Předání vlastního objektu formuláři

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

Napsal jsem si vlastni tridu. Pro tuto tridu jsem si vytvoril instanci (objekt) a tím se snazim naplnit formular pomoci metody setDefaults(). Mam problem v tom, ze mi to hlasi chybu „Values must be an array, object given.“ Pritom, kdyz jsem si vypsal vrácenou promennou, ta vypada nasledovne (zda se mi stejna jako vraci DibiRow):

<?php
  Admin_BlokyEditModels(7) {
   "nadpis1" private => "Kdo jsme" (8)
   "barvaID1" private => "2"
   "nadpis2" private => "a co děláme" (13)
   "barvaID2" private => "1"
   "nadpis3" private => NULL
   "barvaID3" private => NULL
   "text" private => "<p>Du&scaron;evn&iacute" (654)
}
?>

Moje vztvorena trida:

<?php

class Admin_BlokyEditModels extends NObject
{

    private $nadpis1;
    private $barvaID1;
    private $nadpis2;
    private $barvaID2;
    private $nadpis3;
    private $barvaID3;
    private $text;


    public function __construct() {
    }

    public function nacti1BlokText($blokTextID) {

        $connection = dibi::getConnection();
        $results = $connection->query('
        SELECT bt.text, rn.nadpis, rn.barvaID
        FROM radeknadpis rn, radeknadpistext rnt, bloktext bt
        WHERE bt.blokTextID = %i',$blokTextID,'
        AND bt.blokTextID = rnt.blokTextID
        AND rnt.radekNadpisID = rn.radekNadpisID
        ORDER BY rn.pozice ASC
        ');

        $i = 1;
        foreach ($results AS $result) {

            if($i == 1) {
                $this->nadpis1 = $result->nadpis;
                $this->barvaID1 = $result->barvaID;
            }
            if($i ==2) {
                $this->nadpis2 = $result->nadpis;
                $this->barvaID2 = $result->barvaID;
            }
            if($i == 3) {
                $this->nadpis3 = $result->nadpis;
                $this->barvaID3 = $result->barvaID;
            }
            $i++;
        }

        $result2 = $connection->query('
        SELECT bt.text
        FROM bloktext bt
        WHERE bt.blokTextID = %i',$blokTextID)->fetch();
        $this->text = $result2->text;
        return $this;
    }
}

?>

Predani dat do formulare:

<?php
   public function renderEditText($blokTextID) {
        $bloky = new Admin_BlokyEditModels();
        $form = $this['blokTextForm'];
        $result = $bloky->nacti1BlokText($blokTextID);
        NDebug::dump($result);
        $form->setDefaults($result);
    }
?>

Editoval saimons (24. 11. 2010 8:05)

Solution
Člen | 50
+
0
-

saimons napsal(a):
ze mi to hlasi chybu „Values must be an array, object given.“

Je to řečeno zcela jasně, parametr fce je pole a ty se mu snažíš vnutit objekt.

sodae
Nette Evangelist | 250
+
0
-

špatná implementace DibiResult, ta nemá implementaci array (pouze má iteraci), takže musíš výstup přetypovat na array a to bud v setDefaults od formuláře nebo u return od metody modelu

Edit: špatné pochopení kodu

Nette\Object nemá implementaci array, tedy si musíš implementovat

Editoval sodae (23. 11. 2010 20:45)

saimons
Člen | 293
+
0
-

Diky za tip, s pretypovanim to funguje, ale pouze pokud nastavim atributy jako public, ale to se mi zda jako docela prasarna (porusi se tim zapouzdrenost). Tak se mi tak zda, ze jsem na to sel nak spatne, nemelo by se to resit nak pres „get“? Nebo uplne nejak jinak?

saimons
Člen | 293
+
0
-

Aha, tak uz jsem to asi pochopil, diky za radu nakonec jsem to teda udelal takto:

<?php
class Admin_BlokyEditModels extends NObject {

    private $connection;
    private $pole = array();

    public function __construct() {
        $this->connection = dibi::getConnection();
    }

    public function getPole() {
        return $this->pole;
    }

    public function nacti1BlokText($blokTextID) {
	$this->pole[] = ...
	}
?>