[gelöst] Facet API Filter Verwendung auf User Rollen beschränken
am 25.07.2017 - 12:36 Uhr in
Hallo,
ich habe folgendes Problem:
Ich hab diverse Filtermöglichkeiten (Facet API) für eine bestimmte View. Einige davon (nicht alle) sollen allerdings nur speziellen User-Rollen zur Verfügung stehen. Wenn ich nun den Block des Facets auf diese Rolle beschränke, wird er natürlich nur für diese Rolle angezeigt, aber alle anderen - auch nicht angemeldete Nutzer - können den Filter trotzdem verwenden über die Adresszeile des Browsers.
Wie kann ich das unterbinden?
Wie kann ich das einstellen, dass der Facet Filter XYZ nur für spezielle Nutzer sichtbar und nutzbar ist - und für alle anderen wird "Zugriff verweigert" o.ä. angezeigt sobald versucht wird ihn anzuwenden?
Ich könnte mir vorstellen dass es da Anwendung im eCommerce-Sektor geben könnte.
Hat hier schon jemand Erfahrung oder eine Idee, wie man das umsetzen könnte?
Vielen Dank im Voraus.
- Anmelden oder Registrieren um Kommentare zu schreiben
Hast du die Berechtigung auch
am 25.07.2017 - 13:06 Uhr
Hast du die Berechtigung auch in der View selbst gesetzt oder nur in dem Block?
Also den Pfad der View, die die Suchergebnisse ausgibt, meine ich...
Wenn diese View auch nur die Berechtigung X hat, dürfte die Ergebnisseite auch nur mit "Zugriff verweigert" erscheinen.
Grüße Jenna
Nee, die View ist für alle -
am 25.07.2017 - 13:25 Uhr
Nee, die View ist für alle - auch Gäste/nicht angemeldete Nutzer - sichtbar und auch verwendbar.
Nur eben diese speziellen Filter sollten nur für spezielle Nutzer funktionieren.
Beipiel:
Immobilien eCommerce Seite. Liste aller Immobilien in einer View. Facet Filter: Stadt, Land, Preis, Zimmer-Anzahl, Quadratmeter.
Dabei sollten z.B. die Filter für Preis und Quadratmeter nur für spezielle Nutzer sichtbar und verwendbar sein. Alle anderen Filter und auch die View sollte für alle sichtbar und verwendbar sein.
Geht sowas?
Du könntest einfach 2 Views
am 25.07.2017 - 13:43 Uhr
Du könntest einfach 2 Views und Blöcke erstellen und die rollenabhängig einblenden.
Rolle Gast /suche/gast
Rolle X /suche/rollex
Macht aber nur dann Sinn wenn ein Gast nicht die z.B. vorgemerkten Listen mit in eine andere Rolle übernimmt, z.B. bei Premium Zugang.
Da der Gast ja bei Rollenwechsel auf einem anderen Viewspfad weiterarbeiten würde..
Grüße Jenna
Das habe ich auch schon
am 25.07.2017 - 14:15 Uhr
Das habe ich auch schon versucht. Habe eine View abgeriegelt und eine View offen für alle zugänglich.
Dann den Facet API Block mit den speziellen Filtern (Quadratmeter, Preis) nur auf der abgeriegelten View nur für spezielle Nutzer eingebunden und erreichbar gemacht.
Aber witziger Weise, kann man dann trotzdem über die Adresszeile des Browsers (
www.beispieldomain.de/immobilien_suche?f[0]=field_quadratmeter%253Aname%3A150) auch als Gast den Filter verwenden - auf beiden Views.
Es ist zum Mäuse melken...
Sowas hatte ich auch schon
am 25.07.2017 - 15:08 Uhr
Sowas hatte ich auch schon mal und man tüftelt rum bis zum Irrsinn..
Ich glaube das lässt sich mit Kontextfiltern in der Views lösen, wenn Bedingung nicht X ist, dann Zugriff verweigert anzeigen.
Jetzt ist nur die Frage auf welche Bedingung man den Bezug setzen muß... so aus dem Stegreif weiß ich das auch nicht mehr.
Falls du nicht weiter kommst, könnte ich das bei mir einmal nachstellen, komme aber erst am Wochenende dazu.
Grüße Jenna
Ich versuch grad n Workaround
am 26.07.2017 - 09:02 Uhr
Ich versuch grad n Workaround in dem ich die Rolle des aktuell angemeldeten Nutzers an eine JS-Funktion übergebe und dort wird die URL geprüft und wenn da eben einer dieser Filter auftaucht und der Nutzer hat keine Berechtigung dafür wird der Nutzer umgelenkt.
<script type="text/javascript">
function user_auth(user_role){
var current_url = decodeURIComponent(window.location.href);
if(current_url.lastIndexOf('quadratmeter') != -1
|| current_url.lastIndexOf('preis') != -1){
switch (user_role) {
case 'nicht_authentifiziert':
console.log('Zugriff Verweigert!');
break;
case 'authentifiziert':
console.log('Alles gut.');
break;
default:
console.log('Zugriff Verweigert!');
break;
}
}
}
</script>
<?php
global $user;
if (in_array("administrator", $user->roles) || in_array("XYZ Premium", $user->roles)) {
print '<script>jQuery(document).ready(function(){user_auth("authentifiziert");});</script>';
}else{
print '<script>jQuery(document).ready(function(){user_auth("nicht_authentifiziert");});</script>';
}
?>
Bis jetzt klappt das aber noch nicht wirklich. "ReferenceError: user_auth is not defined". Muss irgendwo noch einen entscheidenden Denkfehler haben.
EDIT:
Denkfehler gefunden: Die JS Funktion muss innerhalb einer eingebundenen JS-Datei definiert werden, dann klappt es.
Allerdings wäre mir eine reine Drupal-Interne bzw. serverseite Lösung lieber, da wahrscheinlich sicherer und weniger von außen manipulierbar (hoffe ich jedenfalls).
Gibt es eine Möglichkeit die Facets per Custom Module mit den Nutzerzugriffsrechten bzw. Rollen zu verknüpfen?
Gibt es da einen hook den ich verwenden könnte?
EDIT 2:
@Jenna: Sorry, das mit den Kontextfiltern hatte ich vergessen gestern zu beantworten. Das wäre eigentlich eine gute Idee, glaube ich. Aber in welchen Kontext sollte ich die View setzen? Ich glaub ich hab schon einen Knoten im Kopf. Also... Benutzerrollen kann man ja jeder View so oder so zuweisen bzw. den Zugriff auf div. Rollen beschränken, wahrscheinlich erscheint deshalb auch kein Benutzerfilter in den Kontextfiltern zur Auswahl (?), von daher bin ich da etwas lost.... PS: Das mit dem Angebot, dass du es Nachstellen würdest ist echt super nett, aber ich hoffe dass das nicht nötig wird...
Hi,da Facet API eine API
am 26.07.2017 - 09:07 Uhr
Hi,
da Facet API eine API ist, solltest Du besser diese verwenden.
Schau mal im Modul im Readme.txt oder in *.api.php nach passenden hooks.
MfG
Robert
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
Vielen Dank Hyp1 für den sehr
am 26.07.2017 - 09:31 Uhr
Vielen Dank Hyp1 für den sehr hilfreichen Hinweis! Habe dabei folgendes gefunden:
http://www.drupalcontrib.org/api/drupal/contributions%21facetapi%21plugi...
Die Klasse "FacetapiDependencyRole" würde wohl genau das was ich brauche erledigen, aber wie setze ich sie ein? Mit hooks habe ich schon die ein oder andere Erfahrung machen können, aber noch nicht mit Klassen, um ehrlich zu sein...
Dazu musst Du die Klasse in
am 26.07.2017 - 10:29 Uhr
Dazu musst Du die Klasse in einem Modul(mit der richtigen Ordnerstruktur) erweitern, was nicht ganz einfach ist.
https://www.phase2technology.com/blog/lessons-for-module-development-in-...
Aber schau mal hier, evtl hilft Dir das weiter.
http://drupalsun.com/ygerasimov/2011/11/14/customizing-apachesolr-facets...
MfG
Robert
https://awri.ch
Ich habe eine Schweizer Tastatur und daher kein scharfes ß ;-)
Ich habe es gelöst...
am 26.07.2017 - 12:06 Uhr
Hach... das Leben kann manchmal so wunderbar einfach sein......
Durch folgende Erklärungen https://www.drupal.org/node/1715202
Habe ich ein kleines Modülchen geschrieben:
Inhalt "MODULNAME.info":
name = "Facet API User Roles"
description = "Dieses Modul soll Facet Filter div. User Roles zuweisen können bzw. deren Benutzung auf spezielle User Roles einschränken"
package = "Custom"
core = 7.x
dependencies[] = facetapi
Inhalt "MODULNAME.module":
<?php
/**
* Implements hook_facetapi_dependencies().
*/
function MODULNAME_facetapi_dependencies() {
$dependencies = array();
$dependencies['custom_filter'] = array(
'handler' => array(
'label' => t('Custom filter'),
'class' => 'FacetapiDependencyRole',
),
);
return $dependencies;
}
?>
Danach war unter "admin/config/search/search_api/index/default_node_index/facets" dann eine weitere Operation auswählbar: "configure dependencies".
Dort kann man dann ganz bequem die Rollen auswählen, die diese Facets verwenden dürfen. Wählt man nichts aus, ist die Facet uneingeschränkt für alle Nutzer verfügbar.
Nochmal ganz lieben Dank an Hyp1 und Jenna für die guten Tipps, Hinweise und Hilfestellungen! Vielen, vielen Dank.