Какую версию MODx вы используете для разработки сайтов

Проголосовало: 79. Воздержалось: 2

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

Небольшой тест РЕВО и EVO

Решил сначала собирать 1 сайтик на REVO но понял что не успеваю доделать вовремя так как столкнулся с множеством мелочей.

В итоге в момент когда создал на EVO все тоже что уже было готово на РЕВО:
Провели с Valikras небольшой тест скорости.


( Читать дальше )

Caching MODX Revolution 2.1 and later

Много замечаю в коде, по старинке все используют конструкцию
$modx->cacheManager->clearCache();
. Хочу напомнить, ClearCache () является устаревшим методом работы с кэшем, в Рево 2,1 и выше появилась возможность не очищать весь кэшь, а обновлять
$modx->cacheManager->refresh();

Смотрите более подробную документацию в rtfm.modx.com/display/revolution20/Caching

Как хранить товары в интернет-магазине?

Проголосовало: 33. Воздержалось: 0

Как вы считаете, как нужно хранить категории товаров, их свойства, цены и прочую информацию в интернет магазине для MODX Revolution? Опрос не про техническую возможность, а вообще. Нужна информация для размышления =)

Чат в jabber

Пока шли разговоры про то что и как делать с чатом и как его создать, я запилил чат в Jabber
xmpp:modx@conference.jabber.ru

у кого нет учетки на jabber

PS чтобы не было цирка используйте ники сообщества))

[evo] вытащить ID документов определенного уровня вложенности

Добрый день, возникла потребность тащить докменты с конкретного уровня вложенности. Стандартный метод getChildIds тащат с 1 по заданный уровень.

В итоге благодаря SSDTyphon, появились два снипета:

1) Тащит только id документов из базы и выдает их через ","
<?php
if(!isset($id)) $id = 2;
if(!isset($level)) $level = 1;

if ($level > 1){
    $tblsc = $modx->getFullTableName('site_content');
    $access = "AND lvl{$level}.deleted=0 AND lvl{$level}.published=1";
    $inner = '';
    for ($i = $level-1; $i > 0; --$i){
        $nextlvl = $i+1;
        $inner .= "INNER JOIN $tblsc AS lvl{$i} ON lvl{$nextlvl}.parent=lvl{$i}.id AND lvl{$i}.deleted=0 AND lvl{$i}.published=1 ";
    }
    $sql = "SELECT lvl{$level}.id FROM $tblsc AS lvl{$level} " . $inner . "WHERE lvl1.parent=$id $access;";
    $res = $modx->db->query($sql);

    $children = array();
    while($childId = $modx->db->getValue($res)){
        $children[] = $childId;
    }
}
else{
    $children = $modx->getChildIds($id, 1);
}

return implode(',', $children);
?>


2) По сути аналог $modx->getDocuments(), где в $id заданы все документы уровня, поменяв строчку $child[] = $v['id']; на любую нужную, можно легко вытащить нужные поля документов. Можно менять SQL запрос, тогда можно ограничивать выборку еще сильнее.

<?php
if(!isset($id)) $id = 2;
if(!isset($level)) $level = 5;

if($level>2) {   
    
if(!function_exists('LevelChildren')){
        function LevelChildren($docId, $levels){
          global $modx;
          $tblsc = $modx->getFullTableName('site_content');
          $access = "AND lvl{$levels}.deleted=0 AND lvl{$levels}.published=1";
          $inner = '';
          for ($i = $levels-1; $i > 1; --$i){
            $nextlvl = $i+1;
            $inner .= "INNER JOIN $tblsc AS lvl{$i} ON lvl{$nextlvl}.parent=lvl{$i}.id AND lvl{$i}.deleted=0 AND lvl{$i}.published=1 ";
          }
          $sql = "SELECT lvl{$levels}.* FROM $tblsc AS lvl{$levels} " .
             $inner .
             "WHERE lvl2.parent=$docId $access;";
          $res = $modx->db->query($sql);
          $res = $modx->db->makeArray($res);
          foreach($res as $v) {
                    $child[] = $v['id'];
                    }

        return implode(",",$child);
}

}
    $levelID = LevelChildren($id,$level);
    return $levelID;
}
else { return '';}
?>


Вызов: [[getLevelChild&? &id = `2`&level = `5`]]

id — ID родителя. level = `5` — уровень относительно родителя (учитывая, что родитель на 1 уровне, а не 0)

Оригинал тут

ПС изначально использовал для той же цели конструкцию:

$array1 = $modx->getChildIds($parent,$depth);
$array2 = $modx->getChildIds($parent,$depth-1);
$childParents = array_diff($array1, $array2);

[EVO] Событие при перемещении документа

По логике процесса понадобилось отслеживать перемещение документов. Проверил код модуля и оказалось, что при этом не генерируется никакого события. Нашел быстро Bug #2094 и еще пост на форуме. Может кому понадобится.

Добавляем события в таблицу:
INSERT INTO `modx_system_eventnames` (`id`, `name`, `service`, `groupname`)
VALUES
(1052, 'OnBeforeDocMove', 5, ''),
(1053, 'OnDocMove', 5, '')

Обновляем manager/processors/move_document.processor.php:
до строки 107
// invoke OnBeforeDocMove event
    $modx->invokeEvent("OnBeforeDocMove",
        array(
            'id'         => $_REQUEST['id'],
            'new_parent' => $_REQUEST['new_parent']
    ));

и после строки 113
// invoke OnDocMove event
    $modx->invokeEvent("OnDocMove",
        array(
            'id'         => $_REQUEST['id'],
            'new_parent' => $_REQUEST['new_parent']
    ));


При создании плагина не забываем поставить галочки напротив новых событий.

Также, не забывайте, что в MODx Evolution немало действий, на которые не генерируются события. Все они есть в баг-трекере, в том, или ином виде, достаточно правильно по-английски сформулировать поисковый запрос :)

xPDO generator [[Revo]]

Игрушка… www.crudsquad.org/modx/xpdogenerator
Правда смысл я не пойму, для чего? Чтобы у себя не генерировать классы?
Посчитал нужным выложить здесь ссылку, так как всем интересным мы делимся. :).
Проверил — работает. Думаю, может себе такую игрушку сделать.

[REVO] Графическое представление взаимосвязи объектов

Не знаю как обстоят дела у остальных, а мне постоянно приходится заглядывать в схему modx.mysql.schema.xml, когда нужно сделать выборку связанных объектов. Что-то тривиальное, наподобие $user->getMany('CreatedResources'), уже отложилось в памяти, а вот более редко используемые связи заставляют каждый раз лезть в схему или сюда. В обоих случаях источники представлены в текстовом виде, что не особо наглядно. А хотелось бы так — открыл и сразу выхватил взглядом нужный объект и его взаимоотношения с другими. Поэтому сделал себе такую шпаргалку по некоторым наиболее часто используемым объектам.
Может не только мне пригодится.

Интеграция с LiveStreet за вознаграждение

Добрый день, в связи с активным использованием лайвстрита в последнее время появилось желание получить человеческую интеграцию modx evo 1.0.5 и ls 0.5.1

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

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

Готов спонсировать разработку (в рамках разумного) и буду не против поделиться разработкой с сообществом, думаю многим может быть полезно.

Если есть добровольцы давайте обсудим.

за основу разработки думаю можно взять пост:
community.modx-cms.ru/blog/dev/1255.html

Как убрать из TransAlias знаки препинания

Если у вас псевдонимы генерируются автоматически с помощью плагина TransAlias, то такие знаки препинания, как "!", ":", "," и т.д. автоматически появятся и в вашем псевдониме, если они присутствуют в заголовке. Но если запятая или восклицательный знак не влияют на работоспособность псевдонима, тем не менее, их присутствие вряд ли его украсит. К счастью, это легко исправляется.

Для этого, нам понадобится отредактировать файл assets\plugins\transalias\transliterations\russian.php — в этом файле находится таблица с символами для автоматической замены. Добавляем в нее через запятую знаки препинания:

,','=>'','?'=>'','!'=>'','"'=>'','@'=>'','%'=>'','$'=>'',
'#'=>'',';'=>'',':'=>'','&'=>'','='=>'','('=>'',')'=>'','+'=>'','/'=>'','}'=>'','{'=>'',']'=>'',
'['=>'','*'=>'','`'=>'','~'=>'','№'=>''


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

[REVO] [SOLVED] глюк с кодировками при вставке ссылки в TinyMCE

при наборе названия ресурса поиск отображается в неправильной кодировке



В настройках пакета TinyMCE никаких языковых параметров не нашел

Collate в БД utf8_general_ci

Solution

добавить AddDefaultCharset utf-8 в .htaccess

MODx Revolution обучение начинающих. Урок 4. Шаблон MODx revo - интеграция




Добро пожаловать в четвертый урок из серии MODx Revolution для начинающих. В предыдущих уроках мы прошли шаг за шагом процесс установки MODx Revolution на удаленный сервер и узнали, как осуществить некоторые базовые конфигурации сайта, такие, например, как изменить название сайта.
Мы также рассмотрели установку некоторых расширений из репозитория MODx и управление пакетами. В этой статье мы собираемся рассмотреть, как работать с шаблонами в MODx Revolution.
В качестве примера вы можете использовать любой обычный статический HTML / CSS шаблон и затем преобразовать его в динамический шаблон MODx Revolution.

( Читать дальше )

[Evo] Снипет отображения последних просмотренных товаров

Уважаемые,

взял тут

Стандартно можно вывести лишь url и имя.
Как вывести фотографию которая хранится в TV параметре?

Заранее, спасибо!

<?php
$mode = isset($mode) ? $mode : 'show';
$outerTpl = isset($outerTpl) ? $outerTpl : '@CODE: <h1>Вы уже смотрели:</h1><ul class="[+outer-class+]">[+rows+]</ul>';
$outerClass = isset($outerClass) ? $outerClass : 'last-view';
$rowTpl = isset($rowTpl) ? $rowTpl : '@CODE: <li><a href="[+url+]">[+name+]</a></li>';
$maxRows = isset($maxRows) ? $maxRows : 10;

if(!function_exists('fetchTpl')) {
    function fetchTpl($tpl){
        global $modx;
        $template = "";    
        if(substr($tpl, 0, 6) == "@FILE:") {
            $tpl_file = MODX_BASE_PATH . substr($tpl, 6);
            $template = file_get_contents($tpl_file);
        } else if (substr($tpl, 0, 6) == "@CODE:") {
            $template = substr($tpl, 6);
        } else if($modx->getChunk($tpl) != "") {
            $template = $modx->getChunk($tpl);
        } else {
            $template = false;
        }
        return $template;
    }
}

if(!function_exists('parseTplChunk')) {
    function parseTplChunk($tpl,$placeholder=array()){
        $chunk = fetchTpl($tpl);
        foreach ($placeholder as $key => $value){
           $chunk = str_replace("[+".$key."+]", $value, $chunk);
        }
        return $chunk;
    }
}

$item = array();

if (isset($_COOKIE['last_view']) and $_COOKIE['last_view'] != '') {
    $item = explode(',', $_COOKIE['last_view']);   
}


switch ($mode) {
    case 'register':
        if (!in_array($modx->documentIdentifier, $item)) {
            if (count($item) >= $maxRows) {
                array_shift($item);
                array_unshift($item, $modx->documentIdentifier);
            } else {
                array_unshift($item, $modx->documentIdentifier);
            }
            setcookie('last_view', implode(',', $item), time()+60*60*24*30, '/');
        }
    break;
    
    case 'show':
        
        if (!empty($item)) {
            $docs = $modx->getDocuments($item);
            $output = '';
            foreach ($docs as $doc) {
                $rows .= parseTplChunk($rowTpl, array('url'=>$modx->makeUrl($doc['id']), 'name'=>$doc['pagetitle']));
            }
            
           return parseTplChunk($outerTpl, array('rows'=>$rows, 'outer-class'=>$outerClass));
        }
    break;
}
?>

ps пытался так:
$rows .= parseTplChunk($rowTpl, array('url'=>$modx->makeUrl($doc['id']), 'name'=>$doc['pagetitle'], 'image'=>$modx->getTemplateVar('img_product_home')));

но не работает, выводит вместо значения TV параметра текст:
Array

Русскоязычный веб-чат (irc или иное)

Хочется обсудить вопрос русскоязычного веб-чата о modx. Я нагуглил, что ранее этот вопрос обсуждался и на форуме данного сообщества и на официальном форуме, но дело так и не сдвинулось, да и сомнения у людей были в активности данного мероприятия. Теперь же, когда популярность системы значительно подросла и разработчиков (и желающих ими стать) становится все больше, данный вопрос вновь заслуживает обсуждения.
Думаю, что реализация может быть и как в виде чата, прикрученного к сообществу, и как в виде irc-канала, что знакомо многим. Официальный #modx на webchat.freenode.net все же англоязычный, и если мы там будем свои русские вопросы обсуждать, то остальным будет неудобно.
А пользу веб-чата я вижу в следующем:
— разгрузить сообщество от частых, простых, уже обсуждавшихся вопросов, которые часто возникают как новая тема.
— быстрая помощь друг другу в небольших задачах.
— общение «сообщников» на свободные темы, дабы не загружать левым смыслом основной сайт.
Ведь бывает — возникнет какая-нибудь заковырка, вроде мелочь и темы плодить ради ерунды не хочется и решить бы ее скорее, а у гугла выведать решения не получается.

Интересно мнение других по необходимости и реализации.

[REVO] Гуру, помогите с выводом тайтла родительской страницы

Мне нужно простое решение вывода тайтла родительской страницы.

Проблемы с FROM_UNIXTIME в where

Пишу сниплет, для выборки нужно следующее условие FROM_UNIXTIME(`publishedon`,"%Y") = year, для этого делаю
$query->where(array(' FROM_UNIXTIME(`publishedon`,"%Y") :=' => 2011,));
Но sql запрос не работает. Посмотрев на создаваемый запрос

SELECT `modResource`.`id` AS `modResource_id`, `modResource`.`type` AS `modResource_type FROM `site_content` AS `modResource` WHERE `modResource`.`FROM_UNIXTIME(`publishedon`,"%Y")` = '2011'   


Можно заметить, что перед FROM_UNIXTIME было добавлено modResource как это лечить?

Написать модуль для MODx Evo

Работа для опытного разработчика на MODx.
Суть модуля – автоматизация рутиных процессов в компании.

В качестве тех.задания – прототип в Axure. Там же можно будет увидеть набор сущностей, основные операции с данными.

Мой Skype – svfedorof
Готов обсуждать проект сегодня и завтра. От Вас – отсутствие проблем со сроками.

[REVO] Вывод статей articles с tv-параметрами

Здравствуйте!
Вопрос такой:
1.Создал tv-параметр [[*img_for_statii]]
2.Добавил изображения к статьям
3.Переделал чанк вывода статей Article Row Chunk, т.е. добавил
<div class="img_for_statii">
  <a href="[[~[[+id]]]]">[[*img_for_statii]]</a>
  </div>

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

EVO/@EVAL/TVevaler/ как передать значение pagetitle для обработки в снипет в @EVAL?

Добрый день, использую @EVAL(+TVevaler хотя это наверное не принципиально), вызов снипета такой:
@EVAL return $modx->evalSnippets("[[SqlFilter?&Docfield=`id`&filterTV =`filter_1_parameter,$_GET['pagetitle']|filter_2_sostav,$_GET['pagetitle']`&mode=`OR`]]");

Подскажите, как передать в снипет значение поля ['pagetitle'] меняющееся в зависимости от документа где ТВшка с этой привязкой? (в коде вместо поля $_GET['pagetitle'])