69 votes

Publication d'objets JSON sur Symfony 2

Je suis en train de travailler sur un projet à l'aide de Symfony 2, j'ai construit un bundle pour gérer toutes mes services de base de données qui transmet les données JSON en arrière et en avant.

Mon Problème/Question:

  • Est-il possible de poster un droit en haut d'objet JSON? Actuellement, je suis de l'usurpation d'une forme normale de mon poste pour les appels ajax en donnant un nom à l'objet json={"key":"value"} si je ne lui donne pas un nom que je n'arrive pas à obtenir les données de la requête Symfony objet $JSON = $request->request->get('json');

  • Je veux être en mesure d'utiliser l'un forfait de gérer à la fois les données en provenance des appels AJAX, ou avoir un cours normal formulaire de Symfony. Actuellement, je suis le soumis de formulaire de Symfony, obtenir les données, puis à l'aide de JSON_ENCODE, je ne peux pas travailler sur la façon d'afficher les données grâce à mes services de contrôleur qui attend les données de la demande.

Pour Résumer: - Je veux Symfony à accepter un JSON post de l'objet plutôt que d'une forme. - Je veux passer l'objet JSON entre les contrôleurs à l'aide de Requête/Réponse

Si je vais au sujet de cette tout faux, n'hésitez pas à me le dire!

135voto

richsage Points 12266

Si vous souhaitez récupérer dans votre contrôleur des données envoyées au format JSON standard dans le corps de la demande, vous pouvez procéder de la manière suivante:

 public function yourAction()
{
    $params = array();
    $content = $this->get("request")->getContent();
    if (!empty($content))
    {
        $params = json_decode($content, true); // 2nd param to get as array
    }
}
 

Maintenant, $params sera un tableau complet de vos données JSON. Retirez le true valeur de paramètre dans le json_decode() appel pour obtenir un stdClass objet.

1voto

javascript sur la page:

function submitPostForm(url, data) {
    var form                = document.createElement("form");
        form.action         = url;
        form.method         = 'POST';
        form.style.display  = 'none';

    //if (typeof data === 'object') {}

    for (var attr in data) {
        var param       = document.createElement("input");
            param.name  = attr;
            param.value = data[attr];
            param.type  = 'hidden';
        form.appendChild(param);
    }

    document.body.appendChild(form);
    form.submit();
}

après certains événements (comme un clic sur "soumettre"):

// products is now filled with a json array
var products = jQuery('#spreadSheetWidget').spreadsheet('getProducts');
var postData = {
'action':   action,
'products': products
}
submitPostForm(jQuery('#submitURLcreateorder').val(), postData);

dans le contrôleur:

   /**
    * @Route("/varelager/bestilling", name="_varelager_bestilling")
    * @Template()
    */
   public function bestillingAction(Request $request) {
       $products   = $request->request->get('products', null); // json-string
       $action     = $request->request->get('action', null);

       return $this->render(
           'VarelagerBundle:Varelager:bestilling.html.twig',
           array(
               'postAction' => $action,
               'products' => $products
           )
       );
   }

dans le modèle (bestilling.html.brindille dans mon cas):

  {% block resources %}
       {{ parent() }}
       <script type="text/javascript">
       jQuery(function(){
           //jQuery('#placeDateWidget').placedate();
           {% autoescape false %}
           {% if products %}

           jQuery('#spreadSheetWidget').spreadsheet({
               enable_listitem_amount: 1,
               products: {{products}}
           });
           jQuery('#spreadSheetWidget').spreadsheet('sumQuantities');
           {% endif %}
           {% endautoescape %}

       });
       </script>
   {% endblock %}

Alrite, je pense que c'est ce que tu voulais :)

MODIFIER Pour envoyer quelque chose sans simulation d'un formulaire, vous pouvez utiliser jQuery.ajax(). Voici un exemple dans le même esprit que ci-dessus, qui ne va pas déclencher un rafraichissement de la page.

jQuery.ajax({
    url:        jQuery('#submitURLsaveorder').val(),
    data:       postData,
    success:    function(returnedData, textStatus, jqXHR ){
        jQuery('#spreadSheetWidget').spreadsheet('clear');
        window.alert("Bestillingen ble lagret");
        // consume returnedData here

    },
    error:      jQuery.varelager.ajaxError, // a method
    dataType:   'text',
    type:       'POST'
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X