Павел Романов

Павел Романов

С нами с 03 марта 2014; Место в рейтинге пользователей: #70
Павел Романов
26 мая 2023, 14:19
+2
Попробуйте сделать такой сниппет:
<?php
$totalVar = $modx->getOption('totalVar', $scriptProperties, 'total');
$limit = $modx->getOption('limit', $scriptProperties, 10);
$offset = $modx->getOption('offset', $scriptProperties, 0);
$sortby = $modx->getOption('sortby', $scriptProperties, 'MIGX_id');
$sortdir = $modx->getOption('sortdir', $scriptProperties, 'DESC');
$docid = $modx->getOption('docid', $scriptProperties, $modx->resource->get('id'));
$docid = str_replace(' ', '', $docid);

$table = $modx->getOption('table_prefix').'site_tmplvar_contentvalues';
$sql = "SELECT * FROM {$table} WHERE `contentid` IN ({$docid}) AND `tmplvarid` = '{$tvId}'";
$q = $modx->prepare($sql);
$q->execute();
$tvs = $q->fetchAll(PDO::FETCH_ASSOC);

$array = array();
foreach($tvs as $tv){
   	$a = json_decode($tv['value'], 1);
   	foreach($a as $i){
   	    $array[] = $i;
   	}
}
$modx->setPlaceholder($totalVar, count($array));
function sorter($key) {
    return function ($a, $b) use ($key) {
        return strnatcmp($a[$key], $b[$key]);
    };
}
usort($array, sorter($sortby));
$sortdir == 'DESC' ? krsort($array) : ksort($array);
$array = array_slice($array, $offset, $limit);
foreach($array as $item){
    $out .= $modx->getChunk($tpl, $item);
}
return $out;

И используйте его в pdoPage:
[[!pdoPage?
    &element=`SnippetName`
    &tvId=`43` // ID TV "gallery"
    &docid=`18,38,59,46` // ID ресурсов
    &limit=`12`
    &tpl=`tpl-gallery`
]]
[[!+page.nav]]
Павел Романов
25 мая 2023, 19:04
0
Используйте вставку кода, а то теги съедает:


Вывод ссылки в чанке должен быть таким:
<a href="[[+uri]]">Подробнее</a>
или таким:
<a href="[[~[[+id]]]]">Подробнее</a>
Павел Романов
21 мая 2023, 12:22
+1
Сделайте копию сниппета msProducts и перед этой строкой:
$output[] = $pdoFetch->getChunk($tpl, $row);
добавьте:
$row['parents'] = $scriptProperties['parents'];

Поменяйте вызовы msProducts на новый сниппет и теперь сможете в чанках использовать плейсхолдер [[+parents]], который будет выводить то, что указано в параметре &parents в вызове.
Для вывода в чанках именно pagetitle делайте так:

[[#[[+parents]].pagetitle]]

//или на Fenom
{$parents | resource : 'pagetitle'}
Павел Романов
21 мая 2023, 11:10
0
Имеется та, что указана в вызове в &parents?
То есть тут нужно в чанке programs.row вывести pagetitle категории с ID = 180?

[[!msProducts?
    &parents=`180`
    &limit=`0`
    &sortby=`{ "menuindex":"ASC" }`
    &tpl=`programs.row`
]]
Павел Романов
19 мая 2023, 12:27
+1
Если Вам нужно вывести второстепенные категории товара, сделайте сниппет myCategories:
<?php
$id = $modx->getOption('id', $scriptProperties, $modx->resource->get('id'));
$table_cont = $modx->getOption('table_prefix').'site_content';
$table_cat = $modx->getOption('table_prefix').'ms2_product_categories';
$sql = "SELECT * FROM {$table_cat} WHERE `product_id` = {$id}";
$q = $modx->prepare($sql);
$q->execute();
$resources = $q->fetchAll(PDO::FETCH_ASSOC);
foreach ($resources as $category){
    $cid = $category['category_id'];
	if($result = $modx->query("SELECT * FROM {$table_cont} WHERE id = {$cid}")){
		$row = $result->fetch(PDO::FETCH_ASSOC);
		$out .= $modx->getChunk($tpl, $row);
	}
}
return $out;

В чанке msProducts (programs.row) вызывайте его так:
[[myCategories? &id=`[[+id]]`&tpl=`subcat_tpl`]]
Или на Fenom
{'myCategories' | snippet: ['id' => $id, 'tpl' => 'subcat_tpl']}
В карточке товара &id можно не указывать.

В чанке subcat_tpl доступны любые поля категории: [[+pagetitle]], [[+content]] и т. д.
Павел Романов
16 мая 2023, 13:05
+1
Создайте в настройках каждого контекста параметр id_category и укажите там соответствующий ID.
В возможных значениях у TV пропишите:
@EVAL
if(!$res =  $modx->getObject('modResource', $_GET['id'])) return;
if(!$setting = $modx->getObject('modContextSetting', array('context_key' => $res->get('context_key'), 'key' => 'id_category'))) return;
$docid = $setting->get('value');

return $modx->runSnippet('pdoResources',array(
    'parents' => $docid ,
    'limit' => 0,
    'tpl' => '@INLINE [[+pagetitle]] ([[+id]])==[[+id]]',
    'outputSeparator' => '||'
));
Павел Романов
09 мая 2023, 17:27
0
На одном проекте (хостинг Reg.Ru) 35 810 записей, по 10 на страницу.
Первоначальная загрузка 7 сек., далее быстро, даже если по 100 строк выводить.
Экспорт встроенными средствами (CSV, 60МБ) секунд пять.
Павел Романов
25 апреля 2023, 08:48
2
+1
Сделайте сниппет getFileDate:
<?php
return date("Y-m-d H:i:s",filectime(MODX_BASE_PATH . $file));

Вызывайте в соответствующей колонке:
[[!getFileDate? &file=`assets/template/raport/files/raport/raport_2023.xlsx`]]
Павел Романов
16 марта 2023, 09:42
0
Сделайте сниппет и вызывайте в нужном месте некешированным:
<?php
if(date("G") >= 8 && date("G") <= 23){
    $out = $modx->getChunk('telnumber2', array());
}else{
    $out = $modx->getChunk('telnumber1', array());
}
return $out;
Павел Романов
28 февраля 2023, 14:17
0
Если вкладка есть, но комментарии не выводятся, а в консоли ошибка по поводу отсутствия функции strftime, добавить подключение файла strftime-min-1.3.js:
$templates = array(4, 6, 7);
if (in_array($resource->get('template'), $templates)) {
    if($Tickets = $modx->getService('Tickets')){
        $modx->controller->addLexiconTopic('tickets:default');
        $modx->controller->addLastJavascript(MODX_ASSETS_URL.'components/tickets/js/mgr/misc/strftime-min-1.3.js');
        $Tickets->loadManagerFiles($modx->controller, array(
            'config' => true,
            'utils' => true,
            'css' => true,
            'comments' => true,
        ));
        $insert = '
            tabs.add({
                title: _("comments"),
                items: [{
                    xtype: "tickets-panel-comments",
                    hidden: false,
                    record: ' . $modx->toJSON($resource->toArray()) . ',
                    parents: ' . $resource->id . ',
                }]
            });
        ';
        $modx->controller->addHtml('
            <script>
                Ext.ComponentMgr.onAvailable("modx-resource-tabs", function() {
                    var tabs = this;
                    tabs.on("beforerender", function() {
                        ' . $insert . '
                    });
                });
            </script>', true);
    }
}
Павел Романов
24 февраля 2023, 11:53
0
msoptionprice тоже висит на msOnBeforeChangeInCart и может конфликтовать в Вашим плагином.
Попробуйте поменять приоритет.
Павел Романов
15 февраля 2023, 13:59
+1
А если так:
[[!msProducts?
	&templates=`22`
	&parents=`5`
	&where=`{"parent:IN":[ [[!+directparents]] ]}`
	...
]]
Павел Романов
15 февраля 2023, 12:47
0
В where указываются поля ресурса. Непосредственный родитель прописывается в parent и указав так, получите только те, которые находятся непосредственно внутри категории 5:
[[!msProducts?
    ...
    &where=`{ "parent":5 }`
    ...
]]
Павел Романов
14 февраля 2023, 15:40
0
[!TestSnippet] Вам ничего и не выведет, правильно так:
[[!TestSnippet]]

А В нем возвращайте данные стандартно:
<?php
$out = 'Код страны';
return $out;
Павел Романов
13 февраля 2023, 14:37
+1
В настройках магазина » Статусы заказа у нового снимите чекбокс «Письмо покупателю»:

Павел Романов
10 февраля 2023, 18:25
1
0
Можно через SimpleSearch получать только id ресурсов и их уже скармливать msProducts, где использовать стандартные методы сортировки, фильтрации и т. д.:

[[!SimpleSearch?
    &containerTpl=`search_container`
    &tpl=`search_id`
]]

Чанк search_id такой:
[[+id]],

А в чанке search_container уже pdoPage и все, что угодно:

<div id="pdopage">
    <div class="rows">
        [[!pdoPage?
            &element=`msProducts`
            &resources=`[[+results:non]]`
            &parents=`7`
            &templates=`5` // шаблон товара
            &sortby=`Data.price`
            //и т .д.
            ]]
    </div>
    [[!+page.nav]]
</div>

Модификатор non нужен, чтобы убрать переносы строк в списке ID:
<?php
return str_replace(array("\r\n", "\r", "\n"), "", $input);