在Yii上创建小部件的步骤?

时间:2011-12-09 15:46:20

标签: php yii

我在给定视图上有以下代码:

<?php
    $form = $this->beginWidget('CActiveForm', array(
        'id' => 'home-newsletter-form',
        'enableAjaxValidation' => false,
        'enableClientValidation' => true,
            ));

    echo $form->textField($newsletterSubscribeForm, 'email');
    echo $form->error($newsletterSubscribeForm, 'email');
    echo CHtml::link("subscribe", "#", array('class'=>'btSubscribe'));
    $this->endWidget(); 
?>

碰巧我需要更多一个视图,所以我发现一个小部件是一个更好的选择。 但是我希望将它放在一个单独的文件中(在app / widgets /文件夹中),并在每个视图上调用。

任何人都可以请他告诉我我们应该遵循哪些步骤才能实现这一目标?

6 个答案:

答案 0 :(得分:23)

Widget是最好的解决方案,它会让你的代码干掉(不要重复自己 - 专注于重用性)。

<?php

// protected/components/SubscriberFormWidget.php

class SubscriberFormWidget extends CWidget
{
    /**
     * @var CFormModel
     */
    public $form;

    public function run()
    {
        if (! $this->form instanceof CFormModel) {
            throw new RuntimeException('No valid form available.');
        }
        $this->render('subscriberFormWidget', array('form'=>$this->form));
    }
}

观点:

<?php
// protected/components/views/subscriberFormWidget.php

$form = $this->beginWidget('CActiveForm', array(
    'id' => 'home-newsletter-form',
    'enableAjaxValidation' => false,
    'enableClientValidation' => true,
));

echo $form->textField($newsletterSubscribeForm, 'email');
echo $form->error($newsletterSubscribeForm, 'email');
echo CHtml::link("subscribe", "#", array('class'=>'btSubscribe'));
$this->endWidget();

任何视图中的示例用法

<?php $this->widget('SubscriberFormWidget', array(
        'form' => $newsletterSubscribeForm
)); ?>

答案 1 :(得分:18)

在Yii中创建小部件非常简单。它不能比以下简短的官方文档部分Here更好地解释。

我很少强调,因为很多人发现这个答案很有用。以下单词是我自己的口味,我更喜欢设计我的Yii应用程序构建块:构建窗口小部件类时,请记住窗口小部件是Yii中的一种视图(v1.x)。它不应该处理东西,执行重要的业务逻辑决策。相反,作为一个视图,它只是假设呈现的东西。其中的决策代码应该集中在找出要呈现的内容。我曾经设计过去包含一些AJAX处理的小部件。今天我认为这是糟糕的设计。小部件应该呈现内容。需要一个附带的处理单元?我会将它全部打包在module中,包含控制器,可能是模型类,并将小部件作为该模块的扩展。 Cest tout :-)

答案 2 :(得分:4)

您最好使用partials views

像这样:

<?php $this->renderPartial('//partials/_myview',
        compact('model', 'dataProvider')
); ?>

这样你可以在其他视图中重用代码。

答案 3 :(得分:2)

创建小部件的步骤

<?php
//protected/components
    class Categorywidget extends CWidget
    {

        public function init(){

        }

        public function run(){
            $model=Category::model()->findAll(array("condition"=>"isactive=1"));
            $listdata=CHtml::listData($model,"category_id","name");
            $this->render("category/category",array('listdata'=>$listdata));
        }

    }




 <?php
//protected/components/views
    $count=count($listdata);
    $div2=ceil($count/2)+1;
    $i=0;
    ?>
                <div class="categories">
                    <h5>Categories</h5>
                    <ul>
    <?php           foreach($listdata as $key=>$value) {
                        $i++;
                        if($div2==$i){ ?>
                        </ul><ul>    
    <?php               } ?>                
                        <li><a href="<?php echo Yii::app()->createAbsoluteUrl("medialist/".$this->REQUEST,array("category"=>$key)); ?>" class="colr"><?php echo $value; ?></a></li>
    <?php           } ?>
                    </ul>
                </div>

答案 4 :(得分:0)

在Yii中创建小部件很容易,只需点击链接即可。 Create Yii Widget

答案 5 :(得分:0)

2分钟中,我了解小部件如何在简短教程中工作:
How to create Breadcrumb widget

相关问题