This repository has been archived on 2025-01-19. You can view files and clone it, but cannot push or open issues or pull requests.
oliverdavies.uk-old-sculpin/docs/blog/2013/02/16/creating-and-using-custom-tokens-drupal-7/index.html
2017-07-12 07:22:51 +01:00

362 lines
15 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html class="no-js" lang="en-GB">
<head>
<title>Creating and using custom tokens in Drupal 7 | Oliver Davies</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta property="og:url" content="https://www.oliverdavies.uk/blog/2013/02/16/creating-and-using-custom-tokens-drupal-7">
<meta property="og:title" content="Creating and using custom tokens in Drupal 7"/>
<meta property="og:image" content="https://www.oliverdavies.uk/assets/images/me-precedent.jpg"/>
<meta property="og:image:height" content="327"/>
<meta property="og:image:type" content="image/jpg">
<meta property="og:image:width" content="327"/>
<link rel="stylesheet" href="https://www.oliverdavies.uk/assets/css/main.css">
<link rel="stylesheet" href="https://www.oliverdavies.uk/assets/css/blog-post.css">
<link rel="apple-touch-icon" href="/assets/images/me-precedent.jpg?s=57" sizes="57x57">
<link rel="apple-touch-icon" href="/assets/images/me-precedent.jpg?s=114" sizes="114x114">
<link rel="apple-touch-icon" href="/assets/images/me-precedent.jpg?s=72" sizes="72x72">
<link rel="apple-touch-icon" href="/assets/images/me-precedent.jpg?s=144" sizes="144x144">
<link rel="apple-touch-icon" href="/assets/images/me-precedent.jpg?s=60" sizes="60x60">
<link rel="apple-touch-icon" href="/assets/images/me-precedent.jpg?s=120" sizes="120x120">
<link rel="apple-touch-icon" href="/assets/images/me-precedent.jpg?s=76" sizes="76x76">
<link rel="apple-touch-icon" href="/assets/images/me-precedent.jpg?s=152" sizes="152x152">
<link rel="icon" href="/assets/images/me-precedent.jpg?s=160" sizes="160x160">
<link rel="icon" href="/assets/images/me-precedent.jpg?s=96" sizes="96x96">
<link rel="icon" href="/assets/images/me-precedent.jpg?s=32" sizes="32x32">
<link rel="icon" href="/assets/images/me-precedent.jpg?s=16" sizes="16x16">
</head>
<body class="">
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="https://www.oliverdavies.uk/">Oliver Davies</a>
</div>
<div id="navbar" class="collapse navbar-collapse" role="navigation">
<ul class="nav navbar-nav">
<li class="">
<a href="/">About</a>
</li>
<li class="">
<a href="/experience">Experience</a>
</li>
<li class="">
<a href="/testimonials">Testimonials</a>
</li>
<li class="">
<a href="/talks">Talks</a>
</li>
<li class="active">
<a href="/blog">Blog</a>
</li>
<li class="">
<a href="/contact">Contact</a>
</li>
</ul>
</div> </div>
</nav>
<div class="container">
<div class="row">
<main class="col-md-9">
<h1>Creating and using custom tokens in Drupal 7</h1>
<p class="posted text-light">16th February 2013</p>
<p>This post outlines the steps required to create your own custom tokens in Drupal.</p>
<p>When writing the recent releases of the <a href="http://drupal.org/project/copyright_block">Copyright Block</a> module, I used tokens to allow the user to edit and customise their copyright message and place the copyright_message:dates token in the desired position. When the block is rendered, the token is replaced by the necessary dates.</p>
<p>We will be using the fictional <em>foo</em> module to demonstrate this.</p>
<h2 id="requirements">Requirements</h2>
<ul>
<li><a href="http://drupal.org/project/token">Token module</a></li>
</ul>
<h2 id="recommended">Recommended</h2>
<ul>
<li><a href="http://drupal.org/project/devel">Devel module</a> - useful to run <code>dpm()</code> and <code>kpr()</code> functions</li>
<li><a href="http://drupal.org/project/copyright_block">Copyright Block module</a> - 7.x-2.x and 6.x-1.x use tokens, handy as a reference</li>
</ul>
<h2 id="implementing-hook_token_info">Implementing hook_token_info()</h2>
<p>The first thing that we need to do is define the new token type and/or the token itself, along with it's descriptive text. To view the existing tokens and types, use <code>dpm(token_get_info());</code>, assuming that you have the <a href="http://drupal.org/project/devel">Devel module</a> installed.</p>
<pre><code class="language-php">/**
* Implements hook_token_info().
*/
function foo_token_info() {
$info = array();
// Add any new tokens.
$info['tokens']['foo']['bar'] = t('This is my new bar token within the foo type.');
// Return them.
return $info;
}
</code></pre>
<p>In this case, the token called <em>bar</em> resides within the <em>foo</em> group.</p>
<p>If I needed to add a new token within an existing token type, such as 'node', the syntax would be <code>$info['tokens']['node']['bar']</code>.</p>
<h2 id="implementing-hook_tokens">Implementing hook_tokens()</h2>
<p>Now that the Token module is aware of our new token, we now need to determine what the token is replaced with. This is done using <code>hook_tokens()</code>. Here is the basic code needed for an implementation:</p>
<pre><code class="language-php">/**
* Implements hook_tokens().
*/
function foo_tokens($type, $tokens, array $data = array(), array $options = array()) {
$replacements = array();
// Code goes here...
// Return the replacements.
return $replacements;
}
</code></pre>
<p>The first thing to check for is the type of token using an <code>if()</code> function, as this could be an existing type like 'node', 'user' or 'site', or a custom token type like 'foo'. Once we're sure that we're looking at the right type(s), we can use <code>foreach ($tokens as $name =&gt; $original)</code> to loop through each of the available tokens using a <code>switch()</code>. For each token, you can perform some logic to work out the replacement text and then add it into the replacements array using <code>$replacements[$original] = $new;</code>.</p>
<pre><code class="language-php">/**
* Implements hook_tokens().
*/
function foo_tokens($type, $tokens, array $data = array(), array $options = array()) {
$replacements = array();
// The first thing that we're going to check for is the type of token - node,
// user etc...
if ($type == 'foo') {
// Loop through each of the available tokens.
foreach ($tokens as $name =&gt; $original) {
// Find the desired token by name
switch ($name) {
case 'bar':
$new = '';
// Work out the value of $new...
// Add the new value into the replacements array.
$replacements[$original] = $new;
break;
}
}
}
// Return the replacements.
return $replacements;
}
</code></pre>
<h2 id="example">Example</h2>
<p>An example from Copyright Block module:</p>
<pre><code class="language-php">/**
* Implements hook_tokens().
*/
function copyright_block_tokens($type, $tokens, array $data = array(), array $options = array()) {
$replacements = array();
if ($type == 'copyright_statement') {
foreach ($tokens as $name =&gt; $original) {
switch ($name) {
case 'dates':
$start_year = variable_get('copyright_block_start_year', date('Y'));
$current_year = date('Y');
$replacements[$original] = $start_year &lt; $current_year ? $start_year . '-' . $current_year : $start_year;
break;
}
}
}
return $replacements;
}
</code></pre>
<h2 id="using-token_replace">Using token_replace()</h2>
<p>With everything defined, all that we now need to do is pass some text through the <code>token_replace()</code> function to replace it with the values defined within <code>hook_token()</code>.</p>
<pre><code class="language-php">$a = t('Something');
// This would use any token type - node, user etc.
$b = token_replace($a);
// This would only use foo tokens.
$c = token_replace($a, array('foo'));
</code></pre>
<p class="tags">
Tags:
<a href="https://www.oliverdavies.uk/blog/tags/drupal">drupal</a>, <a href="https://www.oliverdavies.uk/blog/tags/drupal-planet">drupal-planet</a>, <a href="https://www.oliverdavies.uk/blog/tags/drupal-7">drupal-7</a>, <a href="https://www.oliverdavies.uk/blog/tags/tokens">tokens</a> </p>
<div class="post-pager is-flex">
<div class="is-half">
<a href="/blog/2013/01/09/checking-if-user-logged-drupal-right-way">
&laquo; Checking if a user is logged into Drupal (the right way)
</a>
</div>
<div class="is-half text-right">
<a href="/blog/2013/03/02/quickest-way-install-sublime-text-2-ubuntu">
The Quickest way to Install Sublime Text 2 in Ubuntu &raquo;
</a>
</div>
</div>
<div class="about-author">
<h2>About the Author</h2>
<img src="//images.oliverdavies.uk/assets/images/me-precedent.jpg" alt="Picture of Oliver" class="img-circle">
<p>Oliver Davies is a Web Developer, System Administrator and Drupal specialist based in the UK. He is a Senior Developer at <a href="https://microserve.io">Microserve</a> and also provides freelance consultancy services for Drupal websites, PHP applications and Linux servers.</p>
</div>
</main>
<div class="col-md-3">
<div class="panel badges text-center">
<a class="badge--da-member" href="https://assoc.drupal.org/membership" title="Im a Drupal Association member.">
<img
src="//images.oliverdavies.uk/assets/images/da-individual-member.png"
alt="Drupal Association Individual Member"
width="152"
>
</a>
<a href="http://drupalcores.com/#opdavies">
<img
alt="I built Drupal 8 with hand holding a wrench on blue background"
src="//images.oliverdavies.uk/assets/images/drupal-8.jpg"
/>
</a>
<img
src="//images.oliverdavies.uk/assets/images/badges/acquia-certified-developer-drupal-8.png"
alt="Acquia Certified Developer - Drupal 8 Exam Badge"
height="147" width="147"
/>
<a href="http://conference.phpnw.org.uk/phpnw17">
<img src="//images.oliverdavies.uk/assets/images/badges/phpnw17.png" alt="">
</a>
</div>
<div class="availability panel panel-default">
<div class="panel-heading">Availability</div>
<div class="panel-body">
<p>
<i class="fa fa-thumbs-o-up text-warning"></i>
Currently have limited part-time capacity
</p>
<p>
<i class="fa fa-thumbs-o-down text-danger"></i>
Currently no spare full-time capacity.
</p>
</div>
</div>
<div class="latest-posts panel panel-default">
<div class="latest-posts__heading panel-heading">Latest blog posts</div>
<ul class="list-group">
<li class="post list-group-item">
<span class="post__title">
<a href="/blog/2017/06/09/introducing-the-drupal-meetups-twitterbot">
Introducing the Drupal Meetups Twitterbot
</a>
</span> -
<span class="post__date">9th June, 2017</span>
</li>
<li class="post list-group-item">
<span class="post__title">
<a href="/blog/2017/05/20/turning-drupal-module-into-feature">
Turning Your Custom Drupal Module into a Feature
</a>
</span> -
<span class="post__date">20th May, 2017</span>
</li>
<li class="post list-group-item">
<span class="post__title">
<a href="/blog/2017/05/15/drupalcamp-bristol-early-bird-tickets-sessions-sponsors">
DrupalCamp Bristol 2017 - Early Bird Tickets, Call for Sessions, Sponsors
</a>
</span> -
<span class="post__date">15th May, 2017</span>
</li>
</ul>
</div>
</div>
</div> </div>
<footer class="container">
<p class="copyright">
&copy; 2010-2017 Oliver Davies. Built with <a href="https://sculpin.io">Sculpin</a>.
</p>
<div class="meetups">
<h2>Things that I organise</h2>
<ul>
<li class="meetups--drupal-bristol">
<a href="http://www.drupalbristol.org.uk" title="Drupal Bristol">
<img
src="//images.oliverdavies.uk/assets/images/meetups/drupal-bristol.jpeg"
alt="Drupal Bristol logo"
>
</a>
</li>
<li class="meetups--drupalcamp-bristol">
<a href="http://www.drupalcampbristol.co.uk" title="DrupalCamp Bristol">
<img
src="//images.oliverdavies.uk/assets/images/meetups/drupalcamp-bristol.png"
alt="DrupalCamp Bristol logo"
>
</a>
</li>
<li class="meetups--phpsw">
<a href="http://phpsw.uk" title="PHPSW">
<img
src="//images.oliverdavies.uk/assets/images/meetups/phpsw.jpeg"
alt="PHPSW logo"
>
</a>
</li>
</ul>
</div>
</footer>
<script src="https://www.oliverdavies.uk/assets/js/site.js"></script>
<script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-11967257-1', 'auto'); ga('send', 'pageview');</script>
</body>
</html>