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

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

С нами с 03 марта 2014; Место в рейтинге пользователей: #70
Павел Романов
10 января 2024, 12:36
1
+1
В колонке назовите это поле как-нибудь иначе:


В рендере используйте реальное имя.
Если pdoTools установлен и поле называется «project», то так:
Павел Романов
22 ноября 2023, 16:36
0
А в коде страницы что (если Ctrl+U нажать)?
Павел Романов
22 ноября 2023, 15:04
0
А для чего тут pdoPage?
Просто используйте pdoSitemap с limit (остальные параметры тут не нужны):
{'pdoSitemap' | snippet  : [
    'limit' => 100,
]}
Ну и шаблон должен быть пустым.
Павел Романов
09 ноября 2023, 19:30
+1
Версия MODX 2.8.6?
Если да, то попробуйте это: modx.pro/news/24265#comment-140918

PS
Уже написали ))
Павел Романов
15 октября 2023, 10:36
0
Попробуйте так:
[[getImageList?
    &docid=`123` 
    &where=`{ "part-name:LIKE":" %***% " }` 
    &tpl=`tpl.part`
]]
123 — ID ресурса с TV migxTable
*** — критерий для отбора в поле Название

Чанк tpl.part
<div class="part-data">
  <h2>[[+part-name]]</h2>
  <p>Изображение заведения: <img src="[[+part-image]]"></p>
  <p>Адрес заведения: [[+part-adress]]</p>
</div>
Павел Романов
18 сентября 2023, 12:47
0
Автор — Павел Гвоздь.
Протестировать любое дополнение можно на тестовом тарифе Modhost.
Павел Романов
12 сентября 2023, 15:31
+1
В /core/components/console/files/
Павел Романов
02 августа 2023, 16:07
0
Вам нужно проверять стоит ли в определенных TV у родительского ресурса «1» и если стоит, то выводить их название?
  • Для чего получать все TV родителя?
  • Зачем прописывать текущему ресурсу родительские TV?

Сделайте как я написал выше — это универсальное решение.

Если требуется выводить не название TV а какой-то произвольный текст, то можете так:
<?php
$docid = $modx->getOption('docid', $scriptProperties, $resource->get('id'));
$tvs = json_decode($tvs,1);
$out = array();
foreach($tvs as $tv => $name){
	if(!$tvo = $modx->getObject('modTemplateVar', array('name' => trim($tv)))) continue;
	if(!$tvres = $modx->getObject('modTemplateVarResource', array('tmplvarid' => $tvo->get('id'),'contentid' => $docid, 'value' => 1))) continue;
	$out[] = $name;
}
return implode(', ', $out);

А в вызове указывайте для какой TV какой текст выводить:
[[checkTV?
    &tvs = `{ "tovar_forel_chekbox":"форель","tovar_shuka_chekbox":"щука","tovar_kit_chekbox":"кит" }`
    &docid=`[[*parent]]`
]]
Павел Романов
02 августа 2023, 11:50
0
Если сами TV-шки называются «есть щука», «есть форель» и «есть кит», то так:
<?php
$docid = $modx->getOption('docid', $scriptProperties, $resource->get('id'));
$tvs = explode(',', $tvs);
$out = array();
foreach($tvs as $tv){
	if(!$tvo = $modx->getObject('modTemplateVar', array('name' => trim($tv)))) continue;
	if(!$tvres = $modx->getObject('modTemplateVarResource', array('tmplvarid' => $tvo->get('id'),'contentid' => $docid, 'value' => 1))) continue;
	$out[] = $tvo->get('caption');
}
return implode(', ', $out);

Вызов один:
[[checkTV?
    &docid=`[[*parent]]` //если на дочерних
    &tvs = `tovar_forel_chekbox,tovar_shuka_chekbox,tovar_kit_chekbox`
]]
Павел Романов
03 июля 2023, 10:15
2
+4
Чтобы убрать атрибуты и заодно удалить слеши у одиночных тегов можно сделать плагин на событие onWebPagePrerender )):

<?php
if($modx->resource->get('content_type') == 1){
    $arr1 = array('type="text/css"', 'type="text/javascript"',' />','/>');
    $arr2 = array('','','>','>');
    $output = &$modx->resource->_output;
    $output = str_replace($arr1,$arr2,$output);    
}
Павел Романов
17 июня 2023, 10:53
0
Потому что в коде нет элементов с id, которые указаны в ссылках.
Павел Романов
26 мая 2023, 14:46
0
Добавьте на 20 строке:
<?php
//.......
foreach($tvs as $tv){
   	$a = json_decode($tv['value'], 1);
   	foreach($a as $i){
            $i['resource_id'] = $tv['contentid']; // вот это
   	    $array[] = $i;
   	}
}
//.......
В чанке используйте [[+resource_id]]
Павел Романов
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' => '||'
));