Andrey

Andrey

С нами с 08 августа 2016; Место в рейтинге пользователей: #211
Евгений Webinmd
07 июня 2021, 22:40
1
+1
если это не ТВ поле, то у меня вот такой плагин срабатывал
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 без повторного получения объекта. Ну и галочку у плагина на событие не забываем
Сергей Шлоков
16 ноября 2019, 09:11
3
+8
Эх, молодежь. Всё делается гораздо проще. Ставим 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
20 марта 2019, 16:44
1
+2
В файле
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';
Баха Волков
25 сентября 2018, 21:31
1
+1
Ну если самый простой способ, то:

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

Chunk:
{'pdoResources' | snippet : [
'parents' => $id,
'limit' => 1
]}
На выходе 20 товаров по одной из 20 категорий
Денис
31 июля 2018, 09:10
1
0
Можно сделать через 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}
Максим Кузнецов
07 ноября 2017, 12:29
5
+6
На 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 ~ '%"
	}',
	...
])}
Павлик
20 октября 2017, 16:43
1
0
Я все понял. Сейчас опишу — может кому и пригодится:

Дело в скрипте «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;
});
Павел Гвоздь
24 августа 2017, 19:11
4
0
Так а чего там решать, все просто до ужаса:
if ($modx->event->name == 'OnDocFormSave' && $mode == 'new' && is_object($resource) && $resource->get('class_key') == 'msProduct') {
    $resource->set('alias', ($resource->get('alias') . '-' . $id));
    $resource->save();
}
Василий Столейков
26 сентября 2016, 07:24
2
0
Есть поле unpub_date, а при продлении просто нужно увеличивать дату unpub_date (можно и publishedon для поднятия объявления) на нужное количество дней.
А MODX уже сам отпубликует по unpub_date — никаких дополнительных действий не нужно.
varanika
19 сентября 2016, 19:13
1
0
Спасибо, что так подробно описали :) Однако, к тому времени, как я дождалась ответа, я уже поступила по другому (нашла пару советов в нескольких местах и соединила их) :)
Я использую 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>