Drupal 7 开发内部培训资料, 分头诗人

在drupal 8 中增加模块,创建区块。

猪跑啦独家原创专稿,欢迎您转载本文,转载请注明来源。

今天花了一点时间,眼睛了一下drupal 8的模块开发。并且分享一下作为例子。

在开发前,我们首先看看在drupal7 下的基本模块是怎么样的。

test.info

; $Id:$
name = Test
description = "Test Module"
package = "Test"
core = 7.x
dependencies[] = node
dependencies[] = some_other_custom_module
files[] = test.module

test.module

<?php 
/*
* Implementation of hook_menu
*/
function test_menu() {
  $items = array();
  $items['test/%'] = array(
    'title' => t('Test'),
    'description' => t('Test'),
    'page callback' => '_test',
    'page arguments' => array(1),
    'access callback' => TRUE,
    'type' => MENU_CALLBACK
  );
  return $items;
}
function _test($variable) {
  $output = $variable;
  return $output;
}
function test_block_info() {
  $block = array();
  $block['test']['info'] = t('Test Block');
  return $block;
}
function test_block_view($delta = '') {
  $block = array();
  switch ($delta) {
    case 'test':
      $block['subject'] = t('Test block');
      $block['content'] = t('Here is the content');
  }
  return $block;
}
?>

在hook_menu 中有看到'test/%',他是一个生成的地址。每个item下都有一个page callback,通过page callback返回数据到地址'test/%'里面显示。

如果有模块依赖,就在.info 里面增加 dependencies[] 就可以。

现在我们来看看drupal8的,首先drupal8没有 modulename.info 文件,而是改用了 modulename.info.yml 文件。

test.info.yml

name: Test
description: Test module
core: 8.x
package: Test
type: module
dependencies
  - node
  - some_other_custom_module

模块依赖的写法有所改变,只需要在前面打一个dependencies,紧接着每行代表一个依赖的模块,每行以 “-” 开头。

test.module

<?php
/**
* Implementation of hook_menu()
*/
function test_menu() {
  $items = array();
  
  $items['test/{variable}'] = array(
    'title' => 'Test',
    'route_name' => 'test_page',
    'type' => MENU_DEFAULT_LOCAL_TASK,
  );
  
  return $items;
}
?>

在drupal7中的百分号代表匹配符,而drupal8中取而代之的是大括号,

Drupal7 ---- “test/%”

Drupal8 ---- "test/{variable}"

还有是,不再需要用page  callback返回,并且多了route_name,test/{variable} 会通过route_name返回。

所以我们要写一个route,文件名是modulename.routing.yml。并且需要定义一个Controller,Controller 是放在lib/Drupal/modulename/Controller/ 下, 如lib/Drupal/modulename/Controller/ControllerName.php

test.routing.yml

test_page:
  path: '/test/{variable}'
  defaults:
    _content: 'Drupal\test\Controller\TestController::testPage'
  requirements:
    _permission: 'access content'

记得 routing_name => 'test_page' 是要跟 test.module 中hook_menu 里面 的route_name的值。

path: '/test/{variable}' 是访问的地址。

'_content' 是返回什么内容。

‘_permission’ 是设置访问权限。

 

最后我们还得创建一个 controller,创建文件夹test/lib/Drupal/test/Controller,并且在test/lib/Drupal/test/Controller里面增加我们的controller文件。我们这里命名为TestController.php

TestController.php

<?php

namespace Drupal\test\Controller;

class TestController {
  
  public function testPage($variable) {
    $build = array(
      '#type' => 'markup',
      '#markup' => t($variable),
    );
    
    return $build;
  }
}

namespace 是命名空间引用。

class 是一个类,类名是TestController,它必须跟test.routing.yml 文件里面的_content: 'Drupal\test\Controller\TestController::testPage' 对应。

好了,后台开启模块,模块开启后,输入地址 http://yoursite/test/it-works, 系统会自动匹配$variable =  (“it-works”),并且在页面打印出 “it-works”,

这就是一个简单的drupal8模块开发。

 

接下来我们来看看如何建立一个区块,在drupal 8里面,区块的定义略有变化,drupal 8把区块当成是一种Plugin方式引入,

方法如下:

先在test模块里面建立文件夹结构:test/lib/Drupal/test/Plugin/Block,

然后在test/lib/Drupal/test/Plugin/Block里面建立第一个block文件,

TestBlock.php

<?php

/**
* @file
* Contains \Drupal\test\Plugin\Block\TestBlock
*/

namespace Drupal\test\Plugin\Block;

use Drupal\block\BlockBase;
use Drupal\block\Annotation\Block;
use Drupal\Core\Annotation\Translation;

/**
* Provides a test block.
*
* @Block(
*  id = "test_block",
*  admin_label = @Translation("Test Block")
* )
*/
class TestBlock extends BlockBase {
  /**
   * {@inheritdoc}
   */
  public function build() {
    $this->configuration['label'] = t('Test block');
    return array(
      '#children' => t('Here is the content'),
    );
  }
}

这也是一个类的方式,TestBlock继承BlockBase类,保存并清空缓存,在structure里面找到block 页,会看到我们新建的block,可以把它拉到某个区域看看效果。

 

整过模块开发过程与drupal7改变蛮大的,drupal8是基于symfony2的,主要是使用symfony2的方式,所以如果你对symfony2熟悉的话,这些很容易就明白了。