Comment personnaliser l'attribut data-prototype dans Symfony 2 formes
Depuis umpteens jours, je bloque sur un problème avec Symfony 2 et de formes.
J'ai eu une forme de sites web entités. "Les sites web" est une collection de site entités et chaque site web contient deux attributs : "type" et "url".
Si je veux ajouter plus d'un site web dans ma base de données, je peux cliquer sur "Ajouter un site" lien, ce qui ajoute un autre site web en ligne de ma forme. Ainsi, lorsque vous cliquez sur le bouton "soumettre", vous pouvez ajouter un ou X site(s) en même temps.
Ce processus pour ajouter une ligne utiliser l'attribut data-prototype, ce qui peut générer le site web du sous-formulaire.
Le problème est que je personnaliser mon formulaire pour avoir un grand graphique de rendu... comme ça :
<div class="informations_widget">{{ form_widget(website.type.code) }}</div>
<div class="informations_error">{{ form_errors(website.type) }}</div>
<div class="informations_widget">{{ form_widget(website.url) }}</div>
<div class="informations_error">{{ form_errors(website.url) }}</div>
Mais le data-prototype ne se soucie pas de cette personnalisation, avec HTML et CSS des balises & propriétés. Je garde le Symfony rendu :
<div>
<label class=" required">$$name$$</label>
<div id="jobcast_profilebundle_websitestype_websites_$$name$$">
<div>
<label class=" required">Type</label>
<div id="jobcast_profilebundle_websitestype_websites_$$name$$_type">
<div>
<label for="jobcast_profilebundle_websitestype_websites_$$name$$_type_code" class=" required">label</label>
<select id="jobcast_profilebundle_websitestype_websites_$$name$$_type_code" name="jobcast_profilebundle_websitestype[websites][$$name$$][type][code]" required="required">
<option value="WEB-OTHER">Autre</option>
<option value="WEB-RSS">Flux RSS</option>
...
</select>
</div>
</div>
</div>
<div>
<label for="jobcast_profilebundle_websitestype_websites_$$name$$_url" class=" required">Adresse</label>
<input type="url" id="jobcast_profilebundle_websitestype_websites_$$name$$_url" name="jobcast_profilebundle_websitestype[websites][$$name$$][url]" required="required" value="" />
</div>
</div>
</div>
Quelqu'un aurait-il une idée pour faire ce hack ?
Vous devez vous connecter pour publier un commentaire.
Un peu vieux, mais voici une solution simple mortel.
L'idée est tout simplement de rendre les articles de la collection par le biais d'un template Twig, de sorte que vous avez la pleine capacité de personnaliser le prototype qui sera placé dans votre
data-prototype="..."
tag. Juste comme si c'était normal, forme habituelle.Dans yourMainForm.html.rameau:
Et dans MyBundle:MyViewsDirectory:prototype.html.rameau:
De crédit: adapté de https://gist.github.com/tobalgists/4032213
Je sais que cette question est assez vieux, mais j'ai eu le même problème et c'est de cette façon que je soved il. Je suis à l'aide d'une brindille
macro
pour accomplir cette tâche. Les Macros sont comme des fonctions, vous pouvez vous rendre avec des arguments différents.maintenant vous pouvez rendre cette macro où vous le souhaitez. Notez que
information_prototype()
est juste le nom de la macro, vous pouvez l'appeler ce que vous voulez. Si vous souhaitez utiliser la macro pour rendre les éléments donnés et le prototype de la même façon, faire quelque chose comme ceci:form.websites.vars.prototype
détient le prototype des données du formulaire avec leprototype_name
que vous avez spécifié. Utilisation_self.+macroname
si vous souhaitez utiliser la macro dans le même modèle.Vous pouvez en savoir plus sur macros dans le La documentation de Twig
_self.widget_prototype
?Vous avez probablement trouvé depuis, mais voici la solution pour les autres.
Créer un nouveau modèle et de copier/coller ce code:
https://gist.github.com/1294186
Ensuite dans le modèle contenant le formulaire que vous souhaitez personnaliser, de les appliquer à votre forme en faisant ceci:
J'ai rencontré de problème similaire récemment. Voici comment vous pouvez remplacer la collecte de prototype, sans avoir à définir explicitement dans le code html:
Vous pouvez faire ce que vous voulez, puis dans votre twig personnalisée. Par exemple:
Utile lorsque vous n'avez qu'à le faire dans des endroits spécifiques et n'ont pas besoin d'un mondial remplacer c'est applicable à toutes les collections.
Je sais que la réponse est très tard, mais il peut être utile pour les visiteurs.
sur votre fichier de thème, vous pouvez simplement utiliser un bloc pour le rendu de chaque entrée de collection de sites web widget comme suit:
également créer thème bloc pour votre collection de widget ligne comme suit:
maintenant le prototype et le rendu de la collecte d'entrée sera le même.
J'ai eu un peu le même problème. Vous pourriez avoir à modifier cela fonctionne pour votre cas, mais quelqu'un peut le trouver utile.
Créer un nouveau fichier de modèle pour tenir votre formulaire personnalisé 'thème'
Normalement, vous pouvez utiliser le form_row fonction d'affichage d'un champ d'étiquette, de l'erreur, et le widget. Mais dans mon cas, je voulais juste afficher le widget. Comme vous le dites, en utilisant le data-prototype de fonction serait également afficher l'étiquette, aussi, dans nos nouveaux champs.html.twig tapez votre code personnalisé pour la façon dont vous souhaitez que le champ rechercher:
J'ai enlevé le div conteneur, et l'étiquette et de l'erreur, et juste à gauche du widget.
Maintenant dans le fichier twig qui affiche le formulaire, il suffit d'ajouter à la fin de l' {% extends ... %}
Et maintenant le form_widget(form.yourVariable.var.prototype) uniquement à rendre le terrain et rien d'autre.
Application large forme de thématisation sera appliqué pour le prototype.
Voir De faire la Demande à l'échelle de Personnalisations
Voici exemple de code pour custom data-prototype:
où
emails
— votre collection.Pour personnaliser différemment existant les éléments de la collection VS prototype, vous pouvez remplacer collection_widget comme ceci:
Et puis dans votre entrée personnalisée:
Si vous n'avez pas besoin de définir un modèle à l'échelle du système, il suffit de définir un modèle dans votre template twig, et de poser des rameaux de l'utiliser.
Ce message met l'accent sur l'utilisation de conventions préexistantes dans le template twig.
Basant off "Comment Imbriquer une Collection de Formulaires de Symfony livre de recettes (http://symfony.com/doc/master/cookbook/form/form_collections.html), vous pouvez saisir n'importe quel html_escaped des données de formulaire que vous souhaitez dans le data-prototype (peut-être considéré comme un hack, mais qui fonctionne à merveille) et uniquement les pages utilisant ce modèle va changer.
Dans l'exemple, ils vous disent de mettre:
Cela peut être remplacé avec succès par quelque chose comme:
Où le type de données d'attribut de la table avec la classe "tags" ci-dessus est la version html version échappée (et les sauts de ligne supprimée si les espaces sont ok et nécessaire) de:
...mais vous devez également ajuster le javascript dans l'exemple d'ajouter des tr au lieu de li éléments:
Pour moi, la prochaine étape est de savoir comment définir le prototype dans un fichier externe que je peux appeler d'une certaine manière dans le template twig pour le data-prototype dynamique qui travaille avec le formulaire. Quelque chose comme:
Donc, si l'un des autres postes est de décrire, et je suis trop dense ou si quelqu'un sait comment faire ce genre, dites-le!
Il y a un lien quelque chose à partir de gitHub de François, mais je ne vois aucune explication donc je pense que c'est probablement le plus dynamique de la méthode, je vais aller à un de ces jours prochains.
De la paix,
Steve
Mise à jour:
On peut également utiliser des pièces de la maquette:
Où le type de données d'attribut de la table avec la classe "tags" ci-dessus est la version html version échappée (et les sauts de ligne supprimée si les espaces sont ok et nécessaire) de:
(J'ai utilisé http://www.htmlescape.net/htmlescape_tool.html.)
Symfony va remplacer les informations entre les {{}} avec un html_escaped (en raison de l' "|e") a rendu le terrain lorsque la page est affichée. De cette façon, toute personnalisation au niveau du terrain n'est pas perdu, mais! vous devez d'abord ajouter et supprimer des champs pour le prototype comme vous le faites avec de l'entité 🙂