8
votes

À Freemarker, est-il possible de vérifier si un fichier existe avant de l'inclure?

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 xxx

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.

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.

Nous avons donc besoin d'une des deux choses:

  1. n'appelle pas l'inclusion si le fichier n'existe pas - donc la nécessité de vérifier l'existence de fichiers.

    -or -

    1. Un moyen d'empêcher la journalisation de l'erreur dans le bloc de récupération sans modifier la journalisation pour empêcher toutes les erreurs de Freemarker de s'afficher.

3 commentaires

Cela ne répond pas directement à votre question, mais avez-vous envisagé d'utiliser un Templateloader personnalisé à 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.


5 Réponses :


-2
votes

Essayez ceci pour obtenir le chemin de base: xxx

puis pour marcher la structure de répertoire: xxx


1 commentaires

Cette solution ne peut pas résoudre le chemin de fichier, tombe toujours dans la branche Else



0
votes

J'ai aussi eu ce besoin exact, mais je ne voulais pas utiliser ObjectConstructor de Freemarker Code> (c'était trop semblable à un écriture à mon goût).

J'ai écrit une coutume FileemplateLoader : p>

<#macro optional_include name>
    <#include "/optional:" + name>
</#macro>


0 commentaires

2
votes

solution plus facile serait: xxx


0 commentaires

1
votes

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());
            }
        }
    }
}


0 commentaires

0
votes

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>


0 commentaires