DataGrid – akce Editace podle ID

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

Dobrý podvečer, začínám s Nette a zasekl jsem se na téhle situaci.

Na stránce používám https://componette.org/search/?…,

$grid->addNumericColumn('id', 'User ID')->addFilter();
$grid->addColumn('surname', 'Surname')->addFilter();
$grid->addColumn('name', 'Name')->addFilter();
...
$grid->addActionColumn('actions', 'Actions');
$grid->addAction('Edit', 'edit!', Html::el('span')->class('icon icon-edit'), $useAjax = TRUE);
$grid->addAction('Delete', 'delete!', Html::el('span')->class('icon icon-del'), $useAjax = TRUE);

S mazáním problém není, protože jenom zavolám SQL příkaz a refreshnu stránku.

Nevím, jak si však poradit s editací, kde se potřebuji přesměrovat na jinou stránku. Poradíte mi prosím, jak bych si mohl předat ID, abych ho po přesměrování na jiné stránce mohl použít?

public function handleEdit($id) {
    // Predani ID.
    $this->redirect('edituser');
}

Děkuji :-).

Editoval DavidSen (28. 4. 2013 19:32)

Glottis
Člen | 129
+
0
-

cus, v presenteru si nadeklaruj

/** @persistent */
public $necoId;

a v handle do toh oprirad

public function handleEdit($id) {
    // Predani ID.
    $this->necoId = $id;
    $this->redirect('edituser');
}

a pri zpracovani bys to mel mit dostupne v $this->necoId

DavidSen
Člen | 2
+
0
-

Glottis: Díky za pomoc :-)!

Šaman
Člen | 2666
+
0
-

Nechápu, proč jdeš nejdřív na handler a pak z něho přesměrováváš na edit. Proč ten první link nemíří hned na pohled edit?

Swiss
Člen | 4
+
0
-

Šamane, jak by v tom pohledu ‚edit‘ mohl pracovat s předávaným $id? Jsem začátečník a řeším stejnou věc.

Glottis
Člen | 129
+
0
-

uplne stejne jako v handle. propadne to tam do volani akce

public function actionEdit($id) {
	...
}

public function renderEdit($id) {
	...
}

edit: a action predelas nejspis na

$grid->addAction('Edit', 'NejakyPresenter:edit', Html::el('span')->class('icon icon-edit'), $useAjax = TRUE);

Swiss napsal(a):

Šamane, jak by v tom pohledu ‚edit‘ mohl pracovat s předávaným $id? Jsem začátečník a řeším stejnou věc.

Editoval Glottis (29. 4. 2013 23:44)

Swiss
Člen | 4
+
0
-

Dobrá, díky. Předpokládám, že použít (int) $this->getParameter(‚id‘), jak je ostatně použito ve vzorovém příkladu, je nečisté řešení…

Šaman
Člen | 2666
+
0
-

Předpokládáš správně. Ideální je, aby metoda dostala své závislosti a parametry při volání metody a netahala si je sama.
Stejně tak bych nepoužíval v tomhle případě persistentní parametr – ten se hodí třeba na udržování vnitřního stavu aplikace, tohle bych řešil voláním fce s parametrem.

Swiss
Člen | 4
+
0
-

Když si tuhle diskuzi přečtu celou od začátku, jsem přesvědčen, že se jen neumím správně zeptat. Proto se to pokusím pečlivě vysvětlit znova.

  • Na samém začátku je datagrid, ve kterém vytvořím tlačítko na úpravu uživatele: $grid->addAction('Edit','edituser'
  • Takto nastavené mi tlačítko zobrazí pohled edituser.latte, který obsahuje řádek {widget editUserForm}
  • Šablona vytvoří formulář voláním funkce createComponentEditUserForm(), která formulář mimo jiné naplní aktuálními daty uživatele, jehož bylo to tlačítko v datagridu. Jenže aby ta funkce mohla ten formulář naplnit, musí znát id tohoto uživatele, aby si ho našla v databázi.

Znovu se tedy ptám: Jak mohu korektně zařídit, aby mi tlačítko Edit zobrazilo novou stránku s formulářem vyplněným aktuálními daty uživatele, u kterého jsme stiskli toto tlačítko, když tvrdíš, že jak použití /** @persistent */ ve funkci handleEdit($id), tak použití (int) $this->getParameter('id') ve funkci createComponentEditUserForm() je špatně?

Šaman
Člen | 2666
+
0
-

Když v té ukázce v prvním příkladu nebude za edit vykřičník, tak se zavolá nejprve actionEdit($id) a následně renderEdit($id) na stávajícím presenteru. Pokud použiješ třeba User:edit, tak se zavolají tyto metody na UserPresenteru. $id jim v každém případě bude předáno jako paramatr, nemusí si ho nikde hledat.

Tento parametr předáš do šablony a formulář vytvoříš pomocí {control editUserForm $id}

Editoval Šaman (30. 4. 2013 2:42)

Swiss
Člen | 4
+
0
-

Tento parametr předáš do šablony a formulář vytvoříš pomocí {control editUserForm $id}

To mi křičí debugger na šabloně: Undefined variable: id.

Šaman
Člen | 2666
+
0
-

Tento parametr předáš do šablony a formulář vytvoříš pomocí {control editUserForm $id}.
Tedy v presenteru budeš mít např.

<?php
renderEdit($id)
{
    $this->template->id = $id;
}
?>