Jak na sekce webu v Drupalu
Toto je komentovaný komentář :-) ke stejnojmenné prezentaci na pražském Drupal setkání 18. listopadu 2009
Zahrnuje možnosti řešení, jednotlivé výhody a nevýhody, ale i otevřené otázky.
Platí pro Drupal 6.x.
Do textu jsou zapracované podněty z diskuse na setkání. Vaše další nápady a zkušenosti jsou vřele vítány (není to tutoriál, ale stále a hlavně námět k diskusi).
Multisite
V tomto případě řešíme problém: jak propojit a sdílet, co je třeba (například uživatele, obsah, vyhledávání apod.).
Sdílení uživatelů:
Lze vyřešit sdílením odpovídajících tabulek v databázi. Není to ovšem tak triviální, jak jsem se zpočátku domnívala. Například pokus sdílet tabulku permissions podle mých zkušeností vede ke komplikacím, pokud se oba weby liší třeba jen v typech obsahu. Dalším problémem je, že uživatel přihlášený na jednom webu se musí znovu přihlašovat při prokliku na druhý web (byť stejným loginem a heslem), a to i při sdílení tabulky sessions.
Společné vyhledávání:
Docela dobře řeší vyhledávání Google (v Drupalu modul Google CSE). Nevýhodou je zobrazování reklam (za vyhledávání bez reklam se musí platit, výjimkou jsou weby univerzit a neziskových organizací) a komplikovanější stylování výstupu (pokud zobrazíme na stránce samotného webu, je to iframe, druhou možností je zobrazovat výsledky přímo na Googlu).
Prohledávání několika (i nezávislých) webů by měl zajistit i modul Multisite Search, ale je otázkou, nakolik spolehlivě funguje (např. mně nefunguje vůbec). Slibné řešení by mohl skýtat vývoj v oblasti Apache Solr a příbuzných modulů, ale „nic hotového“ jsem zatím neobjevila.
Sdílení obsahu:
Fungující sdílení tabulek týkajících se obsahu si nedovedu dost dobře představit (co například přidání nového typu obsahu, nového CCK pole?). Zajímavý je ale příklad vícejazyčné multisite se sdílením všech tabulek kromě languages (viz prezentace Marka Sotáka na Drupal setkání).
Z dalších možností sdílení obsahu se na bízí RSS (omezené možnosti, ale proč ne, pokud to vyhovuje zadání webu…) a konečně modul Embed widgets (umožní vložit část jiného webu, např. konkrétní display jednoho view, jako iframe, nabízí i překlikávání pomocí tabů).
Podobně komplikovaný (až téměř nemožný) je společný odběr novinek (formou subskripce) z různých částí webu, což ovšem může být častý požadavek.
Z diskuse vyplynulo, že multisite se pro tvorbu jednotlivých sekcí webu hodí spíš výjimečně. Naopak je to ideální řešení pro efektivní společnou správu různých webů (např. více nezávislých webů jedné společnosti).
Jeden web
Install.php běží pouze 1×. Výchozím stavem je „sdílení všeho“, při tvorbě sekcí řešíme problém, jak odlišit, co je třeba (vzhled, přístupová práva, apod.).
Následuje přehled dostupných „hotových“ řešení (modulů a jejich kombinací). Snažím se srovnat:
- nakolik umožňují odlišit vzhled sekce (např. CSS soubor versus celé téma vzhledu);
- na základě jakého principu se dá určit, že sekce má mít odlišný vzhled (cesta, typ obsahu apod.);
- další možnosti a zvláštnosti.
Page theme
Odlišení vzhledu: téma
Princip odlišení sekce: cesta (například: sekce*)
Velmi jednoduchý a podle mé zkušenosti dobře fungující modul (i když rc2), můj favorit pro jednoduchá řešení. Velmi efektivní může být například v kombinaci s Taxonomy (princip přiřazení obsahu do jednotlivých sekcí). Nastavení URL aliasu v závislosti na termpath (Pathauto) pak vyřeší správnou cestu, přístup k jednotlivým sekcím lze snadno ošetřit modulem Taxonomy Access.
Context
Odlišení vzhledu: zatím pouze možnost zadat theme variables, což se projeví v tpl.php souboru. Modul Context Theme (= výběr tématu na základě contextu) je ve vývoji, který se trošku zasekl na tomto problému: http://drupal.org/node/559410.
Modul Context je jinak dost silný nástroj na tvorbu sekcí, na základě definovaných podmínek (typ obsahu, cesta, zobrazení určitého view, pozice v menu, kde se právě nacházíme) umožňuje definovat reakce (vypnutí regionů a naopak aktivace vypnutých bloků, definování položky v menu, která má být v daném kontextu trvale aktivní – zejména tato funkce je dost žádaná).
Osobně uvažuji o využití Contextu v kombinaci s výše zmíněným modulem Page theme (Context pro lepší „zorganizování“ obsahu v jednotlivých sekcích – tedy vlastně pro vytvoření podsekcí, uff :-)), a to i v kombinaci s Taxonomy. Bohužel Context zatím s taxonomy neumí pracovat, existuje však neoficiální modul, který to umí zařídit (testovala jsem, funguje), takže taxonomické kategorie se pak objeví jako podmínky, na základě nichž se context definuje. Modul si můžete napsat podle citovaného návodu, nebo na dané adrese celý stáhnout: Computerminds.co.uk: Extending the drupal context module to allow conditional contexts based on taxonomy terms: http://www.computerminds.co.uk/…xonomy-terms.
Spaces
Modul je jakousi nadstavbou nad modulem Context a měl by zdokonalit jeho možnosti. Bohužel, nějak se mi s ním nějak nedaří, ostatně, není zatím určen pro weby v ostrém provozu :-(
Custom Page
Odlišení vzhledu: theme funkce, tpl.php
Princip odlišení sekce: cesta
Lze kombinovat s výše zmíněným modulem Context (Custom Page se pak objeví jako jedna z podmínek v nastavení contextu).
Virtual Sites
Odlišení vzhledu: téma, CSS, javascript, přetížení jakýchkoli proměnných Drupalu
Princip odlišení sekce: cesta, doména 3. nebo 2. řádu, PHP kód
Nastavení pro doménu 3. nebo 2. řádu se mi nepodařilo zprovoznit (nebo možná pochopit?). Jinak se mi ale modul moc líbí. Nabízí velmi komplexní řešení s minimálními požadavky na konfiguraci a znalosti. Je zcela výjimečný tím, že kromě výběru tématu umožňuje pro sekci nastavit také jiný zdroj primárních a sekundárních odkazů, informace o webu (název, slogan…), jazyk a base url.
Bohužel, modul už se delší dobu nevyvíjí a hledá se nový maintainer (i když na stránce modulu tato informace pravděpodobně zatím není). S požehnáním autora modulu tímto inzeruji, že pokud by se toho někdo chtěl ujmout, byl by velmi vítán; kontaktní formulář viz http://drupal.org/user/46354.
Diskuse (Andrew Burcin): podobná velmi komplexní řešení (s možností jednoduchého nastavení „naklikáním“ = zásah do databáze) se mohou ukázat naopak jako nevýhoda v případě, kdy k už běžícímu webu s větším provozem potřebujeme přidat další sekci (vezměme v úvahu, že v testovacím prostředí probíhá vývoj a testování nové sekce, ale na běžícím webu se kontinuálně přidává obsah). Pro velké projekty je paradoxně lepší hledat co nejjednodušší řešení.
Domain Access
Velký komplex modulů s řadou možností a jistě velkou budoucností. Pro mě s tou nevýhodou, že s ním zatím neumím zacházet :-(
Odlišení vzhledu: téma (modul Domain Theme – součást balíku)
Princip odlišení sekce: výběr sekce (domény), která může mít tvar sekce.domena.cz, sekcedomena.cz, ale například třeba domena.cz:3000.
V rámci nastavení modulu je také možné přímo odlišit přístup k jednotlivým sekcím (jak ostatně napovídá název modulu – Domain Access). Zajímavé je, že jeden uzel může bez problémů existovat ve více sekcích zároveň (při vytváření se nastaví, ve kterých se má zobrazit), což u ostatních řešení není vždy samozřejmostí. Je-li třeba, modul umí vytvořit i tabulky databáze s prefixy.
Sections
Odlišení vzhledu: téma (podle popisu modulu možnost nastavit i CSS a template, ale v administraci se mi takovou možnost nepodařilo najít).
Princip odlišení sekce: cesta, role, PHP kód
Od podobných modulů se liší právě možností pohodlně vytvořit sekce na základě rolí.
Role Theme Switcher
Další modul, který umožňuje vybrat téma na základě role (ale narozdíl od předešlého bez dalších možností výběru).
Pro jednoduché odlišení např. klientské sekce webu může bohatě stačit.
Subsites
Odlišení vzhledu: téma, CSS
Princip odlišení sekce: cesta a/nebo výběr konkrétních uzlů
Modul nabízí také možnost vytvořit zvláštní menu jen pro danou sekci (nespatřuji v tom ovšem žádnou zvláštní výhodu, běžné nastavení bloků funguje podle mě stejně dobře).
Node Page Template
Odlišení vzhledu: tpl.php soubor
Princip odlišení sekce: výběr typů obsahu a/nebo konkrétních uzlů
Node Type Theme
Odlišení vzhledu: téma
Princip odlišení sekce: typ obsahu
ThemeKey
Odlišení vzhledu: téma
Princip odlišení sekce: cesta, typ obsahu, termín taxonomy, jazyk
Poměrně komplexní řešení, oproti podobným modulům je zajímavá možnost odlišit sekci na základě taxonomické kategorie (přímo konfiguračně, bez nutné souvislosti s nastavením cesty) a na základě jazyka.
Modul byl bohužel delší dobu neudržovaný (já jsem ho např. testovala v minulosti 2× a nikdy nefungoval úplně dobře), ale teď má nového maintainera, který na něm zjevně intenzivně pracuje a většinu zásadních problémů už se podařilo vyřešit (soudě podle issues a „todo-listu“ na stránce projektu).
K modulu bude prezentace na DrupalCamp Vienna 09, bude se však týkat především vývoje pro 7.x verzi (nicméně, i to svědčí o tom, že modul má budoucnost).
Následuje ještě několik méně komplexních (a mnou méně prozkoumaných) řešení, která ovšem mohou pro jednodušší požadavky plně vyhovovat:
CSS Injector: umožňuje načtení CSS v závislosti na určitých podmínkách
Blog Theme: uživatel si může definovat téma pro svůj blog
Skinr: umožňuje definovat a použít CSS styl v závislosti na konfiguraci bloků, typech obsahu, dále pro různé Panels a Views displays
Logo Tool (dev) – různé logo pro různé stránky. Podle zkušeností (marinex) má určitý problém s cachováním obrázků. Řekněme, že na stránce A je logo1.png a na stránce B je logo2.png. Pokud se uživatel ze stránky A přenese na stránku B a použije tlačítko browseru ZPĚT (aby se dostal na stránku A), zůstane nacachované logo ze stránky B. Je to pravděpodobně způsobené souborem logo.php, který je nutné při instalaci nakopírovat do kořene webu a používá se právě ke generování loga (resp. on „podstrkuje“ loga browseru). A protože prohlížeč místo logo1.png a logo2.png vidí logo.php, nedokáže loga rozlišit. Když totiž zkusíme zobrazit „vlastnosti obrázku“ loga, pak adresa zdroje je http://www.neco.cz/logo.php.
Path image: umožňuje vytvořit blok s variantami obrázku, jejichž použití se liší pro různé stránky (cesty).
Region Visibility: nastavení viditelnosti regionů podle rolí nebo cest.
Header image: (pro D6 dev, doporučil mysak, testuje zatím k plné spokojenosti): umožňuje v jednotlivých sekcích měnit obrázek v hlavičce webu. Použití hlavičky se může řídit podle id uzlu, cesty, taxonomické kategorie, typu obsahu, knihy (book) nebo vlastního PHP snippetu. Jednotlivé podmínky lze přitom kombinovat a každý obrázek může mít jiné. Každý použitý obrázek odpovídá 1 uzlu, který může mít i text (lze zobrazit jako teaser a použít pro název nebo popis sekce).
Společný problém: jak na „nespecifické“ části webu?
V případě odlišení vzhledu jednotlivých sekcí na „společném“ webu je třeba vyřešit i otázku, jak budou vypadat části, které do žádné sekce nepatří nebo je tam z nějakého důvodu nelze přiřadit.
Příklad: při vytváření nového uzlu Drupal většinou „ještě neví“, do jaké sekce bude patřit. Poučenému administrátorovi to může být (skoro) jedno, ale pokud obsah vytváří běžný uživatel webu, může se stát, že se najednou (soudě podle vzhledu stránky) ocitne „někde jinde“. Jediná možnost odlišení (i podle URL) je v případě, že sekce jsou definované na základě typů obsahu. Totéž se může stát při komentování příspěvku nebo výpisu výsledků vyhledávání, kdy v URL nenajdeme žádnou informaci týkající se sekce.
Možná řešení:
- Pro tyto části zvolit „základní“ vzhled webu (vzhled hlavní sekce)
- Pro tyto části zvolit nějaké „technické“ téma vzhledu, například to, které budeme používat v administraci. (Mimochodem z mé zkušenosti, RootCandy se velmi osvědčuje a líbí, proto díky Markovi Sotákovi :-)) Mohou pomoci moduly, které dovolí podrobněji specifikovat, na které části webu se má použít téma administrace: Administration Theme nebo System Theme ++
Diskuse:
- Beth: Je dobré mít natolik konzistentní design jednotlivých částí, aby si uživatel nepřipadal nikdy „ztracený“. I při velmi odlišných sekcích webu je možné najít/vytvořit designový prvek, který je propojí.
- sign: Pro vyhledávání je možné použít views – exposed filtr Hledat: Search Terms. Pokud URL obsahuje název sekce, ten zůstane zachovaný i při výpisu výsledků. Použito například na MyFinePix.com.
Eva Rázgová
Doplnění a připomínky: Andrew Burcin, Beth, marinex, mysak, sign a další :-). Díky!

Virtual Sites
Výborně :-) Děkuji za přehledný a jednoduše pochopitelný článek. Zvolil jsem pro své potřeby modul Virtual Sites.
Nejprve jsem vytvořil podmínky pomocí modulu Conditions:
podmínka1: Hostitel: Validate only on the listed hostnames: domena1.cz
podmínka2: Hostitel: Validate only on the listed hostnames: domena2.cz …
Pak vytvořil virtuální sítě:
sekce1: Conditions: When ALL selected conditions are met: podmínka1
sekce2: Conditions: When ALL selected conditions are met: podmínka2 …
U těchto sítí jsem nastavil odlišné Informace o webu a odlišná témata (ta se musí nejprve povolit v klasickém nastavení témat, aby se zde dala vybrat).
Bohužel zatím čekám na přesměrování domén na jeden hosting, ale když jsem zkoušel dát do podmínka2 aktuální doménu na které stránky běží a do podmínka1 jinou, téma se v pořádku změnilo z defaultního na téma nastavené u sekce2.
Kde jste tedy narazila na problém? Doufám že po přesměrování to bude fungovat stejně dobře :-)
No, já se obávám, že
No, já se obávám, že u nastavení pro poddomény a další domény jsem vůbec nepochopila smysl/princip (moc jsem se tomu zatím nevěnovala, ale ráda bych :-)). V administraci modulu je odkaz na tutoriál k multisite (http://drupal.org/…l/multi-site)… a to mě mate nejvíc: když mám multisite (kde nastavím odlišně cokoliv), tak k čemu ještě virtual sites? Nebo jak přesně to máte vy? Předem díky ;-)
Na té stránce modulu je jenom
Na té stránce modulu je jenom zmínka, že všechno s tímto modulem nastavit nejde a pro rozsáhlejší věci je vhodnější multisite :-) V jednoduchosti je krása a tento modul to splňuje. Můj projekt je ještě stále ve vývoji, ale jakmile bude nasazen v reálném provozu a bude funkční, dám vědět. Jinak stačí přijet do Brna a můžeme uspořádat virtual/multisite konferenci :-)
Otázka do placu: Chci mít jednu instalaci Drupalu, jednu databázi, jedny uživatele, společný obsah, ale chci aby se stránky z různých míst zobrazovaly jinak (menu, téma, bloky, informace o webu,…). K čemu bych potřeboval multisite, když to nastavím pomocí několika kliků s modulem Virtual Sites?
Třeba k tomu, že v případě,
Třeba k tomu, že v případě, kdy budu potřebovat jeden projekt z nějakého důvodu osamostatnit – tak jednoduše zkopíruju jeho db a k tomu tu sdílenou část db a přesunu jinam. S modulem to předpokládám tak snadné nebude…
S tím souhlasím. Je třeba si
S tím souhlasím. Je třeba si předem rozmyslet co se s webem bude provádět a jaká je požadovaná funkčnost a podle toho vybrat buď modul nebo multisite.
… si nerozumíme. Já
… si nerozumíme. Já nezpochybňuju že ten modul je super (naopak), prostě jen nechápu jednu jeho část (a předpokládám, že chyba je mezi mojí židlí a mojí klávesnicí). Mluvím o tom, co je v nastavení na admin/settings/condition/add > Requirement: Sites: (dole je poznámka: „Listed are all Drupal multi-site directories“.) – a je tam odkaz na tutoriál k multisite.
Proto vyzvídám, jak to máte vy. Já taky nechci (v tomto případě) multisite. Mám všechny subdomény cokoliv.domena.cz směrované na domena.cz. OK, to funguje. Co dál? do /sites dám pokus.domena.cz. To se ale v možnostech pro conditions neobjeví, dokud tam nedám settings.php. Ale co v něm má být? Instalační skript rozbíhat nechci, protože pak budu mít multisite (a to nechci). Když tam zkopíruju settings.php z hlavního webu, tak to nastavit jde (Conditions a Virtual sites taky), ale nefunguje to – buď je pořád výchozí téma, nebo téma nastavené pro „pokus“. V tomhle bodě tomu přestávám rozumět. Předpokládám, že pro jinadomena.cz je to podobné. Takže pokud vám to chodí, alespoň v principu, ráda bych ten princip pochopila, jestli vás můžu poprosit :-)… možná mi prostě uniklo, jak se s tou doménou má naložit.
Už možná vím co máte na
Už možná vím co máte na mysli. Při tom vytváření podmínky se vybírá co se bude ověřovat. V mém případě Hostitel, kde jenom zadám konkrétní doménu. Možnost kde je Sites jsem taky nepochopil :-) Je k něčemu ověřovat na které z multisite právě uživatel je? Mně nic nenapadá. Ve Vašem případě, nestačilo by přes podporu u hostingu nasměrovat poddoménu pokus.domena.cz na domena.cz jako alias a podmínky poté vyplnit podobně jako já? Například vybrat Requirement: Hostitel → Only on the listed hostnames → pokus.domena.cz. Pak vytvořit Virtual Site s touto podmínkou a ta by se pak vyhodnotila jako True právě když uživatel přijde z poddomény pokus. Už jsem se trochu přiblížil tomu co myslíte?
Myslím přesně to co vy,
Myslím přesně to co vy, nastavení mám (řekla bych) tak jak píšete a nechodí mi to.
Doufám že se v ostrém provozu
Doufám že se v ostrém provozu s problémy nesetkám taky :-) Testoval jsem různé nastavení podmínek pro virtuální sítě a všechno se měnilo tak jak mělo. Pak Vám dám vědět jak to dopadlo (cca do týdne).
Díky, budu se těšit. Ještě
Díky, budu se těšit. Ještě bacha: psala jsem sice, že ten modul mi připadá úžasný, ale taky, že v současné době v podstatě nemá maintainera. Tak to ještě zdůrazňuju, abyste mě pak neproklínal (nebo někdo další :-))
Teď mi hlavu zamotala jedna
Teď mi hlavu zamotala jedna věc. Pokud budu mít jednu hlavní doménu (domena1.cz) a na ni alias (domena2.cz), tak pokud zadám do prohlížeče tento alias, vždy se přepíše na hlavní doménu. Podmínka se tedy ověří vždycky stejně ať jdeme odkudkoli. Je to tak? V tom případě už chápu Emu, proč jí to nejde do hlavy :-)
Jde to nějak obejít? Například nechat administrátory na serveru nastavit, aby se doména nepřepisovala když půjde vlastně o odlišný obsah? Nebo nějaká globální proměnná? Musí to jít přece nějak obejít.
Mně to nejen nejde do hlavy,
Mně to nejen nejde do hlavy, mně to prostě nefunguje :-( … A Vám?
Na ty aliasy jsem se ptal
Na ty aliasy jsem se ptal podpory na hostingu Active24 a mají tam službu WebForward, která alias v adrese nepřepíše, takže podmínka se nakonec bude dát ověřit. Tento týden budu stránky uvádět do provozu, takže prosím o strpení, pošlu Vám pak odkaz a jestli to nebude fungovat, tak asi parte :-)
EDIT: Všechno funguje podle očekávání. Zaslal jsem Vám mail.
Sections
Ještě bych si přisadil k výše uvedenému výčtu a doporučil modul Sections – dle výše uvedeného textu má zhruba stejnou funkčnost jako modul „page theme“. Mění se téma na základě cesty (lze si stanovit path pro konkrétní téma).
Už je tam....
Omlouvám se, přehlédl jsem, že už tam tento modul je.....
Zdravim, ako som už písal
Zdravim, ako som už písal (Google CSE ) aby som to upresnil, mne v D5 ide nastavit Vyhľadávanie CSE na „On this site (requires JavaScript)“ a výsledok je javascript na mojej stránke, ktorý je stylovatelny.
Co sa týka sekcií, ja by som asi riesil vlastnú tému + taxonomy + views vyhladavanie + tema administrácie(kde je možnosť zaškrtnúť„Použiť administračnú tému vzhľadu pre úpravu obsahu“) V tej vlasnej téme volať navyše class v určitých div-och(header, regiónoch a pod) aktuálny termín, poda ktorého potom nastylovat rozdiely v sekciách(vlastne termínoch) a potom uz len nastylovat default styly + styly podla termínov.
Poslat nový komentář