Andrey

Andrey

Был в сети 27 апреля 2023, 14:37
Заказы принимаю
Евгений Webinmd
Евгений Webinmd
если это не ТВ поле, то у меня вот такой плагин срабатывал
if ( $modx->event->name != "OnDocFormSave" || $resource->get('class_key') != 'msProduct' ) return;

$id = $resource->get('id');
$res = $modx->getObject('msProduct', $id); // Получаем объект товара
$res->set('field_name', 'Test'); 
$res->save();
Для ТВ поля вместо res используется resource без повторного получения объекта. Ну и галочку у плагина на событие не забываем
Сергей Шлоков
Сергей Шлоков
Эх, молодежь. Всё делается гораздо проще. Ставим 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 не нужен. И даже вреден. Ибо делает ненужную работу для каждого запроса страницы.

П.С. И ещё совет. Не пихайте логику во вьюхи. Это бад практис! Перенесите логику в сниппет и вызывайте его на странице.
Victor
Victor
В файле
core/components/videogallery/lib/videoThumb/videoThumb.php

Меняем строку 52
$image = 'http://img.youtube.com/vi/'.$matches[1].'/0.jp
на это (получаем картинку в формате WEBP):
$image = 'https://i.ytimg.com/vi_webp/'.$matches[1].'/maxresdefault.webp';
на это (получаем в формате JPG):
$image = 'https://i.ytimg.com/vi/'.$matches[1].'/maxresdefault.jpg';
Баха Волков
Баха Волков
Ну если самый простой способ, то:

{'pdoResources' | snippet : [
'parents' => 0,  // Id родителя категорий
'select' => 'id',
'limit' => 20,
'tpl' => 'chunk'
]}

Chunk:
{'pdoResources' | snippet : [
'parents' => $id,
'limit' => 1
]}
На выходе 20 товаров по одной из 20 категорий
Денис
Денис
Можно сделать через fenom.
Во-первых заходите в настройки TV поля во вкладку Параметры вывода. Выбираете в поле Тип вывода — Разделитель. В поле Разделитель ставите запятую. Теперь у вас будут выводиться значения через запятую. Далее в чанке вывода пишите:

{set $productsCategoryArr = $_pls['tv.productsCategory'] | split}
{foreach $productsCategoryArr as $category}
    {switch $category}
        {case 'Фрукты'}
            <div class="fruits">Фрукты</div>
        {case 'Овощи'}
            <div class="veggies">Овощи</div>
    {/switch}
{/foreach}
Максим Кузнецов
Максим Кузнецов
На fenom-е посимпатичнее будет:

{foreach $_modx->resource.pagetitle | split : ' ' as $pagetitle_word}
	{if $pagetitle_word | length > 3}
		{var $words[] = $pagetitle_word}
	{/if}
{/foreach}

{set $random_word_position = rand(1, $words| length)}
{set $random_word = $words[$random_word_position - 1]}

{$_modx->runSnippet('!msProducts', [
	'parent' => $_modx->resource.parent,
	'resources' => -$_modx->resource.id,
	'where' => '{
		"pagetitle:LIKE": "%' ~ $random_word ~ '%"
	}',
	...
])}
Павлик
Павлик
Я все понял. Сейчас опишу — может кому и пригодится:

Дело в скрипте «eventscalendar2.js»: при событии переключения месяца он убирает со страницы контейнер в котором находились элементы текущего месяца и полученные элементы другого месяца вставляет в другое место на странице. От этого селекторы которые «ловят» переключение месяцев перестают работать. В общем часть скрипта «Month changing» нужно переписывать согласно верстке конкретного сайте. У меня переписанная часть выглядит так:

$(document).on('click', '#Calendar .prev a, #Calendar .next a', function() {
	var href = $(this).attr('href');
	$.get(href, function(data) {
	    $('#Calendar').html(data);	 
	});
	return false;
});
Василий Столейков
Василий Столейков
Есть поле unpub_date, а при продлении просто нужно увеличивать дату unpub_date (можно и publishedon для поднятия объявления) на нужное количество дней.
А MODX уже сам отпубликует по unpub_date — никаких дополнительных действий не нужно.
varanika
varanika
Спасибо, что так подробно описали :) Однако, к тому времени, как я дождалась ответа, я уже поступила по другому (нашла пару советов в нескольких местах и соединила их) :)
Я использую get запросы типа:
<a href="[[~32]]?name=[[+username]]" title="Просмотреть">
Где 32 — ресурс Страница пользователя, принимающий параметры с одним единственны вызовом:
[[!userProfile]]
А уже данный сниппет таков:
<?php
	$count = $modx->getCount('modUser', array('username' => $_GET['name']));
	if($count <= 0 || $count >= 2){
		echo'<div class="alert alert-warning" role="alert">	<h2>
				Ошибка
			</h2>
			<p>Вы видите данное сообщение потому, что:</p>
			<br />
			<ul>
			<li>пользователя не существует на сайте;</li>
			<li>профиль пользователя был удален;</li>
			<li>пользователь принадлежит к тайному обществу, которое скрывает данные о себе.</li>
			</ul>
			<br />
			<p>Если Вы читаете данное сообщение, значит полный профиль скрыт и Вы можете посмотреть его краткую версию на 
			странице <a href="[[~31]]" title="Все пользователи">Все пользователи</a></p></div>	';
	}
	else {
	    $user = $modx->getObject('modUser',array('username'=>$_GET['name']));
        $user_id = $user-> get('id');
	   	$params = array();
		$params['users'] = $user_id;
                $params['limit'] = '1';
		$params['showBlocked'] = '1';
		$params['tpl'] = 'User';
		$result = $modx->runSnippet('pdoUsers', $params);
	
		if (!empty($result)) {
			return $result;
		}
		else {
			return '<h2>
					<a>Ошибка</a>
				</h2>
				<div>
					Что-то пошло не так...
				</div>';
		}


	}
Т.е. через строку url я получаю имя пользователя, отдаю его сниппету, а он направляет выборку в pdoUsers. Придумано не мной, я лишь адаптировала под себя.

Ну и чанк User, куда все полетело:

<div class="col-lg-3 col-sm-3 hidden-xs col-md-3">
    <img class="img-thumbmail margin-bottom15" src="[[+photo:default=`/assets/photouser/default.jpg`:thumb=`&w=150&h=150`]]" title="[[+username:htmlent]]">
</div>
<div class="col-lg-4 col-sm-4 col-xs-6 col-md-4">
    <p class="margin-bottom25"><strong>Полное имя</strong></p>
<p><strong>Логин</strong> </p>
</div>
<div class="col-lg-5 col-sm-5 col-xs-6 col-md-5">
    <h3 class="margin-bottom25">[[+fullname:empty=`не указано`]]</h3>
    <p>[[+username:empty=`не указано`]]</p>
    <p><a class="btn btn-default ticket-read-more" href="[[~35? &msgID=`[[+id]]`  &recipient=`[[+sender]]`]]">
        Написать</a>
   </p>
</div>
<table class="table table-striped table-hover">
      <tbody>
     [[!getAuthorRating? &userId=`[[+id]]`]]
       <tr><td>Город</td>
       <td>[[+city:empty=`не указан`]]</td>
       </tr>
       <tr><td>Страна</td>
       <td>[[+country:default=`Беларусь`]]</td>
       </tr>
       <tr></td></tr>
      <tr><td>Телефон</td><td><span class="glyphicon glyphicon-phone-alt" aria-hidden="true"></span> 
      [[+phone:empty=`не указан`]]<br /><span class="glyphicon glyphicon-earphone" aria-hidden="true"></span> 
      [[+mobilephone:empty=`не указан`]]</td></tr>
    </tbody>
</table>