1

I would like to remove certain blocks, so that admin can not see them. In block visibility settings - in pages tab, I try to put followng php code but with no effect. (In user tab there is no php field to put code.)

<?php 
if(arg(0) == 'administrator' )
return true;
else 
return false 
?> 

What I am doing wrong?

EDIT: On my other D6 site I use argument:

 user_access('access administration pages')

but on D7 site it does not work, what can be another way of doing it?

  • what I am going to assume and ignore to be copy/paste issues, the rest of your logic here is saying if the first argument of your path is administrator, return true otherwise return false. so, that means true will be returned on www.yoursite.com/administrator, www.yoursite.com/administrator/foo, www.yoursite.com/administrator/foo/bar, etc. – Jimajamma May 20 '13 at 3:44
  • @Jimajamma I need to hide a block from all pages if administrator is logged in. In D6 site I used user_access('access administration pages') argiment but in D7 it no longer works. – loparr May 22 '13 at 0:01
2

You could perhaps just set the "Roles" options under the block visibility settings.

Alternatively, something like:

global $user;
return in_array('administrator', $user->roles) ? FALSE : TRUE;
|improve this answer|||||
  • 1
    using roles does not do the trick because no matter what roles I check, administrator sees everything. I tried using your code inside php area on pages tab but without any result – loparr May 20 '13 at 1:37
  • 2
    Even you restrict roles user with uid 1 can see everything.. :) – niksmac May 20 '13 at 1:53
  • Nikhil is right - that's why I always reserve uid 1 to service tasks under general name like Admin, and as soon as feasible move to my own username with minimal required set of roles needed. – Mołot May 20 '13 at 6:10
  • Using Rules instead of "Roles* does work ... Refer to my answer here for more details ... Even for uid=1 ... – Pierre.Vriens Mar 12 '16 at 11:50
0

Just using "rOles" (as in the comments below the prior answer) is indeed not going to help/work. Instead, if you're willing to consider using "rUles", then there is a solution for this question, as further explained below.

Part 1: Rules block visibility

Have a look at the Rules block visibility module. Here is a quote from its project page:

The Rules block visibility module allows Rules components to be used to control block visibility. This provides Drupal administrators and developers extreme flexibility in controlling when blocks should be displayed on their websites, in addition to the default visibility options provided by Drupal.

The general idea is that if you can do it with Rules, you can use it to control block visibility, so the possibilities are limitless:

  • Need to show a block only for users registered more than a month ago?

  • Perhaps you have a block that must be shown only between 8am-5pm on weekdays?

  • What about displaying or hiding a block based on current weather conditions?

All of this can be done by using Rules block visibility.

With that, and as per the "if you can do it with Rules, you can use it to control block visibility" above, you've reduced your question to making Rules intercept the actual user who's using the site, i.e. if it is YES or NO (a boolean, right?) the user with uid = 1.

Part 2: Create an appropriate Rules Component

The Rules block visibility module doesn't have a lot of documentation, except in the README.txt that comes with this module. Here is what the crucial part of it is (to get the idea):

Configuration is done on a per-block basis. To control a block visibility using a rule component, go to the block settings page, scroll down to the "Rules" tab, and select the Rules component that you want to use.

Notice that to be able to be used by this module, a Rules component must be constructed in a very specific way. See the next section for more information.

This module comes with 2 sample Rules Components, that should help to understand the concept behind it.

By looking at these samples, I was able to create another Rules Component which looks like so:

{ "rules_block_visibility_hide_block_for_user_1" : {
    "LABEL" : "Hide block for user 1",
    "PLUGIN" : "rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "USES VARIABLES" : {
      "module" : { "label" : "Module", "type" : "text" },
      "delta" : { "label" : "Delta", "type" : "text" },
      "result" : { "label" : "Result", "type" : "boolean", "parameter" : false }
    },
    "IF" : [
      { "NOT data_is" : { "data" : [ "site:current-user:uid" ], "value" : "1" } }
    ],
    "DO" : [ { "data_set" : { "data" : [ "result" ], "value" : "1" } } ],
    "PROVIDES VARIABLES" : [ "result" ]
  }
}

You should be able to import this rule in your own environment.

What this Rules Component does is "only" return a boolean (1 or 0), based on the condition if the user's uid is YES or NO equal to 1.

With that, we're coming close to an actual answer to your question. But note that, as a variation, you could also have used a rules condition like "does this user yes or no have a role like administrator".

Part 3:

Head over to the "Block" settings for the block you want to hide for the user with uid = 1. At the bottom of it's settings, within the typical "Visibility settings", there is now (after you enabled the Rules block visibility module as in Part 1) an extra tab labeled "Rules". Using that tab will allow you to select a "Rules Component" that will do what's documented below that selection list field, ie: "Show this block only if the selected rule returns a positive value. Important: to be listed here, a block visibility rule must have specific parameters and return values.".

And guess what, in my case I just selected my Rules Component from Part 2

Note: it doesn't matter what type of block it is (created by a view, or something else), it works in all cases.

|improve this answer|||||

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.