You are here

区块:实体 VS 插件?(Drupal8系列)

区块系统,一直是Drupal里面的最重要的组成部分,随着技术的发展,尤其是有了CCK模块以后,Drupal用户,很多人希望能够使用CCK扩展区块。其中的一种解决方案,就是把区块处理成为一种节点,这是Drupal6下的解决办法。

到了Drupal7,区块系统并没有升级到实体,但是有第3方模块,BEAN,可以将区块处理成为实体。将区块处理成为实体,是一种趋势。

我们这里所说的,是自定义区块,就是通过Drupal后台创建的区块,我们知道,第3方模块,通过代码也是可以创建区块的,这些通过代码创建的区块,在Drupal7下,是通过钩子函数出现的,在Drupal8下,需要将其改造为插件的形式。

因此,在Drupal8下,通过代码,也就是说通过插件可以定义区块;而对于Drupal后台创建的区块,则是实体的形式,这是通过区块模块的子模块custom_block实现的。

因此,可以说区块既是实体,又是插件。当然这样说还是有点问题的。改造为实体以后,很多相关的第3方模块,将会消失,比如说我开发的block_morelink模块,在Drupal8下,就没有多少实际用处了,除了教学以外。

是的,每一个Drupal主板本的问世,都意味着一大批的第3方模块的消失、淘汰。同时也意味着,一大批新的模块的兴起。

我们最后,来看一下Drupal登录区块,在Drupal8下面的实现:

<?php

 

/**

 * @file

 * Contains \Drupal\user\Plugin\block\block\UserLoginBlock.

 */

 

namespace Drupal\user\Plugin\block\block;

 

use Drupal\block\BlockBase;

use Drupal\Component\Annotation\Plugin;

use Drupal\Core\Annotation\Translation;

 

/**

 * Provides a 'User login' block.

 *

 * @Plugin(

 *   id = "user_login_block",

 *   admin_label = @Translation("User login"),

 *   module = "user"

 * )

 */

class UserLoginBlock extends BlockBase {

 

  /**

   * Overrides \Drupal\block\BlockBase::blockAccess().

   */

  public function blockAccess() {

    return (!$GLOBALS['user']->uid && !(arg(0) == 'user' && !is_numeric(arg(1))));

  }

 

  /**

   * Implements \Drupal\block\BlockBase::blockBuild().

   */

  protected function blockBuild() {

    $form = drupal_get_form('user_login_form');

    unset($form['name']['#attributes']['autofocus']);

    unset($form['name']['#description']);

    unset($form['pass']['#description']);

    $form['name']['#size'] = 15;

    $form['pass']['#size'] = 15;

    $form['#action'] = url(current_path(), array('query' => drupal_get_destination(), 'external' => FALSE));

    // Build action links.

    $items = array();

    if (config('user.settings')->get('register') != USER_REGISTER_ADMINISTRATORS_ONLY) {

      $items['create_account'] = l(t('Create new account'), 'user/register', array(

        'attributes' => array(

          'title' => t('Create a new user account.'),

          'class' => array('create-account-link'),

        ),

      ));

    }

    $items['request_password'] = l(t('Request new password'), 'user/password', array(

      'attributes' => array(

        'title' => t('Request new password via e-mail.'),

        'class' => array('request-password-link'),

      ),

    ));

    return array(

      'user_login_form' => $form,

      'user_links' => array(

        '#theme' => 'item_list',

        '#items' => $items,

      ),

    );

  }

 

}

 

这里的插件的声明定义方式,是通过Annotation完成的,也就是:

/**

 * Provides a 'User login' block.

 *

 * @Plugin(

 *   id = "user_login_block",

 *   admin_label = @Translation("User login"),

 *   module = "user"

 * )

 */

而所有的区块,大部分都继承自BlockBase,区块的访问控制是通过blockAccess完成的,区块内容的构建,是通过blockBuild实现的。

而里面的逻辑,则和原来的差不多。

论坛:

Drupal版本: