Frage zu einem PHP-Code un deren "or" variablen
Eingetragen von fraweg (230)
am 18.01.2013 - 17:36 Uhr in
am 18.01.2013 - 17:36 Uhr in
Hallo zusammen,
ich versuche gerade in meiner template.php einige Tabs für die nicht Adminrollen verschwinden zu lassen. Hier der Code der soweit auch funktioniert:
function andromeda_preprocess_page(&$variables) {
/** hide tabs in user/% for non admins*/
global $user;
$user_roles = array_values($user->roles);
$unwanted_non_admin_tabs = array('user/%/edit');
if (!in_array('administrator', $user_roles)) {
foreach ($variables['tabs'] as $group_key => $tab_group){
if (is_array($tab_group)) {
foreach ($tab_group as $key => $tab) {
if (isset($tab['#link']['path']) && in_array($tab['#link']['path'], $unwanted_non_admin_tabs)){
unset($variables['tabs'][$group_key][$key]);
}
}
}
}
}
/** close andromeda preproces*/
}
Wenn ich nun aber ein "or" Befehl mit einbaue funktioniert es nicht mehr. Hier der Code:
function andromeda_preprocess_page(&$variables) {
/** hide tabs in user/% for non admins*/
global $user;
$user_roles = array_values($user->roles);
$unwanted_non_admin_tabs = array('user/%/edit');
if (!in_array('administrator'||'content manager'||'community manager', $user_roles)) {
foreach ($variables['tabs'] as $group_key => $tab_group){
if (is_array($tab_group)) {
foreach ($tab_group as $key => $tab) {
if (isset($tab['#link']['path']) && in_array($tab['#link']['path'], $unwanted_non_admin_tabs)){
unset($variables['tabs'][$group_key][$key]);
}
}
}
}
}
/** close andromeda preproces*/
}
Hat jemand ein Idee was ich da falsch mache?
Viele Grüße
Frank
- Anmelden oder Registrieren um Kommentare zu schreiben
Probier es doch mal nach
am 18.01.2013 - 17:59 Uhr
Probier es doch mal nach diesem Muster:
if (!in_array('administrator', $user_roles) || !in_array('content manager', $user_roles) || !in_array('community manager', $user_roles)) {
[edit- vervollständigt]
Don't code today what you can't debug tomorrow
Ariya Hidayat
Hui.. das ging ja schnell..
am 18.01.2013 - 18:17 Uhr
Hui.. das ging ja schnell.. vielen herzlichen Dank für die Antwort!
Wenn ich das so mache ist "edit bei alles Rollen wech ... :-(
Viele Grüße
Frank
Stimmt die Schreibweise
am 18.01.2013 - 19:09 Uhr
Stimmt die Schreibweise "content manager" und "community manager" alles klein?
Wenn man hier eine or-Bedingung will, muss der user auch alle Rollen haben, oder?
Sonst wäre es so möglich, dann muss nur eine Rolle erfüllt sein:
if (in_array('administrator', $user_roles) or in_array('content manager', $user_roles) or in_array('community manager', $user_roles) {
$admin = $true; // muss nicht sein - nur für die Lesbarkait
}
else {
foreach ($variables['tabs'] as $group_key => $tab_group){
if (is_array($tab_group)) {
foreach ($tab_group as $key => $tab) {
if (isset($tab['#link']['path']) && in_array($tab['#link']['path'], $unwanted_non_admin_tabs)){
unset($variables['tabs'][$group_key][$key]);
}
}
}
}
}
Don't code today what you can't debug tomorrow
Ariya Hidayat
Hallo und Danke nochmals für
am 18.01.2013 - 20:27 Uhr
Hallo und Danke nochmals für die Mühe!
Stimmt die Schreibweise "content manager" und "community manager" alles klein?
Ja das sollte stimmen an anderer Stelle scheint es auch zu so funktionieren. Ich glaube bei Drupal 7 werden die Großbuchstaben zu kleinen gemacht. Hatte ich so im Netz gefunden.
Wenn man hier eine or-Bedingung will, muss der user auch alle Rollen haben, oder?
An anderer Stelle scheint es wie gesagt so zu funktionieren. Hatte es da so gemacht:
<?php
/**
* Implements hook_form_alter().
*/
function hide_leave_shadow_copy_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'forum_node_form') {
global $user;
$user_roles = array_values($user->roles);
if (!in_array('administrator'||'content manager'||'community manager', $user_roles)) {
$form['shadow']['#access'] = FALSE;
}
}
}
mit deinem Code bekomme ich folgenden Fehler:
Parse error: syntax error, unexpected '{' in /.../template.php on line 202
so jetzt nochmal im Ganzen,
am 18.01.2013 - 20:52 Uhr
so jetzt nochmal im Ganzen, war noch ein Fehler drinn, ich hatte es nicht laufen lassen:
function andromeda_preprocess_page(&$variables) {
/** hide tabs in user/% for non admins*/
global $user;
$user_roles = array_values($user->roles);
$unwanted_non_admin_tabs = array('user/%/edit');
if (in_array('administrator', $user_roles) or in_array('content manager', $user_roles) or in_array('community manager', $user_roles)) {
$admin = true; // muss nicht sein - nur für die Lesbarkait
}
else {
foreach ($variables['tabs'] as $group_key => $tab_group){
if (is_array($tab_group)) {
foreach ($tab_group as $key => $tab) {
if (isset($tab['#link']['path']) && in_array($tab['#link']['path'], $unwanted_non_admin_tabs)){
unset($variables['tabs'][$group_key][$key]);
}
}
}
}
}
/** close andromeda preproces*/
}
Don't code today what you can't debug tomorrow
Ariya Hidayat
Danke nochmals... jetzt habe
am 18.01.2013 - 22:03 Uhr
Danke nochmals... jetzt habe ich folgende Meldung:
Parse error: syntax error, unexpected T_VARIABLE in /.../themes/andromeda/template.php on line 205
Ich habe danach noch folgenden code laufen:
$unwanted_tabs = array('user/%/subscriptions');
foreach ($variables['tabs'] as $group_key => $tab_group){
if (is_array($tab_group)) {
foreach ($tab_group as $key => $tab) {
if (isset($tab['#link']['path']) && in_array($tab['#link']['path'], $unwanted_tabs)){
unset($variables['tabs'][$group_key][$key]);
}
}
}
}
kann das ein Problem sein?
Um Tabs, also Menüeinträge zu
am 19.01.2013 - 01:23 Uhr
Um Tabs, also Menüeinträge zu verbergen würde ich eher mit http://api.drupal.org/api/drupal/modules%21system%21system.api.php/funct... arbeiten und dann die Zugriffsrechte entsprechend entziehen. Alternative auch hier ist Panels.
gruß pebosi
--
https://pebosi.net
Hallo, nochmals Danke fürh
am 21.01.2013 - 12:20 Uhr
Hallo,
nochmals Danke fürh eure Mühe!
@pebosi
ich habe da noch nicht ganz verstanden was du meinst. Es geht um die Tabs in dem Userprofil.
Alternative auch hier ist Panels.
Ich kann die Tabs mit "Panels" beeinflussen? Magst du mir kurz einen Tip geben wie ich das mache?
Um Tabs, also Menüeinträge zu verbergen würde ich eher mit http://api.drupal.org/api/drupal/modules%21system%21system.api.php/funct..
Danke für das Heraussuchen des Links! Ich denke du meinst es als Modul einzubinden? Das würde mir auch noch besser gefallen. Nur ist mir nicht ganz klar wie ich da das einbinden muss. Müsste die *.module etwa so aussehen?
<?php
/** hide tabs in user/% for non admins*/
function hook_menu_alter(&$items) {
global $user;
$user_roles = array_values($user->roles);
if (!in_array('administrator', $user_roles)) {
$items['user/%/edit']['access callback'] = FALSE;
}
}
Und wenn.. ist das tab dann nur versteckt oder existiert der ganze path dann nicht mehr ?
Entschuldigt bitte meine Naiven Fragen..Bin in diesen Dingen nicht so gut...
Viele Grüße
Frank
Hallo,dir auch noch mal
am 21.01.2013 - 12:23 Uhr
@oteno
Hallo,
dir auch noch mal Danke für deine Mühe!
Verstehe ich das richtig, dass der code bei dir so funktioniert?
Viele Grüße
Frank
Vielleicht sollte ich erst
am 21.01.2013 - 12:32 Uhr
Vielleicht sollte ich erst einmal grundsätzlich erklären was ich vor habe. Ich möchte für den User die meisten tabs auslagern in das Menü, so dass alles mehr oder weniger an einem Ort zu finden ist. Grundsätzlich geht das ja mit dem Module "Tab Tamer". Da gibt es aber nicht die Möglichkeit der rollenbasierten Ausblendung. Es macht zum Beispiel Sinn, dass für den Admin trotzdem der "Edit"-tab (oder anderes) in den userprofilen zu finden ist. Aber für den User finde ich es sehr praktisch alles im Menü zu finden unter "My account" usw. . Daher meine Bemühungen :-)
Dazu hatte ich den Oben genannten Code in die Template.php eingebunden. so dass der Code folgendermaßen aussieht:
/**
* Implements template_preprocess_page().
*/
function andromeda_preprocess_page(&$variables) {
if ((arg(0)=='user')&&(arg(1)=='login')){
drupal_set_title(t('Log in'));
}
elseif ((arg(0)=='user')&&(arg(1)=='register')){
drupal_set_title(t('Register'));
}
elseif ((arg(0)=='user')&&(arg(1)=='password')){
drupal_set_title(t('Password'));
}
if (!$GLOBALS['user']->uid) {
$user_links = array(
'links' => array(
'login' => array(
'title' => t('Login'),
'href' => 'user/login',
),
'register' => array(
'title' => t('Register'),
'href' => 'user/register',
),
),
);
}
else {
$user_links = array(
'links' => array(
'account' => array(
'title' => t('My account'),
'href' => 'user/' . $GLOBALS['user']->uid,
),
'logout' => array(
'title' => t('Logout'),
'href' => 'user/logout',
),
),
);
}
$variables['user_links'] = theme('links', $user_links);
$variables['classes_array'][] = 'wrapper-body';
//handle logo
if (theme_get_setting('andromeda_enable_logo')) {
$variables['logo'] = theme_get_setting('logo');
}
else {
$variables['logo'] = '';
}
*/
/** hide tabs in user/% for non admins*/
global $user;
$user_roles = array_values($user->roles);
$unwanted_non_admin_tabs = array('user/%/edit');
if (!in_array('administrator', $user_roles)) {
foreach ($variables['tabs'] as $group_key => $tab_group){
if (is_array($tab_group)) {
foreach ($tab_group as $key => $tab) {
if (isset($tab['#link']['path']) && in_array($tab['#link']['path'], $unwanted_non_admin_tabs)){
unset($variables['tabs'][$group_key][$key]);
}
}
}
}
}
/** hide tabs in user/% */
$unwanted_tabs = array('user/%/subscriptions');
foreach ($variables['tabs'] as $group_key => $tab_group){
if (is_array($tab_group)) {
foreach ($tab_group as $key => $tab) {
if (isset($tab['#link']['path']) && in_array($tab['#link']['path'], $unwanted_tabs)){
unset($variables['tabs'][$group_key][$key]);
}
}
}
}
/** close andromeda preproces*/
}
Da kam dann die Frage mit dem "oder" auf um mehrere Rollen einzubinden.
Soo... vielleicht macht es das so klarer..
Viele Grüße
Frank
nicht ganz... Soviel Mühe
am 21.01.2013 - 12:38 Uhr
nicht ganz...
Soviel Mühe habe ich mir auch nicht gemacht, die Rollen irgenwo anzu legen und das ganze durchzutesten.
Mein Vorschlag, bezog sich auf die Ausgangsfrage, und lediglich die Kontrollstruktur.
Ich habe im Wesentlichen nur vorgeschlagen die if-Abfrage
if (!in_array('administrator'||'content manager'||'community manager', $user_roles)) {
durch diese zu ersetzen:
if (in_array('administrator', $user_roles) or in_array('content manager', $user_roles) or in_array('community manager', $user_roles)) {
$admin = true; // muss nicht sein - nur für die Lesbarkait
}
else {
Mit der eigentlichen Funktionalität habe ich mich nicht groß beschäftigt...
Don't code today what you can't debug tomorrow
Ariya Hidayat