From 652f46703ba02cf5559bdf7a3e33f359e5eb1f83 Mon Sep 17 00:00:00 2001 From: kremsy Date: Wed, 21 Jun 2017 18:24:12 +0200 Subject: [PATCH] updated FML to improve Page chunking --- libs/FML/Script/Features/Paging.php | 895 ++++++++++++++-------------- 1 file changed, 446 insertions(+), 449 deletions(-) diff --git a/libs/FML/Script/Features/Paging.php b/libs/FML/Script/Features/Paging.php index fc995309..d8e197d5 100644 --- a/libs/FML/Script/Features/Paging.php +++ b/libs/FML/Script/Features/Paging.php @@ -19,428 +19,429 @@ use FML\Script\ScriptLabel; class Paging extends ScriptFeature { - /* - * Constants - */ - const VAR_CURRENT_PAGE = "FML_Paging_CurrentPage"; - const FUNCTION_UPDATE_CURRENT_PAGE = "FML_UpdateCurrentPage"; + /* + * Constants + */ + const VAR_CURRENT_PAGE = "FML_Paging_CurrentPage"; + const FUNCTION_UPDATE_CURRENT_PAGE = "FML_UpdateCurrentPage"; - /** - * @var Label $label Page number Label - */ - protected $label = null; + /** + * @var Label $label Page number Label + */ + protected $label = null; - /** - * @var PagingPage[] $pages Pages - */ - protected $pages = array(); + /** + * @var PagingPage[] $pages Pages + */ + protected $pages = array(); - /** - * @var PagingButton[] $buttons Paging Buttons - */ - protected $buttons = array(); + /** + * @var PagingButton[] $buttons Paging Buttons + */ + protected $buttons = array(); - /** - * @var int $startPageNumber Start Page number - */ - protected $startPageNumber = null; + /** + * @var int $startPageNumber Start Page number + */ + protected $startPageNumber = null; - /** - * @var int $customMaxPageNumber Custom maximum page number - */ - protected $customMaxPageNumber = null; + /** + * @var int $customMaxPageNumber Custom maximum page number + */ + protected $customMaxPageNumber = null; - /** - * @var string $previousChunkAction Previous chunk action name - */ - protected $previousChunkAction = null; + /** + * @var string $previousChunkAction Previous chunk action name + */ + protected $previousChunkAction = null; - /** - * @var string $nextChunkAction Next chunk action name - */ - protected $nextChunkAction = null; + /** + * @var string $nextChunkAction Next chunk action name + */ + protected $nextChunkAction = null; - /** - * @var bool $chunkActionAppendsPageNumber Chunk action appended with Page number - */ - protected $chunkActionAppendsPageNumber = null; + /** + * @var bool $chunkActionAppendsPageNumber Chunk action appended with Page number + */ + protected $chunkActionAppendsPageNumber = null; - /** - * Construct a new Paging - * - * @api - * @param Label $label (optional) Page number Label - * @param PagingPage[] $pages (optional) Pages - * @param PagingButton[] $buttons (optional) Pageing Buttons - */ - public function __construct(Label $label = null, array $pages = null, array $buttons = null) - { - if ($label) { - $this->setLabel($label); - } - if ($pages) { - $this->setPages($pages); - } - if ($buttons) { - $this->setButtons($buttons); - } - } + /** + * Construct a new Paging + * + * @api + * @param Label $label (optional) Page number Label + * @param PagingPage[] $pages (optional) Pages + * @param PagingButton[] $buttons (optional) Pageing Buttons + */ + public function __construct(Label $label = null, array $pages = null, array $buttons = null) + { + if ($label) { + $this->setLabel($label); + } + if ($pages) { + $this->setPages($pages); + } + if ($buttons) { + $this->setButtons($buttons); + } + } - /** - * Get the Label showing the Page number - * - * @api - * @return Label - */ - public function getLabel() - { - return $this->label; - } + /** + * Get the Label showing the Page number + * + * @api + * @return Label + */ + public function getLabel() + { + return $this->label; + } - /** - * Set the Label showing the Page number - * - * @api - * @param Label $label Page number Label - * @return static - */ - public function setLabel(Label $label) - { - $label->checkId(); - $this->label = $label; - return $this; - } + /** + * Set the Label showing the Page number + * + * @api + * @param Label $label Page number Label + * @return static + */ + public function setLabel(Label $label) + { + $label->checkId(); + $this->label = $label; + return $this; + } - /** - * Get the Pages - * - * @api - * @return PagingPage[] - */ - public function getPages() - { - return $this->pages; - } + /** + * Get the Pages + * + * @api + * @return PagingPage[] + */ + public function getPages() + { + return $this->pages; + } - /** - * Add a new Page Control - * - * @api - * @param Control $pageControl Page Control - * @param string $pageNumber (optional) Page number - * @return static - */ - public function addPageControl(Control $pageControl, $pageNumber = null) - { - if ($pageNumber === null) { - $pageNumber = count($this->pages) + 1; - } - $page = new PagingPage($pageControl, $pageNumber); - return $this->addPage($page); - } + /** + * Add a new Page Control + * + * @api + * @param Control $pageControl Page Control + * @param string $pageNumber (optional) Page number + * @return static + */ + public function addPageControl(Control $pageControl, $pageNumber = null) + { + if ($pageNumber === null) { + $pageNumber = count($this->pages) + 1; + } + $page = new PagingPage($pageControl, $pageNumber); + return $this->addPage($page); + } - /** - * Add a new Page - * - * @api - * @param PagingPage $page Page - * @return static - */ - public function addPage(PagingPage $page) - { - if (!in_array($page, $this->pages, true)) { - array_push($this->pages, $page); - } - return $this; - } + /** + * Add a new Page + * + * @api + * @param PagingPage $page Page + * @return static + */ + public function addPage(PagingPage $page) + { + if (!in_array($page, $this->pages, true)) { + array_push($this->pages, $page); + } + return $this; + } - /** - * Add new Pages - * - * @api - * @param PagingPage[] $pages Pages - * @return static - */ - public function setPages(array $pages) - { - $this->pages = array(); - foreach ($pages as $page) { - $this->addPage($page); - } - return $this; - } + /** + * Add new Pages + * + * @api + * @param PagingPage[] $pages Pages + * @return static + */ + public function setPages(array $pages) + { + $this->pages = array(); + foreach ($pages as $page) { + $this->addPage($page); + } + return $this; + } - /** - * Get the Buttons - * - * @api - * @return PagingButton[] - */ - public function getButtons() - { - return $this->buttons; - } + /** + * Get the Buttons + * + * @api + * @return PagingButton[] + */ + public function getButtons() + { + return $this->buttons; + } - /** - * Add a new Button Control to browse through the Pages - * - * @api - * @param Control $buttonControl Button used for browsing - * @param int $browseAction (optional) Number of browsed Pages per click - * @return static - */ - public function addButtonControl(Control $buttonControl, $browseAction = null) - { - if ($browseAction === null) { - $buttonCount = count($this->buttons); - if ($buttonCount % 2 === 0) { - $browseAction = $buttonCount / 2 + 1; - } else { - $browseAction = $buttonCount / -2 - 1; - } - } - $button = new PagingButton($buttonControl, $browseAction); - return $this->addButton($button); - } + /** + * Add a new Button Control to browse through the Pages + * + * @api + * @param Control $buttonControl Button used for browsing + * @param int $browseAction (optional) Number of browsed Pages per click + * @return static + */ + public function addButtonControl(Control $buttonControl, $browseAction = null) + { + if ($browseAction === null) { + $buttonCount = count($this->buttons); + if ($buttonCount % 2 === 0) { + $browseAction = $buttonCount / 2 + 1; + } else { + $browseAction = $buttonCount / -2 - 1; + } + } + $button = new PagingButton($buttonControl, $browseAction); + return $this->addButton($button); + } - /** - * Add a new Button to browse through Pages - * - * @api - * @param PagingButton $button Paging Button - * @return static - */ - public function addButton(PagingButton $button) - { - if (!in_array($button, $this->buttons, true)) { - array_push($this->buttons, $button); - } - return $this; - } + /** + * Add a new Button to browse through Pages + * + * @api + * @param PagingButton $button Paging Button + * @return static + */ + public function addButton(PagingButton $button) + { + if (!in_array($button, $this->buttons, true)) { + array_push($this->buttons, $button); + } + return $this; + } - /** - * Set the Paging Buttons - * - * @api - * @param PagingButton[] $buttons Paging Buttons - * @return static - */ - public function setButtons(array $buttons) - { - $this->buttons = array(); - foreach ($buttons as $button) { - $this->addButton($button); - } - return $this; - } + /** + * Set the Paging Buttons + * + * @api + * @param PagingButton[] $buttons Paging Buttons + * @return static + */ + public function setButtons(array $buttons) + { + $this->buttons = array(); + foreach ($buttons as $button) { + $this->addButton($button); + } + return $this; + } - /** - * Get the start Page number - * - * @api - * @return int - */ - public function getStartPageNumber() - { - return $this->startPageNumber; - } + /** + * Get the start Page number + * + * @api + * @return int + */ + public function getStartPageNumber() + { + return $this->startPageNumber; + } - /** - * Set the start Page number - * - * @api - * @param int $startPageNumber Page number to start with - * @return static - */ - public function setStartPageNumber($startPageNumber) - { - $this->startPageNumber = (int)$startPageNumber; - return $this; - } + /** + * Set the start Page number + * + * @api + * @param int $startPageNumber Page number to start with + * @return static + */ + public function setStartPageNumber($startPageNumber) + { + $this->startPageNumber = (int)$startPageNumber; + return $this; + } - /** - * Get a custom maximum Page number for using chunks - * - * @api - * @return int - */ - public function getCustomMaxPageNumber() - { - return $this->customMaxPageNumber; - } + /** + * Get a custom maximum Page number for using chunks + * + * @api + * @return int + */ + public function getCustomMaxPageNumber() + { + return $this->customMaxPageNumber; + } - /** - * Set a custom maximum Page number for using chunks - * - * @api - * @param int $maxPageNumber Custom maximum Page number - * @return static - */ - public function setCustomMaxPageNumber($maxPageNumber) - { - $this->customMaxPageNumber = (int)$maxPageNumber; - return $this; - } + /** + * Set a custom maximum Page number for using chunks + * + * @api + * @param int $maxPageNumber Custom maximum Page number + * @return static + */ + public function setCustomMaxPageNumber($maxPageNumber) + { + $this->customMaxPageNumber = (int)$maxPageNumber; + return $this; + } - /** - * Get the action triggered when the previous chunk is needed - * - * @api - * @return string - */ - public function getPreviousChunkAction() - { - return $this->previousChunkAction; - } + /** + * Get the action triggered when the previous chunk is needed + * + * @api + * @return string + */ + public function getPreviousChunkAction() + { + return $this->previousChunkAction; + } - /** - * Set the action triggered when the previous chunk is needed - * - * @api - * @param string $previousChunkAction Triggered action - * @return static - */ - public function setPreviousChunkAction($previousChunkAction) - { - $this->previousChunkAction = (string)$previousChunkAction; - return $this; - } + /** + * Set the action triggered when the previous chunk is needed + * + * @api + * @param string $previousChunkAction Triggered action + * @return static + */ + public function setPreviousChunkAction($previousChunkAction) + { + $this->previousChunkAction = (string)$previousChunkAction; + return $this; + } - /** - * Get the action triggered when the next chunk is needed - * - * @api - * @return string - */ - public function getNextChunkAction() - { - return $this->nextChunkAction; - } + /** + * Get the action triggered when the next chunk is needed + * + * @api + * @return string + */ + public function getNextChunkAction() + { + return $this->nextChunkAction; + } - /** - * Set the action triggered when the next chunk is needed - * - * @api - * @param string $nextChunkAction Triggered action - * @return static - */ - public function setNextChunkAction($nextChunkAction) - { - $this->nextChunkAction = (string)$nextChunkAction; - return $this; - } + /** + * Set the action triggered when the next chunk is needed + * + * @api + * @param string $nextChunkAction Triggered action + * @return static + */ + public function setNextChunkAction($nextChunkAction) + { + $this->nextChunkAction = (string)$nextChunkAction; + return $this; + } - /** - * Set the actions triggered when another chunk is needed - * - * @api - * @param string $chunkAction Triggered action - * @return static - */ - public function setChunkActions($chunkAction) - { - return $this->setNextChunkAction($chunkAction) - ->setPreviousChunkAction($chunkAction); - } + /** + * Set the actions triggered when another chunk is needed + * + * @api + * @param string $chunkAction Triggered action + * @return static + */ + public function setChunkActions($chunkAction) + { + return $this->setNextChunkAction($chunkAction) + ->setPreviousChunkAction($chunkAction); + } - /** - * Get if the chunk action should append the needed Page number - * - * @api - * @return bool - */ - public function getChunkActionAppendsPageNumber() - { - return $this->chunkActionAppendsPageNumber; - } + /** + * Get if the chunk action should append the needed Page number + * + * @api + * @return bool + */ + public function getChunkActionAppendsPageNumber() + { + return $this->chunkActionAppendsPageNumber; + } - /** - * Set if the chunk action should append the needed Page number - * - * @api - * @param bool $appendPageNumber Append the needed Page number - * @return static - */ - public function setChunkActionAppendsPageNumber($appendPageNumber) - { - $this->chunkActionAppendsPageNumber = (bool)$appendPageNumber; - return $this; - } + /** + * Set if the chunk action should append the needed Page number + * + * @api + * @param bool $appendPageNumber Append the needed Page number + * @return static + */ + public function setChunkActionAppendsPageNumber($appendPageNumber) + { + $this->chunkActionAppendsPageNumber = (bool)$appendPageNumber; + return $this; + } - /** - * @see ScriptFeature::prepare() - */ - public function prepare(Script $script) - { - if (empty($this->pages)) { - return $this; - } - $script->setScriptInclude(ScriptInclude::TEXTLIB); + /** + * @see ScriptFeature::prepare() + */ + public function prepare(Script $script) + { + if (empty($this->pages)) { + return $this; + } + $script->setScriptInclude(ScriptInclude::TEXTLIB); - $currentPageVariable = self::VAR_CURRENT_PAGE; - $updatePageFunction = self::FUNCTION_UPDATE_CURRENT_PAGE; + $currentPageVariable = self::VAR_CURRENT_PAGE; + $updatePageFunction = self::FUNCTION_UPDATE_CURRENT_PAGE; - $minPageNumber = 1; - $startPageNumber = (is_int($this->startPageNumber) ? $this->startPageNumber : $minPageNumber); - $maxPage = $this->getMaxPage(); - $maxPageNumber = $this->customMaxPageNumber; - if (!is_int($maxPageNumber)) { - $maxPageNumber = $maxPage->getPageNumber(); - } + $minPageNumber = 1; + $startPageNumber = (is_int($this->startPageNumber) ? $this->startPageNumber : $minPageNumber); + $maxPage = $this->getMaxPage(); + $maxPageNumber = $this->customMaxPageNumber; + if (!is_int($maxPageNumber)) { + $maxPageNumber = $maxPage->getPageNumber(); + } - $pagingId = $maxPage->getControl() - ->getId(true, true); - $pagingId = Builder::escapeText($maxPage->getControl() - ->getId()); - $pageLabelId = Builder::EMPTY_STRING; - if ($this->label) { - $pageLabelId = Builder::escapeText($this->label->getId()); - } + $pagingId = $maxPage->getControl() + ->getId(true, true); + $pagingId = Builder::escapeText($maxPage->getControl() + ->getId()); + $pageLabelId = Builder::EMPTY_STRING; + if ($this->label) { + $pageLabelId = Builder::escapeText($this->label->getId()); + } - $pagesArrayText = $this->getPagesArrayText(); - $pageButtonsArrayText = $this->getPageButtonsArrayText(); + $pagesArrayText = $this->getPagesArrayText(); + $pageButtonsArrayText = $this->getPageButtonsArrayText(); - $previousChunkAction = Builder::escapeText($this->previousChunkAction); - $nextChunkAction = Builder::escapeText($this->nextChunkAction); - $chunkActionAppendsPageNumber = Builder::getBoolean($this->chunkActionAppendsPageNumber); + $previousChunkAction = Builder::escapeText($this->previousChunkAction); + $nextChunkAction = Builder::escapeText($this->nextChunkAction); + $chunkActionAppendsPageNumber = Builder::getBoolean($this->chunkActionAppendsPageNumber); - // Init - $initScriptText = " + // Init + $initScriptText = " declare {$currentPageVariable} for This = Integer[Text]; {$currentPageVariable}[{$pagingId}] = {$startPageNumber}; {$updatePageFunction}({$pagingId}, {$pageLabelId}, 0, {$minPageNumber}, {$maxPageNumber}, {$pagesArrayText}, {$previousChunkAction}, {$nextChunkAction}, {$chunkActionAppendsPageNumber});"; - $script->appendGenericScriptLabel(ScriptLabel::ONINIT, $initScriptText, true); + $script->appendGenericScriptLabel(ScriptLabel::ONINIT, $initScriptText, true); - // MouseClick - $clickScriptText = " + // MouseClick + $clickScriptText = " declare PageButtons = {$pageButtonsArrayText}; if (PageButtons.existskey(Event.Control.ControlId)) { declare BrowseAction = PageButtons[Event.Control.ControlId]; {$updatePageFunction}({$pagingId}, {$pageLabelId}, BrowseAction, {$minPageNumber}, {$maxPageNumber}, {$pagesArrayText}, {$previousChunkAction}, {$nextChunkAction}, {$chunkActionAppendsPageNumber}); }"; - $script->appendGenericScriptLabel(ScriptLabel::MOUSECLICK, $clickScriptText, true); + $script->appendGenericScriptLabel(ScriptLabel::MOUSECLICK, $clickScriptText, true); - // Update function - $functionText = " + // Update function + $functionText = " Void {$updatePageFunction}(Text _PagingId, Text _PageLabelId, Integer _BrowseAction, Integer _MinPageNumber, Integer _MaxPageNumber, Text[Integer] _Pages, Text _PreviousChunkAction, Text _NextChunkAction, Boolean _ChunkActionAppendPageNumber) { declare {$currentPageVariable} for This = Integer[Text]; if (!{$currentPageVariable}.existskey(_PagingId)) return; - declare CurrentPage = {$currentPageVariable}[_PagingId] + _BrowseAction; - if (CurrentPage < _MinPageNumber) { - CurrentPage = _MinPageNumber; - } else if (CurrentPage > _MaxPageNumber) { - CurrentPage = _MaxPageNumber; + declare NewPageNumber = {$currentPageVariable}[_PagingId] + _BrowseAction; + if (NewPageNumber < _MinPageNumber) { + NewPageNumber = _MinPageNumber; + } else if (NewPageNumber > _MaxPageNumber) { + NewPageNumber = _MaxPageNumber; } - {$currentPageVariable}[_PagingId] = CurrentPage; - declare PageFound = False; - foreach (PageNumber => PageId in _Pages) { - declare PageControl <=> Page.GetFirstChild(PageId); - PageControl.Visible = (CurrentPage == PageNumber); - if (PageControl.Visible) { - PageFound = True; - } - } - if (!PageFound && _BrowseAction != 0) { + {$currentPageVariable}[_PagingId] = NewPageNumber; + if (_Pages.existskey(NewPageNumber)) { + foreach (PageNumber => PageId in _Pages) { + declare PageControl <=> Page.GetFirstChild(PageId); + PageControl.Visible = (PageNumber == NewPageNumber); + } + if (_PageLabelId != \"\") { + declare PageLabel <=> (Page.GetFirstChild(_PageLabelId) as CMlLabel); + PageLabel.Value = NewPageNumber^\"/\"^_MaxPageNumber; + } + } else { declare Text ChunkAction; if (_BrowseAction < 0) { ChunkAction = _PreviousChunkAction; @@ -448,91 +449,87 @@ Void {$updatePageFunction}(Text _PagingId, Text _PageLabelId, Integer _BrowseAct ChunkAction = _NextChunkAction; } if (_ChunkActionAppendPageNumber) { - ChunkAction ^= CurrentPage; + ChunkAction ^= NewPageNumber; } TriggerPageAction(ChunkAction); } - if (_PageLabelId == " . Builder::EMPTY_STRING . ") return; - declare PageLabel <=> (Page.GetFirstChild(_PageLabelId) as CMlLabel); - if (PageLabel == Null) return; - PageLabel.Value = CurrentPage^\"/\"^_MaxPageNumber; }"; - $script->addScriptFunction($updatePageFunction, $functionText); - return $this; - } + $script->addScriptFunction($updatePageFunction, $functionText); + return $this; + } - /** - * Get the minimum Page - * - * @return PagingPage - */ - protected function getMinPage() - { - $minPageNumber = null; - $minPage = null; - foreach ($this->pages as $page) { - $pageNumber = $page->getPageNumber(); - if ($minPageNumber === null || $pageNumber < $minPageNumber) { - $minPageNumber = $pageNumber; - $minPage = $page; - } - } - return $minPage; - } + /** + * Get the minimum Page + * + * @return PagingPage + */ + protected function getMinPage() + { + $minPageNumber = null; + $minPage = null; + foreach ($this->pages as $page) { + $pageNumber = $page->getPageNumber(); + if ($minPageNumber === null || $pageNumber < $minPageNumber) { + $minPageNumber = $pageNumber; + $minPage = $page; + } + } + return $minPage; + } - /** - * Get the maximum Page - * - * @return PagingPage - */ - protected function getMaxPage() - { - $maxPageNumber = null; - $maxPage = null; - foreach ($this->pages as $page) { - $pageNumber = $page->getPageNumber(); - if ($maxPageNumber === null || $pageNumber > $maxPageNumber) { - $maxPageNumber = $pageNumber; - $maxPage = $page; - } - } - return $maxPage; - } + /** + * Get the maximum Page + * + * @return PagingPage + */ + protected function getMaxPage() + { + $maxPageNumber = null; + $maxPage = null; + foreach ($this->pages as $page) { + $pageNumber = $page->getPageNumber(); + if ($maxPageNumber === null || $pageNumber > $maxPageNumber) { + $maxPageNumber = $pageNumber; + $maxPage = $page; + } + } + return $maxPage; + } - /** - * Build the array text for the Pages - * - * @return string - */ - protected function getPagesArrayText() - { - if (empty($this->pages)) { - return Builder::getArray(array(0 => ''), true); - } - $pages = array(); - foreach ($this->pages as $page) { - $pages[$page->getPageNumber()] = $page->getControl() - ->getId(); - } - return Builder::getArray($pages, true); - } + /** + * Build the array text for the Pages + * + * @return string + */ + protected function getPagesArrayText() + { + if (empty($this->pages)) { + return Builder::getArray(array(0 => ''), true); + } + $pages = array(); + foreach ($this->pages as $page) { + $pages[$page->getPageNumber()] = $page->getControl() + ->getId(); + } + return Builder::getArray($pages, true); + } - /** - * Build the array text for the Page Buttons - * - * @return string - */ - protected function getPageButtonsArrayText() - { - if (empty($this->buttons)) { - return Builder::getArray(array('' => 0), true); - } - $pageButtons = array(); - foreach ($this->buttons as $pageButton) { - $pageButtons[$pageButton->getControl() - ->getId()] = $pageButton->getPagingCount(); - } - return Builder::getArray($pageButtons, true); - } + /** + * Build the array text for the Page Buttons + * + * @return string + */ + protected function getPageButtonsArrayText() + { + if (empty($this->buttons)) { + return Builder::getArray(array('' => 0), true); + } + $pageButtons = array(); + foreach ($this->buttons as $pageButton) { + $pageButtons[$pageButton->getControl() + ->getId()] = $pageButton->getPagingCount(); + } + return Builder::getArray($pageButtons, true); + } }