У меня есть пользовательский тип поля, который содержит небольшой валидатор. Он используется повсеместно на внешнем интерфейсе, поэтому для удобства мы также используем его в CMS.
class MyTextField extends TextField {
public function Type() {
return 'text';
}
public function getAttributes() {
return array_merge(
parent::getAttributes(),
array(
'type' => 'text'
)
);
}
public function validate($validator) {
$this->value = trim($this->value);
$maxLength = empty($this->getMaxLength())?50:$this->getMaxLength();
if(strlen($this->value)>$maxLength) {
$validator->validationError(
$this->name,
'Exceeded max length '.$maxLength,
"validation"
);
return false;
}else{
return true;
}
}
}
}
Поле отлично работает. Если создать новый экземпляр, используя его, и этот конструктор не содержит свойства maxlength, по умолчанию используется значение 50.
Проблема, с которой я столкнулся, заключается в том, что для изменения поля внешнего интерфейса «MyText» было задано значение 100, а для версии этого поля в getCMSFields - нет, поэтому по умолчанию установлена максимальная длина 50. Очевидно, ошибка проверки.
Конечно, это должно быть исправлено, но проблема возникла, поскольку пользователь CMS не смог удалить запись. И я действительно не согласен с пользователем в том, что проверка должна игнорироваться, когда вы все равно отбрасываете данные. Это имеет смысл для добавления / редактирования, но не для удаления.
Кто-нибудь знает способ отключения проверки для операции удаления внутри getCMSFields? Вот отрывок из моих getCMSFields на случай, если требуется рефакторинг.
функция getCMSFields () {
$detailBlock = CompositeField::create(
MyTextField::create('MyTextField','CustomField', '', 255),
);
// Build the fieldlist for the form.
$fields = FieldList::create (
TabSet::create (
"Root",
Tab::create (
"Main Content",
$detailBlock
)
)
);
return $fields;
}
РЕДАКТИРОВАНИЕ: Я только что обнаружил, что мне нужен способ обойти getCMSValidator для операций удаления. Здесь установлены обязательные поля, которые могут вызвать ошибку проверки при удалении. На самом деле не имеет смысла, что вам нужно поместить запись в допустимое состояние, чтобы просто удалить ее.