Contributte/translation: Invalid link: No route for Front:Error4×x

aha009
Člen | 50
+
0
-

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.

aha009
Člen | 50
+
0
-

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)

MajklNajt
Člen | 502
+
+1
-

riešil som rovnaký problém: https://forum.nette.org/…orpresenteri

aha009
Člen | 50
+
0
-

Děkuji odkaz. Super, vyřešeno.
$form->setAction('Page:show');

Editoval aha009 (20. 4. 2020 17:55)

emololftw
Člen | 82
+
0
-

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)