Avatar
solta
Člen
Avatar
solta:

ahoj potřeboval bych vytvářet formuláře dynamicky na stránce a zároveň do nich vkládat data doufal jsem že by mohlo fungovat toto
Presenter

function createComponentTitleForm() {
        return new Multiplier(function ($imageId, $title) {
            $form = new Form;
            $form->addText('title', 'Title:')->setRequired()->setValue($title);
            $form->addHidden('gallery_image_id', $imageId);
            $form->addSubmit('send', 'Ulozit');
            return $form;
        });
    }

Šablona

{control titleForm-$image->id, $image->title}

ale vyhodí to chybu Value must be scalar or NULL, object given in field 'title'
neví někdo co s tím

 
Odpovědět 21. srpna 22:33
Avatar
Odpovídá na solta
Martin Konečný (pavelco1998):

zdar,
můžeš tam předávat jen tu jednu hodnotu, pokud vim. Ve tvém případě by asi bylo lepší vytvořit si doslova komponentu, které to pak nacpeš do render() metody.

 
Nahoru Odpovědět  +1 21. srpna 22:36
Avatar
solta
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
solta:

Díky jsem s nette v začátcích a tak nějak nechápu co tím myslíš

 
Nahoru Odpovědět 22. srpna 21:27
Avatar
Martin Konečný (pavelco1998):

Asi něco takovýho (psáno z hlavy)

class GalleryFormControl extends Nette\Application\UI\Control
{

        public function render($imageId, $title)
        {
                $this["galleryForm"]->setDefaults(array(
                        "gallery_image_id" => $imageId,
                        "title" => $title
                ));

                $this->template->setFile("default.latte");
                $this->template->render();
        }


        public function createComponentGalleryForm()
        {
                $form = new Form();
                $form->addText("title", "Title:")
                        ->setRequired();

                $form->addHidden("gallery_image_id");
                $form->addSubmit("send", "Uložit");

                $form->onSuccess[] = array($this, "galleryFormSubmitted");

                return $form;
        }


        public function galleryFormSubmitted(Form $form, $values)
        {
                // your logic
        }

}

V šabloně by ti pak mělo stačit jen to vykreslit

{control galleryFormControl $image->id, $image->title}

V presenteru si to zaregistruješ stejně jako klasický formulář

public function createComponentGalleryFormControl()
{
        return new GalleryFormControl();
}
 
Nahoru Odpovědět  +1 22. srpna 21:37
Avatar
Nahoru Odpovědět 23. srpna 10:21
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
solta
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
solta:

můžu tě poprosit ještě o tu šablonu

$this->template->setFile("default.latte");

mě se tam ten formulář nedaří vykresli

 
Nahoru Odpovědět 24. srpna 2:17
Avatar
Odpovídá na solta
Martin Konečný (pavelco1998):
{control galleryFormControl $image->id, $image->title}

tohle by mělo stačit. Případně si to můžeš vykreslit manuálně jak chceš (pomocí maker {form}, {input} a {label}, nebo úplně ručně přes n:name atributy).

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 24. srpna 11:25
Avatar
Odpovídá na solta
Dominik Gavrecký:
{form galleryForm}
{input name}
{\form}
Nahoru Odpovědět  +1 24. srpna 12:37
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
solta
Člen
Avatar
 
Nahoru Odpovědět  +1 24. srpna 15:55
Avatar
solta
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
solta:

ještě je tam problem s gallery managerem

GalleryFormCon­trol.php

public function galleryFormSubmitted(Form $form, $values) {
        $galleryManager = new  GalleryManager();
        $this->galleryManager->saveImageTitle($values);
        $this->redirect('this');
}

Argument 1 passed to App\Model\Base­Manager::__con­struct() must be an instance of Nette\Database\Con­text, none given, called in D:\work\galery\ap­p\CoreModule\For­m\GalleryFormCon­trol.php on line 37 and defined

BaseManager.php

abstract class BaseManager extends Object {

    protected $database;

    public function __construct(Context $database) {
        $this->database = $database;
    }

}
 
Nahoru Odpovědět 25. srpna 0:20
Avatar
Odpovídá na solta
Martin Konečný (pavelco1998):

Tak to pak budeš muset řešit přes továrny, které tu závislost té komponentě automaticky předají.

class GalleryFormControlFactory
{

        private $galleryManager;

        public function __construct(GalleryManager $galleryManager)
        {
                $this->galleryManager = $galleryManager;
        }


        public function create()
        {
                return new GalleryFormControl($this->galleryManager);
        }

}

tu továrnu si zaregistruješ v configu

- Tvuj\Namespace\GalleryFormControlFactory

v presenteru si to pak injectneš automaticky

/**
 * @var Tvuj\Namespace\GalleryFormControlFactory
 * @inject
 */
public $galleryFormControlFactory;



public function createComponentGalleryFormControl()
{
        return $this->galleryFormControlFactory->create();
}

v té komponentě pak dostaneš ten GalleryManager přes konstruktor, uložíš do privátní proměnné a v galleryFormSub­mitted() budeš moct použít $this->galleryManager

 
Nahoru Odpovědět 25. srpna 0:24
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.