Да, мы можем.Это не идеально, но я могу немного изменить его в соответствии со своими потребностями.
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-рендерингполные таблицы, и в виде сетки это не очень хорошо, поэтому я сделал копию 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;
}
, кроме того, у меня естьизменил это в parent (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',
],
Вывод:
некоторые вещь <== красный </p>
некоторые что <== на самом деле подчеркнутый и зеленый, а не жирный </p>
Я уверен, что можно сделать его более элегантным, но быстро и грязно это хорошо для меня на данный моментпотому что я не хочу строить его дальше.