1

Q1 : ビューからコンポーネントの関数を呼び出す方法は?

私の機能の1つは、ほとんどのコントローラーを使用しています。

public function actionDynamicdepartment()
    {

            //Department
            $data = Department::model()->findAll('p_id=0 AND company_id=:company_id', array(':company_id'=>(int) $_POST['company_id']));
            $data = CHtml::listData($data,'id','name');
            $dddepatment = "<option value=''>Please select a department</option>"; 
            foreach($data as $value=>$name)
                $dddepatment .= CHtml::tag('option', array('value'=>$value),CHtml::encode($name),true);

            //Section and Team
            $ddsection = "<option value=''>Please select a section</option>";
            $ddteam = "<option value=''>Please select a team</option>";

            // return data (JSON formatted)
            echo CJSON::encode(array(
              'dddepartment'=>$dddepatment,
              'ddsection'=>$ddsection,
              'ddteam'=>$ddteam
            ));
    }

コンポーネントかどこかに入れたい。

そして、ビューからそれらの関数を呼び出したいと思います。例えば

<div class="row">
    <?php echo $form->labelEx($model,'company_id'); ?>
    <?php
        $records = Company::model()->findAll();
        $company = CHtml::listData($records, 'id', 'name');

        echo $form->dropDownList($model,'company_id', $company, array('prompt'=>'Please select a company',
                'ajax' => array(
                    'type'=>'POST', //request type
                    'url'=>CController::createUrl('department/dynamicdepartment'), //url to call.
                    'dataType'=>'json',
                    'data'=>array('company_id'=>'js:this.value'),  
                    'success'=>'function(data) {
                        $("#FaMovehistory_department_id").html(data.dddepartment);
                        $("#FaMovehistory_section_id").html(data.ddsection);
                        $("#FaMovehistory_team_id").html(data.ddteam);
                    }',
                )
            )
        ); 
    ?>
    </div>

または Q2 : それらの関数をコントローラーの 1 つ (department.php) に配置します。そして、それらの関数を別のビューから呼び出すことはできますか?

Q3 : Q2 のようにしたら渋滞はありますか?

4

2 に答える 2

4

私がよく行うのは、CWidget(ドミトリーが言ったように)を定義してから、いくつかの関数を作成することです(ライブラリのように静的にする傾向があります)。たとえば、ウィジェットが「Departments」と呼ばれている場合、次のようなことができます。

Yii::import("application.components.Departments");
Departments::actionDynamicdepartment();

かなり簡単です。この状況では、エコーする代わりにその CJson を返すことができます。ただし、このメソッドから静的な応答を得ることには関心がないかもしれません。

最後の質問については、より古典的な方法でドロップダウンの母集団にアプローチする傾向があり、中央コントローラーを要求していくつかの変数を渡す ajax 呼び出し (私は jquery を使用) を行います。もちろん、それはトラフィックを生成します。

要約すると、部門のリストを受け取り、現在のページでそれを変更したくない場合は、ウィジェット/コンポーネントを使用できます。反対に、ドロップダウンがフォーム内の残りの項目と同様に応答する必要がある場合は、コントローラーのアクションが最適な(そしておそらくユニークな)オプションです。

于 2012-08-03T13:53:01.773 に答える
1

コンポーネントの代わりにウィジェットを作成する必要があります。

各ウィジェットには独自のビューがあり、クラス ロジックでその動作を記述できます (コントローラーからコードを移動します)。次に、メイン ビューで呼び出します。

 <?php $this->widget('path.to.your.widget') ?>

詳細: http://www.yiiframework.com/doc/api/1.1/CWidgetおよびhttp://www.yiiframework.com/doc/guide/1.1/en/basics.view#widget

于 2012-08-03T12:21:04.593 に答える