I'm new in CodeIgniter in general. I have a view layout, on which I have navigation menu bar in it. I want to populate the dropdown menu with categories I've saved in database.
Here's snippet of my layout (View\layouts\frontend.php):
<nav class="navbar navbar-expand-md sticky-top">
<div class="collapse navbar-collapse flex-column " id="navbar">
<!-- Brand bar -->
<a class="navbar-brand ml-3" href="#">
<span class="">Test Site</span>
</a>
<!-- Internal links Menu navbar -->
<ul class="navbar-nav justify-content-center w-100 px-3">
<li class="nav-item">
<a class="nav-link" href="#">Home</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Categories
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<a class="dropdown-item" href="#">News</a>
<a class="dropdown-item" href="#">Event</a>
<a class="dropdown-item" href="#">Announcement</a>
</div>
</li>
</ul>
</nav>
Now, I understand that on every views that Extends that layout, I can just do query on controller and return the view with data. Here's what I've done so far and it works.
Home Controller:
use App\Models\CategoryModel;
class Home extends BaseController
{
public function index()
{
$categoryModel = new CategoryModel();
$data['categories'] = $categoryModel->orderBy('id', 'ASC')->findAll();
return view('frontend/home_page', $data);
}
}
Part of layout:
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Categories
</a>
<?php if ($categories) : ?>
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<?php foreach ($categories as $category) : ?>
<a class="dropdown-item" href="#"><?php echo $category['name'] ?></a>
<?php endforeach; ?>
</div>
<?php endif; ?>
</li>
But it looks like I have to do that on all controllers' functions that renders my views that use my layout (frontend.php). What I want to ask is, is there a possibility to just make a function/class/something to call so it's only done one time? What is the best practice in this situation?