1

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 那样做,有流量吗?

4

2 回答 2

4

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

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 回答