如何从视图中调用组件的函数


How to call a function of component from view?

Q1:如何从视图中调用组件的函数?

我的功能之一是使用大多数控制器。

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:把这些函数放在一个控制器(department.php)上。我可以从不同的角度调用这些函数吗?

Q3:如果按Q2做,是否有流量?

我通常定义一个CWidget(就像Dmitry所说的),然后创建一些函数(我倾向于使它们成为静态的,就像它是一个库一样),所以,例如,如果你的Widget被称为"Departments",你可以做这样的事情:

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

相当简单。在这种情况下,你可以返回CJson而不是回声。但是,您可能对该方法的静态响应不感兴趣。

对于您的最后一个问题,我倾向于以一种更经典的方式来处理下拉列表的总体,使用ajax调用(我使用jquery)请求一个中央控制器并将一些变量传递给它。当然,这会产生流量。

因此,总而言之,如果你想收到一个部门列表,并避免在当前页面中更改它,你可以选择一个小部件/组件如果另一方面,您的下拉列表需要与表单中的其他项目一起响应,则控制器的操作是您的最佳(可能是唯一的)选项

您需要创建一个小部件而不是组件。

每个小部件都有自己的视图,您将能够在其类逻辑中描述其行为(从控制器中移动代码),然后在主视图中调用它:

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