Ruční vykreslení formuláře
- aha009
- Člen | 50
Ahoj,
snažím se vykreslit formulář s několika podmínkami, ale při ručním
vykreslení narážím na problém, jak to vykreslit.
Formulář vykreslí všechny dny v měsíci pro každé dítě a pokud
existuje ke dni jídlo tak ho přiřadí. Pří vykreslení přes
{control Form}
, funguje.
Problém v tuto chvíli nastává při manuálním vykreslení zde
$this->template->arrayItem = $this->dietOrderManager->getFoods($child->id)->fetchAll();
kde nevím jak to do latte dostat getFoods($child->id)
, protože
v tomto případě to vypíše hodnoty pouze k prvnímu dítěti.
Možná to jde celé udělat jednodušeji. Protože v tuto chvíli prakticky
všechny podmínky a dotazy použité ve formuláři opakuji v šabloně a
presenteru.
Form
$children = $this->database->table('children')->where('user_id = ?', $userId);
$form = new UI\Form();
$form->addSubmit('send', 'Daten speichern');
$childrenContainer = $form->addContainer('child');
foreach ($children as $child) {
$container = $childrenContainer->addContainer($child->id);
$container->addText('child_id', $child->first_name);
$daysContainer = $container->addContainer('days');
$arrayDate = $this->dietOrderManager->getDaysInYearMonth();
$arrayItem = $this->dietOrderManager->getFoods($child->id)->fetchAll();
$dateItemSnack = array_column($arrayItem, 'snackName', 'date');
$dateItemSnackPrice = array_column($arrayItem, 'snackPrice', 'date');
foreach ($arrayDate as $day) {
$days = $daysContainer->addContainer($day);
$day = \DateTime::createFromFormat('Ymd', $day);
$day = $day->format('Y-m-d 00:00:00');
if (isset($dateItemSnack[$day]) && $dateItemSnackPrice[$day] > 0) {
$days->addCheckbox('snack', 'svacina');
} else {
$days->addCheckbox('snack', 'svacina')
->setDisabled();
}
}
}
Presenter
public function actionDefault(): void
{
$this->template->children = $this->database->table('children')->where('user_id = ?', $this->user->getIdentity()->id)->where('active = ?', 1);
$this->template->arrayDate = $this->dietOrderManager->getDaysInYearMonth();
$arrayDate = $this->dietOrderManager->getDaysInYearMonth();
$this->template->arrayItem = $this->dietOrderManager->getFoods($child->id)->fetchAll();
$arrayItem = $this->dietOrderManager->getFoods($child->id)->fetchAll();
$this->template->dateItemSnack = array_column($arrayItem, 'snackName', 'date');
$this->template->dateItemSnackPrice = array_column($arrayItem, 'snackPrice', 'date');
Latte
<form n:name="dietOrderForm" n:class="ajax">
<table>
<tr>
<th>Datum</th>
<th>Svačina</th>
</tr>
{foreach $children as $child}
<tr>
<td>
{$child->first_name} {$child->last_name}
<ul>
<li>
<ul>
{foreach $arrayDate as $day}
{var $day2 = \DateTime::createFromFormat('Ymd', $day)}
{var $day2 = $day2->format('Y-m-d 00:00:00')}
<li>
<input type="checkbox" n:name=child-$child-days-$day-snack>
<label>{$day2|date:'D d.m.Y'}{ifset $dateItemSnack[$day2] && $dateItemSnackPrice[$day2] > 0}{$dateItemSnack[$day2]} - {$dateItemSnackPrice[$day2]} {/ifset}</label>
</li>
{/foreach}
</ul>
</li>
</ul>
</td>
- dakur
- Člen | 493
@aha009 Ahoj, lepší je to dělat takto:
- data z databáze nastrkáš do form fieldu jako jejich data, nastavíš výchozí položky/hodnoty
- v šabloně vykresluješ normálně přes
n:name
, příp. můžeš sáhnout i k proměnné$form
, která je uvnitř<form></form>
k dispozici - kteroukoliv autogenerovanou část můžeš ručně přepsat, takže pokud
chceš například vyrenderovat datum v nějakém tvaru, můžeš udělat něco
takového:
<label n:name="jmenoFieldu">{$form['jmenoFieldu']|date:'D d.m.Y'}</label>
– tím se ti samy vygenerují atributy pro<label>
, ale zároveň máš custom formát data
Možná by to šlo i ještě elegantněji to formátování, ale teď mě nenapadá jak.
Editoval dakur (11. 5. 2021 9:22)
- aha009
- Člen | 50
Děkuji @dakur . Nevím jestli tohle mi zrovna pomůže nebo tomu
spíš nerozumím a asi jsem to špatně popsal. Potřebuji za určitých
podmínek některé inputy skrýt. Ve formu se k těm hodnotám dostanu, ale
v šabloně už ne. Do šablony potřebuji dostat z formuláře hodnoty
$dateItemSnackPrice[$day]
abych mohl skrýt případně input.
Pokud bych šel přes n:name
, tak jak se dostanu k hodnotě? Nebo
jde udělat nějak isset na n:name
? Ideální by bylo form vypsat
přes {control mujForm}, pak bych nemusel nic řešit a opakovat to do
šablony.
A nebo jen dostat toto
$this->template->arrayItem = $this->dietOrderManager->getFoods($child->id)->fetchAll();
do šablony aby se ve foreach v šabloně
doplnilo $child->id
Form
if (isset($dateItemSnack[$day]) && $dateItemSnackPrice[$day] > 0) {
$days->addCheckbox('snack', 'svacina');
} else {
// nezobrazovat
}
Latte
<form n:name="dietOrderForm" n:class="ajax">
{foreach $children as $child}
{$child->first_name} {$child->last_name}
{foreach $arrayDate as $day}
{var $day2 = \DateTime::createFromFormat('Ymd', $day)}
{var $day2 = $day2->format('Y-m-d 00:00:00')}
{if isset($dateItemSnack[$day2]) && $dateItemSnackPrice[$day2] > 0)
<input type="checkbox" n:name=child-$child-days-$day-snack>
<label>{$day2|date:'D d.m.Y'}{ifset $dateItemSnack[$day2]} {$dateItemSnack[$day2]}{/ifset}</label>
{/if}
{/foreach}
- dakur
- Člen | 493
Tak co ve Form proiterovat ty snacky a v případě, že je splněna podmínka, tak přidat checkbox do containeru? Potom můžeš v šabloně jen proiterovat a vykreslit existující checkboxy:
{foreach $form[$child][$day]->getControls() as $checkbox}
{input $checkbox} {label $checkbox /}
{/foreach}
Jen pozor na to, že hodnoty $child
a $day
se musí
shodovat s tím, co je v názvech těch containerů.
Editoval dakur (12. 5. 2021 9:37)