2010-05-23 18 views
0

J'ai lu this post et je veux utiliser une solution similaire, mais avec db.Thèmes en dehors de l'application

Dans mon contrôleur de site après():

$theme = $page->get_theme_name(); //Orange 
Kohana::set_module_path('themes', Kohana::get_module_path('themes').'/'.$theme); 
$this->template = View::factory('layout') 

J'ai vérifié avec Firebug:

fire::log(Kohana::get_module_path('themes')); // D:\tools\xampp\htdocs\kohana\themes/Orange 

Je suis sûr que chemin existe. J'ai directement dans le dossier 'views' du dossier 'Orange' avec le fichier layout.php.

Mais je reçois: La mise en page de vue demandée n'a pas pu être trouvé

Extended Kohana_Core est juste:

public static function get_module_path($module_key) { 
return self::$_modules[$module_key]; 
} 

public static function set_module_path($module_key, $path) { 
self::$_modules[$module_key] = $path; 
} 

Quelqu'un pourrait me aider à résoudre cette question?

Peut-être est un problème .htaccess:

# Turn on URL rewriting 
RewriteEngine On 

# Put your installation directory here: 
# If your URL is www.example.com/kohana/, use /kohana/ 
# If your URL is www.example.com/, use/
RewriteBase /kohana/ 

# Protect application and system files from being viewed 
RewriteCond $1 ^(application|system|modules) 

# Rewrite to index.php/access_denied/URL 
RewriteRule ^(.*)$/[PT,L] 
RewriteRule ^(media) - [PT,L] 
RewriteRule ^(themes) - [PT,L] 

# Allow these directories and files to be displayed directly: 
# - index.php (DO NOT FORGET THIS!) 
# - robots.txt 
# - favicon.ico 
# - Any file inside of the images/, js/, or css/ directories 
RewriteCond $1 ^(index\.php|robots\.txt|favicon\.ico|static) 

# No rewriting 
RewriteRule ^(.*)$ - [PT,L] 

# Rewrite all other URLs to index.php/URL 
RewriteRule ^(.*)$ index.php/$1 [PT,L] 

Quelqu'un pourrait-il aider? Qu'est-ce que je fais mal?

Cordialement

[EDIT]

Mon code de commande:

class Controller_Site extends Controller_Fly { 

    public static $meta_names = array('keywords', 'descriptions', 'author'); 


    public function action_main() { 
     $this->m('page')->get_main_page(); 
    } 

    public function action_page($page_title) { 
     $this->m('page')->get_by_link($page_title); 
    } 

    public function after() { 
     $page = $this->m('page'); 
     $metas = ''; 
     foreach(self::$meta_names as $meta) { 
      if (! empty($page->$meta)) { 
       $metas .= html::meta($page->$meta, $meta).PHP_EOL; 
      } 
     } 
     $theme = $page->get_theme_name(); 
     Kohana::set_module_path('themes', Kohana::get_module_path('themes').'/'.$theme); 
     $menus = $page->get_menus(); 
     $this->template = View::factory('layout') 
          ->set('theme', $theme) 
          ->set('metas', $metas) 
          ->set('menus', $menus['content']) 
          ->set('sections', $page->get_sections()) 
          ->set_global('page', $page); 
     if ($page->header_on) { 
      $settings = $this->m('setting'); 
      $this->template->header = View::factory('/header') 
               ->set('title', $settings->title) 
               ->set('subtitle', $settings->subtitle) 
               ->set('menus', $menus['header']); 
     } 
     if ($page->sidebar_on) { 
      $this->template->sidebar = View::factory('sidebar', array('menus' => $menus['sidebar'])); 
     } 
     if ($page->footer_on) { 
      $this->template->footer = View::factory('footer'); 
     } 
     parent::after(); 
    } 

} 

et contrôleur parent:

abstract class Controller_Fly extends Controller_Template { 

     protected function m($model_name, $id = NULL) { 
      if (! isset($this->$model_name)) { 
        $this->$model_name = ORM::factory($model_name, $id); 
      } 
      return $this->$model_name; 
     } 

     protected function mf($model_name, $id = NULL) { 
      return ORM::factory($model_name, $id); 
     } 

} 

[Edit 2] Lien antérieur au poste était mort, lien était: http://forum.kohanaframework.org/comments.php?DiscussionID=5744&page=1#Item_0

Répondre

0

Je pense que votre contrôleur a une méthode __construct() et vous n'êtes pas appeler parent::__construct

En fait, je pense que pour V3 kohana __construct doit être aussi passé l'objet de la demande de $ comme suit:

public function __construct(Request $request) 
{ 
    parent::__construct($request); 
} 
+0

Merci pour votre réponse. J'ai ajouté le code du contrôleur. – Marek

0

j'ai réalisé que je dois initialiser tous les modules une fois encore:

$theme = $page->get_theme_name(); 
    Kohana::set_module_path('themes', Kohana::get_module_path('themes').'/'.$theme); 
    Kohana::modules(Kohana::get_modules()); 

Maintenant, je n'ai pas d'erreur.Au lieu de cela, je reçois écran blanc de la mort:

$this->template is null 

:(

[EDIT]

Maintenant, je sais, j'avais:

$this->template = View::factory('layout') 
->set('theme', $theme) 
->set('metas', $metas) 
->set('menus', $menus['content']) 
->set('sections', $page->get_sections()) 
->set_gobal('page', $page); 

Ofcourse j'oubliais que set_global ne retourne pas $this: D

De toute façon tout fonctionne maintenant :)

J'ai encore une question sur l'efficacité. J'appelle Kohana::modules() deuxième fois dans le flux de la demande. Est-ce un gros problème selon l'efficacité?

Cordialement

+0

@Efficacité, non, c'est une méthode très efficace, testée – Kemo