Евгений
С нами с 18 марта 2015; Место в рейтинге пользователей: #420Сниппет подсчета кол-ва заполненных TV с разбитием на колонки
Всем привет!
Написал небольшой сниппет, который считает количество заполненных TV и разбивает их на несколько столбцов.
В остальном сниппет полностью рабочий.
P.S.: чуть позже выложу похожее решение, но уже для вывода ссылок на ресурсы.
Написал небольшой сниппет, который считает количество заполненных 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.: чуть позже выложу похожее решение, но уже для вывода ссылок на ресурсы.
Как подцепить css файл в ExportPage?
Приветствую!
Подскажите, пожалуйста, как подцепить свой css файл в ExportPage?
Указываю в чанке-оформлении
Спасибо.
Подскажите, пожалуйста, как подцепить свой css файл в ExportPage?
Указываю в чанке-оформлении
<link rel="stylesheet" href="/tpl/css/pdf.css">
но файл не подхватывается.Спасибо.
Свой шрифт в ExportPage
Всем привет!
Пытаюсь добавить свой шрифт в ExportPage, но тщетно.
в настройках указываю «Шрифт документа» — montserrat
в папку /core/components/exportpage/vendor/mpdf/ttfonts/ копирую 2 файла шрифта — Montserrat-Medium.ttf и Montserrat-Bold.ttf
в файл config_fonts.php в папке /core/components/exportpage/vendor/mpdf/
добавляю
Пытаюсь добавить свой шрифт в 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', ...
Однако шрифт не подгружается. Что я делаю не так? Вывод сниппета из чанка другого сниппета через Ajax
Всем привет!
Подскажите, пожалуйста, мб кто-то сталкивался или просто знает решение: есть такой сниппет, который при клике на определенный элемент выводит pdoResources с заданными параметрами
Подскажите, пожалуйста, мб кто-то сталкивался или просто знает решение: есть такой сниппет, который при клике на определенный элемент выводит 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 = `` ]]
Как вызывать msFavorites по событию?
Приветствую!
Ситуация такая: есть карта Google, на ней стоят маркеры. По клику на маркер создается всплывающее окно в котором находится msFavorites. Проблема в том, что при открытии этого окна не проверяется статус. При клике по иконке, все работает как надо — страница добавляется и удаляется из избранного. Каким образом заставить msFavorites проверять статус сразу после открытия всплывающего окна?
Ситуация такая: есть карта Google, на ней стоят маркеры. По клику на маркер создается всплывающее окно в котором находится msFavorites. Проблема в том, что при открытии этого окна не проверяется статус. При клике по иконке, все работает как надо — страница добавляется и удаляется из избранного. Каким образом заставить msFavorites проверять статус сразу после открытия всплывающего окна?
<script>
marker.addListener('click', function() {
infoWindow.setContent(infowincontent);
infoWindow.open(map, marker);
// тут по идее должен быть вызов msFavorites
});
</script>
Спасибо. Ограничение кол-ва страниц (выборки) в pdoPage
Приветствую!
Возможно ли в 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>
Вывод полей во вложенном компоненте через Ajax
Всем привет!
Есть страница с pdoPage, вызов такой:
Есть страница с 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-ом? ms2gallery: вывести первое, либо все, кроме первого фото в зависимости от их количества
Привет всем!
Прошу помочь c решением одной задачки по 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}
Как запихнуть TV в [[%language]]?
Всем привет!
Подскажите, пожалуйста, как в конструкцию [[%key? &namespace=`sitename`]] вставить TV-параметр?
[[%[[*tv-name]]? &namespace=`sitename`]] или [[%[[*tv-name]]? &namespace=`sitename` &includeTVs=`tv-name`]] не работают.
Спасибо.
Подскажите, пожалуйста, как в конструкцию [[%key? &namespace=`sitename`]] вставить TV-параметр?
[[%[[*tv-name]]? &namespace=`sitename`]] или [[%[[*tv-name]]? &namespace=`sitename` &includeTVs=`tv-name`]] не работают.
Спасибо.
Передать значения в VirtualPage при переходе по ссылке
Здравствуйте!
Прошу помощи в настройке VirtualPage.
Ситуация такая:
есть страницы — site.ru/objects/id-number/,
на этих страницах стоят ссылки — site.ru/catalog/VP-category/VP-page/
По ссылке будет выборка каталога товаров.
Задача:
при клике сформировать страницу с данным адресом (получить VP-category и VP-page), при этом в pdoPage подставить условие:
Насколько я понимаю данную ситуацию,
в маршруте нужно указать — /catalog/{category:[a-z0-9]}/{page:[a-z0-9]}/
в обработчике — динамический ресурс, содержимое: [[$VP-chunk]].
А дальше тупик. Видимо сниппет необходимо какой-то повесить внутрь чанка, но с PHP я, к сожалению, не дружу пока.
Также есть предположение повесить VP-category и VP-page в дата-атрибуты ссылки, т.е. сделать ссылки вида
Или в этом нет необходимости?
Прошу помощи в настройке 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>
.Или в этом нет необходимости?