2010-10-06 9 views
5

मैं एक टेबल है कि एक Symfony 1.4 परियोजना है कि मैं कर रहा हूँ के विकास पर i18n व्यवहार का उपयोग कर रहे साथ एक छोटी सी समस्या आ रही है। निम्नलिखित मॉडल YAML पर परिभाषित पर उदाहरण के लिए (मैं दूसरों है कि एक ही पैटर्न का पालन किया है):सिद्धांत postSave, postUpdate और अंतर्राष्ट्रीयकरण (संशोधन का पता लगाने)

Subject: 
    actAs: 
    Timestampable: ~ 
    I18n: 
     fields: [name] 
    columns: 
    name: { type: string(255), notnull: true } 
    relations: 
    Publications: 
     class: Publication 
     refClass: PublicationSubject 
     local: subject_id 
     foreign: publication_id 

मैं केवल नाम फ़ील्ड कि अंतरराष्ट्रीयकरण है लेकिन पर सेव (भाषाओं में से एक में फेरबदल एक फार्म पर के बाद) postUpdate ($ event) विधि ट्रिगर नहीं होती है। मैंने सोचा, ठीक है, मैं पोस्टसेव ($ इवेंट) विधि का उपयोग कर सकता हूं और जांच सकता हूं कि यह संशोधित है या नहीं, लेकिन यह हमेशा झूठा रिटर्न देता है। तो मैं कैसे पता लगा सकता हूं कि एक अंतर्राष्ट्रीयकृत मॉडल मॉडल संशोधित हुआ है या नहीं?

अग्रिम धन्यवाद;)

+1

क्या कोई ऐसा व्यक्ति है जिसने एक ही समस्या का सामना किया है? – petersaints

+0

इस समस्या को पुनर्जीवित करने के लिए खेद है, लेकिन मेरे पास पोस्टसेव विधि के साथ समान अंतराल है: i18n फ़ील्ड एक नए रिकॉर्ड पर पहली बार सहेजे नहीं जाते हैं। – 4levels

उत्तर

0

किसी भी सिद्धांत रिकॉर्ड पर आप सिर्फ

$record->isModified(); 

कर सकते हैं और अगर आप पता लगाने के लिए चाहते हैं, तो एक विशेष क्षेत्र संशोधित किया गया है आप कर सकते हैं।

$modified = $record->getModified(); 
if(isset($modified['fieldName'])) 
{ 
    //do something 
} 

आशा है कि

1

संक्षिप्त उत्तर मैं है पाया मदद करता है, वहाँ कोई i18n रूपों का उपयोग कर एक आसान या सुरुचिपूर्ण तरीका है।

मुझे ऐसा करने का स्पष्ट तरीका नहीं मिला, समस्या यह है कि सिम्फनी में i18n रूप सीधे $ रिकॉर्ड के साथ काम करता है-> अनुवाद, सिम्फनी किसी भी _set विधि का उपयोग नहीं करता है, इस मामले में, वहां है केवल रिकॉर्ड ट्रांसलेशन ऑब्जेक्ट में मूल रिकॉर्ड (विषय) में कोई संशोधन नहीं।

शायद अगर आप अपने रिकॉर्ड फॉर्म (विषयफॉर्म) में saveEmbeddedForms विधि को ओवरराइड करते हैं, तो सभी i18n रूपों पर पुनरावृत्त करते हैं और संशोधित किए गए प्रत्येक के लिए पता लगाते हैं, और आखिरकार मूल रिकॉर्ड को संशोधित करने के रूप में किसी तरीके या ध्वज में संशोधित करते हैं, इसलिए जब यह घटना पोस्ट बचाया गया हैसेव ट्रिगर किया जाएगा।

public $already_saved; 

    public function doSave($con = null) { 
    $this->already_saved = $this->object->isModified(); 
    parent::doSave($con); 
    } 



public function saveEmbeddedForms($con = null,$forms = null){ 

if (null === $con) 
    $con = $this->getConnection(); 


if (null === $forms) 
    $forms = $this->embeddedForms; 

foreach($forms as $form) { 
    if (count($form->object->isModified()) != 0){ 
    $mark_for_save = true; 
    break; 
    } 
} 
parent::saveEmbeddedForms($con, $forms); 
if (@$mark_for_save && !$this->already_saved) { 
    $this->object->postSave(); 
} 

    } 
0

सिद्धांत रिकॉर्ड हुक (preInsert, postInsert, आदि) trigerred नहीं कर रहे हैं जब DQL या सादे एसक्यूएल रिकॉर्ड को बदलने के लिए प्रयोग किया जाता है।

मैं sfDoctrineObjectForm में याद तो उन्हें भी बुलाया नहीं कर रहे हैं, और आप या तो व्यवहार (ज्यादा बेहतर imho बाद है) जोड़ने के लिए या उन्हें सीधे फोन करने के लिए

सादर doSave तरह प्रपत्र वर्ग, में तरीकों को ओवरराइड करने के लिए है, ,

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