/** * Used internally to keep engine status updated. * Using events is possible to keep in sync template flow with engine status without giving * to templates write access to Engine status. * * @access private */ private function statusTransitions() { $this->status = self::STATUS_IN_LAYOUT; $this->events->on('f.template.layout', function () { if ($this->status & self::STATUS_IN_PARTIAL) { throw new LogicException('Is not possible to use $this->layout() in partials.'); } $this->status = self::STATUS_IN_TEMPLATE; }); $this->events->on('f.template.renderlayout', function () { $this->status = self::STATUS_IN_LAYOUT; }); $this->events->on('f.template.prepartial', function () { $this->status |= self::STATUS_IN_PARTIAL; }); $this->events->on('f.template.afterpartial', function () { $this->status ^= self::STATUS_IN_PARTIAL; }); $this->events->on('f.template.renderered', function () { $this->stack()->pop(); if ($this->stack()->count() === 0) { $this->status = self::STATUS_RENDERED | self::STATUS_IDLE; $this->events->fire('f.renderered', $this); } }); }
/** * Provide data by collecting it from contexts in the collection that accepts current template. * After having collected data from a context, an event is fired allowing to add some data * that depends on that specific context data. * {@inheritdoc} */ public function provide() { $data = $this->data(); $template = $this->template(); if (empty($template)) { return $data; } $storage = $this->storage(); $storage->rewind(); while ($storage->valid()) { $context = $storage->current(); if ($context->accept($template)) { $data = array_merge($data, $context->provide()); $this->events->fire('f.context.provided', $context, $this); } $storage->next(); } $this->events->fire('f.context.allprovided', $this); return $data; }
/** * Close a section and replace any content already set for the same section. * Provide a name is optional, if provided function will check it is the current section. * * @param string|void $name Section to close */ public function replace($name = null) { $section = $this->end($name); $section->replace(); $this->events->fire('f.sections.content', $this->last, $section->content()); }