Variable Replacement ==================== A key feature of Config Actions is the ability to perform variable substitutions within the configuration data. Variables --------- Variables have the syntax: ``@variable_name@`` where "variable_name" is the alphanumeric name of the variable (with underscores or hyphens allowed) The value of a variable is specified in the action file using the form:: "@variable_name@": value Anywhere else in the action or included template files, a reference to ``@variable_name@`` will be replaced with the ``value``. String Replacements ------------------- The ``replace`` option is an array of string replacement patterns and values. The above syntax for variables actually causes an entry to be made into the string replacement array. But you can actually replace any string value. For example:: replace: foo: bar will cause any text matching "foo" to be replaced with the value of "bar". Inherited Variables ------------------- Variables and string replacement values are passed from action to sub-action. Typically, global values for variables are set at the top of the action file, allowing any other modules that "include" the action to override the value. For example, if ``ActionA.yml`` had the contents:: "@bundle@": article "@name@": "Article" source: node.type.@bundle@ value: name: "@name@" then another action could "include" it and change the variable data that is passed:: plugin: include file: "ActionA.yml" "@name@": "My Article Content" Sub-actions can also override variable values. For example:: "@name@": "Article" source: node.type.@bundle@ actions: action1: "@bundle@": article value: name: "My article" action1: "@bundle@": page value: name: "My page" Each sub-action sets its own value of "@bundle@" and the value of ``source`` is automatically recomputed for each action. NOTE: When specifying variables directly within a sub-action, any other module including this action will not be able to override it. External actions will normally only override the global value of the variables in the file. To force a sub-action variable to be overridden, you can specify the exact ``action`` id (such as "action1") you want to include rather than including the entire file. ADVANCED Usage -------------- The following topics are for more advanced usage and understanding. Option Variables ~~~~~~~~~~~~~~~~ Each "option" in your action is available as a pre-defined variable. For example:: source: [ "@dest@", node.type.template.yml ] dest: node.type.article will automatically expand to:: source: [ node.type.article, node.type.template.yml ] dest: node.type.article The special "id" variable ~~~~~~~~~~~~~~~~~~~~~~~~~ In addition to the pre-defined option variables, the "id" of each action is available via the ``@id@`` variable. For example:: source: "node.type.@id@" path: [ "description" ] actions: article: value: "This is the article description" page: value: "This is the page description" This would execute two sub-actions, and the key value of each sub-action is used as the ``@id@`` variable, which is then replaced in the ``source`` option. Thus, the description of the "article" and "page" content types can be easily changed without needing to specify the ``source`` directly in each sub-action. The special "key" option ~~~~~~~~~~~~~~~~~~~~~~~~ To parse the action "id" into other user-defined variables, use the ``key`` option to specify the pattern of the action id. For example, here we load different template files based on the name and type of fields being created:: source: "field.field.node.@type@.yml" key: "@bundle@.@name@.@type@" path: [ "description" ] actions: article.my_text_field.text: value: "Description of my_text_field page.my_image_field.image: value: "Description of my_image_field This would first load the "field.field.node.text.yml" template and define the variables: ``@bundle@: article``, ``@name@: my_text_field``, ``@type@: text`` and next it would load the "field.field.node.image.yml" template and define the variables: ``@bundle@: page``, ``@name@: my_image_field``, ``@type@: image`` Replacement Locations ~~~~~~~~~~~~~~~~~~~~~ You can control which options perform string replacement, and whether the patterns are replaced in just the array values within config data, or also in the keys. The ``replace_in`` option overrides the array of options that perform string (and variable) replacements. The default of this array varies from plugin to plugin. Override it to specify only the exact options to replace. For example:: source: "foo.bar" dest: "bar.foo" replace: foo: bar replace_in: [ 'dest' ] will only replace "foo" in the ``dest`` option but not in the ``source`` option.