Yiiのコンテキスト依存フォーム

フレームワークを使用するときは、フレームワークの機能を使用して(できれば必要な場合)、主な機能を常に自分で作成する必要があります。 タイトルからわかるように、Yiiのコンテキスト依存フォームについて説明します。 この記事では、モーダルウィンドウを使用した同様のフォームの実装について説明します。 このオプションが誰かに役立つことを願っています。



今後は、そのようなフィールド、ドロップダウンメニュー、必要なデータを選択するための右側のボタンが表示されるはずです。







状況依存選択ボックス:







選択後:







モーダルウィンドウオプションが選択されたのはなぜですか? これにより、目的のアイテムの選択を簡素化できます。 モーダルウィンドウでは、CGridViewを表示できますが、データを並べ替え、検索、およびフィルター処理できます。これは、多数の要素から選択する必要がある場合に非常に便利です。

したがって、このYiichnitsaの準備のための成分:



さあ、辛抱強く料理を始めましょう。



menuController.phpコントローラー、ビューファイル_form.php、およびMenu.phpモデルがあるとします。 私は誰が誰なのかについては触れません。これはすべて、 Gii 、Geeの標準的な自動生成コードです。



モデル(Menu.php)



まず、モデルの仕組みを明確にします。 データ型に関連付けられたデータ型とIDの束があると仮定します。 モデル(データベース内)には、 typeフィールドとdata_idフィールドが両方とも整数である必要があります。 便宜上、モデルをロードするときに、モデルが参照するオブジェクトの名前をロードします(オブジェクトの編集時に必要)。 data_nameフィールドで言ってみましょう。 afterFind()関数で必要な詐欺をチェックしましょう。 また、データ型のリストをより動的にします。 クラスで静的配列を定義するため、型オプションを展開または絞り込む必要がある場合は、モデルクラスのみを編集します。

なぜなら 実際にはActiveRecordを使用しているため、特定のデータ型を操作するにはモデルとビューの名前を知るだけで済みます。



static $types = array( 1 => array("name" => "", "model" => "Pages", "view" => "pages_grid"), 2 => array("name" => "", "model" => "Docs", "view" => "docs_grid"), 3 => array("name" => "", "model" => "Cats", "view" => "cats_grid"), ); public static function getSimpleTypes() { //   .   DropDownList $st = array(); foreach (Menu::$types as $key => $value) $st[$key] = $value["name"]; return $st; } var $data_name; public function afterFind() { $dataModel = $types[$this->type]['model']::model()->findByPk($this->data_id); $this->data_name = $dataModel->title; //   $data_name    parent::afterFind(); }
      
      





これでモデルの検討は終わりです。



フォームを表示(_form.php)



フォーム_form.phpのビューファイルを確認します。



 <!--    --> <?php $form=$this->beginWidget('bootstrap.widgets.TbActiveForm',array( 'id'=>'menu-form', 'enableAjaxValidation'=>false, 'type' => 'horizontal', )); ?> <!--       --> <?php echo $form->errorSummary($model);?> <?php echo $form->textFieldRow($model,'name');?> <!--  ,    data_id --> <?php echo $form->textField($model,'data_id',array('class'=>'hide')); ?> <!--        bootstrap--> <div class="control-group"> <div class="control-label"> <?=$form->labelEx($model,'type')?> </div> <div class="controls"> <div class="input-append"> <?php echo $form->dropDownList($model,'type',Menu::getSimpleTypes());?> <button class="btn" id="data-select-btn" data-loading-text="..." type="button"><i class="icon-list"></i></button> </div> </div> </div> <!--   ,    .     Update,   ,  --> <div id="data-info" class="alert alert-success controls <?if($model->isNewRecord):?>hide<?endif;?>"> <i class="icon-file"></i> <span class="info"> <?if(!$model->isNewRecord) echo $model->data_name?> </span> </div> <!--  /--> <div class="form-actions"> <?php $this->widget('bootstrap.widgets.TbButton', array( 'buttonType'=>'submit', 'type'=>'primary', 'label'=>$model->isNewRecord ? 'Create' : 'Save', )); ?> </div> <?php $this->endWidget(); ?> <!--      --> <?php $this->beginWidget('bootstrap.widgets.TbModal', array('id'=>'dataModal')); ?> <div class="modal-header"> <a class="close" data-dismiss="modal">×</a> <h4><?=Yii::t("menu", " ")?></h4> </div> <div class="modal-body"></div> <div class="modal-footer"> <?php $this->widget('bootstrap.widgets.TbButton', array( 'label'=>Yii::t("menu", ""), 'url'=>'#', 'htmlOptions'=>array('data-dismiss'=>'modal'), )); ?> </div> <?php $this->endWidget(); ?> <script> //       function selectData(id, name) { $("#Menu_data_id").val(id); $("#data-info .info").html(name); $("#data-info").show(); $('#dataModal').modal("hide"); } //  data_id     $('#Menu_type').change(function(){ $("#Menu_data_id").val(""); $("#data-info").hide(); }) //         ,   AJAX $('#data-select-btn').click(function(){ var buttn = this; $(buttn).button('loading'); $.ajax({ url: "<?php echo $this->createAbsoluteUrl('menu/loadData') ?>", cache: false, data: "type="+$("#Menu_type").val(), success: function(html){ $(".modal-body").html(html); $(buttn).button('reset'); $('#dataModal').modal().css({ width: 'auto', 'margin-left': function () { return -($(this).width() / 2); }, }); } }); }) </script>
      
      





実際、これはフォームファイル全体です。 ここでの主な要素は、AJAXデータリクエスト用のフィールドと関数です。

ご覧のとおり、データ収集機能はmenu / loadDataアクションにアクセスします 。 彼が何をしているのか見てみましょう:



コントローラー(menuController.php)



  public function actionLoadData($type) { $model_name = Menu::$types[$type]['model']; $model = new $model_name('search'); //      if(isset($_GET[$model_name])) //          $model->attributes=$_GET[$model_name]; $this->renderPartial(Menu::$types[$type]['view'],array( 'model'=>$model, ), false, true); //   $processOutput = true,      . }
      
      





renderPartial関数のパラメーター$ processOutput = trueを設定する必要があることに注意してください。そうしないと、ビューファイル内のウィジェットによって接続されたスクリプトがロードされません。

また、非常に重要なポイントを明確にする必要があります。 $ processOutputパラメーターを設定すると、メインページで既に接続されているファイルを含むすべてのファイルがロードされます。これは、たとえばJQueryの場合に非常に重要です。 したがって、NLSClientScript拡張機能をインストールすることをお勧めします。これにより、すべてのファイルが一度接続されます。



モーダルウィンドウのファイルの表示(docs_grid.php)



ビューファイルは、コントローラーの専用フォルダーに保存する必要があります。 私たちの場合、それは/保護/ビュー/メニューになります

次に、モーダルウィンドウのビューファイルの1つを分析します。 任意の便利なビューを使用してデータを選択できます。主なことは、モデルオブジェクトを通じて機能することです。 私はCGridViewが好きです 検索、ページネーション、ソートなど、必要なものがすべて揃っています。



 $this->widget('bootstrap.widgets.TbGridView',array( 'id'=>'docs-grid', 'dataProvider'=>$model->search(), 'filter'=>$model, 'columns'=>array( 'id', 'title', 'updated', array( 'class'=>'CButtonColumn', 'template' => "{insert}", 'buttons' => array( "insert" => array( 'label' => "", 'options' => array( "class" => "btn btn-mini btn-success", "onclick" => 'selectData($(this).parent().parent().children(":nth-child(1)").text(),$(this).parent().parent().children(":nth-child(2)").text());', ) ), ) ), ), ));
      
      





余分な要素はなく、要素選択ボタンを備えた単一のグリッドがあります。 この例ではブートストラップグリッドを使用していますが、標準のCGridViewを使用できます。

しかし、1つのトリックがあります。 お気づきのように、単純なスクリプトが要素選択ボタンにハングアップし、テーブルから要素のIDタイトルを引き裂きます。 残念ながら、GridViewウィジェットでは、単一のレコードのデータを操作することはできません。 したがって、この方法で必要なIDタイトルを取得する必要があり、これらはビューファイル_form.phpに記述されているselectData関数に渡されます。



それだけです。 新しいデータ型を追加するには、 Menu.phpモデルで作成された配列に別の行を追加し、 Giiを使用して新しい型のActiveRecordモデルを作成または生成するだけで十分です。



All Articles