En v4.0, les parcours peuvent être partagés et donc être rattachés à plusieurs formations. Certains méthodes du helper XSLT org.ametys.odf.OdfXSLTHelper ont donc évoluées :
Méthode
ODF 2.6.x
ODF 4.0
getParentProgramStructure(String subProgramId, int depth)
Renvoie un seul nœud <program> contenant la structure de la formation parente
Renvoie autant de noeuds <program> qu'il y a de formation intégrant ce sous-programme. Si vous connaissez l'identifiant de la formation souhaitée, utilisez plutôt la méthode getProgramStructure.
getParentProgram (String subprogramId)
Renvoie un seul nœud <program> avec les informations de la formation parente
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Renvoie autant de noeuds <program> qu'il y a de formation intégrant ce sous-programme. Si vous connaissez l'identifiant de la formation souhaitée, utilisez plutôt la méthode getProgram.
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Utile: afficher la structure complète d'une formation en XSL
Voici un exemple de code XSL afin d'afficher la structure complète d'une formation (dans des <ul> <li>) sur une même page, avec les liens vers les pages des sous-programmes et UE enfants.
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
<xsl:template name="structure">
<!-- Récupérer la structure complète à l'aide du helper XSLT 'org.ametys.odf.OdfXSLTHelper' -->
<xsl:variable name="structure" select="odf:getProgramStructure(/view/content/@id, -1)"/>
<ul>
<xsl:apply-templates select="$structure" mode="structure">
<xsl:with-param name="parentId" select="/view/content/@id"/>
</xsl:apply-templates>
</ul>
</xsl:template>
<xsl:template match="subprogram" mode="structure">
<xsl:param name="parentId"/><!-- Id des parents par ordre ascendant, séparés par des ; -->
<li>
<a href="{resolver:resolve('odf', concat(@id, ';', $parentId))}"><xsl:value-of select="@title"/></a>
<xsl:if test="subprogram|courseList|container">
<ul>
<xsl:apply-templates select="subprogram|container|courseList" mode="structure">
<xsl:with-param name="parentId" select="concat(@id, ';', $parentId)"/>
</xsl:apply-templates>
</ul>
</xsl:if>
</li>
</xsl:template>
<xsl:template match="container" mode="structure">
<xsl:param name="parentId"/><!-- Id des parents par ordre ascendant, séparés par des ; -->
<li>
<xsl:value-of select="@title"/>
<xsl:if test="subprogram|courseList|container">
<ul>
<xsl:apply-templates select="subprogram|courseList|container" mode="structure">
<xsl:with-param name="parentId" select="$parentId"/>
</xsl:apply-templates>
</ul>
</xsl:if>
</li>
</xsl:template>
<xsl:template match="courseList" mode="structure">
<xsl:param name="parentId"/><!-- Id des parents par ordre ascendant, séparés par des ; -->
<li>
<xsl:value-of select="@title"/>
<xsl:if test="course">
<ul>
<xsl:apply-templates select="course" mode="structure">
<xsl:with-param name="parentId" select="$parentId"/>
</xsl:apply-templates>
</ul>
</xsl:if>
</li>
</xsl:template>
<xsl:template match="course" mode="structure">
<xsl:param name="parentId"/><!-- Id des parents par ordre ascendant, séparés par des ; -->
<li>
<a href="{resolver:resolve('odf', concat(@id, ';', $parentId))}"><xsl:value-of select="@title"/></a>
<xsl:if test="courseList">
<ul>
<xsl:apply-templates select="courseList" mode="structure">
<xsl:with-param name="parentId" select="concat(@id, ';', $parentId)"/>
</xsl:apply-templates>
</ul>
</xsl:if>
</li>
</xsl:template>
<xsl:template name="structure">
<!-- Récupérer la structure complète à l'aide du helper XSLT 'org.ametys.odf.OdfXSLTHelper' -->
<xsl:variable name="structure" select="odf:getProgramStructure(/view/content/@id, -1)"/>
<ul>
<xsl:apply-templates select="$structure" mode="structure">
<xsl:with-param name="parentId" select="/view/content/@id"/>
</xsl:apply-templates>
</ul>
</xsl:template>
<xsl:template match="subprogram" mode="structure">
<xsl:param name="parentId"/><!-- Id des parents par ordre ascendant, séparés par des ; -->
<li>
<a href="{resolver:resolve('odf', concat(@id, ';', $parentId))}"><xsl:value-of select="@title"/></a>
<xsl:if test="subprogram|courseList|container">
<ul>
<xsl:apply-templates select="subprogram|container|courseList" mode="structure">
<xsl:with-param name="parentId" select="concat(@id, ';', $parentId)"/>
</xsl:apply-templates>
</ul>
</xsl:if>
</li>
</xsl:template>
<xsl:template match="container" mode="structure">
<xsl:param name="parentId"/><!-- Id des parents par ordre ascendant, séparés par des ; -->
<li>
<xsl:value-of select="@title"/>
<xsl:if test="subprogram|courseList|container">
<ul>
<xsl:apply-templates select="subprogram|courseList|container" mode="structure">
<xsl:with-param name="parentId" select="$parentId"/>
</xsl:apply-templates>
</ul>
</xsl:if>
</li>
</xsl:template>
<xsl:template match="courseList" mode="structure">
<xsl:param name="parentId"/><!-- Id des parents par ordre ascendant, séparés par des ; -->
<li>
<xsl:value-of select="@title"/>
<xsl:if test="course">
<ul>
<xsl:apply-templates select="course" mode="structure">
<xsl:with-param name="parentId" select="$parentId"/>
</xsl:apply-templates>
</ul>
</xsl:if>
</li>
</xsl:template>
<xsl:template match="course" mode="structure">
<xsl:param name="parentId"/><!-- Id des parents par ordre ascendant, séparés par des ; -->
<li>
<a href="{resolver:resolve('odf', concat(@id, ';', $parentId))}"><xsl:value-of select="@title"/></a>
<xsl:if test="courseList">
<ul>
<xsl:apply-templates select="courseList" mode="structure">
<xsl:with-param name="parentId" select="concat(@id, ';', $parentId)"/>
</xsl:apply-templates>
</ul>
</xsl:if>
</li>
</xsl:template>
<xsl:template name="structure">
<!-- Récupérer la structure complète à l'aide du helper XSLT 'org.ametys.odf.OdfXSLTHelper' -->
<xsl:variable name="structure" select="odf:getProgramStructure(/view/content/@id, -1)"/>
<ul>
<xsl:apply-templates select="$structure" mode="structure">
<xsl:with-param name="parentId" select="/view/content/@id"/>
</xsl:apply-templates>
</ul>
</xsl:template>
<xsl:template match="subprogram" mode="structure">
<xsl:param name="parentId"/><!-- Id des parents par ordre ascendant, séparés par des ; -->
<li>
<a href="{resolver:resolve('odf', concat(@id, ';', $parentId))}"><xsl:value-of select="@title"/></a>
<xsl:if test="subprogram|courseList|container">
<ul>
<xsl:apply-templates select="subprogram|container|courseList" mode="structure">
<xsl:with-param name="parentId" select="concat(@id, ';', $parentId)"/>
</xsl:apply-templates>
</ul>
</xsl:if>
</li>
</xsl:template>
<xsl:template match="container" mode="structure">
<xsl:param name="parentId"/><!-- Id des parents par ordre ascendant, séparés par des ; -->
<li>
<xsl:value-of select="@title"/>
<xsl:if test="subprogram|courseList|container">
<ul>
<xsl:apply-templates select="subprogram|courseList|container" mode="structure">
<xsl:with-param name="parentId" select="$parentId"/>
</xsl:apply-templates>
</ul>
</xsl:if>
</li>
</xsl:template>
<xsl:template match="courseList" mode="structure">
<xsl:param name="parentId"/><!-- Id des parents par ordre ascendant, séparés par des ; -->
<li>
<xsl:value-of select="@title"/>
<xsl:if test="course">
<ul>
<xsl:apply-templates select="course" mode="structure">
<xsl:with-param name="parentId" select="$parentId"/>
</xsl:apply-templates>
</ul>
</xsl:if>
</li>
</xsl:template>
<xsl:template match="course" mode="structure">
<xsl:param name="parentId"/><!-- Id des parents par ordre ascendant, séparés par des ; -->
<li>
<a href="{resolver:resolve('odf', concat(@id, ';', $parentId))}"><xsl:value-of select="@title"/></a>
<xsl:if test="courseList">
<ul>
<xsl:apply-templates select="courseList" mode="structure">
<xsl:with-param name="parentId" select="concat(@id, ';', $parentId)"/>
</xsl:apply-templates>
</ul>
</xsl:if>
</li>
</xsl:template>
Les services
Service "Schéma des formation"
Pour rappel, ce service contient une image map dont les zones redirigent vers le moteur de recherche avec la présélection d'un type de diplôme (licence, master, doctorat, ...).
Les liens vers le moteur de recherche doivent contenir l'identifiant du diplôme recherché. En 2.6.x, l'identifiant correspondait au code du diplôme ('XA', 'XB', ...). En v4 l'identifiant est l'identifiant du contenu Ametys (de la forme "content://xxxxx..."). Il faut donc préalablement récupérer l'identifiant Ametys à partir du code du diplôme, en utilisant la méthode getEntryId du helper XSLT org.ametys.odf.OdfXSLTHelper.
v4.0
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Le format du XML d'entrée a évolué pour tous les moteurs de recherche :
Chaque critère de recherche portant sur une métadonnée, fait l'objet d'un noeud form >fields > metadata. Si le critère est un champ énuméré (liste déroulante), les valeurs possible se trouvent dans form >fields > metadata > enumeration > item
La valeur recherchée pour un critère de recherche portant sur une métadonnée, se trouve dans un noeud form > values > metadata > metadata
Si l'utilisation de facettes est activée, elles sont listées pour chaque champ énumérés dans form > facets > facet
XML d'entrée en 2.6.x
XML d'entrée en 4.x
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Ce nouveau format d'entrée est en prendre en compte dans toutes vos surcharges ou propres vues sur les moteurs de recherche ODF.
Ci-après sont décrit les modifications qui ont été nécessaires dans les XSL fournies pour le plugin ODF-web.
Vue par défaut pour les formations (search_1.2.xsl)
Pour la vue par défaut, le fichier XSL search-criteria_1.2.xsl a été modifié comme suit :
Ajout de l'import du fichier service:web://pages/services/search/search-criteria/search-criteria_3.3.xsl. En effet, le rendu du moteur de recherche classique supporte maintenant les facettes (dans une liste déroulante) et une liste de critères de recherche portantsur des métadonnées de manière générique.
Suppression des templates "common-service-head-title", "common-service-body-nonempty-content-title", "common-service-body-nonempty-content-content", "common-service-head-js". En effet suite à l'import précédent, la surcharge de ces templates est inutile.
Le fichier facet-lists.js n'existe plus dans le plugin ODF, il doit être importé depuis le plugin web. Grace à l'import précédent, ce fichier est importé automatiquement si les facettes sont activée
Surcharge du template "form-search" pour :
ajouter le champ caché "catalog" (nécessaire pour le calcul des facettes)
ajouter le champ caché "content-types" (nécessaire pour le calcul des facettes) => template XSL form-search-content-types
Dans la charte de démo, utilisant jqTransform, les modifications suivantes ont été faites pour le fichier search-criteria_1.2.xsl :
le template common-service-head-js a été renommé js-facets
l'import du fichier JS <script src="{ametys:pluginResourceURL('odf-web', 'js/search/facet-lists.i18n.js')}" type="text/javascript"></script> a été remplacé par <script src="{$uri-prefix}/plugins/web/resources/js/search/facet-lists.{$lang}.js" type="text/javascript"/>
L'injection pour jqTransform :
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Dans la charte de démo, utilisant jqTransform, comme pour la vue précédente, les modifications suivantes ont été faites pour le fichier search-course_2.3.xsl :
le template common-service-head-js a été renommé js-facets
l'import du fichier JS <script src="{ametys:pluginResourceURL('odf-web', 'js/search/facet-lists.i18n.js')}" type="text/javascript"></script> a été remplacé par <script src="{$uri-prefix}/plugins/web/resources/js/search/facet-lists.{$lang}.js" type="text/javascript"/>
L'injection pour jqTransform :
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Pour cette vue, le fichier XSL search-criteria-links_1.3.xsl a été modifié comme suit :
Les templates "form-search", "form-search-element", "form-search-element-selected-choice", "form-search-element-list-choice" ont été adaptés au nouveau format XML d'entrée :
pour rechercher la liste des facettes, les instructions du type /search/form/fields/*[starts-with(name(), 'criterion-enumerated-')] doivent être remplacées par /search/form/facets/facet[item]
pour recherche la valeur d'une facette sélectionnée, les instruction du type /search/form/values/*[name() = $elementName and normalize-space(.) != ''] doivent être remplacées par /search/form/values/*/metadata[@name = $name and normalize-space(.) != '']
Pour cette vue, le fichier XSL search-criteria-multiple.xsl a été modifié comme suit :
Le template "common-service-head-js" a été renommé "js-facets"
Les templates "form-search-element-title", "form-search-element-keywords", "form-search-element-allwords" et "form-search-element-exactwording" ont été supprimés car leur surcharge est inutile.
Le template "form-search-element" a été remplacé par le template "form-search-by-metadata-enum"
Vues "classification des résultats par domaine" et "classification des résultats par domaine puis diplôme"
Pour ces vues, c'est le format d'entrée pour les champs "domain" et "degree" pour chaque résultat de recherche qui a évolué :
En 2.6.x
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
<hit>
<content id="..." title="Licence LEA Anglais - Allemand">
<domain value="ALL">Art, Lettres et Langues</domain>
<degree value="XA">Licence</domain>
<!-- autres champs du contenus -->
</content>
</hit>
<hit>
<content id="..." title="Licence LEA Anglais - Allemand">
<domain value="ALL">Art, Lettres et Langues</domain>
<degree value="XA">Licence</domain>
<!-- autres champs du contenus -->
</content>
</hit>
<hit>
<content id="..." title="Licence LEA Anglais - Allemand">
<domain value="ALL">Art, Lettres et Langues</domain>
<degree value="XA">Licence</domain>
<!-- autres champs du contenus -->
</content>
</hit>
En 4.x
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
<hit>
<content id="..." title="Licence LEA Anglais - Allemand">
<domain id="content://xxxx" title="Art, Lettres et Langues" lang="fr" name="art-lettres-langues"/>
<degree id="content://yyyy" title="Licence" lang="fr" name="licence"/>
<!-- autres champs du contenus -->
</content>
</hit>
<hit>
<content id="..." title="Licence LEA Anglais - Allemand">
<domain id="content://xxxx" title="Art, Lettres et Langues" lang="fr" name="art-lettres-langues"/>
<degree id="content://yyyy" title="Licence" lang="fr" name="licence"/>
<!-- autres champs du contenus -->
</content>
</hit>
<hit>
<content id="..." title="Licence LEA Anglais - Allemand">
<domain id="content://xxxx" title="Art, Lettres et Langues" lang="fr" name="art-lettres-langues"/>
<degree id="content://yyyy" title="Licence" lang="fr" name="licence"/>
<!-- autres champs du contenus -->
</content>
</hit>
De fait, il faut remplacer les occurences de content/domain/@value par content/domain/@id et les occurences de <xsl:value-of select="content/domain"/> par <xsl:value-of select="content/domain/@title"/>
De plus il faut faire attention car maintenant on a un label pour chaque table de référence, alors qu'avant on construisait un nom à la main ! Par exemple pour les ECTS on stockait "2" et on rajoutait "crédits ECTS" dans la skin. Maintenant le label peut être directement "2 crédits ECTS" donc il faut retirer les clés i18n en trop dans les skins .
Responsable(s)
L'attribut Responsable(s) (personInCharge) a changé de structure. C'est maintenant un repeater ... Il faut donc le gérer dans la skin :
Avant on avait
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
"Sous"-contenus personnes et composantes dans l'affichage d'un contenu ODF
Auparavant les contenus personnes et composantes référencés par le contenu à afficher étaient placés après le SAX principal du contenu dans des balises persons et orgunits qui elles-même contenaient des balises du nom de la métadonnée d'origine avec ensuite le "sous"-contenu saxé à son tour.
Le deuxième niveau correspondant au nom de la métadonnée a été supprimé afin d'éviter les redondances de contenus référencés plusieurs fois dans le contenu principal.
Par exemple, pour récupérer un responsable, auparavant, l'opération était la suivante :
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.