Presmerovanie po odoslani Formu kvoli indexom v $_GET pri pouziti MultiSelectu?
- BillGates
- Člen | 3
Zdravim,
mam jednu otazku, neviem ci je chyba v mojej implementacii alebo je to defaultne spravanie Nette.
Mam klasicky Form (sample kod)
use Nette\Forms\Form;
final class FilterForm extends Form
{
public function __construct($name, $id, $action = NULL)
{
parent::__construct();
$this->setMethod('GET');
$items = array(
'CZ' => 'Česká Republika',
'SK' => 'Slovensko',
'GB' => 'Velká Británie',);
$this->addSelect('country', 'Země:')->setItems($items, FALSE);
$this->addMultiSelect('options', 'Možnosti:', $items);
$this->addSubmit('submit', 'Odeslat');
dump($this->getValues());
}
}
ktory pridavam do templatu cez
$this->template->filterForm = new \FilterForm('test', 1);
V sablone ho vykreslujem takto:
{$filterForm->render('begin')}
<table>
<tr class="required">
<th>{$filterForm['country']->label}</th>
<td>{$filterForm['country']->control}</td>
</tr>
<tr class="required">
<th>{$filterForm['options']->label}</th>
<td>{$filterForm['options']->control}</td>
</tr>
<tr class="required">
<th></th>
<td>{$filterForm['submit']->control}</td>
</tr>
</table>
{$filterForm->render('end')}
Formular sa normalne odosle ako by sa mal, aj odoslane hodnoty su dostupne. Akurat je tu jeden problem. Po odoslani formulara dochadza najprv k 301 presmerovaniu a az potom ku klasickemu vykresleniu stranky (HTTP 200).
Odoslany formular ma query string
country=Slovensko&options%5B%5D=CZ&options%5B%5D=SK&_submit=Odeslat
, ktory sa potom redirectuje cez 301 na
country=Slovensko&options%5B0%5D=CZ&options%5B1%5D=SK&_submit=Odeslat
klasicky cez 301 Location hlavicku.
Cize dochadza k pridaniu numerickeho indexu do $_GET pola options (povodna hodnota je options[]=SK&options[]=CZ, presmerovava na options[0]=SK&options[1]=CZ).
Je toto spravanie sposobene priamo Nette alebo je to nejaka chyba u mna? Idealne by bolo, keby tam tie indexy neboli, alebo potom aby sa generovali priamo pri odoslani formulara (co sa asi IMHO tak lahko neda). Lebo takto je tam zbytocny redirect a sposobuje mi to problemy za istych okolnosti.
Ide o Nette 2.1.0.
Dakujem za odpovede.
- petr.pavel
- Člen | 535
Ukaž ten přesměrovávací kód, prosím. A proč ti to vadí? Trochu mi to zavání :-)
- BillGates
- Člen | 3
Server side kod nemam, lebo neviem kde dochadza k tomu presmerovaniu (to je prave ten problem, ze neviem kde a preco k tomu dochadza).
Client side kod – Chrome konzola:
Request URL: http://xxx/?country=%C4%8Cesk%C3%A1+Republika&options%5B%5D=CZ&options%5B%5D=SK&_submit=Odeslat
Request Method: GET
Status Code: 301 OK
Response headers
Location: http://xxx/?country=%C4%8Cesk%C3%A1+Republika&options%5B0%5D=CZ&options%5B1%5D=SK&_submit=Odeslat
a potom po presmerovani
Request URL: http://xxx/?country=%C4%8Cesk%C3%A1+Republika&options%5B0%5D=CZ&options%5B1%5D=SK&_submit=Odeslat
Request Method: GET
Status Code: 200 OK
Problem je to jednak mozno principialny, nemalo by IMHO k tomu dochadzat, vytazuje to server (2 requesty miesto jedneho) a je to pre mna mierny problem aj z hladiska SEO.
- David Matějka
- Moderator | 6445
imho to zpusobuju automaticka kanonizace url, muzes vypnout nastavenim teto
property na false