Niecachowane Ditto z paginacją w cachowanym dokumencie

Jak otrzymać cachowany dokument oraz niecachowane Ditto z paginacją w MODX Evo.

Psst: od wydania MODX Evolution 1.0.12 możliwe jest cachowanie na podstawie parametrów $_GET. Wystarczy włączyć tą opcję w konfiguracji systemu. W związku z tym, poniższa metoda działa, ale nie jest już jedynym rozwiązaniem. Polecam włączenie nowej opcji ponieważ pozwala na cachowanie zarówno dokumentu jak i snippeta.

Chcąc otrzymać Ditto z paginacją w dokumencie z włączonym cachowaniem natrafimy na pewien problem Otóż kiedy mamy cachowany dokument a w nim niecachowane wywołanie Ditto, placeholdery z paginacją nie działają ponieważ są umieszczone poza wywołaniem Ditto. Dlatego właśnie w typowym scenariuszu musimy mieć cały dokument niecachowany - w przypadku gdy wywołujemy Ditto poprzez standardową składnię odpalania snippeta w MODX Evo. Wyłączenie cachowania całego dokumentu nie jest zbyt wydajne ponieważ przy każdym wyświetleniu jest on od nowa przetwarzany.

Społeczność MODX stworzyła nawet osobny snippet aby rozwiązać ten problem. Jak się okazuje niepotrzebnie ponieważ istnieje jego natywne i proste rozwiązanie.

Niestandardowe wywołanie snippeta

Sposób na działające niecachowane Ditto z paginacją w cachowanym dokumencie jest całkiem prosty. Wystarczy wywołać Ditto inaczej niż przez standardowe [ ! Ditto?... ! ] Jak to osiągnąć? Poprzez "surowe" wywołanie snippeta przy pomocy API MODX, które wygląda tak: $modx->runSnippet('Ditto',$params); Pozostało jedynie stworzyć snippet z tą metodą.

Snippet z Ditto

Nasz snippet (nazwijmy go "run_ditto_articles"), który uruchomi Ditto, powinien posiadać wewnątrz parametry oraz placeholdery Ditto. W zawarciu w nim placeholderów tkwi cały sęk. Snippet będzie wyglądać mniej więcej tak:

<?php
$params['parents']='5';
$params['display']='10';
$params['tpl']='ditto-listing';
$params['tplPaginatePage']='@CODE: <a href="[ + url + ]">[ + page + ]</a> ';
$params['orderBy']='pub_date DESC';
$params['paginate']='1';
$params['paginateAlwaysShowLinks']='1';

$output = $modx->runSnippet('Ditto',$params);
$output .= '<p>Items: [ + total + ] Page: [ + pages + ]</p>';

return $output;
?>

Wszystkie typowe parametry Ditto zamieszczamy w tablicy $params. Następnie nasz snippet wrzucamy w docelowe miejsce na stronie: [ ! run_ditto_articles ! ]

Od tej pory możemy cieszyć się Ditto z działającą paginacją oraz cachowanym dokumentem. Możemy nawet dodać trochę dynamiki do naszego małego snippeta poprzez dodanie parametrów [ ! run_ditto_articles? &parents=`[ * id * ]` ! ] i zmianę w nim $params['parents']='5'; na $params['parents']=$parents; Teraz Ditto zawsze będzie wyświetlać poddokumenty aktualnego dokumentu. Możliwości jest naprawdę dużo.

Proste prawda? Z uwagi na wysoką plastyczność, jest to w moim przekonaniu najlepszy sposób na wywoływanie snippetów.

Tags: ditto, evo, kod, modx, snippet