2011-11-15 10 views
5

में एकाधिक मॉडल का विस्तार करना आप कई मॉडलों के विस्तार की अनुमति देने के लिए सीआई 2 कैसे सेट अप करते हैं?कोडिनेटर 2

मैं इसे नामित एक मॉडल (डाल/एप्लिकेशन/कोर) में विस्तारित करने के लिए प्राप्त कर सकता हूं MY_Model (केस संवेदनशील)।

यह चुनने के लिए कि कौन सा मॉडल विस्तारित करना है; मॉडल में ..

require_once APPPATH.'core/MY_Another_model.php'; 
class Test_model extends MY_Another_model { 
... 
} 

मैं नहीं मिल सकता है, जहां कोर प्रणाली कोड जहां यह केवल कहा गया है मॉडल है कि बढ़ाया जा रहा है MY_Model के नाम से जाना अनुमति देने के लिए।

किसी भी और सभी मदद के लिए धन्यवाद।

उत्तर

4

As I said in this question about the controllers आप दोनों ही कक्षाओं को एक ही MY_Model फ़ाइल में डाल दें। यह फ़ाइल कोडनिर्देशक की स्वत: लोड सुविधा के हिस्से के रूप में उपयोग की जाती है, जिसका अर्थ है कि यह MY_ (या कॉन्फ़िगर परिभाषित) उपसर्ग के साथ किसी भी फाइल की तलाश करेगा।

तुम भी आप संभावित यह MY_Special_Model फोन और MY_Another_Model हो सकता है सीधे नीचे

+0

यह वही है जो मैं करता हूं! यह सुंदर नहीं है क्योंकि मुझे प्रत्येक वर्ग को एक अलग फ़ाइल में रखना पसंद है ... लेकिन सीआई में यह एकमात्र तरीका है जिसे मैं प्राप्त कर सकता हूं। – MikeMurko

+0

@ माइकमुर्को अलग-अलग फाइलों में अलग-अलग वर्गों का तरीका है, लेकिन इसमें कस्टम लोडर क्लास बनाना शामिल है और यह समय और प्रयास के लायक नहीं है। –

+0

@CubedEye संकेत के लिए धन्यवाद - MY_Model.php में महान निम्नलिखित वर्ग :) –

9

मैं कोशिश की है Cubed नेत्र के रास्ते MY_Model अंदर वर्ग कॉल करने की आवश्यकता नहीं है, और यह काम करता है, लेकिन यहाँ एक और विकल्प है:

अपनी autoload.php फ़ाइल में एक मॉडल जोड़ने का प्रयास करें। यह MY_Model (जो CI_Model से विरासत) से विरासत सकता है, और किसी भी अतिरिक्त मॉडल आप लोड यह से विरासत सकता है:

class Extended_model extends MY_Model { 
    public function __construct() 
    { 
     parent::__construct(); 
     $this->load->model('Another_model'); 
    } 
} 

(मॉडल/Extended_model.php)

class Another_model extends Extended_model { 
} 

(मॉडल/Another_model.php)

संपादित करें: मुझे अभी एहसास हुआ कि आप अपने विस्तारित मॉडल को "कोर" फ़ोल्डर में डाल रहे हैं। यह केवल कक्षाओं के लिए जरूरी है जो कोर सीआई_ * कक्षाओं (यानी MY_Controller, MY_Model, MY_Input, आदि) का विस्तार करते हैं। यदि आपके पास कोई मॉडल MY_Model बढ़ाता है, तो इसे अपने मॉडल/फ़ोल्डर में रखें, और इसे "MY_" से उपसर्ग न करें।

+0

पर हूं, भले ही मैंने उपर्युक्त उत्तर स्वीकार कर लिया है, मैंने इसे वोट दिया है क्योंकि मुझे एक फ़ाइल में उन्हें भरने के बजाय प्रति मॉडल अलग फाइलें पसंद हैं। – Rooneyl

1

अंततः आप इस हैक की कोशिश कर सकते, load_class फ़ंक्शन का उपयोग:
आवेदन/कोर/Special_model_class.php:

class CI_Special_model_class extends CI_Model {...} 

php फ़ाइल का नाम बिना है

यह अपने मॉडल विस्तार है सीआई_ उपसर्ग, हालांकि वर्ग स्वयं उपसर्ग के साथ है!

मॉडल इस वर्ग के मॉडल/फ़ोल्डर के भीतर के आधार पर:
आवेदन/मॉडल/one_model.php:

class One_model extends CI_Special_model_class {...} 

आदेश में इस काम बनाने के लिए, आप नियंत्रक से load_class समारोह फोन करना चाहिए:
आवेदन/नियंत्रक/एक_ctrl।php

.... 
load_class('Special_model_class', 'core'); 
$this->load->model('Special_model_class'); 
.... 

अंततः, आप सही यह परिभाषित करने से पहले मॉडल के भीतर load_class कॉल करने के लिए, कोशिश कर सकते हैं। आवेदन/मॉडल/one_model.php:

class MY_Model extends MY_Common_Model { 
    function inset_table($table_name) { 
     $this->connect(); 
     $this->insert_table($table_name); 

    } 
} 

में:

class MY_Common_Model extends CI_Model { 

    function __construct() { 
     parent::__construct(); 
    } 
     function drop_table($table_name) { 
     $this->connect(); 
     $this->dbforge->drop_table($table_name); 

    } 

} 

यहाँ बच्चे मॉडल वर्ग है:

load_class('Special_model_class', 'core'); 
class One_model extends CI_Special_model_class {...} 
0

यहाँ माता पिता मॉडल वर्ग है मॉडल:

$this->drop_table($edge_table);