SilverStripe动态ModelAdmin网址和标题不起作用

时间:2016-07-28 05:59:03

标签: php silverstripe

我已经创建了这样的自定义ModelAdmin

class CompanyAdmin extends ModelAdmin {
    // private static $menu_title = 'Companies';
    // private static $url_segment = 'companies';
    private static $managed_models = 'Company';
    private static $menu_icon = 'mysite/images/icons/company-icon.png'; 
}

在上面的代码中,我已经注释掉静态属性$menu_title$url_segment,因为我希望它们是动态的(即这些属性应该取决于域名)。

为此,我创建了一个这样的扩展名:

class CompanyMenu extends LeftAndMainExtension {

    public function init() {
        $id = 'Company';
        $title = $_SERVER["HTTP_HOST"] == "login.example.com" ? "Companies" : "Profile";
        $link =  $_SERVER["HTTP_HOST"] == "login.example.com" ? "admin/companies" : "admin/profile";

        CMSMenu::add_menu_item($id, $title, $link);
    }
}

_config.php我添加了以下代码以激活扩展程序:

LeftAndMain::add_extension('CompanyMenu');

问题

所有这些代码都正确地呈现了CMS中的菜单,但是:

  1. ModelAdmin中定义的图标未来
  2. 点击菜单后,我会弹出“未找到”。
  3. 如果我取消注释CompanyAdmin中的两行并在_config.php中注释扩展代码,一切正常。

    我在哪里做错了?

2 个答案:

答案 0 :(得分:4)

您可以在CompanyAdmin文件中动态设置_config.php配置设置:

if ($_SERVER['HTTP_HOST'] == 'login.example.com') {
    CompanyAdmin::config()->menu_title = 'Companies';
    CompanyAdmin::config()->url_segment = 'companies';
} else {
    CompanyAdmin::config()->menu_title = 'Profile';
    CompanyAdmin::config()->url_segment = 'profile';
}

我建议仍然在$menu_title类中设置$url_segmentCompanyAdmin,以便有默认的回退设置。配置设置将覆盖以下内容:

class CompanyAdmin extends ModelAdmin {
    private static $menu_title = 'Companies';
    private static $url_segment = 'company';
    private static $managed_models = 'Company';
    private static $menu_icon = 'mysite/images/icons/company-icon.png'; 
}

答案 1 :(得分:1)

我认为,当你可能不必要时延长LeftAndMainExtension时,你会稍微混淆水域。

同意您延长LeftAndMainExtension的想法,还有一些您不知道的事情。

首先,您的ModelAdmin未被使用,因此不会从中获取图标和控制器。

其次,您错过了一个看起来像这样的块,以便在菜单中添加一个图标。这是LeftAndMain上创建css以向菜单项添加图标的方法。

public static function menu_icon_for_class($class) {
    $icon = Config::inst()->get($class, 'menu_icon', Config::FIRST_SET);
    if (!empty($icon)) {
        $class = strtolower(Convert::raw2htmlname(str_replace('\\', '-', $class)));
        return ".icon.icon-16.icon-{$class} { background-image: url('{$icon}'); } ";
    }
    return '';
}

从此返回的CSS被添加到此行LeftAndMain::MainMenu()

中管理区域的要求中
if ($menuIconStyling) Requirements::customCSS($menuIconStyling);

关于"未找到"您收到的错误,是由于您未指定单击图标时应发生的情况而导致的错误。这是您需要在CMSMenu::add_menu_item()LeftAndMainExtension中指定的内容,具体取决于您希望如何处理它。