Makro {control} obaluje pojmenované parametry polem

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

Zdravím,

používám vlastní lehce ohackované komponenty a při pokusu přidat podporu parametrů v šabloně jsem narazil na zvláštní chování.

Můj hack funguje tak, že se zavolá neexistující metoda render a pomocí __call se toto volání přesměruje do metody run(název renderu, args). Nic složitého:

	public function __call($func, $args = []) {
		if (Strings::startsWith($func, 'render')) {
			return $this->run(Strings::substring($func, 6), $args);
		}
		return parent::__call($func, $args);
	}

No a narazil jsem na drobný problém s proměnnou $args.

Když v šabloně zavolám {control paginator:pager, ' články', 's mákem'}, způsobí to následující:

$this->run('pager', [' články', 's mákem']);

Což je v pořádku. Pokud ale přidám názvy parametrů {control paginator:pager, suffix => ' články', houby => 's mákem'}, pak se celé pole obalí dalším polem, tudíž se zavolá toto:

$this->run('pager', [['suffix' => ' články', 'houby' => 's mákem']]);

Očekával bych, že by se to mělo zavolat bez toho obalujícího pole, tedy:

$this->run('pager', ['suffix' => ' články', 'houby' => 's mákem']);

Čím je toto (pro mě velice zvláštní) chování způsobeno a jak to mohu obejít, aniž bych musel komplikovaně procházet pole, kontrolovat, zda je pole v dalším poli, nebo nedejbože zjišťovat, jestli má pole klíče?

Předem díky!

EDIT: Zatím jsem to vyřešil takto, ale vůbec se mi to nelíbí:

	public function __call($func, $args = []) {
		if (Strings::startsWith($func, 'render')) {
			$tmp = @array_reduce($args, 'array_merge', []); // @ - intentionally
			if($tmp === NULL) {
				$tmp = $args;
			}
			return $this->run(Strings::substring($func, 6), $tmp);
		}
		return parent::__call($func, $args);
	}

Editoval Zax (23. 10. 2014 21:35)