问题描述
我是CodeIgniter的新手。我有一个视图布局,上面有导航菜单栏。我想用我保存在数据库中的类别填充下拉菜单。
这是我的布局的摘要(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>
现在,我了解到在扩展该布局的每个视图上,我都可以在控制器上进行查询并返回包含数据的视图。到目前为止,这是我已经完成的工作。
家庭控制器:
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);
}
}
部分布局:
<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>
但是看起来我必须在所有控制器的函数上执行此操作,这些函数会渲染使用布局的视图(frontend.PHP)。 我想问的是,是否有可能只调用一个函数/类/某些东西,而只完成一次?在这种情况下,最佳做法是什么?
解决方法
如果
$categoryModel = new CategoryModel();
$data['categories'] = $categoryModel->orderBy('id','ASC')->findAll();
您计划在该Controller内调用多个方法,然后,是的,将代码推送到可重用的代码中将是最佳实践。
表面上您可以在几个不同的地方定义此功能,但是在这种情况下,私有控制器功能可能是最简单的(必须 私有才能阻止其服务通过网络请求):
private getCategories(){
$categoryModel = new CategoryModel();
$ret['categories'] = $categoryModel->orderBy('id','ASC')->findAll();
return $ret;
}
同一控制器内的任何其他函数随后都可以通过调用来获取数据
$this->getCategories()
。