Drupal – 区块开发
     发布在:PHP      浏览:21      评论:0 条评论

摘自: 《Now i code》

上一篇: 《Drupal – 模块开发》

基本概念

Drupal 8 的 block 即是 plugin 也是 entity 。

  1. Plugin API: 提供可重用的 API
  2. Entity API: 处理 block 的位置和可见性控制

一个区块可以显示在多个 region 内。

Block API 见: https://www.drupal.org/docs/8/api/block-api/overview

创建区块

Drupal 8 的所有目录遵循 PSR-4 标准。

  1. hello_world 目录下创建目录 src\Plugin\Block
  2. Block 目录下创建 ExampleBlock.php 文件,内容如下:
<?php
namespace Drupal\hello_world\Plugin\Block;

use Drupal\Core\Block\BlockBase;

/**
 * Provides a 'Hello' Block
 *
 * @Block(
 *   id = "hello_block",
 *   admin_label = @Translation("Hello block"),
 * )
 */
class HelloBlock extends BlockBase {
    /**
     * {@inheritdoc}
     */
    public function build() {
        return array(
            '#markup' => $this -> t('Hello, World!'),
        );
    }
}

上面的代码包含了 @Block 注解:

  1. id: 区块 ID
  2. admin_label: 经过翻译的管理标签
  3. {@inheritdoc}: 告诉系统使用父类的注解

这里我们事先定义了一个非常重要的方法 build,它返回一个可渲染的数组。

访问 admin/structure/block,在任意区域内点击 放置区块 按钮,在弹出的对话框内就可以看到这个新的区块

这样一个简单的可重复使用的区块就完成了。

Drupal - 区块开发

区块配置表单

配置表单允许用户界面设置区块内显示的文本字符串,方法有:

  1. blockForm: 向接收 $form 数组添加元素
  2. blockSubmit: 保存从表单接收的数据
  3. defaultConfiguration: 定义默认的配置值
  4. build: 输出一个渲染数组

src\Plugin\Block 下创建一个文件 HelloBlockConfigurable.php,内容如下:

<?php
/**
 * @file
 * Contains \Drupal\hello_world\Plugin\Block\HelloBlockConfigurable.
 */
namespace Drupal\hello_world\Plugin\Block;

use Drupal\Core\Block\Annotation\Block;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Annotation\Translation;
use Drupal\Core\Form\FormStateInterface;

/**
 * Provides a 'Example: configurable text string' block.
 *
 * Drupal\block\BlockBase gives us a very useful set of basic functionality for
 * this configurable block. We can just fill in a few of the blanks with
 * defaultConfiguration(), blockForm(), blockSubmit(), and build().
 *
 * @Block(
 *   id = "hello_configurable_block",
 *   admin_label = @Translation("Title of first block (example_configurable_test)"),
 *   category = @Translation("Hello")
 * )
 */
class HelloBlockConfigurable extends BlockBase {
    /**
     * {@inheritdoc}
     */
    public function defaultConfiguration() {
        return [
            'example_string' => $this -> t('A default value. This block was created at %time', ['%time' => date('c')]),
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function blockForm($form, FormStateInterface $form_state) {
        $form['example_string_text'] = [
            '#type' => 'textfield',
            '#title' => $this -> t('Block contents'),
            '#size' => 60,
            '#description' => $this -> t('This text will appear in the example block'),
            '#default_value' => $this -> configuration['example_string'],
        ];
        return $form;
    }

    /**
     * {@inheritdoc}
     */
    public function blockSubmit($form, FormStateInterface $form_state) {
        $this -> configuration['example_string'] = $form_state -> getValue('example_string_text');
    }

    /**
     * {@inheritdoc}
     */
    public function build() {
        return [
            '#type' => 'markup',
            '#markup' => $this -> configuration['example_string'],
        ];
    }
}

访问 admin/structure/block 点击区域旁边的配置按钮来配置该表单。

Drupal - 区块开发
Drupal - 区块开发

实践

  1. 按讲义进行练习
  2. 创建一个区块,显示 top N 访问最多的 URL
  3. 创建一个区块,显示 top N 用户列表
  4. 创建一个显示图片广告的区块

注意: N 可配置

Responses