Modul für Attributzuordnung zu Benutzergruppe gesucht

Hallo Forum,

ich bin auf der Suche nach einem Modul oder einem Workaround wie man bestimmte Attribute an Benutzergruppen knüpfen kann. Schon einmal jemand sowas gesehen und hat nen Tipp für mich? Bin leider nicht fündig geworden.

Vielen Dank und Grüße

Im regulären Szenario ergibt so ein Modul keinen Sinn.
Attribute sind produktspezifische Eigenschaften, z.B: Farbe, Geschmack, Größe.
Eine Melone wird nicht plötzlich blau und nach Fisch schmecken, nur weil der Shopbesucher in der Gruppe “Newsletter Abonnent” ist.

Wenn Du uns beschreibst, welchen Effekt Du erreichen möchtest, finden wir vielleicht ein passendes Modul o.ä.

hi vanilla_thunder.

Szenario wäre z.B. das bei Baugruppen im Maschinenbau interne Produktmerkmale nur für Benutzer der Gruppe “Mitarbeiter” zu sehen sind. Diese Attribute sollen nicht an Endkunden kommuniziert werden.

Grüße

Ebenfalls sollten manche Attribute erst nach Anmeldung im Shop zu sehen sein, also sobald der Besucher in unserem Fall in der Benutzergruppe “Kunde” ist. Klingt doch plausibel oder?

ok, Sichtbarkeit der Attribute im Frontend abhängig von der Gruppe macht viel mehr Sinn als Attribute abhängig von der Gruppe zu setzen.
Möglich wäre es auch ohne Modul:

  1. alle internen Attribute z.B. mit einem (intern) anfangen lassen oder Sortierung von 666 nehmen
  2. TPL anpassen und Attribute mit Sortierung 666 nur für Benutzer der Gruppe Mitarbeiter zeigen.

ok, verstehe ich, aber wie lade ich die “(intern) attribute” im frontend bzw. nur attribute einer bestimmten Benutzergruppe?

Danke für deine Hilfe!

geladen werden wie immer alle, aber nicht alle werden angezeigt.
sowas hier:

[{if ($oxcmp_user->inGroup("Mitarbeiter") && $attr->oxsort == 666) || $attr->oxsort !== 666 }]
attribut...
[{/if}]

ah ok, ich teste das gleich mal, vielen dank! den kannte ich noch nicht :smile:

beachte die Klammern in dem IF-Statement:
( “Mitarbeiter” UND “oxsort 666” ) ODER “oxsort ist nicht 666”
das ist die Verknüpfung zwischen oxsort und der Benutzergruppe

Hab ich das richtig verstanden? Die Sortierung musste ich erweitern auf 66666.

<table class="attributes">

    [{if ($oxcmp_user->inGroup("Mitarbeiter") && $attr->oxsort == 66666) || $attr->oxsort !== 66666 }]
    
    [{/if}]
    
    [{foreach from=$oView->getAttributes() item=oAttr name=attribute}]
    <tr>
        <th id="attrTitle_[{$smarty.foreach.attribute.iteration}]"><strong>[{$oAttr->title}]</strong></th>
        <td id="attrValue_[{$smarty.foreach.attribute.iteration}]">[{$oAttr->value}]</td>
    </tr>
    [{/foreach}]
</table>

Verstehe gerade nicht so richtig wo ich die IF Abfrage einbauen muss :slight_smile: sorry, ist schon ein langer Tag.

Shopversion ist 4.8.9 und Template natürlich page/details/inc/attributes.tpl

Moin Vanilla_thunder,

kannst du mir nochmal kurz helfen? Die Abfrage in page/details/inc/attributes.tpl einbauen? Irgendwie funktioniert es bei mir nicht, template ist zerschossen wenn ich die Abfrage einbaue.

Grüße

sorry, da war ich kurz 2 Wochen im Urlaub.

Also, das ursprüngliche Vorhaben funktioniert leider nicht, weil OXID an dieser Stelle die Sortierung der Attribute völligst ignoriert.
Daher wäre der Umweg über zwei Unterstriche am Anfang des Attributenamens die einfachste Lösung.
Hier meine angepasste attributes.tpl:

<dl class="attributes dl-horizontal">
    [{foreach from=$oView->getAttributes() item=oAttr name=attribute}]
        [{if ( $oxcmp_user && $oxcmp_user->inGroup("oxidpowershopper") && $oAttr->title|strpos:'__' === 0) || $oAttr->title|strpos:'__' !== 0 }]
            <dt id="attrTitle_[{$smarty.foreach.attribute.iteration}]" class="hasTooltip" title="[{$oAttr->title}]" data-placement="right" >[{$oAttr->title|replace:'__':''}]</dt>
            <dd id="attrValue_[{$smarty.foreach.attribute.iteration}]">[{$oAttr->value}]</dd>
        [{/if}]
    [{/foreach}]
</dl>

“oxidpowershopper” ist die ID der Power Shopper Bneutzergruppe, nur zum Testen.

Hallo vanilla_thunder,

vielen Dank funktioniert soweit erstmal, ich musste es ein wenig anpassen da ich ja noch auf Shopversion 4.8.9 und Azure als Grundlage verwende.

Problem: Bei nicht angemeldeten Benutzern gibt er einen Fehler aus da er ja den member call macht:

Fatal error: Call to a member function inGroup() on boolean in /Applications/MAMP/htdocs/gkn/tmp/smarty/95d495a43045524e40c49be912113426^%%05^050^05096B0C%%attributes.tpl.php on line 11

<table class="attributes">
[{foreach from=$oView->getAttributes() item=oAttr name=attribute}]
[{if ( $oxcmp_user->inGroup("81971199a08c8d6e96ad1b6b677270ec") && $oAttr->title|strpos:'__' === 0) || $oAttr->title|strpos:'__' !== 0 }]
<tr>
    <th id="attrTitle_[{$smarty.foreach.attribute.iteration}]"><strong>[{$oAttr->title|replace:'__':''}]</strong></th>
    <td id="attrValue_[{$smarty.foreach.attribute.iteration}]">[{$oAttr->value}]</td>
</tr>
[{/if}]
[{/foreach}]

Weist du dafür auch eine Lösung?

Vielen Dank und Grüße!

kommt das, wenn man nicht eingeloggt ist?
versuch mal so:

[{if ( $oxcmp_user && $oxcmp_user->inGroup(...

Sehr geil! Funzt! Vielen Dank!

top,
also nochmal eine kurze Erklärung, was dieser Code macht, falls jemand sowas ähnlichen braucht:

  • [{foreach from=$oView->getAttributes() item=oAttr name=attribute}] ... [{/foreach}]
    das Foreach-Konstrukt aus dem ursprünglichen Template lädt die Attribute

  • [{if $oxcmp_user .... }] ... [{/if}]
    die darin enthaltene IF-Klausel steuert ob und wann die Attribute angezeigt werden sollen

Die einzelnen Bedingungen machen folgendes:

  • $oxcmp_user ist wahr, wenn der Besucher eingeloggt ist.
  • $oxcmp_user->inGroup("oxidpowershopper") fragt ab, ob der Benutzer in einer bestimmten Benutzergruppe ist
  • $oAttr->title|strpos:'__' === 0 strpos ist eine PHP Funktion, die in $oAttr->title nach __ sucht und dessen Position liefert. Fängt der Attributename mit __ an, ist die Position 0 (Computer fangen bei 0 an zu zählen, nicht bei 1), kommt __ gar nicht vor, liefert strpos -1

Durch die Klammern kann man die Bedingungen verknüpfen, die alle gleichzeitig zutreffen müssen.
Z.B. damit ein Attribut angezeigt werden darf:
entweder muss sein Name nicht mit __ anfangen: $oAttr->title|strpos:'__' !== 0
oder ||
der Name fängt mit __ an und && der Benutzer muss eingeloggt und && in der Gruppe XY sein:
( $oAttr->title|strpos:'__' === 0 && $oxcmp_user && $oxcmp_user->inGroup("81971199a08c8d6e96ad1b6b677270ec") )

In einem der früheren Beiträge habe ich eben nochmal gesehen, dass die Attribute allgemein nur für eingeloggte Benutzer sichtbar sein sollen. Das wäre [{if $oxcmp_user}] ... [{/if}]. Da diese Bedinngung global für alle Attribute wäre, sollte man es vor der Foreach-Schleife abfragen, das spart dem Server komplett die Arbeit, die Attribute zu laden, wenn der Benutzer nicht eingeloggt ist:

[{if $oxcmp_user}]
    [{foreach ... }]
... (hier drin wird dann die Benutzergruppe und der Attributename geprüft ) ...
    [{/foreach}]
[{/if}]