EasyAdmin3:可点击的表格行(链接到编辑页面)

Tim*_* K. 4 javascript crud onclick easyadmin symfony5

我不喜欢索引页面(EasyAdmin 3 / symfony 5)上每个实体末尾的“编辑”按钮,我希望表行可单击,它将直接将我发送到编辑-页。

我想解决方案必须使用 Javascript,所以我开始:

PHP 文件

class PersonCrudController extends AbstractCrudController {
   [...]
   
    public function configureFields(string $pageName): iterable {
        [...]
        yield TextField::new('fullName',  'Name')->onlyOnIndex()->setCssClass('js-row-action');
        [...]
    }

   [...]
}
Run Code Online (Sandbox Code Playgroud)

javascript 文件

// call functions once page is loaded
document.addEventListener("DOMContentLoaded", function() {
    makeTableRowClickable();
});

function makeTableRowClickable() {
    let elements = document.getElementsByClassName('js-row-action');

    for (let i = 0; i < elements.length; i++) {
        let td = elements[i];
        let tr = td.parentNode;

        tr.addEventListener("click", function (e) {
            alert('click the row, Jack!');
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

开放式问题

  1. 如何生成编辑页面的 URL?
  2. 如何将带有 URL 的数据属性设置到任何(隐藏)字段中,以便我可以在 javascript 中使用它?

有任何想法吗?非常感谢!

Tim*_* K. 8

这是我的解决方案(您必须更新树枝模板)

index.html.twig(我的首要文件)

识别编辑页面的 URL 并将链接作为 href 属性添加到 TR 标签中

{#
    EXAMPLES:
    templates/bundles/EasyAdminBundle/layout.html.twig      ===> extends '@!EasyAdmin/layout.html.twig'
    templates/bundles/EasyAdminBundle/crud/index.html.twig  ===> extends '@!EasyAdmin/crud/index.html.twig'
#}

{# DO THIS: the '!' symbol tells Symfony to extend from the original template #}
{% extends '@!EasyAdmin/crud/index.html.twig' %}


{% block table_body %}

    {% for entity in entities %}
        {% if not entity.isAccessible %}
            {% set some_results_are_hidden = true %}
        {% else %}

            {# generation of the EDIT-link #}
            {% set editUrl = ea_url()
                    .setController(ea.crud.controllerFqcn)
                    .setAction('edit')
                    .setEntityId(entity.primaryKeyValue) %}


            {# add href-attribute and insert the URL #}
            <tr data-id="{{ entity.primaryKeyValueAsString }}" href="{{ editUrl }}">

[...]

{% endblock table_body %}

Run Code Online (Sandbox Code Playgroud)

javasript 文件

识别 href 属性并将用户发送到 url

// call functions once page is loaded
document.addEventListener("DOMContentLoaded", function() {
    makeTableRowClickable();
});

function makeTableRowClickable() {
    let elements = document.getElementsByClassName('js-row-action');

    for (let i = 0; i < elements.length; i++) {
        let td  = elements[i];
        let tr  = td.parentNode;
        let url = tr.getAttribute('href');

        tr.addEventListener("click", function (e) {
            location.href = url;
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

CRUD 控制器 (php)

添加一个可以被 javascript 捕获的 css-class

class PersonCrudController extends AbstractCrudController {
   [...]
   
    public function configureFields(string $pageName): iterable {
        [...]
        yield TextField::new('fullName',  'Name')->onlyOnIndex()->setCssClass('js-row-action');
        [...]
    }

   [...]
}
Run Code Online (Sandbox Code Playgroud)

仪表板控制器 (php)

将 javascript 文件链接到仪表板控制器,使其在任何地方都成为默认值

class DashboardController extends AbstractDashboardController
{
    [...]
    public function configureAssets(): Assets {
        $assets = parent::configureAssets();
        $assets->addJsFile('js/row_clickable.js');

        return $assets;
    }
    [...]
}
Run Code Online (Sandbox Code Playgroud)

玩得开心!