Шаги по созданию виджета на Yii? - PullRequest
14 голосов
/ 09 декабря 2011

У меня есть следующий код для данного представления:

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

Бывает, что мне понадобится это БОЛЬШЕ, чем один вид, поэтому я нахожу виджет лучшим вариантом.Однако я хотел бы поместить это в отдельный файл (в приложение / виджеты / папку) и вызывать его при каждом просмотре.

Может ли кто-нибудь проявить любезность и сообщить мне, какие шаги следует предпринять, чтобы добиться этого?

Ответы [ 6 ]

23 голосов
/ 24 января 2013

Виджет - лучшее решение здесь, он также сделает ваш код СУХИМ (не повторяйте себя - сосредоточьтесь на повторном использовании).

<?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
)); ?>
18 голосов
/ 10 декабря 2011

Создать виджет очень просто в Yii. Это не может быть лучше объяснено, чем в следующем коротком официальном разделе документации, Здесь .

Я мало подчеркиваю, так как многие нашли этот ответ полезным. Следующие слова на мой вкус, как я предпочитаю проектировать свои строительные блоки приложения Yii: при создании класса виджета всегда имейте в виду, что виджет является своего рода представлением в Yii (v1.x). Его нельзя обрабатывать, выполнять важные бизнес-логические решения. Скорее, в качестве представления он просто предполагал отрисовать вещи Код принятия решений в нем должен быть сосредоточен на выяснении того, что визуализировать. В прошлом я проектировал виджеты, которые включали некоторую обработку AJAX. Сегодня я думаю, что это плохой дизайн. Виджет должен отображать вещи. Нужен сопутствующий процессор? Я бы упаковал все это в модуль , с контроллерами, возможно модельными классами и виджетом в качестве расширения в этом модуле. Cest Tout :-)

4 голосов
/ 09 декабря 2011

Вам лучше использовать частичное представление .

Как это:

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

таким образом вы можете повторно использовать код в других представлениях.

2 голосов
/ 03 июля 2013

Шаги для создания виджета

<?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>
0 голосов
/ 09 февраля 2014

В 2 минуты Я понимаю, как работают виджеты в этом очень коротком руководстве :
Как создать виджет Breadcrumb

0 голосов
/ 12 января 2014

Легко создать виджет в Yii, просто перейдите по ссылке. Создать виджет Yii

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...