Odesílání dynamického formuláře

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

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

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ě)

Unlink
Člen | 298
+
+2
-

Skúsil by som vypísať
$this->presenter->getRequest()->getPost();
že či sa tie dáta vôbec odosielajú na server a problém je len zo spracovaním formuláru

Grez
Člen | 7
+
0
-
$form = new Form;

Nemáš tam Nette\Forms\Form() místo Nette\Application\UI()?

Lukeluha
Člen | 130
+
0
-

Grez napsal(a):

$form = new Form;

Nemáš tam Nette\Forms\Form() místo Nette\Application\UI()?

Má, ale bude mít obě varianty v use, jinak by se mu to vůbec nedostalo do té callback metody.

Wailey
Člen | 48
+
0
-

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

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

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

Myiyk
Člen | 321
+
0
-

Zkus ještě jednou popsat v čem je problém, co chceš aby to vrátilo a co ti to vrací.
A proměnná group je zjistitelná z group_id, nevím proč ji posíláš formulářem.

Editoval Myiyk (10. 5. 2015 15:29)

Wailey
Člen | 48
+
0
-

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->grouppresenter->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

Myiyk
Člen | 321
+
0
-

Do komponenty se při zpracování nedostanou hodnoty z group a group_id, proto se nevygenerují dynamická pole ve formuláři.

Jinak by tam byly ty pole minimálně s prázdnými hodnotami.

Wailey
Člen | 48
+
0
-

To vím, ale jak to? Už mě opravdu nic nenapadá, proč tam ty hodnoty jsou a pak ne…

Myiyk
Člen | 321
+
+1
-

Tak jdi po zdroji, odkud se berou prvně, když tam jsou.
A potom jdi znovu po zdroji, proč tam nejsou.

Podle kódu soudím, že group bereš z URL. Takže při zpracování asi v tom URL není.

Můžeš dát v presenteru

/** @persistent */
public $group;

možná ti to něco pomůže.

Wailey
Člen | 48
+
0
-

Perfektní, už to funguje, moc díky :)