public function getPages($groupId) { $group = PageGroup::preload($groupId); if ($group->exists) { $pageIds = $group->itemPageIds(false, true); $attributes = PageGroupAttribute::where('group_id', '=', $groupId)->get(); $attributeBlocks = []; foreach ($attributes as $attribute) { $block = Block::preload($attribute->item_block_id); if ($block->exists) { $attributeBlocks[$attribute->item_block_id] = $block; } } $pageRows = ''; if (!empty($pageIds)) { foreach ($pageIds as $pageId) { $pageLang = PageLang::preload($pageId); $showBlocks = []; $canEdit = Auth::action('pages.edit', ['page_id' => $pageId]); $canDelete = Auth::action('pages.delete', ['page_id' => $pageId]); foreach ($attributeBlocks as $attributeBlock) { $pageBlockContent = PageBlock::preloadPageBlockLanguage($pageId, $attributeBlock->id, -1, 'block_id')->content; if (strpos($attributeBlock->type, 'selectmultiple') === 0 && !empty($pageBlockContent)) { // selectmultiple $showBlocks[] = implode(', ', unserialize($pageBlockContent)); } elseif ($attributeBlock->type == 'datetime' && !empty($pageBlockContent)) { // datetime $showBlocks[] = (new Carbon($pageBlockContent))->format(config('coaster::date.format.long')); } else { // text/string/select $showBlocks[] = strip_tags(StringHelper::cutString($pageBlockContent, 50)); } } $pageRows .= View::make('coaster::partials.groups.page_row', array('page_lang' => $pageLang, 'item_name' => $group->item_name, 'showBlocks' => $showBlocks, 'can_edit' => $canEdit, 'can_delete' => $canDelete))->render(); } } $pagesTable = View::make('coaster::partials.groups.page_table', array('rows' => $pageRows, 'item_name' => $group->item_name, 'blocks' => $attributeBlocks))->render(); $this->layoutData['modals'] = View::make('coaster::modals.general.delete_item'); $this->layoutData['content'] = View::make('coaster::pages.groups', array('group' => $group, 'pages' => $pagesTable, 'can_add' => $group->canAddItems(), 'can_edit' => $group->canEditItems())); } }
/** * Display pages selected with view * Also reverse lookup option, find pages with the current page selected * @param string $content * @param array $options * @return string */ public function display($content, $options = []) { $pages = []; $page_ids = []; if (isset($options['reverse'])) { // get page_ids on which current page is selected in this block $currentPageId = PageBuilder::pageId(true); if ($currentPageId) { $same_blocks = PageBlock::where('block_id', '=', $this->_block->id)->get(); foreach ($same_blocks as $same_block) { $block_page_ids = @unserialize($same_block->content); if (!empty($block_page_ids)) { foreach ($block_page_ids as $k => $block_page_id) { $block_page_id = Path::unParsePageId($block_page_id); if ($currentPageId == $block_page_id) { $page_ids[] = $same_block->page_id; break; } } } } } } elseif (!empty($content)) { $page_ids = unserialize($content); } if (!empty($page_ids)) { foreach ($page_ids as $page_id) { $parsedPageId = Path::unParsePageId($page_id, false); $pages[$page_id] = new PageDetails($parsedPageId[0], !empty($parsedPageId[1]) ? $parsedPageId[1] : 0); } } $template = !empty($options['view']) ? $options['view'] : $this->_block->name; $selectPageViews = 'themes.' . PageBuilder::getData('theme') . '.blocks.selectpages.'; if (View::exists($selectPageViews . $template)) { return View::make($selectPageViews . $template, array('pages' => $pages))->render(); } else { return 'Select pages template not found'; } }
/** * @param bool $globalFallback * @return string|null */ public function getContent($globalFallback = false) { if ($this->_repeaterId && $this->_repeaterRowId) { $blockData = PageBlockRepeaterData::getBlockData($this->id, $this->_versionId, $this->_repeaterId, $this->_repeaterRowId); } elseif ($this->_pageId) { $blockData = PageBlock::getBlockData($this->id, $this->_versionId, $this->_pageId); } else { $global = true; } if (isset($global) || $globalFallback && is_null($blockData)) { $blockData = PageBlockDefault::getBlockData($this->id, $this->_versionId); } return $blockData; }
public function getEdit($pageId, $versionId = 0) { // get page data if (!($page = Page::find($pageId))) { return 'Page Not Found'; } PageVersionSchedule::checkPageVersionIds(); $publishingOn = config('coaster::admin.publishing') > 0; $auth = ['can_publish' => $publishingOn && Auth::action('pages.version-publish', ['page_id' => $pageId]) || !$publishingOn && Auth::action('pages.edit', ['page_id' => $pageId]), 'can_duplicate' => $page->canDuplicate()]; // get page lang data if (!($page_lang = $page->pageCurrentLang)) { if (!($page_lang = $page->pageDefaultLang)) { return 'Page Lang Data Not Found'; } $page_lang = $page_lang->replicate(); $page_lang->language_id = Language::current(); $page_lang->save(); } $page_lang->url = ltrim($page_lang->url, '/'); // get version data $versionData = []; $versionData['latest'] = PageVersion::latest_version($pageId); $versionData['editing'] = $versionId == 0 || $versionId > $versionData['latest'] ? $versionData['latest'] : $versionId; $versionData['live'] = $page_lang->live_version; // get frontend link (preview or direct link if document) $frontendLink = Path::getFullUrl($pageId); if (!$page->is_live() && $page->link == 0) { $live_page_version = PageVersion::where('page_id', '=', $pageId)->where('version_id', '=', $versionData['live'])->first(); if (!empty($live_page_version)) { $frontendLink .= '?preview=' . $live_page_version->preview_key; } } // if loading a non live version get version template rather than current page template if ($versionData['live'] != $versionData['editing']) { if ($page_version = PageVersion::where('version_id', '=', $versionData['editing'])->where('page_id', '=', $pageId)->first()) { $page->template = $page_version->template; } else { return 'Page Version Data Not Found'; } } // load blocks content if ($page->link == 0) { $blocks = Template::template_blocks(config('coaster::frontend.theme'), $page->template); $blocks_content = PageBlock::preloadPage($pageId, $versionData['editing']); list($tab_headers, $tab_contents) = Block::getTabs($blocks, $blocks_content, $page->id); } else { $tab_headers = []; $tab_contents = []; } // load page info and order so page info is first and block categories are in order list($tab_headers[0], $tab_contents[0]) = $page->tabInfo(); ksort($tab_headers); // load version / publish requests if ($publishingOn && count($tab_headers) > 1) { $tab_headers[-1] = 'Versions'; $tab_contents[-1] = View::make('coaster::partials.tabs.versions.main', ['content' => PageVersion::version_table($page->id)])->render(); list($tab_headers[-2], $tab_contents[-2]) = $page->tabRequests(); } // remove empty tabs $tab_headers = array_filter($tab_headers); // get item name, or default to page $item_name = $page->groupItemsNames() ?: 'Page'; $tab_data = ['headers' => View::make('coaster::partials.tabs.header', ['tabs' => $tab_headers])->render(), 'contents' => View::make('coaster::partials.tabs.content', ['tabs' => $tab_contents, 'item' => $item_name, 'new_page' => false, 'publishing' => $publishingOn, 'can_publish' => $auth['can_publish'], 'page' => $page])->render()]; // add required modals if ($publishingOn) { $intervals = PageVersionSchedule::selectOptions(); $this->layoutData['modals'] = View::make('coaster::modals.pages.publish')->render() . View::make('coaster::modals.pages.publish_schedule', ['intervals' => $intervals, 'live_version' => $versionData['live']])->render() . View::make('coaster::modals.pages.request_publish')->render() . View::make('coaster::modals.pages.rename_version')->render(); } $this->layoutData['content'] = View::make('coaster::pages.pages.edit', ['page' => $page, 'page_lang' => $page_lang, 'item_name' => $item_name, 'publishingOn' => $publishingOn, 'tab' => $tab_data, 'frontendLink' => $frontendLink, 'version' => $versionData, 'auth' => $auth]); return null; }
/** * Filter by container block content (filtered by group container content - pageId) * @param int $pageId * @param bool $checkLive * @param bool $sort * @return array */ public function itemPageIdsFiltered($pageId, $checkLive = false, $sort = false) { $filterType = $checkLive ? 'all' : 'live'; $sortedSuffix = '-sorted'; $sorted = $sort ? $sortedSuffix : ''; self::$groupPagesFiltered[$this->id] = empty(self::$groupPagesFiltered[$this->id]) ? [] : self::$groupPagesFiltered[$this->id]; if (!array_key_exists($filterType . $sorted, self::$groupPagesFiltered[$this->id])) { if ($pageIds = $this->itemPageIds($checkLive, $sort)) { foreach ($this->blockFilters() as $blockFilter) { // get data to filter by $filterByBlock = Block::preload($blockFilter->filter_by_block_id); $filterByContent = PageBlock::preloadPageBlockLanguage($pageId, $blockFilter->filter_by_block_id, -1, 'block_id')->content; if ($filterByBlock->type == 'selectmultiple') { $filterByContentArr = unserialize($filterByContent); $filterByContentArr = is_array($filterByContentArr) ? $filterByContentArr : []; } else { $filterByContentArr = [$filterByContent]; } $filterByContentArr = array_filter($filterByContentArr, function ($filterByContentEl) { return !is_null($filterByContentEl); }); if (!empty($filterByContentArr)) { // get block data for block to filter on $blockType = Block::preload($blockFilter->item_block_id)->getTypeObject(); // run filter with filterBy content $filteredPageIds = []; foreach ($pageIds as $groupPageId) { foreach ($filterByContentArr as $filterByContentEl) { $groupPageBlockContent = PageBlock::preloadPageBlockLanguage($groupPageId, $blockFilter->item_block_id, -1)->content; if ($blockType->filter($groupPageBlockContent, $filterByContentEl, '=')) { $filteredPageIds[] = $groupPageId; break; } } } $pageIds = $filteredPageIds; } } } self::$groupPagesFiltered[$this->id][$filterType . $sorted] = $pageIds; } return self::$groupPagesFiltered[$this->id][$filterType . $sorted]; }
public function delete() { $page_name = PageLang::getName($this->id); $log_id = AdminLog::new_log('Page \'' . $page_name . '\' deleted (Page ID ' . $this->id . ')'); // make backups $page_versions = PageVersion::where('page_id', '=', $this->id); $page_langs = PageLang::where('page_id', '=', $this->id); $page_blocks = PageBlock::where('page_id', '=', $this->id); $menu_items = MenuItem::where('page_id', '=', $this->id)->orWhere('page_id', 'LIKE', $this->id . ',%'); $user_role_page_actions = UserRolePageAction::where('page_id', '=', $this->id); $page_groups = PageGroupPage::where('page_id', '=', $this->id); $publish_request_ids = []; foreach ($page_versions as $page_version) { $publish_request_ids[] = $page_version->id; } Backup::new_backup($log_id, '\\CoasterCms\\Models\\Page', $this); Backup::new_backup($log_id, '\\CoasterCms\\Models\\PageVersion', $page_versions->get()); Backup::new_backup($log_id, '\\CoasterCms\\Models\\PageLang', $page_langs->get()); Backup::new_backup($log_id, '\\CoasterCms\\Models\\PageBlock', $page_blocks->get()); Backup::new_backup($log_id, '\\CoasterCms\\Models\\MenuItem', $menu_items->get()); Backup::new_backup($log_id, '\\CoasterCms\\Models\\UserRolePageAction', $user_role_page_actions->get()); Backup::new_backup($log_id, '\\CoasterCms\\Models\\PageGroupPage', $page_groups->get()); // publish requests if (!empty($publish_request_ids)) { $page_publish_requests = PagePublishRequests::where('page_version_id', '=', $publish_request_ids); Backup::new_backup($log_id, '\\CoasterCms\\Models\\PagePublishRequests', $page_publish_requests->get()); $page_publish_requests->delete(); } // repeater data $repeater_block_ids = Block::getBlockIdsOfType('repeater'); if (!empty($repeater_block_ids)) { $repeater_blocks = PageBlock::whereIn('block_id', $repeater_block_ids)->where('page_id', $this->id)->get(); if (!$repeater_blocks->isEmpty()) { $repeater_ids = []; foreach ($repeater_blocks as $repeater_block) { $repeater_ids[] = $repeater_block->content; } $repeater_row_keys = PageBlockRepeaterRows::whereIn('repeater_id', $repeater_ids); $repeater_row_keys_get = $repeater_row_keys->get(); if (!$repeater_row_keys_get->isEmpty()) { $row_keys = []; foreach ($repeater_row_keys_get as $repeater_row_key) { $row_keys[] = $repeater_row_key->id; } $repeater_data = PageBlockRepeaterData::whereIn('row_key', $row_keys); Backup::new_backup($log_id, '\\CoasterCms\\Models\\PageBlockRepeaterRows', $repeater_row_keys->get()); Backup::new_backup($log_id, '\\CoasterCms\\Models\\PageBlockRepeaterData', $repeater_data->get()); $repeater_data->delete(); $repeater_row_keys->delete(); } } } // delete data $this->groups()->detach(); $page_versions->delete(); $page_langs->delete(); $page_blocks->delete(); $menu_items->delete(); $user_role_page_actions->delete(); PageSearchData::where('page_id', '=', $this->id)->delete(); parent::delete(); $return_log_ids = array($log_id); $child_pages = self::where('parent', '=', $this->id)->get(); if (!empty($child_pages)) { foreach ($child_pages as $child_page) { $log_ids = $child_page->delete(); $return_log_ids = array_merge($log_ids, $return_log_ids); } } sort($return_log_ids); return $return_log_ids; }
/** * @param string $blockName * @param array $options * @return mixed|string */ public function block($blockName, $options = []) { // force query available if block details changed in current request $block = Block::preloadClone($blockName, isset($options['force_query'])); $pageId = !empty($options['page_id']) ? Path::unParsePageId($options['page_id']) : $this->pageId(); $usingGlobalContent = false; $blockData = null; if (($customBlockData = $this->_getCustomBlockData($blockName)) !== null) { // load custom block data for (is also used for repeater content) $blockData = $customBlockData; } elseif ($block->exists) { // load block data $globalBlockData = PageBlockDefault::preload($block->id); $pageBlockData = PageBlock::preloadPageBlock($pageId, $block->id, $this->pageVersion($pageId)); // get languages $loadForLanguages = [Language::current()]; if (config('coaster::frontend.language_fallback') == 1 && !in_array(config('coaster::frontend.language'), $loadForLanguages)) { $loadForLanguages[] = config('coaster::frontend.language'); } // run through languages until block data found foreach ($loadForLanguages as $language) { if (!empty($pageBlockData[$language])) { // if custom page block for selected language exists $blockData = $pageBlockData[$language]->content; } elseif (!empty($globalBlockData[$language])) { // if default block for selected language exists $blockData = $globalBlockData[$language]->content; $usingGlobalContent = true; break; } } // return raw data if (isset($options['raw']) && $options['raw']) { return $blockData; } } else { return 'block not found'; } // set version that data has been grabbed for (0 = latest) if (empty($options['version'])) { $options['version'] = $usingGlobalContent ? 0 : $this->pageVersion($pageId); } // pass block details and data to display class return $block->setPageId($pageId)->setVersionId($options['version'])->getTypeObject()->display($blockData, $options); }