| 1 | $Id: API.txt,v 1.2.2.1 2007/10/29 04:40:41 eaton Exp $
|
| 2 |
|
| 3 | Overview
|
| 4 | ========
|
| 5 | In many cases, it's useful to allow users to define patterns or large
|
| 6 | chunks of text that contain programmatically derived values. For example,
|
| 7 | form email messages addressed to a given user, or url path aliases
|
| 8 | containing the title of a given node. Both examples require bits of data
|
| 9 | that vary each time the text is generated -- node titles, user ids, and
|
| 10 | so on. Rather than forcing users to embed ugly snippets of PHP, or creating
|
| 11 | elaborate and bizarre UIs for configuring the patterns via the browser,
|
| 12 | it's most useful to give users a set of 'placeholder' tokens to place in
|
| 13 | their text.
|
| 14 |
|
| 15 | Token.module provides a shared API for exposing and using placeholder
|
| 16 | tokens and their appropriate replacement values. It does nothing *by
|
| 17 | itself* -- other modules can use it to avoid reinventing the wheel.
|
| 18 |
|
| 19 | Using Token Replacement
|
| 20 | =======================
|
| 21 | To apply token replacement to a chunk of text, you have two options. The
|
| 22 | first, and simplest, is:
|
| 23 |
|
| 24 | token_replace($original, $type = 'global', $object = NULL,
|
| 25 | $leading = '[', $trailing = ']')
|
| 26 |
|
| 27 | $original is the source text to perform substitutions on: it can be either
|
| 28 | a simple string, or an array of multiple strings.
|
| 29 |
|
| 30 | $type and $object are to be used when performing substitution based on a
|
| 31 | particular Drupal object. Replacing tokens in an email with values from
|
| 32 | a particular user account, or replacing tokens in a path alias pattern with
|
| 33 | values from the node being aliased, are two examples.
|
| 34 |
|
| 35 | $type should contain the general object type (node, comment, user, etc.)
|
| 36 | while $object should contain the object itself.
|
| 37 |
|
| 38 | $leading and $trailing can be used to override the default token style.
|
| 39 | For example, to replace tokens using %this style, pass in '%' and '' for
|
| 40 | the $leading and $trailing values. Note that passing in a leading but NOT
|
| 41 | trailing value can lead to false positives if two tokens are named in a
|
| 42 | similar fashion (%node_term and %node_term_id, for example).
|
| 43 |
|
| 44 |
|
| 45 |
|
| 46 | Altering The Replacement Values
|
| 47 | ===============================
|
| 48 | If your module needs to perform additional cleanup work on the replacement
|
| 49 | values before doing the actual substitutions (cleaning replacement values
|
| 50 | to make them appropriate for path aliasing, truncating them to a particular
|
| 51 | length, etc.) you can manually retrieve the list of tokens and replacement
|
| 52 | values, then call str_replace() yourself.
|
| 53 |
|
| 54 | token_get_values($type = 'global', $object = NULL)
|
| 55 |
|
| 56 | Pass in the $type and $object as you would with the simpler token_replace()
|
| 57 | function. The return value will be an object containing one array of tokens
|
| 58 | and one array of values as in this example:
|
| 59 |
|
| 60 | stdClass Object {
|
| 61 | [tokens] => array(
|
| 62 | [0] => mytoken1,
|
| 63 | [1] => mytoken2
|
| 64 | ),
|
| 65 | [values] => array(
|
| 66 | [0] => value1,
|
| 67 | [1] => value2,
|
| 68 | )
|
| 69 | }
|
| 70 |
|
| 71 |
|
| 72 |
|
| 73 | Providing Placeholder Tokens
|
| 74 | ============================
|
| 75 | Token.module provides a small set of default placeholders for global values
|
| 76 | like the name of the currently logged in user, the site's URL, and so on.
|
| 77 | Any module can provide additional tokens by implementing two hooks.
|
| 78 |
|
| 79 | Security note: For tokens which include user input, users and modules
|
| 80 | expect to see both a ['token-name'] and a ['token-name-raw'] value.
|
| 81 |
|
| 82 |
|
| 83 | hook_token_values($type, $object = NULL)
|
| 84 | ========================================
|
| 85 | This function should return a keyed array of placeholders, and their
|
| 86 | replacement values. $type contains the current context -- 'node', 'user',
|
| 87 | 'global', etc. $object contains the specific node, user, etc. that
|
| 88 | should be used as the basis for the replacements. *Only* generate and
|
| 89 | return replacement tokens when $type is something that your module can
|
| 90 | really deal with. That helps keep things speedy and avoid needlessly
|
| 91 | searching for jillions of replacement tokens. The $options array can
|
| 92 | contain additional options (exact use is dynamic and not easily documented).
|
| 93 |
|
| 94 | For example:
|
| 95 |
|
| 96 | function my_user_token_values($type, $object = NULL, $options = array()) {
|
| 97 | if ($type == 'user') {
|
| 98 | $user = $object;
|
| 99 | $tokens['name'] = $user->name;
|
| 100 | $tokens['mail'] = $user->mail;
|
| 101 | return $tokens;
|
| 102 | }
|
| 103 | }
|
| 104 |
|
| 105 |
|
| 106 | hook_token_list($type = 'all')
|
| 107 | ==============================
|
| 108 | This function is used to provide help and inline documentation for all
|
| 109 | of the possible replacement tokens.
|
| 110 |
|
| 111 | As with hook_token_values, $type indicates the context that token help
|
| 112 | is being generated for. Unlike hook_token_values however, you should
|
| 113 | show ALL tokens at the same time if $type is 'all'. As such, the help
|
| 114 | text should be keyed by the $type context your module will use when
|
| 115 | doing the actual replacements. For example:
|
| 116 |
|
| 117 | function my_user_token_list($type = 'all') {
|
| 118 | if ($type == 'user' || $type == 'all') {
|
| 119 | $tokens['user']['name'] = t("The user's name");
|
| 120 | $tokens['user']['mail'] = t("The user's email address");
|
| 121 | return $tokens;
|
| 122 | }
|
| 123 | }
|
| 124 |
|
| 125 | Examples of more elaborate token replacement setups can be found in the
|
| 126 | token_node.inc file that's bundled with token.module.
|
| 127 |
|
| 128 | Security Note
|
| 129 | ========
|
| 130 | If use any of the tokens in the ['raw'] sub-array then please note that these
|
| 131 | are unfiltered values which could conceivably contain XSS attacks or other
|
| 132 | malicious data. Your module should then provide it's own filtering to ensure the
|
| 133 | safety of site users.
|