Předání dat z presenteru latte
- JazeX
- Člen | 10
Zdravím,
rád bych předal latte data v jednom jediném poli, ze kterého by šlo
data tahat.
Aktuálně to vypadá takto:
final class AdminPresenter extends Nette\Application\UI\Presenter
{
/** @var Nette\Database\Context */
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function renderDefault(): void
{
$this->template->pK = $this->database->query('SELECT COUNT(*) AS pocetKampani FROM kampane')->fetch();
$this->template->cP = $this->database->query('SELECT COUNT(*) AS celkemProkliku FROM clicks')->fetch();
$ziskBezZpracovatele = $this->database->query('SELECT SUM(cCPC) AS ziskBezZpracovatele FROM clicks WHERE cZpracovatel IS NULL')->fetch();
$ziskZbytek = $this->database->query('SELECT ROUND(SUM(cCPC)*0.2, 2) AS ziskZbytek FROM clicks WHERE cZpracovatel IS NOT NULL')->fetch();
$this->template->celkemZisk = $ziskBezZpracovatele['ziskBezZpracovatele'] + $ziskZbytek['ziskZbytek'];
$this->template->chP = $this->database->query('SELECT SUM(cCPC) AS chybnychProkliku FROM clicks WHERE cZpracovatel IS NULL')->fetch();
$this->template->prokliky = $this->database->fetchAll('SELECT * FROM clicks ORDER BY cID DESC');
}
Mým cílem je, aby šlo předat data v jednom poli a já nemusel přiřazovat několik proměnných, jen sypat data do daného pole.
Děkuju mockrát.
- JazeX
- Člen | 10
Chvilku jsem se domníval, že to skutečně to, co potřebuji. Bohužel..
Jde mi o toto:
public function renderDefault(): void
{
$data = array();
$data['pocetKampani'] = $this->database->query('SELECT COUNT(*) AS pocetKampani FROM kampane')->fetch();
$data['celkemProkliku'] = $this->database->query('SELECT COUNT(*) AS celkemProkliku FROM clicks')->fetch();
$data['ziskBezZpracovatele'] = $this->database->query('SELECT SUM(cCPC) AS ziskBezZpracovatele FROM clicks WHERE cZpracovatel IS NULL')->fetch();
$data['ziskZbytek'] = $this->database->query('SELECT ROUND(SUM(cCPC)*0.2, 2) AS ziskZbytek FROM clicks WHERE cZpracovatel IS NOT NULL')->fetch();
$data['celkemZisk'] = $data['ziskBezZpracovatele'] + $data['ziskZbytek'];
$data['chybnychProkliku'] = $this->database->query('SELECT SUM(cCPC) AS chybnychProkliku FROM clicks WHERE cZpracovatel IS NULL')->fetch();
$data['prokliky'] = $this->database->fetchAll('SELECT * FROM clicks ORDER BY cID DESC');
$this->template->data = $data;
}
v default.latte:
<table class="table table-striped table-bordered text-center"><thead class="thead-light">
<thead>
<tr>
<th scope="col">Počet všech kampaní</th>
<th scope="col">Celkem prokliků</th>
<th scope="col">Provize z chybných prokliků</th>
<th scope="col">Celková provize portálu</th>
</tr>
</thead>
<tbody>
<tr>
{if $data->pocetKampani == 0}
<td colspan="4">Na portálu ještě nebyla vytvořena žádná kampaň.</td>
{elseif $data->pocetKampani > 0 && $cP->celkemProkliku == 0}
<td>{$data->pocetKampani} kampaní</td>
<td colspan="3">Na portálu ještě nebyli zaznamenány žádné prokliky.</td>
{else}
<td>{$data->pocetKampani} kampaní</td>
<td>{$data->celkemProkliku} prokliků</td>
{if $data->chybnychProkliku == 0}
<td>0 Kč</td>
{else}
<td>{$data->chybnychProkliku} Kč</td>
{/if}
<td>{$data->celkemZisk} Kč</td>
{/if}
</tr>
</tbody>
</table>
Nebo něco podobného, na takový způsob. Zkrátka o to, abych všechny informace mohl navrátit do jednoho pole, které později předám latte, které mi ho pomůže zobrazit.
Předem díky, i za trpělivost.
Editoval JazeX (22. 6. 2020 23:11)
- lookass
- Člen | 54
Undefined variable: data ⇒ tipuju, že to je reakce na
<?php
public function renderDefault(): void
$data = [];
...
$this-template->setParameters($data);
}
?>
což v šabloně chceš vypisovat
$data->...
jenže do šablony se ti nepředlo pole $data, ale název klíče a jeho hodnota, tzn. $pocetKampani, $celkemProkliku, …
- lookass
- Člen | 54
JazeX napsal(a):
Po použití řešení od lookasse je problém následující:
Object of class Nette\Database\Row could not be converted to string
A toto je, protože metoda fetch vrací Nette\Database\Row. Takže např. pro počet kamapaní to bude
<?php
$data->pocetKampani->pocetKampani;
?>
- lookass
- Člen | 54
JazeX napsal(a):
Takže se ani v jednom případě nevyhnu výpisu podobnému tomuto:
$celkemProkliku->celkemProkliku
, respektive$data->celkemProkliku->celkemProkliku
?
Co třeba zkusit něco takového:
<?php
function renderDefault():void
{
$this->template->pocetKampani = $this->kamaneManager->getAll->count();
$this->template->celkemProkliku = $this->cliksManager->getAll->count();
...
}
?>
Neříkám, že to je takto správně, ale byl by to vcelku zásadní posun ;-)
- MajklNajt
- Člen | 502
@JazeX prestávam chápať, čoho sa snažíš dosiahnúť – ak
chceš sypať dáta do poľa a v šablóne potom používať premennú
$data
, sprav to tak, ako si písal ty:
public function renderDefault(): void
{
$data = array();
$data['pocetKampani'] = $this->database->query('SELECT COUNT(*) AS pocetKampani FROM kampane')->fetch();
$data['celkemProkliku'] = $this->database->query('SELECT COUNT(*) AS celkemProkliku FROM clicks')->fetch();
$data['ziskBezZpracovatele'] = $this->database->query('SELECT SUM(cCPC) AS ziskBezZpracovatele FROM clicks WHERE cZpracovatel IS NULL')->fetch();
$data['ziskZbytek'] = $this->database->query('SELECT ROUND(SUM(cCPC)*0.2, 2) AS ziskZbytek FROM clicks WHERE cZpracovatel IS NOT NULL')->fetch();
$data['celkemZisk'] = $data['ziskBezZpracovatele'] + $data['ziskZbytek'];
$data['chybnychProkliku'] = $this->database->query('SELECT SUM(cCPC) AS chybnychProkliku FROM clicks WHERE cZpracovatel IS NULL')->fetch();
$data['prokliky'] = $this->database->fetchAll('SELECT * FROM clicks ORDER BY cID DESC');
$this->template->data = $data;
}
ak chceš $prokliky
, $pocetKampani
atď, používaj
to, čo som písal v prvom príspevku:
public function renderDefault(): void
{
$data = array();
...
$this->template->setParameters($data);
}
či kde je problém?
Editoval MajklNajt (23. 6. 2020 7:36)
- janpecha
- Backer | 75
@JazeX místo fetch()
(vrací řádek) prostě použij
fetchField()
(vrací hodnotu buňky), viz dokumentace https://doc.nette.org/…atabase/core#…
- JazeX
- Člen | 10
Pánové, já vám ohromně děkuju za trpělivost a ochotu mi pomoct.
Šlo mi primárně o nasypání hodnot do jednoho pole a zároveň trochu o vzhled kódu.
Moc jste mi pomohli, nakonec i janpecha
, který mě správně
upozornil, že problém, který jsem řešil jako poslední je zapříčiněný
špatnou metodou na volání dat. Už to krásně běží jak má a já vám
jsem velmi vděčný.
Díky moc!