Yii Framework-向Controller注册自定义的Action

  由于需要一个级联的DropDown List,而且数据必须从后台获取,所以我的Widget API就没用了,额。

  使用Yii自带的ActiveForm的dropDownList控件,加上Ajax可以实现相应的功能的,但是有几点注意的,记录一下;

  级联列表的代码如下:

<?php $form=$this->beginWidget('CActiveForm', array(
    'method'=>'get',
    'id'=>"customer-contact-search",
    'enableAjaxValidation'=>false,
)); ?>
<?php echo $form->dropDownList(
    $contactModel,
    'customer_id',
    CHtml::listData(CustomerContact::model()->findAll(),'customer_id','customer_id'),
    array(
        'id'=>'customer_id',
        'empty'=>'请选择'.CustomerContact::model()->getAttributeLabel('customer_id'),
        'ajax'=>array(
            'type'=>'GET',
            'data'=>'js:{"customer_id":$("#customer_id").val()}',
            'url'=>$this->createUrl('customerContact/getCustomerNameSelectionsByCustomerId'),
            'update'=>'#customer_name'
        )
    )
); ?>
<?php echo $form->dropDownList(
    $contactModel,
    'customer_name',
    CHtml::listData(CustInfo::model()->findAllByAttributes(array('custno'=>$contactModel->customer_id)),
        'custno','name'),
    array(
        'id'=>"customer_name",
    )
); ?>
<?php echo CHtml::submitButton('查询',array('class'=>'btn')); ?>
<?php $this->endWidget(); ?>

   功能非常简单:选择ID,显示相应的名字。

   分析如下:

    选择了ID后,创建一个Router:"customerContact/getCustomerNameSelectionsByCustomerId", 并且使用data属性将选择的值GET过去。

  这里的actionGetCustomerNameSelectionsByCustomerId就是一个自定义的Action。

  最开始我是在Controller里面创建了Action后直接去View查看,dump结果显示“没有相关的权限”。

  因为Controller对于Action的控制使用accessRules方法来控制各个Action的权限的。那就在accessRules中添加我自定义的Action,并附加相应权限就OK了。

   这是原始的accessRules:

   

public function accessRules()
	{
		return array(
			array('allow',  // allow all users to perform 'index' and 'view' actions
				'actions'=>array('index','view'),
				'users'=>array('*'),
			),
			array('allow', // allow authenticated user to perform 'create' and 'update' actions
				'actions'=>array('create','update'),
				'users'=>array('@'),
			),
			array('allow', // allow admin user to perform 'admin' and 'delete' actions
				'actions'=>array('admin','delete'),
				'users'=>array('admin'),
			),
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}

这是添加后的accessRules:

   

public function accessRules()
	{
		return array(
			array('allow',  // allow all users to perform 'index' and 'view' actions
				'actions'=>array('index','view'),
				'users'=>array('*'),
			),
            array('allow', // allow authenticated user to perform 'create' and 'update' actions
                'actions'=>array('create','update','GetCustomerNameSelectionsByCustomerId'),
                'users'=>array('@'),
            ),
			array('allow', // allow authenticated user to perform 'create' and 'update' actions
				'actions'=>array('create','update'),
				'users'=>array('@'),
			),
			array('allow', // allow admin user to perform 'admin' and 'delete' actions
				'actions'=>array('admin','delete'),
				'users'=>array('admin'),
			),
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}

  这里需要注意的地方就是:自定义的Action的权限必须在"deny"的前面,否则不会生效。


  2. 还有一个问题就是在使用CHtml::listData方法时的问题。

   下面是对listData方法的原型叙述:

   

public static array listData(array $models, string $valueField, string $textField, string $groupField='') 
$models array 模型对象的列表。这个参数也可以是一个关联的数组(例如CDbCommand::queryAll的结果)。 
$valueField string 列表选项值的属性名 
$textField string 列表选项文本的属性名 
$groupField string 列表选项组的属性名。如果是空,将不会生成组。 
{return} array 可用于dropDownList, listBox等的列表数据。 
    所以对于传入的model需要使用findAllByAttributes方法,不能使用findByAttributes方法,因为只有前者才会返回一个model的列表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值