2014-01-26 2 views
0

Обратите внимание, что я использую CakePHP 1.3.Проверка длины в зависимости от настройки в CakePHP

Я хотел бы проверить длину нескольких полей модели в зависимости от ограничения, определенного администратором в базе данных.

У меня есть одна модель под названием Настройка, через которую я могу получить значения maxLength. Моя идея заключается в том, чтобы использовать метод beforeValidate за ними, а затем установите параметр VALIDATE $ соответственно:

<?php 
class Mod extends AppModel 
{ 
    var $belongsTo = array('IBelong'); 
    var $hasMany = array('IHaz'); 

    function beforeValidate() { 
     // Fetch the maxLength settings : requestAction to the SettingsController ? 
     // Somehow do $this->Setting->find... ? 

     // Then set the $validate attribute 
    } 
} 
?> 

Какой метод можно использовать, чтобы получить значения MAXLENGTH в обратном вызове beforeValidate?

Спасибо!

Edit: следующие комментарии Дэйв, вот что я сейчас делаю (и это работает):

<?php 
class Mod extends AppModel 
{ 
    var $belongsTo = array('IBelong'); 
    var $hasMany = array('IHaz'); 

    function beforeValidate() { 
     App::import('Model', 'Setting'); 
     $setting = new Setting(); 
     // Use $setting->find... to fetch the settings 
     // Set the $validate attribute to validate using the settings 
    } 
} 
?> 

Однако, я до сих пор не уверен, что это правильный подход.

Обратите внимание, что у меня есть несколько атрибутов для проверки, и мне бы хотелось избежать вызова $ setting-> find несколько раз для лучшей производительности.

ответ

2

Проверка данных очень подробно объясняется в CakePHP book.

Если вы читаете Custom Validation Rules area, вы увидите пример их вытаскивания данных из базы данных для использования в их проверке - точно так же, как вы хотите.

(Вот Custom Validation Rules for 1.3)

+0

Я видел этот пример на самом деле, но я задавался вопросом а) будет ли это вызов функции для каждого поля, когда я пытаюсь сохранить модель? Я хотел бы избежать создания 5 SQL-запросов, поэтому я хотел использовать beforeValidate. б) как я могу вызвать метод find модели установки из этого обратного вызова? – personne3000

+0

Почему бы просто не сделать то, что вы написали в своем коде - $ this-> Setting-> find() Ничего плохого, если предположить, что параметр связан с Mod. Затем установите свои настройки в $ this-> data ['Setting'] [] или что-то еще. – Dave

+0

Но что делать, если настройка не связана с Mod? Моя модель установки используется для хранения общих параметров для приложения, поэтому нет реальной семантической связи между установкой и модулем (с использованием ownTo или hasMany не имеет смысла) – personne3000

Смежные вопросы