Odesílání dynamického formuláře
- Wailey
- Člen | 48
Ahoj,
Mám vytvořený dynamický formulář
Component
public function render()
{
$this->template->setFile(__DIR__ . '\addShopItemControl.latte');
$this->template->group = $this->presenter->group;
$this->template->parameters = $this->presenter->shop->getGroupParamAll($this->presenter->group_id);
$this->template->products = $this->presenter->shop->getProductAll($this->presenter->group_id);
$this->template->render();
}
protected function createComponentAddShopItemForm() {
$carData = $this->presenter->car->getCarSelectAll();
$manudacturerData = $this->presenter->manufacturer->getManufacturerSelectAll();
array_unshift($carData,"");
$form = new Form;
$form->addSelect("car_id", "Auto", $carData);
$form->addSelect("manufacturer_id", "Výrobce", $manudacturerData);
$form->addText('title')->setAttribute("placeholder", "Název produktu");
$form->addText('description')->setAttribute("placeholder", "Popis produktu");
$form->addText('type')->setAttribute("placeholder", "Typ");
$form->addText('price')->setAttribute("placeholder", "Cena");
$form->addText('discount')->setAttribute("placeholder", "Sleva");
$form->addText('stock')->setAttribute("placeholder", "Skladem");
$form->addUpload('product_image', "Obrázky")
->addRule(Form::IMAGE, 'Obrázek musí být JPEG, PNG nebo GIF.')
->addRule(Form::MAX_FILE_SIZE, 'Maximální velikost souboru je 2 MB.', 2048 * 1024);
$parameters = $this->presenter->shop->getGroupParamAll($this->presenter->group_id);
foreach($parameters as $parameter) {
$form->addText($parameter->key)->setAttribute('placeholder', $parameter->name);
}
$form->addHidden('group', $this->presenter->group);
$form->addHidden('group_id', $this->presenter->group_id);
$form->addSubmit('send', 'Uložit');
$form->onSuccess[] = callback($this, 'addShopItemFormSubmitted');
return $form;
}
public function addShopItemFormSubmitted(UI\Form $form) {
$values = $form->getValues(true);
dump($values);exit;
Problém nastává zde v Array $values, zobrazí se vše kromě input(text)
vygenerovaným dynamicky,
i když se všechny inputy vykreslý a vše je v pořádku i s name inputu,
data se neodesílají vůbec, co s tím?
array(11) {
car_id => "2"
manufacturer_id => "1"
title => "HAPRO Traxer 8,6 Pure White" (27)
description => "Střešní box z prvotřídních materiálů ASA/ABS, opatřený oboustranným otevíráním s centrálním zamykáním. Rychloupínací systém Prém ... " (362)
type => "8826185" (7)
price => "14990" (5)
discount => "15" (2)
stock => "6"
product_image => Nette\Http\FileUpload(5) {
name private => "1310826482_192.jpg" (18)
type private => "image/jpeg" (10)
size private => 10249
tmpName private => "C:\Dropbox\EasyPHP-DevServer-14.1VC9\binaries\tmp\php64BE.tmp" (61)
error private => 0
}
group => "autoboxy" (8)
group_id => "3"
}
Component Latte
{form addShopItemForm}
{input car_id}
{input manufacturer_id}
{input group_id}
{input title}
{input description}
{input type}
{input price}
{input discount}
{input stock}
{input product_image}
<h3>Parametry</h3>
{if $parameters}
{foreach $parameters as $parameter}
{input $parameter->key}
{/foreach}
{/if}
{input send}
{/form}
Díky za pomoc :)
- Lukeluha
- Člen | 130
Máš nějaký důvod proč vykreslovat formulář ručně místo použití
{control form}
?
Zároveň volání typu
$this->presenter->car->getCarSelectAll();
je špatné,
vyžádej si repozitář nebo DatabseContext (nebo co je ta proměnná car
v presenteru) přímo v konstruktoru komponenty – komponenta má být
znovupoužitelný logický prvek – nyní rozhodně není, protože silně
závisí na tom, co je v presenteru.
Každopádně proč se ti to neposílá přesně nevím (zkus renderovat formulář automaticky – zde nevidím důvod proč jej renderovat ručně)
- Wailey
- Člen | 48
První je vrácení výstupu z Values
Nette\ArrayHash(11) {
car_id => "2"
manufacturer_id => "1"
title => "xvcb" (4)
description => "cvb" (3)
type => "xcvb" (4)
price => "454545" (6)
discount => "4"
stock => "45" (2)
product_image => Nette\Http\FileUpload(5) {
name private => "1310826485_192.jpg" (18)
type private => "image/jpeg" (10)
size private => 19652
tmpName private => "C:\Dropbox\EasyPHP-DevServer-14.1VC9\binaries\tmp\php7C58.tmp" (61)
error private => 0
}
group => "autoboxy" (8)
group_id => "3"
}
Druhý z Post
array(12) {
car_id => "2"
manufacturer_id => "1"
group_id => "3"
title => "xvcb" (4)
description => "cvb" (3)
type => "xcvb" (4)
price => "454545" (6)
discount => "4"
stock => "45" (2)
weight => "4545" (4) <- tady se zobrazuje, ve formu ne - je to zvláštní magie :/
send => "Uložit" (7)
group => "autoboxy" (8)
}
- Myiyk
- Člen | 321
Při odesílání formuláře se ten formulář musí znovu vygenerovat aby
věděl jaká pole obsahuje a mohl ověřit hodnoty a přebytečné zahodit.
Při vygenerování formuláře se nevytvoří pole weight
,
protože kdyby se vytvořilo, jeho hodnota by byla minimálně prázdný string.
I kdyby jsi mu nic neposlal.
U tvého formuláře se negeneruje nic se jménem „weight“.
Podle tvého kódu bych to viděl na problém s proměnnou
$this->presenter->group_id
, vypiš si ji jakou má hodnotu
při generování formuláře a při zpracování. Nejspíš bude NULL.
- Wailey
- Člen | 48
Při generování formuláře má group i group_id hodnotu, při odesílání už nemá
Presenter
class AdminPresenter extends BasePresenter {
public $group;
public $group_id;
public $group_name;
public $product;
protected function startup() {
parent::startup();
if (!$this->getUser()->isLoggedIn() || !$this->getUser()->isInRole("admin")) {
$this->redirect('Homepage:');
}
$this->group = $this->getParameter("group");
$this->group_id = $this->shop->getGroupID($this->group);
$this->group_name = $this->shop->getGroupName($this->group_id);
preg_match('([0-9]+$)',$this->getParameter("id"),$this->product);
}
public function renderShop() {
$this->template->group = $this->group;
$this->template->product = $this->product;
$this->template->group_name = $this->group_name;
}
V componentu sbírám data z presenteru, a ptám se skrze model na obsah parametrů v DB, které vytvářím skrze form, a pak rendruji skrze poslaný parametr do šablony. Problém nastává při odesílání, v postu data jsou, vykreslené pole taky, ale nevím kde dělám chybu, že se mi nezobrazují v $form->values()
- Wailey
- Člen | 48
mám %domain%/admin/<group>
AdminPresenter vytahuje parametr group a ukládá je do presenter->group
Component addShopItemControl
se ptá presenteru na proměnou group a podle ní z modelu pomocí funkce getGroupParamAll podle group_id z databáze tahá Array s názvy a klíči pro formulář, vytvoří formulář a v šabloně „ručně“ vykreslí, vše funguje do doby, než se formulář odešle, jakmile se formulář odesílá už je proměnná presenter->group i presenter->group_id prázdné, a i když ve výpisu postu naleznu názvy z dynamického formuláře, ve $form->getValues() nejsou vůbec, jen ty co jsou staticky napsané.
Už mi jde z toho hlava kolem, je to čarovné :D