Grav CMS:在页面选择列表中隐藏模块化页面

Grav CMS: Hide modular pages in page selection lists

我正在从事一个使用大量模块化页面的项目。
因此,自然地,列出所有页面的下拉列表(例如,在选择a parent page 时,创建a 新页面)会变得非常膨胀。真没用。

我编辑了 /user/plugins/admin/themes/grav/templates/forms/fields/pages/pages.html.twig 以防止呈现模块化页面。

原代码(第 12 行):

{% for page_route, option in pages_list %}
    <option {% if page_route == value or (field.multiple and page_route in value) %}selected="selected"{% endif %} value="{{ page_route }}">{{ option|raw }}</option>
{% endfor %}

我的代码:

{% for page_route, option in pages_list %}
    {% if page_route|split('/')|last matches '/^(?!_).*/' %}
         <option {% if page_route == value or (field.multiple and page_route in value) %}selected="selected"{% endif %} value="{{ page_route }}">{{ option|raw }}</option>
    {% endif %}
{% endfor %}

所以这很好用,并且隐藏了下拉列表中的所有模块化页面。 不幸的是,我担心这可能会被下一个管理插件更新覆盖。

我很想创建一个插件,强制管理插件使用我的模板,而不是乱用原始模板,但我不知道该怎么做。有可能吗?

谢谢!

我发现了一些东西:https://github.com/OleVik/grav-plugin-adminidenticons
它覆盖了部分管理插件。

第 1 步:创建插件

有很多教程如何做到这一点。
我的插件文件夹中有以下文件结构:

user/plugins
-- myplugin
---- blueprints.yaml
---- myplugin.php
---- myplugin.yaml

第 2 步:复制文件

/user/plugins/admin/themes/grav/templates/forms/fields/pages/pages.html.twig/user/plugins/myplugin/admin/themes/grav/templates/forms/fields/pages/pages.html.twig

/user/plugins/admin/themes/grav/templates/partials/blueprints-new.html.twig/user/plugins/myplugin/admin/themes/grav/templates/partials/blueprints-new.html.twig

不要忘记将我上面发布的片段添加到复制的 pages.html.twig 中。你可以不编辑 blueprints-new.html.twig,但是你需要在你的插件文件夹中使用部分文件来让 Twig 加载本地文件 pages.html.twig.

第 3 步:PHP

编辑myplugin.php

<?php
namespace Grav\Plugin;

use Grav\Common\Grav;
use Grav\Common\Plugin;
use Grav\Common\Page\Page;
use RocketTheme\Toolbox\Event\Event;

class MyPluginPlugin extends Plugin
{
    public static function getSubscribedEvents() {
        return [
            'onPluginsInitialized' => ['onPluginsInitialized', 0],
        ];
    }

    public function onPluginsInitialized()
    {
        /** @var Uri $uri */
        $uri = $this->grav['uri'];
        $route = $this->config->get('plugins.admin.route');

        if ($route && preg_match('#' . $route . '#', $uri->path())) {
            $this->enable([
                'onPageInitialized' => ['onPageInitialized', 0],
                'onAdminTwigTemplatePaths' => ['onAdminTwigTemplatePaths', 0]
            ]);
        }
    }

    /**
     * Load custom CSS into backend
     *
     */
    public function onPageInitialized()
    {
        $assets = $this->grav['assets'];
        $assets->addCss('user/plugins/myplugin/style/custom-backend.css', 1);
    }

    /**
     * Register templates and page
     *
     * @param RocketTheme\Toolbox\Event\Event $event Event handler
     *
     * @return array
     */
    public function onAdminTwigTemplatePaths($event)
    {
        $event['paths'] = array_merge(
            $event['paths'],
            [__DIR__ . '/admin/themes/grav/templates']
        );
        return $event;
    }
}

奖励:隐藏独特的页面模板

有时,您创建的页面模板应该只在一个页面上使用一次。正如 Grav 的工作方式一样,它们在创建新页面时仍会出现在列表中。当然,您不希望您的编辑对页面模板发挥创意,因此最好隐藏它们。

如果您实际上也在阅读复制粘贴的代码,您会注意到,有一个函数 onPageInitialized(),它将 CSS 文件加载到后端。

更新您的文件:

user/plugins
-- myplugin
---- style
------ custom-backend.scss
------ custom-backend.css
---- blueprints.yaml
---- myplugin.php
---- myplugin.yaml

编辑custom-backend.scss

// hide unique templates
.selectize-dropdown-content {
    .option {
        $hide_values: "this-template", "home", "that-template";

        @each $current_value in $hide_values {
            &[data-value="#{$current_value}"] {
                display: none;
            }
        }
    }
}

$hide_values设置为您要在后台隐藏的页面模板。我使用 CSS,这样您就可以在需要时使用浏览器检查器重新启用它们。当然,别忘了编译你的SCSS.

我知道这变成了一个完整的教程,但是让模块化页面乱扔页面列表实际上是我现在在多个项目中遇到的问题,而且我从未在网上找到任何东西。不幸的是,我真的没有办法正确地发布它,所以我希望有一天有人会偶然发现这个问答并将它放在它所属的一些博客上。

谢谢!