Routování a anotace
- redhead
- Člen | 1313
Zdravím,
napadla mě věc, když už ty anotace budou fungovat i se zapnutým eAcceleratorem, jak bych mohl využít anotace pro přejmenování presenterů a akcí v url pro českou verzi. Vím, že se bude dozajista jednat o vlastní napsání routeru (s routami jsem zatím neexperimentoval, protože mi dosud na localu nešel mod-rewrite). Má představa:
/** @name(lang = 'cs', value = 'uzivatele') */
class UsersPresenter extends Presenter
{
/** @name(lang = 'cs', value = 'detaily') */
public function actionDetails() { /* ... */ }
}
a pak by jely url:
http://example.cz/uzivatele/detaily
http://example.cz/en/users/details
Jak byste na to šli? Je to určitě triviální, ale můj mozek jaksi rezignuje o něčem přemýšlet.
- Ondřej Mirtes
- Člen | 1536
Nepůjde o napsání vlastního routeru. Stačí si vzít seznam presenterů z cache RobotLoaderu (nic systematičtějšího zatím Nette nenabízí), vzít si z jednotlivých jejich anotace a z nich pak vytvořit pole, které předáš do této metody:
Route::setStyleProperty('presenter', Route::FILTER_TABLE, array(
'prihlasit-se' => 'Login',
'registrace' => 'Registration',
'nastaveni' => 'Settings',
));
Mimochodem – je to zajímavý nápad a hodilo by se ho mít přímo ve frameworku :)
- redhead
- Člen | 1313
Ahááá, tak to je krása (měl jsem to tak do teď, ale array natvrdo napsanej)
Ovšem trochu zrada. Někde sem tu čet jak dostat presentery z kešky RobotLoaderu, ale asi se to od té doby změnilo, a kód nefuguje. Bez změny v RobotLoaderu nemůžu dostat unikatní klíč, pod kterým se cache ukládá. Změna se týká metody RobotLoader::getKey() která je private. A pro získání dat z keš je potřeba ($cache[$key]).
Navíc bude trochu problém s velikostí písmen. RobotLoader totiž všechno ukládá lowercase a překladový slovník je jak jsem zjistil case-sensititive.
Bylo by opravdu hezké, kdyby se do FW dostala nějaká metoda na získání všech presenterů.
- David Grudl
- Nette Core | 8218
Vím, že se to u jiných frameworků používá, ale mám za to, že je to prasárna. Jakákoliv změna routování pak obnáší zasahovat do kódu presenterů, namísto úpravy na jednom nezávislém místě.
- redhead
- Člen | 1313
Rád bych znova otevřel tohle téma, páč mě tahle záležitost dost zajímá.
Podle DG je to prasárna, tak se ptám, jak to udělat neprasácky. Když to tak vemu nejde ani tak o routování. Routování se může měnit jak chce, ale budu mít zaručeno, že budu znát jméno presenteru v jiném jazyce. Pokud bych potřeboval tohle jméno využít u čehokoliv jiného, tak mi to prasácké nepřijde. To routování je pouze aplikace (využití) těch anotací.
Pokud bych to měl mít bokem někde napsané v poli, je velká šance, že to zapomenu updatovat a bude se to stávat nepřehledným. Ale u anotací presenteru/actiony budu hned vidět, že mi to chybí.
Routování se může měnit, ale názvy presenterů budou stejné (protože pak bych to musel měnit v šablonách – redirectech, lincích, …)
btw: trochu jsem přehodnotil zápis a tenhle bude lepší:
/** @name( cs => 'uzivatele', hu => 'felhasznaloi' ) */
Teď sice používám jiný, ale funguje to hezky, až na pár problémků se změnou jazyka.
Kdo by měl jakýkoliv jiný nápad nebo kdo používá něco podobného jinak, podělte se.