Ověření přihlášení uživatele ve vlastním makru

Alsatian
Člen | 175
+
0
-

Ahoj. Podle Pavlal Jandy v jedné z diskuzí jsem si vytvořil vlastní makro.
Kód s dovolením přikládám níže. Nedaří se mi do něj vložit ověření, jestli je uživatel přihlášený nebo ne.
Pomůže mi, prosím, někdo s úpravou? Moc děkuji.

Config:

latte:
    macros:
        - App\Utils\Macros

Macros.php:

<?php

namespace App\Utils;

use Latte;

class Macros extends Latte\Macros\MacroSet
{

    public static function install(Latte\Compiler $compiler)
    {
        $set = new static($compiler);

        $set->addMacro('cms', array($set, 'macroCms'));

        return $set;
    }


    public function macroCms(Latte\MacroNode $node, Latte\PhpWriter $writer)
    {
        return $writer->write(
            'echo \App\Utils\Macros::renderMacroCms(%node.word)'
        );
    }

    public static function renderMacroCms($blockId = NULL)
    {
        $blockId = $blockId ?: self::$blockId;

        /*
        if($this->user->isAllowed('AdminPost', 'edit')) {
            echo 'data-cms="'.$blockId.'"';
        }
        */
    }

}

Editoval Alsatian (5. 9. 2018 8:24)

MajklNajt
Člen | 501
+
0
-

takto si neskúšal?

	/** @var Nette\Security\User $user */
	private $user;

public function __construct(Nette\Security\User $user)
{
    $this->user = $user;
}
Alsatian
Člen | 175
+
0
-

MajklNajt napsal(a):

takto si neskúšal?

	/** @var Nette\Security\User $user */
	private $user;

public function __construct(Nette\Security\User $user)
{
    $this->user = $user;
}

Ahoj, zkoušel hned jako první, ale končí to chybou stejně jako další mé pokusy :)
On hlavně to $this tam nějak nefunguje viz „Using $this when not in object context“

Argument 1 passed to App\Utils\Macros::__construct() must be an instance of App\Utils\Nette\Security\User, instance of Latte\Compiler given

Editoval Alsatian (5. 9. 2018 9:28)

Ondřej Kubíček
Člen | 494
+
0
-

MajklNajt napsal(a):

takto si neskúšal?

	/** @var Nette\Security\User $user */
	private $user;

public function __construct(Nette\Security\User $user)
{
    $this->user = $user;
}

v těch statických metodách to mít nebude

Alsatian
Člen | 175
+
0
-

Ondřej Kubíček napsal(a):

MajklNajt napsal(a):

takto si neskúšal?

	/** @var Nette\Security\User $user */
	private $user;

public function __construct(Nette\Security\User $user)
{
    $this->user = $user;
}

v těch statických metodách to mít nebude

Řešení by bylo kontrolovat přihlášení už v latte klasickým IFem, ale umístil jsem to zde pro zjednodušení kódu. Generuje mi to upravovací tlačítko pro kontext na stránce. Pokud nejsem přihlášený, nic se nevygeneruje.

Makro předpokládá jeden parametr, číslo, což je ID záznamu s textem v databázi. Celkově to slouží pro úpravu textu na stránce v takovém velmi jednoduchém redakčním systému, kdy si uživatel může pouze vyměnit text v nějakém bloku. Třeba H1 a podobně.

Editoval Alsatian (5. 9. 2018 9:34)

MajklNajt
Člen | 501
+
0
-

Ondřej Kubíček napsal(a):

MajklNajt napsal(a):

takto si neskúšal?

	/** @var Nette\Security\User $user */
	private $user;

public function __construct(Nette\Security\User $user)
{
    $this->user = $user;
}

v těch statických metodách to mít nebude

sorry, nevšimol som si static.. ja si takto predávam závislosti do filtrov, ale makra teda fungujú ináč

Martk
Člen | 661
+
+1
-

Bude to o trošku složitější. Budeš si muset vytvořit třídu, která ti obslouží makro cms.

class CmsProvider {

	public function __construct(User $user) {
		$this->user = $user;
	}

	public function renderMacroCms($blockId = null) {
		if ($this->user->isLoggedIn()) {
			// ...
		}
	}

}

Tuto třídu zaregistrovat jako latte provider v DI

public function loadConfiguration() {
	$builder = $this->getContainerBuilder();

	$builder->addDefinition($this->prefix('cmsProvider'))
		->setType(CmsProvider::class);
}

public function beforeCompile() {
	$builder = $this->getContainerBuilder();

	$builder->getDefinition('latte.latteFactory')
		->addSetup('addProvider', ['cmsProvider', $this->prefix('@cmsProvider')]);
}

a makro jako

$set->addMacro('cms', '$this->global->cmsProvider->renderMacroCms(%node.word);');
Alsatian
Člen | 175
+
0
-

Martk

Moc děkuji. Na to se musím něčím posilnit :D Ale zkusím.

Alsatian
Člen | 175
+
0
-

Ještě prosím o jednu radu. Jak do úplně prvně uvedeného příkladu přidat druhý parametr v latte. Abych mohl použít třeba:

{cms 10 'nejaky text'}
Martk
Člen | 661
+
0
-

Změnit %node.word na %node.args

Editoval Martk (5. 9. 2018 16:11)

Alsatian
Člen | 175
+
0
-

Martk napsal(a):

Změnit %node.word na %node.args

Kam na tohle lidi chodíte :) Díky moc moc :)
V latte se parametr oddělil čárkou. Jen pro úplnost, kdyby náhodou někdo něco podobného řešil a tápal jako já :)

Alsatian
Člen | 175
+
0
-

A ještě mám dotaz :)

Ručně vygenerovaný blok snippetu, kde se dosadí třeba „snippet–cms1“, další bude „snippet–cms2“.. se při volání nepřekreslí.
Generování snippetu (pokud jej udělám klasicky {snippet cms1}…{/snippet}, tak se překreslí):

return '<span id="snippet--cms'.$id.'" data-cms="'.$id.'">'.$text.'</span>';

Volání z handle v presenteru:

$this->redrawControl('cms'.$id);
Martk
Člen | 661
+
0
-
{snippet cms}
	{foreach $items as $item}
		<div n:snippet="cms-$item->id">
			content
		</div>
	{/foreach}
{/snippet}
$this->redrawControl('cms');

Tímto voláním se překreslí jen dynamický snippet (cms-$item->id), který se změnil.

Dodatek mimo dotaz
A kdybys chtěl překreslit všechno, tak to budeš muset obalit ještě jedním celým snippetem.

{snippet wholeCms}
	{snippet cms}
		...
	{/snippet}
{/snippet}
$this->redrawControl('wholeCms');

PS: Pracuji s nette 3.0, nevím, jestli to takhle funguje i na nette 2.4

Alsatian
Člen | 175
+
0
-

Ahoj.
Pracuji se snippety, vím jak se používají. Teď chci ale snippet vygenerovat mimo latte. Ve vlastním makru. Třeba je to úplný nesmysl, nevím. Kód vypadá takto:

	public static function renderMacroCms($id = NULL, $text = '')
{
    $id = $id ?: self::$id;

    return '<span id="snippet--cms'.$id.'" data-cms="'.$id.'">'.$text.'</span>';
}

Při volání potom $this->redrawControl(‚cms‘.$id); se snippet nepřekreslí.

Editoval Alsatian (5. 9. 2018 21:34)

Ondřej Kubíček
Člen | 494
+
0
-

to podle mě nemůžeš, respektive nestačí ti přidat kousek html
netuším jak to funguje na pozadí, ale nette si určitě ukládá seznam snippetů, takže bys ještě musel říct nette, žes tady vytvořil snippet

Martk
Člen | 661
+
+1
-

To id snippetu slouží jen na straně javascriptu. Latte generuje dodatečný php kód a blok pro snippety, pro více informací se koukni do cache, lze to tam krásně vidět.