drahak/Restful, nette/form – odoslanie

pisa98
Člen | 17
+
0
-

Chcel by som sa opytat ako poslem data z formulara na svoje vlastne API. Nevedel som sa nikde nic docitat ako to pouzivat. Som uplny novacik v API.

Tu je formular

protected function createComponentArticleForm(): Form
    {

        $id = $this->presenter->getParameter('id');
        $getArticle = $this->articleRepository->get(['id' => $id]);
        $getCategories = $this->categoryRepository->findPairs('title', 'id', [], 'id ASC');

        $form = new Form;
        $form->addText('title', 'Titulok:');
        $form->addTextArea('description', 'Opis');
        $form->addTextArea('content', 'Obsah');
        $form->addText('slug', 'Slug:');
        $form->addSelect('categories', 'Kategórie', $getCategories)
            ->setPrompt('Nezaradené');
        $form->addTextArea('alt', 'Vložiť popis obrázka');
        $form->setAction('/api/v1/articles/create');
        $form->setMethod('POST');

        if ($getArticle) {
            $getRelCategory = $getArticle->related('category')->fetch();
            $form->setDefaults([
                'title' => $getArticle['title'],
                'slug' => $getArticle['slug'],
                'description' => $getArticle['description'],
                'content' => $getArticle['content'],
                'categories' => $getRelCategory['category_id']
            ]);
        }
        $form->addSubmit('send', 'Save');

        return $form;
    }

Tu je action

	/**
 * @POST api/v1/article
 */
public function actionCreate()
{
    $articles = $this->articleRepository->create();
    $this->resource->article = $articles;
}

Jak prijme tie parametre z formulara?

Editoval pisa98 (9. 7. 2017 16:13)

David Matějka
Moderator | 6445
+
0
-

to tvoje API je v jine aplikaci, nez ten formular?

pisa98
Člen | 17
+
0
-

David Matějka napsal(a):

to tvoje API je v jine aplikaci, nez ten formular?

Ano je v article presentri a ten formular je samostatna komponenta

David Matějka
Moderator | 6445
+
0
-

ale aplikace je to stejna? to znamena je to stejny codebase, bezi to na stejne domene?

k tomuhle API neslouzi, api slouzi k tomu, kdyz chces komunikovat s nejakou externi aplikaci nebo treba kdyz JS frontend posila datab PHP backendu.

tady proste uloz ten formular primo ve zpracovani formulare – idealne skrz nejakou facade, aby se ti neduplikoval kod ve zpracovani formmulare a zpracovani API pozadavku (pokud tedy api opravdu furt potrebujes :))

pisa98
Člen | 17
+
0
-

David Matějka napsal(a):

to tvoje API je v jine aplikaci, nez ten formular?

Sorry zle som precital, je to v tej istej aplikacii aj formular aj api

pisa98
Člen | 17
+
0
-

David Matějka napsal(a):

ale aplikace je to stejna? to znamena je to stejny codebase, bezi to na stejne domene?

k tomuhle API neslouzi, api slouzi k tomu, kdyz chces komunikovat s nejakou externi aplikaci nebo treba kdyz JS frontend posila datab PHP backendu.

tady proste uloz ten formular primo ve zpracovani formulare – idealne skrz nejakou facade, aby se ti neduplikoval kod ve zpracovani formmulare a zpracovani API pozadavku (pokud tedy api opravdu furt potrebujes :))

Nesluzi k tomu aby komunikovalo s nejakou externou aplikaciou. Zatial ani front end neposiela data ale v buducnosti chcem aby aj to bolo. A jak spravim to zpracovanie poziadavku? Nevies mi poslat nieco k tomu alebo napisat?

David Matějka
Moderator | 6445
+
+1
-

Mas nekolik moznosti, jak to vyresit:

  1. pouze definice a vykresleni formulare skrz nette, zpracovani pres JS na backend API

pri definici formulare v nette nadefinujes pouze strukturu a nebudes resit onSuccess a zpracovani v ramci klasickeho zivotniho cyklu presenteru. v takovem pripade nemusis pouzivat Nette\Application\UI\Form, ale pouze Nette\Forms\Form.
Nemuzes vsak pouzivat

$form->setAction('/api/v1/articles/create');

API neslouzi k tomu, aby se na nej presmerovaval uzivatel. budes muset udelat nejaky JS handler, ktery vezme data z formulare a posle je na ten API endpoint primo z prohlizece. A soucasne tam budes muset vyresit zpracovani chyb apod., coz je celkem slozity, takze se nabizi moznost

  1. formular definovany v JS, odeslany na php API backend

formular vubec nebudes definovat v php, ale primo v js (react/vue) a pouze budes z javascriptove aplikace komunikovat s php API backendem. tohle je ale z tech reseni nejslozitejsi a muze byt zbytecne, pokud neplanujes nejakou slozitou JS aplikaci

  1. formular definovany v nette, zpracovani taky pres nette a v onSuccess provedes pozadavek na api endpoint primo z php. reseni zcela bez JS

budes mit tedy UI\Form, ktery v onSuccess handleru provede skrz nejakou http knihovnu (treba Guzzle) POST pozadavek na tvuj API endpoint. v onSuccess pak nejak pripadne zpracujes chyby z API.

Tenhle pristu se hodi ale zejmena pokud to API a ten formular je v ramci jine aplikace, kdyz je to jen jedna aplikace, tak to celkem postrada smysl

  1. vykaslat se na API, dokud nebude potreba

zpracujes nette formular v onSuccess a budes mit nejakou sluzbu, treba ArticleFacade, ktera se bude starat o ulozeni toho clanku. Pak, az bude potreba API, tak nebude problem tuto tridu ArticleFacade vyuzit i pro zpracovani pozadavku z API

Takze jak vidis, moznosti je spousta, otazkou tedy je, na co a jestli API potrebujes :)

pisa98
Člen | 17
+
0
-

David Matějka napsal(a):

Mas nekolik moznosti, jak to vyresit:

  1. pouze definice a vykresleni formulare skrz nette, zpracovani pres JS na backend API

pri definici formulare v nette nadefinujes pouze strukturu a nebudes resit onSuccess a zpracovani v ramci klasickeho zivotniho cyklu presenteru. v takovem pripade nemusis pouzivat Nette\Application\UI\Form, ale pouze Nette\Forms\Form.
Nemuzes vsak pouzivat

$form->setAction('/api/v1/articles/create');

API neslouzi k tomu, aby se na nej presmerovaval uzivatel. budes muset udelat nejaky JS handler, ktery vezme data z formulare a posle je na ten API endpoint primo z prohlizece. A soucasne tam budes muset vyresit zpracovani chyb apod., coz je celkem slozity, takze se nabizi moznost

  1. formular definovany v JS, odeslany na php API backend

formular vubec nebudes definovat v php, ale primo v js (react/vue) a pouze budes z javascriptove aplikace komunikovat s php API backendem. tohle je ale z tech reseni nejslozitejsi a muze byt zbytecne, pokud neplanujes nejakou slozitou JS aplikaci

  1. formular definovany v nette, zpracovani taky pres nette a v onSuccess provedes pozadavek na api endpoint primo z php. reseni zcela bez JS

budes mit tedy UI\Form, ktery v onSuccess handleru provede skrz nejakou http knihovnu (treba Guzzle) POST pozadavek na tvuj API endpoint. v onSuccess pak nejak pripadne zpracujes chyby z API.

Tenhle pristu se hodi ale zejmena pokud to API a ten formular je v ramci jine aplikace, kdyz je to jen jedna aplikace, tak to celkem postrada smysl

  1. vykaslat se na API, dokud nebude potreba

zpracujes nette formular v onSuccess a budes mit nejakou sluzbu, treba ArticleFacade, ktera se bude starat o ulozeni toho clanku. Pak, az bude potreba API, tak nebude problem tuto tridu ArticleFacade vyuzit i pro zpracovani pozadavku z API

Takze jak vidis, moznosti je spousta, otazkou tedy je, na co a jestli API potrebujes :)

Diky moc to mi staci :)