Тип поля коллекции Symfony в типе поля коллекции: добавление / удаление элементов

У меня проблема с типом поля коллекции Symfony.
Работа с одним типом коллекции (добавление, удаление элементов) понятна из-за записи поваренной книги symfony для работы с типом поля коллекции. Для меня проблема возникает, когда я хочу добавить / удалить элементы для типа коллекции в типе коллекции. Пример:
У меня есть коллекция адресов, которая добавляется в мой класс Contact Type

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('addresses', 'collection', array(
'type' => new AddressType(),
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'by_reference' => false,
))
;
}

Эта коллекция адресов получает тип «AddressType», который выглядит следующим образом:

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// name = country
->add('name', 'text')
->add('cities', 'collection', array(
'type' => 'text',
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
))
;
}

Моя цель — теперь иметь возможность добавлять / удалять новые «адреса» в форму (которая работает из-за записи в кулинарной книге), НО для каждого адреса, я также хочу добавить / удалить города.

Вопрос:
Следуя примеру страницы Symfony, я должен добавить в jquery:

/ addresses
$collectionHolder = $('#ecommerce_user_contact_addresses');

держатель коллекции. Что касается адресов, я знаю, что написать здесь, потому что у прототипа данных, сгенерированного в виджете в представлении, есть этот идентификатор.
Но что я должен написать здесь для внутренней коллекции?
Когда я пишу:

// cities
$collectionHolderCities = $('#ecommerce_user_contact_addresses___name___cities');

, который также взят из data-prototype родительского div, который описывает в этом случае структуру элементов «city», я не знаю, как добавить / удалить новые элементы этого.

При звонке:

var prototype = $collectionHolderCities.data('prototype');

в моем методе addCityForm (..) консоль записывает в меня переменную prototype как неопределенную. Когда я зарегистрировал прототип в другом методе addAddressForm, он правильно показал мне структуру прототипа.

Что я должен определить в качестве держателя коллекции «внутренней коллекции» для городов, и что мне нужно изменить, чтобы это работало?

  • Адрес (с названием страны)
    • город
    • город
    • город
  • Адрес (с названием страны)
    • город
    • город

С уважением.

РЕДАКТИРОВАТЬ:
Я реализовал функцию js для добавления города таким образом, и он работает для первого адреса, который отображается в document.ready. Я не знаю, если это лучший способ справиться с этим, любые другие подходы приветствуются 🙂

Я получаю Держатель коллекции в документе. Уже с этим:

 // cities
$collectionHolderCities = $('#ecommerce_user_contact_addresses_0_cities');

Затем в моей функции addCityForm я делаю некоторую замену, чтобы получить правильный newForm:

function addCityForm($collectionHolderCities, $newLinkCity) {
// Get the data-prototype explained earlier
var prototype = $collectionHolderCities.data('prototype');
// get the new index
var index = $collectionHolderCities.data('index');

// replace 'cities_0' default value in prototype with 'cities__counter'
prototype = prototype.replace("cities_0", "cities__counter__");
prototype = prototype.replace("cities_0", "cities__counter__");
// replace '0label__' with '__counter__label__'
prototype = prototype.replace("0label__", "__counter__label__");
// replace [cities][0] with [cities][__counter__]
prototype = prototype.replace("[cities][0]", "[cities][__counter__]");// Replace '__counter__' in the prototype's HTML to
// instead be a number based on how many items we have
var trans = $('#city-trans').val();
var newForm = prototype.replace(/__counter__/g,index);

// Replace cities0 (cities + index) with cities_0 (cities + "_" + index)
newForm = newForm.replace('cities'+index, 'cities_' + index);
newForm = newForm.replace('cities'+index, 'cities_' + index);

// var repStr = '0label__';
//newForm = newForm.replace(repStr,  trans + ':');

// increase the index with one for the next item
$collectionHolderCities.data('index', index + 1);

// Display the form in the page in an li, before the "Add a tag" link li
var $newFormS = $('<span></span>').append(newForm);
$newLinkCity.before($newFormS);

// add a delete link to the new form
addCityFormDeleteLink($newFormS);
}

Проблема сейчас в следующем:
Когда я добавляю новый «адрес», я не могу добавить города к этому новому добавленному адресу. Нет ссылки или поля ввода города по умолчанию. Как я могу справиться с этим?

Добавление новых городов работает только для первого адреса, который отображается в document.ready:

jQuery(document).ready(function() {

// addresses
$collectionHolder = $('#ecommerce_user_contact_addresses');

// add the "add a tag" anchor and li to the tags ul
$collectionHolder.append($newLink);

// count the current form inputs we have (e.g. 2), use that as the new
// index when inserting a new item (e.g. 2)
$collectionHolder.data('index', $collectionHolder.find(':input').length);

$addAddressLink.on('click', function(e) {
// prevent the link from creating a "#" on the URL
e.preventDefault();

// add a new tag form (see next code block)
addAddressForm($collectionHolder, $newLink);
});

// add blank collections
addAddressForm($collectionHolder, $newLink);// add city
// cities
$collectionHolderCities = $('#ecommerce_user_contact_addresses_0_cities');

// add the "add a tag" anchor and li to the tags ul
$collectionHolderCities.append($newLinkCity);

// count the current form inputs we have (e.g. 2), use that as the new
// index when inserting a new item (e.g. 2)
$collectionHolderCities.data('index',   $collectionHolderCities.find(':input').length);$addCityLink.on('click', function(e) {
// prevent the link from creating a "#" on the URL
e.preventDefault();

addCityForm($collectionHolderCities, $newLinkCity);
});

addCityForm($collectionHolderCities, $newLinkCity);
});

Функция addAddressForm () похожа на запись в поваренной книге Symfony.
Не знаю, как добавить города сейчас для добавленных адресов ..: /

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector