- Patch #884948 by David_Rothstein: the wrong parameter is sometimes passed in to hook_node_load().

merge-requests/26/head
Dries Buytaert 2010-11-24 16:25:39 +00:00
parent 5eaf3e033f
commit b7459d8eb3
3 changed files with 64 additions and 1 deletions

View File

@ -3854,7 +3854,10 @@ class NodeController extends DrupalDefaultEntityController {
$function($nodes_of_type);
}
}
$this->hookLoadArguments[] = array_keys($typed_nodes);
// Besides the list of nodes, pass one additional argument to
// hook_node_load(), containing a list of node types that were loaded.
$argument = array_keys($typed_nodes);
$this->hookLoadArguments = array($argument);
parent::attachLoad($nodes, $revision_id);
}

View File

@ -81,6 +81,50 @@ class NodeLoadMultipleUnitTest extends DrupalWebTestCase {
}
}
/**
* Tests for the hooks invoked during node_load().
*/
class NodeLoadHooksTestCase extends DrupalWebTestCase {
public static function getInfo() {
return array(
'name' => 'Node load hooks',
'description' => 'Test the hooks invoked when a node is being loaded.',
'group' => 'Node',
);
}
function setUp() {
parent::setUp('node_test');
}
/**
* Test that hook_node_load() is invoked correctly.
*/
function testHookNodeLoad() {
// Create some sample articles and pages.
$node1 = $this->drupalCreateNode(array('type' => 'article', 'status' => NODE_PUBLISHED));
$node2 = $this->drupalCreateNode(array('type' => 'article', 'status' => NODE_PUBLISHED));
$node3 = $this->drupalCreateNode(array('type' => 'article', 'status' => NODE_NOT_PUBLISHED));
$node4 = $this->drupalCreateNode(array('type' => 'page', 'status' => NODE_NOT_PUBLISHED));
// Check that when a set of nodes that only contains articles is loaded,
// the properties added to the node by node_test_load_node() correctly
// reflect the expected values.
$nodes = node_load_multiple(array(), array('status' => NODE_PUBLISHED));
$loaded_node = end($nodes);
$this->assertEqual($loaded_node->node_test_loaded_nids, array($node1->nid, $node2->nid), t('hook_node_load() received the correct list of node IDs the first time it was called.'));
$this->assertEqual($loaded_node->node_test_loaded_types, array('article'), t('hook_node_load() received the correct list of node types the first time it was called.'));
// Now, as part of the same page request, load a set of nodes that contain
// both articles and pages, and make sure the parameters passed to
// node_test_node_load() are correctly updated.
$nodes = node_load_multiple(array(), array('status' => NODE_NOT_PUBLISHED));
$loaded_node = end($nodes);
$this->assertEqual($loaded_node->node_test_loaded_nids, array($node3->nid, $node4->nid), t('hook_node_load() received the correct list of node IDs the second time it was called.'));
$this->assertEqual($loaded_node->node_test_loaded_types, array('article', 'page'), t('hook_node_load() received the correct list of node types the second time it was called.'));
}
}
class NodeRevisionsTestCase extends DrupalWebTestCase {
protected $nodes;
protected $logs;

View File

@ -7,6 +7,22 @@
* the Node module.
*/
/**
* Implements hook_node_load().
*/
function node_test_node_load($nodes, $types) {
// Add properties to each loaded node which record the parameters that were
// passed in to this function, so the tests can check that (a) this hook was
// called, and (b) the parameters were what we expected them to be.
$nids = array_keys($nodes);
ksort($nids);
sort($types);
foreach ($nodes as $node) {
$node->node_test_loaded_nids = $nids;
$node->node_test_loaded_types = $types;
}
}
/**
* Implements hook_node_view().
*/