在Silverstripe CMS中添加新的菜单项

在Silverstripe CMS中添加新的菜单项

问题描述:

我正在尝试在Silverstripe CMS中创建一个新的菜单项。我还是不明白。我不知道我做错了什么。这是关于Silverstripe 3.6。在Silverstripe CMS中添加新的菜单项

我也试过“/ dev/build”和“dev/build?flush = 1”。但没有结果。

Footerinfos.php(mysite的/代码/)

class FooterInfos extends ModelAdmin { 

public static $managed_models = array('FooterInfo'); 
static $url_segment = 'footerinfo'; 
static $menu_icon = 'framework/admin/images/menu-icons/network.png'; 
static $menu_title = 'Footer'; 

} 

Footerinfo.php(mysite的/代码/)

class FooterInfo extends DataExtension { 
static $db = array(
    'FooterHead1' => 'Varchar(255)', 
    'FooterHead2' => 'Varchar(255)', 
    'FooterHead3' => 'Varchar(255)', 
    'FooterText1' => 'HTMLText', 
    'FooterText2' => 'HTMLText', 
    'FooterText3' => 'HTMLText', 
); 

function getCMSFields() { 
    $fields = parent::getCMSFields(); 
    $fields->addFieldToTab('Root', new TabSet('Footer')); 
    $fields->addFieldToTab('Root.Footer', new TextField('FooterHead1', 'Footer - Kop 1')); 
    $fields->addFieldToTab('Root.Footer', $h1=new HTMLEditorField('FooterText1', 'Footer - Tekst 1')); 
    $fields->addFieldToTab('Root.Footer', new TextField('FooterHead2', 'Footer - Kop 2')); 
    $fields->addFieldToTab('Root.Footer', $h2=new HTMLEditorField('FooterText2', 'Footer - Tekst 2')); 
    $fields->addFieldToTab('Root.Footer', new TextField('FooterHead3', 'Footer - Kop 3')); 
    $fields->addFieldToTab('Root.Footer', $h3=new HTMLEditorField('FooterText3', 'Footer - Tekst 3')); 
    $h1->setRows(7); 
    $h2->setRows(7); 
    $h3->setRows(7); 

    return $fields; 
} 

} 

更新14:53U:

它具有现在可以创建一个菜单项。 只有我不知道这些字段是否可以立即显示,而不是选择菜单。因此,与“设置”菜单一样,这些字段将立即显示。

我不能马上看到字段。只有一个ID列表。如果您点击该ID,则只能看到这些字段。这不是这个意图。它一定是所有的领域马上。因为不超过1个页脚。

我已经翻译一下代码成我的语言;)

Voettekst.php

class VoetTekst extends DataObject { 

static $db = array(
    'VoetKop1' => 'Varchar(255)', 
    'VoetKop2' => 'Varchar(255)', 
    'VoetKop3' => 'Varchar(255)', 
    'VoetTekst1' => 'HTMLText', 
    'VoetTekst2' => 'HTMLText', 
    'VoetTekst3' => 'HTMLText', 
); 

public function getCMSFields() { 

    return FieldList::create(
     TextField::create('VoetKop1', 'Footer - Kop 1'), 
     HTMLEditorField::create('VoetTekst1', 'Footer - Tekst 1')->setRows(7), 

     TextField::create('VoetKop2', 'Footer - Kop 2'), 
     HTMLEditorField::create('VoetTekst2', 'Footer - Tekst 2')->setRows(7), 

     TextField::create('VoetKop3', 'Footer - Kop 3'), 
     HTMLEditorField::create('VoetTekst3', 'Footer - Tekst 3')->setRows(7) 
    ); 

} 
} 

VoettekstAdmin.php

class VoettekstAdmin extends ModelAdmin { 

private static $managed_models = array('Voettekst'); 
private static $url_segment = 'voettekst'; 
private static $menu_icon = 'framework/admin/images/menu-icons/16x16/network.png'; 
private static $menu_title = 'Voettekst'; 

} 

截图:

First page

Second page after click on ID

什么是您的模板?只需简单地调用$FooterInfo或<%循环$ FooterInfo%>`将不起作用,因为您的基页类需要知道它。你可以像这样在页面底部添加一个方法:

class Page extends SiteTree 
{ 
    public function FooterInfo() 
    { 
     return FooterInfo::get(); 
    } 
} 

返回每页上的页脚信息。

除非您实际上将DataExtension用作DataExtension并将其应用于Page。

在这种情况下,请提供你的配置,告诉清单申请数据扩展(例如你的config.yml

从外观上来看,虽然,我想你想FooterInfo延长DataObject,不DataExtension

我相信开始SS3 *前进是“私人”需要的东西,所以也许尝试改变你的代码:

class FooterInfoAdmin extends ModelAdmin { 
    private static $managed_models = array('FooterInfo'); 
    private static $url_segment = 'footerinfo'; 
    private static $menu_icon = 'framework/admin/images/menu-icons/network.png'; 
    private static $menu_title = 'Footer'; 
} 

***以上回答您的固定第一个问题......

更新1 ::现在你的数据对象

class FooterInfo extends DataObject { 
    static $db = array(
     'FooterHead1' => 'Varchar(255)', 
     'FooterHead2' => 'Varchar(255)', 
     'FooterHead3' => 'Varchar(255)', 
     'FooterText1' => 'HTMLText', 
     'FooterText2' => 'HTMLText', 
     'FooterText3' => 'HTMLText', 
    ); 

    public function getCMSFields() { 
     return new FieldList(
      TextField::create('FooterHead1', 'Footer - Kop 1'), 
      HTMLEditorField::create('FooterText1', 'Footer - Tekst 1')->setRows(7), 

      TextField::create('FooterHead2', 'Footer - Kop 2'), 
      HTMLEditorField::create('FooterText2', 'Footer - Tekst 2')->setRows(7), 

      TextField::create('FooterHead3', 'Footer - Kop 3'), 
      HTMLEditorField::create('FooterText3', 'Footer - Tekst 3')->setRows(7) 

     ); 
    } 
} 

更新2 ::这是一个新的更新来解释我怎么会重做你在做什么,这样一个小的任务,并不真正需要由ModelAdmin管理。

我会扩展SiteConfig来管理您的页脚内容。其他人可能不同意,但对我来说,任何“网站范围”的内容都应该在中心位置进行管理,SiteConfig是完美的位置。这样你甚至不需要一个全新的DataObject或新的ModelAdmin。请参见下面的代码:在一个新的文件

地方叫SiteConfigExtension.php

class SiteConfigExtension extends DataExtension 
{ 
    private static $db = [ 
     'FooterHead1' => 'Varchar(255)', 
     'FooterHead2' => 'Varchar(255)', 
     'FooterHead3' => 'Varchar(255)', 
     'FooterText1' => 'HTMLText', 
     'FooterText2' => 'HTMLText', 
     'FooterText3' => 'HTMLText', 
    ]; 

    public function updateCMSFields(FieldList $fields){ 
     $fields->addFieldToTab('Root.Footer', TextField::create('FooterHead1', 'Footer - Kop 1')); 
     $fields->addFieldToTab('Root.Footer', HTMLEditorField::create('FooterText1', 'Footer - Tekst 1')->setRows(7)); 

     $fields->addFieldToTab('Root.Footer', TextField::create('FooterHead2', 'Footer - Kop 2')); 
     $fields->addFieldToTab('Root.Footer', HTMLEditorField::create('FooterText2', 'Footer - Tekst 2')->setRows(7)); 

     $fields->addFieldToTab('Root.Footer', TextField::create('FooterHead3', 'Footer - Kop 3')); 
     $fields->addFieldToTab('Root.Footer', HTMLEditorField::create('FooterText3', 'Footer - Tekst 3')->setRows(7)); 
    } 
} 

然后在您的config.yml地址:

SiteConfig: 
    extensions: 
    - SiteConfigExtension 

然后,运行的/ dev /建造,你应该看到一个新的在设置选项卡中,您可以使用新字段称为页脚。

更新3 ::也许你可以在你的数据对象试试这个:

public function getCMSFields() 
{ 
    $fields = new FieldList(
     new TabSet(
      "Root", 
      $tabMain = new Tab(
       TextField::create('FooterHead1', 'Footer - Kop 1'), 
       HTMLEditorField::create('FooterText1', 'Footer - Tekst 1')->setRows(7), 

       TextField::create('FooterHead2', 'Footer - Kop 2'), 
       HTMLEditorField::create('FooterText2', 'Footer - Tekst 2')->setRows(7), 

       TextField::create('FooterHead3', 'Footer - Kop 3'), 
       HTMLEditorField::create('FooterText3', 'Footer - Tekst 3')->setRows(7) 
      ), 
     ), 
     new HiddenField('ID') 
    ); 

    $this->extend('updateCMSFields', $fields); 

    return $fields; 
} 

***免责声明:上面的代码没有进行测试。

+0

@Simon Erkelens对你的DataObject也是正确的......但我不认为这是你的主要问题... –

+0

This Works!只有我想知道这些字段是否可以立即显示,而不是选择菜单。因此,与“设置”菜单一样,这些字段将立即显示。 – WillieBoy

+0

是的,一旦你点击左边(CMS内部)的脚注链接/选项卡(modeladmin),你应该立即看到所有6个字段。我不相信你应该为它们创建一个标签,除非你开始添加越来越多,并且需要开始将它们分离到不同的标签中,这样你的用户就可以更容易地知道去哪里编辑东西。 –

参照您的上述回答,$fields = parent::getCMSFields();用于页面,而不是数据对象。

更简单的方法是使用以下命令:

function getCMSFields() { 
    $fields = singleton($this->ClassName)->getFrontendFields(); 
    return $fields; 
} 

如果你想要更多的控制,你可以使用类似:

function getCMSFields() { 
    return FieldList::create(
    TextField::create('FooterHead1', 'Footer - Kop 1'), 
    HTMLEditorField::create('FooterText1', 'Footer - Tekst 1')->setRows(7) 
); 
} 
+1

我经常在我的DataObjects中使用'$ fields = parent :: getCMSFields()',因为这会调用脚手架,然后我不必手动创建每个字段。 – wmk

你可能会更好使用SiteConfig关闭这是你只真的需要一个页脚。数据对象用于多个记录。

的mysite /代码/ CustomSiteConfig.php

class CustomSiteConfig extends DataExtension { 

    private static $db = array(
    'VoetKop1' => 'Varchar(255)', 
    'VoetKop2' => 'Varchar(255)', 
    'VoetKop3' => 'Varchar(255)', 
    'VoetTekst1' => 'HTMLText', 
    'VoetTekst2' => 'HTMLText', 
    'VoetTekst3' => 'HTMLText' 
); 

    public function updateCMSFields(FieldList $fields) { 
    $fields->addFieldsToTab('Root.Footer', array(
     TextField::create('VoetKop1', 'Footer - Kop 1'), 
     HTMLEditorField::create('VoetTekst1', 'Footer - Tekst 1')->setRows(7), 

     TextField::create('VoetKop2', 'Footer - Kop 2'), 
     HTMLEditorField::create('VoetTekst2', 'Footer - Tekst 2')->setRows(7), 

     TextField::create('VoetKop3', 'Footer - Kop 3'), 
     HTMLEditorField::create('VoetTekst3', 'Footer - Tekst 3')->setRows(7) 
    )); 
    } 
} 

的mysite/_config/extensions.yml

SiteConfig: 
    extensions: 
    - CustomSiteConfig 

现在,在您的模板,你可以使用$SiteConfig.variable访问的变量。要抓住你可以使用的第一个标题$SiteConfig.VoetKop1

这通常会在模板中包含。

主题/ THEMENAME /模板/包括/ Footer.ss

<div class="row"> 
    <div class="medium-4 small-12 columns"> 
    <h5>$SiteConfig.VoetKop1</h5> 
    <div class="typography">$SiteConfig.VoetTekst1</div> 
    </div> 
    <div class="medium-4 small-12 columns"> 
    <h5>$SiteConfig.VoetKop2</h5> 
    <div class="typography">$SiteConfig.VoetTekst2</div> 
    </div> 
    <div class="medium-4 small-12 columns"> 
    <h5>$SiteConfig.VoetKop3</h5> 
    <div class="typography">$SiteConfig.VoetTekst3</div> 
    </div> 
</div> 

那么你可以使用'<%包括页脚%>

这通常会发生在主题/ THEMENAME/templates/Page.ss文件。

不要忘了更改主题名称与您的主题文件夹。

设置链接管理员,现在将有一个标签页脚与这些字段。

此代码未经测试,但它应该工作。

+0

我也曾这样做过。但我不想。由于内容管理员无法自定义其他网站配置设置。但他们可能会调整页脚。这就是为什么它必须分开。 – WillieBoy

+0

您可以使用http://api.silverstripe.org/en/3.6/class-Member.html#_inGroup向不同的用户显示不同的字段。 –