Contao-Camp 2024
Ergebnis 1 bis 17 von 17

Thema: [notification_center] Zahlenwerte in if-Anweisungen vergleichen

  1. #1
    Contao-Nutzer
    Registriert seit
    05.08.2019.
    Beiträge
    13

    Standard [notification_center] Zahlenwerte in if-Anweisungen vergleichen

    Hallo zusammen,

    Ich möchte in einer Benachrichtigung abhängig von einem im Formular eingegeben Nummernwert unterschiedlichen Text ausgeben.
    Sprich, gibt der Nutzer einen Zahlenwert < 10000 ein, wird "Text X" ausgegeben, ansonsten "Text Y".

    Nun habe das Problem, dass der Feldtyp "Nummer", den es früher scheinbar mal gab (lese ich zumindest aus alten Beiträgen heraus), in Contao 3.5+ und 4 nicht zu existieren scheint.

    Lege ich einfach ein Feld vom Typ Textfeld an, sieht er den eingegeben wert ja als text und nicht als nummer, weswegen größer und kleiner Vergleiche nicht möglich zu sein scheinen.

    Ich habe bereits versucht, im Formular ein eigenes html-Feld anzulegen um an das Nummernfeld zu kommen:

    <input type="number" name="feld">

    und dann diese If-Anweisung in der Benachrichtigung einzutragen:

    {if form_feld<10000} Text X {else} Text Y {endif}

    aber das bringt leider nicht den gewünschten Effekt. es scheitert vermutlich daran, dass das token nicht erkannt und ersetzt wird und in der Mail dann ##form_feld## steht

    Geht das, was ich machen will?

    Kann ich den input type="number" im Formular nutzen? (erscheinen im Dropdown tut er ja nicht)
    Kann das Notification Center die PHP Operatoren < und > in If-Anweisungen nutzen, um values zu vergleichen?
    Oder kann ich irgendwie den Wert im Textfeld als Zahlenwert lesen, statt als Text und Ihn dann vergleichen?


    VG,
    Johannes

  2. #2
    Contao-Nutzer
    Registriert seit
    05.08.2019.
    Beiträge
    13

    Standard

    Kleines Update:

    Das Textfeld mit Eingabeprüfung generiert ein ordentliches input type="number", da hab ich was falsches gefolgert, ohne es zu prüfen. Hier ist also nicht das Problem.

    Vergleichen mit den Operatoren > und < kann ich allerdings nach wie vor nicht.

    Ich hab es bereits nochmal auf einem weiteren Formular/Benachrichtung auf Contao 4.4.44 und NC 1.5.8. um möglichst viele Fehlerquellen auszuschließen. Jetzt weiß ich nichtmehr, woran das noch liegen kann.

    Kann mir irgendjemand bestätigen, ob es bei euch klappt/nicht klappt?

  3. #3
    Community-Moderatorin & Contao-Urgestein Avatar von mlweb
    Registriert seit
    10.07.2011.
    Beiträge
    6.715
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Muss das nicht heissen
    Code:
    if ($this ->form_feld < 10000)
    Ich habe Dir mit meinen Hinweisen geholfen und Du möchtest Dich bedanken?
    Unterstütze bitte das Contao-Projekt (Button Links)
    Weitere Spendenmöglichkeiten
    ------------------------------------------------------------------------------------------------------
    Contao-Dokumentation: Contao-Handbuch und Contao-Entwickler-Doku
    Contao-Online-Video-Kurse: Contao Academy
    Funktionalität erweitern: Contao-Erweiterungen

    Für Dinge die man mit html5 und css3 lösen kann, braucht man kein javascript.




  4. #4
    Contao-Nutzer
    Registriert seit
    05.08.2019.
    Beiträge
    13

    Standard

    Danke für deine Antwort.

    So wie ich das verstehe nicht. Im 'normalen' PHP wäre das vermutlich richtig, aber das Notification Center arbeitet in den Benachrichtigungen einerseits mit Tokens mit doppelter Raute, um z.b. einen einfachen Wert aus dem Formular zu übermitteln (z.B. ##form_feld## ) andererseits werden If-Bedinungen mit geschweiften Klammern ausgezeichnet, bei denen wird dann allerdings die Doppelraute weggelassen wird.

    Code:
    {if form_feld==10000} Text X {else} Text Y {endif}
    Funktioniert einwandfrei

    Code:
    {if form_feld<10000} Text X {else} Text Y {endif}
    eben nicht.

    Ich habe also eigentlich nur den Operator gewechselt.



    Hab auf Github auch schon gefragt, aber die sagen, was ich möchte geht und das Modul funktioniere in der Hinischt auch wie gedacht, weshalb die mir nicht weiterhelfen können:
    https://github.com/terminal42/contao...ter/issues/193

    Die "UnitTests" sind wohl alle erfolgreich:
    https://github.com/contao/contao/blo....php#L122-L180


    Keine Ahnung, wo ich den Fehler jetzt noch suchen soll. Vielleicht kann es ja jemand nachstellen, der ohnehin noch ein NC irgendwo laufen hat.

    Habe es in einem Contao 3.5 und dann nochmal in einem 4.4.8 probiert mit jeweils der aktuellsten Version des NC

  5. #5
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.682
    User beschenken
    Wunschliste

    Standard

    um die Auflösung der Vergleiche kümmert sich m.E. Contao selbst - hast Du das mal bei einer normalen-Contao-E-mail ausprobiert?

  6. #6
    Contao-Nutzer
    Registriert seit
    05.08.2019.
    Beiträge
    13

    Standard

    Wie meinst du das? In einer normalen Mail (also z.B. Testmail über Newslettermodul) kann ich doch keine Formulareingaben vergleichen?
    Und im normalen Formularversand wiederrum kann ich keine Vergleiche anstellen, weil ja da einfach sämtliche Daten übermittelt werden.

    Ich habe einfach mal in einer Testmail beim Newsletterversand versucht, fixe werte miteinander zu vergleichen:

    Code:
    {if 10000>35000} 10000 IST GROESSER 35000
    {elseif 10000<35000} 10000 IST KLEINER 35000
     {else} Else-Bedinungung {endif}
    Hier greift auch wieder {else]

    Code:
    {elseif 10000==35000} 10000
     {else} Else-Bedinungung {endif}
    Ergebnis ist jeweils, dass das {else} greift. In der Mail Steht also immer "Else-Bedingung"

  7. #7

  8. #8
    Contao-Nutzer
    Registriert seit
    05.08.2019.
    Beiträge
    13

    Standard

    Wie ginge man da vor? ich habe das Gefühl, mit meinen rudimentären PHP-Kenntnissen komme ich in Sachen Debugging nicht weit.

    Da es noch ein älteres 3.x. Contao ist, könnte ich ohne großen Aufwand den DebugModus aktivieren und das Formular abschicken, aber ich schätze mal nicht, dass das weiterhilft.

  9. #9
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.682
    User beschenken
    Wunschliste

    Standard

    bei 3.x mit print_r($meineVariable); die Sachen ausgeben und gucken

  10. #10
    Contao-Nutzer
    Registriert seit
    05.08.2019.
    Beiträge
    13

    Standard

    Danke. Allerdings bin ich da etwas lost gerade.

    Wollte mich dann an verschiedenen stellen einlesen, wie ich dazu vorgehe. Unter anderem hier: https://stackify.com/php-debugging-guide/
    aber muss feststellen, dass mir das alles zu hoch ist, weil ich über ein "hello world" nie groß hinaus gekommen bin.

    Es ist natürlich nicht dein Bier, aber wenn du mir ein paar konkretere Anweisungen geben kannst, wie ich das genau mache, gerne her damit.

    Ansonsten muss ich wohl einen Kleinauftrag hier im Forum posten oder die Jungs vom Terminal42 bemühen.

  11. #11
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.682
    User beschenken
    Wunschliste

    Standard

    Du könntest z.B. hier die Sache abändern https://github.com/contao/contao/blo...gUtil.php#L643

    PHP-Code:

    var_dump
    ($strOperator); die();
                switch (
    $strOperator)
                {
                    case 
    '==':
                        return 
    $varTokenValue == $varValue
    da sollte Dir beim Ausführen der Inhalt des Operators ausgegeben werden - damit Du die Anzeige nicht verpasst, ein die() "tötet" das Script an der Stelle

  12. #12
    Contao-Nutzer
    Registriert seit
    05.08.2019.
    Beiträge
    13

    Standard

    Ich habe das mal getestet:

    Wenn meine Benachrichtigung den == Operator drin hat, wird die Ausführung gestoppt:

    Code:
    string(2) "=="
    Nehme ich den == Operator raus und habe nur den < drin, wird die Ausführung nicht gestopt und die Benachrichtigung geht ganz normal raus.

    So sieht meine StringUtil an der Stelle aus:
    Code:
    {
    				throw new \InvalidArgumentException(sprintf('Unknown data type of comparison value "%s".', $strValue));
    			}
    
    			var_dump($strOperator); die();
                switch ($strOperator)
                {
                    case '==':
                        return $varTokenValue == $varValue; 
    
    				case '!=':
    					return $varTokenValue != $varValue;
    
    				case '===':
    					return $varTokenValue === $varValue;
    
    				case '!==':
    					return $varTokenValue !== $varValue;
    
    				case '<':
    					return $varTokenValue < $varValue;
    
    				case '>':
    					return $varTokenValue > $varValue;
    
    				case '<=':
    					return $varTokenValue <= $varValue;
    
    				case '>=':
    					return $varTokenValue >= $varValue;
    
    				default:
    					throw new \InvalidArgumentException(sprintf('Unknown simple token comparison operator "%s".', $strOperator));
    			}
    		};

  13. #13
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.682
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von ilumy_2 Beitrag anzeigen
    Nehme ich den == Operator raus und habe nur den < drin, wird die Ausführung nicht gestopt und die Benachrichtigung geht ganz normal raus.
    das würde bedeuten, dass die Methode ("Funktion") schon vorher sich verabschiedet... dann ist die Suche im Quelltext weiter oben nach "return ..." z.B. #589 und #603 ... bei 603 müsstest Du einen Eintrag im Systemlog finden...

    Vermutung wäre somit #589 - also mit

    PHP-Code:
                if (!preg_match('/^([^=!<>\s]+) *([=!<>]+)(.+)$/s'$strExpression$arrMatches))
                {
                    echo 
    "Bin hier.."; die();
                    return 
    false;
                } 
    wenn auf Deiner Seite die "Bin hier.." erscheint, schlägt die Prüfung fehl - dann vor dem "if (!..." ein "var_dump($strExpression); die();" einbauen und gucken was da drin steht und warum die Prüfung ein false liefert

    auf der Seite https://regex101.com/ kannst Du die RegEx-Anweisung testen

  14. #14
    Contao-Nutzer
    Registriert seit
    05.08.2019.
    Beiträge
    13

    Standard

    Danke fürs an die Hand nehmen

    Ich schau mir das asap an (heute viele Termine) und geb Bescheid

  15. #15
    Contao-Nutzer
    Registriert seit
    05.08.2019.
    Beiträge
    13

    Standard

    So, nun kam ich heute dazu. Das "Bin hier.." erschien.

    Ich habe dann also wie vorgeschlagen dort den var_dump der $strExpression gemacht:

    Code:
    string(63) "form_feldHASTE-TAG-OPEN-b33870ef1a17bd807fb2ea5ade2c082b35000"
    gehört das so? ('feld' ist der name des Inputs und 35000 ist der Wert, mit dem der input verglichen werden soll.)

  16. #16
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.682
    User beschenken
    Wunschliste

    Standard

    hmm - der hört ja mit dem die(); auch bei denen auf, wo er aufhören soll...

    am besten ein var_dump($strExpression) vor das if (!preg_match... und darein ohne die(); damit Du alle Tokens durchlaufen kannst

  17. #17
    Contao-Nutzer
    Registriert seit
    05.08.2019.
    Beiträge
    13

    Standard

    Wo kommt dann stattdessen das "die();" hin?

    Wenn ich nur das "var_dump($strExpression)" einbaue, bekomme ich einen 500er

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

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