Formulář na filtrování výpisu položek
- Domki
- Člen | 310
Mám výpis položek. Udělal jsem formulář na filtrování ( značky,
roky, řazení)
Jak docílit aby se po odeslani formuláře nastavili promenné v presenteru,
ktere v render() pouziji pro filtrovani?
Parametry by měli být videt v URL, a na daném presenteru se uchovat
i například po změne stranky(strankováni)
Zkoušel jsem /** Persistent */ ale ty se do url nevkladaji, a při redirectu ve formuláři se hodnota ztratí. Při ajaxovém odeslaní formuláře se sice render provede s filtry, ale v url argumenty též nemám
díky
Editoval Domki (19. 11. 2016 11:24)
- Domki
- Člen | 310
Aby byli videt v url jsem se pokusil pouzit nette.history.ajax.js podle: https://forum.nette.org/…cky-redirect
ale pripojil jsem client-side/history.ajax.js, v config pridal extension, Ale ajaxové odeslání mi stále url nezmění.
- Domki
- Člen | 310
Jo mám. Narazil jsem na podobné téma ve starem vlaknu(https://forum.nette.org/…u-na-e-shopu).
Predělal jsem to podle příspěvku od ali. Ted mám vše v poli $filter
které je persisten.
Parametry se nyní do url dají (předpokládam že když nejsou nastaveny(null)
tak se do url nedávají)
Nyní se snažím když nebude vybrán žádny checkbox, tak aby se vybrali všechny(ve filtru se to provede, ale na checkboxech ne – zůstanou nezaškrtnuté)
V success metodě nastavím $filter z formuláře, a projdu a pokud jsou všechny hodnoty false tak je změní na true,
ve funkci renderDefault se následně volá setDefaults
checkbox ale zůstanou nezaškrtnuté
Co dělám špatně? díky
A ještě bych se zeptal jestli je dobrý přistup v actionDefault nastavovat defaultni hodnoty takto?
class CategoriesPresenter extends BasePresenter
{
/** @var Category $category */
private $category;
/** @persistent */
public $filter = [];
public function actionDefault($id)
{
$this->category = $this->categoriesRepository->getByID($id);
if (count($this->filter) === 0) {
$brandsOfCategories = $this->productsRepository->findBrandsOfCategories([1,4]);
$yearsOfCategories = $this->productsRepository->findYearsOfCategories([1,4]);
foreach ($brandsOfCategories as $key => $value) {
$this->filter['brand_' . $key] = TRUE;
}
}
}
protected function createComponentFilterSortPageForm()
{
$form = $this->formFactory->create();
foreach ($this->productsRepository->findBrandsOfCategories([1,4]) as $id => $name) {
$form->addCheckbox('brand_' . $id, $name)->setAttribute('class', 'onChangeSubmit');
}
$form->addSubmit('filter', 'Filtrovat');
$form->onSuccess[] = [$this, 'filterSortPageFormSucceeded'];
return $form;
}
public function filterSortPageFormSucceeded(BaseForm $form)
{
$values = $form->getValues();
$this->filter = array_filter((array) $values, function ($s) {
return ($s === "" || $s === NULL || $s === [] ? FALSE : TRUE);
});
//zde pokud neni zadna značka vybrana, nastavim vse na true
//if any brand is not select -> select all
$brandsFilterOnly = array_filter(
$this->filter,
function ($key) {
return substr($key, 0, 6) === 'brand_';
},
ARRAY_FILTER_USE_KEY
);
if (count(array_filter($brandsFilterOnly)) === 0) {
foreach ($this->filter as $key => $value) {
if (substr($key, 0, 6) === 'brand_') {
$this->filter[$key] = TRUE;
}
}
}
$this->payload->url = $this->link('this', $this->filter);
if ($this->isAjax()) {
$this->redrawControl('productsGrid');
$this->redrawControl('filterForm');
} else {
$this->redirect('this');
}
}
public function renderDefault()
{
$this['filterSortPageForm']->setDefaults($this->filter); //zde nastavim hodnoty formuláre
$this->template->brands = $this->productsRepository->findBrandsOfCategories([1,4]);
$this->template->category = $this->categoriesRepository->getByID($this->category->id);
$this->template->products = $this->productsRepository->findProductsOfCategories([1,4], $this->filter);
}
}
Editoval Domki (20. 11. 2016 10:44)