Michal Čihař - phpMyAdmin (6.) - MIME transformace

phpMyAdmin (6.) - MIME transformace

Do databáze se dají ukládat různá data a phpMyAdmin nám umožňuje nadefinovat jejich zobrazení v uživatelském rozhraní.

Co zobrazovat

Protože naše současná databáze zatím obsahuje poměrně málo položek, tak jí rozšíříme ještě o screenshot programu. Bude to sloupec typu mediumblob, jeho přidání jistě již nemusím popisovat. Po nahrání obrázku do tohoto pole se nám zobrazí při procházení tabulky jen informace o velikosti pole: "[BLOB - 59.0 kB]".

Předdefinované transformace

phpMyAdmin přichází s mnoha předdefinovanými transformacemi, které pokrývají nejčastěji používané operace:

application/octetstream: download
Zobrazí odkaz na stáhnutí dat.
image/jpeg: inline
Zobrazí náhled obrázku s odkazem na obrázek
image/jpeg: link
Zobrazí odkaz na obrázek (například stáhnutí pole blob).
image/png: inline
Viz image/jpeg: inline
text/plain: dateformat
Zobrazí datum nebo čas (TIME, TIMESTAMP a DATETIME) podle místního nastavení.
text/plain: external
Spustí externí program, na jeho standardní vstup pošle obsah pole a zobrazí výstup programu. Tato transformace může přinášet bezpečnostní rizika, takže je standardně vypnutá.
text/plain: formatted
Zachová původní formátování sloupce, tak jak je uložen v databázi.
text/plain: imagelink
Zobrazí obrázek a odkaz z pole obsahujícího odkaz na obrázek.
text/plain: link
Zobrazí odkaz z pole obsahující odkaz.
text/plain: substr
Zobrazí jen část textu.

Pro naší databázi se nám hodí transformace image/jpeg: inline pro zobrazení obrázku a text/plain: link pro zobrazení odkazů. Nastavíme proto tyto transformace (na obrázku jsou jen vybrané sloupce):

Nyní již při procházení databáze vidíme odkaz a náhled obrázku:

Vlastní transformace

Kromě předdefinovaných transformací můžeme vytvořit i svoje vlastní. Například se rozhodneme, že do popis programu může obsahovat formátovací značky BBCode (obsahuje základní formátováná, používá se například v phpBB.

Transformaci pojmenujeme bbcode, a protože bude zpracovávat text, tak MIME typ bude text/plain. V adresáři libraries/transformations tedy vytvoříme soubor text_plain__bbcode.inc.php, který musí obsahovat funkci PMA_transformation_text_plain__bbcode, která bude zavolána pro každou položku s prvním parametrem obsahujícím hodnotu pole v databázi, další dva parametry nebudeme pro naší transformaci potřebovat, ale obsahují případné parametry transformace a meta informace o sloupci tabulky.

Po chvíli hledání na internetu nalezneme funkci pro zpracování BBCode:

$GLOBALS['bb_patterns'] = array(
    '`\[b\](.+?)\[/b\]`is',
    '`\[i\](.+?)\[/i\]`is',
    '`\[u\](.+?)\[/u\]`is',
    '`\[strike\](.+?)\[/strike\]`is',
    '`\[color=#([0-9a-fA-F]{6})\](.+?)\[/color\]`is',
    '`\[email\](.+?)\[/email\]`is',
    '`\[img\](.+?)\[/img\]`is',
    '`\[url=([a-z0-9]+://)([\w\-]+\.([\w\-]+\.)*[\w]+(:[0-9]+)?' .
       '(/[^ \"\n\r\t<]*?)?)\](.*?)\[/url\]`si',
    '`\[url\]([a-z0-9]+?://){1}([\w\-]+\.([\w\-]+\.)*[\w]+' .
       '(:[0-9]+)?(/[^ \"\n\r\t<]*)?)\[/url\]`si',
    '`\[url\]((www|ftp)\.([\w\-]+\.)*[\w]+(:[0-9]+)?' .
       '(/[^ \"\n\r\t<]*?)?)\[/url\]`si',
    '`\[flash=([0-9]+),([0-9]+)\](.+?)\[/flash\]`is',
    '`\[quote\](.+?)\[/quote\]`is',
    '`\[indent](.+?)\[/indent\]`is',
    '`\[size=([1-6]+)\](.+?)\[/size\]`is'
);

$GLOBALS['bb_replaces'] =  array(
    '<span style="font-weight: bold">\1</span>',
    '<span style="font-style: italic">\1</span>',
    '<span style="border-bottom: 1px dotted">\1</span>',
    '<strike>\1</strike>',
    '<span style="color:#\1;">\2</span>',
    '<a href="mailto:\1">\1</a>',
    '<img src="\1" alt="" style="border:0px;" />',
    '<a href="\1\2">\6</a>',
    '<a href="\1\2">\1\2</a>',
    '<a href="http://\1">\1</a>',
    '<object width="\1" height="\2"><param name="movie" value="\3" />' .
       '<embed src="\3" width="\1" height="\2"></embed></object>',
    '<strong>Quote:</strong><div style="margin:0px 10px;padding:5px;' .
       'background-color:#F7F7F7;border:1px dotted #CCCCCC;' .
       'width:80%;"><em>\1</em></div>',
    '<pre>\\1</pre>',
    '<h\1>\2</h\1>'
);

function bbcode( $string){

    global $bb_patterns, $bb_replaces;
    return preg_replace($bb_patterns, $bb_replaces , 
        nl2br(htmlspecialchars($string)));
}

A nyní již zbývá jen napsat transformační funkci, ta bude v tomto jednoduchém případě spočívat jen v zavolání jiné funkce:

function PMA_transformation_text_plain__bbcode(
    $buffer, $options = array(), $meta = '') {

    return bbcode($buffer);
}

Hotovou transformaci si můžete stáhnout zde. Teď již jen zbývá nastavit používání této transformace na sloupec s popisem a můžeme využít formátovací možnosti BBCode:

[color=#999999]Nějaký[/color] [strike]text[/strike]
[flash=100,100]http://kecy.roumen.cz/archive/vajicko.swf[/flash]
[i]Italic[/i]
[email]michal@cihar.com[/email]
[url=http://www.linuxsoft.cz]
[img]http://www.linuxsoft.cz/img/ls.gif[/img][/url]
[url]http://www.linuxsoft.cz[/url]
[url=http://www.linuxsoft.cz]Linuxsoft[/url]
[quote]Quote![/quote]

Podobným způsobem můžeme vytvořit libovolnou transformaci zpracovávající data při zobrazování. V některé s následujících verzí phpMyAdmina se možná dočkáte i podobné transformace pro editaci dat, ale to je ještě hudba vzdálené budoucnosti :-).

Tak to je vše o transformacích a v dalším díle si nastavíme phpMyAdmina tak, aby vypadal jak chceme.