summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArron Woods <aw@chartblocks.com>2015-05-15 15:19:46 +0100
committerArron Woods <aw@chartblocks.com>2015-05-15 15:19:46 +0100
commit92364a9965c75b8703271b76e689ed726dd74c27 (patch)
treee2c2f8cc401d004a84eacedfb7e094fde3b64409
parent0994427a5b75bba964cd56142e7f5d34a79a2422 (diff)
downloadphp-ssrs-92364a9965c75b8703271b76e689ed726dd74c27.zip
php-ssrs-92364a9965c75b8703271b76e689ed726dd74c27.tar.gz
php-ssrs-92364a9965c75b8703271b76e689ed726dd74c27.tar.bz2
Form rendering with ZendFramework2
-rw-r--r--composer.json7
-rw-r--r--library/SSRS/Form/Adapter/AbstractAdapter.php20
-rw-r--r--library/SSRS/Form/Adapter/AdapterInterface.php16
-rw-r--r--library/SSRS/Form/Adapter/ZendFramework2.php170
-rw-r--r--library/SSRS/Form/ValidateResult.php10
-rwxr-xr-xlibrary/SSRS/Object/ExecutionInfo.php34
-rwxr-xr-xlibrary/SSRS/Object/ReportOutput.php8
-rwxr-xr-xlibrary/SSRS/Object/ReportParameter.php24
8 files changed, 288 insertions, 1 deletions
diff --git a/composer.json b/composer.json
index 597a95e..3d04969 100644
--- a/composer.json
+++ b/composer.json
@@ -20,5 +20,12 @@
"psr-0": {
"SSRS\\": "library/"
}
+ },
+ "suggest": {
+ "zendframework/zend-escaper": "Required for rendering forms with ZendFramework2",
+ "zendframework/zend-form": "Required for rendering forms with ZendFramework2",
+ "zendframework/zend-i18n": "Required for rendering forms with ZendFramework2",
+ "zendframework/zend-servicemanager": "Required for rendering forms with ZendFramework2",
+ "zendframework/zend-view": "Required for rendering forms with ZendFramework2"
}
}
diff --git a/library/SSRS/Form/Adapter/AbstractAdapter.php b/library/SSRS/Form/Adapter/AbstractAdapter.php
new file mode 100644
index 0000000..1f2391b
--- /dev/null
+++ b/library/SSRS/Form/Adapter/AbstractAdapter.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace SSRS\Form\Adapter;
+
+use SSRS\Object\ExecutionInfo;
+
+abstract class AbstractAdapter implements AdapterInterface {
+
+ protected $executionInfo;
+
+ public function __construct(ExecutionInfo $executionInfo) {
+ $this->setExecutionInfo($executionInfo);
+ }
+
+ public function setExecutionInfo(ExecutionInfo $executionInfo) {
+ $this->executionInfo = $executionInfo;
+ return $this;
+ }
+
+}
diff --git a/library/SSRS/Form/Adapter/AdapterInterface.php b/library/SSRS/Form/Adapter/AdapterInterface.php
new file mode 100644
index 0000000..07a03f8
--- /dev/null
+++ b/library/SSRS/Form/Adapter/AdapterInterface.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace SSRS\Form\Adapter;
+
+use SSRS\Object\ExecutionInfo;
+
+interface AdapterInterface {
+
+ public function __construct(ExecutionInfo $executionInfo);
+
+ public function setExecutionInfo(ExecutionInfo $executionInfo);
+
+ public function getHTML();
+
+ public function validate($data);
+}
diff --git a/library/SSRS/Form/Adapter/ZendFramework2.php b/library/SSRS/Form/Adapter/ZendFramework2.php
new file mode 100644
index 0000000..fef6585
--- /dev/null
+++ b/library/SSRS/Form/Adapter/ZendFramework2.php
@@ -0,0 +1,170 @@
+<?php
+
+namespace SSRS\Form\Adapter;
+
+use SSRS\Object\ExecutionInfo;
+use SSRS\Object\ReportParameter;
+use Zend\Form\Form;
+use Zend\Form\Element\Select;
+use Zend\Form\Element\Text;
+use Zend\View\Renderer\PhpRenderer;
+
+class ZendFramework2 extends AbstractAdapter {
+
+ /**
+ *
+ * @var Form
+ */
+ protected $form;
+
+ public function __construct(ExecutionInfo $executionInfo) {
+ if (false === class_exists('\Zend\Form\Form')) {
+ throw new \RuntimeException('zendframework/zend-form not found, add to composer.json?');
+ }
+
+ parent::__construct($executionInfo);
+ }
+
+ public function setExecutionInfo(ExecutionInfo $executionInfo) {
+ parent::setExecutionInfo($executionInfo);
+ $this->buildForm();
+ return $this;
+ }
+
+ public function getHTML() {
+ $this->checkForGetHTMLZendDependencies();
+ $html = null;
+
+ $renderer = new PhpRenderer();
+ $formHelperConfig = new \Zend\Form\View\HelperConfig();
+ $formHelperConfig->configureServiceManager($renderer->getHelperPluginManager());
+
+ $formRenderer = new \Zend\Form\View\Helper\Form();
+ $html .= $formRenderer->openTag($this->form);
+
+ $formRow = new \Zend\Form\View\Helper\FormRow();
+ $formRow->setView($renderer);
+
+ foreach ($this->form->getElements() as $key => $element) {
+ $html .= '<div id="' . $key . '" class="element">';
+ $html .= $formRow->render($element);
+ $html .= '</div>';
+ }
+
+ $html .= $formRenderer->closeTag();
+
+ return $html;
+ }
+
+ public function validate($data) {
+ $this->form->setData($data);
+ $isValid = $this->form->isValid();
+ $normalized = $this->form->getData();
+ unset($normalized['ViewReportControl']);
+
+ $validated = new \SSRS\Form\ValidateResult();
+ $validated->isValid = $isValid;
+ $validated->parameters = $normalized;
+
+ return $validated;
+ }
+
+ protected function buildForm() {
+ $form = new Form();
+
+ $parameters = $this->getUserParameters();
+
+ // add the elements to the form
+ foreach ($parameters as $parameter) {
+ $element = $this->buildElement($parameter);
+ $form->add($element);
+ }
+
+ // modify the input filter
+ foreach ($parameters as $parameter) {
+ $filter = $form->getInputFilter()->get($parameter->name);
+ $filter->setAllowEmpty($parameter->isAllowBlank());
+ }
+
+ $submit = new \Zend\Form\Element\Submit('ViewReportControl');
+ $submit->setValue('View Report');
+ $form->add($submit);
+
+ $this->form = $form;
+ return $this;
+ }
+
+ public function getUserParameters() {
+ return array_filter($this->executionInfo->getReportParameters(), function(ReportParameter $parameter) {
+ return ($parameter->data['PromptUser'] && false === empty($parameter->data['Prompt']));
+ });
+ }
+
+ protected function buildElement(ReportParameter $parameter) {
+ $type = $parameter->getType();
+ if (false === in_array($type, array('Integer', 'String', 'Float', 'Boolean', 'DateTime'))) {
+ throw new \RuntimeException("Unknown report parameter type '$type'");
+ }
+
+ if ($parameter->isSelect()) {
+ $element = $this->buildSelect($parameter);
+ } else {
+ $element = $this->buildText($parameter);
+ }
+
+ // set the element label
+ $element->setLabel($parameter->data['Prompt']);
+ // set the value that ssrs suggests
+ $defaults = $parameter->getDefaultValue();
+ $default = $parameter->isMultiValue() ? $defaults : (string) array_shift($defaults);
+ $element->setValue($default);
+
+ return $element;
+ }
+
+ protected function buildText(ReportParameter $parameter) {
+ $element = new Text($parameter->name);
+ return $element;
+ }
+
+ /**
+ *
+ * @param ReportParameter $parameter
+ * @return \Zend\Form\Element\Select
+ */
+ protected function buildSelect(ReportParameter $parameter) {
+ $element = new Select($parameter->name);
+
+ if ($parameter->isMultiValue()) {
+ $element->setAttribute('multiple', true);
+ }
+
+ $multiOptions = array();
+ foreach ($parameter->getValidValues() as $value) {
+ $multiOptions[$value->Value] = $value->Label;
+ }
+
+ $element->setValueOptions($multiOptions);
+
+ return $element;
+ }
+
+ protected function checkForGetHTMLZendDependencies() {
+ if (false === class_exists('\Zend\View\View')) {
+ throw new \RuntimeException('zendframework/zend-view not found, add to composer.json?');
+ }
+
+ if (false === class_exists('\Zend\ServiceManager\AbstractPluginManager')) {
+ throw new \RuntimeException('zendframework/zend-servicemanager not found, add to composer.json?');
+ }
+
+ if (false === class_exists('\Zend\I18n\View\Helper\AbstractTranslatorHelper')) {
+ throw new \RuntimeException('zendframework/zend-i18n not found, add to composer.json?');
+ }
+
+ if (false === class_exists('\Zend\Escaper\Escaper')) {
+ throw new \RuntimeException('zendframework/zend-escaper not found, add to composer.json?');
+ }
+ }
+
+}
diff --git a/library/SSRS/Form/ValidateResult.php b/library/SSRS/Form/ValidateResult.php
new file mode 100644
index 0000000..c023dc2
--- /dev/null
+++ b/library/SSRS/Form/ValidateResult.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace SSRS\Form;
+
+class ValidateResult {
+
+ public $isValid;
+ public $parameters;
+
+}
diff --git a/library/SSRS/Object/ExecutionInfo.php b/library/SSRS/Object/ExecutionInfo.php
index 0a723db..f1f9d56 100755
--- a/library/SSRS/Object/ExecutionInfo.php
+++ b/library/SSRS/Object/ExecutionInfo.php
@@ -84,6 +84,40 @@ class ExecutionInfo extends ObjectAbstract {
return null;
}
+ public function hasOutstandingDependencies() {
+ $parameters = $this->getReportParameters();
+ foreach ($parameters AS $parameter) {
+ if ($parameter->hasOutstandingDependencies()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public function hasMissingValidValues() {
+ $parameters = $this->getReportParameters();
+ foreach ($parameters AS $parameter) {
+ if ($parameter->hasMissingValidValue()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public function canRender() {
+ if ($this->hasOutstandingDependencies()) {
+ return false;
+ }
+
+ if ($this->hasMissingValidValues()) {
+ return false;
+ }
+
+ return true;
+ }
+
public function __sleep() {
$this->executionInfo = null;
return array('data');
diff --git a/library/SSRS/Object/ReportOutput.php b/library/SSRS/Object/ReportOutput.php
index ac17fe4..70d7928 100755
--- a/library/SSRS/Object/ReportOutput.php
+++ b/library/SSRS/Object/ReportOutput.php
@@ -11,7 +11,9 @@ class ReportOutput extends ObjectAbstract {
$this->verifyCachePath($localCachePath);
$rootPath = rtrim($localCachePath, '/');
- foreach ($this->StreamIds->string as $streamId) {
+
+ $streamIds = $this->getStreamIds();
+ foreach ($streamIds as $streamId) {
$path = $rootPath . '/' . $streamId;
$stream = $report->renderStream($format, $streamId);
@@ -22,6 +24,10 @@ class ReportOutput extends ObjectAbstract {
return $this;
}
+ public function getStreamIds() {
+ return is_array($this->StreamIds->string) ? $this->StreamIds->string : array($this->StreamIds->string);
+ }
+
public function download($filename) {
header("Cache-control: max-age=3600, must-revalidate");
header("Pragma: public");
diff --git a/library/SSRS/Object/ReportParameter.php b/library/SSRS/Object/ReportParameter.php
index 60a09a2..d00e464 100755
--- a/library/SSRS/Object/ReportParameter.php
+++ b/library/SSRS/Object/ReportParameter.php
@@ -95,11 +95,27 @@ class ReportParameter extends ObjectAbstract {
*
* @return bool
*/
+ public function hasMissingValidValue() {
+ return ($this->getState() == 'MissingValidValue');
+ }
+
+ /**
+ *
+ * @return bool
+ */
public function getState() {
return key_exists('State', $this->data) ? $this->data['State'] : null;
}
/**
+ *
+ * @return string
+ */
+ public function getType() {
+ return $this->data['Type'];
+ }
+
+ /**
*
* @return bool
*/
@@ -115,4 +131,12 @@ class ReportParameter extends ObjectAbstract {
return ($this->isMultiValue() || (!empty($this->data['ValidValues']) && is_array($this->data['ValidValues']) && count($this->data['ValidValues']) > 0));
}
+ /**
+ *
+ * @return bool
+ */
+ public function isAllowBlank() {
+ return $this->data['AllowBlank'];
+ }
+
}