diff options
author | Arron Woods <aw@chartblocks.com> | 2015-05-15 15:19:46 +0100 |
---|---|---|
committer | Arron Woods <aw@chartblocks.com> | 2015-05-15 15:19:46 +0100 |
commit | 92364a9965c75b8703271b76e689ed726dd74c27 (patch) | |
tree | e2c2f8cc401d004a84eacedfb7e094fde3b64409 | |
parent | 0994427a5b75bba964cd56142e7f5d34a79a2422 (diff) | |
download | php-ssrs-92364a9965c75b8703271b76e689ed726dd74c27.zip php-ssrs-92364a9965c75b8703271b76e689ed726dd74c27.tar.gz php-ssrs-92364a9965c75b8703271b76e689ed726dd74c27.tar.bz2 |
Form rendering with ZendFramework2
-rw-r--r-- | composer.json | 7 | ||||
-rw-r--r-- | library/SSRS/Form/Adapter/AbstractAdapter.php | 20 | ||||
-rw-r--r-- | library/SSRS/Form/Adapter/AdapterInterface.php | 16 | ||||
-rw-r--r-- | library/SSRS/Form/Adapter/ZendFramework2.php | 170 | ||||
-rw-r--r-- | library/SSRS/Form/ValidateResult.php | 10 | ||||
-rwxr-xr-x | library/SSRS/Object/ExecutionInfo.php | 34 | ||||
-rwxr-xr-x | library/SSRS/Object/ReportOutput.php | 8 | ||||
-rwxr-xr-x | library/SSRS/Object/ReportParameter.php | 24 |
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']; + } + } |