Návrh na nové Latte makro {switch}

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

Jednou jsem potřeboval v šabloně použít switch a zjistil jsem, že pro něj není makro. Zatím to supluju takhle, ale myslím, že kdyby se to přidalo do standardního seznamu maker, tak by to řada lidí ocenila.

LatteMacros::$defaultMacros['switch'] = '<?php switch (%%): ?>';
LatteMacros::$defaultMacros['/switch'] = '<?php endswitch ?>';
LatteMacros::$defaultMacros['case'] = '<?php case %%: ?>';
LatteMacros::$defaultMacros['/case'] = LatteMacros::$defaultMacros['break'] = '<?php break ?>';
uestla
Backer | 796
+
0
-

A jak zapsat

switch ($v) {
	default: // <-- toto?
		// ...
		break;
}

Makro {default ?} už je totiž zabrané pro defaultizaci proměnných…

Cifro
Člen | 245
+
0
-

podľa mňa aj takto {defaultCase}{/case}

Mikulas Dite
Člen | 756
+
0
-

Ještě sem to nepotřeboval. Složitější logika je v presenteru, resp. v action. V templatě není potřeba a jestli tam je, možná patří do spíš modelu.

Možná máš nějaký příklad použití, který se hodí do template? Ale ani tak bych makro do Nette nedával, není pro něj dostatek využití.

jansfabik
Člen | 193
+
0
-

Dělám digitální žákovskou knížku a když vypisuju známky, tak chci některé ostylovat. $mark->style může být normal (běžná známka), final (výsledná známka – barevně zvýrazněná) nebo canceled (škrtnutá).

<table class="grid">
	<thead>
		<tr>
			<th width="25%">Předmět</th>
			<th width="25%">Vyučující</th>
			<th width="25%">Hodnocení za 1. pololetí</th>
			<th width="25%">Hodnocení za 2. pololetí</th>
		</tr>
	</thead>
	<tbody>
		<tr{attr class('even', $iterator->isEven())} n:foreach="$subjects as $subject">
			<th>{$subject->name}</th>
			<td n:inner-foreach="$subject->teachers as $teacher">
				<a href="{link contact, id => $teacher->id}">{$teacher->realname}</a>
			</td>
			<td n:inner-foreach="$subject->firstTermMarks as $mark">
				<a href="{link view, id => $mark->id}" n:block="mark" n:inner-switch="$mark->style">
					{case 'normal'}{$mark->value}{/case}
					<strong n:case="final">{$mark->value}</strong>
					<s n:case="canceled">{$mark->value}</s>
				</a>
			</td>
			<td n:inner-foreach="$subject->secondTermMarks as $mark">
				{include #mark}
			</td>
		</tr>
	</tbody>
</table>
Ondrej
Člen | 110
+
0
-

jansfabik napsal(a):

Dělám digitální žákovskou knížku a když vypisuju známky, tak chci některé ostylovat. $mark->style může být normal (běžná známka), final (výsledná známka – barevně zvýrazněná) nebo canceled (škrtnutá).

v tomto pripade se hodi stylovat pres CSS

<td n:inner-foreach="$subject->firstTermMarks as $mark">
	<a href="{link view, id => $mark->id}" class="{$mark->style}">
	{$mark->value}
	</a>
</td>
jansfabik
Člen | 193
+
0
-

tjn., ale <strong> a <s> mi připadá sémanticky lepší

Mikulas Dite
Člen | 756
+
0
-

Přesně tohle sem dělal taky, styly známek. Napsal sem si na to helper.

<?php
class MarkHelper extends Object
{
	public static function mark($mark, $digits = 0)
	{
		$colors = array('55b936', '0EB5E8', 'F7803C', 'BF0429', '000000');

		if ($mark == 0) {
			return Html::el('span')->class('highlight')->setText('?')->style('background-color: #BBB; color: #EEE;');
		}


		preg_match('~^(\d)(\.\d+)?$~im', $mark, $m);
		if ($digits == 0 && isset($m[2])) {
			$fmark = $m[1] . '–';
		} elseif ($digits == 0) {
			$fmark = $m[1];
		} else {
			$fmark = number_format(round($mark, $digits), 2, ',', ' ');
		}
		return Html::el('span')->class('highlight')->setText($fmark)->style('background-color: #' . $colors[round((float) $mark) - 1] . ';');
	}
}

$template->registerHelper('mark', array('Helpers', 'mark'));
?>

Protože psát všude {$user->grade|mark} je mnohem hezčí než mít všude switche.

Snadno si to upravíš na makro, které bude brát typ známky.

Editoval Mikulas Dite (13. 6. 2010 15:08)

jansfabik
Člen | 193
+
0
-

a ještě jednou jsem potřeboval použít switch (taky na žákovce), a to při vykreslování menu:

<div id="menu" n:inner-switch="$user->roles[0]">
	<ul n:case="student">
		<li><a href="{link Marks:overview}"{ifCurrent Marks:overview} class="active"{/if}>Klasifikace</a></li>
		<li><a href="{link Contact:default}"{ifCurrent Contact:default} class="active"{/if}>Kontakt</a></li>
	</ul>
	<ul n:case="teacher">
		<li><a href="{link Classes:overview}"{ifCurrent Classes:overview} class="active"{/if}>Přehled tříd</a></li>
		<li><a href="{link Marks:insert}"{ifCurrent Marks:insert} class="active"{/if}>Zapsat známku</a></li>
		<li><a href="{link Contact:default}"{ifCurrent Contact:default} class="active"{/if}>Kontakt</a></li>
	</ul>
	<ul n:case="admin">
		<li><a href="{link Backend:marks}"{ifCurrent Backend:marks} class="active"{/if}>Klasifikace</a></li>
		<li><a href="{link Backend:classes}"{ifCurrent Backend:classes} class="active"{/if}>Třídy</a></li>
		<li><a href="{link Backend:subjects}"{ifCurrent Backend:subjects} class="active"{/if}>Předměty</a></li>
		<li><a href="{link Backend:members}"{ifCurrent Backend:members} class="active"{/if}>Žáci a učitelé</a></li>
		<li><a href="{link Contact:default}"{ifCurrent Contact:default} class="active"{/if}>Kontakt</a></li>
	</ul>
</div>

i když by to šlo zapsat jako: n:if="$presenter->user->isInRole('...')", což mi ale přijde hrozně nepřehledný

Majkl578
Moderator | 1364
+
0
-

A co ti brání použít obyčejnou podmínku (if a dvě elseif)?

jansfabik
Člen | 193
+
0
-

Majkl578 napsal(a):

A co ti brání použít obyčejnou podmínku (if a dvě elseif)?

ten switch mi připadá přehlednější než toto:

<div id="menu">
        <ul n:if="$presenter->user->isInRole('student')">
                <li><a href="{link Marks:overview}"{ifCurrent Marks:overview} class="active"{/if}>Klasifikace</a></li>
                <li><a href="{link Contact:default}"{ifCurrent Contact:default} class="active"{/if}>Kontakt</a></li>
        </ul>
        <ul n:if="$presenter->user->isInRole('teacher')">
                <li><a href="{link Classes:overview}"{ifCurrent Classes:overview} class="active"{/if}>Přehled tříd</a></li>
                <li><a href="{link Marks:insert}"{ifCurrent Marks:insert} class="active"{/if}>Zapsat známku</a></li>
                <li><a href="{link Contact:default}"{ifCurrent Contact:default} class="active"{/if}>Kontakt</a></li>
        </ul>
        <ul n:if="$presenter->user->isInRole('admin')">
                <li><a href="{link Backend:marks}"{ifCurrent Backend:marks} class="active"{/if}>Klasifikace</a></li>
                <li><a href="{link Backend:classes}"{ifCurrent Backend:classes} class="active"{/if}>Třídy</a></li>
                <li><a href="{link Backend:subjects}"{ifCurrent Backend:subjects} class="active"{/if}>Předměty</a></li>
                <li><a href="{link Backend:members}"{ifCurrent Backend:members} class="active"{/if}>Žáci a učitelé</a></li>
                <li><a href="{link Contact:default}"{ifCurrent Contact:default} class="active"{/if}>Kontakt</a></li>
        </ul>
</div>
pekelnik
Člen | 462
+
0
-

Celou záležitost řeší s přehledem if

jansfabik
Člen | 193
+
0
-

i v normálním kódu můžeš switche nahradit ifama, ale tím to přijde o tu eleganci

Honza Kuchař
Člen | 1662
+
0
-

Switche skoro vůbec nepoužívám a myslím, že je lepší si napsat makro pro to či ono konkrétní použití.