【问题标题】:Add new menu-item in Silverstripe CMS在 Silverstripe CMS 中添加新的菜单项
【发布时间】:2017-10-19 08:29:37
【问题描述】:

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

我还尝试了“/dev/build”和“dev/build?flush=1”。但没有结果。

Footerinfos.php (mysite/code/)

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/code/)

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

【问题讨论】:

    标签: content-management-system silverstripe


    【解决方案1】:

    您的模板中有什么?只是简单地调用$FooterInfo 或` 是行不通的,因为您的基页类需要知道它。您可以像这样向页面库添加一个方法:

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

    返回每一页的页脚信息。

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

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

    不过,从外观上看,我认为您希望 FooterInfo 扩展 DataObject,而不是 DataExtension

    【讨论】:

      【解决方案2】:

      参考您的上述答案,$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)
        );
      }
      

      【讨论】:

      • 我经常在我的 DataObjects 中使用$fields = parent::getCMSFields(),因为它调用了脚手架,然后我不必手动创建每个字段。
      【解决方案3】:

      您最好使用SiteConfig 来实现这一点,因为您只需要一个页脚。数据对象用于多条记录。

      mysite/code/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

      这通常在模板包含中。

      themes/themename/templates/Includes/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>
      

      然后你会使用`

      这通常发生在 themes/themename/templates/Page.ss 文件中。

      不要忘记用您的主题文件夹更改 主题名称

      在管理员的 Settings 链接下,现在会有一个名为 Footer 的标签,其中包含这些字段。

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

      【讨论】:

      • 我以前也这样做过。但我不想。因为内容管理员无法自定义其他站点配置设置。但他们可能会调整页脚。这就是为什么它必须分开。
      • 您可以使用api.silverstripe.org/en/3.6/class-Member.html#_inGroup向不同的用户显示不同的字段。
      【解决方案4】:

      我相信从 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';
      }
      

      *** 以上答案解决了您的第一个问题...

      UPDATE 1::Now for your DataObject

      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/build,您应该会在 Settings 选项卡中看到一个名为 Footer 的新选项卡,其中包含您的新字段。

      更新 3:: 也许你可以在你的 DataObject 中试试这个:

      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;
      }
      

      ***免责声明:以上代码未经测试。

      【讨论】:

      • @Simon Erkelens 对您的 DataObject 也是正确的...但我认为这不是您此时的主要问题...
      • 这行得通!只有我想知道这些字段是否立即可见,而不是选择菜单。因此,与设置菜单一样,字段将立即显示。
      • 是的,一旦您单击左侧(CMS 内部)的页脚链接/选项卡 (modeladmin),您应该会立即看到所有 6 个字段。我不认为你应该为它们创建一个标签,除非你开始添加越来越多的东西,并且需要开始将它们分成不同的标签,这样你的用户就更容易知道去哪里编辑。
      • 不幸的是,我无法立即看到这些字段。只有一个 ID 列表。如果单击该 ID,您将只能看到这些字段。那不是本意。它必须马上是所有的领域。因为没有超过 1 个页脚。
      • 那肯定有什么其他问题……什么版本的SS?是3.6吗?编辑:啊,你原来的帖子说3.6,对不起。你能把你的完整代码发布到一个粘贴网站并给我链接吗?
      猜你喜欢
      • 1970-01-01
      • 2021-09-10
      • 2013-06-30
      • 2014-06-14
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      相关资源
      最近更新 更多