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