如何从视图中调用组件的功能?

时间:2012-08-03 11:00:29

标签: php yii yii-extensions

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
            ));
    }

我想将它放入组件或某个地方。

我想从我的观点中调用这些功能。 e.g

<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)。我可以从不同的角度调用这些函数吗?

问题3:如果是Q2,是否有任何流量?

2 个答案:

答案 0 :(得分:4)

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

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

非常简单。在这种情况下,您可以返回CJson而不是回显。但是,您可能对使用此方法的静态响应不感兴趣。

对于你的上一个问题,我倾向于以更经典的方式接近下拉群体,有一个ajax调用(我使用jquery)请求中央控制器并将一些变量传递给它。当然,这会产生流量。

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

答案 1 :(得分:1)

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

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

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

了解详情:http://www.yiiframework.com/doc/api/1.1/CWidgethttp://www.yiiframework.com/doc/guide/1.1/en/basics.view#widget