在控制器中设置常量,并在视图中调用为yii中的下拉列表

在控制器中设置常量,并在视图中调用为yii中的下拉列表,yii,constants,Yii,Constants,控制器中有三个常数: const TEST1 = 1; const TEST2 = 2; const TEST3 = 3; 如何将视图中的这些值作为下拉列表调用?简单,只需使用: $this::TEST1; 在下拉列表中: echo CHtml::dropDownList('name','selected', array($this::TEST1=>'Test1',$this::TEST2=>'Test2',$this::TEST3=>'Test3'), a

控制器中有三个常数:

const TEST1 = 1;
const TEST2 = 2;
const TEST3 = 3;
如何将视图中的这些值作为下拉列表调用?

简单,只需使用:

$this::TEST1;
在下拉列表中:

echo CHtml::dropDownList('name','selected',
    array($this::TEST1=>'Test1',$this::TEST2=>'Test2',$this::TEST3=>'Test3'),
    array(// for htmlOptions
    )
);

若你们在不同的模型中的所有常量都会弄乱,你们可以使用我写的代码片段来管理它们。请参阅(yii维基文章)

我将只复制函数和一个示例,但有关完整的wiki和详细信息,请访问上面的链接

将此方法直接放在父类或模型类中:

class ActiveRecord extends CActiveRecord {
    const TEST_1 = 1;
    const TEST_2 = 2;
    const TEST_3 = 3;


    /*
        Get class constants by token.
        If you set constants with same prefix, like:
        TEST_1
        TEST_2
        TEST_3

        , you can get it by calling
        Class::getConstants('TEST_');
    */
    public static function getConstants($token,$objectClass) {
        $tokenLen = strlen($token);

        $reflection = new ReflectionClass($objectClass); //php built-in 
        $allConstants = $reflection->getConstants(); //constants as array

        $tokenConstants = array(); 
        foreach($allConstants as $name => $val) {
        if ( substr($name,0,$tokenLen) != $token ) continue;
        $tokenConstants[ $val ] = $val;
        }
        return $tokenConstants;
    }

}
之后,您可以使用此方法获取数组中的特定常量(来自一个组):

self::getConstants('TEST_',__CLASS__); //inside same class
ActiveRecord::getConstants('TEST_','ActiveRecord'); //outside, somewhere else in view or controller
对于下拉列表,它看起来像(如果MyModel有父ActiveRecord)

现在,如果添加新常量,您可能会忘记编辑代码中的所有位置。它会自动添加到你所有的下拉列表中

echo CHtml::dropDownList('name','selected',
    MyModel::getConstants('TEST_','MyModel'),
    array(// for htmlOptions
    )
);