vkladanie formulara do db …

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

Ahojte viete mi poradit??

mam form na vkladanie uloh, a nasledne vkladam do dalsej tabulky last insert id

protected function createComponentTaskForm()
{
  $form = new Form();
  $form->addText('task_name', 'Úloha:', 40, 100)
      ->addRule(Form::FILLED, 'Je nutné zadat text úkolu.');
  ..........
  $form->addSubmit('create', 'Vytvořit');
  $form->onSuccess[] = callback($this, 'taskFormSubmitted');
  return $form;
}

public function taskFormSubmitted(Form $form)
{
  $row = $this->context->createTasks()->insert(array(
      'title' => $form->values->task_name
      ..................
  ));

  $this->context->createExecutor()->insert(array(
       'task_id' =>$row->id,
       'user_id' => $form->values->userId));

  $this->flashMessage('Úkol přidán.', 'success');
  //$this->redirect('this');
}

ked zapoznamkujem to druhe vkladanie vsetko prebehne ok, ale ked vkladam aj do druhej tabulku tak mi vrati

Undefined offset: 11
...\libs\Nette\Database\Table\ActiveRow.php:279	 source ▼  Nette\Database\Table\Selection->	 offsetGet (arguments ▼)

:        /**
273:         * @internal
274:         */
275:        public function access($key, $cache = TRUE)
276:        {
277:            if ($this->table->getConnection()->getCache() && !isset($this->modified[$key]) && $this->table->access($key, $cache)) {
278:                $id = (isset($this->data[$this->table->getPrimary()]) ? $this->data[$this->table->getPrimary()] : $this->data);
279:                $this->data = $this->table[$id]->data;
280:            }
281:        }
282:
--------------------------------------------------------------------------------------------------

...\temp\cache\_Nette.FileTemplate\_TaskList.TaskList.latte-929127b2a04727d744389de3d02cbe21.php:43	 source ►  Nette\Iterators\CachingIterator->	 rewind ()



33:            <th class="executor">executor</th>
34:            <th class="observer">observer</th>
35:
36:            <th class="executor">done</th>
37:    <?php if ($displayTaskList): ?>        <th class="tasklist">Seznam</th>
38:    <?php endif ;if ($displayUser): ?>        <th class="user">Komu</th>
39:    <?php endif ?>
40:        </tr>
41:        </thead>
42:        <tbody>
43:    <?php $iterations = 0; foreach ($iterator = $_l->its[] = new Nette\Iterators\CachingIterator($tasks) as $task): ?>
44:        <tr<?php if ($_l->tmp = array_filter(array($iterator->isOdd() ? 'odd' : 'even', $task->done ? 'done':null))) echo ' class="' . htmlSpecialChars(implode(" ", array_unique($_l->tmp))) . '"' ?>>
45:            <td class="title"><?php echo Nette\Templating\Helpers::escapeHtml($task->id, ENT_NOQUOTES) ?>
46:    -<?php echo Nette\Templating\Helpers::escapeHtml($task->title, ENT_NOQUOTES) ?></td>
47:            <td class="add_date"><?php echo Nette\Templating\Helpers::escapeHtml($template->date($task->add_date, 'j. n. Y'), ENT_NOQUOTES) ?></td>

aj ked vypnem presmerovanie tak to prejde.

uz skutocne neviem v com je to.

Editoval duskohu (16. 7. 2012 13:48)

petr.pavel
Člen | 535
+
0
-

Přijde mi, že laděnka vykape na chybě v TaskList.TaskList.latte, což se netýká tvého formuláře.
Koukni se do presenteru TaskList na akci/render TaskList.

Mimochodem, asi správnější by bylo pojmenovat presenter Task a konkrétní akci list, ale třeba víš, proč to máš takhle.

jtousek
Člen | 951
+
0
-

Víš co? Zkus to rovnou na té hrachově větvi. :-)

duskohu
Člen | 778
+
0
-

no je to v TaskList.latte, ale ono sa to spusti len ked pridam do TaskListPresenteru
hoci len tento riadok
$x=$row->id;

a uz to padne…
ak to tam nemam tak to prebehne bez problemov,
aj ked som pridal verziju od hracha .....
uz neviem co robim zle …

petr.pavel
Člen | 535
+
0
-

Co se spustí? Ta chyba?
Nevyvrátil jsi mi, že chyba není ve formuláři, ale v presenteru. Pošli teda kód presenteru.

Ty chybová hláška, co's sem zkopíroval, si stěžuje, že neexistuje záznam v databázi s id 11. Třeba ti to pomůže.

duskohu
Člen | 778
+
0
-

dam insert formulara:

$row = $this->context->createTasks()->insert(array(
    'title' => $form->values->task_name,
    'add_date' => new DateTime(),
    'start_date' => NULL,
    'end_date' => NULL,
    'finish_term' => new DateTime('2012-09-07'),
    'status_id' => 1,
    'tasklist_id' => $this->taskList->id,
    'user_id' => $form->values->userId,
));

potom : nacitam last insert id: ktory viem pouzit inde

$x=$row->id;

a nakoniec redirect:

$this->redirect('this');

a pokial neni v kode : $x=$row->id;
vsetko prebehne ok alebo nepouzijem redirect ale pokial pouzijem $x=$row->id; a redirect tak mi vrati:

Undefined offset: 126
-----------------------
...\temp\cache\_Nette.FileTemplate\_TaskList.TaskList.latte-929127b2a04727d744389de3d02cbe21.php:43	 source ►  Nette\Iterators\CachingIterator->	 rewind ()

33:            <th class="executor">executor</th>
34:            <th class="observer">observer</th>
35:
36:            <th class="executor">done</th>
37:    <?php if ($displayTaskList): ?>        <th class="tasklist">Seznam</th>
38:    <?php endif ;if ($displayUser): ?>        <th class="user">Komu</th>
39:    <?php endif ?>
40:        </tr>
41:        </thead>
42:        <tbody>
43:    <?php $iterations = 0; foreach ($iterator = $_l->its[] = new Nette\Iterators\CachingIterator($tasks) as $task): ?>
44:        <tr<?php if ($_l->tmp = array_filter(array($iterator->isOdd() ? 'odd' : 'even', $task->done ? 'done':null))) echo ' class="' . htmlSpecialChars(implode(" ", array_unique($_l->tmp))) . '"' ?>>
45:            <td class="title"><?php echo Nette\Templating\Helpers::escapeHtml($task->id, ENT_NOQUOTES) ?>
46:    -<?php echo Nette\Templating\Helpers::escapeHtml($task->title, ENT_NOQUOTES) ?></td>
47:            <td class="add_date"><?php echo Nette\Templating\Helpers::escapeHtml($template->date($task->add_date, 'j. n. Y'), ENT_NOQUOTES) ?></td>
jtousek
Člen | 951
+
0
-

Je 126 ID toho nově vloženého řádku?

duskohu
Člen | 778
+
0
-

nie,
ale ulozil som html ladenky :
http://www.ulozto.sk/…/ladenka-rar

petr.pavel
Člen | 535
+
0
-

Koukal jsem na tu laděnku a stojím si za svým. V TaskList.TaskList.latte chceš v cyklu procházet $tasks. Vypadá to, že $tasks jsi získal odkazem z nějaké věty db do jiné tabulky a při konstrukci toho dotazu na $tasks to vykape. Podle mě není chyba tam, kde ji hledáš – tj. nesouvisí s last insert id.

Mimochodem, ta tvoje laděnka nejde rozklikávat. Možná proto, že's ji nazval „Projekt A – Úkolníček.htm“. Diakritika a mezery v názvu souboru, chm. Příště si to, prosím, zkus. Já si vyzkoušel ve Firefoxu laděnku uložit jako test.html a rozklikávat pak šla.

Pošli celý presenter a celou šablonu latte. Jinak nemá smysl tu něco zkoušet hledat.

duskohu
Člen | 778
+
0
-

No v tom ti noponijem ze chyba je v TaskList.latte ale zacne sa prejavovat az ked v taskpresentri pridam odkaz na last insert id a dam redirect().

Takze pridal som task presenter:
na riadku:82 a 86, je: $row->id >> ktore sposobuje tuto chybu ( predstavuje last insert id )
ked sa nahradi nejakym cislom a nie odkazom na last insert id, ktore je hned nad , na riadku: 68 tak to funguje

pridal som ladenku ktora sa da rozklikat;
a tasklist komponentu a jej sablonu kde tu chybu robi ......

http://www.ulozto.sk/x4e4R6w/ladenka-2-rar
petr.pavel
Člen | 535
+
0
-

Zkus na chvíli zapomenout na formulář. :-) Možná se pletu, ale moje zkušenost je, že nemá smysl sledovat pořád tu samou myšlenkovou cestu, když nikam nevede.

V komponentě TaskList vypišuješ $tasks, které plníš v TaskPresenter jako $this->taskList->related('task'). $this->taskList zase plníš v akci default přes $this->context->createTasklists()->get($id).

Laděnka ti vystřelí v okamžiku, kdy se pokouší zpracovat ten related() dotaz. Id z tabulky tasklist je 5, přesto při dotazu do tabulky task to používá tasklist_id = 126. Je potřeba přijít na to, proč.

Zkusil bych si dumpnout $this->taskList těsně předtím, než se pokoušíš iterovat ty $tasks v komponentě. Předej si ho komponentě a dumpni v latte, ať získáš proklikávací výpis.

Taky bych se podíval na to, jak funguje továrna createTasklists(), případně i createTasks(), createObserver() a createExecutor(). Třeba mezi nimi omylem sdílíš db tabulku, takže založení exekutora ti přepíše id v taskList. To bys pak měl tu souvislost s odeslaným formulářem ;-)