X-Git-Url: https://git.mxchange.org/?p=shipsimu.git;a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Fhelper%2Fclass_BaseHelper.php;h=b4e893f4bcee531260a179f4cf0b54fde375cbcc;hp=cc829fd0ea053d00dab82c363d9deee3f77f9c6d;hb=bbf48d46cb9063a4d2b78c106747147712f5474e;hpb=d9f03cd847ac073e31b64f5e8d1da8912c160c0b diff --git a/inc/classes/main/helper/class_BaseHelper.php b/inc/classes/main/helper/class_BaseHelper.php index cc829fd..b4e893f 100644 --- a/inc/classes/main/helper/class_BaseHelper.php +++ b/inc/classes/main/helper/class_BaseHelper.php @@ -22,20 +22,50 @@ * along with this program. If not, see . */ class BaseHelper extends BaseFrameworkSystem { + /** + * Instance to the class which provides field values + */ + private $valueInstance = null; + /** * Rendered content created by the helper class */ private $content = ""; /** - * Instance to the class which provides field values + * Array with groups */ - private $valueInstance = null; + private $groups = array(); + + /** + * Array with sub group + */ + private $subGroups = array(); + + /** + * Previously opened group + */ + private $previousGroupId = ""; + + /** + * Previously opened sub group + */ + private $previousSubGroupId = ""; + + /** + * Total counter for groups and sub groups + */ + private $totalCounter = 0; // Exception constants - const EXCEPTION_XML_PARSER_ERROR = 0x1e0; - const EXCEPTION_XML_NODE_UNKNOWN = 0x1e1; - const EXCEPTION_XML_NODE_MISMATCH = 0x1e2; + const EXCEPTION_XML_PARSER_ERROR = 0x1e0; + const EXCEPTION_XML_NODE_UNKNOWN = 0x1e1; + const EXCEPTION_XML_NODE_MISMATCH = 0x1e2; + const EXCEPTION_GROUP_NOT_OPENED = 0x1e3; + const EXCEPTION_GROUP_ALREADY_FOUND = 0x1e4; + const EXCEPTION_SUB_GROUP_ALREADY_FOUND = 0x1e5; + const EXCEPTION_NO_PREVIOUS_SUB_GROUP_OPENED = 0x1e6; + const EXCEPTION_NO_PREVIOUS_GROUP_OPENED = 0x1e7; /** * Protected constructor @@ -53,13 +83,63 @@ class BaseHelper extends BaseFrameworkSystem { } /** - * Add content + * Adds content directly * * @param $newContent New content to add * @return void */ protected final function addContent ($newContent) { - $this->content .= (string) trim($newContent)."\r\n"; + $this->content .= (string) trim($newContent)."\n"; + } + + /** + * Add header content to the helper + * + * @param $content Content to to the base + * @return void + */ + protected function addHeaderContent ($content) { + // Add the header content + $this->groups['header']['content'] = (string) trim($content); + } + + /** + * Add footer content to the helper + * + * @param $content Content to to the base + * @return void + */ + protected function addFooterContent ($content) { + // Add the footer content + $this->groups['footer']['content'] = (string) trim($content); + } + + /** + * Adds content to the previously opened group or sub group. If a sub group + * was found it will be taken. If no group/sub group is opened at the moment + * the code will be passed to addContent(). + * + * @param $newContent New content to add + * @return void + */ + protected final function addContentToPreviousGroup ($newContent) { + // Check for sub/group + if ($this->ifSubGroupOpenedPreviously()) { + // Get sub group id + $subGroupId = $this->getPreviousSubGroupId(); + + // Add the content + $this->subGroups[$subGroupId]['content'] .= $newContent; + } elseif ($this->ifGroupOpenedPreviously()) { + // Get group id + $groupId = $this->getPreviousGroupId(); + + // Add the content + $this->groups[$groupId]['content'] .= $newContent; + } else { + // Add it directly + $this->addContent($newContent); + } } /** @@ -82,7 +162,7 @@ class BaseHelper extends BaseFrameworkSystem { $fieldValue = $this->getValueField($fieldName); // Assign it with a template variable - $this->getTemplateInstance()->assignVariable("block_" . $fieldName, $fieldValue); + $this->getTemplateInstance()->assignVariable('block_' . $fieldName, $fieldValue); } /** @@ -99,10 +179,10 @@ class BaseHelper extends BaseFrameworkSystem { $fieldValue = $this->getValueField($fieldName); // Now filter it through the value through the filter method - $filteredValue = call_user_func_array(array($this, "doFilter" . ucfirst($filterMethod)), array($fieldValue)); + $filteredValue = call_user_func_array(array($this, 'doFilter' . $this->convertToClassName($filterMethod)), array($fieldValue)); // Assign it with a template variable - $this->getTemplateInstance()->assignVariable("block_" . $fieldName, $filteredValue); + $this->getTemplateInstance()->assignVariable('block_' . $fieldName, $filteredValue); } /** @@ -117,7 +197,7 @@ class BaseHelper extends BaseFrameworkSystem { // Get the required instance $this->valueInstance = Registry::getRegistry()->getInstance($registryKey); - // Is the instance valid? + // Is the value instance valid? if (is_null($this->valueInstance)) { // Try to create it "from scratch", by first init extra instance $extraInstance = null; @@ -139,6 +219,204 @@ class BaseHelper extends BaseFrameworkSystem { } // END - if } + /** + * Opens a helper group with given group id and content or throws an + * exception if that group is already found regardless if it is open or + * closed. + * + * @param $groupId Group id to open + * @param $content Initial content to add to the group + * @param $tag HTML tag used to open this group + * @return void + * @throws HelperGroupAlreadyCreatedException If the group was already created before + */ + protected function openGroupByIdContent ($groupId, $content, $tag) { + //* DEBUG: */ echo "OPEN:groupId={$groupId},content=
".htmlentities($content)."
\n"; + // Is the group already there? + if (isset($this->groups[$groupId])) { + // Then throw an exception here + throw new HelperGroupAlreadyCreatedException(array($this, $groupId), self::EXCEPTION_GROUP_ALREADY_FOUND); + } // END - if + + // Count one up + $this->totalCounter++; + + // Add the group to the stack + $this->groups[$this->totalCounter] = $groupId; + $this->groups[$groupId]['opened'] = true; + $this->groups[$groupId]['content'] = sprintf("%s\n", $groupId, strlen($content), $tag, $content); + $this->groups[$groupId]['tag'] = $tag; + + // Mark this group as previously opened + $this->setPreviousGroupId($groupId); + } + + /** + * Closes the previously opened group by added given content to it or + * throws an exception if no previous group was opened + * + * @param $content Content for previously opened group, or empty to use tag of opener + * @return void + * @throws HelperNoPreviousOpenedGroupException If no previously opened group was found + */ + public function closePreviousGroupByContent ($content = "") { + // Check if any sub group was opened before + if ($this->ifSubGroupOpenedPreviously()) { + // Close it automatically + $this->closePreviousSubGroupByContent(); + } // END - if + + // Check if any group was opened before + if ($this->ifGroupOpenedPreviously() === false) { + // Then throw an exception + throw new HelperNoPreviousOpenedGroupException(array($this, $content), self::EXCEPTION_NO_PREVIOUS_SUB_GROUP_OPENED); + } // END - if + + // Get previous group + $groupId = $this->getPreviousGroupId(); + + // Is the content empty? + if ((empty($content)) && (!empty($this->groups[$groupId]['tag']))) { + // Get it from opener + $content = sprintf("", $groupId, $this->groups[$groupId]['tag']); + } // END - if + + // Add content to it and mark it as closed + $this->groups[$groupId]['content'] .= sprintf("%s\n", $groupId, strlen($content), $this->groups[$groupId]['tag'], $content); + $this->groups[$groupId]['opened'] = false; + + // Mark previous group as closed + $this->setPreviousGroupId(""); + //* DEBUG: */ echo "CLOSE:groupId={$groupId}
\n"; + } + + /** + * Opens a helper sub group with given group id and content or throws an + * exception if that sub group is already found regardless if it is open or + * closed. + * + * @param $subGroupId Sub group id to open + * @param $content Initial content to add to the sub group + * @param $tag HTML tag used to open this group + * @return void + * @throws HelperSubGroupAlreadyCreatedException If the sub group was already created before + */ + protected function openSubGroupByIdContent ($subGroupId, $content, $tag) { + //* DEBUG: */ echo "OPEN:subGroupId={$subGroupId},content=".htmlentities($content)."
\n"; + // Is the group already there? + if (isset($this->subGroups[$subGroupId])) { + // Then throw an exception here + throw new HelperSubGroupAlreadyCreatedException(array($this, $subGroupId), self::EXCEPTION_SUB_GROUP_ALREADY_FOUND); + } // END - if + + // Count one up + $this->totalCounter++; + + // Add the group to the stack + $this->subGroups[$this->totalCounter] = $subGroupId; + $this->subGroups[$subGroupId]['opened'] = true; + $this->subGroups[$subGroupId]['content'] = sprintf("%s\n", $subGroupId, strlen($content), $tag, $content); + $this->subGroups[$subGroupId]['tag'] = $tag; + + // Mark this group as previously opened + $this->setPreviousSubGroupId($subGroupId); + } + + /** + * Closes the previously opened sub group by added given content to it or + * throws an exception if no previous sub group was opened + * + * @param $content Content for previously opened sub group, or leave empty to use div/span of openener + * @return void + * @throws HelperNoPreviousOpenedSubGroupException If no previously opened sub group was found + */ + public function closePreviousSubGroupByContent ($content = "") { + // Check if any sub group was opened before + if ($this->ifSubGroupOpenedPreviously() === false) { + // Then throw an exception + throw new HelperNoPreviousOpenedSubGroupException(array($this, $content), self::EXCEPTION_NO_PREVIOUS_SUB_GROUP_OPENED); + } // END - if + + // Get previous sub group + $subGroupId = $this->getPreviousSubGroupId(); + + // Is the content empty? + if ((empty($content)) && (!empty($this->subGroups[$subGroupId]['tag']))) { + // Get it from opener + $content = sprintf("", $subGroupId, $this->subGroups[$subGroupId]['tag']); + } // END - if + + // Add content to it and mark it as closed + $this->subGroups[$subGroupId]['content'] .= sprintf("%s\n", $subGroupId, strlen($content), $this->subGroups[$subGroupId]['tag'], $content); + $this->subGroups[$subGroupId]['opened'] = false; + + // Mark previous sub group as closed + $this->setPreviousSubGroupId(""); + //* DEBUG: */ echo "CLOSE:subGroupId={$subGroupId}
\n"; + } + + /** + * Renders all group and sub group in their order + * + * @return $content Rendered HTML content + */ + public function renderContent () { + // Initialize content + $content = ""; + + // Is header content there? + if (isset($this->groups['header'])) { + // Then add it + $content .= $this->groups['header']['content']."\n"; + } // END - if + + // Initiate content + $content .= $this->getContent(); + + // Now "walk" through all groups and sub-groups + for ($idx = 1; $idx <= $this->totalCounter; $idx++) { + // Is this a group and is it closed? + if ((isset($this->groups[$idx])) && ($this->groups[$this->groups[$idx]]['opened'] === false)) { + // Then add it's content + $groupContent = trim($this->groups[$this->groups[$idx]]['content']); + //* DEBUG: */ echo "group={$this->groups[$idx]},content=
".htmlentities($groupContent)."

\n"; + $content .= $groupContent; + } elseif ((isset($this->subGroups[$idx])) && ($this->subGroups[$this->subGroups[$idx]]['opened'] === false)) { + // Then add it's content + $subGroupContent = $this->subGroups[$this->subGroups[$idx]]['content']; + //* DEBUG: */ echo "subgroup={$this->subGroups[$idx]},content=
".htmlentities($subGroupContent)."

\n"; + $content .= trim($subGroupContent); + } else { + // Something went wrong + $this->debugInstance(__METHOD__."(): Something unexpected happened here."); + } + } // END - for + + // Is footer content there? + if (isset($this->groups['footer'])) { + // Then add it + $content .= $this->groups['footer']['content']."\n"; + } // END - if + + // Return it + //* DEBUG: */ echo "content=
".htmlentities($content)."
(".strlen($content).")
\n"; + return $content; + } + + /** + * Checks wether the specified group is opened + * + * @param $groupId Id of group to check + * @return $isOpened Wether the specified group is open + */ + protected function ifGroupIsOpened ($groupId) { + // Is the group open? + $isOpened = ((isset($this->groups[$groupId])) && ($this->groups[$groupId]['opened'] === true)); + + // Return status + return $isOpened; + } + /** * Getter for direct field values * @@ -161,6 +439,64 @@ class BaseHelper extends BaseFrameworkSystem { public final function getValueInstance () { return $this->valueInstance; } + + /** + * Check wether a group was opened previously + * + * @return $groupOpened Wether any group was opened before + */ + protected final function ifGroupOpenedPreviously () { + $groupOpened = (!empty($this->previousGroupId)); + return $groupOpened; + } + + /** + * Check wether a group was opened previously + * + * @return $subGroupOpened Wether any group was opened before + */ + protected final function ifSubGroupOpenedPreviously () { + $subGroupOpened = (!empty($this->previousSubGroupId)); + return $subGroupOpened; + } + + /** + * Getter for previous group id + * + * @return $previousGroupId Id of previously opened group + */ + protected final function getPreviousGroupId () { + return $this->previousGroupId; + } + + /** + * Setter for previous group id + * + * @param $previousGroupId Id of previously opened group + * @return void + */ + protected final function setPreviousGroupId ($previousGroupId) { + $this->previousGroupId = (string) $previousGroupId; + } + + /** + * Getter for previous sub group id + * + * @return $previousSubGroupId Id of previously opened sub group + */ + protected final function getPreviousSubGroupId () { + return $this->previousSubGroupId; + } + + /** + * Setter for previous sub group id + * + * @param $previousSubGroupId Id of previously opened sub group + * @return void + */ + protected final function setPreviousSubGroupId ($previousSubGroupId) { + $this->previousSubGroupId = (string) $previousSubGroupId; + } } // [EOF]