+ Antworten
Ergebnis 1 bis 7 von 7

Thema: countModules Bedingung

  1. #1
    Neu an Board
    Registriert seit
    23.10.2007
    Beiträge
    4
    Bedankte sich
    3
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Beitrag countModules Bedingung

    Hallo,

    zur Zeit arbeite ich mit Joomla 2.51 und möchte ein neues Template auf meinem lokalen Server erstellen. Dabei soll die Klasse "box info" nur greifen, wenn alle 4 Module aktiv sind. Deswege habe ich mir mit meinen kaum vorhandenen PHP-Kenntnissen folgende Bedingung zusammengereimt
    PHP-Code:
    <?php if ($this->countModules('top1 and top2 and top3 and top4') == ?>
          <section class="box info">
          <?php else: ?>
          <section>
          <?php endif; ?>
    Obwohl ich schon alles mögliche ausprobiert habe, bekomme ich immer wieder die Fehlermeldung:

    Beim Abrufen von http://localhost:8888/domain/ ist auf der Website ein Fehler aufgetreten. Möglicherweise wird sie gerade gewartet oder ist falsch konfiguriert.
    Vorschläge:Laden Sie diese Webseite später erneut.
    HTTP-Fehler 500 (Internal Server Error): Beim Versuch des Servers, die Anforderung zu verarbeiten, ist eine unerwartete Bedingung aufgetreten.
    Leider habe ich keine Ahnung wie ich weiter machen könnte.

    Viele Grüße ins Forum
    Sommertag
    Geändert von Sommertag (28.02.2012 um 09:13 Uhr)

  2. #2
    Wohnt hier Avatar von Joomla-Hilfe
    Registriert seit
    12.08.2010
    Beiträge
    3.668
    Bedankte sich
    78
    Erhielt 1.094 Danksagungen
    in 874 Beiträgen

    Standard

    Aber countmodules immer nur eine Position zu übergeben und die Rückgaben logisch zu verknüpfen hast du noch nicht probiert, obwohl das auch unter "alles mögliche" fällt.
    Danke?

    Keine Macht den Facebutts!
    "Dinner for one ist jeden Tag" oder "Und täglich grüßt das Murmeltier"

  3. Erhielt Danksagungen von:


  4. #3
    Hat hier eine Zweitwohnung Avatar von CirTap
    Registriert seit
    12.12.2005
    Ort
    Karlsruhe
    Beiträge
    1.628
    Bedankte sich
    83
    Erhielt 539 Danksagungen
    in 438 Beiträgen

    Standard

    Die Abfrage 'and' bedeutet, dass die Module in alle genannten Positionen publiziert sein müssen und ergibt damit 0 oder 1.
    Was du vermutlich willst ist 'top1 + top2 + top3 + top4', was dir die Gesamtzahl der publizierten Module in den vier Positionen liefert, d.h. egal wo, Hauptsache exakt vier Stück.

    Viel Spaß,
    CirTap
    Joomla FAQ | CSS-Probleme? Verstehen Entdecken Anwenden Meistern

    "I love deadlines. I like the whooshing sound they make as they fly by." (Douglas Adams)
    Man kann Software schnell, gut und günstig schreiben, sich aber nur 2 Dinge aussuchen.


  5. Erhielt Danksagungen von:


  6. #4
    Neu an Board
    Registriert seit
    23.10.2007
    Beiträge
    4
    Bedankte sich
    3
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard Problem gelöst, aber nicht verstanden

    Erstmal vielen Dank an Joomla-Hilfe und CirTap. Mit euren Hinweisen habe ich weiter meinem Weg durch trial and error gefunden. Dabei hat sich folgendes (vereinfacht dargestellt) als funktionsfähig herausgestellt:

    PHP-Code:
    <?php if ($this->countModules('top1 + top2 + top3 + top4')== 4) : ?>
            <section class="box info">
                     <jdoc:include type="modules" name="top1" style="xhtml" />
                     <jdoc:include type="modules" name="top2" style="xhtml" />
                     <jdoc:include type="modules" name="top3" style="xhtml" />
                     <jdoc:include type="modules" name="top4" style="xhtml" />          
              </section>
          <?php endif; ?>
    Also die Darstellung der Module einschließlich der section mit der entsprechenden CSS Klasse erfolgt nur wenn die Bedingung erfüllt wird. Warum es nicht mit else funktioniert hat, verstehe ich leider nicht.

    Aber an anderer Stelle hat es mit der Verzweigung per else funktioniert.

    PHP-Code:
           <?php if ($this->countModules('right1')) : ?>
            <article class="rechts">
              <?php else : ?>
              <article >
              <?php endif; ?>

    Soweit mein Erkenntnisstand. Meine Probleme sind damit für´s erste gelöst. Um künftigen Kopfschmerzen vor zu beugen, würde es mich sehr freuen und vielleicht auch andere mit ähnlichen Problemlagen, wenn ich es verstehen würde .

    Gruss
    Sommertag

  7. #5
    Hat hier eine Zweitwohnung Avatar von CirTap
    Registriert seit
    12.12.2005
    Ort
    Karlsruhe
    Beiträge
    1.628
    Bedankte sich
    83
    Erhielt 539 Danksagungen
    in 438 Beiträgen

    Standard

    countModules macht in erster Linie eines: rechnen.
    Die "Rechenformel" gibt man als Parameter an und die "Variablen" sind die Modulpositionen. Für jede Position steht intern die Zahl der Module die man der Position zugewiesen hat.
    Verwirrend ist vermutlich der Umstand, dass countModules() mal die Anzahl der Module zurückgibt, ein andermal nur die Zahlen 0 oder 1. Es "rechnet" also nicht immer.

    Mit einem einfachen countModules('right1') (1 Position abgefragt) bekommst du also zunächst mal eine Zahl zurück, entweder 0 (keine Module drin) oder eben die Gesamtmenge. Typischerweise prüft man so, ob der Position überhaupt ein Modul zugewiesen ist, um irgendeinen HTML-Schnipsel "auszublenden". Die Menge selbst ist dann aber unerheblich.

    Innerhalb von if(xxx) ergibt jede Zahl ungleich Null den logischen Wert true, d.h. die Bedingung ist erfüllt.
    Ob also 1 Modul oder 300 ist if() dann herzlich egal: Bedingung erfüllt und macht was in den {} Klammern steht *oder* das aus dem else-Block -- sofern es einen gibt.

    Aus der Addition "top1 + top2 + top3 + top4" könnte also intern "2 + 0 + 1 + 1" werden. Nur wenn die Summe exakt den Wert 4 hat (also 4 == 4 ist) wird der if-Block ausgeführt.
    Jedes andere Ergebnis, d.h. auch der Wert 0 ist in dieser Konstellation eben FALSE und führt das "else" aus -- sofern vorhanden.

    Wenn du auf verschiedene Mengen reagieren willst, z.B. wenn exakt 2 Module da sind oder exakt 1, musst du das Ergebnis von countModules() zuerst in eine Variable packen [ist zumindest einfacher] und danach den Wert der Variablen nach allerlei Kriterien abfragen, z.B.
    PHP-Code:
    $menge $this->countModules('top1 + top2 + top3 + top4'); // eine Zahl zwischen 0 und ... ziemlich viel
    if ($menge == 4) {
       
    // exakt 4 Module
    }
    else if (
    $menge == 0) {
      
    // nix da
    else if (($menge 2) == 0) {
      
    // eine gerade Anzahl (2, 4, 6, ...)
    }
    else if ((
    $menge 2) == 1) {
      
    // eine ungerade Anzahl (1, 3, 5, ...)
    else {
      
    // vermutlich 1, aber tatsächlich kommen wir hier nie an ;)

    Die Reihenfolge der "else if"s ist natürlich entscheidend

    Man kann auch logische Kombinationen angeben: "top1 or top2 or top3" ~ z.B. "2 or 0 or 1" was bedeutet: in einer der genannten Positionen muss mindestens 1 Modul publiziert sein.
    "top1 and top2 and top3" ~ "2 and 0 and 1" = in jeder Position muss mindestens 1 Modul stehen, denn sobald bei 'and' eine Null auftaucht ist alles "falsch".

    Sobald man logischen Operatoren wie "and" oder "or" ins Spiel bringt ist das "Rechenergebnis" von countModule() jedoch keine Summe mehr, sonder nur noch die Zahl 0 (falsch) oder 1 (wahr), entsprechend der gestellten Bedingung die man an countModule gestellt hat.
    Was man dann mit diesem logischen Ergebnis, 0 bzw. 1, innerhalb des if()-Blockes anstellt, ist eine andere Sache; viel Auswahl besteht allerdings nicht :-)

    Deshalb hat das == 4 in deiner ersten Abfrage mit 'or' nicht gegriffen, weil 4 nie als (logisches) Ergebnis hätte zurückkommen können.

    Tricky wird es bei Subtraktionen, z.B. "top1 + top2 - top3 + top4".
    Da man keine Klammern setzen kann, ist das Ergebnis evtl. nicht das was man zunächst erwartet:
    "top1 + top2 - top3 + top4" ~ "2 + 0 - 1 + 1"
    ergibt: 2 + 0 - 1 + 1 = 2
    aber: 2 + 0 - (1 + 1) = 2 - (2) = 0

    Wann man subtrahieren will? Wenn bspw. in "top3 + top4" mehr Module sind, als in "top1 + top2" und deshalb die (untere/obere) Spalte zu lang würde oder die Module nur in bestimmten (Mengen-)Konstellationen ausgegeben werden sollen ~ "das Login-Modul nur dann ausgeben, wenn oben Platz für mindestens 3 Banner ist." -- so blöder Kram eben
    Dann verschachtelt man die Abfrage und mit weiteren if()s testet man die Einzelwerte ab oder prüft die Positionen nochmal explizit; was auch immer.

    Viel Spaß,
    CirTap
    Geändert von CirTap (27.02.2012 um 18:51 Uhr) Grund: tipp- und schraipfehla
    Joomla FAQ | CSS-Probleme? Verstehen Entdecken Anwenden Meistern

    "I love deadlines. I like the whooshing sound they make as they fly by." (Douglas Adams)
    Man kann Software schnell, gut und günstig schreiben, sich aber nur 2 Dinge aussuchen.


  8. Erhielt Danksagungen von:


  9. #6
    Wohnt hier Avatar von Joomla-Hilfe
    Registriert seit
    12.08.2010
    Beiträge
    3.668
    Bedankte sich
    78
    Erhielt 1.094 Danksagungen
    in 874 Beiträgen

    Standard

    Zitat Zitat von CirTap Beitrag anzeigen
    Veriwrrend ist vermutlich der Umstand, dass countModules() mal die Anzahl der Module zurückgibt, ein andermal nur die Zahlen 0 oder 1. Es "rechnet" also nicht immer.
    Korrigier mich, wenn ich falsch liege:
    Es rechnet durchaus immer. Aber in PHP kann man beliebige Zahlenwerte auch mit logischen Operatoren abfragen. Dann entspricht 0 "false" und alle anderen Werte sind "true". Der Umkehrschluß, daß "true" zwingend 1 entspricht, ist deshalb unzulässig.
    Danke?

    Keine Macht den Facebutts!
    "Dinner for one ist jeden Tag" oder "Und täglich grüßt das Murmeltier"

  10. Erhielt Danksagungen von:


  11. #7
    Hat hier eine Zweitwohnung Avatar von CirTap
    Registriert seit
    12.12.2005
    Ort
    Karlsruhe
    Beiträge
    1.628
    Bedankte sich
    83
    Erhielt 539 Danksagungen
    in 438 Beiträgen

    Standard

    Zitat Zitat von Joomla-Hilfe Beitrag anzeigen
    Der Umkehrschluß, daß "true" zwingend 1 entspricht, ist deshalb unzulässig.
    bezüglich PHP in Allgemeinen hast du vollkommen recht und auch -23769 ergibt in einem bool'schen Kontext TRUE.
    Im vorliegenden Fall fällt dieser feine Unterschied aber aus, denn du kannst nicht -1 Module publizieren und deshalb Gefahr laufen, das als TRUE zu interpretieren.
    countModules() liefert mit Ausnahme der Subtraktion, immer Werte >= 0, die einmal als Null (keins) bzw. als positive Summe und ein andermal als "boolean", 0/1 ~ falsch/wahr, zu interpretieren sind.
    Aber danke für's richtigstellen!

    CirTap

    EDIT: ist es Interpretationssache, logische Operationen wie and/or/xor/not nicht als "rechnen" zu bezeichnen? Das meinte ich mit "rechnet nicht immer" -- ungeachtet dessen, das Computer per definitionem immer rechnen
    Geändert von CirTap (27.02.2012 um 19:19 Uhr)
    Joomla FAQ | CSS-Probleme? Verstehen Entdecken Anwenden Meistern

    "I love deadlines. I like the whooshing sound they make as they fly by." (Douglas Adams)
    Man kann Software schnell, gut und günstig schreiben, sich aber nur 2 Dinge aussuchen.


+ Antworten

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein