views:

5150

answers:

4

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?

+1  A: 

There are a couple 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. Hope that helps!

theunraveler
Option 1 didn't quite work i'm afraid - it could pick the argument up, but the argument was formatted incorrectly for what i needed - it kept using the alias rather than the nodeID
hfidgen
You can check the option under the argument to pass in the node ID from the URL if no argument is present. Or you can check the PHP code option and input something like: $url = explode('/',$_GET['q']); return $url[1];
theunraveler
+1  A: 

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.

googletorp
I've looked at panels before, not really got into it, maybe this could have been the time ^^
hfidgen
+1  A: 

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];
?>


Edit: 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);
?>
hfidgen
You should take a look at the arg() function for extracting arguments from a drupal path - see: http://api.drupal.org/api/function/arg/6
Henrik Opel
Henrik - thats perfect! Worked a dream.
hfidgen
+1 for posting follow up with found solution.
Henrik Opel
@hfidgen: I edited your answer to point to the 'arg()' function usage, as it would be the recommended way. Adjust or roll back, if that is not OK.
Henrik Opel
No thats fine, thanks again :)
hfidgen
+6  A: 

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.

M Parker
On a related note, enabling the `path` module will give you access to a function called `drupal_lookup_path`, which you can use to find a system path from an alias and vice-versa. See the `drupal_lookup_path` documentation for more information: <http://api.drupal.org/api/function/drupal_lookup_path/6>
M Parker
Also, once you have a node ID, you can use the node_load function to get all information about that node: <http://api.drupal.org/api/function/node_load/6>
M Parker
Depending on what context you are pasting my code in, the `return` statements might not always make sense... you may want to replace them with `$displayed_node =` if you need to return something else; but you need to get the NID for something.
M Parker
Nice one Mark - that'll be a big help!
hfidgen
Glad I could help!
M Parker

related questions