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

问题描述 投票:0回答:6

我不喜欢索引页面(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');
        [...]
    }

   [...]
}

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!');
        });
    }
}

开放式问题

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

有什么想法吗?非常感谢!

javascript onclick crud symfony5 easyadmin
6个回答
7
投票

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

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 %}

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;
        });
    }
}

crud 控制器 (php)

添加一个可以被javascript捕获的CSS类

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

   [...]
}

仪表板控制器(php)

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

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

        return $assets;
    }
    [...]
}

玩得开心!


3
投票

为我工作。 Symfony 6.1、EasyAdminBundle 4

在 CRUD 控制器中(PHP)


    公共函数configureFields(字符串$ pageName):可迭代
    {
    //....
    产生 IdField::new('id')->onlyOnIndex()
    ->setTemplatePath('admin/field/linkedit.html.twig');
    产生 TextField::new('anyfield')->setLabel("标题")
    ->setTemplatePath('admin/field/linkedit.html.twig');
    //....
    }

模板(树枝)


    {# admin/field/linkedit.html.twig #}
    {% 设置 editUrl = ea_url()
                        .setController(ea.crud.controllerFqcn)
                        .setAction('编辑')
                        .setEntityId(entity.primaryKeyValue) %}
    {{ 字段.值 }}

此答案中使用的“editUrl”变量https://stackoverflow.com/a/65017290/19516399


1
投票

我找到了一种替代解决方案,可以转换链接中的文本,然后 javascript 查找并将您带到编辑 URL。

public function configureFields(string $pageName): iterable
{
    return [
        TextField::new('firstName')->setCssClass('js-row-action'),

...

public function configureAssets(Assets $assets): Assets
{
    return $assets->addJsFile('js/admin.js');
}

....

$('.js-row-action').each(function () {
    $(this).find('span').html('<a href="#">' + $(this).find('span').text() + 
'</a>');
});

$('.js-row-action').click(function () {
    window.location.href =  
    (this).siblings('td.actions').find('a').attr('href');
});

0
投票

我改进了代码分组全部在一个 jquery 指令中:

$('.js-row-action').each(function () {
    $(this).find('span').html('<a href="' + 
$(this).siblings('td.actions').find('a').attr('href') + ' ">' + 
$(this).find('span').text() + '</a>');
});

0
投票

纯javascript版本

for (let [key, element] of Object.entries(document.getElementsByClassName('edit-entity'))) {        
    element.innerHTML = '<a href="'+element.parentElement.querySelector('td.actions a').getAttribute('href')+'">'+element.innerHTML+'</a>';
}

CrudController 配置字段

yield Field::new('column')->setCssClass('edit-entity');

0
投票

感谢您的鼓舞人心的帖子。这是我使用纯 JavaScript 的解决方案:

使用另一个字段作为编辑链接

例如将“名称”链接到编辑操作,而不是单独的“编辑”链接

// src/Controller/Admin/FooCrudController.php

public function configureFields(string $pageName): iterable
{
    // Add the trigger css class name:
    yield TextField::new('name')->setCssClass('use-as-edit-link');
    ...
}

public function configureAssets(): Assets
{
    $assets = parent::configureAssets();
    $assets->addJsFile('js/easyadmin/move-edit-link.js');

    return $assets;
}

 

// /public/js/easyadmin/move-edit-link.js

/* jshint esversion: 6 */
document.addEventListener("DOMContentLoaded", function(event)
{
    // Remove the "edit" link and link the field with css class 'use-as-edit-link' instead

    // Get all elements with class "action-edit"
    const editLinks = document.querySelectorAll('.action-edit');

    // Loop through each edit link
    editLinks.forEach(editLink => {
        // Get the href attribute of the current edit link
        const href = editLink.getAttribute('href');

        // Hide the original edit link cell by setting its style to "display: none;"
        editLink.style.display = 'none';

        // Find the closest parent row of the edit link
        const row = editLink.closest('tr');

        // Find the element with class "use-as-edit-link" within the same row
        const useAsEditLink = row.querySelector('.use-as-edit-link');

        // Update the innerHTML of the use-as-edit-link element to create a link
        useAsEditLink.innerHTML = `<a href="${href}">${useAsEditLink.innerHTML}</a>`;
    });

});
© www.soinside.com 2019 - 2024. All rights reserved.