Using Layout in CodeIgniter 4
CodeIgniter 4 is not ready for production use, but we can already play with it. We can apply layout support to avoid repetitive header/footer/sidebar html code in our application’s views by provide helper and autoload it in the hook.
Ok, let’s start, first, we can clone a CI4 project by run command:
git clone https://github.com/bcit-ci/CodeIgniter4.git
We can use PHP-Development server launcher by go to CodeIgniter4 directory and run command:
php serve.php
and we will get the page:
The view of “Home::index()” of controller is placed at application/Views/welcome_message.php
:
application/ ├── Config ├── Controllers │ └── Home.php ├── Views │ ├── errors │ ├── form.php │ └── welcome_message.php
with code called in the controller like the following:
<?php namespace App\Controllers; use CodeIgniter\Controller; class Home extends Controller { public function index() { return view('welcome_message'); } }
For example, we need to move the header and footer to the separate file, named application/Views/layout.php
:
application/ ├── Config ├── Controllers │ └── Home.php ├── Views │ ├── errors │ ├── form.php │ ├── layout.php │ └── welcome_message.php
So, Let’s prepare the layout:
<html> <head></head> <!-- move code from welcome_message.php's html <head> to here --> <body> <!-- move code from welcome_message.php's style to here, or use separate file for css and apply to <head> --> <div class="wrap"> <?php echo $content; ?> </div> </body> </html>
Now, we can write a helper to wrap it, for example, named render
helper. We can create a file named application/Helpers/render_helper.php
:
application/ ├── Config ├── Controllers ├── Helpers │ └── render_helper.php ├── Views
Our render
helper can have function()
for render view with layout functionality, which we get the content of view, and then apply to the layout:
<?php if ( ! function_exists('render')) { function render(string $name, array $data = [], array $options = []) { return view( 'layout', [ 'content' => view($name, $data, $options), ], $options ); } }
If most of the controllers will use the render
helper, we can then autoload it in the Events:
application/ ├── Config │ ├── Events.php ├── Controllers ├── Helpers ├── Views
with post_controller_constructor
event point:
<?php namespace Config; use CodeIgniter\Events\Events; Events::on('post_controller_constructor', function() { helper('render'); });
And now, we are ready to use the render()
function in the controller:
<?php namespace App\Controllers; use CodeIgniter\Controller; class Home extends Controller { public function index() { return render('welcome_message'); } }
Done 😉
how to implement the above said using sub folders in view folder i.e.
/view/frontend/layouts.php
/view/backend/layouts.php
you can modify the `render` helper to allow specify layout path
thanx i figured it out. thanx for ur useful and precious blog
How to pass data in view using render helper? As you explained is not working for me.
You may need to follow latest documentation for layout support usage in CodeIgniter 4 https://codeigniter.com/user_guide/outgoing/view_layouts.html?highlight=layout