سلوك CakePhP بعد الوفاة لم يتم استدعاء النماذج ذات الصلة

StackOverflow https://stackoverflow.com/questions/4028441

سؤال

أنا أستخدم دالة Afterfind لتعديل البيانات من دالة البحث. أنه يعمل بشكل جيد. إذا قمت بنقل وظيفة Afterfind إلى سلوك (في البرنامج المساعد) ، فلا يزال يعمل ، ولكن فقط عندما يكون نموذج الاهتمام هو النموذج الأساسي ، أي أنه لا يسمى عندما ينتمي النموذج نموذج آخر. هل هناك أي طريقة جولة هذا؟ أنا أستخدم الكعكة 1.3.4. هذه نسخة مبسطة من السلوك:

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;
    }
}
هل كانت مفيدة؟

المحلول

أعتقد أنني سأقوم بأحد أمرين اعتمادًا على كيفية تطبيق كتلة التعليمات البرمجية بشكل عام:

  1. الإصدار العالمي: لا تستخدم سلوكًا ، ولكن قم بتضمين كتلة الطريقة في AppModel::afterFind
  2. الإصدار الجراحي: استخدم سلوكًا وأرفقه بكل نموذج يحتاج إلى مشاركة الوظيفة.

نصائح أخرى

لا يُفترض أن يعمل السلوك على النماذج ذات الصلة ، على سبيل المثال ، إذا كان لديك هذين النموذجين:

التطبيق/النماذج/المنتج

<?php

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

?>

التطبيق/النماذج/الفئة

<?php 

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

?>

بعض السلوك لن يتم تنفيذها إلا عند استدعاء أساليب المنتج ، لأن السلوك لا يرتبط بالفئة

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

قم بإعداد حدث يقوم بالتنسيق - قم بإعداد هذا الحدث ، كما تحتاج إلى ذلك. سهل مثل الكعكة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top