Multiplier nefunkční metoda render()

Isigarek
Člen | 74
+
0
-

Dobrý den,
Mám menší problém aktuálně budu vykreslovat několik desítek formulářů, které budou uplně stejné, jen se jim bude měnit default hodnota. Proto jsem zvolil cestu pomocí multiplieru ale hned jsem narazil na problém.

Vytváření v presenteru:

public function createComponentEditExcel()
    {
        $multi = new Multiplier(function($itemID){
            return $this->core->getComponent("excelEdit");
        });
        return $multi;
    }

Error:

Call to undefined method Nette\Application\UI\Multiplier::render()

Tady nastavá problém, že componenta má vlastní template file a render funkci. Multiplier ji ale nechce použít.

Component code:

<?php
/**
 * Created by PhpStorm.
 * User: relisoft
 * Date: 12.7.2017
 * Time: 13:09
 */

namespace App\Bin\Components\Excel\Edit;


use App\Bin\Components\Component;
use App\Bin\Components\Dph\Dph;
use App\Bin\Components\Dph\DphManager;
use Kdyby\Translation\Translator;
use Nette\Application\Application;
use Nette\Application\UI\Form;
use Nette\Database\Context;
use Tracy\Dumper;

class excelEditComponent extends Component
{
    private $db;
    private $app;
    private $t;

    public $onSuccess;
    public $onFailed;

    public function __construct(Application $application, Context $db, Translator $translator)
    {
        $this->db = $db;
        $this->app = $application;
        $this->t = $translator;

        parent::__construct($application, $db, $translator);
    }

    public function render()
    {
        $this->template->setFile(__DIR__."/template/default.latte");
        $this->template->render();
    }

    public function createComponentEdit($itemID)
    {
        $data = $this->app->getPresenter()->getSession()->getSection("import_data")->data;
        $current = $this->findData($data,$itemID);

        $form = new Form();
        $form->addText("name",$this->t->translate("excel.edit.name"))
            ->setDefaultValue($current["name"])
            ->setRequired($this->t->translate("excel.edit.name_required"));

        $form->addText("price_1",$this->t->translate("excel.edit.price_1"))
            ->addRule(Form::FLOAT,$this->t->translate("excel.edit.price_float"))
            ->setDefaultValue($current["price_1"])
            ->setRequired($this->t->translate("excel.edit.price_1_required"));
        $form->addText("price_2",$this->t->translate("excel.edit.price_2"))
            ->addRule(Form::FLOAT,$this->t->translate("excel.edit.price_float"))
            ->setDefaultValue($current["price_2"])
            ->setRequired($this->t->translate("excel.edit.price_2_required"));
        $form->addText("price_3",$this->t->translate("excel.edit.price_3"))
            ->addRule(Form::FLOAT,$this->t->translate("excel.edit.price_float"))
            ->setDefaultValue($current["price_3"])
            ->setRequired($this->t->translate("excel.edit.price_3_required"));
        $form->addText("price_4",$this->t->translate("excel.edit.price_4"))
            ->setDefaultValue($current["price_4"])
            ->addRule(Form::FLOAT,$this->t->translate("excel.edit.price_float"))
            ->setRequired($this->t->translate("excel.edit.price_4_required"));

        $form->addText("state",$this->t->translate("excel.edit.state"))
            ->setDefaultValue($current["state"])
            ->setType("number");
        $form->addText("stock",$this->t->translate("excel.edit.stock"))
            ->setDefaultValue($current["stock"])
            ->setType("number");

        $dph = new Dph();
        $dphManager = new DphManager($this->db);
        $selectData = [];
        foreach($dphManager->get() as $line)
        {
            $selectData[$line->ID] = $line->name;
        }
        $form->addSelect("dph",$this->t->translate("excel.edit.dph"))
            ->setDefaultValue($current["dph"]);

        $form->addProtection($this->t->translate("ui.form.protection"));
        $form->addSubmit("submt",$this->t->translate("excel.edit.submit"));
        $form->onSuccess[] = [$this,"succ"];
        return $form;
    }

    private function findData($data,$itemID)
    {
        $current = [];
        foreach($data as $line)
        {
            if($line["ID"] == $itemID)
            {
                return $line;
            }
            else
            {
                continue;
            }
        }
    }

    public function succ(Form $form,$values)
    {
        Dumper::dump($values);
    }
}

Vyvolávání control makra:

{foreach $data as $line}
            {control editExcel-$line["ID"]}
        {/foreach}

Tady pokud použiji $line["ID"] tak se vyhodí jiný error.

Error #2:

Use of undefined constant editExcel - assumed 'editExcel'

Takže opravdu nevím co s tím a byl bych rád za každou pomoc. Díky moc.

nightfish
Člen | 472
+
0
-

Jaký je kód metody $this->core->getComponent("excelEdit");? Resp. co ta metoda vrací? Měla by vracet něco implementující IComponent

Isigarek
Člen | 74
+
0
-

nightfish napsal(a):

Jaký je kód metody $this->core->getComponent("excelEdit");? Resp. co ta metoda vrací? Měla by vracet něco implementující IComponent

Ano přesně tak vrací IComponent je to jen autoloading udělaný pro componenty všechny a jednoduché implementování do celého projektu. Přímo toto vrací objekt componenty

leninzprahy
Člen | 150
+
+2
-

Metoda render by se měla volat až na té tvé komponentě, možná bude problém v tom latte, zkusi bych něco jako

{foreach $data as $line}
	{var $id = $line["ID"]}
	{control editExcel-$id}
{/foreach}
nightfish
Člen | 472
+
0
-

Jakým způsobem do komponenty předáváš tu proměnnou $itemId, která je uvedena jako parametr callbacku Multiplieru? Protože v tom volání getComponent ji nikde nevidím… (Ale to je jen na okraj, hlavní problém vidím v tom, že se volá metoda render() na Multiplieru a ne na tvé komponentě – z toho bych tipoval, že někde něco vracíš špatně – tedy Multiplier místo IComponent.)

Isigarek
Člen | 74
+
0
-

leninzprahy napsal(a):

Metoda render by se měla volat až na té tvé komponentě, možná bude problém v tom latte, zkusi bych něco jako

{foreach $data as $line}
	{var $id = $line["ID"]}
	{control editExcel-$id}
{/foreach}

Paráda bylo to fakt tím! Díky moc. Latte asi nemá rádo míchání syntaxe, protože v doc bylo použití pouze s stdClass ($line->ID) a ne array. Opravdu to funguje.

Isigarek
Člen | 74
+
0
-

nightfish napsal(a):

Jakým způsobem do komponenty předáváš tu proměnnou $itemId, která je uvedena jako parametr callbacku Multiplieru? Protože v tom volání getComponent ji nikde nevidím… (Ale to je jen na okraj, hlavní problém vidím v tom, že se volá metoda render() na Multiplieru a ne na tvé komponentě – z toho bych tipoval, že někde něco vracíš špatně – tedy Multiplier místo IComponent.)

Ta se předává při hodnotě {control jmenoKomponenty-$neco} viz. doc multiplieru

nightfish
Člen | 472
+
0
-

Isigarek napsal(a):

Ta se předává při hodnotě {control jmenoKomponenty-$neco} viz. doc multiplieru

Šlo mi o to, že v kódu, který jsi ukázal v prvním příspěvku, s tou proměnnou $itemID nikde nepracuješ (nepředáváš ji do getComponent).

public function createComponentEditExcel()
{
    $multi = new Multiplier(function($itemID){
        return $this->core->getComponent("excelEdit");
    });
    return $multi;
}
Isigarek
Člen | 74
+
0
-

Finále vypadá totiž takto:

public function createComponentEditExcel()
   {
       $multi = new Multiplier(function($itemID){
           $component = $this->core->getComponent("excelEdit");
           $component->setItemID($itemID);
           return $component;
       });
       return $multi;
   }
GEpic
Člen | 562
+
+1
-

Popř. by mělo fungovat:

{control "editExcel-" . $line["ID"]}