2008-11-25 02:37:33 +00:00
< ? php
2012-06-15 16:43:34 +00:00
use Drupal\entity\EntityInterface ;
2008-11-25 02:37:33 +00:00
/**
* @ file
* Hooks provided by the Node module .
*/
2010-02-10 10:34:50 +00:00
/**
* @ defgroup node_api_hooks Node API Hooks
* @ {
2011-01-03 18:03:54 +00:00
* Functions to define and modify content types .
2010-02-10 10:34:50 +00:00
*
* Each content type is maintained by a primary module , which is either
* node . module ( for content types created in the user interface ) or the
* module that implements hook_node_info () to define the content type .
*
* During node operations ( create , update , view , delete , etc . ), there are
* several sets of hooks that get invoked to allow modules to modify the base
* node operation :
* - Node - type - specific hooks : These hooks are only invoked on the primary
* module , using the " base " return component of hook_node_info () as the
2010-02-11 08:58:55 +00:00
* function prefix . For example , poll . module defines the base for the Poll
* content type as " poll " , so during creation of a poll node , hook_insert () is
* only invoked by calling poll_insert () .
2010-02-10 10:34:50 +00:00
* - All - module hooks : This set of hooks is invoked on all implementing
* modules , to allow other modules to modify what the primary node module is
* doing . For example , hook_node_insert () is invoked on all modules when
2010-02-11 08:58:55 +00:00
* creating a poll node .
2010-02-10 10:34:50 +00:00
* - Field hooks : Hooks related to the fields attached to the node . These are
* invoked from the field operations functions described below , and can be
* either field - type - specific or all - module hooks .
* - Entity hooks : Generic hooks for " entity " operations . These are always
* invoked on all modules .
*
* Here is a list of the node and entity hooks that are invoked , field
* operations , and other steps that take place during node operations :
* - Creating a new node ( calling node_save () on a new node ) :
* - field_attach_presave ()
* - hook_node_presave () ( all )
2011-05-14 16:51:34 +00:00
* - hook_entity_presave () ( all )
2010-02-10 10:34:50 +00:00
* - Node and revision records are written to the database
* - hook_insert () ( node - type - specific )
* - field_attach_insert ()
* - hook_node_insert () ( all )
* - hook_entity_insert () ( all )
* - hook_node_access_records () ( all )
* - hook_node_access_records_alter () ( all )
* - Updating an existing node ( calling node_save () on an existing node ) :
* - field_attach_presave ()
* - hook_node_presave () ( all )
2011-05-14 16:51:34 +00:00
* - hook_entity_presave () ( all )
2010-02-10 10:34:50 +00:00
* - Node and revision records are written to the database
* - hook_update () ( node - type - specific )
* - field_attach_update ()
* - hook_node_update () ( all )
* - hook_entity_update () ( all )
* - hook_node_access_records () ( all )
* - hook_node_access_records_alter () ( all )
2012-04-26 04:07:55 +00:00
* - Loading a node ( calling node_load (), node_load_multiple (), entity_load ()
* or entity_load_multiple () with $entity_type of 'node' ) :
2010-02-10 10:34:50 +00:00
* - Node and revision information is read from database .
* - hook_load () ( node - type - specific )
* - field_attach_load_revision () and field_attach_load ()
* - hook_entity_load () ( all )
* - hook_node_load () ( all )
* - Viewing a single node ( calling node_view () - note that the input to
* node_view () is a loaded node , so the Loading steps above are already
* done ) :
* - hook_view () ( node - type - specific )
* - field_attach_prepare_view ()
2010-02-11 08:58:55 +00:00
* - hook_entity_prepare_view () ( all )
2010-02-10 10:34:50 +00:00
* - field_attach_view ()
* - hook_node_view () ( all )
2011-05-14 16:51:34 +00:00
* - hook_entity_view () ( all )
* - hook_node_view_alter () ( all )
* - hook_entity_view_alter () ( all )
2010-02-10 10:34:50 +00:00
* - Viewing multiple nodes ( calling node_view_multiple () - note that the input
* to node_view_multiple () is a set of loaded nodes , so the Loading steps
* above are already done ) :
* - field_attach_prepare_view ()
2010-02-11 08:58:55 +00:00
* - hook_entity_prepare_view () ( all )
2010-02-10 10:34:50 +00:00
* - hook_view () ( node - type - specific )
* - field_attach_view ()
* - hook_node_view () ( all )
2011-05-14 16:51:34 +00:00
* - hook_entity_view () ( all )
2010-02-10 10:34:50 +00:00
* - hook_node_view_alter () ( all )
2011-05-14 16:51:34 +00:00
* - hook_entity_view_alter () ( all )
2010-02-10 10:34:50 +00:00
* - Deleting a node ( calling node_delete () or node_delete_multiple ()) :
* - Node is loaded ( see Loading section above )
* - hook_delete () ( node - type - specific )
2011-12-17 12:43:37 +00:00
* - hook_node_predelete () ( all )
* - hook_entity_predelete () ( all )
2010-02-10 10:34:50 +00:00
* - field_attach_delete ()
2011-05-14 16:51:34 +00:00
* - Node and revision information are deleted from database
2011-12-17 12:43:37 +00:00
* - hook_node_delete () ( all )
* - hook_entity_delete () ( all )
2010-02-10 10:34:50 +00:00
* - Deleting a node revision ( calling node_revision_delete ()) :
* - Node is loaded ( see Loading section above )
* - Revision information is deleted from database
* - hook_node_revision_delete () ( all )
* - field_attach_delete_revision ()
* - Preparing a node for editing ( calling node_form () - note that if it ' s
* an existing node , it will already be loaded ; see the Loading section
* above ) :
* - hook_prepare () ( node - type - specific )
2010-06-06 00:24:16 +00:00
* - hook_node_prepare () ( all )
2010-02-10 10:34:50 +00:00
* - hook_form () ( node - type - specific )
* - field_attach_form ()
* - Validating a node during editing form submit ( calling
* node_form_validate ()) :
* - hook_validate () ( node - type - specific )
* - hook_node_validate () ( all )
* - field_attach_form_validate ()
* - Searching ( calling node_search_execute ()) :
* - hook_ranking () ( all )
* - Query is executed to find matching nodes
* - Resulting node is loaded ( see Loading section above )
* - Resulting node is prepared for viewing ( see Viewing a single node above )
2010-02-11 08:58:55 +00:00
* - comment_node_update_index () is called .
2010-02-10 10:34:50 +00:00
* - hook_node_search_result () ( all )
* - Search indexing ( calling node_update_index ()) :
* - Node is loaded ( see Loading section above )
* - Node is prepared for viewing ( see Viewing a single node above )
* - hook_node_update_index () ( all )
* @ }
*/
2008-11-25 02:37:33 +00:00
/**
* @ addtogroup hooks
* @ {
*/
/**
* Inform the node access system what permissions the user has .
*
2009-10-24 11:49:52 +00:00
* This hook is for implementation by node access modules . In this hook ,
* the module grants a user different " grant IDs " within one or more
* " realms " . In hook_node_access_records (), the realms and grant IDs are
* associated with permission to view , edit , and delete individual nodes .
2008-11-25 02:37:33 +00:00
*
2009-10-24 11:49:52 +00:00
* The realms and grant IDs can be arbitrarily defined by your node access
* module ; it is common to use role IDs as grant IDs , but that is not
* required . Your module could instead maintain its own list of users , where
* each list has an ID . In that case , the return value of this hook would be
* an array of the list IDs that this user is a member of .
2008-11-25 02:37:33 +00:00
*
* A node access module may implement as many realms as necessary to
2010-09-29 14:08:54 +00:00
* properly define the access privileges for the nodes . Note that the system
* makes no distinction between published and unpublished nodes . It is the
* module ' s responsibility to provide appropriate realms to limit access to
* unpublished content .
2008-11-25 02:37:33 +00:00
*
2010-11-20 04:33:56 +00:00
* Node access records are stored in the { node_access } table and define which
* grants are required to access a node . There is a special case for the view
* operation -- a record with node ID 0 corresponds to a " view all " grant for
* the realm and grant ID of that record . If there are no node access modules
* enabled , the core node module adds a node ID 0 record for realm 'all' . Node
* access modules can also grant " view all " permission on their custom realms ;
* for example , a module could create a record in { node_access } with :
* @ code
* $record = array (
* 'nid' => 0 ,
* 'gid' => 888 ,
* 'realm' => 'example_realm' ,
* 'grant_view' => 1 ,
* 'grant_update' => 0 ,
* 'grant_delete' => 0 ,
* );
* drupal_write_record ( 'node_access' , $record );
* @ endcode
* And then in its hook_node_grants () implementation , it would need to return :
* @ code
* if ( $op == 'view' ) {
* $grants [ 'example_realm' ] = array ( 888 );
* }
* @ endcode
* If you decide to do this , be aware that the node_access_rebuild () function
* will erase any node ID 0 entry when it is called , so you will need to make
* sure to restore your { node_access } record after node_access_rebuild () is
* called .
*
2010-01-04 20:34:28 +00:00
* @ param $account
2008-11-25 02:37:33 +00:00
* The user object whose grants are requested .
* @ param $op
* The node operation to be performed , such as " view " , " update " , or " delete " .
2009-10-24 11:49:52 +00:00
*
2008-11-25 02:37:33 +00:00
* @ return
2009-10-24 11:49:52 +00:00
* An array whose keys are " realms " of grants , and whose values are arrays of
* the grant IDs within this realm that this user is being granted .
2008-11-25 02:37:33 +00:00
*
* For a detailed example , see node_access_example . module .
*
2011-11-28 11:44:25 +00:00
* @ see node_access_view_all_nodes ()
* @ see node_access_rebuild ()
2008-11-25 02:37:33 +00:00
* @ ingroup node_access
*/
function hook_node_grants ( $account , $op ) {
if ( user_access ( 'access private content' , $account )) {
$grants [ 'example' ] = array ( 1 );
}
2010-01-04 20:34:28 +00:00
$grants [ 'example_owner' ] = array ( $account -> uid );
2008-11-25 02:37:33 +00:00
return $grants ;
}
/**
* Set permissions for a node to be written to the database .
*
2009-10-24 11:49:52 +00:00
* When a node is saved , a module implementing hook_node_access_records () will
* be asked if it is interested in the access permissions for a node . If it is
* interested , it must respond with an array of permissions arrays for that
2008-11-25 02:37:33 +00:00
* node .
*
2010-09-29 14:08:54 +00:00
* Node access grants apply regardless of the published or unpublished status
* of the node . Implementations must make sure not to grant access to
* unpublished nodes if they don ' t want to change the standard access control
* behavior . Your module may need to create a separate access realm to handle
* access to unpublished nodes .
*
2010-02-05 22:24:12 +00:00
* Note that the grant values in the return value from your hook must be
* integers and not boolean TRUE and FALSE .
*
2009-10-24 11:49:52 +00:00
* Each permissions item in the array is an array with the following elements :
* - 'realm' : The name of a realm that the module has defined in
* hook_node_grants () .
* - 'gid' : A 'grant ID' from hook_node_grants () .
2010-02-05 22:24:12 +00:00
* - 'grant_view' : If set to 1 a user that has been identified as a member
2010-09-29 14:08:54 +00:00
* of this gid within this realm can view this node . This should usually be
* set to $node -> status . Failure to do so may expose unpublished content
* to some users .
2010-02-05 22:24:12 +00:00
* - 'grant_update' : If set to 1 a user that has been identified as a member
2009-10-24 11:49:52 +00:00
* of this gid within this realm can edit this node .
2010-02-05 22:24:12 +00:00
* - 'grant_delete' : If set to 1 a user that has been identified as a member
2009-10-24 11:49:52 +00:00
* of this gid within this realm can delete this node .
2008-11-25 02:37:33 +00:00
*
2010-09-29 14:08:54 +00:00
*
* When an implementation is interested in a node but want to deny access to
* everyone , it may return a " deny all " grant :
*
* @ code
* $grants [] = array (
* 'realm' => 'all' ,
* 'gid' => 0 ,
* 'grant_view' => 0 ,
* 'grant_update' => 0 ,
* 'grant_delete' => 0 ,
* 'priority' => 1 ,
* );
* @ endcode
*
* Setting the priority should cancel out other grants . In the case of a
* conflict between modules , it is safer to use hook_node_access_records_alter ()
* to return only the deny grant .
*
* Note : a deny all grant is not written to the database ; denies are implicit .
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2010-09-29 14:08:54 +00:00
* The node that has just been saved .
*
* @ return
* An array of grants as defined above .
*
2011-11-28 11:44:25 +00:00
* @ see _node_access_write_grants ()
2008-11-25 02:37:33 +00:00
* @ ingroup node_access
*/
2012-04-26 16:44:37 +00:00
function hook_node_access_records ( Drupal\node\Node $node ) {
2009-01-27 00:22:27 +00:00
// We only care about the node if it has been marked private. If not, it is
2008-11-25 02:37:33 +00:00
// treated just like any other node and we completely ignore it.
if ( $node -> private ) {
$grants = array ();
2010-09-29 14:08:54 +00:00
// Only published nodes should be viewable to all users. If we allow access
// blindly here, then all users could view an unpublished node.
if ( $node -> status ) {
$grants [] = array (
'realm' => 'example' ,
'gid' => 1 ,
'grant_view' => 1 ,
'grant_update' => 0 ,
'grant_delete' => 0 ,
);
}
2008-11-25 02:37:33 +00:00
// For the example_author array, the GID is equivalent to a UID, which
2010-09-29 14:08:54 +00:00
// means there are many groups of just 1 user.
// Note that an author can always view his or her nodes, even if they
// have status unpublished.
2008-11-25 02:37:33 +00:00
$grants [] = array (
'realm' => 'example_author' ,
'gid' => $node -> uid ,
2010-02-05 22:24:12 +00:00
'grant_view' => 1 ,
'grant_update' => 1 ,
'grant_delete' => 1 ,
2008-11-25 02:37:33 +00:00
);
2010-09-29 14:08:54 +00:00
2008-11-25 02:37:33 +00:00
return $grants ;
}
}
2009-05-27 02:01:54 +00:00
/**
* Alter permissions for a node before it is written to the database .
*
* Node access modules establish rules for user access to content . Node access
* records are stored in the { node_access } table and define which permissions
* are required to access a node . This hook is invoked after node access modules
* returned their requirements via hook_node_access_records (); doing so allows
* modules to modify the $grants array by reference before it is stored , so
* custom or advanced business logic can be applied .
*
* Upon viewing , editing or deleting a node , hook_node_grants () builds a
* permissions array that is compared against the stored access records . The
* user must have one or more matching permissions in order to complete the
* requested operation .
*
2010-09-29 14:08:54 +00:00
* A module may deny all access to a node by setting $grants to an empty array .
*
2011-05-08 19:50:38 +00:00
* @ param $grants
2009-05-27 02:01:54 +00:00
* The $grants array returned by hook_node_access_records () .
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2009-05-27 02:01:54 +00:00
* The node for which the grants were acquired .
*
* The preferred use of this hook is in a module that bridges multiple node
2010-01-13 06:10:43 +00:00
* access modules with a configurable behavior , as shown in the example with the
* 'is_preview' field .
2009-05-27 02:01:54 +00:00
*
2011-11-28 11:44:25 +00:00
* @ see hook_node_access_records ()
* @ see hook_node_grants ()
* @ see hook_node_grants_alter ()
2009-05-27 02:01:54 +00:00
* @ ingroup node_access
*/
2012-04-26 16:44:37 +00:00
function hook_node_access_records_alter ( & $grants , Drupal\node\Node $node ) {
2010-01-13 06:10:43 +00:00
// Our module allows editors to mark specific articles with the 'is_preview'
// field. If the node being saved has a TRUE value for that field, then only
// our grants are retained, and other grants are removed. Doing so ensures
// that our rules are enforced no matter what priority other grants are given.
if ( $node -> is_preview ) {
// Our module grants are set in $grants['example'].
$temp = $grants [ 'example' ];
// Now remove all module grants but our own.
$grants = array ( 'example' => $temp );
2009-05-27 02:01:54 +00:00
}
}
/**
* Alter user access rules when trying to view , edit or delete a node .
*
* Node access modules establish rules for user access to content .
* hook_node_grants () defines permissions for a user to view , edit or
* delete nodes by building a $grants array that indicates the permissions
* assigned to the user by each node access module . This hook is called to allow
* modules to modify the $grants array by reference , so the interaction of
* multiple node access modules can be altered or advanced business logic can be
* applied .
*
* The resulting grants are then checked against the records stored in the
* { node_access } table to determine if the operation may be completed .
*
2010-09-29 14:08:54 +00:00
* A module may deny all access to a user by setting $grants to an empty array .
*
2011-11-28 11:44:25 +00:00
* Developers may use this hook to either add additional grants to a user
* or to remove existing grants . These rules are typically based on either the
* permissions assigned to a user role , or specific attributes of a user
* account .
2009-05-27 02:01:54 +00:00
*
2011-05-08 19:50:38 +00:00
* @ param $grants
2009-05-27 02:01:54 +00:00
* The $grants array returned by hook_node_grants () .
* @ param $account
* The user account requesting access to content .
* @ param $op
* The operation being performed , 'view' , 'update' or 'delete' .
*
2011-11-28 11:44:25 +00:00
* @ see hook_node_grants ()
* @ see hook_node_access_records ()
* @ see hook_node_access_records_alter ()
2009-05-27 02:01:54 +00:00
* @ ingroup node_access
*/
function hook_node_grants_alter ( & $grants , $account , $op ) {
// Our sample module never allows certain roles to edit or delete
// content. Since some other node access modules might allow this
// permission, we expressly remove it by returning an empty $grants
// array for roles specified in our variable setting.
// Get our list of banned roles.
$restricted = variable_get ( 'example_restricted_roles' , array ());
2009-06-12 08:39:40 +00:00
2009-05-27 02:01:54 +00:00
if ( $op != 'view' && ! empty ( $restricted )) {
// Now check the roles for this account against the restrictions.
foreach ( $restricted as $role_id ) {
2012-03-06 18:31:38 +00:00
if ( isset ( $account -> roles [ $role_id ])) {
2009-05-27 02:01:54 +00:00
$grants = array ();
}
}
}
}
2008-11-25 02:37:33 +00:00
/**
* Add mass node operations .
*
2009-11-15 02:11:51 +00:00
* This hook enables modules to inject custom operations into the mass
* operations dropdown found at admin / content , by associating a callback
* function with the operation , which is called when the form is submitted . The
* callback function receives one initial argument , which is an array of the
* checked nodes .
2008-11-25 02:37:33 +00:00
*
* @ return
* An array of operations . Each operation is an associative array that may
* contain the following key - value pairs :
2009-11-15 02:11:51 +00:00
* - 'label' : Required . The label for the operation , displayed in the dropdown
* menu .
* - 'callback' : Required . The function to call for the operation .
* - 'callback arguments' : Optional . An array of additional arguments to pass
* to the callback function .
2008-11-25 02:37:33 +00:00
*/
function hook_node_operations () {
$operations = array (
2010-01-13 23:30:43 +00:00
'publish' => array (
'label' => t ( 'Publish selected content' ),
'callback' => 'node_mass_update' ,
'callback arguments' => array ( 'updates' => array ( 'status' => NODE_PUBLISHED )),
2008-11-25 02:37:33 +00:00
),
2010-01-13 23:30:43 +00:00
'unpublish' => array (
'label' => t ( 'Unpublish selected content' ),
'callback' => 'node_mass_update' ,
'callback arguments' => array ( 'updates' => array ( 'status' => NODE_NOT_PUBLISHED )),
2008-11-25 02:37:33 +00:00
),
2010-01-13 23:30:43 +00:00
'promote' => array (
'label' => t ( 'Promote selected content to front page' ),
'callback' => 'node_mass_update' ,
'callback arguments' => array ( 'updates' => array ( 'status' => NODE_PUBLISHED , 'promote' => NODE_PROMOTED )),
2008-11-25 02:37:33 +00:00
),
'demote' => array (
2010-01-13 23:30:43 +00:00
'label' => t ( 'Demote selected content from front page' ),
'callback' => 'node_mass_update' ,
'callback arguments' => array ( 'updates' => array ( 'promote' => NODE_NOT_PROMOTED )),
2008-11-25 02:37:33 +00:00
),
2010-01-13 23:30:43 +00:00
'sticky' => array (
'label' => t ( 'Make selected content sticky' ),
'callback' => 'node_mass_update' ,
'callback arguments' => array ( 'updates' => array ( 'status' => NODE_PUBLISHED , 'sticky' => NODE_STICKY )),
),
'unsticky' => array (
'label' => t ( 'Make selected content not sticky' ),
'callback' => 'node_mass_update' ,
'callback arguments' => array ( 'updates' => array ( 'sticky' => NODE_NOT_STICKY )),
2008-11-25 02:37:33 +00:00
),
'delete' => array (
2010-01-13 23:30:43 +00:00
'label' => t ( 'Delete selected content' ),
'callback' => NULL ,
2008-11-25 02:37:33 +00:00
),
);
return $operations ;
}
2008-12-09 11:30:25 +00:00
/**
2011-12-17 12:43:37 +00:00
* Act before node deletion .
2009-11-15 02:11:51 +00:00
*
2011-05-14 16:51:34 +00:00
* This hook is invoked from node_delete_multiple () after the type - specific
2011-12-17 12:43:37 +00:00
* hook_delete () has been invoked , but before hook_entity_predelete () and
2011-05-14 16:51:34 +00:00
* field_attach_delete () are called , and before the node is removed from the
* node table in the database .
2008-12-09 11:30:25 +00:00
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2011-12-17 12:43:37 +00:00
* The node that is about to be deleted .
2010-02-10 10:34:50 +00:00
*
2011-12-17 12:43:37 +00:00
* @ see hook_node_predelete ()
* @ see node_delete_multiple ()
2010-02-10 10:34:50 +00:00
* @ ingroup node_api_hooks
2008-12-09 11:30:25 +00:00
*/
2012-04-26 16:44:37 +00:00
function hook_node_predelete ( Drupal\node\Node $node ) {
2009-04-25 16:33:48 +00:00
db_delete ( 'mytable' )
-> condition ( 'nid' , $node -> nid )
-> execute ();
2008-12-09 11:30:25 +00:00
}
2011-12-17 12:43:37 +00:00
/**
* Respond to node deletion .
*
* This hook is invoked from node_delete_multiple () after field_attach_delete ()
* has been called and after the node has been removed from the database .
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2011-12-17 12:43:37 +00:00
* The node that has been deleted .
*
* @ see hook_node_predelete ()
* @ see node_delete_multiple ()
* @ ingroup node_api_hooks
*/
2012-04-26 16:44:37 +00:00
function hook_node_delete ( Drupal\node\Node $node ) {
2011-12-17 12:43:37 +00:00
drupal_set_message ( t ( 'Node: @title has been deleted' , array ( '@title' => $node -> title )));
}
2008-12-09 11:30:25 +00:00
/**
2009-11-15 02:11:51 +00:00
* Respond to deletion of a node revision .
2008-12-09 11:30:25 +00:00
*
2009-11-15 02:11:51 +00:00
* This hook is invoked from node_revision_delete () after the revision has been
* removed from the node_revision table , and before
* field_attach_delete_revision () is called .
2008-12-09 11:30:25 +00:00
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2009-11-15 02:11:51 +00:00
* The node revision ( node object ) that is being deleted .
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2008-12-09 11:30:25 +00:00
*/
2012-04-26 16:44:37 +00:00
function hook_node_revision_delete ( Drupal\node\Node $node ) {
2010-08-22 13:52:59 +00:00
db_delete ( 'mytable' )
-> condition ( 'vid' , $node -> vid )
-> execute ();
2008-12-09 11:30:25 +00:00
}
/**
2009-11-15 02:11:51 +00:00
* Respond to creation of a new node .
2009-03-08 22:01:36 +00:00
*
2009-11-15 02:11:51 +00:00
* This hook is invoked from node_save () after the node is inserted into the
* node table in the database , after the type - specific hook_insert () is invoked ,
* and after field_attach_insert () is called .
2008-12-09 11:30:25 +00:00
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2009-11-15 02:11:51 +00:00
* The node that is being created .
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2008-12-09 11:30:25 +00:00
*/
2012-04-26 16:44:37 +00:00
function hook_node_insert ( Drupal\node\Node $node ) {
2009-04-25 16:33:48 +00:00
db_insert ( 'mytable' )
-> fields ( array (
'nid' => $node -> nid ,
'extra' => $node -> extra ,
))
-> execute ();
2008-12-09 11:30:25 +00:00
}
2008-12-05 22:18:46 +00:00
/**
2009-12-01 19:00:18 +00:00
* Act on nodes being loaded from the database .
*
* This hook is invoked during node loading , which is handled by entity_load (),
2012-06-08 13:04:22 +00:00
* via classes NodeController and Drupal\entity\DatabaseStorageController .
2012-05-16 03:38:40 +00:00
* After the node information is read from the database or the entity cache ,
* hook_load () is invoked on the node ' s content type module , then
* field_attach_node_revision () or field_attach_load () is called , then
* hook_entity_load () is invoked on all implementing modules , and finally
* hook_node_load () is invoked on all implementing modules .
2009-12-01 19:00:18 +00:00
*
* This hook should only be used to add information that is not in the node or
* node revisions table , not to replace information that is in these tables
* ( which could interfere with the entity cache ) . For performance reasons ,
* information for all available nodes should be loaded in a single query where
* possible .
*
* The $types parameter allows for your module to have an early return ( for
* efficiency ) if your module only supports certain node types . However , if your
* module defines a content type , you can use hook_load () to respond to loading
* of just that content type .
2008-12-05 22:18:46 +00:00
*
* @ param $nodes
2009-12-01 19:00:18 +00:00
* An array of the nodes being loaded , keyed by nid .
2008-12-05 22:18:46 +00:00
* @ param $types
* An array containing the types of the nodes .
2009-12-01 19:00:18 +00:00
*
* For a detailed usage example , see nodeapi_example . module .
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2008-12-05 22:18:46 +00:00
*/
2009-03-08 04:25:07 +00:00
function hook_node_load ( $nodes , $types ) {
2008-12-29 16:03:57 +00:00
$result = db_query ( 'SELECT nid, foo FROM {mytable} WHERE nid IN(:nids)' , array ( ':nids' => array_keys ( $nodes )));
2008-12-05 22:18:46 +00:00
foreach ( $result as $record ) {
$nodes [ $record -> nid ] -> foo = $record -> foo ;
}
}
2009-08-20 09:47:04 +00:00
/**
2011-11-28 11:44:25 +00:00
* Controls access to a node .
2009-08-20 09:47:04 +00:00
*
* Modules may implement this hook if they want to have a say in whether or not
* a given user has access to perform a given operation on a node .
*
* The administrative account ( user ID #1) always passes any access check,
* so this hook is not called in that case . Users with the " bypass node access "
* permission may always view and edit content through the administrative
* interface .
*
* Note that not all modules will want to influence access on all
* node types . If your module does not want to actively grant or
* block access , return NODE_ACCESS_IGNORE or simply return nothing .
* Blindly returning FALSE will break other node access modules .
*
2011-12-28 05:44:49 +00:00
* Also note that this function isn ' t called for node listings ( e . g . , RSS feeds ,
* the default home page at path 'node' , a recent content block , etc . ) See
* @ link node_access Node access rights @ endlink for a full explanation .
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node | string $node
* Either a node entity or the machine name of the content type on which to
2011-10-17 16:10:06 +00:00
* perform the access check .
2011-10-16 08:50:06 +00:00
* @ param string $op
2009-08-20 09:47:04 +00:00
* The operation to be performed . Possible values :
* - " create "
* - " delete "
* - " update "
* - " view "
2011-10-16 08:50:06 +00:00
* @ param object $account
2011-10-20 06:56:11 +00:00
* The user object to perform the access check operation on .
2009-11-15 02:11:51 +00:00
*
2011-10-16 08:50:06 +00:00
* @ return integer
2011-11-11 12:20:17 +00:00
* - NODE_ACCESS_ALLOW : if the operation is to be allowed .
* - NODE_ACCESS_DENY : if the operation is to be denied .
* - NODE_ACCESS_IGNORE : to not affect this operation at all .
2011-10-16 08:50:06 +00:00
*
* @ ingroup node_access
2009-08-20 09:47:04 +00:00
*/
function hook_node_access ( $node , $op , $account ) {
2009-11-01 12:11:10 +00:00
$type = is_string ( $node ) ? $node : $node -> type ;
2009-08-20 09:47:04 +00:00
2012-05-08 05:12:18 +00:00
$configured_types = node_permissions_get_configured_types ();
if ( isset ( $configured_types [ $type ])) {
2009-08-20 09:47:04 +00:00
if ( $op == 'create' && user_access ( 'create ' . $type . ' content' , $account )) {
return NODE_ACCESS_ALLOW ;
}
if ( $op == 'update' ) {
if ( user_access ( 'edit any ' . $type . ' content' , $account ) || ( user_access ( 'edit own ' . $type . ' content' , $account ) && ( $account -> uid == $node -> uid ))) {
return NODE_ACCESS_ALLOW ;
}
}
if ( $op == 'delete' ) {
if ( user_access ( 'delete any ' . $type . ' content' , $account ) || ( user_access ( 'delete own ' . $type . ' content' , $account ) && ( $account -> uid == $node -> uid ))) {
return NODE_ACCESS_ALLOW ;
}
}
}
// Returning nothing from this function would have the same effect.
return NODE_ACCESS_IGNORE ;
}
2008-11-25 02:37:33 +00:00
/**
2009-11-15 02:11:51 +00:00
* Act on a node object about to be shown on the add / edit form .
*
* This hook is invoked from node_object_prepare () after the type - specific
* hook_prepare () is invoked .
2008-11-25 02:37:33 +00:00
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2009-11-15 02:11:51 +00:00
* The node that is about to be shown on the add / edit form .
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2008-12-09 11:30:25 +00:00
*/
2012-04-26 16:44:37 +00:00
function hook_node_prepare ( Drupal\node\Node $node ) {
2008-12-09 11:30:25 +00:00
if ( ! isset ( $node -> comment )) {
2009-03-17 12:41:54 +00:00
$node -> comment = variable_get ( " comment_ $node->type " , COMMENT_NODE_OPEN );
2008-12-09 11:30:25 +00:00
}
}
/**
2009-11-15 02:11:51 +00:00
* Act on a node being displayed as a search result .
2008-12-09 11:30:25 +00:00
*
2009-11-15 02:11:51 +00:00
* This hook is invoked from node_search_execute (), after node_load ()
2009-12-21 13:47:32 +00:00
* and node_view () have been called .
2008-12-09 11:30:25 +00:00
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2009-11-15 02:11:51 +00:00
* The node being displayed in a search result .
*
2011-06-27 06:11:44 +00:00
* @ return array
* Extra information to be displayed with search result . This information
* should be presented as an associative array . It will be concatenated
* with the post information ( last updated , author ) in the default search
* result theming .
*
* @ see template_preprocess_search_result ()
* @ see search - result . tpl . php
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2008-12-09 11:30:25 +00:00
*/
2012-04-26 16:44:37 +00:00
function hook_node_search_result ( Drupal\node\Node $node ) {
2008-12-09 11:30:25 +00:00
$comments = db_query ( 'SELECT comment_count FROM {node_comment_statistics} WHERE nid = :nid' , array ( 'nid' => $node -> nid )) -> fetchField ();
2011-06-27 06:11:44 +00:00
return array ( 'comment' => format_plural ( $comments , '1 comment' , '@count comments' ));
2008-12-09 11:30:25 +00:00
}
/**
2009-11-15 02:11:51 +00:00
* Act on a node being inserted or updated .
2008-12-09 11:30:25 +00:00
*
2009-11-15 02:11:51 +00:00
* This hook is invoked from node_save () before the node is saved to the
* database .
2008-12-09 11:30:25 +00:00
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2009-11-15 02:11:51 +00:00
* The node that is being inserted or updated .
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2008-12-09 11:30:25 +00:00
*/
2012-04-26 16:44:37 +00:00
function hook_node_presave ( Drupal\node\Node $node ) {
2008-12-09 11:30:25 +00:00
if ( $node -> nid && $node -> moderate ) {
// Reset votes when node is updated:
$node -> score = 0 ;
$node -> users = '' ;
$node -> votes = 0 ;
}
}
/**
2009-11-15 02:11:51 +00:00
* Respond to updates to a node .
*
* This hook is invoked from node_save () after the node is updated in the node
* table in the database , after the type - specific hook_update () is invoked , and
* after field_attach_update () is called .
2008-12-09 11:30:25 +00:00
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2009-11-15 02:11:51 +00:00
* The node that is being updated .
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2008-12-09 11:30:25 +00:00
*/
2012-04-26 16:44:37 +00:00
function hook_node_update ( Drupal\node\Node $node ) {
2009-04-25 16:33:48 +00:00
db_update ( 'mytable' )
-> fields ( array ( 'extra' => $node -> extra ))
-> condition ( 'nid' , $node -> nid )
-> execute ();
2008-12-09 11:30:25 +00:00
}
/**
2009-11-15 02:11:51 +00:00
* Act on a node being indexed for searching .
2008-12-09 11:30:25 +00:00
*
2009-11-15 02:11:51 +00:00
* This hook is invoked during search indexing , after node_load (), and after
2009-12-21 13:47:32 +00:00
* the result of node_view () is added as $node -> rendered to the node object .
2008-12-09 11:30:25 +00:00
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2009-11-15 02:11:51 +00:00
* The node being indexed .
*
2012-03-13 19:08:05 +00:00
* @ return string
* Additional node information to be indexed .
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2008-12-09 11:30:25 +00:00
*/
2012-04-26 16:44:37 +00:00
function hook_node_update_index ( Drupal\node\Node $node ) {
2008-12-09 11:30:25 +00:00
$text = '' ;
$comments = db_query ( 'SELECT subject, comment, format FROM {comment} WHERE nid = :nid AND status = :status' , array ( ':nid' => $node -> nid , ':status' => COMMENT_PUBLISHED ));
foreach ( $comments as $comment ) {
2009-10-10 21:39:03 +00:00
$text .= '<h2>' . check_plain ( $comment -> subject ) . '</h2>' . check_markup ( $comment -> comment , $comment -> format , '' , TRUE );
2008-12-09 11:30:25 +00:00
}
return $text ;
}
/**
2009-11-15 02:11:51 +00:00
* Perform node validation before a node is created or updated .
*
* This hook is invoked from node_validate (), after a user has has finished
* editing the node and is previewing or submitting it . It is invoked at the
* end of all the standard validation steps , and after the type - specific
* hook_validate () is invoked .
2008-12-09 11:30:25 +00:00
*
2009-11-15 02:11:51 +00:00
* To indicate a validation error , use form_set_error () .
*
* Note : Changes made to the $node object within your hook implementation will
* have no effect . The preferred method to change a node ' s content is to use
* hook_node_presave () instead . If it is really necessary to change
* the node at the validate stage , you can use form_set_value () .
2008-12-09 11:30:25 +00:00
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2009-11-15 02:11:51 +00:00
* The node being validated .
2008-12-09 11:30:25 +00:00
* @ param $form
2009-11-15 02:11:51 +00:00
* The form being used to edit the node .
2010-09-03 19:56:51 +00:00
* @ param $form_state
* The form state array .
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2008-12-09 11:30:25 +00:00
*/
2012-04-26 16:44:37 +00:00
function hook_node_validate ( Drupal\node\Node $node , $form , & $form_state ) {
2008-12-09 11:30:25 +00:00
if ( isset ( $node -> end ) && isset ( $node -> start )) {
if ( $node -> start > $node -> end ) {
form_set_error ( 'time' , t ( 'An event may not end before it starts.' ));
}
}
}
2010-06-17 13:44:45 +00:00
/**
* Act on a node after validated form values have been copied to it .
*
* This hook is invoked when a node form is submitted with either the " Save " or
* " Preview " button , after form values have been copied to the form state ' s node
* object , but before the node is saved or previewed . It is a chance for modules
* to adjust the node ' s properties from what they are simply after a copy from
* $form_state [ 'values' ] . This hook is intended for adjusting non - field - related
* properties . See hook_field_attach_submit () for customizing field - related
* properties .
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
* The node entity being updated in response to a form submission .
2010-06-17 13:44:45 +00:00
* @ param $form
* The form being used to edit the node .
* @ param $form_state
* The form state array .
*
* @ ingroup node_api_hooks
*/
2012-04-26 16:44:37 +00:00
function hook_node_submit ( Drupal\node\Node $node , $form , & $form_state ) {
2010-06-17 13:44:45 +00:00
// Decompose the selected menu parent option into 'menu_name' and 'plid', if
// the form used the default parent selection widget.
if ( ! empty ( $form_state [ 'values' ][ 'menu' ][ 'parent' ])) {
list ( $node -> menu [ 'menu_name' ], $node -> menu [ 'plid' ]) = explode ( ':' , $form_state [ 'values' ][ 'menu' ][ 'parent' ]);
}
}
2008-12-09 11:30:25 +00:00
/**
2009-11-15 02:11:51 +00:00
* Act on a node that is being assembled before rendering .
2008-12-09 11:30:25 +00:00
*
2009-05-03 10:11:35 +00:00
* The module may add elements to $node -> content prior to rendering . This hook
* will be called after hook_view () . The structure of $node -> content is a
* renderable array as expected by drupal_render () .
*
2009-12-26 16:50:09 +00:00
* When $view_mode is 'rss' , modules can also add extra RSS elements and
2009-06-22 09:10:07 +00:00
* namespaces to $node -> rss_elements and $node -> rss_namespaces respectively for
* the RSS item generated for this node .
2010-03-26 17:14:46 +00:00
* For details on how this is used , see node_feed () .
2009-05-03 10:11:35 +00:00
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2009-11-15 02:11:51 +00:00
* The node that is being assembled for rendering .
2009-12-26 16:50:09 +00:00
* @ param $view_mode
* The $view_mode parameter from node_view () .
2010-10-03 01:15:34 +00:00
* @ param $langcode
* The language code used for rendering .
2010-02-10 10:34:50 +00:00
*
2011-11-28 11:44:25 +00:00
* @ see forum_node_view ()
* @ see comment_node_view ()
2010-10-23 15:30:34 +00:00
* @ see hook_entity_view ()
*
2010-02-10 10:34:50 +00:00
* @ ingroup node_api_hooks
2008-12-09 11:30:25 +00:00
*/
2012-04-26 16:44:37 +00:00
function hook_node_view ( Drupal\node\Node $node , $view_mode , $langcode ) {
2008-12-09 11:30:25 +00:00
$node -> content [ 'my_additional_field' ] = array (
2010-01-19 04:53:45 +00:00
'#markup' => $additional_field ,
2008-12-09 11:30:25 +00:00
'#weight' => 10 ,
2008-12-31 12:02:24 +00:00
'#theme' => 'mymodule_my_additional_field' ,
2008-12-09 11:30:25 +00:00
);
2008-11-25 02:37:33 +00:00
}
2009-05-10 20:41:17 +00:00
/**
2009-12-21 13:47:32 +00:00
* Alter the results of node_view () .
2009-05-10 20:41:17 +00:00
*
2009-11-15 02:11:51 +00:00
* This hook is called after the content has been assembled in a structured
* array and may be used for doing processing which requires that the complete
* node content structure has been built .
2009-05-10 20:41:17 +00:00
*
* If the module wishes to act on the rendered HTML of the node rather than the
2009-11-15 02:11:51 +00:00
* structured content array , it may use this hook to add a #post_render
2012-05-04 19:53:43 +00:00
* callback . Alternatively , it could also implement hook_preprocess_HOOK () for
* node . tpl . php . See drupal_render () and theme () documentation respectively
* for details .
2009-05-10 20:41:17 +00:00
*
2009-11-07 13:35:21 +00:00
* @ param $build
* A renderable array representing the node content .
2012-06-15 16:43:34 +00:00
* @ param Drupal\node\Node $node
* The node being rendered .
2009-11-07 13:35:21 +00:00
*
2009-12-21 13:47:32 +00:00
* @ see node_view ()
2010-10-23 15:30:34 +00:00
* @ see hook_entity_view_alter ()
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2009-05-10 20:41:17 +00:00
*/
2012-06-15 16:43:34 +00:00
function hook_node_view_alter ( & $build , Drupal\node\Node $node ) {
2009-12-26 16:50:09 +00:00
if ( $build [ '#view_mode' ] == 'full' && isset ( $build [ 'an_additional_field' ])) {
2009-05-10 20:41:17 +00:00
// Change its weight.
2009-11-07 13:35:21 +00:00
$build [ 'an_additional_field' ][ '#weight' ] = - 10 ;
2009-05-12 23:19:13 +00:00
}
2009-05-10 20:41:17 +00:00
// Add a #post_render callback to act on the rendered HTML of the node.
2009-11-07 13:35:21 +00:00
$build [ '#post_render' ][] = 'my_module_node_post_render' ;
2009-05-10 20:41:17 +00:00
}
2008-11-25 02:37:33 +00:00
/**
2009-11-15 02:11:51 +00:00
* Define module - provided node types .
2008-11-25 02:37:33 +00:00
*
2009-08-27 07:22:15 +00:00
* This hook allows a module to define one or more of its own node types . For
2011-08-29 13:08:58 +00:00
* example , the forum module uses it to define a forum node - type named " Forum
* topic . " The name and attributes of each desired node type are specified in
2009-08-27 07:22:15 +00:00
* an array returned by the hook .
2009-10-22 00:47:09 +00:00
*
2008-11-25 02:37:33 +00:00
* Only module - provided node types should be defined through this hook . User -
* provided ( or 'custom' ) node types should be defined only in the 'node_type'
* database table , and should be maintained by using the node_type_save () and
* node_type_delete () functions .
*
* @ return
2009-08-27 07:22:15 +00:00
* An array of information defining the module ' s node types . The array
2011-10-20 06:56:11 +00:00
* contains a sub - array for each node type , with the the machine name of a
* content type as the key . Each sub - array has up to 10 attributes .
* Possible attributes :
2008-11-25 02:37:33 +00:00
* - " name " : the human - readable name of the node type . Required .
2009-08-27 07:22:15 +00:00
* - " base " : the base string used to construct callbacks corresponding to
* this node type .
* ( i . e . if base is defined as example_foo , then example_foo_insert will
2008-11-25 02:37:33 +00:00
* be called when inserting a node of that type ) . This string is usually
2009-08-27 07:22:15 +00:00
* the name of the module , but not always . Required .
2008-11-25 02:37:33 +00:00
* - " description " : a brief description of the node type . Required .
2009-08-27 07:22:15 +00:00
* - " help " : help information shown to the user when creating a node of
* this type .. Optional ( defaults to '' ) .
2008-11-25 02:37:33 +00:00
* - " has_title " : boolean indicating whether or not this node type has a title
* field . Optional ( defaults to TRUE ) .
* - " title_label " : the label for the title field of this content type .
* Optional ( defaults to 'Title' ) .
2009-08-27 07:22:15 +00:00
* - " locked " : boolean indicating whether the administrator can change the
2010-01-25 10:38:35 +00:00
* machine name of this type . FALSE = changeable ( not locked ),
* TRUE = unchangeable ( locked ) . Optional ( defaults to TRUE ) .
2008-11-25 02:37:33 +00:00
*
2011-10-20 06:56:11 +00:00
* The machine name of a node type should contain only letters , numbers , and
* underscores . Underscores will be converted into hyphens for the purpose of
* constructing URLs .
2008-11-25 02:37:33 +00:00
*
* All attributes of a node type that are defined through this hook ( except for
* 'locked' ) can be edited by a site administrator . This includes the
* machine - readable name of a node type , if 'locked' is set to FALSE .
*
2010-02-10 10:34:50 +00:00
* @ ingroup node_api_hooks
2008-11-25 02:37:33 +00:00
*/
function hook_node_info () {
return array (
2011-08-29 13:08:58 +00:00
'forum' => array (
'name' => t ( 'Forum topic' ),
'base' => 'forum' ,
'description' => t ( 'A <em>forum topic</em> starts a new discussion thread within a forum.' ),
'title_label' => t ( 'Subject' ),
2008-11-25 02:37:33 +00:00
)
);
}
2009-08-05 14:58:40 +00:00
/**
* Provide additional methods of scoring for core search results for nodes .
*
* A node ' s search score is used to rank it among other nodes matched by the
* search , with the highest - ranked nodes appearing first in the search listing .
*
* For example , a module allowing users to vote on content could expose an
* option to allow search results ' rankings to be influenced by the average
* voting score of a node .
*
* All scoring mechanisms are provided as options to site administrators , and
* may be tweaked based on individual sites or disabled altogether if they do
* not make sense . Individual scoring mechanisms , if enabled , are assigned a
* weight from 1 to 10. The weight represents the factor of magnification of
* the ranking mechanism , with higher - weighted ranking mechanisms having more
* influence . In order for the weight system to work , each scoring mechanism
* must return a value between 0 and 1 for every node . That value is then
* multiplied by the administrator - assigned weight for the ranking mechanism ,
* and then the weighted scores from all ranking mechanisms are added , which
* brings about the same result as a weighted average .
*
* @ return
* An associative array of ranking data . The keys should be strings ,
* corresponding to the internal name of the ranking mechanism , such as
* 'recent' , or 'comments' . The values should be arrays themselves , with the
* following keys available :
* - " title " : the human readable name of the ranking mechanism . Required .
* - " join " : part of a query string to join to any additional necessary
* table . This is not necessary if the table required is already joined to
* by the base query , such as for the { node } table . Other tables should use
* the full table name as an alias to avoid naming collisions . Optional .
* - " score " : part of a query string to calculate the score for the ranking
* mechanism based on values in the database . This does not need to be
* wrapped in parentheses , as it will be done automatically ; it also does
* not need to take the weighted system into account , as it will be done
* automatically . It does , however , need to calculate a decimal between
* 0 and 1 ; be careful not to cast the entire score to an integer by
2010-01-25 10:38:35 +00:00
* inadvertently introducing a variable argument . Required .
2009-08-05 14:58:40 +00:00
* - " arguments " : if any arguments are required for the score , they can be
* specified in an array here .
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2009-08-05 14:58:40 +00:00
*/
function hook_ranking () {
// If voting is disabled, we can avoid returning the array, no hard feelings.
if ( variable_get ( 'vote_node_enabled' , TRUE )) {
return array (
'vote_average' => array (
'title' => t ( 'Average vote' ),
// Note that we use i.sid, the search index's search item id, rather than
// n.nid.
'join' => 'LEFT JOIN {vote_node_data} vote_node_data ON vote_node_data.nid = i.sid' ,
// The highest possible score should be 1, and the lowest possible score,
// always 0, should be 0.
'score' => 'vote_node_data.average / CAST(%f AS DECIMAL)' ,
// Pass in the highest possible voting score as a decimal argument.
'arguments' => array ( variable_get ( 'vote_score_max' , 5 )),
),
);
}
}
2009-08-11 15:50:56 +00:00
/**
2009-11-15 02:11:51 +00:00
* Respond to node type creation .
2009-08-11 15:50:56 +00:00
*
2009-11-15 02:11:51 +00:00
* This hook is invoked from node_type_save () after the node type is added
* to the database .
2009-08-11 15:50:56 +00:00
*
* @ param $info
2009-11-15 02:11:51 +00:00
* The node type object that is being created .
2009-08-11 15:50:56 +00:00
*/
function hook_node_type_insert ( $info ) {
2012-01-27 17:10:57 +00:00
drupal_set_message ( t ( 'You have just created a content type with a machine name %type.' , array ( '%type' => $info -> type )));
2009-08-11 15:50:56 +00:00
}
2008-11-25 02:37:33 +00:00
/**
2009-11-15 02:11:51 +00:00
* Respond to node type updates .
2008-11-25 02:37:33 +00:00
*
2009-11-15 02:11:51 +00:00
* This hook is invoked from node_type_save () after the node type is updated
* in the database .
2008-11-25 02:37:33 +00:00
*
* @ param $info
2009-11-15 02:11:51 +00:00
* The node type object that is being updated .
2008-11-25 02:37:33 +00:00
*/
2009-08-11 15:50:56 +00:00
function hook_node_type_update ( $info ) {
if ( ! empty ( $info -> old_type ) && $info -> old_type != $info -> type ) {
$setting = variable_get ( 'comment_' . $info -> old_type , COMMENT_NODE_OPEN );
variable_del ( 'comment_' . $info -> old_type );
variable_set ( 'comment_' . $info -> type , $setting );
2008-11-25 02:37:33 +00:00
}
}
2009-08-11 15:50:56 +00:00
/**
2009-11-15 02:11:51 +00:00
* Respond to node type deletion .
2009-08-11 15:50:56 +00:00
*
2009-11-15 02:11:51 +00:00
* This hook is invoked from node_type_delete () after the node type is removed
* from the database .
2009-08-11 15:50:56 +00:00
*
* @ param $info
2009-11-15 02:11:51 +00:00
* The node type object that is being deleted .
2009-08-11 15:50:56 +00:00
*/
function hook_node_type_delete ( $info ) {
variable_del ( 'comment_' . $info -> type );
}
2008-11-25 02:37:33 +00:00
/**
* Respond to node deletion .
*
2009-11-15 02:11:51 +00:00
* This hook is invoked only on the module that defines the node ' s content type
* ( use hook_node_delete () to respond to all node deletions ) .
2008-11-25 02:37:33 +00:00
*
2009-11-15 02:11:51 +00:00
* This hook is invoked from node_delete_multiple () after the node has been
* removed from the node table in the database , before hook_node_delete () is
* invoked , and before field_attach_delete () is called .
2008-11-25 02:37:33 +00:00
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2009-11-15 02:11:51 +00:00
* The node that is being deleted .
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2008-11-25 02:37:33 +00:00
*/
2012-04-26 16:44:37 +00:00
function hook_delete ( Drupal\node\Node $node ) {
2009-04-25 16:33:48 +00:00
db_delete ( 'mytable' )
2011-07-03 17:50:29 +00:00
-> condition ( 'nid' , $node -> nid )
2009-04-25 16:33:48 +00:00
-> execute ();
2008-11-25 02:37:33 +00:00
}
/**
2009-11-15 02:11:51 +00:00
* Act on a node object about to be shown on the add / edit form .
2008-11-25 02:37:33 +00:00
*
2009-11-15 02:11:51 +00:00
* This hook is invoked only on the module that defines the node ' s content type
* ( use hook_node_prepare () to act on all node preparations ) .
2008-11-25 02:37:33 +00:00
*
2009-11-15 02:11:51 +00:00
* This hook is invoked from node_object_prepare () before the general
* hook_node_prepare () is invoked .
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2009-11-15 02:11:51 +00:00
* The node that is about to be shown on the add / edit form .
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2008-11-25 02:37:33 +00:00
*/
2012-04-26 16:44:37 +00:00
function hook_prepare ( Drupal\node\Node $node ) {
2008-11-25 02:37:33 +00:00
if ( $file = file_check_upload ( $field_name )) {
$file = file_save_upload ( $field_name , _image_filename ( $file -> filename , NULL , TRUE ));
if ( $file ) {
2009-08-17 19:14:42 +00:00
if ( ! image_get_info ( $file -> uri )) {
2008-11-25 02:37:33 +00:00
form_set_error ( $field_name , t ( 'Uploaded file is not a valid image' ));
return ;
}
}
else {
return ;
}
2009-08-17 19:14:42 +00:00
$node -> images [ '_original' ] = $file -> uri ;
2009-05-24 05:21:56 +00:00
_image_build_derivatives ( $node , TRUE );
2008-11-25 02:37:33 +00:00
$node -> new_file = TRUE ;
}
}
/**
* Display a node editing form .
*
* This hook , implemented by node modules , is called to retrieve the form
2010-10-22 00:35:35 +00:00
* that is displayed to create or edit a node . This form is displayed at path
* node / add / [ node type ] or node / [ node ID ] / edit .
*
* The submit and preview buttons , administrative and display controls , and
* sections added by other modules ( such as path settings , menu settings ,
* comment settings , and fields managed by the Field UI module ) are
* displayed automatically by the node module . This hook just needs to
* return the node title and form editing fields specific to the node type .
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2008-11-25 02:37:33 +00:00
* The node being added or edited .
* @ param $form_state
2010-09-03 19:56:51 +00:00
* The form state array .
*
2008-11-25 02:37:33 +00:00
* @ return
2010-10-22 00:35:35 +00:00
* An array containing the title and any custom form elements to be displayed
* in the node editing form .
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2008-11-25 02:37:33 +00:00
*/
2012-04-26 16:44:37 +00:00
function hook_form ( Drupal\node\Node $node , & $form_state ) {
2012-05-08 05:12:18 +00:00
$type = node_type_load ( $node -> type );
2008-11-25 02:37:33 +00:00
2010-10-22 00:35:35 +00:00
$form [ 'title' ] = array (
'#type' => 'textfield' ,
'#title' => check_plain ( $type -> title_label ),
'#default_value' => ! empty ( $node -> title ) ? $node -> title : '' ,
'#required' => TRUE , '#weight' => - 5
);
2008-11-25 02:37:33 +00:00
$form [ 'field1' ] = array (
'#type' => 'textfield' ,
'#title' => t ( 'Custom field' ),
'#default_value' => $node -> field1 ,
'#maxlength' => 127 ,
);
$form [ 'selectbox' ] = array (
'#type' => 'select' ,
'#title' => t ( 'Select box' ),
'#default_value' => $node -> selectbox ,
'#options' => array (
1 => 'Option A' ,
2 => 'Option B' ,
3 => 'Option C' ,
),
2010-01-09 23:03:22 +00:00
'#description' => t ( 'Choose an option.' ),
2008-11-25 02:37:33 +00:00
);
return $form ;
}
/**
2009-11-15 02:11:51 +00:00
* Respond to creation of a new node .
2008-11-25 02:37:33 +00:00
*
2009-11-15 02:11:51 +00:00
* This hook is invoked only on the module that defines the node ' s content type
* ( use hook_node_insert () to act on all node insertions ) .
2008-11-25 02:37:33 +00:00
*
2009-11-15 02:11:51 +00:00
* This hook is invoked from node_save () after the node is inserted into the
* node table in the database , before field_attach_insert () is called , and
* before hook_node_insert () is invoked .
2008-11-25 02:37:33 +00:00
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2009-11-15 02:11:51 +00:00
* The node that is being created .
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2008-11-25 02:37:33 +00:00
*/
2012-04-26 16:44:37 +00:00
function hook_insert ( Drupal\node\Node $node ) {
2009-07-28 19:18:08 +00:00
db_insert ( 'mytable' )
-> fields ( array (
'nid' => $node -> nid ,
'extra' => $node -> extra ,
))
-> execute ();
2008-11-25 02:37:33 +00:00
}
/**
2009-12-01 19:00:18 +00:00
* Act on nodes being loaded from the database .
2008-11-25 02:37:33 +00:00
*
2009-12-01 19:00:18 +00:00
* This hook is invoked only on the module that defines the node ' s content type
* ( use hook_node_load () to respond to all node loads ) .
*
* This hook is invoked during node loading , which is handled by entity_load (),
2012-06-08 13:04:22 +00:00
* via classes NodeController and Drupal\entity\DatabaseStorageController .
2012-05-16 03:38:40 +00:00
* After the node information is read from the database or the entity cache ,
* hook_load () is invoked on the node ' s content type module , then
* field_attach_node_revision () or field_attach_load () is called , then
* hook_entity_load () is invoked on all implementing modules , and finally
* hook_node_load () is invoked on all implementing modules .
2009-12-01 19:00:18 +00:00
*
* This hook should only be used to add information that is not in the node or
* node revisions table , not to replace information that is in these tables
* ( which could interfere with the entity cache ) . For performance reasons ,
* information for all available nodes should be loaded in a single query where
* possible .
2008-11-25 02:37:33 +00:00
*
2008-12-05 22:18:46 +00:00
* @ param $nodes
2009-12-01 19:00:18 +00:00
* An array of the nodes being loaded , keyed by nid .
2008-11-25 02:37:33 +00:00
*
* For a detailed usage example , see node_example . module .
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2008-11-25 02:37:33 +00:00
*/
2008-12-05 22:18:46 +00:00
function hook_load ( $nodes ) {
2008-12-29 16:03:57 +00:00
$result = db_query ( 'SELECT nid, foo FROM {mytable} WHERE nid IN (:nids)' , array ( ':nids' => array_keys ( $nodes )));
2008-12-05 22:18:46 +00:00
foreach ( $result as $record ) {
$nodes [ $record -> nid ] -> foo = $record -> foo ;
}
2008-11-25 02:37:33 +00:00
}
/**
2009-11-15 02:11:51 +00:00
* Respond to updates to a node .
2008-11-25 02:37:33 +00:00
*
2009-11-15 02:11:51 +00:00
* This hook is invoked only on the module that defines the node ' s content type
* ( use hook_node_update () to act on all node updates ) .
2008-11-25 02:37:33 +00:00
*
2009-11-15 02:11:51 +00:00
* This hook is invoked from node_save () after the node is updated in the
* node table in the database , before field_attach_update () is called , and
* before hook_node_update () is invoked .
2008-11-25 02:37:33 +00:00
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2009-11-15 02:11:51 +00:00
* The node that is being updated .
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2008-11-25 02:37:33 +00:00
*/
2012-04-26 16:44:37 +00:00
function hook_update ( Drupal\node\Node $node ) {
2009-07-28 19:18:08 +00:00
db_update ( 'mytable' )
-> fields ( array ( 'extra' => $node -> extra ))
-> condition ( 'nid' , $node -> nid )
-> execute ();
2008-11-25 02:37:33 +00:00
}
/**
2009-11-15 02:11:51 +00:00
* Perform node validation before a node is created or updated .
2008-11-25 02:37:33 +00:00
*
2009-11-15 02:11:51 +00:00
* This hook is invoked only on the module that defines the node ' s content type
* ( use hook_node_validate () to act on all node validations ) .
2008-11-25 02:37:33 +00:00
*
2010-03-18 06:49:17 +00:00
* This hook is invoked from node_validate (), after a user has finished
2009-11-15 02:11:51 +00:00
* editing the node and is previewing or submitting it . It is invoked at the end
* of all the standard validation steps , and before hook_node_validate () is
* invoked .
2008-11-25 02:37:33 +00:00
*
2009-11-15 02:11:51 +00:00
* To indicate a validation error , use form_set_error () .
2008-11-25 02:37:33 +00:00
*
2009-11-15 02:11:51 +00:00
* Note : Changes made to the $node object within your hook implementation will
* have no effect . The preferred method to change a node ' s content is to use
2010-03-18 06:49:17 +00:00
* hook_node_presave () instead .
2008-11-25 02:37:33 +00:00
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2009-11-15 02:11:51 +00:00
* The node being validated .
* @ param $form
* The form being used to edit the node .
2010-09-03 19:56:51 +00:00
* @ param $form_state
* The form state array .
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2008-11-25 02:37:33 +00:00
*/
2012-04-26 16:44:37 +00:00
function hook_validate ( Drupal\node\Node $node , $form , & $form_state ) {
2008-11-25 02:37:33 +00:00
if ( isset ( $node -> end ) && isset ( $node -> start )) {
if ( $node -> start > $node -> end ) {
form_set_error ( 'time' , t ( 'An event may not end before it starts.' ));
}
}
}
/**
* Display a node .
*
2011-12-20 05:36:32 +00:00
* This hook is invoked only on the module that defines the node ' s content type
* ( use hook_node_view () to act on all node views ) .
*
* This hook is invoked during node viewing after the node is fully loaded ,
* so that the node type module can define a custom method for display , or
* add to the default display .
2008-11-25 02:37:33 +00:00
*
2012-04-26 16:44:37 +00:00
* @ param Drupal\node\Node $node
2009-07-28 10:38:12 +00:00
* The node to be displayed , as returned by node_load () .
2009-12-26 16:50:09 +00:00
* @ param $view_mode
* View mode , e . g . 'full' , 'teaser' , ...
2011-11-28 11:44:25 +00:00
*
2008-11-25 02:37:33 +00:00
* @ return
2011-11-28 11:44:25 +00:00
* The passed $node parameter should be modified as necessary and
2008-11-25 02:37:33 +00:00
* returned so it can be properly presented . Nodes are prepared for display
2009-08-20 09:47:04 +00:00
* by assembling a structured array , formatted as in the Form API , in
* $node -> content . As with Form API arrays , the #weight property can be
2009-07-28 10:38:12 +00:00
* used to control the relative positions of added elements . After this
2009-12-21 13:47:32 +00:00
* hook is invoked , node_view () calls field_attach_view () to add field
2009-08-20 09:47:04 +00:00
* views to $node -> content , and then invokes hook_node_view () and
2009-12-21 13:47:32 +00:00
* hook_node_view_alter (), so if you want to affect the final
2009-07-28 10:38:12 +00:00
* view of the node , you might consider implementing one of these hooks
* instead .
2008-11-25 02:37:33 +00:00
*
2010-02-10 10:34:50 +00:00
* @ ingroup node_api_hooks
2008-11-25 02:37:33 +00:00
*/
2012-04-26 16:44:37 +00:00
function hook_view ( Drupal\node\Node $node , $view_mode ) {
2010-08-17 16:20:08 +00:00
if ( $view_mode == 'full' && node_is_page ( $node )) {
2008-11-25 02:37:33 +00:00
$breadcrumb = array ();
2010-01-04 20:12:59 +00:00
$breadcrumb [] = l ( t ( 'Home' ), NULL );
$breadcrumb [] = l ( t ( 'Example' ), 'example' );
$breadcrumb [] = l ( $node -> field1 , 'example/' . $node -> field1 );
drupal_set_breadcrumb ( $breadcrumb );
2008-11-25 02:37:33 +00:00
}
$node -> content [ 'myfield' ] = array (
2010-11-05 19:58:14 +00:00
'#markup' => theme ( 'mymodule_myfield' , $node -> myfield ),
2008-11-25 02:37:33 +00:00
'#weight' => 1 ,
);
return $node ;
}
/**
* @ } End of " addtogroup hooks " .
*/