Adminer – rozšiřitelnost

Školení, která pořádám

Chování Admineru a především Editoru lze přizpůsobit pomocí vlastního objektu, který může obsahovat celou řadu metod, které se volají na mnoha různých místech. Výchozí chování těchto metod je definované a vlastní objekt je může přepsat nebo rozšířit. Ukázkové rozšíření Editoru vypadá takto:

<?php
function adminer_object() {
    class AdminerCds extends Adminer {
        function name() {
            return 'CDs';
        }
        function credentials() {
            return array('localhost', 'ODBC', '');
        }
        function database() {
            return 'adminer_test';
        }
        function login($login, $password) {
            return ($login == 'admin');
        }
        function tableName($tableStatus) {
            return h($tableStatus["Comment"]);
        }
        function fieldName($field, $order = 0) {
            return ($order <= 5 ? h($field["comment"]) : "");
        }
    }
    return new AdminerCds;
}

include "./editor.php";
?>

Přestože obsahuje jenom několik jednořádkových metod, mění chování poměrně zásadním způsobem:

Z dokumentačních komentářů metod je vygenerovaná dokumentace. Nepoužil jsem phpDocumentor, ale vlastní jednoduchý skript:

<?php
$path = "http://github.com/vrana/adminer/blob/v3.0.0/adminer/";
$filename = "include/adminer.inc.php";

$tokens = array();
$line = 1;
$lines = array();
foreach (token_get_all(file_get_contents($filename)) as $token) {
    if ($token[0] !== T_WHITESPACE) {
        $tokens[] = $token;
        $lines[] = $line;
    }
    if (is_array($token)) {
        $line += substr_count($token[1], "\n");
    }
}

echo "<ul lang='en'>\n";
for ($i=0; $i < count($tokens); $i++) {
    $token = $tokens[$i];
    if ($token[0] === T_DOC_COMMENT && $tokens[$i+1][0] === T_FUNCTION) {
        $comment = $token[1];
        echo "<li>";
        if (preg_match('~^\\s*\\*\\s*@return\\s+(\\S+)(.*)~m', $comment, $match)) {
            $returns = htmlspecialchars($match[1]);
            echo (trim($match[2]) ? '<abbr title="' . htmlspecialchars(trim($match[2])) . '">' . $returns . '</abbr>' : $returns);
        }
        echo " <a href='$path$filename#L$lines[$i]'>" . htmlspecialchars($tokens[$i+2][1]) . "</a>(";
        preg_match_all('~^\\s*\\*\\s*@param\\s+(\\S+)(.*)~m', $comment, $params, PREG_SET_ORDER);
        $param = 0;
        for ($i += 4; $tokens[$i] !== ')'; $i++) {
            if ($tokens[$i][0] === T_VARIABLE) {
                if ($tokens[$i+1] === '=') {
                    $params[$param][2] .= " [" . $tokens[$i+2][1] . "]"; //! can be array()
                }
                echo ($param ? ", " : "") . htmlspecialchars($params[$param][1]) . ' ' . (strlen(trim($params[$param][2])) ? '<abbr title="' . htmlspecialchars(trim($params[$param][2])) . '">' . htmlspecialchars($tokens[$i][1]) . '</abbr>' : htmlspecialchars($tokens[$i][1])); //! reference
                $param++;
            }
        }
        echo ")" . (preg_match('~^/\\*\\* *(.+)~', $comment, $match) ? " - " . htmlspecialchars($match[1]) : "") . "</li>\n";
    }
}
echo "</ul>\n";
?>
Jakub Vrána, Adminer, 21.8.2009, diskuse: 5 (nové: 0)

Diskuse

PetrP:

K čemu je `return new AdminerCds;`?

Marek Hrabě:

Nekoukal jsem ještě na zdrojáky, ale předpokládám, že si adminer v případě existence funkce adminer_object() tuto funkci zavolá. Ta funkce vytvoří třídu s popisem nastavení a  vrátí instanci této třídy.

<?php
// příklad implementace

$setup = adminer_object();
echo
"Jméno databáze: " . $setup->name();
?>

Chápeš, co tím je myšleno?

PetrP:

Tedy vše nastavuju přes jednu jedinou třídu? Prvním pohledem jsem myslel, že nastavuju jen tabulku `cds` a mohla by třeba existovat i třída `AdminerInterprets` a `AdminerSongs`.

Sice je to podle mě nepřehlednější, ale proč ne.

ikona Jakub Vrána OpenID:

Ano, vše se nastavuje jednou třídou. Pokud by se měly metody chovat jinak v závislosti na tabulce, tak si to musí samy otestovat. Třídu jsem pojmenoval AdminerCds, protože pracuje s databází cédéček.

Zvažoval jsem i to, že by se dali vytvořit potomci pro jednotlivé tabulky, ale příliš by se to zkomplikovalo.

Marek Hrabě:

Takhle mi to přijde jako ideální řešení - neměnil bych to.

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.