Jak upravit datum a autora článku v Drupalu 7 a přitom zachovat RDF

Asi nejčastěji upravovanou částí šablony článku v Drupalu je informace o autorovi a datu publikace. Standardní zápis kdo a kdy článek napsal, téměř nikdy svou podobou nevyhovuje grafickému zadání - alespoň taková je má zkušenost. Možností, jak tuto informaci upravit, je celá řada. Dbejte na to, abyste použili takovou úpravu, kterou se neochudíte o výhody automatického vkládání RDF v Drupalu 7.

RDF je zkratka pro Resource Description Framework. Jedná se o určitým způsobem strukturovanou sadu dat, která jsou vložena ve standardním kódu HTML a popisují jeho jednotlivé části. Když se kouknete na nějaký web běžící třeba na Drupalu 7 se zapnutým modulem RDF, uvidíte v jeho zdrojovém kódu, že okolo data vydání článku je HTML značka span s celou řadou „podivných" atributů doplněných hodnotami odpovídajícími datu článku.

Informace z RDF mohou zpracovávat vyhledávače a jiné indexovací stroje, které tak snadno zjistí nadpis stránky (nebo název produktu v eshopu), datum zveřejnění, autora, obsah atd. Nemusí se tedy spoléhat na automatiku rozpoznávající strukturu HTML kódu.

Je tedy bezesporu, že použití RDF na webu vám přináší jistou konkurenční výhodu oproti těm, kdo toto vylepšení na svém webu nemají. V Drupalu 7 stačí aktivovat modul RDF, který je součástí jádra. Hned poté se začnou příslušné informace do HTML kódu doplňovat.

Potenciální problém

Proč vůbec článek o tom, jak upravovat datum a jméno autora článku v Drupalu, když se nám modul RDF o připojení potřebných informací postará automaticky? Problém je v tom, že ona automatika vyžaduje nějaké základní předpoklady pro své správné fungování. Je mnoho způsobů, jak upravovat výchozí šablony PHP pro výslednou podobu stránky v Drupalu. A některé tyto úpravy mohou činnost RDF zcela vyřadit.

Příklad špatné úpravy data článku

Když se podíváte na standardní výpis článků v Drupalu realizovaný například s výchozím tématem vzhledu Bartik, uvidíte informaci ve stylu „Napsal uživatel maxiorel dne Ne, 10/09/2011 - 12:17". Z pohledu zdrojového kódu bude vypadat nějak takto:

<div class="meta submitted"><span rel="sioc:has_creator" datatype="xsd:dateTime" content="2011-10-09T12:17:33+02:00" property="dc:date dc:created">Napsal uživatel <a property="foaf:name" typeof="sioc:UserAccount" about="/users/maxiorel" xml:lang="" class="username" title="Zobrazit profil uživatele." href="/users/maxiorel">maxiorel</a> dne Ne, 10/09/2011 - 12:17.</span></div>

Řekněme, že chcete danou informaci opravit do podoby „Napsal Jméno, 10.9.2011". Tedy se změnou formátování a s vynecháním informace o času publikace. V Drupalu 6 byste s největší pravděpodobností sáhli do šablony node.tpl.php, odstranili odtud příkaz k vypsání print $submitted; a nahradili jej něčím vlastním. Funguje to i v Drupalu 7.

Když tedy ze šablony node.tpl.php odstraníte položku print $submitted;, můžete ji pro dosažení popsaného výsledku nahradit tímto:

<?php 
  $autor = user_load($node->uid);
  print 'Napsal '.l($autor->name, 'user/'.$autor->uid).','.format_date($node->created, 'custom', 'j.n.Y'); 
?>

Čili nejprve načtete objekt s uživatelem, který článek vytvořil, poté vypíšete informaci složenou s řetězce, funkce l() pro vytvoření odkazu na profil autora a funkcí format_date() pro výpis zformátovaného data článku bez informace o času.

Když se však podíváte na vygenerovaný kód, informace RDF budou pryč:

<div class="meta submitted">Napsal <a href="/users/maxiorel">maxiorel</a>, 9.10.2011</div>

Správná úprava se zachováním RDF v Drupalu

Čili, jakkoli jsou úpravy přímo v souboru node.tpl.php pohodlné a rychlé, nemusí být vždy tím nejlepším možným řešením. Pokud chcete informace RDF v této části zachovat, musíte na úpravu informace o publikaci jiným způsobem. Konkrétně s využitím souboru template.php ve vašem tématu vzhledu. V šabloně node.tpl.php zůstane klasicky print $submitted, případně tuto šablonu nebudete v tématu vzhledu vůbec vytvářet a necháte Drupal, ať vezme její výchozí podobu ze systému.

Do souboru template.php ve vašem tématu vzhledu doplňte funkci NAZEVTEMATU_ preprocess_node(&$variables){}. Pokud se podíváte na její výchozí podobu, zjistíte, že se zde vytváří podoba proměnných, se kterými pak můžete pracovat v šabloně node.tpl.php. Nás konkrétně zajímají dvě:

  • $variables['date'] - zde se uchovává zformátovaná informace o datu vydání článku
  • $variables['submitted'] - zformátovaná informace zobrazující text s jménem autora a datem článku

Pokud v souboru template.php funkci NAZEVTEMATU_ preprocess_node(&$variables) zatím vůbec nemáte, můžete ji tam přidat v následující podobě. Kdykoli tak v tématu vzhledu učiníte, zůstane samozřejmě funkční i systémová podoba této funkce, ale zároveň se aplikují změny na ty proměnné, které ve svém tématu vzhledu upravujete. Není tedy nutné kopírovat do tématu vzhledu vždy celou podobu původní funkce a provádět v ní změny. Stačí specifikovat jen požadované změny.

Čili v našem případě bude funkce vypadat následovně:

{syntaxhighlighter brush:php} function NAZEVTEMATU_preprocess_node(&$variables) { $variables['date'] = format_date($variables['node']->created, 'custom', 'j.n.Y'); $variables['submitted'] = t('Napsal !username, !datetime', array('!username' => $variables['name'], '!datetime' => $variables['date'], )); } {/syntaxhighlighter}

Jak vidíte, ve funkci měním jen dvě proměnné, které nás zajímají. V node.tpl.php budou dostupné jako $date a stará známá $submitted. Docílil jsem tedy změny výstupu do šablony node.tpl.php. Když se nyní podíváme na vygenerovaný kód, budou zároveň zachovány okolní informace RDF:

<div class="meta submitted"><span rel="sioc:has_creator" datatype="xsd:dateTime" content="2011-10-09T12:17:33+02:00" property="dc:date dc:created">Napsal <a property="foaf:name" typeof="sioc:UserAccount" about="/users/maxiorel" xml:lang="" class="username" title="Zobrazit profil uživatele." href="/users/maxiorel">maxiorel</a>, 9.10.2011</span></div>

Pokud již funkci NAZEVTEMATU_preprocess_node(&$variables) ve své šabloně vzhledu máte definovánu, pak samozřejmě z výše uvedeného příkladu vezmete jen „vnitřek" a doplníte jej do stávající podoby funkce, případně upravíte aktuální formátování oněch dvou proměnných do pozměněné podoby.

Úpravou proměnných skrze preprocess funkce a soubor template.php můžete měnit další výstupy zpracovávané v šabloně node.tpl.php a zároveň zachovat informace RDF i okolo nich. Preprocess funkce jsou dostupné i pro další šablony v tématu vzhledu. Jejich výchozí podobu můžete najít například ve vyhledávači na webu api.drupal.org.

Tip: Chcete-li se dozvědět více o programování a tvorbě témat vzhledu a modulů pro Drupal, můžete navštívit můj kurz v počítačové škole GOPAS.

Tagy

Buďme ve spojení, přihlaste se k newsletteru

Odesláním formuláře souhlasíte s podmínkami zpracováním osobních údajů. 
Více informací v Ochrana osobních údajů.

Autor článku: Jan Polzer

Tvůrce webů z Brna se specializací na Drupal, WordPress a Symfony. Acquia Certified Developer & Site Builder. Autor několika knih o Drupalu.
Web Development Director v Lesensky.cz. Ve volných chvílích podnikám výlety na souši i po vodě. Více se dozvíte na polzer.cz a mém LinkedIn profilu.

Komentáře k článku

návštěvník

Doplnil jsem funkci granada_preprocess_node do svého výchozího tématu granada a vůbec nic se nezměnilo. Čím to může být?

Přidat komentář

Odesláním komentáře souhlasíte s podmínkami Ochrany osobních údajů

reklama
Moje kniha o CMS Drupal

 

Kniha 333 tipů a triků pro Drupal 9


Více na KnihyPolzer.cz

Sledujte Maxiorla na Facebooku

Maxiorel na Facebooku

Hosting pro Drupal a WordPress

Hledáte český webhosting vhodný nejenom pro redakční systém Drupal? Tak vyzkoušejte Webhosting C4 za 1200 Kč na rok s doménou v ceně, 20 GB prostoru a automatické navyšováním o 2 GB každý rok. Podrobnosti zde.

@maxiorel na Twitteru

Maxiorel na Twitteru