Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/core/View
diff options
context:
space:
mode:
authordiosmosis <benakamoorthi@fastmail.fm>2014-02-06 07:35:57 +0400
committerdiosmosis <benakamoorthi@fastmail.fm>2014-02-06 07:36:29 +0400
commitb8e93ed82bee138d1207d31803bf248abcea4d3b (patch)
tree71b4bb31959e0d559296737874a629a458fa56e9 /core/View
parentbcf38478f7b8db68d855c5fcb90ec144f45acfc5 (diff)
Move containing <div> rendering of UIControl to new template, add new custom Twig tag to render Views and allow selected segment of segment selector to be determined by PHP code.
Diffstat (limited to 'core/View')
-rw-r--r--core/View/RenderTokenParser.php82
-rw-r--r--core/View/UIControl.php92
2 files changed, 173 insertions, 1 deletions
diff --git a/core/View/RenderTokenParser.php b/core/View/RenderTokenParser.php
new file mode 100644
index 0000000000..14f1eb6806
--- /dev/null
+++ b/core/View/RenderTokenParser.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\View;
+
+use Twig_Token;
+use Twig_TokenParser;
+use Twig_Node_Expression_MethodCall;
+use Twig_Node_Expression_Array;
+use Twig_Node_Include;
+use Exception;
+
+/**
+ * Defines a new Twig tag that will render a Piwik View.
+ *
+ * Use the tag like this:
+ *
+ * {% render theView %}
+ *
+ * where `theView` is a variable referencing a View instance.
+ */
+class RenderTokenParser extends Twig_TokenParser
+{
+ /**
+ * Parses the Twig stream and creates a Twig_Node_Include instance that includes
+ * the View's template.
+ *
+ * @return Twig_Node_Include
+ */
+ public function parse(Twig_Token $token)
+ {
+ $parser = $this->parser;
+ $stream = $parser->getStream();
+
+ $view = $parser->getExpressionParser()->parseExpression();
+
+ $variablesOverride = null;
+ if ($stream->nextIf(Twig_Token::NAME_TYPE, 'with')) {
+ $variablesOverride = $this->parser->getExpressionParser()->parseExpression();
+ }
+
+ $stream->expect(Twig_Token::BLOCK_END_TYPE);
+
+ $viewTemplateExpr = new Twig_Node_Expression_MethodCall(
+ $view,
+ 'getTemplateFile',
+ new Twig_Node_Expression_Array(array(), $token->getLine()),
+ $token->getLine()
+ );
+
+ $variablesOverrideExpr = $variablesOverride === null ? array() : array($variablesOverride);
+ $variablesExpr = new Twig_Node_Expression_MethodCall(
+ $view,
+ 'getTemplateVars',
+ new Twig_Node_Expression_Array($variablesOverrideExpr, $token->getLine()),
+ $token->getLine()
+ );
+
+ return new Twig_Node_Include(
+ $viewTemplateExpr,
+ $variablesExpr,
+ $only = false,
+ $ignoreMissing = false,
+ $token->getLine()
+ );
+ }
+
+ /**
+ * Returns the tag identifier.
+ *
+ * @return string
+ */
+ public function getTag()
+ {
+ return 'render';
+ }
+} \ No newline at end of file
diff --git a/core/View/UIControl.php b/core/View/UIControl.php
index 90d0b0b331..39994aa828 100644
--- a/core/View/UIControl.php
+++ b/core/View/UIControl.php
@@ -8,6 +8,9 @@
*/
namespace Piwik\View;
+use Piwik\View;
+use Exception;
+
/**
* Base type of UI controls.
*
@@ -25,12 +28,99 @@ class UIControl extends \Piwik\View
const TEMPLATE = '';
/**
+ * Holds the array of values that are passed to the UIControl JavaScript class.
+ *
+ * @var array
+ */
+ public $clientSideProperties = array();
+
+ /**
+ * Holds an array of values that are passed to the UIControl JavaScript class. These values
+ * differ from those in {@link $clientSideProperties} in that they are meant to passed as
+ * request parameters when the JavaScript code makes an AJAX request.
+ *
+ * @var array
+ */
+ public $clientSideParameters = array();
+
+ /**
+ * The CSS class that is used to map the root element of this control with the JavaScript class.
+ *
+ * This field must be set prior to rendering.
+ *
+ * @var string
+ */
+ public $cssIdentifier = null;
+
+ /**
+ * The name of the JavaScript class that handles the behavior of this control.
+ *
+ * The JavaScript class must exist in the **piwik/UI** JavaScript module (so it will exist in
+ * `window.piwik.UI`).
+ *
+ * This field must be set prior to rendering.
+ *
+ * @var string
+ */
+ public $jsClass = null;
+
+ /**
+ * Extra CSS class(es) for the root element.
+ *
+ * @var string
+ */
+ public $cssClass = "";
+
+ /**
+ * Whether we are currently rendering the containing div or not.
+ */
+ private $renderingContainer = false;
+
+ /**
* Constructor.
*/
- public function __construct() {
+ public function __construct()
+ {
parent::__construct(static::TEMPLATE);
$this->clientSideProperties = array();
$this->clientSideParameters = array();
}
+
+ /**
+ * Renders the control view within a containing <div> that is used by the UIControl JavaScript
+ * class.
+ *
+ * @return string
+ */
+ public function render()
+ {
+ if ($this->cssIdentifier === null) {
+ throw new Exception("All UIControls must set a cssIdentifier property");
+ }
+
+ if ($this->jsClass === null) {
+ throw new Exception("All UIControls must set a jsClass property");
+ }
+
+ if ($this->renderingContainer) {
+ return parent::render();
+ } else {
+ $this->renderingContainer = true;
+
+ $surroundingDivView = new View("@CoreHome\_uiControl");
+ $surroundingDivView->clientSideProperties = $this->clientSideProperties;
+ $surroundingDivView->clientSideParameters = $this->clientSideParameters;
+ $surroundingDivView->implView = $this;
+ $surroundingDivView->cssIdentifier = $this->cssIdentifier;
+ $surroundingDivView->cssClass = $this->cssClass;
+ $surroundingDivView->jsClass = $this->jsClass;
+
+ $result = $surroundingDivView->render();
+
+ $this->renderingContainer = false;
+
+ return $result;
+ }
+ }
} \ No newline at end of file