在给定的视图上有以下代码:
<?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小部件