Catalog-Reader Template mit gruppierten Feldern ala fieldsets

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Tim G
    Contao-Urgestein
    • 13.02.2010
    • 2212

    #1

    Catalog-Reader Template mit gruppierten Feldern ala fieldsets

    Hi Leute,
    ich brauchte gerade ein Reader-Template, das es mir ermöglicht Felder innerhalb von Gruppen / Containern aufzulisten.
    Wenn man zum Beispiel eine Bilderreihe erstellen will aus unterschiedlichen Katalog-Feldern, oder Bereiche anders stylen möchte, kommt man an Untergruppen ala fieldsets nicht vorbei.
    Auch z.B. nur 3 Objekte nebeneinander flowtn lassen und die nachfolgenden Felder nicht, ist ohne zusätzliche Untergruppen Container nur sehr aufwendig möglich.
    Oder ein / mehrere Accordions mit diversen Feldern ist ohne Untergruppen nicht möglich.

    Anbei findet Ihr ein Template, das genau das macht.

    Oben einfach ein oder mehrere arrays mit den Spaltennamen der Katalog-Felder erstellen, die jeweils gruppiert werden sollen erstellen und dem $arrGroups - Array anhängen.
    (Meine heissen: 1. 'name', 'item_number'
    2. 'image_main','image_scale','image_sprayzone'
    Dort einfach eure Spaltennamen einsetzen, oder löschen.)

    Der Rest kommt von selbst.

    Ein Blick in das html Konstrukt:
    Die gruppierten Felder werden in <div class="field field_container_X"> DIVs zusammengefasst.
    Ich schicke eine laufende Nummer mit, aber man kann im Grunde alles einstellen (Kommentare geben Aufschluss)
    Innerhalb der Container sieht es wie gewohnt aus.

    Jetzt kann man nach Herzenslust sich "Fieldsets" bauen.

    Viele Grüße und viel Spass damit,
    Tim
    ps. ich hab das _full template hier verbaut. Klar geht das ganze auch mit dem _simple etc.

    catalog_full_groups.tpl
    PHP-Code:
    <?php
    /**
     * Catalog (_full) Reader Template
     * for grouping catalog fields together in field containers (like fieldset) 
     * @author     Tim Gatzky <info@tim-gatzky.de>
     */
    ?>
    
    <?php if (count($this->entries)): ?>
    
    <?php
    // Catalog fields (table names) that should be grouped together (array name can be anything you want)
    $group1 = array('name','item_number');
    $group2 = array('image_main','image_scale','image_sprayzone');
    $arrGroups = array($group1,$group2); // attach all groups you like to use
    
    $arrEntries = $this->entries; // the original entries array
    $tmp = array(); // store the field groups temporarly
    $ignore = array(); // stores all proceeded fields
    
    // build groups
    foreach($this->entries as $i => $entry)
    {
        foreach($entry['data'] as $field=>$data)
        {
            foreach($arrGroups as $j => $group)
            {
                // store labels
                $label = array();
                foreach($group as $f)
                    $label[] = $entry['data'][$f]['label'];
                
                // start new node and fill all fields in
                if(in_array($field, $group))
                {
                    $tmp['data_container_'.$j]['label'] = implode(',', $label); // all field labels comma seperated
                    $tmp['data_container_'.$j]['value'] = implode(',', $group); // all field names comma seperated
                    $tmp['data_container_'.$j]['class'] = 'field_container_'.$j; // class name of field container (numeric steps)
                    $tmp['data_container_'.$j]['type'] = 'field_container'; 
                    $tmp['data_container_'.$j]['data'][$field] = $data; // store catalog field data
                    $ignore[] = $field; // update ignore list
                }
            }
                    
            // store all others    
            if(!in_array($field, $ignore))
                $tmp[$field] = $data;
        }
        
        // overwrite the original entries array            
        $arrEntries[$i]['data'] = $tmp;
        
    }
    
    ?>
    
    <div class="layout_full group">
    
    <?php foreach ($arrEntries as $entry): ?>
    <div class="item<?php echo $entry['class'] ? ' '.$entry['class'] : ''; ?>">
    <?php if($entry['linkEdit']): ?><?php echo $entry['linkEdit']; ?><?php endif; ?>
    <?php foreach ($entry['data'] as $field=>$data): ?>
    <?php if ($data['data'] || strlen($data['raw']) && !in_array($field, array('catalog_name','parentJumpTo')) || $field=='notelist'): ?>
    
    <!-- field container -->
    <?php if($data['data']): ?>
    <div class="field <?php echo $data['class']; ?>">
    <?php foreach($data['data'] as $fc_field => $fc_data): ?>
        <div class="field <?php echo $fc_field; ?>">
            <div class="label"><?php echo $fc_data['label']; ?></div>
            <div class="value"><?php echo $fc_data['value']; ?></div>
        </div>        
    <?php endforeach; ?>
    </div>
    
    <?php else: ?>
    
    <!-- regular field -->
    <div class="field <?php echo $field; ?>">
        <!--<div class="value"><?php echo $data['value']; ?></div>
        <div class="label"><?php echo $data['label']; ?></div> -->
        <span class="label"><?php echo $data['label']; ?>:</span>
        <span class="value"><?php echo $data['value']; ?></span>
    </div>
    <?php endif; ?>
    
    <?php endif; ?>
    <?php endforeach; ?>
    </div>
    <?php endforeach; ?>
    </div>
    
    <?php else: ?>
    <p class="info">Invalid item reference for catalog.</p>
    <?php endif; ?>
    Angehängte Dateien
    Zuletzt geändert von Tim G; 27.07.2011, 21:48.
    http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.
  • Tim G
    Contao-Urgestein
    • 13.02.2010
    • 2212

    #2
    ... das ganze mit Accordion

    catalog_full_groups_accordion.tpl

    PHP-Code:
    <?php
    /**
     * Catalog (_full) Reader Template
     * for grouping catalog fields together in one field container (fieldset)
     * field containers act like accordions
     * @author     Tim Gatzky <info@tim-gatzky.de>
     */
    ?>
    
    <?php if (count($this->entries)): ?>
    
    <?php
    // Catalog fields (table names) that should be grouped together (array name can be anything you want)
    $group1 = array('name','item_number');
    $group2 = array('image_main','image_scale','image_sprayzone');
    $arrGroups = array($group1,$group2); // attach all groups you like to use
    
    $arrEntries = $this->entries; // the original entries array
    $tmp = array(); // store the field groups temporarly
    $ignore = array(); // stores all proceeded fields
    
    // build groups
    foreach($this->entries as $i => $entry)
    {
        foreach($entry['data'] as $field=>$data)
        {
            foreach($arrGroups as $j => $group)
            {
                // store labels
                $label = array();
                foreach($group as $f)
                    $label[] = $entry['data'][$f]['label'];
                
                // start new node and fill all fields in
                if(in_array($field, $group))
                {
                    $tmp['data_container_'.$j]['label'] = implode(',', $label); // all field labels comma seperated
                    $tmp['data_container_'.$j]['value'] = implode(',', $group); // all field names comma seperated
                    $tmp['data_container_'.$j]['class'] = 'field_container_'.$j; // class name of field container (numeric steps)
                    $tmp['data_container_'.$j]['type'] = 'field_container'; 
                    $tmp['data_container_'.$j]['data'][$field] = $data; // store catalog field data
                    $ignore[] = $field; // update ignore list
                }
            }
                    
            // store all others    
            if(!in_array($field, $ignore))
                $tmp[$field] = $data;
        }
        
        // overwrite the original entries array            
        $arrEntries[$i]['data'] = $tmp;
        
    }
    
    ?>
    
    <div class="layout_full group">
    
    <?php foreach ($arrEntries as $entry): ?>
    <div class="item<?php echo $entry['class'] ? ' '.$entry['class'] : ''; ?>">
    <?php if($entry['linkEdit']): ?><?php echo $entry['linkEdit']; ?><?php endif; ?>
    <?php foreach ($entry['data'] as $field=>$data): ?>
    <?php if ($data['data'] || strlen($data['raw']) && !in_array($field, array('catalog_name','parentJumpTo')) || $field=='notelist'): ?>
    
    <!-- field container accordion -->
    <?php if($data['data']): ?>
    <div class="<?php echo $data['class']; ?> ce_accordion">
    <div class="<?php echo $data['class']; ?> toggler">Klick</div>
    <div class="field <?php echo $data['class']; ?> accordion">
    <?php foreach($data['data'] as $fc_field => $fc_data): ?>
        <div class="field <?php echo $fc_field; ?>">
            <div class="label"><?php echo $fc_data['label']; ?></div>
            <div class="value"><?php echo $fc_data['value']; ?></div>
        </div>        
    <?php endforeach; ?>
    </div>
    </div>
    
    <?php else: ?>
    
    <!-- regular field -->
    <div class="field <?php echo $field; ?>">
        <!--<div class="value"><?php echo $data['value']; ?></div>
        <div class="label"><?php echo $data['label']; ?></div> -->
        <span class="label"><?php echo $data['label']; ?>:</span>
        <span class="value"><?php echo $data['value']; ?></span>
    </div>
    <?php endif; ?>
    
    <?php endif; ?>
    <?php endforeach; ?>
    </div>
    <?php endforeach; ?>
    </div>
    
    <?php else: ?>
    <p class="info">Invalid item reference for catalog.</p>
    <?php endif; ?>
    Angehängte Dateien
    http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

    Kommentar

    • Tim G
      Contao-Urgestein
      • 13.02.2010
      • 2212

      #3
      Zusätzliche 'first' und 'last' Klassen für die Felder innerhalb des Containers:

      PHP-Code:
      <?php $i = 0; $classExt = ''; ?>
      <div class="field_container <?php echo $data['class']; ?>">
      <?php foreach($data['data'] as $fc_field => $fc_data): ?>
          <?php 
          if($i == 0) $classExt = ' first';
          else if($i == count($data['data'])-1) $classExt = ' last';
          else $classExt = '';
          ?>
          <div class="field <?php echo $fc_field . $classExt; ?>">
              <div class="label"><?php echo $fc_data['label']; ?></div>
              <div class="value"><?php echo $fc_data['value']; ?></div>
          </div>
          <?php $i++; ?>        
      <?php endforeach; ?>
      </div>
      http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

      Kommentar

      • Tim G
        Contao-Urgestein
        • 13.02.2010
        • 2212

        #4
        Da die Container von oben abgearbeitet werden, hier noch eine kleine ergänzende Funktion zum Tauschen von Elementen innerhalb des / eines Arrays.
        (meine erste Version war falsch. Aber google hilft )

        PHP-Code:
        // Helper function: swaps elements in arrays
        // array_swap (array $input, array element key1 $string, array element key2 $string)
        function array_swap_assoc($array, $key1, $key2)
        {
            $newArray = array();
            foreach ($array as $key => $value) {
                if ($key == $key1) {
                    $newArray[$key2] = $array[$key2];
                } elseif ($key == $key2) {
                    $newArray[$key1] = $array[$key1];
                } else {
                    $newArray[$key] = $value;
                }
            }
            return $newArray;
        }
        
        // Sorting or swapping can be applyed here
        // swap data_container_1 with data_container_2
        $arrEntries[0]['data'] = array_swap($arrEntries[0]['data'], 'data_container_1', 'data_container_2'); 
        
        Zuletzt geändert von Tim G; 28.07.2011, 10:21.
        http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

        Kommentar

        • Thomas
          Contao-Urgestein
          • 16.08.2009
          • 1947

          #5
          Hey, danke Tim!

          Das werde ich in den nächsten Tagen, ups, nach meinem Urlaub, auch brauchen.
          Habe ich mal gleich in meine Favoriten verfrachtet.
          Gruß Thomas
          "Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du." Mahatma Gandhi

          Kommentar

          • MacKP
            Contao-Yoda
            • 15.06.2009
            • 13315

            #6
            Hallo Tim G,
            wäre super, wenn das mal im Wiki landen würde. Hier im Forum geht sowas leider unter...
            Einfach ne neue Seite anlegen im Wiki und da einbringen.

            Viele Grüße
            Contao Pool | C-C-A | MetaModels | [Internetseite -> Mediendepot Ruhr]
            [Arbeitet bei -> Paus Design & Medien]
            "I can EXPLAIN it to you, but I can't UNDERSTAND it for you."

            Kommentar

            • Tim G
              Contao-Urgestein
              • 13.02.2010
              • 2212

              #7
              Hab immer Schiss da was kaputt zu machen.
              Soll ich einen neuen Punkt unter: 9 Tipps und Tricks zur Umsetzung erstellen?
              http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

              Kommentar

              • xtra
                Maintainer
                • 02.07.2009
                • 2007

                #8
                Anmerkung noch am Rande.

                In Templates funktionen unter zu bringen kann zu massiven Problemen fyhren, wenn das Template mehrfach verwendet wird (beispielsweise zwei reader auf derselben Seite).

                Daher sollte man die Funktionen immer in der dca_config.php unterbringen, wo sie dann updatesafe hinterlegt sind.
                Noch besser waere es logischerweise, die Funktionen in einer config.php einer eigenen Extension zu hinterlegen, dann hat man immer sein "Templatepack" dabei.

                Gruss
                Chris
                Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

                Kommentar

                • MacKP
                  Contao-Yoda
                  • 15.06.2009
                  • 13315

                  #9
                  Zitat von Tim G Beitrag anzeigen
                  Hab immer Schiss da was kaputt zu machen.
                  Soll ich einen neuen Punkt unter: 9 Tipps und Tricks zur Umsetzung erstellen?
                  Ne, keine Panik ;-)
                  Machs einfach direkt im Catalog Bereich: http://de.contaowiki.org/Kategorie:Catalog

                  Viele Grüße
                  Contao Pool | C-C-A | MetaModels | [Internetseite -> Mediendepot Ruhr]
                  [Arbeitet bei -> Paus Design & Medien]
                  "I can EXPLAIN it to you, but I can't UNDERSTAND it for you."

                  Kommentar

                  • Tim G
                    Contao-Urgestein
                    • 13.02.2010
                    • 2212

                    #10
                    Daher sollte man die Funktionen immer in der dca_config.php unterbringen, wo sie dann updatesafe hinterlegt sind.
                    Ah, da also - macht ja Sinn
                    Wusste jetzt nicht wohin damit und einen extra Module Ordner wollte ich nicht spendieren.

                    Danke Dir
                    http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

                    Kommentar

                    • Tim G
                      Contao-Urgestein
                      • 13.02.2010
                      • 2212

                      #11
                      Zitat von MacKP Beitrag anzeigen
                      Ne, keine Panik ;-)
                      Machs einfach direkt im Catalog Bereich: http://de.contaowiki.org/Kategorie:Catalog

                      Viele Grüße
                      Ich bin zu blöde dafür.
                      Ich kann zwar nach der Anmeldung existierende Einträge bearbeiten, aber wie ich neue Anlegen kann, oder neue Unterseiten weiss ich nicht.
                      http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

                      Kommentar

                      • Tim G
                        Contao-Urgestein
                        • 13.02.2010
                        • 2212

                        #12
                        Zitat von xtra Beitrag anzeigen
                        Anmerkung noch am Rande.

                        In Templates funktionen unter zu bringen kann zu massiven Problemen fyhren, wenn das Template mehrfach verwendet wird (beispielsweise zwei reader auf derselben Seite).

                        Daher sollte man die Funktionen immer in der dca_config.php unterbringen, wo sie dann updatesafe hinterlegt sind.
                        Noch besser waere es logischerweise, die Funktionen in einer config.php einer eigenen Extension zu hinterlegen, dann hat man immer sein "Templatepack" dabei.

                        Gruss
                        Chris
                        Hi xtra,
                        nachdem ich die Funktion in der dcaconfig.php gesichert habe, kann ich keine Module im BE mehr öffnen. Klick auf Artikel -> weiss, Klick auf Katalog Einträge bearbeiten -> weiss... usw.
                        http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

                        Kommentar

                        • MacKP
                          Contao-Yoda
                          • 15.06.2009
                          • 13315

                          #13
                          Zitat von Tim G Beitrag anzeigen
                          Ich bin zu blöde dafür.
                          Ich kann zwar nach der Anmeldung existierende Einträge bearbeiten, aber wie ich neue Anlegen kann, oder neue Unterseiten weiss ich nicht.
                          Findest alles in der Hilfe: http://de.contaowiki.org/Hilfe:Hilfe...rtikel_anlegen ;-)

                          Viele Grüße
                          Contao Pool | C-C-A | MetaModels | [Internetseite -> Mediendepot Ruhr]
                          [Arbeitet bei -> Paus Design & Medien]
                          "I can EXPLAIN it to you, but I can't UNDERSTAND it for you."

                          Kommentar

                          Lädt...