2011-12-07 10 views
16

मैं अब काफी कुछ समय के लिए साथ काम कर रहा है CodeIgniter और मैं वर्तमान में एक ग्राहक है कि एक कस्टम चाहते हैं पृष्ठ के लिए एक प्रोजेक्ट कर रहा हूँ। सबकुछ ठीक है और 404_override यह बहुत अच्छा काम करता है।CodeIgniter 2.1 मुद्दा और 404_override

मेरे मुद्दा जब एक आगंतुक एक लेख मौजूद नहीं है कि मैं show_404() समारोह कॉल करना चाहते हैं का उपयोग करने की कोशिश कर रहा है, लेकिन यह मुझे पता चलता "out of box" 404 पेज और नहीं 404_override में लिखा एक आता है।

मैंने पुराने संस्करणों के लिए कुछ फिक्स देखे हैं, लेकिन मैं इसे 2.1 में काम करने के लिए नहीं मिल सकता। तो अगर कोई मेरी मदद कर सकता है तो मैं वास्तव में आभारी रहूंगा।

उत्तर

20

रीडायरेक्ट साफ़ है; एक दृश्य लोड करना भी काम कर सकता है।

यहां समस्या यह है कि show_404() आमतौर पर आपके नियंत्रक को लोड होने के बाद बुलाया जाता है (कुछ इसे बाद में 404 दिखाता है)। सीआई उस बिंदु पर एक दूसरा नियंत्रक लोड करना पसंद नहीं करता है, जो प्राथमिक बाधा है।

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

आप स्पष्ट रूप से त्रुटियों फ़ोल्डर में 404 टेम्पलेट को संपादित करने से कुछ और अधिक उन्नत चाहते हैं। मुझे उस फ़ाइल से get_instance() तक पहुंचने का प्रयास करने में समस्याएं आई हैं, कभी-कभी नियंत्रक के निर्माण से पहले इसे लोड किया जाता है। तो, सावधान यदि आप कोशिश है कि हो सकता है;)

अद्यतन: यहाँ एक दृश्य

<?php 
// application/core/MY_Exceptions.php 
class MY_Exceptions extends CI_Exceptions { 

    public function show_404() 
    { 
     $CI =& get_instance(); 
     $CI->load->view('my_notfound_view'); 
     echo $CI->output->get_output(); 
     exit; 
    } 
} 
+1

फोन आपकी प्रतिक्रिया के लिए धन्यवाद। सबसे पहले मैंने सुना है कि एक रीडायरेक्ट एक बुरा विचार होगा, क्योंकि यह सही पृष्ठ पर 404 नहीं दिखाएगा (इसके बजाए सभी 404 उदाहरण पर होने के रूप में दिखाए जाएंगे।कॉम/404) जो एक बुरा विचार होना चाहिए। आपके लिखते ही, क्या मैं सच में करना चाहते हैं 404 त्रुटि अंदर विचारों लोड करने के लिए मेरे नेविगेशन, शीर्ष लेख और पाद शामिल करने के लिए सक्षम होने के लिए है। अगर मैं विचारों का उपयोग कर सकता हूं तो 404 टेम्पलेट को संपादित करना एक विकल्प होगा। मैंने बिना किसी भाग्य के get_instance की कोशिश की, इसके बारे में एक ब्लॉग पोस्ट पाया लेकिन मदद नहीं की (यह 2008 से था)। –

+0

आपको बहुत बहुत धन्यवाद। उस छोटे कोड स्निपेट के साथ मुझे बहुत मदद मिली। मैंने अपने 404 को दिखाने के लिए बनाए गए नियंत्रक को लोड करने की भी कोशिश की, लेकिन ऐसा लगता है कि $ सीआई-> लोड-> नियंत्रकों का समर्थन नहीं कर रहा है। (जिसे मैं 404_override के लिए उपयोग कर रहा हूं)। लेकिन यह सिर्फ मेरा दिन बना दिया :) –

+0

हो सकता है कि आपके 404_override नियंत्रक refactor बस show_404() कॉल करने के लिए, और show_404() फ़ंक्शन लोड सभी डेटा आप की जरूरत है। इसे ड्रवाई मैन रखें ...;) – landons

-1

मैं एक ही बात के लिए खोज रहा था लोड करने के लिए show_404() फ़ंक्शन का विस्तार की एक काम उदाहरण है, लेकिन पाया काफी लंबे समाधान जैसे स्वयं त्रुटि नियंत्रक और अपवाद वर्ग बनाना या बस 404 पेज पर रीडायरेक्ट करना (जो कि अर्थात् अच्छा नहीं है)।

इसलिए मैंने थोड़ा सा शोध किया कि सीआई आंतरिक रूप से '404_override' मार्ग कहता है। यहाँ समाधान मैं के साथ आया है:

// Override show_404 method 
function show_404(){ 
    // Load Router and Core classes. 
    $RTR =& load_class('Router', 'core'); 

    // Get class and method for 404 from routes.php 
    $x = explode('/', $RTR->routes['404_override']); 
    $class = $x[0]; 
    $method = (isset($x[1]) ? $x[1] : 'index'); 

    // Get current class and method for callback 
    $callback_class = $RTR->fetch_class(); 
    $callback_method = $RTR->fetch_method(); 
    // Can also log here, using callback class and method. 

    // Create object for callback 
    $CI = new $callback_class; 
    call_user_func_array(array(&$CI, $method), array_slice(array($class,$method), 2)); 
} // End! 

में प्रणाली/कोर/CodeIgniter.php फ़ाइल इस समारोह जोड़ें। यह शो_404 फ़ंक्शन ओवरराइड करेगा। आप इसे अपने नियंत्रकों से कॉल कर सकते हैं और यह routes.php फ़ाइल में दिए गए '404_override' मार्ग को कॉल करेगा।

+1

कोई कोर हैक कृपया :) – anupam

0
function show_404($page = '', $log_error = TRUE) 
{ 
    if ($log_error) 
    { 
     log_message('error', '404 Page Not Found --> '.$page); 
    } 
    redirect(base_url().index_page().'/controller/error_page'); 
      //OR 
      //redirect('SOME URL'); 

    exit; 
} 
2

समस्या को हल करने के लिए मेरे तेज दृष्टिकोण परियोजना मैं पर काम कर रहा हूँ में एक autoloaded सहायक फ़ाइल में एक समारोह बनाने के लिए है। यह सहायक बस कस्टम 404 पेज पर रीडायरेक्ट करता है। तो मैं सिर्फ show_my_404() के बजाय show_404()

function show_my_404(){ 
    //Using 'location' not work well on some windows systems 
    redirect('controller/page404', 'location'); 
}