J'utilise un formulaire de connexion sur Symfony2 avec le code de contrôleur suivant
public function loginAction(Request $request)
{
$user = new SiteUser();
$form = $this->createForm(new LoginType(), $user);
if ($request->getMethod() == 'POST') {
$form->bindRequest($request);
$data = $form->getValues();
// Need to do something with the data here
}
return $this->render('GDSiteBundle::header.html.twig', array('form' => $form->createView()));
}
Mais je reçois l'avertissement suivant:
Avertissement: array_replace_recursive () [function.array-replace-recursive]: L'argument n ° 1 n'est pas un tableau dans la ligne 593. 500 Erreur interne du serveur - ErreurException
Est-ce que quelqu'un peut m'aider à comprendre ce qui est incorrect et comment je peux le réparer? Merci.
Mise à jour: Le fichier twig ressemble à ceci:
<div class="form">
{{ form_errors(form) }}
<form action="{{ path('site_user_login') }}" method="POST" {{ form_enctype(form) }}>
<div class="level1">
{{ form_row(form.username) }}
<a href="javascript:void(0)" id="inscription">{% trans %}Registration{% endtrans %}</a>
</div>
<div class="level2">
{{ form_row(form.pwd_hash) }}
<div class="forget_pass"><a href="#" id="frgt">{% trans %}Forgot Password ?{% endtrans %}</a></div>
</div>
<input type="submit" class="submit" name="login" value/>
<div class="clr"></div>
</form>
</div>
Voici la fonction dans le type du formulaire
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('username', 'text', array('label' => 'Username : '));
$builder->add('pwd_hash','password', array('label' => 'Password : '));
}
Voici l'itinéraire:
site_user_login:
pattern: /{_locale}/login
defaults: {_controller: GDSiteBundle:SiteUser:login}
Simplement:
$data = $form->getData();
Aucun de ce qui précède n'a fonctionné pour moi. Cela fonctionne pour moi:
$username = $form["username"]->getData();
$password = $form["password"]->getData();
J'espère que ça aide.
Dans Symfony 2 (pour être plus spécifique, la version 2.3), vous pouvez obtenir les données d’un champ en
$var = $form->get('yourformfieldname')->getData();
ou vous pouvez obtenir toutes les données envoyées
$data = $form->getData();
où '$ data' est un tableau contenant les valeurs de vos champs de formulaire.
Dans Symfony> = 2.3, vous pouvez obtenir la valeur de champs simples avec:
$var = $form->get('yourformfieldname')->getData();
D'autre part, vous pouvez utiliser:
$data = $form->getData();
MAIScela vous donnerait deux choses différentes:
l'entité avec les valeurs renseignées par le formulaire, si l'option data-class
est activée dans votre formulaire (il est donc lié à une entité) ce sera exclure tout champ avec l'option 'mapping' => false
sinon, un tableau avec tous les champs du formulaire
Si vous avez des champs supplémentaires dans le formulaire qui ne sont pas définis dans Entity, $form->getData()
ne fonctionne pas, une solution pourrait être la suivante:
$request->get("form")["foo"]
Ou :
$form->get('foo')->getData();
Dans Symfony formulaires , il existe deux types différents de transformateurs et trois types différents de données sous-jacentes: Quelle que soit leur forme, les trois types de données sont:
Données du modèle
Il s’agit des données au format utilisé dans votre application (par exemple, un objet Issue). Si vous appelez Form::getData()
ou Form::setData()
, vous traitez avec les données "modèles".
Données de données
Ceci est une version normalisée de vos données et correspond généralement aux données de votre "modèle" (mais pas dans notre exemple). Ce n'est pas couramment utilisé directement.
Voir les données
C'est le format utilisé pour remplir les champs du formulaire eux-mêmes. C'est également le format dans lequel l'utilisateur soumettra les données. Lorsque vous appelez Form::submit($data)
, les données $ sont au format de données "view".
Les deux types de transformateurs permettent de convertir vers et à partir de chacun de ces types de données:
Transformateurs de modèle:
transform()
: "model data" => "norm data"reverseTransform()
: "norm data" => "données de modèle"
View transformers:
transform()
: "norm data" => "view data"reverseTransform()
: "view data" => "norm data"
Le transformateur dont vous avez besoin dépend de votre situation.
Pour utiliser le transformateur de vue, appelez addViewTransformer()
.
Si vous souhaitez obtenir toutes les données de formulaire:
$form->getData();
Si vous recherchez un champ de formulaire spécifique (par exemple first_name
):
$form->get('first_name')->getData();
Je l'ai eu en travaillant par ceci:
if ($request->getMethod() == 'POST') {
$username = $request->request->get('username');
$password = $request->request->get('password');
// Do something with the post data
}
Vous devez également avoir la requête Request $ request en tant que paramètre dans la fonction!.
Je pense que pour obtenir les données de la demande, liées et validées par l'objet de formulaire, vous devez utiliser cette commande:
$form->getViewData();
$form->getClientData(); // Deprecated since version 2.1, to be removed in 2.3.
private function getFormDataArray($form)
{
$data = [];
foreach ( $form as $key => $value) {
$data[$key] = $value->getData();
}
return $data;
}
Si vous utilisez Symfony 2 security management, vous n’avez pas besoin d’obtenir des valeurs publiées, vous devez seulement gérer le modèle de formulaire (voir documentation ).
Si vous n'utilisez pas la gestion de la sécurité Symfony 2, je vous conseille vivement de l'utiliser. Si vous ne le souhaitez pas ou si vous ne le pouvez pas, pouvez-vous nous donner les sources de LoginType
?
Pour obtenir les données d'un champ spécifique,
$form->get('fieldName')->getData();
Ou pour toutes les données de formulaire
$form->getData();
Lien vers docs: https://symfony.com/doc/2.7/forms.html
Pour les champs de formulaire non mappés, j'utilise $ form-> get ('inputName') -> getViewData ();