2015-08-17 17:00:26 -07:00
< ? php
/**
* @ file
* Builds placeholder replacement tokens for node - related data .
*/
2015-08-27 12:03:05 -07:00
use Drupal\Core\Datetime\Entity\DateFormat ;
2015-08-17 17:00:26 -07:00
use Drupal\Core\Language\LanguageInterface ;
2015-08-27 12:03:05 -07:00
use Drupal\Core\Render\BubbleableMetadata ;
2015-08-17 17:00:26 -07:00
use Drupal\user\Entity\User ;
/**
* Implements hook_token_info () .
*/
function node_token_info () {
2017-04-13 15:53:35 +01:00
$type = [
2015-08-17 17:00:26 -07:00
'name' => t ( 'Nodes' ),
'description' => t ( 'Tokens related to individual content items, or "nodes".' ),
'needs-data' => 'node' ,
2017-04-13 15:53:35 +01:00
];
2015-08-17 17:00:26 -07:00
// Core tokens for nodes.
2017-04-13 15:53:35 +01:00
$node [ 'nid' ] = [
2015-08-17 17:00:26 -07:00
'name' => t ( " Content ID " ),
'description' => t ( 'The unique ID of the content item, or "node".' ),
2017-04-13 15:53:35 +01:00
];
$node [ 'vid' ] = [
2015-08-17 17:00:26 -07:00
'name' => t ( " Revision ID " ),
'description' => t ( " The unique ID of the node's latest revision. " ),
2017-04-13 15:53:35 +01:00
];
$node [ 'type' ] = [
2015-08-17 17:00:26 -07:00
'name' => t ( " Content type " ),
2017-04-13 15:53:35 +01:00
];
$node [ 'type-name' ] = [
2015-08-17 17:00:26 -07:00
'name' => t ( " Content type name " ),
'description' => t ( " The human-readable name of the node type. " ),
2017-04-13 15:53:35 +01:00
];
$node [ 'title' ] = [
2015-08-17 17:00:26 -07:00
'name' => t ( " Title " ),
2017-04-13 15:53:35 +01:00
];
$node [ 'body' ] = [
2015-08-17 17:00:26 -07:00
'name' => t ( " Body " ),
'description' => t ( " The main body text of the node. " ),
2017-04-13 15:53:35 +01:00
];
$node [ 'summary' ] = [
2015-08-17 17:00:26 -07:00
'name' => t ( " Summary " ),
'description' => t ( " The summary of the node's main body text. " ),
2017-04-13 15:53:35 +01:00
];
$node [ 'langcode' ] = [
2015-08-17 17:00:26 -07:00
'name' => t ( 'Language code' ),
'description' => t ( 'The language code of the language the node is written in.' ),
2017-04-13 15:53:35 +01:00
];
$node [ 'url' ] = [
2015-08-17 17:00:26 -07:00
'name' => t ( " URL " ),
'description' => t ( " The URL of the node. " ),
2017-04-13 15:53:35 +01:00
];
$node [ 'edit-url' ] = [
2015-08-17 17:00:26 -07:00
'name' => t ( " Edit URL " ),
'description' => t ( " The URL of the node's edit page. " ),
2017-04-13 15:53:35 +01:00
];
2015-08-17 17:00:26 -07:00
// Chained tokens for nodes.
2017-04-13 15:53:35 +01:00
$node [ 'created' ] = [
2015-08-17 17:00:26 -07:00
'name' => t ( " Date created " ),
'type' => 'date' ,
2017-04-13 15:53:35 +01:00
];
$node [ 'changed' ] = [
2015-08-17 17:00:26 -07:00
'name' => t ( " Date changed " ),
'description' => t ( " The date the node was most recently updated. " ),
'type' => 'date' ,
2017-04-13 15:53:35 +01:00
];
$node [ 'author' ] = [
2015-08-17 17:00:26 -07:00
'name' => t ( " Author " ),
'type' => 'user' ,
2017-04-13 15:53:35 +01:00
];
2015-08-17 17:00:26 -07:00
2017-04-13 15:53:35 +01:00
return [
'types' => [ 'node' => $type ],
'tokens' => [ 'node' => $node ],
];
2015-08-17 17:00:26 -07:00
}
/**
* Implements hook_tokens () .
*/
2015-08-27 12:03:05 -07:00
function node_tokens ( $type , $tokens , array $data , array $options , BubbleableMetadata $bubbleable_metadata ) {
2015-08-17 17:00:26 -07:00
$token_service = \Drupal :: token ();
2017-04-13 15:53:35 +01:00
$url_options = [ 'absolute' => TRUE ];
2015-08-17 17:00:26 -07:00
if ( isset ( $options [ 'langcode' ])) {
$url_options [ 'language' ] = \Drupal :: languageManager () -> getLanguage ( $options [ 'langcode' ]);
$langcode = $options [ 'langcode' ];
}
else {
$langcode = LanguageInterface :: LANGCODE_DEFAULT ;
}
2017-04-13 15:53:35 +01:00
$replacements = [];
2015-08-17 17:00:26 -07:00
if ( $type == 'node' && ! empty ( $data [ 'node' ])) {
/** @var \Drupal\node\NodeInterface $node */
$node = $data [ 'node' ];
foreach ( $tokens as $name => $original ) {
switch ( $name ) {
// Simple key values on the node.
case 'nid' :
$replacements [ $original ] = $node -> id ();
break ;
case 'vid' :
$replacements [ $original ] = $node -> getRevisionId ();
break ;
case 'type' :
2015-10-08 11:40:12 -07:00
$replacements [ $original ] = $node -> getType ();
2015-08-17 17:00:26 -07:00
break ;
case 'type-name' :
$type_name = node_get_type_label ( $node );
2015-10-08 11:40:12 -07:00
$replacements [ $original ] = $type_name ;
2015-08-17 17:00:26 -07:00
break ;
case 'title' :
2015-10-08 11:40:12 -07:00
$replacements [ $original ] = $node -> getTitle ();
2015-08-17 17:00:26 -07:00
break ;
case 'body' :
case 'summary' :
2017-04-13 15:53:35 +01:00
$translation = \Drupal :: entityManager () -> getTranslationFromContext ( $node , $langcode , [ 'operation' => 'node_tokens' ]);
2015-08-17 17:00:26 -07:00
if ( $translation -> hasField ( 'body' ) && ( $items = $translation -> get ( 'body' )) && ! $items -> isEmpty ()) {
$item = $items [ 0 ];
// If the summary was requested and is not empty, use it.
if ( $name == 'summary' && ! empty ( $item -> summary )) {
2015-10-08 11:40:12 -07:00
$output = $item -> summary_processed ;
2015-08-17 17:00:26 -07:00
}
// Attempt to provide a suitable version of the 'body' field.
else {
2015-10-08 11:40:12 -07:00
$output = $item -> processed ;
2015-08-17 17:00:26 -07:00
// A summary was requested.
if ( $name == 'summary' ) {
// Generate an optionally trimmed summary of the body field.
// Get the 'trim_length' size used for the 'teaser' mode, if
// present, or use the default trim_length size.
$display_options = entity_get_display ( 'node' , $node -> getType (), 'teaser' ) -> getComponent ( 'body' );
if ( isset ( $display_options [ 'settings' ][ 'trim_length' ])) {
$length = $display_options [ 'settings' ][ 'trim_length' ];
}
else {
$settings = \Drupal :: service ( 'plugin.manager.field.formatter' ) -> getDefaultSettings ( 'text_summary_or_trimmed' );
$length = $settings [ 'trim_length' ];
}
$output = text_summary ( $output , $item -> format , $length );
}
}
2015-10-08 11:40:12 -07:00
// "processed" returns a \Drupal\Component\Render\MarkupInterface
// via check_markup().
2015-08-17 17:00:26 -07:00
$replacements [ $original ] = $output ;
}
break ;
case 'langcode' :
2015-10-08 11:40:12 -07:00
$replacements [ $original ] = $node -> language () -> getId ();
2015-08-17 17:00:26 -07:00
break ;
case 'url' :
$replacements [ $original ] = $node -> url ( 'canonical' , $url_options );
break ;
case 'edit-url' :
$replacements [ $original ] = $node -> url ( 'edit-form' , $url_options );
break ;
// Default values for the chained tokens handled below.
case 'author' :
$account = $node -> getOwner () ? $node -> getOwner () : User :: load ( 0 );
2015-08-27 12:03:05 -07:00
$bubbleable_metadata -> addCacheableDependency ( $account );
2015-10-08 11:40:12 -07:00
$replacements [ $original ] = $account -> label ();
2015-08-17 17:00:26 -07:00
break ;
case 'created' :
2015-08-27 12:03:05 -07:00
$date_format = DateFormat :: load ( 'medium' );
$bubbleable_metadata -> addCacheableDependency ( $date_format );
2015-08-17 17:00:26 -07:00
$replacements [ $original ] = format_date ( $node -> getCreatedTime (), 'medium' , '' , NULL , $langcode );
break ;
case 'changed' :
2015-08-27 12:03:05 -07:00
$date_format = DateFormat :: load ( 'medium' );
$bubbleable_metadata -> addCacheableDependency ( $date_format );
2015-08-17 17:00:26 -07:00
$replacements [ $original ] = format_date ( $node -> getChangedTime (), 'medium' , '' , NULL , $langcode );
break ;
}
}
if ( $author_tokens = $token_service -> findWithPrefix ( $tokens , 'author' )) {
2017-04-13 15:53:35 +01:00
$replacements += $token_service -> generate ( 'user' , $author_tokens , [ 'user' => $node -> getOwner ()], $options , $bubbleable_metadata );
2015-08-17 17:00:26 -07:00
}
if ( $created_tokens = $token_service -> findWithPrefix ( $tokens , 'created' )) {
2017-04-13 15:53:35 +01:00
$replacements += $token_service -> generate ( 'date' , $created_tokens , [ 'date' => $node -> getCreatedTime ()], $options , $bubbleable_metadata );
2015-08-17 17:00:26 -07:00
}
if ( $changed_tokens = $token_service -> findWithPrefix ( $tokens , 'changed' )) {
2017-04-13 15:53:35 +01:00
$replacements += $token_service -> generate ( 'date' , $changed_tokens , [ 'date' => $node -> getChangedTime ()], $options , $bubbleable_metadata );
2015-08-17 17:00:26 -07:00
}
}
return $replacements ;
}