na výsledek z databáze nelze použít metodu toArray()
- Jarek92
- Člen | 91
Dobrý den,
chci do editačního formuláře nacpat data z db, ale vypíše mi to chybu:
Nette\MemberAccessException → Call to undefined method
Nette\Database\ResultSet::toArray()
dotaz v modelu:
public function getOneContact($kontakt_id){
return $this->connection->query('SELECT hodnota, typ_kontaktu_id FROM kontakty WHERE kontakt_id=?', $kontakt_id);
}
metoda v presenteru:
public function actionEdit($kontakt_id)
{
$post = $this->contact->getOneContact($kontakt_id);
if (!$post) {
$this->error('Kontakt nebyl nalezen');
}
$this['addContact']->setDefaults($post->toArray());
}
nevíte někdo proč nemůžu použít na object metodu toArray()?
- Jan Mikeš
- Člen | 771
@Jarek92: query() totiz pouze vykona SQL query ale nemas zadne info o vysledku.
Zkus toto (nejsem si tim uplne jisty):
public function getOneContact($kontakt_id){
return $this->connection->query('SELECT hodnota, typ_kontaktu_id FROM kontakty WHERE kontakt_id=?', $kontakt_id)->fetch();
}
public function actionEdit($kontakt_id)
{
$post = $this->contact->getOneContact($kontakt_id);
if (!$post) {
$this->error('Kontakt nebyl nalezen');
}
$this['addContact']->setDefaults((array)$post);
}
- Jan Mikeš
- Člen | 771
A nebo muzes pouzit NDB pokud s tim nemas problem:
public function getOneContact($kontakt_id){
// Predpokladam ze $this->connection je instance Nette\Database\Context
return $this->connection->table("kontakty")
->select("hodnota, typ_kontaktu_id") // Tento radek lze vynechat, NDB cache pozna ktere sloupce pouzijes a bude automaticky selectovat pouze je
->wherePrimary($kontakt_id) // nebo take ->where("id", $kontakt_id)
->fetch();
}
Timto ziskas instanci Nette\Database\Table\ActiveRow|false takze actionEdit() muzes nechat tak jak mas s ->toArray()
- Jarek92
- Člen | 91
Díky moc za reakce, pak mi to došlo, že funkce toArray() vlastně na výsledek query není definovaná. Nakonec jsem to vyřešil tak, že jsem výsledek dotazu zpracoval do pole ještě v metodě getOneContact a to pole pak jen předal do formu.
public function getOneContact($kontakt_id){
$result = $this->connection->query('SELECT hodnota, typ_kontaktu_id FROM kontakty WHERE kontakt_id=?', $kontakt_id);
$pole=array();
foreach ($result as $value)
{
$pole['hodnota']=$value['hodnota'];
$pole['typ_kontaktu_id']=$value['typ_kontaktu_id'];
}
return $pole;
}
- David Matějka
- Moderator | 6445
na ResultSetu muzes zavolat ->fetch()
a nemusis tam delat
tyhle opicarny :)
nevíte, jak v php podmínce (v metodě Presenteru) zavolat js funkci a vyhodnotit ji (true/false)?
eh??
- Jarek92
- Člen | 91
matej21: OK, děkuju.
K té php s js. Chtěl jsem jen po klinutí na „Smazat“ spustit js funkci, která by se ještě pro kontrolu zeptala, jestli ano nebo ne a pak se spustilo teprve mazaní v metodě actionDelete.
Ještě bych měl jednu otázku. Udělal jsem si formulář, který má jeden select a který vybírá data podle sezony. Jenže ted řeším problém, jak udělat „přepisování“ dat v šabloně. Zatím mě napadlo to, že když zavolám šablonu default.latte poprvé, narvu tam dotaz bez parametru (prostě jen nejaktuálnější sezonu) a pak bych prostřednictvím formuláře předal jiné id sezony, jenže to asi fungovat nebude.
Zatím mám:
class CenikPresenter extends BasePresenter
{
/** @var \App\Cenik @inject */
public $cenik;
private $sezona_id;
public function renderDefault()
{
if(!$sezona_id){
$this->template->ubytovani = $this->cenik->getDefaultUbytovani();
}
else {
$this->template->ubytovani = $this->cenik->getUbytovani($sezona_id);
}
}
protected function createComponentSelectSeason()
{
$form = new Nette\Application\UI\Form;
$form->addSelect('sezona_id', 'Vyberte sezonu: ')
->setItems($this->cenik->getSeason())
->setAttribute('onchange', 'submit()');
$form->onSuccess[] = $this->selectSeasonFormSucceeded;
return $form;
}
public function selectSeasonFormSucceeded($form)
{
$values = $form->getValues();
$sezona_id = $this->getParameter('sezona_id');
$this->redirect('Cenik:default');
}
}
Je to řešení výhodné, nebo se na to dá jít i jinak?
Editoval Jarek92 (27. 2. 2014 14:14)