MetaModels Workshop in Berlin
Ergebnis 1 bis 16 von 16

Thema: [Gelöst] Bestimmte CSS Klassen im Template auslesen

  1. #1
    Contao-Fan Avatar von Franko
    Registriert seit
    22.06.2009.
    Beiträge
    884
    Partner-ID
    6122

    Standard [Gelöst] Bestimmte CSS Klassen im Template auslesen

    Hallo,
    benötige Anregungen zu PHP Umsetzung.
    Ich möchte bestimmte CSS Klassen die im Backend definiert sind auslesen und z.B. dann für data attribute heranziehen.

    Angenommen im Template "block_searchable.html5" beinhaltet "this->css" folgende Angaben:

    "myClass1 myClass2 cat-11 myClass3 cat-22 myClass4 cat-33"

    Nun möchte ich alle Values innerhalb von "cat-" und " " auslesen. Zum Test:

    PHP-Code:
    <?php

    $str
    ="myClass1 myClass2 cat-11 myClass3 cat-22 myClass4 cat-33";
    $pattern="/cat-(.*?) /";

    preg_match_all($pattern$str$matches);
    print_r($matches);
    Diese Vorgehensweise berücksichtigt dann aber leider nicht den letzten Eintrag "cat_33" da dieser am Ende ja kein Leerzeichen/Space beinhaltet.
    Hat jemand dazu evtl. ein Pattern das greift?
    Ansonsten muß ich auf andere Delimiter ausweichen ...

    Danke

    Update/Gelöst:
    Siehe https://community.contao.org/de/show...l=1#post501098
    Geändert von Franko (11.04.2019 um 10:12 Uhr)
    Carpe diem ...

  2. #2
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.390
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Abgesehen davon, dass das nach Workaround stinkt: Was hättest du gerne als Resultat? Nur "33"?
    terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.

  3. #3
    Contao-Fan Avatar von Franko
    Registriert seit
    22.06.2009.
    Beiträge
    884
    Partner-ID
    6122

    Standard

    Zitat Zitat von Toflar Beitrag anzeigen
    Abgesehen davon, dass das nach Workaround stinkt: Was hättest du gerne als Resultat? Nur "33"?
    Hm,
    Nein nicht nur "33" sonder auch ...

    ich möchte https://github.com/giotiskl/filterizr / https://yiotis.net/filterizr/ einsetzen.
    Hier werden data attribute ( "data-category=" ) zur Kenzeichnung der Filter Kategorien benötigt.

    Diese möchte quasi via Backend eingeben können und über das modifizierte template dann entsprechend ausgeben.
    Also später sowas wie "<div class="filtr-item" data-category="1" ...", <div class="filtr-item" data-category="myCategory1, myCatergory2" ...", etc..
    Carpe diem ...

  4. #4
    Contao-Fan Avatar von Franko
    Registriert seit
    22.06.2009.
    Beiträge
    884
    Partner-ID
    6122

    Standard

    Anstelle des Leerzeichen am Ende nutze ich jetzt einfach ein "-":

    PHP-Code:
    <?php 

    $str
    ="myClass1 myClass2 cat-11- myClass3 cat-22- myClass4 cat-33-"
    $pattern="/cat-(.*?)-/"

    preg_match_all($pattern$str$matches); 
    print_r($matches);
    Falls jemand eine Idee hat wie das Pattern dennoch mit " " funktionieren könnte - Gerne ...
    Carpe diem ...

  5. #5
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.390
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Äh, ich schreib dir die Regex aber könntest du mir einfach sagen, was du gerne haben möchtest?

    PHP-Code:
    $str="myClass1 myClass2 cat-11- myClass3 cat-22- myClass4 cat-33-";  

    $result = []; // was soll in diesem array stehen? 
    terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.

  6. #6
    Contao-Fan Avatar von Franko
    Registriert seit
    22.06.2009.
    Beiträge
    884
    Partner-ID
    6122

    Standard

    Zitat Zitat von Toflar Beitrag anzeigen
    Äh, ich schreib dir die Regex aber könntest du mir einfach sagen, was du gerne haben möchtest?
    Hi, nett das Du antwortest.
    Mit
    PHP-Code:
    $str="myClass1 myClass2 cat-11- myClass3 cat-22- myClass4 cat-33-";  
    $pattern="/cat-(.*?)-/"
    klappt es ja. Alles weitere krieg ich schon hin.
    Mich interessiert halt nur wie man es lösen könnte das ich bei z.B. "myClass1 cat-abc myClass2 cat-def" alle Werte (hier "abc" und "def") erhalte.

    Mit
    PHP-Code:
    $pattern="/cat-(.*?) /"
    klappt es nicht - hier bekomme ich nur "abc" zu fassen aber nicht "def", da da am Ende ja auch kein Leerzeichen vorhanden ist ...

    Danke
    Carpe diem ...

  7. #7
    Contao-Fan Avatar von Franko
    Registriert seit
    22.06.2009.
    Beiträge
    884
    Partner-ID
    6122

    Standard

    Nachtrag,
    oder wie geht Ihr mit custom data attributen um (ohne Erweiterung oder "RockSolid Custom Elements" ) ...
    Carpe diem ...

  8. #8
    Contao-Fan Avatar von Ainschy
    Registriert seit
    24.06.2009.
    Ort
    Neuenburg am Rhein
    Beiträge
    501
    Partner-ID
    5666
    User beschenken
    Wunschliste

    Standard

    Wäre es nicht leichter mit einer kleinen Erweiterung den DCA von CE und MOD um die Eingabe von Data-Attribute zu erweitern?

  9. #9
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.206

    Standard

    Für den RegEx: Du benötigst \b (word boundary; siehe z.B. https://www.regular-expressions.info...oundaries.html) oder (falls ich Dein Problem richtig verstanden habe und Du nach den Zahlen suchst) solltest Du anstelle . (beliebiges Zeichen) explizit nach \d (Ziffer) suchen

    Damit hättest Du dann etwas wie

    PHP-Code:
    $pattern="/cat-(.+)\b/"
    oder m.E. klarer formuliert

    PHP-Code:
    $pattern="/cat-(\d+)/"
    das die folgenden Leerzeichen oder das Ende des Strings keine \d sind.
    Stammtisch Contao Bayern: http://www.contao-bayern.de

  10. #10
    Contao-Fan Avatar von Franko
    Registriert seit
    22.06.2009.
    Beiträge
    884
    Partner-ID
    6122

    Standard

    Zitat Zitat von fiedsch Beitrag anzeigen
    PHP-Code:
    $pattern="/cat-(\d+)/"
    Perfekt - Das klappt mit den Ziffern Beispielen ...
    Danke

    Allerdings nicht für Einträge ala "myClass1 cat-Kategorie1 myClass2 cat-Kategorie2" - auch nicht mit $pattern="/cat-(.+)\b/";
    Geändert von Franko (10.04.2019 um 21:18 Uhr)
    Carpe diem ...

  11. #11
    Contao-Fan Avatar von Franko
    Registriert seit
    22.06.2009.
    Beiträge
    884
    Partner-ID
    6122

    Standard

    Zitat Zitat von Ainschy Beitrag anzeigen
    Wäre es nicht leichter mit einer kleinen Erweiterung den DCA von CE und MOD um die Eingabe von Data-Attribute zu erweitern?
    Hier wurde das schon mal angesprochen:
    https://github.com/contao/core/issues/7407
    Carpe diem ...

  12. #12
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.206

    Standard

    Zitat Zitat von Franko Beitrag anzeigen
    Allerdings nicht für Einträge ala "myClass1 cat-Kategorie1 myClass2 cat-Kategorie2" - auch nicht mit $pattern="/cat-(.+)\b/";
    Es liegt wohl daran, was bei \b als "word" und damit als Grenze betrachtet wird. Ein anderer Ansatz wäre dann

    PHP-Code:
    $pattern="/cat-(.+)[\s|$]/"
    lies: cat-(gefolgt von mehreren Zeichen)[gefolgt von einem Leerzeichen oder dem Ende des Strings]

    Auch das: garantiert ungetestet™ und wie @toflar schon schrieb: irgendwie fühlt sich dieser Lösungsansatz falsch an.
    Stammtisch Contao Bayern: http://www.contao-bayern.de

  13. #13
    Contao-Fan Avatar von Franko
    Registriert seit
    22.06.2009.
    Beiträge
    884
    Partner-ID
    6122

    Standard

    Zitat Zitat von fiedsch Beitrag anzeigen
    Auch das: garantiert ungetestet™ und wie @toflar schon schrieb: irgendwie fühlt sich dieser Lösungsansatz falsch an.
    Hi,
    leider klappte ( $pattern="/cat-(.+)[\s|$]/"; ) auch nicht.

    Aber das:
    PHP-Code:
    $pattern="/cat-(.+?)\b/"
    Vielen Dank fiedsch für die Anregungen ...

    Und naja, es ist halt eine normale Template Änderung -
    mit einer Konvention über die Eingabe innerhalb der CSS Klassen Definition.
    Damit kann ich leben :-)
    Carpe diem ...

  14. #14
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.206

    Standard

    War wohl noch nicht ganz wach :-(

    Was ich bei [\s|$] im Sinn hatte war (\s|$), denn ich suche ja nicht nach \s oder | oder $.

    Damit funktioniert es dann auch, aber Du bekommst über die Gruppierung einen weiteren Eintrag in $matches.


    PHP-Code:
    $str 'myClass1 myClass2 cat-11 myClass3 cat-22 myClass4 cat-33';
    $pattern='/cat-(.+?)(\s|$)/';
    preg_match_all($pattern$str$matches);
    print_r($matches); 
    ergibt

    Code:
    Array
    (
        [0] => Array
            (
                [0] => cat-11 
                [1] => cat-22 
                [2] => cat-33
            )
    
        [1] => Array
            (
                [0] => 11
                [1] => 22
                [2] => 33
            )
    
        [2] => Array
            (
                [0] =>  
                [1] =>  
                [2] => 
            )
    
    )
    Meine erste Idee (in #9) war schon richtig, und zudem ist sie einfacher als obiges, nur hatte dort das ? (für non greedy) gefehlt.

    Außerdem sollte das Pattern wohl am besten in ' (anstelle ") geschrieben werden, damit \ ggf. erhalten bleiben (Bsp. "\n" vs. '\n').
    Stammtisch Contao Bayern: http://www.contao-bayern.de

  15. #15
    Contao-Fan Avatar von Franko
    Registriert seit
    22.06.2009.
    Beiträge
    884
    Partner-ID
    6122

    Standard

    Zitat Zitat von fiedsch Beitrag anzeigen
    War wohl noch nicht ganz wach :-(
    Meine erste Idee (in #9) war schon richtig, und zudem ist sie einfacher als obiges, nur hatte dort das ? (für non greedy) gefehlt.
    Außerdem sollte das Pattern wohl am besten in ' (anstelle ") geschrieben werden, damit \ ggf. erhalten bleiben (Bsp. "\n" vs. '\n').
    Ausgezeichnet,
    Nutze ich jetzt so
    PHP-Code:
    $delimiter "cat-";
    $pattern '/'.$delimiter.'(.+?)\b/i';  
    preg_match_all($pattern$subject$matchesPREG_PATTERN_ORDER0);
    print_r($matches); 
    Danke
    Franko
    Carpe diem ...

  16. #16
    Contao-Fan Avatar von Franko
    Registriert seit
    22.06.2009.
    Beiträge
    884
    Partner-ID
    6122

    Standard

    Hier das vollständige Template "block_searchable.html5":

    PHP-Code:
    <?php
    // Compare the CSS definition with a pattern and set the results as HTML Data attributes

    $strDelimiter "DATA-";
    $strPattern '/'.$strDelimiter.'(.+?)\b/i';  
    $strDataAttr "data-category"

    $strCSS $this->class// default CSS output

    // only if pattern matches
    if ( substr_count($strCSS$strDelimiter) > ) {

      
    // find all substrings between pattern in string
      
    preg_match_all($strPattern$strCSS$arrMatchesPREG_PATTERN_ORDER0);

      for( 
    $i 0$i <= count($arrMatches); $i++) {
        
    // cleanup full matches ( incl. delimiter ) from orginal CSS string 
        
    $strCSS str_replace($arrMatches[0][$i], ""$strCSS);          
          
        
    // get matched values only
        
    $arrMatchedValues[] = $arrMatches[1][$i];      
      }    
        
      
    // complete data attribute
      
    $strData $strDataAttr.'="'.rtrim(implode(", "$arrMatchedValues), ", ").'"';
      
    }
    ?>

    <div class="<?= $strCSS ?> block"<?= $strData ?><?= $this->cssID ?><?php if ($this->style): ?> style="<?= $this->style ?>"<?php endif; ?>>

      <?php $this->block('headline'); ?>
        <?php if ($this->headline): ?>
          <<?= $this->hl ?>><?= $this->headline ?></<?= $this->hl ?>>
        <?php endif; ?>
      <?php $this->endblock(); ?>

      <?php $this->block('content'); ?>
      <?php $this->endblock(); ?>

    </div>
    Bei Angabe der CSS Klasse(n) von z.B.: "filter-item DATA-category1 DATA-category2" in einem Inhaltselement "Text" erhält man dann:

    Code:
    ...
    <div class="ce_text filter-item first last block" data-category="category1, category2" id="myID">
    ...
    Geändert von Franko (11.04.2019 um 15:17 Uhr)
    Carpe diem ...

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
  •