/** * Renders values as JSON * * @todo Determine what use case exists for accepting only $nameOrModel * @param string|Model $nameOrModel The script/resource process, or a view model * @param null|array|\ArrayAccess $values Values to use during rendering * @throws Exception\InvalidArgumentException * @return string The script output. */ public function render($nameOrModel, $values = null) { if ($nameOrModel instanceof Model) { // Use case 1: View Model provided // Non-FeedModel: cast to FeedModel if (!$nameOrModel instanceof FeedModel) { $vars = $nameOrModel->getVariables(); $options = $nameOrModel->getOptions(); $type = $this->getFeedType(); if (isset($options['feed_type'])) { $type = $options['feed_type']; } else { $this->setFeedType($type); } $nameOrModel = new FeedModel($vars, array('feed_type' => $type)); } } elseif (is_string($nameOrModel)) { // Use case 2: string $nameOrModel + array|Traversable|Feed $values $nameOrModel = new FeedModel($values, (array) $nameOrModel); } else { // Use case 3: failure throw new Exception\InvalidArgumentException(sprintf('%s expects a ViewModel or a string feed type as the first argument; received "%s"', __METHOD__, is_object($nameOrModel) ? get_class($nameOrModel) : gettype($nameOrModel))); } // Get feed and type $feed = $nameOrModel->getFeed(); $type = $nameOrModel->getFeedType(); if (!$type) { $type = $this->getFeedType(); } else { $this->setFeedType($type); } // Render feed return $feed->export($type); }
/** * Processes a view script and returns the output. * * @param string|ModelInterface $nameOrModel The script/resource process, or a view model * @param null|array|\ArrayAccess $values Values to use during rendering * @return string The script output. * @throws \LogicException */ public function render($nameOrModel, $values = null) { $name = $nameOrModel; if ($nameOrModel instanceof ModelInterface) { $name = $this->resolver->resolve($nameOrModel->getTemplate(), $this); $values = (array) $nameOrModel->getVariables(); } if (array_key_exists('helper', $values)) { throw new \LogicException('Variable $helper is reserved for Zend helpers and can\'t be passed to view.'); } $values['helper'] = $this->helpers; return $this->engine->renderToString($name, $values); }
/** * 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; }
/** * 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; }
/** * Merge global/template parameters with provided view model. * * @param string $name Template name. * @param ModelInterface $model * @return ModelInterface */ private function mergeViewModel($name, ModelInterface $model) { $params = $this->mergeParams($name, $model->getVariables()); $model->setVariables($params); $model->setTemplate($name); return $model; }
/** * @param string|ModelInterface $nameOrModel The script/resource process, or a view model * @param null|array|\ArrayAccess $values Values to use during rendering * @return string The script output. */ public function render($nameOrModel, $values = null) { $result = $this->negotiator->negotiate($nameOrModel->getVariables(), $nameOrModel->getAccept()); return $result; }