我有以下问题: 菜单中显示的一些链接(“投资组合”的子项)是自定义控制器的链接。当然,现在LinkingMode不适用于该链接。这是菜单的图像:
因此,Portfolio(网站,应用程序等)的子项实际上是Category-DataObjects,它们没有SiteTree Representation。通过检查和循环数据库中所有找到的类别来创建投资组合子菜单。
菜单创建如下:
<ul>
<% loop Menu(1) %>
<li class="$LinkingMode">
<a href="$Link">[$LinkingMode] $MenuTitle.XML</a>
<% if Children %>
<ul class="secondary">
<% if ClassName == 'ProjectsPage' %>
<% loop $Top.Categories %> <!-- loop all found categories, every found item links to the custom category controller -->
<li class="$LinkingMode"><a href="category/show/$Slug">$Name</a></li>
<% end_loop %>
<% else %>
<% loop Children %>
<li class="$LinkingMode"><a href="$Link"><span class="text">$MenuTitle.XML</span></a></li>
<% end_loop %>
<% end_if %>
</ul>
<% end_if %>
</li>
<% end_loop %>
</ul>
菜单中的每个类别(网站,移动设备)都链接到自定义控制器,看起来基本上就是这样:
class Category_Controller extends Page_Controller {
public function show($arguments) {
return $this; //there will be more code to display all projects of a category
}
}
我希望我必须为Category_Controller添加一些自定义代码,告诉Portfolio Page哪个链接模式有...
很多, 弗洛里安
答案 0 :(得分:2)
我在这里找到了很好的建议:
http://www.ssbits.com/snippets/2009/extending-linkingmode-to-handle-controller-actions/
http://www.ssbits.com/tutorials/2010/dataobjects-as-pages-part-1-keeping-it-simple/
这就是Category_Controller.php(在那里设置了一个公共var CategoryID):
class Category_Controller extends Page_Controller {
public $CategoryID;
public function index($arguments) {
$slug = $arguments->param("Slug");
$category = Category::get()->filter(array('Slug' => $slug))->First();
$this->CategoryID = $category->ID;
}
}
DataObject类别(LinkingMode函数检查Controller中设置的当前CategoryID是否等于Category DateObject的ID):
class Category extends DataObject {
public function LinkingMode(){
$categoryID = Controller::curr()->CategoryID;
return ($categoryID == $this->ID) ? 'current' : 'link';
}
}
在模板中,您可以像往常一样检查链接模式:
<% loop $Categories %>
<li class="$LinkingMode">$Name</li>
<% end_loop %>
干杯, 弗洛里安