Makro {control} obaluje pojmenované parametry polem
- Zax
- Člen | 370
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)