Почему появляется | в виджете?

InstantCMS 2.X

Заметил, что эта вертикальная черта часто появляется и ее приходится постоянно контролировать, чтобы она автоматически не ставилась. При чем это бывает в 3-5 случаев из 10.

#1 3 апреля 2026 в 11:33

Заметил, что эта вертикальная черта часто появляется и ее приходится постоянно контролировать, чтобы она автоматически не ставилась. При чем это бывает в 3-5 случаев из 10.

Изображение

#2 3 апреля 2026 в 11:45

не только в виджете, во всех текстовых полях админки:) уже где только не поймал

это после последнего обновления

там еще код ломается, какой нить яндекс метрики например. В гугл аналитике пропали "<" перед script, еще что-то.

Проверяйте

#3 3 апреля 2026 в 12:56

это после последнего обновления

kalikimaka

раньше тоже такое было

#4 3 апреля 2026 в 14:06
не только в виджете, во всех текстовых полях админки:) уже где только не поймал это после последнего обновления там еще код ломается, какой нить яндекс метрики например.
kalikimaka

не не не, это длится уже очень давно с ранних версий

#5 3 апреля 2026 в 14:51

Да, такое еще с 2.14 (мой первый инстант). 

#6 3 апреля 2026 в 15:44
Да, такое еще с 2.14 (мой первый инстант). 
pupsik

даже еще раньше

#7 3 апреля 2026 в 18:08

Т.е это у всех, но все стеснялись написать ?)

#8 3 апреля 2026 в 18:14

 Def, Не стеснялись. Просто как-то не напрягало это дело. Не каждый же день виджеты правишь. Поправил и забил. Многие скорей всего даже в эти «Опции» и не заходили.

#9 4 апреля 2026 в 14:03
 Def, Не стеснялись. Просто как-то не напрягало это дело. Не каждый же день виджеты правишь. Поправил и забил. Многие скорей всего даже в эти «Опции» и не заходили.
pupsik

Если делать корп сайт с внутренними посадочными страницами, то это ежедневная задача с виджетами и т.д.

Просто непонятно, почему этот символ то появляется, то нет.

#10 4 апреля 2026 в 19:37

После долго изучения проблемы (потому что это реально подбешивало) вот что я накопал. Лишний символ | появился в YAML-формате — если несколько раз пересохранить виджет «Социальные кнопки» — то на терий четвертый раз он обязательно проявится. По сути — это не ошибка вставки, это ошибка сериализации массива в YAML. Где-то в коде при сохранении массива options в YAML происходит двойное экранирование или неправильное формирование строки. 

Ну тут уже стало понятно что это системный класс Model. Смотрим что в нем:

  1. public static function arrayToYaml($input_array, $indent = 2, $word_wrap = 40) {
  2. // ...
  3. return Spyc::YAMLDump($array, $indent, $word_wrap);
  4. }

Как мне кажется — проблема в библиотеке Spyc. При сохранении массив options преобразуется в YAML через Spyc::YAMLDump(). 

Соответственно (если я конечно прав) — библиотеку надо либо фиксить, либо менять на что то другое. Если мои наблюдения неверны — пните в нужном направлении. 

Добавлено спустя 4 минуты

Ну и вот соответственно виновник в самой библиотеке

  1. private function _doLiteralBlock($value, $indent) {
  2. if ($value === "\n") {
  3. return '\n';
  4. }
  5. if (strpos($value, "\n") === false && strpos($value, "'") === false) {
  6. return sprintf("'%s'", $value);
  7. }
  8. if (strpos($value, "\n") === false && strpos($value, '"') === false) {
  9. return sprintf('"%s"', $value);
  10. }
  11. $exploded = explode("\n", $value);
  12. $newValue = '|';
  13. $indent += $this->_dumpIndent;
  14. $spaces = str_repeat(' ', $indent);
  15. foreach ($exploded as $line) {
  16. $newValue .= "\n" . $spaces . ($line);
  17. }
  18. return $newValue;
  19. }


Фиксим:

  1. private function _doLiteralBlock($value, $indent) {
  2. if ($value === "\n") {
  3. return '\n';
  4. }
  5.  
  6. if (strlen($value) < 3 && strpos($value, "\n") === false) {
  7. if (strpos($value, "'") === false) {
  8. return sprintf("'%s'", $value);
  9. }
  10. if (strpos($value, '"') === false) {
  11. return sprintf('"%s"', $value);
  12. }
  13. }
  14.  
  15. $exploded = explode("\n", $value);
  16. while (isset($exploded[0]) && $exploded[0] === '') {
  17. array_shift($exploded);
  18. }
  19. while (isset($exploded[count($exploded)-1]) && $exploded[count($exploded)-1] === '') {
  20. array_pop($exploded);
  21. }
  22. if (count($exploded) === 1) {
  23. return sprintf('"%s"', addslashes($exploded[0]));
  24. }
  25. $newValue = '|';
  26. $indent += $this->_dumpIndent;
  27. $spaces = str_repeat(' ', $indent);
  28. foreach ($exploded as $line) {
  29. $newValue .= "\n" . $spaces . rtrim($line);
  30. }
  31. return $newValue;
  32. }

Проверяем работу виджета по тому же сценарию — сохраняем три четыре раза — все гуд. работает. Отправлю Pull requests на гит — надеюсь внесут в релиз. 

#11 5 апреля 2026 в 17:17

У меня обычно "|" появляется, когда оставляю пустые строки после кода, например свой шаблон для виджета, в содержимом, в JS. 

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

Похожее в блогах

🍪Мы используем файлы cookie для работы сайта. Читать подробнее.