Bonjour, je suis débutant avec SF2. J'ai créer un blog avec Symfony2. J'essaye d'intégrer ce plugin de rating dans chaque article jRating . J'ai rencontré un problème au niveau de son fichier js où je dois passer ma route. voila un appercu du code:

$.fn.jRating = function (op) {
        var defaults = {
            / **String vars** /
            bigStarsPath: '../../../bundles/portofoliofront/css/icons/stars.png', // path of the icon stars.png
            smallStarsPath: '../../../bundles/portofoliofront/css/icons/small.png', // path of the icon small.png
            phpPath: "{{ path('portofolio_front_rating') }}",
            type: 'big', // can be set to 'small' or 'big'

voila l'emplacement du fichier routing et controlleur:

l'erreur:
http://localhost/Portofolio/web/app\_dev.php/blog/article/%7B%7B%20path('portofolio\_front\_rating')%20%7D%7D
Comment je peu insérer ma route dans la variable "phpPath" ?

8 réponses


Yentia
Réponse acceptée

je viens de dl Jrating pour me comprendre ton problème, une autre solution

dans ton dossier public web/Bundles
crée un dossier que tu appel comme tu veux par exemple : core
dans ce dossier core place ton dossier Jquery et php qui proviens de JRating sans rien toucher.

depuis ta vue après tu utilise

{% block javascripts %}
    {% javascripts output="js/compiled/main.js" 
        'Bundles/core/jquery/jquery.js'
        'Bundles/core/jquery/jRating.jquery.js'
    %}
        <script type="text/javascript" src="{{ asset_url }}"></script>
    {% endjavascripts %}
{% endblock %}

apres dans ton fichier js tu remonte d'un dossier et tu as acces a ton fichier php

taiebb
Auteur
Réponse acceptée

@Yentia. Merci beaucoup pour votre aide. En effet, la solution est simple. Il suffit de redéfinir la variable phpPath dans la vue. Voila mon nouveau code:

<script type="text/javascript">
        $(document).ready(function () {
            $(".basic").jRating({
                length: 5,
                decimalLength: 1,
                phpPath: '{{ path('portofolio_front_rating') }}',
                rateMax: 5,
                onClick: function (element, rate) {
                    alert(rate);
                },
                onSuccess: function () {
                    alert('Success : your rate has been saved :)');
                },
                onError: function () {
                    alert('Error : please retry');
                }
            });
        });
    </script>

Mon code coté controlleur. Il n'est pas encore finit mais ça marche:

//rating action    
    public function ratingAction(Request $request) {
        if ($request->isXMLHttpRequest()) {
            $aResponse'error'] = false;
            $aResponse'message'] = '';
            $aResponse'server'] = '';
            if ($request->request->get('action') == 'rating') {
                $id = $request->request->get('idBox');
                $rate = $request->request->get('rate');
                $em = $this->getDoctrine()->getManager();
                //check if the article exists
                $article = $em->getRepository('PortofolioAdminBundle:Article')->getArticleById($id);
                if ($article) {
                    //get total_rating
                    $total_rating = $article->getTotalRating();
                    //add new rate to the total_rating
                    $total_rating = $total_rating + $rate;                    
                    //get total_rates
                    $total_rates = $article->getTotalRates();
                    $total_rates = $total_rates + 1;
                    //get current voter ip
                    $ip = $this->container->get('request')->getClientIp(); 
                    //calculate the new rate
                    $new_rate = $total_rating / $total_rates;
                    //update article entity with the news values
                    $article->setRating($new_rate);
                    $article->setTotalRating($total_rating);
                    $article->setTotalRates($total_rates);
                    $article->setIp($ip);    
                    $em->persist($article);
                    $em->flush();

                    $success = true;
                    // else $success = false;
                    // json datas send to the js file
                    if ($success) {
                        $aResponse'message'] = 'Your rate has been successfuly recorded. Thanks for your rate :)';
                        $aResponse'server'] = '<strong>Success answer :</strong> Success : Your rate has been recorded. Thanks for your rate :)<br />';
                        $aResponse'server'] .= '<strong>Rate received :</strong> ' . $rate . '<br />';
                        $aResponse'server'] .= '<strong>ID to update :</strong> ' . $id;
                        return new JsonResponse($aResponse);
                    } else {
                        $aResponse'error'] = true;
                        $aResponse'message'] = 'An error occured during the request. Please retry';
                        $aResponse'server'] = '<strong>ERROR :</strong> Your error if the request crash !';
                        return new JsonResponse($aResponse);
                    }
                }
            } else {
                $aResponse'error'] = true;
                $aResponse'message'] = '"action" post data not equal to \'rating\'';
                $aResponse'server'] = '<strong>ERROR :</strong> "action" post data not equal to \'rating\'';
                return new JsonResponse($aResponse);
            }
        }
        return new Response('This is not ajax!', 400);
    }
iiNku
Réponse acceptée

Salut.

Je suis totalement d'accord avec android38 et yurty. Tu ne dois en aucun cas appeler un varible twig dans du JS. Pour ton problème, tu dois utiliser un element data sur ton object, comme te l'a indiqué android38.
Pour récuperer l'url en js, tu peux faire

$('#id').data('url')

salut,

Sa depand, il se trouve ou ce fichier jRating.php ?
il se trouve dans un bundle dans ton dossier src ? ou tu las mis dans ton dossier web ?
Peut tu donner l'architecture de tes dossiers stp ?

taiebb
Auteur

@Yentia: J'ai mis à jour mon poste.

De la façon que tu as fais avec twig {{ path('portofolio_front_rating') }}, il faut deja que ton js soit dans ta vue.html.twig sinon sa ne marchera pas. Ensuite il faut que portofolio_front_rating appel l'action nécessaire, et que cette action dans ton controller contienne le php nécessaire contenu dans ton fichier Jrating.php
Donc a mon avis ce n'est pas la bonne solution.

Moi j'aurai mis mon fichier dans ressources/public/library/Jrating.php
ensuite avec la commande assets:install web dans ton terminal, le fichier sera transporter dans le dossier web/bundles/frontBundle/library/
ensuite tu fais comme avant tu vas le chercher dans ton bundle.('bundles/frontBundle/library/jRating.php')

sinon après tu peux mettre ta library dans ton dossier vendor et la use dans ton controller, mais sa reviens au même que ma première explication je pense.

Je suis pas un expert sf2 j'ai commencer il y a 5 mois :s

Bonjour

Je sais qu'il est un peu tard mais bon ça peu peut être aider d'autre personne.
Moi pour récuperer la route dans mes fichiers javascript, je mets une div dans mon template de base qui est appelé partout.Cette div je l'ecris comme ça :

<div id="urlFaq" data-path="{{ path('route_faq') }}"></div>

et dans mes javascript ou j'ai besoin de mes routes j'ecris :

$('#urlFaq').attr("data-path");

Je sais pas si c'est la meilleur des façon mais ça fonctionne tres bien pour moi.

Yop,

Moi j'ai l'habitude d'utiliser ce bundle : https://github.com/FriendsOfSymfony/FOSJsRoutingBundle

++