Открыть список
Как стать автором
Обновить

Комментарии 9

<?php

use yii\widgets\Pjax;
?>
<?= $this->render('_profile', ['model' => $model]) ?>
<?php Pjax::begin(['enablePushState' => false]); ?>
    <?= $this->render('_addresses', ['model' => $model]) ?>
<?php Pjax::end(); ?>

Зачем столько открывающих и закрывающих тегов?
Пример брал из головы, а код копировал из реального проекта. Подразумевается, что между этими тегами есть еще верстка.
Эх, а в symfony/forms это из коробки идет уже пару лет… collection называется… А коль уж у вас JS много, имеет смысл вообще просто десериализовать JSON запрос в готовые сущности с уже забитыми данными и просто провалидировать.
Как раз наоборот, JS не много, исключение только мой маленький скрипт. Статья показывает не стандартный способ использования PJAX, по крайней мере не документированный и не обсуждаемый сообществом.
На мой взгляд, раз уж сервер генерирует шаблон, то именно он этим и должен заниматься, хуже когда добавляется JS кнопка генерирующая ноду по какому то шаблону из js строки. А раз уж мы можем так легко и без написания JS отдать это дело серверу, да еще и получая валидируемые поля, то почему нет?

Эх, а в symfony/forms это из коробки идет уже пару лет… collection называется…

Не забывайте что Yii 2,0 пока только в RC. И изменений между beta и RC было много, вполне возможно что к релизу получим еще что-нибудь.
релиз в воскресенье, 12 октября.
во-первых «нестандартное использование» или использование «необслуживаемых» фич влечет за собой последствия. В частности усложнение поддержки в случае передачи проекта другому разработчику или вам через год.

во-вторых подозреваю что эту задачу можно решить элегантее, если задать прототип для формы, которая будет динамически добавляться (будет воспринимать форму вашей коллекции сущностей как просто форму). Тогда можно сделать и реюзабельный JS который будет клонировать элементы формы и разруливать все это. И на сервере можно через листенеры или что-то в этом духе сделать динамическую привязку элементов формы к нашим моделям… много можно придумать без «кастылей».

ну и да, разработка Yii 2 велась больше 3-х лет по сути, и вы серьезно думаете что за месяца/неделю до релиза что-то поменяется сильно? Статус RC означает стабилизацию API. Так что для сложных форм стоит просто взять какой-то отдельный компонент и запилить интеграцию. Или реализовать свой на базе Yii. Приведенный вам кейс с динамически добавляемыми полями один из самых популярных. Отсутствие готовых решений приводит к велосипедостроению. Сделайте мир Yii лучше, реализуйте реюзабельное решение и выложите в опенсурс.
во-первых «нестандартное использование» или использование «необслуживаемых» фич влечет за собой последствия. В частности усложнение поддержки в случае передачи проекта другому разработчику или вам через год.

На мой взгляд, решение достаточно простое для поддержки.

во-вторых подозреваю что эту задачу можно решить элегантее

Пожалуйста предложите рабочий вариант, хотя бы псевдо-решение. Я писал в статье что на элегантность рецепт не тянет, но это лучше чем ничего вообще в сети.

Приведенный вам кейс с динамически добавляемыми полями один из самых популярных. Отсутствие готовых решений приводит к велосипедостроению.

Не нашел похожего кейса в сети. Более того на форумах Yii framework предлагали каким либо образом перенести инстанс формы через сессию, что, на мой взгляд не возможно, а потом рендерить дополнительное поле из отдельного view, который содержит только шаблон одного поля и все.

Сделайте мир Yii лучше, реализуйте реюзабельное решение и выложите в опенсурс.

Обязательно сделаю что-то для Yii. Я работаю в продакшн с фреймворком всего месяц, так что время будет, это лишь старт.
Некоторые методы в JavaScript коде ActiveForm стали частью API, что позволяет легче создавать динамичные формы с поддержкой валидации добавляемых полей на стороне клиента. К примеру, следующий JavaScript код может быть использован для валидации только что добавленного поля «address»:

$('#myform').yiiActiveForm('add', {
    'id': 'address',
    'name': 'address',
    'container': '.field-address',
    'input': '#address',
    'error': '.field-address .help-block'
});

а как насчет вот этого?
Когда я решал задачу, этого api не было.
Когда же api появился я решил попробовать добавить поле таким образом, в итоге вышло что необходимо сперва создать код для добавления поля, а уже потом использовать yiiActiveForm('add', params), что, на мой взгляд, не вписывается в идеологию — шаблонизация только на одной стороне: клиент или сервер.
И напоследок. До сих пор нет документации по JS составляющей виджета ActiveForm. Возможно, когда появится дока, я пересмотрю решение.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.