Ergebnis 1 bis 15 von 15

Thema: Filter Linkliste mit einzelnen Total-Anzeige möglich?

  1. #1
    Contao-Nutzer
    Registriert seit
    09.09.2009.
    Beiträge
    55

    Standard Filter Linkliste mit einzelnen Total-Anzeige möglich?

    Habe ein Firmenverzeichnis mit Branchen angelegt. Branchen als Taxonomien und auf der Ausgabeseite als Filterlinkliste angelegt. Schön wäre es, wenn ich jetzt hinter jeden Filter die Zahl der Einträge zu den einzelnen Branchen bekommen könnte, ähnlich wie es bei der Liste ein Total gibt. Kriegs nur einfach nicht hin. Hat jemand vorschläge?

  2. #2
    Contao-Urgestein Avatar von Tim G
    Registriert seit
    13.02.2010.
    Ort
    Lübeck
    Beiträge
    2.210
    User beschenken
    Wunschliste

    Standard

    Ja, geht.
    Dafür im template vor der Ausgabe erst die gemeinsamen Einträge in ein Array packen, also alle der gleichen Kategorie. Die Wurzeln sollten die Id der Kategorie sein, oder der Name.
    In der Ausgabe dann je Item, dessen Kategorie mit der Anzahl an Items in der Kategorie des Sammelarrays abgleichen.




    Sent from my iPhone using Tapatalk
    http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

  3. #3
    Contao-Urgestein Avatar von Tim G
    Registriert seit
    13.02.2010.
    Ort
    Lübeck
    Beiträge
    2.210
    User beschenken
    Wunschliste

    Standard

    Wie gesagt, das geht mit zwei Schleifen.
    Die erste durchläuft einfach die Einträge und zählt einfach die Einträge pro Kategorie und merkt sich die Anzahl in einem Array.
    Die zweite Schleife ist im Grunde die normale Ausgabe-Schleife.

    1 Schleife:
    PHP-Code:
    <?php
    $fieldName 
    'category'// catalog field name. This is the column name of your select field for the categories
    $arrCategories = array(); // stores the categories and its item_count
    foreach($this->entries as $entry)
    {
        
    $catId $entry['data'][$fieldName]['raw']; // current category id
        
    if(!array_key_exists($catId,$arrCategories)) // new category
        
    {
            
    $arrCategories[$catId][num_items] = 1;
        }
        else 
    // increase the items count
        
    {
            
    $arrCategories[$catId][num_items] += 1;
        }
    }
    ?>
    Die Trennung ist wichtig damit du die Gesamtanzahl ausgeben kannst und nicht pro gefundener Kategorie sich die Zahl in der Ausgabe um 1 erhöht.

    Die eigentliche Ausgabe-Schleife erweiterst Du hiermit innerhalb der ersten foreach-Schleife
    PHP-Code:
    <?php
    $catId 
    $entry['data'][$fieldName]['raw']; 
    $items $arrCategories[$catId]['num_items']; // get stored items count
    ?>
    Die Ausgabe einfach per echo darunter z.B.:
    HTML-Code:
    <div class="items_count"><?php echo $items; ?></div>
    ----------- hier das komplette catalog_simple template dafür
    PHP-Code:
    <?php if (count($this->entries)): ?>

    <?php
    $fieldName 
    'category'// field name for creating collections
    $arrCategories = array(); // stores the categories and its item_count
    foreach($this->entries as $entry)
    {
        
    $catId $entry['data'][$fieldName]['raw']; // current category id
        
    if(!array_key_exists($catId,$arrCategories)) // new category
        
    {
            
    $arrCategories[$catId][num_items] = 1;
        }
        else 
    // increase the items count
        
    {
            
    $arrCategories[$catId][num_items] += 1;
        }
    }
    ?>

    <div class="layout_simple">

    <?php foreach ($this->entries as $entry): ?>
    <div class="item<?php echo $entry['class'] ? ' '.$entry['class'] : ''?>">

    <?php
    $catId 
    $entry['data'][$fieldName]['raw']; 
    $items $arrCategories[$catId]['num_items'];
    ?>
    <div class="items_count"><?php echo $items?></div>

    <?php foreach ($entry['data'] as $field=>$data): ?>

    <?php if (!in_array($field, array('catalog_name','parentJumpTo'))): ?>
    <div class="field <?php echo $field?>">
        <div class="label"><?php echo $data['label']; ?></div>
        <div class="value"><?php echo $data['value']; ?></div>
    </div>

    <?php endif; ?>
    <?php 
    endforeach; ?>

    <?php if ($entry['showLink'] && $entry['link']): ?>
    <div class="link"><?php echo $entry['link']; ?></div>
    <?php endif; ?>
    <?php 
    if ($entry['linkEdit']): ?>
    <div class="linkEdit"><?php echo $entry['linkEdit']; ?></div>
    <?php endif; ?>
    </div>

    <?php endforeach; ?>
    </div>
     
    <?php else: ?>

    <?php if ($this->condition): ?>
    <div class="condition"><?php echo $this->condition?></div>
    <?php else: ?>
    <p class="info">There are no entries matching your search.</p>
    <?php endif; ?>

    <?php endif; ?>

    Viel Spass beim Ausprobieren,
    Gruß Tim
    http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

  4. #4
    Contao-Nutzer
    Registriert seit
    09.09.2009.
    Beiträge
    55

    Standard

    Danke, Tim, für den ausführlichen Post. Kriege das im catalog_simple auch hin. Meinte aber eigentlich eine Ausgabe im filter_default, so dass die Eintragsanzahl je Kat/Filterlink ausgegeben werden. Kriegs leider in der filter_default nicht hin, bin nicht so firm in php.

  5. #5
    Contao-Urgestein Avatar von Tim G
    Registriert seit
    13.02.2010.
    Ort
    Lübeck
    Beiträge
    2.210
    User beschenken
    Wunschliste

    Standard

    Ah ja, sorry
    Mein Firephp funzt nicht mehr. Ich muss da grad ne Alternative installieren, aber die funzt auch noch nicht - nervig!
    Dann guck ichs mir mal an.

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

  6. #6
    Contao-Urgestein Avatar von Tim G
    Registriert seit
    13.02.2010.
    Ort
    Lübeck
    Beiträge
    2.210
    User beschenken
    Wunschliste

    Standard

    Das sollte es tun.
    Das beispiel manipluiert die normalen Filter, range-Filter etc. sind nicht betroffen. (aber man kann es sich ja weiter umbauen)

    Basiert auf dem filter_default.tpl
    Ledigleich die Variable $catalog muss auf Eure Katalog-Tablelle geändert werden.
    Das eigentliche Umschreiben des Filter-HTML-Strings ist bissel schwammig mit dem einfach str_replace. Ein preg_replace wäre sicher eleganter.

    Hier die Schritte:
    1. Den Filter-Ausgabe String vom Catalog zerschneiden und anhand der html-ids die ids der verwendeten taxonomy Felder finden, zusätzlich den Spaltennamen der Filter-Felder holden
    2.0 Mit den ids den Alias, den Namen etc aus der tl_taxonomy tabelle holen (ist für den Anchor String später notwendig)
    2.1 Mit dem Spaltennamen aus dem Filter und der taxonomy ID per MySQL einfach die Anzahl der ausgebenlassen
    2.2 Alles in einen Array mit laufendem Index verstauen
    3. Im eigentlich HTML-Template für jede Filter-Option den Link ersetzen mit dem dazugehörigen Namen (name aus tl_taxonomy (ermittelt in 2.0)) und als Ergänzung ein <span class="total">ANZAHL n</span> mit der Ausgabe der Anzahl an Einträgen (ermittelt in 2.2)

    PHP-Code:

    <?php if ($this->filterOptions): ?>

    <?php
    $this
    ->import('Database');

    $catalog 'cat_products'// our catalog table
    $arrTemp = array();
    foreach(
    $this->filterOptions as $i => $filterOption)
    {
            
    preg_match_all('/list_id\-(.*?)\"/'$filterOption$resultPregIds); // returns tax ids as array
        
    preg_match('/filter_field\_(.*?)\"/'$filterOption$resultPregField);
        
    $filter_group $resultPregField[1];
        
        
    // Database connect
        
    foreach($resultPregIds[1] as $tax_id)
        {
            
    // tl_taxonomy
            
    $objTaxFields $this->Database->prepare("SELECT id,alias,name FROM tl_taxonomy WHERE id=?")
                            ->
    limit(1)
                            ->
    execute($tax_id);
            if(!
    $objTaxFields->numRows) continue;
            
            
    // catalog itself
            // Count entries from catalog table where the colName contains the taxonomy id
            
    $objCatalog $this->Database->prepare("SELECT COUNT(*) as total FROM $catalog WHERE $filter_group=?")
                            ->
    execute($tax_id);
            
    #if($objCatalog->total > 0)
            #    FB::log($objCatalog->total);
            
            // Build array
            #$arrTemp[$i][$filter_group][] = array(
            
    $arrTemp[$i][] = array(
                
    'filter_field' => $filter_group,
                
    'id' => $tax_id,
                
    'alias' => $objTaxFields->alias,
                
    'name' => $objTaxFields->name,
                
    'total' => $objCatalog->total
            
    );
        }
    }
    #print_r($arrTemp);
    ?>





    <div class="filter_group">

    <?php if ($this->filter_headline): ?>
    <<?php echo $this->filter_hl?>><?php echo $this->filter_headline?></<?php echo $this->filter_hl?>>
    <?php endif; ?>

    <?php foreach($this->filterOptions as $i => $filterOption): ?>
    <?php
        
    #$filterField = $arrTemp[$i][0]['filter_field'];
        // Loop through the filter fields and insert the total number of items for each anchor link
        
    foreach($arrTemp[$i] as $field)
        {
            
    $search '>'.$field['name'];
            
    $replace '>'.$field['name'] . ' <span class="total">(' $field['total'] . ')</span>';
            
    $filterOption str_replace($search$replace$filterOption);
            
    #$newFilterOption = preg_replace('/filter_field\_(.*?)\"/', $replace, $filterOption);
        
    }
    ?>

    <?php echo $filterOption?>
    <?php 
    endforeach; ?>

    </div>
    <?php endif; ?>


    <?php if ($this->rangeOptions): ?>
    <div class="range_group">

    <?php if ($this->range_headline): ?>
    <<?php echo $this->range_hl?>><?php echo $this->range_headline?></<?php echo $this->range_hl?>>
    <?php endif; ?>

    <form method="post" id="<?php echo $this->table?>_range" action="<?php echo $this->action?>">    
    <div class="range">
    <input type="hidden" name="FORM_SUBMIT" value="<?php echo $this->table?>" />
    <input type="hidden" name="FORM_DATA" value="range" />
    <?php foreach($this->rangeOptions as $rangeOption): ?>
    <?php 
    echo $rangeOption?>
    <?php 
    endforeach; ?>
    </div>
    </form>

    </div>
    <?php endif; ?>


    <?php if ($this->dateOptions): ?>
    <div class="date_group">

    <?php if ($this->date_headline): ?>
    <<?php echo $this->date_hl?>><?php echo $this->date_headline?></<?php echo $this->date_hl?>>
    <?php endif; ?>

    <form method="post" id="<?php echo $this->table?>_date" action="<?php echo $this->action?>">    
    <div class="date">
    <input type="hidden" name="FORM_SUBMIT" value="<?php echo $this->table?>" />
    <input type="hidden" name="FORM_DATA" value="date" />
    <?php foreach($this->dateOptions as $dateOption): ?>
    <?php 
    echo $dateOption?>
    <?php 
    endforeach; ?>
    </div>
    </form>

    </div>
    <?php endif; ?>


    <?php if ($this->searchOptions): ?>
    <div class="search_group">

    <?php if ($this->search_headline): ?>
    <<?php echo $this->search_hl?>><?php echo $this->search_headline?></<?php echo $this->search_hl?>>
    <?php endif; ?>

    <form method="post" id="<?php echo $this->table?>_search" action="<?php echo $this->action?>"> 
    <div class="search">
    <input type="hidden" name="FORM_SUBMIT" value="<?php echo $this->table?>" />
    <input type="hidden" name="FORM_DATA" value="search" />
    <?php echo $this->searchOptions?>
    </div>
    </form> 

    </div>
    <?php endif; ?>


    <?php if ($this->sortOptions): ?>
    <div class="sort_group">

    <?php if ($this->sort_headline): ?>
    <<?php echo $this->sort_hl?>><?php echo $this->sort_headline?></<?php echo $this->sort_hl?>>
    <?php endif; ?>

    <div class="sort">
    <?php echo $this->sortOptions?>
    </div>

    </div>
    <?php endif; ?>

    <div class="clearall">
    <a href="<?php echo $this->clearall?>" title="<?php echo $this->clearallText?>"><?php echo $this->clearallText?></a>
    </div>
    Grüße Tim
    http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

  7. #7
    Contao-Nutzer
    Registriert seit
    09.09.2009.
    Beiträge
    55

    Standard

    Danke, Tim, das ist so spitze und gibt genau die Ausgabe, die ich beabsichtige.
    Ähm, nur einen Schönheitsfehler: Der active Filter aus der filter_group, also nach klick auf filterlink, wird auf null gesetzt. Komme nicht ganz dahinter, wieso der active filter nicht ausgelesen wird.

  8. #8
    Contao-Urgestein Avatar von Tim G
    Registriert seit
    13.02.2010.
    Ort
    Lübeck
    Beiträge
    2.210
    User beschenken
    Wunschliste

    Standard

    Der active Filter aus der filter_group, also nach klick auf filterlink, wird auf null gesetzt.
    Seltsam, bei mir nicht.
    http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

  9. #9
    Contao-Nutzer
    Registriert seit
    09.09.2009.
    Beiträge
    55

    Standard

    Hab ich vielleicht die falsche tabelle eingetragen? ich schau gleich nochmal nach.

  10. #10
    Contao-Nutzer
    Registriert seit
    09.09.2009.
    Beiträge
    55

    Standard

    ok, kann das noch nicht lösen, aber bessr eingrenzen. hat mit der sprachdatei zu tun.
    in de gibts
    $GLOBALS['TL_LANG']['MSC']['optionselected'] = "[%s]";
    dann gibts den selected/active filter als name aus in brackets
    ich hatte es umgeschrieben in
    $GLOBALS['TL_LANG']['MSC']['optionselected'] = "%s";
    damit die brackets weg sind. Tatsächlich gibt er mir dann den namen aus und macht (0) dahinter. Bei defaut spracheintrag ohne irgendwas dazu.
    Denke mal, das es einen konflikt mit alias und name gibt.

  11. #11
    Maintainer Avatar von xtra
    Registriert seit
    02.07.2009.
    Ort
    Tuebingen
    Beiträge
    2.007
    User beschenken
    Wunschliste

    Standard

    Ihr seid euch schon bewusst, dass ihr die anzahl der "hits" im filter_widgets template schon ausgegeben bekommt?

    PHP-Code:
    foreach($this->widgets['filter'] as $filterWidget)
      foreach(
    deserialize($filterWidget['options']) as $filterOption)
        echo 
    $filterOption['resultcount']; 
    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.

  12. #12
    Contao-Urgestein Avatar von Tim G
    Registriert seit
    13.02.2010.
    Ort
    Lübeck
    Beiträge
    2.210
    User beschenken
    Wunschliste

    Standard

    Ihr seid euch schon bewusst, dass ihr die anzahl der "hits" im filter_widgets template schon ausgegeben bekommt?

    PHP-Code:
    foreach($this->widgets['filter'] as $filterWidget)
    foreach(deserialize($filterWidget['options']) as $filterOption)
    echo $filterOption['resultcount'];
    Ohne Worte...


    Selbst im filter_default kommt man so an die Werte ran. Ahh... das macht ja kein Spass
    http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.

  13. #13
    Contao-Nutzer
    Registriert seit
    09.09.2009.
    Beiträge
    55

    Standard

    danke, xtra.
    wenn ich den filter umstelle bekomme ich immer:
    Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ']' in /Applications/MAMP/htdocs/contao-2.9.5/templates/filter_widgets.tpl on line 83

    habe cataloge modul nochmal aktualisiert, kann mir das aber nicht erklären.

  14. #14
    Contao-Nutzer
    Registriert seit
    09.09.2009.
    Beiträge
    55

    Standard

    danke, habs jetzt hinbekommen. habe einfach den rest gelöscht und nur meine list stehen gelassen. damit gehts dann auch genau so, wie ichs brauchte.
    dank an xtra und tim

  15. #15
    Contao-Nutzer
    Registriert seit
    09.09.2009.
    Beiträge
    55

    Standard

    Nach längerem Gebrauch stelle ich nun doch einen Fehler fest.
    Gelöschte Einträge in den Listen werden bei der Ausgabe mitgezählt.
    D.h. bei einzelnen Categorien gab es z.B. mal 20 Einträge, 5 wurden entfernt, aber die Ausgabe ist nicht 15 sondern 20.

    das hier steht im filter widget:

    PHP-Code:
    <ul class="list">
    <?php $i 0; foreach(deserialize($filterWidget['options']) as $filterOption): ?>
    <li class="option <?php echo ($i=='list_none' 'list_id-'.$filterOption['id']); ?><?php if ($filterOption['selected']) echo ' active'?>"><a href="<?php echo $filterOption['value']; ?>" title="<?php echo $filterOption['label']; ?>"><?php echo $filterOption['label']; ?> <span class="total"><?php echo $filterOption[resultcount]; ?></span></a></li>
    <?php $i++; endforeach; ?>
    </ul>
    komme nicht dahinter

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
  •