Поведение CakePhp в полной мере не вызывается на соответствующих моделях
-
26-09-2019 - |
Вопрос
Я использую функцию последования для изменения данных из функции поиска. Работает нормально. Если я перемещу функцию последования в поведение (в плагине), он все еще работает, но только тогда, когда модель интереса является основной моделью, то есть она не вызывается, когда модель хранится другая модель. Есть ли в этом пути? Я использую торт 1.3.4. Это упрощенная версия поведения:
class ChemicalStructureBehavior extends ModelBehavior {
function afterFind(&$model, $results, $primary) {
foreach ($results as &$unit) {
// format chemical formula (with subscripts)
$unit[$model->alias]['chemical_formula_formatted'] = preg_replace('/([0-9]+)/i', '<sub>$1</sub>', $unit[$model->alias]['chemical_formula']);
}
return $results;
}
}
Решение
Я думаю, что я бы сделал одну из 2 вещей в зависимости от того, насколько общене применяется код код:
- Универсальная версия: не использовать поведение, но включите свой блок метода в
AppModel::afterFind
- Хирургическая версия: используйте поведение и прикрепите его к каждой модели, которая должна поделиться функциональностью.
Другие советы
Поведение не должно работать над связанными моделями, например, если у вас есть две модели:
Приложение / Модели / Продукт .php
<?php
class Product extends AppModel{
var $belongsTo = array('Category');
var $actsAs = array('SomeBehavior');
}
?>
Приложение / Модели / категория .php
<?php
class Category extends AppModel {
var $hasMany = array('Product');
}
?>
Помимоэхавиор будет выполняться только при вызове методов для продукта, потому что поведение не связано с категорией
http://github.com/m3nt0r/eventful-cakephp.
Настройте событие, которое делает форматирование - срабатывает на это событие, однако вам нужно. Легко в качестве пирога.