Contributte/translation: Invalid link: No route for Front:Error4×x
- aha009
- Člen | 50
Ahoj,
snažím se zprovozni contributte translation. Překlady mi fungují, ale mám
problém s tím, když v @layout
zavolám formulář
{include bootstrap-form-main contactForm}
a pokusím se vyvolat
chybu stránka nenalezena tak vyskočí chyba: Invalid link: No route
for Front:Error4xx:default(locale=cs)
Pokud formulář odstraním, tak se normálně zobrazí chybová stránka.
Formulář je převzatý z příkladu v sandboxu. Netuším kde by mohla
být chyba.
- Phalanx
- Člen | 310
- aha009
- Člen | 50
Na to jsem už koukal a bohužel na nic jsem nepřišel.
Persistentní parametr $locale
mám v BasePresenteru. Bez
formuláře to funguje. Zkoušel jsem vytvořit i bez factory formulář a
dopadlo to stejně.
BasePresenter
abstract class BasePresenter extends Presenter
{
/** @persistent */
public $locale;
/** @var Nette\Localization\ITranslator @inject */
public $translator;
/** @var Contributte\Translation\LocalesResolvers\Router @inject */
public $translatorSessionResolver;
/** @var MenuManager */
private $menuManager;
/** @var PageManager */
private $pageManager;
/** @var Forms\ContactFormFactory */
private $contactFactory;
public function __construct(MenuManager $menuManager, PageManager $pageManager, Forms\ContactFormFactory $contactFormFactory)
{
$this->menuManager = $menuManager;
$this->pageManager = $pageManager;
$this->contactFactory = $contactFormFactory;
}
public function handleChangeLocale(string $locale): void
{
$this->translatorSessionResolver->setLocale($locale);
$this->redirect('this');
}
protected function createComponentContactForm(): Form
{
return $this->contactFactory->create(function (): void {
$this->flashMessage('Zprávy byla odeslána', 'succes');
$this->redirect('this');
});
}
ContactForm
class ContactFormFactory
{
use Nette\SmartObject;
/** @var FormFactory */
private $factory;
/** @var Nette\Localization\ITranslator */
private $translator;
public function __construct(FormFactory $factory, Nette\Localization\ITranslator $translator)
{
$this->factory = $factory;
$this->translator = $translator;
}
public function create(callable $onSuccess): Form
{
$form = $this->factory->create();
$form->setTranslator($this->translator);
$form->addText('name', 'messages.contactForm.title')
Router
$router[] = new Route('[<locale=cs cs|en|de|ru>/][<slug>]', [
'presenter' => 'Page',
'action' => 'show',
'module' => 'Front',
NULL => [
Route::FILTER_OUT => function(array $params) {
if (isset($params['slug']) && in_array($params['slug'], ['uvod', 'home'])) {
unset($params['slug']);
}
return $params;
},
]
]);
Editoval aha009 (20. 4. 2020 15:14)
- emololftw
- Člen | 82
Nemáte náhodou nějáké vysvětlení / nové postupy pro tento problém?
Dnes jsem do routeru přidal domenu 3. řádu a všechny továrny přestaly
fungovat (domena je parametr <customerId>). Dávat do formulářů natvrdo
$form->setAction('Page:show');
asi není uplně nejlepší
řešení, když vše fungovalo bez problémů (přestaly jít i odkazy)..
$router->withModule('Front')
->addRoute( '//<customerId>.%domain%/<locale=cs_CZ cs_CZ|en_US|de_DE>/' . '<module>/<presenter>[/<action=default>][/<id \d+>]', 'Front:Auth:SignIn:default')
->addRoute( '//<customerId>.%domain%/<locale=cs_CZ cs_CZ|en_US|de_DE>/', 'Front:Auth:SignIn:');
TRACY: https://ctrlv.cz/M87t
Tak si klasicky sám odpovím:
Po třech hodinách failů postnu příspěvek na forum a v zápětí to
vyřeším. (klasický scénář, tak alespon zkusím pomoc někomu
jinému).
Nově vytvořenou doménou 3. řádu definuji parametr <customerId> a ten
se promítne do všech ostatních rout, avšak parametr musí být
persistentní!!!
Editoval emololftw (15. 11. 2021 15:56)