/ClosureTable

Closure Table database design pattern implementation for MODX Evolution

Primary LanguagePHPGNU General Public License v2.0GPL-2.0

Closure Table for MODX Evolution

На данный момент, плагин полностью готов к работе только на сборке Дмитрия версии не ниже 1.1b-d7.1

Чтобы детальней понять суть данного компонента советую ознакомиться со следующим материалом:

Примеры SQL запросов

Получение всех дочерних документов относительно записи с ID 666
SELECT `c`.`id`, `c`.`pagetitle`, `t`.`descendant`, `t`.`depth` 
FROM `modx_site_content` as `c`
JOIN `modx_site_content_tree` as `t` ON `c`.`id` = `t`.`descendant`
WHERE `t`.`ancestor` = 666 AND `t`.`depth` > 0
ORDER BY `t`.`depth` ASC, `c`.`menuindex` ASC
Получение всего стека родительсих документов для записи с ID 666
SELECT `c`.`id`, `c`.`pagetitle`, `t`.`descendant`, `t`.`depth` 
FROM `modx_site_content` as `c`
JOIN `modx_site_content_tree` as `t` ON `c`.`id` = `t`.`ancestor`
WHERE `t`.`descendant` = 666 AND `t`.`depth` > 0
ORDER BY `t`.`depth` DESC

Преимущества

  • Нет жесткой привязки к массиву aliasListing в отличии от UltimateParent
  • Возможность получения 1 SQL запросом всего дерева дочерних ресурсов без цепочки запросов в стиле
SELECT `id` FROM `modx_site_content` WHERE `parent` IN(
    SELECT `id` FROM `modx_site_content` WHERE `parent` IN (
        SELECT `id` FROM `modx_site_content` WHERE `parent` IN (
            ....
        )
    )
)

Установка

После установки плагина ClosureTable, необходимо переиндексировать дерево для уже существующих документов. Чтобы это сделать, нужно пересохранить каждый имеющийся документ в дереве. Если установка плагина выполнялась на чистый MODX, а в дереве не так много документов, то выполнить процедуру пересохранения можно и руками. В противном же случае потребуется установить MODxAPI из репозитория DocLister. После чего воспользоваться следующим кодом:

include_once(MODX_BASE_PATH.'assets/lib/MODxAPI/modResource.php');
$DocObj = new modResource($modx);

$q = $modx->db->query("SELECT id FROM ".$modx->getFullTableName('site_content'));
while($row = $modx->db->getRow($q)){
    $DocObj->edit($row['id'])->save(true, true);
}

Автор


Борисов Евгений
Agel Nash

http://agel-nash.ru

ICQ: 8608196
Skype: agel.nash
Email: modx@agel-nash.ru

Реквизиты для доната



WMZ: Z762708026453
WMR: R203864025267
PayPal: agel_nash@xaker.ru