Василий Столейков

Василий Столейков

С нами с 19 декабря 2012; Место в рейтинге пользователей: #23
16 февраля 2016, 18:15
0
Лексиконы работают, а вот pdoMenu не подхватывается с 0-м родителем…
11 февраля 2016, 15:48
0
Спасибо Василию и Сергею за помощь. В итоге родился сниппет, в котором среди прочего и следующий код решающий мою задачу (я его упростил, оставил лишь принцип себе на будущее):
$sql = "SELECT * FROM modx_baz_orders_1_external WHERE publishedby = {$user_id} UNION
            SELECT * FROM modx_baz_orders_2_internal WHERE publishedby = {$user_id} UNION
            SELECT * FROM modx_baz_orders_3_sea WHERE publishedby = {$user_id}
            ORDER BY ".$sortby." ".$sortdir."
    ";
    $q = $modx->prepare($sql);
    $q->execute(array(0));
    $arr = $q->fetchAll(PDO::FETCH_ASSOC);
     foreach ($arr as $v) {
    	$arr = $v;
        $output .= $pdoTools->getChunk($tpl, $arr);
    }
11 февраля 2016, 09:40
0
Классно, спасибо большое! Очень полезная статья, ещё не дочитал но уже руки чешутся применить…
11 февраля 2016, 09:31
0
Если я правильно понимаю, эти таблицы друг с другом не связаны, просто из каждой таблицы нужно вывести определенные записи.
Да, правильно понимаешь.
Или сделать запрос с UNION через PDO.
Да, значит буду строчить свой сниппет для этого. Спасибо за направление мысли!
11 февраля 2016, 09:23
0
В результате должны выбраться из всех подключаемых таблиц все строки где поле publishedby равно 2. Всё это дело нужно отсортировать по полям publishedon (timestamp-поле) в обратном порядке DESC.
Я скорее всего чего-то недопонимаю, но результат должен быть таким.
11 февраля 2016, 09:14
0
Добавил select, но ничего особенно не поменялось:
'select' => '{
                "BazOrders1External": "*",
                "Internal": "*",
                "Rails": "*"
                }
    ',
11 февраля 2016, 09:08
0
leftJoin и rightJoin ведут себя точно так же. Значит дело в условии? Или в where?
11 февраля 2016, 09:07
0
Так тоже самое выводит:
'innerJoin' => '{ 
                    "Internal":{ "class":"BazOrders2Internal","on":"Internal.publishedby = BazOrders1External.publishedby" }
                     }',
    'innerJoin' => '{ 
                    "Rails":{ "class":"BazOrders4Rails","on":"Rails.publishedby = BazOrders1External.publishedby" }
                     }',
11 февраля 2016, 09:06
0
Вроде бы читал, но почему-то решил указать везде цифру 2, хотя до этого пробовал по другому, например вот так:
{set $resultsCargo = $_modx->runSnippet('!pdoResources', [
    'loadModels' => 'orders_external,orders_rails',
    'class' => 'BazOrders1External',
    'innerJoin' => '{ 
                    "Internal":{ "class":"BazOrders2Internal","on":"Internal.publishedby = BazOrders1External.publishedby" },
                    "Rails":{ "class":"BazOrders4Rails","on":"Rails.publishedby = BazOrders1External.publishedby" }
                     }',
    'tpl' => 'tpl.orders.row.my',
    'limit' => 0,
    'where' => "{ 'publishedby':{$user_id} }",
    'totalVar' => 'myTotalCargo',
    'showLog' => 1
])}
При таком раскладе он считает все строки из таблицы BazOrders4Rails и множит их на количество строк в первой таблице BazOrders1External. Например если в BazOrders4Rails 3 строчки а в BazOrders1External 2, то он выведет 6 результатов, где эти 2 строчки повторяются по 3 раза. BazOrders2Internal тут вообще не выбирает ничего…
11 февраля 2016, 07:55
0
Точно, очень даже логично…
Только вот как использовать UNION в pdoResources?..
Или прийдется писать свой сниппет для вывода?
08 февраля 2016, 15:17
0
Возможно вариант с LIKE получится использовать в массиве, сейчас попробую…
08 февраля 2016, 15:15
0
Если просто вставить твой код в параметр &where у pdoResources, то вроде бы работает… Но!

Вообще-то, раскрою все карты для полного понимания.
Я вывожу через обёртку для pdoResources данные из кастомной таблицы:
[[!orderResources?
    &element=`orderResources`
    &loadModels=`orders_external`
    &class=`BazOrders1External`
    &filters=`export_country,import_country,date_from,transport_type`
    &tpl=`@INLINE {{+idx}}. {{+id}}
`
    &where=`{ 'published': 1 }`
]]
А в обёртке orderResources прохожусь по всем GET-параметрам и по разрешенным из них составляет where-запрос для pdoResources. Если в where уже есть что-то, то он должен ему добавить
if(!empty($scriptProperties['filters'])) {
    $where = array();
    $filters = explode(',',$scriptProperties['filters']);
    if(!empty($scriptProperties['where'])) {
        $where = (array) json_decode($scriptProperties['where']);
        foreach($_GET as $key => $v) {
            if (in_array($key, $filters)){
                if($key == 'date_from') {
                    $unix_begin = strtotime($v);
                    $unix_end = strtotime($v.' 23:59:59');
                    if(isset($where['published'])) {
                        $where_ext = ' AND published=1';
                    }
                    $where[]="date_from BETWEEN $unix_begin AND $unix_end$where_ext"; // тут попробовал добавить существующий параметр в ту же строку
                    
                } else {
                    $where[$key] = $v;
                }
            }        
        }        
    } else {
        foreach($_GET as $key => $v) {
            if (in_array($key, $filters)){
                if($key == 'date_from') {
                    $unix_begin = strtotime($v);
                    $unix_end = strtotime($v.' 23:59:59');
                    $where="date_from BETWEEN $unix_begin AND $unix_end";
                } else {
                    $where[$key] = $v;
                }
            }        
        }        
    }
    $scriptProperties['where'] = json_encode($where);
}
return $modx->runSnippet('pdoResources', $scriptProperties);
Итого: у меня каждый раз в зависимости от GET-параметров должен быть разный WHERE. Ты предлагаешь одной строкой записанной уже, а мне похоже нужно составлять json-запрос из получившегося массива…
08 февраля 2016, 14:44
0
Спасибо! Почему-то так и думал что именно ты ответишь на такой вопрос! ;)
А как мне этот запрос запихнуть в pdoResources?
Я просто использую следующую конструкцию для передачи $where в pdoResources:
$scriptProperties['where'] = json_encode($where);
return $modx->runSnippet('pdoResources', $scriptProperties);
06 февраля 2016, 19:21
0
Для ресурсов да. Кстати, Group Edit — крутая штука, только вот жаль что проект закрыт и не поддерживается. Хотя автор и считает что Collections заменяет его, но Group Edit уникален для задач быстрого табличного редактирования любых ресурсов сайта…
06 февраля 2016, 19:18
0
А на modstore будет эта же панелька? Или оставите там те ссылки что там есть? Просто думал что и там она будет и потерялся сначала от неожиданности, потому и уточняю…
05 февраля 2016, 15:19
0
А есть возможность прицепить какую-то комбинацию нажатий для открытия елемента в новой вкладке?
05 февраля 2016, 12:54
+2
Только вчера разобрался со слаком как сегодня уже статья! Надо было мне подождать )))
Панелька очень удобная, тоже сразу заметил что ещё не на всех проектах. Если она будет везде одинаковая и в одном и том же стиле — будет очень удобно переключаться между сайтами!
05 февраля 2016, 11:35
0
Уже есть, спасибо, всё супер!
05 февраля 2016, 09:02
0
Обновление связано только с PHP 5.3? Версии PHP выше, например 5.5 поддерживаются?
05 февраля 2016, 08:58
0
Круто! Спасибо — реально должно сохранить нервы… )))
P.S. Админка обновление не видит, возможно дойдёт ещё…