makinacorpus/drupal-udashboard

Drupal的高级仪表板API

安装: 207

依赖者: 0

建议者: 0

安全性: 0

星级: 2

关注者: 14

分支: 2

开放问题: 7

类型:drupal-module

1.0.3 2017-07-05 08:29 UTC

README

此初始版本是来自https://github.com/makinacorpus/drupal-ucms Drupal模块套件的ucms_dashboard的原始导出。只更改了命名空间,并将一些实用函数从ucms_contrib模块移动出来。

它应该足够稳定,可以使用。

安装

它严重依赖于makinacorpus/drupal-sf-dic,最简单的安装方法是

composer install makinacorpus/drupal-udashboard

配置

运行时配置

启用顶部工具栏

$conf['udashboard.context_pane_enable'] = true;

启用上下文面板

$conf['udashboard.context_pane_enable'] = true;

启用管理页面面包屑修改

这是一个用于UCMS的具体设置。

$conf['udashboard.breadcrumb_alter'] = true;

显示配置

禁用自定义CSS

如果您希望将此模块的CSS或自定义LESS嵌入到自己的自定义主题中,您可能希望禁用CSS加载

$conf['udashboard.disable_css'] = true;

Drupal七主题修复

将此设置为true,将始终包含七个修复

$conf['udashboard.seven_force'] = true;

将其设置为false,则始终删除。

删除变量或将其设置为null,则在运行时将自动检测七个管理主题,并在必要时加载修复。

用法

哲学

此模块采用SOLID原则的哲学,为了使其工作,您需要创建

  • 一个控制器
  • 一个数据源
  • 一个twig模板
  • 可能还需要一个ActionProvider

为了演示这一点,我们将替换Drupal核心的用户管理。

与Drupal绑定

/**
 * Implements hook_menu_alter().
 */
function mymodule_menu_alter(&$items) {
  $items['admin/people']['page callback'] = 'sf_dic_page';
  $items['admin/people']['page arguments'] = [AccountController::class . '::accountList'];
}

当点击admin/people时,将调用AccountController::actionListAction方法。

控制器

<?php

use MakinaCorpus\Drupal\Dashboard\Controller\PageControllerTrait;
use MakinaCorpus\Drupal\Sf\Controller;
use Symfony\Component\HttpFoundation\Request;

/**
 * User admin
 */
class AccountController extends Controller
{
    /**
     * Main list
     *
     * @param \Symfony\Component\HttpFoundation\Request $request
     * @return string
     */
    public function accountListAction(Request $request)
    {
        /** @var \MakinaCorpus\Drupal\Dashboard\Page\DatasourceInterface $datasource */
        $datasource = $this->get('mymodule.datasource.account');

        return $this
          ->createPageBuilder()
          ->setDatasource($datasource)
          ->setAllowedTemplates(
            [
              'table' => 'module:mymodule:Page/page-account.html.twig',
            ]
          )
          ->showFilters()
          ->showSort()
          ->showSearch()
          ->setDefaultDisplay('table')
          ->searchAndRender($request)
        ;
    }
}

如您所见,我们的控制器依赖于数据源和模板。

数据源

一个DefaultAccountDatasource可用,并抽象了查询users表的主要部分,但您可以添加您自己的排序等。

<?php

namespace MyModule\Page;

use MakinaCorpus\Drupal\Dashboard\Page\Account\DefaultAccountDatasource;
use MakinaCorpus\Drupal\Dashboard\Page\PageState;

/**
 * Account Datasource
 */
class AccountDatasource extends DefaultAccountDatasource
{
    /**
     * Add our own columns
     *
     * @inheritdoc
     */
    public function getSortFields($query)
    {
        $sortFields = parent::getSortFields($query);

        $sortFields['m.myfield_value'] = "my field";

        return $sortFields;
    }

    protected function applyFilters(\SelectQueryInterface $select, $query, PageState $pageState)
    {
        $select->leftJoin('field_data_myfield', 'm', 'm.entity_id = u.uid');
    }
}

它必须在您的mymodule.services.yml中声明。

services:
  mymodule.datasource.account:
    public: true
    shared: false
    class: MyModule\Page\AccountDatasource
    arguments: ["@database", "@entity.manager"]

模板

该模板扩展自module:udashboard:views/Page/page.html.twig,它为显示项表提供了主要组件。您只需要覆盖列和行即可。

{% extends 'module:udashboard:views/Page/page.html.twig' %}

{%- block item -%}
    <tr class="separator">
        <td>{{ item.name }}</td>
        <td>{{ item.myfield.und.0.value }}</td>
        <td>
            <ul>
                {% for role in item.roles %}
                    {% if role != 'authenticated user' %}
                        <li>{{ role }}</li>
                    {% endif %}
                {% endfor %}
            </ul>
        </td>
        <td>{{ item.created|date('d/m/Y H:i') }}</td>
        <td>{{ item.access|date('d/m/Y H:i') }}</td>
        <td>{{ item.status ? 'Yes'|t : 'No'|t }}</td>
        <td class="actions">{{ udashboard_primary(item) }}</td>
    </tr>
{%- endblock -%}

{% block item_list %}
    <table class="table table-striped table-condensed table-demandes">
        <thead>
        <tr>
            <th>Name</th>
            <th>My Field</th>
            <th>Roles</th>
            <th>Member since</th>
            <th>Last access</th>
            <th>Status</th>
            <th></th>
        </tr>
        </thead>
        <tbody>
        {% for item in items %}
            {{ block('item') }}
        {% else %}
            <tr>
                <td colspan="9">
                    No account to display.
                </td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
{% endblock %}

操作提供者

操作提供者不是必需的,但它允许在项上添加操作。例如,对于帐户

<?php

namespace MyModule\Action;

use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\user\User;
use MakinaCorpus\Drupal\Dashboard\Action\Action;
use MakinaCorpus\Drupal\Dashboard\Action\ActionProviderInterface;

/**
 * Action provider for accounts
 */
class AccountActionProvider implements ActionProviderInterface
{
    use StringTranslationTrait;

    /**
     * @inheritdoc
     */
    public function getActions($item, $primaryOnly = false, array $groups = [])
    {
        $ret = [];

        $ret[] = new Action($this->t("Edit"), 'user/'.$item->id().'/edit', null,'pencil', 0, true, false);
        $ret[] = new Action($this->t("Delete"), 'user/'.$item->id().'/cancel', null, 'trash', 2, true, false);

        return $ret;
    }

    /**
     * {@inheritDoc}
     */
    public function supports($item)
    {
        return $item instanceof User;
    }
}

它必须在您的mymodule.services.yml中声明。

services:
  mymodule.account_action_provider:
    public: false
    class: MyModule\Action\AccountActionProvider
    tags: [{name: udashboard.action_provider}]