2013-09-25 4 views
3

Если у меня есть связь $has_many, с которой я хочу управлять с помощью GridField в cms, как бы я мог поместить ограничение на количество отношений одного объекта могу иметь? Это возможно?SilverStripe - ограничение числа многих отношений, которые может иметь объект данных

Могу ли я сделать это в модели или это должно быть проверка, которую я добавляю в GridField Я использую, чтобы добавлять и удалять отношения?

Я ищу реализацию GridField_SaveHandler, чтобы сделать заказ GridFieldComponent, но не знаю, как я могу использовать это, чтобы прервать сохранение, если я обнаружил, что что-то не так.

+0

Не могли бы вы не просто использовать '$ this-> MyRelationName () -> Count() ', чтобы проверить, сколько уже существует, и если достигнут предел, просто удалите' GridFieldAddNewButton' из 'GridFieldConfig' в' getCMSFields() '? Вы также можете добавить дополнительную проверку в 'onBeforeWrite()' hook .... – colymba

+1

Да, я просто попробовал это на самом деле, единственная проблема связана с тем, что страница не перезагружает действия, если я добавляю nineth-объект кнопка все еще отображается, но не работает должным образом, а затем, когда я обновляю страницу и удаляю 9-й элемент, кнопка все еще скрыта до тех пор, пока страница не будет обновлена. – danbroooks

+0

Привет, у вас было обходное решение еще? Я застрял здесь, как ты. Удаление этого отношения не приводит к перезагрузке браузера, поэтому скрытая кнопка «Добавить новую» не появится, пока вы не обновите страницу. – Michael

ответ

2

следующие 2 решения - это не самый чистый способ решить эту проблему, но наиболее прагматичный и простой в реализации.

В основном, что я предлагаю сделать, просто подсчитывает объекты и удаляет возможность добавлять новые записи, когда счетчик превышает определенное число.

если вы хотите ограничить количество записей на одной отношения/сетки (позволяет сказать, что не более 5 игроков в команде):

class Player extends Dataobject { 
    private static $db = array('Title' => 'Varchar'); 
    private static $has_one = array('TeamPage' => 'TeamPage'); 
} 
class TeamPage extends Page { 
    private static $has_one = array('Players' => 'Player'); 
    public function getCMSFields() { 
     $fields = parent::getCMSFields(); 
     $config = GridFieldConfig_RecordEditor::create(); 
     if ($this->Players()->count > 5) { 
      // remove the buttons if we don't want to allow more records to be added/created 
      $config->removeComponentsByType('GridFieldAddNewButton'); 
      $config->removeComponentsByType('GridFieldAddExistingAutocompleter'); 
     } 
     $grid = GridField::create('Players', 'Players on this Team', $this->Players(), $config); 
     $fields->addFieldToTab('Root.Main', $grid); 
     return $fields; 
    } 
} 

если вы хотите ограничить общее количество записей по всему миру (если мы ограничим этот путь до 5, это означает, что если одна команда уже имеет 3-х игроков, то вторая команда может только иметь 2):

class Player extends Dataobject { 
    private static $db = array('Title' => 'Varchar'); 
    private static $has_one = array('TeamPage' => 'TeamPage'); 
    public function canCreate($member = null) { 
     if (Player::get()->count() > 5) { 
      return false; 
     } 
     return parent::canCreate($member); 
    } 
} 
class TeamPage extends Page { 
    private static $has_one = array('Players' => 'Player'); 
    public function getCMSFields() { 
     $fields = parent::getCMSFields(); 
     $config = GridFieldConfig_RecordEditor::create(); 
     $grid = GridField::create('Players', 'Players on this Team', $this->Players(), $config); 
     $fields->addFieldToTab('Root.Main', $grid); 
     return $fields; 
    } 
} 
+0

Да, так выглядит мой сайт (первый), хотя это не идеально, я буду принимать его, поскольку я думаю, что это самое близкое, что я за ... нет возможности выполнить эту проверку, но с javascript и ajax? поэтому проверка является вызовом ajax, и js может скрыть элемент, если требуется ... – danbroooks

0

работает для меня: создайте метод DataObject, который управляется вашей проверкой GridField для существующих объектов.

, конечно же, это не позволяет реализовать пользовательский GridFieldComponent, поскольку вам необходимо изменить код DataObject.

+0

Это для создания отношений, хотя на самом деле не создание объекта – danbroooks

1

Я написал быстрый плагин JQuery, чтобы ограничить количество элементов через GridField может иметь: -

Скачать плагин здесь: - gridfieldlimit.js

https://letscrate.com/f/monkeyben/silverstripe/gridfieldlimit.js

Настройка плагина в функции getCMSFields: -

// Pass GridField configs, each one containing field name and item limit 
$vars = array(
    "GridFieldLimits" => "[['GRIDFIELD_NAME_1', 3], ['GRIDFIELD_NAME_2', 6]]", 
); 

// Load the jquery gridfield plugin 
Requirements::javascriptTemplate("themes/YOUR_THEME_NAME/javascript/gridfieldlimit.js", $vars); 
Смежные вопросы