Formulář na filtrování výpisu položek

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

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
+
0
-

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í.

CZechBoY
Člen | 3608
+
0
-

Persistentni parametry jsou v url.. Mas je oznacene jako public?

Domki
Člen | 310
+
0
-

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)