शुक्रवार, 26 फ़रवरी 2010

कैलेंडर क्लास – कोड इग्नाइटर

कैलेंडर क्लास से आप डायनेमिक रूप से कैलेंडर बना सकते हैं. आप कैलेंडर को टेम्प्लेटों के द्वारा फ़ार्मेट कर सकते हैं जिससे आपको डिजाइन के विभिन्न पहलुओं पर पूरा नियंत्रण मिलता है. यहां तक कि आप अपना डाटा भी कैलेंडर के प्रकोष्ठों में में डाल सकते हैं.

क्लास को आरंभ करना

कोड इग्नाइटर की ज्यादातर अन्य क्लासों की ही तरह यह क्लास भी आपके कंट्रोलर से $this->load->library फ़ंग्शन द्वारा आरंभ की जा सकती है.

$this->load->library('calendar');

एक बार लोड हो जाने के बाद कैलेंडर आब्जेक्ट को आप $this->calendar का प्रयोग करके उपयोग कर सकते हैं.

कैलेंडर प्रदर्शित करना

कैलेंडर को प्रदर्शित करने का यहां एक बहुत ही आसान उदाहरण दिया गया है.

$this->load->library('calendar');
echo $this->calendar->generate();

ऊपर दिया हुआ कोड आपके सर्वर के अनुसार बताए गए वर्तमान माह/वर्ष के आधार पर एक कैलेंडर तैयार कर देगा. किसी माह/वर्ष विशेष का कैलेंडर प्राप्त करने के लिए आपको निम्नलिखित जानकारी generate फ़ंग्शन से गुजारनी होगी:

$this->load->library('calendar');
echo $this->calendar->generate(2006, 6);

ऊपर दिया हुआ कोड सन २००६ के जून माह का कैलेंडर पैदा करेगा. पहला पैरामीटर वर्ष को बताता है और दूसरा माह को.

कैलेंडर के प्रकोष्ठों में अपने आंकड़े प्रवेश कराना

कैलेंडर के प्रकोष्ठों में अपने आंकड़ों को जोड़ने के लिए आपको एक associative array का निर्माण करना होगा जिसकी कुंजियां दिनों को बताएं. एरे को generate फ़ंग्शन के तीसरे पैरामीटर के तौर पर गुजारा जाता है.

$this->load->library('calendar');
$data = array(
               3  => 'http://example.com/news/article/2006/03/',
               7  => 'http://example.com/news/article/2006/07/',
               13 => 'http://example.com/news/article/2006/13/',
               26 => 'http://example.com/news/article/2006/26/'
             );
echo $this->calendar->generate(2006, 6, $data);

ऊपर के उदाहरण में दिनांक ३,७,१३ तथा १६ लिंक बन जाएंगे और वो आपके द्वारा बताए गये यूआरएलों को इंगित करेंगे.

कृपया ध्यान दें: सामान्यत: यह माना जाता है कि आपकी एरे में लिंक होंगे. कैलेंडर टेम्प्लेट वाले अनुभाग में बताया गया है कि आप प्रकोष्ठों में प्रविष्ट कराए गये आंकड़ों को किस प्रकार से संभाला जाए, ताकि आप अलग तरह के आंकड़े भी गुजार पाएं.

प्रदर्शन वरीयताएं तय करना

आप सात वरीयता विकल्पों के द्वारा कैलेंडर के विभिन्न पहलुओं को नियंत्रित कर सकते हैं. वरीयताओं को तय करने के लिए आपको उनकी एक एरे बनाकर लोडिंग फ़ंग्शन के दूसरे पैरामीटर के रूप में गुजारना होता है. यहां एक उदाहरण है:

$prefs = array (
               'start_day'    => 'saturday',
               'month_type'   => 'long',
               'day_type'     => 'short'
             );
$this->load->library('calendar', $prefs);
echo $this->calendar->generate();

ऊपर दिया हुआ कोड कैलेंडर को शनिवार को शुरू करेगा, महीनों के नाम लंबे(long) रूप में शीर्षक के तौर पर लिखेगा तथा दिनों के नाम संक्षिप्त(short) रूप में लिखेगा. वरीयता विकल्पों के संबंध में अधिक जानकारी नीचे दी गई है.

Preference Default Value Options Description
template None None A string containing your calendar template. See the template section below.
local_time time() None A Unix timestamp corresponding to the current time.
start_day sunday Any week day (sunday, monday, tuesday, etc.) Sets the day of the week the calendar should start on.
month_type long long, short Determines what version of the month name to use in the header. long = January, short = Jan.
day_type abr long, short, abr Determines what version of the weekday names to use in the column headers. long = Sunday, short = Sun, abr = Su.
show_next_prev FALSE TRUE/FALSE (boolean) Determines whether to display links allowing you to toggle to next/previous months. See information on this feature below.
next_prev_url None A URL Sets the basepath used in the next/previous calendar links.

अगले-पिछले माह के लिंक दिखाना

आपका कैलेंडर next/previous लिंकों के द्वारा महीनों को डायनेमिक रूप से घटा बढ़ा सके इसके लिए जरूरी है कि आप अपने कैलेंडर का कोड इस प्रकार से लिखें.

$prefs = array (
               'show_next_prev'  => TRUE,
               'next_prev_url'   => 'http://example.com/index.php/calendar/show/'
             );
$this->load->library('calendar', $prefs);
echo $this->calendar->generate($this->uri->segment(3), $this->uri->segment(4));

आप ऊपर के उदाहरण में कुछ महत्वपूर्ण चीजें पाएंगे:

  • आपको "show_next_prev" को TRUE करना होगा(यानि कि सक्षम करना होगा).
  • आपको "next_prev_url" में आपको कैलेंडर वाले कंट्रोलर का यूआरएल लिखना होगा.
  • आपको यूआरआई के वर्ष तथा माह वाले खंडों को generate वाले फ़ंग्शन में बताना होगा. कृपया ध्यान दें कि कैलेंडर क्लास स्वत: ही आपके द्वारा दिये जाने वाले आधार यूआरएल में वर्ष और माह जोड़ लेती है.

एक कैलेंडर टेम्प्लेट बनाना

कैलेंडर टेम्प्लेट बनाने से आप अपने कैलेंडर के स्वरूप को पूरी तरह से नियंत्रित कर सकते हैं. जैसा कि नीचे दिया हुआ है आपके कैलेंडर का प्रत्येक हिस्सा स्यूडो वैरिएबलों के जोड़ों में रखा जाना चाहिए:

$prefs['template'] = '
{table_open}<table border="0" cellpadding="0" cellspacing="0">{/table_open}
{heading_row_start}<tr>{/heading_row_start}
{heading_previous_cell}<th><a href="{previous_url}">&lt;&lt;</a></th>{/heading_previous_cell}
{heading_title_cell}<th colspan="{colspan}">{heading}</th>{/heading_title_cell}
{heading_next_cell}<th><a href="{next_url}">&gt;&gt;</a></th>{/heading_next_cell}
{heading_row_end}</tr>{/heading_row_end}
{week_row_start}<tr>{/week_row_start}
{week_day_cell}<td>{week_day}</td>{/week_day_cell}
{week_row_end}</tr>{/week_row_end}
{cal_row_start}<tr>{/cal_row_start}
{cal_cell_start}<td>{/cal_cell_start}
{cal_cell_content}<a href="{content}">{day}</a>{/cal_cell_content}
{cal_cell_content_today}<div class="highlight"><a href="{content}">{day}</a></div>{/cal_cell_content_today}
{cal_cell_no_content}{day}{/cal_cell_no_content}
{cal_cell_no_content_today}<div class="highlight">{day}</div>{/cal_cell_no_content_today}
{cal_cell_blank}&nbsp;{/cal_cell_blank}
{cal_cell_end}</td>{/cal_cell_end}
{cal_row_end}</tr>{/cal_row_end}
{table_close}</table>{/table_close}
';
$this->load->library('calendar', $prefs);
echo $this->calendar->generate();

बेंचमार्किंग क्लास – कोड इग्नाइटर

कोड इग्नाइटर की बेंचमार्किंग क्लास हमेशा सक्रिय रहती है. यह क्लास हमें किन्ही दो बिंदुओं के बीच के अंतर की गणना करने की सुविधा प्रदान करती है.

कृपया ध्यान दें: यह क्लास; तंत्र के द्वारा स्वत: ही आरंभ कर दी जाती है अत: इसे खुद आरंभ करने की  जरूरत नही होती.

जैसे ही आपका फ़्रेमवर्क चालू होता है, बेंचमार्क चालू हो जाता है. और आपकी आउटपुट क्लास के ब्राउजर में परिणाम भेजने के ठीक पहले समाप्त हो जाता है. ऐसा होने से पूरे तंत्र के क्रियान्वयन के समय की बहुत ही सही जानकारी मिल पाती है.

बेंचमार्क क्लास का उपयोग करना

बेंचमार्क क्लास आपके कंट्रोलरों, व्यूओं अथवा माडलों में उपयोग की जा सकती है. इसे उपयोग करने की विधि इस प्रकार है:

  1. शुरुआती बिंदु चिन्हित करें.
  2. आखिरी या समाप्ति बिंदु चिन्हित करें.
  3. परिणाम देखने के लिए "elapsed time" फ़ंग्शन का क्रियान्वयन कराएं.

यहां एक उदाहरण दिया गया है:

$this->benchmark->mark('code_start');
// यहां पर अपना कोड लिखें
$this->benchmark->mark('code_end');
echo $this->benchmark->elapsed_time('code_start', 'code_end');

कृपया ध्यान दें: "code_start" तथा "code_end" शब्द स्वेच्छा से कुछ भी रखे जा सकते हैं. वो बिंदुओं को चिन्हित करने के लिए मात्र उपयोग किये जाते हैं. आप एक से अधिक बिंदुओं को भी चिन्हित कर सकते हैं. जैसे:

$this->benchmark->mark('dog');
// यहां कुछ कोड लिखें
$this->benchmark->mark('cat');
// यहां कुछ और कोड लिखें
$this->benchmark->mark('bird');
echo $this->benchmark->elapsed_time('dog', 'cat');
echo $this->benchmark->elapsed_time('cat', 'bird');
echo $this->benchmark->elapsed_time('dog', 'bird');

अपने बेंचमार्क बिंदुओं को प्रोफ़ाइल करें

यदि आप चाहते हैं कि आपकी बेंचमार्किंग के आंकड़े Profiler को उपलब्ध हो तो आप को चिन्हित बिंदुओं को जोड़े में रखना होगा और प्रत्येक चिन्हित बिंदु का नाम _start तथा _end शब्द से खत्म होगा. प्रत्येक जोड़े के बिंदुओं के शेष नाम एक समान रखने होंगे. जैसे:

$this->benchmark->mark('my_mark_start');
// यहां पर अपना कोड लिखें
$this->benchmark->mark('my_mark_end');
$this->benchmark->mark('another_mark_start');
// यहां पर अपना कोड लिखें
$this->benchmark->mark('another_mark_end');

क्रियान्वयन में लगने वाले कुल समय को प्रदर्शित करना

यदि आप कोड इग्नाइटर के शुरू होने से लेकर ब्राउजर में परिणाम भेजने तक के समय को जानना चाहते हैं तो निम्नलिखित कोड को अपनी व्यू टेम्प्लेटों में लिख दें:

<?php echo $this->benchmark->elapsed_time();?>

आपने ध्यान दिया होगा कि यही फ़ंग्शन ऊपर के उदाहरणों में भी प्रयोग किया गया था, बस आप यहां किसी पैरामीटर का उपयोग नही कर रहे हैं. जब पैरामीटर अनुपस्थित रहते हैं तब कोड इग्नाइटर बेंचमार्क को तब तक नही रोकता है जब तक कि पूरा आउटपुट परिणाम ब्राउजर में न भेज दिया जाए. इस बात से कोई फ़र्क नही पड़ता कि आप इस फ़ंग्शन को कहां उपयोग करते हैं.

यदि आप शुद्ध पीएचपी का प्रयोग करना नही चाहते तो इसी चीज को दिखाने का एक वैकल्पिक तरीका स्यूडो वैरिएबल का प्रयोग भी कर सकते है

{elapsed_time}

कृपया ध्यान दें: यदि आप कंट्रोलर में किसी चीज को बेंचमार्क करना चाहते है तो आपको अपने शुरूआती तथा समाप्ति बिंदु चिन्हित करने होंगे.

मेमोरी खपत को दिखाना

यदि आपके पीएचपी को --enable-memory-limit से विन्यासित किया गया है तो आप निम्नलिखित कोड द्वारा पूरे तंत्र के द्वारा खपत हुई मेमोरी की जानकारी प्राप्त कर सकते हैं.

<?php echo $this->benchmark->memory_usage();?>

यदि आप शुद्ध पीएचपी का प्रयोग करना नही चाहते तो इसी चीज को दिखाने का एक वैकल्पिक तरीका स्यूडो वैरिएबल का प्रयोग भी कर सकते हैं.

{memory_usage}

बुधवार, 24 फ़रवरी 2010

सुरक्षा – कोड इग्नाइटर

यहां हम वेब सुरक्षा तथा कोड इग्निटर के आंतरिक सुरक्षा विशेषताओं के बारे चर्चा करेंगे.

यूआरआई सुरक्षा

कोड इग्निटर आपके यूआरआई के वर्णों के मामले में काफ़ी प्रतिबंधनात्मक रवैया अपनाता है. इससे यह चीजों को आपके अनुप्रयोग में घुसने से रोकता है. यूआर आई में केवल निम्न लिखित चीजें ही हो सकती हैं:
  • अल्फ़ा न्यूमेरिक टेक्स्ट यानि कि A-Z तथा अंक
  • टिल्ड: ~
  • पीरियड या बिंदी: .
  • अपूर्ण विराम या कालन: :
  • अधोडैश या अंडरस्कोर: _
  • डैश: -

GET, POST, तथा COOKIE के आंकड़े

GET डाटा को कोड इग्निटर अनुमति नही देता क्योंकि इसका तंत्र पारंपरिक क्वेरी स्ट्रिंग्स की बजाय यूआरआई के टुकड़ों का इस्तेमाल करता है(जब तक कि आपने अपनी कांफ़िग फ़ाइल से क्वेरी स्ट्रिंग को सक्षम ना कर दिया हो). तंत्र के आरंभ में ही सार्वभौमिक(Global) GET array को इनपुट क्लास के द्वारा unset कर दिया जाता है.

Register_globals

तंत्र के आरंभ में ही $_POST तथा $_COOKIE को छोड़कर सारे ग्लोबल वैरियेबलों को Unset कर दिया जाता है. ऐसा करना उतना ही प्रभावशाली है जितना कि register_globals = off करना.

magic_quotes_runtime

तंत्र के आरंभ में magic_quotes_runtime डायरेक्ट्रिव को आफ़ कर दिया जाता है ताकि आपको डाटाबेस से आने वाले डाटा में से स्लैश ना हटाने पड़ें.

सर्वोत्तम तरीके

अपने अनुप्रयोग में से कोई भी डाटा स्वीकार करने से पहले (चाहे यह फ़ार्मों के द्वारा जमा किये जाने वाला POST डाटा हो, COOKIE डाटा, URI डाटा, XML-RPC डाटा अथवा SERVER array से प्राप्त होने वाला कोई डाटा) आपको निम्नलिखित तीन चरण वाला तरीका अपनाना चाहिए:
  1. आंकडों को साफ़ कर लीजिये इसमें दूषित तत्व हो सकते हैं.
  2. आंकड़ों की पुष्टि करें ताकि यह निश्चित हो जाये कि यह सही प्रकार और आकार का है.(कभी कभी इस चरण को पहले चरण की जगह प्रयोग किया जाता है.)
  3. डाटाबेस में भेजने के पहले आंकड़ों को Escape कीजिये.
इसके लिये कोड इग्निटर आपको निम्न लिखित फ़ंग्शन उपलब्ध कराता है.

  • XSS की सफ़ाई करना

    कोड इग्निटर एक क्रास साइट स्क्रिप्टिंग फ़िल्टर के साथ आता है. यह फ़िल्टर जावास्क्रिप्ट को आपके डाटा में लगाने/बैठाने वाली अथवा अन्य तरह के कोडों पर को कुकीज को हाईजैक करने वाली अक्सर उपयोग में आने वाली तकनीकों पर नजर रखता है. XSS Filter का को यहां पर वर्णित किया गया है.

  • आंकड़ों की पुष्टि करना

    कोड इग्निटर के पास एक Form Validation Class है जो कि आकड़ों की सफ़ाई, पुष्टि तथा तैयार करने में आपकी मदत करेगी.

  • डाटाबेस में प्रविष्टि से पहले सारे आंकड़ों को एस्केप कर दें.

    कभी भी अपने डाटाबेस में कोई जानकारी बिना एस्केप किये मत भेजिये. अधिक जानकारी के लिये कृपया queries से संबंधित अनुभाग देखें.

व्यू फ़ाइलों के लिये वैकल्पिक पीएचपी सिंटेक्स – कोड इग्नाइटर

यदि आप कोड इग्नाइटर के टेम्प्लेट इंजन का प्रयोग नही करते हैं तो आपको व्यू फ़ाइलों में शुद्ध पीएचपी का प्रयोग करना होगा. इन फ़ाइलों में पीएचपी का प्रयोग न्यूनतम करने के लिये तथा कोड ब्लाक्स को आसान बनाने के लिये यह अनुसंशित किया जाता है कि आप पीएचपी के वैकल्पिक सिंटेक्स तथा छोटे echo का प्रयोग करें. यदि आप इन सिंटेक्सों के बारे में नही जानते हैं तो बता दूं कि ये आपके कोड से धनुकोष्ठकों(braces) को हटानें में मदत करेंगे तथा "echo" स्टेटमेंट्स को भी हटा देंगे.

स्वचालित संक्षेपित टैग(शार्ट टैग्स) समर्थन

नोट: यदि इस पेज में बताये गए सिंटेक्स आपके सर्वर में काम नही कर रहे हैं तो इसका मतलब है कि आपकी php.ini फ़ाइल में "short tags" को अक्षम किया गया है. यद्यपि कोड इग्नाइटर शार्ट टैग्स को दोबारा लिखता है ताकि आपका अनुप्रयोग उस समय भी चल सके जब आपका सर्वर उसे समर्थन ना दे. इस सुविधा को config/config.php फ़ाइल से सक्षम किया जा सकता है.

कृपया नोट करें कि यदि आप इस सुविधा का उपयोग करते हैं तो व्यू फ़ाइलों में होने वाली त्रुटियों के लाइन नम्बरों को सही तरीके से नही दिखाया जायेगा. इसकी बजाय सभी त्रुटियां eval() त्रुटियों के तौर पर दिखाई देंगी.

Echo का विकल्प

सामान्यत: किसी वैरियेबल को प्रिंट करने के लिये आप ये कोड लिखते हैं:

<?php echo $variable; ?>

वैकल्पिक सिंटेक्स के द्वारा आप इसे कुछ ऐसे लिख सकते हैं.

<?=$variable?>

वैकल्पिक कंट्रोल संरचना

कंट्रोल स्ट्रक्चर जैसे if, for, foreach, and while को सरल रूप में भी लिखा जा सकता है. यहां foreach का एक उदाहरण दिया हुआ है:

<ul>
<?php foreach($todo as $item): ?>
<li><?=$item?></li>
<?php endforeach; ?>
</ul>

ध्यान दें कि यहां कोई धनुकोष्ठक(braces) नही हैं. बल्कि आखिरी धनुकोष्ठक(brace) की बजाय endforeach लिखा गया है. ऊपर दिये गये हर कंट्रोल स्ट्रक्चर को इसी तरह बंद किया जा सकता है जैसे: endif, endfor, endforeach, and endwhile

एक बात और नोट करें कि अर्धविराम(semi-colon) की बजाय हमने अपूर्ण विराम(colon) का प्रयोग किया है(आखिरी वाले को छोड़कर). यह चीज जरूरी है.

यहां एक दूसरा उदाहरण है. अपूर्ण विरामों(colon) पर ध्यान दीजिये:

<?php if ($username == 'sally'): ?>
   <h3>Hi Sally</h3>
<?php elseif ($username == 'joe'): ?>
   <h3>Hi Joe</h3>
<?php else: ?>
   <h3>Hi unknown user</h3>
<?php endif; ?>

मंगलवार, 23 फ़रवरी 2010

अनुप्रयोगों का प्रबंधन – कोड इग्नाइटर

सामान्यत: यह मान के चला जाता है कि आप कोड इग्नाइटर का प्रयोग केवल एक ही अनुप्रयोग में करेंगे, जिसे आप system/application/ डायरेक्ट्री में बनाते हैं. यद्यपि कोड इग्नाइटर की केवल एक ही स्थापना से यह संभव है कि आप कई एप्लीकेशनों को उससे प्रबंधित कर पायें. आप अपने application फ़ोल्डर का नाम भी बदल सकते हैं. यहां तक कि उसकी जगह भी.

एप्लीकेशन फ़ोल्डर का नाम बदलना

यदि आप अपने application फ़ोल्डर का नाम बदलना चाहते हैं तो आप ऐसा कर सकते हैं. हां इसके लिये आपको अपनी index.php फ़ाइल खोलकर उसमें $application_folder वैरिएबल का नाम बदलना पड़ेगा.

$application_folder = "application";

एप्लीकेशन फ़ोल्डर की जगह बदलना

कोड इग्नाइटर में आप अपने application फ़ोल्डर की जगह को भी बदलकर दूसरी जगह ले जा सकते हैं. ऐसा करने के लिये आपको मुख्य index.php फ़ाइल में $application_folder वैरिएबल में पूरा सर्वर पाथ भरना पड़ेगा.

$application_folder = "/Path/to/your/application";

कोड इग्नाइटर की एक ही स्थापना से कई अनुप्रयोगों को चलाना

यदि आप कोड इग्नाइटर के साझा इंस्टालेशन से एक से ज्यादा अनुप्रयोगों को चलाना चाहते हैं तो application फ़ोल्डर में सीधे एक डायरेक्ट्री बनाइये और application फ़ोल्डर के भीतर की सारी डायरेक्ट्रियों को उस नई डायरेक्ट्री के भीतर रख दीजिये.

उदाहरण के लिये, आप "foo" तथा "bar" नाम के दो एप्लीकेशन बनाना चाहते हैं. तो आप अपना एप्लीकेशन फ़ोल्डर कुछ इस प्रकार व्यवस्थित करेंगे.

system/application/foo/
system/application/foo/config/
system/application/foo/controllers/
system/application/foo/errors/
system/application/foo/libraries/
system/application/foo/models/
system/application/foo/views/
system/application/bar/
system/application/bar/config/
system/application/bar/controllers/
system/application/bar/errors/
system/application/bar/libraries/
system/application/bar/models/
system/application/bar/views/

किसी विशिष्ट अनुप्रयोग को चुनने के लिये आपको index.php फ़ाइल खोलनी पड़ेगी और $application_folder वैरिएबल का मान बदलना पड़ेगा. जैसे "foo" एप्लीकेशन को चुनने के लिये आप कुछ ऐसा लिखेंगे:

$application_folder = "application/foo";

कृपया ध्यान दें: आपके प्रत्येक अनुप्रयोग को अपनी स्वयं की index.php फ़ाइल की जरूरत होती है. index.php फ़ाइल का नाम कुछ भी रखा जा सकता है.

अपने अनुप्रयोग को Profile करना – कोड इग्नाइटर

Profiler Class आपके पेज के नीचे बेंचमार्क परिणाम, क्वेरी जो आप चला रहे हैं तथा $_POST डाटा को दिखाती है. यह जानकारी डेवलपमेंट के दौरान काफ़ी उपयोगी होती है. क्योंकि यह अनुप्रयोग डिबग और सुधारने के काम आ सकती है.

किसी क्लास को आरंभ करना

महत्वपूर्ण:  इस क्लास को आरंभ करने की जरूरत नही है. जैसा कि नीचे दिया गया है यदि Profiling को सक्षम किया गया है तो यह Output Class के द्वारा स्वत: ही लोड हो जाती है.

Profiler को सक्षम करना

प्रोफ़ाइलर को सक्षम करने के लिये निम्न लिखित फ़ंग्शन को अपने कंट्रोलर फ़ंग्शन में कहीं भी रख दीजिये.

$this->output->enable_profiler(TRUE);

जब यह सक्षम होगा तब आपके पेजो के नीचे एक रिपोर्ट बनेगी.

प्रोफ़ाइलर को अक्षम करने के लिये आपको यह उपयोग करना पड़ेगा:

$this->output->enable_profiler(FALSE);

Benchmark के बिंदु तय करना

प्रोफ़ाइलर आपके बेंचमार्क डाटा को कंपाइल तथा दिखा सके इसके लिये आपको अपने मार्क प्वाइंटों को नाम देना होगा. बेंचमार्क प्वाइंटों को निर्धारित करने से संबंधित जानकारी Benchmark Class पेज में दी गई है.

वेब पेजों की कैशिंग – कोड इग्नाइटर

अधिक निष्पादन के लिए कोड इग्नाइटर आपके पेजों को कैश कर सकता है.

कोड इग्नाइटर की गति तेज है पर जो परिवर्तनशील जानकारी आप अपने पेजों में दिखाते हैं वो आपके सर्वर के संसाधनों, मेमोरी की खपत करती है. इससे गति कुछ कम भी हो सकती है. पर कैशिंग के द्वारा आप अपने पेजों की गति को बढ़ा सकते हैं क्योंकि ये अपने पूरी अंतिम अवस्था में सुरक्षित हो जायेंगे. जब दोबारा अनुरोध भेजा जायेगा तो पेज को संसाधित करने की बजाय उसके कैश किये हुये/सुरक्षित किये हुये संस्करण को बाउजर में भेज दिया जायेगा. अत: आप इससे लगभग स्थैतिक (स्टैटिक) पेजों जितना कार्य निष्पादन पा सकते हैं.

कैशिंग किस तरह काम करती है?

कैशिंग को प्रति पेज के हिसाब से सक्षम किया जा सकता है, तथा आप किसी पेज के कैश रहने के लिये समय सीमा भी बना सकते हैं. जब पेज को पहली बार लोड किया जाता है तब एक कैश फ़ाइल आपके system/cache फ़ोल्डर में लिख दी जाती है. बाद के पेज लोड में कैश फ़ाइल को प्राप्त करके ब्राउजर में भेज दिया जाता है. यदि यह एक्सपायर हो गई हो जाती है तो इसे मिटा दिया जाता है और नई फ़ाइल बनाकर उसे कैश करने के साथ ही ब्राउजर में भेज दिया जाता है.

नोट: Benchmark tag को कैश नही किया जाता है अत: आप कैशिंग सक्षम होने पर भी पेज लोड होने की गति देख पायेंगे.

कैशिंग को सक्षम करना

कैशिंग को सक्षम करने के लिये, नीचे लिखे गये कोड को किसी भी कंट्रोलर फ़ंग्शन में लिख दीजिये:

$this->output->cache(n);

जहां n मिनटों को बताता है जब तक कि आप अपने पेज को कैश रखना चाहते हैं.

ऊपर वाला कोड, फ़ंग्शन के बीच में कहीं भी रह सकता है. यह अपनी स्थित से प्रभावित नही होता है, अत: आप इसे जहां उपयुक्त लगे वहां रख सकते हैं. एक बार यह कोड रख दिया जाता है तो आपके पेज कैश होना शुरू हो जाते हैं.

चेतावनी: कैशिंग तभी काम करेगी जब आप view का प्रयोग अपने कंट्रोलरों में करेंगे क्योंकि कोड इग्नाइटर व्यू को कैश करता है.

नोट: कैश फ़ाइलों के लिखे जाने से पहले system/cache फ़ोल्डर की परमीशन कुछ इस तरह बदल देनी चाहिये ताकि इसके अंदर लिखा जा सके.

कैश मिटाना

यदि आप कैश फ़ाइलों का निर्माण बंद करना चाहते हैं तो आप ऐसा कैश वाले कोड को हटाकर कर सकते हैं. नोट: कैश टैग को हटाने से कैश तुरंत खत्म नही हो जाती है. यह सामान्य तरीके से खत्म होगी. यदि आपको इसे पहले से हटाने की जरूरत है तो आपको इसे स्वयं कैश फ़ोल्डर से हटाना पड़ेगा.

त्रुटियों को संभालना – कोड इग्नाइटर

कोड इग्नाइटर निम्नलिखित फ़ंग्शनों के द्वारा आपको अपने अनुप्रयोग के लिये "एरर रिपोर्टिंग" बनाने की सुविधा प्रदान करता है. इसके अलावा इसमें एक एरर लागिंग क्लास भी है जिसके द्वारा आप त्रुटियों और डिबगिंग संदेशों को एक पाठ्य(Text) फ़ाइल के तौर पर सुरक्षित कर सकते हैं.

नोट: सामान्य अवस्था में, कोड इग्नाइटर हर PHP त्रुटियों को दिखाता है. डेवलपमेंट पूरा होने के पश्चात आप कोड इग्नाइटर के इस व्यवहार को बदलना चाहेंगे. आपको अपनी मुख्य index.php फ़ाइल में सबसे ऊपर error_reporting() नाम का फ़ंग्शन मिलेगा. "एरर रिपोर्टिंग" को अक्षम करने से आपकी लाग फ़ाइलें लिखना बंद नही होंगी.

कोड इग्नाइटर के ज्यादातर तंत्रों के विपतीत, एरर फ़ंग्शन साधारण प्रक्रियात्मक फ़ंग्शन होते हैं जो कि हर जगह उपलब्ध होते हैं. ऐसा होने से बिना क्लास/फ़ंग्शन के स्कोप के बारे में सोचे एरर मैसेज दिखाए जा सकते हैं.

निम्नलिखित फ़ंग्शन आपको त्रुटियों को बनाने में मदत करेंगे:

show_error('message')

यह फ़ंग्शन निम्नलिखित टेम्प्लेट का प्रयोग करते हुये, बताये अनुसार त्रुटि संदेश दिखायेगा.

application/errors/error_general.php

show_404('page')

यह फ़ंग्शन निम्नलिखित टेम्प्लेट का प्रयोग करते हुये 404 त्रुटि संदेश दिखायेगा.

application/errors/error_404.php

यह फ़ंग्शन यह उम्मीद करता है कि जो स्ट्रिंग इससे गुजारी जाए वह उस पेज का पाथ हो जो कि नही मिला. यदि कंट्रोलर नही मिलते हैं तो कोड इग्नाइटर स्वत: ही 404 त्रुटि संदेश दिखाता है.

log_message('level', 'message')

इस फ़ंग्शन से आप अपनी लाग फ़ाइल में संदेश लिख सकते हैं. इस फ़ंग्शन में आपको ३ स्तरों में से कोई एक पहले पैरामीटर के तौर पर गुजारना होता है, जो कि यह बताता है कि संदेश का प्रकार क्या है. जैसे (debug, error, info). इसके साथ ही दूसरे पैरामीटर के तौर पर संदेश गुजारा जाता है. उदाहरण:

if ($some_var == "")
{
    log_message('error', 'Some variable did not contain a value.');
}
else
{
    log_message('debug', 'Some variable was correctly set');
}
log_message('info', 'The purpose of some variable is to provide some value.');

त्रुटि संदेशों के तीन प्रकार हैं:

  1. Error Messages. ये वास्तविक त्रुटियां होती हैं जैसे PHP errors या user errors.
  2. Debug Messages. ये वो संदेश होते हैं जो कि आपकी डिबगिंग के दौरान सहायता करते हैं. जैसे कि यदि किसी क्लास को आरंभ किया जा रहा है तो आप उस बात को डिबगिंग संदेश के तौर पर लाग कर सकते हैं.
  3. Informational Messages. ये सबसे कम वरीयता प्राप्त संदेश होते हैं. ये आपको किसी क्रिया से संबंधित केवल जानाकारी प्रदान करते हैं. कोड इग्नाइटर मूल रूप से कोई info message नही बनाता है पर आप चाहें तो अपने अनुप्रयोग में बना सकते हैं.

नोट:
लाग फ़ाइल लिखे जाने के लिये यह जरूरी है कि आपका "logs" वाला फ़ोल्डर लिखने योग्य हो. इसके अलावा लागिंग के लिये आपको threshold भी सेट करना होगा. यानि कि हो सकता है कि आप केवल error message ही लाग करना चाहें अन्य दो को नही. यदि आप इसे शून्य पर सेट कर देंगे तो लागिंग अक्षम हो जायेगी.

यूआरआई का मार्ग निर्धारण अथवा राउटिंग – कोड इग्नाइटर

सामान्यतया आपकी यूआरएल स्ट्रिंग और संगत कंट्रोलर क्लास/मेथड के मध्य एक से एक का संबंध होता है. यूआरआई के खंड सामान्यतया निम्नलिखित ढांचे अनुसरण करते हैं:

example.com/class/function/id/

कुछ परिस्थितियों में आप कभी इन संबंधों को बदलना चाहें ताकि किसी दूसरी क्लास/फ़ंग्शन को अनुरोध भेजा जा सके(बजाय संबंधित यूआरएल के) तो आप ऐसा कर सकते हैं. उदाहरण के लिये, आप अपने यूआरएलों का ढ़ांचा कुछ इस प्रकार बनाना चाहते हैं:

example.com/product/1/
example.com/product/2/
example.com/product/3/
example.com/product/4/

सामान्यतया यूआरएल का दूसरा खंड फ़ंग्शन के नाम के लिये आरक्षित होता है, पर इस उदाहरण में यह प्रोडक्ट आई डी है. अत: ऐसा करने के लिये कोड इग्नाइटर आपको यूआरआई हैंडलर को रिमैप करने की सुविधा देता है.

अपने स्वयं के राउटिंग नियम बनाना

राउटिंग के नियम आपकी application/config/routes.php फ़ाइल में परिभाषित होते हैं. इसमें आपको $route नाम का एक एरे मिलेगा जो कि आपको राउटिंग के मानदंड निर्धारित करने की सुविधा प्रदान करेगा. राउट्स को आप या तो wildcards से या फ़िर Regular Expressions के द्वारा निर्दिष्ट कर सकते हैं.

वाइल्ड कार्ड

एक सामान्य वाइल्डकार्ड राऊट कुछ ऐसा लग सकता है:

$route['product/:num'] = "catalog/product_lookup";

राउट्स में, एरे की "की" यूआरआई को रखती है वहीं एरे का मान गंत्वय का पता रखता है.  ऊपर के उदाहरण में यदि यूआरएल के पहले हिस्से में "product" शब्द तथा दूसरे हिस्से में नंबर पाया जाता है तो तो "catalog" क्लास तथा "product_lookup" फ़ंग्शन का प्रयोग किया जायेगा.

आप अक्षरों का मिलान करवा सकते हैं अथवा आप दो वाइल्ड कार्ड प्रकारों का प्रयोग कर सकते हैं:

:num
:any

:num  हमेशा उन्ही हिस्सों का मिलान करेगा जिनमें नंबर हैं
:any उन हिस्सों से मिलान करेगा जिनमें कोई भी अक्षर हो सकता है.

नोट: राउट हमेशा उसी क्रम में चलते हैं जिस क्रम में उन्हे परिभाषित किया गया होता है. उच्च श्रेणी के राउट हमेंशा निचले की अपेक्षा प्राथमिकता लेते हैं.

उदाहरण

यहां कुछ राउटिंग के उदाहरण दिये गये हैं:

$route['journals'] = "blogs";

एक यूआरएल जिसमें "journals" शब्द पहले खंड में होगा वह "blogs" क्लास में रिमैप कर दिया जायेगा.

$route['blog/joe'] = "blogs/users/34";

एक यूआरएल जिसमें "blog/joe" शब्द होगा वह "blogs" क्लास तथा "users" मेथड में रिमैप कर दिया जायेगा. इसका आईडी "34" सेट कर दिया जायेगा.

$route['product/:any'] = "catalog/product_lookup";

एक यूआरएल जिसमें "product" पहले खंड में हो तथा दूसरे खंड में कुछ भी हो, "catalog" क्लास और "product_lookup" फ़ंग्शन में रिमैप कर दिया जायेगा.

$route['product/(:num)'] = "catalog/product_lookup_by_id/$1";

एक यूआरएल जिसमें पहले खंड में "product" हो तथा दूसरे में कुछ भी हो "catalog" क्लास तथा "product_look_by_id" मैथड में रिमैप कर दिया जायेगा. इसके साथ ही यह फ़ंग्शन से वैरिएबल का भी मिलान करेगा.

महत्वपूर्ण: इसमें तिर्यकों (slashes) का प्रयोग ना करें

रेगुलर एक्सप्रेशन

यदि आप चाहें तो आप अपने राउटिंग नियमों को परिभाषित करने के लिये रेगुलर एक्सप्रेशनों का उपयोग कर सकते हैं. आप किसी भी प्रकार का रेगुलर एक्सप्रेशन प्रयोग कर सकते हैं.

नोट:  यदि आप बैक रिफ़रेंस का प्रयोग कर रहे हैं तो आपको बैक स्लैश(तिर्यक) के चिन्ह की बजाय डालर के चिन्ह का प्रयोग करना चाहिये.

एक ठेठ RegEx राउट कुछ इस प्रकार दिखेगा.

$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";

ऊपर के उदाहरण में products/shirts/123 तरह का यूआरआई shirts कंट्रोलर क्लास तथा id_123 फ़ंग्शन को अनुरोध भेजेगा.

आप वाइल्ड कार्डों तथा रेगुलर एक्सप्रेशनों को मिलाकर भी उपयोग कर सकते हैं.

आरक्षित मार्ग

कुल दो आरक्षित राउट्स हैं:

$route['default_controller'] = 'welcome';

यह राउट यह बताता है कि यदि यूआरआई में कोई डाटा ना हो तो कौन कंट्रोलर क्लास को लोड करना है. ऐसा तब होगा जब लोग आपके रूट यूआरएल को लोड करेंगे. ऊपर के उदाहरण में "welcome" क्लास लोड होगी. आपको हमेशा एक डिफ़ाल्ट राउट बनाकर रखना चाहिये अन्यथा 404 पेज सामान्य अवस्था में दिखाई देगा.

$route['scaffolding_trigger'] = 'scaffolding';

यह राउट आपको एक गुप्त शब्द सेट करने की सुविधा प्रदान करता है. यह शब्द जब यूआरएल में उपस्थित होगा तो स्कैफ़ोल्डिंग को चालू कर देगा. अधिक जानकारी के लिये स्कैफ़ोल्डिंग पेज को पढ़ें.

महत्वपूर्ण:  आरक्षित राउट हमेशा किसी वाइल्ड कार्ड अथवा रेगुलर एक्स्प्रेशन के पहले आने चाहिये.

स्कैफ़ोल्डिंग (Scaffolding) – कोड इग्नाइटर

स्कैफ़ोल्डिंग को कोड इग्नाइटर १.६.० संस्करण से ही अवमानित(deprecated) किया जा रहा है.

कोड इग्नाइटर की स्कैफ़ोल्डिंग सुविधा आपको अपने डाटाबेस में से जानकारियों को जोड़ने, संपादित करने तथा हटाने का आसान और तेज तरीका प्रदान करती है.

अति महत्वपूर्ण: स्कैफ़ोल्डिंग केवल डेवलपमेंट के दौरान उपयोग के लिये है. यह बहुत कम सुरक्षा प्रदान करती है. अत: जो कोई भी आपकी कोड इग्नाइटर साइट तक पहुंच सकता है वह आपकी जानकारियों को संपादित तथा मिटा भी सकता है. यदि आप स्कैफ़ोल्डिंग उपयोग करते हैं तो उपयोग के तुरंत पश्चात उसे अक्षम भी कर दें. इसे सजीव साइट में सक्षम ना रखें. और हां इसे प्रयोग करने के पहले एक गुप्त शब्द जरूर सेट कर दें.

स्कैफ़ोल्डिंग की जरूरत क्यों?

जरा इस परिदृश्य पर नजर डालते हैं: डेवलपमेंट के दौरान आप एक नई डाटाबेस टेबल बनाते हैं तथा आप उसमें आंकडे़ जोड़ने का असान तरीका चाहते हैं ताकि उसपर काम किया जा सके. बिना स्कैफ़ोल्डिंग के आपके पास दो विकल्प रहते हैं कि या तो आप कुछ रिकार्डों को कमांड के जरिये जोड़ें या फ़िर किसी डाटाबेस मैनेजमेंट टूल जैसे कि पीएचपीमाईएडमिन का इस्तेमाल करें. कोड इग्नाइटर के स्कैफ़ोल्डिंग सुविधा से आप अपने ब्राउजर इंटरफ़ेस का प्रयोग करते हुये कुछ आंकड़ों को डाटाबेस में भर पायेंगे तथा उपयोग के पश्चात आसानी से डिलीट भी कर पायेंगे.

गुप्त शब्द सेट करना

स्कैफ़ोल्डिंग को सक्षम करने के पहले गुप्त शब्द को सेट करना पड़ेगा. जब इस शब्द को यूआरएल में भरा जायेगा तभी आपका स्कैफ़ोल्डिंग इंटरफ़ेस खुलेगा, अत: कोई ऐसा शब्द चुनें जिसका कोई अनुमान ना लगा सके.

गुप्त शब्द को सेट करने के लिये अपनी application/config/routes.php फ़ाइल खोलें तथा इस लाइन को देखें:

$route['scaffolding_trigger'] = '';

जब यह लाइन आपको मिल जाये तो इसमें अपना कोई विशेष शब्द जोड़ दें.

नोट स्कैफ़ोल्डिंग शब्द को अंडरस्कोर से शुरू नही किया जा सकता है.

स्कैफ़ोल्डिंग सक्षम करना

नोट: इस पेज उपस्थित जानकारी देते हुये हम यह मान के चल रहे हैं कि आप यह पहले से ही जानते हैं कि कंट्रोलर कैसे काम करते हैं, तथा आपके पास एक काम करता हुआ कंट्रोलर पहले से ही है. हम यह भी मान के चल रहे हैं कि आपने कोड इग्नाइटर को स्वत: ही डाटाबेस से जुड़ने हेतु विन्यासित किया है. आखिर में हम यह भी मान के चल रहे हैं कि आप यह जानते हैं कि क्लास कंस्ट्रकटर क्या होता है. यदि नही तो सबसे पहले कंट्रोलर वाले पेज का आखिरी हिस्सा पढें.

स्कैफ़ोल्डिंग को सक्षम करने के लिये कंस्ट्रक्टर में आपको इसे इस प्रकार आरंभ करना पड़ेगा:

<?php
class Blog extends Controller {
       function Blog()
       {
            parent::Controller();
$this->load->scaffolding('table_name');
       }
}
?>

यहां table_name वह टेबल (जी हां! टेबल. ना कि डाटाबेस) है जिसके साथ आप काम करना चाहते हैं.

एक बार जब आप स्कैफ़ोल्डिंग आरंभ कर देते हैं तो फ़िर आप इस तक इस प्रकार के यूआरएल के द्वारा पहुंच सकते हैं.

example.com/index.php/class/secret_word/

उदाहरण के लिये Blog नामक कंट्रोलर में abracadabra गुप्त शब्द का इस्तेमाल करते हुये आप स्कैफ़ोल्डिंग तक इस प्रकार पहुंच सकते हैं.

example.com/index.php/blog/abracadabra/

स्कैफ़ोल्डिंग का इंटरफ़ेस बेहद आसान होता है. ये आपको अपने आप ही समझ आ जायेगा.

आखिर में

स्कैफ़ोल्डिंग उन्ही टेबलों में काम करती है जिनमें "प्राइमरी कुंजी" निर्धारित होती है. ऐसा इसलिये क्योंकि विभिन्न डाटाबेस कार्यों को निष्पादित करने के लिये इस जानकारी की जरूरत पड़ती है.

आम फ़ंग्शन – कोड इग्नाइटर

कोड इग्निटर कुछ सर्वभौमिक रूप से पारिभाषित फ़ंग्शनों का प्रयोग करता है. ये फ़ंग्शन आपको किसी भी बिंदू पर उपलब्ध होते हैं. इन्हे उपयोग करने के लिये किसी लाइब्रेरी या हेल्पर को लोड करने की जरूरत नही पड़ती है.

is_really_writable('path/to/file')

विंडोज सर्वरों में is_writable() उस वक्त भी TRUE ही उतर देगा जबकि आप असल में फ़ाइलों को ना लिख पायेंगे. ऐसा इसलिये क्योंकि आपरेटिंग सिस्टम पीएचपी को FALSE उत्तर तभी देता है जब "Read Only" attribute को चिन्हित किया जाये. यह फ़ंग्शन किसी फ़ाइल में लिखने का प्रयास करके इस बात को पता करता है कि वह फ़ाइल वाकई में लिखने योग्य है भी या नही. सामान्यत: इसे उन्ही प्लेटफ़ार्मों में उपयोग करना चाहिये जहां यह जानकारी भरोसेमंद ना हो.

if (is_really_writable('file.txt'))
{
    echo "I could write to this if I wanted to";
}
else
{
    echo "File is not writable";
}

config_item('item_key')

विन्यास (कांफ़िगरेशन) संबंधी सूचना को हासिल करने के लिये Config library को वरीयता दी जाती है, यद्यपि config_item() को एकल कुंजियों को प्राप्त करने के लिये उपयोग किया जा सकता है. अधिक जानकारी के लिये कांफ़िग लाइब्रेरी का दस्तावेज देखें.

show_error('message'), show_404('page'), log_message('level', 'message')

इनमें से प्रत्येक के बारे में Error Handling पेज में विवरण दिया गया है.

संसाधनों को स्वत: लोड करना – कोड इग्नाइटर

कोड इग्नाइटर "Auto-load" नामक एक सुविधा के साथ आता है जो कि लाइब्रेरियों, हेल्परों और प्लग इन्सों को कोड इग्नाइटर से शुरू होते ही आरंभ कर देता है. यदि आपको कुछ संसाधनों की पूरे अनुप्रयोग में जरूरत है तो आपको सुविधा का दृष्टि से "Auto Loading" का उपयोग जरूर करना चाहिये.

निम्नलिखित वस्तुओं को स्वत: लोड कराया जा सकता है:

  • लाइब्रेरीज़ फ़ोल्डर भीतर पाई जाने वाली कोर क्लासों को
  • हेल्पर फ़ोल्डर के भीतर की हेल्पर फ़ाइलों को
  • प्लग इन्स फ़ोल्डर के भीतर के प्लग इन्स को
  • कांफ़िग फ़ोल्डर के भीतर की विशेष रूप से बनाई गई कांफ़िग फ़ाइलों को
  • system/language फ़ोल्डर के भीतर की लैंग्वेज फ़ाइलों को
  • माडल्स फ़ोल्डर के भीतर पाये जाने वाले माडलों को

किसी संसाधन को स्वत: लोड करने के लिये application/config/autoload.php फ़ाइल खोलिये और autoload array में हर संसाधन का नाम डाल दीजिये. आप इस फ़ाइल में हर तरह की चीजों को डालने संबंधी निर्देश मिल जायेंगे.

नोट: autoload array में .php एक्स्टेंशन का प्रयोग ना करें.

हुक्स : फ़्रेमवर्क के क्रोड़ को विस्तारित करना – कोड इग्नाइटर

कोड इग्नाइटर के हुक्स के द्वारा आप कोड इग्नाइटर के क्रोड को बिना छुये उसमें बदलाव ला सकते हैं. जब कोड इग्नाइटर चलता है तब यह एक विशेष एक्जिक्यूशन प्रक्रिया का पालन करता है. इस प्रक्रिया को एप्लिकेशन फ़्लो पेज में दर्शाया गया है. कई उदाहरण हो सकते हैं जैसे कि किसी विशेष चरण में जैसे किसी कंट्रोलर के लोड होने के ठीक पहले या ठीक बाद में आप किसी कार्य को शुरू करना चाहते हैं.

हुक्स को सक्षम करना

हुक्स सुविधा को application/config/config.php फ़ाइल से केवल निम्न लिखित लाइन को बदल कर पूरे अनुप्रयोग में सक्षम या अक्षम किया जा सकता है:

$config['enable_hooks'] = TRUE;

किसी हुक को परिभाषित करना

हुक्स को application/config/hooks.php फ़ाइल में परिभाषित किया जाता है. प्रत्येक हुक को एक एरे के तौर पर कुछ इस प्रकार लिखा जा सकता है:

$hook['pre_controller'] = array(
                                'class'    => 'MyClass',
                                'function' => 'Myfunction',
                                'filename' => 'Myclass.php',
                                'filepath' => 'hooks',
                                'params'   => array('beer', 'wine', 'snacks')
                                );

नोट्स:
एरे की इंडेक्स हमेंशा विशेष हुक के बिंदु से सहसंबद्ध होती है. ऊपर के उदाहरण में हुक का बिंदु pre_controller है. हुक के बिंदुओं की सूची नीचे दी गई है. आपकी एसोसिएटिव एरे में निम्नलिखित चीजें परिभाषित होनी चाहिए:

  • class  उस क्लास का नाम जिसका आप आह्वान करना चाहते हैं. यदि आप क्लास की बजाय किसी प्रक्रियात्मक फ़ंग्शन को उपयोग करना चाहते हैं तो इसे खाली ही छोड़ दें.
  • function  उस फ़ंग्शन का नाम जिसे आप पुकारना चाहते हैं.
  • filename  उस फ़ाइल का नाम जिसमें आपकी क्लास/फ़ंग्शन हैं.
  • filepath  उस डायरेक्ट्री का नाम जहां आपकी स्क्रिप्ट रखी हुई है.
    नोट: आपकी स्क्रिप्ट application फ़ोल्डर के अंदर की किसी डायरेक्ट्री के भीतर होनी चाहिये. उदाहरण के लिये, यदि आपकी स्क्रिप्ट application/hooks फ़ोल्डर में है, तो आप फ़ाइल पाथ के तौर पर hooks शब्द का प्रयोग करेंगे. यदि आपकी स्क्रिप्ट application/hooks/utilities फ़ोल्डर में है तो आप hooks/utilities को अपने फ़ाइल पाथ के तौर पर प्रयोग करेंगे.
  • params  कोई ऐसा पैरामीटर जिसे आप अपनी स्क्रिप्ट से गुजारना चाहें. यह वैकल्पिक है.

एक ही हुक को कई बार पुकारना

यदि आप एक ही हुक बिंदु का का प्रयोग एक से अधिक स्क्रिप्टों में करना चाहते हैं तो अपने एरे को बहु आयामी बनायें जैसे कि ये:

$hook['pre_controller'][] = array(
                                'class'    => 'MyClass',
                                'function' => 'Myfunction',
                                'filename' => 'Myclass.php',
                                'filepath' => 'hooks',
                                'params'   => array('beer', 'wine', 'snacks')
                                );
$hook['pre_controller'][] = array(
                                'class'    => 'MyOtherClass',
                                'function' => 'MyOtherfunction',
                                'filename' => 'Myotherclass.php',
                                'filepath' => 'hooks',
                                'params'   => array('red', 'yellow', 'blue')
                                );

हर एरे इंडेक्स के आगे लगे हुये बड़े कोष्ठकों में ध्यान दीजियेगा:

$hook['pre_controller'][]

इसके प्रयोग से आपको एक ही हुक का बिंदु मिलेगा जो कि एक से अधिक स्क्रिप्टों के साथ होगा. आप जिस क्रम से एरे परिभाषित करते हैं उसी क्रम से उनका क्रियान्वयन भी होता है.

हुक बिंदु

हुकों के बिंदुओं की सूची इस प्रकार है:

  • pre_system
    इसे तंत्र के क्रियान्वयन के एकदम शुरू में पुकारा जाता है. इस चरण में केवल बेन्चमार्क तथा हुक क्लासें ही लोड हुई होती हैं. कोई राउटिंग या अन्य क्रिया शुरू नही होती है.
  • pre_controller
    इसे आपके कंट्रोलरों के पुकारे जाने के ठीक बाद पुकारा जाता है. सभी आधारभूत क्लासें, राउटिंग तथा सुरक्षा जांच हो चुकी होती हैं.
  • post_controller_constructor
    इसे आपके कंट्रोलर के शुरू होने के बाद परंतु किसी मेथड की पुकार के पहले पुकारा जाता है.
  • post_controller
    आपके कंट्रोलर के पूरे क्रियान्वयन के ठीक बाद इसे पुकारा जाता है.
  • display_override
    यह _display() फ़ंग्शन का उल्लंघन करता है. _display() फ़ंग्शन तंत्र के पूरी तरह क्रियान्वित होने के पश्चात अंत में ब्राउजर में पेज भेजने का कार्य करता है. यह आपको अपनी डिस्प्ले कार्यपद्धति उपयोग करने की भी सुविधा प्रदान करता है.
    कृपया नोट कीजिये कि आपको $this->CI =& get_instance() कोड इग्नाइटर सुपर आब्जेक्ट के साथ संदर्भित करने की जरूरत होगी. और तब आखिरी डाटा $this->CI->output->get_output() फ़ंग्शन को पुकारने पर उपलब्ध होगा.
  • cache_override
    यह आपको _display_cache() फ़ंग्शन की बजाय अपने स्वयं के फ़ंग्शनों को उपयोग करने की सुविधा प्रदान करता है. यह आपको अपने स्वयं के कैश तंत्र को उपयोग करने की सुविधा प्रदान करता है.
  • scaffolding_override
    यह आपको स्कैफ़ोल्डिंग अनुरोधों का उल्लंघन करके अपनी स्क्रिप्टों का उपयोग करने की अनुमति प्रदान करता है.
  • post_system
    यह उस वक्त पुकारा जाता है जब आपका पेज पूरी तरह से रेंडर होकर आपके ब्राउजर को भेज दिया जाता है.

क्रोड़ तंत्र की क्लासों को बनाना – कोड इग्नाइटर

हर बार जब कोड इग्नाइटर चालू होता है तब कुछ आधारभूत क्लासें फ़्रेमवर्क के हिस्से के तौर पर स्वत: प्रारंभ हो जाती हैं. कोड इग्नाइटर में यह संभव है कि आप चाहें तो इन क्रोड़ तंत्र की क्लासों अपनी बनाई हुई क्लासों से बदल दें. इसके अलावा आप चाहें तो क्लासों के मूल संस्करण को विस्तारित (Extend) भी कर सकते हैं.

ज्यादातर उपयोगकर्ताओं को ऐसा करने की जरूरत नही पड़ेगी. पर यह विकल्प उन लोगों के लिये है जो कि कोड इग्नाइटर के क्रोड़ में बदलाव लाना चाहते हैं.

तंत्र की क्लासों की सूची

हर बार जैसे ही कोड इग्नाइटर चालू होता है निम्नलिखित क्रोड़ तंत्र की फ़ाइलें शुरू हो जाती हैं:

  • Benchmark
  • Config
  • Controller
  • Exceptions
  • Hooks
  • Input
  • Language
  • Loader
  • Log
  • Output
  • Router
  • URI

क्रोड़ क्लासों को बदलकर दूसरी रखना

क्रोड़ तंत्र में वास्तविक क्लासों की बजाय अपनी क्लासों को प्रयोग करने के लिये अपने संस्करण को application/libraries में रखें.

application/libraries/some-class.php

यदि यह डायरेक्ट्री ना उपस्थित हो तो आप इसे बना भी सकते हैं.

इस फ़ोल्डर में कोई भी फ़ाइल जिसका नाम ऊपर बताई गई लिस्ट के समान होगा उसे वास्तविक क्रोड़ क्लास की बजाय उपयोग किया जायेगा.

कृपया ध्यान दें कि आपकी क्लास के नाम के आगे CI उपसर्ग के तौर पर लिखा होना चाहिये. उदाहरण के लिये यदि आपकी फ़ाइल का नाम Input.php है तो क्लास का नाम यह होगा:

class CI_Input {
}

क्रोड़ क्लासों को विस्तारित करना

यदि आप पहले से बनी लाइब्रेरी में कुछ और सुविधायें जोड़ना चाहते हैं जैसे कि कुछ फ़ंग्शन जोड़ना तो ऐसी स्थिति में क्लास को विस्तारित(Extend) करना ही बेहतर रहेगा. क्लास को विस्तारित करना क्लास को बदलने से जैसा ही है पर कुछ अपवादों को छोड़कर:

  • क्लास की घोषणा(Declaration) हमेशा अपनी मूलजनक क्लास(parent class) से विस्तारित होनी चाहिये.
  • आपकी नई क्लास तथा उसके फ़ाइल का नाम हमेशा MY_ उपसर्ग के साथ होना चाहिये (इसे बदला जा सकता है. नीचे देखें.).

उदाहरण के लिये मूल Input क्लास को विस्तारित करने के लिये आप एक application/libraries/MY_Input.php नाम की एक फ़ाइल बनायेंगे, तथा उसमें अपनी क्लास की घोषणा इस प्रकार करेंगे:

class MY_Input extends CI_Input {
}

कृपया ध्यान दें: यदि आपको अपनी क्लास में कंस्ट्रक्टर की जरूरत हो तो तो उसे अपने मूलजनक कंस्ट्रक्टर से विस्तारित करना ना भूलें:

class MY_Input extends CI_Input {
    function My_Input()
    {
        parent::CI_Input();
    }
}

सुझाव: आपकी क्लास का कोई फ़ंग्शन जिसका नाम अपनी मूलजनक क्लास के किसी फ़ंग्शन के समान है तो वह अपने मूल फ़ंग्शन की जगह पर उपयोग किया जायेगा (इसे "Method Overriding" या रीति उल्लंघन भी कहा जाता है.)

यदि आप कंट्रोलर की क्रोड़ क्लासों को विस्तारित कर रहे हैं, तो आप अपनी नई क्लास को अपने कंस्ट्रक्टर में extend या विस्तारित करना ना भूलें.

class Welcome extends MY_Controller {
    function Welcome()
    {
        parent::MY_Controller();
    }
    function index()
    {
        $this->load->view('welcome_message');
    }
}

अपना स्वयं का उपसर्ग लगाना.

अपने उप-क्लास(sub-class) उपसर्ग को निश्चित करने के लिए अपनी application/config/config.php फ़ाइल को खोलिये फ़िर इस लाइन को खोजिये:

$config['subclass_prefix'] = 'MY_';

कृपया ध्यान दें कि कोड इग्नाइटर की सभी मूल लाइब्रेरियों में CI_  उपसर्ग लगाया जाता है. अत: इसे अपने उपसर्ग के तौर पर प्रयोग ना करें.

लाइब्रेरियां बनाना – कोड इग्नाइटर

जब हम "लाइब्रेरी" शब्द का उपयोग करते हैं तो हमारा उससे मतलब उन क्लासों से होता है जो कि libraries फ़ोल्डर के भीतर होती हैं. यहां हम आपको application/libraries डायरेक्ट्री में अपनी लाइब्रेरियां बनाना सिखाएंगे. ऐसा करने से आपके अनुप्रयोग के स्थानीय संसाधन तथा सार्वभौमिक संसाधनों को अलग अलग रखने में मदत मिलती है.

यदि आप पहले से उपलब्ध लाइब्रेरियों में और क्षमतायें जोड़ना चाहते हैं तो कोड इग्नाइटर आपको मूल लाइब्रेरियों को विस्तारित/extend करने की सुविधा देता है. या आप चाहें तो मूल लाइब्रेरियों के नाम वाले संस्करण application/libraries फ़ोल्डर में रखकर मूल लाइब्रेरियों को पूरी तरह से बदल सकते हैं.

संक्षेप में:

  • आप बिल्कुल नई लाइब्रेरियां बना सकते हैं
  • आप पहले से बनी मूल लाइब्रेरियों को विस्तारित कर सकते हैं.
  • आप मूल लाइब्रेरियों को नई लाइब्रेरियों से पूरी तरह बदलकर नई लागू कर सकते हैं.

आगे हम इन तीनों संकल्पनाओं को समझने का प्रयास करेंगे.

कृपया ध्यान दें: आप अपनी क्लासों के द्वारा डाटाबेस क्लासों को ना ही बदल सकते हैं और ना ही विस्तारित कर सकते हैं. इसी प्रकार php4 में लोडर क्लासों को भी विस्तारित या बदला नही जा सकता है. अन्य सभी क्लासों को बदला या विस्तारित किया जा सकता है.

भंडारण

लाइब्रेरी क्लासों को हमेशा application/libraries फ़ोल्डर में रखा जाना चाहिये, क्योंकि कोड इग्नाइटर हमेशा इन्हे वहीं ढूंढ़ने की कोशिश करता है.

नाम लिखने का तरीका

  • फ़ाइलों के नाम का शुरू का अक्षर कैपिटल होना चाहिये. उदाहरण के लिये:  Myclass.php
  • क्लास की घोषणा करते वक्त भी उसके नाम का शुरूआती अक्षर कैपिटल में होना चाहिये. उदाहरण के लिये: class Myclass
  • क्लास का नाम तथा फ़ाइल का नाम मेल खाना चाहिये.

क्लास फ़ाइल

क्लासों को कुछ इस प्रकार दिखाई देना चाहिये (नोट: हम यहां Someclass क्लास के नाम के तौर पर इस्तेमाल कर रहे हैं.)

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Someclass {
    function some_function()
    {
    }
}
?>

अपनी क्लास का उपयोग करना

निम्नलिखित के द्वारा आप अपने किसी भी कंट्रोलर फ़ंग्शन में अपनी क्लास आरंभ कर सकते हैं:

$this->load->library('someclass');

यहां someclass बिना.php एक्सटेंशन के फ़ाइल का नाम है. आप इस फ़ाइल के नाम को बड़े या छोटे अक्षरों में लिख सकते हैं. कोडइग्निटर को इससे फ़र्क नही पड़ता है.

एक बार लोड होने के पश्चात आप अपनी क्लास तक "छोटे अक्षरों(lower case)" के द्वारा भी पहुंच सकते हैं.

$this->someclass->some_function();  // Object instances will always be lower case

क्लास को आरंभ करते वक्त पैरामीटरों को गुजारना

लाइब्रेरी को लोड करते वक्त लोड फ़ंग्शन में आप दूसरे पैरामीटर के तौर पर डाटा गुजार सकते हैं और यह आपकी क्लास के कंस्ट्रक्टर तक पहुंचा दिया जायेगा.

$params = array('type' => 'large', 'color' => 'red');
$this->load->library('Someclass', $params);

यदि आप इस सुविधा को उपयोग करना चाहते हैं तो आपको क्लास में कंस्ट्रक्टर बनाना होगा.

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Someclass {
    function Someclass($params)
    {
        // Do something with $params
    }
}
?>

आप अपनी config फ़ाइल में सुरक्षित पैरामीटरों को भी गुजार सकते हैं. इसके लिये एक config फ़ाइल बनायें. इसका नाम आपकी क्लास के फ़ाइल के नाम से हूबहू मिलना चाहिये. अब इसे application/config/ फ़ोल्डर में सुरक्षित कर दें. याद रखें कि यदि आप ऊपर वाले तरीके से पैरामीटरों को गुजारेंगे तो, config फ़ाइल का विकल्प उपलब्ध नही होगा.

लाइब्रेरी के भीतर कोड इग्नाइटर के संसाधनों को उपयोग करना

कोड इग्नाइटर के मूल संसाधनों को अपनी लाइब्रेरी के अंदर प्राप्त करने के लिए get_instance() फ़ंग्शन का उपयोग करना होगा. यह फ़ंग्शन कोड इग्नाइटर सुपर आब्जेट देता है.

सामान्यत: अपने कंट्रोलर फ़ंग्शनों से आप किसी किसी उपलब्ध कोड इग्नाइटर फ़ंग्शन को $this कंस्ट्रक्ट के द्वारा पुकारते हैं.

$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
etc.

यद्यपि $this सीधे तौर पर केवल आपके कंट्रोलरों, माडलो तथा व्यू में ही काम करता है. यदि आप अपनी क्लासों के भीतर से कोड इग्नाइटर की क्लासों को उपयोग करना चाहत हैं तो आप इसे ऐसे कर सकते हैं:

सर्वप्रथम कोड इग्नाइटर आब्जेक्ट को एक वैरिएबल से निर्दिष्ट कीजिये:

$CI =& get_instance();

एक बार जब आप आब्जेक्ट को वैरिएबल से निर्दिष्ट कर देते हैं, तो आप $this की बजाय उस वैरिएबल के नाम को उपयोग कर सकते हैं.

$CI =& get_instance();
$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
etc.

कृपया ध्यान दें: आपने ध्यान दिया होगा कि ऊपर का get_instance() फ़ंग्शन को संदर्भ के द्वारा गुजारा जाता है.
$CI =& get_instance();
यह बहुत महत्वपूर्ण है कि किसी संदर्भ के द्वारा निर्दिष्ट करने ने आप कोड इग्नाइटर के वास्तविक आब्जेक्ट्स को उपयोग कर सकते हैं न कि इनकी कापी बनाकर.
यह भी नोट करें: कि यदि आप PHP4 उपयोग कर रहे हैं तो get_instance() को क्लास कंस्ट्रक्टर से पुकारने से बचना ही ठीक रहेगा.

मूल लाइब्रेरियों को अपने संस्करणों से बदलना

यदि आप अपनी क्लास का नाम बिल्कुल कोड इग्नाइटर की मूल लाइब्रेरियों के नाम की तरह रख लेंगे तो कोड इग्नाइटर का तंत्र मूल लाइब्रेरियों की जगह आपकी क्लासों का उपयोग करने लगेगा. इस सुविधा का लाभ लेने के लिये आपको अपनी फ़ाइल का नाम तथा क्लास की घोषणा बिल्कुल मूल लाइब्रेरियों की समान रखनी होंगी. उदाहरण के लिये मूल Email लाइब्रेरी को बदलने के लिये आपको application/libraries/Email.php, फ़ाइल बनानी होंगी और उसमें इस नाम से क्लास की घोषणा करनी होगी:

class CI_Email {
}

ध्यान दीजिये कि ज्यादातर मूल क्लासों में CI_ उपसर्ग के तौर पर लगा होता है.

अपनी लाइब्रेरी को लोड करने के लिये आपको इस फ़ंग्शन का इस्तेमाल करना पड़ेगा:

$this->load->library('email');

कृपया ध्यान दें Note: डाटाबेस क्लासों को अपनी क्लासों से नही बदला जा सकता है.

मूल लाइब्रेरियों को विस्तारित करना

यदि आप मूल लाइब्रेरियों में कुछ फ़ंग्शन और जोडना चाहते हैं जैसे कि एक या दो तो पूरी लाइब्रेरी को बदलने से अच्छा होगा कि उस क्लास को विस्तारित कर दिया जाये. किसी क्लास को विस्तारित करना कुछ अपवादों को छोड़कर उसे बदलने जैसा ही होता है:

  • क्लास की घोषणा अपनी parent class को extend करनी चाहिये.
  • आपकी नई क्लास का नाम तथा फ़ाइल का नाम हमेशा MY_ उपसर्ग के साथ होना चाहिये.(इसे विन्यासित किया जा सकता है. नीचे देखें.)

उदाहरण के लिये, मूल Email क्लास को विस्तारित करने के लिये आपको एक फ़ाइल application/libraries/MY_Email.php बनानी होगी, तथा उसमें इस प्रकार से क्लास की घोषणा करनी होगी:

class MY_Email extends CI_Email {
}

नोट: यदि आपको अपनी क्लास में कंस्ट्रक्टर की जरूरत पड़ती है तो आप उसे parent constructure से extend  जरूर कर लें:

class MY_Email extends CI_Email {
    function My_Email()
    {
        parent::CI_Email();
    }
}

उप-क्लासों/सब-क्लासों को लोड करना Loading Your Sub-class

अपनी उप-क्लासों को लोड करने के लिये आप वही पुराना सिंटेक्स उपयोग करेंगे. हां इस बात का ध्यान रखें कि आप उसमें उपसर्ग ना जोड़ें. उदाहरण के लिए ऊपर दिये गये उदाहरण (जिसमें ईमेल क्लास को विस्तारित किया गया है) को लोड करने के लिये आप निम्नलिखित सिंटेक्स का उपयोग करेंगे:

$this->load->library('email');

एक बार लोड होने के पश्चात आप क्लास वैरिएबलों का प्रयोग बिल्कुल उसी तरीके से करेंगे जैसे कि आप उस क्लास के वैरिएबलों का प्रयोग करते हैं जिसे विस्तारित किया गया है. इस स्थिति में ईमेल क्लास में हर अनुरोध को इस प्रकार लिखा जायेगा:

$this->email->some_function();

अपने स्वयं के उपसर्ग निश्चित करना

अपने स्वयं के उपसर्गों को सेट करने के लिये, अपनी application/config/config.php फ़ाइल खोलिये तथा इस लाइन को खोजिये:

$config['subclass_prefix'] = 'MY_';

कृपया ध्यान दीजिये कि कोड इग्नाइटर की सभी मूल लाइब्रेरियों में CI_ उपसर्ग के तौर पर उपयोग किया जाता है. अत: इसे उपसर्ग के तौर पर प्रयोग ना करें.

लाइब्रेरियां - कोड इग्नाइटर

सभी उपलब्ध लाइब्रेरियां system/libraries फ़ोल्डर में उपलब्ध होती है. ज्यादातर मामलों में इन क्लासों को कंट्रोलर के भीतर प्रयोग करने के लिये आपको इन्हे निम्नलिखित फ़ंग्शनों के द्वारा आरंभ करना पड़ेगा.

$this->load->library('class name');

यहां class name उस क्लास का नाम है जिसे आप आरंभ करना चाहते हैं. उदाहरण के लिये वैलिडेशन क्लास को लोड करने के लिये आप कुछ ऐसा लिखेंगे:

$this->load->library('validation');

एक बार आरंभ हो जाने के पश्चात आप उसे उस क्लास के यूजर गाइड पेज के अनुसार उपयोग कर सकते हैं.

अपनी स्वयं की लाइब्रेरियां बनाना

अपनी स्वयं की लाइब्रेरियों को बनाने के लिये यूजर गाइड का यह अनुभाग पढें.

प्लग-इन्स Plugins – कोड इग्नाइटर

प्लग इन्स लगभग हेल्परों की तरह काम करते हैं. प्लग इन में मुख्य अंतर यह है कि ये सामान्यत: केवल एक ही फ़ंग्शन उपलब्ध कराते हैं, जबकि हेल्पर फ़ंग्शनों का समूह होते हैं.

प्लग इन्स को system/plugins डायरेक्ट्री में सुरक्षित किया जाना चाहिये अथवा आप application फ़ोल्डर के अंदर plugins नाम का फ़ोल्डर बना सकते हैं. कोड इग्निटर सबसे पहले system/application/plugins डायरेक्ट्री में प्लग इन्स को ढूंढ़ता है. यदि यह डायरेक्ट्री नही मिलती या प्लग इन नही मिलता तो यह system/plugins फ़ोल्डर में प्लग इन को ढूंढ़ता है.

प्लग इन को लोड करना

किसी प्लग इन को निम्न लिखित फ़ंग्शन के द्वारा लोड किया जा सकता है.

$this->load->plugin('name');

यहां name बिना php एक्सटेंशन के तथा बिना _pi हिस्से के आपके प्लग इन का नाम है.

उदाहरण के लिये Captcha प्लगइन जिसका नाम captcha_pi.php को लोड करने के लिये, आपको यह करना पडे़गा.

किसी प्लग इन को आपके कंट्रोलर के भीतर कहीं भी लोड किया जा सकता है(यहां तक कि व्यू में भी, यद्यपि ऐसा करना ठीक तरीका नही है.), जब तक कि आप उसे उपयोग करने से पहले लोड करें. आप अपने प्लग इन को अपने कंट्रोलर के कंस्ट्रक्टर में लोड कर सकते हैं ताकि वह आपके किसी भी फ़ंग्शन में उपलब्ध हो जाये, या आप उसे उस फ़ंग्शन में लोड कर सकते हैं जिसमें उसकी जरूरत हो.

नोट: प्लग इन लोडिंग फ़ंग्शन कोई मान नही देता है अत: इसे किसी वैरिएबल में निर्दिष्ट ना करें. इन्हे जैसा दिखाया गया है वैसा ही उपयोग करें.

एक साथ एक से अधिक प्लगइनों को लोड करना

यदि आपको एक साथ एक से अधिक प्लग इन लोड करने की जरूरत हो तो आप उन्हे एक एरे में लिख सकते हैं, जैसे:

$this->load->plugin( array('plugin1', 'plugin2', 'plugin3') );

प्लग इन्स को स्वत: लोड करना

यदि आपको लगता है कि कोई विशेष प्लग इन पूरे अनुप्रयोग में उपयोग किया जायेगा तो आप कोड इग्निटर को उसे स्वत: लोड करने के लिये कह सकते हैं. ऐसा करने के लिये application/config/autoload.php फ़ाइल खोलकर मैं आटोलोड एरे में उस प्लग इन का नाम भरना होगा.

प्लग इन का उपयोग करना

एक बार जब आप प्लग इन लोड कर लेते हैं तो आप इसे किसी भी ठेठ PHP फ़ंग्शन की तरह पुकार सकते हैं.

हेल्पर फ़ंग्शन – कोड इग्नाइटर

हेल्पर, जैसा कि नाम से ही पता चलता है, विभिन्न कार्यों को करने में आपकी मदत करते हैं. प्रत्येक हेल्पर फ़ाइल एक विशेष प्रकार के फ़ंग्शनों का समूह होती है. जैसे: URL Helpers आपको लिंक बनाने में मदत करते हैं, Form Helpers आपको फ़ार्म के अवयवों को बनाने में मदत करते हैं, Text Helpers विभिन्न प्रकार के पाठ्य संरूपण का काम करने में मदत करते हैं, Cookie Helpers कुकीज़ को बनाने और उन्हे पढ़ने का काम करते हैं, File Helpers आपको फ़ाइलों के साथ काम करने में सहयोग करते हैं, आदि.

कोड इग्नाइटर के अन्य तंत्रों के उलट, हेल्पर आब्जेक्ट ओरिएंटेड रूप में नही लिखे जाते हैं. ये साधारण प्रक्रियात्मक(Procedural) रूप में लिखे जाते हैं. प्रत्येक हेल्पर फ़ंग्शन एक विशिष्ट कार्य को करता है. एक हेल्पर फ़ंग्शन किसी कार्य को करने के लिये दूसरे फ़ंग्शनों पर निर्भर नही रहता है.

सामान्य अवस्था में कोड इग्नाइटर हेल्पर फ़ाइलों को लोड नही करता है, अत: किसी हेल्पर को उपयोग करने के लिये सबसे पहले उसे लोड करना पड़ता है. एक बार लोड होने के बाद ये सभी कंट्रोलरों और व्यूज़ में उपलब्ध हो जाते हैं.

हेल्पर सामान्यत: आपके system/helpers, या system/application/helpers डायरेक्ट्री में रहते हैं. कोड इग्नाइटर सबसे पहले आपकी system/application/helpers डायरेक्ट्री में हेल्परों को खोजता है. यदि यह डायरेक्ट्री उपलब्ध नही होती या वह हेल्पर वहां नही उपलब्ध होता तो कोड इग्नाइटर system/helpers फ़ोल्डर में हेल्परों को खोजता है.

किसी हेल्पर को लोड करना

किसी हेल्पर को लोड करना बहुत ही आसान है. इसके लिये हम निम्न लिखित फ़ंग्शन का प्रयोग करते हैं:

$this->load->helper('name');

यहां name आपकी हेल्पर फ़ाइल का नाम है जिसे बिना .php एक्सटेंशन तथा "helper" वाले हिस्से के लिखा गया है.

उदाहरण के लिये URL Helper फ़ाइल को लोड करने के लिये(जिसका नाम url_helper.php है) आप इस तरीके का इस्तेमाल करेंगे.

$this->load->helper('url');

किसी हेल्पर को कंट्रोलर फ़ंग्शन में कहीं भी लोड किया जा सकता है. यहां तक कि आप इसे अपनी व्यू फ़ाइलों में भी लोड करा सकते हैं. यद्यपि यह अच्छा तरीका नही है. आप अपने हेल्पर फ़ंग्शनों को अपने कंट्रोलर कंस्ट्रक्टर में भी लोड करा सकते हैं ताकि वे किसी भी फ़ंग्शन के अंदर उपयोग के लिये उपलब्ध हों, या आप किसी हेल्पर को केवल उस फ़ंग्शन में लोड करा सकते हैं जिसमें इसकी आवश्यकता हो.

कृपया ध्यान दें: हेल्पर लोड करने वाले फ़ंग्शनों से कभी कोई मान नही प्राप्त किया जा सकता है, अत: कभी इन्हे वैरिएबलों के साथ निर्दिष्ट ना करें. इन्हे बस दिखाये गये तरीके से प्रयोग करें.

एक साथ कई हेल्परों को लोड करना

यदि आप एक से अधिक हेल्परों को एक साथ लोड करना चाहते हैं तो आप इस तरह एक एरे के रूप में लिख सकते हैं:

$this->load->helper( array('helper1', 'helper2', 'helper3') );

हेल्परों को स्वत: लोड करना

यदि आपको लगता है कि कोई विशेष हेल्पर पूरे अनुप्रयोग में उपयोग होगा तो आप कोड इग्नाइटर को इसे स्वत: लोड करने के लिये कह सकते हैं. यह करने के लिये application/config/autoload.php फ़ाइल को खोलें और autoload एरे में उस हेल्पर का नाम भर दें.

किसी हेल्पर को उपयोग में लाना

एक बार जब आप किसी हेल्पर फ़ाइल को लोड कर देते हैं, आप उस हेल्पर फ़ाइल में उपलब्ध फ़ंग्शनों को आप आम पीएचपी फ़ंग्शनों की तरह उपयोग में ला सकते हैं.

उदाहरण के लिये anchor() फ़ंग्शन के द्वारा व्यू फ़ाइलों में लिंक बनाने के लिये आपको कुछ ऐसा लिखना होगा:

<?php echo anchor('blog/comments', 'Click Here');?>

यहां "Click Here" लिंक का नाम है तथा "blog/comments" "कंट्रोलर/फ़ंग्शन" का URI  है.

हेल्परों को विस्तारित(Extend) करना

हेल्परों को विस्तारित करने के लिये application/helpers/ फ़ोल्डर में अपने पहले से बने हुये हेल्पर के नाम वाली फ़ाइल बनायें, पर उसमें MY_ उपसर्ग लगा दें(इसे विन्यासित किया जा सकता है. नीचे देखें).

यदि आपको पहले से बने हुये हेल्पर में कुछ सुविधायें जोड़नी हों जैसे एक या दो फ़ंग्शन जोड़ना हो या हेल्पर के काम करने का तरीका बदलना हो तो पूरी की पूरी हेल्पर फ़ाइल को अपनी हेल्पर फ़ाइल से बदलना कठिन काम होगा. ऐसी स्थिति में हेल्पर को "extend" करना बेहतर होगा. यहां "extend" शब्द को अस्पष्ट रूप से प्रयोग किया जा रहा है क्योंकि हेल्पर फ़ंग्शन प्रक्रियात्मक रूप में लिखे जाते हैं तथा पारंपरिक प्रोग्रामिंग तकनीक की तरह विस्तारित या "extend" नही किये जा सकते हैं.

उदाहरण के लिये किसी Array Helper को विस्तारित करने के लिये आप application/helpers/MY_array_helper.php नाम से फ़ाइल बनायेंगे तथा किसी फ़ंग्शन को जोडे़ंगे या पहले से बने फ़ंग्शन का उल्लंघन करेंगे.

// any_in_array() is not in the Array Helper, so it defines a new function
function any_in_array($needle, $haystack)
{
    $needle = (is_array($needle)) ? $needle : array($needle);
    foreach ($needle as $item)
    {
        if (in_array($item, $haystack))
        {
            return TRUE;
        }
        }
    return FALSE;
}
// random_element() is included in Array Helper, so it overrides the native function
function random_element($array)
{
    shuffle($array);
    return array_pop($array);
}

अपने स्वयं के उपसर्ग जोड़ना

विस्तारित हेल्परों की फ़ाइलों के नाम में लगने वाले उपसर्ग को लाइब्रेरियों तथा कोर क्लासों को विस्तारित करते वक्त भी उपयोग किया जाता है. अपने स्वयं के उपसर्ग को निर्धारित करने के लिये application/config/config.php फ़ाइल को खोलें तथा इस लाइन को खोजें:

$config['subclass_prefix'] = 'MY_';

कृपया ध्यान दें: कोड इग्नाइटर की मूल लाइब्रेरियों में CI_ उपसर्ग के तौर में प्रयुक्त होता है अत: इन्हे अपने उपसर्ग के तौर पर उपयोग ना करें.

माडल्स Models - कोड इग्नाइटर

जो कोई भी अधिक पारंपरिक MVC तरीके को उपयोग करना चाहता है, उनके लिये कोड इग्नाइटर में माडल वैकल्पिक रूप से उपलब्ध होते हैं.

माडल क्या है?

माडल्स वे PHP Classes हैं जो कि आपके डाटाबेस की जानकारियों के साथ काम करती हैं. उदाहरण के लिये आप कोड इग्नाइटर को अपने ब्लाग को प्रबंधन के लिये उपयोग करते हैं. तो आपके पास एक माडल क्लास होनी चाहिये जिसमें वो फ़ंग्शन हों जिससे कि आप अपने ब्लाग में डाटा जोड़, घटा या संपादित कर सकें. यहां एक ऐसा ही उदाहरण दिया जा रहा है:

class Blogmodel extends Model {
    var $title   = '';
    var $content = '';
    var $date    = '';
    function Blogmodel()
    {
        // Call the Model constructor
        parent::Model();
    }
    function get_last_ten_entries()
    {
        $query = $this->db->get('entries', 10);
        return $query->result();
    }
    function insert_entry()
    {
        $this->title   = $_POST['title']; // please read the below note
        $this->content = $_POST['content'];
        $this->date    = time();
        $this->db->insert('entries', $this);
    }
    function update_entry()
    {
        $this->title   = $_POST['title'];
        $this->content = $_POST['content'];
        $this->date    = time();
        $this->db->update('entries', $this, array('id' => $_POST['id']));
    }
}

नोट: ऊपर के उदाहरण में हमने Active Record डाटाबेस फ़ंग्शन का उपयोग क्या गया है.

नोट: Note: सरलता के लिये हम यहां $_POST वैरिएबलों को सीधे उपयोग कर रहे हैं. हालांकि ऐसा करना ठीक नही है. इसकी बजाय सामान्यत: Input Class के $this->input->post('title') का प्रयोग किया जाता है.

माडल का गठन

माडल क्लासें आपके application/models/ फ़ोल्डर में होती हैं.यदि आप उन्हे और भी अधिक अच्छे से वर्गीकृत करना चाहते हैं तो उन्हे और अंदर सब फ़ोल्डरों में भी रखा जा सकता है.

एक माडल क्लास कुछ इस प्रकार होती है:

class Model_name extends Model {
    function Model_name()
    {
        parent::Model();
    }
}

यहां Model_name आपकी क्लास का नाम है. क्लास का नाम में पहला अक्षर हमेशा कैपिटल अक्षर से लिखा होना चाहिये और बाकी छोटे अक्षरों से. एक बात यह भी सुनिश्चित कर लेना चाहिये कि आपकी क्लास आधारभूत माडल क्लास को विस्तारित कर रही हो.

फ़ाइल का नाम हमेशा छोटे अक्षरों से लिखा जाना चाहिये तथा आपकी फ़ाइल का नाम और क्लास का नाम एक ही होना चाहिये. उदाहरण के लिये यदि आपकी क्लास यह है तो:

class User_model extends Model {
    function User_model()
    {
        parent::Model();
    }
}

आपकी फ़ाइल ऐसी होगी:

application/models/user_model.php

माडल को लोड करना

सामान्यत: आपकी माडलों को कंट्रोलर फ़ंग्शनों से ही पुकारा तथा लोड किया जाता है. किसी माडल को लोड करने के लिये आप निम्नलिखित फ़ंग्शन का प्रयोग करेंगे:

$this->load->model('Model_name');

यदि आपका माडल किसी उप-फ़ोल्डर में है जैसे कि यदि आपका माडल application/models/blog/queries.php फ़ोल्डर में है, तो आपको इसे इस प्रकार लोड करना होगा:

$this->load->model('blog/queries');

एक बार लोड होने के बाद आप अपने माडल फ़ंग्शन को उसके नाम से पुकार सकते हैं. इस दौरान आपको यह ध्यान रखना होगा:

$this->load->model('Model_name');
$this->Model_name->function();

यदि आप अपने माडल को किसी दूसरे आब्जेक्ट नाम से निर्दिष्ट करना चाहते हैं तो आप ऐसा एक दूसरे पैरामीटर के द्वारा कर सकते हैं.

$this->load->model('Model_name', 'fubar');
$this->fubar->function();

यहां एक कंट्रोलर का उदाहरण दिया जा रहा है जो कि माडल को लोड करता है और व्यू दिखाता है.

class Blog_controller extends Controller {
    function blog()
    {
        $this->load->model('Blog');
        $data['query'] = $this->Blog->get_last_ten_entries();
        $this->load->view('blog', $data);
    }
}

माडलों को स्वत: लोड करना

यदि आप किसी माडल को पूरे अनुप्रयोग में उपयोग करना चाहते हैं तो आप कोडइग्निटर को इसे स्वत: लोड करने के लिये कह सकते हैं. ऐसा आप application/config/autoload.php में जाकर आटोलोड एरे में माडल का नाम भरकर कर सकते हैं.

अपने डाटाबेस से जुड़ना

जब एक माडल लोड हो चुका होता है तो यह स्वत: ही आपके डाटाबेस से नही जुड़ता है. कनेक्शन के लिये निम्नलिखित विकल्प आपके लिये उपलब्ध होते हैं:

  • आप यहां बताये गये तरीकों से आप डाटाबेस से जुड़ सकते हैं.
  • आप अपने माडल लोडिंग फ़ंग्शन में तीसरे पैरामीटर के तौर पर TRUE (boolean) गुजारकर माडल को डाटाबेस से स्वत: ही जोड़ सकते हैं:
    $this->load->model('Model_name', '', TRUE);
  • आप तीसरे पैरामीटर में डाटाबेस की नई सेटिंग्स को एरे के तौर पर भी गुजार सकते हैं.
    $config['hostname'] = "localhost";
    $config['username'] = "myusername";
    $config['password'] = "mypassword";
    $config['database'] = "mydatabase";
    $config['dbdriver'] = "mysql";
    $config['dbprefix'] = "";
    $config['pconnect'] = FALSE;
    $config['db_debug'] = TRUE;
    $this->load->model('Model_name', '', $config);

व्यूज़ Views - कोड इग्नाइटर

एक view एक वेब पेज हो सकता है या पेज का टुकड़ा हो सकता है जैसे हेडर,फ़ूटर, साइडबार आदि. असल में व्यू को आप किसी अन्य व्यू में भी जोड़ सकते हैं और उसे किसी अन्य व्यू में भी.

व्यूज को कभी सीधे नही बुलाया जाता है. उन्हे हमेशा कंट्रोलर के द्वारा लोड किया जाना चाहिये. याद रखें कि MVC Framework में, कंट्रोलर ट्रैफ़िक पुलिस की तरह कार्य करता है, अत: यह किसी व्यू के आनयन के लिये जिम्मेदार होता है. यदि आपने कंट्रोलर पेज के बारे में नही पढ़ा है तो आगे बढ़ने से पहले उसे पढिये.

उदाहरणों के उपयोग से आपने कंट्रोलर पेज बना लिया है, चलिये उसमें व्यू जोड़ते हैं.

एक व्यू बनाना

अपने टेक्स्ट एडीटर का प्रयोग करते हुये एक फ़ाइल blogview.php बनाइये, और उसमें निम्नलिखित को रखिये.

<html>

<head>

<title>My Blog</title>

</head>

<body>

<h1>Welcome to my Blog!</h1>

</body>

</html>

अब इस फ़ाइल को application/views/ फ़ोल्डर में सुरक्षित कीजिये.

एक व्यू को लोड करना

किसी विशेष व्यू को लोड करने के लिये आपको निम्नलिखित फ़ंग्शन का प्रयोग करना होगा.

$this->load->view('name');

यहां name आपकी व्यू फ़ाइल का नाम है. नोट: आपको यहां .php एक्सटेंशन बताने की जरूरत नही होती है जब तक कि आप .php के अलावा कुछ और ना लोड कर रहे हों.

अब आपने जो पहले blog.php नाम की एक कंट्रोलर फ़ाइल बनाई थी उसे खोलें, तथा उसमें echo कथन की जगह में निम्न लिखित व्यू लोडिंग फ़ंग्शन लिख दें:

<?php class Blog extends Controller { function index() { $this->load->view('blogview'); } } ?>

यदि आप अपनी साइट में पिछले यूआरएल में जायेंगे तो आप अपना नया व्यू देखेंगे. वो यूआरएल कुछ ऐसा दिखता था:

example.com/index.php/blog/

कई व्यूज़ को एक साथ लोड करना

कोड इग्नाइटर $this->load->view के कई अनुरोधों को बड़ी ही बुद्धिमत्ता के साथ पूरा करता है. यदि एक से अधिक अनुरोध होते हैं तो वो एक के बाद एक संलग्न्न हो जाते हैं. उदाहरण के लिये यदि आप एक हेडर व्यू, एक मीनू व्यू, एक कंटेंट व्यू तथा एक फ़ूटर व्यू चाहते हैं तो उसे कुछ इस प्रकार लिखा जायेगा:

<?php
class Page extends Controller {
   function index()
   {
      $data['page_title'] = 'Your title';
      $this->load->view('header');
      $this->load->view('menu');
      $this->load->view('content', $data);
      $this->load->view('footer');
   }
}
?>

ऊपर के उदाहरण में हमनें एक $data नाम का वैरिएबल का प्रयोग किया है, जिसके बारे में आप आगे जानेंगे.

व्यूज़ को सब-फ़ोल्डरों में रखना

यदि आप चाहें तो आपकी व्यू फ़ाइलों को भी सब-फ़ोल्डरों/उप-फ़ोल्डरों में रखा जा सकता है. आप जब ऐसा करेंगे तो आपको व्यू लोड करते समय फ़ोल्डर का नाम भी शामिल करना पड़ेगा.

$this->load->view('folder_name/file_name');

व्यू में डायनेमिक डाटा जोड़ना

आंकड़े हमेशा एरे या आब्जेक्ट के तौर पर कंट्रोलर से व्यू की ओर चलते हैं. इन्हे व्यू लोडिंग फ़ंग्शन में हमेशा दूसरे पैरामीटर के तौर पर गुजारा जाता है. यहां एक एरे का उदाहरण दिया जा रहा है:

$data = array(
               'title' => 'My Title',
               'heading' => 'My Heading',
               'message' => 'My Message'
          );
$this->load->view('blogview', $data);

यहां एक आब्जेक्ट का उदाहरण दिया जा रहा है:

$data = new Someclass();
$this->load->view('blogview', $data);

कृपया ध्यान दें: यदि आप आब्जेक्ट का प्रयोग करते हैं तो क्लास के वैरिएबल एरे के अवयवों के रूप में बदल जायेंगे.

चलिये आपकी कंट्रोलर फ़ाइल से शुरू करते हैं. इसे खोलिये और यह कोड उसमें लिखिये:

<?php class Blog extends Controller {

function index() {

$data['title'] = "My Real Title";

$data['heading'] = "My Real Heading";

$this->load->view('blogview', $data);

}

} ?>

अब अपनी व्यू फ़ाइल खोलिये और जिन शब्दों का प्रयोग आपने एरे की कुंजियों/की के तौर पर किया है उन्हे वैरिएबल के तौर पर लिखिये:

<html>
<head>
<title><?php echo $title;?></title>
</head>
<body>
<h1><?php echo $heading;?></h1>
</body>
</html>

अब अपने पेज को ब्राउजर में खोलिये, आप देखेंगे कि आपके वैरिएबल एरे की कुंजियों/की से बदल दिये गये हैं.

लूप बनाना

आप जिस डाटा एरे को अपनी व्यू फ़ाइलों में भेजते हैं वह केवल साधारण वैरिएबलों तक सीमित नही है. आप उससे बहु-आयामी एरे भी गुजार सकते हैं. इनका प्रयोग लूप के द्वारा कई सारी रो बनाने के लिये किया जा सकता है. जैसे कि आप अपने डाटाबेस से जब कोई डाटा निकालते हैं तो यह सामान्यत: बहु-आयामी एरे के रूप में होता है.

यहां एक सरल सा उदाहरण दिया जा रहा है. निम्नलिखित कोड को अपने कंट्रोलर में जोडे़ं:

<?php
class Blog extends Controller {
function index() {
$data['todo_list'] = array('Clean House', 'Call Mom', 'Run Errands');
$data['title'] = "My Real Title";
$data['heading'] = "My Real Heading";
$this->load->view('blogview', $data);
}
} ?>

अब अपनी व्यू फ़ाइल को खोलें और उसमें लूप बनायें:

<html>

<head>

<title><?php echo $title;?></title>

</head>

<body>

<h1><?php echo $heading;?></h1>

<h3>My Todo List</h3>

<ul>

<?php foreach($todo_list as $item):?>

<li><?php echo $item;?></li>

<?php endforeach;?>

</ul>

</body>

</html>

व्यूज़ को डाटा के रूप में प्राप्त करना

आप एक तीसरे वैकल्पिक पैरामीटर के द्वारा अपने व्यू लोडिंग के फ़ंग्शन के व्यवहार को बदल सकते हैं ताकि व्यू से निकलने वाले डाटा को ब्राउजर में भेजने की बजाय किसी वैरिएबल में सुरक्षित किया जा सके. यदि आप इस डाटा को किसी प्रकार से प्रोसेस करना चाहते हैं तो यह वैकल्पिक पैरामीटर उपयोगी सिद्ध होगा. यदि आप पैरामीटर को true कर देते हैं तो यह डाटा ब्राउजर में भेजने की बजाय सीधे उपयोग हेतु दे देगा. अत: अगर आप इसे true किया हुआ है तो इसके साथ एक वैरिएबल निर्दिष्ट करना ना भूलें.  

$string = $this->load->view('myfile', '', true);

कोड इग्नाइटर में आरक्षित नामों की सूची

कोड इग्नाइटर कई सारे फ़ंग्शनों और नामों का स्वयं उपयोग करता है. अत: कुछ नामों का डेवलपर उपयोग नही कर सकते हैं. नीचे आरक्षित नामों की एक सूची दी गई है जिन्हे डेवलपर्स उपयोग नही कर सकते हैं.

कंट्रोलरों के नाम

जैसा कि आपकी कंट्रोलर क्लासें मुख्य एप्लिकेशन कंट्रोलर से "extend" की जाती हैं अत: आपको अपने फ़ंग्शनों के नामकरण में सावधान रहना चाहिये. अन्यथा आपके फ़ंग्शन कोड इग्नाइटर के फ़ंग्शनों को रद्द कर देंगे. नीचे आरक्षित नामों एक सूची है. आप अपने कंट्रोलर फ़ंग्शनों का नाम निम्न में से कोई भी ना रखें.

  • Controller
  • CI_Base
  • _ci_initialize
  • _ci_scaffolding
  • index

यदि आप PHP4 का उपयोग कर रहे हैं तो आपके लिये कुछ अतिरिक्त आरक्षित नाम हैं. लेकिन ये तभी लागू होंगे जब आप PHP4 का प्रयोग कर रहे हों.

  • CI_Loader
  • config
  • database
  • dbutil
  • dbforge
  • file
  • helper
  • helpers
  • language
  • library
  • model
  • plugin
  • plugins
  • scaffolding
  • script
  • view
  • vars
  • _ci_assign_to_models
  • _ci_autoloader
  • _ci_init_class
  • _ci_init_scaffolding
  • _ci_is_instance
  • _ci_load
  • _ci_load_class
  • _ci_object_to_array

फ़ंग्शन

  • is_really_writable()
  • load_class()
  • get_config()
  • config_item()
  • show_error()
  • show_404()
  • log_message()
  • _exception_handler()
  • get_instance()

वैरिएबल (चर राशि)

  • $config
  • $mimes
  • $lang

कांस्टेंट (अचर राशि)

  • EXT
  • FCPATH
  • SELF
  • BASEPATH
  • APPPATH
  • CI_VERSION
  • FILE_READ_MODE
  • FILE_WRITE_MODE
  • DIR_READ_MODE
  • DIR_WRITE_MODE
  • FOPEN_READ
  • FOPEN_READ_WRITE
  • FOPEN_WRITE_CREATE_DESTRUCTIVE
  • FOPEN_READ_WRITE_CREATE_DESTRUCTIVE
  • FOPEN_WRITE_CREATE
  • FOPEN_READ_WRITE_CREATE
  • FOPEN_WRITE_CREATE_STRICT
  • FOPEN_READ_WRITE_CREATE_STRICT

कंट्रोलर – कोड इग्नाइटर

कंट्रोलर आपके अनुप्रयोग का हृदय होता है. यही यह सुनिश्चित करता है कि प्रत्येक HTTP अनुरोध का किस प्रकार उपयोग करना है.

कंट्रोलर क्या है?

कंट्रोलर एक क्लास फ़ाइल होती है जिसके नाम को यूआरआई में सम्मिलित किया जा सकता है.

Consider this URI: जरा इस यूआरआई पर ध्यान दें

example.com/index.php/blog/

ऊपर के उदाहरण मे, कोड इग्निटर blog.php को प्राप्त करने के प्रयास करेगा और उसे लोड करेगा.

जब यूआरआई के पहले हिस्से से कंट्रोलर का नाम मिलता है तभी वह लोड होता है.

आइये Hello World! प्रोग्राम बनायें.

आइये एक कंट्रोलर बनायें ताकि आप इसे काम करते देख सकें. अपने टेक्स्ट एडीटर का उपयोग करके एक फ़ाइल बनायें blog.php,और इसमें निम्न लिखित कोड लिखें.

<?php
class Blog extends Controller {
  function index()
  {
    echo 'Hello World!';
  }
} ?>

अब इस फ़ाइल को application/controllers/ फ़ोल्डर में सुरक्षित करें.

अब अपनी साइट में निम्नलिखित यूआरएल को खोलें.

example.com/index.php/blog/

यदि आपने सब कुछ सही किया है तो आपको Hello World!.दिखेगा.

कृपया ध्यान दें: क्लास का नाम हमेशा अंग्रेजी के बड़े(कैपिटल) लेटर से शुरू होना चाहिये. उदाहरण के लिये निम्नलिखित कोड वैध है.

<?php
class Blog extends Controller {
}
?>

निम्नलिखित कोड वैध नही है.

<?php
class blog extends Controller {
}
?>

हमेशा यह सुनिश्चित कर लें कि आपका कंट्रोलर हमेशा parent controller क्लास से extends होना चाहिये ताकि ताकि आपके कंट्रोलर को उसके सारे फ़ंग्शन मिल सकें.

फ़ंग्शन

ऊपर के उदाहरण में फ़ंग्शन का नाम index() है. सामान्यत: जब यूआरआई का दूसरा खंड जब भी खाली होता है तब index() फ़ंग्शन हमेशा लोड होता है. "Hello World" को दिखाने का दूसरा तरीका कुछ ऐसा हो सकता है:

example.com/index.php/blog/index/

यूआरआई का दूसरा खंड कंट्रोलर के उस फ़ंग्शन के बारे में बताता है जिसे अनुरोध भेजा गया है.

आइये आपके कंट्रोलर में एक नया फ़ंग्शन जोड़ें.

<?php class Blog extends Controller { function index() { echo 'Hello World!'; } function comments() { echo 'Look at this!'; } } ?>

अब comment फ़ंग्शन को देखने के लिये निम्नलिखित यूआरआई को ब्राउजर में खोलें.

example.com/index.php/blog/comments/

आप आपना नया संदेश देख पायेंगे

फ़ंग्शन में से यूआरआई के हिस्सों को को गुजारना.

यदि आपका यूआर आई दो से ज्यादा खंड रखता है तो वो खंड आपके फ़ंग्शन मे पैरामीटरों के तौर पर भेजे जा सकते हैं

उदाहरण के लिये, आपके पास कुछ इस तरह का यूआरआई है.

example.com/index.php/products/shoes/sandals/123

आपके फ़ंग्शन(shoes) में यूआरएल के अतिरिक्त हिस्से (3 और 4 यानि "sandals" और "123") भेजे जायेंगे.

<?php
class Products extends Controller {
    function shoes($sandals, $id)
    {
        echo $sandals;
        echo $id;
    }
}
?>

महत्वपूर्ण:  यदि आप URI Routing का इस्तेमाल कर रहे हैं तो, जो हिस्से आपके फ़ंग्शन से गुजारे जा रहे हैं वो एक बार फ़िर Route होंगे.

डिफ़ाल्ट कंट्रोलर परिभाषित करना

ऐसी स्थिति में जबकि कोई URI  उपस्थित ना हो तब कोड इग्निटर को किसी कंट्रोलर विशेष को लोड करने को कहा जा सकता है. जैसे कि जब आपकी साइट के मुख्य यूआरएल को अनुरोध भेजा जाता है तब किस कंट्रोलर को लोड करना. default controller को परिभाषित करने के लिये application/config/routes.php फ़ाइल को खोलें और उसके वरियेबल को बदल दें. जैसे:

$route['default_controller'] = 'Blog';

यहां Blog उस कंट्रोलर क्लास का नाम है जिसे आप उपयोग करना चाहते हैं. अब यदि आप अपनी मुख्य index.php फ़ाइल को बिना किसी यूआरआई के हिस्से जोड़े लोड करेंगे तो आप Hello World का संदेश देखेंगे.(ऐसा तब ही होगा जब आपने कोई कंट्रोलर Blog के नाम से बनाया हो तथा उसके index फ़ंग्शन में Hello World संदेश को echo कराया हो.)

फ़ंग्शन अनुरोधों को रिमैप करना

जैसा कि ऊपर बताया गया है कि यूआरआई का दूसरा हिस्सा सामान्यत: उस कंट्रोलर के किसी फ़ंग्शन को बताता है. कोड इग्निटर _remap() फ़ंग्शन के द्वारा आपको इस आचरण का उल्लंघन करने की अनुमति प्रदान करता है.

function _remap()
{
    // Some code here...
}

महत्वपूर्ण: यदि आपके कंट्रोलर में _remap() फ़ंग्शन है तो हमेशा इसे ही अनुरोध चला जायेगा चाहे आपके यूआरआई में कुछ भी हो. यह कोड इग्निटर के सामान्य आचरण का उल्लंघन कर देता है और आपको अपने फ़ंग्शन रूटिंग नियम बनाने की अनुमति प्रदान करता है.

निम्न लिखित उदाहरण में उल्लंघित फ़ंग्शन अनुरोध(जो कि सामान्यत: यूआरआई का दूसरा हिस्सा होता है) को _remap() फ़ंग्शन से गुजारा जायेगा.

function _remap($method)
{
    if ($method == 'some_method')
    {
        $this->$method();
    }
    else
    {
        $this->default_method();
    }
}

उत्पाद(आउटपुट) को संसाधित करना

कोड इग्निटर में एक output class है. इसका काम, आपके अंतिम परिणाम को वेब ब्राउजर में अपने आप भेजने का होता है.इसके बारे में अधिक जानकारी Views तथा Output पेजों से प्राप्त कर सकते हैं. कुछ मामलों में आप हो सकता है परिपूर्ण डाटा (जिसे ब्राउजर में भेजा जाना है) को दोबारा संसाधित करना चाहें. कोड इग्निटर आपको _output() नाम के एक फ़ंग्शन को अपने कंट्रोलरों में जोड़ने की अनुमति प्रदान करता है. इस फ़ंग्शन के द्वारा आप परिपूर्ण डाटा को प्राप्त कर पायेंगे.

महत्वपूर्ण: यदि आपके कंट्रोलर में _output() नाम का फ़ंग्शन है तो इसे हमेशा आउटपुट क्लास के द्वारा ही बुलाया जा सकता है. इसका पहला प्राचल या पैरामीटर आपका परिपूर्ण आउटपुट होगा.

यहां एक उदाहरण दिया जा रहा है:

function _output($output)
{
    echo $output;
}

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

निजी या प्राइवेट फ़ंग्शन

कभी कभी हो सकता है कि आप कुछ फ़ंग्शनों को सार्वजनिक उपलब्ध ना करना चाहें. किसी फ़ंग्शन को निजी या प्राइवेट बनाने के लिये उसके नाम के आगे एक अंडरस्कोर का उपसर्ग जोड़ना पड़ता है. अब यह किसी यूआरएल अनुरोध में उपलब्ध नही होगा. उदाहरण के लिये आपको कुछ ऐसे फ़ंग्शन बनाने होंगे:

function _utility()
{
  // some code
}

अगर आप इसे इस तरीके से पाने की कोशिश करेंगे तो यह काम नही करेगा.

example.com/index.php/blog/_utility/

अपने कंट्रोलरों को सब-फ़ोल्डरों में व्यवस्थित करना

यदि आप एक बडा़ अनुप्रयोग बना रहे हैं तो आपको कंट्रोलरों को सब फ़ोल्डरों में व्यवस्थित करना अच्छा लगेगा. कोड इग्निटर में आप ऐसा कर सकते हैं.

आपको बस इतना करना है कि application/controllers डायरेक्ट्री में फ़ोल्डरों को बनाइये और अपनी कंट्रोलर क्लासों को उसमें रख दीजिये.

नोट:  जब आप इस सुविधा का प्रयोग करते हैं तब आपके यू आर आई का पहला हिस्सा फ़ोल्डर का नाम होना चाहिये. उदाहरण के लिये आपका कंट्रोलर यहां है:

application/controllers/products/shoes.php

इस कंट्रोलर को अनुरोध भेजने के लिये आपका यूआरआई कुछ ऐसा लगना चाहिये.

example.com/index.php/products/shoes/show/123

आपके हर सब-फ़ोल्डरो में एक डिफ़ाल्ट कंट्रोलर हो सकता है जिसे तब बुलाया जाये जब यूआरएल में केवल सब फ़ोल्डर हों.इसके लिये आपको application/config/routes.php फ़ाइल में डिफ़ाल्ट कंट्रोलर का नाम बताना होगा.

कोड इग्निटर URI Routing के द्वारा आपको यूआरएल्स को भी रिमैप करने की सुविधा प्रदान करता है.

क्लास कंस्ट्रक्टर(Class Constructors)

यदि आप अपने कंट्रोलरों में कंस्ट्रक्टरों का प्रयोग करना चाहते हैं तो आपको निम्नलिखित लाइन को लिखना होगा.

parent::Controller();

इस लाइन के जरूरी रहने का कारण यह है कि आपके लोकल कंस्ट्रकटर आपके पैरेंट कंट्रोलर की क्लास का उल्लंघन कर सकते हैं अत: हमें उन्हे खुद से बुलाना पड़ता है.

यदि आप कंस्ट्रक्टरों के बारे में नही जानते हैं तो...

पीएचपी ४ में कंस्ट्रकटर एक ऐसा फ़ंग्शन होता है जिसका नाम उसकी क्लास के समान होता है. जैसे:

<?php
class Blog extends Controller {
       function Blog()
       {
parent::Controller();
       }
}
?>

पीएचपी ५ में कंस्ट्रक्टरों के लिये निम्नलिखित वाक्यविन्यास का प्रयोग किया जाता है.

<?php
class Blog extends Controller {
       function __construct()
       {
parent::Controller();
       }
}
?>

यदि आप पहले से ही कुछ वैरियेबलों को सेट करना चाहते हैं या कोई डिफ़ाल्ट क्रिया शुरू करना चाहते हैं तो कंस्ट्रक्टर काफ़ी उपयोगी होते है. कंस्ट्रक्टर कभी कोई मान return नही करते हैं. पर वे कुछ डिफ़ाल्ट कार्य करते हैं.

कोड इग्नाइटर के यूआरएल

सामान्य अवस्था में कोड इग्नाइटर के यू आर एल्स इस तरीके से बनाये जाते हैं कि वो सर्च इंजनों और मनुष्यों दोनो को आसानी से समझ आ पायें. अक्सर उपयोग में आने वाले तरीके "क्वेरी स्ट्रिंग" का उपयोग करने की बजाय कोड इग्नाइटर खंड आधारित तरीके का उपयोग करता है:

example.com/news/article/my_article

कृपया ध्यान दें: नीचे बताये गये तरीके से क्वेरी स्ट्रिंग यूआरएल्स को वैकल्पिक तौर पर सक्षम किया जा सकता है.

यूआरआई के हिस्से

माडल व्यू कंट्रोलर में यूआरएल के हिस्से निम्नलिखित जानकारी देते हैं:

example.com/class/function/ID

  1. पहला हिस्सा कंट्रोलर की क्लास को बताता है.
  2. दूसरा हिस्सा उस क्लास के फ़ंग्शन को बताता है जिसे अनुरोध भेजा जा रहा है.
  3. तीसरा या अन्य अतिरिक्त हिस्से किसी आई डी या अन्य वैरिएबल की जानकारी देते हैं जिन्हे कंट्रोलर के उस फ़ंग्शन से गुजारा जा रहा है.

URI Class तथा URL Helper में उपलब्ध फ़ंग्शन आपको यूआरआई डाटा के साथ काम करने में सहूलियत प्रदान करते हैं. यहां तक कि आप अपनी सुविधा के लिये अपने यूआरएल्स को URI Routing के द्वारा बदल भी सकते हैं.

index.php फ़ाइल को हटाना

सामान्य अवस्था में index.php फ़ाइल आपके यूआरएल्स में सम्मिलित होती है.

example.com/index.php/news/article/my_article

आप इसे .htaccess फ़ाइल के द्वारा आसानी से हटा सकते हैं.यहां एक ऐसी ही फ़ाइल का उदाहरण दिया गया है:

RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

ऊपर के उदाहरण में कोई भी http अनुरोध (index.php, robot.txt या images को छोड़कर) index.php को भेजा जायेगा.

यूआरएलों में प्रत्यय जोड़ना

आप अपनी config/config.php फ़ाइल में यूआरएल में प्रत्यय उल्लिखित कर सकते हैं. यह प्रत्यय कोड इग्नाइटर के द्वारा बनाये जाने वाले हर यूआरएल में जोड़ा जायेगा. उदाहरण के लिये यदि एक यूआरएल ऐसा है:

example.com/index.php/products/view/shoes

आप इसमें वैकल्पिक तौर से प्रत्यय जोड़ सकते हैं जैसे .html. इससे आपका पेज किसी विशेष प्रकार का प्रतीत होगा.

example.com/index.php/products/view/shoes.html

क्वेरी स्ट्रिंग्स को सक्षम करना

कुछ मामलों में आपको क्वेरी स्ट्रिंग वाले यूआरएल्स को तरजीह देना पड़ सकता है:

index.php?c=products&m=view&id=345

कोड इग्नाइटर में इस सुविधा को वैकल्पिक तौर से सक्षम किया जा सकता है. इसे आप application/config.php फ़ाइल से सक्षम कर सकते हैं. जब आप इस फ़ाइल को खोलेंगे तो आपको निम्न लिखित लाइने मिलेंगी:

$config['enable_query_strings'] = FALSE;
$config['controller_trigger'] = 'c';
$config['function_trigger'] = 'm';

यदि आप "enable_query_strings" को TRUE में बदल देंगे तो यह सुविधा सक्रिय हो जायेगी. आपके कंट्रोलर और फ़ंग्शन को फ़िर "ट्रिगर" शब्दों के द्वारा उपयोग किया जा सकेगा:

index.php?c=controller&m=method

कृपया ध्यान दें यदि आप क्वेरी स्ट्रिंग्स का प्रयोग कर रहे हैं तो आपको यूआरएल हेल्पर्स(तथा अन्य हेल्पर्स जो कि यूआरएल बनाते हैं) के बजाय अपने यूआरएल स्वयं बनाने पड़ेंगे. ऐसा इसलिये क्योंकि ये हेल्पर खंड आधारित यूआरएल्स के साथ काम करने के लिये बने हैं.

इस ब्लाग में प्रकाशित सामग्री कापीराईट द्वारा सुरक्षित है. बिना अनुमति इसका किसी भी प्रकार से अन्यत्र प्रयोग/प्रकाशन मूल रूप में/बदल कर उपयोग नही किया जा सकता है.

हिंदी में तकनीकी लेखन को प्रोत्साहित करें

please donate अभी तक वेब डेवलपमेंट अथवा प्रोग्रामिंग आदि से संबंधित जानकारी पर अंग्रेजी का एकाधिकार रहा है. भारत में इतने आई टी गुरू होने के बावजूद भारतीय भाषाओं में इस विषय पर लेखन नगण्य है. इस ब्लाग के माध्यम से मैं हिन्दी भाषिओं तक वेब डेवलपमेंट का ज्ञान पहुंचाने की कोशिश कर रहा हूं. अत: आप सभी से अनुरोध है कि हिंदी में तकनीकी लेखन के लिये सहयोग करें
मैं वेबसाइटें भी बनाता हूं. यदि आपको बनवानी हो तो बताएं.

ARCHIVES

इस ब्लॉग में खोजें

समर्थक