[tvSuperSelect] Тип TV: автозаполняемый список из ms2, для реализации тегов
Это такой тип ТВ поля, в который можно вбивать значения «на ходу». Другими словами, мы не указываем «Возможные значения» при редактировании ТВ, а вбиваем эти значения в это поле на странице редактирования ресурса.
Очень удобно создавать из такого поля «Теги» на сайте, потому что помимо добавления значений «на ходу», у нас есть возможность выбрать уже используемые значения из других ресурсов.
О хранении значений в базе
- У данного ТВ поля есть своя таблица tvss_options, в ней данные хранятся в таком виде:
- Однако, данные также хранятся и в таблице site_tmplvar_contentvalues, но уже в виде JSON массива:
Скачать можно из репозитория modstore.pro — modstore.pro/packages/other/tvsuperselect
P.S.: Спасибо Василию за часть кода!
Поблагодарить автора
Отправить деньги
Комментарии: 125
То есть при установке данного компонента у нас добавляется новый тип TV tvSuperSelect?
Да.
Ожидаем восторженного отклика Василия.
Круть!
Несколько раз перечитал, но так и не понял, чем эта TV отличается от обычного списка с мультиселектом. И зачем отдельная таблица для неё? Так не проще?
В том-то и деле, что тут не нужно заранее набивать набор тегов — при вводе новые теги создаются.
Ну, и таблица, соответственно, поможет делать гибкие фильтры и пр.
Вот это автору поста стоило на самом верху написать :) Теперь понятно для чего это.
Честно говоря, я открыл для себя людей, которые не знают, что в ms2 есть такая клёвая плюха. :)
А ещё есть люди, которые не знают, что такое ms2. Представляешь, ну не нужен он им? Зачем объяснять таким про твой компонент? Наверно, всем разработчикам нужно взять такой подход.
Так я вроде переписал описание пакета. Что, до сих пор не понятно, чтоли?)
В общем-то Илья назвал причину появления данного компонента.
У меня складывается впечатление, что пост твой появился тут ради ссылки. =) Капелька бреда, не воспринимай всерьёз. ;)
У меня складывается впечатление, что пост твой появился тут ради ссылки. =) Капелька бреда, не воспринимай всерьёз. ;)
Спасибо Илье, объяснил старику ;) Я минишопом не пользуюсь (пока!), поэтому для меня слова «как в минишопе» ни о чём не говорят. Мне это показалось очередным «открытием». Но теперь понял механизм.
У меня складывается впечатление, что пост твой появился тут ради ссылки. =) Капелька бреда, не воспринимай всерьёз. ;)Не угадал. Мне там пока хвалится нечем. Главная идея сайта — написать документацию к своим дополнениям и подгружать её в админке при нажатии на кнопку Помощь (так работает помощь у самого MODX), а также сделать реализацию платных дополнений. Ни до одного ни до другого руки еще не дошли.
Уже в modStore.pro — modstore.pro/packages/other/tvsuperselect
с mfilter2 работает поле?
Не знаю, проверь. Скажешь потом. А mfilter2 работает с JSON полями?
проверю и отпишу, вроде с JSON не работает, но думаю можно написать и свой тип. В общем проверю и расскажу
mFilter2 все выводит, но сам тег в фильтре отображается как кусок JSON. Не понимаю как это можно исправить.
Здравствуйте. Прошу небольшой пример непосредственного использования, т.е. как вывести тэги допустим к статье в блоге, и как вывести статьи по конкретным тегам. Для меня пока решение не очевидно, нет опыта.
Феномом как-то так:
Можешь сам для себя написать сниппет, он будет похож на код Fenom. Ничего сверхъестественного нет.
{if $_modx->resource.tags?}
{foreach json_decode($_modx->resource.tags,1) as $tag}
{var $tags[] = '<a href="">'~ $tag ~'</a>'}
{/foreach}
{$tags|join:", "}
{/if}
На стандартном синтаксисе хз, надо писать сниппет. Где-то в марте обновлю пакет, добавлю туда необходимый, для вывода стандартным синтаксисом, сниппет. Сейчас совершенно не до этого, тем более я уже давно не использую почти нигде стандартный синтаксис MODX, поэтому мне «не припекает» особо писать его.Можешь сам для себя написать сниппет, он будет похож на код Fenom. Ничего сверхъестественного нет.
Хорошо, спасибо, я попробую.
Здравствуйте! У вас получилось реализовать вывод обычным сниппетом?
А переназначить не как нельзя все теги на сайте с типа «Тег», на «tvSuperSelect», если просто меняю Тип и сохраняю, то и теги не отображаются и нельзя добавить не какие. Скрин
Просто выводится название TV-поля и ничего более
Просто выводится название TV-поля и ничего более
Нет, думаю не получится. Данные этого поля в базе хранятся в JSON формате, возможно поэтому такой глюк. А если новому ТВ назначить такой тип поля, всё нормально отображается? Думаю не сложно будет написать скриптик, который произведёт миграцию с типа «Тег» в «tvSuperSelect». Главное, чтобы скрипт помимо данных в site_tmplvar_contentvalues, сохранял ещё и данные в таблицу компонента tvss_options.
Кому просто, а кому очень сложно))
Скрипт мигрирует с ТВ типа «Тег» на ТВ типа «tvSuperSelect»:
<?php
$tv_tag = 18; // id тв поля с типом "Тег"
$tv_tss = 17; // id тв поля с типом "tvSuperSelect"
$modx->addPackage('tvsuperselect', MODX_CORE_PATH .'components/tvsuperselect/model/');
$objs = $modx->getIterator('modTemplateVarResource', array('tmplvarid' => $tv_tag));
foreach ($objs as $obj)
{
$values = explode(',', $obj->value);
foreach ($values as $value)
{
$where = array(
'resource_id' => $obj->contentid,
'tv_id' => $tv_tss,
'value' => $value,
);
if (!$modx->getCount('tvssOption', $where))
{
$new = $modx->newObject('tvssOption');
$new->fromArray($where);
$new->save();
unset($new);
}
$where = array(
'contentid' => $obj->contentid,
'tmplvarid' => $tv_tss,
);
if ($old = $modx->getObject('modTemplateVarResource', $where))
{
$old_values = $modx->fromJSON($old->value);
$old_values[] = $value;
$old->set('value', $modx->toJSON(array_unique($old_values)));
$old->save();
}
else {
$new = $modx->newObject('modTemplateVarResource');
$new->fromArray($where);
$new->save();
unset($new);
}
}
}
Запускать в пакете "Console"
Спасибо. Через консоль конечно не запустишь это, когда на сайте много тегов и материалов. Через SSH Норм.
Хочется конечно, чтобы в админке можно было бы управлять этими тегами, как в Smarttag, а так все круто.
Хочется конечно, чтобы в админке можно было бы управлять этими тегами, как в Smarttag, а так все круто.
Не понимаю, что ты имеешь ввиду, говоря «управлять»?
Ну во первых смотреть все теги, возможность удалять и редактировать их, смотреть в каких материалах они есть и т.д.
В ближайшее время такого точно реализовывать не буду. Если надо срочно — можешь проспонсировать.
Можно ли реализовать автозаполняемый список из фронтэнда? Из Tickets например
Это поле выводится средствами ExtJS. Если на JS или jQuery у тебя получится такое сделать — то можно. Могу дописать такой функционал за 4 000 рублей.
Подскажите, как использовать этот тип TV в MIGX?
И кстати, правильно ли это, что он не реагирует на настройки «разделитель», и выводит всегда JSON?
Спасибо!
И кстати, правильно ли это, что он не реагирует на настройки «разделитель», и выводит всегда JSON?
Спасибо!
как использовать этот тип TV в MIGX?С MIGX не использовал. А что, не работает? Что в консоли?
И кстати, правильно ли это, что он не реагирует на настройки «разделитель», и выводит всегда JSON?Настройки никакие не прикручивал. А что он должен делать, когда предположим, будет реагировать на разделитель?
Не знаю. Первый раз вижу такое.
Это конфликтовали два плагина, как выяснилось)
Другой вопрос)
Не подскажешь, как быть?)
{var $resources = $_modx->getResources(
['published' => 1, 'deleted' => 0, 'storerazdel:>' => ''],
['sortby' => 'menutitle', 'sortdir' => 'ASC', 'limit' => 0]
)}
{foreach $resources as $resource}
{if 'Цветы' in list $resource.storerazdel}
{$_modx->getChunk('tpl.brand.card', $resource)}
{/if}
{/foreach}
Таким образом вывожу соответствующие «тегам», ресурсы. НО, для этого надо либо настроить по этой статье, чтобы поле TV копировалось в таблицу modx_site_content (настроил, но как-то через раз работает, думаю дело в событии OnDocFormSave), либо как-то по-другому выводить ресурсы.Не подскажешь, как быть?)
Выборку делать по tvssOption. Там есть поле value, в нём хранятся теги. Следовательно нужный тег сравнивать с этим полем. И приджоинить к запросу modResource по полю resource_id.
Спасибо!
Исправьте описание, после сегодняшнего обновления минимальное требование PHP 5.4
Да, спасибо!
пришлось чутка поправить файлики, что бы сайт поднялся, до того как пхп на хостинге переключат)
Массивы правил только? Думаю восстановлю совместимость чуть позже.
Да, там в 4х местах только затыкается где вместо старого «array(...)» используется "[]" и где обнуляются массивцы, могу уже «исправленный» костыльный вариант скинуть)
Спасибо, я уже закинул в репозиторий обновлённую версию с поддержкой PHP 5.3.
Подскажите пожалуйста, как сделать сортировку выводимых документов по дате публикации?
Столкнулся с такой проблемой, что при использовании pdoPage не отрабатывается ajax переход по страницам.
В response возврощает {«output»:"",«page»:1,«pagination»:"",«pages»:0,«total»:0}
Мог бы, пожалуйста, кто-нибудь помочь с данной проблемой.
tvSuperSelect 1.1.2-beta
В response возврощает {«output»:"",«page»:1,«pagination»:"",«pages»:0,«total»:0}
Мог бы, пожалуйста, кто-нибудь помочь с данной проблемой.
tvSuperSelect 1.1.2-beta
{if $.get['tag']?}
<div id="pdopage">
<div class="rows">
{$_modx->runSnippet('pdoPage', [
'element' => 'tvssResources',
'tv' => '6',
'parents' => 5,
'limit' => 3,
'ajaxMode' => 'default',
'sortby' => 'publishedon',
'hideContainers' => 1,
'sortdir' => 'DESC',
'includeTVs' => 'small_news_image',
'prepareTVs' => 1,
'tpl' => 'news_list.chnk',
'pageLimit' => 7,
'tplPageWrapper' => '@INLINE <div class="pagination"><ul class="pagination">{$prev}{$pages}{$next}</ul></div>',
'tplPage' => '@INLINE <li class="page_num num-{$pageNo}"><a href="{$href}">{$pageNo}</a></li>',
'tplPageActive' => '@INLINE <li class="page_num num-{$pageNo} active"><a href="{$href}">{$pageNo}</a></li>',
'tplPagePrev' => '@INLINE <li class="control prev"><a href="{$href}"></a></li>',
'tplPageNext' => '@INLINE <li class="control next"><a href="{$href}"></a></li>',
'tplPagePrevEmpty' => '@INLINE ',
'tplPageNextEmpty' => '@INLINE '
]) ?: 'Ресурсов по данному тегу не найдено'}
</div>
{$_modx->getPlaceholder('page.nav')}
</div>
{else}
Укажите тег для выборки документов
{/if}
Скинь в личку доступ в бекенд.
Сейчас скину
Возможно ли получить в чанке tpl чистый урл от &pageId (без гет-параметра tag)? — на случай, если на странице поиска ресурсов по тегу реализована своя логика получения ресурсов с необходимым тегом (через свой гет-параметр).
Задачу, конечно, можно решить через
Плюс ко всему, если реализовывать теги по вашему примеру в документации, то в чанке со списком ресурсов русскоязычные теги будут представлены в виде:
Задачу, конечно, можно решить через
{pageId | url}/?name={$tag}
— но в таком случае идет двойная работа по формированию урлы — в чанке и в сниппете.Плюс ко всему, если реализовывать теги по вашему примеру в документации, то в чанке со списком ресурсов русскоязычные теги будут представлены в виде:
?tag=Название
— тогда как на странице самого ресурса ссылки тегов, вызванные через tvssTags, будут представлены в url-кодированном виде. Возможно ли получить в чанке tpl чистый урл от &pageId (без гет-параметра tag)?Возможно, продублировав и дописав в сниппет то, что нужно.
Павел, приведите пожалуйста более жизненный пример вывода документов, с соответствующим тегом:
Снипет + Чанк.
Снипет + Чанк.
Всё есть в документации на modstore — modstore.pro/packages/other/tvsuperselect
Спасибо разобрался.
Но при выборе тега «еда», выбираются документы с тегом "еда" и «педагог»
Но при выборе тега «еда», выбираются документы с тегом "еда" и «педагог»
Обновляйтесь до версии 1.1.3-beta
1.1.3-beta (17.06.2016)
==============
— В сниппеты tvssResources и tvssTickets добавлен параметр &like, который отвечает за способ выборки. Если указан &like=`1`, то при выводе ресурсов по тегу «еда», в результаты будут добавлены ресурсы с тегом «педагог». Если же &like=`0`, то поиск по тегам осуществляется точный. По-умолчанию &like=`0`.
Подскажите, пожалуйста, как вывести «облако» всех тегов.
В документации нашел только вывод тегов текущего ресурса.
В документации нашел только вывод тегов текущего ресурса.
Пока никак, вывод облака тегов не реализовывал.
А как тогда применять это приложение? Без облака какой смысл в тегах?
Можно не применять. Я не против.
А можно как-то вывести только одно значение tv?
Например вбили:
Нужно вывести отдельно 2-е значение(300)
Например вбили:
Нужно вывести отдельно 2-е значение(300)
Феномом получить список тегов и вывести второй по счёту:
{if $_modx->resource.tags?}
{var $tags = json_decode($_modx->resource.tags, 1)}
{$tags[1] ?: ''}
{/if}
Как-то так…
Спасибо. Работает.
А вот как использовать tv в migx таблице?
Проблема: ввожу значение, а оно не сохраняется.
Вкладка формы:
А вот как использовать tv в migx таблице?
Проблема: ввожу значение, а оно не сохраняется.
Вкладка формы:
{"field":"filter","caption":"Фильтр","inputTV":"superSelect"}
Разметка колонок:{"header": "Фильтр", "width": "100", "sortable": "false", "dataIndex": "filter"}
Честно говоря, с MIGX я пакет не связывал, поэтому ничего по этому поводу сказать не могу.
Павел, у меня выводятся все документы с тегами, в том числе снятые с публикации (не опубликованные).
Как сделать так, что бы выводились только опубликованные документы?
Как сделать так, что бы выводились только опубликованные документы?
Это когда что вы делаете?
После того как кликаю на один из тегов документа, выводится список связанных с этим тегом документов.
Использую ваш код:
Контент для вывода списка ресурсов:
{if $.get['tag']?}
{$_modx->runSnippet('pdoPage', [
'element' => 'tvssResources',
'tv' => '2',
'parents' => 0,
'ajaxMode' => 'default',
'tpl' => '@INLINE {$id} — {$pagetitle}',
]) ?: 'Ресурсов по данному тегу не найдено'}
{$_modx->getPlaceholder('page.nav')}
{else}
Укажите тег для выборки документов
{/if}
Использую ваш код:
Контент для вывода списка ресурсов:
{if $.get['tag']?}
{$_modx->runSnippet('pdoPage', [
'element' => 'tvssResources',
'tv' => '2',
'parents' => 0,
'ajaxMode' => 'default',
'tpl' => '@INLINE {$id} — {$pagetitle}',
]) ?: 'Ресурсов по данному тегу не найдено'}
{$_modx->getPlaceholder('page.nav')}
{else}
Укажите тег для выборки документов
{/if}
Код на данном сайте необходимо оформлять в тег code:
Используйте параметры pdoResources, а точнее showUnpublished.
<code>тут указываем наш код</code>
Используйте параметры pdoResources, а точнее showUnpublished.
Спасибо Павел! Заработало как надо.
Насчёт «code» понятно, буду использовать.
И дополнительный вопрос: Можно ли Ваш инструмент использовать для создания облака тегов сайта?
Насчёт «code» понятно, буду использовать.
И дополнительный вопрос: Можно ли Ваш инструмент использовать для создания облака тегов сайта?
Облако тегов на данный момент не реализовано. Во-первых, потому что я занят, во-вторых, потому что не особо понятно, как оно должно работать, что называется «до мелочей».
1. Веский аргумент =) (не в обиду, сам такой)
2. modx.pro/solutions/7958-tag-cloud-for-minishop2/ — тут неплохо всё расписано. Только я не совсем уверен, что тот вариант будет работать с тегами tvSuperSelect… Но думаю идею можно взять оттуда:
2. modx.pro/solutions/7958-tag-cloud-for-minishop2/ — тут неплохо всё расписано. Только я не совсем уверен, что тот вариант будет работать с тегами tvSuperSelect… Но думаю идею можно взять оттуда:
Алгоритм работы прост:
1. Собираются теги со всех товаров сайта.
2. Подсчитывается количество товаров для каждого тега.
3. Рассчитываются размеры для каждого уровня и границы по количеству использования тега.
4. Если не указан шаблон вывода, то на экране также будет облако тегов, но без ссылок.
По сути для облака важен вес (уровень), количество упоминаний тега и список самих тегов.
Чтобы выбирались теги со всего сайта и с какой-то определённой категории.
Не думаю что нужно что-то ещё, уровень можно подставлять в классах чанка для величины тега…
Чтобы выбирались теги со всего сайта и с какой-то определённой категории.
Не думаю что нужно что-то ещё, уровень можно подставлять в классах чанка для величины тега…
При выводе похожих статей используюю конструкцию из документации:
1. Из журнала ошибок:
2. Не нашел как убрать из списка похожих статей саму статью, из которой вызван сниппет.
[[tvssResources:empty=`Похожих записей не найдено`?
&tv=`2`
&tags=`[[tvssTags?id=`[[*id]]`&tv=`2`&tpl=`@INLINE [[+tag]]`&outputSeparator=`||`]]`
&parents=`0`
&limit=`4`
]]
Выводит отлично, но есть 2 вопроса:1. Из журнала ошибок:
[2016-11-04 18:26:40] (ERROR @ W:\domains\localhost\core\xpdo\xpdo.class.php : 502) Path specified for package tvsuperselect is not a valid or accessible directory: W:/domains/localhost/core/w:/domains/localhost/core/components/tvsuperselect/model/
Сниппет работает несмотря на это, но немного раздражает… Как её убрать?2. Не нашел как убрать из списка похожих статей саму статью, из которой вызван сниппет.
1) Может быть это из-за Винды?
2) Добавить параметр where и исключить текущий ресурс там:
2) Добавить параметр where и исключить текущий ресурс там:
&where=`{"id:!=":"[[*id]]"}`
Как перенесу на реальный хостинг — отпишусь насчет ошибки.
Спасибо, насчет where забыл совсем )))
Спасибо, насчет where забыл совсем )))
Создаю набор параметров со снипеттом tvssTags. Поле параметра id делаю текстовым, вписываю $_modx->resource.id или [[*id]], всё одно, не цепляет ид текущего ресурса.
Павел, скажите пожалуйста, это можно как-нибудь решить, кроме как {$_modx->runSnippet('tvssTags@tags', ['id'=>$_modx->resource.id])}? Спасибо
Павел, скажите пожалуйста, это можно как-нибудь решить, кроме как {$_modx->runSnippet('tvssTags@tags', ['id'=>$_modx->resource.id])}? Спасибо
При наличие собственных плагинов на событие «OnBeforeDocFormSave» tvSuperSelect возвращает ошибку:
— при том, что по отдельности как дополнение, так и плагин срабатывают корректно.
/home/(путь)/components/tvsuperselect/tv/output/
— при том, что по отдельности как дополнение, так и плагин срабатывают корректно.
Если скинете доступ на почту — попробую диагностировать проблему.
Скинул, спасибо..)
С минимальным функционалом, облако тегов к компоненту можно реализовать следующим способом:
1. Создаем сниппет (tags.list):
2. Создаем чанк для отображения кнопки тега (tags.list.item):
3. Вызываем созданный сниппет:
При желании можно добавить подсчет использований каждого тега, убрав $q->groupby('value') и добавив счетчик внутри цикла.
1. Создаем сниппет (tags.list):
<?php
$pdoTools = $modx->getService('pdoTools');
$TvSuperSelect = $modx->getService('tvsuperselect', 'tvsuperselect', MODX_CORE_PATH . 'components/tvsuperselect/model/tvsuperselect/');
if (!$TvSuperSelect) {
$modx->log(xPDO::LOG_LEVEL_ERROR, 'Не удалось загрузить TvSuperSelect');
return;
}
$q = $modx->newQuery('tvssOption');
$q->groupby('value');
$q->select('value, tv_id');
$q->where(array(
'tv_id' => $tv_id
));
if ($q->prepare() && $q->stmt->execute()) {
$tags = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
}
$tags_page = $modx->makeUrl($tags_page, '', '', 'full');
foreach($tags as $tag) {
$result .= $pdoTools->getChunk($tpl, array(
'tag' => $tag['value'],
'tags_page' => $tags_page
));
}
return $result;
2. Создаем чанк для отображения кнопки тега (tags.list.item):
<a href="{$tags_page}{$tag | replace : " " : "%20"}/">{$tag}</a><br />
3. Вызываем созданный сниппет:
{$_modx->runSnippet('!tags.list', [
'tv_id' => 5,
'tpl' => 'tags.list.item',
'tags_page' => 99
])}
При желании можно добавить подсчет использований каждого тега, убрав $q->groupby('value') и добавив счетчик внутри цикла.
Спасибо за добавление этой, на мой взгляд очень важной, функции. Но ссылка на страницу с тегами почему-то не работает. Она даже другого вида, чем та, которая в стандартном сниппете генерируется: в стандартном /tag-search?tag=тег в json, а в приведённом /tag-searchтег
При желании можно добавить подсчет использований каждого тега, убрав $q->groupby('value') и добавив счетчик внутри цикла.Опишите это пожалуйста для далёких. И можно ли будет при этом теги лимитриовать по самым используемым? Спасибо
Упс) Извиняюсь — для себя я реализовал теги в виде site.ru/tag/тег/ через кастомную маршрутизацию, поэтому и такая ссылка. Просто замените чанк на что-нибудь в духе:
Что же до подсчета кол-ва использований, то примерно так:
Ну и в чанк добавить плейсхолдер [[+count]] для отображения
href="{$tags_page}?tag={$tag | replace : " " : "%20"}/"
Что же до подсчета кол-ва использований, то примерно так:
<?php
$pdoTools = $modx->getService('pdoTools');
$TvSuperSelect = $modx->getService('tvsuperselect', 'tvsuperselect', MODX_CORE_PATH . 'components/tvsuperselect/model/tvsuperselect/');
if (!$TvSuperSelect) {
$modx->log(xPDO::LOG_LEVEL_ERROR, 'Не удалось загрузить TvSuperSelect');
return;
}
$q = $modx->newQuery('tvssOption');
$q->select('value, tv_id');
$q->where(array(
'tv_id' => $tv_id
));
if ($q->prepare() && $q->stmt->execute()) {
$tags = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
}
$result = '';
$tags_list = array();
$tags_count_list = array();
foreach($tags as $tag) {
if (in_array($tag['value'], $tags_list)) {
$key = array_search($tag['value'], $tags_list);
$tags_count_list[$key] = $tags_count_list[$key] + 1;
}
else {
array_push($tags_list, $tag['value']);
array_push($tags_count_list, 1);
}
}
$result = '';
foreach($tags_list as $key => $value) {
$result .= $pdoTools->getChunk($tpl, array(
'tag' => $value,
'count' => $tags_count_list[$key],
'tags_page' => $tags_page
));
}
return $result;
— осталось только добавить сортировку массива по вкусу.) Ну и в чанк добавить плейсхолдер [[+count]] для отображения
Спасибо! Получилось так
<a href="{$tags_page|url}?tag={$tag | replace : " " : "%20"}">{$tag} <sup>{$count}</sup></a>
Теперь, чтобы сделать сортировку, нужно завести pdoResources в elements указав tags.list и where указать параметры, так?
Вряд ли это сработает — данный сниппет возвращает результат единым куском. Нужно заменить процесс формирования $tags_list, чтобы ключом заносилось наименование тега, а значением — количество использований. После чего отсортировать массив по krsort(); и точно также вывести результат.
Спасибо за Вашу отзывчивость, но моих знаний не хватит реализовать этот функционал.
Эх, услышал бы уважаемый Павел эти вздохи и дополнил свой замечательный компонент данным функционалом!
Эх, услышал бы уважаемый Павел эти вздохи и дополнил свой замечательный компонент данным функционалом!
Вот так:
— в таком варианте результат будет отсортирован от самых используемых тегов к наименее.
//...
//до этих строк изменений нет
$result = '';
$tags_list = array();
foreach($tags as $tag) {
$key = $tag['value'];
if (array_key_exists($key, $tags_list)) {
$tags_list[$key] = $tags_list[$key] + 1;
}
else {
$tags_list[$key] = 1;
}
}
asort($tags_list);
$tags_list = array_reverse($tags_list, true);
$result = '';
foreach($tags_list as $key => $value) {
$result .= $pdoTools->getChunk($tpl, array(
'tag' => $key,
'count' => $value,
'tags_page' => $tags_page
));
}
return $result;
— в таком варианте результат будет отсортирован от самых используемых тегов к наименее.
О! Пока «вздыхал», Вы уже написали ответ! Спасибо!
Лимит бы ещё сделать и вообще всё круто будет!
Лимит бы ещё сделать и вообще всё круто будет!
Меняем:
На:
foreach($tags_list as $key => $value) {
$result .= $pdoTools->getChunk($tpl, array(
'tag' => $key,
'count' => $value,
'tags_page' => $tags_page
));
}
На:
$counter = 1;
if (!isset($limit)) {
$limit = 10;
}
foreach($tags_list as $key => $value) {
if ($counter <= $limit) {
$result .= $pdoTools->getChunk($tpl, array(
'tag' => $key,
'count' => $value,
'tags_page' => $tags_page
));
$counter = $counter + 1;
}
}
+ добавить в вызов сниппета параметр &limit.
У меня нет слов! Сегодня безусловно Вы для меня Дед Мороз. Всё работает! С праздниками и огромное спасибо!
Не за что..)
Максим КузнецовМожно поподробнее как сделать, чтобы URL облака тегов был site.ru/tags/, а ресурсы с определенным тегом выводились бы по URL site.ru/tags/определенный+тег/
06 января 2017, 15:57
Упс) Извиняюсь — для себя я реализовал теги в виде site.ru/tag/тег/ через кастомную маршрутизацию, поэтому и такая ссылка.
Заранее, благодарю!
1. Создается обычный ресурс «список тегов» с псевдонимом tags
2. Кастомной маршрутизацией по шаблону /tags/{item} присваивается плейсхолдер и sendForward-ится на страницу из пункта 1.
2. Кастомной маршрутизацией по шаблону /tags/{item} присваивается плейсхолдер и sendForward-ится на страницу из пункта 1.
2. Кастомной маршрутизацией по шаблону /tags/{item} присваивается плейсхолдер и sendForward-ится на страницу из пункта 1.Можно этот пункт поподробнее, недолго знаком с MODX, да и в php не особо силен.
Страницу с облаком /tags/ сделал, теги выводятся, схема URL правильная:
Однако из статьи bezumkin.ru/sections/tips_and_tricks/2918/ не совсем понятно как применить все описанное к данному случаю.
Не сочтите за наглость, опишите это пожалуйста для далёких (пока) новичков в MODX и не особо знающих php, а именно можете дать код плагина, который это делает (кастомную маршрутизацию).
Я так понимаю на него надо будет повесить событие OnPageNotFound
Заранее, благодарю!
site.ru/tags/определенный+тег/
Однако из статьи bezumkin.ru/sections/tips_and_tricks/2918/ не совсем понятно как применить все описанное к данному случаю.
Не сочтите за наглость, опишите это пожалуйста для далёких (пока) новичков в MODX и не особо знающих php, а именно можете дать код плагина, который это делает (кастомную маршрутизацию).
Я так понимаю на него надо будет повесить событие OnPageNotFound
Заранее, благодарю!
Под рукой готового плагина у меня нет. Есть встречное предложение (и вы не сочтите за наглость, угу):
Вариант 1: все-таки прочитать статью по ссылке, а именно участок кода с пометкой «рабочий плагин» и изменить там 3.5 строчки. Вот, например, аналогичный плагин для реализации страниц пользователей.
Вариант 2: modx.pro/work
Вариант 1: все-таки прочитать статью по ссылке, а именно участок кода с пометкой «рабочий плагин» и изменить там 3.5 строчки. Вот, например, аналогичный плагин для реализации страниц пользователей.
Вариант 2: modx.pro/work
Если добавлять в список строки, содержащие *\/() и другие специальные символы для регулярных выражений, не добавляется новый элемент в список, возникает ошибка «Uncaught SyntaxError: Invalid regular expression» Фикс — экранирование символов при проверке соответствия последнего пункта списка с добавляемым в регулярном выражении.
Отправил PR: github.com/modxcms/revolution/pull/13236. Это практически мой первый вклад в OpenSource, надеюсь пригодится, если что — поправьте, буду благодарен :)
Отправил PR: github.com/modxcms/revolution/pull/13236. Это практически мой первый вклад в OpenSource, надеюсь пригодится, если что — поправьте, буду благодарен :)
Создал теги к тикетам почему то ссылка в теге выглядит вот так tag=%25D0%25B2%25D1%258B%25D1%2581%25D1%2582%25D0%25B0%25D0%25B2%25D0%25BA%25D0%25B0
можно как то исправить все делал по инструкции.
можно как то исправить все делал по инструкции.
Вам удалось решить эту проблему с урлом?
{$_modx->runSnippet('tvssTags', [
'id' => $_modx->resource.id,
'tv' => 35, //ID tv тегов
'pageId' => 54, //ID страницы выборки по тегам
'outputSeparator' => '',
'tpl' => '@INLINE <li><a class="tl-tag" href="{$link | unescape : "url"}">{$tag}</a></li>',
])}
Причина была здесь здесь {$link | unescape : "url"}
У меня была аналогичная проблема robo74.tw1.ru/tags-training?tag=%D0%9C%D0%B0%D0%B3%D0%BD%D0%B8%D1%82%D0%BE%D0%B3%D0%BE%D1%80%D1%81%D0%BA {$_modx->runSnippet('tvssTags', [
'id' => $_modx->resource.id,
'tv' => 35, //ID tv тегов
'pageId' => 54, //ID страницы выборки по тегам
'outputSeparator' => '',
'tpl' => '@INLINE <li><a class="tl-tag" href="{$link | unescape : "url"}">{$tag}</a></li>',
])}
Причина была здесь здесь {$link | unescape : "url"}
Скажите, пожалуйста, с mFilter2 работает?
&filters=`
tv|filter_mat_korp
`
ставлю, выдает ["\u041b\u0414\u0421\u041f"] 1
в списке фильтров
Вопрос такой, в чём может быть причина:
Блок Похожие материалы, основанный на инструкции
Похожие ресурсы
Fenom:
Блок Похожие материалы, основанный на инструкции
Похожие ресурсы
Fenom:
{$_modx->runSnippet('tvssResources', [
'tv' => '2',
'tags' => $_modx->runSnippet('tvssTags', ['id' => $_modx->resource.id, 'tv' => '2', 'tpl' => '@INLINE [[+tag]]', 'outputSeparator' => '||']),
'parents' => 0,
'limit' => 4,
]) ?: 'Похожих записей не найдено'}
Notice: Undefined variable: context in /var/www/path-to-site/core/cache/includes/elements/modsnippet/31.include.cache.php on line 6
Notice: Undefined index: class in /var/www/path-to-site/core/cache/includes/elements/modsnippet/31.include.cache.php on line 38
Notice: Array to string conversion in /var/www/path-to-site/core/components/pdotools/model/pdotools/pdofetch.class.php on line 215
На PHP 5.6 и на PHP 7.0 вываливается, MODX 2.5.8, Apache2
Добрый день! Не работает tvSuperSelect с MIGX. Данные заполняются, но при редактировании, все что забил в поле пропадает. Можно как-то поправить?
Кстати, попробовал использовать с MIGX тип TV авто-метка и тоже не работает.
Кстати, попробовал использовать с MIGX тип TV авто-метка и тоже не работает.
Приветствую!
Как сделать сортировку тегов в снипете tvssTags?
Сейчас получается, что теги в обратном порядке выводятся.
Как сделать сортировку тегов в снипете tvssTags?
{'tvssTags' | snippet : [
'id' => $id,
'tv' => 23,
'sortdir' => 'DESC',
'outputSeparator' => ',',
'tplWrapper' => '@INLINE <span>{$output}</span>',
'tpl' => '@INLINE {$tag}'
]}
Вывожу так. Ничего не меняется.Сейчас получается, что теги в обратном порядке выводятся.
А что вы указываете, чтобы порядок был «не обратный»? Почитайте, пожалуйста, про ASC и DESC и что из них порядок возрастания и порядок убывания.
Опечатка, ASC конечно.
Но ASC и DESC ситуацию не меняют никак. Порядок всегда в обратном направлении.
Но ASC и DESC ситуацию не меняют никак. Порядок всегда в обратном направлении.
Добрый день. На странице материала вывожу блок с похожими материалами таким образом:
Когда понадобилось вывести все это через чанк fenom:
Если выводить чанк стандартным способом:
Кстати, пробовал исключать ненужные материал через
Подскажите, где у меня ошибка?
{set $related_items = $_modx->runSnippet('tvssResources', [
'tv' => '6',
'tags' => $_modx->runSnippet('tvssTags', ['id' => $_modx->resource.id, 'tv' => '6', 'tpl' => '@INLINE [[+tag]]', 'outputSeparator' => '||']),
'parents' => 0,
'limit' => 10,
'tpl' => '@INLINE <li><a href="{$uri}">{$pagetitle}</a></li>',
'where'=>'{"id:!=":"[[*id]]"}'
])}
{if $related_items}
<div class="related-items"><div class="h3">Похожие материалы:</div><ul>{$related_items}</ul></div>
{/if}
где с помощью 'where'=>'{"id:!=":"[[*id]]"}'
исключаю ресурс, в котором вывожу похожие материалы.Когда понадобилось вывести все это через чанк fenom:
{include 'related_items'}
условие where перестает работать.Если выводить чанк стандартным способом:
[[$related_items]]
то все работает.Кстати, пробовал исключать ненужные материал через
'resources'=>'-[[*id]]',
и аналогичная ситуация. В вызове чанка через fenom это не работает, т.е текущий ресурс в похожих материалах выводится.Подскажите, где у меня ошибка?
условие where перестает работать.Ещё бы!
'where'=>'{"id:!=":"[[*id]]"}'
Что это за колдунство?) Запишите нормально, по-человечески, массивом!Вот тоже самое:
'where' => [
'id:!=' => $_modx->resource['id'],
],
Спасибо! Теперь все в порядке.
Не могли бы Вы помочь еще в одном вопросе. В целях самообразования я попытался вывести похожие материалы другим способом, используя pdoResources и присоединение таблицы tvss_options через leftJoin. У меня есть доп. поле tv_tags (tvSuperSelect), в котором я задаю теги и они в свою очередь передаются при сохранении ресурса в поле tags таблицы site_content. В поле tags информация сохраняется в таком виде:
Не могли бы Вы помочь?
Не могли бы Вы помочь еще в одном вопросе. В целях самообразования я попытался вывести похожие материалы другим способом, используя pdoResources и присоединение таблицы tvss_options через leftJoin. У меня есть доп. поле tv_tags (tvSuperSelect), в котором я задаю теги и они в свою очередь передаются при сохранении ресурса в поле tags таблицы site_content. В поле tags информация сохраняется в таком виде:
["тег1","тег2","и т.д."]
Пока я остановился на этом:{'!pdoResources' | snippet: [
'leftJoin' => '{
"tvssOption":{
"class":"tvssOption",
"on":"modResource.id = tvssOption.resource_id"
}
}',
'select' => '{
"modResource":"*",
"tvssOption":"*"
}',
'parents'=> 0,
'limit' => 10,
'tpl' => '@INLINE <p>{$pagetitle}</p></li>'
'where' => [?],
]}
И тут во where я не могу понять, как сделать условие сравнения value из tvss_options и моего tags?Не могли бы Вы помочь?
Все делал по инструкции. Создал теги к тикетам почему-то ссылка в теге выглядит вот так:
tag=%25D0%25B2%25D1%258B%25D1%2581%25D1%2582%25D0%25B0%25D0%25B2%25D0%25BA%25D0%25B0
Можно как то исправить?
tag=%25D0%25B2%25D1%258B%25D1%2581%25D1%2582%25D0%25B0%25D0%25B2%25D0%25BA%25D0%25B0
Можно как то исправить?
{$_modx->runSnippet('tvssTags', [
'id' => $_modx->resource.id,
'tv' => 35, //ID tv тегов
'pageId' => 54, //ID страницы выборки по тегам
'outputSeparator' => '',
'tpl' => '@INLINE <a class=«tl-tag» href="{$link | unescape: «url»}">{$tag}',
])}
Причина была здесь здесь {$link | unescape: «url»}
'id' => $_modx->resource.id,
'tv' => 35, //ID tv тегов
'pageId' => 54, //ID страницы выборки по тегам
'outputSeparator' => '',
'tpl' => '@INLINE <a class=«tl-tag» href="{$link | unescape: «url»}">{$tag}',
])}
Причина была здесь здесь {$link | unescape: «url»}
Прошу помощи сделать правильный запрос, у меня два tv под теги используются tv id5 и tv id10 хочу сделать фильтрацию c izotope плагином, решение подсмотрел у Ильи на сайте.Собственно вопрос
{'pdoResources' | snippet : [
'loadModels' => 'tvsuperselect',
'class' => 'tvssOption',
'sortby' => '{ "value":"ASC" }'
'groupby' => 'value',
'tpl' => '@INLINE <li>
<a href="{$_modx->resource.uri}#{$value}"
data-filter=".{$value | md5}"
class="filter">{$value}</a>
</li>',
'tplWrapper' => '@INLINE <ul class="nav nav-tabs">{$output}</ul>'
]}
Как из value получить тег из tv c id 5, все выходные бился и пока впустую
День добрый! Создала вывод тегов в статье.
Подскажите, пожалуйста, какой должен быть код (в данном синтаксисе, а не fenom) на странице с id=6, чтобы там выводились ресурсы с выбранным тегом?
У меня пока так (и ничего не выводится):
[[tvssTags?
id=`[[*id]]`
&tv=`8`
&tpl=`@INLINE <li><a href="[[+link]]">[[+tag]]</a></li>`
&tplWrapper=`@INLINE
<div class="btArticleShareEtc">
<div class="btTagsColumn">
<div class="btTags">
<ul>[[+output]]</ul>
</div>
</div>
</div>`
&outputSeparator=``
&pageId=`6`
]]
Подскажите, пожалуйста, какой должен быть код (в данном синтаксисе, а не fenom) на странице с id=6, чтобы там выводились ресурсы с выбранным тегом?
У меня пока так (и ничего не выводится):
[[tvssResources:empty=`Похожих записей не найдено`?
&tv=`8`
&tags=`[[tvssTags? id=`[[*id]]` &tv=`8` &tpl=`@INLINE [[+tag]]` &outputSeparator=`||`]]`
&limit=`8`
&tpl=`tpl.Article`
&parents=`6`
&includeContent=`1`
&includeTVs=`image,tags`
&tvPrefix=``
&tag=``
]]
Убрала в последнем примере
Но возникло еще 2 вопроса: первый — как на станице, где выводятся статьи, отфильтрованные по конкретному тегу, вывести в названии сам этот тег?
И второй вопрос: как с помощью стандартного синтаксиса сделать читаемым кириллический тег в url? Сейчас тег «важно» в адресе выглядит так: ?tag=%25D0%25B2%25D0%25B0%25D0%25B6%25D0%25BD%25D0%25BE
Буду благодарна за ответы.
&tag=``
, и все работает теперь.Но возникло еще 2 вопроса: первый — как на станице, где выводятся статьи, отфильтрованные по конкретному тегу, вывести в названии сам этот тег?
И второй вопрос: как с помощью стандартного синтаксиса сделать читаемым кириллический тег в url? Сейчас тег «важно» в адресе выглядит так: ?tag=%25D0%25B2%25D0%25B0%25D0%25B6%25D0%25BD%25D0%25BE
Буду благодарна за ответы.
tvssTags не получается отсортировать ASC/DESC не работают. Как настроить направление сортировки?
Можно ли вывести список тегов внутри сниппета pdoResources?
Вот так делаю, не выводит ни чего
{'!pdoResources' | snippet : [
'parents' => 3,
'depth' => 2,
'includeTVs' => 'modImgOne, subCategory',
'tvPrefix' => '',
'sortby' => '{"menuindex" : "ASC"}',
'tpl' => '@FILE chunks/cat.tpl'
/*для понимания, что нужно
'tpl' => '@INLINE
<a href="{$uri}" class="card">
<img src="{$modImgOne}">
<h3>
Вот сюда нужно вывести 1 тег из всех тегов https://prnt.sc/1dhp2fp.
</h3>
</a>*/
'
]}
Если внутри чанка добавить сниппет вывода списков тегов ресурса, будет работать? Вот так делаю, не выводит ни чего
<a href="{$uri}" class="card">
<img src="{$modImgOne}">
<h3>
{$_modx->runSnippet('tvssTags', [
'id' => $id
])}
</h3>
</a>
Как проверить работу данного сниппета?
ID ТВ поля 15, значения присвоены prnt.sc/1di5bxu
ID родителя правильное prnt.sc/1di5le0
В ресурсах добавлены теги, и им присвоены значения из скриншота выше prnt.sc/1di6vxq
Что не так, куда копать в итоге, сниппет вообще ни чего не выводит, после того как в elements добавляется указание tvssResources
{$_modx->runSnippet('pdoPage', [
'element' => 'tvssResources',
'tv' => '15',
'tag' => '1||2||3',
'parents' => 3,
'tpl' => '@INLINE <div>{$id} - {$pagetitle}</div>',
])}
Не выводит вообще ни чего.ID ТВ поля 15, значения присвоены prnt.sc/1di5bxu
ID родителя правильное prnt.sc/1di5le0
В ресурсах добавлены теги, и им присвоены значения из скриншота выше prnt.sc/1di6vxq
Что не так, куда копать в итоге, сниппет вообще ни чего не выводит, после того как в elements добавляется указание tvssResources
Всем привет, классный плагин получился, перечитал комментарии, но не нашел варианта вывода общего облака тегов со всех ресурсов, кто ни будь сделал такой вывод, подскажите как?
Не получается вывести TV поле image из галереи товара ms2
{$_modx->runSnippet('pdoPage', [
'element' => 'tvssResources',
'tv' => '8',
'parents' => '0',
'tvPrefix' => '',
'includeContent' => '0' ,
'includeTVs' => 'image',
'processTVs' => '1',
'tpl' => '@INLINE {$pagetitle} {$image} ',
'wrapIfEmpty' => '0'
]) ?: 'Ресурсов по данному тегу не найдено'}
удалось вывести
'tpl' => '@INLINE {$pagetitle} {$id | resource : "image" },
, но если вызывать отдельно из чанка, то этот метод не работает
прошу помощи)
modx.pro/help/23302
modx.pro/help/23302
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.