Comment ajouter un champ de saisie semi-automatique dans un formulaire Symfony2 pour la collecte et l'utilisation de Propulser?
Je suis à l'aide de Symfony 2.1 formes avec PropelBundle et je suis en train de revoir une forme qui avait une liste déroulante des objets (pour sélectionner) pour utiliser à la place un jquery autocomplete champ de travail (avec AJAX). Pour la liste déroulante, j'ai été en utilisant le code suivant (qui a fonctionné parfaitement pour le drop-down) dans mon formulaire type:
$builder->add('books', 'collection', array(
'type' => 'model',
'options' => array(
'class' => 'MyVendor\MyBundle\Model\Book',
'property' => 'title',
),
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'required' => false,
));
Pour le bien de donner un peu de contexte, disons que nous sommes en créant un nouveau "Lecteur" de l'objet et que nous voudrions pour sélectionner le Lecteur de livres préférés à partir d'une liste de "Réserver" des objets. Un type de collection est utilisé de sorte que de nombreux "livres préférés" peut être sélectionné dans le nouveau "Lecteur". Maintenant, je voudrais changer le ci-dessus pour utiliser la saisie semi-automatique. Pour ce faire, j'ai essayé de mettre en œuvre un Les données de transformation afin d'être en mesure d'obtenir un Livre-objet à partir d'un simple champ de texte qui pourrait être utilisé pour la fonction d'auto-complétion pour passer le Livre ID comme indiqué dans la réponse à cette Question. Cependant, je n'étais pas en mesure de comprendre comment faire les Données du Transformateur de travailler avec un type de collection et de Propulser cours. J'ai créé un BookToIdTransformer classe comme indiqué dans le Symfony livre de cuisine et j'ai essayé le suivant dans le "ReaderType" fichier:
$transformer = new BookToIdTransformer();
$builder->add(
$builder->create('books', 'collection', array(
'type' => 'text',
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'required' => false,
))->addModelTransformer($transformer)
);
Ci-dessus, j'obtiens un "Call to undefined method: getId" l'exception " (apparemment le Transformateur s'attend à un PropelCollection de Livres, pas un seul Livre objet..). Personne ne sait comment s'y prendre? ou laissez-moi savoir si il ya d'autres façons de mettre en œuvre la saisie semi-automatique à l'aide de Symfony Propel et permettant la sélection de plusieurs objets (par exemple, une collection de livres)?
OriginalL'auteur RayOnAir | 2012-08-15
Vous devez vous connecter pour publier un commentaire.
La solution que j'ai finalement allé pour est légèrement différent de celui de ma réponse précédente. J'ai fini à l'aide d'un "texte" type de champ au lieu d'une "collection" type de champ dans mon "ReaderType" forme", depuis que j'ai fini par utiliser le Loopj Tokeninput plugin jQuery qui permet de sélectionner plusieurs objets (par exemple, "Livre Préféré") pour l'associer à mon principal objet (par exemple, le "Lecteur" de l'objet) dans le formulaire. Considérant que, j'ai créé un "Data Transformateur" pour transformer les objets les identifiants transmis (dans une liste séparée par des virgules dans le champ de texte) à Propulser un Objet de Collection. Le code est partagé comme suit, y compris un échantillon ajax objet contrôleur.
La partie clé de la "ReaderType" formulaire se présente comme suit:
Le "Transformateur" fichier ressemble à ceci:
L'ajax contrôleur qui renvoie un json collection de "livres" à la Tokeninput fonction d'auto-complétion est comme suit:
Et enfin, le routeur dans le "routage.yml" fichier:
vous pouvez ajouter un extrait de votre point de vue / le formulaire, s'il vous plaît?
si je me souviens bien (j'ai fini par ne plus avoir besoin de lui), le code de la vue est juste le standard utilisé pour les formulaires symfony. Le domaine est régulièrement saisie de texte. La fonctionnalité de saisie semi-automatique est ajoutée à l'entrée par le Tokeninput plugin à l'aide de javascript à l'aide de l'id de l'entrée: $("#mon-texte-saisie").tokenInput("/url/de/votre/script/");
OriginalL'auteur RayOnAir