Ruční vykreslení formuláře

aha009
Člen | 50
+
0
-

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>&nbsp;
                                <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 | 351
+
0
-

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

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

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)