Question

How can I build a block in Drupal which is able to show the node ID of the view page the block is currently sitting on?

I'm using views to build a large chunk of my site, but I need to be able to make "intelligent" blocks in PHP mode which will have dynamic content depending on what the view is displaying.

How can I find the $nid which a view is currently displaying?

Was it helpful?

Solution

Here is a more-robust way of getting the node ID:

<?php
    // Check that the current URL is for a specific node:
    if(arg(0) == 'node' && is_numeric(arg(1))) {
        return arg(1); // Return the NID
    }
    else { // Whatever it is we're looking at, it's not a node
      return NULL; // Return an invalid NID
    }
?>

This method works even if you have a custom path for your node with the path and/or pathauto modules.

Just for reference, if you don't turn on the path module, the default URLs that Drupal generates are called "system paths" in the documentation. If you do turn on the path module, you are able to set custom paths which are called "aliases" in the documentation.

Since I always have the path module turned on, one thing that confused me at first was whether it was ever possible for the arg function to return part of an alias rather than part of system path.

As it turns out, the arg function will always return a system path because the arg function is based on $_GET['q']... After a bit of research it seems that $_GET['q'] will always return a system path.

If you want to get the path from the actual page request, you need to use $_REQUEST['q']. If the path module is enabled, $_REQUEST['q'] may return either an alias or a system path.

OTHER TIPS

For a solution, especially one that involves a view argument in the midst of a path like department/%/list, see the blog post Node ID as View Argument from SEO-friendly URL Path.

In the end this snippet did the job - it just stripped the clean URL and reported back the very last argument.

<?php
    $refer= $_SERVER ['REQUEST_URI'];
    $nid = explode("/", $refer);
    $nid = $nid[3];
?>

Given the comment reply, the above was probably reduced to this, using the Drupal arg() function to get a part of the request path:

<?php
    $nid = arg(3);
?>

You should considder the panels module. It is a very big module and requires some work before you really can tap into it's potential. So take that into considderation.

You can use it to setup a page containing several views/blocks that can be placed in different regions. It uses a concept called context which can be anything related to what you are viewing. You can use that context to determine which node is being viewed and not only change blocks but also layout. It is also a bit more clean since you can move the PHP code away from admin interface.

On a side note, it's also written by the views author.

There are a couple of ways to go about this:

  1. You can make your blocks with Views and pass the nid in through an argument.

  2. You can manually pass in the nid by accessing the $view object using the code below. It's an array at $view->result. Each row in the view is an object in that array, and the nid is in that object for each one. So you could run a foreach on that and get all of the nid of all rows in the view pretty easily.

The first option is a lot easier, so if that suits your needs I would go with that.

New about Drupal 7: The correct way to get the node id is using the function menu_get_object();

Example:

$node = menu_get_object();
$contentType = node_type_get_name($node);

Drupal 8 has another method. Check this out:

arg() is deprecated

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top