Komponenta na komentár (čo komentár to komponenta)
- Matey
- Člen | 142
Ahojte, dnes som si prerobil komentáre ku článku z jednej komponenty ktorá komentáre len vypísala
<?php
<div n:foreach="$article->comments as $comment">
<p>{$comment->name}</p>
//...
</div>
?>
na jednotlivé komponenty (čo komentár to komponenta)
<?php
{foreach $article->comments as $comment}
{var key = $iterator->counter - 1}
{control test-$key}
{/foreach}
?>
v prezenteri mám jeden veľký objekt v ktorom je článok(article) a jeho
komentáre(comments ako objekt comment)
pripojenie komponenty vypadá takto
<?php
protected function createComponentComment() {
return new Multiplier(function ($id) {
return $this->commentFactory->create($this->article->comments[$id]);
});
}
?>
krásne to funguje.. dovoľuje mi to konkrétne komentáre editovať(prekreslí sa na editačný form)/mazať(prekreslí sa na potvrdenie zmazania) atď
Ale chcel som sa riadiť idčkom komentára a nie klúčom poľa pod ktorým je potrebný komentár, zmenil som to na
<?php
{foreach $article->comments as $comment}
{control comment-$comment->id}
{/foreach}
?>
a pripojenie
<?php
protected function createComponentComment() {
return new Multiplier(function ($id) {
return $this->commentFactory->create($this->findCommentById($id));
});
}
private function findCommentById($id){
foreach ($this->article->comments as $comment) {
if ( $comment->id == $id) {
return $comment;
}
}
}
?>
no a zas som si problém vyriešil už počas písania tohoto príspevku :) (šlo práve o to vyhľadávanie podľa id komentára a nie podľa kľúča pola)
tak sa už len spýtam..
- napadá vás ešte nejaký lepší spôsob ako vyhľadať potrebný objekt?
- je toto riešenie komentárov cez komponenty vhodné? vzhľadom na náročnosť oproti tomu čo som uviedol hneď na začiatok (ak sa nazbiera viac komentárov čiže vytváranie ďalších komponent a prehľadávanie findCommentById) chcel by som takto riešiť aj výpis článkov a určite sa nájde aj ďalšie využitie na komponenty
- David Matějka
- Moderator | 6445
napadá vás ešte nejaký lepší spôsob ako vyhľadať potrebný objekt?
muzes si udelat array, kde jako klic bude id komentare
jinak je to v poradku..
- Matey
- Člen | 142
@Čamo stačilo by, ale chcel som to urobiť elegantnejšie a niečo nové sa naučiť :) nebudem mať kopu kodu v ArticlePresenter, všetko čo sa týka komentárov sa tak presunie na komponentu. Získam tým krásnu editáciu/delete komentáru, kde sa len ten jeden komentár prekeslí na editačný form atď :) + do toho chcem pridať Kdyby\Translator a ACL
továrnička na komponentu mi zjednoduší/zautomatizuje pripájanie komponenty k presenteru:
<?php
namespace App\Components\Comment;
/**
* @author Matej
*/
interface ICommentControlFactory {
/**
* @param int $id
* @return CommentControl
*/
public function create($id);
}
?>
registrácia továrničky ako služby:
services:
- implement: App\Components\Comment\ICommentControlFactory
parameters: [comment]
arguments: [%comment%]
vo výsledku mi tá komponenta v presenteri:
<?php
/** @var ICommentControlFactory @inject */
public $commentControlFactory;
protected function createComponentComment() {
return new Multiplier(function ($id) {
return $this->commentControlFactory->create($this->findCommentById($id));
});
}
?>
vráti triedu \App\Components\Comment\CommentControl cez Multiplier
CommentControl sa stará samostatne o každý komentár
(ak som niekde niečo zle napísal, tak pardón, php (Nette) atď okolo webu je len takým mojím koníčkom na voľné chvíle)
Editoval Matey (15. 7. 2014 17:45)
- Matey
- Člen | 142
Zdravím, trošku som si to chcel ešte vylepšiť, momentálne to vypadá
asi takto:
Ku prezenteru pripojím komponentu comments, ktorá vytvára
formulár na pridávanie komentárov a multiplierom vytvára komponenty
comment ktoré majú na starosti komentár zobraziť,
dovoľujú podľa práv komentár upravovať / mazať.
v šablóne komponenty comment môžem priamo používať
premennú $user
no priamo v komponente nemám prístupný presenter, čiže
$this->presenter->user… mi vyhodí že komponenta nie je pripojená
k presenteru, áno nie je lebo je pripojená k inej komponente a až tá je
pripojená priamo k presenteru
otázka: musím si užívateľa dodať cez konštruktor, alebo je nato nejaká finta?
edit: zjavne bol problém v tom že som sa do konštruktoru komponenty comment snažil dostať inicializaciu nejakych premennych ktoré používali presenter a ten v tej chvíli ešte nie je vytvorený, ak som túto inicializaciu presunul mimo konštruktoru všetko bolo ok
Editoval Matey (19. 7. 2014 22:16)