Slug router → attached nenastavi callback pro zpracovani dat z odeslaneho formulare
- kopa
- Člen | 29
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 ;)
- kopa
- Člen | 29
<?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)
- kopa
- Člen | 29
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
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
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
hm, problem mozna bude jeste jinde. pri ->link('this')
se
prenaseji
- persistentni parametry
- 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
David Matějka napsal(a):
hm, problem mozna bude jeste jinde. pri
->link('this')
se prenaseji
- persistentni parametry
- 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
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
<?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
ukaz
- jak vypada action metoda v presenteru
- jak si rucne nastavoval u formulare setAction, aby to fungovalo
- David Matějka
- Moderator | 6445
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
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
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
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
a dostane se to aspon do metody fireEvents ? pripadne kde se to kousne?
- kopa
- Člen | 29
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
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
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
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
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
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
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.
- kopa
- Člen | 29
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
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;
}