Grav 插件教程



本章我们将深入探讨如何设置和配置插件。此外,我们还将了解插件的结构以及如何显示随机页面。插件是一段软件,它提供Grav核心功能原本未包含的附加功能。

在本文中,我们将使用random插件来显示随机页面。在使用此插件之前,我们将了解random插件的一些重要点。

  • 您可以使用此插件通过URI /random 来显示随机页面。

  • 创建过滤器以利用页面中指定的分类法。您可以创建如下分类:category : blog

  • 您可以使用过滤器选项显示随机页面;这指示Grav使用要在随机页面中显示的相同内容。

插件设置

在使用实际插件之前,请按照以下步骤创建插件的基本设置。

  • user/plugins文件夹下创建一个名为random的文件夹。

  • user/plugins/random文件夹下,创建两个文件:

    • random.php 用于插件代码

    • random.yaml 用于配置

插件配置

要使用random插件,我们需要一些配置选项。我们将在random.yaml文件中写入以下几行。

enabled:true
route:/random
filters:
   category:blog

Random 创建一个您定义的路由。基于分类法过滤器,它会随机选择一个项目。过滤器的默认值为'category: blog',用于随机选择。

插件结构

以下代码可用于插件结构。

<?php
   namespace Grav\Plugin;
   use Grav\Common\Page\Collection;
   use Grav\Common\Plugin;
   use Grav\Common\Uri;
   use Grav\Common\Taxonomy;
   
   class RandomPlugin extends Plugin {
   }
?>

我们使用use语句在插件中使用了一组类,这使得代码更易读,也节省了空间。必须在PHP文件的顶部编写namespace Grav\Plugin。插件名称应使用标题大小写编写,并应使用Plugin扩展。

您可以将函数getSubscribedEvents()订阅到onPluginsInitialized事件;这决定了插件订阅了哪些事件。这样,您可以使用该事件订阅其他事件。

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

现在让我们在RandomPlugin类下使用onPluginInitialized事件,该类用于路由在random.yaml文件中配置的页面。

方法onPluginInitialized()包含以下代码:

public function onPluginsInitialized() {
   $uri = $this->grav['uri'];
   $route = $this->config->get('plugins.random.route');
   
   if ($route && $route == $uri->path()) {
      $this->enable([
         'onPageInitialized' => ['onPageInitialized', 0]
      ]);
   }
}

Uri对象包含当前uri,关于路由的信息。config对象指定random插件路由的配置值,并将其存储在route对象中。

现在我们将配置的路由与当前URI路径进行比较,这通知插件监听onPageInitialized事件。

显示随机页面

您可以使用以下方法的代码显示随机页面:

public function onPageInitialized() {
   $taxonomy_map = $this->grav['taxonomy'];
   $filters = (array) $this->config->get('plugins.random.filters');
   $operator = $this->config->get('plugins.random.filter_combinator', 'and');
   
   if (count($filters)) {
      $collection = new Collection();
      $collection->append($taxonomy_map->findTaxonomy($filters, $operator)->toArray());
      
      if (count($collection)) {
         unset($this->grav['page']);
         $this->grav['page'] = $collection->random()->current();
      }
   }
}

如代码所示:

  • 将分类法对象赋值给变量$taxonomy_map

  • 获取使用插件配置中配置的分类法的过滤器数组,使用config对象。我们使用项目为category : blog

  • 我们使用collection将随机页面存储在$collection中。将匹配过滤器的页面附加到$collection变量。

  • 取消设置当前页面对象,并将当前页面设置为在集合中显示为随机页面。

最后,我们将看到如下所示的完整插件代码,用于显示随机页面:

<?php
namespace Grav\Plugin;
use Grav\Common\Page\Collection;
use Grav\Common\Plugin;
use Grav\Common\Uri;
use Grav\Common\Taxonomy;

class RandomPlugin extends Plugin {
   public static function getSubscribedEvents() {
      return [
         'onPluginsInitialized' => ['onPluginsInitialized', 0],
      ];
   }
   public function onPluginsInitialized() {
      $uri = $this->grav['uri'];
      $route = $this->config->get('plugins.random.route');
      if ($route && $route == $uri->path()) {
         $this->enable([
            'onPageInitialized' => ['onPageInitialized', 0]
         ]);
      }
   }
   public function onPageInitialized() {
      $taxonomy_map = $this->grav['taxonomy'];
      $filters = (array) $this->config->get('plugins.random.filters');
      $operator = $this->config->get('plugins.random.filter_combinator', 'and');
      
      if (count($filters)) {
         $collection = new Collection();
         $collection->append($taxonomy_map->findTaxonomy($filters, $operator)->toArray());
         
         if (count($collection)) {
            unset($this->grav['page']);
            $this->grav['page'] = $collection->random()->current();
         }
      }
   }
}

打开您的浏览器并输入localhost/folder_name/random以查看随机页面,如下面的屏幕截图所示:

Grav Plugin Tutorials
广告