Automatische Kategoriesortierung linke Navigation (Lösung zum Teilen)

Shopware 5.2.8

Hi Zusammen,

ich hatte letztens die Anforderung eine automatische Kategoriesortierung nach Namen in der linken Navigation bereitzustellen. Ein Kunde hatte keine Lust bestimmte Unterkategorien immer wieder manuell zu sortieren. 

Meine Umsetzung als Anregung und Diskussion würde ich gerne hier bereitstellen. Folgendermaßen bin ich vorgegangen: 

  1. Freitextfeld für Kategorien erstellt (Checkbox) 

  1. Smarty modifier angelegt 

modifier.sortby.php abgelegt im eigenen Theme unter

themes/Frontend/EUERTHEME/_private/smarty/modifier.sortby.php

 \$b['$key']) return $d * 1;\n";
                $code .= "if ( \$a['$key'] < \$b['$key']) return $d * -1;\n";
            }
        }
        $code .= 'return $c;';
        $sort_func = $sort_funcs[$sortby] = create_function('$a, $b', $code);
    }
    else
    {
        $sort_func = $sort_funcs[$sortby];
    }
    uasort($data, $sort_func);
}

#
# Modifier: sortby - allows arrays of named arrays to be sorted by a given field
#
function smarty_modifier_sortby($arrData,$sortfields) {
    array_sort_by_fields($arrData,$sortfields);
    return $arrData;
}

?>
  1. Templateanpassung

sidebar-categories.tpl unter themes/Frontend/EUERTHEMEfrontend/index/sidebar-categories.tpl

{block name="frontend_index_categories_left_entry_subcategories"}
    {if $category.subcategories}
        {if $category.attribute.attribute1 == 1 && $Controller != 'checkout'}
            {call name=categories categories=$category.subcategories|@sortby:"name" level=$level+1}
        {else}
            {call name=categories categories=$category.subcategories level=$level+1}
        {/if}
    {/if}
{/block}

Viel Spaß damit, Anregungen und Fragen könnt ihr gerne loswerden. 

Liebe Grüße aus Hamburg

Kevin

Es fehlt hier leider noch ein 4. Schritt, der mir noch aufgefallen ist. Im Off-Canvas Menü sollte die Sortierung natürlich auch greifen. 

Daher hier noch ein Punkt zur Templateanpassung:

get_category.tpl unter unter frontend/themes/EUERTHEME/widgets/listing/get_category.tpl

{extends file="parent:widgets/listing/get_category.tpl"}
{namespace name="frontend/listing/get_category"}

{block name="widgets_listing_get_category_categories"}
    

        {* Go back button *}
        {block name="widgets_listing_get_category_categories_back"}
            
                {block name="widgets_listing_get_category_categories_back_link"}
                    
                        {block name="widgets_listing_get_category_categories_back_link_arrow_left"}
                            
                                        
                                    
                        {/block}

                        {block name="widgets_listing_get_category_categories_back_link_name"}
                            {s name="ButtonBack"}{/s}
                        {/block}
                    
                {/block}
            
        {/block}

        {* Show this category button *}
        {block name="widgets_listing_get_category_categories_show"}
            
                {block name="widgets_listing_get_category_categories_show_link"}
                    
                        {block name="widgets_listing_get_category_categories_show_link_name"}
                            {s name="ButtonShowPrepend"}{/s} {$category.name} {s name="ButtonShowAppend"}{/s}
                        {/block}
                    
                {/block}
            
        {/block}

        {* sub categories *}
        {* Check if automatic sort is activated *}
        {if $category.attribute.attribute1 == 1}
            {foreach $category.children|@sortby:"name" as $children}
                {block name="widgets_listing_get_category_categories_item"}
                    {if $children.active}
                        
                            {block name="widgets_listing_get_category_categories_item_link"}
                                

                                    {block name="widgets_listing_get_category_categories_item_link_name"}
                                        {$children.name}
                                    {/block}

                                    {block name="widgets_listing_get_category_categories_item_link_children"}
                                        {if $children.childrenCount}
                                            
                                                    
                                                
                                        {/if}
                                    {/block}
                                
                            {/block}
                        
                    {/if}
                {/block}
            {/foreach}
        {else}
            {* Default Shopware Category Sorting *}
            {foreach $category.children as $children}
                {block name="widgets_listing_get_category_categories_item"}
                    {if $children.active}
                        
                            {block name="widgets_listing_get_category_categories_item_link"}
                                

                                    {block name="widgets_listing_get_category_categories_item_link_name"}
                                        {$children.name}
                                    {/block}

                                    {block name="widgets_listing_get_category_categories_item_link_children"}
                                        {if $children.childrenCount}
                                            
                                                    
                                                
                                        {/if}
                                    {/block}
                                
                            {/block}
                        
                    {/if}
                {/block}
            {/foreach}
        {/if}

    
{/block}

Hier fehlt mir leider aktuell ein Block vor der

 {foreach $category.children as $children}

Daher musste ich mir leider den ganzen Block “widgets_listing_get_category_categories” nehmen und anpassen. Werde mal ein Pull Request bei Shopware hierzu erstellen.  

Sieht bei mir aber soweit gut aus.

Liebe Grüße

Kevin

1 „Gefällt mir“

Hi Kevin,

keine Ahnung ob deine Lösung funktioniert. Ich benötige sie gerade nicht. :slight_smile:

Aber vielen Dank für das Teilen! So stelle ich mir ein Forum vor. Das habe ich das letzte Mal im" xtcModified" - Forum so erlebt .

Danke!

Markus 

Habe es gerade bei mir probiert!!

Ich habe im Template den modifier angelegt.

Ich möchte eine foreach von einen Plugin nach optionname sortieren lassen.

Ich rufe es so auf:

	{foreach $foreachGroup.values|@sortby:"optionname" as $option}

Das Array $foreachGroup.Value rufe ich davor mal auf:

Array
(
[14] => Array
(
[optionID] => 14
[groupID] => 9
[optionname] => Braun
[user_selected] => 1
[selected] => 1
[selectable] => 1
[attributes] => Array
(
)
)
[15] => Array
(
[optionID] => 15
[groupID] => 9
[optionname] => Gelb
[user_selected] =>
[selected] =>
[selectable] => 1
[attributes] => Array
( ........

Aber danach sind diese genauso noch sortiert, bekomme aber auch keinen Fehler