Используя плагин редактора данных JQuery, следующий код работает как задумано. Он выполняет указанные проверки (некоторые поля для краткости опущены).
Editor::inst( $db, 'file_upload' )
->fields(
Field::inst( 'id' )->validator( 'Validate::notEmpty' ),
Field::inst( 'name' )->validator( 'Validate::notEmpty' )
->validator( function ($val, $data, $opts) {
$length = strlen(trim(preg_replace('/\s+/', ' ', $val)));
return $length > 30 ? 'Length must be 30 characters or less' : true;
})->getFormatter( function ( $val, $data, $opts ) {
return htmlspecialchars($val, ENT_QUOTES, "UTF-8");
})->setFormatter( function ( $val, $data, $opts ) {
return trim(preg_replace('/\s+/', ' ', $val));
}),
Field::inst( 'document_title' )->validator( 'Validate::notEmpty' )
->validator( function ($val, $data, $opts) {
$length = strlen(trim(preg_replace('/\s+/', ' ', $val)));
return $length > 50 ? 'Length must be 50 characters or less' : true;
})->getFormatter( function ( $val, $data, $opts ) {
return htmlspecialchars($val, ENT_QUOTES, "UTF-8");
})->setFormatter( function ( $val, $data, $opts ) {
return trim(preg_replace('/\s+/', ' ', $val));
}),
Field::inst( 'email_address' )->validator( 'Validate::notEmpty' )
->validator( function ($val, $data, $opts) {
$length = strlen(trim(preg_replace('/\s+/', ' ', $val)));
return $length > 60 ? 'Length must be 60 characters or less' : true;
})->getFormatter( function ( $val, $data, $opts ) {
return htmlspecialchars($val, ENT_QUOTES, "UTF-8");
})->setFormatter( function ( $val, $data, $opts ) {
return trim(preg_replace('/\s+/', ' ', $val));
})
)->where( function ( $q ) {
$q->where( 'file_type', "('jpg', 'jpeg', 'gif', 'png')", 'IN', false );
})->process( $_POST )
->json();
Но когда логика проверки слегка модифицируется, как показано ниже,
Editor::inst( $db, 'file_upload' )
->fields(
Field::inst( 'id' )->validator( 'Validate::notEmpty' ),
Field::inst( 'name' )->validator( 'Validate::notEmpty' )
->validator( function ($val, $data, $opts) {
$length = strlen(trim(preg_replace('/\s+/', ' ', $val)));
// The following line has been modified
return $length === 0 ? 'This field is required' : ($length > 30 ? 'Length must be 30 characters or less' : true);
})->getFormatter( function ( $val, $data, $opts ) {
return htmlspecialchars($val, ENT_QUOTES, "UTF-8");
})->setFormatter( function ( $val, $data, $opts ) {
return trim(preg_replace('/\s+/', ' ', $val));
}),
Field::inst( 'document_title' )->validator( 'Validate::notEmpty' )
->validator( function ($val, $data, $opts) {
$length = strlen(trim(preg_replace('/\s+/', ' ', $val)));
// The following line has been modified
return $length === 0 ? 'This field is required' : ($length > 50 ? 'Length must be 50 characters or less' : true);
})->getFormatter( function ( $val, $data, $opts ) {
return htmlspecialchars($val, ENT_QUOTES, "UTF-8");
})->setFormatter( function ( $val, $data, $opts ) {
return trim(preg_replace('/\s+/', ' ', $val));
}),
Field::inst( 'email_address' )->validator( 'Validate::notEmpty' )
->validator( function ($val, $data, $opts) {
$length = strlen(trim(preg_replace('/\s+/', ' ', $val)));
// The following line has been modified
return $length === 0 ? 'This field is required' : ($length > 60 ? 'Length must be 60 characters or less' : true);
})->getFormatter( function ( $val, $data, $opts ) {
return htmlspecialchars($val, ENT_QUOTES, "UTF-8");
})->setFormatter( function ( $val, $data, $opts ) {
return trim(preg_replace('/\s+/', ' ', $val));
})
)->where( function ( $q ) {
$q->where( 'file_type', "('jpg', 'jpeg', 'gif', 'png')", 'IN', false );
})->process( $_POST )
->json();
В этом случае проверки выполняются так, как они должны, но значения не передаются (и одновременно данные не обновляются) в базу данных. Встроенное текстовое поле редактирования остается открытым после нажатия клавиши ввода.
В чем может быть причина и как это исправить? Возможно, мне не хватает чего-то очень простого в PHP.
При необходимости выложу соответствующий клиентский скрипт.
Похоже, что другие валидаторы запускаются, когда применяются дополнительные условия, препятствующие отправке входных значений в абстрактный слой, базу данных. Это не должно происходить в случае редактирования встроенных ячеек.
Какое лекарство?
Если единственными изменениями в вашем коде являются строки, выделенные вами в комментариях, я подозреваю, что проблема заключается в использовании вами вложенного троичного оператора. Эти два отдельный вопросы в теге PHP могут кое-что проясниться, но в основном быстрая версия заключается в том, что троичный оператор PHP имеет странное поведение, поэтому не рекомендуется использовать их вложенными. Я бы порекомендовал вам попробовать перейти на стандартную инструкцию if / else, чтобы посмотреть, решит ли это вашу проблему, поэтому
if($length === 0){
return 'This field is required';
}
else if($length > 50){
return 'Length must be 50 characters or less';
}
else{
return true;
}
Хотя это может быть дольше, вероятно, будет намного легче отлаживать, и я подозреваю, что на основании вашего вопроса, что, если это было все, что было изменено, ваша проблема сводится к левоассоциативное вложение тройного оператора; тогда как в почти любой другой язык троичные операторы являются правоассоциативными.
Вот еще одна ссылка рекомендация против вложенных тернарных операторов в PHP.
Текстовое поле, оставшееся открытым после нажатия кнопки отправки, является стандартным для ошибки формы JavaScript DataTables, которая часто встречается, когда серверная операция CRUD не возвращает ожидаемое значение клиенту (проверьте консоль разработчика браузера, чтобы убедиться, что вы не получаете ошибку JS Я рекомендую получить Firebug для Firefox, если вы хотите действительно надежный). Если после изменения вашего кода, чтобы использовать блок if / else вместо троичных операторов, у вас все еще есть ошибка, то я бы посмотрел ваш клиентский код, чтобы убедиться, что ничего не изменилось (возможно, вы можете опубликовать его в вопросе, если это не так. не решить вашу проблему).
Других решений пока нет …