Projet

Général

Profil

Paste
Télécharger (44,3 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / rules / rules.api.php @ 87dbc3bf

1
<?php
2

    
3
/**
4
 * @file
5
 * This file contains no working PHP code; it exists to provide additional
6
 * documentation for doxygen as well as to document hooks in the standard
7
 * Drupal manner.
8
 */
9

    
10

    
11
/**
12
 * @defgroup rules Rules module integrations.
13
 *
14
 * Module integrations with the rules module.
15
 *
16
 * The Rules developer documentation describes how modules can integrate with
17
 * rules: http://drupal.org/node/298486.
18
 */
19

    
20
/**
21
 * @defgroup rules_hooks Rules' hooks
22
 * @{
23
 * Hooks that can be implemented by other modules in order to extend rules.
24
 */
25

    
26
/**
27
 * Define rules compatible actions.
28
 *
29
 * This hook is required in order to add a new rules action. It should be
30
 * placed into the file MODULENAME.rules.inc, which gets automatically included
31
 * when the hook is invoked.
32
 *
33
 * However, as an alternative to implementing this hook, class based plugin
34
 * handlers may be provided by implementing RulesActionHandlerInterface. See
35
 * the interface for details.
36
 *
37
 * @return
38
 *   An array of information about the module's provided rules actions.
39
 *   The array contains a sub-array for each action, with the action name as
40
 *   the key. Actions names may only contain lowercase alpha-numeric characters
41
 *   and underscores and should be prefixed with the providing module name.
42
 *   Possible attributes for each sub-array are:
43
 *   - label: The label of the action. Start capitalized. Required.
44
 *   - group: A group for this element, used for grouping the actions in the
45
 *     interface. Should start with a capital letter and be translated.
46
 *     Required.
47
 *   - parameter: (optional) An array describing all parameter of the action
48
 *     with the parameter's name as key. Each parameter has to be
49
 *     described by a sub-array with possible attributes as described
50
 *     afterwards, whereas the name of a parameter needs to be a lowercase,
51
 *     valid PHP variable name.
52
 *   - provides: (optional) An array describing the variables the action
53
 *     provides to the evaluation state with the variable name as key. Each
54
 *     variable has to be described by a sub-array with possible attributes as
55
 *     described afterwards, whereas the name of a parameter needs to be a
56
 *     lowercase, valid PHP variable name.
57
 *   - 'named parameter': (optional) If set to TRUE, the arguments will be
58
 *     passed as a single array with the parameter names as keys. This emulates
59
 *     named parameters in PHP and is in particular useful if the number of
60
 *     parameters can vary. Defaults to FALSE.
61
 *   - base: (optional) The base for action implementation callbacks to use
62
 *     instead of the action's name. Defaults to the action name.
63
 *   - callbacks: (optional) An array which allows to set specific function
64
 *     callbacks for the action. The default for each callback is the actions
65
 *     base appended by '_' and the callback name.
66
 *   - 'access callback': (optional) A callback which has to return whether the
67
 *     currently logged in user is allowed to configure this action. See
68
 *     rules_node_integration_access() for an example callback.
69
 *  Each 'parameter' array may contain the following properties:
70
 *   - label: The label of the parameter. Start capitalized. Required.
71
 *   - type: The rules data type of the parameter, which is to be passed to the
72
 *     action. All types declared in hook_rules_data_info() may be specified, as
73
 *     well as an array of possible types. Also lists and lists of a given type
74
 *     can be specified by using the notating list<integer> as introduced by
75
 *     the entity metadata module, see hook_entity_property_info(). The special
76
 *     keyword '*' can be used when all types should be allowed. Required.
77
 *   - bundles: (optional) An array of bundle names. When the specified type is
78
 *     set to a single entity type, this may be used to restrict the allowed
79
 *     bundles.
80
 *   - description: (optional) If necessary, a further description of the
81
 *     parameter.
82
 *   - options list: (optional) A callback that returns an array of possible
83
 *     values for this parameter. The callback has to return an array as used
84
 *     by hook_options_list(). For an example implementation see
85
 *     rules_data_action_type_options().
86
 *   - save: (optional) If this is set to TRUE, the parameter will be saved by
87
 *     rules when the rules evaluation ends. This is only supported for savable
88
 *     data types. If the action returns FALSE, saving is skipped.
89
 *   - optional: (optional) May be set to TRUE, when the parameter isn't
90
 *     required.
91
 *   - 'default value': (optional) The value to pass to the action, in case the
92
 *     parameter is optional and there is no specified value.
93
 *   - 'allow null': (optional) Usually Rules will not pass any NULL values as
94
 *     argument, but abort the evaluation if a NULL value is present. If set to
95
 *     TRUE, Rules will not abort and pass the NULL value through. Defaults to
96
 *     FALSE.
97
 *   - restriction: (optional) Restrict how the argument for this parameter may
98
 *     be provided. Supported values are 'selector' and 'input'.
99
 *   - default mode: (optional) Customize the default mode for providing the
100
 *     argument value for a parameter. Supported values are 'selector' and
101
 *     'input'. The default depends on the required data type.
102
 *   - sanitize: (optional) Allows parameters of type 'text' to demand an
103
 *     already sanitized argument. If enabled, any user specified value won't be
104
 *     sanitized itself, but replacements applied by input evaluators are as
105
 *     well as values retrieved from selected data sources.
106
 *   - translatable: (optional) If set to TRUE, the provided argument value
107
 *     of the parameter is translatable via i18n String translation. This is
108
 *     applicable for textual parameters only, i.e. parameters of type 'text',
109
 *     'token', 'list<text>' and 'list<token>'. Defaults to FALSE.
110
 *   - ui class: (optional) Allows overriding the UI class, which is used to
111
 *     generate the configuration UI of a parameter. Defaults to the UI class of
112
 *     the specified data type.
113
 *   - cleaning callback: (optional) A callback that input evaluators may use
114
 *     to clean inserted replacements; e.g. this is used by the token evaluator.
115
 *   - wrapped: (optional) Set this to TRUE in case the data should be passed
116
 *     wrapped. This only applies to wrapped data types, e.g. entities.
117
 *  Each 'provides' array may contain the following properties:
118
 *   - label: The label of the variable. Start capitalized. Required.
119
 *   - type: The rules data type of the variable. All types declared in
120
 *     hook_rules_data_info() may be specified. Types may be parametrized e.g.
121
 *     the types node<page> or list<integer> are valid.
122
 *   - save: (optional) If this is set to TRUE, the provided variable is saved
123
 *     by rules when the rules evaluation ends. Only possible for savable data
124
 *     types. Defaults to FALSE.
125
 *
126
 *  The module has to provide an implementation for each action, being a
127
 *  function named as specified in the 'base' key or for the execution callback.
128
 *  All other possible callbacks are optional.
129
 *  Supported action callbacks by rules are defined and documented in the
130
 *  RulesPluginImplInterface. However any module may extend the action plugin
131
 *  based upon a defined interface using hook_rules_plugin_info(). All methods
132
 *  defined in those interfaces can be overridden by the action implementation.
133
 *  The callback implementations for those interfaces may reside in any file
134
 *  specified in hook_rules_file_info().
135
 *
136
 *  @see hook_rules_file_info()
137
 *  @see rules_action_execution_callback()
138
 *  @see hook_rules_plugin_info()
139
 *  @see RulesPluginImplInterface
140
 */
141
function hook_rules_action_info() {
142
  return array(
143
    'mail_user' => array(
144
      'label' => t('Send a mail to a user'),
145
      'parameter' => array(
146
        'user' => array('type' => 'user', 'label' => t('Recipient')),
147
      ),
148
      'group' => t('System'),
149
      'base' => 'rules_action_mail_user',
150
      'callbacks' => array(
151
        'validate' => 'rules_action_custom_validation',
152
        'help' => 'rules_mail_help',
153
      ),
154
    ),
155
  );
156
}
157

    
158
/**
159
 * Define categories for Rules items, e.g. actions, conditions or events.
160
 *
161
 * Categories are similar to the previously used 'group' key in e.g.
162
 * hook_rules_action_info(), but have a machine name and some more optional
163
 * keys like a weight, or an icon.
164
 *
165
 * For best compatibility, modules may keep using the 'group' key for referring
166
 * to categories. However, if a 'group' key and a 'category' is given the group
167
 * will be treated as grouping in the given category (e.g. group "paypal" in
168
 * category "commerce payment").
169
 *
170
 * @return
171
 *   An array of information about the module's provided categories.
172
 *   The array contains a sub-array for each category, with the category name as
173
 *   the key. Names may only contain lowercase alpha-numeric characters
174
 *   and underscores and should be prefixed with the providing module name.
175
 *   Possible attributes for each sub-array are:
176
 *   - label: The label of the category. Start capitalized. Required.
177
 *   - weight: (optional) A weight for sorting the category. Defaults to 0.
178
 *   - equals group: (optional) For BC, categories may be defined that equal
179
 *     a previsouly used 'group'.
180
 *   - icon: (optional) The file path of an icon to use, relative to the module
181
 *     or specified icon path. The icon should be a transparent SVG containing
182
 *     no colors (only #fff). See https://drupal.org/node/2090265 for
183
 *     instructions on how to create a suiting icon.
184
 *     Note that the icon is currently not used by Rules, however other UIs
185
 *     building upon Rules (like fluxkraft) do, and future releases of Rules
186
 *     might do as well. Consequently, the definition of an icon is optional.
187
 *     However, if both an icon font and icon is given, the icon is preferred.
188
 *   - icon path: (optional) The base path for the icon. Defaults to the
189
 *     providing module's directory.
190
 *   - icon font class: (optional) An icon font class referring to a suiting
191
 *     icon. Icon font class names should map to the ones as defined by Font
192
 *     Awesome, while themes might want to choose to provide another icon font.
193
 *     See http://fortawesome.github.io/Font-Awesome/cheatsheet/.
194
 *   - icon background color: (optional) The color used as icon background.
195
 *     Should have a high contrast to white. Defaults to #ddd.
196
 */
197
function hook_rules_category_info() {
198
  return array(
199
    'rules_data' => array(
200
      'label' => t('Data'),
201
      'equals group' => t('Data'),
202
      'weight' => -50,
203
    ),
204
    'fluxtwitter' => array(
205
      'label' => t('Twitter'),
206
      'icon font class' => 'icon-twitter',
207
      'icon font background color' => '#30a9fd',
208
    ),
209
  );
210
}
211

    
212
/**
213
 * Specify files containing rules integration code.
214
 *
215
 * All files specified in that hook will be included when rules looks for
216
 * existing callbacks for any plugin. Rules remembers which callback is found in
217
 * which file and automatically includes the right file before it is executing
218
 * a plugin method callback. The file yourmodule.rules.inc is added by default
219
 * and need not be specified here.
220
 * This allows you to add new include files only containing functions serving as
221
 * plugin method callbacks in any file without having to care about file
222
 * inclusion.
223
 *
224
 * @return
225
 *   An array of file names without the file ending which defaults to '.inc'.
226
 */
227
function hook_rules_file_info() {
228
  return array('yourmodule.rules-eval');
229
}
230

    
231
/**
232
 * Specifies directories for class-based plugin handler discovery.
233
 *
234
 * Implementing this hook is not a requirement, it is just one option to load
235
 * the files containing the classes during discovery - see
236
 * rules_discover_plugins().
237
 *
238
 * @return string|array
239
 *   A directory relative to the module directory, which holds the files
240
 *   containing rules plugin handlers, or multiple directories keyed by the
241
 *   module the directory is contained in.
242
 *   All files in those directories having a 'php' or 'inc' file extension will
243
 *   be loaded during discovery. Optionally, wildcards ('*') may be used to
244
 *   match multiple directories.
245
 *
246
 * @see rules_discover_plugins()
247
 */
248
function hook_rules_directory() {
249
  return 'lib/Drupal/fluxtwitter/Rules/*';
250
}
251

    
252
/**
253
 * The execution callback for an action.
254
 *
255
 * It should be placed in any file included by your module or in a file
256
 * specified using hook_rules_file_info().
257
 *
258
 * @param
259
 *   The callback gets arguments passed as described as parameter in
260
 *   hook_rules_action_info() as well as an array containing the action's
261
 *   configuration settings.
262
 * @return
263
 *   The action may return an array containg parameter or provided variables
264
 *   with their names as key. This is used update the value of a parameter or to
265
 *   provdide the value for a provided variable.
266
 *   Apart from that any parameters which have the key 'save' set to TRUE will
267
 *   be remembered to be saved by rules unless the action returns FALSE.
268
 *   Conditions have to return a boolean value in any case.
269
 *
270
 * @see hook_rules_action_info()
271
 * @see hook_rules_file_info()
272
 */
273
function rules_action_execution_callback($node, $title, $settings) {
274
  $node->title = $title;
275
  return array('node' => $node);
276
}
277

    
278
/**
279
 * Define rules conditions.
280
 *
281
 * This hook is required in order to add a new rules condition. It should be
282
 * placed into the file MODULENAME.rules.inc, which gets automatically included
283
 * when the hook is invoked.
284
 *
285
 * However, as an alternative to implementing this hook, class based plugin
286
 * handlers may be provided by implementing RulesConditionHandlerInterface. See
287
 * the interface for details.
288
 *
289
 * Adding conditions works exactly the same way as adding actions, with the
290
 * exception that conditions can't provide variables and cannot save parameters.
291
 * Thus the 'provides' attribute is not supported. Furthermore the condition
292
 * implementation callback has to return a boolean value.
293
 *
294
 * @see hook_rules_action_info()
295
 */
296
function hook_rules_condition_info() {
297
  return array(
298
    'rules_condition_text_compare' => array(
299
      'label' => t('Textual comparison'),
300
      'parameter' => array(
301
        'text1' => array('label' => t('Text 1'), 'type' => 'text'),
302
        'text2' => array('label' => t('Text 2'), 'type' => 'text'),
303
      ),
304
      'group' => t('Rules'),
305
    ),
306
  );
307
}
308

    
309
/**
310
 * Define rules events.
311
 *
312
 * This hook is required in order to add a new rules event. It should be
313
 * placed into the file MODULENAME.rules.inc, which gets automatically included
314
 * when the hook is invoked.
315
 * The module has to invoke the event when it occurs using rules_invoke_event().
316
 * This function call has to happen outside of MODULENAME.rules.inc,
317
 * usually it's invoked directly from the providing module but wrapped by a
318
 * module_exists('rules') check.
319
 *
320
 * However, as an alternative to implementing this hook, class based event
321
 * handlers may be provided by implementing RulesEventHandlerInterface. See
322
 * the interface for details.
323
 *
324
 * @return
325
 *   An array of information about the module's provided rules events. The array
326
 *   contains a sub-array for each event, with the event name as the key. The
327
 *   name may only contain lower case alpha-numeric characters and underscores
328
 *   and should be prefixed with the providing module name. Possible attributes
329
 *   for each sub-array are:
330
 *   - label: The label of the event. Start capitalized. Required.
331
 *   - group: A group for this element, used for grouping the events in the
332
 *     interface. Should start with a capital letter and be translated.
333
 *     Required.
334
 *   - class: (optional) An event handler class implementing the
335
 *     RulesEventHandlerInterface. If none is specified the
336
 *     RulesEventDefaultHandler class will be used. While the default event
337
 *     handler has no settings, custom event handlers may be implemented to
338
 *     to make an event configurable. See RulesEventHandlerInterface.
339
 *   - access callback: (optional) An callback, which has to return whether the
340
 *     currently logged in user is allowed to configure rules for this event.
341
 *     Access should be only granted, if the user at least may access all the
342
 *     variables provided by the event.
343
 *   - help: (optional) A help text for rules reaction on this event.
344
 *   - variables: (optional) An array describing all variables that are
345
 *     available for elements reacting on this event. Each variable has to be
346
 *     described by a sub-array with the possible attributes:
347
 *     - label: The label of the variable. Start capitalized. Required.
348
 *     - type: The rules data type of the variable. All types declared in
349
 *       hook_rules_data_info() or supported by hook_entity_property_info() may
350
 *       be specified.
351
 *     - bundle: (optional) If the type is an entity type, the bundle of the
352
 *       entity.
353
 *     - description: (optional) A description for the variable.
354
 *     - 'options list': (optional) A callback that returns an array of possible
355
 *       values for this variable as specified for entity properties at
356
 *       hook_entity_property_info().
357
 *     - 'skip save': (optional) If the variable is saved after the event has
358
 *       occurred anyway, set this to TRUE. So rules won't save the variable a
359
 *       second time. Defaults to FALSE.
360
 *     - handler: (optional) A handler to load the actual variable value. This
361
 *       is useful for lazy loading variables. The handler gets all so far
362
 *       available variables passed in the order as defined. Also see
363
 *       http://drupal.org/node/884554.
364
 *       Note that for lazy-loading entities just the entity id may be passed
365
 *       as variable value, so a handler is not necessary in that case.
366
 *
367
 *  @see rules_invoke_event()
368
 */
369
function hook_rules_event_info() {
370
  $items = array(
371
    'node_insert' => array(
372
      'label' => t('After saving new content'),
373
      'group' => t('Node'),
374
      'variables' => rules_events_node_variables(t('created content')),
375
    ),
376
    'node_update' => array(
377
      'label' => t('After updating existing content'),
378
      'group' => t('Node'),
379
      'variables' => rules_events_node_variables(t('updated content'), TRUE),
380
    ),
381
    'node_presave' => array(
382
      'label' => t('Content is going to be saved'),
383
      'group' => t('Node'),
384
      'variables' => rules_events_node_variables(t('saved content'), TRUE),
385
    ),
386
    'node_view' => array(
387
      'label' => t('Content is going to be viewed'),
388
      'group' => t('Node'),
389
      'variables' => rules_events_node_variables(t('viewed content')) + array(
390
        'view_mode' => array('type' => 'text', 'label' => t('view mode')),
391
      ),
392
    ),
393
    'node_delete' => array(
394
      'label' => t('After deleting content'),
395
      'group' => t('Node'),
396
      'variables' => rules_events_node_variables(t('deleted content')),
397
    ),
398
  );
399
  // Specify that on presave the node is saved anyway.
400
  $items['node_presave']['variables']['node']['skip save'] = TRUE;
401
  return $items;
402
}
403

    
404
/**
405
 * Define rules data types.
406
 *
407
 * This hook is required in order to add a new rules data type. It should be
408
 * placed into the file MODULENAME.rules.inc, which gets automatically included
409
 * when the hook is invoked.
410
 * Rules builds upon the entity metadata module, thus to improve the support of
411
 * your data in rules, make it an entity if possible and provide metadata about
412
 * its properties and CRUD functions by integrating with the entity metadata
413
 * module.
414
 * For a list of data types defined by rules see rules_rules_core_data_info().
415
 *
416
 *
417
 * @return
418
 *   An array of information about the module's provided data types. The array
419
 *   contains a sub-array for each data type, with the data type name as the
420
 *   key. The name may only contain lower case alpha-numeric characters and
421
 *   underscores and should be prefixed with the providing module name. Possible
422
 *   attributes for each sub-array are:
423
 *   - label: The label of the data type. Start uncapitalized. Required.
424
 *   - parent: (optional) A parent type may be set to specify a sub-type
425
 *     relationship, which will be only used for checking compatible types. E.g.
426
 *     the 'entity' data type is parent of the 'node' data type, thus a node may
427
 *     be also used for any action needing an 'entity' parameter. Can be set to
428
 *     any known rules data type.
429
 *   - ui class: (optional) Specify a class that is used to generate the
430
 *     configuration UI to configure parameters of this type. The given class
431
 *     must extend RulesDataUI and may implement the
432
 *     RulesDataDirectInputFormInterface in order to allow the direct data input
433
 *     configuration mode. For supporting selecting values from options lists,
434
 *     the UI class may implement RulesDataInputOptionsListInterface also.
435
 *     Defaults to RulesDataUI.
436
 *   - wrap: (optional) If set to TRUE, the data is wrapped internally using
437
 *     wrappers provided by the entity API module. This is required for entities
438
 *     and data structures to support selecting a property via the data selector
439
 *     and for intelligent saving.
440
 *   - is wrapped: (optional) In case the data wrapper is already wrapped when
441
 *     passed to Rules and Rules should not unwrap it when passing the data as
442
 *     argument, e.g. to an action, set this to TRUE. The default FALSE is fine
443
 *     in most cases.
444
 *   - wrapper class: (optional) Allows the specification of a custom wrapper
445
 *     class, which has to inherit from 'EntityMetadataWrapper'. If given Rules
446
 *     makes use of the class for wrapping the data of the given type. However
447
 *     note that if data is already wrapped when it is passed to Rules, the
448
 *     existing wrappers will be kept.
449
 *     For modules implementing identifiable data types being non-entites the
450
 *     class RulesIdentifiableDataWrapper is provided, which can be used as base
451
 *     for a custom wrapper class. See RulesIdentifiableDataWrapper for details.
452
 *   - property info: (optional) May be used for non-entity data structures to
453
 *     provide info about the data properties, such that data selectors via an
454
 *     entity metadata wrapper are supported. Specify an array as expected by
455
 *     the $info parameter of entity_metadata_wrapper().
456
 *   - creation callback: (optional) If 'property info' is given, an optional
457
 *     callback that makes use of the property info to create a new instance of
458
 *     this data type. Entities should use hook_entity_info() to specify the
459
 *     'creation callback' instead, as utilized by the entity API module. See
460
 *     rules_action_data_create_array() for an example callback.
461
 *   - property defaults: (optional) May be used for non-entity data structures
462
 *     to to provide property info defaults for the data properties. Specify an
463
 *     array as expected by entity_metadata_wrapper().
464
 *   - group: (optional) A group for this element, used for grouping the data
465
 *     types in the interface. Should start with a capital letter and be
466
 *     translated.
467
 *   - token type: (optional) The type name as used by the token module.
468
 *     Defaults to the type name as used by rules. Use FALSE to let token ignore
469
 *     this type.
470
 *   - cleaning callback: (optional) A callback that input evaluators may use
471
 *     to clean inserted replacements; e.g. this is used by the token evaluator.
472
 *
473
 *  @see entity_metadata_wrapper()
474
 *  @see hook_rules_data_info_alter()
475
 *  @see rules_rules_core_data_info()
476
 */
477
function hook_rules_data_info() {
478
  return array(
479
    'node' => array(
480
      'label' => t('content'),
481
      'parent' => 'entity',
482
      'group' => t('Node'),
483
    ),
484
    // Formatted text as used by in hook_entity_property_info() for text fields.
485
    'text_formatted' => array(
486
      'label' => t('formatted text'),
487
      'ui class' => 'RulesDataUITextFormatted',
488
      'wrap' => TRUE,
489
      'property info' => entity_property_text_formatted_info(),
490
    ),
491
  );
492
}
493

    
494
/**
495
 * Defines rules plugins.
496
 *
497
 * A rules configuration may consist of elements being instances of any rules
498
 * plugin. This hook can be used to define new or to extend rules plugins.
499
 *
500
 * @return
501
 *   An array of information about the module's provided rules plugins. The
502
 *   array contains a sub-array for each plugin, with the plugin name as the
503
 *   key. The name may only contain lower case alpha-numeric characters,
504
 *   underscores and spaces and should be prefixed with the providing module
505
 *   name. Possible attributes for
506
 *   each sub-array are:
507
 *   - label: A label for the plugin. Start capitalized. Required only for
508
 *     components (see below).
509
 *   - class: The implementation class. Has to extend the RulesPlugin class.
510
 *   - embeddable: A container class in which elements of those plugin may be
511
 *     embedded via the UI or FALSE to disallow embedding it via the UI. This
512
 *     has no implications on the API level though. Common classes that are
513
 *     used here are RulesConditionContainer and RulesActionContainer.
514
 *   - component: If set to TRUE, the rules admin UI will list elements of those
515
 *     plugin in the components UI and allows the creation of new components
516
 *     based upon this plugin. Optional.
517
 *   - extenders: This allows one to specify faces extenders, which may be used
518
 *     to dynamically implement interfaces. Optional. All extenders specified
519
 *     here are setup automatically by rules once the object is created. To
520
 *     specify set this to an array, where the keys are the implemented
521
 *     interfaces pointing to another array with the keys:
522
 *     - class: The class of the extender, implementing the FacesExtender
523
 *       and the specified interface. Either 'class' or 'methods' has to exist.
524
 *     - methods: An array of callbacks that implement the methods of the
525
 *       interface where the method names are the keys and the callback names
526
 *       the values. There has to be a callback for each defined method.
527
 *     - file: An optional array describing the file to include when a method
528
 *       of the interface is invoked. The array entries known are 'type',
529
 *       'module', and 'name' matching the parameters of module_load_include().
530
 *       Only 'module' is required as 'type' defaults to 'inc' and 'name' to
531
 *       NULL.
532
 *   - overrides: An optional array, which may be used to specify callbacks to
533
 *     override specific methods. For that the following keys are supported:
534
 *     - methods: As in the extenders array, but you may specify as many methods
535
 *       here as you like.
536
 *     - file: Optionally an array specifying a file to include for a method.
537
 *       For each method appearing in methods a file may be specified by using
538
 *       the method name as key and another array as value, which describes the
539
 *       file to include - looking like the file array supported by 'extenders'.
540
 *   - import keys: (optional) Embeddable plugins may specify an array of import
541
 *     keys, which the plugin make use for exporting. Defaults to the upper
542
 *     case plugin name, thus the key 'OR' in an export triggers the creation
543
 *     of the 'or' plugin. Note that only uppercase values are allowed, as
544
 *     lower case values are treated as action or condition exports.
545
 *
546
 *  @see class RulesPlugin
547
 *  @see hook_rules_plugin_info_alter()
548
 */
549
function hook_rules_plugin_info() {
550
  return array(
551
    'or' => array(
552
      'label' => t('Condition set (OR)'),
553
      'class' => 'RulesOr',
554
      'embeddable' => 'RulesConditionContainer',
555
      'component' => TRUE,
556
      'extenders' => array(
557
        'RulesPluginUIInterface' => array(
558
          'class' => 'RulesConditionContainerUI',
559
        ),
560
      ),
561
    ),
562
    'rule' => array(
563
      'class' => 'Rule',
564
      'embeddable' => 'RulesRuleSet',
565
      'extenders' => array(
566
        'RulesPluginUIInterface' => array(
567
          'class' => 'RulesRuleUI',
568
        ),
569
      ),
570
      'import keys' => array('DO', 'IF'),
571
    ),
572
  );
573
}
574

    
575
/**
576
 * Declare provided rules input evaluators.
577
 *
578
 * The hook implementation should be placed into the file MODULENAME.rules.inc,
579
 * which gets automatically included when the hook is invoked.
580
 * For implementing an input evaluator a class has to be provided which
581
 * extends the abstract RulesDataInputEvaluator class. Therefore the abstract
582
 * methods prepare() and evaluate() have to be implemented, as well as access()
583
 * and help() could be overridden in order to control access permissions or to
584
 * provide some usage help.
585
 *
586
 * @return
587
 *   An array of information about the module's provided input evaluators. The
588
 *   array contains a sub-array for each evaluator, with the evaluator name as
589
 *   the key. The name may only contain lower case alpha-numeric characters and
590
 *   underscores and should be prefixed with the providing module name. Possible
591
 *   attributes for each sub-array are:
592
 *   - class: The implementation class, which has to extend the
593
 *     RulesDataInputEvaluator class. Required.
594
 *   - weight: A weight for controlling the evaluation order of multiple
595
 *     evaluators. Required.
596
 *   - type: Optionally, the data types for which the input evaluator should be
597
 *     used. Defaults to 'text'. Multiple data types may be specified using an
598
 *     array.
599
 *
600
 *  @see class RulesDataInputEvaluator
601
 *  @see hook_rules_evaluator_info_alter()
602
 */
603
function hook_rules_evaluator_info() {
604
  return array(
605
    'token' => array(
606
      'class' => 'RulesTokenEvaluator',
607
      'type' => array('text', 'uri'),
608
      'weight' => 0,
609
     ),
610
  );
611
}
612

    
613
/**
614
 * Declare provided rules data processors.
615
 *
616
 * The hook implementation should be placed into the file MODULENAME.rules.inc,
617
 * which gets automatically included when the hook is invoked.
618
 * For implementing a data processors a class has to be provided which
619
 * extends the abstract RulesDataProcessor class. Therefore the abstract
620
 * method process() has to be implemented, but also the methods form() and
621
 * access() could be overridden in order to provide a configuration form or
622
 * to control access permissions.
623
 *
624
 * @return
625
 *   An array of information about the module's provided data processors. The
626
 *   array contains a sub-array for each processor, with the processor name as
627
 *   the key. The name may only contain lower case alpha-numeric characters and
628
 *   underscores and should be prefixed with the providing module name, whereas
629
 *   'select' is reserved as well.
630
 *   Possible attributes for each sub-array are:
631
 *   - class: The implementation class, which has to extend the
632
 *     RulesDataProcessor class. Required.
633
 *   - weight: A weight for controlling the processing order of multiple data
634
 *     processors. Required.
635
 *   - type: Optionally, the data types for which the data processor should be
636
 *     used. Defaults to 'text'. Multiple data types may be specified using an
637
 *     array.
638
 *
639
 *  @see class RulesDataProcessor
640
 *  @see hook_rules_data_processor_info_alter()
641
 */
642
function hook_rules_data_processor_info() {
643
  return array(
644
    'date_offset' => array(
645
      'class' => 'RulesDateOffsetProcessor',
646
      'type' => 'date',
647
      'weight' => -2,
648
     ),
649
  );
650
}
651

    
652
/**
653
 * Alter rules compatible actions.
654
 *
655
 * The implementation should be placed into the file MODULENAME.rules.inc, which
656
 * gets automatically included when the hook is invoked.
657
 *
658
 * @param $actions
659
 *   The items of all modules as returned from hook_rules_action_info().
660
 *
661
 * @see hook_rules_action_info().
662
 */
663
function hook_rules_action_info_alter(&$actions) {
664
  // The rules action is more powerful, so hide the core action
665
  unset($actions['rules_core_node_assign_owner_action']);
666
  // We prefer handling saving by rules - not by the user.
667
  unset($actions['rules_core_node_save_action']);
668
}
669

    
670
/**
671
 * Alter rules conditions.
672
 *
673
 * The implementation should be placed into the file MODULENAME.rules.inc, which
674
 * gets automatically included when the hook is invoked.
675
 *
676
 * @param $conditions
677
 *   The items of all modules as returned from hook_rules_condition_info().
678
 *
679
 * @see hook_rules_condition_info()
680
 */
681
function hook_rules_condition_info_alter(&$conditions) {
682
  // Change conditions.
683
}
684

    
685
/**
686
 * Alter rules events.
687
 *
688
 * The implementation should be placed into the file MODULENAME.rules.inc, which
689
 * gets automatically included when the hook is invoked.
690
 *
691
 * @param $events
692
 *   The items of all modules as returned from hook_rules_event_info().
693
 *
694
 * @see hook_rules_event_info().
695
 */
696
function hook_rules_event_info_alter(&$events) {
697
  // Change events.
698
}
699

    
700
/**
701
 * Alter rules data types.
702
 *
703
 * The implementation should be placed into the file MODULENAME.rules.inc, which
704
 * gets automatically included when the hook is invoked.
705
 *
706
 * @param $data_info
707
 *   The items of all modules as returned from hook_rules_data_info().
708
 *
709
 * @see hook_rules_data_info()
710
 */
711
function hook_rules_data_info_alter(&$data_info) {
712
  // Change data types.
713
}
714

    
715
/**
716
 * Alter rules plugin info.
717
 *
718
 * The implementation should be placed into the file MODULENAME.rules.inc, which
719
 * gets automatically included when the hook is invoked.
720
 *
721
 * @param $plugin_info
722
 *   The items of all modules as returned from hook_rules_plugin_info().
723
 *
724
 * @see hook_rules_plugin_info()
725
 */
726
function hook_rules_plugin_info_alter(&$plugin_info) {
727
  // Change plugin info.
728
}
729

    
730
/**
731
 * Alter rules input evaluator info.
732
 *
733
 * The implementation should be placed into the file MODULENAME.rules.inc, which
734
 * gets automatically included when the hook is invoked.
735
 *
736
 * @param $evaluator_info
737
 *   The items of all modules as returned from hook_rules_evaluator_info().
738
 *
739
 * @see hook_rules_evaluator_info()
740
 */
741
function hook_rules_evaluator_info_alter(&$evaluator_info) {
742
  // Change evaluator info.
743
}
744

    
745
/**
746
 * Alter rules data_processor info.
747
 *
748
 * The implementation should be placed into the file MODULENAME.rules.inc, which
749
 * gets automatically included when the hook is invoked.
750
 *
751
 * @param $processor_info
752
 *   The items of all modules as returned from hook_rules_data_processor_info().
753
 *
754
 * @see hook_rules_data_processor_info()
755
 */
756
function hook_rules_data_processor_info_alter(&$processor_info) {
757
  // Change processor info.
758
}
759

    
760
/**
761
 * Act on rules configuration being loaded from the database.
762
 *
763
 * This hook is invoked during rules configuration loading, which is handled
764
 * by entity_load(), via classes RulesEntityController and EntityCRUDController.
765
 *
766
 * @param $configs
767
 *   An array of rules configurations being loaded, keyed by id.
768
 */
769
function hook_rules_config_load($configs) {
770
  $result = db_query('SELECT id, foo FROM {mytable} WHERE id IN(:ids)', array(':ids' => array_keys($configs)));
771
  foreach ($result as $record) {
772
    $configs[$record->id]->foo = $record->foo;
773
  }
774
}
775

    
776
/**
777
 * Respond to creation of a new rules configuration.
778
 *
779
 * This hook is invoked after the rules configuration is inserted into the
780
 * the database.
781
 *
782
 * @param RulesPlugin $config
783
 *   The rules configuration that is being created.
784
 */
785
function hook_rules_config_insert($config) {
786
  db_insert('mytable')
787
    ->fields(array(
788
      'nid' => $config->id,
789
      'plugin' => $config->plugin,
790
    ))
791
    ->execute();
792
}
793

    
794
/**
795
 * Act on a rules configuration being inserted or updated.
796
 *
797
 * This hook is invoked before the rules configuration is saved to the
798
 * database.
799
 *
800
 * @param RulesPlugin $config
801
 *   The rules configuration that is being inserted or updated.
802
 */
803
function hook_rules_config_presave($config) {
804
  if ($config->id && $config->owner == 'your_module') {
805
    // Add custom condition.
806
    $config->conditon(/* Your condition */);
807
  }
808
}
809

    
810
/**
811
 * Respond to updates to a rules configuration.
812
 *
813
 * This hook is invoked after the configuration has been updated in the
814
 * database.
815
 *
816
 * @param RulesPlugin $config
817
 *   The rules configuration that is being updated.
818
 */
819
function hook_rules_config_update($config) {
820
  db_update('mytable')
821
    ->fields(array('plugin' => $config->plugin))
822
    ->condition('id', $config->id)
823
    ->execute();
824
}
825

    
826
/**
827
 * Respond to rules configuration deletion.
828
 *
829
 * This hook is invoked after the configuration has been removed from the
830
 * database.
831
 *
832
 * @param RulesPlugin $config
833
 *   The rules configuration that is being deleted.
834
 */
835
function hook_rules_config_delete($config) {
836
  db_delete('mytable')
837
    ->condition('id', $config->id)
838
    ->execute();
839
}
840

    
841
/**
842
 * Respond to rules configuration execution.
843
 *
844
 * This hook is invoked right before the rules configuration is executed.
845
 *
846
 * @param RulesPlugin $config
847
 *   The rules configuration that is being executed.
848
 */
849
function hook_rules_config_execute($config) {
850

    
851
}
852

    
853
/**
854
 * Define default rules configurations.
855
 *
856
 * This hook is invoked when rules configurations are loaded. The implementation
857
 * should be placed into the file MODULENAME.rules_defaults.inc, which gets
858
 * automatically included when the hook is invoked.
859
 *
860
 * @return
861
 *   An array of rules configurations with the configuration names as keys.
862
 *
863
 * @see hook_default_rules_configuration_alter()
864
 * @see hook_rules_config_defaults_rebuild()
865
 */
866
function hook_default_rules_configuration() {
867
  $rule = rules_reaction_rule();
868
  $rule->label = 'example default rule';
869
  $rule->active = FALSE;
870
  $rule->event('node_update')
871
       ->condition(rules_condition('data_is', array('data:select' => 'node:status', 'value' => TRUE))->negate())
872
       ->condition('data_is', array('data:select' => 'node:type', 'value' => 'page'))
873
       ->action('drupal_message', array('message' => 'A node has been updated.'));
874

    
875
  $configs['rules_test_default_1'] = $rule;
876
  return $configs;
877
}
878

    
879
/**
880
 * Alter default rules configurations.
881
 *
882
 * The implementation should be placed into the file
883
 * MODULENAME.rules_defaults.inc, which gets automatically included when the
884
 * hook is invoked.
885
 *
886
 * @param $configs
887
 *   The default configurations of all modules as returned from
888
 *   hook_default_rules_configuration().
889
 *
890
 * @see hook_default_rules_configuration()
891
 */
892
function hook_default_rules_configuration_alter(&$configs) {
893
  // Add custom condition.
894
  $configs['foo']->condition('bar');
895
}
896

    
897
/**
898
 * Act after rebuilding default configurations.
899
 *
900
 * This hook is invoked by the entity module after default rules configurations
901
 * have been rebuilt; i.e. defaults have been saved to the database.
902
 *
903
 * @param $rules_configs
904
 *   The array of default rules configurations which have been inserted or
905
 *   updated, keyed by name.
906
 * @param $originals
907
 *   An array of original rules configurations keyed by name; i.e. the rules
908
 *   configurations before the current defaults have been applied. For inserted
909
 *   rules configurations no original is available.
910
 *
911
 * @see hook_default_rules_configuration()
912
 * @see entity_defaults_rebuild()
913
 */
914
function hook_rules_config_defaults_rebuild($rules_configs, $originals) {
915
  // Once all defaults have been rebuilt, update all i18n strings at once. That
916
  // way we build the rules cache once the rebuild is complete and avoid
917
  // rebuilding caches for each updated rule.
918
  foreach ($rules_configs as $name => $rule_config) {
919
    if (empty($originals[$name])) {
920
      rules_i18n_rules_config_insert($rule_config);
921
    }
922
    else {
923
      rules_i18n_rules_config_update($rule_config, $originals[$name]);
924
    }
925
  }
926
}
927

    
928
/**
929
 * Alter rules components before execution.
930
 *
931
 * This hooks allows altering rules components before they are cached for later
932
 * re-use. Use this hook only for altering the component in order to prepare
933
 * re-use through rules_invoke_component() or the provided condition/action.
934
 * Note that this hook is only invoked for any components cached for execution,
935
 * but not for components that are programmatically created and executed on the
936
 * fly (without saving them).
937
 *
938
 * @param $plugin
939
 *   The name of the component plugin.
940
 * @param $component
941
 *   The component that is to be cached.
942
 *
943
 * @see rules_invoke_component()
944
 */
945
function hook_rules_component_alter($plugin, RulesPlugin $component) {
946

    
947
}
948

    
949
/**
950
 * Alters event sets.
951
 *
952
 * This hooks allows altering rules event sets, which contain all rules that are
953
 * triggered upon a specific event. Rules internally caches all rules associated
954
 * to an event in an event set, which is cached for fast evaluation. This hook
955
 * is invoked just before any event set is cached, thus it allows altering of
956
 * the to be executed rules without the changes to appear in the UI, e.g. to add
957
 * a further condition to some rules.
958
 *
959
 * @param $event_name
960
 *   The name of the event.
961
 * @param $event_set
962
 *   The event set that is to be cached.
963
 *
964
 * @see rules_invoke_event()
965
 */
966
function hook_rules_event_set_alter($event_name, RulesEventSet $event_set) {
967

    
968
}
969

    
970
/**
971
 * D6 to D7 upgrade procedure hook for mapping action or condition names.
972
 *
973
 * If for a module the action or condition name changed since Drupal 6, this
974
 * "hook" can be implemented in order to map to the new name of the action or
975
 * condition.
976
 *
977
 * This is no real hook, but a callback that is invoked for each Drupal 6
978
 * action or condition that is to be upgraded to Drupal 7. E.g. the function
979
 * name called for the action "rules_action_set_node_title" would be
980
 * "rules_action_set_node_title_upgrade_map_name".
981
 *
982
 * @param $element
983
 *   The element array of a configured condition or action which is to be
984
 *   upgraded.
985
 * @return
986
 *   The name of the action or condition which should be used.
987
 */
988
function hook_rules_action_base_upgrade_map_name($element) {
989
  return 'data_set';
990
}
991

    
992
/**
993
 * D6 to D7 upgrade procedure hook for mapping action or condition configuration.
994
 *
995
 * During upgrading Drupal 6 rule configurations to Drupal 7 Rules is taking
996
 * care of upgrading the configuration of all known parameters, which only works
997
 * if the parameter name has not changed.
998
 * If something changed, this callback can be used to properly apply the
999
 * configruation of the Drupal 6 action ($element) to the Drupal 7 version
1000
 * ($target).
1001
 *
1002
 * This is no real hook, but a callback that is invoked for each Drupal 6
1003
 * action or condition that is to be upgraded to Drupal 7. E.g. the function
1004
 * name called for the action "rules_action_set_node_title" would be
1005
 * "rules_action_set_node_title_upgrade".
1006
 *
1007
 * @param $element
1008
 *   The element array of a configured condition or action which is to be
1009
 *   upgraded.
1010
 * @param $target
1011
 *   The Drupal 7 version of the configured element.
1012
 *
1013
 * @see hook_rules_element_upgrade_alter()
1014
 */
1015
function hook_rules_action_base_upgrade($element, RulesPlugin $target) {
1016
  $target->settings['data:select'] = $element['#settings']['#argument map']['node'] . ':title';
1017
  $target->settings['value'] = $element['#settings']['title'];
1018
}
1019

    
1020
/**
1021
 * D6 to D7 upgrade procedure hook for mapping action or condition configuration.
1022
 *
1023
 * A alter hook that is called after the action/condition specific callback for
1024
 * each element of a configuration that is upgraded.
1025
 *
1026
 * @param $element
1027
 *   The element array of a configured condition or action which is to be
1028
 *   upgraded.
1029
 * @param $target
1030
 *   The Drupal 7 version of the configured element.
1031
 *
1032
 * @see hook_rules_action_base_upgrade()
1033
 */
1034
function hook_rules_element_upgrade_alter($element, $target) {
1035

    
1036
}
1037

    
1038
/**
1039
 * Allows modules to alter or to extend the provided Rules UI.
1040
 *
1041
 * Use this hook over the regular hook_menu_alter() as the Rules UI is re-used
1042
 * and embedded by modules. See rules_ui().
1043
 *
1044
 * @param $items
1045
 *   The menu items to alter.
1046
 * @param $base_path
1047
 *   The base path of the Rules UI.
1048
 * @param $base_count
1049
 *   The count of the directories contained in the base path.
1050
 */
1051
function hook_rules_ui_menu_alter(&$items, $base_path, $base_count) {
1052
  $items[$base_path . '/manage/%rules_config/schedule'] = array(
1053
    'title callback' => 'rules_get_title',
1054
    'title arguments' => array('Schedule !plugin "!label"', $base_count + 1),
1055
    'page callback' => 'drupal_get_form',
1056
    'page arguments' => array('rules_scheduler_schedule_form', $base_count + 1, $base_path),
1057
    'access callback' => 'rules_config_access',
1058
    'access arguments' => array('update', $base_count + 1),
1059
    'file' => 'rules_scheduler.admin.inc',
1060
    'file path' => drupal_get_path('module', 'rules_scheduler'),
1061
  );
1062
}
1063

    
1064
/**
1065
 * Control access to Rules configurations.
1066
 *
1067
 * Modules may implement this hook if they want to have a say in whether or not
1068
 * a given user has access to perform a given operation on a Rules
1069
 * configuration.
1070
 *
1071
 * @param $op
1072
 *   The operation being performed. One of 'view', 'create', 'update' or
1073
 *   'delete'.
1074
 * @param $rules_config
1075
 *   (optional) A Rules configuration to check access for. If nothing is given,
1076
 *   access for all Rules configurations is determined.
1077
 * @param $account
1078
 *   (optional) The user to check for. If no account is passed, access is
1079
 *   determined for the current user.
1080
 * @return boolean
1081
 *   Return TRUE to grant access, FALSE to explicitly deny access. Return NULL
1082
 *   or nothing to not affect the operation.
1083
 *   Access is granted as soon as a module grants access and no one denies
1084
 *   access. Thus if no module explicitly grants access, access will be denied.
1085
 *
1086
 * @see rules_config_access()
1087
 */
1088
function hook_rules_config_access($op, $rules_config = NULL, $account = NULL) {
1089
  // Instead of returning FALSE return nothing, so others still can grant
1090
  // access.
1091
  if (isset($rules_config) && $rules_config->owner == 'mymodule' && user_access('my modules permission')) {
1092
    return TRUE;
1093
  }
1094
}
1095

    
1096
/**
1097
 * @}
1098
 */