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

    Petit problème :


    • Un seul template ("default") (parcque plus facile à gérer).
    • Plusieurs groupes de documents ("test", "prod", "final") (pour la sécurité et la sémantique).
    • Un paquet de TV.

    Maintenant ce que je désire c’est associer certains TV avec certains documents en utilisant leur groupe.
    Pour chaque TV, j’ai donc cocher "default" et le groupe de documents auquels je veux le ratacher. Mais apparement la logique est un "ou". Donc tout mes documents voient tout les TV car ils ont tous le template "default".

    Ce que je souhaite c’est ue logique "et". Càd. associe le document si son template est "default" et qu’il fait partie du roupe "test".

    Any ideas huh
      • 20394
      • 134 Posts
      Salut,
      qu’est-ce que cela donne en changeant dans "mutate_content_dynamic" la ligne
      $sql.= "WHERE tvtpl.templateid = ".$template." AND (1='".$_SESSION['mgrRole']."' OR ISNULL(tva.documentgroup)".((!$docgrp)? "":" OR tva.documentgroup IN ($docgrp)").") ORDER BY tv.rank;";

      par
      $sql.= "WHERE tvtpl.templateid = ".$template." AND (1='".$_SESSION['mgrRole']."' AND (ISNULL(tva.documentgroup)".((!$docgrp)? "":" OR tva.documentgroup IN ($docgrp)").")) ORDER BY tv.rank;";
      ?
        • 26083
        • 32 Posts
        Merci.

        Je vais essayer. Par contre l’idée de hacker me plait pas particulièrement car cela devient difficile à maintenir... Je vais tenter de rassembler cela avec le hack que tu as fournis précédement pour avoir les TV dans un onglets. Si en plus on pouvait les grouper par catégories !!! smiley

          • 20394
          • 134 Posts
          Pour hacker le moins possible j’ai l’impression qu’il faut rajouter des événements un peu partout. Par exemple une fois que la requête sql est crée on peut insérer OnTemplateSqlDocMutate (ou tout autre nom mieux choisi):
          $sql.= "WHERE tvtpl.templateid = ".$template." AND (1='".$_SESSION['mgrRole']."' OR ISNULL(tva.documentgroup)".((!$docgrp)? "":" OR tva.documentgroup IN ($docgrp)").") ORDER BY tv.rank;";
          $modx->invokeEvent("OnTemplateSqlDocMutate");

          , ajouter cet événement dans la table system_eventnames,
          puis on crée un plugin réagissant à cet événement :
          $sql = "SELECT DISTINCT tv.*, IF(tvc.value!='',tvc.value,tv.default_text) as value ";
          		$sql.= "FROM $dbase.".$table_prefix."site_tmplvars tv ";
          		$sql.= "INNER JOIN $dbase.".$table_prefix."site_tmplvar_templates tvtpl ON tvtpl.tmplvarid = tv.id ";
          		$sql.= "LEFT JOIN $dbase.".$table_prefix."site_tmplvar_contentvalues tvc ON tvc.tmplvarid=tv.id AND tvc.contentid = $id ";
          		$sql.= "LEFT JOIN $dbase.".$table_prefix."site_tmplvar_access tva ON tva.tmplvarid=tv.id  ";			
          		$sql.= "WHERE tvtpl.templateid = ".$template." AND (1='".$_SESSION['mgrRole']."' AND (ISNULL(tva.documentgroup)".((!$docgrp)? "":" OR tva.documentgroup IN ($docgrp)").")) ORDER BY tv.rank;";
          		

          Ainsi le hack consiste seulement à ajouter un événement dans mutate_content.dynamic, ajouter son nom dans la table system_eventnames. Ensuite tout est une affaire de plugin, qui ici remplace la requête SQL par une nouvelle.