Monday, 2 November 2020

How can I pass variable to a Twig view in this Codeigniter 3 application?

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:

enter image description here

Inside themes I have the theme directory (of course) which contains the "master view", layout.php:

enter image description here

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></title> does not display "My Awesome Site" inside the <title> tag.

What am I doing wrong?



from How can I pass variable to a Twig view in this Codeigniter 3 application?

No comments:

Post a Comment