2010-10-26 8 views
6

पर कहा जाता है। यह बढ़िया काम करता है। अगर मैं एक व्यवहार में afterFind समारोह के लिए कदम (एक प्लगइन में) यह अभी भी काम करता है, लेकिन केवल जब ब्याज की मॉडल प्राथमिक मॉडल है, यानी यह जब एक और मॉडल belongsTo मॉडल कहा जाता नहीं है। क्या इस के चारों ओर कोई रास्ता है? मैं केक 1.3.4 का उपयोग कर रहा हूँ।CakePHP व्यवहार afterFind नहीं मैं एक afterFind समारोह का उपयोग कर रहा एक खोज समारोह से डेटा को संशोधित करने संबंधित मॉडल

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

पीएचपी 5.4 से और ऊपर, तो आप इस के लिए एक विशेषता इस्तेमाल कर सकते हैं - बस (बदलते '$ this' को' $ model' संदर्भ) एक नई विशेषता घोषणा युक्त फ़ाइल में अपने 'afterFind()' कोड डाल दिया और इसे शामिल 'उपयोग' कथन के साथ अपने मॉडल वर्ग के शीर्ष पर। आपको अपनी मॉडल फ़ाइल के शीर्ष पर अपनी विशेषता वाले फ़ाइल को लोड करने के लिए 'ऐप :: आयात() 'या' आवश्यकता() 'का उपयोग करने की आवश्यकता होगी। – BeesonBison

उत्तर

2

मुझे लगता है मैं 2 चीजों में से एक है कि कैसे सामान्य रूप से कोड ब्लॉक लागू होता है के आधार पर करते हैं चाहते हैं::

  1. यूनिवर्सल संस्करण: यह व्यवहार का एक सरलीकृत संस्करण है, एक व्यवहार का उपयोग नहीं लेकिन एक व्यवहार का उपयोग करें और प्रत्येक मॉडल कार्यक्षमता भी साझा करने की आवश्यकता है के लिए देते: AppModel::afterFind
  2. सर्जिकल संस्करण में अपने विधि ब्लॉक शामिल हैं।
+0

(1) मेरे लिए काम नहीं करता है क्योंकि यह केवल मॉडल कुछ करने के लिए लागू होता है, लेकिन सभी नहीं,। (2), अनिवार्य रूप से मैं जो करने की कोशिश कर रहा हूं, लेकिन यह काम नहीं करता है जब मॉडल प्राथमिक मॉडल नहीं है – Tomba

+0

मेरा मतलब यह है कि आप _literally_ प्रत्येक मॉडल को व्यवहार संलग्न करेंगे जिसके लिए आपको कार्यक्षमता की आवश्यकता है । व्यवहार संबंधित मॉडल के खिलाफ काम करने का इरादा नहीं है। –

+0

धन्यवाद। "सचमुच हर मॉडल के व्यवहार को संलग्न करके" का क्या मतलब है? – Tomba

2

एक व्यवहार, संबंधित मॉडल पर काम करने के लिए उदाहरण के लिए माना जाता है, अगर आप इस दो मॉडल हैं:

एप्लिकेशन/मॉडल/product.php

<?php 

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

?> 

एप्लिकेशन /models/category.php

<?php 

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

?> 

SomeBehavior सिर्फ इसलिए व्यवहार श्रेणी

+0

मैंने अपनी टिप्पणी दोबारा शुरू की है .. मैं नहीं चाहता कि यह संबंधित मॉडलों पर काम करे, मैं इसे मॉडल पर काम करना चाहता हूं चाहे इसे प्राथमिक मॉडल कहा जाए या नहीं। आपके उदाहरण में, मैं उत्पाद के बजाय व्यवहार के साथ व्यवहार को जोड़ता हूं, और मैं कॉलबैक फ़ंक्शंस को कॉल करना चाहता हूं कि श्रेणी प्राथमिक मॉडल (/ श्रेणियां/दृश्य/1) है या जब इसे उत्पाद (/ उत्पादों/देखें/1)। वर्तमान में, व्यवहार कॉलबैक फ़ंक्शन केवल पूर्व मामले में ही बुलाए जाते हैं। अगर मैं किसी व्यवहार के बजाय श्रेणी मॉडल में कॉलबैक फ़ंक्शन डालता हूं, तो इसे दोनों मामलों में बुलाया जाता है। – Tomba

2

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

एक घटना है कि स्वरूपण करता है सेट अप के साथ संबद्ध नहीं है, जब उत्पाद के लिए तरीके बुला निष्पादित किया जाएगा - लेकिन उस घटना को ट्रिगर आप की जरूरत है। केक के रूप में आसान है।

+0

सुझाव के लिए धन्यवाद। मैं इस पर गौर करूंगा। – Tomba

+1

हर बार जब मैं इवेंटफुल प्लगइन का सुझाव देता हूं तो मुझे कुछ मिनटों में मुझे ऊपर ले जाता है - यह आश्चर्य करना होगा कि यह m3nt0r है (लेखक) –

संबंधित मुद्दे