* * {myObject.name} * * Note that `{arrayVariable.{offset}.name}` is not possible * due to the way Fluid parses nodes; the above piece of * code would try reading `arrayVariable.{offset}.name` * as a variable actually called "arrayVariable.{offset}.name" * rather than the correct `arrayVariable[offset][name]`. * * In many ways this ViewHelper works like `f:alias` * with one exception: in `f:alias` the variable only * becomes accessible in the tag content, whereas `v:variable.set` * inserts the variable in the template and leaves it there * (it "leaks" the variable). * * If $name contains a dot, VHS will attempt to load the object * stored under the named used as the first segment part and * set the value at the remaining path. E.g. * `{value -> v:variable.set(name: 'object.property.subProperty')}` * would attempt to load `{object}` first, then set * `property.subProperty` on that object/array using * ObjectAccess::setPropertyPath(). If `{object}` is not * an object or an array, the variable will not be set. Please * note: Extbase does not currently support setting variables * deeper than two levels, meaning a `name` of fx `foo.bar.baz` * will be ignored. To set values deeper than two levels you * must first extract the second-level object then set the * value on that object. * * Using as `{value -> v:variable.set(name: 'myVar')}` makes `{myVar}` contain * `{value}`. * * @author Claus Due * @package Vhs * @subpackage ViewHelpers\Var */ class SetViewHelper extends AbstractViewHelper { /** * Set (override) the variable in $name. * * @param string $name * @param mixed $value * @return void */ public function render($name, $value = NULL) { if (NULL === $value) { $value = $this->renderChildren(); } if (FALSE === strpos($name, '.')) { if (TRUE === $this->templateVariableContainer->exists($name)) { $this->templateVariableContainer->remove($name); } $this->templateVariableContainer->add($name, $value); } elseif (1 === substr_count($name, '.')) { $parts = explode('.', $name); $objectName = array_shift($parts); $path = implode('.', $parts); if (FALSE === $this->templateVariableContainer->exists($objectName)) { return NULL; } $object = $this->templateVariableContainer->get($objectName); try { ObjectAccess::setProperty($object, $path, $value); // Note: re-insert the variable to ensure unreferenced values like arrays also get updated $this->templateVariableContainer->remove($objectName); $this->templateVariableContainer->add($objectName, $object); } catch (\Exception $error) { return NULL; } } return NULL; } }