Formulář, SetDefault z DB – model

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

Zdravím,

prosím o radu, řeším problém s výpisem dat z DB zpět do formuláře.
Mám stránku s nastavením, jednotlivé dny, tabulku mám navrženou

DB:

 Celé texty
id_day
day_name
open
day_open
day_pause_start
day_pause_end
day_closse

1
monday
1
08:00:00.000000
12:00:00.000000
13:00:00.000000
17:00:00.000000

2
tuesday
0
07:00:00.000000
12:00:00.000000
13:00:00.000000
17:00:00.000000
.
.

Presenter:

$form = new Form;
        $form->addHidden('id_day');
        $form->addCheckbox('monday', 'Pondělí')
                ->addCondition($form::EQUAL, TRUE)
                ->toggle('monday_open')
                ->toggle('monday_pause_start')
                ->toggle('monday_pause_end')
                ->toggle('monday_closse');
        $form->addText('monday_open', 'Od: ')
                ->setOption('id', 'monday_open');
        $form->addText('monday_pause_start', 'Polední pauza začátek: ')
                ->setOption('id', 'monday_pause_start');
        $form->addText('monday_pause_end', 'Polední pauza konec: ')
                ->setOption('id', 'monday_pause_end');
        $form->addText('monday_closse', 'Do: ')
                ->setOption('id', 'monday_closse');



		/*
		*
		To samé i pro ostatní dny
		*
		*/

        /* načte data z db */
        $default = $this->SettingManager->getDays();



        /* nastavý výchozí hodnoty z databaze do formuláře */
        $form->setDefaults($default);

        $form->addSubmit('send', 'Uložit');
        $form->onSuccess[] = array($this, 'daysFormSucceeded');
        return $form;

Model

Const

const
            TABLE_OPTIONS = 'options',
            COLUMN_ID = 'id',
            COLUMN_NAME = 'name',
            COLUMN_URL = 'url',
            COLUMN_EMAIL = 'email',
            COLUMN_TEL = 'tel',
            COLUMN_LOGO = 'logo',
            TABLE_DAYS = 'days',
            COLUMN_ID_DAY = 'id_day',
            COLUMN_DAY_NAME = 'day_name',
            COLUMN_OPEN = 'open',
            COLUMN_DAY_OPEN = 'day_open',
            COLUMN_DAY_PAUSE_START = 'day_pause_start',
            COLUMN_DAY_PAUSE_END = 'day_pause_end',
            COLUMN_DAY_CLOSSE = 'day_closse';

1. Je možné mít v const takhle umístěné dvě tabulky?

Ukládání dat

$monday = array(
            self::COLUMN_OPEN => $values['monday'],
            self::COLUMN_DAY_OPEN => $values['monday_open'],
            self::COLUMN_DAY_PAUSE_START => $values['monday_pause_start'],
            self::COLUMN_DAY_PAUSE_END => $values['monday_pause_end'],
            self::COLUMN_DAY_CLOSSE => $values['monday_closse'],
        );
        $this->database->table(self::TABLE_DAYS)->where(self::COLUMN_ID_DAY, 1)->update($monday);

		/*
		*
		To samé i pro ostatní dny
		*
		*/

2. Tady se chci jenom zeptat zda jde kód nějakým způsobe zkrátit

Načtení dat

$results_mo = $this->database->table(self::TABLE_DAYS)
          ->select(self::COLUMN_ID_DAY)
          ->select(self::COLUMN_OPEN)
          ->select(self::COLUMN_DAY_OPEN)
          ->select(self::COLUMN_DAY_PAUSE_START)
          ->select(self::COLUMN_DAY_PAUSE_END)
          ->select(self::COLUMN_DAY_CLOSSE)
          ->where(self::COLUMN_ID_DAY, '1')
          ->fetch();

foreach ($results_mo as $result_mo) {
          Debugger::barDump($result_mo);
          return $result;
          };
/*Mělo by to pokračovat pro další dny kde by se pak tyto výsledky spojilo do pole a vrátili hodnoty do presenteru*/

3. tady mám teď největší problém

  • neustále mi vyskakuje laděnka: Undefined offset: 2 → proč? Googloval jsem a nějak mi nejde do hlavy co se mi to snaží říct…
  • je tohle idealni řešení když to bude rozepsáno pro každý den?
  • Potřebuji z tohohle dostat hodnoty, které bych mohl nastavit jako výchozí pro formulář v presenteru viz víše
  • pokud přeskočím chybu offset pokračuje to chybou: DateInterval::__construct(): Unknown or bad format (PTHMS)

Budu velice vděčný za každou radu, odkaz či nasměrovní.

Editoval strejcz (14. 5. 2016 15:28)

igor.pocta
Člen | 100
+
0
-

Za sebe, snad se na mě ostatní nebudou zlobit :)

$results_mo = $this->database->table(self::TABLE_DAYS)
  ->select(self::COLUMN_ID_DAY)
  ->select(self::COLUMN_OPEN)
  ->select(self::COLUMN_DAY_OPEN)
  ->select(self::COLUMN_DAY_PAUSE_START)
  ->select(self::COLUMN_DAY_PAUSE_END)
  ->select(self::COLUMN_DAY_CLOSSE)
  ->where(self::COLUMN_ID_DAY, '1')
          ->fetch();

Když ty selecty vynecháš, tak si to zkrátíš podstatně. Jen v tom budeš mít navíc day_name, což by vadit nemuselo.

Záznam který získáš z databáze a chceš ho použít, by měl být pole, tak si tam přidej:

$default = $this->SettingManager->getDays();
$default = $default->toArray();

Ale pokud chceš použít tohle, musí se prvky formuláře jmenovat stejně (…), jako sloupce v databázové tabulce.

Formulář bych si udělal jako komponentu a den nastavil přes metodu. V tomhle mi hodně pomohlo video od Honzy – https://www.youtube.com/watch?…