Skip to content

Instantly share code, notes, and snippets.

@greabock
Last active December 3, 2017 07:34
Show Gist options
  • Save greabock/124a7896ca124522768b to your computer and use it in GitHub Desktop.
Save greabock/124a7896ca124522768b to your computer and use it in GitHub Desktop.
Вольный перевод офф доки по Former в двух частях. Часть вторая

Что, не понял куда ввалился? Ну тогда тебе в первый пост.

##Datalist А что еще он умеет делать? Datalist, он умеет делать Datalist. Ты не знаешь что это? Окааай... знаешь, типа иногда можно дать людям не только выбор из списка, но еще и позволить им ввести что-то в ручную? Вот это и есть datalist. С Former'ом такие вещи делаются на раз-два:

Former::text('clients')->useDatalist($clients)

// Или можно опять опять же подрубить модель как делали с fromQuery()
Former::text('projects')->useDatalist(Project::all(), 'name')

Ты также можешь (если тебе оно надо) запилить кастомный айдишник на созданном DataList:

 Former::text('foo')->list('myId')->useDatalist();

Тут он автоматически сгенерирует соответствующий <datalist> и привяжет его по айдишнику на это поле
(я вообще нихрена не понял, что он имел ввиду - п.п.)
Это означает, что этот самый инпут, будет заполнятся значением из твоего массива, пока чел вводит то, что он хочет, если он не найдет счастья и/или попаболи...
(тут он меня окончательно запутал; похоже надо самому поискать счастье и/или попаболь; читай попробовать этот даталист, чтобы понять в чем соль - п.п).

##Горячая валидация Дальше. Окай, мнгновенная валидация - ты любишь ее, негодник, не так ли? Как ты возможно уже знаешь, все современные браузеры поддерживают валидацию по HTML атрибутам. Никакого жабаскрипта, никаких полифилов. Есть несколько атрибутов, которые могут облегчить тебе работу: pattern, required, max/min и т.д. Ты же знаешь как валидировать POST-данные через $rules? А ты не хотел бы просто передать такие правила в форму для горячей валидации? О, да, проказник - ты хотел бы... И поэтому Former это умеет. Ведь Former любит тебя и заботится о тебе.

Former::open()->rules(array(
  'name'     => 'required|max:20|alpha',
  'age'      => 'between:18,24',
  'email'    => 'email',
  'show'     => 'in:batman,spiderman',
  'random'   => 'match:/[a-zA-Z]+/',
  'birthday' => 'before:1968-12-03',
  'avatar'   => 'image',
));

Former просмотрит эти правила и преобразует их, как сможет. Сейчас там не очень много правил, но я планирую их пополнять.

<input name="name"      type="text"   required maxlength="20" pattern="[a-zA-Z]+" />
<input name="age"       type="number" min="18" max="24" />
<input name="email"     type="email" />
<input name="show"      type="text"   pattern="^(batman|spiderman)$" />
<input name="random"    type="text"   pattern="[a-zA-Z]+" />
<input name="birthday"  type="date"   max="1968-12-03" />
<input name="avatar"    type="file"   accept="image/jpeg,image/png,image/gif,image/bmp" />

Заметь, что ты всегда можешь сам назначить кастомные парвила, точно также, как ты добавляешь атрибуты. И если ты не шаришь в регэкспах, то это твой единственный путь.

Former::number('age')->min(18)

Former::text('client_code')->pattern('[a-z]{4}[0-9]{2}')

И вот оно что! Это шикарная новость: с Bootstrap шарит в HTML-правилах. Просто вот так: соббщил правила, откинулся в кресле, смотришь в свой Chrome/Firefox, и наслаждаешься прекрсными всплывающими боксами "Ты должен заполнить это поле, чувак" или "Это ни разу не электронная почта, кого хотел провести?".

Ну и конечно, ты всегда можешь вручную вклининить стейт для контрол-груп в Bootstrap или Foundation. Success, warning, error and info.

Former::text('name')->state('error')

####Обработка файлов В Former, как и в Laravel ты легко можешь сделать Former::file(). А вот что нового, так это то что ты можешь запилить мультифайловую кнопку <input type="file" name="foo[]" multiple />. Еще есть один из специальных методов ->accept() с которым можно сделать следующее:

// Используя шорткаты (image, video or audio)
Former::files('avatar')->accept('image')

// Используя шорткаты длая миме-тайпов
Former::files('avatar')->accept('gif', 'jpg')

// Или буквально указывая миме-тайп
Former::files('avatar')->accept('image/jpeg', 'image/png')

Ты также можешь указывать макс-сайз для файлов

Former::file('foo')->max(2, 'MB')
Former::file('foo')->max(400, 'Ko')
Former::file('foo')->max(1, 'TB')

Это создаст скрытое поле MAX_FILE_SIZE с правильным размером в байтах.

####Чекбоксы и Радио Чекбоксы и радио, мужик, кого они не бесят? А потом ты такой: "бляха муха, а как все это валидировать?". Но с Foremer'ом это все немного проще :

// Простой оффнутый чекбокс
Former::checkbox('checkme')


// отмеченный с текстом
Former::checkbox('checkme')
  ->text('YO CHECK THIS OUT')
  ->check()


// Четыре связанных чекбокса
Former::checkboxes('checkme')
  ->checkboxes('first', 'second', 'third', 'fourth')

// Они же инлайн
Former::checkboxes('checkme')
  ->checkboxes($checkboxes)->inline()

// Все тоже самое пашет для радио
Former::radios('radio')
  ->radios(array('label' => 'name', 'label' => 'name'))
  ->stacked()

// немного магии
Former::inline_checkboxes('foo')->checkboxes('foo', 'bar')
Former::stacked_radios('foo')->radios('foo', 'bar')

// Отмеченные/неотмеченные в один мув
Former::checkboxes('level')
  ->checkboxes(0, 1, 2)
  ->check(array('level_0' => true, 'level_1' => false, 'level_2' => true))

// Полная настройка
Former::radios('radio')
  ->radios(array(
    'label' => array('name' => 'foo', 'value' => 'bar', 'data-foo' => 'bar'),
    'label' => array('name' => 'foo', 'value' => 'bar', 'data-foo' => 'bar'),
  ))

Мотай на ус: Former дает тебе возможность, пушить отжатый флаг. Чё? Это когда ты передаешь состояние флага (checked/unchecked) в POST, а не "передаешь его или не передаешь". Это звучит логично, но это не то, как ведут себя формы по дефолту.

Когда плишь чекаблы через checkboxes/radios() метод, по дефолту, для каждого чекабла создается уникальное имя в конец просто ставится индекс (например это может быть ). Это позволит значениям оставаться отмеченными при сабмитах.

####Хелперы локализации Если ты пилишь мультиязычный проект, Former и тут спасет тебя. По дефолту при создании поля, если лейбл не задан Former будет использовать имя по дефолту (не, ну я сегодня жугу на каламбуры - п.п.).Что более важно, он еще и попытается перевести его.То же самое касается флажков лейюлов, легенды. Это означает, следующее:

// Это
Former::label(__('validation.attributes.name'))
Former::text('name', __('validation.attributes.name'))
Former::text('name')->inlineHelp(__('help.name'))
Former::checkbox('rules')->text(__('my.translation'))
<legend>{{ __('validation.attributes.mylegend') }}</legend>

// Тоже самое, что это
Former::label('name')
Former::text('name')
Former::text('name')->inlineHelp('help.name')
Former::checkbox('rules')->text('my.translation')
Former::legend('mylegend')

Как видно, это довльно круто. Former сначала сам попытается перевести строку, т.е. my.text вернет __('my.text'), а если оно зафелится, это значит, что он не нашел то, что искал, там где искал. Ты также можешь ткнуть Former носом, непосредственно туда, где нужноискать - ну чтоб он уж наверняка не промахнулся. Former::setOption('translate_from', [boolean]) (по умолчанию он ищет validation.attributes). Засеки - это должен быть массив.

####Примечания по порядку установки значения полей Все классы форм сталкиваются с одной и той же проблемой: какие данные должны быть в приоритете? Для заполнения полей в Former'e установен следующий порядок:

  1. POST-данные имеют самый высокий приоритет - если пользователь просто ввел что-то в поле, скорее всего, это то, что он захочет увидеть в следующий раз.
  2. Затем идет заполнение данных данных с помощью метода ->forceValue() - это хитрый форк от ->value(), созданный, чтобы перезаписать значение, и пофиг все.
  3. После идут любые значения, установленные с помощью Former::populate()
  4. Наконец обчный ->value() получает самый низкий приоритет.

(тут у меня пальцы отсохли; думаю спеки по методам и на буржуйском почитать можно - п.п. )

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment