predvyplneni inputu ve formulari pomoci setDefaultValue

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

Ahoj neporadily by jste mi prosim jak do inputu nacist hodnotu z DB nastavit ji a pripadne zabranit aby uzivatel mel moznost ji upravit, kliden nech ji vidi.
$free_spots je pokud si dumpnu v presenteru

Nette\Database\Table\Selection #f121
context protected => Nette\Database\Context #bc46
connection private => Nette\Database\Connection #acb7
structure private => Nette\Database\Structure #d313
connection protected => Nette\Database\Connection #acb7 { ... }
cache protected => Nette\Caching\Cache #e1cd { ... }
structure protected => array (5) [ ... ]
isRebuilt protected => FALSE
conventions private => Nette\Database\Conventions\DiscoveredConventions #5062
cacheStorage private => Nette\Caching\Storages\FileStorage #8d0a
conventions protected => Nette\Database\Conventions\DiscoveredConventions #5062
cache protected => Nette\Caching\Cache #8348
sqlBuilder protected => Nette\Database\Table\SqlBuilder #6229
name protected => "parking_reservation" (19)
primary protected => "id" (2)
primarySequence protected => FALSE
rows protected => NULL
data protected => NULL
dataRefreshed protected => FALSE
globalRefCache protected => array (1)
"" => array (1)
referencingPrototype => array ()
refCache protected => array (1)
referencingPrototype => array ()
generalCacheKey protected => NULL
generalCacheTraceKey protected => NULL
specificCacheKey protected => NULL
aggregation protected => array ()
accessedColumns protected => NULL
previousAccessedColumns protected => NULL
observeCache protected => FALSE
keys protected => array ()
$form->addText('parking_place_id', 'Parking place')
                 ->setDefaultValue($free_spots->parking_place->label);

pokud to takhle pustim tak mi to vyhodi hlasku

Undefined variable: free_spots

potreboval bych si z toho vytahnout jenom to id parkovaciho mista nebo to lable.

Dekuji moc za pomoc.

Oli
Člen | 1215
+
0
-

V tvém případě je $free_spots kolekce řádků. Musíš nad tím zavolat ještě fetch.

Aby neměl možnost to změnit nepotřebuješ. Prostě to nezpracuješ při ukládání. Jinak můžeš nastavit setDisable(true), nebo jak se to zapisuje. Pak to nemá možnost změnit (přes formulář). V kodu můžeš měnit všechno ;-)

parti
Člen | 117
+
0
-

Ono to nebude asi tak jednoduche u me pokud na tom zavolam fetch tak mi to vyhodi chybu

Call to undefined method Nette\Database\Table\ActiveRow::count()

odkazuje me to do sablony na tenhle radek

{if $free_spots->count('*')}

a dotaz mam takhle

$free_spots = $this->database->table('parking_reservation')
        ->where('parking_user_id IS NULL AND is_deleted = 0 AND to > ?', $this->today)
        ->order(isset($ordering['available_spots']) ? $ordering['available_spots'] : 'from DESC')->fetch();
Oli
Člen | 1215
+
0
-

No, pleteš to.

$free_spots = $this->database->table('parking_reservation')
        ->where('parking_user_id IS NULL AND is_deleted = 0 AND to > ?', $this->today)
        ->order(isset($ordering['available_spots']) ? $ordering['available_spots'] : 'from DESC');

Tohle ti vytáhne objekt Selection. Což je kolekce řádků. Prostě něco, co hodíš do feache a proiteruješ. Nebo nad tím můžeš zavolat tu metodu count(). Odsud název sloupce nedostaneš.

Pokud nad tím zavoláš fetch. Tak ti to vrátí objekt ActiveRow. A ten už obsahuje jednotlivé názvy sloupců a můžeš zavolat to $free_spots->parking_place_id.

A protože to je už jeden řádek, tak je jasné, že volat nad ním count() je blbost, proto to ani nejde.

Snad jsem ti to aspoň trochu objasnil :-)

parti
Člen | 117
+
0
-

@Oli
hm ok prvni odstavec
„Tohle ti vytáhne objekt Selection. Což je kolekce řádků. Prostě něco, co hodíš do feache a proiteruješ. Nebo nad tím můžeš zavolat tu metodu count(). Odsud název sloupce nedostaneš.“
jsem pochopil ok

ale nerozumim cemu rikas „Pokud nad tím zavoláš fetch.“ fetch vim co je ale kde presne myslis zavoals nad tim ?
Nemuze mi to ukazat?
Dekuji za pomoc

RePRO
Člen | 32
+
0
-

Oli to napsal celkem jasně. To, co ti vrátí teď $free_spots tak to je Selection. Když nad tím zavoláš ještě fetch, tedy např. $free_spot = $free_spots->fetch() tak to vrací ActiveRow.

Oli
Člen | 1215
+
0
-

Takže pokud potřebuješ oboje, tak by to mohlo vypadat takhle:

$free_spots = $this->database->table('parking_reservation')
	->where('parking_user_id IS NULL AND is_deleted = 0 AND to > ?', $this->today)
	->order(isset($ordering['available_spots']) ? $ordering['available_spots'] : 'from DESC');

$free_first_spot = $free_spots->fetch();

{foreach $free_spots as $spot}
	{$spot->parking_place->label}
{/foreach}

{$free_first_spot->parking_place->label}
parti
Člen | 117
+
0
-

@Oli Dekuji moc ted mi je to uz trochu jasny. Ale da se ted ta hodnota nastavit ve fromulari jako vychozi ?? Neco jako

$form->addText('parking_place_id', 'Parking place')
              ->setDefaultValue($free_first_spot->parking_place->label)
              ->setAttribute('placeholder', 'parking place');

Tento zapis neni dobre vyhodi mi to chybu Undefined variable: free_first_spot. Takze takhle to asi nepujde.
Uzivatel nema moznost menit misto stani ale to mu je prideleno podle toho jak se uvolni.On si vybere jenom datum od do.
Dekuji moc za pomoc a vysvetleni.

Oli
Člen | 1215
+
0
-

Vzdyt to je jasny. Undefined variable: free_first_spot. Tohle ti rika co? Ze ta promenna neexistuje. Takže ji nemáš vytvořenou. Nebo ji máš vytvořenou jinde a musíš si ji tam předat…

A jinak ano, pak to děláš celkem dobře. Takhle to jde nastavit.