Nous essayons de créer un système à FreeMarker lorsque des fichiers d'extension peuvent être éventuellement ajoutés pour remplacer les blocs du gabarit standard.
Nous sommes arrivés à ce point p> donc - si le fichier d'extension.ftl existe, il sera utilisé, sinon la pièce à l'intérieur du bloc de récupération est sortie. p> Le problème avec c'est que Freemarker enregistre toujours l'erreur qui a entraîné la gâchette du bloc de récupération. P> Nous avons donc besoin d'une des deux choses: p> -or - p>
5 Réponses :
Essayez ceci pour obtenir le chemin de base: puis pour marcher la structure de répertoire: p>
Cette solution ne peut pas résoudre le chemin de fichier, tombe toujours dans la branche Else
J'ai aussi eu ce besoin exact, mais je ne voulais pas utiliser J'ai écrit une coutume FileemplateLoader : p> ObjectConstructor de Freemarker Code> (c'était trop semblable à un écriture à mon goût).
<#macro optional_include name>
<#include "/optional:" + name>
</#macro>
solution plus facile serait:
Nous avons écrit une macro personnalisée qui résout ceci pour nous. Au début des tests, cela fonctionne bien. Pour y inclure, ajoutez quelque chose comme ceci (où mm est une modélisation de ressort):
import java.io.IOException; import java.util.Map; import org.apache.commons.io.FilenameUtils; import freemarker.cache.TemplateCache; import freemarker.cache.TemplateLoader; import freemarker.core.Environment; import freemarker.template.TemplateDirectiveBody; import freemarker.template.TemplateDirectiveModel; import freemarker.template.TemplateException; import freemarker.template.TemplateModel; /** * This macro optionally includes the template given by path. If the template isn't found, it doesn't * throw an exception; instead it renders the nested content (if any). * * For example: * <@include_if_exists path="module/${behavior}.ftl"> * <#include "default.ftl"> * </@include_if_exists> * * @param path the path of the template to be included if it exists * @param nested (optional) body could be include directive or any other block of code */ public class IncludeIfExistsMacro implements TemplateDirectiveModel { private static final String PATH_PARAM = "path"; public static final String MACRO_NAME = "include_if_exists"; @Override public void execute(Environment environment, Map map, TemplateModel[] templateModel, TemplateDirectiveBody directiveBody) throws TemplateException, IOException { if (! map.containsKey(PATH_PARAM)) { throw new RuntimeException("missing required parameter '" + PATH_PARAM + "' for macro " + MACRO_NAME); } // get the current template's parent directory to use when searching for relative paths final String currentTemplateName = environment.getTemplate().getName(); final String currentTemplateDir = FilenameUtils.getPath(currentTemplateName); // look up the path relative to the current working directory (this also works for absolute paths) final String path = map.get(PATH_PARAM).toString(); final String fullTemplatePath = TemplateCache.getFullTemplatePath(environment, currentTemplateDir, path); TemplateLoader templateLoader = environment.getConfiguration().getTemplateLoader(); if (templateLoader.findTemplateSource(fullTemplatePath) != null) { // include the template for the path, if it's found environment.include(environment.getTemplateForInclusion(fullTemplatePath, null, true)); } else { // otherwise render the nested content, if there is any if (directiveBody != null) { directiveBody.render(environment.getOut()); } } } }
Vous pouvez utiliser également une méthode Java pour vérifier le fichier existant ou non.
Méthode Java - P>
<#assign fileExists = (Static["ClassName"].checkFileExistance("Filename"))?c/> <#if fileExists = "true"> <#include "/home/demo.ftl"/> <#else> <#include "/home/index.ftl"> </#if>
Cela ne répond pas directement à votre question, mais avez-vous envisagé d'utiliser un
Templateloader personnalisé code> à la place? par exemple. Freemarker.org/docs/api/ Freemarker / Modèle / ...
Résolu de la [Directive définie par l'utilisateur définie par l'utilisateur de Freemarker [1] Vous pouvez essayer. [1]: Stackoverflow.com/questions/13908848/...
J'aimerais pouvoir fermer cette question - je ne peux accepter aucune des réponses parce que je ne suis plus sur ce projet, donc je ne sais pas si elles travaillent ou non. Désolé pour ça.