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

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

С нами с 19 декабря 2015; Место в рейтинге пользователей: #15
Александр Туниеков
05 марта 2020, 12:32
0
Читал год назад. (int) использую, а с санацией строки проблема вышла. В поле название города кавычки писались и его никто найти не мог. Так что, санация это работа надолго :-(.
Александр Туниеков
05 марта 2020, 12:20
0
Актуальность в одну минут, вообще не принципиально)))
В смысле, крон настраивать запросы для этих таблиц писать. На 80 базовых таблиц — это офигенное кол-во временных. Сайт только висеть будет их генерировать.
Александр Туниеков
05 марта 2020, 12:05
0
Если бы ты принял этот PR, пришлось бы pdoTools удалять.
Дыры много где есть. И никто вам не мешает взять и переписать PR или что-то еще без дыр, если они там есть. Вроде ничего такого не должно быть. Все стандартные дыры MODX только.
Александр Туниеков
05 марта 2020, 11:50
0
Никогда не понимал зачем такие мега запросы писать. Бесполезных join-нов куча. Этаж сколько выборка этого всего идти будет. А потом еще сидеть постоянно разбирать что там написано.
Выборка достаточно быстро идет. Какие-то тормоза не заметны. И в каком таком случае не приходиться разбирать что написано? Что в сниппете что в запросе одинаково приятно.
Для таких запросов проще временную таблицу сделать куда будут данные сливаться на бэкенде, и потом уже готовые данные забирать на фронте.
И еще за актуальность временных таблиц следить. Причем разных нужных данных может быть много вариантов. Вроде кол-во перестановок пропорционально n! Если 2 таблицы по 5 колонок, то кол-во возможных выборок 10! = 3628800 вариантов :-).
Александр Туниеков
05 марта 2020, 11:39
0
Ну если вы магистр напишите внятную инструкцию как делать санацию параметров.
$where['id'] = (int)$_POST['id'];
(int) это понятно. Для даты strftime можно использовать. А остальное? string, decimal, float. Хотя тоже все понятно. Только писать такие преобразования во все сниппеты долго. Плагин или что-то такое посмотрю. Ну здесь на интранет хакеров лет 10 не предвидеться. А если и предвидятся, то взлом внутреннего сайта это уже мелочь.
Александр Туниеков
04 марта 2020, 23:49
1
+1
Известная проблема :-)
В файле faq.mysql.schema.xml
<field key="question" dbtype="text" length="1023" phptype="text" null="false" default=""/>
phptype=«text» нет такого. Когда-то работало, а сейчас надо phptype=«string». Замените phptype=«text» на phptype=«string» везде в схеме и перегенируйте классы XPDO. Я с помощью migx это делаю. Создание таблиц через MIGX
Александр Туниеков
04 марта 2020, 22:44
0
Сколько будет выполнятся такой вопрос, если сверху на него навесить абстракцию в виде pdoTools? Сорок лет?
Преобразовать массив на 10-40 ключей в строку 100-600 символов? Явно миллисекунды :-).

После последней правки, подзапрос добавил плюс 7 мс к общему выполнению запроса. getChunk операция затратная. Целых 5 мс :-).
Александр Туниеков
04 марта 2020, 22:16
-2
А если серьёзно, то ты пишешь очень сложный запрос, который не понадобится 99% пользователей pdoTools, а может и вообще MODX
Если 1% понадобится, то уже неплохо. 99% не понадобиться — это не слишком хороший критерий. Взлетит не взлетит 100% не угадаешь. То есть, это критерий на способности предсказывать будущие. А оно не слишком предсказуемо.
Он не станет менее сложным, если засунуть его в массив Fenom, никто ничего от этого не выиграет.
А, кстати, тогда зачем вообще запросы описывать массивом феном? Можно же вообще писать чисто SQL.
XPDO это типа ORM. В нем получил объект и сразу можно что-то записать в базу. В pdoTools только чисто вывод.
Мне просто удобнее сам синтаксис pdoTools писать. И, так как запрос массив, есть возможность на лету его поменять. Приготовил массив запроса, а потом where добавляешь или удаляешь когда надо. На чисто sql менять where жуть. Код 5 лет назад :-). Ни pdoTools ни strftime еще не знал.
if(isset($_GET['date1'])){
    $modx->setPlaceholder('date1',$_GET['date1']);
    if(isset($_GET['date2'])){
        $modx->setPlaceholder('date2',$_GET['date2']);
    }
    if($_GET['date1']!='' and $_GET['date2']==''){
       $where = "where o.makedate >='".$_GET['date1']." 00:00:00' and l.status_id=1"; 
    }elseif($_GET['date2']!=''){
        $where = "where o.makedate >='".$_GET['date1']." 00:00:00' and o.makedate <='".$_GET['date2']." 23:59:59' and l.status_id=1";
    }
}else{
    $where = "where l.status_id=1";
}
Тоже для XPDO и pdoTools
$where = [ 'l.status_id'=>1];
if($_GET['date1']){
    $modx->setPlaceholder('date1',$_GET['date1']);
    $where['o.makedate:>='] = '".$_GET['date1']." 00:00:00'";
}
if($_GET['date2']){
    $modx->setPlaceholder('date2',$_GET['date2']);
    $where['o.makedate:<='] = '".$_GET['date2']." 23:59:59'";
}
Явно проще. Особенно когда фильтр больше на параметров 6.
А вот пример уже с феном.
{set $where = [
        'Detail.flanec:NOT IN'=>[1,3],
        'Detail.sech'=>'pryam',
        ]}
    {if $.get.sk_order_id}{set $where['Detail.sk_order_id']=$.get.sk_order_id}{/if}
    {if $.get.smena_id}{set $where['tSkladDetNSLink.smena_id']=$.get.smena_id}{/if}
    {if $.get.type_job_id}{set $where['DetailClass.type_job_id']=$.get.type_job_id}{/if}
Так что запрос в массиве штука полезная.
А вот подзапросов в массиве у меня не было. Поиграюсь, посмотрю, что можно с ними сделать. Хотя, конечно, их на каждом шагу внедрять не стоит.
Усилия по добавлению этого функционала не просто ничего не стоят, они отрицательные не длинной дистанции, потому что нужно будет отвечать на вопросы по конвертации этих твоих вложенных массивов в SQL.
Это аргумент. Отвечать на вопросы кучи начинающих прогеров не самая приятная перспектива. Но тормозить из-за этого компоненты или проекты?? Это раз. И два. Отвечать имеет смысл, если развивать свою команду. С которой можно делать очень большие проекты. Такие как linux, например. Думаю сеньор не предел развития программиста. Можно как-бы основать свою школу и стать что-то вроде академика.
Периодически будут находиться люди, пытающиеся наворотить какую-нибудь фигню в этими параметрами. Как сейчас это делают с долбаным tvFilters.
Будут явно. Люди пытаются решить свои задачи. Изучаем их задачи и пишем код, чтобы у них был инструмент для их задач :-). Прикалываюсь, если что :-). Но в каждой шутке доля шутки…

Резюме.
Я этот PR не приму, удачи в развитии своих дополнений.

Ну как хотите. Я то надеялся, что вот крутая фишка пользуйтесь. Но, возможно, это и не так круто как мне кажется. Подзапросы, когда они мне понадобятся буду писать в своей версии синтаксиса pdoTools. Просто потому, что мне так удобнее. Сейчас, практические преимущества этой версии не понятны :-(.

PS. Сюда $fields массивом иногда приходят.
$fields = 'SQL_CALC_FOUND_ROWS ' . $fields;
В итоге запрос выглядит так:
SELECT SQL_CALC_FOUND_ROWSArray FROM
Где $fields массивом становиться не нашел. Просто implode сделал. Может разберетесь?
Александр Туниеков
04 марта 2020, 19:56
0
Блин. Мне не нужны сырые запросы. Мне надо, чтоб запрос был подготовлен. Вдруг я префикс базы захочу изменить, а в куче запросов он будет указан.
Александр Туниеков
04 марта 2020, 19:40
-2
А нафига ж ты его прислал с своём PR?
Торопился не проверил. И мне он нравиться :-).
Не надо.
Подсадили всех на pdoTools, а теперь нужные правки отказываетесь принять? :-) Проявите ответственность :-)
Александр Туниеков
04 марта 2020, 19:31
0
проверяешь свой новый придуманный синтаксис на pdoFetch с твоими изменениями, и без них? И приводишь как доказательство, что твой синтаксис без твоих изменений в pdoFetch не работает?
1) Сперва проверил синтаксис на чистом pdoTools. Понятно дело ошибка.
2) Проверил синтаксис только с заменой pdoFetch. Заработало. То есть
Я уже не принял предыдущий PR

принимать этот PR Не требуется..
3) Ну и на всякий случай проверил как весь сайт без предыдущего PR будет работать. Нормально работает. (Только в стилях пробелов понаставил).

Сейчас подготовлю PR чисто для подзапросов. Еще через минут 20 будет.
Александр Туниеков
04 марта 2020, 16:20
-1
ты легко запилишь прекрасный форк
Запилю :-). Надо для работы. Не легко :-(.
И будешь его потом поддерживать бесплатно, годами.
Не буду :-). Наверно передам кому-нибудь, если будут желающие. Но пока такой ситуации нет, так что вопрос открытый. Проблемы решаю по мере поступления.
Александр Туниеков
04 марта 2020, 16:14
0
Пиши свои допы, развивай — Сергей верно говорит.
Ниже пример с подзапросом. Нужно для одного этапа производства детали получить на когда запланирован следующий этап. С измененным pdoTool, это можно получить через pdoResources. Не надо писать никаких сниппетов. Их уже и так целая куча.
Как можно сделать доп, чтобы можно было так же через pdoResources вывести нужную информацию, не меняя pdoTools?
{'!pdoResources' | snippet :[
    'loadModels'=>'tSklad',
    'subpdo'=>[
        'test'=>[
            'class'=>'tSkladDetNSLink',
            'alias'=>'NextDNL',
            'select'=>[
                'NextDNL'=>'NextDNL.smena_id',
            ],
            'leftJoin'=>[
                'NextS'=>[
                    'class'=>'tSkladSmena',
                    'on'=>'NextS.id=NextDNL.smena_id',
                    'where'=>[
                        'NextS.date > Smena.date',
                    ],
                ],
            ],
            'where'=>[
                'NextS.date > Smena.date',
            ],
            'sortby'=>[
                'NextS.date'=>'ASC',
                'NextS.number'=>'ASC',
            ],
            'limit'=>1,
        ],
    ],
    'class'=>'tSkladDetNSLink',
    'select'=>[
        'tSkladDetNSLink'=>'tSkladDetNSLink.id,Smena.id as smena_id, ({$subpdo.test}) as on_next_smena_id',
    ],
    'leftJoin'=>[
        'Smena'=>[
            'class'=>'tSkladSmena',
            'on'=>'Smena.id=tSkladDetNSLink.smena_id',
        ],
    ],
    'where'=>[
        'Smena.id > 0',
    ],
    'sortby'=>[
        'tSkladDetNSLink.id'=>'DESC',
    ],
    'limit'=>10,
    'tpl'=>'subpdo_test',
    'showLog'=>1,
]}
Александр Туниеков
04 марта 2020, 16:01
0
Меня волновали. Года 3 :-). Просто обходился чистым sql. Думаю, далеко не всем, но нужны. Может просто никто не говорил. Вообще интересно опрос устроить. Правда на modx.pro опросов нет :-(.
Александр Туниеков
04 марта 2020, 15:55
0
Саша, ты несёшь такую пургу, что я просто теряюсь.
Для меня вроде все логично что я пишу, но я могу ошибаться и у людей с разным опытом разные мнения. И не супер писатель я. Не всегда понятно пишу. Надо общаться и писать просто больше…
Скажи пожалуйста, каким образом у тебя построение запроса через xPDO приводит к ошибке работы Fenom?
Что-то я совсем не понял с честь чего у вас такой вопрос?? «построение запроса через xPDO приводит к ошибке работы Fenom» — вроде нигде такого не говорил. Василий, пожалуйста, поясните, что вы имеете в виду.
Александр Туниеков
04 марта 2020, 15:06
0
Уф… Пример напишите запроса с xPDO.getCollection раз. Два pdoTools удобнее.
Вполне логично написать свой сниппет или плагин!
Лишние сниппеты не нужны!!! А, кстати, плагин тут причем?
Короче не морочте мне голову :-)
Александр Туниеков
04 марта 2020, 14:22
0
А авторы Tikkets вообще собираются редактор сообщений обновлять?
Офтопик (скрытый раскрывающейся блок) вроде уже давно стандарт. Километры кодов, логов и запросов нагружают восприятие текста, а вырезать лишнее замучишся. В офтопик проще засунуть и восприятие не нагружает и кому надо может все полностью посмотреть.
Еще выделение цветом блока в блоке кода тоже хорошо было бы. И загрузка файлов без перехода в Файлохранилище тоже не помешает.
Александр Туниеков
04 марта 2020, 14:10
0
под видом необходимого для подзапросов
Ладно счас протестирую на коде из коммента. Поставил чистый pdoTools 2.11.3-pl. Ответ:
0.0009770: SQL prepared "SELECT tSkladDetNSLink.id, Smena.id as smena_id, () as on_next_smena_id
Подзапроса нет. Заменяем pdofetch.class.php.
Все правильно выведено :-). Add Fenom soft mode не потребовалось.
Страницы сайта не работают. Ошибка pdotools.class.php: 989) Unexpected tag 'display' in 0b3013274c174a9c5505daeb0e70dfc6 line 27, near '{display:' < — there
Через modDevTools заменяю все {display на { display. Затем также {font
Сайт заработал. В getTables тоже все работает :-). Ну я написал, что не все тестировал. Что-то когда-то не запустилось, а с Add Fenom soft mode заработало. И дальше я со стандартным пакетом не работал. И тут
Эта возможно с этой правкой Add Fenom soft mode… Без нее, скорей всего, феном не поймет
, тоже оговорился что скорее всего.

PR Add Fenom soft mode не требуется. Если он вам так не нравиться, подзапросы можно принять без него. Актуальные изменения только в pdofetch.class.php.
Правок не много и сами можете написать так как вам хочется. Только синтаксис subpdo просьба сохранить, но тоже не обязательно :-). 1 сниппет можно и поправить.
Александр Туниеков
04 марта 2020, 13:02
0
Не нужно лезть в исходники!!!
Думал расширить феном, но там все функции оказались privite и protected. И меня это так разочаровало, что функции pdoTools я и не думал расширять, а тупо писал что мне нужно в исходники. Иногда нужно исходники править, чтоб не усложнять код и, если исходники обновились, чтобы компонент смог работать.
Я не мучал автора своими пулами.
Зря :-). Авторы бывают ленивыми и зазнайками. Их надо мучать, чтоб прогресс был. Подзапросы вроде вещь актуальная. Разве нет?
И не стоит плодить кучу разных компонентов. В wordpress, взяв сделанный кем-то сайт, приходиться изучать десяток новых плагинов. Такой компонент как pdoTools лучше, чтоб один был и со стандартным синтаксисом.
Александр Туниеков
03 марта 2020, 22:59
0
Решил проверить как сработает и написал простенький код :-):
{'!pdoResources' | snippet :[
    'loadModels'=>'tSklad',
    'subpdo'=>[
        'test'=>[
            'class'=>'tSkladDetNSLink',
            'alias'=>'NextDNL',
            'select'=>[
                'NextDNL'=>'NextDNL.smena_id',
            ],
            'leftJoin'=>[
                'NextS'=>[
                    'class'=>'tSkladSmena',
                    'on'=>'NextS.id=NextDNL.smena_id',
                    'where'=>[
                        'NextS.date > Smena.date',
                    ],
                ],
            ],
            'where'=>[
                'NextS.date > Smena.date',
            ],
            'sortby'=>[
                'NextS.date'=>'ASC',
                'NextS.number'=>'ASC',
            ],
            'limit'=>1,
        ],
    ],
    'class'=>'tSkladDetNSLink',
    'select'=>[
        'tSkladDetNSLink'=>'tSkladDetNSLink.id,Smena.id as smena_id, ({$subpdo.test}) as on_next_smena_id',
    ],
    'leftJoin'=>[
        'Smena'=>[
            'class'=>'tSkladSmena',
            'on'=>'Smena.id=tSkladDetNSLink.smena_id',
        ],
    ],
    'where'=>[
        'Smena.id > 0',
    ],
    'sortby'=>[
        'tSkladDetNSLink.id'=>'DESC',
    ],
    'limit'=>10,
    'tpl'=>'subpdo_test',
    'showLog'=>1,
]}
И этот код я уже считаю простеньким :-). Есть у меня подобные конфиги и на 571 строку! Жесть.
Вот вывел: