2010-10-26 4 views
6

Я использую функцию afterFind для изменения данных из функции поиска. Он работает нормально. Если я переместил функцию afterFind в поведение (в плагине), она все еще работает, но только тогда, когда интересующая модель является основной моделью, т. Е. Не вызывается, когда модель принадлежит другой модели. Есть ли способ обойти это? Я использую торт 1.3.4. Это упрощенная версия поведения:поведение cakephp afterFind не вызвано связанными моделями

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; 
    } 
} 
+0

Из PHP 5.4 и выше вы можете использовать Trait для этого - просто поместите свой код 'afterFind() в новый файл, содержащий декларацию признака (сменив ссылки' $ model' на '$ this') и включите его в верхней части вашего класса модели с помощью инструкции 'use'. Вам нужно будет использовать 'App :: import()' или 'require()' для загрузки файла, содержащего вашу черту, в верхней части файла модели. – BeesonBison

ответ

2

Я предполагаю, что я хотел бы сделать один из 2-х вещей, в зависимости от того, как обобщенно блок кода применяется:

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

(1) не работает для меня, потому что он применим только к некоторым, но не ко всем моделям. (2), по сути, я пытаюсь сделать, но это не сработает, когда модель не является основной моделью. – Tomba

+0

Что я имею в виду, так это то, что вы должны _literally_ прикрепить поведение к каждой модели, для которой вам нужны функции , Поведение не предназначено для работы с соответствующими моделями. –

+0

Спасибо. Что вы подразумеваете под «буквально приписываете поведение каждой модели»? – Tomba

2

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

приложение/модели/product.php

<?php 

class Product extends AppModel{ 
    var $belongsTo = array('Category'); 
    var $actsAs = array('SomeBehavior'); 
} 

?> 

приложение /models/category.php

<?php 

class Category extends AppModel { 
    var $hasMany = array('Product'); 
} 

?> 

SomeBehavior будет выполняться только при вызове методов для продукта, потому что поведение не связано с Категория

+0

Я перефразировал свой комментарий. Я не хочу, чтобы он работал над связанными моделями, Я хочу, чтобы он работал над моделью, называется ли она основной моделью или нет. В вашем примере я бы связал поведение с категорией, а не с продуктом, и я бы хотел, чтобы функции обратного вызова вызывались, является ли категория первичной моделью (/ categories/view/1) или когда она вызывается продуктом (/ products/вид/1). В настоящее время функции обратного вызова поведения вызываются только в первом случае. Если я помещаю функцию обратного вызова в модель категории, а не в поведение, она вызывается в обоих случаях. – Tomba

2

http://github.com/m3nt0r/eventful-cakephp

Создать событие, которое делает форматирование - вызвать это событие, однако вам нужно. Легко, как торт.

+0

Спасибо за предложение. Я посмотрю. – Tomba

+1

Каждый раз, когда я предлагаю плагин Eventful, кто-то упрекает меня в течение нескольких минут - стоит ли задаваться вопросом, является ли это m3nt0r (автором) –

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

  • Нет связанных вопросов^_^