onderka.com

Grav-Plugin "File Exists"

Ein Grav-Plugin zur Prüfung auf die Existenz einer Datei

Diese Plugin bietet über die PHP-Funktion file_exists() die Möglichkeit, in einem Twig-Template z.B. ein Header-Bild anzuzeigen, wenn die Bilddatei im Ordner der aktuellen Seite existiert. ebenso kann eine extern generierte (Include-)Datei eingebunden wird, wenn sie vorhanden ist.

Das Plugin reicht die bool-Rückgabe (true/false) der PHP-Funktion 1:1 weiter, so dass im Twig mit if auf einfache Art geprüft werden kann.

Lesestoff

Ordner- und Dateistruktur

Lesen, verstehen, Pfade kontrollieren und anpassen

Das Plugin benötigt nur 2 Ordner und vier Dateien, die Pfadangaben relativ zum Grav-Wurzelverzeichnis sind:

Ordner user/plugins/file-exists/
Ordner user/plugins/file-exists/twig/

Datei  user/plugins/file-exists/blueprints.yaml
Datei  user/plugins/file-exists/file-exists.php
Datei  user/plugins/file-exists/file-exists.yaml
Datei  user/plugins/file-exists/twig/FileExistsTwigExtension.php

Datei blueprints.yaml

Diese Datei enthält die Informationen zum Plugin

name: File Exists
type: plugin
slug: fileexists
version: 1.0.0
description: "Provides a function to see if a file exists (e.g. 'if file_exists(file)')"
icon: map-marker
author:
  name: Stefan Onderka
  email: stefan@onderka.com
  url: https://www.onderka.com/computer-und-netzwerk/grav-plugin-file_exists

Datei file-exists.php

Die Grundstruktur des Plugins, mit der das Plugin definiert wird

<?php
namespace Grav\Plugin;
use \Grav\Common\Plugin;
class FileExistsPlugin extends Plugin
{
    public static function getSubscribedEvents()
    {
        return [
            'onTwigExtensions' => ['onTwigExtensions', 0]
        ];
    }
    public function onTwigExtensions()
    {
        require_once(__DIR__ . '/twig/FileExistsTwigExtension.php');
        $this->grav['twig']->twig->addExtension(new FileExistsTwigExtension());
    }
}

Datei file-exists.yaml

Die Konfigurationsdatei des Plugins, speichert lediglich ob es aktiviert ist

enabled: true

Nach installation und Aktivierung ist das Plugin im Grav Plugin-Manager zu sehen:

Datei twig/FileExistsTwigExtension.php

Die eigentlich Funktions-Definition von fileExists, die PHP file_exists() ausführt

<?php
namespace Grav\Plugin;
class FileExistsTwigExtension extends \Twig_Extension
{
    public function getName()
    {
        return 'FileExistsTwigExtension';
    }
    public function getFunctions()
    {
        return [
            new \Twig_SimpleFunction('file_exists', [$this, 'fileExists'])
        ];
    }
    public function fileExists($file)
    {
        return file_exists($file);
    }
}

Nach dem manuellen Anlegen dieser Ordner und Dateien ein chown www-data:www-data user/plugins/file-exists/ -R nicht vergessen

Anwendung des Plugins

Um an einer Stelle im Theme z.B. die Datei _header.jpg einzubinden, falls diese im Ordner der aktuellen Seite vorhanden ist, kann folgender Code im Twig-Template verwendet werden:

{# Needs plugin "File Exists" (https://github.com/noppingen/grav-plugin-file_exists) #}
{% set current_path = page.path() %}
{% if file_exists(current_path ~ "/_header.jpg") %}
    <img title='Header - {{ page.title }}' src='{{ page.url }}/_header.jpg'>
{% endif %}

Dieser Code wird auch auf meinen Seiten verwendet.

Lösung ohne Plugin

Eine Lösung (für Bilder/Medien der aktuellen Seite, die sich innerhalb der Grav-Ordnerstruktur befinden) ohne Plugin ist mit dem folgenden Code möglich:

{% set header_image = page.media['_header.jpg'] %}
{% if header_image %}
    <img title='Header - {{ page.title }}' src='{{ page.url }}/_header.jpg'>
{% endif %}

Links

Andere Seiten unter 'Computer und Netzwerk'