Modx sortby: pdoResources SortBy=RAND() / Русскоязычное сообщество MODX

PageBlocks / Другое / Дополнения MODX / modstore.pro

Внимание, этот компонент требует версию PHP 7.2 или выше! Если ваш сайт использует PHP ниже требуемого, установка этого дополнения может его сломать.

Всем привет.

Версия 1.2.0 не совместима с предыдущими версиями. При обновлении все может поломаться.

PageBlocks позволяет легко и быстро интегрировать верстку. Больше никаких дополнительных полей(tv). Добавляйте, удаляйте и перемещайте блоки в интерфейсе ресурса.

Блоки контента

Разберем несколько блоков для примера:

1. Обычный блок

Блок имеет структуру: заголовок, описание, 2 кнопки и картинку.

Теперь давайте создадим такой блок в конструкторе блоков:

В чанке hero нам доступны след. переменные: title, desc, appstore, googleplay и img

2. Блок с повторяющими элементами.

Здесь мы будем использовать дополнительную таблицу внутри блока:

В чанке выводим таблицу через параметр

blocks(имя поля, которое мы задали в блоке):

{foreach $blocks as $block}
    <div>
        <div>
            <div></div>
            <h3>{$block.title}</h3>
        </div>
        <div>
            {$block.desc}
        </div>
    </div>
{/foreach}
3. Готовые блоки.

Есть блок FAQ, который нужно вывести и на других страницах. Но, заполнять такие блоки на каждой странице было бы тупо.

Поэтому мы заполним блок только в одном месте — в базе готовых блоков.
1. Создаем структуру блока

2. Заполняем блок

3. Добавляем на страницы

Но, можно еще вывести этот блок вручную через идентификатор блока.

{'!pdoResources' | snippet: [
    'frontend_css' => '',
    'class' => 'pageBlock',
    'loadModels' => 'pageBlocks',
    'sortby' => 'rank',
    'sortdir' => 'asc',
    'limit' => 1,
    'tpl' => 'tpl.PageBlocks',
    'where' => [
        'id' => 4, // faq block id
        'active' => 1
    ],
]}

При обновлении базового блока, все соответствующие блоки будут обновлены автоматически, кроме тех блоков, у которых отмечена галочка «Уникальный блок».

Доступность

Каждый блок можно сделать доступным только для конкретной страницы или шаблона.

Вывод блоков на странице

{'!pdoResources' | snippet: [
    'frontend_css' => '',
    'class' => 'pageBlock',
    'loadModels' => 'pageBlocks',
    'sortby' => 'rank',
    'sortdir' => 'asc',
    'limit' => 0,
    'tpl' => 'tpl.PageBlocks',
    'where' => [
        'resource' => $_modx->resource.id,
        'active' => 1
    ],
]}

Мультиязычность

1. Контексты. (например, Babel)
Используем тот же код, что и выше.

2. Без контекстов (например, localizator)
В системной настройке pageblocks_contexts добавляем необходимые языки, например English==web||Russian==ru. Где English — это название языка, web — имя контекста. В недалеком будущем будет автоматический перевод.

Выводим блоки:

{'!pdoResources' | snippet: [
    'frontend_css' => '',
    'class' => 'pageBlock',
    'loadModels' => 'pageBlocks',
    'sortby' => 'rank',
    'sortdir' => 'asc',
    'limit' => 0,
    'tpl' => 'tpl.
PageBlocks', 'where' => [ 'resource' => $_modx->resource.id, 'context_key' => $_modx->config.localizator_key, 'active' => 1 ], ]}

Экспорт / Импорт

Есть возможность экспортировать/импортировать блоки в формат csv. Очень удобно для копирования блоков с одной страницы в другую, а также для импорта большого кол-во однотипных блоков, но об этом узнаете чуть позже))

PrettyTags — дружелюбные теги в MODX

PrettyTags — дружелюбные теги в MODX

  1. Главная
  2. MODX
  3. PrettyTags — дружелюбные теги в MODX

15421

Назад

Представляю мой новый компонент PrettyTags. Компонент, который даёт возможность создавать и управлять тегами с красивыми ЧПУ ссылками.

Компонент уже выложен в репозиторий modstore.pro.

Приемущества компонента

  • Дает возможность создавать динамические красивые url для тегов. Например, site.com/tag/some-tag.
  • Есть страница по управление тегами, где мы указываем: alias, название, описание. Можно добавлять, удалять, редактировать и отключать теги.
  • Есть собственное TV-поле, в которые подгружаются все добавленные теги и нельзя нечаянно добавить новый тег, что удобно при работе с контент-менеджерами, также не показываются отключенные теги
  • Есть собственный сниппет для вывода облака тегов, который легко кастомизируется.
  • Страница с выводом тега сразу получает все поля, где мы можем легко их вывести и использовать с другими компонентами
  • Вы можете менять названия и другие поля тегов, при этом в ресурсах ничего не потеряется.
  • Намного производительнее по сравнению с ТВ «Авто-метка», так как теги собираются не у каждого ресурса, а из одной сущности

Обзор компонента

Компонент добавляет новую страницу в админке по управлению тегами. Где вы можете добавлять, удалять и редактировать новые теги.

Добаляется новое TV-поле, аналогичное «Авто-метка», за исключением, добавления новых тегов

Подключению к сайту

Устанавливаем компонент, затем нужно вывести теги в ресурсы и добавить страницу для отловки тегов.

Вывод тегов в ресурсе

Cоздаём TV-поле с типом «prettytagstv» для вывода и работы с тегами. Добавляем новые теги на странице «Пакеты — Pretty Tags»

Для отображении тегов в ресурсе, вызываем сниппет prettyTagsResource

[[!prettyTagsResource?
    &tpl=`tags_item`
    &input=`[[*tags]]`
]]
// в Fenom
{$_modx->runSnippet('!prettyTagsResource', [
    'input' => $_modx->resource.tags,
    'tpl' => 'tags_item'
])}

Доступны следующие параметры:

  • input — значение TV-поля с тегами
  • tpl — tpl тега
  • sortby — сортировка по полю, например: sortby='name'
  • sortdir — направление сортировки, ASC или DESC
  • limit — маскимальное количество тегов на страницу, например: limit='10'
  • outputSeparator — разделить между тегами, например: outputSeparator=','

в tpl указываем свою разметку одного тега, если нужно:

<li>
    <a href="[[+url]]">[[+name]]</a>
</li>

<!-- [[+url]] - полный url на страницу тега -->
<!-- [[+alias]] - alias тега -->
<!-- [[+id]] - id тега -->
<!-- [[+name]] - название тега -->
<!-- [[+description]] - описание тега -->

Страница для отображения ресурсов по тегу

Нужно создать новый ресурс, который будет отлавливать наши теги. Важно: В данном ресурсе, снять галочку с “Кэшируемый” во избежании проблем.. Затем нужно указать ID этого ресурса в системной настройке prettytags_resource_id.

Теперь в шаблоне можно указывать все поля тега:

[[+pretty_tags_id]]     
[[+pretty_tags_alias]]  
[[+pretty_tags_name]]   
[[+pretty_tags_description]]

// Fenom
{$_modx->getPlaceholder('pretty_tags_id')}
{$_modx->getPlaceholder('pretty_tags_alias')}
{$_modx->getPlaceholder('pretty_tags_name')}
{$_modx->getPlaceholder('pretty_tags_description')}

Для вывода ресурсов по тегу, используем pdoResource или PdoPage

[[!pdoPage?
    &parents=`0`
    &includeTVs=`tags`
    &tpl=`tpl_article`
    &where=`["FIND_IN_SET('[[+pretty_tags_id]]', tags) > 0"]`
]]
[[!+page.nav]]

// в Fenom
{$_modx->runSnippet('!pdoPage', [
    'parents' => 0,
    'includeTVs' => 'tags',
    'tpl' => 'tpl_article',
    'where' => '["FIND_IN_SET(\''~$_modx->getPlaceholder('pretty_tags_id')~'\', tags) > 0"]',
])}
{$_modx->getPlaceholder('page. nav')}

Небольшая трудность, если вы вызваете хлебные крошки, так как теги динамичные, в хлебных крошках тега не будет, вариант обойти:

[[!pdoCrumbs?
    &tplWrapper => `@INLINE <ol>
        [[+output]]
        <li>
            <a itemprop="item" href="[[*alias]]/[[+pretty_tags_alias]]">
                [[+pretty_tags_name]]
            </a>
        </li>
    </div>`
]]

// в Fenom
{$_modx->runSnippet('!pdoCrumbs', [
    'tplWrapper' => '@INLINE <ol>
        {$output}
        <li>
            <a href="'~$_modx->resource.alias~'/'~$_modx->getPlaceholder('pretty_tags_alias')~'">
                '~$_modx->getPlaceholder('pretty_tags_name')~'
            </a>
        </li>
    </ol>',
])}

Облако тегов

В любом месте сайта, вы можете отобразить облако тегов, с помощью сниппета

prettyTagsCloud

[[!prettyTagsCloud?
    &tvId=`1`
    &tpl=`tags_item`
]]

// в Fenom
{$_modx->runSnippet('!prettyTagsCloud',[
    'tvId' => 1,
    'tpl' => 'tags_item',
])}

Доступны следующие параметры:

  • tvId — Id TV-поля с тегами, обязательный параметр
  • tpl — tpl тега
  • sortby — сортировка по полю, например: sortby='name'
  • sortdir — направление сортировки, ASC или DESC
  • limit — маскимальное количество тегов на страницу, например: limit='10'
  • outputSeparator — разделить между тегами, например: outputSeparator=','
  • includeUnpublished — включить неопубликованные ресурсы, например: includeUnpublished='1'
  • includeDeleted — включить удаленные ресурсы, например: includeDeleted='1'

в tpl указываем свою разметку одного тега, если нужно:

<li>
    <a href="[[+url]]">[[+name]]</a>
</li>

<!-- [[+url]] - полный url на страницу тега -->
<!-- [[+alias]] - alias тега -->
<!-- [[+id]] - id тега -->
<!-- [[+name]] - название тега -->
<!-- [[+description]] - описание тега -->
<!-- [[+count]] - количество использования тега в ресурсах -->

Все пожелания и проблемы, прошу обсуждать здесь, для быстрого реагирования.

Обновление 1.0.1, сделано:

  • Теперь работает как со слешом на конце, так и без на странице тегов (https:/site.com/tag/some-tag или https:/site.com/tag/some-tag/)
  • Добавлена системная настройка — если тега не существуюет (на странице тегов), то отправлять на 404 страницу, по умолчанию включено

Обновление 1.0.2, сделано:

  • Сортировка по названию тега в ресурсе в тв
  • Автоматическое заполнение alias при создания тегов

Обновление 1.0.3, сделано:

  • добавлен плейсхолдер [[+count]] для tpl в сниппете prettyTagsCloud
  • добавлены параметры сниппета prettyTagsCloud: tvId (id TV с тегами, обязательный), includeUnpublished (включать с неопубликованными ресурсами), includeDeleted (включать с удаленными ресурсами)

« Предыдущая статья

Modx Revolution pdoPage и Bootstrap 4

Следующая статья »

Установка MODX Revolution на локальный сервер

Назад

Комментарии

Алексей 06 октября 2022, 21:09

Здравствуйте. Обновите компонент, он ломает частично MODX (2.8.4), ресурсы-ссылки перестают работать и(поле ссылка пропадает, в консоль падает ошибка core/xpdo/om/xpdoobject.class.php : 344) Instantiated a derived class modWebLink that is not a subclass of the requested class modDocument . Отсюда идут еще и конфликты с плагинами типа redirect

Denis 27 апреля 2022, 12:53

Здравствуйте! Как использовать синтаксис Fenom в чанке сниппета «prettyTagsResource» вместо этого:
<li>
<a href=»[[+url]]»>[[+name]]</a>
</li>

Oleg 19 апреля 2022, 12:42

Подскажите, как вывести теги в списке новостей.

Константин 11 апреля 2022, 09:02

Добрый день, перестал работать компонент.
При переходе по ссылке тега дублируется страница поиска по тегам: https://вашсайт.ру/url-страницы-тегов/страницы-тегов/alias-тега
И сайт отдает 404 ошибку.

Валерий 17 марта 2022, 13:14

Добрый день.
Тут уже спрашивали, но подтвердился факт, после установки плагина перестал работать компонент Redirector.
Как считаете, можно как-то поправить?

evgeny 15 января 2022, 10:58

Было бы здорово добавить возможность вывода, как-бы присвоения tv к набору тегов, тем самым появится возможность создавать наборы с тегами, допустим есть два раздела: новости и допустим полезная информация, и выводить сниппет
[[!prettyTagsCloud?
&tvId=`1`
&tpl=`tags_item`
]]
В tvId указывать id указывать id нужного набора с тегами, а зависимость присвоения тегов можно указывать допустим в дополнительное поле на странице с тегами
Такая идея возникла потому что мешают лишние теги в облаке тегов на странице с категорией(новости и полезная информация, в новостях ненужны некоторые теги от полезной инфы)

evgeny 18 декабря 2021, 06:34

Привет привет!
Подскажите пожалуйста, как вывести только нужные мне теги(указываю id тегов) на любой странице

Alexandr 26 июля 2021, 20:08

А вообще с разными контекстами будет работать?

Alexandr 26 июля 2021, 19:53

Приветствую!
Возникла проблема. Плагин конфликтует с плагином redirect на событие onpageNotFound
Можно как то пофиксить?

Елена 13 марта 2021, 13:57

Добрый день

При попытке добавить тег вылетает ошибка http://prntscr.com/10kdsfu

Как устранить?

Daruse

Добрый день, нужно больше информации, версии php, mysql. Думаю проблема связана с сервером, проверьте, соответствует сервер требованиям modx? https://docs.modx.com/current/ru/getting-started/server-requirements#switchsettings

Оставить комментарий

Антиспам поле. Его необходимо скрыть через css

Ваше имя

Электронная почта

Ваше сообщение

Присылайте свои вопросы, предложения и пожелания на электронную почту. Будем рады сотрудничеству.

E-mail: [email protected]

Telegram: daruse93

Вы можете сказать спасибо автору сайта или перевести оплату.

Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.

pdoPage sortby like — Extras

Сообщество MODX

Джо-Петтс

#1

Привет,

Я пытаюсь получить следующую проблему с помощью вызова pdoPage:

Сначала отображаются все записи в районе «центр» и сортируются по расстоянию. Затем следует отобразить и отсортировать по расстоянию все остальные записи, не находящиеся в «центре» района.

С sql это будет выглядеть примерно так (я думаю): ORDER BY район = 'центр' ASC, расстояние ASC

Моя попытка еще не сработала:

 [[!pdoPage?
&родители=`1`
&sortby=`{"район='центр'":"ASC","distance":"ASC"}`
&tpl=`mytpl`
]]
 

Есть идеи?

1 Нравится

29 октября 2019 г. , 10:58

#2

Добро пожаловать в сообщество!

pdoPage используется для перечисления ресурсов (имеется в виду фактические страницы в дереве ресурсов). Вы можете использовать только &sortby для сортировки по соответствующим полям ресурсов этих ресурсов, например, по pagetitle .

Чтобы отсортировать ресурсы по чему-то вроде расстояния, вам, вероятно, потребуется создать переменную шаблона для этих ресурсов и ввести в нее значение расстояния для каждого ресурса. Затем вы можете добавить &includeTVs к вашему вызову pdoPage и сослаться на свой телевизор, чтобы иметь возможность сортировать по нему.

Для получения дополнительной информации взгляните на документ pdoResources, так как большинство (если не все) свойств применимы и к pdoPage. Там вы также найдете более подробную информацию о &sortby и свойство &includeTVs .

1 Нравится

Джо-Петтс

#3

Большое спасибо!

Я просто вижу, что мой код не полный, спасибо за подсказку. Телевизор уже создан и будет интегрирован следующим образом:

 [[!pdoPage?
&родители=`1`
&includeTVs=`район,расстояние`
&sortby=`{"район='центр'":"ASC","distance":"ASC"}`
&tpl=`mytpl`
]]
 

Простая сортировка по расстоянию также отлично работает. Я просто не знаю, как сначала отсортировать «центр» по расстоянию, а затем другие записи.

Я очень хорошо знаю документацию по pdoResources, но ответа на мой вопрос нет.

вибродизайн

#4

Сколько у вас других районов, кроме «центра»? Если это вариант для вас, вы можете вложить свои ресурсы следующим образом:

  • центр

    • ресурс центра
    • ресурс центра
  • не по центру

    • нецентральный ресурс
    • нецентральный ресурс

А затем просто вызовите два экземпляра pdoPage , один из которых ссылается на «центральный», а другой — на «другой» (вне центра) ресурс.

Также я не уверен, что "район='центр'":"ASC" является правильным синтаксисом. Вы можете использовать только имя: сортировка

2 лайка

Джо-Петтс

#5

Это около 100 ресурсов и 20 районов. А структура ресурсов уже фиксирована и не должна меняться.

Я надеялся, что будет способ передать «ORDER BY» из SQL в другом написании в «&sortby».

Я не получаю сообщение об ошибке с район='центр'":"ASC" , но это не работает.

1 Нравится

Люси

#6

Что происходит с вашим звонком? Я предполагаю, что вы отсортировали все 100 ресурсов по расстоянию?
Некоторые идеи – надеюсь, я не принесу больше вреда, чем пользы:

Я никогда этого не делал, но, возможно, сработает изменение синтаксиса на тот, который используется свойством filterby:

 "район==центр":"ASC ","расстояние":"ASC"
 

Если это не работает:

 "район":"ASC","расстояние":"ASC"
 

должен сначала рассортировать все по группам по районам, а затем рассортировать по расстоянию внутри каждого района. Вы получите центр район в качестве первой группы только в том случае, если он окажется первым в алфавитном порядке.

Что за районное телевидение? Выбрать список? Возможно, вы могли бы присвоить числовое значение и сортировать по нему, а не по написанию, и таким образом вы могли бы присвоить 1 центральному району.


Если бы я делал это с pdoresources, я мог бы просто использовать 2 отдельных вызова с фильтрами. Таким образом, первый вызов фильтрует по , равному центру , а второй вызов фильтрует по , НЕ равному центру … Но не уверен, как обернуть 2 вызова pdoresources в один вызов pdopage. Бьюсь об заклад, это можно сделать, хотя…


Как бы то ни было, если каждый район представляет собой отдельный флажок TV, каждый из которых имеет только один флажок, тогда вы можете просто включить этот телевизор в сортировку (в этом примере «центр» — это флажок ТВ) :

 "центр":ASC,"расстояние":ASC
 

Все ресурсы с установленным флажком «по центру» будут отображаться первыми. Хотя, вероятно, это неэффективный способ построить районное телевидение.

2 лайка

Джо-Петтс

#7

Вау, спасибо! Кажется, это работает! Но только с И:

$sortby=’{“район==центр”:“ASC”,“И:расстояние”:“ASC”}’

РЕДАКТИРОВАТЬ:

О нет, вы не можете этого сделать. Это была просто случайная сортировка
. Завтра я проверю другие предложения.

1 Нравится

nuan88

#8

Я согласен с @lucy в том, что два вызова имеют больше смысла… но как объединить их в один…

И по какой-то причине я вижу, что он работает лучше, если внешние вызовы установлены первыми, FWTW

1 Нравится

Джо-Петтс

#9

ТВ районов всегда имеет только одно название «район» с соответствующим значением «центр», «вандсбек» и так далее.

С районом = ‘центр’»: «ASC» я вообще не получаю никаких значений.

Я уже попробовал эту идею с двумя вызовами, проблема заключается в разбиении на страницы. Разбиение на страницы не может повлиять на два вызова.

@nuan88 что ты имеешь в виду под FWTWW?

1 Нравится

Люси

#10

Попробуйте использовать параметр where:

 &where=`ORDER BY District = 'center' ASC, Distance ASC`
 

или, возможно,

 &where=`ЗАКАЗАТЬ ПО району = 'центр', расстояние ASC`
 

Кроме того, если вы окружите код в своих сообщениях тремя обратными кавычками в отдельных строках выше и ниже вашего кода, код будет отображаться правильно. Нам проще увидеть, что вы на самом деле пишете.

2 лайка

бобрай

#11

Я могу запутаться здесь, но я думаю, что &sortby ищет одно или несколько простых имен полей, и в этом случае сортировать по району=’центру’ не имеет смысла. Вы можете отсортировать по районам, если хотите.

Если вам нужны только записи, где район = «центр», это относится к и где 9Предложение 0016, а не и сортировка по .

2 лайка

люси

#12

Я думаю, что они хотят два правила сортировки, сначала используя район TV для отображения ресурсов со значением центр сначала, затем используя расстояние TV для сортировки всего остального по расстоянию ASC.

2 лайков

бобрай

№13

Верно, но это не сработает, если «центр» не стоит первым или последним в алфавитном порядке, потому что &sortby будет сортировать только в числовом или алфавитном порядке. Одним из решений может быть изменение названия района на aCenter или 1Center. Другой вариант — иметь несколько запросов, по одному для каждого района, и запускать их в нужном вам порядке. Третьим может быть использование фрагмента, чтобы отсортировать все по расстоянию, а затем изменить порядок записей, используя поле района, чтобы получить вещи в нужном вам порядке.

2 лайка

люси

№14

Надеялся, что сработает предложение Ordered By в параметре where…

2 лайка

бобрай

№15

Я не думаю, что Ordered By будет работать в свойстве &where. Я могу ошибаться. Но даже если это так, это работает так же, как и &sortby. Это либо алфавитная, либо числовая сортировка в одном поле.

Думаю, что без пользовательского фрагмента необходимо несколько звонков, по одному на каждый район. Я делаю это в Bob’s Guides для мегаменю — отдельный вызов Wayfinder для каждого основного заголовка. Я не мог заставить его работать по-другому.

2 лайка

Джо-Петтс

№16

@bobray Но проблема с отдельными вызовами в том, что нумерация страниц [[!+page.nav]] работает некорректно. Или я ошибаюсь?

1 Нравится

Люси

# 17

Я думаю, что sortby также сортирует по логическому значению, поэтому вы можете использовать значение флажка при сортировке?

Используя ORDERED BY в запросе mysql, вы можете указать значение поля как один из видов, поэтому это будет работать: ORDER BY район = 'центр', расстояние ASC в mysql. Я надеялся, что это также будет работать в параметре WHERE, но я просто понимаю.

2 лайка

joe-petts

# 18

В любом случае спасибо за поддержку. Тогда я должен думать о другой структуре.

1 Нравится

маркх

# 19

Вы не можете добавить ORDER BY в WHERE ; построитель запросов не позволяет этого.

Думаю, должно работать:

 &sortby=`{"ПОЛЕ(район, \"центр\")":"DESC", "distance":"ASC"}`
 

Синтаксис sortby json требует «имя поля»: «направление» для каждого элемента.

(связанное необработанное объяснение SQL: https://stackoverflow.com/questions/14104055/ordering-by-specific-field-value-first)

2 лайка

Джо-Петтс

#20

Я почти потерял надежду, но Маркх спас меня!

Вот как это работает. Большое спасибо!

2 лайка

следующая страница →

ModX Revo: getResources не сортируется по индексу меню

спросил

Изменено 7 лет, 10 месяцев назад

Просмотрено 6к раз

Я хочу упорядочить ресурсы по индексу меню и иметь следующий код:

 [[!getResources? &parents=`50` &sortdir=`ASC` &sortby=`menuindex` &limit=`100` &includeTVs=`1` &processTVs=`1` &tpl=`temp` ]]
 

Но сортировка по просто не работает.

Кто-нибудь знает, что я делаю неправильно?

Спасибо!

  • modx
  • modx-revolution
  • getresource

Если вы читаете документацию, то видите, что поле sortby должно быть закодировано как строка JSON. http://rtfm.modx.com/display/ADDON/getResources

Если вы хотите упорядочить по индексу меню, это должно работать:

 [[!getResources? &parents=`50` &sortdir=`ASC` &sortby=`{"menuindex":"DESC"}` &limit=`100` &includeTVs=`1` &processTVs=`1` &tpl=`temp` ]]
 

Возможно, попробуйте указать направление сортировки и сортировку в одном и том же вызове. Избавьтесь от $sortdir в вызове сниппета.

 [[!getResources? &parents=`50` &sortby=`{menuindex:ASC}` &limit=`100` &includeTVs=`1` &processTVs=`1` &tpl=`temp` ]]
 

@OptimusCrime,

Формат Json: , необязательный . Как обычно, это может быть строка:

.

Любое поле ресурса (за исключением переменных шаблона) для сортировки.

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *