We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 26604
    • 16 Posts
    Bonjour

    j’ai une page qui contient juste une [*tvList*]

    cette tvList a comme parametres importants :
    Input Type => Text
    Default Value => @SELECT CHAMP1, CHAMP2 FROM TABLE
    Widget => Datagrid

    etant donné que le Widget Datagrid est super pratique à utiliser, puisqu’il evite de s’embeter a enchevetrer soi meme du PHP et des balises <table>, <th>, <tr>, etc ...., je voudrais conserver son utilisation, mais ajouter dans sa requete @SELECT une clause WHERE qui piocherait dans $_POST les valeurs à utiliser pour la restriction, afin de n’afficher dans le datagrod que certains enregistrements, plutot que tout le resultat de la requete @SELECT

    - evidemment j’ai essayé de manipuler $_POST dans le @SELECT, mais ca ne fonctionne pas !

    - je sais aussi qu’un chunk peut contenir des snippets et des TV, et que l’on peut utiliser les Nested Bindings (http://modxcms.com/eval-binding.html), j’ai essayé d’utiliser ces principes, mais je tourne en rond, je ne m’en sors pas

    ma question : comment personnaliser a l’execution la requete @SELECT, pour qu’elle prenne en compte ce qu’il y a dans $_POST (ou dans $_GET) ?

    merci d’avance

    anthony
      • 11975
      • 2,542 Posts
      Salut,

      je manque de tps ,pour te donner une explication détaillée mais ds ton cas change @SELECT pour @EVAL

      @EVAL return $modx->runSnippet(’monSnippetquifaitLarequeteSQL’);

      et dans le snippet ton output doit ressemble a name==value||name==value
      pour creer les options de ta tv

      :-)
        Made with MODx : [url=http://www.copadel.com]copadel, fruits et l
        • 26604
        • 16 Posts
        Quote from: heliotrope at Apr 19, 2007, 12:26 PM
        change @SELECT pour @EVAL

        @EVAL return $modx->runSnippet(’monSnippetquifaitLarequeteSQL’);

        et dans le snippet ton output doit ressemble a name==value||name==value
        pour creer les options de ta tv
        ah ouais, cool, bonne idée
        merci pour la reponse
        et ca va marcher meme si mon output est vraiment super super long ? (genre une table avec 200 lignes et plusieurs colonnes et des balises <a> dans le contenu des td ) ?

        anthony
          • 26604
          • 16 Posts
          Quote from: heliotrope at Apr 19, 2007, 12:26 PM
          ds ton cas change @SELECT pour @EVAL

          @EVAL return $modx->runSnippet(’monSnippetquifaitLarequeteSQL’);

          et dans le snippet ton output doit ressemble a name==value||name==value

          Salut

          j’ai essayé de mettre en oeuvre ta solution, mais le datagrid généré n’est pas bon (cf plus bas)

          donc j’ai besoin de précisions stp :

          si ma tvListe est configurée ainsi :
          - Default Value: @EVAL return $modx->runSnippet(’snpTEST’);
          - Column Names : Champ 1, Champ 2
          - Field Names : CHAMP1, CHAMP2

          et que mon snpTEST est ainsi :
          <?php
          return ’CHAMP1==val1||CHAMP2==val2’;
          ?>

          alors j’obtiens ca :


          ma question :
          Comment faire pour obtenir vraiment une ligne dans mon datagrid, avec comme contenu val1 et val2 ?

          autre question :
          Quelle tronche doit avoir l’output du snpTEST pour provoquer plusieurs lignes dans le datagrid ?

          merci beaucoup par avance

          anthony
            • 11975
            • 2,542 Posts
            Salut,

            en fait il ne faut pas que tu formates l’output de ta requete avec les ==|| c’est une erreur de ma part.

            Essaie de retourner le resultat de ta requete à la base.
            Sinon la class dataGrid est dans manager/controls/datagrid.class.php
            Et l’output des TVs est géré dans le fichier manager/tmplvars.format.inc.php

            :-)
              Made with MODx : [url=http://www.copadel.com]copadel, fruits et l
              • 26604
              • 16 Posts
              Quote from: heliotrope at Apr 24, 2007, 12:09 PM

              en fait il ne faut pas que tu formates l’output de ta requete avec les ==|| c’est une erreur de ma part.
              OK merci

              Quote from: heliotrope at Apr 24, 2007, 12:09 PM
              Essaie de retourner le resultat de ta requete à la base.
              OK je vais regarder

              Quote from: heliotrope at Apr 24, 2007, 12:09 PM
              Sinon la class dataGrid est dans manager/controls/datagrid.class.php
              Et l’output des TVs est géré dans le fichier manager/tmplvars.format.inc.php
              merci, justement je venais de commencer a chercher ou tout ca se planquait ...

              je te tiens au courant ..

              anthony
                • 11975
                • 2,542 Posts
                Re,

                bon j’ai vite testé la chose et les résultats sont franchement bizarre.
                la class dataGrid attend soit un array soit une resource (resultat sql)
                Mais le resultat du @EVAL semble être interprété comme une chaine de caratere par dataGrid.

                Si tu as des notions de PHP oublie le widget et écrit un snippet qu ifera ça aussi bien.
                Soit en utilisant la class dataGrid ou makeTable pour générer le tableau.

                :-)
                  Made with MODx : [url=http://www.copadel.com]copadel, fruits et l
                  • 11975
                  • 2,542 Posts
                  pour t’en convaincre ajoute dans le fichier manager/includes/tmplvars.commands.inc.php ligne 49
                  après cette portion
                  <?php //highlight code ci dessous
                  case "EVAL":		// evaluates text as php codes return the results
                  				$output = eval($param);
                  	if(is_string($output)) echo "dommage"; // cette ligne
                  

                    Made with MODx : [url=http://www.copadel.com]copadel, fruits et l
                    • 11975
                    • 2,542 Posts
                    Bon je me rends compte que j’ai pas explique les details

                    Voici mon snippet

                    $rs = $modx->db->select(’name,id’,’modx_site_tmplvars’);
                    return $rs;

                    dataGrid attend soit un array soit une ressource donc c’est ok avec ce snippet.
                    (extrait du code => $this->_isDataset = is_resource($this->ds); // if not dataset then treat as array)
                    Mais ca marche pas :-/
                      Made with MODx : [url=http://www.copadel.com]copadel, fruits et l
                      • 26604
                      • 16 Posts
                      Finalement voici ce que j’ai fait :

                      - dans \manager\includes\tmplvars.commands.inc.php, ajout d’un categorie ’SELECT_IN_EVAL’ dans $BINDINGS :
                      $BINDINGS = array('FILE','CHUNK','DOCUMENT','SELECT_IN_EVAL','SELECT','EVAL','INHERIT','DIRECTORY');

                      - dans \manager\includes\tmplvars.commands.inc.php, ajout d’un case "SELECT_IN_EVAL" avant le case "SELECT" :
                      case "SELECT_IN_EVAL": // - Permet de faire comme un @SELECT, mais en obtenant la requete depuis un eval
                                             // - Généralement on mettra dans le Default Value du TV une instruction du type :
                                             //   @SELECT_IN_EVAL return $modx->runSnippet('SNIPPET_QUI_RETOURNE_UN_SELECT');
                                             // - Ce case "SELECT_IN_EVAL" permet par exemple d'executer une requete SELECT dont la
                                             //   clause WHERE est constituée dynamiquement a l'execution, en tenant compte, par exemple, 
                                             //   de $_GET dans le SNIPPET_QUI_RETOURNE_UN_SELECT
                                             // - Ce case "SELECT_IN_EVAL" doit obligatoirement précéder le case "SELECT", et il ne doit
                                             //   pas contenir de break a la fin, afin qu'il passe la main au case "SELECT" apres son execution
                      $param = eval($param);
                      $param = substr($param,6);
                      // break;

                      - ensuite je crée une page.php dans laquelle je place un template variable [*tvLISTE*]

                      - ce tvLISTE a comme parametres significatifs :
                      Default Value: @SELECT_IN_EVAL return $modx->runSnippet(’snpTEST’);
                      Widget: Datagrid
                      Column Names: Champ 1, Champ 2
                      Field Names: CHAMP1, CHAMP2

                      - et enfin je crée un snippet snpTEST dont le code est :
                      <?php
                      return 'SELECT CHAMP1, CHAMP2 FROM TABLE WHERE CHAMP3='.$_GET['CHAMP3'];
                      ?>

                      - ainsi, si j’affiche l’url http://modxsite/page.php?CHAMP3=’toto’, je recupere un datagrid avec une unique ligne correpondant à la requete SELECT CHAMP1, CHAMP2 FROM TABLE WHERE CHAMP3=’toto’

                      voila, c’est du bricolage, mais j’espere que ca me suffira en attendant que la v1 de MODx permette le meme resultat, mais plus proprement ;-)

                      anthony

                      NB1 : bien sur, dans mon exemple, il est possible de modifier snpTEST pour qu’il genere une requete SELECT :
                      - sans clause WHERE, lorsque $_GET[’CHAMP3’] est vide,
                      - ou avec une clause WHERE de la forme LIKE, lorsque $_GET[’CHAMP3’] contient des caracteres %,
                      - etc .....

                      NB2 : pour que mon exemple fonctionne (utilisation de $_GET), il faut activer les friendly urls, de facon à obtenir des pages modx dont l’url est du style http://modxsite/xx.php,
                      et non pas http://modxsite/index.php?id=yy, comme par défaut

                      NB3 : pour info, pour activer les friendly urls, je me suis servi des 2 pages d’explications suivantes :
                      conf de MODx : http://wiki.modxcms.com/index.php/Friendly_Url%27s_Guide
                      conf de Apache : http://www.webmaster-hub.com/publication/Mod-rewrite-ou-la-reecriture-des.html