2009-12-19 28 views
5

Tôi muốn sử dụng xác nhận cốt lõi của CakePHP cho các danh sách trong mô hình của tôi:CakePHP mô hình xác nhận với mảng

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

Tuy nhiên, mảng $listToCheck là mảng tương tự mà được sử dụng trong giao diện, để cư một selectbox. Tôi đặt hàm này ở đâu?

public function getList() { 
    return array('hi'=>'Hello','bi'=>'Goodbye','si'=>'Salutations'); 
} 

Đã có trong bộ điều khiển của tôi, trong một trong những hành động Tôi đang thiết nó cho xem, như:

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

Vì vậy, tôi không muốn phải sao chép các getList() chức năng. .. nơi tôi có thể đặt nó để mô hình có thể gọi nó để điền vào mảng $listToCheck của nó?

Cảm ơn sự giúp đỡ của bạn.

Trả lời

11

Xem xét dữ liệu của nó, bạn nên lưu trữ danh sách các lựa chọn hợp lệ trong mô hình.

class MyModel extends AppModel { 

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

} 

Bạn có thể lấy biến trong điều khiển đơn giản như thế này:

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

Đáng tiếc là bạn không thể chỉ đơn giản là sử dụng biến trong khai báo quy tắc cho sự cai trị inList, vì quy tắc được khai báo là ví dụ các biến và chỉ có thể được khởi tạo tĩnh (không cho phép biến nào). Cách tốt nhất xung quanh đó là để thiết lập các biến trong vị thi công:

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); 
} 

Nếu bạn không thoải mái trọng các Constructor, bạn cũng có thể làm điều này trong một callback beforeValidate().

Cũng lưu ý rằng bạn không nên đặt tên trường 'selectBox' của mình. :)

+0

Cảm ơn bạn đã trả lời. Nhưng điều gì sẽ xảy ra khi tôi muốn sử dụng hàm '__()' trên các giá trị fieldAbc? – ash

+1

Sau đó, tạo toàn bộ mảng trong hàm tạo, hoặc 'array_walk' trên nó và áp dụng hàm trên trường' message'. '$ this-> choices = array ('a' => __ ('A', true),…);' – deceze

+0

Hoàn hảo. Cảm ơn bạn đã giúp đỡ! – ash

Các vấn đề liên quan