Comportamento CakePhp após encontrar modelos relacionados a modelos relacionados
-
26-09-2019 - |
Pergunta
Estou usando uma função pós -encontro para modificar os dados de uma função de localização. Funciona bem. Se eu mover a função Afterfind para um comportamento (em um plug -in), ele ainda funciona, mas somente quando o modelo de interesse é o modelo principal, ou seja, ele não é chamado quando o modelo pertence a outro modelo. Existe alguma maneira de voltar a isso? Estou usando o bolo 1.3.4. Esta é uma versão simplificada do comportamento:
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;
}
}
Solução
Acho que faria uma das duas coisas, dependendo de quão geneicamente o bloco de código se aplica:
- Versão universal: não use um comportamento, mas inclua seu bloco de método em
AppModel::afterFind
- Versão cirúrgica: use um comportamento e anexe -o a cada modelo que precisa compartilhar a funcionalidade.
Outras dicas
Um comportamento não deve funcionar em modelos relacionados, por exemplo, se você tiver esses dois modelos:
App/modelos/product.php
<?php
class Product extends AppModel{
var $belongsTo = array('Category');
var $actsAs = array('SomeBehavior');
}
?>
app/modelos/category.php
<?php
class Category extends AppModel {
var $hasMany = array('Product');
}
?>
Algum Behavior só será executado ao chamar métodos de produto, porque o comportamento não está associado à categoria
http://github.com/m3nt0r/eventful-cakephp
Configure um evento que faça a formatação - acione esse evento como precisar. Fácil como bolo.