DataObject पर आधिकारिक SS गाइड का पालन करना विस्तार, मैं इस अपवाद पर हो रहा हूँ:

पीएचपी नोटिस: अपरिभाषित सूचकांक: PrezzoIva

प्रोजेक्ट पैनोरमा: मुख्य write() निष्पादन से पहले, एक मान की गणना और अन्य DataObject गुणों के साथ जोड़ी में सहेजा जाना चाहिए। यहां स्थिति है (एसएस 4.0.3 पर):

[...] 
/**
 * Classe Prodotto
 */
class Prodotto extends DataObject
{
    // Dichiarazione Proprietà
    private static $db = [
        [...] 
        'PrezzoIva' => 'Currency',
        [...] 

onBeforeWrite विधि:

    /**
     * Metodo gestione azioni salvataggio
     * Calcolo automatico prezzo lordo e scontato
     * Setter
     * @return void
     */
    public function onBeforeWrite()
    {
        // Controllo Record
        if (!$this->isInDb()) {
            $this->setPrezzoIva();
            [...]
        }
        if (!$this->record['PrezzoIva']) { // <--- This is the line involved
            $this->setPrezzoIva();
        }
        [...]

        parent::onBeforeWrite();
    }

उपरोक्त एक द्वारा बुलाई गई विधि:

    /**
     * Metodo calcolo prezzo lordo IVA
     * Setter
     * @return void
     */
    public function setPrezzoIva()
    {
        // Controllo IVA
        if (empty($this->PrezzoIva)) {
            $prezzoIva = ($this->PrezzoUnitario * $this->Iva) + $this->PrezzoUnitario;

            // Salvataggio IVA
            $this->PrezzoIva = $prezzoIva;
        }
    }

या तो if (!$this->record['PrezzoIva']) को if (!isset($this->record['PrezzoIva'])) में बदलना अभी भी अपवाद है।

समर्थन के लिए अग्रिम धन्यवाद।

अपडेट करें

ऐसा लगता है कि onBeforeWrite के अंदर नियंत्रणों को नेस्ट करने से समस्या हल हो जाती है, लेकिन यह व्यावसायिक तर्क के अनुरूप नहीं है। onBeforeWrite के पहले प्रयास में, सिस्टम कोई $this->record['PrezzoIva'] नहीं देखता है, फिर विफल हो जाता है। दूसरी ओर, यदि नियंत्रणों को elseif के साथ नेस्ट किया जा रहा है, यदि अन्य रिकॉर्ड गायब हैं, तो इन्हें अनदेखा कर दिया जाता है। फिलहाल मैं इस पर काम कर रहा हूं। इस बीच, मैंने देखा कि शामिल फ़ील्ड को न तो write() कॉलिंग पर प्रारंभ किया गया है। और यह केवल $this->PrezzoIva के साथ होता है। अन्य क्षेत्रों को सही ढंग से सहेजा जा रहा है। यहाँ एक उदाहरण:

DB screen

0
Luca Cattide 18 अप्रैल 2018, 14:09

1 उत्तर

सबसे बढ़िया उत्तर

इस विशिष्ट मामले के लिए सही स्थिति पर काम करने से समस्या हल हो गई। पहले write() के बाद, यदि कोई this->record['PrezzoIva'] सेट नहीं है या यह शून्य के बराबर है (Currency डेटा प्रकार डिफ़ॉल्ट मान के अनुसार), तो विधि लागू की जाती है:

        // Controllo Record
        if (!$this->isInDb()) {
            $this->setPrezzoIva();
        }
        if ((!isset($this->record['PrezzoIva'])) || ($this->record['PrezzoIva'] == 0)) {
            $this->setPrezzoIva();
        }

नो-डेटा लिखित समस्या के बारे में, मैंने यहां एक नया खोला: SilverStripe - इससे पहले कोई डेटा नहीं लिखा गया है< /ए>

0
Luca Cattide 18 अप्रैल 2018, 18:32