Евгений

Евгений

С нами с 18 марта 2015; Место в рейтинге пользователей: #420

Сниппет подсчета кол-ва заполненных TV с разбитием на колонки

Всем привет!

Написал небольшой сниппет, который считает количество заполненных TV и разбивает их на несколько столбцов.

<?php
//передаваемые в сниппет параметры
//id - id ресурса с которого берем нужные поля
//tvInput - id полей для проверки, через запятую
//cols_count - количество выводимых колонок
//tpl - шаблон вывода
$id = $id;
$tvInput = explode(',',$tvs);
$cols_count = $cols;
$tpl = $tpl;

if (!isset($tvInput)) { return false; } // Если не указаны TV, прекращаем выполнение кода
if (!isset($id)) { $id = $modx->resource->get('id'); } // По-умолчанию текущий ресурс
if (!isset($cols_count)) { $cols_count = 2; } // Количество колонок по-умолчанию
if (!isset($tpl)) { $tpl = 'objectParams'; } // Шаблон по-умолчанию

$criteria = $modx->newQuery('modTemplateVarResource',[
              'contentid' => $id,
              'tmplvarid:IN' => $tvInput,
              'value:!=' => ''
            ]);
$criteria->sortby('tmplvarid');
$docs = $modx->getCollection('modTemplateVarResource', $criteria);

//выводим по колонкам
//default_elems_at_col - количество элементов в колонке
$output = '';
$count = count($docs);
$default_elems_at_col = floor($count / $cols_count);
$continue_default = false;

/* 
  как работает:
  например: 52 элемента на 5 колонок
  $default_elems_at_col - количество элементов в колонке по умолчанию floor(52 / 5) = 10
  остается 2 элемента (52 - 50), которые необходимо распределить по колонкам, т.е.
  $real_default_elems_at_col = 11 (для первых двух колонок)
  $continue_default - переменная, чтобы прекратить лишние вычисления на итерациях, когда лишних элементов не осталось
*/
$output .= '<div class="params params_cols-' . $cols_count . '">';
for ($i = 0; $i < $cols_count; $i++) {
  if (!$continue_default) {
    $real_default_elems_at_col = $default_elems_at_col + 1;
    if ( ($real_default_elems_at_col * ($i + 1) + ($cols_count - $i - 1) * $default_elems_at_col) > $count ) {
      $real_default_elems_at_col = $default_elems_at_col;
      $continue_default = true;
    }
  } 

  $output .= '<div class="params__column">';
  for ($j = 0; $j < $real_default_elems_at_col; $j++) {
    $current_doc = current($docs)->toArray();
    $tvId = $current_doc["tmplvarid"];
    $value = $current_doc["value"];
    
    $output .= $modx->getChunk($tpl, [
                'tvId' => $tvId,
                'value' => $value
               ]);

    //если следующего элемента нет - выходим из цикла
    if (!next($docs)) {
      break;
    }
  }
  $output .= '</div>';
}
$output .= '</div>';
return $output;
Минимальный вызов:
[[!snippet? &tvs=``]]
Т.к. с php пока на Вы, буду рад замечаниям и комментариям по данному решению.
В остальном сниппет полностью рабочий.

P.S.: чуть позже выложу похожее решение, но уже для вывода ссылок на ресурсы.
Евгений
19 октября 2018, 17:00
modx.pro
624
0

Как подцепить css файл в ExportPage?

Приветствую!

Подскажите, пожалуйста, как подцепить свой css файл в ExportPage?

Указываю в чанке-оформлении
<link rel="stylesheet" href="/tpl/css/pdf.css">
но файл не подхватывается.

Спасибо.
Евгений
18 октября 2018, 14:47
modx.pro
1 080
0

Свой шрифт в ExportPage

Всем привет!

Пытаюсь добавить свой шрифт в ExportPage, но тщетно.

в настройках указываю «Шрифт документа» — montserrat

в папку /core/components/exportpage/vendor/mpdf/ttfonts/ копирую 2 файла шрифта — Montserrat-Medium.ttf и Montserrat-Bold.ttf

в файл config_fonts.php в папке /core/components/exportpage/vendor/mpdf/

добавляю
$this->fontdata = array(
"montserrat" => array(
	'R' => "Montserrat-Medium.ttf",
	'B' => "Montserrat-Bold.ttf",
),
...
$this->sans_fonts = array('montserrat', ...
Однако шрифт не подгружается. Что я делаю не так?
Евгений
03 октября 2018, 13:15
modx.pro
1
888
0

Вывод сниппета из чанка другого сниппета через Ajax

Всем привет!

Подскажите, пожалуйста, мб кто-то сталкивался или просто знает решение: есть такой сниппет, который при клике на определенный элемент выводит pdoResources с заданными параметрами
<?php
if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {return;}

$action = filter_input(INPUT_POST,'action');

if (empty($action)) {return;}

$res = '';
switch ($action) {
  case 'pdoResources': 
    $params = array();
    $params['parents'] = filter_input(INPUT_POST, 'parents', FILTER_SANITIZE_NUMBER_INT);
    $params['resources'] = filter_input(INPUT_POST, 'resources', FILTER_SANITIZE_NUMBER_INT);
    $params['tpl'] = filter_input(INPUT_POST,'tpl');
    $params['includeTVs'] = filter_input(INPUT_POST,'includeTVs');
    $res = $modx->runSnippet('pdoResources', $params);
    break;
}

if (!empty($res)) {
  die($res);
}
JS выглядит так
<script>
$('.trigger').on('click', function() {
     var data = {
        action: 'pdoResources',
        parents: '25',
        resources: objectId,
        tpl: 'tpl.mapObjectsItem',
        includeTVs: 'objectStatus'
    };

    $.post('/ajax/', data, function(data) {
        $('.current-object').empty().prepend(data);
    })
});
</script>
В чанке tpl.mapObjectsItem подгружается ms2Gallery
...
[[!ms2Gallery?
    &resources = `[[+id]]`
    &tpl = `tpl.ms2GalleryCatalog`
    &frontend_css = ``
    &frontend_js = ``
]]
...
Все было бы замечательно, если бы не одно НО — когда на страницу при клике загружается нужный ресурс, вместо того, чтобы выполнить сниппет ms2Gallery, он выводится в виде текста, т.е. так
[[!ms2Gallery? &resources = `61` &tpl = `tpl.ms2GalleryCatalog` &frontend_css = `` &frontend_js = `` ]]
Евгений
26 сентября 2018, 16:56
modx.pro
1
1 138
0

Как вызывать msFavorites по событию?

Приветствую!

Ситуация такая: есть карта Google, на ней стоят маркеры. По клику на маркер создается всплывающее окно в котором находится msFavorites. Проблема в том, что при открытии этого окна не проверяется статус. При клике по иконке, все работает как надо — страница добавляется и удаляется из избранного. Каким образом заставить msFavorites проверять статус сразу после открытия всплывающего окна?

<script>
    marker.addListener('click', function() {
        infoWindow.setContent(infowincontent);
        infoWindow.open(map, marker);
        // тут по идее должен быть вызов msFavorites
    });
</script>
Спасибо.
Евгений
25 сентября 2018, 17:27
modx.pro
506
0

Ограничение кол-ва страниц (выборки) в pdoPage

Приветствую!

Возможно ли в pdoPage задать максимальное количество страниц (как вариант лимит выборки)?
В голову приходит сделать это через шаблон, но по-моему это криво:
[[+idx:el=`10`:then=`Template`]]
UPD: реализовал решение для Ajax через кнопку на js:
<script>
var bntMoreCounter = 0;
$(document.body).on('click', '.btn-more', function() {
    ++bntMoreCounter;
    if (bntMoreCounter >= 2) {
        $(this).css('display','none');
    }
});
</script>
Евгений
20 сентября 2018, 16:58
modx.pro
627
0

Вывод полей во вложенном компоненте через Ajax

Всем привет!

Есть страница с pdoPage, вызов такой:
[[!pdoPage?
    &parents = `25`
    &tpl = `tpl.catalogItem`
    &includeTVs = `objectCity,objectArea`
    &ajaxMode = `button`
]]
в шаблоне дополнительно вызывается ms2gallery:
<div class="catalog__item catalog__item_[[+idx]]">
    <div class="catalog__thumb">
        [[!ms2Gallery?
            &resources=`[[+id]]`
            &tpl=`tpl.ms2GalleryCatalog`
        ]]
    </div>
    <div class="catalog__desc">
           ...
    </div>
</div
шаблон галереи tpl.ms2GalleryCatalog выглядит так:
<div class="fotorama" data-link="[[~[[+id]]]]">
    {if $files?}
        {foreach $files as $file}
            <img src="{$file['catalog']}" alt="[[+longtitle]], [[+tv.objectCity]], [[+tv.objectArea]]">
        {/foreach}
    {/if}
</div>
Когда открывается страница, все ок. Но как только наживаешь на «Показать еще», в новых блоках не выводятся поля из шаблона tpl.ms2GalleryCatalog. При этом сама галерея подгружается нормально. Как заставить ms2Gallery подхватить поля из своего шаблона при загрузке Ajax-ом?
Евгений
20 сентября 2018, 16:42
modx.pro
996
0

ms2gallery: вывести первое, либо все, кроме первого фото в зависимости от их количества

Привет всем!

Прошу помочь c решением одной задачки по ms2gallery:
на странице стоит вызов
[[!ms2Gallery?
      &tpl=`tpl.ms2GalleryObject`
      &frontend_css=``
      &frontend_js=``
]]
в зависимости от кол-ва изображений должно выводиться либо no-photo, либо одна фотография, либо все фотографии, кроме первой (она отображается отдельно).

Как можно это реализовать? Сейчас код чанка такой:
{if count($files) > 1}
    <div class="gallery__main-photo" data-background="{foreach $files as $file}{$file['url']}{/foreach}"></div> // тут необходимо вывести первое фото
    <div class="fotorama">
        {foreach $files as $file} // тут необходимо вывести все фото, кроме первого
      <a href="{$file['url']}"><img src="{$file['thumb']}"></a>
        {/foreach}
    </div>
{elseif count($files) == 1}
    <div class="gallery__main-photo" data-background="{foreach $files as $file}{$file['url']}{/foreach}"></div> // тут необходимо вывести первое фото
{else}
    <div class="gallery__no-photo"></div>
{/if}
Евгений
17 сентября 2018, 16:23
modx.pro
2
1 700
0

Как запихнуть TV в [[%language]]?

Всем привет!

Подскажите, пожалуйста, как в конструкцию [[%key? &namespace=`sitename`]] вставить TV-параметр?

[[%[[*tv-name]]? &namespace=`sitename`]] или [[%[[*tv-name]]? &namespace=`sitename` &includeTVs=`tv-name`]] не работают.

Спасибо.
Евгений
10 сентября 2018, 11:51
modx.pro
774
0

Передать значения в VirtualPage при переходе по ссылке

Здравствуйте!

Прошу помощи в настройке VirtualPage.

Ситуация такая:
есть страницы — site.ru/objects/id-number/,
на этих страницах стоят ссылки — site.ru/catalog/VP-category/VP-page/
По ссылке будет выборка каталога товаров.

Задача:
при клике сформировать страницу с данным адресом (получить VP-category и VP-page), при этом в pdoPage подставить условие:

&where=`{
  "city": "VP-category__VP-page"
}`

Насколько я понимаю данную ситуацию,
в маршруте нужно указать — /catalog/{category:[a-z0-9]}/{page:[a-z0-9]}/
в обработчике — динамический ресурс, содержимое: [[$VP-chunk]].

А дальше тупик. Видимо сниппет необходимо какой-то повесить внутрь чанка, но с PHP я, к сожалению, не дружу пока.

Также есть предположение повесить VP-category и VP-page в дата-атрибуты ссылки, т.е. сделать ссылки вида

<a href="http://site.ru/catalog/VP-category/VP-page/" data-category="VP-category" data-page="VP-page">Ссылка</a>
.

Или в этом нет необходимости?
Евгений
05 сентября 2018, 17:08
modx.pro
1
1 026
0