jgraf
I'm new here

Advanced URL-Creator / Factory

Hallo,

ich habe folgende Anforderung:

the customer need a own URL Creator with following requirements:

  • "/privat/" should be replaced with "/" on the whole website
  • "/index.jsp" should be replaced with "/" on the whole website

Also habe ich für den ersten Punkt den Code so modifiziert dass /privat/ ersetzt wird und funktioniert.

Siehe hier:

@Override
public String getUrl(final ContentProducer contentProducer, final TemplateSet templateSet, final Language language, final PageParams pageParams) {

   final String name = getName(contentProducer, templateSet, language, pageParams);

   final String extension = contentProducer.getExtension(templateSet);

   int len = name.length();

   if (extension.length() > 0) {

  len += extension.length();

  len++;

  }

   final StringBuilder buffer = new StringBuilder(0);

   final String path = this._pathLookup.lookupPath(contentProducer, language, templateSet);

   if (path != null) {

  buffer.ensureCapacity(len + path.length() + 2);

  buffer.append('/');

   if (path.length() > 0) {

  buffer.append(path);

  buffer.append('/');

  }

  } else {

  collectPath(contentProducer.getParent(), language, templateSet, len, buffer);

  }

  buffer.append(name);

   if (extension.length() > 0) {

  buffer.append('.');

  buffer.append(extension);

  }

  String result = buffer.toString();

  result = result.replaceFirst("/privat/", "/");

   return result;

}

Für den zweiten Punkt steht in der Dokumentation:

stripWelcomeFileNames

Der Parameter „stripWelcomeFileNames“ ist nur relevant, wenn die verwendete URL-Pfadstrategie auch den Konfigurationsparameter useWelcomeFileNames
verwendet. Mithilfe des Parameters „stripWelcomeFileNames“ kann die
durch „useWelcomeFileNames“ ergänzte Extension „/index.*“ aus der
Advanced URL entfernt werden (aber nicht aus dem Dateinamen, unter dem
die Seite im Dateisystem abgelegt wird).

factorySettings = new HashMap(); 
factorySettings.put("usewelcomefilenames", "true"); 
factorySettings.put("stripwelcomefilenames", "true"); 
context.setProperty("#urlCreatorSettings", factorySettings); 

Funktioniert auch mit "index.html"

Eine weitere Anmerkung besagt:

Die Referenzimplementierung AdvancedUrlFactory unterstützt die

Funktionalität „stripWelcomeFileNames“ nur für Dateierweiterung vom Typ

„html“. Sollen weitere Dateiendungen unterstützt werden, muss die

Referenzimplementierung projektspezifisch angepasst werden

OK, für "index.jsp" muss ich es wohl selbst implementieren und habe folgendes angepasst:

private String getName(final ContentProducer contentProducer, final TemplateSet templateSet, final Language language, final PageParams pageParams) {

   if (((contentProducer instanceof PageRef)) && ((pageParams instanceof ContentMultiPageParams.ContentPageParams)) && (pageParams.getSize() == 1)) {

   final Content2Params content2Params = ((PageRef) contentProducer).getContent2Params();

   if (content2Params != null) {

  String varName = content2Params.getSitemapVariableName();

   if (varName != null) {

   if (varName.endsWith("*")) {

  varName = varName.substring(0, varName.length() - 1);

  }

   final ContentMultiPageParams.ContentPageParams contentPageParams = (ContentMultiPageParams.ContentPageParams) pageParams;

   final List<Entity> list = contentPageParams.getData();

   if (list.size() > 0) {

   final Entity entity = list.get(0);

   final String result = ContentUtil.resolve(entity, varName, language, null);

   if ((result != null) && (!result.isEmpty())) {

   return cleanup(result);

  }

  }

  }

  }

  }

   if ((this._welcomeFileMode != WelcomeFileMode.DISABLED) && (("html".equals(templateSet.getExtension()))||("jsp".equals(templateSet.getExtension()))) && (pageParams.getIndex() == 0) && (!(pageParams instanceof ContentMultiPageParams.ContentPageParams))) {

   final SiteStoreFolder folder = (SiteStoreFolder) contentProducer.getParent();

   if ((folder != null) && (contentProducer.equals(folder.getStartNode())) && (createIndexFile(templateSet, contentProducer.getProject()))) {

   return "index";

  }

  }

   final String name = getName(contentProducer, language);

   final String pageSuffix = pageParams.getPageSuffix();

   if (pageSuffix.length() > 0) {

   return name + '_' + pageSuffix;

  }

   return name;

}

private boolean createIndexFile(final TemplateSet templateSet, final Project project) {

   if (this._welcomeFileMode == WelcomeFileMode.FOR_ALL_HTML_CHANNELS) {

   return true;

  }

   for (final TemplateSet set : project.getTemplateSets()) {

   if ("html".equals(set.getExtension())) {

   return templateSet.equals(set);

  }

   if ("jsp".equals(set.getExtension())) {

   return templateSet.equals(set);

  }

  }

   return false;

}

Leider ohne Erfolg.

Hat jemand eine Idee was ich noch anpassen/ändern muss ?

Viele Grüße

Joachim Graf

6 Replies
tenter
I'm new here

Hallo Joachim,

erst einmal Danke für deine Geduld Smiley Happy

Die Implementierung sieht soweit erstmal richtig aus und sollte nach unserem Verständnis auch das tun, was du möchtest. Wir haben intern ein wenig geforscht und konnten (teilweise gelöste) Bugreports zu diesem oder ähnlichen Umständen finden. Allerdings ist das ganze für uns so ohne Weiteres nicht durchschaubar. Würdest du dich mit dem Problem bitte bei unserem Technical Support melden?

Grüße,

Hannes

0 Kudos
gpadesso
I'm new here

Hallo zusammen,

auch in meinem Projekt gibt es die Anforderung alle Index-Seiten (index.html, index.jsp, index.php, ...) aus dem HTML-Kanal beim verlinken durch "/" zu ersetzen. Konnte der Support eine Lösung anbieten?

Viele Grüße

Georg

0 Kudos

Das Problem konnte ich inzwischen selber lösen, indem mein URL-Creator zusätzlich zum de.espirit.firstspirit.generate.UrlFactory- auch noch das de.espirit.firstspirit.generate.FilenameFactory-Interface implementiert. Durch einen entsprechenden zusätzlichen Eintrag in der module.xml, wird die Klasse für die Dateinamensgenerierung herangezogen. Somit können URLs und zugehörige Dateinamen den eigenen Wünschen entsprechend und unabhängig von einander gebildet werden.

Hallo gpadesso,

was muss man in die module.xml reinschreiben damit das funktioniert?

Viele Grüße

Dorota

0 Kudos

Hallo Georg,

ja, ich habe einen ähnlichen Usecase - mich würde auch interessieren, was genau man noch in die module.xml schreiben muss, wenn man die FilenameFactory implementiert.
Oder kann mir jemand von e-Spirit helfen? Das ist in der Doku nicht so toll dokumentiert..

Danke und Gruß,

Benny Kannengießer

0 Kudos

Ok ich nehme alles zurück, hab's in der Doku gefunden:

<configuration>  ...  <FilenameFactory>examples.urlfactory.FilenameFactoryExample</FilenameFactory> </configuration>

Gruß,

Benny

0 Kudos