Niekolko uzitocnych template helpers

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
westrem
Člen | 398
+
0
-

Trieda zgrupujuca niekolko pomocnych helper-ov do Nette sablon.

Download

Format

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 &bull; v pripade TRUE a &nbsp; 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)

LuKo
Člen | 116
+
0
-

Zatím jsem to nezkoušel, proto nevím, zda je chyba v helperu, nebo jsi udělal chybu při psaní postu. Toto 1 000,67,- Kč je chyba. ,- znamená žádná haléřová část nebo nula haléřů. Proto lze zapsat pouze:

1 000,67 Kč
2 000,- Kč
westrem
Člen | 398
+
0
-

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
+
0
-

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

Nilp
Člen | 65
+
0
-

Ohledně scapitalize, nedělá to samé styl font-variant: small-caps?

iguana007
Člen | 970
+
0
-

Nilp napsal(a):

Ohledně scapitalize, nedělá to samé styl font-variant: small-caps?

To možná ano, ale CSS ti jsou třeba prd platný při generování non-html obsahu, takže helper se hodí ;)

westrem
Člen | 398
+
0
-

Ahoj Lopo, vsimol som si, ze medzi svojimi helpers mas aj tradicny date, nebije sa to s tym od Nette? resp. vykonava sa ten tvoj alebo ten od Nette?

redhead
Člen | 1313
+
0
-

Helpery se dají přepsat, resp. se vykoná ten, který se registruje jako poslední (výjimku tvoří akorát helper translate, který David odmítá spravit :( )

Blizzy
Člen | 149
+
0
-

iguana007 napsal(a):

Nilp napsal(a):

Ohledně scapitalize, nedělá to samé styl font-variant: small-caps?

To možná ano, ale CSS ti jsou třeba prd platný při generování non-html obsahu, takže helper se hodí ;)

To řešení používá inline CSS.

Editoval Blizzy (3. 9. 2010 15:17)

Lopo
Člen | 277
+
0
-

ten scapitalize vznikol uz ani neviem kvoli comu … mam dojem ze povodne to bol trochu iny filter ale uz si nepamatam, aktualne ho myslim nikde nepouzivam
ale mam ho odlozeny hlavne kvoli samotnemu algoritmu akym funguje, je totiz lahko upravitelny na ine podobne filtre

iguana007
Člen | 970
+
0
-

Blizzy napsal(a):
To řešení používá inline CSS.

Aha, tak toho jsem si nevsim, beru tedy zpet ;)

maarlin
Člen | 207
+
0
-

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
+
0
-

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
+
0
-

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.

h4kuna
Backer | 740
+
0
-

westrem napsal(a):
//output
1 000,67 €
1 000,67 Kč;
1 000,67 €
1 000,– €
\---

ahoj, toto zvladá luxusně Cnb a umí formátovat jinak € a jinak Kč. př: 1 000 Kč, €1000.51

westrem
Člen | 398
+
0
-

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
+
0
-

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.