SilverStripe - ограничение количества многих отношений, которые может иметь объект данных

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

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

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

3 ответа

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

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

если вы хотите ограничить количество записей в одном соотношении/сетке (допустим, максимум 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, это означает, что если 1 команда уже имеет 3 игрока, то у 2-й команды может быть только 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;
 }
}


Я написал быстрый плагин 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);


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

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

licensed under cc by-sa 3.0 with attribution.