vyplňování Hidden fieldu v šabloně vrací prázdnou hodnotu

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

Ahoj,
od rána se snažím rozchodit následující situaci.

PRESENTER

<?php
  protected function createComponentVlozPresneForm()
  {
	$form = new NAppForm;
	$form->addHidden('id_produktu');

	$form->addText('ks', 'ks', 2)
    	.....
	$form->addImage('save', $this->template->basePath . '/images/basket-add-mini.png')->setAttribute('class', 'default');

	$form->onSuccess[] = callback($this, 'vlozPresneFormSubmitted');
	return $form;
  }

  public function vlozPresneFormSubmitted($form)
	{
		$hodnoty = $form->getValues();
		NDebugger::dump($hodnoty);exit;
	}
?>

TEMPLATE

	{foreach $produkty as $item => $id}
		{form vlozPresneForm}
		{input id_produktu value => $id->id_produktu}
		{input ks cols => 3, value => 1}
{input save}
		{/form vlozPresneForm}
	{/foreach}

Po odeslání formuláře vypadají uložené hodnoty takto:

<?php
NArrayHash(2) {
   id_produktu => ""
   ks => "1"
}
?>

Nejsem schopen žádným způsobem zapsat do Hidden fieldu. Prosím o radu, popř. názornou ukázku ideálně s vysvětlivkou i pro blbce, už jsem z toho na hlavu.
Používám poslední verzi nette 2.0-beta ze dne 4. 8. 2011.

Ano, díval jsem se už zde , ale bohužel jsem to nerozchodil .

Díky moc, Tonda

Filip Procházka
Moderator | 4668
+
0
-

Ajaja :) Prohlédni si sandbox addDynamic, stáhni a registruj.

protected function createComponentVlozPresneForm()
{
	$form = new Nette\Application\UI\Form;
	$presenter = $this;
	$form->addDynamic('products', function (Nette\Forms\Container $container) use ($presenter) {
		// sleduj jak zmizí ten hidden

		$container->addText('ks', 'ks', 2);
		.....

		$icon = $this->template->basePath . '/images/basket-add-mini.png';
		$save = $container->addImage('save', $icon)
			->setAttribute('class', 'default');
		$save->onClick[] = callback($presenter, 'vlozPresneFormSubmitted');
	});

	return $form;
}

V šabloně

{form vlozPresneForm}
	{foreach $produkty as $item => $id}
	        {$form['products'][$id]['ks']->control}
        	{$form['products'][$id]['save']->control}
	{/foreach}
{/form}

zpracování

public function vlozPresneFormSubmitted(Nette\Forms\Controls\SubmitButton $save)
{
	$id = $save->parent->name;
	$ks = $save->parent['ks']->value;

	Nette\Debugging\Debugger::dump(array(
		'id' => $id,
		'ks' => $ks
	)); die();
}

Namespaces si zvládneš sám opravit ne? :)

Sonic
Člen | 6
+
0
-

Perfektní, funguje to. Mockrát Ti děkuju. Už jsem byl tak zoufalej, že jsem to měl vyřešený i dost prasácky, jakože jsem z šablony volal $presenter->vratForm($id); což teda bylo hodně nečistý a nefungovalo to úplně podle mých představ.
Znovu dík!

radikus
Člen | 11
+
0
-

Ahoj, no perfektní to moc není. Podle mě tenhle případ zbytečně komplikuje naprosto standardní dynamické vkládání hiddenu do formulářů.
Ještě k addDynamic:
Existuje jiný způsob generování inputů než je tento?

<?php
{$form['products'][$id]['ks']->control}
?>

Výše uvedený způsob vygeneruje něco jako

<?php
Nette\ArrayHash Object ( [$id] => Nette\ArrayHash Object ( [ks] => ... ) )
?>

Myslím tím, že moje dynamická hodnota, kterou chci jako value daného inputu je vlastně index pole inputů.
To zase komplikuje zpracování, protože v moji metodě zpracovávám arrayHash Object. A potřebuji tedy zjistit hodnotu indexu jednoho prvku, který v něm je. Přes arrayHash Object to asi nezjistím nijak nebo nevím jak. Takže musím přetypovat arrayHash Object na array

<?php
$arrayHash = $arrayHash->getIterator()->getArrayCopy();
?>

a teprve potom zjistim index prvku

<?php
array_keys($arrayHash);
?>

UF.

Takže se ptám, existuje jiná varianta vygenerování dynamického inputu tak, aby dynamická hodnota byla jako value inputu?

Filip Procházka
Moderator | 4668
+
0
-

Ano, nepoužívej Nette a vrať se k bastlení formulářů v šablonách :)

Můžeš si tu funkcionalitu otočit tak, aby to připomínalo co chceš ty.

$ks = $form->addContainer('ks');
foreach (...
	$ks->addText($i, 'ks:');

Ale pomáhat ti v tom nehodlám, protože v tom nevidím přínos.

radikus
Člen | 11
+
0
-

HosipLan napsal(a):

Ano, nepoužívej Nette a vrať se k bastlení formulářů v šablonách :)

Můžeš si tu funkcionalitu otočit tak, aby to připomínalo co chceš ty.

$ks = $form->addContainer('ks');
foreach (...
	$ks->addText($i, 'ks:');

Ale pomáhat ti v tom nehodlám, protože v tom nevidím přínos.

Díky, někdy to vyzkouším až bude čas..

art
Člen | 2
+
0
-

:)
No možná chtěl jen radikus vypsat v šabloně pod sebou několik formu a v každém mít input type=hidden s nějakou hodnotou z databáze. Nic světoborného. Taky jsem to hledal, také nenalézal, ale nevzdal a byl jsem odměněn. Takže snad ti radikus postačí místo stahování, registrování, a škrábání se za pravým uchem pravou nohou tento link viz. úplně dole #35
https://forum.nette.org/…zeni-smazani

special thx. Bazylek,Tomáše M.

radikus
Člen | 11
+
0
-

art napsal(a):

:)
No možná chtěl jen radikus vypsat v šabloně pod sebou několik formu a v každém mít input type=hidden s nějakou hodnotou z databáze. Nic světoborného. Taky jsem to hledal, také nenalézal, ale nevzdal a byl jsem odměněn. Takže snad ti radikus postačí místo stahování, registrování, a škrábání se za pravým uchem pravou nohou tento link viz. úplně dole #35
https://forum.nette.org/…zeni-smazani

special thx. Bazylek,Tomáše M.

Super, to je to co jsem potřeboval – funguje. Takže řešením je jeden řádek v šabloně.

<?php
{form attachmentList}
	{?$control['attachmentList']['attachment_id']->setValue($row['attachment_id'])}
{/form}
?>

Tajně jsem doufal, že to půjde vyřešit čistěji :-).
Určitě doporučuji tohle jednořádkové řešení než dělo na vrabce uvedeno výše.
Díky.

Filip Procházka
Moderator | 4668
+
0
-

Určitě tohle jednořádkové „řešení“ nedoporučuji. Je to neskutečná prasárna. Moje řešení není dělo na vrabce.

Tomáš Votruba
Moderator | 1114
+
0
-

Není to tak trochu bug, že právě u hidden value nefunguje?

<?php

{input text, value => "Funguje"}
{input hidden, value => "Nefunguje"}

?>
Filip Procházka
Moderator | 4668
+
0
-

Není. Byť je to WTF.

Tomáš Votruba
Moderator | 1114
+
0
-

Má to nějaký důvod, smysl, účel, vysvětlení?
Proč to není třeba tak, že nefunguje value u textu a naopak? :)

bazo
Člen | 620
+
0
-

no ja neviem, mne nastavenie hodnoty hidden inputu v sablone normalne funguje

Tomáš Votruba
Moderator | 1114
+
0
-

bazo napsal(a):

no ja neviem, mne nastavenie hodnoty hidden inputu v sablone normalne funguje

Můžeš uvést formulář v presenteru a šabloně?