Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
100.00% |
1 / 1 |
|
100.00% |
27 / 27 |
CRAP | |
100.00% |
312 / 312 |
PagePropertyDefinition | |
100.00% |
1 / 1 |
|
100.00% |
27 / 27 |
80 | |
100.00% |
312 / 312 |
__construct(\Scrivo\Context $context=null) | |
100.00% |
1 / 1 |
2 | |
100.00% |
8 / 8 |
|||
__get($name) | |
100.00% |
1 / 1 |
8 | |
100.00% |
8 / 8 |
|||
__set($name, $value) | |
100.00% |
1 / 1 |
7 | |
100.00% |
8 / 8 |
|||
setFields(\Scrivo\Context $context, array $rd) | |
100.00% |
1 / 1 |
1 | |
100.00% |
9 / 9 |
|||
getTypes() | |
100.00% |
1 / 1 |
1 | |
100.00% |
12 / 12 |
|||
setPageDefinitionId($pageDefinitionId) | |
100.00% |
1 / 1 |
1 | |
100.00% |
5 / 5 |
|||
setTitle(\Scrivo\String $title) | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
setPhpSelector(\Scrivo\String $phpSelector) | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
setType($type) | |
100.00% |
1 / 1 |
10 | |
100.00% |
15 / 15 |
|||
setTypeData(\stdClass $typeData) | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
setPageDefinitionTabId($pageDefinitionTabId) | |
100.00% |
1 / 1 |
5 | |
100.00% |
10 / 10 |
|||
readStr($val) | |
100.00% |
1 / 1 |
3 | |
100.00% |
6 / 6 |
|||
setTypeDataFromRS($rs) | |
100.00% |
1 / 1 |
3 | |
100.00% |
14 / 14 |
|||
getTypeDataAsString() | |
100.00% |
1 / 1 |
2 | |
100.00% |
5 / 5 |
|||
setTypeDataAsString(\Scrivo\String $str) | |
100.00% |
1 / 1 |
3 | |
100.00% |
14 / 14 |
|||
checkUniquePhpSelector() | |
100.00% |
1 / 1 |
2 | |
100.00% |
10 / 10 |
|||
validateInsert() | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
insert() | |
100.00% |
1 / 1 |
7 | |
100.00% |
39 / 39 |
|||
validateUpdate() | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
update() | |
100.00% |
1 / 1 |
5 | |
100.00% |
31 / 31 |
|||
updateHtmlTextTab() | |
100.00% |
1 / 1 |
1 | |
100.00% |
18 / 18 |
|||
updateApplicationTab() | |
100.00% |
1 / 1 |
1 | |
100.00% |
12 / 12 |
|||
validateDelete(\Scrivo\Context $context, $id) | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
delete(\Scrivo\Context $context, $id) | |
100.00% |
1 / 1 |
4 | |
100.00% |
18 / 18 |
|||
move($dir=\Scrivo\SequenceNo::MOVE_DOWN) | |
100.00% |
1 / 1 |
1 | |
100.00% |
7 / 7 |
|||
fetch(\Scrivo\Context $context, $id) | |
100.00% |
1 / 1 |
4 | |
100.00% |
27 / 27 |
|||
select(\Scrivo\Context $context, $pageDefinitionId) | |
100.00% |
1 / 1 |
3 | |
100.00% |
22 / 22 |
<?php | |
/* Copyright (c) 2013, Geert Bergman (geert@scrivo.nl) | |
* All rights reserved. | |
* | |
* Redistribution and use in source and binary forms, with or without | |
* modification, are permitted provided that the following conditions are met: | |
* | |
* 1. Redistributions of source code must retain the above copyright notice, | |
* this list of conditions and the following disclaimer. | |
* 2. Redistributions in binary form must reproduce the above copyright notice, | |
* this list of conditions and the following disclaimer in the documentation | |
* and/or other materials provided with the distribution. | |
* 3. Neither the name of "Scrivo" nor the names of its contributors may be | |
* used to endorse or promote products derived from this software without | |
* specific prior written permission. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | |
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
* POSSIBILITY OF SUCH DAMAGE. | |
* | |
* $Id: PagePropertyDefinition.php 866 2013-08-25 16:22:35Z geert $ | |
*/ | |
/** | |
* Implementation of the \Scrivo\PagePropertyDefinition class. | |
*/ | |
namespace Scrivo; | |
/** | |
* The PagePropertyDefinition is used to create definions for page properties. | |
* | |
* Page properties are page objects (text blocks, images, urls, colors, etc) | |
* that can be edited using the Scrivo user interface. A page property | |
* definition holds the definition of a page property. | |
* | |
* TODO: full tab html text entry properties still store their data into the | |
* etPageDefinition_ELEMENT table. | |
* | |
* @property-read int $id The page property definition id (DB key). | |
* @property \Scrivo\String $phpSelector A textual identification/key for this | |
* page property. | |
* @property int $pageDefinitionId The id of the page definition to which this | |
* page property definition belongs. | |
* @property int $pageDefinitionTabId An optional id of a page definition tab | |
* on which the page property is displayed. | |
* @property \Scrivo\String $title A descriptive name for the page property. | |
* @property \Scrivo\String $type The page property type, one out of | |
* PagePropertyDefinition::TYPE_* constants. | |
* @property \stdClass $typeData Optional data needed to for this specific | |
* page property. | |
*/ | |
class PagePropertyDefinition { | |
/** | |
* Value indicating an img property. | |
*/ | |
const TYPE_IMAGE = "img"; | |
/** | |
* Value indicating an input field property. | |
*/ | |
const TYPE_INPUT = "input"; | |
/** | |
* Value indicating a select list property. | |
*/ | |
const TYPE_SELECT = "select"; | |
/** | |
* Value indicating a color select list property. | |
*/ | |
const TYPE_COLOR_LIST = "colorlist"; | |
/** | |
* Value indicating a color property. | |
*/ | |
const TYPE_COLOR = "color"; | |
/** | |
* Value indicating a datetime property. | |
*/ | |
const TYPE_DATE_TIME = "datetime"; | |
/** | |
* Value indicating a url property. | |
*/ | |
const TYPE_URL = "url"; | |
/** | |
* Value indicating a checkbox property. | |
*/ | |
const TYPE_CHECKBOX = "checkbox"; | |
/** | |
* Value indicating a html textarea property. | |
*/ | |
const TYPE_HTML_TEXT = "html_text"; | |
/** | |
* Value indicating a single large html textarea on a tab. | |
*/ | |
const TYPE_HTML_TEXT_TAB = "html_text_tab"; | |
/** | |
* Value indicating there's an application the tab. | |
*/ | |
const TYPE_APPLICATION_TAB = "application_tab"; | |
/** | |
* Value indicating a textarea property. | |
*/ | |
const TYPE_TEXT = "text"; | |
/** | |
* The page property definition id (DB key). | |
* @var int | |
*/ | |
private $id = 0; | |
/** | |
* The id of the pageDefinition to which this page property definition | |
* belongs. | |
* @var int | |
*/ | |
private $pageDefinitionId = 0; | |
/** | |
* A descriptive name for the page property. | |
* @var \Scrivo\String | |
*/ | |
private $title = null; | |
/** | |
* A textual identification/key for this page property. | |
* @var \Scrivo\String | |
*/ | |
private $phpSelector = null; | |
/** | |
* The page property type, one out of PagePropertyDefinition::TYPE_* | |
* constants. | |
* @var \Scrivo\String | |
*/ | |
private $type = ""; | |
/** | |
* Optional data needed to for this specific page property. | |
* @var \stdClass | |
*/ | |
private $typeData = null; | |
/** | |
* An optional id of a pageDefinition tab on which the page property is | |
* displayed. | |
* @var int | |
*/ | |
private $pageDefinitionTabId = 0; | |
/** | |
* A Scrivo context. | |
* @var \Scrivo\Context | |
*/ | |
private $context = null; | |
/** | |
* A flag to indicate a resquence on update | |
* @var boolean | |
*/ | |
private $resequence = false; | |
/** | |
* Create an empty page property defintion object. | |
* | |
* @param \Scrivo\Context $context A Scrivo context. | |
*/ | |
public function __construct(\Scrivo\Context $context=null) { | |
\Scrivo\ArgumentCheck::assertArgs(func_get_args(), array(null), 0); | |
if ($context) { | |
$this->title = new \Scrivo\String(); | |
$this->phpSelector = new \Scrivo\String(); | |
$this->typeData = new \stdClass; | |
$this->context = $context; | |
} | |
} | |
/** | |
* Implementation of the readable properties using the PHP magic | |
* method __get(). | |
* | |
* @param string $name The name of the property to get. | |
* | |
* @return mixed The value of the requested property. | |
*/ | |
public function __get($name) { | |
switch($name) { | |
case "id": return $this->id; | |
case "pageDefinitionId": return $this->pageDefinitionId; | |
case "title": return $this->title; | |
case "phpSelector": return $this->phpSelector; | |
case "type": return $this->type; | |
case "typeData": return $this->typeData; | |
case "pageDefinitionTabId": return $this->pageDefinitionTabId; | |
} | |
throw new \Scrivo\SystemException("No such get-property '$name'."); | |
} | |
/** | |
* Implementation of the writable properties using the PHP magic | |
* method __set(). | |
* | |
* @param string $name The name of the property to set. | |
* @param mixed $value The value of the property to set. | |
*/ | |
public function __set($name, $value) { | |
switch($name) { | |
case "pageDefinitionId": $this->setPageDefinitionId($value); return; | |
case "title": $this->setTitle($value); return; | |
case "phpSelector": $this->setPhpSelector($value); return; | |
case "type": $this->setType($value); return; | |
case "typeData": $this->setTypeData($value); return; | |
case "pageDefinitionTabId": | |
$this->setPageDefinitionTabId($value); return; | |
} | |
throw new \Scrivo\SystemException("No such set-property '$name'."); | |
} | |
/** | |
* Convenience method to set the fields of a page property defintion | |
* object from an array (result set row). | |
* | |
* @param \Scrivo\Context $context A Scrivo context. | |
* @param array $rd An array containing the field data using the database | |
* field names as keys. | |
*/ | |
private function setFields(\Scrivo\Context $context, array $rd) { | |
$this->id = intval($rd["page_property_definition_id"]); | |
$this->pageDefinitionId = intval($rd["page_definition_id"]); | |
$this->title = new \Scrivo\String($rd["title"]); | |
$this->phpSelector = new \Scrivo\String($rd["php_key"]); | |
$this->type = (string)$rd["type"]; | |
$this->setTypeDataFromRS($rd); | |
$this->pageDefinitionTabId = intval($rd["page_definition_tab_id"]); | |
$this->context = $context; | |
} | |
/** | |
* Get an array of the possible property types. | |
* | |
* @return \Scrivo\String[] An array of all possible property types. | |
*/ | |
public static function getTypes() { | |
return array( | |
self::TYPE_IMAGE, | |
self::TYPE_INPUT, | |
self::TYPE_SELECT, | |
self::TYPE_COLOR_LIST, | |
self::TYPE_COLOR, | |
self::TYPE_DATE_TIME, | |
self::TYPE_URL, | |
self::TYPE_CHECKBOX, | |
self::TYPE_HTML_TEXT, | |
self::TYPE_HTML_TEXT_TAB, | |
self::TYPE_APPLICATION_TAB, | |
self::TYPE_TEXT | |
); | |
} | |
/** | |
* Set the id of the page definition to which this page property definition | |
* belongs. | |
* | |
* @param int $pageDefinitionId The id of the page definition to which this | |
* page property definition belongs. | |
*/ | |
private function setPageDefinitionId($pageDefinitionId) { | |
\Scrivo\ArgumentCheck::assertArgs(func_get_args(), array( | |
array(\Scrivo\ArgumentCheck::TYPE_INTEGER) | |
)); | |
$this->pageDefinitionId = $pageDefinitionId; | |
} | |
/** | |
* Set the descriptive name for the page property. | |
* | |
* @param \Scrivo\String $title A descriptive name for the page property. | |
*/ | |
private function setTitle(\Scrivo\String $title) { | |
$this->title = $title; | |
} | |
/** | |
* Set the textual identification/key for this page property. | |
* | |
* @param \Scrivo\String $phpSelector A textual identification/key for | |
* this page property. | |
*/ | |
private function setPhpSelector(\Scrivo\String $phpSelector) { | |
$this->phpSelector = $phpSelector; | |
} | |
/** | |
* Set the page property type, one out of the | |
* \Scrivo\PagePropertyDefinition::TYPE_* constants. | |
* Note that TYPE_HTML_TEXT_TAB and TYPE_HTML_TEXT_TAB behave differently | |
* than normal properties so type juggling between these and other types | |
* is not allowed. | |
* | |
* @param string $type The property type, one out of the | |
* \Scrivo\PagePropertyDefinition::TYPE_* constants. | |
*/ | |
private function setType($type) { | |
\Scrivo\ArgumentCheck::assertArgs(func_get_args(), array( | |
array(\Scrivo\ArgumentCheck::TYPE_STRING, $this->getTypes()) | |
)); | |
if ($this->type && ( | |
($this->type === self::TYPE_HTML_TEXT_TAB | |
&& $type !== self::TYPE_HTML_TEXT_TAB) || | |
($this->type === self::TYPE_APPLICATION_TAB | |
&& $type !== self::TYPE_APPLICATION_TAB) || | |
(($this->type !== self::TYPE_APPLICATION_TAB | |
&& $this->type !== self::TYPE_HTML_TEXT_TAB) && | |
($type === self::TYPE_APPLICATION_TAB | |
|| $type === self::TYPE_HTML_TEXT_TAB)))) { | |
throw new \Scrivo\SystemException( | |
"Type change '{$this->type}' to '{$type}' is not supported"); | |
} | |
$this->type = $type; | |
} | |
/** | |
* Set the data (optional) needed to for this specific page property type. | |
* | |
* @param \stdClass $typeData Optional data needed to for this specific | |
* page property type. | |
*/ | |
private function setTypeData(\stdClass $typeData) { | |
$this->typeData = $typeData; | |
} | |
/** | |
* Set the id of a page definition tab (optional) on which this page | |
* property is displayed. | |
* Note that TYPE_HTML_TEXT_TAB and TYPE_HTML_TEXT_TAB types have their | |
* own exclusive tabs and setting their tab is therefore prohibited. | |
* | |
* @param int $pageDefinitionTabId An optional id of a page definition tab | |
* on which this page property is displayed. | |
*/ | |
private function setPageDefinitionTabId($pageDefinitionTabId) { | |
if ($this->type == self::TYPE_HTML_TEXT_TAB | |
|| $this->type == self::TYPE_APPLICATION_TAB) { | |
throw new \Scrivo\SystemException( | |
"cant't set the tab for HTML and Application tabs"); | |
} | |
if ($this->id | |
&& ($this->pageDefinitionTabId != $pageDefinitionTabId)) { | |
$this->resequence = true; | |
} | |
$this->pageDefinitionTabId = $pageDefinitionTabId; | |
} | |
/** | |
* Convert a string to its most likely type. | |
* | |
* @param string $val The value to convert to either an int, float or | |
* \Scrivo\String. | |
* | |
* @return int|float|\Scrivo\String The given value converted to its | |
* most likely type. | |
*/ | |
private function readStr($val) { | |
$str = (string)$val; | |
if (is_numeric($str)) { | |
if ((string)$str === (string)(int)$str) { | |
return intval($str); | |
} | |
return floatval($str); | |
} | |
return $val; | |
} | |
/** | |
* Convert plain text type data to an object. | |
* | |
* @param array $rs The type data as stored in the database. | |
*/ | |
private function setTypeDataFromRS($rs) { | |
$d = array(); | |
if ($rs["type"] == self::TYPE_HTML_TEXT_TAB) { | |
$d["css_selector"] = new \Scrivo\String($rs["css_selector"]); | |
$d["INITIAL_CONTENT"] = new \Scrivo\String(""); | |
$d["page_css"] = new \Scrivo\String($rs["page_css"]); | |
$d["stylesheet"] = new \Scrivo\String($rs["stylesheet"]); | |
$d["css_id"] = new \Scrivo\String($rs["css_id"]); | |
$this->typeData = (object)$d; | |
} else if ($rs["type"] == self::TYPE_APPLICATION_TAB) { | |
$d["APPLICATION_DEFINITION_ID"] = intval($rs["application_definition_id"]); | |
$this->typeData = (object)$d; | |
} else { | |
$this->setTypeDataAsString(new \Scrivo\String($rs["type_data"])); | |
} | |
} | |
/** | |
* Create a string representation of the type data member. | |
* | |
* @return \Scrivo\String The type data as an string. | |
*/ | |
private function getTypeDataAsString() { | |
$d = array(); | |
foreach($this->typeData as $k=>$v) { | |
$d[] = $k."=".$v; | |
}; | |
return new \Scrivo\String(implode("\n", $d)); | |
} | |
/** | |
* Set the type data member form a string representation. The format of | |
* the string should be NAME1=VALUE1\nNAME2=VALUE2\nNAME3...etc. | |
* | |
* @param \Scrivo\String $str The type data string. | |
*/ | |
private function setTypeDataAsString(\Scrivo\String $str) { | |
\Scrivo\ArgumentCheck::assertArgs(func_get_args(), array( | |
null, | |
array(\Scrivo\ArgumentCheck::TYPE_INTEGER) | |
), 1); | |
$d = array(); | |
$parts = $str->split(new \Scrivo\String("\n")); | |
foreach($parts as $line) { | |
$p = $line->split(new \Scrivo\String("="), 2); | |
if (count($p) == 2) { | |
$d[(string)$p[0]->trim()] = $this->readStr($p[1]->trim()); | |
} | |
} | |
$this->typeData = (object)$d; | |
} | |
/** | |
* Check if the current php selector is unique. | |
* | |
* @throws ApplicationException If one or more of the fields contain | |
* invalid data. | |
*/ | |
private function checkUniquePhpSelector() { | |
$sth = $this->context->connection->prepare( | |
"SELECT COUNT(*) FROM page_property_definition WHERE | |
instance_id = :instId AND page_property_definition_id <> :id AND | |
page_definition_id = :templId AND php_key = :phpSelector"); | |
$this->context->connection->bindInstance($sth); | |
$sth->bindValue(":id", $this->id, \PDO::PARAM_INT); | |
$sth->bindValue(":templId", $this->pageDefinitionId, \PDO::PARAM_INT); | |
$sth->bindValue(":phpSelector", $this->phpSelector, \PDO::PARAM_STR); | |
$sth->execute(); | |
if ($sth->fetchColumn()) { | |
throw new ApplicationException("PHP Selector not unique"); | |
} | |
} | |
/** | |
* Check if this page property defintion object can be inserted into the | |
* database. | |
* | |
* @throws \Scrivo\ApplicationException If the data is not accessible or | |
* one or more of the fields contain invalid data. | |
*/ | |
private function validateInsert() { | |
$this->context->checkPermission(\Scrivo\AccessController::WRITE_ACCESS); | |
$this->checkUniquePhpSelector(); | |
} | |
/** | |
* Insert new page property defintion object data into the database. | |
* | |
* First it is checked if the data of this page property defintion object | |
* can be inserted into the database, then the data is inserted into the | |
* database. If no id was set a new object id is generated. | |
* | |
* @throws \Scrivo\ApplicationException If the data is not accessible or | |
* one or more of the fields contain invalid data. | |
*/ | |
public function insert() { | |
try { | |
$this->validateInsert(); | |
if ($this->type == self::TYPE_HTML_TEXT_TAB | |
|| $this->type == self::TYPE_APPLICATION_TAB) { | |
if (!$this->pageDefinitionTabId) { | |
$tab = new \Scrivo\PageDefinitionTab($this->context); | |
$tab->pageDefinitionId = $this->pageDefinitionId; | |
$tab->title = $this->title; | |
$tab->insert(); | |
$this->pageDefinitionTabId = $tab->id; | |
} | |
$this->id = $this->pageDefinitionTabId; | |
if ($this->type == self::TYPE_HTML_TEXT_TAB) { | |
$this->updateHtmlTextTab(); | |
} else { | |
$this->updateApplicationTab(); | |
} | |
} else { | |
if (!$this->id) { | |
$this->id = $this->context->connection->generateId(); | |
} | |
$sth = $this->context->connection->prepare( | |
"INSERT INTO page_property_definition ( | |
instance_id, page_property_definition_id, page_definition_id, sequence_no, | |
title, php_key, type, type_data, page_definition_tab_id | |
) VALUES ( | |
:instId, :id, :pageDefinitionId, 0, :title, | |
:phpSelector, :type, :typeData, :pageDefinitionTabId | |
)"); | |
$this->context->connection->bindInstance($sth); | |
$sth->bindValue(":id", $this->id, \PDO::PARAM_INT); | |
$sth->bindValue(":pageDefinitionId", | |
$this->pageDefinitionId, \PDO::PARAM_INT); | |
$sth->bindValue(":title", $this->title, \PDO::PARAM_STR); | |
$sth->bindValue( | |
":phpSelector", $this->phpSelector, \PDO::PARAM_STR); | |
$sth->bindValue(":type", $this->type, \PDO::PARAM_STR); | |
$sth->bindValue( | |
":typeData", $this->getTypeDataAsString(), \PDO::PARAM_STR); | |
$sth->bindValue(":pageDefinitionTabId", | |
$this->pageDefinitionTabId, \PDO::PARAM_INT); | |
$sth->execute(); | |
\Scrivo\SequenceNo::position($this->context, "page_property_definition", | |
"page_definition_tab_id", $this->id, \Scrivo\SequenceNo::MOVE_LAST); | |
} | |
} catch(\PDOException $e) { | |
throw new \Scrivo\ResourceException($e); | |
} | |
} | |
/** | |
* Check if this page property defintion object can be updated in the | |
* database. | |
* | |
* @throws \Scrivo\ApplicationException If the data is not accessible or | |
* one or more of the fields contain invalid data. | |
*/ | |
private function validateUpdate() { | |
$this->context->checkPermission(\Scrivo\AccessController::WRITE_ACCESS); | |
$this->checkUniquePhpSelector(); | |
} | |
/** | |
* Update existing page property defintion object data in the database. | |
* | |
* First it is checked if the data of this page property defintion object | |
* can be updated in the database, then the data is updated in the database. | |
* | |
* @throws \Scrivo\ApplicationException If the data is not accessible or | |
* one or more of the fields contain invalid data. | |
*/ | |
public function update() { | |
try { | |
$this->validateUpdate(); | |
if ($this->type == self::TYPE_HTML_TEXT_TAB) { | |
$this->updateHtmlTextTab(); | |
} else if ($this->type == self::TYPE_APPLICATION_TAB) { | |
$this->updateApplicationTab(); | |
} else { | |
$sth = $this->context->connection->prepare( | |
"UPDATE page_property_definition SET | |
page_definition_id = :pageDefinitionId, | |
title = :title, | |
php_key = :phpSelector, type = :type, | |
type_data = :typeData, page_definition_tab_id = :pageDefinitionTabId | |
WHERE instance_id = :instId AND page_property_definition_id = :id"); | |
$this->context->connection->bindInstance($sth); | |
$sth->bindValue(":id", $this->id, \PDO::PARAM_INT); | |
$sth->bindValue(":pageDefinitionId", | |
$this->pageDefinitionId, \PDO::PARAM_INT); | |
$sth->bindValue(":title", $this->title, \PDO::PARAM_STR); | |
$sth->bindValue( | |
":phpSelector", $this->phpSelector, \PDO::PARAM_STR); | |
$sth->bindValue(":type", $this->type, \PDO::PARAM_STR); | |
$sth->bindValue( | |
":typeData", $this->getTypeDataAsString(), \PDO::PARAM_STR); | |
$sth->bindValue(":pageDefinitionTabId", | |
$this->pageDefinitionTabId, \PDO::PARAM_INT); | |
$sth->execute(); | |
// If marked (i.e. moved to other tab) move this property last. | |
if ($this->resequence) { | |
\Scrivo\SequenceNo::position($this->context, | |
"page_property_definition", "page_definition_tab_id", $this->id, | |
\Scrivo\SequenceNo::MOVE_LAST); | |
$this->resequence = false; | |
} | |
unset($this->context->cache[$this->id]); | |
} | |
} catch(\PDOException $e) { | |
throw new \Scrivo\ResourceException($e); | |
} | |
} | |
/** | |
* Set page property definition data for html text tab definitions in the | |
* page_definition_tab table. | |
*/ | |
private function updateHtmlTextTab() { | |
$sth = $this->context->connection->prepare( | |
"UPDATE page_definition_tab SET page_definition_id = :pageDefinitionId, | |
php_key = :phpSelector, css_selector = :ccsSelector, | |
page_css = :documentCss, stylesheet = :stylesheet, | |
css_id = :cssId, application_definition_id = 0 | |
WHERE instance_id = :instId AND page_definition_tab_id = :id"); | |
$this->context->connection->bindInstance($sth); | |
$sth->bindValue(":id", $this->id, \PDO::PARAM_INT); | |
$sth->bindValue( | |
":pageDefinitionId", $this->pageDefinitionId, \PDO::PARAM_INT); | |
$sth->bindValue( | |
":phpSelector", $this->phpSelector, \PDO::PARAM_STR); | |
$sth->bindValue( | |
":ccsSelector", $this->typeData->css_selector, \PDO::PARAM_STR); | |
$sth->bindValue( | |
":documentCss", $this->typeData->page_css, \PDO::PARAM_STR); | |
$sth->bindValue( | |
":stylesheet", $this->typeData->stylesheet, \PDO::PARAM_STR); | |
$sth->bindValue( | |
":cssId", $this->typeData->css_id, \PDO::PARAM_STR); | |
$sth->execute(); | |
} | |
/** | |
* Set page property definition data for application definitions in the | |
* page_definition_tab table. | |
*/ | |
private function updateApplicationTab() { | |
$sth = $this->context->connection->prepare( | |
"UPDATE page_definition_tab SET page_definition_id = :pageDefinitionId, | |
php_key = :phpSelector, application_definition_id = :appId | |
WHERE instance_id = :instId AND page_definition_tab_id = :id"); | |
$this->context->connection->bindInstance($sth); | |
$sth->bindValue(":id", $this->id, \PDO::PARAM_INT); | |
$sth->bindValue( | |
":pageDefinitionId", $this->pageDefinitionId, \PDO::PARAM_INT); | |
$sth->bindValue( | |
":phpSelector", $this->phpSelector, \PDO::PARAM_STR); | |
$sth->bindValue(":appId", | |
$this->typeData->APPLICATION_DEFINITION_ID, \PDO::PARAM_INT); | |
$sth->execute(); | |
} | |
/** | |
* Check if deletion of page property defintion object data does not | |
* violate any business rules. | |
* | |
* @param \Scrivo\Context $context A Scrivo context. | |
* @param int $id The object id of the page property defintion to select. | |
* | |
* @throws \Scrivo\ApplicationException If the data is not accessible or | |
* if it is not possible to delete the language data. | |
*/ | |
private static function validateDelete(\Scrivo\Context $context, $id) { | |
$context->checkPermission(\Scrivo\AccessController::WRITE_ACCESS); | |
} | |
/** | |
* Delete existing page property defintion data from the database. | |
* | |
* First it is is checked if it's possible to delete page property | |
* defintion data, then the page property defintion data including its | |
* dependecies is deleted from the database. | |
* | |
* @param \Scrivo\Context $context A Scrivo context. | |
* @param int $id The object id of the page property defintion to select. | |
* | |
* @throws \Scrivo\ApplicationException If the data is not accessible or | |
* if it is not possible to delete the page property defintion data. | |
*/ | |
public static function delete(\Scrivo\Context $context, $id) { | |
\Scrivo\ArgumentCheck::assertArgs(func_get_args(), array( | |
null, | |
array(\Scrivo\ArgumentCheck::TYPE_INTEGER) | |
)); | |
try { | |
self::validateDelete($context, $id); | |
$tmp = self::fetch($context, $id); | |
if ($tmp->type != self::TYPE_HTML_TEXT_TAB && | |
$tmp->type != self::TYPE_APPLICATION_TAB) { | |
$sth = $context->connection->prepare( | |
"DELETE FROM page_property_definition | |
WHERE instance_id = :instId AND page_property_definition_id = :id"); | |
$context->connection->bindInstance($sth); | |
$sth->bindValue(":id", $id, \PDO::PARAM_INT); | |
$sth->execute(); | |
} else { | |
\Scrivo\PageDefinitionTab::delete($context, $id); | |
} | |
} catch(\PDOException $e) { | |
throw new \Scrivo\ResourceException($e); | |
} | |
} | |
/** | |
* Move a property one position up or down. | |
* | |
* @param int $dir Direction of the move, see \Scrivo\SequenceNo:::MOVE_* | |
*/ | |
public function move($dir=\Scrivo\SequenceNo::MOVE_DOWN) { | |
\Scrivo\ArgumentCheck::assertArgs(func_get_args(), array( | |
array(\Scrivo\ArgumentCheck::TYPE_INTEGER) | |
), 0); | |
$this->context->checkPermission(AccessController::WRITE_ACCESS); | |
\Scrivo\SequenceNo::position($this->context, "page_property_definition", | |
"page_definition_tab_id", $this->id, $dir); | |
} | |
/** | |
* Fetch a page property defintion object from the database using its | |
* object id. | |
* | |
* @param \Scrivo\Context $context A Scrivo context. | |
* @param int $id The object id of the page property defintion to select. | |
* | |
* @return \Scrivo\PagePropertyDefinition The requested page property | |
* defintion object. | |
*/ | |
public static function fetch(\Scrivo\Context $context, $id) { | |
\Scrivo\ArgumentCheck::assertArgs(func_get_args(), array( | |
null, | |
array(\Scrivo\ArgumentCheck::TYPE_INTEGER) | |
)); | |
try { | |
// Try to retieve the page property defintion from the cache ... | |
if (isset($context->cache[$id])) { | |
// ... get it from the cache and set the context. | |
$pagePropertyDefinition = $context->cache[$id]; | |
$pagePropertyDefinition->context = $context; | |
} else { | |
// ... else retrieve it and set it in the cache. | |
$sth = $context->connection->prepare( | |
"SELECT page_property_definition_id, page_definition_id, sequence_no, | |
title, php_key, type, type_data, page_definition_tab_id, | |
'' css_selector, '' page_css, '' stylesheet, | |
'' css_id, 0 application_definition_id | |
FROM page_property_definition | |
WHERE instance_id = :instId AND page_property_definition_id = :id | |
UNION SELECT | |
page_definition_tab_id page_property_definition_id, | |
page_definition_id, sequence_no, title title, php_key, | |
IF(application_definition_id > 0, :appTab, :htmlTab) | |
type, '' type_data, page_definition_tab_id page_definition_tab_id, | |
css_selector, page_css, stylesheet, css_id, | |
application_definition_id | |
FROM page_definition_tab | |
WHERE instance_id = :instId AND page_definition_tab_id = :id" | |
); | |
$context->connection->bindInstance($sth); | |
$sth->bindValue(":id", $id, \PDO::PARAM_INT); | |
$sth->bindValue( | |
":appTab", self::TYPE_APPLICATION_TAB, \PDO::PARAM_STR); | |
$sth->bindValue( | |
":htmlTab", self::TYPE_HTML_TEXT_TAB, \PDO::PARAM_STR); | |
$sth->execute(); | |
if ($sth->rowCount() != 1) { | |
throw new \Scrivo\SystemException( | |
"Failed to load page definition property"); | |
} | |
$pagePropertyDefinition = | |
new \Scrivo\PagePropertyDefinition(); | |
$pagePropertyDefinition->setFields( | |
$context, $sth->fetch(\PDO::FETCH_ASSOC)); | |
$context->cache[$id] = $pagePropertyDefinition; | |
} | |
return $pagePropertyDefinition; | |
} catch(\PDOException $e) { | |
throw new \Scrivo\ResourceException($e); | |
} | |
} | |
/** | |
* Select page property defintions from the database. | |
* | |
* @param \Scrivo\Context $context A Scrivo context. | |
* @param int $pageDefinitionId An id of a page definition for which to | |
* select its properties. | |
* | |
* @return \Scrivo\PagePropertyDefinition[id] An array containing the | |
* selected page property defintions. | |
*/ | |
public static function select(\Scrivo\Context $context, $pageDefinitionId) { | |
\Scrivo\ArgumentCheck::assertArgs(func_get_args(), array( | |
null, | |
array(\Scrivo\ArgumentCheck::TYPE_INTEGER) | |
)); | |
try { | |
$sth = $context->connection->prepare( | |
"SELECT * FROM ( | |
SELECT page_property_definition_id, page_definition_id, sequence_no, title, | |
php_key, type, type_data, page_definition_tab_id, '' css_selector, | |
'' page_css, '' stylesheet, '' css_id, 0 application_definition_id | |
FROM page_property_definition | |
WHERE instance_id = :instId AND page_definition_id = :templId | |
UNION SELECT | |
page_definition_tab_id page_property_definition_id, | |
page_definition_id, sequence_no, title title, php_key, | |
IF(application_definition_id > 0, :appTab, :htmlTab) | |
type, '' type_data, page_definition_tab_id page_definition_tab_id, | |
css_selector, page_css, stylesheet, css_id, | |
application_definition_id | |
FROM page_definition_tab | |
WHERE instance_id = :instId AND application_definition_id >= 0 | |
AND page_definition_id = :templId | |
) TMP ORDER BY page_definition_tab_id, sequence_no"); | |
$context->connection->bindInstance($sth); | |
$sth->bindValue(":templId", $pageDefinitionId, \PDO::PARAM_INT); | |
$sth->bindValue( | |
":appTab", self::TYPE_APPLICATION_TAB, \PDO::PARAM_STR); | |
$sth->bindValue( | |
":htmlTab", self::TYPE_HTML_TEXT_TAB, \PDO::PARAM_STR); | |
$sth->execute(); | |
$res = array(); | |
while ($rd = $sth->fetch(\PDO::FETCH_ASSOC)) { | |
$li = new PagePropertyDefinition(); | |
$li->setFields($context, $rd); | |
$res[$li->id] = $li; | |
} | |
return $res; | |
} catch(\PDOException $e) { | |
throw new \Scrivo\ResourceException($e); | |
} | |
} | |
} | |