【问题标题】:Solution for Magento mass actions and large number of records problem?Magento 大规模行动和大量记录问题的解决方案?
【发布时间】:2026-01-19 16:30:01
【问题描述】:

目前 Magento 在处理批量操作的方式上存在问题。无论分页如何,它都会返回一些 JS,其中包含当前集合和过滤器的每个 db id。这是为了支持网格标题中的“全选”与“全选可见”选项。当您的记录数量较少时,这不是一个问题,但如果您有 850k 条记录(在这种情况下为订单),它就会成为一个严重的问题。

我的问题是,有没有人可以优雅地解决这个问题?

我可以想到几种解决方案,每种都有自己的缺点,但我希望有人以一种简单的方式解决了这个问题,可以作为附加模块使用。付费或开源解决方案都是受欢迎的建议。

澄清:

我正在使用 Magento 中的网格小部件寻找一个优雅/直接的解决方案来解决 850k+ 记录的问题。普通的 Magento 代码做出了明智的决定,即返回与当前过滤器匹配的每条记录的 id,即使它们没有被显示。这不是关于离线处理记录,而是关于使用网格小部件进行日常管理任务。

一种可能的解决方案是将过滤后的搜索结果存储在临时表中并返回对搜索结果的引用。然后,您可以将其从使用“全选”上的实际 ID 更改为使用引用的操作的特定回调。这将保留当前行为。

所以,再问一次,有没有人对这个已经创建的问题有好的解决方案?

【问题讨论】:

  • 如果你最终不得不自己动手,巧妙地使用本地存储将是解决这个问题的好方法。
  • 我认为@fbmc 没有抓住重点。您不是在寻找一种方法来摆脱这些额外的 JS 块,而不是处理来自 Web 界面的所有 850k 记录吗?无论哪种情况,我都建议您修改您的问题,因为它还不清楚。

标签: magento


【解决方案1】:

我在一个 shell 脚本中运行繁重的操作。我有一个通用迭代器(在我的例子中是产品,但可以用其他所有东西来完成),我只实现一个对产品执行操作的类。我的 product_iterator shell 脚本负责遍历产品,同时一次只处理 x 个产品(以避免内存泄漏)。

【讨论】:

    【解决方案2】:

    好吧,解决该问题的侵入性最小的解决方案是关闭具有大量记录的网格的“全选”选项。这很容易通过扩展网格类并添加以下代码来实现:

    protected function _prepareMassaction()
    {
        $this->getMassactionBlock()->setUseSelectAll(false);
        return parent::_prepareMassaction();
    }
    

    【讨论】:

      【解决方案3】:

      我认为 fbmc 有正确的通用方法。显然,即使您确实找到了发回所有 850k 记录的方法,该框架也会在试图处理所有这些记录时发生心脏病。如果这是您需要的,请在 shell 脚本中运行逻辑。对于某些作业,您甚至可能需要分批运行它们或向下移动到实际的 SQL 逻辑。

      不幸的是,框架的某些部分无法处理这种规模。你找到了其中之一。

      希望有帮助!

      谢谢, 乔

      【讨论】:

      • 我知道这是一个古老的回应,但你错过了问题的重点。我不是在问如何使用集体行动来处理 85 万条记录。我指出,如果在具有大量记录的网格上进行大规模操作,Magento 将返回集合中每条记录的 ID。这当然是个问题。
      【解决方案4】:

      最近我写了一篇关于“在 Magento 中向管理网格添加新的大规模操作”的文章,
      希望你会喜欢它:
      http://www.blog.magepsycho.com/adding-new-mass-action-to-admin-grid-in-magento/

      它描述了添加群众行动的两种方式
      1> 扩展网格布局 _prepareMassaction() 方法
      2> 使用事件:core_block_abstract_prepare_layout_before(更多升级证明方式)

      谢谢 问候

      【讨论】:

      • 您应该在此处发布博客文章的内容,而不是指向您博客的链接。
      • 谢谢李。注明以供将来参考。
      最近更新 更多