Odeslání dat z tabulky emailem
- Luppo
- Člen | 13
Ahoj všichni,
mám vytvořený formulář, který dokáže poslat data z formuláře emailem, ale potřeboval bych k němu připojit jeden řádek z databáze abych je mohl použít v emailovém templatu.
Zkusil jsem něco jako toto, ale ID které používám v selectu itemu (routování apod) to nějak nebere a nevím proč. Neví někdo co s tím?
Chyba: „Call to a member function get() on string“
public function processOrderForm(Form $form, $id)
{
$row = (self::TABLE_NAME)->get($id);
$values = $form->getValues();
$templateToClient = $this->createTemplate();
$templateToClient->setFile(__DIR__ . '/templates/emails/emailOrderClient.latte');
$templateToClient->values = $values;
$templateToClient->product = $row;
$templateToUs = $this->createTemplate();
$templateToUs->setFile(__DIR__ . '/templates/emails/emailOrderUs.latte');
$templateToUs->values = $values;
$templateToUs->product = $row;
}
Editoval Luppo (1. 6. 2018 6:00)
- Pavel Kravčík
- Člen | 1196
public function processOrderForm(Form $form, $id)
a taky
myslím, že druhý parametr nebude $id
, ale stdClass
$values
.
- Luppo
- Člen | 13
h4kuna napsal(a):
Jaký datový typ je self::TABLE_NAME? :)
public function processOrderForm(Form $form, $id) { dumpe(self::TABLE_NAME); }
Je to konstanta
const
TABLE_NAME = 'table';
CZechBoY napsal(a):
:D
no chybi ti tam neco jako $this->database->table na radku 3
Mortisson napsal(a):
Neměl by ten kód spíš vypadat takhle:
$row = $thi->database->table(self::TABLE_NAME)->get($id);
Kdz6 jsem to tam takhle zadal hodilo mi to akorát jiný error: „Argument 2 passed to Nette\Database\Table\SqlBuilder::getConditionHash() must be of the type array, object given, called in C:\xampp\htdocs\geo\vendor\nette\database\src\Database\Table\SqlBuilder.php on line 878“
Pavel Kravčík napsal(a):
public function processOrderForm(Form $form, $id)
a taky myslím, že druhý parametr nebude$id
, ale stdClass$values
.
Values jsou data z formu. Já potřebuju použít $id, protože jsou to data z úplně jiné tabulka. To $id je už předem použité a v latte jsou z něj použitá data, akorát nevím jak je znovu použít. Volám je.
//Presenter
public function renderOrder($id)
{
$this->template->item = $this->productManager->getProduct(self::TABLE_NAME, $id);
}
//ProductManager
public function getProduct($table, $id) {
//echo "<script type='text/javascript'>alert('$id');</script>";
$product = $this->database->table($table)->get($id);
if (!$product) {
$this->error(); //ERR 404
}
return $product;
}
- Šaman
- Člen | 2666
Luppo napsal(a):
Kdyz jsem to tam takhle zadal hodilo mi to akorát jiný error
Jak akorát? Předtím nechápalo na čem chceš volat metodu
get()
(protože jsi ji fakticky volal nad stringem, tedy zcela
nesmyslně $row = table->get($id);
). Mimochodem tohle není
o Nette, ale úplné základy PHP.
Teď ti to říká, že jsi v Nette\Database\Table\SqlBuilder
a
nelíbí se tomu parametry. To je o hodně lepší, ne?
Luppo napsal(a):
Values jsou data z formu. Já potřebuju použít $id.
A zkoušel sis ten parametr vypsat? Chápeš vůbec, jak funkují v PHP
funkce?
Ta metoda má tenhle
tvar : processOrderForm(Form $form, $values)
, do prvního
parametru se předá objekt formuláře a do druhého (volitelného) se předá
objektové pole získaných hodnot. Ty jsi si ten druhý parametr pojmenoval
$id
, ale to nic nemění na tom, že se do tohoto parametru předá
celé to pole hodnot z formuláře. Není to tvoje kýžené $id
,
to si musíš vytáhnout z toho pole.
Dej si bdump($id)
a uvidíš (zkratka bdump
funguje
myslím až od Nette 2.4).
- Luppo
- Člen | 13
Šaman napsal(a):
Luppo napsal(a):
Kdyz jsem to tam takhle zadal hodilo mi to akorát jiný error
Jak akorát? Předtím nechápalo na čem chceš volat metodu
get()
(protože jsi ji fakticky volal nad stringem, tedy zcela nesmyslně$row = table->get($id);
). Mimochodem tohle není o Nette, ale úplné základy PHP.
Teď ti to říká, že jsi vNette\Database\Table\SqlBuilder
a nelíbí se tomu parametry. To je o hodně lepší, ne?Luppo napsal(a):
Values jsou data z formu. Já potřebuju použít $id.
A zkoušel sis ten parametr vypsat? Chápeš vůbec, jak funkují v PHP funkce?
Ta metoda má tenhle tvar :processOrderForm(Form $form, $values)
, do prvního parametru se předá objekt formuláře a do druhého (volitelného) se předá objektové pole získaných hodnot. Ty jsi si ten druhý parametr pojmenoval$id
, ale to nic nemění na tom, že se do tohoto parametru předá celé to pole hodnot z formuláře. Není to tvoje kýžené$id
, to si musíš vytáhnout z toho pole.
Dej sibdump($id)
a uvidíš (zkratkabdump
funguje myslím až od Nette 2.4).
Yap jsem v jak v PHP tak i v Nette nový a už to jedu pár dní v kuse skoro bez spánku takže už mi utíkají písmenka :x, ale nějak to patlám. Jak vytáhnu to moje id? Já to id v debugeru vidím i bez bdumpu.
Díky moc za odpověď.
Editoval Luppo (1. 6. 2018 13:16)
- David Matějka
- Moderator | 6445
v action metode si muzes cokoliv (tedy treba to id nebo rovnou vytazeny radek z db) vlozit do clenske promenne toho presenter, pripadne kdekoliv muzes ziskat parametr volanim:
$this->getParameter('id')