예제 #1
0
 /**
  * Handle the event.
  *
  * @param  AuthRoute $event
  * @return void
  */
 public function handle(AuthRoute $event)
 {
     // specify page_id option for use in auth check
     switch ($event->controller) {
         case 'forms':
         case 'gallery':
         case 'pages':
             $event->returnOptions['page_id'] = isset($event->parameters['pageId']) ? $event->parameters['pageId'] : 0;
             // use parent page id when posting add page form
             if ($event->action == 'add') {
                 $event->returnOptions['page_id'] = Request::input('page_info.parent.select') ?: $event->returnOptions['page_id'];
                 if (isset($event->parameters['groupId'])) {
                     $pageGroup = PageGroup::preload($event->parameters['groupId']);
                     if (!$pageGroup->exists || !$pageGroup->canAddItems()) {
                         $event->override = false;
                     }
                 }
             }
             // let page sort function deal with permissions
             if ($event->action == 'sort') {
                 $event->override = true;
             }
             break;
         case 'groups':
             $page_group = PageGroup::preload(isset($event->parameters['groupId']) ? $event->parameters['groupId'] : 0);
             $event->override = $page_group->exists ? $page_group->canAddItems() : $event->override;
     }
 }
 public function postEdit($groupId)
 {
     $group = PageGroup::preload($groupId);
     if ($group->exists) {
         $groupInput = Request::input('group', []);
         foreach ($groupInput as $groupAttribute => $attributeValue) {
             if ($group->{$groupAttribute} !== null && $groupAttribute != 'id') {
                 if (is_array($attributeValue)) {
                     $attributeValue = isset($attributeValue['select']) ? $attributeValue['select'] : '';
                 }
                 $group->{$groupAttribute} = $attributeValue;
             }
         }
         $group->save();
         $currentAttributes = [];
         $newAttributes = [];
         foreach ($group->groupAttributes as $currentAttribute) {
             $currentAttributes[$currentAttribute->id] = $currentAttribute;
         }
         $groupPageAttributes = Request::input('groupAttribute', []);
         foreach ($groupPageAttributes as $attributeId => $groupPageAttribute) {
             if ($newAttribute = strpos($attributeId, 'new') === 0 ? new PageGroupAttribute() : (!empty($currentAttributes[$attributeId]) ? $currentAttributes[$attributeId] : null)) {
                 $newAttribute->group_id = $group->id;
                 $newAttribute->item_block_id = $groupPageAttribute['item_block_id'];
                 $newAttribute->item_block_order_priority = $groupPageAttribute['item_block_order_priority'];
                 $newAttribute->item_block_order_dir = $groupPageAttribute['item_block_order_dir'];
                 $newAttribute->save();
                 $newAttributes[$newAttribute->id] = $newAttribute;
             }
         }
         $deleteAttributeIds = array_diff(array_keys($currentAttributes), array_keys($newAttributes));
         PageGroupAttribute::whereIn('id', $deleteAttributeIds)->delete();
     }
     return redirect()->route('coaster.admin.groups.edit', ['groupId' => $groupId]);
 }
예제 #3
0
 /**
  * @param Page[] $pages
  * @param Path|null $parentPathData
  */
 protected static function _loadSubPaths($pages, $parentPathData = null)
 {
     foreach ($pages as $pageId => $pageData) {
         $pagePathData = self::_getById($pageId);
         $pagePathData->fullName = ($parentPathData ? $parentPathData->fullName . $pagePathData->separator : '') . $pagePathData->name;
         if ($pageData->link > 0) {
             $pagePathData->fullUrl = $pagePathData->url;
         } else {
             $pagePathData->fullUrl = ($parentPathData ? $parentPathData->fullUrl : '') . '/' . $pagePathData->url;
         }
         if ($childPages = Page::getChildPages($pageId)) {
             self::_loadSubPaths($childPages, $pagePathData);
         }
         if ($pageData->group_container > 0) {
             $group = PageGroup::preload($pageData->group_container);
             if ($group->exists) {
                 foreach ($group->itemPageFiltered($pageId) as $groupPage) {
                     $groupPagePathData = self::_getById($groupPage->id);
                     $groupPagePathData->groupContainers[$pageId] = ['name' => $pagePathData->fullName, 'url' => $pagePathData->fullUrl, 'priority' => $pageData->group_container_url_priority ?: $group->url_priority, 'canonical' => $groupPage->canonical_parent == $pageData->id];
                 }
             }
         }
     }
 }
예제 #4
0
 /**
  * @param string $path
  * @param Page $parentPage
  * @return Page|null
  */
 protected function _loadSubPage($path, Page $parentPage)
 {
     $paths = [$path];
     $page = self::_pageQuery($paths, $parentPage->id);
     if (!$page && $parentPage->group_container > 0) {
         $page = self::_pageQuery($paths, false, $parentPage->group_container);
         if ($page) {
             $group = PageGroup::preload($parentPage->group_container);
             $page = in_array($page->id, $group->itemPageIdsFiltered($parentPage->id)) ? $page : null;
         }
     }
     return $page;
 }
예제 #5
0
 /**
  * Saves page data
  * @param PageVersion $pageVersion
  * @param array $pagePost
  * @param array $pageLangPost
  * @param array $pageGroupsPost
  * @param array $pageInfoOther
  * @return bool
  */
 public function savePostData($pageVersion, $pagePost, $pageLangPost, $pageGroupsPost, $pageInfoOther = [])
 {
     /*
      * Post data fixes
      */
     foreach ($pagePost as $k => $pagePostField) {
         if (is_array($pagePostField) && array_key_exists('exists', $pagePostField)) {
             $pagePost[$k] = array_key_exists('select', $pagePostField) ? $pagePostField['select'] : 0;
         }
     }
     if (array_key_exists('live_start', $pagePost)) {
         $pagePost['live_start'] = DateTimeHelper::jQueryToMysql($pagePost['live_start']) ?: null;
     }
     if (array_key_exists('live_end', $pagePost)) {
         $pagePost['live_end'] = DateTimeHelper::jQueryToMysql($pagePost['live_end']) ?: null;
     }
     foreach ($pageInfoOther as $k => $pageInfoOtherField) {
         if (is_array($pageInfoOtherField) && array_key_exists('exists', $pageInfoOtherField) && array_key_exists('select', $pageInfoOtherField)) {
             $pageInfoOther[$k] = $pageInfoOtherField['select'];
         }
     }
     /*
      * Overwrite default/existing data with posted data
      */
     $pageDefaults = array_merge(['template' => 0, 'parent' => 0, 'child_template' => 0, 'order' => 0, 'group_container' => 0, 'group_container_url_priority' => 0, 'canonical_parent' => 0, 'link' => 0, 'live' => 0, 'sitemap' => 1, 'live_start' => null, 'live_end' => null], $this->getAttributes());
     foreach ($pageDefaults as $pageAttribute => $pageDefault) {
         $this->{$pageAttribute} = $pageDefault;
         switch ($pageAttribute) {
             case 'template':
                 $pageVersion->{$pageAttribute} = $pagePost[$pageAttribute];
                 break;
             default:
                 $this->{$pageAttribute} = array_key_exists($pageAttribute, $pagePost) ? $pagePost[$pageAttribute] : $this->{$pageAttribute};
         }
     }
     if (!$this->pageCurrentLang) {
         $this->setRelation('pageCurrentLang', ($d = $this->pageDefaultLang) ? $d->replicate() : new PageLang());
         unset($this->pageCurrentLang->language_id);
     }
     $pageLang = $this->pageLang();
     $pageLangDefaults = array_merge(['language_id' => Language::current(), 'url' => '', 'name' => '', 'live_version' => 1], $pageLang->getAttributes());
     foreach ($pageLangDefaults as $pageLangAttribute => $pageLangDefault) {
         $pageLang->{$pageLangAttribute} = array_key_exists($pageLangAttribute, $pageLangPost) ? $pageLangPost[$pageLangAttribute] : $pageLangDefault;
     }
     /*
      * Check page parent exists if set and page limit is not hit
      */
     $parent = static::find($this->parent);
     if ($this->parent > 0 && !$parent) {
         return false;
     }
     if (!$this->id && !$this->link && static::at_limit($this->parent == -1)) {
         return false;
     }
     /*
      * Check page name/url set and does not conflict
      */
     $pageLang->url = trim($pageLang->url);
     if (!$this->link) {
         $pageLang->url = strtolower(str_replace(['/', ' '], '-', $pageLang->url));
         if (preg_match('#^[-]+$#', $pageLang->url)) {
             $pageLang->url = '';
         }
         if ($pageLang->url == '' && !$this->parent) {
             $pageLang->url = '/';
         }
         $siblings = [];
         foreach ($pageGroupsPost as $pageGroupId => $checkedVal) {
             $pageGroup = PageGroup::preload($pageGroupId);
             $siblings = array_merge($pageGroup->exists ? $pageGroup->itemPageIds() : [], $siblings);
         }
         if ($this->parent >= 0) {
             $siblings = array_merge(static::getChildPageIds($this->parent), $siblings);
         }
         $siblings = array_unique($siblings);
     }
     if (!$pageLang->name) {
         FormMessage::add('page_info_lang[name]', 'page name required');
     }
     if (!$pageLang->url) {
         FormMessage::add('page_info_lang[url]', 'page url required');
     }
     if (!empty($siblings)) {
         $same_level = PageLang::where('url', '=', $pageLang->url)->whereIn('page_id', $siblings);
         $same_level = $this->id ? $same_level->where('page_id', '!=', $this->id) : $same_level;
         if (!$same_level->get()->isEmpty()) {
             FormMessage::add('page_info_lang[url]', 'url in use by another page!');
             $pageLang->url = '';
         }
     }
     if (!$pageLang->name || !$pageLang->url) {
         return false;
     }
     /*
      * If adding a page as a group container, create container / check exists
      */
     if ($this->group_container == -1) {
         $groupContainer = new PageGroup();
         $groupContainer->name = $pageLang->name;
         $groupContainer->item_name = 'Page';
         $groupContainer->default_template = 0;
         $groupContainer->save();
         $this->group_container = $groupContainer->id;
     } elseif ($this->group_container) {
         $groupContainer = PageGroup::preload($this->group_container);
         if (!$groupContainer->exists || $pageDefaults['group_container'] != $this->group_container && !$groupContainer->canEditItems()) {
             $this->group_container = 0;
         }
     }
     /*
      * Check if page info can be updated (based on publishing auth action, or allowed if new page)
      */
     $authPageIdCheck = $this->id ?: ($this->parent > 0 ? $this->parent : 0);
     $canPublish = config('coaster::admin.publishing') > 0 && Auth::action('pages.version-publish', ['page_id' => $authPageIdCheck]) || config('coaster::admin.publishing') == 0 && Auth::action('pages.edit', ['page_id' => $authPageIdCheck]);
     $canPublish = $canPublish || isset($groupContainer) && (config('coaster::admin.publishing') > 0 && $groupContainer->canPublishItems() || config('coaster::admin.publishing') == 0 && $groupContainer->canEditItems());
     $willPublish = !$this->id || $canPublish;
     /*
      * Check and save page changes
      */
     if ($willPublish) {
         // if new page set as last ordered page
         if ($this->parent >= 0 && !$this->id) {
             $lastSibling = static::where('parent', '=', $this->parent)->orderBy('order', 'desc')->first();
             $this->order = $lastSibling ? $lastSibling->order + 1 : 1;
         }
         // if new page publish template
         $this->template = $this->id ? $this->template : $pageVersion->template;
         // if link remove live template
         $this->template = $this->link ? 0 : $this->template;
         // set page live between but no dates set set as hidden, or if can't publish set as hidden
         $this->live = $this->live == 2 && is_null($this->live_end) && is_null($this->live_start) ? 0 : $this->live;
         $this->live = $canPublish ? $this->live : 0;
         // save page data
         $this->save();
         $pageLang->page_id = $this->id;
         $pageLang->save();
     }
     $pageVersion->page_id = $this->id;
     $pageVersion->save();
     /*
      * Update title block to the page name is new page
      */
     if (!$this->id && ($titleBlock = Block::where('name', '=', config('coaster::admin.title_block'))->first())) {
         $titleBlock->setVersionId($pageVersion->version_id)->setPageId($this->id)->getTypeObject()->save($pageLang->name);
         PageSearchData::updateText(strip_tags($pageLang->name), 0, $this->id);
     }
     /*
      * Save Page Groups
      */
     $currentGroupIds = $this->groupIds();
     $newGroupIds = array_keys($pageGroupsPost);
     PageGroupPage::where('page_id', '=', $this->id)->whereIn('group_id', array_diff($currentGroupIds, $newGroupIds))->delete();
     foreach (array_diff($newGroupIds, $currentGroupIds) as $addGroupId) {
         $this->groups()->attach($addGroupId);
     }
     /*
      * Save other page info
      */
     if ($willPublish && Auth::action('menus')) {
         MenuItem::set_page_menus($this->id, array_key_exists('menus', $pageInfoOther) ? $pageInfoOther['menus'] : []);
     }
     if ($canPublish && array_key_exists('beacons', $pageInfoOther) && Auth::action('themes.beacons-update')) {
         BlockBeacon::updatePage($this->id, $pageInfoOther['beacons']);
     }
     return true;
 }