2014-12-03 3 views
2

У меня есть DataObject с именем ContentSection, который имеет 2 отношения has_one: к типу страницы LandingPage и другому DataObject Person.Silverstripe удалить нерелевантные поля отношений has_one на вкладке CMS

class ContentSection extends DataObject { 
    protected static $has_one = array(
     'Person'  => 'Person', 
     'LandingPage' => 'LandingPage' 
    ); 
} 

Как LandingPage, так и Person определяют отношение has_many к ContentSection.

class LandingPage extends Page { 
    protected static $has_many = array(
     'ContentSections' => 'ContentSection' 
    ); 
} 

class Person extends DataObject { 
    protected static $has_many = array(
     'ContentSections' => 'ContentSection' 
    ); 
} 

ContentSections редактируются через LandingPage и человек с GridFieldConfig_RelationEditor .: например

function getCMSFields() { 
    $fields = parent::getCMSFields(); 
    $config = GridFieldConfig_RelationEditor::create(10); 
    $fields->addFieldToTab('Root.Content', new GridField('ContentSections', 'Content Sections', $this->ContentSections(), $config)); 
    return $fields; 
} 

Мой вопрос как можно скрыть/удалить ненужные поля HAS_ONE на вкладке редактора CMS? Поля раскрытия отношения Person и LandingPage отображаются как при редактировании ContentSection, так и для Person или LandingPage. Я хочу показать только соответствующее поле отношений has_one. Я попытался с помощью точечной нотации на has_many отношений:

class Person extends DataObject { 
    protected static $has_many = array(
     'ContentSections' => 'ContentSection.Person' 
    ); 
} 

Я также попытался с помощью метода removeFieldFromTab в getCMSFields способе ContentSection класса, где я определяю другие поля CMS для ContentSection:

$fields->removeFieldFromTab('Root.Main', 'Person'); 

ответ

7

Вместо removeFieldFromTab использовать функцию removeByName. removeFieldFromTab не будет работать, если нет 'Root.Main' tab.

Также мы удаляем PersonID, а не Person. has_one переменные имеют ID, добавленные к концу их имени переменной.

function getCMSFields() { 
    $fields = parent::getCMSFields(); 

    $fields->removeByName('PersonID'); 
    $fields->removeByName('LandingPageID'); 

    return $fields; 
} 

Если вы хотите, чтобы выборочно скрыть или отобразить эти поля, которые вы можете поместить в некоторых if заявления в вашей getCMSFields функции.

function getCMSFields() { 
    $fields = parent::getCMSFields(); 

    if (!$this->PersonID) { 
     $fields->removeByName('PersonID'); 
    } 

    if (!$this->LandingPageID) { 
     $fields->removeByName('LandingPageID'); 
    } 

    return $fields; 
} 
Смежные вопросы