20steps / autotables-bundle
Symfony 扩展包,用于将实体映射到自动生成的表中
Requires
- 20steps/commons-ensure-bundle: ^1.0
- brandonwamboldt/utilphp: ^1.0
- danielstjules/stringy: ^2.0
- symfony/framework-bundle: ^2.3|^3.0
This package is not auto-updated.
Last update: 2024-09-28 15:06:15 UTC
README
关于
20steps AutoTables 扩展包为在 Symfony2 应用程序中以自动生成和可编辑的表格显示实体提供了一种简单的方法。这些表格由 DataTables 渲染,并通过修补版本的 jquery.datatables.editable 变得更易于编辑。
AutoTables 扩展包采用 LGPL 许可协议版本 3.0 许可 (https://gnu.ac.cn/licenses/lgpl-3.0.html)。
功能
- 在自动生成的表格中可视化自定义实体
- 更新、删除和添加实体
- 集成 Doctrine 仓库
- 集成自定义 CRUD 服务
- 使用 Doctrine 注解实体
- 使用 AutoTablesBundle 注解实体
- 显示属性或方法的列
- 修改属性或方法的列
- 将列声明为只读
- 支持常量和 ManyToOne 映射的新增实体的自动初始化功能
- 支持 jQuery-UI 和 Bootstrap3
- 许多自定义选项
安装
通过向您的 composer.json 文件的相应部分添加以下条目来要求扩展包
"20steps/autotables-bundle": "dev-master"
通过调用从 GitHub 的 Packagist 获取扩展包
php composer.phar update 20steps/autotables-bundle
通过向您的 AppKernel.php 中 registerBundles() 方法的以下行添加扩展包以在您的应用程序中注册扩展包
new twentysteps\Bundle\AutoTablesBundle\twentystepsAutoTablesBundle()
在 config.yml 中添加您的 assetic 配置以添加扩展包
assetic:
    bundles:        [ 'twentystepsAutoTablesBundle' ]
在 routing.yml 中添加扩展包的路线
twentysteps_auto_tables:
    resource: "@twentystepsAutoTablesBundle/Resources/config/routing.yml"
    prefix:   /autoTables
使用方法
以下部分描述了如何在您的应用程序中集成自动生成的表格。作为先决条件,必须完成安装部分中的步骤。
全局配置
您的 config.yml 中有一个名为 twentysteps_auto_tables 的部分配置了此扩展包。
twentysteps_auto_tables:
    ...
可能的全球配置选项包括
- 
default_datatables_options: DataTables 插件的默认配置。它由包含选项的 JSON 表示的字符串给出。此处给出的任何设置都将扩展到特定表的选项。 
- 
trans_scope: 与 autotables 相关翻译的默认作用域。 
- 
frontend_framework: 用于渲染的前端框架。目前支持 "jquery-ui"(默认)和 "bootstrap3"。 
twentysteps_auto_tables:
    default_datatables_options: >
    {
      "sDom": "TC<\\'clear'><'row table-header'<'col-md-3'f><'col-md-4'p>r>t<'row table-footer'<'col-md-9'i><'col-md-3'l>>"
    }
    trans_scope: 'autoTableMessages'
表格特定配置
现在必须配置将由扩展包渲染的表格。这作为 tables 部分中的列表发生。每个表格配置都必须有一个 id 属性。这用于在以后对扩展包的调用中引用配置。
repository 和 service
此外,每个表格配置必须定义 repository 或 service。repository 是处理要打印的实体的 Doctrine 仓库的名称。如果您不使用 Doctrine(或由于其他原因),可以定义一个指向实现 AutoTablesCrudService 接口的服务 service。
trans_scope
使用 trans_scope 属性,您可以定义用于翻译表格使用的消息的新作用域。这些是列的名称和一些附加消息,如扩展包的 messages.en.yml 文件中找到的。默认情况下使用全局配置的值。
datatable_options
属性datatables_options可以用来指定特定的表格配置,以便于使用DataTables插件,这将扩展全局配置部分的任何配置。
视图
views选项可以指向一个目录,该目录包含用于覆盖包中模板的自定义模板。
列
使用columns,您可以覆盖由autotables注解所做的任何设置,或者定义注解未配置的设置。config.yml中的任何列设置都将覆盖任何注解。
目前可以配置列的以下内容:name、readOnly、type、order和ignore。
selector参数必须指定要覆盖的列。这可能是一个属性,如description,或者是一个方法,如getDisplayName()。
对于在添加条目表单时应该自动初始化的列,您可以配置一个initializer部分。此部分可以包含repository、value和id的值。
value属性简单地选择一个常量值,并将其注入到具有此列的每个新实体中。通过选择一个存储库,可以注入通过给定ID找到的对象。ID可以在config.xml中通过常量值传递,也可以在稍后使用ts_auto_table_options函数的Twig视图中传递。
示例
以下是一个为products表提供的配置示例
twentysteps_auto_tables:
  default_datatables_options: >
    {
      "sDom": "TC<\\'clear'><'row table-header'<'col-md-3'f><'col-md-4'p>r>t<'row table-footer'<'col-md-9'i><'col-md-3'l>>"
    }
  tables:
    -
      id: "products"
      repository: 'AcmeStoreBundle:Product'
      trans_scope: 'autoTables'
      datatables_options: >
        {
          "oLanguage": {
            "sLengthMenu": "_MENU_ entries per page",
            "sSearch": "Search",
            "oTableTools": {
                "aButtons": [
                  {"sExtends": "copy", "sButtonText": "Copy"},
                ]
            }
          }
        }
      columns:
              -
                selector: 'description'
                readOnly: true
                order: 2
              -
                selector: 'client'
                visible: false
                initializer:
                    repository: 'AcmeStoreBundle:Client'
              -
                selector: 'getDisplayName()'
                order: 10
                readOnly: false
实体注解
将任何列渲染到表中的信息来自实体中找到的注解。包搜索Doctrine注解,如@Doctrine\ORM\Mapping\Column和@Doctrine\ORM\Mapping\Id。如果您想提供一个不同的名称,设置一个排序值或出于其他原因,可以使用包的注解twentysteps\Bundle\AutoTablesBundle\Annotations\Column。甚至getter方法也可以使用此注解进行注解,以创建显示getter返回值的列。在这种情况下,要能够更新值,必须创建具有相同名称的setter(getFoo/setFoo)。还可以使用注解的readOnly属性禁用列的编辑。
如果您想避免在自动生成的表中渲染列,应将注解的ignore标志设置为true。在这种情况下,属性或方法将由包忽略。
如配置部分所述,任何列都可以在使用添加条目表单时自动初始化。这可以通过配置部分中描述的Initializer注解或以下示例中显示的进行配置。
/**
 * @ORM\ManyToOne(targetEntity="Client", inversedBy="products")
 * @ORM\JoinColumn(name="client_id", referencedColumnName="id")
 * @AUT\Column(type="mixed", visible=false, initializer=@AUT\Initializer(repository="AcmeStoreBundle:Client"))
 */
private $client;
/**
 * @ORM\Column(type="string", length=100)
 * @AUT\Column(visible=false, initializer=@AUT\Initializer(value="bar"))
 */
private $foo;
以下代码块显示了一个为AutoTablesBundle正确注解的实体的完整示例
<?php
namespace Acme\StoreBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use twentysteps\Bundle\AutoTablesBundle\Annotations as AUT;
/**
 * Product
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Acme\StoreBundle\Entity\ProductRepository")
 */
class Product
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @AUT\Column(ignore=true)
     */
    protected $id;
    /**
     * @ORM\Column(type="string", length=100)
     * @AUT\Column(ignore=true)
     */
    protected $name;
    /**
     * @ORM\Column(type="decimal", scale=2)
     * @AUT\Column(name="col_prize", order = 2, readOnly = true)
     */
    protected $price;
    /**
     * @ORM\Column(type="text")
     * @AUT\Column(name="col_description", order = 3)
     */
    protected $description;
    /**
     * @AUT\Column(name="col_name", type="string", order=1)
     * @return string
     */
    public function getDisplayName()
    {
        return '#' . $this->name . '#';
    }
    public function setDisplayName($name)
    {
        $this->name = trim($name, '#');
    }
视图集成
现在您必须修改视图以渲染实体表。我们假设您正在使用Twig模板。
ts_auto_table_stylesheets
使用Twig函数ts_auto_table_stylesheets包含所需样式表。如果设置了相应的选项为true,则可以包含所选前端框架的样式表:includeJqueryUi resp. includeBootstrap3。
ts_auto_table_options
您必须至少定义entities和tableId,以便渲染数据。这通过函数ts_auto_table_options完成,如下例所示
{{ ts_auto_table_options({
        'entities': products, 'tableId': 'products',
        'columns': [
            {
                'selector': 'getDisplayName()',
                'visible': true
            },
            {
                'selector': 'client',
                'initializer': {
                    'id': client.id
                }
            }
            {
                'selector': 'id',
                'visible': false
            }
    ]}) }}
如您所见,您也可以在此处覆盖任何列的配置。
ts_auto_table_html
必须使用Twig函数ts_auto_table_html渲染表格的HTML。要能够渲染任何表格,必须确保先调用函数ts_auto_table_options。
ts_auto_table_js
最后需要渲染表格的javascript代码。这通过Twig函数ts_auto_table_js来完成。默认情况下,除了jQuery库外,所有需要的javascript库都会被加载。这种行为可以通过以下选项进行配置:includeBootstrap3、includeJquery、includeJqueryUi、includeJqueryEditable、includeJqueryDataTables和includeJqueryValidate
可以通过选项dtOptions在这里扩展DataTables配置。
此外,还可以在这里覆盖transScope,以及通过选项updateRoute、deleteRoute和addRoute来指定CRUD控制器操作的路径。
选项reloadAfterAdd(默认为true)可以设置为true,以在添加实体后重新加载页面。目前这需要刷新自定义视图模板中渲染的任何链接。
同样,还有一个选项reloadAfterUpdate(默认为false),具有相同的效果。
与ts_auto_table_html类似,此函数也需要在调用ts_auto_table_options之前。
示例
在以下示例中,您可以了解如何构建一个显示实体products的视图。
{% extends "TwigBundle::layout.html.twig" %}
{% block head %}
    <link rel="icon" sizes="16x16" href="{{ asset('favicon.ico') }}"/>
    <link rel="stylesheet" href="{{ asset('bundles/acmedemo/css/demo.css') }}"/>
    {{ ts_auto_table_stylesheets() }}
{% endblock %}
{% block title 'Product list' %}
{% block body %}
    <div class="block">
        List of products
        {{ ts_auto_table_options({
                'entities': products, 'tableId': 'products',
                'columns': [
                    {
                        'selector': 'getDisplayName()',
                        'ignore': false
                    },
                    {
                        'selector': 'id',
                        'ignore': false
                    }
                ]}) }}
        {{ ts_auto_table_html() }}
        {{ ts_auto_table_js({'includeJquery': true}) }}
    </div>
{% endblock %}
作者
- 马克·厄尔特 (marc.ewert@20steps.de)
- 赫尔穆特·霍弗·冯·安克肖芬 (hhva@20steps.de)