Александр

Александр

Был в сети 04 октября 2023, 18:04
Заказы не принимаю
Иван Бочкарев
Иван Бочкарев
Можно так:
{set $material = $_modx->resource.project_material | split:'||'}
{foreach $material as $item}
    {set $filter[] = 'project_material=='~$item}
{/foreach}

{'!pdoResources' | snippet : [
  'parents' => 7,
  'limit' => 2,
  'tvPrefix' => '',
  'tvFilters' => $filter,
  'showLog' => 0,
  'sortby' => 'RAND()',
  'includeTVs' => 'project_image,project_price,project_area,project_material,project_size,project_bedrooms,project_bathrooms,location',
  'tpl' => '@FILE chunks/projects/project.tpl',
]}
Сергей Шлоков
Сергей Шлоков
Эх, молодежь. Всё делается гораздо проще. Ставим modHelpers и используем функцию snippet.
{snippet("mySnippet", ["param" => "value"], 604800)}  // сохраняем на неделю. Третий параметр лучше указать через массив (см. ниже)

А в cron удаляем кэш и парсим страницу сниппетом
... // инициализация MODX
// Лучше указать отдельную папку для хранения данных. Иначе данные будут лежать в папке cache/default, которая очищается при сохранении любого объекта MODX.
$options = array(
  cache_key => 'mysnippet_cache',
  cache_expires => 604800,
);
cache()->delete("mySnippet", $options);
snippet("mySnippet", ["param" => "value"], $options);
Что важно! В данном случае сам сниппет на странице вызывается некэшированным. Поэтому кэш самой страницы обновлять не нужно. Только кэш сниппета!!! Обратите внимание, насколько код стал проще.

Функция snippet() сама проверит кэш. Если его нет, то выполнит указанный сниппет и результат сохранит в кэш. И не нужно вычислять все эти секунды. Cron каждую неделю будет обновлять кэш независимо от того, есть он или нет. Поэтому сниппет differenceBetweenDatesInSeconds не нужен. И даже вреден. Ибо делает ненужную работу для каждого запроса страницы.

П.С. И ещё совет. Не пихайте логику во вьюхи. Это бад практис! Перенесите логику в сниппет и вызывайте его на странице.
Андрей Шевяков
Андрей Шевяков
Спасибо @Баха Волков за помощь.

Может кому пригодится:

{foreach $rows as $row}
            {set $tmp = $row.keys | split : ', '}
            {if $term in list $tmp}
                {set $result = $row.title}
                {break}
            {/if}
{/foreach}
{$result ?: 'Ни одного с...ка соответствия'}
Сергей Шлоков
Сергей Шлоков
Буду груб. Если Вы используете MODX, то изучите хотя бы базовые понятия работы с MySql. Как может придти в голову запрос поиска по id с LIKE? Я не говорю про тот же FIND_IN_SET. Не все знают про эту функцию. Но надо же знать, что id — это первичный индекс. По нему запрос с равенством и оператором IN отрабатывает мгновенно. А с LIKE Вы заставляете MySql бежать по всем строкам и проверять вхождение. А если строк будет сотни тысяч или миллион? Вроде же не новичок…
Jury
Jury
Была такая проблема при обновлении на 2.7.
На сервере, стояла локаль en_US.UTF-8 UTF-8
Прописал в настойках modx locale en_US.UTF-8 и ошибка ушла
Что бы использовать ru_RU.UTF-8
Сгенерировал две локали на сервере
root@localhost:~# cat /etc/locale.gen | grep -v '#'
en_US.UTF-8 UTF-8
ru_RU.UTF-8 UTF-8
При этом кириллическую локаль поставил основной, и все гуд.
проверить можно так
root@localhost:~# echo $LANG
Максим
Максим
Все гораздо проще! Установите компонент TVsuperSelect. Создайте TV данного типа и в возможные значения укажите вызов сниппета:
@EVAL return $modx->runSnippet('pdoResorces', ['parent'=>'1','tpl'=>'@INLINE {$pagetitle} {$id}=={$id}{$idx == $count ? '||' : ''}'])
А в параметрах вывода необходимо указать тип вывода разделитель запятая. После добавления нескольких ресурсов в это TV на выходе вы будите иметь список id ресурсов разделенных запятыми!
Виталий Серый
Виталий Серый
Максим Кузнецов
Максим Кузнецов
Вы можете сделать выборку необходимых ресурсов с тв-полем через обычный pdoResources, подключив в includeTVs нужное MIGX-поле, после чего разобрать их в чанке при помощи фенома:

{set $migx_array = $migx_tv_name | fromJSON}

{foreach $migx_array as $migx_row}
	{$migx_row['название_колонки1_в_migx']}, {$migx_row['название_колонки2_в_migx']}, ...
{/foreach}