Předání dat z presenteru latte

JazeX
Člen | 10
+
0
-

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.

MajklNajt
Člen | 470
+
0
-

skúšal si takto?

public function renderDefault(): void
	$data = [];
	...
	$this-template->setParameters($data);
}
JazeX
Člen | 10
+
0
-

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)

MajklNajt
Člen | 470
+
0
-

A toto riešenie, čo si práve napísal, má aký problém? Však to by malo normálne fungovať

lookass
Člen | 53
+
0
-

Není pouze problém mezi formáty? $data je v tvém případě typu array.

<?php
$this->template->data = ArrayHash::from($data);
?>
JazeX
Člen | 10
+
0
-

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

Po použítí řešení od MajlkNajt pro změnu následující: Undefined variable: data

Editoval JazeX (23. 6. 2020 0:13)

lookass
Člen | 53
+
0
-

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

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;
?>
JazeX
Člen | 10
+
0
-

Takže se ani v jednom případě nevyhnu výpisu podobnému tomuto: $celkemProkliku->celkemProkliku, respektive $data->celkemProkliku->celkemProkliku?

Editoval JazeX (23. 6. 2020 0:31)

lookass
Člen | 53
+
0
-

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

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

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

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!