Odeslání dat z tabulky emailem

Luppo
Člen | 13
+
0
-

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)

h4kuna
Backer | 740
+
0
-

Jaký datový typ je self::TABLE_NAME? :)

public function processOrderForm(Form $form, $id)
{
	dumpe(self::TABLE_NAME);
}
CZechBoY
Člen | 3608
+
+1
-

:D
no chybi ti tam neco jako $this->database->table na radku 3

Mortisson
Člen | 21
+
0
-

Neměl by ten kód spíš vypadat takhle:

$row = $thi->database->table(self::TABLE_NAME)->get($id);
Pavel Kravčík
Člen | 1196
+
0
-

public function processOrderForm(Form $form, $id) a taky myslím, že druhý parametr nebude $id, ale stdClass $values.

Luppo
Člen | 13
+
0
-

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

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

Š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 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).

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ěď.

https://imgur.com/a/pz30qv9

Editoval Luppo (1. 6. 2018 13:16)

David Matějka
Moderator | 6445
+
+1
-

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')