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 😉
5 comments