- <?php
- /**
- * Zend Framework (http://framework.zend.com/)
- *
- * @link http://github.com/zendframework/zf2 for the canonical source repository
- * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
- * @license http://framework.zend.com/license/new-bsd New BSD License
- */
- namespace Zend\View\Helper;
- use Zend\View\Exception;
- use Zend\View\Model\ModelInterface as Model;
- /**
- * Helper for rendering child view models
- *
- * Finds children matching "capture-to" values, and renders them using the
- * composed view instance.
- */
- class RenderChildModel extends AbstractHelper
- {
- /**
- * Current view model
- *
- * @var Model
- */
- protected $current;
- /**
- * View model helper instance
- *
- * @var ViewModel
- */
- protected $viewModelHelper;
- /**
- * Invoke as a function
- *
- * Proxies to {render()}.
- *
- * @param string $child
- * @return string
- */
- public function __invoke($child)
- {
- return $this->render($child);
- }
- /**
- * Render a model
- *
- * If a matching child model is found, it is rendered. If not, an empty
- * string is returned.
- *
- * @param string $child
- * @return string
- */
- public function render($child)
- {
- $model = $this->findChild($child);
- if (!$model) {
- return '';
- }
- $current = $this->current;
- $view = $this->getView();
- $return = $view->render($model);
- $helper = $this->getViewModelHelper();
- $helper->setCurrent($current);
- return $return;
- }
- /**
- * Find the named child model
- *
- * Iterates through the current view model, looking for a child model that
- * has a captureTo value matching the requested $child. If found, that child
- * model is returned; otherwise, a boolean false is returned.
- *
- * @param string $child
- * @return false|Model
- */
- protected function findChild($child)
- {
- $this->current = $model = $this->getCurrent();
- foreach ($model->getChildren() as $childModel) {
- if ($childModel->captureTo() == $child) {
- return $childModel;
- }
- }
- return false;
- }
- /**
- * Get the current view model
- *
- * @throws Exception\RuntimeException
- * @return null|Model
- */
- protected function getCurrent()
- {
- $helper = $this->getViewModelHelper();
- if (!$helper->hasCurrent()) {
- throw new Exception\RuntimeException(sprintf(
- '%s: no view model currently registered in renderer; cannot query for children',
- __METHOD__
- ));
- }
- return $helper->getCurrent();
- }
- /**
- * Retrieve the view model helper
- *
- * @return ViewModel
- */
- protected function getViewModelHelper()
- {
- if ($this->viewModelHelper) {
- return $this->viewModelHelper;
- }
- if (method_exists($this->getView(), 'plugin')) {
- $this->viewModelHelper = $this->view->plugin('view_model');
- }
- return $this->viewModelHelper;
- }
- }