Yii2比较并突出显示GridView中两个字符串或文本之间的差异

时间:2018-09-14 10:48:02

标签: string yii2 highlight difference

有没有办法使它起作用? 我一直在寻找解决方案,但没有发现任何相关性。如果StringHelper具有这样的方法,那就太好了! yii2的某个地方必须有一个文本差异函数,因为在gii中也有一个突出的区别,不是吗? DiffRendererHtmlInline?这是什么?是来自gii。我们可以以某种方式利用它吗?

https://github.com/pdjshog/yii2/blob/master/framework/gii/components/Pear/Text/Diff.php

它应该在那里,但我在Yii中找不到它。 实际上,yii框架中还有其他功能:

  • phpspec / php-diff / lib / Diff.php

看起来不错。我们可以以某种方式使用它吗?

1 个答案:

答案 0 :(得分:0)

是的,我们可以。它不是完美的,但是我可以根据自己的需要进行一些更改。

https://github.com/chrisboulton/php-diff/blob/master/example/example.php

因此yii中已经存在,您无需安装任何东西。

我已将以下内容添加到index.php:

require_once \Yii::$app->basePath . '/vendor/phpspec/php-diff/lib/Diff.php';
require_once \Yii::$app->basePath . '/vendor/phpspec/php-diff/lib/Diff/Renderer/Html/InlineMy.php';

唯一的问题是,没有一个输出对我而言真的是完美的:文本渲染太少,html渲染是完整的表格,并且在gridview中不是很好,所以我制作了一个Inline副本.php作为InlineMy.php并删除了我不需要的所有内容:

public function render() {
    $changes = parent::render();
    $html = '';
    if (empty($changes)) {
        return $html;
    }

    foreach ($changes as $i => $blocks) {
        foreach ($blocks as $change) {
            if ($change['tag'] == 'replace') {
                foreach ($change['base']['lines'] as $no => $line) {
                    $html .= '<span style="white-space: nowrap">' . $line . '</span><br>';
                }

                foreach ($change['changed']['lines'] as $no => $line) {
                    $html .= '<span style="white-space: nowrap">' . $line . '</span>';
                }
            }
        }
    }
    return $html;
}

此外,我在父(Array.php)中对此进行了更改:

<del> ==> <del style="background-color: red">
<ins> ==> <ins style="background-color: green">

此刻我正在使用SqlDataProvider,所以我的gridview看起来与平时(ActiveDataProvider)略有不同:

[
    'attribute' => 'diff',
    'value' => function ($row) {
        $diff = new Diff(explode("\n", $row["name"]), explode("\n", $row["name2"]));
        $renderer = new Diff_Renderer_Html_Inline;
        return $diff->render($renderer);
    },
    'format' => 'html',
],

输出:

  

一些东西 <==红色

     

一些内容 <==实际上是带下划线的绿色,而不是粗体

我敢肯定,它可以变得更优雅,但是以一种快速又肮脏的方式对我来说现在很好,因为我不想再制造它了。