我在给定视图上有以下代码:
<?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();
?>
Run Code Online (Sandbox Code Playgroud)
碰巧我需要在MORE和一个视图上使用它,所以我发现一个小部件是一个更好的选择.但是我希望将它放在一个单独的文件上(在app/widgets /文件夹中),并在每个视图上调用.
任何人都可以请他告诉我我们应该遵循哪些步骤才能实现这一目标?
emi*_*mix 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));
}
}
Run Code Online (Sandbox Code Playgroud)
并且观点:
<?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();
Run Code Online (Sandbox Code Playgroud)
任何视图中的示例用法
<?php $this->widget('SubscriberFormWidget', array(
'form' => $newsletterSubscribeForm
)); ?>
Run Code Online (Sandbox Code Playgroud)
Boa*_*and 18
在Yii中创建一个小部件非常简单.它不能比下面的简短官方文档部分得到更好的解释,在这里.
我很少强调,因为很多人发现这个答案很有用.以下单词是我自己的口味,我更喜欢设计我的Yii应用程序构建块:构建窗口小部件类时,请记住窗口小部件是Yii中的一种视图(v1.x).它不应该处理东西,执行重要的业务逻辑决策.相反,作为一种观点,它只是应该渲染东西.其中的决策代码应该集中在找出要呈现的内容.我曾经设计过去包含一些AJAX处理的小部件.今天我认为这是糟糕的设计.小部件应该呈现内容.需要一个附带的处理单元?我会将它全部打包在一个模块中,包含控制器,可能是模型类,并将小部件作为该模块的扩展.Cest tout :-)
| 归档时间: |
|
| 查看次数: |
35906 次 |
| 最近记录: |