区块系统,一直是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实现的。
而里面的逻辑,则和原来的差不多。