Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.php > #3614

Re: Darstellung von Knoten mit Trennung zwischen view und Code

From Thomas 'PointedEars' Lahn <PointedEars@web.de>
Newsgroups de.comp.lang.php
Subject Re: Darstellung von Knoten mit Trennung zwischen view und Code
Date 2015-12-17 20:45 +0100
Organization PointedEars Software (PES)
Message-ID <1840896.Q9fhR2YkPP@PointedEars.de> (permalink)
References <n4uao3$v4r$1@news.albasani.net> <1t5672db4fi7736n3e8%sfroehli@Froehlich.Priv.at>

Show all headers | View raw


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 '<li>', $group->getName();
>>                         this->ceateTree($groups,$group->getId());
>>                         echo '</li>';
>>                         }
>>                 }
>>         }
>> }
>> ...
>> }
>  
>> 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
>> <?php echo $this->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 <?php echo … ?> 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 = '<li>' . $group->getName();
> $string .= $this->createTree($groups, $group->getId());
> $string .= '</li>';
> }

Effizienter:

  $that = $this;
  $string = implode('',
    array_map(function ($group) use ($that, $groups) {
      return '<li>' . $group->getName()
        . $that->createTree($groups, $group->getId())
        . '</li>';
    }, $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+
> <?php echo $this->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:

  <?php foreach ($this->groups as $group): ?>
    <li><?= $group->name ?>…</li>
  <?php endforeach; ?>

> In einem zweiten Schritt würde ich dann auch für den inneren
> HTML-Code "<li>$name $subtree</li>" 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.

Back to de.comp.lang.php | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Darstellung von Knoten mit Trennung zwischen view und Code Jan Novak <repcom@gmail.com> - 2015-12-17 13:44 +0100
  Re: Darstellung von Knoten mit Trennung zwischen view und Code Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2015-12-17 16:01 +0000
    Re: Darstellung von Knoten mit Trennung zwischen view und Code Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2015-12-17 20:45 +0100
      Re: Darstellung von Knoten mit Trennung zwischen view und Code Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2015-12-17 22:27 +0000
      Re: Darstellung von Knoten mit Trennung zwischen view und Code Jan Novak <repcom@gmail.com> - 2015-12-18 08:25 +0100
        Re: Darstellung von Knoten mit Trennung zwischen view und Code Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2015-12-19 18:33 +0100
          Re: Darstellung von Knoten mit Trennung zwischen view und Code Jan Novak <repcom@gmail.com> - 2016-01-11 14:08 +0100

csiph-web