2008-11-25 02:37:33 +00:00
< ? php
2012-09-12 09:18:04 +00:00
use Drupal\Core\Entity\EntityInterface ;
2013-12-10 16:40:21 +00:00
use Drupal\node\Entity\NodeInterface ;
2013-09-27 15:34:47 +00:00
use Drupal\Component\Utility\String ;
use Drupal\Component\Utility\Xss ;
2012-06-15 16:43:34 +00:00
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
2012-11-10 15:25:19 +00:00
* node . module ( for content types created in the user interface ) or the module
2013-06-27 05:48:51 +00:00
* that defines the content type by providing configuration file .
2010-02-10 10:34:50 +00:00
*
2013-01-16 17:37:23 +00:00
* During node operations ( create , insert , update , view , delete , etc . ), there
* are several sets of hooks that get invoked to allow modules to modify the
* base node operation :
2012-11-10 15:25:19 +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
2013-01-23 17:29:29 +00:00
* example , hook_node_insert () is invoked on all modules when creating a forum
2012-11-10 15:25:19 +00:00
* 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 :
2013-01-16 17:37:23 +00:00
* - Instantiating a new node :
* - hook_node_create () ( all )
* - hook_entity_create () ( all )
2013-06-03 10:00:40 +00:00
* - Creating a new node ( calling $node -> save () on a new node ) :
2010-02-10 10:34:50 +00:00
* - 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_node_insert () ( all )
* - hook_entity_insert () ( all )
* - hook_node_access_records () ( all )
* - hook_node_access_records_alter () ( all )
2013-06-03 10:00:40 +00:00
* - Updating an existing node ( calling $node -> save () on an existing node ) :
2010-02-10 10:34:50 +00:00
* - 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_node_update () ( all )
* - hook_entity_update () ( all )
* - hook_node_access_records () ( all )
* - hook_node_access_records_alter () ( all )
2012-11-10 15:25:19 +00:00
* - Loading a node ( calling node_load (), node_load_multiple (), entity_load (),
2012-04-26 04:07:55 +00:00
* 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_entity_load () ( all )
* - hook_node_load () ( all )
* - Viewing a single node ( calling node_view () - note that the input to
2012-11-10 15:25:19 +00:00
* node_view () is a loaded node , so the Loading steps above are already done ) :
2010-02-10 10:34:50 +00:00
* - 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
* - 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 )
2013-06-03 10:00:40 +00:00
* - Deleting a node ( calling $node -> delete () or entity_delete_multiple ()) :
2010-02-10 10:34:50 +00:00
* - Node is loaded ( see Loading section above )
2011-12-17 12:43:37 +00:00
* - hook_node_predelete () ( all )
* - hook_entity_predelete () ( all )
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 )
2012-11-10 15:25:19 +00:00
* - Preparing a node for editing ( calling node_form () - note that if it is an
* existing node , it will already be loaded ; see the Loading section above ) :
2013-06-28 08:41:01 +00:00
* - hook_node_prepare_form () ( all )
* - hook_entity_prepare_form () ( all )
2010-02-10 10:34:50 +00:00
* - field_attach_form ()
* - Validating a node during editing form submit ( calling
* node_form_validate ()) :
* - hook_node_validate () ( all )
2013-09-06 08:26:26 +00:00
* - Searching ( using the 'node_search' plugin ) :
2010-02-10 10:34:50 +00:00
* - 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 )
2013-09-06 08:26:26 +00:00
* - comment_node_update_index () is called ( this adds " N comments " text )
2010-02-10 10:34:50 +00:00
* - hook_node_search_result () ( all )
2013-09-06 08:26:26 +00:00
* - Search indexing ( calling updateIndex () on the 'node_search' plugin ) :
2010-02-10 10:34:50 +00:00
* - 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
2012-11-10 15:25:19 +00:00
* 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
*
2012-11-10 15:25:19 +00:00
* A node access module may implement as many realms as necessary to 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
2012-11-10 15:25:19 +00:00
* 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 );
}
2013-07-11 17:29:02 +00:00
$grants [ 'example_owner' ] = array ( $account -> id ());
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
2013-08-16 17:13:11 +00:00
* set to $node -> isPublished () . Failure to do so may expose unpublished content
2010-09-29 14:08:54 +00:00
* 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 .
2013-03-27 18:23:49 +00:00
* - langcode : ( optional ) The language code of a specific translation of the
* node , if any . Modules may add this key to grant different access to
* different translations of a node , such that ( e . g . ) a particular group is
* granted access to edit the Catalan version of the node , but not the
* Hungarian version . If no value is provided , the langcode is set
* automatically from the $node parameter and the node ' s original language ( if
* specified ) is used as a fallback . Only specify multiple grant records with
* different languages for a node if the site has those languages configured .
2008-11-25 02:37:33 +00:00
*
2013-03-27 18:23:49 +00:00
* A " deny all " grant may be used to deny all access to a particular node or
* node translation :
2010-09-29 14:08:54 +00:00
* @ code
* $grants [] = array (
* 'realm' => 'all' ,
* 'gid' => 0 ,
* 'grant_view' => 0 ,
* 'grant_update' => 0 ,
* 'grant_delete' => 0 ,
2013-03-27 18:23:49 +00:00
* 'langcode' => 'ca' ,
2010-09-29 14:08:54 +00:00
* );
* @ endcode
2013-03-27 18:23:49 +00:00
* Note that another module node access module could override this by granting
* access to one or more nodes , since grants are additive . To enforce that
* access is denied in a particular case , use hook_node_access_records_alter () .
* Also note that a deny all is not written to the database ; denies are
* implicit .
2010-09-29 14:08:54 +00:00
*
2013-03-10 19:05:24 +00:00
* @ param \Drupal\Core\Entity\EntityInterface $node
2010-09-29 14:08:54 +00:00
* The node that has just been saved .
*
* @ return
* An array of grants as defined above .
*
2013-07-05 13:38:55 +00:00
* @ see node_access_write_grants ()
2012-11-10 15:25:19 +00:00
* @ see hook_node_access_records_alter ()
2008-11-25 02:37:33 +00:00
* @ ingroup node_access
*/
2013-08-16 17:13:11 +00:00
function hook_node_access_records ( \Drupal\node\NodeInterface $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.
2013-08-27 10:36:16 +00:00
if ( $node -> private -> value ) {
2008-11-25 02:37:33 +00:00
$grants = array ();
2013-03-27 18:23:49 +00:00
// Only published Catalan translations of private nodes should be viewable
2013-08-16 17:13:11 +00:00
// to all users. If we fail to check $node->isPublished(), all users would be able
2013-03-27 18:23:49 +00:00
// to view an unpublished node.
2013-08-16 17:13:11 +00:00
if ( $node -> isPublished ()) {
2010-09-29 14:08:54 +00:00
$grants [] = array (
'realm' => 'example' ,
'gid' => 1 ,
'grant_view' => 1 ,
'grant_update' => 0 ,
'grant_delete' => 0 ,
2013-03-27 18:23:49 +00:00
'langcode' => 'ca'
2010-09-29 14:08:54 +00:00
);
}
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' ,
2013-08-16 17:13:11 +00:00
'gid' => $node -> getAuthorId (),
2010-02-05 22:24:12 +00:00
'grant_view' => 1 ,
'grant_update' => 1 ,
'grant_delete' => 1 ,
2013-03-27 18:23:49 +00:00
'langcode' => 'ca'
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 () .
2013-03-10 19:05:24 +00:00
* @ param \Drupal\Core\Entity\EntityInterface $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
*/
2013-03-10 19:05:24 +00:00
function hook_node_access_records_alter ( & $grants , Drupal\Core\Entity\EntityInterface $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 .
2012-11-10 15:25:19 +00:00
* 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 .
2009-05-27 02:01:54 +00:00
*
* 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 .
*
2012-11-10 15:25:19 +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
2011-11-28 11:44:25 +00:00
* 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.
2013-10-26 04:53:38 +00:00
$restricted = \Drupal :: config ( 'example.settings' ) -> get ( 'restricted_roles' );
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.
2013-07-24 19:40:03 +00:00
foreach ( $account -> getRoles () as $rid ) {
2013-06-06 10:20:38 +00:00
if ( in_array ( $rid , $restricted )) {
2009-05-27 02:01:54 +00:00
$grants = array ();
}
}
}
}
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
*
2013-06-17 11:03:40 +00:00
* This hook is invoked from entity_delete_multiple () before
2013-09-01 06:20:08 +00:00
* hook_entity_predelete () is called and field values are deleted , and before
2013-06-17 11:03:40 +00:00
* the node is removed from the node table in the database .
2008-12-09 11:30:25 +00:00
*
2013-03-10 19:05:24 +00:00
* @ param \Drupal\Core\Entity\EntityInterface $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 ()
2013-06-03 10:00:40 +00:00
* @ see entity_delete_multiple ()
2010-02-10 10:34:50 +00:00
* @ ingroup node_api_hooks
2008-12-09 11:30:25 +00:00
*/
2013-03-10 19:05:24 +00:00
function hook_node_predelete ( \Drupal\Core\Entity\EntityInterface $node ) {
2009-04-25 16:33:48 +00:00
db_delete ( 'mytable' )
2013-07-20 12:21:43 +00:00
-> condition ( 'nid' , $node -> id ())
2009-04-25 16:33:48 +00:00
-> execute ();
2008-12-09 11:30:25 +00:00
}
2011-12-17 12:43:37 +00:00
/**
* Respond to node deletion .
*
2013-09-01 06:20:08 +00:00
* This hook is invoked from entity_delete_multiple () after field values are
* deleted and after the node has been removed from the database .
2011-12-17 12:43:37 +00:00
*
2013-03-10 19:05:24 +00:00
* @ param \Drupal\Core\Entity\EntityInterface $node
2011-12-17 12:43:37 +00:00
* The node that has been deleted .
*
* @ see hook_node_predelete ()
2013-06-03 10:00:40 +00:00
* @ see entity_delete_multiple ()
2011-12-17 12:43:37 +00:00
* @ ingroup node_api_hooks
*/
2013-03-10 19:05:24 +00:00
function hook_node_delete ( \Drupal\Core\Entity\EntityInterface $node ) {
2012-07-22 18:07:00 +00:00
drupal_set_message ( t ( 'Node: @title has been deleted' , array ( '@title' => $node -> label ())));
2011-12-17 12:43:37 +00:00
}
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
2013-09-01 06:20:08 +00:00
* removed from the node_revision table , and before field values are deleted .
2008-12-09 11:30:25 +00:00
*
2013-03-10 19:05:24 +00:00
* @ param \Drupal\Core\Entity\EntityInterface $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
*/
2013-03-10 19:05:24 +00:00
function hook_node_revision_delete ( \Drupal\Core\Entity\EntityInterface $node ) {
2010-08-22 13:52:59 +00:00
db_delete ( 'mytable' )
2013-08-16 17:13:11 +00:00
-> condition ( 'vid' , $node -> getRevisionId ())
2010-08-22 13:52:59 +00:00
-> 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
*
2013-06-03 10:00:40 +00:00
* This hook is invoked from $node -> save () after the database query that will
2013-06-17 11:03:40 +00:00
* insert the node into the node table is scheduled for execution , and after
2013-09-01 06:20:08 +00:00
* field values are saved .
2012-10-09 17:29:51 +00:00
*
* Note that when this hook is invoked , the changes have not yet been written to
* the database , because a database transaction is still in progress . The
* transaction is not finalized until the save operation is entirely completed
2013-06-03 10:00:40 +00:00
* and $node -> save () goes out of scope . You should not rely on data in the
2012-10-09 17:29:51 +00:00
* database at this time as it is not updated yet . You should also note that any
* write / update database queries executed from this hook are also not committed
2013-06-03 10:00:40 +00:00
* immediately . Check $node -> save () and db_transaction () for more info .
2008-12-09 11:30:25 +00:00
*
2013-03-10 19:05:24 +00:00
* @ param \Drupal\Core\Entity\EntityInterface $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
*/
2013-03-10 19:05:24 +00:00
function hook_node_insert ( \Drupal\Core\Entity\EntityInterface $node ) {
2009-04-25 16:33:48 +00:00
db_insert ( 'mytable' )
-> fields ( array (
2013-07-20 12:21:43 +00:00
'nid' => $node -> id (),
2009-04-25 16:33:48 +00:00
'extra' => $node -> extra ,
))
-> execute ();
2008-12-09 11:30:25 +00:00
}
2013-01-16 17:37:23 +00:00
/**
* Act on a newly created node .
*
* This hook runs after a new node object has just been instantiated . It can be
* used to set initial values , e . g . to provide defaults .
*
2013-03-10 19:05:24 +00:00
* @ param \Drupal\Core\Entity\EntityInterface $node
2013-01-16 17:37:23 +00:00
* The node object .
*
* @ ingroup node_api_hooks
*/
2013-03-10 19:05:24 +00:00
function hook_node_create ( \Drupal\Core\Entity\EntityInterface $node ) {
2013-01-16 17:37:23 +00:00
if ( ! isset ( $node -> foo )) {
$node -> foo = 'some_initial_value' ;
}
}
2008-12-05 22:18:46 +00:00
/**
2012-09-19 13:25:24 +00:00
* Act on arbitrary nodes being loaded from the database .
*
2012-11-10 15:25:19 +00:00
* This hook should 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 .
2009-12-01 19:00:18 +00:00
*
* This hook is invoked during node loading , which is handled by entity_load (),
2013-01-30 05:29:45 +00:00
* via classes Drupal\node\NodeStorageController and
2013-09-02 20:26:08 +00:00
* Drupal\Core\Entity\DatabaseStorageController . After the node information and
* field values are read from the database or the entity cache ,
* 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
*
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 .
*
* 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
*/
2013-12-12 14:46:24 +00:00
function hook_node_load ( $nodes ) {
2012-09-19 13:25:24 +00:00
// Decide whether any of $types are relevant to our purposes.
2013-09-27 15:34:47 +00:00
$types_we_want_to_process = \Drupal :: config ( 'my_types' ) -> get ( 'types' );
2013-12-12 14:46:24 +00:00
$nids = array ();
foreach ( $nodes as $node ) {
if ( in_array ( $node -> bundle (), $types_we_want_to_process )) {
$nids = $node -> id ();
}
}
if ( $nids ) {
2012-09-19 13:25:24 +00:00
// Gather our extra data for each of these nodes.
2013-12-12 14:46:24 +00:00
$result = db_query ( 'SELECT nid, foo FROM {mytable} WHERE nid IN(:nids)' , array ( ':nids' => $nids ));
2012-09-19 13:25:24 +00:00
// Add our extra data to the node objects.
foreach ( $result as $record ) {
$nodes [ $record -> nid ] -> foo = $record -> foo ;
}
2008-12-05 22:18:46 +00:00
}
}
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 .
*
2012-11-10 15:25:19 +00:00
* 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 "
2009-08-20 09:47:04 +00:00
* permission may always view and edit content through the administrative
* interface .
*
2012-11-10 15:25:19 +00:00
* 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 .
2009-08-20 09:47:04 +00:00
*
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 .
*
2013-10-03 11:26:25 +00:00
* @ param \Drupal\Core\Entity\EntityInterface | string $node
2012-04-26 16:44:37 +00:00
* 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 .
2012-06-30 18:30:24 +00:00
* @ param object $langcode
* The language code to perform the access check operation on .
2009-11-15 02:11:51 +00:00
*
2012-09-22 01:11:03 +00:00
* @ return string
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
*/
2013-08-16 17:13:11 +00:00
function hook_node_access ( \Drupal\node\NodeInterface $node , $op , $account , $langcode ) {
$type = is_string ( $node ) ? $node : $node -> getType ();
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' ) {
2013-08-16 17:13:11 +00:00
if ( user_access ( 'edit any ' . $type . ' content' , $account ) || ( user_access ( 'edit own ' . $type . ' content' , $account ) && ( $account -> id () == $node -> getAuthorId ()))) {
2009-08-20 09:47:04 +00:00
return NODE_ACCESS_ALLOW ;
}
}
if ( $op == 'delete' ) {
2013-08-16 17:13:11 +00:00
if ( user_access ( 'delete any ' . $type . ' content' , $account ) || ( user_access ( 'delete own ' . $type . ' content' , $account ) && ( $account -> id () == $node -> getAuthorId ()))) {
2009-08-20 09:47:04 +00:00
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 .
*
2013-06-17 11:03:40 +00:00
* This hook is invoked from NodeFormController :: prepareEntity () .
2008-11-25 02:37:33 +00:00
*
2013-06-28 08:41:01 +00:00
* @ param \Drupal\node\NodeInterface $node
* The node that is about to be shown on the form .
* @ param $form_display
* The current form display .
* @ param $operation
* The current operation .
* @ param array $form_state
* An associative array containing the current state of the form .
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2008-12-09 11:30:25 +00:00
*/
2013-06-28 08:41:01 +00:00
function hook_node_prepare_form ( \Drupal\node\NodeInterface $node , $form_display , $operation , array & $form_state ) {
2013-09-27 15:34:47 +00:00
if ( ! isset ( $node -> my_rating )) {
$node -> my_rating = \Drupal :: config ( " my_rating_ { $node -> bundle () } " ) -> get ( 'enabled' );
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
*
2013-09-06 08:26:26 +00:00
* This hook is invoked from the node search plugin during search execution ,
* after loading and rendering the node .
2008-12-09 11:30:25 +00:00
*
2013-03-10 19:05:24 +00:00
* @ param \Drupal\Core\Entity\EntityInterface $node
2009-11-15 02:11:51 +00:00
* The node being displayed in a search result .
2012-08-16 14:18:38 +00:00
* @ param $langcode
* Language code of result being displayed .
2009-11-15 02:11:51 +00:00
*
2011-06-27 06:11:44 +00:00
* @ return array
* Extra information to be displayed with search result . This information
2012-11-10 15:25:19 +00:00
* should be presented as an associative array . It will be concatenated with
* the post information ( last updated , author ) in the default search result
* theming .
2011-06-27 06:11:44 +00:00
*
* @ see template_preprocess_search_result ()
2013-10-03 20:55:34 +00:00
* @ see search - result . html . twig
2010-02-10 10:34:50 +00:00
*
* @ ingroup node_api_hooks
2008-12-09 11:30:25 +00:00
*/
2013-03-10 19:05:24 +00:00
function hook_node_search_result ( \Drupal\Core\Entity\EntityInterface $node , $langcode ) {
2013-09-27 15:34:47 +00:00
$rating = db_query ( 'SELECT SUM(points) FROM {my_rating} WHERE nid = :nid' , array ( 'nid' => $node -> id ())) -> fetchField ();
return array ( 'rating' => format_plural ( $rating , '1 point' , '@count points' ));
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
*
2013-06-03 10:00:40 +00:00
* This hook is invoked from $node -> save () before the node is saved to the
2009-11-15 02:11:51 +00:00
* database .
2008-12-09 11:30:25 +00:00
*
2013-03-10 19:05:24 +00:00
* @ param \Drupal\Core\Entity\EntityInterface $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
*/
2013-03-10 19:05:24 +00:00
function hook_node_presave ( \Drupal\Core\Entity\EntityInterface $node ) {
2013-07-20 12:21:43 +00:00
if ( $node -> id () && $node -> moderate ) {
2008-12-09 11:30:25 +00:00
// 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 .
*
2013-06-03 10:00:40 +00:00
* This hook is invoked from $node -> save () after the database query that will
2013-09-01 06:20:08 +00:00
* update node in the node table is scheduled for execution , and after field
* values are saved .
2012-10-09 17:29:51 +00:00
*
* Note that when this hook is invoked , the changes have not yet been written to
* the database , because a database transaction is still in progress . The
* transaction is not finalized until the save operation is entirely completed
2013-06-03 10:00:40 +00:00
* and $node -> save () goes out of scope . You should not rely on data in the
2012-10-09 17:29:51 +00:00
* database at this time as it is not updated yet . You should also note that any
* write / update database queries executed from this hook are also not committed
2013-06-03 10:00:40 +00:00
* immediately . Check $node -> save () and db_transaction () for more info .
2008-12-09 11:30:25 +00:00
*
2013-03-10 19:05:24 +00:00
* @ param \Drupal\Core\Entity\EntityInterface $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
*/
2013-03-10 19:05:24 +00:00
function hook_node_update ( \Drupal\Core\Entity\EntityInterface $node ) {
2009-04-25 16:33:48 +00:00
db_update ( 'mytable' )
-> fields ( array ( 'extra' => $node -> extra ))
2013-07-20 12:21:43 +00:00
-> condition ( 'nid' , $node -> id ())
2009-04-25 16:33:48 +00:00
-> 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
*
2013-09-06 08:26:26 +00:00
* This hook is invoked during search indexing , after loading , and after the
* result of rendering is added as $node -> rendered to the node object .
2008-12-09 11:30:25 +00:00
*
2013-03-10 19:05:24 +00:00
* @ param \Drupal\Core\Entity\EntityInterface $node
2009-11-15 02:11:51 +00:00
* The node being indexed .
2012-08-16 14:18:38 +00:00
* @ param $langcode
* Language code of the variant of the node being indexed .
2009-11-15 02:11:51 +00:00
*
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
*/
2013-03-10 19:05:24 +00:00
function hook_node_update_index ( \Drupal\Core\Entity\EntityInterface $node , $langcode ) {
2008-12-09 11:30:25 +00:00
$text = '' ;
2013-09-27 15:34:47 +00:00
$ratings = db_query ( 'SELECT title, description FROM {my_ratings} WHERE nid = :nid' , array ( ':nid' => $node -> id ()));
foreach ( $ratings as $rating ) {
$text .= '<h2>' . String :: checkPlain ( $rating -> title ) . '</h2>' . Xss :: filter ( $rating -> description );
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 .
*
2012-08-16 11:30:43 +00:00
* This hook is invoked from NodeFormController :: validate (), after a user has
2012-11-10 15:25:19 +00:00
* finished editing the node and is previewing or submitting it . It is invoked
2013-06-17 11:03:40 +00:00
* at the end of all the standard validation steps .
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
2012-11-10 15:25:19 +00:00
* 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
*
2013-03-10 19:05:24 +00:00
* @ param \Drupal\Core\Entity\EntityInterface $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
*/
2013-03-10 19:05:24 +00:00
function hook_node_validate ( \Drupal\Core\Entity\EntityInterface $node , $form , & $form_state ) {
2008-12-09 11:30:25 +00:00
if ( isset ( $node -> end ) && isset ( $node -> start )) {
if ( $node -> start > $node -> end ) {
2013-11-23 20:57:04 +00:00
form_set_error ( 'time' , $form_state , t ( 'An event may not end before it starts.' ));
2008-12-09 11:30:25 +00:00
}
}
}
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
2013-02-04 14:30:22 +00:00
* properties . See hook_field_attach_extract_form_values () for customizing
* field - related properties .
2010-06-17 13:44:45 +00:00
*
2013-03-10 19:05:24 +00:00
* @ param \Drupal\Core\Entity\EntityInterface $node
2012-04-26 16:44:37 +00:00
* 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
*/
2013-03-10 19:05:24 +00:00
function hook_node_submit ( \Drupal\Core\Entity\EntityInterface $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
*
2013-06-17 11:03:40 +00:00
* The module may add elements to $node -> content prior to rendering .
* The structure of $node -> content is a renderable array as expected by
* drupal_render () .
2009-05-03 10:11:35 +00:00
*
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
*
2013-03-10 19:05:24 +00:00
* @ param \Drupal\Core\Entity\EntityInterface $node
2009-11-15 02:11:51 +00:00
* The node that is being assembled for rendering .
2013-08-18 21:16:19 +00:00
* @ param \Drupal\entity\Entity\EntityDisplay $display
2013-01-08 19:16:16 +00:00
* The entity_display object holding the display options configured for the
* node components .
* @ param string $view_mode
2009-12-26 16:50:09 +00:00
* The $view_mode parameter from node_view () .
2013-01-08 19:16:16 +00:00
* @ param string $langcode
2010-10-03 01:15:34 +00:00
* 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 ()
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
*/
2013-08-18 21:16:19 +00:00
function hook_node_view ( \Drupal\Core\Entity\EntityInterface $node , \Drupal\entity\Entity\EntityDisplay $display , $view_mode , $langcode ) {
2013-01-08 19:16:16 +00:00
// Only do the extra work if the component is configured to be displayed.
// This assumes a 'mymodule_addition' extra field has been defined for the
// node type in hook_field_extra_fields().
if ( $display -> getComponent ( 'mymodule_addition' )) {
$node -> content [ 'mymodule_addition' ] = array (
'#markup' => mymodule_addition ( $node ),
'#theme' => 'mymodule_my_additional_field' ,
);
}
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
Issue #1898432 by WebDevDude, steveoliver, vlad.dancer, jenlampton, pixelmord, Fabianx, iztok, EVIIILJ, jwilson3, c4rl, Cottser: Convert node module to Twig.
2013-05-24 17:13:55 +00:00
* node . html . twig . 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 .
2013-03-10 19:05:24 +00:00
* @ param \Drupal\Core\Entity\EntityInterface $node
2012-06-15 16:43:34 +00:00
* The node being rendered .
2013-08-18 21:16:19 +00:00
* @ param \Drupal\entity\Entity\EntityDisplay $display
2013-01-08 19:16:16 +00:00
* The entity_display object holding the display options configured for the
* node components .
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
*/
2013-08-18 21:16:19 +00:00
function hook_node_view_alter ( & $build , \Drupal\Core\Entity\EntityInterface $node , \Drupal\entity\Entity\EntityDisplay $display ) {
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
}
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 :
2012-11-10 15:25:19 +00:00
* - title : ( required ) The human readable name of the ranking mechanism .
* - join : ( optional ) The 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 .
* - score : ( required ) The 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
2009-08-05 14:58:40 +00:00
* 0 and 1 ; be careful not to cast the entire score to an integer by
2012-11-10 15:25:19 +00:00
* inadvertently introducing a variable argument .
* - arguments : ( optional ) 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.
2013-10-26 04:53:38 +00:00
if ( \Drupal :: config ( 'vote.settings' ) -> get ( 'node_enabled' )) {
2009-08-05 14:58:40 +00:00
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.
2013-10-26 04:53:38 +00:00
'arguments' => array ( \Drupal :: config ( 'vote.settings' ) . get ( 'score_max' )),
2009-08-05 14:58:40 +00:00
),
);
}
}
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
*
2013-06-27 05:48:51 +00:00
* @ param \Drupal\node\NodeTypeInterface $type
* The node type entity that was created .
2009-08-11 15:50:56 +00:00
*/
2013-06-27 05:48:51 +00:00
function hook_node_type_insert ( \Drupal\node\NodeTypeInterface $type ) {
drupal_set_message ( t ( 'You have just created a content type with a machine name %type.' , array ( '%type' => $type -> id ())));
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
*
2013-06-27 05:48:51 +00:00
* @ param \Drupal\node\NodeTypeInterface $type
* The node type entity that was updated .
2008-11-25 02:37:33 +00:00
*/
2013-06-27 05:48:51 +00:00
function hook_node_type_update ( \Drupal\node\NodeTypeInterface $type ) {
if ( $type -> original -> id () != $type -> id ()) {
drupal_set_message ( t ( 'You have just changed the machine name of a content type from %old_type to %type.' , array ( '%old_type' => $type -> original -> id (), '%type' => $type -> id ())));
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
*
2013-06-27 05:48:51 +00:00
* @ param \Drupal\node\NodeTypeInterface $type
* The node type entity that was deleted .
2009-08-11 15:50:56 +00:00
*/
2013-06-27 05:48:51 +00:00
function hook_node_type_delete ( \Drupal\node\NodeTypeInterface $type ) {
drupal_set_message ( t ( 'You have just deleted a content type with the machine name %type.' , array ( '%type' => $type -> id ())));
2009-08-11 15:50:56 +00:00
}
2013-12-10 16:40:21 +00:00
/**
* Alter the links of a node .
*
* @ param array & $links
* A renderable array representing the node links .
* @ param \Drupal\node\NodeInterface $entity
* The node being rendered .
* @ param array & $context
* Various aspects of the context in which the node links are going to be
* displayed , with the following keys :
* - 'view_mode' : the view mode in which the comment is being viewed
* - 'langcode' : the language in which the comment is being viewed
*
* @ see \Drupal\node\NodeViewBuilder :: renderLinks ()
* @ see \Drupal\node\NodeViewBuilder :: buildLinks ()
*/
function hook_node_links_alter ( array & $links , NodeInterface $entity , array & $context ) {
$links [ 'mymodule' ] = array (
'#theme' => 'links__node__mymodule' ,
'#attributes' => array ( 'class' => array ( 'links' , 'inline' )),
'#links' => array (
'node-report' => array (
'title' => t ( 'Report' ),
'href' => " node/ { $entity -> id () } /report " ,
'html' => TRUE ,
'query' => array ( 'token' => \Drupal :: getContainer () -> get ( 'csrf_token' ) -> get ( " node/ { $entity -> id () } /report " )),
),
),
);
}
2008-11-25 02:37:33 +00:00
/**
* @ } End of " addtogroup hooks " .
*/