特定のビューに次のコードがあります。
<?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();
?>
たまたまこれが1つのビューよりも多くで必要になるので、ウィジェットの方が良いオプションだと思います。ただし、これを別のファイル(app/widgets /フォルダー)に配置し、各ビューで呼び出したいと思います。
それを達成するために私たちが従うべきステップを教えてくれる人がいますか?
ウィジェットはここでの最良の解決策であり、コードを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));
}
}
そしてビュー:
<?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処理を含むウィジェットを設計していました。今日はこれは悪いデザインだと思います。ウィジェットはものをレンダリングする必要があります。付属の処理装置が必要ですか?私はそれをすべて module にパックし、コントローラー、場合によってはモデルクラス、そしてそのモジュールの拡張機能としてウィジェットを使用します。 Cest tout :-)
部分ビュー を使用することをお勧めします。
このような:
<?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>
2分でウィジェットがこの非常に短いチュートリアルでどのように機能するかを理解しました)::
ブレッドクラムウィジェットの作成方法
Yiiでウィジェットを作成するのは簡単です。リンクをたどるだけです。 作成Yiiウィジェット