Ověření přihlášení uživatele ve vlastním makru
- Alsatian
- Člen | 175
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)
- Alsatian
- Člen | 175
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
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
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
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
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
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
{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
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
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