Michal Čihař - Archive for Nov. 19, 2007

Zobrazování dat a MIME transformace

Při procházení tabulek phpMyAdmin přímo zobrazí jen textová data a pokud do tabulek ukládáme třeba obrázky, dozvíme se, že jen jeho velikost. Pokud chceme přímo zobrazit obrázek, musíme mít nastavené používání MIME transformací. Jak pro tento účel nastavit phpMyAdmina již bylo popsáno v článku o  rozšířených možnostech .

Předdefinované transformace

phpMyAdmin přichází s mnoha předdefinovanými transformacemi, které pokrývají nejčastěji používané operace. Jejich aktuální popis je v phpMyAdminovi obsažen, tak se můžete podívat na demo server .

Použití transformací je jednoduché, stačí vybrat požadovanou transformaci ve vlastnostech sloupce a při prohlížení se automaticky aplikuje. Některé transformace se dají dále nastavit pomocí parametrů, jejich popis je ve výše odkázaném seznamu transformací.

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/tran­sformations tedy vytvoříme soubor text_plain__bbco­de.inc.php, který musí obsahovat funkci PMA_transforma­tion_text_pla­in__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. 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 :-).

Přílohy: