Yii2 比较并突出显示 gridview 中两个字符串或文本之间的差异
Yii2 compare and highlight difference between two strings or text in gridview
有没有办法让它工作?
我一直在寻找解决方案,但没有找到任何相关的东西。如果 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
看起来不错。我们能以某种方式使用它吗?
是的,我们可以。它并不完美,但我可以稍微改变它以满足我的需要。
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';
嗯,唯一的问题是 none 的输出对我来说真的很完美:文本渲染太少,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',
],
输出:
something <== red
somewhat <== that's actually underlined and green, not bold
我相信有人可以让它更优雅,但以一种快速而肮脏的方式,目前对我来说还不错,因为我不想再构建它了。
有没有办法让它工作? 我一直在寻找解决方案,但没有找到任何相关的东西。如果 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
看起来不错。我们能以某种方式使用它吗?
是的,我们可以。它并不完美,但我可以稍微改变它以满足我的需要。
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';
嗯,唯一的问题是 none 的输出对我来说真的很完美:文本渲染太少,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',
],
输出:
some
thing<== redsomewhat <== that's actually underlined and green, not bold
我相信有人可以让它更优雅,但以一种快速而肮脏的方式,目前对我来说还不错,因为我不想再构建它了。