следующие 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;
}
}
Не могли бы вы не просто использовать '$ this-> MyRelationName () -> Count() ', чтобы проверить, сколько уже существует, и если достигнут предел, просто удалите' GridFieldAddNewButton' из 'GridFieldConfig' в' getCMSFields() '? Вы также можете добавить дополнительную проверку в 'onBeforeWrite()' hook .... – colymba
Да, я просто попробовал это на самом деле, единственная проблема связана с тем, что страница не перезагружает действия, если я добавляю nineth-объект кнопка все еще отображается, но не работает должным образом, а затем, когда я обновляю страницу и удаляю 9-й элемент, кнопка все еще скрыта до тех пор, пока страница не будет обновлена. – danbroooks
Привет, у вас было обходное решение еще? Я застрял здесь, как ты. Удаление этого отношения не приводит к перезагрузке браузера, поэтому скрытая кнопка «Добавить новую» не появится, пока вы не обновите страницу. – Michael