У меня проблема с типом поля коллекции 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.
Не знаю, как добавить города сейчас для добавленных адресов ..: /
Задача ещё не решена.
Других решений пока нет …