Warning preg_match() expects parameter 2 to be string, object given
- SontoEremo
- Člen | 341
a tracy ukazuje
File: …/web/vendor/nette/mail/src/Mail/Message.php:162
/**
155: * Formats recipient email.
156: * @param string
157: * @param string
158: * @return array
159: */
160: private function formatEmail($email, $name)
161: {
162: if (!$name && preg_match('#^(.+) +<(.*)>\z#', $email, $matches)) {
163: return array($matches[2] => $matches[1]);
164: } else {
165: return array($email => $name);
166: }
Môžete mi prosím poradiť čo mám spraviť? aby to zaslalo email?
Ešte funkcia na zaslanie tokenu
/**
* @param Form $resetForm
*/
public function resetFormSuccessSubmited(Form $resetForm, $email) {
$resValues = $resetForm->getValues();
$resVerify = $this->userRepository->getByEmail($email);
if(!$resVerify) {
$mailtoken = Utils\Random::generate(32);
$template = new FileTemplate(__DIR__ . '/../templates/Email/reset.latte');
$template->registerFilter(new Engine);
$template->registerHelperLoader('\Nette\Templating\Helpers::loader');
$template->verifymail = $this->presenter->link('//Sign:verifymail', array(
'mailtoken' => $mailtoken,
));
$resetmail = new Message;
$resetmail->setFrom('Email <mail@mail.xxx>')
->addTo($resetForm['email'])
->setSubject('Obnovenie Hesla')
->setHtmlBody($template);
$resetmailer = new SmtpMailer(array(
'host' => 'smtp.mail.xxx',
'port' => 465,
'username' => 'mail@mail.xxx',
'password' => '********',
'secure' => 'ssl',
));
$resetmailer->send($resetmail);
$this->presenter->flashMessage(Html::el('div')
->setHtml('Na Vašu Emailovú adresu <strong class="email-strong"><br>' . $resetForm->email . '<br></strong> bol zaslaný odkaz na nové heslo.'));
$this->presenter->redirect('mailfinish');
} else {
$resetForm->addError('Neplatná Emailová adresa');
}
}
Editoval SontoEremo (13. 7. 2014 20:51)
- jiri.pudil
- Nette Blogger | 1032
$resetForm['email']
je instance TextInput. Ty do
addTo
chceš předat jeho hodnotu, tedy
$resetForm['email']->value
. Totéž níže ve flashMessage.
- SontoEremo
- Člen | 341
Môžem sa ešte spítať prečo tento kód neoveruje existenciu emailu?
Presenter
/**
* @param Form $resetForm
*/
public function resetFormSuccessSubmited(Form $resetForm, $email) {
$resValues = $resetForm->getValues();
$resEmail = $this->userRepository;
if(!$resEmail->usermailexists($email)) {
echo "OK";
} else {
echo "BAD";
}
}
A UserRepository
public function usermailexists($email)
{
return $this->findAll()->select('email')->where('email', $email)->fetch();
}
- David Kudera
- Člen | 455
Odkud se tam vlastně bere ta proměnná $email
v metodě
resetFormSuccessSubmitted
? Ta metoda je normálně navěšená na
onSuccess formuláře nebo to je něco jiného?
$form->onSuccess[] = array($this, 'resetFormSuccessSubmitted');
- SontoEremo
- Člen | 341
Presenter
/**
* Reset factory.
* @return Form
*/
protected function createComponentResetForm() {
$resetForm = new Form;
$resetForm->addProtection();
$resetForm->addText('email')
->setAttribute('placeholder', 'Emailová adresa')
->setAttribute('class', 'form-control input-bg')
->addRule(Form::EMAIL, 'Zadajte prosím, platnú emailovú adresu!');
$resetForm->addSubmit('signReset', 'Obnoviť heslo');
$resetForm->onSuccess[] = $this->resetFormSuccessSubmited;
return $resetForm;
}
/**
* @param Form $resetForm
*/
public function resetFormSuccessSubmited(Form $resetForm, $email) {
$resValues = $resetForm->getValues();
$resEmail = $this->userRepository;
if(!$resEmail->usermailexists($email)) {
echo "OK";
} else {
echo "BAD";
}
}
A UserRepository
public function usermailexists($email)
{
return $this->findAll()->select('email')->where('email', $email)->fetch();
}
Veď sa snažím do public function resetFormSuccessSubmited dostať $email aby to overilo či je v DB
Editoval SontoEremo (13. 7. 2014 21:54)
- David Kudera
- Člen | 455
Ale hodnoty z formuláře získáváš přes to
$resetForm->getValues()
. Ten email se tam tak kouzelně sám
nedostane. dokumentace
Takže:
$email = $resValues->email;
- SontoEremo
- Člen | 341
Tak som to teda skúsil ale stále nič i keď zadám správny mail vypíše „BAD“
public function resetFormSuccessSubmited(Form $resetForm, $email) {
$resValues = $resetForm->getValues();
$email = $resValues->email;
$resEmail = $this->userRepository->findByEmail('email', $email);
if($email) {
echo "OK";
} else {
echo "BAD";
}
}
Ani
public function resetFormSuccessSubmited(Form $resetForm, $email) {
$resValues = $resetForm->getValues();
$email = $resValues->email;
$resEmail = $this->userRepository->findByEmail('email', $email);
if($email === $resEmail) {
echo "OK";
} else {
echo "BAD";
}
}
- David Kudera
- Člen | 455
Zkus si tam dát třeba dumpy jestli ti to dobře načítá ten mail z db.. Určitě si dej dump pro ten email i pro resEmail
dump($email, $resEmail);
No a pak zkontrolovat, jestli máš v db opravdu to, co si myslíš
- SontoEremo
- Člen | 341
Tak som to samozrejme aj skúšal s tym dump(…)
Ale teraz ja hlupák som si všimol, že uvádzam
$resEmail = $this->userRepository->findByEmail('email', $email);
Keď to má byť
$resEmail = $this->userRepository->findByEmail($email);
Teraz mi to samozrejme vypise
"mail@mail.xxx" (20)
Nette\Database\Table\ActiveRow #aa88
table private => Nette\Database\Table\Selection #022d data private => array (1)
email => "mail@mail.xxx" (20)
dataRefreshed private => FALSE
isModified private => FALSE
A keď zadám neexistujúci Email tak vyhodí False
Ale už
public function resetFormSuccessSubmited(Form $resetForm, $email) {
$resValues = $resetForm->getValues();
$email = $resValues->email;
$resEmail = $this->userRepository->findByEmail($email);
if($email === $resEmail) {
echo "OK";
} else {
echo "BAD";
}
}
nefunguje
Editoval SontoEremo (13. 7. 2014 22:36)
- David Kudera
- Člen | 455
Ano to protože $email je obyč string a $resEmail je záznam z db.. Odsud použij ten tvůj 1. příklad
Edit: Nebo jak píše @Mysteria
Editoval David Kudera (13. 7. 2014 22:52)
- SontoEremo
- Člen | 341
ešte sa chcem spítať je toto dobre riešené?
/**
* @param Form $resetForm
*/
public function resetFormSuccessSubmited(Form $resetForm, $email) {
$resValues = $resetForm->getValues();
$email = $resValues->email;
$resEmail = $this->userRepository->findByEmail($email);
if (!$resEmail) {
$resetForm->addError('Neplatná Emailová adresa');
} else {
... Odoslanie Tokenu ....
.........
......
}
}
Neviem prečo ale takto to pri neexistujúcom maile vypíše Neplatná Emailová adresa a pri existujúcom pošle mail s tokenom
- David Kudera
- Člen | 455
Ano, protože ta podmínka je tak napsaná..
- Načti uživatele podle emailu
- Když uživatel s daným mailem neexistuje, zobraz chybu
- Jinak odešli token
Je to špatně?