Владимир

Владимир

С нами с 28 декабря 2012; Место в рейтинге пользователей: #53
Баха Волков
15 августа 2020, 11:18
2
+4
@Руслан Алеев В главном шаблоне которую будут расширять в начале пишешь:

{set $resource = $_modx->resource}
{set $resource.headline = $resource.longtitle ?: $resource.pagetitle}

{set $config = $_modx->config}

и вуаля

{$resource.id}
{$resource.pagetitle}
{$resource.headline}
{$resource.content ?: $resource.introtext ?: $resource.description}

{$config.site_name}
{$config.site_url}

Лично меня раздражает то, что синтаксис сильно вариативный, типа
Не понимаю, в чем вариативность и в чем сложность вообще?

В твоем примере:
{$id} // Это переменная
{$_modx->resource.tv_param} // Доступ к элементу массива, которая является свойством объекта $_modx
{$_modx->lexicon('lexicon')} // Вызов метода объекта $_modx, которой нужно передать ключ лексикона в качестве параметра

Это легко читается программистом
iWatchYouFromAfar
09 апреля 2020, 01:58
1
+1
Зачем это все и зачем phpthumbon, когда есть phpthumb из коробки?

modx.pro/development/16940
Сергей Шлоков
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 не нужен. И даже вреден. Ибо делает ненужную работу для каждого запроса страницы.

П.С. И ещё совет. Не пихайте логику во вьюхи. Это бад практис! Перенесите логику в сниппет и вызывайте его на странице.
Ann
Ann
08 сентября 2019, 05:04
2
+1
Было решено написанием плагина, сохраняющим артикулы модификаций в аннотацию при сохранении товара.
$eventName = $modx->event->name;
switch($eventName) {
    case 'OnDocFormSave':

        $modpar = array(
          'rid' => $id
        );

        $mod = $modx->getCollection('msopModification', $modpar);
    
        $datamod = array();

        if ($mod){
          foreach ($mod as $v){
            $qi = ['mid' => $v->get('id')];
            $opt = $modx->getObject('msopModificationOption', $qi);
            $val = '';
            if ($opt){
              $val .= $v->get('article');
            }
            $datamod[] = $val;
            $intro = implode(",", $datamod);
          };
            $res = $modx->getObject('modResource', $id);
            $res->set('introtext', $intro);
            $res->save();  
        }
        break;
}
Для обновления существующих товаров:
if(!$docs = $modx->getCollection('modResource', array(
    'template' => 7
))){return;}
foreach($docs as $doc){
    $q = $doc->get('id');
    $modpar = array(
      'rid' => $q
    );

    $mod = $modx->getCollection('msopModification', $modpar);

    $datamod = array();

    if ($mod){
      foreach ($mod as $v){
        $qi = ['mid' => $v->get('id')];
        $opt = $this->modx->getObject('msopModificationOption', $qi);
        $val = '';
        if ($opt){
          $val .= $v->get('article');
        }

        $datamod[] = $val;
        $intro = implode(",", $datamod);
      };

        $doc->set('introtext',$intro);
        $doc->save();
    }
}
Артем
03 сентября 2019, 12:59
1
+1
А еще лучше
$ids = [];
$c = $modx->newQuery('msCategory', [
    'pagetitle' => $modx->resource->pagetitle,
    'id:!=' => $modx->resource->id,
]);
$c->select(['id']);
if ($c->prepare() && $c->stmt->execute()) {
    $ids = $c->stmt->fetchAll(PDO::FETCH_COLUMN);
}

return implode(',', $ids);
для экономии ресурсов
Роман Л.
17 июня 2019, 11:13
3
0
Работает, если только в сиппете PdoPage заменить строку 244:
$modx->regClientStartupHTMLBlock('<link rel="canonical" href="' . $canurl . '"/>');
на
$modx->regClientStartupHTMLBlock('<link rel="canonical" href="' . $pdoPage->makePageLink($canurl) . '"/>');
но при очередном обновлении это все слетит =(
Андрей
13 июня 2019, 12:10
1
0
Проблема была в том, что $ids нужно отдавать процессору в JSON
Вот так работает, оставлю тут, может кому-то еще пригодится
<?php
$images = $modx->getCollection('msProductFile', array('type' => 'image', 'parent' => 0));
$ids = array();
foreach ($images as $image) {
    $ids[] = $image->get('id');
    }
$response = $modx->runProcessor('gallery/multiple',
	array(
		'method' => 'remove',
		'ids' => json_encode($ids),
	),
	array('processors_path' => MODX_CORE_PATH.'components/minishop2/processors/mgr/')
);
if ($response->isError()) {
	$modx->log(modX::LOG_LEVEL_ERROR, "Error \"$v\": \n". print_r($response->getAllErrors(), 1));
}
else {
	$modx->log(modX::LOG_LEVEL_INFO, "Successful  \"$v\": \n". print_r($response->getObject(), 1));
}
	
print_r($response->response);
Володя
06 июня 2019, 14:34
2
0
{var $name}


{set $count = 0}
{foreach $array as $value}
    {include ++$count}
    <div class="col-md-6">{$value.pagetitle}</div>
{/foreach}


{/var}
Максим
01 марта 2019, 11:10
1
+1
Как-то так:
<a href="{$introtext}" data-id="{$id}" target="_blank" rel="noopener noreferrer" class="point">
        Читать подробности>>
  </a>

$('.point').on('cklick', function(e) {
    e.preventDefault();
    var id = $(this).data('id');
    ym(510Х5916,'reachGoal','mainpage' + id);
});