我在给定视图上有以下代码:
<?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 /文件夹中),并在每个视图上调用。
任何人都可以请他告诉我我们应该遵循哪些步骤才能实现这一目标?
答案 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