Yii2 сравнить и выделить разницу между двумя строками или текстом в виде сетки - PullRequest
0 голосов
/ 14 сентября 2018

Есть ли способ заставить его работать? Я искал решение, но не нашел ничего особенного. Было бы хорошо, если бы у StringHelper был такой метод! Где-то в yii2 должна быть где-то текстовая функция сравнения, потому что в gii есть и различие, не так ли? DiffRendererHtmlInline? Что это? Это из Гии. Можем ли мы как-нибудь этим воспользоваться?

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

Это должно быть там, но я не могу найти его в своем Yii. На самом деле в yii есть и другие:

  • phpspec / PHP-Diff / Lib / Diff.php

выглядит неплохо. Можем ли мы использовать это как-нибудь?

1 Ответ

0 голосов
/ 17 сентября 2018

Да, мы можем.Это не идеально, но я могу немного изменить его в соответствии со своими потребностями.

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>

Я уверен, что можно сделать его более элегантным, но быстро и грязно это хорошо для меня на данный моментпотому что я не хочу строить его дальше.

...