IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

[eZ Publish] Sélection de contenus d'une classe avec critères


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 35
    Par défaut [eZ Publish] Sélection de contenus d'une classe avec critères
    Bonjour,

    Pour simplifier, je possède une classe document_interne décrite par les attributs suivants :
    - nom_document de type ligne de texte
    - type_document de type sélection avec un certain nombre de valeurs
    - sous_type_document de type sélection avec un certain nombre de valeurs.

    Je voudrais créer un formulaire de recherche des objets documents de cette classe avec pour champ de sélection le type_document et le sous_type_document ayant pour résultat les documents correspondants aux choix sélectionnés par l'utilisateur.

    Mais hélàs, je ne sais comment m'y prendre...

    Merci d'avance pour vos solutions.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Par défaut
    je ne suis pas bon en JS, donc je ne pourrais pas beaucoup t'aider, mais plutôt que de faire des attributs de classe, je te conseil de faire direct dans l'arborescence du site tes types et sous-types.

    Ensuite, tu fais un template spécial pour ton moteur de recherche, qui va lister dans ton premier select les sous-rubriques,
    et avec un onchange sur ce select, tu listeras les enfants du premier select choisi (le sous-type) dans ton second select...

    Par fairre des fetch sur des attributs de classe, c'est tout de suite plus galère, mais également moins maintenable à terme, alors qu'une arbo, ça se gère facile coté admin ;-)

  3. #3
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 35
    Par défaut
    Bonjour Pixme,

    Tout d'abord merci pour ta réponse et ton idée.
    Hélas il existe déjà un autre classement dans l'arborescence qui fait office d'armoires en quelque sorte. Il faudrait donc suivant ta solution répéter ce deuxième système de classement dans l'arborescence déjà existante... Trop lourd et trop répétitif surtout que j'ai simplifié pour exposer mon problème car en fait il existe encore deux autres critères pour ces documents.

    Merci.

  4. #4
    Membre émérite Avatar de sboyer
    Homme Profil pro
    Développeur PHP chez OpenWide
    Inscrit en
    Février 2010
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur PHP chez OpenWide
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2010
    Messages : 348
    Par défaut
    Salut,

    Tu peux également utiliser le datatype enhancedSelection2 qui permet de hiérarchiser des choix au sein même du datatype :
    http://projects.ez.no/enhanced_selection/

    Bon courage par contre pour créer le JS...

  5. #5
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 35
    Par défaut
    Merci encore pour ces solutions.

    Ceci me parait bien compliqué pour ce que je souhaite faire, une simple sélection d'enregistrements à partir d'un choix de critères...

  6. #6
    Membre émérite Avatar de sboyer
    Homme Profil pro
    Développeur PHP chez OpenWide
    Inscrit en
    Février 2010
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur PHP chez OpenWide
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2010
    Messages : 348
    Par défaut
    Le datatype que je t'ai proposé permet d'ajouter des identifiants, en plus des valeurs du datatype selection.

    Avec cela, tu peux facilement obtenir ce que tu désires à l'aide d'un petit script jquery

  7. #7
    Membre émérite Avatar de sboyer
    Homme Profil pro
    Développeur PHP chez OpenWide
    Inscrit en
    Février 2010
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur PHP chez OpenWide
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2010
    Messages : 348
    Par défaut
    Erratum : le datatype permettant de faire des choix hiérarchisés est en fait le multioption2

  8. #8
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 35
    Par défaut
    Bonjour,

    Tout d'abord, merci pour vos réponses.

    Alors je m'en suis sorti à partir de cette doc http://share.ez.no/learn/ez-publish/...ish-extensions , je ne sais pas si c'est une bonne solution, en tous cas elle fonctionne et je viens donc vous la proposer pour ceux qui aurait la même problématique. Elle se base sur le principe des modules et en partant de la classe décrite dans l'énoncé.


    Création du module recherche

    Créer le dossier mon_extension/modules/mon_module avec les fichiers suivants :

    recherche.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?php
    $Module = $Params['Module'];
     
    $http = eZHTTPTool::instance (); 
    $type = '';
    $sous_type = '';
     
    //Réception des variables passées dans l'url
    if( $http->hasVariable('type_document') ) 
        $type = $http->variable ('type_document');
    if( $http->hasVariable('sous_type_document') ) 
        $sous_type = $http->variable ('sous_type_document');
     
    // Passage des paramètres au template
    $tpl = eZTemplate::factory();
    $tpl->setVariable( 'type', $type );
    $tpl->setVariable( 'sous_type', $sous_type );
     
    // Appel du template correspondant au module
    $Result = array();
    $Result['content'] = $tpl->fetch( 'design:mon_module/recherche.tpl' );
     
    $Result['path'] = array(  array( 'url'  => 'mon_module/recherche',
                                     'text' => 'Documentaire'), 
                              array( 'url'  => false,
                                     'text' => 'recherche' ) );
    ?>
    module.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    $Module = array( 'name' => 'mon_module' ); 
    $ViewList = array();
     
    $ViewList['recherche'] = array( 'script' => 'recherche.php',
                                              'functions' => array( 'read' ), 
    					  'params' => array(),
    					  'unordered_params' => array()); 
     
    $FunctionList = array(); 
    $FunctionList['read'] = array();
    ?>

    Déclaration du module

    Créer ou modifier le fichier module.ini.append.php sous le répertoire mon_extension/settings/siteaccess/mon_site :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php /* #?ini charset="utf-8"?
    
    [ModuleSettings]
    ExtensionRepositories[]=mon_extension
    ModuleList[]=mon_module
    
    */ ?>
    Ajouter au fichier mon_extension/settings/siteaccess/mon_site/site.ini.append.php pour les droits
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [RoleSettings] 
    PolicyOmitList[]=mon_module/recherche

    Création du formulaire de recherche

    Dans mon cas le template du module recherche fait à la fois office de formulaire de recherche et d'affichage des résultats. Créer ainsi le fichier recherche.tpl sous le répertoire mon_extension/design/mon_site/templates/mon_module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    <!-- Recherche des attributs de la classe "document_interne" de numéro de noeud 88 -->
    {def $attributs = fetch( 'class', 'attribute_list', hash( 'class_id', 88 ) )}
     
    <div id="docaire_recherche">
     
       <!-- Création du formulaire de recherche de documents avec les critères Type et Sous type -->
       <div id="formulaire_recherche">
          <form action={'mon_module/recherche'|ezurl} method="post"
             {foreach $attributs as $attribut}
     
                <!-- Parcourt des attributs de la classe "document_interne" -->
                {if or($attribut.identifier|eq('type_document'), $attribut.identifier|eq('sous_type_document')))}
     
                   <!-- Création d un select pour chacun des attributs de la classe correspondant aux critères de recherche -->
                   <label for={$attribut.identifier}>{$attribut.name}</label>
                   <select name={$attribut.identifier}>
     
                      <!-- Création des options du sélect avec les options définies pour l attribut de classe -->
                      <option value=""></option>
                      {foreach $attribut.content.options as $option}
                         <option value="{$option.id}"
                         {switch match=$attribut.identifier}
                            <!-- Définition de l option sélectionnée si celle-ci est reçue en paramètre de la vue, c est à dire si un choix a déjà été saisi -->
                            {case match='type_document'}
                               {if $option.id|eq($type)} selected {/if}
                            {/case}
                            {case match='sous_type_document'}
                               {if $option.id|eq($sous_type)}selected{/if}
                            {/case}
                         {/switch}
                         >{$option.name}</option>
                      {/foreach}
                   </select>
                {/if}
             {/foreach}
             <input type="submit" name="Recherche" value="OK">
          </form>
       </div>
     
    <!-- Recherche des documents correspondants aux critères saisis  -->
    {if or($type|ne(''), $sous_type|ne(''))}
     
       <!-- Récupération du numéro de noeud de dossier Documents -->
       {def $node_dossier_documents_id = ezini('NodeIds','Documents','site.ini')}
     
       <!-- Construction du tableau des critères de sélection pour les documents internes -->
       {def $selections = array()}
       {if $type|ne('')}
          {set $selections = $selections|append(array('document_interne/type_document', '=', $type))}
       {/if}
       {if $sous_type|ne('')}
          {set $selections = $selections|append(array('document_interne/sous_type_document', '=', $sous_type))}
       {/if}
     
       <!--  Recherche des documents interne sous le dossier Documents -->
       {def $documents = fetch( 'content', 'list', hash( 'parent_node_id', $node_dossier_documents_id, 'sort_by', array( 'attribute', true(), 'document_interne/identifiant_document_interne' ), 'class_filter_type', 'include', 'class_filter_array', array('document_interne'), 'attribute_filter', $selections, 'depth', 50))}
     
       {def $nb_documents = $documents|count()}
     
       <!-- Affichage du résultat de la sélection des documents -->
       <div id="resultats_recherche">
          {if $nb_documents|ne(0)}
             <ul>
                {foreach $documents as $document}
                   <li id={$document.node_id}>
                      <a href={concat( 'content/download/', $document.data_map.fichier_document_interne.contentobject_id,	 '/', $document.data_map.fichier_document_interne.id, '/version/', $document.data_map.fichier_document_interne.version , '/file/', $document.data_map.fichier_document_interne.content.original_filename|urlencode )|ezurl} title={concat('"', $document.data_map.description_document_interne.data_text|strip_tags(), '"')}>{$document.data_map.identifiant_document_interne.data_text}</a>
                   </li>
                {/foreach}
             </ul>
          {else}
             <p>Aucun document n a été trouvé avec les critètes de recherche choisis</p>
          {/if}
       </div>
    {/if}
    </div>
    Enfin appeler la recherche de documents par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="/mon_module/recherche">Recherche</a>
    Voilà, si celà peut être utile à quelqu'un...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [eZ Publish] Customiser taille image sur une classe ?
    Par le_chomeur dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 05/11/2009, 16h23
  2. Bien programmer une classe avec sa gestion d'erreur
    Par chris81 dans le forum Framework .NET
    Réponses: 8
    Dernier message: 13/02/2007, 19h13
  3. Comment faire une classe avec deux form?
    Par Mickey.jet dans le forum Delphi
    Réponses: 10
    Dernier message: 04/07/2006, 19h23
  4. creer une classe avec VC++
    Par Spacy_green dans le forum MFC
    Réponses: 6
    Dernier message: 08/06/2006, 18h53
  5. Réponses: 5
    Dernier message: 26/05/2005, 16h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo