123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393 |
- <?php
- /*
- * This file is part of the symfony package.
- * (c) 2004-2006 Fabien Potencier <fabien.potencier@symfony-project.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- /**
- * PartialHelper.
- *
- * @package symfony
- * @subpackage helper
- * @author Fabien Potencier <fabien.potencier@symfony-project.com>
- * @version SVN: $Id: PartialHelper.php 13463 2008-11-28 15:35:54Z fabien $
- */
- /**
- * Evaluates and echoes a component slot.
- * The component name is deduced from the definition of the view.yml
- * For a variable to be accessible to the component and its partial,
- * it has to be passed in the second argument.
- *
- * <b>Example:</b>
- * <code>
- * include_component_slot('sidebar', array('myvar' => 12345));
- * </code>
- *
- * @param string slot name
- * @param array variables to be made accessible to the component
- *
- * @see get_component_slot, include_partial, include_component
- */
- function include_component_slot($name, $vars = array())
- {
- echo get_component_slot($name, $vars);
- }
- /**
- * Evaluates and returns a component slot.
- * The syntax is similar to the one of include_component_slot.
- *
- * <b>Example:</b>
- * <code>
- * echo get_component_slot('sidebar', array('myvar' => 12345));
- * </code>
- *
- * @param string $name slot name
- * @param array $vars variables to be made accessible to the component
- *
- * @return string result of the component execution
- * @see get_component_slot, include_partial, include_component
- */
- function get_component_slot($name, $vars = array())
- {
- $viewInstance = sfContext::getInstance()->get('view_instance');
- if (!$viewInstance->hasComponentSlot($name))
- {
- // cannot find component slot
- throw new sfConfigurationException(sprintf('The component slot "%s" is not set.', $name));
- }
- if ($componentSlot = $viewInstance->getComponentSlot($name))
- {
- return get_component($componentSlot[0], $componentSlot[1], $vars);
- }
- }
- /**
- * Returns true if component slot exists.
- *
- * @param string slot name
- * @return bool true if component slot exists, false otherwise
- */
- function has_component_slot($name)
- {
- $viewInstance = sfContext::getInstance()->get('view_instance');
- // check to see if one is defined
- if (!$viewInstance->hasComponentSlot($name))
- {
- return false;
- }
-
- // check to see if component slot is empty (null)
- if ($viewInstance->getComponentSlot($name))
- {
- return true;
- }
- return false;
- }
- /**
- * Evaluates and echoes a component.
- * For a variable to be accessible to the component and its partial,
- * it has to be passed in the third argument.
- *
- * <b>Example:</b>
- * <code>
- * include_component('mymodule', 'mypartial', array('myvar' => 12345));
- * </code>
- *
- * @param string $moduleName module name
- * @param string $componentName component name
- * @param array $vars variables to be made accessible to the component
- *
- * @see get_component, include_partial, include_component_slot
- */
- function include_component($moduleName, $componentName, $vars = array())
- {
- echo get_component($moduleName, $componentName, $vars);
- }
- /**
- * Evaluates and returns a component.
- * The syntax is similar to the one of include_component.
- *
- * <b>Example:</b>
- * <code>
- * echo get_component('mymodule', 'mypartial', array('myvar' => 12345));
- * </code>
- *
- * @param string $moduleName module name
- * @param string $componentName component name
- * @param array $vars variables to be made accessible to the component
- *
- * @return string result of the component execution
- * @see include_component
- */
- function get_component($moduleName, $componentName, $vars = array())
- {
- $context = sfContext::getInstance();
- $actionName = '_'.$componentName;
- $class = sfConfig::get('mod_'.$moduleName.'_partial_view_class', 'sf').'PartialView';
- $view = new $class($context, $moduleName, $actionName, '');
- $view->setPartialVars($vars);
- if ($retval = $view->getCache())
- {
- return $retval;
- }
- $allVars = _call_component($moduleName, $componentName, $vars);
- if (!is_null($allVars))
- {
- // render
- $view->getAttributeHolder()->add($allVars);
- return $view->render();
- }
- }
- /**
- * Evaluates and echoes a partial.
- * The partial name is composed as follows: 'mymodule/mypartial'.
- * The partial file name is _mypartial.php and is looked for in modules/mymodule/templates/.
- * If the partial name doesn't include a module name,
- * then the partial file is searched for in the caller's template/ directory.
- * If the module name is 'global', then the partial file is looked for in myapp/templates/.
- * For a variable to be accessible to the partial, it has to be passed in the second argument.
- *
- * <b>Example:</b>
- * <code>
- * include_partial('mypartial', array('myvar' => 12345));
- * </code>
- *
- * @param string $templateName partial name
- * @param array $vars variables to be made accessible to the partial
- *
- * @see get_partial, include_component
- */
- function include_partial($templateName, $vars = array())
- {
- echo get_partial($templateName, $vars);
- }
- /**
- * Evaluates and returns a partial.
- * The syntax is similar to the one of include_partial
- *
- * <b>Example:</b>
- * <code>
- * echo get_partial('mypartial', array('myvar' => 12345));
- * </code>
- *
- * @param string $templateName partial name
- * @param array $vars variables to be made accessible to the partial
- *
- * @return string result of the partial execution
- * @see include_partial
- */
- function get_partial($templateName, $vars = array())
- {
- $context = sfContext::getInstance();
- // partial is in another module?
- if (false !== $sep = strpos($templateName, '/'))
- {
- $moduleName = substr($templateName, 0, $sep);
- $templateName = substr($templateName, $sep + 1);
- }
- else
- {
- $moduleName = $context->getActionStack()->getLastEntry()->getModuleName();
- }
- $actionName = '_'.$templateName;
- $class = sfConfig::get('mod_'.$moduleName.'_partial_view_class', 'sf').'PartialView';
- $view = new $class($context, $moduleName, $actionName, '');
- $view->setPartialVars($vars);
- return $view->render();
- }
- /**
- * Begins the capturing of the slot.
- *
- * @param string $name slot name
- * @param string $value The slot content
- *
- * @see end_slot
- */
- function slot($name, $value = null)
- {
- $context = sfContext::getInstance();
- $response = $context->getResponse();
- $slot_names = sfConfig::get('symfony.view.slot_names', array());
- if (in_array($name, $slot_names))
- {
- throw new sfCacheException(sprintf('A slot named "%s" is already started.', $name));
- }
- if (sfConfig::get('sf_logging_enabled'))
- {
- $context->getEventDispatcher()->notify(new sfEvent(null, 'application.log', array(sprintf('Set slot "%s"', $name))));
- }
- if (!is_null($value))
- {
- $response->setSlot($name, $value);
- return;
- }
- $slot_names[] = $name;
- $response->setSlot($name, '');
- sfConfig::set('symfony.view.slot_names', $slot_names);
- ob_start();
- ob_implicit_flush(0);
- }
- /**
- * Stops the content capture and save the content in the slot.
- *
- * @see slot
- */
- function end_slot()
- {
- $content = ob_get_clean();
- $response = sfContext::getInstance()->getResponse();
- $slot_names = sfConfig::get('symfony.view.slot_names', array());
- if (!$slot_names)
- {
- throw new sfCacheException('No slot started.');
- }
- $name = array_pop($slot_names);
- $response->setSlot($name, $content);
- sfConfig::set('symfony.view.slot_names', $slot_names);
- }
- /**
- * Returns true if the slot exists.
- *
- * @param string $name slot name
- *
- * @return bool true, if the slot exists
- * @see get_slot, include_slot
- */
- function has_slot($name)
- {
- return array_key_exists($name, sfContext::getInstance()->getResponse()->getSlots());
- }
- /**
- * Evaluates and echoes a slot.
- *
- * <b>Example:</b>
- * <code>
- * include_slot('navigation');
- * </code>
- *
- * @param string $name slot name
- *
- * @see has_slot, get_slot
- */
- function include_slot($name)
- {
- return ($v = get_slot($name)) ? print $v : false;
- }
- /**
- * Evaluates and returns a slot.
- *
- * <b>Example:</b>
- * <code>
- * echo get_slot('navigation');
- * </code>
- *
- * @param string $name slot name
- *
- * @return string content of the slot
- * @see has_slot, include_slot
- */
- function get_slot($name)
- {
- $context = sfContext::getInstance();
- $slots = $context->getResponse()->getSlots();
- if (sfConfig::get('sf_logging_enabled'))
- {
- $context->getEventDispatcher()->notify(new sfEvent(null, 'application.log', array(sprintf('Get slot "%s"', $name))));
- }
- return isset($slots[$name]) ? $slots[$name] : '';
- }
- function _call_component($moduleName, $componentName, $vars)
- {
- $context = sfContext::getInstance();
- $controller = $context->getController();
- if (!$controller->componentExists($moduleName, $componentName))
- {
- // cannot find component
- throw new sfConfigurationException(sprintf('The component does not exist: "%s", "%s".', $moduleName, $componentName));
- }
- // create an instance of the action
- $componentInstance = $controller->getComponent($moduleName, $componentName);
- // load component's module config file
- require($context->getConfigCache()->checkConfig('modules/'.$moduleName.'/config/module.yml'));
- // pass unescaped vars to the component
- $componentInstance->getVarHolder()->add(sfOutputEscaper::unescape($vars));
- // dispatch component
- $componentToRun = 'execute'.ucfirst($componentName);
- if (!method_exists($componentInstance, $componentToRun))
- {
- if (!method_exists($componentInstance, 'execute'))
- {
- // component not found
- throw new sfInitializationException(sprintf('sfComponent initialization failed for module "%s", component "%s".', $moduleName, $componentName));
- }
- $componentToRun = 'execute';
- }
- if (sfConfig::get('sf_logging_enabled'))
- {
- $context->getEventDispatcher()->notify(new sfEvent(null, 'application.log', array(sprintf('Call "%s->%s()'.'"', $moduleName, $componentToRun))));
- }
- // run component
- if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
- {
- $timer = sfTimerManager::getTimer(sprintf('Component "%s/%s"', $moduleName, $componentName));
- }
- $retval = $componentInstance->$componentToRun($context->getRequest());
- if (sfConfig::get('sf_debug') && sfConfig::get('sf_logging_enabled'))
- {
- $timer->addTime();
- }
- return sfView::NONE == $retval ? null : $componentInstance->getVarHolder()->getAll();
- }
|