Activeform - массив полей - показать только ОДНУ ошибку

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
lostdok
Сообщения: 48
Зарегистрирован: 2016.09.05, 18:23

Activeform - массив полей - показать только ОДНУ ошибку

Сообщение lostdok »

Делаю галерею для загрузки фото.

Все это состоит из 8-ми input type file.

Вид:

Код: Выделить всё

<?php for ($i = 1; $i < 9; $i++) : ?>
  <label class="b-field-img__item-empty" id="images_<?= $i ?>">
    <?= $form->field($galleryForm, 'images[]')->label(false)->fileInput([
      'id' => 'image_input_' . $i,
      'class' => 'b-field-img__input'
    ]) ?>
  </label>
<?php endfor; ?>
У меня реализована валидация в виде класса ImagesValidator: нужно загрузить хотя бы ОДНО ФОТО.
Я сделал clientValidateAttribute(), который выглядит так:

Код: Выделить всё

  public function clientValidateAttribute($model, $attribute, $view)
  {
    $message = json_encode($this->message, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
    return <<<JS
var valid = false;
$('#gallery-upload input[type="file"]').each(function(index, item) {
  if($(item).val().length > 0) {
    valid = true;
  }
});
if(!valid) {
  messages.push($message);
}
return valid;
JS;
  }
Теперь у меня КО ВСЕМ полям добавляется ошибка "Загрузите фото" - что вполне ожидаемо.

А мне надо отображать только ОДНУ ошибку и в другом месте.

Вот скрин как есть: http://dl4.joxi.net/drive/2018/12/13/00 ... 9706b2.jpg
Вот как хочу: http://dl3.joxi.net/drive/2018/12/13/00 ... 31e7c8.jpg

Вопрос.
В каком направлении мне копать? Я подозреваю что надо работать с yii.activeForm.js
Но не совсем понимаю в каком направлении идти даже...


* Хочу обратить внимание, что использовать готовые решения для такой галереи я не могу - нужен конкретный внешний вид.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Activeform - массив полей - показать только ОДНУ ошибку

Сообщение andku83 »

Попробуйте как-то так:

Код: Выделить всё

...
  public $imageError; //возможно и не нужно

  public function validateImages($attribute, $params) {
    if($this->images === null || count($this->images) === 0) {
      $this->addError('imageError', 'Загрузите фото');
    }
  }
...

Код: Выделить всё

<?= Html::error($model, 'imageError'); ?>
lostdok
Сообщения: 48
Зарегистрирован: 2016.09.05, 18:23

Re: Activeform - массив полей - показать только ОДНУ ошибку

Сообщение lostdok »

Это то, что нужно.

Только пришлось еще добавить

Код: Выделить всё

<?= $form->field($model, 'imageError')->label(false)->hiddenInput() ?>
Чтобы и на клиенте показывались ошибки.

Вы мне уже второй раз помогаете. Спасибо :))
lostdok
Сообщения: 48
Зарегистрирован: 2016.09.05, 18:23

Re: Activeform - массив полей - показать только ОДНУ ошибку

Сообщение lostdok »

Понял, что по факту это не нужно:

Код: Выделить всё

<?= Html::error($model, 'imageError'); ?>
Это поможет только при валидации на стороне сервера.
На клиенте блок, который генерирует Html::error ошибки добавляться не будут.

То есть проблему решил добавлением нового свойства + вывод hidden инпута под него + генерация ошибок под это свойство.
Ответить