2013-02-06 36 views
9

मैं एक घटक (फ्रंट एंड) बनाने की कोशिश कर रहा हूं जो एकाधिक तालिकाओं का उपयोग करता है। मुझे 1 या 2 पद मिले जो आंशिक रूप से प्रश्न का उत्तर देता है लेकिन वास्तव में कोई भी नहीं करता है। यह बिंदु हमेशा के लिए सरल और स्पष्ट लगता है जो इसे जानता है कि यह कैसे करना है लेकिन इसे वास्तव में कभी समझाया नहीं गया है (या मुझे सही पोस्ट याद आया)। डेटा कि जूमला यानी # __users_complementsजूमला घटक में एकाधिक तालिकाओं को लिखें?

में शामिल नहीं हैं स्टोर करने के लिए एक अतिरिक्त तालिका मानक जूमला उपयोगकर्ता तालिका यानी # __users :

मेरी घटक में, उपयोगकर्ता एक दृश्य में डेटा दो तालिकाओं में संग्रहीत करने की आवश्यकता है में प्रवेश करती है

मैं एक नौसिखिया हूं, इसलिए शायद मैं गलत हूं, लेकिन मुझे समझ में आया कि जूमला के मानक कार्य केवल एक तालिका में एक फॉर्म के परिणाम सहेज सकते हैं। मेरे मामले में, मुझे लगता है कि मुझे अपने मॉडल में मानक कार्यों को ओवरराइड करना होगा: com_component/model/my_model.php।

1) मैं उलझन में हूं क्योंकि मुझे वास्तव में समझ में नहीं आता कि कौन सा फ़ंक्शन ओवरराइड होना चाहिए: save()? दुकान()? अन्य?

2) मान लीजिए कि मैं सेव() फ़ंक्शन को ओवरराइड करता हूं, क्या मुझे डेटा को सहेजने के लिए सभी कोड को फिर से लिखना चाहिए (डेटा सरणी विस्फोट करना और सभी अपडेट क्वेरी बनाना) या मुझे 2 मानक टेबल ऑब्जेक्ट्स बनाना चाहिए।

इस मामले में, (2 ऑब्जेक्ट्स) प्रत्येक बार संपूर्ण डेटा सरणी को मूल कार्य में भेजने के लिए अजीब लगता है क्योंकि मुझे पता है कि एक भाग तालिका 1 के लिए है और तालिका के लिए दूसरा भाग 2. मुझे सक्षम होना चाहिए मैं पहले विभाजित करने के लिए नहीं?

3) क्या मुझे 2 मॉडल बनाना चाहिए और उन मॉडलों को अपने नियंत्रक से प्रबंधित करना चाहिए जब मैं फॉर्म से डेटा वापस लेता हूं और मॉडल के सेव फ़ंक्शन को कॉल करता हूं?

क्या आप मुझे यह समझाने में मदद कर सकते हैं कि एकाधिक तालिकाओं में यह बचत कैसे करें? कोड के साथ एक उदाहरण की बहुत सराहना की जाएगी। धन्यवाद

उत्तर

18

मैंने अंततः इसे बनाया। जैसा कि मैंने इस पर कई घंटे बिताए और पाया कि बहुत सारे लोग जहां उत्तर की तलाश में है, यहां मैंने ऐसा किया है।

  1. घटक प्रवेश बिंदु
  2. घटक नियंत्रक
  3. अंततः घटक रूटर
  4. घटक दृश्य
  5. घटक मॉडल:

    मुझे लगता है कि आप एक घटक बनाने का तरीका, मानक MVC संरचना का उपयोग पता है

  6. घटक नियंत्रक

मॉडल में घटकों \ my_component \ मॉडल \ my_model.php बनाने अपने खुद के बचाने के समारोह

public function save($data) 
{ 
    // Initialise variables. 
    $userId = (!empty($data['id'])) ? $data['id'] : (int)$this->getState('user.id'); 
    $user = JFactory::getUser(); 

    $table_one = $this->getTable('TableOne', 'MyComponentTable', array()); 
    $table_two = $this->getTable('TableTwo', 'MyComponentTable', array()); 

    // Bind the data. 
    if (!$table_one->bind($data)) 
    { 
     $this->setError(JText::sprintf('USERS PROFILE BIND FAILED', $user->getError())); 
     return false; 
    } 

    if (!$table_two->bind($data)) 
    { 
     $this->setError(JText::sprintf('USERS PROFILE BIND FAILED', $user->getError())); 
     return false; 
    } 

    // Store the data. 
    if (!$table_one->save($data)) 
    { 
     $this->setError($user->getError()); 
     return false; 
    } 

    if (!$table_two->save($data)) 
    { 
     $this->setError($user->getError()); 
     return false; 
    } 

    return $user->id; 
} 

बेशक, आप gettable समारोह को बचाने के समारोह में कहा जाता है की जरूरत है

public function getTable($type = 'TableOne', $prefix = 'MyComponentTable', $config = array()) 
{ 
    // call the administrator\components\com_mycomponent\tables\__tablename__.php 
    $this->addTablePath(JPATH_COMPONENT_ADMINISTRATOR . '/tables'); 
    return JTable::getInstance($type, $prefix, $config); 
} 

और यह काम करता हैं! बहुत आसन! बेशक, जैसा कि मैंने अपने प्रश्न में कहा था कि पूरा $ डेटा माता-पिता सेव() फ़ंक्शन को डेटा_ऑन या table_two के लिए आवश्यक डेटा के साथ भेजा जाता है। यह मानक जूमला संरचना (कोड में कोई हैक या सीधी क्वेरी) के साथ इस तरह काम करता है।

उम्मीद है कि यह मदद करता है।

+0

अच्छा। यह जांचने का लाभ है कि आप कुछ भी सहेजने से पहले दोनों टेबलों से जुड़ सकते हैं। –

+1

जूमला 3 जेटीबल में बाध्य ($ डेटा) का उपयोग कर विधि सहेजें, इसलिए सहेजने के तरीके से पहले डेटा को बाध्य करने की आवश्यकता नहीं है। – 3ehrang

2

वहां ऐसे लोग हो सकते हैं जो इस विधि से असहमत हैं कि निम्न विधि एमवीसी संरचना को थोड़ा सा बाधित करती है, लेकिन मुझे यह मेरे लिए सबसे सरल माना गया है।

आमतौर पर, आपके पास एक मॉडल है जो टेबल में से एक फिट बैठता है। अपने घटक में एक उपयोगकर्ता तालिका में डेटा के साथ-साथ आगे बढ़ाने के साथ अपने उदाहरण में, मैं निम्नलिखित मॉडल के लिए मेज के लिए अपने घटक में जोड़ना होगा:

public function save($data) { 
    if (!parent::save($data)) { 
     return false; 
    } 

    // add necessary code to save to the users table, since there isn't a standard way to do this that I'm aware of 

    // sometimes I will grab another model even 
    require_once(JPATH_BASE . '/administrator/components/com_users/models/user.php'); 
    $other_model = $this->getInstance('user', 'UsersModel'); 
    $other_model->save($data); 

    return true; 
} 

इस समारोह के पहले भाग डेटा को बचाने चाहिए घटकों की मेज पर सामान्य की तरह। लेकिन आप जो कुछ भी करना चाहते हैं उसे बनाने के लिए आपको शेष घटक पर जो चाहिए उसे हल कर सकते हैं।

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

इसके अलावा, प्रॉम्प्ट 3 के लिए, यदि आप कभी-कभी केवल एक टेबल को सहेजने की ज़रूरत होती है और कभी-कभी दोनों को सहेजने की आवश्यकता होती है तो मैं नियंत्रक में संभाल लेता हूं। मैंने पाया है कि सहेजे गए कार्यों को चलाने के लिए बहुत सुरक्षित हैं, भले ही भागों को लोड नहीं किया जाता है, इसलिए मैं आमतौर पर इसे चलाने देता हूं।

+0

धन्यवाद डेविड, मैंने एक और तरीका पसंद किया (मेरा अपना जवाब देखें)। –

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