【问题标题】:EasyAdmin3: clickable table-row (link to EDIT-page)EasyAdmin 3:可点击的表格行(链接到编辑页面)
【发布时间】:2021-03-08 16:03:26
【问题描述】:

我不喜欢 INDEX 页面(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. 如何生成 EDIT 页面的 URL?
  2. 如何将带有 URL 的数据属性设置到任何(隐藏)字段中,以便在 javascript 中使用它?

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

【问题讨论】:

    标签: javascript onclick crud symfony5 easyadmin


    【解决方案1】:

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

    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

    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;
        }
        [...]
    }
    

    玩得开心!

    【讨论】:

      【解决方案2】:

      我找到了一个替代解决方案,它可以转换链接中的文本,然后 javascript 找到并将 yo 带到编辑 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');
      });
      

      【讨论】:

      • 更新到可以回答在一个 jquery 指令中进行分组: $('.js-row-action').each(function () { $(this).find('span'). html('' + $(this).find( 'span').text() + ''); });
      • 当您使用 Encore 时,请务必使用 addWebpackEncoreEntry 而不是 addJsFile,否则您的脚本将无法正确添加。
      【解决方案3】:

      我在一条 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>');
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-03
        • 1970-01-01
        • 2012-08-04
        • 1970-01-01
        • 2012-07-04
        • 2020-02-17
        • 2021-06-19
        • 1970-01-01
        相关资源
        最近更新 更多