2011-10-04 16 views
5

में टेम्पलेट्स के साथ कस्टम त्रुटि पृष्ठ मैं कोडइग्निटर, http://williamsconcepts.com/ci/codeigniter/libraries/template/reference.html के लिए टेम्पलेट लाइब्रेरी का उपयोग कर रहा हूं, और अब मैं कस्टम त्रुटि पृष्ठों को भी कार्यान्वित करना चाहता हूं। मुझे एक त्रुटि मिली जिसमें MY_Router डिफ़ॉल्ट राउटर का विस्तार कर रहा है: http://maestric.com/doc/php/codeigniter_404 लेकिन यह केवल 404 त्रुटियों का इलाज करता है। मैं सभी त्रुटियों को डेटाबेस त्रुटियों आदि सहित एक साधारण उपयोगकर्ता के अनुकूल पृष्ठ दिखाने के लिए चाहता हूं, और मैं इसे नियंत्रक के माध्यम से जाना चाहता हूं, आंशिक रूप से इसलिए मैं टेम्पलेट लाइब्रेरी का उपयोग कर सकता हूं, और आंशिक रूप से इसलिए मैं खुद को भेजने के लिए एक ईमेल फ़ंक्शन भी कार्यान्वित कर सकता हूं हुई त्रुटि के बारे में जानकारी।कोडइग्निटर

किसी ने अन्य त्रुटियों के लिए उपरोक्त MY_Router विधि की कार्यक्षमता को विस्तारित करने के बारे में पूछा, जैसे error_db, लेकिन लेखक से कोई जवाब नहीं मिला, इसलिए मैं यह देखने के लिए यहां जा रहा हूं कि कोई यह जानता है कि यह कैसे करना है, उपर्युक्त विधि या इसे प्राप्त करने का कोई अन्य सरल तरीका। कृपया ध्यान दें कि मैं नौसिखिया हूं, इसलिए बुनियादी कोडइग्निटर कार्यक्षमता के बारे में मेरे ज्ञान के बारे में बहुत कुछ न मानें :-)

+0

घड़ी '/ एप्लिकेशन lication/error/error_ * 'फ़ाइलें, टेम्पलेट्स डीबी त्रुटि, 404, PHP त्रुटि और सामान्य त्रुटियां हैं, इसलिए आप – user973254

+2

के साथ काम कर सकते हैं और आप सीआई कोर क्लास (बिल्कुल आपको CI_Exceptions को विस्तारित करने की आवश्यकता है) का विस्तार कर सकते हैं जैसे समझाया गया [यहां] (http://codeigniter.com/user_guide/general/core_classes.html) – user973254

+0

मुझे त्रुटि फ़ाइलों के बारे में पता है, लेकिन मुझे नहीं पता कि उन्हें साइट के बाकी हिस्सों की तरह दिखने के लिए टेम्पलेट लाइब्रेरी का उपयोग कैसे किया जाए। इसे प्राप्त करने के लिए मैं सीआई कोर कक्षाओं का विस्तार कैसे करूं? कृपया उदाहरणों के साथ उत्तर प्रदान करें ... – Anders

उत्तर

1

मुझे यह पसंद है: मैं अपना स्वयं का त्रुटि पृष्ठ बनाता हूं, और जब भी मुझे 404 फेंकना चाहिए त्रुटि, मैं वास्तव में अपना 404 पेज लोड करता हूं।

तो कहते हैं कि मेरा डिफ़ॉल्ट नियंत्रक site.php है, मेरे site.php इस तरह दिखता है:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class Site extends CI_Controller { 

    public function index() 
    { 
     $this->load->view('welcome_message'); 
    } 

    public function view($page = "home" , $function = "index") 
    { 
     do_something(); 
     if($status == "404") 
     { 
      $function = "404"; 
     } 
     $this->load->view('templates/header', $data); 
     $this->load->view($page.'/'.$function, $data);  
     $this->load->view('templates/footer', $data); 
    } 




} 

/* End of file welcome.php */ 
/* Location: ./application/controllers/welcome.php */ 

तो मैं घर/404.php की सेवा जब भी कोई त्रुटि होती है। यानी, मैं कोडइग्निटर को show_404(); पर कॉल करने की अनुमति नहीं देता इसलिए 404 पृष्ठ किसी अन्य पृष्ठ की तरह दिखता है।

पेज। मुझे लगता है कि आपने CodeIgniter की वेबसाइट में अच्छे ट्यूटोरियल का पालन किया है।

+5

यह अभी भी HTTP 200 कोड कैसे भेजेगा। यह सिर्फ 404 होने का भ्रम देता है। – Jeremy

2

मैंने अपवाद वर्ग के लिए एक एक्सटेंशन बनाया है। इस एक्सटेंशन में मैंने $this->Exceptions->show_error(); विधि को प्रतिस्थापित कर दिया है, चुड़ैल का उपयोग show_error() सीआई के कार्य द्वारा किया जाता है।

जब मैं show_error('User is not logged in', 401); पर कॉल करता हूं तो यह कस्टम विधि पहले त्रुटि_ $status_code फ़ाइल की तलाश में है। उपरोक्त उदाहरण के मामले में, यह एक त्रुटि_401.php फ़ाइल की तलाश करेगा।

जब यह फ़ाइल मौजूद नहीं है, तो यह केवल error_general.php फ़ाइल को लोड करेगा, जैसे डिफ़ॉल्ट $this->Exceptions->show_error(); करता है।

अपने मामले में, आप अपनी लाइब्रेरी, नियंत्रक या किसी भी त्रुटि को फेंकने के लिए निम्न कोड का उपयोग कर सकते हैं।

<?php 
 

 
if(!(isset($UserIsLoggedin))){ 
 
    $this->load->view('template/header'); 
 
    show_error('User is not logged in', 401); 
 
    $this->load->view('template/footer'); 
 
} 
 

 
?>

आपका error_401.php फ़ाइल की तुलना में इस तरह दिखना चाहिए:

<div id="container"> 
 
\t <h1><?php echo 'This is an 401 error'; ?></h1> 
 
\t <?php echo $message; ?> 
 
</div>

/application/core/MY_Exceptions.php:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 
 

 
class MY_Exceptions extends CI_Exceptions 
 
{ 
 
\t 
 
\t function show_error($heading, $message, $template = 'error_general', $status_code = 500) 
 
\t { \t \t 
 
\t \t if((!isset($template)) || ($template == 'error_general')){ 
 
\t \t \t if(file_exists(APPPATH.'errors/error_'.$status_code.'.php')) { 
 
\t \t \t \t $template = 'error_'.$status_code; 
 
\t \t \t } 
 
\t \t }  \t 
 
\t \t 
 
\t \t if (!isset($status_code)) $status_code = 500; 
 
\t \t 
 
\t \t set_status_header($status_code); 
 

 
\t \t $message = '<p>'.implode('</p><p>', (! is_array($message)) ? array($message) : $message).'</p>'; 
 

 
\t \t if (ob_get_level() > $this->ob_level + 1) 
 
\t \t { 
 
\t \t \t ob_end_flush(); 
 
\t \t } 
 
\t \t ob_start(); \t \t 
 
\t \t \t \t 
 
\t \t include(APPPATH.'errors/'.$template.'.php'); 
 
\t \t $buffer = ob_get_contents(); 
 
\t \t ob_end_clean(); 
 
\t \t return $buffer; 
 
\t } 
 
\t 
 
} 
 

 
?>

1

कस्टम त्रुटि पेज बनाने के लिए सबसे आसान तरीका /application/views/errors/html/error_*.php जैसे error_404.php (404 के लिए), error_db.php (डेटाबेस त्रुटियों के लिए) और error_general.php (अधिकांश अन्य त्रुटियों के लिए) पर फ़ाइलों को संपादित करने के लिए है।

चूंकि ये पृष्ठ आपकी application निर्देशिका में हैं, तो आप उन्हें अपनी आवश्यकताओं के अनुसार अनुकूलित करने के लिए स्वतंत्र हैं।

अपने सामान्य दृश्य टेम्पलेट कुछ इस तरह दिखाई देता है:

<?php $this->load->view('includes/header'); ?> 
... 
... 
<?php $this->load->view('includes/footer'); ?> 

आप इस अनुकूलित कर सकते हैं अपने /application/views/errors/html/error_*.php फाइलों में तो जैसे:

<?php 
    $page_title = $heading; 
    include VIEWPATH.'includes'.DIRECTORY_SEPARATOR.'header.php'; 
?> 
<div class="well"> 
    <h1><?php echo $heading; ?></h1> 
    <?php echo $message; ?> 
</div> 
<?php include VIEWPATH.'includes'.DIRECTORY_SEPARATOR.'footer.php'; ?> 

सूचना है कि अब हम कर रहे हैं विचारों का उपयोग, लेकिन इसके बजाय header & footer के लिए दृश्य फ़ाइलों सहित।

एक और बात गौर करने योग्य

header ध्यान में रखते हुए मैं एक $data वस्तु जो $data['page_title'] शामिल गुजर रहा हूँ। चूंकि त्रुटि पृष्ठ दृश्यों का उपयोग नहीं करते हैं, इसलिए आपको किसी भी चर को जोड़ना होगा जिसे आप सामान्य रूप से दृश्य में पारित करेंगे, इसलिए $page_title की उपस्थिति।

0
config/routes.php 

संपादित

$route['404_override'] = ''; 

प्रकार यहाँ उदाहरण त्रुटि के लिए अपने नियंत्रक

एक समारोहसूचकांक और लोड बनाते हैं तो आप में अपने दृश्य