Silverstripe:LinkingMode与自定义控制器

时间:2012-08-27 15:23:16

标签: content-management-system silverstripe

我有以下问题: 菜单中显示的一些链接(“投资组合”的子项)是自定义控制器的链接。当然,现在LinkingMode不适用于该链接。这是菜单的图像:

enter image description here

因此,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哪个链接模式有...

很多, 弗洛里安

1 个答案:

答案 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 %>

干杯, 弗洛里安