Поведение CakePhp в полной мере не вызывается на соответствующих моделях

StackOverflow https://stackoverflow.com/questions/4028441

Вопрос

Я использую функцию последования для изменения данных из функции поиска. Работает нормально. Если я перемещу функцию последования в поведение (в плагине), он все еще работает, но только тогда, когда модель интереса является основной моделью, то есть она не вызывается, когда модель хранится другая модель. Есть ли в этом пути? Я использую торт 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 вещей в зависимости от того, насколько общене применяется код код:

  1. Универсальная версия: не использовать поведение, но включите свой блок метода в AppModel::afterFind
  2. Хирургическая версия: используйте поведение и прикрепите его к каждой модели, которая должна поделиться функциональностью.

Другие советы

Поведение не должно работать над связанными моделями, например, если у вас есть две модели:

Приложение / Модели / Продукт .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.

Настройте событие, которое делает форматирование - срабатывает на это событие, однако вам нужно. Легко в качестве пирога.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top