Содержание
создание слайдеров при помощи 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 | Дополнительный каталог для поиска файлов на основе чанков при использовании @FILE | assets_path + «elements/chunks/» | |
tplWrapper | Название чанка, выступающего в виде обёртки шаблона для вывода [Примечание: не работает с toSeparatePlaceholders]. Плейсхолдер, где элементы вставлены — [[+output]]. | 1.6.0-pl | |
wrapIfEmpty | Если истина, выведёт обёртку, указанную в &tplWrapper даже если вывводимые данные отсутствуют. | false | 1.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-параметров, зависяшие от среды. | 1 | 1.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 запрос в лог-файл MODx | false |
Имеющиеся плейсхолдеры
Перечень плейсхолдеров, доступных для 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
Для удобства клиентов решил сделать калькулятор услуг. Для начала определился с требованиями:
- Необходимо реализовать визуальное разделение категорий услуг(Расширение функционала/Доработка/Разработка сайта) с возможностью подсчёта общей суммы
- Услуги и цены должны легко добавляться/удаляться без корректировки скрипта калькулятора
- После выбора необходимых услуг сделать возможность отправки заказа с их списком и полной стоимостью
Для реализации первого пункта буду использовать табы на 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
По написанному получилось конечно всё чётко и быстро, а на самом деле пришлось долго провозиться чтобы всё это связать воедино. На оригинальность не претендую, но буду рад если кому нибудь пригодится мой опыт.
Derzaiii
08/03/2016
9521
Оцени и поделись 😉
Посещая этот сайт, вы разрешаете нам для его полноценного функционирования собирать ваши метаданные (cookie, IP-адрес и местоположение)
×
9521
Как перенести modx на другой хостинг (Коротко)
Всем привет друзья!
Данная статья — краткий, пошаговый мануал по переносу сайта MODX Revolution.
Используя приведенную ниже последовательность действий вы можете перенести сайт на modx с сервера на сервер, или с локальной машины на хостинг
1. Подготавливаем сайт
Чистим кеш из админки
Управление -> Очистить кеш
Завершаем все сеансы
Управление -> Завершить все сеансы
Полностью удаляем кеш
Удаляем все файлы и директории в папке
core/cache
2. Переносим данные сайта на новый сервер
Импортируем базу данных
Для этого используем стандартные экспорт/импорт phpMyAdmin
Переносим файлы
Просто копируем файлы сайта на новый сервер
3. Правим конфиги
Настраиваем пути к modx
config.core.php manager/config.core.php core/config/config.inc.php connectors/config.core.php
В этих файлах необходимо изменить путь до директорий системы.
К примеру я изменил путь
D:/programs/OSPanel/domains/modx-market2/
на
/home/x/x9999999/x9999999.beget.tech/public_html/
Соответственно:
D:/programs/OSPanel/domains/modx-market2/core/
поменялся на
/home/x/x9999999/x9999999.beget.tech/public_html/core/
Чтобы узнать путь который необходимо прописать, используйте phpinfo() в директории сайта. Значение нужно взять у переменной DOCUMENT_ROOT
Конфигурируем базу данных
В файле core/config/config.inc.php нужно указать новые данные для подключения к базе данных
Изменять нужно только следующие строки
$database_user = ‘{Пользователь}’; $database_password = ‘{Пароль}’; $dbase = ‘{Название базы данных}’; $database_dsn = ‘mysql:host=localhost;dbname={Название базы данных};charset=utf8’;
4. Выставляем права на папки
Для директории системы нужно указать следующие разрешения
777 assets/cache/ 666 assets/cache/siteCache.idx.php 666 assets/cache/sitePublishing.idx.php 777 assets/images/ 777 assets/export/ 444 manager/includes/config.inc.php
Ну вот друзья, краткий мануал готов. Практикой проверено что переносить необходимо в четкой последовательности.
Увидимся в новых статьях!
Перенос сайта на новый хостинг (на примере CMS Modx) | PHP-программист
Перенос сайта выполняется в три этапа:
- переносим файлы
- переносим таблицы базы данных
- дополнительные настройки в административной панели
Перенос файлов
Переносим все файлы сайта со старого хостинга, на новый. После этого:
1) изменяем в файле конфигураций (manager/includes/config.inc.php) доступы к БД (жирным выделено что нужно изменить):
$database_server = ‘localhost‘; // (возможно не придётся менять)
$database_user = ‘root‘;
$database_password = ‘111111‘;
$dbase = ‘`modx`’;
2) устанавливаем права на следующие папки и файлы:
assets/cache/ — 777
assets/cache/siteCache.idx.php — 666
assets/cache/sitePublishing.idx.php — 666
assets/images/ — 777
assets/export/ — 777
manager/includes/config.inc.php — 444
3) если путь от домена до корня сайта изменился, корректируем файл .htaccess в корне сайта:
RewriteEngine On
RewriteBase /modx/
Если Вы используете дополнительные редиректы и изменился домен сайта, также следует исправить это в .htaccess.
Перенос таблиц базы данных
Делаем экспорт таблиц нашего сайта. Есть несколько вариантов, например:
- на старом хостинге заходим в PhpMyAdmin и делаем экспорт таблиц нашего сайта
- или заходим в административную панель ModX. Переходим во вкладку:
Инструментарий—>Резервное копирование.
Перед нами раскрывается список таблиц БД. Выделяем таблицы нашего сайта, или,
если в БД лежит только один сайт, то все таблицы (для этого ставим
галочку возле заголовка столбца «Имя таблицы»). Чуть выше таблицы есть ссылка «Нажмите для скачивания резервной копии базы данных». Cохраняем дамп.
На новом хостинге делаем импорт таблиц сайта.
Дополнительные настройки в административной панели
В административной панели нужно изменить физический путь к корню сайта. Если Вы его знаете — отлично. Если нет, то можно быстро узнать, воспользовавшись PHPinfo.
Переходим во вкладку:
Отчёты->Системная информация-> phpInfo() Просмотр
Из таблицы «Apache Environment» берём значение переменной DOCUMENT_ROOT. Если сайт расположен не в корневой папке, то присоединяем путь от домена до корня сайта. Например, из поля DOCUMENT_ROOT вы получили значение:
/home/users/user11/domains/mysite.ru/html
Но для того, чтобы попасть на Ваш сайт, нужно ввести в браузер не такой URL: http://mysite.ru, а такой: http://mysite.ru/modx/.
Соответственно и к физическому адресу Вашего сайта следует дописать папку /modx/. То есть полный адрес будет такой:
/home/users/user11/domains/mysite.ru/html/modx/
Если Ваш сайт лежит в корне сайт, то просто допишите слеш к полученному Вами пути из phpInfo(). Это и есть наш физический адрес сайта:
/home/users/user11/domains/mysite.ru/html/
Переходим в раздел Инструментарий->Конфигурации.
Во вкладке «Другое» в поле «Путь для файлового менеджера» прописываем физический путь к сайту.
Похожую процедуру выполняем во вкладке «Настройки HTML-редактора и интерфейса».
В поле «Путь к файлам» прописываем «физический путь»+«assets/». Например:
/home/users/user11/domains/mysite.ru/html/assets/
И напоследок, не забываем сделать очистку кеша сайта: Сайт->Обновить сайт.
P.S. Если после всего этого изложения не получается перенести сайт на новый хостинг, напишите мне и я с удовольствием Вам помогу.
Автор: Татьяна
Copyright © 2008 scabbiaza.net
PHP-программист: программирование сайтов, интернет-магазинов, порталов
[pdoTools] Версия 1.4.0, сниппет pdoResources / Расширения MODX / Блоги / bezumkin.ru
Все пользователи MODX Revolution знают основной инструмент для работы с документами сайта — getResources. Возможности его почти безграничны, параметров и настроек хватает для любых ситуаций.
Однако, есть один неприятный момент: иногда скорость работы этого сниппета бывает недостаточной. Его нельзя назвать прям тормозом, но хотелось бы побыстрее.
Учитывая, что мы уже довольно давно используем pdoTools для разработки быстрых сниппетов в своих компонентах, написание аналога getResources было только вопросом времени.
И вот, наконец-то, новый сниппет pdoResources включен в пакет по умолчанию и является самым главным изменением в новой версии pdoTools. Поэтому, с него и начнем.
Сниппет pdoResources
Это сниппет, написанный на pdoTools и входящий в состав пакета. Он предназначен для получения и вывода документов сайта и, насколько это возможно, повторяет функционал getResources.
Основное отличие — работа с ТВ параметрами:
- Нет &processTVs=«
- Параметр &includeTVs=« принимает имена ТВ параметров. То есть, нужно указывать, какие ТВ выбирать. Включить сразу все подряд ТВ нельзя.
- Все возможные дополнительные условия указываются в &where=«. Нет отдельной фильтрации по ТВ, но это можно указать вручную.
- Нет условий при работе с чанками (conditional chunks). Если будет нужно — добавим.
Особая работа с ТВ обусловливается тем, что все ТВ выбираются в том же запросе, что и ресурсы, то есть, используется &leftJoin=«. Все параметры с описаниями нужно смотреть вот тут.
Ну а теперь — про скорость!
Выборка из БД
Простая выборка из БД, без оформления, без ТВ параметров, чистый тест скорости получения данных.
Вызовы сниппетов:
[[!getResources? &parents=`2` &limit=`n` ]] [[!pdoResources? &parents=`2` &limit=`n` ]]
Результаты:
Limit | getResources | pdoResources |
---|---|---|
10 | 0.1592 s | 0.1304 s |
50 | 0.3502 s | 0.1495 s |
100 | 0.5500 s | 0.1762 s |
500 | 2.1891 s | 0.3045 s |
Благодаря работе через PDO и выборку всего необходимого в один запрос, pdoResources уверенно лидирует, особенно при больших объёмах.
Выборка и оформление
Та же выборка, но с указанием чанка, в котором всего два плейсхолдера:
<p>[[+idx]] - [[+pagetitle]]</p>
Вызовы сниппетов:
[[!getResources? &parents=`2` &tpl=`tpl.Test.row` &limit=`n` ]] [[!pdoResources? &parents=`2` &tpl=`tpl.Test.row` &limit=`n` ]]
Результаты:
Limit | getResources | pdoResources |
---|---|---|
10 | 0.1721 s | 0.1384 s |
50 | 0.3994 s | 0.1687 s |
100 | 0.6915 s | 0.2047 s |
500 | 2.7538 s | 0.4851 s |
Тут ситуация никак не меняется.
Выборка и оформление + 2 ТВ параметра
Добавляем 2 ТВ параметра в наш чанк и выборку:
<p>[[+idx]] - [[+pagetitle]]. [[+tv.meta_description]] [[+tv.meta_keywords]]</p>
Вызовы сниппетов:
[[!getResources? &parents=`2` &tpl=`tpl.Test.row` &includeTVs=`1` &includeTVList=`meta_description,meta_keywords` &limit=`n` ]] [[!pdoResources? &parents=`2` &tpl=`tpl.Test.row` &includeTVs=`meta_description,meta_keywords` &limit=`n` ]]
Результаты:
Limit | getResources | pdoResources |
---|---|---|
10 | 0.2029 s | 0.1383 s |
50 | 0.5014 s | 0.1747 s |
100 | 0.8860 s | 0.2230 s |
500 | 4.0989 s | 0.5248 s |
А вот тут pdoResources вообще выбегает за пределы стадиона, благодаря присоединению ТВ к основному запросу, а не отдельной выборке в цикле через xPDO.
Выводы
Дальнейшие тесты проводить не вижу смысла, ибо в зависимости от чанков и условий выборки разрыв будет только увеличиваться.
Это достигается благодаря двум основным составляющим:
- Выборка всего нужно за один запрос, через PDO.
- Предварительная обработка чанков, когда значения из ресурса заменяются в чанке без парсера MODX.
Есть конечно и еще много разных оптимизаций\улучшений, но эти 2 — принципиальные. Именно они дают такой прирост производительности.
Обращаю ваше внимание, что это работа без fastMode и быстрых плейсхолдеров.
Остальные изменения pdoTools
Внимание, это изменения, которые влияют на работу всех сниппетов pdoTools. То есть, новые свойства можно использовать и у miniShop2 и у Tickets!
Параметр sort теперь принимает массивы в виде JSON строк, например:
[[!msProducts? &sortby=`{ "publishedon":"desc" ,"pagetitle":"asc" }` ]]
Добавлена автоматическая замена имён ТВ в &where. Тут нужно немного пояснить: из-за того, что ТВ присоединяются к запросу в БД, используются псевдонимы, и при указании
&includeTVs=`test`
в запросе мы получаем
`TVtest`.`value` as `test`
То есть, для работы с присоединённым ТВ нужно было указывать вот такое условие:
&includeTVs=`test` &where=`{ "TVtest.value:!=":"0" }`
С версии 1.4.0 вы можете указать просто:
&includeTVs=`test` &where=`{ "test:!=":"0" }`
и замена в запросе будет произведена автоматически.
Новый метод pdoTools::defineChunk(), который позволяет назначить кучу чанков для вывода результатов, согласно логики getResources.
Этот метод выдает имя чанка, используя параметры:
&tplFirst — чанк для первой строки результатов
&tplLast — чанк для последней строки результатов
&tplOdd — чанк для каждой второй строки
&tpl_N — чанк для n строки, например для 4й строки будет &tpl_4=«
&tpl_nN — чанк для каждой n строки, например для каждой третьей будет &tpl_n3=«
Эта возможность не включится автоматически — для нее сниппеты нужно апгредить. Конечно, новый pdoResources это уже умеет.
В лог менеджеру теперь выводится потребление памяти. Не знаю, пригодится это кому то, или нет — но мне нравится. Для просмотра лога нужно быть авторизованным в админке у вызвать сниппет с параметром
&showLog=`1`
Заключение
С версии 1.4.0, pdoTools стал не только библиотекой для написания быстрых сниппетов, но и гораздо более быстрой заменой getResources.
Текущая версия — бета. Возможны ошибки и недоработки, но уверен, вместе мы их поправим. В дальнейшем я планирую добавить сниппеты pdoMenu и pdoSitemap, которые, надеюсь, будут повторять функционал Wayfinder и GoogleSiteMap, только более быстро.
По GoogleSiteMap, кстати, уже есть наработки.
И всё таки, чего же нет в pdoResources?
Список вещей, которые есть в getResources, но пока не реализованы в pdoResources:
- @FILE и @INLINE чанки — не уверен, что кто-то этим пользуется
- &toSeparatePlaceholders — тоже самое. (Появилось в 1.4.1)
- &tvFilters — не реализовано, но работает при указании ТВ в &where, например
[[!pdoResources? &includeTVs=`test` &where=`{"test:!=":""}`]]
- &sortbyTV, &sortdirTV и &sortbyTVType — не реализовано, но работает при указании сортировки в обычном &sortby, например:
[[!pdoResources? &includeTVs=`test` &sortby=`{"test":"desc"}`]]
- &prepareTVs, &prepareTVList, &processTVs, &processTVList — этого нет, и скорее всего, не будет.
- &debug — есть гораздо более мощный и удобный &showLog=`1`
- &sortbyAlias, &sortbyEscaped — не знаю, зачем они.
- &tplCondition, &conditionalTpls и $tplOperator — чанки с условием, в документации не описаны, но скорее всего — сделаю. (Появилось в 1.4.1)
Всё остальное в наличии.
Добавление новых комментариев отключено.
Сгруппируйте ресурсы MODX в столбцы
Потребность
getResources — это универсальный швейцарский армейский нож из MODX Snippets. Вы можете многое сделать с ним, от галерей до меню и таких вещей, как блоги. При оптимальном использовании — и с добавлением небольшого количества магии MODX — он даже масштабируется для очень загруженных сайтов, обслуживающих огромное количество трафика. Вот только один пример.
Но есть одна мелочь, которую мне иногда нужно делать, и getResources не справляется с этим очень хорошо: столбцы.А точнее — группировка.
Возьмем, к примеру:
- Первый элемент
- Второй элемент
- Третий пункт
- Четвертый пункт
- Пятый пункт
- Шестой пункт
- Последний элемент
Количество пунктов произвольно. getResources позволяет вам форматировать вывод каждого элемента по его позиции в списке, например: первая, последняя, n-я позиция или nN-я позиция (например, каждая четвертая).Вы даже можете применить условное форматирование на основе некоторого атрибута ресурса, например, является ли это веб-ссылкой или документом, или используемым шаблоном. Действительно мощный материал. Однако что, если желаемая разметка выглядит примерно так:
- Первый элемент
- Четвертый пункт
- Последний элемент
- Второй элемент
- Пятый пункт
- Третий пункт
- Шестой пункт
Обратите внимание, что первые три элемента не сгруппированы в первом столбце — это было бы легко.Элементы предварительно отсортированы в последовательные группы в том порядке, в котором они возвращаются. getResources этого не делает. Я сделал обходной путь, когда вы вызываете getResources несколько раз, передавая ему свойства offset и limit на основе некоторых вычислений общих результатов и т. Д. И т. Д. Позвольте мне сказать вам, что это некрасиво.
getResourcesColumns
Введите новый фрагмент, getResourcesColumns. Это еще не экстра. Вероятно, когда-нибудь скоро, но до тех пор вы можете скопировать и вставить суть (встроена ниже) в сниппет на вашем сайте MODX и использовать его аналогично getResources.У него нет такого же условного форматирования, как у getResources — только & rowTpl и & colWrapTpl, но в тех случаях, когда вам нужны столбцы, это удобно. Ознакомьтесь с комментариями к коду для документации, и если у вас есть какие-либо мысли по этому поводу (особенно лучший способ получить телевизоры, когда они нужны), отправьте сообщение в Disqus ниже 🙂
MODx 1.0.6 Brute Force / Path Disclosure ≈ Packet Storm
Привет, список!
Хочу предупредить вас об уязвимостях безопасности в MODx.Это первая
часть уязвимостей в данной CMS (первые 19 уязвимостей).
Это уязвимости полного раскрытия пути и грубой силы в MODx. Это
о версиях MODx CMS 0.x и 1.x (Evolution). В версии 2.x (Revolution)
MODx есть часть этих дыр и часть новых дыр — я
написал по этому поводу отдельную рекомендацию.
————————-
Затронутые продукты:
—————— ——-
Уязвимы MODx 1.0.6 и предыдущие версии.
———-
Подробности:
———-
Brute Force (WASC-11):
В форме входа (http: // site / manager / ) отсутствует надежная защита от атак
Brute Force.
При этом на некоторых сайтах блокировка используется после нескольких неудачных
попыток. Но это неэффективно — пароль можно подобрать до того, как сработает блокировка
(как это было во время моего пентеста), это кратковременно и
работает для конкретной учетной записи, т.е.е. можно подобрать пароли к другим
разблокированным аккаунтам.
Раскрытие полного пути (WASC-13):
http: //site/assets/cache/siteCache.idx.php
http: //site/assets/plugins/ckeditor/read_config.php
http: / /site/assets/plugins/managermanager/default.mm_rules.inc.php
http: //site/assets/plugins/managermanager/example.mm_rules.inc.php
http: // site / assets / plugins / managermanager /mm.inc.php
http: // site / assets / plugins / phx / modifiers / parent.phx.php
http: //site/assets/snippets/ditto/classes/debug.class.inc.php
http: //site/assets/snippets/ditto/extenders/tagging.extender.inc.php
http: //site/assets/snippets/ditto/formats/atom.format.inc.php
http: //site/assets/snippets/ditto/formats/json.format.inc.php
http: / /site/assets/snippets/ditto/formats/rss.format.inc.php
http: //site/assets/snippets/ditto/formats/xml.format.inc.php
http: // site / manager / включает / browsercheck.inc.php
http: //site/manager/includes/mutate_settings.ajax.php
http: //site/manager/includes/rss.inc.php
http: // site / manager / includes / extenders /getUserData.extender.php
http: //site/manager/includes/sniff/phpSniff.class.php
http: //site/manager/media/browser/mcpuk/connectors/php/Commands/Thumbnail.php
Некоторые из этих дыр FPD относятся к движку, а некоторые — к плагинам к нему.
————
Хронология:
————
2012.27.06 — объявлено у меня на сайте.
2012.06.28 — проинформировал разработчиков о первой части уязвимостей.
2012.06.30 — проинформировал разработчиков о второй части уязвимостей.
28.07.2012 — проинформировал разработчиков об уязвимостях в MODx Revolution
и напомнил о двух предыдущих письмах.
2012.07.28-2012.10.31 — во время разговора с разработчиками о MODx
Revolution я постоянно напоминал им, что отправил им информацию о
дырах в Evolution и могу возмутиться, потому что было ясно, что они
пропустили это (они только отвечали по поводу революции).
2012.11.02 — после того, как разработчики заявили, что хотят видеть эту информацию (пропустили
в июне), я повторно отправил первые два письма разработчикам.
2012.11.17 — раскрыто на моем сайте (http://websecurity.com.ua/5926/).
С уважением,
MustLive
Администратор веб-сайта Websecurity
http://websecurity.com.ua
MODX Extras
2.4.11 пл
==============
— Исправлен путь по умолчанию для загрузки сервисов в методе loadCustomClasses ().
— Обновить стоимость заказа после добавления товара.
— Улучшена обработка опций продуктов.
— Удален вызов ms2Gallery :: syncFiles () из msProductData :: updateProductImage ().
— [mgr] Добавить список контекстов в фильтры на странице заказов.
— [mgr] Исправлена возможная ошибка при получении списка статусов заказов.
— [мгр] Исправить «xcheckbox» в параметрах продукта.
— [mgr] Добавить действия «развернуть, свернуть, проверить, снять отметку» в деревья категорий и опций.
2.4.10 пл
==============
— Исправлено возможное E_WARNING во фрагменте msOrder.
— Добавлены события в процессоры msOrderProduct.
2.4.9 пл
==============
— Улучшена загрузка pdoTools в сниппетах
2.4.8 пл
==============
— Добавлена поддержка ms2Gallery 2.0.
— Параметр источника мультимедиа «эскизы» теперь использует ключ массива с параметрами в качестве псевдонима для эскиза.
— Удалена системная настройка «ms2_product_thumbnail_size».
— Исправлена ошибка галереи с перетаскиванием в Firefox.
2.4.7 пл
==============
— Исправлена загрузка плагинов продукта, когда их можно было загружать несколько раз.
— Исправлена фатальная ошибка при получении классов в настройках с некоторыми сторонними способами оплаты.
— Исправлена ошибка с неправильным ранжированием эскизов после сортировки.
2.4.6 пл
==============
— Добавлена проверка электронной почты пользователей при получении идентификатора покупателя для нового заказа.
— Улучшена совместимость с MODX 2.5.2.
2.4.5 пл
==============
— Исправлена возможная ошибка входа в систему при создании нового продукта из режима cli.
— Обновлен jGrowl до версии 1.4.5.
2.4.4 пл
==============
— [# 242] Возможность указывать только необходимые параметры во фрагменте msProductOptions.
— [# 212, # 241] Исправлена обработка опций продукта с точкой в названии.
— [# 240] Исправлен сброс полей даты, когда продукт редактировался через сетку категорий.
— [# 239] Исправлены повторяющиеся и пустые параметры в msProductData.
— [# 229, # 238] Дерево категорий теперь учитывает системную настройку «resource_tree_node_name_fallback».
2.4.3 пл
==============
— [# 237] Исправлен метод msProductData :: get (‘options’).
— [# 236] Возможность отображать столбцы категорий заказанного товара.
— [# 231] Snippet msOptions теперь передает идентификатор продукта в блок.
— [# 230] Исправлена невозможность смены продавца товара более 1 раза.
— [# 228] Возможное исправление для «пустого файла» в галерее продуктов на некоторых конфигурациях сервера.
— [# 227] Улучшена производительность сетки с опциями в настройках.
2.4.2 пл
==============
— Исправлена ошибка, когда системная настройка «ms2_product_tab_gallery» отключена.
2.4.1 пл2
==============
— Исправлена ошибка перезаписи опций товара при обновлении из сетки категорий.
2.4.0 пл
==============
— [# 222] Оптимизирован фрагмент кода.
2.4.0 RC11
==============
— [msGallery] Улучшена загрузка эскизов в сниппете.
— [# 220] [мгр] Улучшены итоговые цифры в форме заказов.
2.4.0 RC10
==============
— msPaymentHandler :: getOrderHash () теперь включает номер заказа.
2.4.0 RC9
==============
— [# 215] Возможность указать рабочий контекст для корзины.
2.4.0 RC8
==============
— [# 218] Опции продукта становятся активными сразу после их назначения категориям.
2.4.0 RC7
==============
— Возвращено назад # 216 из-за проблем.
— [# 216] [msGetOrder] Чтобы исправить это, необходимо обновить pdoTools до версии 2.5.6-pl.
— [msGetOrder] Заказы показываются всем, если задан параметр и идентификатор.
— [mgr] Фиксированное количество строк в панели заказов.
2.4.0 RC6
==============
— [# 216] [msGetOrder] Исправлена возможность включения & includeTV.
2.4.0 RC5
==============
— Убрано неправильное поле «требует» в настройках msPayment.
2.4.0 RC4
==============
— Улучшена миграция системных настроек при обновлении со старых версий.
2.4.0 RC3
==============
— [msGallery] Улучшенный сниппет в случае, если для продукта не задан медиа-источник.
— Исправлена работа с автозаполнением опций товара.
2.4.0 RC2
==============
— Исправлено дублирование номера заказа в msOrderHandler.
2.4.0 RC1
==============
— Исправлена ошибка цикла при изменении ключа класса с modResource на msProduct.
2.4.0 RC
==============
— Все сниппеты полностью переписаны.
— Все фрагменты используют синтаксис Fenom.
— Улучшена совместимость с MySQL 5.7.
— Улучшена панель формы заказов.
— [msOrder] Удалены чанки tpl.msOrder.delivery, tpl.msOrder.payment и tpl.msOrder.success.
— [msOrder] Чанк tpl.msOrder.outer переименован в tpl.msOrder.
— [msOrder] Новый параметр и поля пользователя.
— [msCart] Удалены чанки tpl.msCart.row и tpl.msCart.empty.
— [msCart] Чанк tpl.msCart.outer переименован в tpl.msCart.
— [msGetOrder] Теперь действует как обычный сниппет и не устанавливает заполнители для страницы по умолчанию.
— [msGetOrder] Удален чанк tpl.msGetOrder.row.
— [msGetOrder] Добавлен чанк tpl.msGetOrder.
— [msOptions] Удалены блоки tpl.msOptions.outer и tpl.msOptions.row.
— [msOptions] Добавлен чанк tpl.msOptions.
— [msProductOptions] Удалены блоки tpl.msProductOptions.outer и tpl.msProductOptions.row.
— [msProductOptions] Добавлен чанк tpl.msProductOptions.
— [msGallery] Удалены блоки tpl.msGallery.outer, tpl.msGallery.row и tpl.msGallery.empty.
— [msGallery] Добавлен чанк tpl.msGallery.
— [msGallery] Добавлен скрипт Фоторамы из коробки.
— Улучшены блоки электронной почты. Добавлен общий шаблон электронной почты.
2.4.0 бета3
==============
— Небольшие улучшения галереи товаров.
— Улучшена панель настроек ExtJS.
2.4.0 бета2
==============
— Добавлена системная настройка «ms2_template_category_default».
— Улучшена регистрация рефералов.
— Улучшена панель продуктов ExtJS.
— Блоки писем теперь обрабатываются pdoTools.
— Заменены вызовы modX :: toJSON и modX :: fromJSON на собственные функции.
— Новая система регистрации сторонних классов расширений.
— Новая система регистрации сторонних плагинов для модели объектов.
— Улучшено дублирование товаров и категорий.
— В теги ресурса добавлены поля данных товара: [[* цена]], [[* статья]] и т. Д.
— Улучшена регистрация JS и CSS на веб-интерфейсе.
— Обратные вызовы Javascript теперь представляют собой массивы с функциями. Новые функции для регистрации и удаления обратных вызовов.
— Обновленная модель для MySQL 5.7.
— Улучшенная галерея товаров.
— Новый логотип.
2.4.0 бета1
==============
— Улучшены категории с товарами.
— Улучшено меню категорий в дереве ресурсов.
— Возможность изменить class_key категории.
— Множество улучшений панели категорий ExtJS и сетки продуктов.
— Параметр ms2_category_content_default теперь по умолчанию пуст.
2.4.0 бета0
==============
— Исправлен php-тип «статьи» в объекте xPDO msProductData.
— Улучшена панель заказов.
— Обновлен строитель.
— Добавлены иконки для CRC в дереве менеджеров.
— Минимальная версия MODX 2.3.
Modx и «предел» в 5000 документов / Sudo Null IT News
Введение
Modx — замечательный фреймворк, но на ресурсах и в разделах, посвященных modx, вы можете прочитать сообщения об определенных ограничениях фреймворка в 5000 документах , а клиенты иногда спрашивают, будет ли сайт работать, если на нем более 5000 страниц.
Вы, наверное, уже догадались, речь пойдет об эволюции modx (версия 1.0,5).
Когда стоит задача сделать сайт больше визитки, возникает вопрос: сколько страниц может обслуживать cmf / cms и как быстро?
Modx славится своей гибкостью, и практически для любой задачи вы можете предложить несколько решений, но узким местом является кеширование, в частности, нас интересует файл assets / cache / siteCache.idx.php, который содержит абсолютно все, что может кэшироваться (кроме самих страниц, для которых есть собственный файл кеша в форме assets / cache / docid_.pageCache.php).
Есть несколько способов обойти небольшие неудобства, которые могут возникнуть (если вы создадите портал и сохраните все как документы modx) на большом сайте с текущей концепцией кэширования modx, которые обсуждаются ниже.
Что не так с кешированием
С ним все верно, но есть один момент — при очистке кеша необходимо пересобирать основной файл кеша siteCache.idx.php.
Обновление кеша запускается такими событиями, как любые изменения параметров tv, фрагментов, фрагментов, шаблонов, изменений в документах (добавлен новый ресурс или удален из публикации любой другой — вам необходимо «обновить» массив идентификаторов документов), как результат, если есть каталог сайта с несколькими сотнями документов, в большинстве из которых есть десяток параметров tv — размер siteCache.idx.php может быть несколько МБ и увеличиваться, и для создания нового файла кеша необходимо выполнить дюжину запросов sql, если не более того, этот файл будет успешно перезаписан до тех пор, пока имеется достаточно выделенной памяти (memory_limit) как на этапе формирования файла основного кеша, так и на других запросах на формирование текущей страницы (которая в данный момент находится), в противном случае получите ошибку: Неустранимая ошибка: допустимый размер памяти ... байтов исчерпан (пробовал выделить ... байтов) в ..assets / cache / siteCache.idx.php в сети ...
.
Распространенные ошибки на крупных сайтах
Под большим сайтом мы представим ресурс из нескольких тысяч документов, количество которых постоянно увеличивается.
Если сайт спроектирован неправильно, основная нагрузка ляжет на файловую систему и, в частности, на запись siteCache.idx.php, и рассмотрите один из возможных вариантов.
Например, блог modx
Допустим, есть блог по modx, содержимое которого «генерируется» пользователями, каждый размещает свои статьи, которые записываются в базе данных в виде документа modx и отображаются в дереве документов, что вполне логично и даже удобно, поскольку нет необходимости делать дополнительную работу: отдельная таблица, контроллеры для управления данными от имени пользователя и админа (это займет несколько часов в зависимости от сложности), а также инструменты для редактирования сайта админом / менеджером из fron -end довольно нестандартные.
При добавлении нового документа в modx необходимо очистить весь кеш, поэтому при частоте 2-3 документа в минуту сайт может тормозить, при увеличении количества документов тормоза увеличиваются, со временем сайту будет недостаточно выделенной памяти, и сервер выдаст ошибку, которая начинается: «Разрешить размер памяти …».
Вы можете увеличить размер выделенной памяти, но вы не можете увеличивать его бесконечно (мы выиграли ‘ Сказать почему сейчас) рано или поздно вам придется пересмотреть концепцию нашего блога и переписать большую часть работы.
Тестирование Modx
Чтобы не быть голословным, я провел дома небольшой тест, имитируя пример «блога на modx».
Контрольная
Убедитесь лично, что modx может работать с более чем 5000 документов, определите, при каких условиях modx может перестать работать.
Инструменты
Ноутбук: CPU Core i3 2.13Ghz, RAM 8Gb DDR3, HDD 500GB 5400 rpm
Программное обеспечение: Windows 7 x64, Apache 2.2.12, php 5.3.0, mysql 5.1.36
Настройки сервера: обычный веб-сервер xampp, нормальные настройки, memory_limit установлен на 64Мб.
Рабочий план
- установить modx evolution 1.0.5
- создать: 30 копий шаблонов, 50 фрагментов, 30 фрагментов, 100 параметров ТВ, 5.000 документов
- написать сценарий, который частично выполняет шаг 2, выполните шаг 2.
- , если админ не работает — выполните шаг 6, если он работает — выполните шаг 5
- увеличивает количество документов еще на 5.000, см. Пункт 4
- увеличьте memory_limit до 128 МБ, если ошибок нет, см. Пункт 5.
- , если мы дойдем до этой точки, то получим ошибку «Разрешить размер памяти… », делаем выводы.
Рабочий процесс
Установлен (запуск и завершен) фреймворк вместе со всеми фрагментами и фрагментами, которые включены по умолчанию.
На этапе тестирования не имеет значения, какие именно данные будут содержать шаблоны, чанки, сниппеты, параметры ТВ, документы. Мы будем постоянно копировать один и тот же элемент.
Для операций копирования был написан небольшой скрипт:
- source
- копируем в assets / snippets / test / test.php
- запустить index-ajax.php? q = активы / фрагменты / test / test.php
В панели администратора я сделал копию первого документа (id = 1), установил идентификатор документа = 1 как дочерний для скопированного (id = 2) документа и запретил отображение документа в меню (при наличии много документов, не обязательно видеть их все на сайте), скрипт скопирует созданный документ (id = 2), и все клоны будут иметь первый документ в качестве родительского (id = 1).
Копирование ресурсов
Начальный размер siteCache.idx.php — 161 КБ.
Templates, донором будет «MODxHost» — примерно столько же места занимают любые другие шаблоны в большинстве проектов, сделано 30 копий, также скопировано 100 параметров ТВ, 50 чанков (донором был WebLoginSideBar), 30 сниппетов ( донор — AjaxSearch, много кода содержит то, что нам нужно).
После этих несложных операций размер siteCache.idx.php увеличился до 1.370Мб, сайт и админка работают, мы создаем много документов (напомню, скрипт дублирует документ с id = 2, мы также вставим некоторый контент для id = 2, например, откуда-то я скопировал отсюда кусок).
Результаты теста в таблице
Попытка создать еще 5к документов с memory_limit = 128Mb и наличием 60k документов не удалась.
Во время тестирования перестали загружаться документы в дереве документов в админке, хотя админка работала, это было из-за того, что я скопировал все документы в один «родительский» (id = 1), и там было недостаточно выделенной памяти для выбора и вывода необходимых дочерних документов.
При создании кеш-файла siteCache.idx.php, стоит подумать, на какой странице создается основной файл кеша, поскольку фрагменты и плагины, которые используются на конкретной странице, также потребляют память, выделенную для PHP, поэтому максимальное количество документов также зависит от того, насколько хорошо написано сниппеты и как строятся запросы.
Тест окончен, с memory_limit 64MB и 128MB примерно 15k и 60k соответственно могут быть обслужены в modx, это явно больше, чем заявленный лимит в 5k документов, конечно это не стандарт, но это показатель что modx, в принципе, может работать с большим количеством документов.
Структура сайта организации
Чтобы избежать проблемы нехватки выделенной памяти, могу посоветовать принципы, которых следует придерживаться при создании сайта или портала на modx:
- Не пишите много дочерних документов на одного родителя, постарайтесь логически распределить документы по группам ;
- динамический контент для огромных каталогов нужно организовать в отдельную таблицу, напишите для него необходимые сниппеты, если вам нужен ЧПУ для данных в таблицах — вы можете написать плагин или сниппет и повесить его на странице 404, что будет отображать контент, если данные есть в нашей таблице;
- чтобы избежать запросов «SELECT * FROM», нужно выбирать только то, что нам нужно, не более того, разбивать сложные запросы на несколько простых;
- не злоупотреблять, например, звонками Дитто, на практике встречался с десятком некэшированных вызовов Дитто на одной странице, которые ужасно тормозили сайт, для конкретной задачи лучше написать конкретный сниппет, который больше ничего не делает .
- Теги:
Конечно, если предполагаемое количество страниц на сайте несколько тысяч, у разработчика уже будут другие задачи, а если используется modx, то только для статического контента и в качестве моста для данных в других таблицах.
Заключение
Как видите, modx может работать с большим количеством документов, evolution можно без проблем использовать для создания больших порталов и интернет-магазинов, хотя подход должен быть разумным. Modx — это всего лишь инструмент, качество создаваемого ресурса зависит от того, как разработчик будет использовать эти инструменты.
В статье не упоминается революция в modx, как лучше делать сниппеты (в виде отдельного файла или хранить код в базе данных) и многое, многое другое, о modx можно много писать.
Мне приятно читать комментарии или критику к статье и коду.
Специально для Хабра.
Настройка 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 | Электронная почта для ответа |
Протокол идентификации для открытых приложений
2021 год станет масштабным годом для децентрализованной работы и идентификации благодаря проектам как @ graphprotocol и @identityindex .
Очень рад дальнейшему изучению этих идей для дальнейшего продвижения миссии участия, а не домыслов 🤝
& mdash; Брайан Флинн 🐇 🕳️ (@Flynnjamm) 19 декабря 2020 г.
Новые технологии, такие как @ethereum , # Blockchains , @IPFS и @Filecoin открывают дверь к совершенно новой парадигме инфраструктуры данных и приложений и таких инструментов, как @ ceramicnetwork и @identityindex будут способствовать связывая эти новые технологии вместе.
& mdash; Спенсер Томпсон Броуди (он / он) (@stbrody) 20 ноября 2020 г.
< p lang = "en" dir = "ltr"> Право собственности и совместимость являются важными аспектами самостоятельной идентичности и данных. @ceramicnetwork & # 39; s @ identityindex , созданный командой @ 3boxdb , выглядит действительно сильным подход здесь. Теперь у нас есть инструменты для создания web3 без UX или жертвоприношений DevEx.
& mdash; Таннр Аллард (@TannrAllard) 9 ноября 2020 г.
El Portal del Ciclismo Argentino
+ горный велосипед
10.11.2019
Los casi 200 corredores se volvieron felices con el recorrido.
3.11.2019
La buena convocatoria se mantuvo hasta el final
7.10.2019
El Rural Bike, проехав мимо Paraje El Tat
23.9.2019
Cobra Di Lorenzo y Anabela Monrdez, ganadores de las generales
22.9.2019
Хорхе Матье и Луизина Симонди, следуя за общими усилиями, 15 Desafo
16.9.2019
Samanta Ruiz gan en Damas
15.9.2019
Martn Caprifoglio y Claudia Martins, los ganadores
8.9.2019
Exigente circuito de 60 km para las categoras Competitivas
2.9.2019
Ариэль Мартнез и Валерия Гмез mantienen sus invictos
25.8.2019
Ариэль Мартнез и Кристина Зекка ganaron las generales
25.8.2019
Paola Caggianesa venci en Damas Pro
19.8.2019
Con ms de 3500 bikers se corri la edicin ms convcante del Trasmontaa.
5.8.2019
Ms de 500 байкеров disfrutaron del 4 Rally MTB Pilar
15.7.2019
340 отверстий и грунтовка Crazy Rally
15.7.2019
El Balneario de Carmen de Areco recibi nuevamente al Rural Bike
+ Писта и Рута
14.6.2019
Carreras en Tandil, Lans, San Nicols, Quines y Villa Cas
2.5.2019
Тивани ган ла 88 эдицин
23.4.2019
Carreras en KDT, Lans, Ramallo, Trenque Lauquen y Cerro Catedral
9.4.2019
Carreras en Formosa, Lans y Tandil
26.3.2019
Carreras en Gral. Виллегас, Граль. Alvear Mza., Las Flores y Lans
20.3.2019
Carreras en Lomas, Juan Llerena y Lans
11.