2017-10-19 3 views
0

Silverstripe CMS에서 새 메뉴 항목을 만들려고합니다. 아직도 난 이해가 안가. 내가 뭘 잘못했는지 모르겠다. 그것은 Silverstripe 3.6에 관한 것입니다.Silverstripe CMS에 새 메뉴 항목 추가

"/ dev/build"및 "dev/build? flush = 1"도 시도했습니다. 그러나 결과는 없습니다.

Footerinfos.php (내 사이트/코드 /)

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 (내 사이트/코드 /)

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

답변

0

템플릿의 내용은 무엇입니까? $FooterInfo 또는 < % loop $ FooterInfo %>`를 호출하는 것은 기본 페이지 클래스가 알아야하기 때문에 작동하지 않습니다. 다음과 같이 페이지 기반에 메소드를 추가 할 수 있습니다.

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

모든 페이지에서 바닥 글 정보를 반환하려면 다음과 같이하십시오.

실제로 DataExtension을 DataExtension으로 사용하고있는 경우가 아니면 해당 페이지에 적용하십시오. 이 경우

이 데이터 확장을 적용 할 매니페스트를 알려주는 설정을 제공하십시오 (예를 들어, 당신의 config.yml)하지만 그것의 모습에서

, 난 당신이 DataObject하지 DataExtension 확장 FooterInfo 원하는 생각합니다.

0

나는 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 : 이제 데이터 객체에 대한

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에서 관리해야합니다.

Footer 내용을 관리하려면 SiteConfig를 확장해야합니다. 다른 사람들은 동의하지 않을 수도 있지만 나에게 "사이트 와이드"는 중앙 위치에서 관리해야하며 SiteConfig는이를위한 완벽한 위치입니다. 이렇게하면 완전히 새로운 DataObject 또는 새 ModelAdmin이 필요하지 않습니다. 아래를 참조 코드 :

config.yml 추가에 그런
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)); 
    } 
} 

:

SiteConfig: 
    extensions: 
    - SiteConfigExtension 

그런 다음, 실행은/dev가/구축하고, 새를 볼 새 파일에

장소 SiteConfigExtension.php라고 탭에서 새 필드를 Footer라고 부릅니다.

UPDATE 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

@ 사이먼 Erkelens은뿐만 아니라 당신의 데이터 객체에 대한 올바른 ...하지만 나는이 시점에서 당신의 주요 질문 ...이 작동 –

+0

생각하지 않습니다! 선택 메뉴 대신이 필드에 즉시 표시되는지 궁금합니다. 설정 메뉴와 마찬가지로 필드가 즉시 표시됩니다. – WillieBoy

+0

예, 좌측 (CMS 내부) (modeladmin)의 바닥 글 링크/탭을 클릭하면 즉시 6 개의 모든 필드가 표시됩니다. 난 당신이 더 많은 추가를 시작하고 사용자가 물건을 편집 어디로 더 쉽게 파악할 수 있도록, 그래서 다른 탭으로 그들을 분리 시작해야하지 않는 한 그들을 위해 탭을 작성해야한다고 생각하지 않습니다. –

0

위의 대답을 참조하면 데이터 대상이 아닌 페이지에서 $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

나는 종종'스케 폴더 (scaffolder)를 호출하고 나서 수동으로 각 필드를 만들 필요가 없습니다 $ 필드 = 부모 :: getCMSFields()'내 데이터 객체에서 원인을 사용합니다. – wmk

0

당신은 아마 당신 같은이 대한 해제 SiteConfig를 사용하여 더 나은을 단 하나의 바닥 글이 정말로 필요합니다. 데이터 개체는 여러 레코드에 사용됩니다.

내 사이트/코드/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) 
    )); 
    } 
} 

는 내 사이트/_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 파일.

은 당신의 테마 폴더로 THEMENAME을 변경하는 것을 잊지 마십시오. 관리자의 설정 링크에서

, 지금이 필드 바닥 글라는 탭이있을 것이다.

이 코드는 테스트하지 않고 작동한다.

+0

나는 그것을하기도했다. 하지만 나는 싫어. 콘텐츠 관리자는 다른 사이트 구성 설정을 사용자 지정할 수 없으므로 그러나 그들은 바닥 글을 조정할 수 있습니다. 그렇기 때문에 그것이 분리되어야합니다. – WillieBoy

+0

서로 다른 사용자에게 서로 다른 필드를 표시 할 http://api.silverstripe.org/en/3.6/class-Member.html#_inGroup를 사용할 수 있습니다. –