Once working on the Drupal project, I faced a situation when I had to access the current loaded node fields in Rules. To be more specific, the content type had an email field and attached entity form. The task was to send the email using Rules to the email address which was set in a node field after submission the attached entity form.
The problem is that the only available fields I had were entity form fields and no fields from the node. So I came up to some custom and quick solution of creating custom Token which would contain the data from the node field.
I'm sure maybe there is a solution without custom coding, but at that point it had to be done quickly and I had not much time for researching it.
The first thing I checked the content type structure to make sure that the Email field is hidden.
The second, I inspected the node object using Devel module to see the structure of my email field there. It can be found by its machine name field_email.
The next thing I did was creating field_helper folder and placing it into sites/all/modules/custom. Actually field_helper is the name of the module. Then I created module files: field_helper.info and field_helper.module and put them into my created folder.
Here is the source code of these files:
field_helper.info
name = Field Token Helper
description = "Creates custom token from field's value"
package = Custom
core = 7.x
dependencies[] = token
field_helper.module
<?php
/**
* Implements hook_token_info().
*/
function field_helper_token_info() {
// Define email_field token, it will be available as [site:email_field]
$field['email_field'] = array(
'name' => t("Email field token"),
'description' => t("Email field value from the current node"),
);
// Return associative array of tokens & token types
return array(
'tokens' => array(
'site' => $field,
),
);
}
/**
* Implements hook_tokens().
*/
function field_helper_tokens($type, $tokens, array $data = array(), array $options = array()) {
$replacements = array();
// Check token type
if($type == 'site'){
foreach ($tokens as $name => $original) {
switch ($name) {
// Check token name
case 'email_field':
$node = menu_get_object();
$email_field = "";
if (isset($node->field_email[LANGUAGE_NONE][0]['email'])) {
$email_field = $node->field_email[LANGUAGE_NONE][0]['email'];
}
$replacements[$original] = $email_field;
break;
}
}
}
return $replacements;
}
This is pretty simple as you can see, I created custom token email_field which would be available under site type and then I loaded current node with menu_get_object() function and saved the data from the node email field (field_email machine name) into my custom token.
After enabling newly created module I can see that my custom token is available under Rules interface.
I also checked my token value with adding additional Show a message on the site action which displayed it via system message after submitting entity form in Rules.
Make sure that you deleted this action after testing your token).
That's all, this is how you can programmatically create a custom tokens with the data and logic you need and then use it in your Drupal projects.
Add new comment