2012-04-03 7 views
1

Ich habe meine Website (mysite.com) zu mysite.com/Mobile für mobile Browser umleiten mit Codeigniters useragent Bibliothek von meinem Standard-Controller.Codeigniter mobile Redirect mit Caching

Wenn ich meine Ausgabe vom Controller zwischenspeichern funktioniert die Weiterleitung nicht, da der Browser die zwischengespeicherte Datei bedient.

Gibt es einen richtigen Weg, um aus der Datei config/routes.php umzuleiten? Wird dies mobile Besucher umleiten?

Mein Controller

Klasse Child erstreckt Regler {

function child() 
{ 
    parent::Controller(); 
    //$this->output->cache(7200); 
    $agent = $this->agent->browser() . ' ver ' . $this->agent->version(); 

} 

function index() 
{ 
    if ($this->agent->is_mobile()) 
    { 
     header('Location: ' . site_url() . 'Mobile/', TRUE, 301); 
     exit(0); 
    }else{ 
     $this->output->cache(7200); 
     $this->load->view('home',$data); 
    } 
} 

Antwort

2

Ich würde nicht mit CodeIgniter der Ausgabezwischenspeicherung vor. Das läuft vor dem Controller, deshalb werden Sie nie in die index() gelangen. Das Routing kann mit dieser Situation nicht umgehen, da es nicht erkennen kann, ob der Client mobil ist.

Es ist eine bessere Idee, die andere Caching-Methode, die CodeIgniter bietet, zu verwenden, da es detaillierter ist, können Sie die einzelnen Ansichten zwischenspeichern. http://codeigniter.com/user_guide/libraries/caching.html

function index() 
{ 
    // should put this in the __construct() of this controller or in your MY_Controller.php 
    $this->load->driver('cache', array('adapter' => 'apc', 'backup' => 'file')); 

    if ($this->agent->is_mobile()) 
    { 
     redirect('Mobile'); 
    } 
    else 
    { 
     // if this doesn't get us the output, recreate and store it 
     if(!$output = $this->cache->get('controllername_index_output')) 
     { 
      $output = $this->load->view('home', $data, TRUE); 
      $this->cache->save('controllername_index_output', $output, 7200); 
     } 

     // now we surely have the output ready, whether it was cached or not 
     $this->output->set_output($output);   
    } 
} 
+0

Danke für die Antwort. Es macht durchaus Sinn. Ich laufe immer noch CI Version 1.7. Ich kann die Cache-Treiber unter Bibliotheken nicht sehen. Funktioniert das Caching in CI 1.7 nicht? – preschool

+0

Diese andere Art von Caching wurde in 2.0 implementiert. Sie müssen APC/memcached manuell verwenden, um das Caching nach Bedarf zu verwenden. http://www.php.net/manual/en/function.apc-add.php im Beispiel ist wenig anders zu verwenden als die CodeIgniter-Funktion. – Woxxy

+0

Ich verbesserte auf 2.0 und es funktioniert wie ein Charme! – preschool