2009-12-19 61 views
5

我想使用CakePHP的核心驗證的名單在我的模型CakePHP的模型驗證:與陣列

var $validate = array(
    'selectBox' => array(
    'allowedChoice' => array(
     'rule' => array('inList', $listToCheck), 
     'message' => 'Enter something in listToCheck.' 
    ) 
) 
); 

然而,$listToCheck陣列是在視圖中使用,來填充選擇框同一陣列。我在哪裏放這個功能?

public function getList() { 
    return array('hi'=>'Hello','bi'=>'Goodbye','si'=>'Salutations'); 
} 
在我的控制器

目前,在我設置它的觀點,就像操作之一:

public function actionForForm() { 
    $options = $this->getList(); 
    $this->set('options', $options); 
} 

所以,我不希望有複製的getList()功能。 ..我可以把它放在模型上,讓它可以調用它來填充它的$listToCheck數組?

感謝您的幫助。

回答

11

考慮到它是數據,你應該在模型中存儲有效選擇的列表。

class MyModel extends AppModel { 

    var $fieldAbcChoices = array('a' => 'The A', 'b' => 'The B', 'c' => 'The C'); 

} 

你可以得到該變量在控制器只是這樣的:

$this->set('fieldAbcs', $this->MyModel->fieldAbcChoices); 

不幸的是,你不能簡單地使用該變量在規則中聲明爲inList規則,因爲規則被聲明爲實例變量和那些只能靜態初始化(不允許變量)。周圍的最好的辦法是設置變量的構造:

var $validate = array(
    'fieldAbc' => array(
     'allowedChoice' => array(
      'rule' => array('inList', array()), 
      'message' => 'Enter something in listToCheck.' 
     ) 
    ) 
); 

function __construct($id = false, $table = null, $ds = null) { 
    parent::__construct($id, $table, $ds); 

    $this->validate['fieldAbc']['allowedChoice']['rule'][1] = array_keys($this->fieldAbcChoices); 
} 

如果你不舒服重寫構造函數,你也可以做到這一點的beforeValidate()回調。

另請注意,您不應將您的字段命名爲「selectBox」。 :)

+0

感謝您的答覆。但是當我想在fieldAbc值上使用'__()'函數時會發生什麼? – ash 2009-12-20 13:01:44

+1

然後在構造函數中創建整個數組,或者在其上創建'array_walk',並將函數應用於'message'字段。 '$ this-> choices = array('a'=> __('A',true),...);' – deceze 2009-12-20 13:17:34

+0

完美。謝謝你的幫助! – ash 2009-12-20 17:09:43