2010-10-26 16 views
6

Estoy usando una función afterFind para modificar los datos de una función de búsqueda. Funciona bien. Si muevo la función afterFind 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 a otro modelo. ¿Hay alguna forma de evitar esto? Estoy usando cake 1.3.4. Esta es una versión simplificada del comportamiento:comportamiento cakephp despuésEncuentre no invocado en los modelos relacionados

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

Desde PHP 5.4 en adelante, puede usar un Rasgo para esto - simplemente ponga su código 'afterFind()' en un nuevo archivo que contenga la declaración de rasgo (cambiando las referencias '$ model' a' $ this') e inclúyalo en la parte superior de su clase de modelo con la instrucción 'use'. Tendrá que usar 'App :: import()' o 'require()' para cargar el archivo que contiene su rasgo en la parte superior de su archivo de modelo. – BeesonBison

Respuesta

2

supongo que lo haría una de 2 cosas dependiendo de la forma genérica del bloque de código se aplica:

  1. versión universal: no utilizar un comportamiento, pero incluya su bloque de métodos en AppModel::afterFind
  2. Versión quirúrgica: use un comportamiento y conéctelo a cada modelo que necesite compartir la funcionalidad.
+0

(1) no funciona para mí porque solo se aplica a algunos modelos, pero no a todos. (2), es esencialmente lo que trato de hacer, pero no funciona cuando el modelo no es el modelo principal. – Tomba

+0

Lo que quiero decir es que literalmente se adjuntará el comportamiento a cada modelo para el que se necesita la funcionalidad . Los comportamientos no están destinados a operar contra modelos asociados. –

+0

Gracias. ¿A qué te refieres con "adjuntar literalmente el comportamiento a cada modelo"? – Tomba

2

no se supone un comportamiento a trabajar en modelos relacionados, por ejemplo, si usted tiene estos dos modelos:

app/modelos/product.php

<?php 

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

?> 

de aplicaciones /models/category.php

<?php 

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

?> 

SomeBehavior solamente se ejecuta cuando se llama a los métodos para el producto, ya que el comportamiento no está asociado con la categoría

+0

He reformulado mi comentario ... No quiero que funcione en modelos relacionados, Quiero que funcione en un modelo, ya sea que se llame como el modelo principal o no. En su ejemplo, asociaría el comportamiento con Categoría en lugar de Producto, y me gustaría llamar a las funciones de devolución de llamada si Categoría es el modelo principal (/ categories/view/1) o cuando se llama por producto (/ products/ver/1). Actualmente, las funciones de devolución de llamada de comportamiento solo se invocan en el primer caso. Si pongo la función de devolución de llamada en el modelo de Categoría en lugar de en un comportamiento, se llama en ambos casos. – Tomba

2

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

Configurar un evento que hace el formateo - desencadenar ese evento sin embargo es necesario. Fácil como Cake.

+0

Gracias por la sugerencia. Lo miraré. – Tomba

+1

Cada vez que sugiero el plugin Eventful, alguien me sube en unos minutos. Me pregunto si es m3nt0r (el autor) –

Cuestiones relacionadas