Předání parametrů mezi komponentami

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

Ahoj, mám dvě komponenty vytvořené v Presenteru přes createComponent.
Jedna se spojí s facebookem a do promměných si načte data. Jak prosím ty promměné předám jiné komponentě(v mém případě register form), aby si nimi mohla pracovat?

Pak bych se ještě rád zeptal, jestli je možné z komponenty volat komponentu. V mém případě by se jednalo o facebook controler, který po vykonání zavolá register component a zde již budou předvyplněny zíkaná data (poslední bod již zvládám :-)).

Děkuji všem za odpověď, nemůžu se hnout z místa.

CZechBoY
Člen | 3608
+
0
-

Tak komponenta je vlastně i presenter, takže stejně jako v presenteru – pomocí createComponentXXX.
Data předávej přes konstruktor v createComponentXXX.

Barvoj
Člen | 60
+
0
-

Předávání dat z jedné komponenty (např. filtrovací formulář) do druhé (grid) se nedávno řešilo v tomto vlákně.

PavelS
Člen | 66
+
0
-

Poradíte mi někdo jak konkrétně na to? Oba komponenty máme v BasePresenteru.

PavelS
Člen | 66
+
0
-

Zavolání $this[‚registerForm‘]->setDefaults(array(‚email‘ ⇒ $email,‚firstName‘ =>$name));
mi nijak neovlivní data v registerformu…

CZechBoY
Člen | 3608
+
0
-

To by melo. Mas spravne jmena policek? Nesla by nejaka ukazka kodu ukazat?

PavelS
Člen | 66
+
0
-

CZechBoY napsal(a):

To by melo. Mas spravne jmena policek? Nesla by nejaka ukazka kodu ukazat?

BasePresenter:

   protected function createComponentRegisterForm()
{
    $form = new Form;
    $form->addProtection();
    $form->addText('firstName', 'Tell us your first name please')
        ->setRequired();

    $form->addText('surname', 'And your surname')
        ->setRequired();

    $form->addText('username', 'Your username')
    ->setRequired();

     $form->addText('email', 'Your e-mail')
    ->setRequired('Choose an e-mail')
    ->addRule(Form::EMAIL, 'Please fill in your valid adress')
    ->emptyValue = '@';

    $form->addPassword('password', 'Your password')
    ->setRequired('Choose a password')
    ->addRule(Form::MIN_LENGTH, 'Password has to contain at least %d letters.', 6)
    ->addRule(Form::PATTERN, 'Password has to contain at least one number.', '.*[0-9].*');

    $form->addPassword('passwordVerify', 'Your password second time')
    ->addRule(Form::FILLED, 'Please confirm your password by typing it again.')
    ->addRule(Form::EQUAL, 'Passwords do not match.', $form['password']);

    $form->addSubmit('send', 'Sign up');
    $form->onSuccess[] = $this->registerFormSubmitted;

    return $form;
}

 protected function createComponentFbLogin()
    {
        $dialog = $this->facebook->createDialog('login');
        /** @var \Kdyby\Facebook\Dialog\LoginDialog $dialog */

        $dialog->onResponse[] = function (\Kdyby\Facebook\Dialog\LoginDialog $dialog) {
            $fb = $dialog->getFacebook();

            if (!$fb->getUser()) {
                $this->flashMessage("Sorry bro, facebook authentication failed.");
                return;
            }

            /**
             * If we get here, it means that the user was recognized
             * and we can call the Facebook API
             */

            try {
                $me = $fb->api('/me/?fields=name,email,id,picture.type(large)');
                $mee=$me->offsetGet('picture');
                $meee=$mee->offsetGet('data');
                $picture=$meee->offsetGet('url');
                $name=$me->offsetGet('name');
                $email=$me->offsetGet('email');

                $this->flashMessage($name.$email.$picture);
                 $this['registerForm']->setValues(array('email' => $email,'firstName' =>$name));
               //dump($me);

            } catch (\Kdyby\Facebook\FacebookApiException $e) {
                /**
                 * You might wanna know what happened, so let's log the exception.
                 *
                 * Rendering entire bluescreen is kind of slow task,
                 * so might wanna log only $e->getMessage(), it's up to you
                 */
                \Tracy\Debugger::log($e, 'facebook');
                $this->flashMessage("Sorry bro, facebook authentication failed hard.");
            }

            $this->redirect('this');
        };

        return $dialog;
    }

Šablona:

{control registerForm}<a n:href="fbLogin-open!">Login using facebook</a>
PavelS
Člen | 66
+
0
-

Víte někdo jak na to? Předpokládám, že to není tak nečastá věc co aplikace dělají. Vážně se mi nechce zapisovat do databáze :-D

David Matějka
Moderator | 6445
+
0
-

A co ti nefunguje?

PavelS
Člen | 66
+
0
-

David Matějka napsal(a):

A co ti nefunguje?

Nemohu dostat pole hodnot z jedné komponenty do druhé.

David Matějka
Moderator | 6445
+
0
-

A hlasi to nejakou chybu? ktera cast kodu se provede?

CZechBoY
Člen | 3608
+
0
-

Používáš vůbec někde tu komponentu fbLogin? Můžeš ukázat jak a kde?

PavelS
Člen | 66
+
0
-

David Matějka napsal(a):

A hlasi to nejakou chybu? ktera cast kodu se provede?

Chybu mi to nehlásí žádnou, z faceboku získám potřebné údaje a vypíšu je ve flash zprávě, dalším krokem je předání hodnot komponentě registerForm, ale tam už se ty data nedostanou. Po získání informací z facebooku dojde na reload, tak jestli nemůže být problém tady? Ale snad se ty data přenáší mezi požadavky.

PavelS
Člen | 66
+
0
-

CZechBoY napsal(a):

Používáš vůbec někde tu komponentu fbLogin? Můžeš ukázat jak a kde?

Používám ji v šabloně, po kliknutí na odkaz se načtou data z facebooku, pro test si je vypisuju ve flash zprávě.

Barvoj
Člen | 60
+
+2
-

Problém je v tom, že v callbacku onResponse nasetuješ sice data formuláři, ale pak uděláš redirect. To tě přesměruje na tu stejnou stránku, ale hodnoty ve formuláři se redirectem nepřenesou.

Napadají mě dvě možnosti, jak to řešit:

  1. nedělat ten redirect
  2. před redirectem si ty hodnotu uložit do session nebo je poslat v url

Editoval Barvoj (24. 5. 2016 8:36)

PavelS
Člen | 66
+
0
-

Barvoj napsal(a):

Problém je v tom, že v callbacku onResponse nasetuješ sice data formuláři, ale pak uděláš redirect. To tě přesměruje na tu stejnou stránku, ale hodnoty ve formuláři se redirectem nepřenesou.

Napadají mě dvě možnosti, jak to řešit:

  1. nedělat ten redirect
  2. před redirectem si ty hodnotu uložit do session nebo je poslat v url

Díky moc za opověď k věci! Nebylo by možné přenášet formulářová data i přes redirect? Třeba natavit ty hodnoty jako perzistentní? Jinak použiju asi to sezení. Díky.

David Matějka
Moderator | 6445
+
0
-

Jo redirectu jsem si nevsim. Presmeruj s tema parametrema, treba

$this->redirect('this', ['email' => $email, 'name' => $name]);

a pak si je vytahnes pres $this->getParameter('email')