Skip to content

Commit 0ceb959

Browse files
committed
minor #14340 [Collection forms] Make javascript generic (tcheymol)
This PR was submitted for the master branch but it was merged into the 4.4 branch instead. Discussion ---------- [Collection forms] Make javascript generic This pull request aims at making javascript code on the "embeded collection form" section reusable in any form collection * The aim is that we only need to add a `<ul>` tag, and add one init line in javascript if we embed another form collection * Also, I think that the `$addLinkLi` can perfectly be added in Twig instead of javascript, it reduces the size of the js function and improoves reusability What I did is * Remove the `$addLinkLi` from javacripts * Add a data attribute to it so it can reference the list container class : `data-collection-holder-class` I created a sample project implementing my working solution [here](https://github.com/tcheymol/embeed_form_collection_test) Commits ------- 3abeceb [Collection forms] Make javascript generic
2 parents 8b0a921 + 3abeceb commit 0ceb959

File tree

1 file changed

+19
-18
lines changed

1 file changed

+19
-18
lines changed

form/form_collections.rst

+19-18
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,13 @@ the following ``data-prototype`` attribute to the existing ``<ul>`` in your temp
242242

243243
.. code-block:: html+twig
244244

245-
<ul class="tags" data-prototype="{{ form_widget(form.tags.vars.prototype)|e('html_attr') }}">
245+
<ul class="tags" data-prototype="{{ form_widget(form.tags.vars.prototype)|e('html_attr') }}"></ul>
246+
247+
Now add a button just next to the ``<ul>`` to dynamically add a new tag
248+
249+
.. code-block:: html+twig
250+
251+
<button type="button" class="add_item_link" data-collection-holder-class="tags">Add a tag</button>
246252

247253
On the rendered page, the result will look something like this:
248254

@@ -285,27 +291,18 @@ will be show next):
285291

286292
.. code-block:: javascript
287293
288-
var $collectionHolder;
289-
290-
// setup an "add a tag" link
291-
var $addTagButton = $('<button type="button" class="add_tag_link">Add a tag</button>');
292-
var $newLinkLi = $('<li></li>').append($addTagButton);
293-
294294
jQuery(document).ready(function() {
295295
// Get the ul that holds the collection of tags
296-
$collectionHolder = $('ul.tags');
297-
298-
// add the "add a tag" anchor and li to the tags ul
299-
$collectionHolder.append($newLinkLi);
300-
296+
var $tagsCollectionHolder = $('ul.tags');
301297
// count the current form inputs we have (e.g. 2), use that as the new
302298
// index when inserting a new item (e.g. 2)
303-
$collectionHolder.data('index', $collectionHolder.find('input').length);
299+
$tagsCollectionHolder.data('index', $tagsCollectionHolder.find('input').length);
304300
305-
$addTagButton.on('click', function(e) {
301+
$('body').on('click', '.add_item_link', function(e) {
302+
var $collectionHolderClass = $(e.currentTarget).data('collectionHolderClass');
306303
// add a new tag form (see next code block)
307-
addTagForm($collectionHolder, $newLinkLi);
308-
});
304+
addFormToCollection($collectionHolderClass);
305+
})
309306
});
310307
311308
The ``addTagForm()`` function's job will be to use the ``data-prototype`` attribute
@@ -319,7 +316,10 @@ one example:
319316

320317
.. code-block:: javascript
321318
322-
function addTagForm($collectionHolder, $newLinkLi) {
319+
function addFormToCollection($collectionHolderClass) {
320+
// Get the ul that holds the collection of tags
321+
var $collectionHolder = $('.' + $collectionHolderClass);
322+
323323
// Get the data-prototype explained earlier
324324
var prototype = $collectionHolder.data('prototype');
325325
@@ -341,7 +341,8 @@ one example:
341341
342342
// Display the form in the page in an li, before the "Add a tag" link li
343343
var $newFormLi = $('<li></li>').append(newForm);
344-
$newLinkLi.before($newFormLi);
344+
// Add the new form at the end of the list
345+
$collectionHolder.append($newFormLi)
345346
}
346347
347348
.. note::

0 commit comments

Comments
 (0)