Komponenta na komentár (čo komentár to komponenta)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Matey
Člen | 142
+
0
-

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..

  1. napadá vás ešte nejaký lepší spôsob ako vyhľadať potrebný objekt?
  2. 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
+
0
-

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

@matej21 ďakujem, tak to ešte skúsim na strane ORM (LM), možno tam na to má niečo pred pripravené, aby to mapoval s iným kľúčom

Čamo
Člen | 798
+
0
-

@Matey
Mohol by si sem hodiť kód funkcie commentFactory->create()
Nechápem prečo to riešiš tak zložito. Nestačilo by aby mal každý komentár pri sebe odkaz na actionEdit resp. actionDelete s príslušným id?

Editoval Čamo (15. 7. 2014 16:54)

Matey
Člen | 142
+
0
-

@Č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)

Čamo
Člen | 798
+
0
-

Len som chcel vedieť aký je dôvod. Zdá sa, že si lepšie na tom ako ja. Ja tie továrne a konfig musím ešte trénovať.

akadlec
Člen | 1326
+
0
-

@Čamo: prečo? abys to měl zapozdřeno a tak nějak na jednom místě a pak máš i možnost to vzít jako pack a dát do jiné appky.

Matey
Člen | 142
+
0
-

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)