/**
  * @param int $blockId
  * @param int $pageId
  * @return \CoasterCms\Libraries\Blocks\Gallery
  * @throws \Exception
  */
 protected function _getGalleryBlock($pageId, $blockId)
 {
     $galleryBlock = Block::preload($blockId)->setPageId($pageId)->getTypeObject();
     if (is_a($galleryBlock, Gallery::class)) {
         return $galleryBlock;
     } else {
         throw new \Exception('Not a gallery block!');
     }
 }
 public static function getRepeaterBlocks($blockId)
 {
     $repeaterBlocks = [];
     $blockRepeater = static::preload($blockId);
     if ($blockRepeater->exists) {
         foreach (explode(",", $blockRepeater->blocks) as $repeaterBlockId) {
             $repeaterBlocks[$repeaterBlockId] = Block::preload($repeaterBlockId);
         }
     }
     return $repeaterBlocks;
 }
 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()));
     }
 }
Example #4
0
 private static function _pageExportData($theme)
 {
     @mkdir(base_path() . '/resources/views/themes/' . $theme->theme . '/export/pages');
     $pagesCsv = fopen(base_path() . '/resources/views/themes/' . $theme->theme . '/export/pages.csv', 'w');
     $pageBlocksCsv = fopen(base_path() . '/resources/views/themes/' . $theme->theme . '/export/pages/page_blocks.csv', 'w');
     $repeaterBlocksCsv = fopen(base_path() . '/resources/views/themes/' . $theme->theme . '/export/pages/repeater_blocks.csv', 'w');
     $menusCsv = fopen(base_path() . '/resources/views/themes/' . $theme->theme . '/export/pages/menus.csv', 'w');
     $menuItemsCsv = fopen(base_path() . '/resources/views/themes/' . $theme->theme . '/export/pages/menu_items.csv', 'w');
     $allFilesUsed = [];
     $groupIds = [];
     $groups = PageGroup::all();
     foreach ($groups as $group) {
         $groupIds[$group->id] = $group->id;
     }
     $pagesData = [];
     $pages = Page::all();
     foreach ($pages as $page) {
         $pagesData[$page->id] = $page;
     }
     $pageLangData = [];
     $pageLangs = PageLang::where('language_id', '=', Language::current())->orderBy('page_id')->get();
     foreach ($pageLangs as $pageLang) {
         $pageLangData[$pageLang->page_id] = $pageLang;
     }
     $templatesById = [];
     $templatesByName = [];
     $templates = Template::where('theme_id', '=', $theme->id)->get();
     foreach ($templates as $template) {
         $templatesById[$template->id] = $template->template;
         $templatesByName[$template->template] = $template->id;
     }
     // export pages
     fputcsv($pagesCsv, ['Page Id', 'Page Name', 'Page Url', 'Page Template', 'Parent Page Id', 'Default Child Template', 'Page Order Value', 'Is Link (0 or 1)', 'Is Live (0 or 1)', 'In Sitemap (0 or 1)', 'Container for Group Id', 'Container Url Priority', 'Canonical Parent Page Id', 'Group Ids (Comma Separated)']);
     foreach ($pageLangs as $pageLang) {
         if (!empty($pagesData[$pageLang->page_id])) {
             $page = $pagesData[$pageLang->page_id];
             if ($page->link && (strpos($pageLang->url, URL::to('/')) === 0 || strpos($pageLang->url, '/') === 0)) {
                 $filesUsed = [str_replace(URL::to('/'), '', $pageLang->url)];
                 $allFilesUsed = array_merge($filesUsed, $allFilesUsed);
             }
             fputcsv($pagesCsv, [$pageLang->page_id, $pageLang->name, $pageLang->url, !empty($templatesById[$page->template]) ? $templatesById[$page->template] : '', $page->parent ?: '', !empty($templatesById[$page->child_template]) ? $templatesById[$page->child_template] : '', $page->order, $page->link, $page->live ? 1 : 0, $page->sitemap, $page->group_container && !empty($groupIds[$page->group_container]) ? $page->group_container : '', $page->group_container_url_priority && !empty($groupIds[$page->group_container]) ? $page->group_container_url_priority : '', $page->canonical_parent, implode(',', $page->groupIds())]);
         }
     }
     // export menus
     fputcsv($menusCsv, ['Menu Identifier', 'Menu Name', 'Menu Max Sublevels']);
     $menuIds = [];
     $menuIdentifiers = [];
     $menus = Menu::all();
     foreach ($menus as $menu) {
         $menuIds[] = $menu->id;
         $menuIdentifiers[$menu->id] = $menu->name;
         fputcsv($menusCsv, [$menu->name, $menu->label, $menu->max_sublevel]);
     }
     fputcsv($menuItemsCsv, ['Menu Identifier', 'Item Page Id', 'Item Order', 'Item Sublevels', 'Item Custom Name']);
     $menuItems = MenuItem::whereIn('menu_id', $menuIds)->get()->all();
     usort($menuItems, function ($a, $b) {
         if ($a->menu_id == $b->menu_id) {
             if ($a->order == $b->order) {
                 return 0;
             }
             return $a->order < $b->order ? -1 : 1;
         }
         return $a->menu_id < $b->menu_id ? -1 : 1;
     });
     foreach ($menuItems as $menuItem) {
         fputcsv($menuItemsCsv, [$menuIdentifiers[$menuItem->menu_id], $menuItem->page_id, $menuItem->order, $menuItem->sub_levels, $menuItem->custom_name]);
     }
     // export page groups
     if (!$groups->isEmpty()) {
         $groupsCsv = fopen(base_path() . '/resources/views/themes/' . $theme->theme . '/export/pages/groups.csv', 'w');
         $groupAttributesCsv = fopen(base_path() . '/resources/views/themes/' . $theme->theme . '/export/pages/group_attributes.csv', 'w');
         fputcsv($groupsCsv, ['Group Id', 'Group Name', 'Group Item Name', 'Url Priority (Default: 50)', 'Default Template']);
         fputcsv($groupAttributesCsv, ['Attribute Id', 'Group Id', 'Block Name', 'Order Priority (0 for no ordering)', 'Order Dir (asc/desc)', 'Container Filter by Block Name']);
         $groupAttributesByGroupId = [];
         $groupAttributes = PageGroupAttribute::orderBy('group_id')->get();
         foreach ($groupAttributes as $groupAttribute) {
             if (!isset($groupAttributesByGroupId[$groupAttribute->group_id])) {
                 $groupAttributesByGroupId[$groupAttribute->group_id] = [];
             }
             $groupAttributesByGroupId[$groupAttribute->group_id][] = $groupAttribute;
         }
         foreach ($groups as $pageGroup) {
             fputcsv($groupsCsv, [$pageGroup->id, $pageGroup->name, $pageGroup->item_name, $pageGroup->url_priority, !empty($templatesById[$pageGroup->default_template]) ? $templatesById[$pageGroup->default_template] : '']);
             foreach ($groupAttributesByGroupId as $groupId => $attributes) {
                 foreach ($attributes as $attribute) {
                     fputcsv($groupAttributesCsv, [$attribute->id, $groupId, Block::preload($attribute->item_block_id)->name, $attribute->item_block_order_priority, $attribute->item_block_order_dir, $attribute->filter_by_block_id ?: '']);
                 }
             }
         }
         fclose($groupsCsv);
         fclose($groupAttributesCsv);
     }
     // export page block data
     fputcsv($pageBlocksCsv, ['Page Id', 'Block Name', 'Content']);
     $blocksById = [];
     $blocksByName = [];
     foreach (BlockUpdater::getDatabaseBlocks($theme->id) as $block) {
         $blocksById[$block->id] = $block;
         $blocksByName[$block->name] = $block;
     }
     $blockTemplatesById = [];
     $templateBlocks = TemplateBlock::whereIn('template_id', $templatesByName)->get();
     if (!$templateBlocks->isEmpty()) {
         foreach ($templateBlocks as $templateBlock) {
             if (!isset($blockTemplatesById[$templateBlock->template_id])) {
                 $blockTemplatesById[$templateBlock->template_id] = [];
             }
             $blockTemplatesById[$templateBlock->template_id][] = $templateBlock->block_id;
         }
     }
     $themeBlocks = ThemeBlock::where('theme_id', '=', $theme->id)->where('show_in_pages', '=', 1)->get();
     if (!$themeBlocks->isEmpty()) {
         foreach ($themeBlocks as $themeBlock) {
             $ignoreTemplates = explode(',', $themeBlock->exclude_templates);
             foreach ($templatesByName as $templateById) {
                 if (!in_array($templateById, $ignoreTemplates)) {
                     if (!isset($blockTemplatesById[$templateById])) {
                         $blockTemplatesById[$templateById] = [];
                     }
                     $blockTemplatesById[$templateById][] = $themeBlock->block_id;
                 }
             }
         }
     }
     $pageBlocks = collect(array_merge(Block::getDataForVersion(new PageBlock(), 0)->all(), Block::getDataForVersion(new PageBlockDefault(), 0)->all()));
     $repeaterBlocks = [];
     $pageBlockArr = [];
     foreach ($pageBlocks as $pageBlock) {
         $blockName = !empty($blocksById[$pageBlock->block_id]) ? $blocksById[$pageBlock->block_id]->name : null;
         if (!empty($blockName) && !empty($pageBlock->content)) {
             // don't add data for blocks that aren't set as template blocks even if data exists (sort of a cleanup on export)
             if (isset($pageBlock->page_id)) {
                 if (empty($pagesData[$pageBlock->page_id]->template) || empty($blockTemplatesById[$pagesData[$pageBlock->page_id]->template])) {
                     continue;
                 } elseif (!in_array($pageBlock->block_id, $blockTemplatesById[$pagesData[$pageBlock->page_id]->template])) {
                     continue;
                 }
             }
             if (strtolower($blocksById[$pageBlock->block_id]->type) == 'repeater') {
                 $repeaterBlocks[$pageBlock->content] = PageBlockRepeaterData::loadRepeaterData($pageBlock->content);
                 $repeaterBlockArr[] = $pageBlock->block_id;
             }
             $filesUsed = $blocksById[$pageBlock->block_id]->getTypeObject()->exportFiles($pageBlock->content);
             $allFilesUsed = array_merge($filesUsed, $allFilesUsed);
             $pageBlockArr[] = [isset($pageBlock->page_id) ? $pageBlock->page_id : 0, $blockName, $pageBlock->content];
         }
     }
     usort($pageBlockArr, function ($a, $b) {
         if ($a[0] == $b[0]) {
             return strcmp($a[1], $b[1]);
         }
         return $a[0] < $b[0] ? -1 : 1;
     });
     foreach ($pageBlockArr as $pageBlock) {
         fputcsv($pageBlocksCsv, $pageBlock);
     }
     fputcsv($repeaterBlocksCsv, ['Repeater Id', 'Repeater Row', 'Block Name', 'Content']);
     ksort($repeaterBlocks);
     foreach ($repeaterBlocks as $repeaterId => $repeaterRows) {
         foreach ($repeaterRows as $repeaterRowId => $repeaterBlocks) {
             foreach ($repeaterBlocks as $repeaterBlockId => $repeaterContent) {
                 $blockName = !empty($blocksById[$repeaterBlockId]) ? $blocksById[$repeaterBlockId]->name : null;
                 if (!empty($blockName) && $repeaterContent) {
                     $filesUsed = $blocksById[$repeaterBlockId]->getTypeObject()->exportFiles($repeaterContent);
                     $allFilesUsed = array_merge($filesUsed, $allFilesUsed);
                     fputcsv($repeaterBlocksCsv, [$repeaterId, $repeaterRowId, $blockName, $repeaterContent]);
                 }
             }
         }
     }
     // backup uploaded files
     $securePaths = [];
     $secureUploadPaths = explode(',', config('coaster::site.secure_folders'));
     foreach ($secureUploadPaths as $secureUploadPath) {
         $securePaths[] = '/uploads/' . trim($secureUploadPath, '/');
     }
     $allFilesUsed = array_unique($allFilesUsed);
     if (!empty($allFilesUsed)) {
         foreach ($allFilesUsed as $file) {
             $base_path = public_path();
             foreach ($securePaths as $securePath) {
                 if (strpos($file, $securePath) === 0) {
                     $base_path = storage_path();
                     break;
                 }
             }
             if (file_exists($base_path . $file)) {
                 self::$_uploadsToAdd[trim($file, '/')] = $base_path . $file;
             }
         }
     }
     fclose($menuItemsCsv);
     fclose($menusCsv);
     fclose($pagesCsv);
     fclose($pageBlocksCsv);
     fclose($repeaterBlocksCsv);
 }
Example #5
0
 /**
  * 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];
 }
Example #6
0
 /**
  * Repeater form submission
  * @param array $formData
  * @return null|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
  */
 public function submission($formData)
 {
     $formRules = BlockFormRule::get_rules($this->_block->name . '-form');
     $v = Validator::make($formData, $formRules);
     if ($v->passes()) {
         foreach ($formData as $blockName => $content) {
             $fieldBlock = Block::preload($blockName);
             if ($fieldBlock->exists) {
                 if ($fieldBlock->type == 'datetime' && empty($content)) {
                     $content = new Carbon();
                 }
                 $formData[$blockName] = $content;
             }
         }
         $this->insertRow($formData);
         Email::sendFromFormData([$this->_block->name . '-form'], $formData, config('coaster::site.name') . ': New Form Submission - ' . $this->_block->label);
         return \redirect(Request::url());
     } else {
         FormMessage::set($v->messages());
     }
     return null;
 }
 /**
  * @param string|array $blockName
  * @param string|array $search
  * @param array $options
  * @return string
  */
 public function filter($blockName, $search, $options = [])
 {
     $defaultOptions = ['match' => '=', 'fromPageIds' => [], 'operand' => 'AND', 'multiFilter' => false];
     $options = array_merge($defaultOptions, $options);
     $pageId = !empty($options['page_id']) ? $options['page_id'] : $this->pageId();
     $blockNames = $options['multiFilter'] ? $blockName : [$blockName];
     $searches = $options['multiFilter'] ? $search : [$search];
     $filteredPages = [];
     foreach ($blockNames as $k => $blockName) {
         $block = Block::preload($blockName);
         if ($block->exists) {
             $blockTypeObject = $block->getTypeObject();
             $searchValue = $searches[count($searches) > 1 ? $k : 0];
             $filteredPagesForBlock = [];
             $liveBlocks = PageBlock::livePageBlocksForBlock($block->id);
             foreach ($liveBlocks as $liveBlock) {
                 if (array_key_exists($liveBlock->page_id, $filteredPagesForBlock) || !empty($options['fromPageIds']) && !in_array($liveBlock->page_id, $options['fromPageIds'])) {
                     continue;
                 }
                 if ($blockTypeObject->filter($liveBlock->content, $searchValue, $options['match'])) {
                     $filteredPagesForBlock[$liveBlock->page_id] = Page::preload($liveBlock->page_id);
                 }
             }
             if ($options['operand'] == 'OR' || $k == 0) {
                 $filteredPages = array_merge($filteredPages, $filteredPagesForBlock);
             } else {
                 $filteredPages = array_intersect_key($filteredPages, $filteredPagesForBlock);
             }
         }
     }
     return $this->_renderCategory($pageId, $filteredPages, $options);
 }