Path: csiph.com!news.swapon.de!newsfeed.fsmpi.rwth-aachen.de!newsfeed.straub-nv.de!weretis.net!feeder1.news.weretis.net!news.solani.org!.POSTED!not-for-mail From: Thomas 'PointedEars' Lahn Newsgroups: de.comp.lang.php Subject: Re: Darstellung von Knoten mit Trennung zwischen view und Code Date: Thu, 17 Dec 2015 20:45:09 +0100 Organization: PointedEars Software (PES) Lines: 116 Message-ID: <1840896.Q9fhR2YkPP@PointedEars.de> References: <1t5672db4fi7736n3e8%sfroehli@Froehlich.Priv.at> Reply-To: Thomas 'PointedEars' Lahn Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8Bit X-Trace: solani.org 1450381511 27169 eJwFwQkBACAIA8BKIjCoI8/6R/DOFYIOg8OczvEQTePBtUfbGGGXPFC3M3dqca7GTVTE2gcfnhE8 (17 Dec 2015 19:45:11 GMT) X-Complaints-To: abuse@news.solani.org NNTP-Posting-Date: Thu, 17 Dec 2015 19:45:11 +0000 (UTC) User-Agent: KNode/4.14.2 X-User-ID: eJwNzAkBACEIBMBKwi6PcUClf4S7CTAGFz9BN6eNDS8ouuoFo85BqcB7h2jKsPO6FpL7nd6UeGPQ1lzAf7jOBzezFGw= Cancel-Lock: sha1:R9REKH1v0ej+c3qV1z8+ntFLtJs= X-NNTP-Posting-Host: eJwFwQERADEIAzBLbKXlXg484F/CEkJHf7go53JPWw1aws0O8oPflLc3Y0RDTY45orRYywcUyBD0 Xref: csiph.com de.comp.lang.php:3614 Stefan Froehlich wrote: > On Thu, 17 Dec 2015 13:44:51 Jan Novak wrote: >> class Groups{ >> ... >> >> public function ceateTree($groups,$parent_id=0){ >> foreach($groups as $group){ >> if($group->getPrimaryGroup()===$parent_id){ >> echo '
  • ', $group->getName(); >> this->ceateTree($groups,$group->getId()); >> echo '
  • '; >> } >> } >> } >> } >> ... >> } > >> Ich habe meinen Code und meine Ausgaben in getrennten Dateien stehen. >> Der View ist eine "dumme" HTML Datei, in welcher nur Anweisungen wie zum >> Beispiel >> WasAuchImmer ?> >> stehen. > > So weit, so gut - aber wenn Du Views verwendest, wieso hast Du dann > echo-Befehle in Deinem Code stehen. Weil man das im allgemeinen so machen sollte. Wobei ab PHP 5.4 kürzer geschrieben werden kann. Und PHP < 5.4 will man nicht mehr benutzen, schon aus Performancegründen nicht. > Statt dessen empfiehlt sich in > einem ersten Schritt z.B. so etwas: > > #v+ > public function createTree($groups, $parent_id=0) { > $string = ''; > foreach ($groups as $group) { > $string = '
  • ' . $group->getName(); > $string .= $this->createTree($groups, $group->getId()); > $string .= '
  • '; > } Effizienter: $that = $this; $string = implode('', array_map(function ($group) use ($that, $groups) { return '
  • ' . $group->getName() . $that->createTree($groups, $group->getId()) . '
  • '; }, $groups) ); > return $string; > } > #v- Bei sauberem MVC gehört überhaupt kein Markup in diese Methode. >> Wie kann ich die selbstaufrufende Funktion "createTree" in den >> HTML View einbetten, ohne dort wieder viel PHP Code haben zu >> müssen? > > In Deinem View musst Du nun $groups zur Verfügung haben Nein, muss er nicht. > und kannst danach: > > #v+ > createTree($groups); ?> > #v- Falsch. Das Template darf maximal $this->groups benutzen. Es soll nämlich _nicht_ von Implementierungsdetails abhängig sein. > schreiben (wobei mir nicht ganz klar ist, wo der Unterschied > zwischen $this und $groups sein soll, und ob $groups überhaupt > benötigt wird; aber das musst Du selbst wissen). $this ist bei MVC in Templates üblicherweise die Referenz auf die Instanz der View-Klasse für das Template (denn dieses wird in einer View-Methode – render() o.ä. – included), $group wären die darzustellenden Daten. Wobei sich aber nicht das Template die Daten aus dem Model holen, oder gar den Controller bemühen soll, sondern der Controller muss vorgängig die Daten aus dem Model holen und damit eine möglichst darstellungsunabhängige View- Variable definieren, deren Wert vom Template über die View-Instanz benutzt wird: Controller <----> Model ^ `-. .-' : : X X v .-' '-. : View <--------- Template Also: groups as $group): ?>
  • name ?>…
  • > In einem zweiten Schritt würde ich dann auch für den inneren > HTML-Code "
  • $name $subtree
  • " noch ein Template schreiben > und aus der Funktion heraus aufrufen, damit Du in der Programmlogik > am Ende kein HTML mehr hast. Die Rekursionslogik für die Darstellung gehört ins Template, die Rekursionslogik für die Daten ins Model. -- PointedEars Zend Certified PHP Engineer Twitter: @PointedEars2 Please do not cc me. / Bitte keine Kopien per E-Mail.