na výsledek z databáze nelze použít metodu toArray()

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

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()?

Etch
Člen | 403
+
0
-

No pravděpodobně proto, že ResultSet nemá takovou metodu definovanou, jak ostatně říká i chybová hláška.

$this['addContact']->setDefaults(iterator_to_array($post));
Jan Mikeš
Člen | 771
+
0
-

@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
+
0
-

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
+
0
-

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;
  }
Jarek92
Člen | 91
+
0
-

BTW:
nevíte, jak v php podmínce (v metodě Presenteru) zavolat js funkci a vyhodnotit ji (true/false)?

Editoval Jarek92 (27. 2. 2014 11:52)

David Matějka
Moderator | 6445
+
0
-

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
+
0
-

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)