2.9 - Contenu statique

Attention : Ce tutoriel est ancien, incomplet, et n'est pas mis à jour. Il ne contient pas toutes les nouveautés du système de template de Gecko 1.9 / Firefox 3.0 qui est largement simplifié et permet d'utiliser sqlite ou xml comme source de données. Aussi est-il préférable d'aller consulter la version anglaise sur developer.mozilla.org.

La création dans la liste de filtrage d'un menuitem permettant de voir tous les items est relativement simple. Cet item n'a pas besoin d'être généré par la source de données. Il sera un contenu statique appelé par le gabarit. Le contenu statique est créé par tous les contenus voisins de l'élément template et de même niveau. Ce contenu est affiché tel quel sans affecter le contenu généré par le gabarit.

<menulist datasources="template-guide-photos4.rdf"
           ref="http://www.daml.org/2001/09/countries/country-ont#Country"
           oncommand="applyFilter(event.target.value);">
  <menupopup>
     <menuitem label="Tous"/>
  </menupopup>
  <template>
    <rule>
      <conditions>
        <content uri="?start"/>
        <triple subject="?country"
                predicate="http://www.w3.org/1999/02/22-rdf-syntax-ns#type"
                object="?start"/>
        <triple subject="?country"
                predicate="http://purl.org/dc/elements/1.1/title"
                object="?countrytitle"/>
      </conditions>
      <action>
        <menupopup>
          <menuitem uri="?country" label="?countrytitle" value="?country"/>
        </menupopup>
      </action>
    </rule>
  </template>
</menulist>

La seule différence entre l'exemple précédent et celui-ci est que l'élément menulist a du contenu supplémentaire avant le template. Ce contenu sera affiché comme si le gabarit n'existait pas. Ainsi, avant que le gabarit ne soit examiné, la liste déroulante contiendra un premier item avec le libellé Tous. Le gabarit génère ensuite deux résultats comme précédemment, un pour chaque pays, et les ajoute au menulist.

Ce qui est intéressant avec cet exemple est qu'un seul menupopup sera créé même s'il y en a deux dans le code, un en dehors du gabarit et un autre à l'intérieur du corps d'action. Il vous montre comment le constructeur de gabarit génère du contenu, et ce cas spécifique devient important lorsque vous traitez du contenu récursif et des règles multiples.

Ici, l'analyseur XUL commence par créer l'élément externe menulist. Le contenu statique en dehors du gabarit sera également créé. Le résultat sera l'affichage d'un code XUL similaire à celui ci-dessus, à l'exception du gabarit et de son contenu qui sont absents. À ce stade, le menulist aura un menupopup comme fils, et le menupopup aura à son tour qu'un seul fils menuitem. Ensuite, le gabarit est examiné et deux résultats sont générés. Souvenez vous que seul le contenu à partir de l'attribut uri à l'intérieur d'action est dupliqué pour chaque résultat.

Lors du traitement du corps d'action, le constructeur regardera le premier élément à l'intérieur d'action, dans ce cas, le menupopup. Cet élément n'a pas d'attribut uri, donc le constructeur sait qu'il ne doit créer cet élément qu'une seule fois. Vous devez penser que le constructeur va alors créer un menupopup, mais il n'en est rien. En fait, il vérifie si un menupopup existe déjà à l'emplacement où il aurait dû être créé. Dans notre cas, il y en a déjà un, le menupopup statique défini en dehors du gabarit. Plutôt que de créer un autre menupopup, le constructeur utilise l'existant. Il est ainsi pratique de combiner des résultats statiques et ceux d'un gabarit dans une seule liste.

Le constructeur passe ensuite à l'endroit où le contenu aurait dû être généré et continue avec la partie suivante d'action, le menuitem. Cet élément a l'attribut uri, donc son contenu sera dupliqué pour chaque résultat.

La technique de recherche d'un élément existant s'applique à n'importe quel type de contenu. Le constructeur traitera l'élément comme étant présent aussi longtemps qu'un autre élément avec la même balise existe. Si vous changiez l'élément statique par un élément autre qu'un menupopup, le constructeur en créera un nouveau lors du traitement du corps d'action. Ce principe devient utile lors de l'emploi de multiples règles et nous verrons divers exemples plus tard.

Voici l'exemple que vous pouvez tester.

Notez que l'astuce résolvant le problème de chargement de la source de données mentionnée lors du précédent exemple n'est plus nécessaire, car l'existence d'un contenu statique est une autre méthode pour contourner ce problème. Donc, si vous utilisez des menulist avec des gabarits et que les données ne s'affichent pas correctement lors du chargement, essayez d'utiliser un élément menupopup statique. Il n'est pas nécessaire d'y ajouter des items.

Le contenu statique peut être placé avant ou après le gabarit, bien qu'il soit généralement placé en premier. Notez qu'ici le contenu statique est placé avant le contenu généré, donc l'item Tous sera le premier item dans le menu.

Exemple de contenu statique

Étudions un autre exemple invoquant des boutons radios. En réalité, cet exemple est similaire, mais il utilise simplement un radiogroup au lieu d'un menulist pour afficher la liste des pays.

<radiogroup datasources="template-guide-photos4.rdf"
            ref="http://www.daml.org/2001/09/countries/country-ont#Country"
            onselect="applyFilter(event.target.value);">
  <radio label="Tous" selected="true"/>
  <template>
    <rule>
      <conditions>
        <content uri="?start"/>
        <triple subject="?country"
                predicate="http://www.w3.org/1999/02/22-rdf-syntax-ns#type"
                object="?start"/>
        <triple subject="?country"
                predicate="http://purl.org/dc/elements/1.1/title"
                object="?countrytitle"/>
      </conditions>
      <action>
        <radio uri="?country" label="?countrytitle" value="?country"/>
      </action>
    </rule>
  </template>
</radiogroup>

Cet exemple n'a pas à générer d'autre contenu en dehors de l'élément avec l'attribut uri, donc il sera copié tel quel. Le bouton radio statique Tous sera le premier item radio.


Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.