Pokročilejší přetěžování funkcí vzhledu v Drupalu

Každý vývojář Drupalu jistě ví, jak přetížit všechny theme funkce v tématu vzhledu. Tento postup je ve valné většině případů dostačující. Já jsem se však setkal se situací, kdy tento postup nestačí.

Mám totiž více vlastních modulů, ve kterých potřebuji přetěžovat některé konkrétní theme funkce. Bohužel Drupal neumožňuje přetěžování pomocí názvu vlastního modulu, ale pouze názvu tématu či šablonovacího systému. A je jasné, že definovat stejnou funkci prostě není možné.

Nejprve jsem si myslel, že to prostě jinak nepůjde, ale nakonec jsem nalezl jeden postup, který využívá hook hook_theme_registry_alter, díky kterému je to možné. Nicméně přetížení tímto způsobem není zcela stoprocentní z toho důvodu, že takto přetíženou theme funkce již nelze dále přetěžovat klasickým způsobem. To z toho důvodu, že je tento hook volán až po provedení všech přetížení – obsahuje vlastně všechna data o všech zaregistrovaných theme funkcích. Jeho volání však není náročné, protože je vyvolán je po vymazání cache.

Já jsem si tento postup ještě vylepšil o možnost dalšího klasického přetěžování. Dosáhl jsem toho zcela jednoduše definováním nových theme funkcí a použíti mezikroku.

PHP: Setřídění pole podle abecedy včetně diakritiky

PHP nabízí vskutku rozsáhlé možnosti pro práci s poli a to včetně třídění. Problém ovšem nastává, pokud je potřeba setřídit prvky pole, jejichž počáteční písmena neobsahují pouze znaky anglické abecedy, ale také další písmena s diakritikou, či jiné symboly. V takovém případě jsou tyto položky umístěny na začátek, či konec pole (záleží na nastavení serveru), kam přitom nemusí vůbec patřit. Tento problém je sice možné obejít setříděním prvků při výběru z databáze, někdy ale stejně může nastat situace, kdy je nutné seřadit až samotné pole.

Sám jsem na tuto situaci narazil, a proto jsem se rozhodl, že se pokusím napsat vlastní třídící funkci, která bude prvky polí řadit korektně.

Je využito funkce usort(), která umožňuje pro třídění definovat vlastní funkci, ve které dochází k porovnávání jednotlivých prvků mezi sebou na základě vlastních kritérií. K tomu, aby byly jednotlivé položky pole správně řazeny, bylo nutné před samotným porovnáváním jednotlivých dvojic, převést speciální znaky na znaky anglické abecedy. Toto bohužel vyžaduje mít seznam všech speciálních znaků s překlady na znaky standardní.

PHP: Oprava špatné detekce kódování v DOMXpath

DOMXpath je skvělý nástroj pro zpracování XML a HTML souborů. Umožňuje dle speciální syntaxe vypsat pouze požadované části souboru dle specifických tagů, identifikátorů, tříd nebo obsahu elementů.

Obsahuje však bug, díky kterému není korektně rozpoznáno UTF8 kódování zdrojového souboru. Výsledkem je pak špatná reprezentace diakritiky.

Tento problém je však možné celkem snadno obejít. Místo metody loadHTMLfile je nutné použít loadHTML. Požadovaný soubor je nutné předem načíst a provést úpravu hlavičky.

<?php
$file = file_get_contents('http://www.example.com');
$file = preg_replace('/<head[^>]*>/','<head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">',$file);

$doc = new DOMDocument();
$doc->loadHTML($file);
?>

csfd.cz script do Ant Movie Catalogu (aktualizováno)

Dobrá zpráva, pro všechny, kteří používají skvělý program Ant Movie Catalog, o kterém jsem již dříve psal. Konečně se mi podařilo upravit script na stahování informací o filmech z Československé filmové databáze dle mých představ. Hodně mi pomohl MI'RA, kterého jsem hodně otravoval a tímto mu děkuji.

Sesmolit těch pár řádků byl pro mě strašlivý úkol, jelikož se v Delphi absolutně nevyznám. Takže úpravy, které jsem provedl jsou možná zběsilé a určitě by šly udělat lépe.

Co se změnilo:

  • Jednak byla opravena chyba, která házela do URL filmu další tuny znaků navíc.
  • Dále bylo vylepšeno stahování popisku filmu, který je nyní stahován celý.
  • A nakonec jsem si nechal možnost hledat ve všech typech názvů najednou (dříve se musela vybrat možnost z oreginálních, českých nebo slovenských názvů) + teď to hledá ještě v anglických názvech.

Za nejnovější verzi děkuji uživateli IkE Blaster!

Syndikovat obsah