През ауспуха
На любимия drupal винаги може да се разчита, когато те обземе перверзното желание да постигнеш сравнително прост резултат по най-завъртяния възможен начин.
В случая целта на упражнението е да покажем даден node само със съдържанието си (без sidebar-ове, header и прочие) в доста актуалния понастоящем colorbox.
Да, действително че оригиналният lightbox предлага тази функционалност и то съвсем автоматизирано, само че ние искаме да сме модерни и да използваме един и същи бокс в целия сайт, а colorbox разчита тежко на jquery и съответно е малък като килобайти, освен това се разбира добре с insert, така че colorbox it is.
Първата стъпка е орязването на page template за съответния node. Тъй като става дума за единичен такъв, а не цял node тип, в template.php добавяме следната функция:
<span style="color: #000000;"><span style="color: #0000bb;"><?php<br></span><span style="color: #007700;">function </span><span style="color: #0000bb;">phptemplate_preprocess_page</span><span style="color: #007700;">(&</span><span style="color: #0000bb;">$vars</span><span style="color: #007700;">) {<br> if ( isset(</span><span style="color: #0000bb;">$_GET</span><span style="color: #007700;">[</span><span style="color: #dd0000;">'ajax'</span><span style="color: #007700;">]) && </span><span style="color: #0000bb;">$_GET</span><span style="color: #007700;">[</span><span style="color: #dd0000;">'ajax'</span><span style="color: #007700;">] == </span><span style="color: #0000bb;">1 </span><span style="color: #007700;">) {<br> </span><span style="color: #0000bb;">$vars</span><span style="color: #007700;">[</span><span style="color: #dd0000;">'template_file'</span><span style="color: #007700;">] = </span><span style="color: #dd0000;">'page-ajax'</span><span style="color: #007700;">;<br> }<br>}<br></span><span style="color: #0000bb;">?></span></span>
След което създаваме page-ajax.tpl.php, от който се изчистват всички ненужни подробности.
По този начин при добавяне на аргумент в url-то към който и да е node, друпал автоматично зарежда орязания page template.
Дотук добре, но неотменна част от почти всяка drupal инсталация в момента е толкова полезното admin menu, без което вече не можем, а не бихме искали да се появява втори път в colorbox прозореца, когато сме логнати в сайта.
Самият модул admin menu предлага чудесна функция за потискане и тя е:
<span style="color: #000000;"><span style="color: #0000bb;"><?php<br></span></span>
<span style="color: #000000;"><span style="color: #007700;">module_invoke</span></span>
<span style="color: #000000;"><span style="color: #007700;">(</span><span style="color: #dd0000;">'admin_menu'</span><span style="color: #007700;">, </span><span style="color: #dd0000;">'suppress'</span><span style="color: #007700;">);<br></span><span style="color: #0000bb;">?></span></span>
Но проблемът е, че за да проработи, трябва да се извика в много ранен етап от композирането на заявката (т.е. където и да е в template-ите няма как да стане).
Лошото е, че функцията preprocess_page в template.php също няма как да помогне, тъй като в настоящата stable версия на admin menu пускането му се извършва някъде след изпълняването на preprocess-а.
Твърди се, че в последните dev версии това е поправено, но внушителният им списък с бъгове, съвсем гордо окачен на drupal.org ме кара скромно да пропусна експериментите с тях.
Така че не съвсем елегантното решение на проблема е въпросната suppress функция да се извика от някой модул, за да може да се изпълни навреме и да си свърши работата.
За целта създаваме къстъм модул, който естествено се казва Kur и включва в себе си един прост if, който проверява дали имаме аргумент ajax=1 и затваря менюто.
Модулът се качва в директория "kur" и включва два файла:
1. kur.info, в който се описва стилистично и литературно, за да може друпал да го разпознае:
<span style="color: #000000;"><span style="color: #0000bb;">; $Id: kur.info $<br>name = Kur<br>description = "Kura mi yanko."<br>core = 6.x</span><span style="color: #0000bb;"><br></span></span>
2. kur.module, в който е самият код:
<span style="color: #000000;"><span style="color: #0000bb;"><?php<br>// $Id: kur.module,v 1.1.2.1 2009/10/03 16:30:07 rfay Exp $<br><br>/**<br> * @file<br> * Kura mi yanko<br> *<br> */<br><br></span></span>
<span style="color: #000000;"><span style="color: #007700;">function </span></span>
<span style="color: #000000;"><span style="color: #0000bb;">kur_init() {<br> </span></span>
<span style="color: #000000;"><span style="color: #007700;">if ( isset(</span><span style="color: #0000bb;">$_GET</span><span style="color: #007700;">[</span><span style="color: #dd0000;">'ajax'</span><span style="color: #007700;">]) && </span><span style="color: #0000bb;">$_GET</span><span style="color: #007700;">[</span><span style="color: #dd0000;">'ajax'</span><span style="color: #007700;">] == </span><span style="color: #0000bb;">1 </span><span style="color: #007700;">)</span></span>
<span style="color: #000000;"><span style="color: #0000bb;"> </span></span>
<span style="color: #000000;"><span style="color: #007700;">module_invoke</span></span>
<span style="color: #000000;"><span style="color: #007700;">(</span><span style="color: #dd0000;">'admin_menu'</span><span style="color: #007700;">, </span><span style="color: #dd0000;">'suppress'</span><span style="color: #007700;">);</span></span>
<span style="color: #000000;"><span style="color: #0000bb;"><br>}</span></span>
Като е важно <?php тагът да не се затваря, защото така било трябвало при модулите.
При коректно създаден kur.info, новосъздаденото творение би трябвало да се покаже в списъка с модули на drupal, а оттам нататък пускането му е ясно на всички, допускам.
Последната стъпка представлява включване на опцията за зареждане на съдържание в colorbox, която по подразбиране е изключена:
admin menu -> site configuration -> colorbox -> load in colorbox -> enable colorbox load
И най-накрая, вече можем гордо да отворим най-накрая прословутия орязан node като към url-то му добавим следните аргументи:
?width=XXX&height=XXX&iframe=true&scrolling=false&ajax=1
и му приложим CSS клас "colorox-load".
Сигурно можеше да стане и по още по-сложен начин, но поне за момента не се сещам как.
Дано на някой да му свърши работа.
Comments
Коментар от Николай Цветков на Permalink
:huh: Имаш една съществена грешка. Yanko се пише с главна буква. Все пак е собствено име.
Коментар от Victor на Permalink
Най-искрено се извинявам за проявената небрежност към този толкова сакрален за всички компютърджии тестов стринг. :D