Návrh na nové Latte makro {switch}
- jansfabik
- Člen | 193
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 | 799
A jak zapsat
switch ($v) {
default: // <-- toto?
// ...
break;
}
Makro {default ?}
už je totiž zabrané pro defaultizaci
proměnných…
- Mikulas Dite
- Člen | 756
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
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
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>
- Mikulas Dite
- Člen | 756
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
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ý
- jansfabik
- Člen | 193
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>
- Honza Kuchař
- Člen | 1662
Switche skoro vůbec nepoužívám a myslím, že je lepší si napsat makro pro to či ono konkrétní použití.