Niekolko uzitocnych template helpers
- westrem
- Člen | 398
Trieda zgrupujuca niekolko pomocnych helper-ov do Nette sablon.
Download
Pouzitie
Triedu zaregistrujeme ako HelperLoader napr. v BasePresenter-e
abstract class BasePresenter extends Presenter
{
protected function createTemplate()
{
$template = parent::createTemplate();
$template->registerHelperLoader('Format::loadHelper');
return $template;
}
}
Helpery
telephone
Naformatuje string ako SK alebo CZ telefonne cislo pevnej linky (podla dostupnych a dohladatelnych formatov o tel. cislach)
// phones
$phoneSk = '025976887';
$phoneSk2= '0455976887';
$phoneCz = '987664225';
//use
{$phoneSk|telephone}
{$phoneSk2|telephone}
{$phoneCz|telephone}
//output
02 5 97 68 87
045 5 97 68 87
987 664 225
mobile
Naformatuje string ako SK alebo CZ mobilne telefonne cislo (podla dostupnych a dohladatelnych formatov o tel. cislach)
// mobile phones
$phone1 = '00421908557443';
$phone2= '+421908557443';
$phone3 = '0908557443';
//use
{$phone1|mobile}
{$phone2|mobile}
{$phone3|mobile}
//output
00421 908 557 443
+421 908 557 443
0908 557 443
IBAN
Naformatuje IBAN.
// IBAN
$iban = 'GR1601101050000010547023795';
//use
{$iban|iban}
//output
GR16 0110 1050 0000 1054 7023 795
number
Obecne naformatovanie cisla podla SK a CZ locale konvencii.
// numbers
$int = 1002;
$float1 = 1000.67;
$float2 = '1000,67';
//use
{$int|number}
{$float1|number}
{$float2|number}
//output
1 002
1 000,67
1 000,67
money
Naformatuje dane cislo (float alebo int) ako sumu a pripadne prida znacku meny (€ je default).
// amounts
$amountSk = 1000.67;
$amountCz = 1000.67;
$amountDiff = '1000,67';
$amountInt = 1000;
//use
{$amountSk|money}
{$amountCz|money:'Kč'}
{$amountDiff|money}
{$amountInt|money}
//output
1 000,67 €
1 000,67 Kč;
1 000,67 €
1 000,- €
checkbox
Vhodne pre formatovanie TRUE/FALSE hodnot napr v DataGride. Hodnota sa
nahradi tagom <span>, ktory
dostane triedu tag-true
alebo tag-false
podla hodnoty
a text •
v pripade TRUE a
v pripade false.
// bools
$var = TRUE;
//use
{$var|checkbox}
//output
<span class="tag-true">•</span>
checkbox3
Obdoba checkboxu ale s rozsirenim na 3. stav, ktory nastava pokial ma
premenna hodnotu: ‚na‘, –1 alebo NULL.
Text sa nastavi na n/a
a trieda na tag-na
.
// value
$var = -1;
//use
{$var|checkbox3}
//output
<span class="tag-na">n/a</span>
onNull
Nahrada hodnoty v pripade, ze je rovna NULL
suffix
Append stringu za hodnotu.
// value
$var = 'Hello ';
//use
{$var|suffix:'world!'}
//output
Hello world!
prefix
Prepend stringu pred hodnotu.
// value
$var = 'world!';
//use
{$var|prefix:'Hello '}
//output
Hello world!
Editoval westrem (2. 9. 2010 23:33)
- westrem
- Člen | 398
Ach, mne sa tam zdalo nieco nie uplne koser.
Fixed.
Tak isto som uploadol novu verziu, kde ta povodna na par miestach volala moje interne funkcie, ktore nie su k dispozicii a musel som ich prepisat na bezne PHP funkcie.
Ospravedlnujem sa, ak to uz niekto stiahol a neslo mu par helperov, bolo to sposobene tymto.
- Lopo
- Člen | 277
ja sa pridam s mojou trochou – Helpers
(popisem len tie zaujimavejsie):
xmldate, xmltime, xmldatetime
formatuje datum pre pouzitie v Excel XML poli prislusneho typu
$dt='3.8.2010 08:43:15';
{$var|xmldate} // '2010-08-03T00:00:00.000'
{$var|xmltime} // '2010-08-03T08:43:15.000'
{$var|xmldatetime} // '2010-08-03T08:43:15.000'
rozdiel medzi time a datetime sa urcuje uz formatovanim bunky v ramci XML
scapitalize
„supercapitalize“ (uppercase+capitalize) → cely retazec napise velkymi pismenami a tie co boli velke budu este vacsie
$var='kapiTALizovany REtazeC'
{$var|scapitalize} // 'KAPI<span style="font-size: 125%;">TAL</span>IZOVANY <span style="font-size: 125%;">RE</span>TAZE<span style="font-size: 125%;">C</span>'
tento helper budem asi prerabat na fungovanie cez regexp-y
csvfloat
formatovanie float hodnot pre pouzitie v CSV
$var=0.00003;
{$var|csvfloat} // 0,000030
vzniklo ked mi zacalo hodnotu 0.00003 pisat ako 3e-05
- maarlin
- Člen | 207
Přidávám se se svou troškou do mlýna:
public static function czechDate($time, $format = 'j.F Y')
{
if (!$time) {
return FALSE;
} elseif (is_numeric($time)) {
$time = (int) $time;
} elseif ($time instanceof DateTime) {
$time = $time->format('U');
} else {
$time = strtotime($time);
}
$weekDays = array (
'Monday' => 'pondělí', 'Tuesday' => 'úterý',
'Wednesday' => 'středa', 'Thursday' => 'čtvrtek',
'Friday' => 'pátek', 'Saturday' => 'sobota', 'Sunday' => 'neděle');
$months = array (
'January' => 'ledna', 'February' => 'února', 'March' => 'března',
'April' => 'dubna', 'May' => 'května', 'June' => 'června',
'July' => 'července', 'August' => 'srpna', 'September' => 'září',
'October' => 'října', 'November' => 'listopadu',
'December' => 'prosince');
$date = date($format, $time);
foreach ($weekDays as $en => $cs) {
$date = str_replace ($en, $cs, $date);
}
foreach ($months as $en => $cs) {
$date = str_replace ($en, $cs, $date);
}
return $date;
}
public static function phoneNumber($number)
{
$finalNumber = preg_match('/((\+|\+ |00)([0-9]{3}))? ?([0-9]{3})\/? '.
'?([0-9]{3}) ?([0-9]{3})/is', $number, $match);
if (count ($match) > 0) {
$prefix = '';
if ((string)$match[3] !== '') {
$prefix = '+'.$match[3];
}
return $prefix.$match[4].$match[5].$match[6];
} else {
return '';
}
}
Je někdo ochoten to dát na https://addons.nette.org/ ? :-)
- Panda
- Člen | 569
Když už tu všichni tak zuřivě sdílíte své helpery, tak také přispěji svou malou troškou do mlýna:
class Helpers
{
public static function register(Template $template)
{
$template->registerHelperLoader('Helpers::loader');
// override the default Nette date helper
$template->registerHelper('date', 'Helpers::date');
}
public static function loader($helper)
{
if (is_callable($callback = __CLASS__ . '::' . $helper))
return $callback;
}
public static function dateTime($time)
{
if (!($time instanceof \DateTime)) {
$time = new \DateTime($time);
}
return self::date($time) . ' ' . $time->format('G:i');
}
public static function date($time)
{
if (!($time instanceof \DateTime)) {
$time = new \DateTime($time);
}
$today = new \DateTime('today');
$diff = $today->diff($time);
if ((!$diff->invert && $diff->d > 1) || ($diff->invert && $diff->d > 0)) {
return $time->format('j. n.' . ($today->format('Y') != $time->format('Y') ? ' Y' : ''));
} elseif ($diff->d == 0) {
return $diff->invert ? 'Včera' : 'Dnes';
} else {
return 'Zítra';
}
}
}
Výstupy:
class HelpersTest extends BaseTest
{
public function testDate()
{
$todayNoon = new DateTime('today noon');
$yesterday8 = new DateTime('yesterday 8:00');
$tomorrow20 = new DateTime('tomorrow 20:00');
$twoDaysAgo = new DateTime('2 days ago');
$nextWeek = new DateTime('+1week');
$fixedDate = new DateTime('2008-08-08');
$this->assertEquals('Dnes 12:00', Helpers::dateTime($todayNoon));
$this->assertEquals('Včera 8:00', Helpers::dateTime($yesterday8));
$this->assertEquals('Zítra 20:00', Helpers::dateTime($tomorrow20));
$this->assertEquals($twoDaysAgo->format('j. n. G:i'), Helpers::dateTime($twoDaysAgo));
$this->assertEquals($nextWeek->format('j. n. G:i'), Helpers::dateTime($nextWeek));
$this->assertEquals($fixedDate->format('j. n. Y G:i'), Helpers::dateTime($fixedDate));
}
}
- westrem
- Člen | 398
Pridavam sa s prosbou o pripadne uverejnenie na Addons, kludne sekcionovane s menom autora a ukazkou kodu a pouzitia, ktory tu sam napisal. Plus by nebolo odveci spomenut to, ze v pripade helperochs rovnakym menom ako ma uz nejaky existujuci helper v Nette dojde k jeho prepisaniu.
- westrem
- Člen | 398
matata napsal:
Ja netvrdim opak :)
Avsak tvoju komponentu som zatial nepotreboval a napisat si easy helper mi prislo lepsie ako kvoli tomu pouzivat kurzovy listok, ktoreho primarne vyuzitie spociva trochu v niecom inom.
Tak isto poziciovanie € nie je easy a jednotne. Ja kedze som Slovak a myslim si, ze zatial valna cast pouzivatelov Nette su Cesi a Slovaci som si helper napisal tak aby umiestnoval Euro sign za sumu, pretoze tak je konvencia na SR.
- h4kuna
- Backer | 740
westrem napsal(a):
matata napsal:
Ja netvrdim opak :)
Já jsem to jen uvedl aby se neuváděli zbytečné duplicity. Chápu že tvoje je intuitivní a lehké.
Avsak tvoju komponentu som zatial nepotreboval a napisat si easy helper mi prislo lepsie ako kvoli tomu pouzivat kurzovy listok, ktoreho primarne vyuzitie spociva trochu v niecom inom.
super to musím dopsat, ona jde použít i bez přepočtu prostě využiješ metodu Cnb::format(). V momentě kdy budeš potřebovat přepočet tak to bude otázka sekund ho zapojit.
Tak isto poziciovanie € nie je easy a jednotne. Ja kedze som Slovak a myslim si, ze zatial valna cast pouzivatelov Nette su Cesi a Slovaci som si helper napisal tak aby umiestnoval Euro sign za sumu, pretoze tak je konvencia na SR.
toto je v komponentě variabliní a můžeš si to změnit spíše jsem to uvedl že je jedno kde je znak, jestli je desetiná čárka nebo tečka, kolik je desetiných míst a jaký je oddělovač tisíců, vše lze nastavit velmi lehce.