Warning preg_match() expects parameter 2 to be string, object given

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

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
+
0
-

$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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)

Mysteria
Člen | 797
+
0
-

Vždyť vidíš, že tam máš celej ActiveRow z toho dumpu ne?

if ($email === $resEmail->email) { }
David Kudera
Člen | 455
+
0
-

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
+
0
-

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
+
0
-

Ano, protože ta podmínka je tak napsaná..

  1. Načti uživatele podle emailu
  2. Když uživatel s daným mailem neexistuje, zobraz chybu
  3. Jinak odešli token

Je to špatně?