Александр Туниеков

Александр Туниеков

С нами с 19 декабря 2015; Место в рейтинге пользователей: #15
Александр Туниеков
14 ноября 2019, 23:12
0
Мне кажется, сейчас сайт сломаешь, если только специально ломать.
Вставляю
{
{$_modx->user.fullname}
<script>
    x = {"active":1};
    console.info(x);
</script>
на сайте { Администратор по умолчанию
{if 
{$_modx->user.fullname}
{if {$_modx->user.fullname}
{if}
{$_modx->user.fullname}
{if} Администратор по умолчанию
{if true}
{$_modx->user.fullname}
Сломался. Так как не закрытый блок. Только, что-то сомнительно, чтоб менеджеры {if или {if true} нечаянно написали.
{a
{$_modx->user.fullname}
на сайте: {a {$_modx->user.fullname}
А вот это могут :-(.
Ну меня, пока, устраивает, что не ломается по каждому чиху. Посмотрим что дальше будет.
Александр Туниеков
14 ноября 2019, 22:50
0
Сделал PR на fenom и на pdoTools.
This option, when compiling a Fenom tag error, enables the output of this tag as is and output error in pdoTools for MODX log. To inverse JS / JSON code on MODX template.
Изменения вносятся одновременно в 2 компонента. Сюда в pdoTools и в исходники Fenom. Чтоб опция работала, нужно, либо загрузить fenom с форка github.com/touol/fenom, либо дождаться примут PR и обновить исходники.
Опция pdotools_fenom_soft_mode включается системных настройках pdoTools. При ее включении, fenom феном, не распознанные теги, добавляет в текст шаблона(чанка) как есть и продолжает компилировать шаблон. При включении pdotools_fenom_save_on_errors, ошибки сохраняются в лог MODX.
Изменено поведение только самой критичной части компилятора fenom здесь. То есть, ошибки на валидном JS / JSON коде. В остальных случаях, феном так же выбрасывает исключения (На не закрытых {if ..},{block},{ignore} и т.д.).
Транспортный пакет с правками pdoTools и fenom file.modx.pro/files/7/5/8/758e797e15b740fd58e7993054996bc3.zip (переименовать в pdotools-2.13.0-pl.transport.zip)
Есть желающие протестировать? Вдруг что-то еще поправить надо.
Александр Туниеков
14 ноября 2019, 13:22
0
Так обсуждается уже :-). В теме ссылка.
Александр Туниеков
14 ноября 2019, 13:12
0
Конечно разные. Однако прежде чем сделать всегда есть идея что сделать. Без нее делать то нечего :-). Так вот, идея есть и она предложена на рассмотрение, а сделать в процессе и зависит, в общем-то, от итогов рассмотрения.
И поддержка от заинтересованных лиц не помешала бы. А вот заинтересованные лица «жуют попкорн» :-).
Александр Туниеков
13 ноября 2019, 23:08
0
Вообщем в чем проблема не разберусь :-(. Когда возникнет ошибка попробуете правила отключать. Например это
### Редиректы с index.php или index.html на сайт
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html)\ HTTP/
RewriteRule .* / [R=301,L]
Если вдруг от этого заработает, будет больше инфы куда копать.
Александр Туниеков
13 ноября 2019, 19:00
0
$q= «UPDATE `site_tmplvar_contentvalues` SET `value` = REPLACE(`value`, 'value_1', 'value_2') WHERE `tmplvarid` = ID_TV AND `contentid` IN (SELECT `id` FROM site_content WHERE template= 8)»;
Александр Туниеков
13 ноября 2019, 18:18
0
Ну во первых, можно сделать скрипт который будет работать в ssh сессии и там нет ограничений на время выполнения.
Во вторых, console умеет выполнять код много раз. Как здесь ilyaut.ru/cheats/to-rebuild-all-previews-of-products/
В смысле, ставите limit и offset в запрос. offset пишете в сессию и читаете его из нее.
$_SESSION['Console']['completed'] = false;
показывает console, что код нужно повторить.
Александр Туниеков
13 ноября 2019, 17:45
0
Еще бы Василия привлечь к обсуждению, но у него issues закрыт github.com/bezumkin/pdoTools и где искать его контакты не понятно.
Александр Туниеков
13 ноября 2019, 17:42
+1
Ну хостера не знаю. А остальные вопросы?
Прям не знаю, толи злиться, толи смеяться. Просят помощи, а нужную инфу не дают.
Александр Туниеков
13 ноября 2019, 17:18
0
Так, кто хочет решить проблему, помогайте разрабам объяснить, что проблема есть и ее нужно решать :-).
А то чувствую в отказ уйдут.
github.com/fenom-template/fenom/issues/308
Александр Туниеков
13 ноября 2019, 17:13
0
Хм… Это не часть кода, а весь код возвращается как HTML yadi.sk/i/YVv8sFEM7hGyFQ
У Вас Apache вообще? В .htaccess что? И что за хостер?
Александр Туниеков
13 ноября 2019, 16:48
0
можете взять и сделать так, чтобы все работало без лишних наворотов, все скажут вам спасибо!
Вроде предложил решение, чтоб все работало без наворотов, а спасибо не от кого не слышно :-).
Александр Туниеков
13 ноября 2019, 16:10
0
У MODX есть глюки с кешем. У меня вот при работе в админке на одном сайте периодически код в кеше плагина задваивается и сайт вылетает. Пока влазить во внутренности MODX по этой проблеме не решился. Админка там только мной и не часто используется. Ладно это лирика.
У Вас почему-то на странице вываливается часть кода файла index.php yadi.sk/i/TsEpmxrJtz5Mzg
По идее это проблемы настройки сервера php, а не MODX. Но почему тогда очистка кеша помогает не понятно.
Сделайте плиз скриншот страницы с ошибкой. И проверьте настройки сервера qaru.site/questions/3368/php-code-is-not-being-executed-instead-code-shows-on-the-page
Александр Туниеков
12 ноября 2019, 15:02
0
По-вашему рецепту эта ошибка вылезет намного позже и с наслоениями, вероятно у других людей, возможно у менеджеров.
Если не правильно написан тег фенома, то на странице он просто выведется и в логе MODX будет описание. То есть ошибку сразу видно и плюс видно сам не правильный тег. А если на феном переводиться готовый сайт, то все JS/JSON будут работать как и работали. Без проблем. И если менеджер введет проставит фигурные скобочки в контент, то они так же отобразятся.

Единственное если менеджер поставит открывающую скобку без закрывающей, то сайт сломается на строке github.com/fenom-template/fenom/blob/fc188a582229c7735df1bb584eb268548a957f46/src/Fenom/Template.php#L248 Но я даже не знаю как это обойти :-(. Можно, конечно, так же, вместо исключения, запихать ошибку в лог и тег проигнорировать, но скорее всего fenom поймает закрывающую скобку хорошего тега и сайт снова сломается. В смысле поломается порядок тегов. Вместо {'asd' | snippet} в обработку попадет {текст {'asd' | snippet}
Александр Туниеков
12 ноября 2019, 14:26
0
В сниппете ошибка. В коде страницы поправил, а здесь забыл.
[[!pdoResources?
&parents=`1`
&where=`{"active":1}`
]]
Александр Туниеков
12 ноября 2019, 14:12
0
Сейчас ошибка возникает фиг знает где. Вот последний случай. Мне понадобилось включить fenom на страницах готового сайта. И сайт стал показывать пустые страницы. В логах
pdotools.class.php : 989) Unexpected token ':' in 65502631cb124d85a4b77cf0b9656e40 line 71, near '{"active":' <- there
То есть, не понятно в каком шаблоне или чанке или контенте или tv. Ищи где хочешь.
Оказалось в шаблоне нашел и поправил быстро. Но пришлось поволноваться. Ошибку вызывает вызов типа
[[!pdoResource?
&parents=`1`
&where=``{"active":1}`
]]
Сейчас я воспроизвел ее на тестовом сайте. yadi.sk/i/fPFVkXKf9M8oIQ
Вчера я наметил идею. То есть, не окончательный вариант. Счас попробуем реализовать.
Реализовал. Вот изменения:
Файл core/components/pdotools/vendor/fenom/fenom/src/Fenom/Template.php со строки 273
} else {
                            try{
                                $code = $this->parseTag($tokens);
                                if ($tokens->key()) { // if tokenizer have tokens - throws exceptions
                                    throw new CompileException("Unexpected token '" . $tokens->current() . "' in {$this} line {$this->_line}, near '{" . $tokens->getSnippetAsString(0, 0) . "' <- there", 0, E_ERROR, $this->_name, $this->_line);
                                }
                                $this->_appendCode($code, '{' . $tag . '}'); // start the tag lexer
                            }catch (\Exception $e){
                                $this->_appendText('{' . $tag . '}');
                                $this->_appendText('<pre class="fenomLog">'.$e->getMessage().'</pre>');
                            }
                        }
Файл core/components/pdotools/model/pdotools/pdotools.class.php со строки 580
$content = $tpl->fetch($properties);
                    //$this->modx->log(modX::LOG_LEVEL_ERROR, $tpl);
                    //$this->modx->log(modX::LOG_LEVEL_ERROR, $content);
                    if(preg_match("#<pre class=\"fenomLog\">(.*?)</pre>#is", $content, $matches)){
                        $content = preg_replace("#<pre class=\"fenomLog\">(.*?)</pre>#is", "", $content);
                        $this->modx->log(modX::LOG_LEVEL_ERROR, print_r($matches,1));
                    }
Журнал ошибок
[2019-11-12 14:03:20] (ERROR @ D:\OpenServer\domains\modx.loc\core\components\pdotools\model\pdotools\pdotools.class.php : 585) Array
(
    [0] => <pre class="fenomLog">Unexpected token ':' in 57d5300dc6213bb54abc3938f719d063 line 72, near '{"active":' <- there</pre>
    [1] => Unexpected token ':' in 57d5300dc6213bb54abc3938f719d063 line 72, near '{"active":' <- there
)

[2019-11-12 14:03:20] (ERROR @ D:\OpenServer\domains\modx.loc\core\components\pdotools\model\pdotools\pdofetch.class.php : 172) [pdoTools] Error 42S22: Unknown column 'modResource.active' in 'where clause'
Страница нормально грузиться yadi.sk/i/yTdJ1mWadBz_nQ и если бы у меня на тестовом сайте было бы поле modResource.active то и сниппет бы нормально отработал. То есть, все JS/JSON отработали бы без ошибок.
Александр Туниеков
12 ноября 2019, 00:11
+1
Вопрос актуальный. Тоже на этой скобке проблемы вылазят. Взглянул на исходники fenom. По идее фигурная скобка прошита только в этой функции github.com/fenom-template/fenom/blob/fc188a582229c7735df1bb584eb268548a957f46/src/Fenom/Template.php#L212
В принципе, ее там можно заменить чем-то другим, но спецсимволов на клаве не так много, и все где-то используются. А двойным символом заменять не красиво и не удобно :-(.
Думаю лучше чтоб на этой строке github.com/fenom-template/fenom/blob/fc188a582229c7735df1bb584eb268548a957f46/src/Fenom/Template.php#L276
не создавалось исключение с обрывом компиляции, а чтоб ошибка кидалась в лог и компиляция продолжалась.
Лог прикрутить довольно сложно.
$result = $fenom->fetch("template/name.tpl", $vars);
Возвращает уже откомпилированную страницу. Не массив. И чтоб метод вернул массив много изменений надо.
Можно сделать костыль. Вместо исключения
throw new CompileException("Unexpected token '" . $tokens->current() . "' in {$this} line {$this->_line}, near '{" . $tokens->getSnippetAsString(0, 0) . "' <- there", 0, E_ERROR, $this->_name, $this->_line);
Запихать ошибку в текст страницы
$error_text = "Unexpected token '" . $tokens->current() . "' in {$this} line {$this->_line}, near '{" . $tokens->getSnippetAsString(0, 0) . "' <- there";
$this->_appendText("<!--log ".$error_text." end_log-->");
И уже в MODX в pdoParser вылавливать ошибку в тексте и писать ее в лог MODX.
Ну вот так по идее можно решить проблему :-)
Александр Туниеков
25 сентября 2019, 06:54
0
Сам задал вопрос. Сам и отвечу :-).
Проблема не в MODX а в классе php finfo. На одном хостинге он на тип файла возвращает «text/html», на другом «application/xml». Или от версии php зависит.
Я поправил в MODX файл core/model/modx/modfilehandler.class.php
/**
     * Tells if a file is a binary file or not.
     *
     * @param string $file
     * @return boolean True if a binary file.
     */
    public function isBinary($file) {
        if (!file_exists($file) || !is_file($file)) {
            return false;
        }

        if (filesize($file) > 0 && class_exists('\finfo')) {
            $finfo = new \finfo(FILEINFO_MIME);
            $info_file = $finfo->file($file);
            //$this->modx->log(1,"$file ".$info_file);
            if(strpos($info_file, "application/xml") !== false) {
                //$this->modx->log(1,"$file ".$info_file);
                return false;
            }
            return substr($info_file, 0, 4) !== 'text';
        }

        $fh = @fopen($file, 'r');
        $blk = @fread($fh, 512);
        @fclose($fh);
        @clearstatcache();
        return (substr_count($blk, "^ -~" /*. "^\r\n"*/) / 512 > 0.3) || (substr_count($blk, "\x00") > 0);
    }
Теперь xml редактируется у меня.
Александр Туниеков
24 сентября 2019, 12:16
0
2 раза подобный модуль делал, а прилизать и оформить в отдельный компоненть и выложить руки не добрались :-).