CakePhp Behavior After Find no se llama a los modelos relacionados
-
26-09-2019 - |
Pregunta
Estoy usando una función posterior para modificar los datos de una función de búsqueda. Funciona bien. Si muevo la función posterior a la intemperie a un comportamiento (en un complemento) todavía funciona, pero solo cuando el modelo de interés es el modelo primario, es decir, no se llama cuando el modelo pertenece otro modelo. ¿Hay alguna forma en torno a esto? Estoy usando pastel 1.3.4. Esta es una versión simplificada del comportamiento:
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;
}
}
Solución
Supongo que haría una de las 2 cosas dependiendo de cuán genéricamente se aplique el bloque de código:
- Versión universal: no use un comportamiento, pero incluya su bloque de métodos en
AppModel::afterFind
- Versión quirúrgica: use un comportamiento y adjunte a cada modelo que necesite compartir la funcionalidad.
Otros consejos
No se supone que un comportamiento funcione en modelos relacionados, por ejemplo, si tiene estos dos modelos:
aplicación/modelos/producto.php
<?php
class Product extends AppModel{
var $belongsTo = array('Category');
var $actsAs = array('SomeBehavior');
}
?>
aplicación/modelos/categoría.php
<?php
class Category extends AppModel {
var $hasMany = array('Product');
}
?>
Algún comportamiento Solo se ejecutará al llamar a los métodos para el producto, porque el comportamiento no está asociado con la categoría
http://github.com/m3nt0r/eventful-carphp
Configure un evento que realice el formato: active ese evento como sea necesario. Fácil como el pastel.