A partir de la 2.5.0, une formation peut-être dupliquée.
Cela nécessite une mise à jour du fichier WEB-INF/params/workflow-program.xml, consistant à ajouter l'action de workflow initiale avec l'identifiant 111:
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
Modification des identifiants des pages virtuelles (depuis le 10/02/2016)
Le script suivant est nécessaire dès lors que vous possédez des textes riches susceptibles de contenir des liens vers des pages ODF (formations, parcours, ELP).
Attention Le script suivant ne peut être passé qu'une seule fois ! Procédez à une sauvegarde du repository AVANT de passer le script. Puis passez une première fois le script en laissant l'instruction session.save() commentée. Vérifier que cela vous semble correct avant de repasser le script en dé-commentant session.save()
Script de mise à jour des liens dans les textes riches
Oups !
La copie dans le presse papier a échouée. Ouvrez le code et copier-le manuellement.
var qm = session.getWorkspace().getQueryManager();
// récupération de tous les textes riches existants
var query = qm.createQuery("//element(*, ametys:richText)[@jcr:data]", javax.jcr.query.Query.XPATH);
var nodes = query.execute().getNodes();
var nodeCount = 0;
var liveCount = 0;
while (nodes.hasNext())
{
var node = nodes.next();
try
{
// contenu du texte riche
var is = node.getProperty("jcr:data").getStream();
var builder = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();
var doc = builder.parse(is);
is.close();
var needUpdate = false;
// parcours des liens contenus dans le texte riche
var links = org.apache.xpath.XPathAPI.selectNodeList(doc, "//link[@type='page']", doc.getDocumentElement());
for (var i = 0; i < links.getLength(); i++)
{
var linkNeedUpdate = false;
var link = links.item(i);
var href = link.getAttributes().getNamedItem("xlink:href").getNodeValue();
// traitement des liens vers une formation, parcours ou ELP
if (href.indexOf("program://") == 0)
{
// les anciennes url sont de la forme program://art-lettres-langue-ALL/master-lmd-XB/master-design-program-fruai3182988bprh7agzrd6?rootId=page://xxxx&programId=subProgram://yyyy
// ou program://art-lettres-langue-ALL/master-lmd-XB?rootId=page://xxx&programId=program://yyy
var index = href.indexOf('?');
var oldPath = href.substring("program://".length, index);
// println(node.getUUID() + " - "+ href);
var pathSegment = oldPath.split("/");
var newPath;
if (pathSegment.length == 2)
{
newPath = "_root";
linkNeedUpdate = true;
}
else if (pathSegment.length > 2)
{
linkNeedUpdate = true;
newPath = org.apache.commons.lang.StringUtils.join(pathSegment, '/', 2, pathSegment.length);
}
if (linkNeedUpdate)
{
// calcul du nouveau lien
// les nouvelles url sont de la forme program://master-design-program-fruai3182988bprh7agzrd6?rootId=page://xxxx&programId=subProgram://yyyy
// ou program://_root?rootId=page://xxx&programId=program://yyy
var newHref = "program://" + newPath + href.substring(index);
println(href + " \n=>\n " + newHref + "'");
println("");
link.getAttributes().getNamedItem("xlink:href").setNodeValue(newHref);
needUpdate = true;
}
}
else if (href.indexOf("course://") == 0 && href.indexOf("&programId=") == -1)
{
var index = href.indexOf('?');
var oldPath = href.substring("course://".length, index);
var pathSegment = oldPath.split("/");
var newPath;
if (pathSegment.length > 2)
{
// les anciennes url sont de la forme course://art-lettres-langue-ALL/master-lmd-XB/master-design-program-fruai3182988bprh7agzrd6?rootId=xxx&courseId=yyy
newPath = org.apache.commons.lang.StringUtils.join(pathSegment, '/', 2, pathSegment.length);
// course://licence-professionnelle-design-program-fruai3182988bprh7agzrd6?rootId=...
var programName = pathSegment[2].substring (pathSegment[2].indexOf('program-'));
query = qm.createQuery("//" + programName, javax.jcr.query.Query.XPATH);
nodes = query.execute().getNodes();
var program = nodes.hasNext() ? nodes.next() : null;
// calcul du nouveau lien
// les nouvelles url sont de la forme course://master-design-program-fruai3182988bprh7agzrd6?rootId=xxx&courseId=yyy&programId=zzz
var newHref = "course://" + newPath + href.substring(index);
if (program != null)
{
newHref += "&programId=program://" + program.getId();
}
println(href + " \n=>\n " + newHref + "'");
println("");
link.getAttributes().getNamedItem("xlink:href").setNodeValue(newHref);
needUpdate = true;
}
}
}
if (needUpdate)
{
// mise à jour du contenu du texte riche avec les liens modifiés
var os = new java.io.ByteArrayOutputStream();
var result = new javax.xml.transform.stream.StreamResult(os);
var source = new javax.xml.transform.dom.DOMSource(doc);
var transformer = javax.xml.transform.TransformerFactory.newInstance().newTransformer();
var format = new java.util.Properties();
format.put(javax.xml.transform.OutputKeys.METHOD, "xml");
//format.put(javax.xml.transform.OutputKeys.INDENT, "yes");
format.put(javax.xml.transform.OutputKeys.ENCODING, "UTF-8");
//format.put(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "2");
transformer.setOutputProperties(format);
transformer.transform(source, result);
var is = new java.io.ByteArrayInputStream(os.toByteArray());
node.setProperty("jcr:data", is);
is.close();
nodeCount++;
println("\n"+node.getUUID()+"\n");
var content = node.getParent();
// TO UNCOMMENT WHEN READY
//content.save();
if (content.hasProperty("ametys-internal:currentStepId") && content.getProperty("ametys-internal:currentStepId").getLong() == 3)
{
//TO UNCOMMENT WHEN READY
//content.checkin();
//content.checkout();
var versionName = content.getBaseVersion().getName();
content.getVersionHistory().addVersionLabel(versionName, "Live", true);
liveCount++;
}
}
}
catch (e) { println("ERROR: "+node.getPath());}
}
// TO UNCOMMENT WHEN READY
// session.save();
println (nodeCount + " rich text(s) were processed");
println (liveCount + " live rich text(s) were processed");
var qm = session.getWorkspace().getQueryManager();
// récupération de tous les textes riches existants
var query = qm.createQuery("//element(*, ametys:richText)[@jcr:data]", javax.jcr.query.Query.XPATH);
var nodes = query.execute().getNodes();
var nodeCount = 0;
var liveCount = 0;
while (nodes.hasNext())
{
var node = nodes.next();
try
{
// contenu du texte riche
var is = node.getProperty("jcr:data").getStream();
var builder = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();
var doc = builder.parse(is);
is.close();
var needUpdate = false;
// parcours des liens contenus dans le texte riche
var links = org.apache.xpath.XPathAPI.selectNodeList(doc, "//link[@type='page']", doc.getDocumentElement());
for (var i = 0; i < links.getLength(); i++)
{
var linkNeedUpdate = false;
var link = links.item(i);
var href = link.getAttributes().getNamedItem("xlink:href").getNodeValue();
// traitement des liens vers une formation, parcours ou ELP
if (href.indexOf("program://") == 0)
{
// les anciennes url sont de la forme program://art-lettres-langue-ALL/master-lmd-XB/master-design-program-fruai3182988bprh7agzrd6?rootId=page://xxxx&programId=subProgram://yyyy
// ou program://art-lettres-langue-ALL/master-lmd-XB?rootId=page://xxx&programId=program://yyy
var index = href.indexOf('?');
var oldPath = href.substring("program://".length, index);
// println(node.getUUID() + " - "+ href);
var pathSegment = oldPath.split("/");
var newPath;
if (pathSegment.length == 2)
{
newPath = "_root";
linkNeedUpdate = true;
}
else if (pathSegment.length > 2)
{
linkNeedUpdate = true;
newPath = org.apache.commons.lang.StringUtils.join(pathSegment, '/', 2, pathSegment.length);
}
if (linkNeedUpdate)
{
// calcul du nouveau lien
// les nouvelles url sont de la forme program://master-design-program-fruai3182988bprh7agzrd6?rootId=page://xxxx&programId=subProgram://yyyy
// ou program://_root?rootId=page://xxx&programId=program://yyy
var newHref = "program://" + newPath + href.substring(index);
println(href + " \n=>\n " + newHref + "'");
println("");
link.getAttributes().getNamedItem("xlink:href").setNodeValue(newHref);
needUpdate = true;
}
}
else if (href.indexOf("course://") == 0 && href.indexOf("&programId=") == -1)
{
var index = href.indexOf('?');
var oldPath = href.substring("course://".length, index);
var pathSegment = oldPath.split("/");
var newPath;
if (pathSegment.length > 2)
{
// les anciennes url sont de la forme course://art-lettres-langue-ALL/master-lmd-XB/master-design-program-fruai3182988bprh7agzrd6?rootId=xxx&courseId=yyy
newPath = org.apache.commons.lang.StringUtils.join(pathSegment, '/', 2, pathSegment.length);
// course://licence-professionnelle-design-program-fruai3182988bprh7agzrd6?rootId=...
var programName = pathSegment[2].substring (pathSegment[2].indexOf('program-'));
query = qm.createQuery("//" + programName, javax.jcr.query.Query.XPATH);
nodes = query.execute().getNodes();
var program = nodes.hasNext() ? nodes.next() : null;
// calcul du nouveau lien
// les nouvelles url sont de la forme course://master-design-program-fruai3182988bprh7agzrd6?rootId=xxx&courseId=yyy&programId=zzz
var newHref = "course://" + newPath + href.substring(index);
if (program != null)
{
newHref += "&programId=program://" + program.getId();
}
println(href + " \n=>\n " + newHref + "'");
println("");
link.getAttributes().getNamedItem("xlink:href").setNodeValue(newHref);
needUpdate = true;
}
}
}
if (needUpdate)
{
// mise à jour du contenu du texte riche avec les liens modifiés
var os = new java.io.ByteArrayOutputStream();
var result = new javax.xml.transform.stream.StreamResult(os);
var source = new javax.xml.transform.dom.DOMSource(doc);
var transformer = javax.xml.transform.TransformerFactory.newInstance().newTransformer();
var format = new java.util.Properties();
format.put(javax.xml.transform.OutputKeys.METHOD, "xml");
//format.put(javax.xml.transform.OutputKeys.INDENT, "yes");
format.put(javax.xml.transform.OutputKeys.ENCODING, "UTF-8");
//format.put(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "2");
transformer.setOutputProperties(format);
transformer.transform(source, result);
var is = new java.io.ByteArrayInputStream(os.toByteArray());
node.setProperty("jcr:data", is);
is.close();
nodeCount++;
println("\n"+node.getUUID()+"\n");
var content = node.getParent();
// TO UNCOMMENT WHEN READY
//content.save();
if (content.hasProperty("ametys-internal:currentStepId") && content.getProperty("ametys-internal:currentStepId").getLong() == 3)
{
//TO UNCOMMENT WHEN READY
//content.checkin();
//content.checkout();
var versionName = content.getBaseVersion().getName();
content.getVersionHistory().addVersionLabel(versionName, "Live", true);
liveCount++;
}
}
}
catch (e) { println("ERROR: "+node.getPath());}
}
// TO UNCOMMENT WHEN READY
// session.save();
println (nodeCount + " rich text(s) were processed");
println (liveCount + " live rich text(s) were processed");
var qm = session.getWorkspace().getQueryManager();
// récupération de tous les textes riches existants
var query = qm.createQuery("//element(*, ametys:richText)[@jcr:data]", javax.jcr.query.Query.XPATH);
var nodes = query.execute().getNodes();
var nodeCount = 0;
var liveCount = 0;
while (nodes.hasNext())
{
var node = nodes.next();
try
{
// contenu du texte riche
var is = node.getProperty("jcr:data").getStream();
var builder = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();
var doc = builder.parse(is);
is.close();
var needUpdate = false;
// parcours des liens contenus dans le texte riche
var links = org.apache.xpath.XPathAPI.selectNodeList(doc, "//link[@type='page']", doc.getDocumentElement());
for (var i = 0; i < links.getLength(); i++)
{
var linkNeedUpdate = false;
var link = links.item(i);
var href = link.getAttributes().getNamedItem("xlink:href").getNodeValue();
// traitement des liens vers une formation, parcours ou ELP
if (href.indexOf("program://") == 0)
{
// les anciennes url sont de la forme program://art-lettres-langue-ALL/master-lmd-XB/master-design-program-fruai3182988bprh7agzrd6?rootId=page://xxxx&programId=subProgram://yyyy
// ou program://art-lettres-langue-ALL/master-lmd-XB?rootId=page://xxx&programId=program://yyy
var index = href.indexOf('?');
var oldPath = href.substring("program://".length, index);
// println(node.getUUID() + " - "+ href);
var pathSegment = oldPath.split("/");
var newPath;
if (pathSegment.length == 2)
{
newPath = "_root";
linkNeedUpdate = true;
}
else if (pathSegment.length > 2)
{
linkNeedUpdate = true;
newPath = org.apache.commons.lang.StringUtils.join(pathSegment, '/', 2, pathSegment.length);
}
if (linkNeedUpdate)
{
// calcul du nouveau lien
// les nouvelles url sont de la forme program://master-design-program-fruai3182988bprh7agzrd6?rootId=page://xxxx&programId=subProgram://yyyy
// ou program://_root?rootId=page://xxx&programId=program://yyy
var newHref = "program://" + newPath + href.substring(index);
println(href + " \n=>\n " + newHref + "'");
println("");
link.getAttributes().getNamedItem("xlink:href").setNodeValue(newHref);
needUpdate = true;
}
}
else if (href.indexOf("course://") == 0 && href.indexOf("&programId=") == -1)
{
var index = href.indexOf('?');
var oldPath = href.substring("course://".length, index);
var pathSegment = oldPath.split("/");
var newPath;
if (pathSegment.length > 2)
{
// les anciennes url sont de la forme course://art-lettres-langue-ALL/master-lmd-XB/master-design-program-fruai3182988bprh7agzrd6?rootId=xxx&courseId=yyy
newPath = org.apache.commons.lang.StringUtils.join(pathSegment, '/', 2, pathSegment.length);
// course://licence-professionnelle-design-program-fruai3182988bprh7agzrd6?rootId=...
var programName = pathSegment[2].substring (pathSegment[2].indexOf('program-'));
query = qm.createQuery("//" + programName, javax.jcr.query.Query.XPATH);
nodes = query.execute().getNodes();
var program = nodes.hasNext() ? nodes.next() : null;
// calcul du nouveau lien
// les nouvelles url sont de la forme course://master-design-program-fruai3182988bprh7agzrd6?rootId=xxx&courseId=yyy&programId=zzz
var newHref = "course://" + newPath + href.substring(index);
if (program != null)
{
newHref += "&programId=program://" + program.getId();
}
println(href + " \n=>\n " + newHref + "'");
println("");
link.getAttributes().getNamedItem("xlink:href").setNodeValue(newHref);
needUpdate = true;
}
}
}
if (needUpdate)
{
// mise à jour du contenu du texte riche avec les liens modifiés
var os = new java.io.ByteArrayOutputStream();
var result = new javax.xml.transform.stream.StreamResult(os);
var source = new javax.xml.transform.dom.DOMSource(doc);
var transformer = javax.xml.transform.TransformerFactory.newInstance().newTransformer();
var format = new java.util.Properties();
format.put(javax.xml.transform.OutputKeys.METHOD, "xml");
//format.put(javax.xml.transform.OutputKeys.INDENT, "yes");
format.put(javax.xml.transform.OutputKeys.ENCODING, "UTF-8");
//format.put(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "2");
transformer.setOutputProperties(format);
transformer.transform(source, result);
var is = new java.io.ByteArrayInputStream(os.toByteArray());
node.setProperty("jcr:data", is);
is.close();
nodeCount++;
println("\n"+node.getUUID()+"\n");
var content = node.getParent();
// TO UNCOMMENT WHEN READY
//content.save();
if (content.hasProperty("ametys-internal:currentStepId") && content.getProperty("ametys-internal:currentStepId").getLong() == 3)
{
//TO UNCOMMENT WHEN READY
//content.checkin();
//content.checkout();
var versionName = content.getBaseVersion().getName();
content.getVersionHistory().addVersionLabel(versionName, "Live", true);
liveCount++;
}
}
}
catch (e) { println("ERROR: "+node.getPath());}
}
// TO UNCOMMENT WHEN READY
// session.save();
println (nodeCount + " rich text(s) were processed");
println (liveCount + " live rich text(s) were processed");
Auto-complétion sur le moteur de recherche des formations et UE
L'ajout de l'auto-complétion sur le champ de recherche "mots-clés" nécessite la ré-indexation des contenus.