/**
  * @param ModelInterface $viewModel
  * @param callable $addToViewFromModel
  */
 protected function addChildrenToView(ModelInterface $viewModel, $addToViewFromModel)
 {
     if ($viewModel->hasChildren()) {
         foreach ($viewModel->getChildren() as $child) {
             $addToViewFromModel($child);
             $this->addChildrenToView($child, $addToViewFromModel);
         }
     }
 }
Exemple #2
0
 /**
  * @inheritDoc
  */
 public function add($blockId, ModelInterface $block)
 {
     $block->setOption('block_id', $blockId);
     if ($block->hasChildren()) {
         foreach ($block->getChildren() as $childBlock) {
             $childBlockId = $this->determineAnonymousBlockId($childBlock);
             $childBlock->setCaptureTo($blockId . LayoutInterface::CAPTURE_TO_DELIMITER . $childBlock->captureTo());
             $this->add($childBlockId, $childBlock);
         }
         if ($block instanceof ClearableModelInterface) {
             $block->clearChildren();
         }
     }
     $this->blocks[$blockId] = $block;
     return $this;
 }
 /**
  * Retrieve values from a model and recurse its children to build a data structure
  *
  * @param  Model $model
  * @param  bool $mergeWithVariables Whether or not to merge children with
  *         the variables of the $model
  * @return array
  */
 protected function recurseModel(Model $model, $mergeWithVariables = true)
 {
     $values = [];
     if ($mergeWithVariables) {
         $values = $model->getVariables();
     }
     if ($values instanceof Traversable) {
         $values = ArrayUtils::iteratorToArray($values);
     }
     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
             // TODO please complete if append is true. must change old
             // value to array and append to array?
             $values[$captureTo] = $childValues;
         } elseif ($mergeChildren) {
             // Merging values with parent
             $values = array_replace_recursive($values, $childValues);
         }
     }
     return $values;
 }
Exemple #4
0
 /**
  * Recursively processes all ViewModels and returns output.
  *
  * @param  string|ModelInterface   $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 ModelInterface) {
         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;
 }
 /**
  * Recursively processes all ViewModels and returns output.
  *
  * @param string|ModelInterface $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)
 {
     $result = '';
     if (!$model instanceof ModelInterface) {
         // View model is required by this renderer
         return $result;
     }
     // If option keys match setters, pass values to those methods.
     foreach ($model->getOptions() as $setting => $value) {
         $method = 'set' . $setting;
         if (method_exists($this, $method)) {
             $this->{$method}($value);
         }
     }
     // Render children first
     if ($model->hasChildren()) {
         // recursively render all children
         foreach ($model->getChildren() as $child) {
             $result .= $this->render($child, $values);
         }
     }
     // Render the result, if present.
     $values = $model->getVariables();
     if (isset($values['result']) && !isset($this->filterChain)) {
         // append the result verbatim
         $result .= $values['result'];
     }
     if (isset($values['result']) && isset($this->filterChain)) {
         // filter and append the result
         $result .= $this->getFilterChain()->filter($values['result']);
     }
     return $result;
 }