Полный доступ к схемам modx revo!

И вот наступило время свободного полета в дебрях modx revo.
Нам нужно сделать вывод страниц, просчет статистики, тонкая настройка пагинации или что-то еще. Почти все можно сделать. используя мощный API MODx Revolution. Описывать тут долго ни чего не стану, а лишь сделаю ссылку на документ, хорошо описыающий логику работы с данными как с объектами и самое важное - имена этих объектов.

http://bobsguides.com/revolution-objects.html

Для примера работы с данными как с объектами покажу как можно изменить имя сайта, которое указывается в системных свойствах.

$c = $this->modx->getObject('modSystemSetting', array('key' => 'site_name'));
if(is_null($c)){ // Если свойства нет. то создаем его
    $c = $this->modx->newObject('modSystemSetting');
    $c->set('key', 'site_name');
    $c->set('area', 'site');
    $c->set('xtype', 'textfield');
}

$c->set('value', 'Новое имя сайта'); // Изменить значение свойства
$c->save(); // Сохранить изменения

Что с Yandex'ом?

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

С "Яндексом" явно что-то случилось. Последние несколько дней из выдачи пропали самые крутые сайты, которые оттуда выставить не могли просто по определению. Например, на запрос "анекдоты" в выдаче Анекдот.ру вы не найдете. Зато на втором месте там какая-то совершенно левая страничка с анекдотами, на которую не заходит и тысяча в день.
То же с "автомобилями". Авто.ру там нет, зато на первом месте - "Из рук в руки авто", на которую заходит на порядок меньше народу, чем на Авто.ру, а на втором - сайт, на котором в день бывает меньше сотни человек.

СТОП! А может Яandex сделал паузу, и чтобы не нести большие потери приостановил работу всех своих служб, по крайне мере служб, работающих через всеми известный восьмидесятый.
Хотя насколько это может быть оправданным нельзя сказать, без осведомленности о всей структуре этого проекта.

На самом же деле проблема в серверах. Домен yandex не выдает ни каких ошибок, запрос выдает пустой ответ, любой браузер напишет нам - ошибка сети.

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

Условие в чанках MODx Revolution

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

[[*id:is=`[[++site_start]]`:then=`Это главная страница`:else=`Это не главная страница, а страница с нормером [[*id]]`]]

Работа с ресурсами через API MODx Revolution

<?php
/* Получить данные ресурса*/
// array getDocument(int $id[, string $fields[, int $published[, int $deleted]]]);
$modx->getDocument(6, '*', 1);

/* Получить данные несколькиз ресурсов*/
// array getDocument(array $ids[, int $published[, int $deleted[, string $fields[, string $where[, string $sort[, string $dir[, string $limit]]]);
$modx->getDocuments(array(6,7,8), 1, 0, 'pagetitle');

/*Работа с ресурсами через объектную модель*/
/*Загрузка реесурса*/
$res = $modx->getObject('modResource', array('id' => '1'));
$res->getContent(); // Контент ресурса

/*Создание ресурса*/ 
$res = $modx->newObject('modResource'); 
$res->set(parent,0);
$res->set('name','NewResourceName'); 
$res->setContent('<p>Это новый ресурс!</p>');
$res->save();
?>

Посмотреть описание полей ресурса в официальной документации MODx Revo.

Подклечение API MODx Revolution

// Защита от некоторых опасностей
require_once('manager/includes/protect.inc.php');
// Загрузка конфигурации
if (!$rt = @include_once 'manager/includes/config.inc.php') {
exit('Невозможно загрузить конфигурационный файл MODx!');
}

// Установка режима MODx API
define('MODX_API_MODE', true);

// Инициализация парсера
include_once(MODX_MANAGER_PATH.'/includes/document.parser.class.inc.php');

$modx = new DocumentParser;
// Включение доступа к базе данных MODx

$modx->db->connect();
// Включение доступа к основным параметрам MODx
$modx->getSettings();

Работа с чанком и сниппетом через API MODx Revolution

<?php
/* Создание чанка */
$chunk = $modx->newObject('modChunk');
$chunk->set('name','NewChunkName');
$chunk->setContent('<p>Это новый чанк!</p>');
$chunk->save();

/* Вызов чанка */
$modx->getChunk('rowTpl',$properties);

/* Перезапись чанка */
$chunk = $modx->getObject('modChunk', array('name' => 'MyExistingChunk'));
if ($chunk) {
$chunk->setContent('<p>Это перезаписанный чанк!</p>');
$chunk->save();
}

/* Удаление чанка*/
$chunk = $modx->getObject('modChunk', array('name' => 'MyObsoleteChunk'));
if ($chunk) $chunk->remove();

/* Вызов сниппета */
$modx->runSnippet('snippet' ,$properties )
?>

Вы можете попробовать изменять сниппеты аналогичным способом, используя объект "modSnippet". 

Определение того, что пользователь на главной странице

Для определения главной страницы заходим в "Настройки системы" раздела "Система" и находим пункт "Главная страница сайта" (в фильтре вы можете указать имя параметра "site_start") в разделе "сайт".

Второй вопрос - как же узнать, что наш пользователь находится именно на главной старнице (например мы хотим, чтобы скрипт приветствия был только на главной, для этого лучше использовать условие, нежели писать новый шаблон для галвной страницы)?

В шаблоне, чанке, или на самой странице пишем слудующую инструкцию, не забудьте сначала убедиться, что у вас установлен пакет "If" (этот пакет рекомендуется обязательным для большинства проектов):

[[!If?
  &subject=`[[*id]]`
  &operator=`==`
  &operand=`[[++site_start]]`
  &then=`[[$чанк_для_главной]]`
  &else=`[[$чанк_для_не_главной]]`
]]

Напомню, что конструкция "[[*id]]" выводит "id" текущей страницы, в данном примере "id" текущей страницы будет сравнен с "id" главной страницы.

Вступление! Зачем MODx есть и с чем его едят?

Эта CMF включает особенности пакетов для удобного программирования и функции самой CMS. Вы сможете программировать не выходя из админки. Единственный, и, возможно самый огромный недостаток MODx Revolution - это трудный режим редактирования маленьких функций, так как они пишутся из браузера, но не смотря на это, вы всегда сможете подключить необходимый класс, который сможете программировать в Dreamweaver или другой удобной вам программе.

И так, рассмотрит базовые элементы создания шаблона:
  1. Шаблон - элемент, который ассоциируется с одной или несколькими страницами, имеет свой набор параметров (TV). Например для страниц товаров это могут быть: цена, вес, размер; а для страниц новостей - картинка к превью новости. С помощью такой надстройки, добавлять новости и другие элементы составит одно удовольствие, без использования сторонних модулей - это является неоспоримым преимуществом данной CMF/CMS.
  2. Дополнительное поле (TV) - параметр, прикрепляющийся к шаблону и ко всем страницам, с которыми он ассоциирован.
  3. Чанк - элемент, содеражащий html-код. Может включать в себя другие чанки и сниппеты. Является основным элементом шаблона. Для включения в другие элементы используется строковаую конструкцию - [[$имя_чанка]].
  4. Сниппет - php-код, включающий все API MODx Revolution. Написав необходимый код, вы всегда сможете его включить в необходимую часть страницы через строковую конструкцию - [[имя_сниппета]]. Обратите внимание, что сначала всегда происходит вычисление всех php функций и только потом построение текста страницы, это сделано во избежании ошибок при попытке изменить заголовок страницы после ее отправки.
  5. Плагин - функция, подключающаяся к старнице в определенных условиях. Пример такого плагина - известный текстовой редактор TinyMCE.
  6. Ресурс - страница, элемент с переадресацией на другую страницу или виртуальная копия другого ресурса. Это документ, содержащий любую информацию и который может в себя включать чанки и сниппеты.
Основные понятия разобраны. Вы моежте начать работу с загрузкой одного из пакетов, который будет содержать примеры реализация данных структур. Чтобы загрузить пакет дополнений перейдите в административной панели в разделе "Система" к пункту "Управление пакетами".
Примеры использования базовых функций на англиском языке описаны здесь. Если вы по каким либо причинам не читаете материалы на английском не паникуйте - чтобы понять алгоритм часто достаточно увидеть исходный код вызова функции, который чаще всего занимает одну стрчоку.
Если вы еще думаете, стоит ли разбираться во всем этом или нет я скажу - один из таких пакетов строит карту сайта, насколько это просто написав вызов сниппета одним словом вы могли об этом тоьлко мечтать. А для более опытных разработчиков поясню, что в параметрах к модулям вы можете указывать собственные шаблоны для его представления и этим возможности МОДикс не заканчиваются.

Возможные конструкции вствавок элементов [[*...]]


[[*pub_date]] — дата публикации ресурса
[[*unpub_date]] — дата завершения публикации
[[*createdby]] — идентификатор пользователя, создавшего ресурс
[[*createdon]] — дата создания ресурса
[[*editedby]] — идентификатор пользователя, редактировавшего ресурс
[[*editedon]] — дата редактирования ресурса
[[*contentType]] — тип содержимого (например, text/html)
[[*type]] — тип (ресурс, папка или ссылка)
[[*published]] — опубликован ли ресурс (1|0)
[[*parent]] — номер (ID) родительского ресурса
[[*isfolder]] — является ли ресурс папкой (1|0)
[[*richtext]] — используется ли при редактировании страницы визуальный редактор
[[*template]] — номер (ID) используемого шаблона для ресурса
[[*menuindex]] — порядковый номер отображения в меню
[[*searchable]] — доступен ли ресурс для поиска (1|0)
[[*cacheable]] — кэшируется ли ресурс (1|0)
[[*deleted]] — ресурс удален (1|0)
[[*deletedby]] — идентификатор пользователя, удалившего ресурс
[[*menutitle]] — заголовок меню, если таковой есть
[[*donthit]] — слежение за количеством посещений отключено (1|0)
[[*haskeywords]] — ресурс содержит ключевые слова (1|0)
[[*hasmetatags]] — ресурс имеет META теги (1|0)
[[*privateweb]] — ресурс входит в частную группу пользовательских документов (1|0)
[[*privatemgr]] — ресурс входит в частную группу менеджерских документов (1|0)
[[*content_dispo]] — вариант выдачи содержимого (1 — для отображения | 0 — прикрепленное для скачивания)
[[*hidemenu]] — документ не отображается в меню (1|0)