Ankündigung

Einklappen
Keine Ankündigung bisher.

Denkanstoss benötigt

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Denkanstoss benötigt

    Vielleicht kann mir jemand helfen, da ich den Wald vor lauter Bäumen nicht mehr sehe...

    Situation:

    Bestehender CC mit Eltern-Kind-Produkttabellen

    Die Kindeinträge sind mit wenigen Infos ausgestattet – der Einfachheit halber vergleichen wir das mal mit T-Shirts.
    Man hat also ein Elternelement "T-Shirt" und die Kindeinträge sind dann die Produktvarianten, die sich eigentlich nur über Farbe und Größe unterscheiden.

    Das Elternelement wird auf der Detailseite korrekt ausgegeben und ich möchte die Kindeinträge als Liste auf dieser Seite unterbringen - soweit auch kein Problem.

    Was ich aber gerne hätte, wäre dass ich die Kindeinträge zusammenfassen kann, gruppiert nach Farbe. Wie könnte man sowas angehen?

    Hieraus:

    Variante 1: Schwarz, Größe S
    Variante 2: Schwarz, Größe M
    Variante 3: Schwarz, Größe L
    Variante 4: Schwarz, Größe XL
    Variante 5: Rot, Größe S
    Variante 6: Rot, Größe M
    Variante 7: Blau, Größe S

    Soll das werden:

    Variante 1: Schwarz, Größen S - XL
    Variante 2: Rot, Größen S - M
    Variante 3: Blau, Größen S

  • #2
    In gestückelten DB Abfragen würde es mit GROUP BY gehen oder wenn alle kommen in assoziativen Arrays.

    Sagen wir mal es kommen alle, roh rein. Dann würde ich einen Array nach Klassifikationen "Merkmalen" bauen. Den kannst du dann auch (in der Tiefe) sortieren.

    Code:
     <?php
      
      $arrCollection = array();
      
      foreach($objEntries as $entry)
      {
      $arrCollection[$enty->merkmal1][$enty->merkmal2] = $entry;
      }
      
      // alphabetisch nach merkmal1 sortieren
      ksort($arrCollection);
      
      // alphabetisch innerhalb von merkmal1 sortieren
      ksort($arrCollection['###merkmal1###'])
      
    // sortiert ausgeben
      foreach($arrCollection as $merkmal1 => $arrEntries)
      {
      foreach($arrEntrie as $merkmal2 => $entry)
      {
      echo $entry->id;
      }
      }
      
      ?>
    http://www.premium-contao-themes.com

    Kommentar


    • #3
      Danke Tim!
      Soweit war ich bereits – was mir fehlt ist der richtige Ansatz, wie ich das jetzt zusammenfassen kann.
      Anstelle von mehreren schwarzen Varianten mit jeweils einer Größe, soll eben jede Farbe nur einmal ausgegeben und die Größen entsprechend in diesem Eintrag zusammen gefasst werden.

      Variante 1: Schwarz, Größen S - XL
      Variante 2: Rot, Größen S - M

      Kommentar


      • #4
        Warum machst du nicht getrennte DB Abfragen? Holst alle mit Schwarz, holst alle mit Rot.
        Zuletzt geändert von Tim; 11.04.2019, 14:33.
        http://www.premium-contao-themes.com

        Kommentar


        • #5
          Zitat von Tim Beitrag anzeigen
          Warum machst du nicht getrennte DB Abfragen? Holst alle mit Schwarz, holst alle mit Rot.

          An welcher Stelle?

          Kommentar


          • #6
            Zitat von D23 Beitrag anzeigen


            An welcher Stelle?
            Mehrere Kind-Einträge Abfragen. In dem Query für alle Kinder mit Farbe rot, setzt du WHERE farbe='rot'.

            Oder du machst eine normale Array Aufstockung. Dein Array ist nur eine Tiefe.

            $arrCollection[$enty->farbe][] = $entry;
            http://www.premium-contao-themes.com

            Kommentar


            • #7
              Zitat von Tim Beitrag anzeigen

              Mehrere Kind-Einträge Abfragen. In dem Query für alle Kinder mit Farbe rot, setzt du WHERE farbe='rot'.
              Da müsste ich am Ende bis zu 20 Abfragen machen... fände ich jetzt eher down & dirty

              Kommentar


              • #8
                Zitat von D23 Beitrag anzeigen

                Da müsste ich am Ende bis zu 20 Abfragen machen... fände ich jetzt eher down & dirty
                Kann man am Ende immer tunen. Eine Lösung ist besser als keine Lösung

                So sollte es linear gehen.
                $arrCollection[$enty->farbe][] = $entry;
                http://www.premium-contao-themes.com

                Kommentar


                • #9
                  PHP-Code:
                  $arrCollection = array();

                    foreach(
                  $this->entries as $entry){
                      
                  $arrCollection[$entry->color][$entry->size] = $entry;
                    }

                    
                  // alphabetisch nach color sortieren
                    
                  ksort($arrCollection);

                    
                  // alphabetisch innerhalb von color sortieren
                    
                  ksort($arrCollection['color']);

                    
                  // sortiert ausgeben
                    
                  foreach($arrCollection as $color => $arrEntries){
                      foreach(
                  $arrEntries as $size => $entry){
                        echo 
                  'Farbe: '.$entry->color.' | Größe: '.$entry->size.'<br>';
                      }
                    } 
                  liefert:

                  Farbe: 0 | Größe: 39
                  Farbe: 3 | Größe: 39
                  Farbe: 3 | Größe: 40
                  Farbe: 3 | Größe: 41
                  Farbe: 3 | Größe: 42
                  Farbe: 3 | Größe: 43
                  Farbe: 3 | Größe: 44
                  Farbe: 3 | Größe: 45
                  Farbe: 3 | Größe: 46
                  Farbe: 3 | Größe: 47

                  Kommentar


                  • #10
                    Ok, nochmal komplett überarbeitet – so kommt man zum Ziel (falls jmd mal ein ähnliches Problem hat):

                    PHP-Code:

                    $arrEntries 
                    = [];
                      foreach(
                    $this->entries as $entry){
                        
                    $arrEntryData = array(
                          
                    'color' => $entry->field('color')->value(),
                          
                    'material' => $entry->field('material')->value(),
                          
                    'type' => $entry->field('material_type')->value(),
                          
                    'size' => $entry->field('size')->value(),
                          
                    'image' => $entry->field('imagepath')->value()
                        );
                        
                    $arrEntries[] = $arrEntryData;
                      }
                      
                    // leeres array für rückgabe
                      
                    $output = [];

                      foreach(
                    $arrEntries as $row) {
                        
                    // teste, ob Eintrag in der Farbe bereits vorhanden (alternativ andere Eigenschaft wie material)
                        
                    if(!isset($output[$row['color']])) {
                          
                    // nicht vorhanden, neuer Eintrag
                          
                    $output[$row['color']] = [];
                        }
                        
                    // füge den Eintrag dem Array hinzu
                        
                    array_push($output[$row['color']], $row);
                      } 

                    Und für die Ausgabe:

                    PHP-Code:

                    <table class="uk-table">
                        <thead>
                          <th>Farbe</th>
                          <th>Material</th>
                          <th>Materialart</th>
                          <th>Größe</th>
                        </thead>
                        <tbody>
                          <?php
                          
                    foreach($output as $row) {
                            echo 
                    '<tr>';
                            echo 
                    '<td>' $row[0]['color'] . '</td>';
                            echo 
                    '<td>' $row[0]['material'] . '</td>';
                            echo 
                    '<td>' $row[0]['type'] . '</td>';
                            
                    $min 99;
                            
                    $max 0;
                            foreach(
                    $row as $item) {
                              
                    // ermittle min
                              
                    if($item['size'] < $min) {
                                
                    $min $item['size'];
                              }
                              if(
                    $item['size'] > $max) {
                                
                    $max $item['size'];
                              }
                            }
                            echo 
                    '<td>' $min ' - ' $max '</td>';
                            echo 
                    '</tr>';
                          }
                          
                    ?>
                        </tbody>
                      </table>

                    Kommentar


                    • #11
                      Wenn du mit Arrays auch noch die Größe sortiert haben willst, innerhalb der Farbe, wäre es genau das Beispiel im ersten Post.
                      Code:
                      $arrCollection[$enty->merkmal1][$enty->merkmal2] = $entry;
                      Ich bin nicht so der SQL Crack, aber hast du es mit deiner DB Abfrage für die Kind-Einträge mit Group By mal probiert.

                      Code:
                      SELECT * FROM ... WHERE pid=ID-VON-MAMA GROUP BY (farbe, groesse) ORDER BY groesse
                      Das sollte die Einträge nach Farbe und Groesse gruppiert sammeln und darin nach Größe sortieren.
                      http://www.premium-contao-themes.com

                      Kommentar


                      • #12
                        SQL Abfrage hab ich versucht, die verursacht aber Fehler.

                        An exception occurred while executing 'SELECT * FROM cc_variants WHERE pid=96100 GROUP BY color':\n\nSQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'contao4_fdb.cc_variants.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by at /Applications/MAMP/htdocs/c4/finn/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php:126

                        Kommentar


                        • #13
                          Im Select muss by only_full_group_by SQL modus die GROUP BY Felder explizit erwähnt sein, glaube ich.

                          SELECT *,color,groesse ...
                          http://www.premium-contao-themes.com

                          Kommentar


                          • #14
                            Man kann auch diesen Fix einbauen: https://github.com/isotope/core/issu...ment-345039560

                            Kommentar


                            • #15
                              Ok, damit funktioniert das grundsätzlich schon. Allerdings geht mir hier die Info der verfügbaren Größen verloren. Man erhält in der Ausgabe dann nur noch 2 Einträge.

                              Kommentar

                              Lädt...
                              X