Программирование на Python и Objective-C в Mac OS

Программирование на Python и Objective-C под Mac OS и для iPhone / iPod Touch

Idx modx: Вывод позиции ресурса в полной новости

Содержание

создание слайдеров при помощи MIGX, BanerY и pdoResources

Автор Алексей На чтение 13 мин Просмотров 2.7к. Опубликовано Обновлено

Продолжаем натяжку нашего шаблона и сегодня мы научимся делать слайдеры (карусели) в MODX. В нашем шаблоне на главной странице сразу 3 слайдера: изображения + текст, отзывы, и вывод статей (новостей) — сделаем их динамичными.

Существует как минимум 3 способа создания слайдеров: при помощи плагинов banery, migx и pdoResources рассмотрим каждый способ.

Логика создания слайдеров или какой компонент выбрать

Для карусели с контентом (к примеру вывод опубликованных новостей, статей с блога, отзывов и т.д.) отлично подойдет pdoResources.

Для статического контента (когда нет созданных страниц с информацией и не собираетесь их создавать) отлично подойдет MIGX.

BanerY — по идее создан для размещения рекламы — но на нем без проблем можно создать статические слайдеры — сделать это проще чем на MIGX, но я бы не стал. В любом случае выбор за вами.

Создание слайдеров при помощи MIGX

Если не читали прошлый урок, изучите его.

Начнем с верхнего слайдера на главной странице, за него отвечает js компонент revolution slider — слайдеры прикольные, красивые, с различными эффектами — но жестко тормозят сайт так как используют пачку js скриптов и css стилей. Для оптимизации скорости я избавлюсь от него и за место него выведу родной bootstrap слайдер (у нас он 3й версии) — он тоже присутствует в шаблоне (пренебрегаем красотой во благо оптимизации).

Удаляем все что связано со slider revolution (если важна скорость  — не важна оставляйте — логика его натяжки похожа).

Находятся в чанке tpl = как минимум +20% к скорости сайта.

Также удаляем весь html код слайдера из чанка tpl.1.

Создание MIGX конфигурации

Идем в управление MIGX и добавляем новый элемент с именем slider, в поле замены пишем «Добавить слайды» и переходим на вкладку «Formtabs».

Далее идем на вкладку «Columns» и точно также заполняем значения:

  • Fieldname – zagolovok, Caption – Заголовок.
  • Fieldname – slide, Caption – Слайд, Input TV Type – image.
  • Fieldname – opisanie, Caption – Описание, Input TV Type – richtext.

Далее идем во вкладку «Columns» и точно также заполняем значения:

  • Header – Заголовок, Field – zagolovok.
  • Header – Слайд, Field – slide, Renderer – this.renderImage.
  • Header – Описание, Field – opisanie.

Примечание: По сути мы переносим элементы с Formtabs. Да так же можете заполнять поля Column width – ширину столбцов.

Сохраняем (выполнить).

Для тех кто вообще не хочет париться, создаем пустую конфигурацию (slider) и экспортируем в нее следующий код:

{
  "formtabs":[
    {
      "MIGX_id":1,
      "caption":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0430\u0439\u0434\u044b",
      "print_before_tabs":"0",
      "fields":[
        {
          "MIGX_id":1,
          "field":"zagolovok",
          "caption":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",
          "description":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441\u043b\u0430\u0439\u0434\u0430",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":1
        },
        {
          "MIGX_id":2,
          "field":"slide",
          "caption":"\u0421\u043b\u0430\u0439\u0434",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"image",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":2
        },
        {
          "MIGX_id":3,
          "field":"opisanie",
          "caption":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435",
          "description":"",
          "description_is_code":"0",
          "inputTV":"",
          "inputTVtype":"richtext",
          "validation":"",
          "configs":"",
          "restrictive_condition":"",
          "display":"",
          "sourceFrom":"config",
          "sources":"",
          "inputOptionValues":"",
          "default":"",
          "useDefaultIfEmpty":"0",
          "pos":3
        }
      ],
      "pos":1
    }
  ],
  "contextmenus":"",
  "actionbuttons":"",
  "columnbuttons":"",
  "filters":"",
  "extended":{
    "migx_add":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0430\u0439\u0434\u044b",
    "disable_add_item":"",
    "add_items_directly":"",
    "formcaption":"",
    "update_win_title":"",
    "win_id":"",
    "maxRecords":"",
    "addNewItemAt":"bottom",
    "media_source_id":"",
    "multiple_formtabs":"",
    "multiple_formtabs_label":"",
    "multiple_formtabs_field":"",
    "multiple_formtabs_optionstext":"",
    "multiple_formtabs_optionsvalue":"",
    "actionbuttonsperrow":4,
    "winbuttonslist":"",
    "extrahandlers":"",
    "filtersperrow":4,
    "packageName":"",
    "classname":"",
    "task":"",
    "getlistsort":"",
    "getlistsortdir":"",
    "sortconfig":"",
    "gridpagesize":"",
    "use_custom_prefix":"0",
    "prefix":"",
    "grid":"",
    "gridload_mode":1,
    "check_resid":1,
    "check_resid_TV":"",
    "join_alias":"",
    "has_jointable":"yes",
    "getlistwhere":"",
    "joins":"",
    "hooksnippets":"",
    "cmpmaincaption":"",
    "cmptabcaption":"",
    "cmptabdescription":"",
    "cmptabcontroller":"",
    "winbuttons":"",
    "onsubmitsuccess":"",
    "submitparams":""
  },
  "columns":[
    {
      "MIGX_id":1,
      "header":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a",
      "dataIndex":"zagolovok",
      "width":100,
      "sortable":"false",
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":""
    },
    {
      "MIGX_id":2,
      "header":"\u0421\u043b\u0430\u0439\u0434",
      "dataIndex":"slide",
      "width":100,
      "sortable":"false",
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"this.renderImage",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":""
    },
    {
      "MIGX_id":3,
      "header":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435",
      "dataIndex":"opisanie",
      "width":200,
      "sortable":"false",
      "show_in_grid":1,
      "customrenderer":"",
      "renderer":"",
      "clickaction":"",
      "selectorconfig":"",
      "renderchunktpl":"",
      "renderoptions":"",
      "editor":""
    }
  ],
  "category":""
} 

Создание TV с конфигурацией MIGX

В дереве MODX на вкладке «Элементы», нажмите + напротив пункта «Дополнительные поля» и вводим следующее:

 

  • «Имя» — slider; «Подпись» — Слайдер.
  • Во вкладке «Параметры ввода» в «Тип ввода» выбираем migx, а в поле «Конфигурации» вводим slider.
  • Во вкладке «Доступно для шаблонов» выбираем те шаблоны, для которых будет доступен ввод в это поле.

Ввод данных

Откроем документ, для которого присвоено поле slider с MIGX с конфигурацией и введём в него какие-нибудь данные.

Вывод bootstrap 3 carusel на страницу

Html разметка у нас стандартная getbootstrap.com/docs/3.3/javascript/#carousel-examples, переделаем ее под MIGX и в необходимое место в шаблоне пропишем следующий код:

<div data-ride="carousel">
  <ol>
    [[getImageList? &tvname=`slider` &tpl=`tplsliderIndicator`]]
  </ol>
  <div role="listbox">
    [[getImageList? &tvname=`slider` &tpl=`tplsliderItem`]]
  </div>
  <a href="#carousel-example-generic" role="button" data-slide="prev">
    <span aria-hidden="true"></span>
    <span>Предыдущий</span>
  </a>
  <a href="#carousel-example-generic" role="button" data-slide="next">
    <span aria-hidden="true"></span>
    <span>Следующий</span>
  </a>
</div>

И создаем чанки:

tplsliderIndicator:

<li data-target="#carousel" data-slide-to="[[+idx:subtract]]" [[+idx:is=`1`:then=`class="active"`]]></li>

и чанк tplsliderItem со следующим содержимым:

<div>
  <img src="[[+slide]]" alt="[[+zagolovok]]">
  <div>
    <h4>[[+zagolovok]]</h4>
    <p>[[+opisanie]]</p>
    <a href="[[~[[+idstranici]]]]">Подробнее</a>
  </div>
</div>

Либо можно сделать вывод migx проще — при помощи fenom.

{set $rows = json_decode($_modx->resource.slider, true)}
<section>
    <div>
        <div data-ride="carousel">
          <ol>
            {foreach $rows as $idx => $row}
                <li data-target="#carousel" data-slide-to="{$idx}"{if $idx == 0}{/if}></li>
            {/foreach}
          </ol>
          <div role="listbox">
            {foreach $rows as $idx => $row} 
                <div>
                  <img src="images/{$row.slide}" alt="{$row.zagolovok}">
                  <div>
                    <h4>{$row.zagolovok}</h4>
                    <p>{$row.opisanie}</p>
                  </div>
                </div>
            {/foreach}
          </div>
          <a href="#carousel-example-generic" role="button" data-slide="prev">
            <span aria-hidden="true"></span>
            <span>Предыдущий</span>
          </a>
          <a href="#carousel-example-generic" role="button" data-slide="next">
            <span aria-hidden="true"></span>
            <span>Следующий</span>
          </a>
        </div>
    </div>
</section>

Вывод bootstrap 4 carusel на страницу

Как и в предыдущем случае, берем стандартную разметку getbootstrap.com/docs/4.1/components/carousel/ и переделываем ее, в итоге получаем

<div data-ride="carousel">
    <ol>
        [[getImageList? &tvname=`slider` &tpl=`tplsliderIndicator`]]
    </ol>
    <div role="listbox">
        [[getImageList? &tvname=`slider` &tpl=`tplsliderItem`]]
    </div>
    <a href="#carouselExampleIndicators" role="button" data-slide="prev">
        <span aria-hidden="true"></span>
        <span>Предыдущий</span>
    </a>
    <a href="#carouselExampleIndicators" role="button" data-slide="next">
        <span aria-hidden="true"></span>
        <span>Следующий</span>
    </a>
</div>

Где чанк tplsliderIndicator имеет следующий код:

<li data-target="#carouselExampleIndicators" data-slide-to="[[+idx:subtract]]" [[+idx:is=`1`:then=`class="active"`]]></li>

и чанк tplsliderItem со следующим кодом:

<div`]]">
    <div>
        <h4>[[+zagolovok]]</h4>
        <p>[[+opisanie]]</p>
        <a href="[[~[[+idstranici]]]]">Подробнее</a>
    </div>
</div>

Создание слайдера при помощи BanerY

И так есть статичный слайдер, пусть это будет обычный bootstrap слайдер, с вот такой разметкой:

<div data-ride="carousel">
  <!-- Indicators -->
  <ol>
    <li data-target="#myCarousel" data-slide-to="0"></li>
    <li data-target="#myCarousel" data-slide-to="1"></li>
    <li data-target="#myCarousel" data-slide-to="2"></li>
  </ol>

  <!-- Wrapper for slides -->
  <div role="listbox">
    <div>
      <img src="img_chania.jpg" alt="Chania">
      <div>
        <h4>Заголовок</h4>
        <p>Описание</p>
      </div>
    </div>

    <div>
      <img src="img_chania2.jpg" alt="Chania">
      <div>
        <h4>Заголовок</h4>
        <p>Описание</p>
      </div>
    </div>

    <div>
      <img src="img_flower.jpg" alt="Flower">
      <div>
        <h4>Заголовок</h4>
        <p>Описание</p>
      </div>
    </div>

  </div>

  <!-- Left and right controls -->
  <a href="#myCarousel" role="button" data-slide="prev">
    <span aria-hidden="true"></span>
    <span>Previous</span>
  </a>
  <a href="#myCarousel" role="button" data-slide="next">
    <span aria-hidden="true"></span>
    <span>Next</span>
  </a>
</div>

Цель создать управляемый слайдер из этой разметки. Приступим.

Начнем пожалуй с создания слайдов в BannerY, для этого заходим в Приложения — BannerY — Позиции и создаем позицию (к примеру home-slider).

 

После этого переходим во вкладку Баннеры и нажимаем на кнопку Новый банер. Откроется окно создания нового банера.

Заполняем все:

  • Название, его можно будет вывести при помощи [[+name]].
  • Выбираем изображение — [[+image]].
  • Указываем URL куда переходить — [[+url]].
  • Заполняем описание — [[+description]] — сюда к стати можно зарядить не только текст, но и обычный html, и это круто.
  • Ну и выбираем позицию (создали ее ранее).

И так создаем нужное количество слайдов.

Теперь нужно вышеприведенную разметку разбить на чанки и подогнать код в чанках под синтаксис BanerY

Создаем чанк для отдельного слайдера с классом active, пусть будет slide и внедряем в него синтаксис:

<div>
 <img src="[[+image]]" alt="[[+name]]">
 <div>
  <h4>[[+name]]</h4>
  <p>[[+description]]</p>
  <p><a href="[[+url]]">Подробнее</a></p>
 </div>
</div>

Теперь копируем тот чанк и задаем ему имя slide2 и удаляем класс active

<div>
 <img src="[[+image]]" alt="[[+name]]">
 <div>
  <h4>[[+name]]</h4>
  <p>[[+description]]</p>
  <p><a href="[[+url]]">Подробнее</a></p>
 </div>
</div>

Ну и остается по сути только вывести слайды.

[[BannerY? &position=`1` &tplFirst=`slide` &tpl=`slide2`]]

В итоге получаем следующее:

<div data-ride="carousel">
  <!-- Indicators -->
  <ol>
    <li data-target="#myCarousel" data-slide-to="0"></li>
    <li data-target="#myCarousel" data-slide-to="1"></li>
    <li data-target="#myCarousel" data-slide-to="2"></li>
  </ol>

  <!-- Wrapper for slides -->
  <div role="listbox">
   [[BannerY? &position=`1` &tplFirst=`slide` &tpl=`slide2`]]
  </div>

  <!-- Left and right controls -->
  <a href="#myCarousel" role="button" data-slide="prev">
    <span aria-hidden="true"></span>
    <span>Previous</span>
  </a>
  <a href="#myCarousel" role="button" data-slide="next">
    <span aria-hidden="true"></span>
    <span>Next</span>
  </a>
</div>

Да к стати его документация находится вот здесь: docs.modx.pro/components/bannery/snippet

Карусель ресурсов при помощи pdoResources

Т.к. мы еще не наполнили сайт и не изучили pdoResources (будет отдельный урок). Просто объясню логику: к примеру у нас есть раздел блога или новостей компании, в нем есть отдельные ресурсы со своими полями, вот эти ресурсы и поля мы выведем (позже дополню статью конкретным кодом).

TVTable / Утилиты / Дополнения MODX / modstore.pro

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

Внимание, этот компонент требует версию MODX не ниже
2.3
!

TVTable — это ТВ-параметр в виде таблицы, в которой можно менять количество не только строк, но и столбцов.

UPD:

Теперь таблица выглядит так:

И поддерживает лексиконы!

Можно использовать чанки

Использование сниппета:

[[TVTable?
  &tv=`id TV`
  &id=`id ресурса`
  &classname=`Классы таблицы`
]]

Так же, можно появились 2 параметра — getX и getY, которые позволяют получить значение из ячейки таблицы

Важные изменения
  • Редизайн компонента
  • Из компонента выпилен jQuery
  • Теперь нет привязки к количеству колонок и строк таблицы, т.е. теперь можно создать даже одну ячейку
  • Есть обратная совместимость
  • Появилась возможность удалять определенные столбцы
  • Появилось несколько параметров <cut/>
    • Максимальное количество столбцов

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

    • Максимальное количество строк

      Примечание: Существующие значения не будут изменены и в том случае, если количество строк в существующих данных будет больше указанного лимита, то у пользователей будет возможность удалять строки до указанного лимита.

    • Количество столбцов

      Примечание: Имеет приоритет над свойством «Максимальное количество столбцов». Существующие значения не будут изменены и в том случае, если количество столбцов в существующих данных будет больше указанного лимита, то у пользователей будет возможность удалять столбцы до указанного лимита, а если количество столбцов будет меньше указанного лимита, то при следующем редактировании будет добавлено недостающее количество столбцов.

    • Количество строк

      Примечание: Имеет приоритет над свойством «Максимальное количество строк». Существующие значения не будут изменены и в том случае, если количество строк в существующих данных будет больше указанного лимита, то у пользователей будет возможность удалять строки до указанного лимита, а если количество строк будет меньше указанного лимита, то при следующем редактировании будет добавлено недостающее количество строк.

    • Заголовки столбцов
    • Ширина полей в пикселях

Сниппет
  • В параметр tv теперь можно указывать не только ID, но и название TV
  • Теперь выводится thead, параметр head (По умолчанию: включен)
  • Добавлены свойства bodyClass и headClass для добавления CSS-классов в tbody и thead соответственно
  • Параметр classname переименован в tableClass (но classname всё равно будет работать)
  • Изменено поведение сниппета при указанных getX и getY
    • Если указать только getX, то на выходе получим таблицу с указанной строкой
    • Если указать только getY, то на выходе получим таблицу с указанным столбцом
    • Если указать и getX и getY, то на выходе получим содержимое указанной ячейки по координатам
    • Также в них кроме индекса можно указывать first и last

Несколько примеров для наглядности:
&getX=`last` // Вывод последней строки
====================
&getY=`last` // Вывод последнего столбца
====================
&getY=`first` // Или 0, вывести первый столбец
====================
&getX=`first` // Или 0, вывести первую строку
====================
&getX=`last`
&getY=`last` // Вывести содержимое ячейки которая находится по координатам: последняя строка, последний столбец
====================
&getX=`1`
&getY=`last` // Вывести содержимое ячейки которая находится по координатам: вторая строка, последний столбец
====================
&getX=`last`
&getY=`2` // Вывести содержимое ячейки которая находится по координатам: последняя строка, второй столбец

Важно! При обновлении будьте внимательны, из чанка теперь убран <tbody>

Баги и прочее
  • Исправлен баг когда в БД записовался пустой массив в случае если таблица была пустая, теперь если все поля таблицы пустые, то в БД ничего не записывается
  • Исправлен баг с кнопкой удаления столбца, теперь она будет появлятся и исчезать
  • Добавлена кнопка для очистки таблицы, системная настройка tvtable_clear_button (По умочанию: выключена)

Видео с демонстрацией кейсов

Автор основной версии — Яна Вострякова.

Автор последних правок — Баха Волков.

Создание сайта на MODX Revolution

Что такое getResources?

getResources — это многоцелевой  сниппет MODX Revolution, который может извлекать содержимое полей из других ресурсов и выводить его в любом удобном  виде. Это не замена Ditto, а скорее альтернатива, сниппет, который может выполнять функции более специализированных компонент, таких как Ditto, Wayfinder, Breadcrumbs; фактически любых компонент, которые выполняют вывод данных из списка ресурсов.

Требования

  • MODX Revolution 2.0.0 или выше
  • PHP5 или выше

Установка getResources

Установка  производится из панели управления MODX Revolution стандартным способом через Система->Управление пакетами->Загрузить дополнения.

Использование

Снипет getResourses может быть вызван с использованием тега:

[[!getResources]]

вызов без &tpl свойста выведет просто список всех ресурсов и их полей.

Доступные свойства:

Параметры шаблонизации

НазваниеОписаниеЗначение по умолчаниюДобавлено в версии
tplНазвание чанка, отвечающего за вывод ресурсов. Если не указано, выводятся список всех ресурсов текущего уровня.  
tplOddНазвание чанка выступающего в качестве шаблона с нечётным значением idx. (смотрите свойство idx).  
tplFirstНазнание чанка, который будет шаблоном вывода первого ресурса  
tplLastНазнание чанка, который будет шаблоном вывода последнего ресурса  
tpl_NНазнание чанка, который будет шаблоном вывода n-ного ресурса, например, &tpl_4=`tpl4th`  
tpl_nNНазнание чанка, который будет шаблоном вывода каждого n-ного ресурса, например, &tpl_n4=`tpl4th` будет применяться к любому элементу, у которого id делится на 4. 1.4.1-pl
tplPathДополнительный каталог для поиска файлов на основе чанков при использовании @FILEassets_path + «elements/chunks/» 
tplWrapperНазвание чанка, выступающего в виде обёртки шаблона для вывода [Примечание: не работает с toSeparatePlaceholders]. Плейсхолдер, где элементы вставлены — [[+output]]. 1.6.0-pl
wrapIfEmptyЕсли истина, выведёт обёртку, указанную в &tplWrapper даже если вывводимые данные отсутствуют.false1.6.0-pl
outputSeparatorДополнительная строка для разделения каждого tpl .«\n» 
toPlaceholderЕсли установлено, присвоит результат данному плейсхолдеру вместо его непосредственного вывода.  
toSeparatePlaceholdersЕсли установлено, будет назначать каждый результат отдельному плейсхолдеру, названному по имени этого параметра с суффиксом в виде последовательных чисел, начиная с 0. 1.3.0

Префиксы шаблонов @FILE и @INLINE

@FILE — этот префикс позволяет вам указать файл вместо чанка в базе данных в качестве шаблона. Путь и имя файла, который вы указываете, будут заданы по умолчанию, если вы не задаете свойство tplPath, а поиск шаблона @FILE будет выполняться относительно вашей конфигурации assets_path + «elements/chunks/.

@INLINE — этот префикс позволяет вам указать разметку для использования с вашим шаблоном непосредственно в значении параметра. Рекомендуется использовать этот префикс шаблона только при указании свойств tpl* в наборе свойств [Property Set], в противном случае любые плейсхолдеры в строковой разметке могут быть вычислены перед передачей содержимого getResourses, поскольку кэшируемые вложенные теги в MODX Revolution вычисляются перед началом обработки содержащего их тега.  @INLINE должен сопровождаться пробелом, например : «@INLINE <li>[[+pagetitle]]</li>».

Пример использования некэшируемой ссылки с префиксом шаблона @INLINE :

[[!getResources? &tpl=`@INLINE <a href="[[!~[[+id]]]]" title="[[+pagetitle]]">[[+pagetitle]] ([[+id]]) </a>`]]

Параметры выборки :

НазваниеОписаниеЗначение по умолчаниюДобавлено в версии
parentsСписок ифентификаторов, разделённых запятыми, выступающих в качестве родителей. Используйте -1 для игнорирования родителей при указании ресурсов. Если этого параметра не указать, getResources принимает &parents как текущий ресурс и выбирает дочерние ресурсы от него (а также ресурсы, указанные в параметрах &resourses). id текущего ресурса 
resourcesРазделённый запятыми список идентификаторов, включаемых в результат. Добавте перед идентификатором «- «, чтобы исключить его из результата.  
depthЦелочисленное значение, указывающее глубину поиска документов от каждого родителя.10 
tvFiltersМожет быть использован для фильтрации ресурсов по определённым TV параметрам. Они вводятся как [(имя tv-параметра)(оператор)](значение). Вы можете использовать два разделителя для объединения условий фильтра.  

Вы можете использовать фильтры «ИЛИ» (OR), в виде двойной вертикальной черты ( ||). Фильтр «ИЛИ» (OR) извлекает ресурсы, которые имеют один из  перечисленных tv-параметров.

mytv==одно значение||mytv==другое значениеe

Вы можете также использовать фильтр «И» (AND)  указывая запятую (,). Этот фильтр проверяет соблюдение всех условий.

mytv==одно значение,othertv==другое значениеe

Для расширения возможностей фильтрации вы можете группировать эти значения. Важно знать, что вначале обрабатываются условия «ИЛИ» (||), а затем «И». Давайте рассмотрим это на примере:

mytv==foo||mytv==bar,bartv==3||bartv==1

Это будет фильтрация ресурсов, удовлетворяющим одному из следующих условий:

mytv равно foo, или:
mytv равно bar И bartv равно 3, или:
bartv равно 1

Выше приведены примеры поиска точных значений. Если хотите, вы так же можете использовать знак процента(%) в качестве маски. Например:

mytv==%a%

Соответствует любым ресурсам, имеющим «а» в значении mytv.

mytv==a% 

Соответствует любым ресурсам, имеющим значение  mytv, начинающееся с «а».

mytv==%a

Соответствует любым ресурсам, имеющим значение  mytv, заканчивающееся на «а».

В этих случаях вы также можете использовать разделители «ИЛИ» ( ||) и «И» (,).

Важно знать, что эта функция ищет необработанное значение tv-параметра для определенного ресурса. Это означает, что данное значение точно установлено для ресурса и, что оно не будет обработано в соответствии с типом tv-параметра (или же является типом по умолчанию в релизах до 1.4.2-pl; в этом релизе добавляется поддержка фильтрации, включая значения по  умолчанию). Поэтому, если у вас tv-параметр «авто-метка», это означает, что необработанное значение представляе собой список, ограниченный запятыми, и он не разделен на теги, как вы это видите в панели управления.

Начиная с версии 1.4.2-pl, возможно использование новых операторов фильтра. Имеется целый ряд новых операторов сравнения, которые можно использовать при создании условий фильтрования. Кроме того, при использовании многих из этих операторов перед сравнением tv-параметры приводятся к числовым величинам. Вот перечень допустимых операторов :

Оператор фильтраSQL операторЧисловое преобразование
<=> (безопасное сравнение с NULL) <=> Да
 ==== Да
 !== != Да
 <> <> Да
 == LIKE Да
!= NOT LIKE Да
 << < Да
 <=  <=Да 
 =<  =< Да
 >> > Да
 >=>=  Да
 => => Да

 

sortby Позволяет выполнять сортировку по любому полю ресурса (исключая tv-параметры). Некоторыми обычными полями, по которым возможна сортировка, являются : publishedon, munuindex, pagetitle и другие. Указывайте только имя поля, не используя синтаксис тега. Отметим, что при использовании для сортировки полей, подобных template, publishedby, они будут сортироваться по необработанным значениям, а не по их именам.

Вы также можете использовать случайную сортировку, указав параметр RAND():

&sortby=`RAND()`

 Начиная с версии 1.3.0 для сортировки по нескольким полям может использоваться массив JSON, например:

&sortby=`{"publishedon":"ASC","createdon":"DESC"}`

Если вы хотите выполнить сортировку в определенном особом порядке, вы можете сделать это, указав список идентификаторов (ID) ресурсов, подобно следующему :

&sortby=`FIELD(modResource.id, 4,7,2,5,1 )`

Это же возможно, если вы поместите идентификаторы в tv-параметр:

&sortby=`FIELD(modResource.id,)`

 

publishedon Модифицировано в версии 1.3.0.
 sortbyAlias Выстраивает псевдонимы для поля sortby.
 sortbyEscaped Исключает имя поля, указанное в sortby.
 sortdirПорядок, по которому производится сортировка.
(По умолчанию: DESC)
 sortbyTV tv-параметр, по которому производится сортировка.
sortdirTVПорядок, по которому производится сортировка при использовании sortbyTV.
 sortbyTVTypeУказывает тип данных для sortbyTV. Возможными значениями являются : string, integer, decimal, datetime.
(По умолчанию: string)
 limitОграничивает количество выдаваемых ресурсов. Используйте `0` для выдачи результатов без ограничений.
(По умолчанию: 5)
 offsetСдвиг выдаваемых по некоторому критерию ресурсов.
(По умолчанию: 0)
 where Выражение для критерия типа JSON для построения дополнительных условий. Смотрите примеры ниже, а также
 contextВ каком контексте должен выполняться поиск.
(По умолчанию в текущем)

Прочие параметры:

НазваниеОписаниеЗначение по умолчаниюДобавлено в версии
showUnpublishedЕсли истина, будут отображаться ресурсы, снятые с публикации.0 
showDeletedЕсли истина, будут отображаться ресурсы, помеченные для удаления.0 
showHiddenЕсли истина, будут отображаться ресурсы, независимо от того, отображаются ли они в  меню.0 
hideContainersЕсли установленно,  не будут отображатся любые ресурсы, отмеченные как контейнер (is_folder).0 
includeContentУказывает должно ли выдаваться в результатах содержимое каждого ресурса.0 
includeTVsУказывает должны ли значения tv-параметров включаться в параметры, доступные каждому шаблону ресурса.0 
includeTVListДополнительный, разделяемый запятыми список имен tv-параметров для включения в явном виде, если includeTVs установлен в 1. 1.4.0
prepareTVsПодготавливает значения tv-параметров, зависяшие от среды.11.5.0
prepareTVListОрганичивает tv-параметры теми, которые указаны по имени в разделенном запятыми списке. 1.5.0
processTVsУказывает должны ли быть tv-параметры обработаны так, как они были бы представлены в ресурсе. tv-параметрыа должны быть включены для обработки (см. includeTVs/includeTVList).0 
processTVListДополнительный разделенный запятыми список имен tv- параметров, обрабатываемых явно. tv-параметры, указанные здесь, должны быть включены при помощи includeTVs/includeTVList 1.4.0
tvPrefixПрефикс для свойств tv-параметров.tv. 
idxВы можите определить начальный idx ресурсов, который представляет собой свойство, увеличивающееся при обработке каждого ресурса.1 
firstОпределяет idx, представляющий собой первый ресурс.1 
lastОпределяет idx, который представляет собой последний ресурс. По умолчанию это значение равноколичеству суммируемых ресурсов + first — 1  
totalVarЗадает ключ плейсхолдера, устанавливаемого getResources для показа общего количества ресурсов, которые будут выбраны не учитывая значения limit.total 
debugЕсли истина, отправит SQL запрос в лог-файл MODxfalse 

Имеющиеся плейсхолдеры

Перечень плейсхолдеров, доступных для getResourses при форматировании чанков, зависит от ресурсов, с которыми вы работаете.

Смотрите раздел на странице «Обычно используемые теги шаблонов» («Commonly Used Template Tags») — здесь перечислены параметры, доступные для всех ресурсов.

Если ваш ресурс имеет tv-параметры, они будут иметь соответствующие плейсхолдеры (помните, что плейсхолдеры будут использовать префикс, задаваемый параметром &tvPrefix).

Кроме того имеется следующий плейсхолдер :

[[+idx]]Увеличивается с каждой итерацией, начиная с 1 (или со значения, заданного параметром &tvPrefix)

Примеры

За более детальными примерами обращайтесь к подразделу документации .

Пример вывода списка дочерних ресурсов текущего ресурса с использованием чанка ‘myRowTpl’ :

[[!getResources? &parents=`71` &tpl=`myRowTpl`]]

Вывод списка всех дочерних ресурсов, начиная с 5, за исключением 10, используя чанк ‘myRowTpl’:

[[!getResources? &parents=`5` &resources=`-10` &tpl=`myRowTpl`]]

Вывод указанных ресурсов с использованием чанка ‘myRowTpl’

[[!getResources? &parents=`-1` &resources=`10,11,12` &tpl=`myRowTpl`]]

Выводит 5 последних опубликованных ресурсов с помощью чанка ‘blogPost’

[[!getResources? &parents=`5` &limit=`5` &tpl=`blogPost` &includeContent=`1`]]

Выводит список дочерних ресурсов текущего ресурса, где id шаблона ресурсов 1 или 2

[[!getResources? &parents=`71` &where=`{"template:=":1, "OR:template:=":2}` &tpl=`myRowTpl`]]

Выводит список дочерних элементов текущего ресурса с id шаблонов 1, 2 или 3 (вы пожете использовать один ключ несколько раз)

[[!getResources? &parents=`71` &where=`{"template:IN":[1,2,3]}` &tpl=`myRowTpl`]]

Сообщание, выдаваемое при отсутствии результата:

[[!getResources:default=`No results found`? &parents=`71` &tpl=`myRowTpl`]]

Отображение TV параметров в getResources

Чтобы уменьшить время поиска, getResources не получает TV параментр по умолчанию. Если вы хотите отобразить TV, вы должны включать в вызов следующие параметры:

&includeTVs=`1` &processTVs=`1`

Вам необходим префикс перед каждым TV параметром.

&tvPrefix=``

В Tpl чанке, который вы использовать для отображения getResources используйте placeholder в месте, где должен отображаться TV параметр:

[[+tv.my_tv]]

Использование getPage для нумерации страниц

В сочетании с GetPage, GetResources позволяет делать мощное и гибкое разбиение на страницы вашего сайта.

Пример:

[[!getPage?
&elementClass=`modSnippet`
&element=`getResources`
&parents=`17`
&depth=`2`
&limit=`10`
&pageVarKey=`page`
&includeTVs=`1`
&includeContent=`1`
&tpl=`blogListPost`
]]
<div>
<ul>
[[!+page.nav]]
</ul>
</div>

и чанк blogListPost:

<div class="blogPost">

<div class="date"></div>

<h3><a href="[[~[[+id]]]]" title="">[[+pagetitle]]</a></h3>

<p class="author"><strong>Author:</strong> <span class="author">

[[+createdby:userinfo=`username`]]</span></p>

<p class="summary">[[+introtext]]</p>

<p class="readmore"><a href="[[~[[+id]]]]"><span>Read more</span></a></p>

<div class="clear"></div>

</div>

<hr/>

Делаю калькулятор расчёта стоимости работ | Блог

Делаю калькулятор расчёта стоимости работ | Блог | Создание и обслуживание сайтов на Modx

Уведомление об использовании cookie, IP-адреса и местоположения

Пример уведомление об использовании информации

Читать

Выводим вложенный MIGX в MIGX через Fenom

Инструкция как вывести поля MIGX во вложенной таблице MIGX через Fenom

Читать

Выгрузка для каталога Facebook

Подготавливаем файл со списком товаров для каталога Facebook

Читать

SEO требования к сайтам (первичное SEO)

Список правил по SEO (первичное SEO)

Читать

Автозакрытие fancybox через время

Улучшаем форму обратной связи

Читать

08 марта 2016, 22:33


Средняя оценка:

Всего голосов: 6

Для удобства клиентов решил сделать калькулятор услуг. Для начала определился с требованиями:

  1. Необходимо реализовать визуальное разделение категорий услуг(Расширение функционала/Доработка/Разработка сайта) с возможностью подсчёта общей суммы
  2. Услуги и цены должны легко добавляться/удаляться без корректировки скрипта калькулятора
  3. После выбора необходимых услуг сделать возможность отправки заказа с их списком и полной стоимостью

Для реализации первого пункта буду использовать табы на Jquery, второго — таблицы MIGX ну а третьего — Formit+AjaxForm.

Категории услуг будут ресурсами, а сами услуги будут хранится внутри ресурса в таблице MIGX.

1) Создал TV таблицу MIGX с разметкой для услуг и цен.

В новом TV выбрал тип MIGX, и задал такие параметры:

2) В обычную разметку табов вставил вызов pdoResources и pdoMenu

В итоге получил что если добавить ресурс родителю ID=2, то автоматически добавляется новый таб

3) В чанк tab-usluga.tpl вставил вызовы getImageList которые будут выгружать необходимые поля

4) Чанки calc-price.tpl и calc-price-check.tpl обеспечивают логику расчёта калькулятора

5) На основе чанка price.tpl строится таблица с чекбоксами

6) Обернул всё вышеописанное в Form, добавил необходимые поля и еще один расчёт — для суммирования сумм из категорий

7) Сделал вызов на основе AjaxForm

По написанному получилось конечно всё чётко и быстро, а на самом деле пришлось долго провозиться чтобы всё это связать воедино. На оригинальность не претендую, но буду рад если кому нибудь пригодится мой опыт.

LimitgetResourcespdoResources
100.1592 s0.1304 s
500.3502 s0.1495 s
1000.5500 s0.1762 s
5002.1891 s0.3045 s

LimitgetResourcespdoResources
100.1721 s0.1384 s
500.3994 s0.1687 s
1000.6915 s0.2047 s
5002.7538 s0.4851 s

LimitgetResourcespdoResources
100.2029 s0.1383 s
500.5014 s0.1747 s
1000.8860 s0.2230 s
5004.0989 s0.5248 s

Настройка BBCode
Установить BBCode modxtalks.BBCode

Есть

Установить в редакторе BBCode в комментариях? Да / Нет
Ссылки modxtalks.detectUrls

Обнаруживать ссылки на странице и заключать их в теги ? Да / Нет
Редактор тегов modxtalks.editOptionsControls исправлено, изображение, ссылка, предупреждение, заголовок, курсив, полужирный шрифт, видео, цитата Выберите управляющие теги для редактора.Доступно — фиксированное, изображение, ссылка, предупреждение, заголовок, курсив, полужирный шрифт, видео, цитата
Улыбки modxtalks.smileys

Нет

Включить смайлы в комментариях? Да / Нет
Общие настройки
Реверс modxtalks.revers

Нет

Отображение комментариев вверху новых, если выбрать НЕТ, новые комментарии будут ниже.
Тайм-аут между отправкой комментариев modxtalks.add_timeout

60

Время в секундах между отправкой комментариев
Обновление комментариев AJAX modxtalks.ajax

Да

Разрешить обновление комментариев с сервера в реальном времени? Да / Нет
Длина комментария modxtalks.комментарийДлина 2000 Максимальная длина комментариев (в символах).
Комментариев на страницу modxtalks.commentsPerPage 20 Максимальное количество комментариев на странице для разбивки на страницы.
Формат даты modxtalks.dateFormat j-m-Y, G: i Формат даты, отображаемый в комментарии.
Аватар по умолчанию modxtalks.default Аватар Полная ссылка на аватар, который появляется, когда Gravatar отключен или не существует.
Время редактирования modxtalks.edit_time 180 Время, по истечении которого пользователь не может редактировать свой комментарий.
Используйте gravatar modxtalks.граватар

Есть

Включить изображение граватара в сообщениях пользователя. Да / Нет
Gravatar размер modxtalks.gravatar Размер 64 Размер Граватара в комментарии.
Включить jQuery modxtalks.jquery

Есть

Если вы используете jQuery Lib на своей странице, выберите НЕТ, но убедитесь, что ваша версия jQuery — 1.7+
Модераторы группы modxtalks.moderator Администратор Группы модераторов через запятую.
Только авторизованные пользователи modxtalks.onlyAuthUsers

Комментарии могут оставлять только авторизованные пользователи.
Комментарии предварительная модерация modxtalks.preModarateComments

Есть

Если ДА, то комментарии модерируются. После одобрения комментарий появится на сайте.
Смещение скруббера modxtalks.scrubberOffsetTop 0 Смещение скруббера от верхнего положения при прокрутке. Это необходимо, когда у вас есть элементы с фиксированной позицией, например. меню.
Положение скруббера modxtalks.верхний скруббер

Отображение ползунка вверху комментария. По умолчанию НЕТ — правая колонка.
Проголосуйте за комментарий modxtalks. голосование

Выберите Да, если вы хотите проголосовать за комментарии.
Выделение кода
Выделение кода modxtalks.выделить

Есть

Включить выделение кода в комментариях? Да / Нет
Выделить тему modxtalks.highlighttheme GitHub Тема Hightlight для кода. Подробнее здесь.
Доступные темы: Default, Dark, FAR, IDEA, Sunburst, Zenburn, Visual Studio, Ascetic, Magula, GitHub, Google Code, Brown Paper, School Book, IR Black, Solarized-Dark, Solarized-Light, Arta, Monokai, XCode. , Pojoaque, Радуга, Завтра, Завтра ночь, Завтра ночь Яркая, Завтра ночь Голубая, Завтра ночь 80-х годов
Уведомления по электронной почте
modxtalks.электронные письмаОт modxtalks.emails От Электронная почта отправителя сообщения.
modxtalks.emailsReplyTo modxtalks.emailsReplyTo Электронная почта для ответа