04-08-2010 00:25 - Zdroj: php.vrana.cz
NotORM se výborně hodí pro pohodlné sestavování dotazů pokládaných do databáze, obzvlášť pokud potřebujeme pracovat se vztahy mezi tabulkami. Pokud je ale databáze navržena nešikovně nebo je příliš komplexní, tak by se hodilo nad nízkoúrovňovými funkcemi NotORM vytvořit ještě jednu vrstvu abstrakce.
Vezměme si třeba takové vícejazyčné záznamy. Pokud překlady uchováváme v samostatné tabulce, můžeme je pomocí NotORM získat následujícím kódem:
<?php
// zjištění názvu a ceny produktu v dané skupině
foreach ($notORM->product("group_id", $group) as $product) {
foreach ($product->product_translation("language_id", $lang) as $product_translation) {
$product_translation["name"];
}
$product["price"];
}
?>
Kód je sice mnohem jednodušší, než při použití nízkoúrovňových funkcí, pořád je ale dost krkolomný. A to ani nezohledňuje případ, že by překlad neexistoval. Představa, že bych musel tento kód psát při každém získání přeloženého textu, mě zrovna neláká.
NotORM proto nyní (zatím pouze ve vývojové verzi) umožňuje určit třídu, ze které se budou vytvářet vracené řádky a která může chování upravovat. Třeba takhle:
<?php
class NotORM_Row_Lang extends NotORM_Row {
static $lang = "cs";
function offsetExists($key) {
if (!array_key_exists($key, $this->row)) {
$table = $this->result->table . "_translation";
// pokud by překlad neexistoval, vrátíme anglickou verzi
foreach ($this->$table("language_id", array(self::$lang, "en"))->order("language_id = 'en'")->limit(1) as $row) {
foreach ($row as $key => $val) {
$this->row[$key] = $val;
}
}
}
return parent::offsetExists($key);
}
... -
Pokračovat...