【问题标题】:Steps to create a widget on Yii?在 Yii 上创建小部件的步骤?
【发布时间】:2011-12-09 15:46:19
【问题描述】:

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

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

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

谁能告诉我我们应该遵循哪些步骤来实现这一目标?

【问题讨论】:

标签: php yii


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你最好使用partials views

      像这样:

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

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

      【讨论】:

      • 小部件也不是万能的解决方案。在这种情况下,他的问题的最佳解决方案是部分,他不需要小部件你说他们不是。但你没有给出任何理由......
      • 我的意思是,用部分替换小部件 - 不是最好的解决方案。
      【解决方案4】:

      创建小部件的步骤

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          2 分钟内我已经在这个非常简短的教程中了解了小部件的工作原理:
          How to create Breadcrumb widget

          【讨论】:

            猜你喜欢
            • 2013-04-17
            • 1970-01-01
            • 2017-04-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多