vkladanie formulara do db …
- duskohu
- Člen | 778
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
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.
- petr.pavel
- Člen | 535
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
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>
- petr.pavel
- Člen | 535
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
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
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 ;-)