问题
I am working on a online newspaper/blogging application with CodeIgniter 3.1.8 and Bootstrap 4. I have decided to add themes to it. The application is not HMVC, only MVC.
The themes directory is outside application as can be see in the image below:
Inside themes I have the theme directory (of course) which contains the "master view", layout.php
:
How I use the theme views
In application/core
I have added a MY_Loader.php
file with the following contents:
<?php defined('BASEPATH') OR exit('No direct script access allowed');
class MY_Loader extends CI_Loader {
function theme_view($folder, $view, $vars = array(), $return = FALSE) {
$this->_ci_view_paths = array_merge($this->_ci_view_paths, array(FCPATH . $folder . '/' => TRUE));
return $this->_ci_load(array(
'_ci_view' => $view,
'_ci_vars' => $this->_ci_prepare_view_vars($vars),
'_ci_return' => $return
));
}
}
In my Posts controller's index()
method, I load the view passing it the data:
public function index() {
//more code here
$data['posts'] = $this->Posts_model->get_posts($config['limit'], $config['offset']);
$this->load->theme_view('/themes/caminar/', 'layout', $data);
}
Using Twig for the themes
Even though I have no Symfony knowledge, I thought it was a good idea to use the Twig template engine to the theme(s).
For this purpose, I use CodeIgniter Simple and Secure Twig. I have:
Added the Simple and Secure Twig library:
application\libraries\Twig.php
;In the
third_party
directory I have added Twig itself.In
application\config\autoload.php
I have loaded twing:$autoload['libraries'] = array('database', 'form_validation', 'session', 'user_agent', 'twig');
Set the path for the Twig views in
application\libraries\Twig.php
:
private $config = [ 'paths' => [FCPATH . '/themes', VIEWPATH], 'cache' => '/path/to/twig/cache', ];
The problem
According to the docs of CodeIgniter Simple and Secure Twig, we can set a global variable like so: $this->twig->addGlobal('sitename', 'My Awesome Site');
So, I added $this->twig->addGlobal('siteTitle', 'My Awesome Site');
in the Posts controller:
public function index() {
//call initialization method
$config = $this->_initPagination("/", $this->Posts_model->get_num_rows());
$data = $this->Static_model->get_static_data();
$data['pages'] = $this->Pages_model->get_pages();
$data['categories'] = $this->Categories_model->get_categories();
//use limit and offset returned by _initPaginator method
$data['posts'] = $this->Posts_model->get_posts($config['limit'], $config['offset']);
$this->twig->addGlobal('siteTitle', 'My Awesome Site');
$this->load->theme_view('/themes/caminar/', 'layout', $data);
}
Yet, in themes\caminar\layout.php
the line <title>{{siteTitle}}</title>
does not display "My Awesome Site" inside the <title>
tag.
What am I doing wrong?
来源:https://stackoverflow.com/questions/64593789/how-can-i-pass-variable-to-a-twig-view-in-this-codeigniter-3-application