Slug router → attached nenastavi callback pro zpracovani dat z odeslaneho formulare

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

Pokud mam vlastni routovani tak mi formular negeneruje link pro action, protoze new Link funguje jenom na <presenter><action>

kdyz si ho zadam rucne, tak nenastavy callback pro zpracovani dat.

https://api.nette.org/…orm.php.html#75

je mozne zkratit pozdminku if (!$this->getAction()) { } pouze pro nastaveni akce?

doufam, ze na to nejdu moc od lesa ;)

chemix
Nette Core | 1296
+
0
-

Ahoj, můžeš napsat čeho chceš docílit? :)

kopa
Člen | 29
+
0
-
<?php
protected function attached($presenter)
	{
		if ($presenter instanceof Presenter) {
			$name = $this->lookupPath('Nette\Application\UI\Presenter');

			if (!isset($this->getElementPrototype()->id)) {
				$this->getElementPrototype()->id = 'frm-' . $name;
			}

			if (iterator_count($this->getControls()) && $this->isSubmitted()) {
				foreach ($this->getControls() as $control) {
					if (!$control->isDisabled()) {
						$control->loadHttpData();
					}
				}
			}

			if (!$this->getAction()) {
				$this->setAction(new Link($presenter, 'this', array()));
			**}** <<- ukonceni podminky posunout sem
				$signal = new Nette\Forms\Controls\HiddenField($name . self::NAME_SEPARATOR . 'submit');
				$signal->setOmitted()->setHtmlId(FALSE);
				$this[Presenter::SIGNAL_KEY] = $signal;
			**}** <<- puvodni misto podminky
		}
		parent::attached($presenter);
	}
?>

aby se nastavilo zachyseni signalu, i kdyz si vyplnim action. idelani by bylo, kdyby new Link() pracoval s routama tak jak si je nastavim ;)

Editoval kopa (21. 1. 2016 9:33)

chemix
Nette Core | 1296
+
0
-

@kopa takze „aby se nastavilo zachyseni signalu, i kdyz si vyplnim action“ Bohuzel tomuhle vubec nerozumim co tim myslis. Asi malo kontextu, zkus to napsat jako totalnimu lajkovi ceho chces ve vysledku docilit.

kopa
Člen | 29
+
0
-

chemix napsal(a):

@kopa takze „aby se nastavilo zachyseni signalu, i kdyz si vyplnim action“ Bohuzel tomuhle vubec nerozumim co tim myslis. Asi malo kontextu, zkus to napsat jako totalnimu lajkovi ceho chces ve vysledku docilit.

podivej se na kod, ktery je mimochodem dost spatne citelny. pokud mam vlastni routovani stranek, tak mi form do action vlozi / misto url stranky, z niz je volan, a kdyz si action vlozim, tak se data pri odeslani formulare nezpracuji. je to dost jasne?

David Matějka
Moderator | 6445
+
0
-

Pokud mam vlastni routovani tak mi formular negeneruje link pro action, protoze new Link funguje jenom na <presenter><action>

new Link funguje i u vlastniho routeru. co znamena „negeneruje link pro action“? jak se to zachova?

muzes ukazat ten tvuj router?

kopa
Člen | 29
+
0
-

je starsi nekde stazeny s upravenym nacitanim dat

pokud je vlozen formular ma action=‚/‘

<?php
namespace App\router;

use App\Model\LanguageModel;
use App\Model\SlugManager;

use Nette\Application\Routers;
use Nette\Application as App;
use Nette\Application\UI;
use Nette\Http;


class SlugRouter extends \Nette\Object implements \Nette\Application\IRouter
{

    /** @var SlugManager @inject */
    public $slugManager;

    /** @var  LanguageModel @inject */
    public $languageModel;


    public function __construct(SlugManager $slugManager, LanguageModel $languageModel)
    {
        $this->languageModel = $languageModel;
        $this->slugManager = $slugManager;
    }

    /**
     * Maps HTTP request to a Request object.
     *
     * @param \Nette\Http\IRequest $httpRequest
     * @throws \Nette\Application\BadRequestException
     * @return App\Request|NULL
     */
    public function match(Http\IRequest $httpRequest)
    {
        $params = array();

        // 1) PARSE URL
        $url = $httpRequest->getUrl();
        #echo "math {$url}";
        $path = trim($url->path, $url->scriptPath);

		if ($path !== '') {

          if (substr_count($path,'html')){

             $detail = substr(strrchr($path, "/"),1);
             $lng = substr($path,0,2);
             $path = substr($path,3,strrpos($path, "/")-3);
             $id = substr($detail,0,strpos($detail, "-"));
             $params['detail'] = $id;
             $params['detailUrl'] = $detail;
             #echo "^{$path}~{$id}#".strchr($detail, "-")."#";
          }else{
            $lng = substr($path,0,2);
            $path = substr($path,3);
            #echo "`{$path}`";
          }

          $_SESSION['id_lng'] = $this->languageModel->getIDByCode(($lng?$lng:'cs'));
            $row = $this->slugManager->getRowBySlug($path);
        }
		if (!$path) {
            $parts = array('Homepage', 'default');
            $row = $this->slugManager->getDefault();
        }
        if(!$row) {
            $row = $this->slugManager->getSlugById(1);
            #throw new \Nette\Application\BadRequestException('Page does not exist');
        }


        // 2) PARAMS
        //action
        if(isset($parts[1])) {
            $action = $parts[1];
        } else {
            $action = 'default';
        }

        //id
        if(isset($parts[2])) {
            $id = $parts[2];
        }

        //params
        $lng = (isset($lng)?$lng:$this->languageModel->getCodeByDefault());
        $params['action'] = $action;
        $params['lng'] = $lng;
        $_SESSION['lng'] = $lng;
        $params['page_id'] = $row->id;
        #$_SESSION['id_lng'] = $this->slugManager->getDetailByZkratka(($lng?$lng:'cs'));
        if(isset($id)) {
            $params['id'] = $id;
        }

        //$url->query into params
        if($url->getQuery() !== '') {
            $query = explode('&', $url->getQuery());
            foreach($query as $singlequery) {
                $result = explode('=', $singlequery);
                $params[$result[0]] = $result[1];
            }
        }


        // 3) GET PRESENTER
        #var_dump($row);
        $modul_page_path = explode(":",$row->page_path);
        #echo
				$presenter = ($modul_page_path[0]?$modul_page_path[0]:"Homepage");

        if (isset($modul_page_path[1]) && $modul_page_path[1])
          $params['action'] = $modul_page_path[1];

        return new App\Request("Front:{$presenter}", $httpRequest->getMethod(), $params, $httpRequest->getPost(), $httpRequest->getFiles(), array(App\Request::SECURED => $httpRequest->isSecured()));

    }

    /**
     * Constructs absolute URL from Request object.
     *
     * @return string|NULL
     */
    public function constructUrl(App\Request $appRequest, Http\Url $refUrl)
    {
        $params = $appRequest->getParameters();

        $query = $params;
        $detailUrl = "";
        unset($query['lng'], $query['action'], $query['page_id'], $query['slug'], $query['id']);

        if(isset($params['slug'])) {
            $slug = strtolower($params['slug']);
        } else {
            if(isset($params['page_id'])) {
                $row = $this->slugManager->getSlugById($params['page_id']);
                if($row) {
                    $slug = $row->seo;
                } else {
                    return $refUrl->getScheme() . '://' . $refUrl->getHost() . $refUrl->getPath();
                }
            } else {
                return $refUrl->getScheme() . '://' . $refUrl->getHost() . $refUrl->getPath();
            }
            if (isset($params['detailUrl']) && $params['detailUrl']) $detailUrl = "/{$params['detailUrl']}";
        }
        $url = $refUrl->getScheme() . '://' . $refUrl->getHost() . $refUrl->getPath() . ($params['lng']?"{$params['lng']}/":'cs/').$slug. $detailUrl;
        $params = $appRequest->getParameters();
        if(count($query)>0){

            $queryString = '?';

            foreach($query as $key=>$parameter){
              if ($key <> 'detail' && $key <> 'detailUrl')
                $queryString .= $key . '=' . $parameter . '&';
            }

            $finalQueryString = substr($queryString,0,-1);

            $url .= $finalQueryString;
        }
        return $url;
    }
}
?>
David Matějka
Moderator | 6445
+
0
-

hm, problem mozna bude jeste jinde. pri ->link('this') se prenaseji

  1. persistentni parametry
  2. parametry uvedene v signature odpovidajici action/render metody

takze v tvem pripade asi parametry lng a page_id (mozna i dalsi, nevim)… takze je uved v parametrech action/render metody

kopa
Člen | 29
+
0
-

David Matějka napsal(a):

hm, problem mozna bude jeste jinde. pri ->link('this') se prenaseji

  1. persistentni parametry
  2. parametry uvedene v signature odpovidajici action/render metody

takze v tvem pripade asi parametry lng a page_id (mozna i dalsi, nevim)… takze je uved v parametrech action/render metody

ted budu za mimone. co mam kde uvest? diky ;)

David Matějka
Moderator | 6445
+
0
-

public function actionDefault($lng, $page_id) (pripadne do jine odpovidajici akce, jestli nejde o default)

lng by se mozna hodil jako persistentni parametr – to uz je na tvem zvazeni, jak ta aplikace funguje. a mozna tam budes muset uvest dalsi parametry (vsechny, ktere jsou potreba pro vytvoreni url)…

asi by to mely byt vsechny, ktere nyni uvadis v setAction na formu (kdyztak ukaz, jak to mas)

kopa
Člen | 29
+
0
-
<?php
	public function createComponentUserPropertyForm(){
        $form = new UserPropertyForm($this->translator);
        $form->onSuccess[] = callback($this, 'processUserPropertyForm');
        return $form;
    }
	 public function processUserPropertyForm(UserPropertyForm $form)
    {
        if ($form->isSuccess()) {
            #echo $this->template->customerData->contact_id; die;
            $values = $form->getValues(true);
		}
	}
?>

pokud pouziji „standartni“ routovani vlozi mi form do html action url stranky, kde se zrovna nachazim. pokud to udelam se slug routou tak tam dostanu action=„/“

kdyz upravim jadro tak se formular odesle, data zpracuji jenom nasledny redirect na this nezafunguje.

Editoval kopa (22. 1. 2016 15:21)

David Matějka
Moderator | 6445
+
0
-

a dal jsi ty parametry do action, jak jsem ti rikal?

kopa
Člen | 29
+
0
-

David Matějka napsal(a):

a dal jsi ty parametry do action, jak jsem ti rikal?

action se vyplni, ale formular se nezpracuje :(

David Matějka
Moderator | 6445
+
0
-

ukaz

  1. jak vypada action metoda v presenteru
  2. jak si rucne nastavoval u formulare setAction, aby to fungovalo
kopa
Člen | 29
+
0
-

David Matějka napsal(a):

ukaz

1. jak vypada action metoda v presenteru

<?php
	public function actionDefault($lng,$page_id){

	}
?>

2. jak si rucne nastavoval u formulare setAction, aby to fungovalo

<?php
$form->setAction($_SERVER["REQUEST_URI"]);
?>
David Matějka
Moderator | 6445
+
0
-

aha.. ukaz, jak vypda aplikacni request – koukni do tracy baru do routing panelu a tam zkopiruj obsah posledniho sloupecku u matchnute routy (sviti zelene), bude tam neco podobnyho jako

Foo:Bar:default
lng = xx
page_id = 1
kopa
Člen | 29
+
0
-

David Matějka napsal(a):

aha.. ukaz, jak vypda aplikacni request – koukni do tracy baru do routing panelu a tam zkopiruj obsah posledniho sloupecku u matchnute routy (sviti zelene), bude tam neco podobnyho jako

Foo:Bar:default
lng = xx
page_id = 1
Front:Customer:user
lng = cs
page_id = 54
David Matějka
Moderator | 6445
+
+1
-

psal jsem

pripadne do jine odpovidajici akce, jestli nejde o default

v tvem pripade jde o akci user, actionDefault prejmenuj na actionUser (pripadne jestli uz actionUser mas, tak tam akorat zkopiruj parametry)

kopa
Člen | 29
+
0
-

David Matějka napsal(a):

psal jsem

pripadne do jine odpovidajici akce, jestli nejde o default

v tvem pripade jde o akci user, actionDefault prejmenuj na actionUser (pripadne jestli uz actionUser mas, tak tam akorat zkopiruj parametry)

zadna zmena porad se neprovede

<?php

public function processUserPropertyForm(UserPropertyForm $form)	{ }

?>
David Matějka
Moderator | 6445
+
0
-

a jak se ted generuje action?

kopa
Člen | 29
+
0
-

David Matějka napsal(a):

a jak se ted generuje action?

je to ok, ale tim to konci. formular se po odeslani nezpracuje.

David Matějka
Moderator | 6445
+
0
-

je v html pridany ten input name=do ?

kopa
Člen | 29
+
0
-

David Matějka napsal(a):

je v html pridany ten input name=do ?

<?php

<input type="hidden" name="_token_" value="xlvlwl2ug2yzLD7s+gSItWcPjm9n8bAeHHnoI="><input type="hidden" name="do" value="userPropertyForm-submit"></form>

?>

je a dokonce i token ;)

David Matějka
Moderator | 6445
+
0
-

a dostane se to aspon do metody fireEvents ? pripadne kde se to kousne?

kopa
Člen | 29
+
0
-

David Matějka napsal(a):

a dostane se to aspon do metody fireEvents ? pripadne kde se to kousne?

vypada to, ze ne. nekousne, proste ten script probehne a nic neudela.

David Matějka
Moderator | 6445
+
0
-

divny. muzes jeste ukazat vygenerovanou html hlavicku toho formu? (tedy action apod)..

a kdyztak jeste zkus, co se deje v metode processSignal v presenteru https://api.nette.org/…ter.php.html#…

kopa
Člen | 29
+
0
-

David Matějka napsal(a):

divny. muzes jeste ukazat vygenerovanou html hlavicku toho formu? (tedy action apod)..

a kdyztak jeste zkus, co se deje v metode processSignal v presenteru https://api.nette.org/…ter.php.html#…

<?php

<form action="/cs/nastaveni/profil" method="post" enctype="multipart/form-data" id="user-property" class="hidden">

?>

$this->signal obsahu hodnotu „submit“

Editoval kopa (22. 1. 2016 23:07)

David Matějka
Moderator | 6445
+
0
-

divny, v takovym pripade by se to melo dostat sem https://api.nette.org/…orm.php.html#… a odsud i do fireEvents.. muzes to prozkoumat jeste dal? :)

kopa
Člen | 29
+
0
-

David Matějka napsal(a):

divny, v takovym pripade by se to melo dostat sem https://api.nette.org/…orm.php.html#… a odsud i do fireEvents.. muzes to prozkoumat jeste dal? :)

nejaky napad jak to „rozumne“ trasovat? jadro mam importovane pres composer a pouzivam phpStorm. moc diky ;)

kopa
Člen | 29
+
0
-

David Matějka napsal(a):

rozhodne pres xdebug: https://filip-prochazka.com/…s-phpstormem

zatim se mi to nepovedlo rozbehat. moc dekuju za pomoc ;)

Lukáš Kadlec
Člen | 17
+
0
-

Ahoj, podařilo se vyřešit? Řeším zřejmě stejný problém s vlastním routerem, nezavolá se mi onSuccess callback při odeslání formuláře.

CZechBoY
Člen | 3608
+
0
-

Používáš Nette\Application\UI\Form?

Lukáš Kadlec
Člen | 17
+
0
-

Ano

kopa
Člen | 29
+
0
-

Lukáš Kadlec napsal(a):

Ahoj, podařilo se vyřešit? Řeším zřejmě stejný problém s vlastním routerem, nezavolá se mi onSuccess callback při odeslání formuláře.

Jo, presmeruju url na Presenter:action a ten uz to pak zpracuje. S onSuccess muze byt problem, pokud neposilas validni data ;)

V Presenteru mam

<script>
public function actionRedir($id){

/** pak si zjistim, kam to poslat a presmeruju **/

  $this->forward("module", ['page_id' => $data->page_id]);
}
</script>
Lukáš Kadlec
Člen | 17
+
0
-

Když vyřadím vlastní router vše funguje jak má. Něco mi tam zřejmě chybí:

	function match(HttpRequest $httpRequest)
{
    $businessId = $this->businessModel->getCurrentBusinessId();
    $slug = trim($httpRequest->url->path, '/');
    $row = $this->businessModel->router()
        ->where('slug', $slug)
        ->where('business_id', $businessId)
        ->fetch();
    if ($row) {
        $presenter = $row->presenter;
        $id = $row->id;
        return new AppRequest(
            $presenter,
            'default',
            ['id' => $id],
            $httpRequest->getPost(),
            $httpRequest->getFiles(),
            array(\Nette\Application\Request::SECURED => $httpRequest->isSecured()));
    }
    return null;
}

function constructUrl(AppRequest $appRequest, Url $refUrl)
{
    $presenter = $appRequest->getPresenterName();
    $id = $appRequest->getParameter('id');
    $businessId = $this->businessModel->getCurrentBusinessId();
    $row = $this->businessModel->router()
        ->select('slug')
        ->where('presenter', $presenter)
        ->where('id', $id)
        ->where('business_id', $businessId)
        ->fetch();
    $url = $refUrl->getScheme() . '://' . $refUrl->getAuthority() . $refUrl->getBasePath();
    if ($row) {
        $url .= $row->slug . '/';
        return $url;
    }
    return null;
}
kopa
Člen | 29
+
0
-

Lukáš Kadlec napsal(a):

Když vyřadím vlastní router vše funguje jak má. Něco mi tam zřejmě chybí:

Ja to vyresila nadstavbou nad router, jak jsem psala. Vlastni router ti nejspis funguje spravne.