【问题标题】:jQuery Bootgrid - conditional formatterjQuery Bootgrid - 条件格式化程序
【发布时间】:2023-03-25 16:11:02
【问题描述】:

希望使用 jQuery Bootgrid 创建条件格式化程序/行操作。例如,如果在 PHP 数据中设置了某个值,则显示格式化程序,否则不显示。我找不到任何解决此问题的文档或以前的 stackoverflow 问题。

编辑:

我目前在控制器中执行此操作的方式如下:

$actions = array(
    'override' => array(
        'icon' => 'flare red',
        'link' => '/edit',
        'perm' => 'Edit',
        'title' => '...',
        'condition_and' => array(
            'status' => array(
                'column' => 'status !=',
                'value' => 'Suspended'
            ),
            'registered' => array(
                'column' => 'reg ==',
                'value' => 'Yes'
            )
        ),
        'disabled_icon' => 'flare grey',
        'disabled_title' => '...'
    )
);

在随后生成网格的函数中,我在遍历数据时解释这些设置。在我看来,唯一仍然是 hacky 的部分是我使用 PHP 循环遍历数据,然后构建一个 JS 字符串来匹配条件:

if (!empty($vv['condition_and']))
{
    $check_cond = '+(';
    foreach ($vv['condition_and'] as $conk => $conv)
    {
        $check_cond .= '(row.' . $conv['column'] . ' ' . $conv['operator'] . ' "' . $conv['value'] . '") && ';
    }
    $check_cond = rtrim($check_cond, ' && ');
    $out .= '"\
        "' . $check_cond . ' ? "\
            <a style=\"margin-right: 8px\" href=\"' . base_url() . $vv['link'] . '/" + row.id + "\"><i title=\"' . $vv['title'] . '\" class=\"zmdi zmdi-hc-lg zmdi-' . $vv['icon'] . '\"></i></a>" : "\
            <i style=\"margin-right: 8px;\" title=\"' . $vv['disabled_title'] . '\" class=\"zmdi zmdi-hc-lg zmdi-' . $vv['disabled_icon'] . '\"></i>")+"\
    " + ';
}

但如果没有明确的方法可以更好地做到这一点,我会暂时坚持下去。

【问题讨论】:

  • 所以你可以将格式化程序用于一行,但不能用于其他行?或者您是否只想根据此值禁用所有行的格式化程序?您能否提供一个示例,说明如何在一些 HTML 标记中从 PHP 设置此值?
  • @Alisson,我想将它用于一行而不是另一行,您的理解是正确的。
  • 您是如何加载数据的?您是在使用 ajax 并调用一些 API,还是在使用 PHP 使用循环创建 HTML(例如 &lt;tr&gt;&lt;td&gt;)?
  • 是的,使用 Ajax 加载数据并使用循环生成内容。我找到了一种方法来做我想做的事,但它似乎很hacky。我最初的尝试实际上是硬编码的,但我设法让它可重用,所以我现在很高兴,除非有人提出真正的解决方案。不确定我是否应该将我的解决方案作为答案发布。
  • 所以你不是在使用 bootgrid 的内置 ajax 加载数据的方式,而是自己发出 ajax 请求并循环传递结果并手动将数据添加到 bootgrid?对于每种加载数据的不同方式,我将尝试发布不同的方式来实现您想要的效果。

标签: jquery jquery-bootgrid


【解决方案1】:

您可以使用 json 数据中的属性在自己的格式化程序函数中检查:

$("#grid-data").bootgrid({
    ajax: true,
    url: "/api/get-data",
    formatters: {
        "paymentButton": function(column, row)
        {
            if (row.HasPayment)
                return '<button class="btn btn-primary" data-id="' + row.PaymentId + '" title="Check payment details"><i class="fa fa-money"></i></button>';
            return "";
        }
    }
});

在这种情况下,使用 paymentButton 格式化程序的列将只为 HasPayment 属性为 true 的行显示一个按钮,或者当它为 false 时不显示任何内容。

您可以从后端 PHP API 返回任何您想要的数据,并在格式化程序函数中检查它们。

无论您加载数据的方式如何,都会调用格式化程序函数。

【讨论】:

  • 嗨,艾莉森,感谢您的回答。我循环遍历数据的原因是因为我希望它可以重用,因为我不必为我制作的每个不同的网格编辑网格生成 JS。我在 PHP 中编写了一个辅助函数,它根据我需要为特定的 crud 视图生成的操作来构建格式化程序的条件,但它目前有点 hacky。我会对其进行一些改进,看看我是否可以发布一个可以以某种方式帮助其他人的答案。您的方式虽然可行,但意味着我需要为每个不同的网格生成一个新的 ajax 调用脚本。
  • @KobusMyburgh 正如我所说,即使您循环数据并将其手动附加到 bootgrid,此解决方案也有效,因为将调用格式化程序函数。您只需要返回在格式化程序函数中检查条件所需的任何属性(例如 HasPayment 属性)。如果您可以共享您的部分代码,以便我可以更好地理解您如何使用 PHP 来构建这些条件,也许我可以举一个更好的例子,但是无论您将数据加载到网格中的方式如何,我的解决方案都应该有效。跨度>
  • 你这样做的方式意味着我需要为每个具有不同列的网格实例编辑 JS。我使用具有可重用功能的帮助文件来制作网格,因此它不是我所想的 100%。我拥有的代码总共大约有 400 行代码,它适用于我现在的想法,但它对我来说确实是 hacky,但如果你想查看它,我可以在某个地方分享它。至少我可以在我的 CodeIgniter 控制器中指定特定于我要创建的实例的条件,从而相应地构建自定义操作。
  • @KobusMyburgh 如果您可以只分享部分代码(最相关的部分),那就太好了。如果我理解正确,您有许多不同的网格,它们使用相同的数据来填充行,但列可能不一样。
  • 似乎我无法将格式化的代码放在评论中。我将编辑问题以简要介绍代码的当前状态。我从不牺牲可读性。我只是想确保我的代码不是 hacky。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 2022-07-04
相关资源
最近更新 更多