CakePHP Comportamento Afterfind non chiamato su modelli correlati
-
26-09-2019 - |
Domanda
Sto utilizzando una funzione difalfind per modificare i dati da una funzione Trova. Funziona bene. Se sposto la funzione di Afterfind in un comportamento (in un plug -in) funziona ancora, ma solo quando il modello di interesse è il modello principale, cioè non viene chiamato quando il modello appartiene a un altro modello. C'è un modo per aggirare questo? Sto usando la torta 1.3.4. Questa è una versione semplificata del 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;
}
}
Soluzione
Immagino che farei una delle 2 cose a seconda di come si applica genericamente il blocco del codice:
- Versione universale: non utilizzare un comportamento, ma includi il blocco del metodo
AppModel::afterFind
- Versione chirurgica: utilizzare un comportamento e allegarlo a ciascun modello che deve condividere la funzionalità.
Altri suggerimenti
Un comportamento non dovrebbe funzionare su modelli correlati, ad esempio, se hai questi due modelli:
app/modelli/product.php
<?php
class Product extends AppModel{
var $belongsTo = array('Category');
var $actsAs = array('SomeBehavior');
}
?>
app/modelli/category.php
<?php
class Category extends AppModel {
var $hasMany = array('Product');
}
?>
Un po 'di combustione verrà eseguito solo quando si chiama metodi per il prodotto, perché il comportamento non è associato alla categoria
http://github.com/m3nt0r/eventful-cakephp
Imposta un evento che fa la formattazione: attiva quell'evento come è necessario. Facile come torta.