През ауспуха

На любимия 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;">&lt;?php<br></span><span style="color: #007700;">function </span><span style="color: #0000bb;">phptemplate_preprocess_page</span><span style="color: #007700;">(&amp;</span><span style="color: #0000bb;">$vars</span><span style="color: #007700;">) {<br>&nbsp; if ( isset(</span><span style="color: #0000bb;">$_GET</span><span style="color: #007700;">[</span><span style="color: #dd0000;">'ajax'</span><span style="color: #007700;">]) &amp;&amp; </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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </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>&nbsp; }<br>}<br></span><span style="color: #0000bb;">?&gt;</span></span>

След което създаваме page-ajax.tpl.php, от който се изчистват всички ненужни подробности.

По този начин при добавяне на аргумент в url-то към който и да е node, друпал автоматично зарежда орязания page template.

Дотук добре, но неотменна част от почти всяка drupal инсталация в момента е толкова полезното admin menu, без което вече не можем, а не бихме искали да се появява втори път в colorbox прозореца, когато сме логнати в сайта.

Самият модул admin menu предлага чудесна функция за потискане и тя е:

<span style="color: #000000;"><span style="color: #0000bb;">&lt;?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;">?&gt;</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;">&lt;?php<br>// $Id: kur.module,v 1.1.2.1 2009/10/03 16:30:07 rfay Exp $<br><br>/**<br>&nbsp;* @file<br>&nbsp;* Kura mi yanko<br>&nbsp;*<br>&nbsp;*/<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>&nbsp; </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;">]) &amp;&amp; </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;">&nbsp;&nbsp;&nbsp; </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

:huh: Имаш една съществена грешка. Yanko се пише с главна буква. Все пак е собствено име.

Най-искрено се извинявам за проявената небрежност към този толкова сакрален за всички компютърджии тестов стринг. :D