我正在为特定的PHP应用程序构建一个小型MVC framewrok - 使用Doctrine作为ORM。 我想知道管理前端菜单的最佳做法是什么。
我的应用程序有3个菜单(水平菜单,左菜单,底部/页脚菜单),可以由站点Admin编辑(菜单存储在Doctrine NestedSet中)。
应该在哪里找到调用和呈现菜单的代码?每个控制器应该能够根据其要求调用菜单的创建(例如,对于控制器,用户不希望显示左侧菜单)。
在菜单模型中找到此功能是不合适的我猜...
答案 0 :(得分:2)
控制器应调用代码来呈现菜单,并在需要时使用模型中数据库中的任何数据。然后将结果发送到您的视图。
这是一个小故障
答案 1 :(得分:1)
我目前在我的MVC框架中实现了多层菜单(特别是Symfony,但这种模式应该传输),方法是将渲染设置在一个单独的include(Symfony术语中的组件)中,递归调用自身来呈现每个层。 include的控制器从模型请求当前层,然后将其传递给视图。 include的视图呈现每个返回的元素并再次调用include来打印所有子元素(如果可用),传入当前元素的ID以查询模型中的父值。
就条件显示菜单而言,我会将其保留在顶级视图中,因为它听起来像是视图特定的。
<强>模型强>
你应该善于使用Doctrine的findByX方法来查询当前层的项目。我的架构中的字段名为parent
,因此我会使用findByParent
。
包含控制器
$items = Doctrine::getTable('TopMenuItems')->findByParent( isset($parent) ? $parent : null) ) // null for initial call to grab top-tier elements, recursion should pass in new parent for children
包含视图
<?php foreach($items as $item) : ?>
// echo HTML element for nav item
<?php $parent = $item['parent']; include('top_menu.php'); // call nav again to print this item's children ?>
<?php endforeach; ?>
主视图
<?php if($user->wantsTopMenu()) : ?>
<?php include('top_menu.php'); ?>
<?php endif; ?>
希望有所帮助。