[EVO] 10 000 + документов в дереве.

Этой теме уже много лет.
Из предложенных вариантов вот основные:
community.modx-cms.ru/blog/1346.html
modx.im/blog/addons/803.html
modx.im/blog/addons/1977.html
github.com/AgelxNash/CustomEvo

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

Суть вопроса

1. Находим самое узкое место в системе кэширования
-проблема известна давно это масив в кеше AliasListing
при 23000 документах он съедает порядка 80 мегабайт памяти + добавляет прилично работы PHP (сразу напишу что при использовании написанного ниже решения потребление памяти на уровне 4-5 мегабайт)

2. Изучаем более ранние решения
Почти все приняли решение что нужно полностью избавиться от массива AliasListing
но зачастую это приводит к проблеме генерации урлов и тянет за собой много изменений, притом часть из проблем зачастую так и не получилось решить

3. Подходим с другой стороны
После анализа текущего проекта понял, что более 95% массива AliasListing это финальные документы, тоесть документы с isfolder=0
в частности у меня из 23172 всего 103 документа с isfolder=1.
Делая вывод понимаем что это не существенно и оставляя все папки в массиве AliasListing мы находим довольно простой способ решить проблему.

Решение

1 Правим генерацию кеша:
вот эту строку
github.com/dmi3yy/modx.evo.custom/blob/master/manager/processors/cache_sync.class.processor.php#L160
заменяем на:
$rs = $modx->db->select('IF(alias=\'\', id, alias) AS alias, id, parent, isfolder', $modx->getFullTableName('site_content'), 'deleted=0 AND isfolder=1', 'parent, menuindex');

дописываем условие: AND isfolder=1

2 Добавляем в функцию rewriteURL

после вот этой строки github.com/dmi3yy/modx.evo.custom/blob/master/manager/includes/document.parser.class.inc.php#L1255
кусок кода:

preg_match_all('!\[\~([0-9]+)\~\]!ise', $documentSource, $match);
            $ids = implode(',',$match['1']);
            $res = $this->db->select("id,alias,isfolder,parent", $this->getFullTableName('site_content'),  "id IN (".$ids.") AND isfolder = '0'");
            while( $row = $this->db->getRow( $res ) ) {
            	$aliases[$row['id']] = $aliases[$row['parent']].'/'.$row['alias'];
            	$isfolder[$row['id']] = '0';
        
       		}

этим мы за 1 запрос вытаскиваем все документы на страничке и дописываем в массив AliasListing для них нужную информацию

3. Заменяем функцию getChildIds
github.com/dmi3yy/modx.evo.custom/blob/master/manager/includes/document.parser.class.inc.php#L1711-L1738

function getChildIds($ids, $depth= 10, $children= array ()) {
        $res = $this->db->select("id,alias,isfolder", $this->getFullTableName('site_content'),  "parent IN (".$ids.") AND deleted = '0'");
        $idx = array();
        while( $row = $this->db->getRow( $res ) ) {
            $children[$row['alias']] = $row['id'];
            if ($row['isfolder']==1) $idx[] = $row['id'];
        }
        $depth--;
        $idx = implode(',',$idx);
        if (!empty($idx)) {
            if ($depth) {
                $children = $this->getChildIds($idx, $depth, $children );
            }
        }
        return $children;
    }

Добавляет нагрузки при использовании Ditto и Wayfinder так как используется в основном только там. Вытаскиваем список id дочерних документов из базы а не из AliasListing

4. Заставляем правильно генерить URL
MODX может генерить ссылки 2-я способами:
1. [~#~] — решили в пункте 2
2. Ditto, DocLister: [+url+], Wayfinder: [+wf.link+] решаем так:

Добавляем функцию getAliasListing подсмотренную тут:
github.com/AgelxNash/CustomEvo/blob/master/manager/custom/includes/document.parser.class.inc.php#L418-L445 но подправленную чуток:

function getAliasListing($id){
        if(isset($this->aliasListing[$id])){
            $out = $this->aliasListing[$id];
        }else{
            $q = $this->db->query("SELECT id,alias,isfolder,parent FROM ".$this->getFullTableName("site_content")." WHERE id=".(int)$id);
            if($this->db->getRecordCount($q)=='1'){
                $q = $this->db->getRow($q);
                $this->aliasListing[$id] =  array(
                    'id' => (int)$q['id'],
                    'alias' => $q['alias']=='' ? $q['id'] : $q['alias'],
                    'parent' => (int)$q['parent'],
                    'isfolder' => (int)$q['isfolder'],
                );

                if($this->aliasListing[$id]['parent']>0){
                    $tmp = $this->getAliasListing($this->aliasListing[$id]['parent']);
                    $this->aliasListing[$id]['path'] = $tmp['path'] . (($tmp['parent']>0) ? '/' : '') .$tmp['alias'];
                }

                $out = $this->aliasListing[$id];
            }
        }
        return $out;
    }


и в функции makeURL
github.com/dmi3yy/modx.evo.custom/blob/master/manager/includes/document.parser.class.inc.php#L2320
меняем на:

 $al= $this->getAliasListing($id);


5. Настраиваем отображение контента когда перешли по урлу которого нет в AliasListing
Вместо github.com/dmi3yy/modx.evo.custom/blob/master/manager/includes/document.parser.class.inc.php#L1559
вставить

$tbl_site_content = $this->getFullTableName('site_content');
                    $alias = $this->db->escape($_GET['q']);
                    
                    $parentAlias = dirname($alias);
                    $parentId = $this->getIdFromAlias($parentAlias);
                    $parentId = ($parentId > 0) ? $parentId : '0';

                    $docAlias = basename($alias, $this->config['friendly_url_suffix']);
                    
                    $rs  = $this->db->select('id', $tbl_site_content, "deleted=0 and parent='{$parentId}' and alias='{$docAlias}'");
                    if($this->db->getRecordCount($rs)==0) 
                    {
                        $rs  = $this->db->select('id', $tbl_site_content, "deleted=0 and parent='{$parentId}' and id='{$docAlias}'");
                    }
                    $docId = $this->db->getValue($rs);

                    if ($docId > 0) 
                    { 
                        $this->documentIdentifier = $docId;
                    }else{
                        $this->sendErrorPage();
                    } 


На этом все, получаем рабочее решение. Осталось протестировать и оформить галочкой в MODX


Жду помощи в тестировании :)

Update:
Обновил еще и генерацию [+url+] и [+wf.link+]
Избавился от плагина, теперь все в ядре

ToDo:
Вынести в настройку параметр:
AliasListingDocuments (all, folder)

61 комментарий

avatar
avatar
агамс, но там уж все координально.
Нашел более простое решение :)
осталось только протестировать все как положено
Комментарий отредактирован 2014-06-10 15:31:12 пользователем Dmi3yy
avatar
делал что-то похожее, но с полным удалением AliasListing
avatar
Агамс и это видел
только там не полноценное решение ибо отваливаются пару функций
avatar
А нету форка на githube с данными изменениями?

Данный вариант корректно работает с отключенными вложенными url?
avatar
C отключенными ЧПУ работает корректно
avatar
Чистая установка, ничего не делал, просмотр сайта:

« PHP Parse Error »
PHP error debug
Error : Invalid argument supplied for foreach()
ErrorType[num] :	WARNING[2]
File :	C:\xampplite\htdocs_modx\manager\includes\document.parser.class.inc.php
Line :	1252
Source :	 foreach($this->documentListing as $key=>$val){

Backtrace
1	DocumentParser->executeParser()
index.php on line 144
2	DocumentParser->prepareResponse()
manager/includes/document.parser.class.inc.php on line 1619
3	DocumentParser->outputContent()
manager/includes/document.parser.class.inc.php on line 1721
4	DocumentParser->rewriteUrls()
manager/includes/document.parser.class.inc.php on line 621
avatar
по умолчанию параметр выключен и ни на что не влияет
это у вас не создался файлик кеша видать после установки не зашли в админку и не сохранили настройки
avatar
зашел, сохранил, сбросил кеш, ошибка та-же
avatar
а все понял
создай в админка хоть 1 документ папку :)
avatar
какой именно файл должен создаться?

Содержимое папки C:\xampplite\htdocs_modx\assets\cache

11.06.2014  16:48    <DIR>          .
11.06.2014  16:48    <DIR>          ..
11.06.2014  15:04                31 .htaccess
11.06.2014  16:47             1 661 docid_1.pageCache.php
11.06.2014  13:15    <DIR>          images
11.06.2014  13:15                69 index.html
11.06.2014  15:06    <DIR>          rss
11.06.2014  16:47            19 296 siteCache.idx.php
11.06.2014  16:47                41 siteHostnames.php
11.06.2014  13:15                38 siteManager.php
11.06.2014  16:47                29 sitePublishing.idx.php
avatar
Прикольная кстати темка D3X — а-ля «Битрикс Эрмитаж» :))) Только вот скины tinyMCE немного бьет — хотя это поправить недолго.
Еще б соответствующую ей форму входа — и было б совсем хорошо :)
avatar
D3X = Дитрикс :)))
avatar
С битрикса и рисовал )
Ага видел пару багов пока руки не дошли поправить
если есть желание чуть поправить буду благодарен :)
то же и с формой входа:)

Чуть позже презентую 1.1b там есть довольно интересные штуки уже :)
avatar
А где тема-то? В сборке не нашел:)
avatar
avatar
Ага, спс, а то я в ветке мастер искал:)
avatar
Есть небольшой косяк в wayfinder с определением активного пункта меню. Если заходить в дочерний, который не является папкой, то теряется class=«active» для данного родительского пункта меню. Если же тот же ресурс является папкой — то все ок, пункт родительского меню остается активным. Все нормально также если рассматривать не дочерний ресурс, а текущий.

В общем проблема в методе getParentIds — когда документа нет в массиве aliasListing он не видит его родителей.

UPD: Решение (в функции getParentIds):

//$id = $this->aliasListing[$id]['parent'];
            //if (!$id) break;
            $id = isset($this->aliasListing[$id]['parent']) ? $this->aliasListing[$id]['parent'] : $this->db->getValue("SELECT `parent` FROM " . $this->getFullTableName("site_content") . " WHERE `id` = '{$id}' LIMIT 0,1");
            if (!$id || $id == '0') break;
Комментарий отредактирован 2014-06-12 12:20:50 пользователем webber
avatar
закинь плз PR
avatar
Не коректно работает параметр «Использовать вложенные URL» в значение нет, Wayfinder продолжает строить меню как будто данный параметр включен, просмотр документов из админке также происходит с учетом вложенности и соответсвенно ссылки не работают.
avatar
Подтверждаю что без вложенных урл-ов работает некорректно. дело в том, что в новой функции getAliasListing жестко вшит путь без проверок используется ли вложенность или нет.

if($this->aliasListing[$id]['parent']>0){
                    $tmp = $this->getAliasListing($this->aliasListing[$id]['parent']);
                    $this->aliasListing[$id]['path'] = $tmp['path'] . (($tmp['parent']>0) ? '/' : '') .$tmp['alias'];
                }
avatar
Также, соответственно, урлы формируются без учета птички «участвует в формировании URL», т.е. этот параметр игнорируется.
Это касается только для конечных ресурсов и опять же связано со спецификой формирования пути в новой функции getAliasListing, которая просто берет путь к родителю и прибавляет к нему алиас. Но если у родителя стоит птичка, что он не участвует в урл, то путь к нему все равно содержит этот его алиас, а при переходе к дочернему он должен дополнительно проверяться и откидываться (чего не происходит).
Когда имеем дело с папками (т.е. внесенными в массив aliasListing) то все работает корректно, т.к. путь в массиве содержится сразу правильный.

В общем дело опять в этой строчке

$this->aliasListing[$id]['path'] = $tmp['path'] . (($tmp['parent']>0) ? '/' : '') .$tmp['alias'];


она должна:
— проверять используются ли вложенные урлы и если нет, то просто не дописывать в начало $tmp['path']
— проверять, участвует ли $tmp['id'] в формировании урл, и если нет, то отбрасывать его алиас из $tmp['path']
Комментарий отредактирован 2014-06-12 13:15:31 пользователем webber
avatar
надо поправить но тут еще вариант у нас может быть не 1 папка а несколько
поесть каталог/раздел/подраздел
по логике первые 2 и сейчас должны без проблем работать
но вот подраздел выключать нельзя

тут дело не совсем в одной строке так как надо еще править поиск документа в базе
avatar
По логике должна, но на конечных документах не всегда работает — если отключить участие в УРЛ у какого-нибудь корневого раздела, то приписывает лишний слэш в самое начало к корню сайта, т.к. $tmp['path'] пустой, но при этом и $tmp['parent']>0. В общем надо бы дополнительно проверять как минимум:

<code>(($tmp['parent']>0 && $tmp['path'] != '') ? '/' : '')</code>
Хотя это тоже не очень помогает, т.к. все равно в итоге идет на страницу ошибки (хотя по идее адрес правильный)

В общем проблема тут в новой функции getIdFromAlias — которая подразумевает, что если у нас алиас без слэша, то автоматически это дочерний от корня (parent=0). Но если у нас снята у корневого раздела птичка «участвует в урл» — то соответственно у нас не будет ни одного подходящего ресурса под условия функции getIdFromAlias и она отправит нас на ошибку.
Комментарий отредактирован 2014-06-12 13:49:09 пользователем webber
avatar
Не прошло и года…

По сабжу — это решение еще больше загоняет ситуацию в тупик. И я против внедрения такой галочки в офф. версию, т.к. вместо того, чтобы решить задачу раз и навсегда, в ядро регулярно внедряются полумеры чтобы на какое-то время поставить маркер «проблема решена». При этом сам код ядра все больше и больше разнится от форков, тем самым лишая нас возможности в час Х отказаться от Evo в пользу какого-нибудь клиппера.

А решение это я называю полумерой, т.к. оно как и любое другое подходит не для всех сайтов. Не берусь аргументировано защищать остальные, но вот за CustomEvo я знаю — способен работать действительно на любых объемах. В то время, как предлагаемая в топике «галочка» спасет лишь сайты с малым числом каталогов.
В одном случае получаем полное решение проблемы, а в другом — частичное. При этом как в одном, так и в другом случае требуются доработки и тесты. Но как говорится хозяин — барин.

Удачи в тестах!
Комментарий отредактирован 2014-06-12 17:20:14 пользователем Agel_Nash
avatar
Я считаю что делать большой проект на EVO тяжело ибо нет разделения на ветки
приходиться почти все делать на боевом сайте а при большом потоке посетителей это очень и очень плохо.
Твое решение так же есть полумер ибо убивает часть полезного функционала, собственно изначально делал на базе него но пришлось отказаться.

В одном твоем проекте где в дереве 608341 документов из них папок всего 13304(для моего решения это критично)

при этом мы обоюдно пришли к выводу что такой проект на MODX в целом делать не целесообразно, проще было поднять сразу на Laravel.

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

Все что уже есть в моей сборке в версии 1.1 я опишу задачками в офa версию и пусть команда(а не только я) решает надо ли это там или нет.
avatar
делать большой проект на EVO тяжело ибо нет разделения на ветки
приходиться почти все делать на боевом сайте
Это относится не только к Evo, а MODX у в целом. Хотя при желании это разделение реализовывается за счет хранения всех элементов в файлах. Но к теме сабжа это не относится.

Твое решение так же есть полумер ибо убивает часть полезного функционала
Например? Сохранение старых урлов при перемещении документов? Проблема решаема. Работа Wayfinder и Ditto? При желании проблема так же решаема, если лень разбираться с DocLister.

Изначально делал на базе него но пришлось отказаться.
Уведомил бы раньше, я бы залил обновленную версию на GitHub. О проблемах с той версии, что выложена в паблик — я знаю. Многие из них решены на боевом сайте, где используется CustomEvo, но обновление не выкладывается из-за нехватки времени.

при этом мы обоюдно пришли к выводу что такой проект на MODX в целом делать не целесообразно, проще было поднять сразу на Laravel.
В идеале — да. Но сам же знаешь, дерево MODX было идеально для решения задачи поставленной на сайте. Более того, на данный момент все комфортно работает и на MODX. А главное, для разработки ничего сверх естественного не потребовалось.
— DocLister
— LoadElement зашитый в ядро CustomEvo
— eForm
— несколько сниппетов для реализации корзины и небольшой JS (уже обсуждали, что сделать подобное не так сложно)
— Регистрация и авторизация пользователей на базе MODxAPI

Т.е. да, делая на Laravel — я бы для авторизации, регистрации, создания и валидации формы использовал бы штатные средства. В случае с Evo — у меня есть свои заготовки на базе которых получилось собрать сайт довольно правильно с точки зрения MVC. И мой подход кажется диким только тем, кто плотно сидит на phx или сниппетах типа if. Хотя после того, как я сделал несколько проектов на laravel — мне вообще любой код с $modx-> кажется диким.

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

Все что уже есть в моей сборке в версии 1.1 я опишу задачками в офa версию и пусть команда(а не только я) решает надо ли это там или нет.
Ну тогда я пошел за попкорном. 4 релиз подряд с фейлами будет сказочно интересным…
avatar
решение опциональное по умолчанию выключенно. А фэйлы в последних релизах не в моих дополнениях, но по моему недосмотру
avatar
Дмитрий, Неш, может быть объединить усилия для написания качественного продукта, а не полумер? Ладно суть вопроса не в этом и не в том что-бы разводить холивары.
По теме. Проект 12000 документов в дереве. Без галочки потребление памяти 40.75мб, PHP: 0,33s, после галочки памяти 8-9 мб, PHP: 0,1646 s, увеличилось количество запросов к базе, было 23, стало 50. Да и остается вопрос с вложенностью урлов, если включена вложенность, то все ок, если выключена, то есть проблемы. Структура каталога — каталог/раздел/категория/под категория/товар, так вот товар как раз и не видит, весь остальной путь каталог/раздел/категория/под категория/ работает нормально, то есть если вложенность меньше то должно корректно отрабатывать, не проверял пока.
avatar
И опять вопрос по вложенным урл. Документы которые находятся в корне сайта и не являются папками тоже не отрабатываются при выключенной вложенности.
avatar
Оно в принципе не работает при отключении вложенности урл-ов на данный момент :)
Насчет «видимости дерева предков» — смотрите тут
avatar
Это должно работать, исправлял

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

А проблема без вложенных урлов в том, что там вообще в самом начале стоит проверка if ($this->config['use_alias_path'] == '1') { — и все эти действия происходят только при вложенных урлах.
avatar
Дубль
Комментарий отредактирован 2014-06-13 12:17:44 пользователем proud
avatar
Кстати насчет производительности. Ради интереса загнал в базу 329,974 товаров.
Выводим список в категории (50 000 штук), вывод постраничный по 10 штук (используется DocLister плюс Wayfinder в один уровень).

<!--  Mem : 6 mb, MySQL: 1.7969 s, 47 request(s), PHP: 0.2188 s, total: 2.0156 s, document from database. -->
<!--  Mem : 2 mb, MySQL: 0.0156 s, 0 request(s), PHP: 0.0156 s, total: 0.0312 s, document from cache. -->


Так что по производительности что это решение, что custom.evo — можно сказать идентичные.
Но в текущем решении удалось решить еще как минимум две задачи, которые остались в неоконченной стадии для custom.evo — это проблема с переносом ветки и проблема с переименованием родителя (а еще страшнее — дедушки или прадедушки) :)))
Т.е. в этом плане конечно отстутствие хранящихся в базе конечных url-ов делают нам жизнь значительно проще.
Ну или например желание заказчика резко изменить суффикс с html на, например, слэш — в текущем решении для этого не нужно опять лопатить базу с сотнями тысяч записей (еще вопрос — выдержит ли хостинг подобный запрос на переименование).

Остались же нерешенными что в одной что во второй версии также одинаковые проблемы:
— учет «участвует в УРЛ»
— не использование вложенных урлов

Поэтому, как говорится, правильной дорогой идем товарищи :)))) Еще пару лет — и появится законченное решение проблемы «кэша модха» ))))
Комментарий отредактирован 2014-06-13 14:31:53 пользователем webber
avatar
Поэтому, как говорится, правильной дорогой идем товарищи :)))) Еще пару лет — и появится законченное решение проблемы «кэша модха» ))))
Главное не отказываться от поддержки php 5.2, чтобы движок уж точно работал всегда и везде.
avatar
Я в своих проектах из карты алиасов исключаю документы с определенным шаблоном.
Например, если это каталог товаров, то исключаю товары из карты, оставляя только разделы каталога и информационные страницы, чтобы корректно выстраивалось меню ч/з Wayfinder.
В таблице шаблонов добавляю параметр, включать или нет документы с этим шаблонов в карту.
+ в последних версиях evo сделал примерно изменения из топика, чтобы не перекидывало на 404 в случае отсутствия алиаса в карте при рендеринге соответствующей страницы.

P. S. Сложно объяснить заказчику, что если тот хочет чтобы меню строилось правильно, ему нужно не забывать указать, что создаваемый пункт для меню должен быть контейнером, а если в шаблоне все указано, все будет рендерится без дополнительного рукоприкладства.
avatar
Так это решается через параметр where в Wayfinder
к примеру where=`isfolder=1`
avatar
where=`sc.isfolder=1`, надо в документацию добавить
avatar
Согласен, а то я всю жизнь пишу excludeDocs=`SELECT id FROM modx_site_content WHERE isfolder=0` если надо чтоб было where=`isfolder=1` ))))
avatar
Не о том, Дмитрий. Пример: набор информационных страниц с крайними листочками — с isfolder = 0 по умолчанию. Но эти страницы, чтобы они в итоге попали в меню и в карту алиасов должны быть преобразованы вручную в контейнеры менеджером сайта, ибо могут быть просто вопросы «А нафига тогда чек галочки отображения в меню», потому что просто так без этих манипуляций они туда не попадут.
Можно конечно настроить MM для выставления isfolder в 1 по умолчанию для определенного ряда шаблонов, но это приводит меня к моему же решению по оставлению в карте кеша документов с определенным мной набором шаблонов.

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

А решение с исключением всех неконтейнеров неверно в силу здравого смысла работы менеджера сайта.

Таким образом я считаю, что необходимо задавать список исключения из карты на этапе создания именно шаблона документа.
1. Создаем или открываем на редактирование шаблон
2. в cache_sync.class.processor.php делаем вместо
if ($config['aliaslistingfolder'] == 1) {
            $rs = $modx->db->select('IF(alias=\'\', id, alias) AS alias, id, parent, isfolder', $modx->getFullTableName('site_content'), 'deleted=0 and isfolder=1', 'parent, menuindex');
        }else{
            $rs = $modx->db->select('IF(alias=\'\', id, alias) AS alias, id, parent, isfolder', $modx->getFullTableName('site_content'), 'deleted=0', 'parent, menuindex');
        }

следующее:
$sctable = $modx->getFullTableName('site_content');
		$tmpltable = $modx->getFullTableName('site_templates');
		$exclude_doc_templates = $modx->db->makeArray($modx->db->select("id"),$tmpltable,"excludecache=1");
		if(count($exclude_doc_templates) > 0){
			$extmpls = array();
			foreach($exclude_doc_templates as $edt){
				$extmpls[] = $edt['id'];
			}
			$rs = $modx->db->select('IF(alias=\'\', id, alias) AS alias, id, parent, isfolder', $sctable, 'deleted=0 and template NOT IN ('.implode(',',$extmpls).')', 'parent, menuindex');
		}else{
			$rs = $modx->db->select('IF(alias=\'\', id, alias) AS alias, id, parent, isfolder', $sctable, 'deleted=0', 'parent, menuindex');
		}
avatar
Ну и пора заменять Ditto на DocLister, если Евгений не против ))
avatar
Кто сказал что «не папки» туда не попадают в меню? Нормально там все попадает — без разницы папка или не папка.

п.с. Давайте уже не будем пользоваться непроверенными сведениями и пороть горячку со всякими написанными за три минуты кодами на основе непроверенных даных.
Комментарий отредактирован 2014-06-24 10:51:05 пользователем webber
avatar
В данном решении да, выведет все, но getChildIds уже порождает большее количество запросов в БД при работе Wayfinder.
То есть это решение неверно на мой взгляд с изменением данной фукнции.
avatar
Ну это сугубо ваш личный взгляд который к тому же ничем не подтвержден :)
Wayfinder-ом товары не выводят тысячами, level и условия вполне позволяют сделать все что нужно.

А статистику я приводил чуть выше — modx.im/blog/research/2294.html#comment21147
avatar
Я не против — заменяйте. Раньше я был против повального внедрения MODxAPI и DocLister в сборки/ядро, т.к. были планы по написанию вторых версий с оглядкой на старые проблемы и созданием более мощного API. Но от этой затеи я отказался, т.к.:
— На подобные решения нет особого спроса в MODX тем более Evo
— Текущие версии справляются со своими задачами
— В последнее время стало не очень интересно ковырять говнокод MODX, тем более на шару.
— До сих пор, мой отказ от поддержки php 5.2 многих отпугивает

Так что если кто-то считает, что DocLister способен вытеснить Ditto, то мне искренне приятно. И я постараюсь поддерживать код по мере поступления багрепортов на GitHub/свободного времени.
avatar
Я давно удалил Ditto и ставлю DocLister на все без исключения проекты, слежу за новостями по нему, поскольку он является универсальной заменой моим частным сниппетам вывода блоков информации.
Говнокода действительно очень много в самом движке и это тоже вызывает отвращение, когда даже в файлах движка не используется modx db api, который для него и создавался, но тяжелость revo меня коробит пока больше, хоть и сделан прорыв в UI в плане интеграции с extjs.
Комментарий отредактирован 2014-06-24 11:54:18 пользователем nvkuzmichev
avatar
В движке уже везде используется db api
прямые запросы все заменили хотя говнокода там еще хватает. В целом если хватает знаний и есть желания то можете помогать в развитии :)
avatar
Ок, я с радостью, да и часик свободного времени в день найду на полезное дело
avatar
Идеальным решением тут будет задание пользовательского callback аля замыкание. Но это не про modx
avatar
И как по мне, то карту не нужно искоренять при борьбе с проблемой кэширования. Она на самом деле делает полезное дело, если в этом массиве не хранить полчище документов, а только нужные для построения меню, хлебных крошек и создания сниппетов с получением id парентов например, что полезно для каталогов и т.п.
avatar
Ребята, какое-нибудь из решений (4 по ссылкам или это) было внедрено в официальную сборку Дмитрия?
avatar
ВОт тут есть текущий вариант — работает стабильно :)
avatar
Спасибо. Но как я поняла, текущий вариант этой статьи только для вложенных урлов :(, а сеошники на это ругаются (
avatar
Нет, этот вариант работает уже и для невложенных урл-ов (хотя сеошники, которые ругаются на вложенные урлы мне кажутся крайне подозрительными, не встречал еще таких) :)))))
Единственное, с чем этот вариант вроде как не работает до сих пор — это с «участвует в url» — т.е. со случаями, когда какая-то папка исключается из url (но надо это далеко не всегда, вернее раньше вообще этого не было и никому не надо было ))).
avatar
Спасибо за подробный ответ, теперь ясно))
avatar
Установила версию с гитхаба. В один момент при редактировании контента вылезла ошибка в mm.inc.php в строке 317. Отключила и включила MM — всё починилось.
Комментарий отредактирован 2014-10-13 16:04:23 пользователем Jassie
avatar
А данное решение не внедрено в последнюю сборку на данный момент?
avatar
Давным давно уже включено...
github.com/dmi3yy/modx.evo.custom/tree/develop
В конфигурации включите AliasListing для папок и все.
avatar
спасибо, а то что-то запутался:)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.