2011-12-07 16 views
16

şimdi uzunca bir süre ile CodeIgniter'ı çalışıyoruz ve ben şu anda bir özel sayfasını istiyorum bir müşteri için bir proje yapıyorum. Her şey yolunda ve 404_override harika çalışıyor.CodeIgniter'ın 2.1 show_404 ile sorunu() ve 404_override

Sorunum bir ziyaretçinin ben show_404() işlevini çağırmak istiyorum olmadığı bir makale erişmeye çalışıyor ama bu bana "out of box" 404 sayfa olup 404_override yazılmış bir gösterdiğinde gelir.

Eski sürümler için bazı düzeltmeler gördüm, ancak 2.1 numaralı belgede çalışamıyorum. Öyleyse bu konuda bana yardımcı olabilecek herkes gerçekten minnettar olur.

cevap

20

Yönlendirme en temizdir; bir görünüm yüklemek de işe yarayabilir.

Buradaki problem şudur: show_404() genellikle denetleyicinizin zaten yüklendiğinden (bir şeyden sonra 404'ü göstermesi gerektiğini söylemişti) denir. CI bu noktada ikinci bir kontrolör yüklemekten hoşlanmaz, ki bu birincil engeldir.

En iyi seçeneğiniz muhtemelen 404 yolunuza yeniden yönlendirmek için istisnalar sınıfındaki show_404() işlevini genişletmektir. Yönlendirme olmadan, 404'ü çağırmadan önce ihtiyaç duyduğu tüm "ek verileri" bildiğiniz bir görünüm veya bir şey gösterdiğinizde takılırsınız (ya da istisnai olarak bunu istisnalar sınıfına yükleyebilirsiniz). Bazı dinamik görünümlerde gerçekten karmaşık olabilir.

Açıkçası, hata klasöründeki 404 şablonunu düzenlemekten daha gelişmiş bir şey yapmak istersiniz. Bazen denetleyicinin oluşturulmasından önce yüklendiği gibi, get_instance() dosyasına erişmeye çalışırken sorunlar yaşadım. Yani, o çalışırsanız dikkatli olun;

Güncelleme): İşte Ben aynı şeyi arayan bir görünüm

<?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

show_404() ait çağrı Yanıtınız için teşekkür ederiz. Her şeyden önce bir yönlendirmenin kötü bir fikir olacağını duydum, çünkü 404'ü doğru sayfada göstermeyecekti (bunun yerine örnek olarak 404'ün tamamı gösterilecekti).com/404) kötü bir fikir olmalı. Siz yazdıkça, gezinme, üstbilgi ve altbilgimi dahil etmek için 404 hatası içinde görünümleri yükleyebilmeniz gerçekten çok önemli. Görüntülemeyi kullanabilseydim, 404 şablonunu düzenlemenin bir seçeneği olurdu. Herhangi bir şans olmadan get_instance'ı denedim, bunun hakkında bir blog yazısı buldum ama yardım etmedim (2008'den beri). –

+0

Çok teşekkür ederim. Bu küçük kod parçacığıyla bana çok yardımcı oldu. 404'ü göstermeye yarayan denetleyiciyi yüklemek için kendimi bile denedim, ama CI-> load-> denetleyicileri desteklemiyor gibi görünüyor. (404_override için kullanıyorum). Ama bu sadece benim günümüzü yaptı :) –

+0

Belki de show_404() işlevini çağırmak için 404_override kontrol cihazınızı yeniden düzenleyin ve show_404() işlevinin ihtiyacınız olan tüm verileri yüklemesini sağlayın. KURUYUNUZ., ...) – landons

-1

yüklemek için show_404() fonksiyonunu uzanan bir çalışma örneği, ama bulundu kendi hata denetleyicisi ve istisna sınıfı oluşturma veya basitçe 404 sayfasına yönlendirme gibi oldukça uzun çözümler (bu, semantik olarak iyi değildir).

CI'nin dahili olarak '404_override' yolunu nasıl aradığı konusunda biraz araştırma yaptım. İşte ben ile geldi çözüm:

// 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! 

sistemi/çekirdek/CodeIgniter.php dosyasında bu işlevi ekleyin. Bu, show_404 işlevini geçersiz kılar. Denetleyicilerinizden çağırabilir ve bunlar, routes.php dosyasında verilen '404_override' yolunu arayacaktır.

+1

Çekirdek bilgisayar yok lütfen :) – 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

problem çözme Benim hızlı yaklaşım i üzerinde çalışıyorum projede bir otomatik yüklenmesi yardımcı dosyasında bir işlevi yaratmaktır. Bu yardımcı, yalnızca özel 404 sayfasına yönlendiriyor. Bu yüzden sadece show_my_404() yerine

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