/** * Recursively processes all ViewModels and returns output. * * @param string|Model $model A ViewModel instance. * @param null|array|Traversable $values Values to use when rendering. If none * provided, uses those in the composed * variables container. * @return string Console output. */ public function render($model, $values = null) { if (!$model instanceof Model) { return ''; } $result = ''; $options = $model->getOptions(); foreach ($options as $setting => $value) { $method = 'set' . $setting; if (method_exists($this, $method)) { $this->{$method}($value); } unset($method, $setting, $value); } unset($options); $values = $model->getVariables(); if (isset($values['result'])) { // filter and append the result $result .= $this->getFilterChain()->filter($values['result']); } if ($model->hasChildren()) { // recursively render all children foreach ($model->getChildren() as $child) { $result .= $this->render($child, $values); } } return $result; }
/** * Retrieve values from a model and recurse its children to build a data structure * * @param Model $model * @return array */ protected function recurseModel(Model $model) { $values = $model->getVariables(); if (!$model->hasChildren()) { return $values; } $mergeChildren = $this->mergeUnnamedChildren(); foreach ($model as $child) { $captureTo = $child->captureTo(); if (!$captureTo && !$mergeChildren) { // We don't want to do anything with this child continue; } $childValues = $this->recurseModel($child); if ($captureTo) { // Capturing to a specific key $values[$captureTo] = $childValues; } elseif ($mergeChildren) { // Merging values with parent $values = array_replace_recursive($values, $childValues); } } return $values; }