Dostat jen ciselne castky z textarea

iDome89
Člen | 27
+
0
-

Zdravim vsechny, uz konecne jsem vyresil ostatni problemy s Presenterem a prichazim s novou otazkou. Je to vec vice phpkova nez primo Nette.
Ve svem formu mam textarea a chtel bych aby po kliknuti na tlacitko odeslat nebo spocitat, byla kazda lina vyhodnocena zvlast. Např format bude tak textarea1 : “300ks, 600kc
200ks, 400kc”

Kliknu na spocitat a textarea2 : my vyhodi “300ks, 750kc
200ks, 500kc”
Ktere vypocitalo podle marze kterou mam ulozenou v db.
Kod podtim je to co jsem napsal, ale samozrejme nefunguje protoze promenna price a quantity je uvnitr scopu foreach, a me uz nenapada jak to jinak napsat. Proto jdu za vama pro radu. Diky

<?php
declare(strict_types=1);

namespace App\Presenters;


    use App\Forms\FormFactory;
    use Nette\Application\UI\Form;
    use Nette\Database\Context;
    use Nette\Utils\ArrayHash;

class HomepagePresenter extends BasePresenter
{

    /**
     * @var Context
     * @inject
     */
    public $database;

    /**
     * @var FormFactory
     * @inject
     */
    public $formFactory;

    protected function createComponentCalculationForm(): Form
    {
        $form = $this->formFactory->create();

        $form->addSelect('supplier', 'Dodavatel:', $this->database->table('suppliers')->fetchPairs('id', 'supp_name'));

        $form->addTextArea('user_input');

        $form->addSubmit('calculate', 'Spočítat');

        $form->addTextArea('result')
            ->setHtmlAttribute('class', 'totalPrice')
            ->setHtmlAttribute('readonly');

        $form->onSuccess[] = function (Form $form, ArrayHash $values): void {
            $selectedSupp = $values->supplier;
            $userInput = $values->user_input;
            $lines = $array = explode("\n", $userInput);
            foreach ($lines as $line) {
                preg_match_all('/[\d]+/', $line, $numbers);
                list($quantity, $price) = $numbers[0];
            }

            $modifier = $this->database->fetch('SELECT percentage FROM prices WHERE supplier_id = ? AND max >= ? AND min <= ?', $selectedSupp, $quantity, $quantity);
            $total = round($price + ($price / 100) * $modifier->percentage);
            $form['result']->setValue("$quantity Ks, $total Kč + DPH");
        };

        return $form;
    }

}
?>
artemevsin
Člen | 61
+
0
-

nemáš na mysli něco takového?

<?php

        $form->onSuccess[] = function (Form $form, ArrayHash $values): void {
            $selectedSupp = $values->supplier;
            $modifier = $this->database->fetch('SELECT percentage FROM prices WHERE supplier_id = ? AND max >= ? AND min <= ?', $selectedSupp, $quantity, $quantity);
            $userInput = $values->user_input;
            $lines = $array = explode("\n", $userInput);
			$resultLines = [];
            foreach ($lines as $line) {
                preg_match_all('/[\d]+/', $line, $numbers);
                list($quantity, $price) = $numbers[0];
	            $total = round($price + ($price / 100) * $modifier->percentage);
				$resultLines[] = "$quantity Ks, $total Kč + DPH";
            }

            $form['result']->setValue(implode("\n", $resultLines));
        };

?>
iDome89
Člen | 27
+
0
-

artemevsin napsal(a):

nemáš na mysli něco takového?

<?php

        $form->onSuccess[] = function (Form $form, ArrayHash $values): void {
            $selectedSupp = $values->supplier;
            $modifier = $this->database->fetch('SELECT percentage FROM prices WHERE supplier_id = ? AND max >= ? AND min <= ?', $selectedSupp, $quantity, $quantity);
            $userInput = $values->user_input;
            $lines = $array = explode("\n", $userInput);
			$resultLines = [];
            foreach ($lines as $line) {
                preg_match_all('/[\d]+/', $line, $numbers);
                list($quantity, $price) = $numbers[0];
	            $total = round($price + ($price / 100) * $modifier->percentage);
				$resultLines[] = "$quantity Ks, $total Kč + DPH";
            }

            $form['result']->setValue(implode("\n", $resultLines));
        };

?>

Tady promenna $quantity je zase nedefinovaná v $modifier, neco podobneho uz jsem prave zkousel.

artemevsin
Člen | 61
+
0
-

aha, to jsem přehlédl… tak ten sql dotaz dej do foreache. Nevím, kolik míváš řádků v textarea a jak moc řešíš optimalizaci, ale pokud těch záznamů nemáš moc, tak bych rychlost (resp. počet dotazů) neřešil

iDome89
Člen | 27
+
0
-

artemevsin napsal(a):

aha, to jsem přehlédl… tak ten sql dotaz dej do foreache. Nevím, kolik míváš řádků v textarea a jak moc řešíš optimalizaci, ale pokud těch záznamů nemáš moc, tak bych rychlost (resp. počet dotazů) neřešil

Zkusil jsem to hodit i do toho foreache samozrejme ale, porad mam ten stejny problem jako u „meho“ reseni, kdy je hlaska $price is not and object nebo tak neco, a prave mi to neudela ten vypocet.

artemevsin
Člen | 61
+
0
-

hoď sem přesné znění chyby

iDome89
Člen | 27
+
0
-

artemevsin napsal(a):

hoď sem přesné znění chyby

Chvilku jsem si s tim hrál a nevim proč ale teď to funguje, a to jsem nic nemenil v tom kodu.

Díky za pomoc

Editoval iDome89 (9. 9. 2019 11:06)