在Yii上创建小部件的步骤


Steps to create a widget on 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/folder)上,并在每个视图上调用。

谁能好心告诉我,我们应该遵循什么步骤,以实现这一目标?

Widget是这里最好的解决方案,它将保持你的代码DRY(不要重复自己-专注于可重用性)。

<?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));
    }
}

和view:

<?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
)); ?>

在Yii中创建小部件非常简单。没有比下面简短的官方文档部分更好的解释了,在这里。

我不强调,因为很多人发现这个答案很有用。下面的话是我自己的口味,我喜欢如何设计我的Yii应用程序构建块:在构建小部件类时,请始终记住小部件是Yii (v1.x)中的一种视图。它不应该处理东西,执行重要的业务逻辑决策。相反,作为一个视图,它仅仅假定渲染内容。其中的决策代码应该专注于找出要呈现的内容。我过去常常设计包含一些AJAX处理的小部件。今天我认为这是糟糕的设计。小部件应该呈现内容。需要附带的处理装置吗?我将把它们全部打包在一个模块中,其中包括控制器(可能还有模型类)和作为该模块扩展的小部件。测试输出:-)

您最好使用局部视图。

:

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

创建部件的步骤

<?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>

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

2分钟内我已经理解了小部件在这个非常短教程中的工作原理:
如何创建Breadcrumb小部件