Předání parametrů mezi komponentami
- PavelS
- Člen | 66
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.
- Barvoj
- Člen | 60
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
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
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.
- Barvoj
- Člen | 60
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:
- nedělat ten redirect
- 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
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:
- nedělat ten redirect
- 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
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')