Multiplier nefunkční metoda render()
- Isigarek
- Člen | 74
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.
- Isigarek
- Člen | 74
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
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 | 519
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
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
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á metodarender()
naMultiplieru
a ne na tvé komponentě – z toho bych tipoval, že někde něco vracíš špatně – tedyMultiplier
místoIComponent
.)
Ta se předává při hodnotě {control jmenoKomponenty-$neco} viz. doc multiplieru
- nightfish
- Člen | 519
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;
}