跳转到主要内容

Drupal 8 核心 bug: Views创建menu tab时无视参数验证

当用views创建page时,定义像'node/%node/foo'这样的路径,然后创建一个menu tab,在context filter里提供当前node页面的id作为默认参数,并开启参数验证:node type必须为article等。

当访问node/123/foo时,如果该node type不是article,会返回404等(根据设置),但menu tab依旧存在。

相关issue链接:

View argument validators are not taken into account in access checks

Views argument validators aren't taken into account on access checks - local task point to 404

暂时未有完美的patch,已推后至计划在drupal8.8.x-dev版本解决。

Drupal 8 如何定义动态路由?

动态路由,即'/node/{node}/edit'这样的路径。

官方文档:Structure of routes

例子:my_module.routing.yml

round_robin.content:
  path: '/node/{node}/round-robin'
  defaults:
    _controller: '\Drupal\round_robin\Controller\RoundRobinController::content'
    _title_callback: '\Drupal\round_robin\Controller\RoundRobinController::title'
  requirements:
    _entity_access: 'node.update'
    node: ^\d+$
  options:
    parameters:
      node:
        type: 'entity:node'

简单解释:

Drupal 8 的简单表格显示例子

有时候调试数据,需要表格呈现时,可参照以下例程。

  public function generate() {
    $teams = ['曼联', '曼城', '阿仙奴', '巴塞', '皇马', '拜仁'];
    $schedule = schedule($teams);
    $tables = [];
    foreach ($schedule as $key => $round) {
      $content = array(
        '#type' => 'table',
        '#sticky' => FALSE,
        '#header' => ['A队', 'B队'],
      );
      $rows = [];
      foreach($round as $match) {
        $rows[] = array($match[0], $match[1]);
      }
      $content['#rows'] = $rows;
      $tables[] = $content;
    }

    return $tables;
  }

比赛管理模块试用比较

Tournament Bracket(过时,不支持现在版本的php)

Tournament:这是一个基于用户互动的比赛管理模块,后台创建一个比赛后,用户可以加入比赛和挑战其它对手。

Sports League:纯后台发布信息的功能,数据设计非常完善,但录入数据比较繁琐,连关联内容都要手动输入node id。适合用来做二次开发。

League: Online Tournament Manager:这是我试过最实用的比赛管理模块。可以管理赛事、队伍、队员、比赛事件、赛果,自动计算积分排行榜。作者号称通过结合og模块,能支持多赛事管理,可惜试用过程中发现程序有严重的bug,og功能用不起来。对于单个赛事管理是可以开箱即用,支持循环赛、淘汰赛。

Drupal 8 核心 bug: 多图上传时会导致系统保存的图片尺寸混乱

Multiple image upload breaks image dimensions

现象:drupal 8核心的image field支持圈选多个图片上传,但图片保存时,只会以第一张图片的尺寸为准。如果圈选的图片大小甚至比例不一的话,后续的图片保存时是错误的尺寸(都是第一张图的尺寸)。

解决方案:打补丁,或等待drupal 8 核心修复

临时方案:image_field_repair会对已保存的图片逐一校对,重新写入正确的尺寸。

 

Drupal核心autocomplete功能出错

一些nginx服务器的配置硬性隐藏了index.php,导致drupal的autocomplete功能出错(返回404)。

临时解决方法:

修改includes/form.inc

- $element['#autocomplete_input']['#url_value'] = url($element['#autocomplete_path'], array('absolute' => TRUE, 'script' => 'index.php'));

+ $element['#autocomplete_input']['#url_value'] = url($element['#autocomplete_path'], array('absolute' => TRUE));

field_collection与multifield的简单对比

field_collection比较完美地实现了子字段的使用,但由于collection是通过entity+field实现的,据说有性能问题,还带来了数据迁移时的复杂性。drupal的entity+field可以被理解为扁平化结构的数据表,在扁平化结构中记录父子关系,对于复杂的数据查询是比较难构建的。试想一下,要提取某个node的所有field,首先得先将各个子字段表join到父字段(其实是个entity)表,再join到node表,还要join上其它非collection的field表。

multifield简化了field_collection的数据存储方式,尽管也是通过entity+field实现,在数据库中它同样建立的子字段对应的数据表,但里面都是空的——而所有子字段都放入同一个数据表中,这样的话至少查询子字段时比较方便,免去子字段与父字段的联合查询(join)。