PHP Funktion wie Smarty Funktion cycle?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • PHP Funktion wie Smarty Funktion cycle?

    Ich arbeite sonst immer mit Systemen die als Template Engine Smarty benutzen, dort kann man auf einfache Weise Elemente durchzählen und zum Beispiel individuelle Klassen verteilen, indem man den cycle Befehl benutzt:

    Zum Beispiel
    <li class="np{cycle values="1, 2, 3"}">

    Nun habe ich folgenden php Code und benötige normalerweise wieder den cycle Befehl um die class="product-image" um die Klassen "links" "mitte" und "rechts" , jeweils ebe in einem cycle zu erweitern.
    Das System beinhaltet keine Smarty Template Engine, sa dass ich per PHP lösen muss. Was bietet sich da an, mehrere foreach?

    PHP-Quellcode

    1. <?php $_collectionSize = $_productCollection->count() ?>
    2. <?php $i=0; foreach ($_productCollection as $_product): ?>
    3. <?php if ($i++%3==0): ?>
    4. <p>
    5. <?php endif ?>
    6. <li class="product-image">
    7. <a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $this->htmlEscape($_product->getName()) ?>">
    8. <img src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(240, 150); ?>" width="240" height="150" alt="<?php echo $this->htmlEscape($_product->getName()) ?>"/>
    9. </a>
    10. </li>
    11. </p>
    12. <?php endforeach ?>
    Alles anzeigen
  • Ich hab das mal versucht nachzuvollziehen und dieses Tutorial gelesen php-center.de/tutorial/teil1.htm
    Also die Funktion des Moulos % hab ich verstanden, der bildet die Reste, hab ich hier gelesen tut.php-quake.net/rechnen.html#u3.
    $i ist ja eine einfache Variable, die mit ++ um den Faktor eins erhöht wird, beginnend bei 0. Aber was bedeutet while (true). While definiert doch wann bzw bis wann etwas gemacht wird. Während eben. Heißt dann while true, das $cycles gemacht werden, während array 5, 6, oder 7 ist?
    Ich verstehe cycle nicht und array.
  • Hab mal ein wenig weiter in den ganzen Literaturempfehlungen gelesen. Verstehe das jetzt so, dass ich in dem array verschieden Werte speichern kann, so zum Beispiel auch meine benötigten Klassenbezeichnungen "links" "mitte" "rechts". Dann gebe ich dieses, als Variable cycle gespeichertes, array per echo aus, in der Reihenfolge wie i hochgezählt wird ++ ? Und wie funktioniert dann der letzte Teil mit dem Modulo Operator, er müsste doch den cycle immer wieder von vorne beginnen lassen, sobald der cycle bei 3 ist (1,2,3 = links, mitte, rechts)?

    Quellcode

    1. [$i++%count($cycles)
  • i wird immer größer und der rest wird nie größer der anzahl der array elemente...
    bau dir ne ausgabe ums besser zu verstehen.... poste das ergebnis auch mal für die anderen...

    Quellcode

    1. $i=0;
    2. $cycles = array('5','6','7');
    3. while(true) {
    4. echo "\$i=$i<br/>";
    5. echo "\$i%".count($cycles)."=".($i%count($cycles))."<br/>";
    6. echo "\$cycles[".($i%count($cycles)."]=".($cycles[$i%count($cycles)])."<br/>";
    7. $i++;
    8. if($i==50) break;
    9. }
  • Ich habe es jetzt einmal umgesetzt und es funktioniert auch.

    PHP-Quellcode

    1. <?php $i=0; foreach ($_productCollection as $_product): ?>
    2. <li class="<?php $cycles = array('pimage_left','pimage_center','pimage_right');
    3. echo $cycles[$i++%count($cycles)];?>">
    4. <a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $this->htmlEscape($_product->getName()) ?>">
    5. <img src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(240, 150); ?>" width="240" height="150" alt="<?php echo $this->htmlEscape($_product->getName()) ?>"/>
    6. </a>
    7. </li>
    8. <?php endforeach ?>


    Was ich immer noch nicht verstehe ist der Term [$i++%count($cycles)]. O.k. i wird hochgezählt, dann der Modulo der den Rest erzeugt, aber was macht count($cycles). Ich weiß das der Modulo ja irgendetwas braucht um den Rest zu bilden. Zum Beispiel:

    PHP-Quellcode

    1. <?php
    2. $rest = 20%7;
    3. echo "Der Rest von 20 durch 7 ist: ".$rest;
    4. // Der Rest ist 6, denn 20 = (2*7)+6 = 14+6
    5. ?>


    Quelle: tut.php-quake.net/rechnen.html#u3

    In unserem Beispiel wird ja dann die Anzahl der ausgegeben Bilder durch die Anzahl der cyclen geteilt? Also wenn ich 3 Bilder habe ist der cyclus einmal durch, bei 6 das zweite mal. Dadurch erhöht sich immer der Divident im selben Verhältns wie sich die Bildanzahl erhöht und somit komme ich nicht über die array Länge hinaus? Sprich 3:1 = 3 (länge des Arrays), 6:2 = 3, 24:8=3 etc. Aber Modulo bildet doch den Rest?
  • Ach so, also ist der Dividident bei einen Array aus 3 Elementen, demach 3. Und dadurch das Modulo immer den Rest ausgibt kommt man nicht über die array länge, sondern erhält immer die Werte 0,1 oder 2 welche dann den array Elementen zugewiesen werden. Also 0 entspricht 6:3=2, demnach Modulo Rest 0 = Klasse "left". Bei 7 wäre der Rest 1, also Klasse "center". Das gilt ja dann dank Modulo für alle Werte, egal wie hoch diese sind. Beispiel 26:3 = Rest 2, also Klasse "right". Prima, ich hab es kapiert … tut mir Leid das es so lange gedauert hat, aber ich wollte es unbedingt mal richtig verstehen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von 21cdb ()