March 2nd, 2009
Jestli je něco v CodeIgniteru strašná otrava, tak určitě překlad aplikace. Člověk do controlleru, nebo view napíše hlášku a musí jít ještě vytvořit do souboru s jazykem proměnou, kam už tedy konečně může napsat překlad. Při pár hláškách se to přežít dá, ale při větším množství to leze na nervy. Poslední dobou si pohrávám s Djangem a vygenerovaní PO pro gettext je pomoci makemessages je prostě geniální zrychlovák. (Pro neznalé ve zkratce: de-fakto to proleze zdrojáky a hlášky na překlad nasype do souboru).
Je tady nějakej knoflík, kterej to umí? A jestli ne, tak proč ne? Proč ne opravdu nevím, ale konflík jsem horkou jehlou sešil a hazím v plén. Skript proleze adresář s projektem v CI a do specifikovaného souboru pro zadaný jazyk dosype hlášky, které ještě v souboru nejsou. Nic míň, nic víc. Předesílám, že skript je psanej pro mojí potřebu, takže postrádá jistou dávku blbuvzdornosti (bez urážky).
Jak to funguje? Je nutné předat cestku k projektu (option -p), ve které se rekurzivně projdou všechny podadresáře (pomocí -e je možné některý vynechat) a ve zdrojákách (defautlně přípona .php - možno změnit ve zdroji skriptu) se hledají stringy použité při validaci (lang:moje_lajna) nebo volání “překládací funkce”. defaultně je to v CI lang(”moje_lajna”), nicméně já používám vlastní rychlejší alias “_t()”. Název funkce jde proto nastavit také ve skriptu. Pokud není lajna ještě v souboru s překladem (-f soubor, -l jazyk), přidá se na konec souboru. Další podrobnosti k optionům po zavolání skript.py -h. Skript ke stažení tady.
Popularity: 21% [?]
November 3rd, 2008
Pokuď někdo generoval XLSko pomocí jinak dobře našláplýho projektu PHPExcel, jistojistě narazil na fakt, že data se ukladají po buňkách(!). Na tom zase není nic moc až tak tragickýho, až na fakt, že musíte nějak vygenerovat i souřadnici buňky. Já jsem zrovna potřeboval procházet buňky od A až po XY a tak vznikla tahle lehce retardovaná funkce. Budiž možná někomu prospěšná. PS. Pokud někdo přišel na způsob jak ukládat data třeba po sloupečkách nebo snad dokonce po řádkách, nechť mě osvítí v komentářích.
function make_column_name
($start_row,
$add)
{
$len =
strlen($start_row);
if(!
is_int($add)) return false;
if($len >
2 ||
$start_row ==
”) return false;
$start_row =
strtoupper($start_row);
$last_ord =
ord($start_row[$len-1]);
$first_ord =
($len ==
1)?
false:
ord($start_row[0]);
$first_ret_ord =
($len ==
1)?
65:
$first_ord;
$to_z =
90-
$last_ord;
if($add <=
$to_z) return ($first_ord)?
chr($first_ord).
chr($last_ord+
$add):
chr($last_ord+
$add);
else
{
$add -=
($to_z+1);
return chr($first_ret_ord+
floor($add/
26)).
chr(65+
($add%
26));
}
}
Popularity: 11% [?]
February 16th, 2008
Tenhle týden jsem narazil na potřebu (někoho) mít na stránce blbůstku jménem “Konvertor měn”. Budiž. Je to hodně jednoduché a ne moc oštřené (např. to spoléhá to na slušnost při zadávání parametrů fce…), ale snad to někomu bude sloužit k inspiraci
Na začátku je třeba stáhnout data z České Národní Banky, která se uloží do lokálního souboru pro příští požadavky. Data rovnou přechroustáme do pole - co řádek, to položka.
$cache =
‘./cache/cnb_’.
date(‘dmY’);
if(!
$data = @
file($cache))
{
$uri =
‘http://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.txt?date=’.
date(‘d.m.Y’);
if(!
$data =
file($uri)) return false;
else
{
$fh = @
fopen($cache,
‘w+’);
@
fwrite($fh,
implode("\n",
$data));
@
fclose($fh);
}
}
Jakmile máme data, ořízneme první dva řádky v souboru, které nepotřebujeme, data projdeme a uložíme do asociativního pole, kde klíči jsou kódy měn a hodnotami jsou jejich kurzy vůči koruně (rate) za dané množství měny (amount) $struct('EUR' => array('amount'=>1,'rate'=>25.225),....). Posléze se už jen zdrojová měna přepočte na koruny a trojčlenka nám vyhodí kýžené číslo
$data =
array_slice($data,
2);
$struct =
array();
foreach ($data as $item)
{
$t =
explode("|",
$item);
$struct[$t[3]] =
array(‘amount’=>
$t[2],
‘rate’=>str_replace
(‘,’,
‘.’,
$t[4]));
}
if($src != ‘CZK’) $inczk = (double)$amount/$struct[$src][‘amount’]*$struct[$src][‘rate’];
else $inczk = $amount;
if($tar != ‘CZK’) $div = (double)$struct[$tar][‘rate’]*$struct[$tar][‘amount’];
else $div = 1;
return (double)$inczk/$div;
Celá funkce je k dostání tady:
function get_xrate
($amount,
$src,
$tar)
{
if($src ==
‘CZK’ &&
$tar =
‘CZK’) return $amount;
$cache = ‘./cache/cnb_’.date(‘dmY’);
if(!$data = @file($cache))
{
$uri = ‘http://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.txt?date=’.date(‘d.m.Y’);
if(!$data = file($uri)) return false;
else
{
$fh = @fopen($cache,‘w+’);
@fwrite($fh,implode("\n",$data));
@fclose($fh);
}
}
$data = array_slice($data,2);
$struct = array();
foreach ($data as $item)
{
$t = explode("|",$item);
$struct[$t[3]] = array(‘amount’=>$t[2],‘rate’=>str_replace(‘,’,‘.’,$t[4]));
}
if($src != ‘CZK’) $inczk = (double)$amount/$struct[$src][‘amount’]*$struct[$src][‘rate’];
else $inczk = $amount;
if($tar != ‘CZK’) $div = (double)$struct[$tar][‘rate’]*$struct[$tar][‘amount’];
else $div = 1;
return (double)$inczk/$div;
}
Popularity: 23% [?]