/**
  * Pre-process the selectors to add Page status checks
  *
  */
 protected function setupStatusChecks(Selectors $selectors, $options = array())
 {
     $maxStatus = null;
     foreach ($selectors as $key => $selector) {
         if ($selector->field == 'status') {
             $value = $selector->value;
             if (!ctype_digit("{$value}")) {
                 // allow use of some predefined labels for Page statuses
                 if ($value == 'hidden') {
                     $selector->value = Page::statusHidden;
                 } else {
                     if ($value == 'unpublished') {
                         $selector->value = Page::statusUnpublished;
                     } else {
                         if ($value == 'locked') {
                             $selector->value = Page::statusLocked;
                         } else {
                             $selector->value = 1;
                         }
                     }
                 }
                 if ($selector->operator == '=') {
                     // there is no point in an equals operator here, so we make it a bitwise AND, for simplification
                     $selectors[$key] = new SelectorBitwiseAnd('status', $selector->value);
                 }
             }
             if (is_null($maxStatus) || $value > $maxStatus) {
                 $maxStatus = (int) $selector->value;
             }
         }
     }
     if (!is_null($maxStatus)) {
         // if a status was already present in the selector, then just make sure the page isn't unpublished
         if ($maxStatus < Page::statusUnpublished) {
             $selectors->add(new SelectorLessThan('status', Page::statusUnpublished));
         }
     } else {
         if ($options['findOne']) {
             // findOne option, apply optimizations enabling hidden pages to be loaded
             $selectors->add(new SelectorLessThan('status', Page::statusUnpublished));
         } else {
             // no status is present, so exclude everything hidden and above
             $selectors->add(new SelectorLessThan('status', Page::statusHidden));
         }
     }
     if ($options['findOne']) {
         $selectors->add(new SelectorEqual('start', 0));
         $selectors->add(new SelectorEqual('limit', 1));
     }
 }
Exemple #2
0
 /**
  * Pre-process the selectors to add Page status checks
  *
  */
 protected function setupStatusChecks(Selectors $selectors)
 {
     $maxStatus = null;
     $options = $this->options;
     foreach ($selectors as $key => $selector) {
         if ($selector->field == 'status') {
             $value = $selector->value;
             if (!ctype_digit("{$value}")) {
                 // allow use of some predefined labels for Page statuses
                 if ($value == 'hidden') {
                     $selector->value = Page::statusHidden;
                 } else {
                     if ($value == 'unpublished') {
                         $selector->value = Page::statusUnpublished;
                     } else {
                         if ($value == 'locked') {
                             $selector->value = Page::statusLocked;
                         } else {
                             if ($value == 'max') {
                                 $selector->value = Page::statusMax;
                             } else {
                                 $selector->value = 1;
                             }
                         }
                     }
                 }
                 if ($selector->operator == '=') {
                     // there is no point in an equals operator here, so we make it a bitwise AND, for simplification
                     $selectors[$key] = new SelectorBitwiseAnd('status', $selector->value);
                 }
             }
             if (is_null($maxStatus) || $value > $maxStatus) {
                 $maxStatus = (int) $selector->value;
             }
         } else {
             if ($selector->field == 'include' && $selector->operator == '=' && in_array($selector->value, array('hidden', 'all'))) {
                 if ($selector->value == 'hidden') {
                     $options['findHidden'] = true;
                 } else {
                     if ($selector->value == 'all') {
                         $options['findAll'] = true;
                     }
                 }
                 $selectors->remove($key);
             } else {
                 if ($selector->field == 'check_access' || $selector->field == 'checkAccess') {
                     $this->checkAccess = (int) $selector->value > 0 ? true : false;
                     $selectors->remove($key);
                 }
             }
         }
     }
     if (!is_null($maxStatus)) {
         // if a status was already present in the selector, then just make sure the page isn't unpublished
         if ($maxStatus < Page::statusUnpublished) {
             $selectors->add(new SelectorLessThan('status', Page::statusUnpublished));
         }
     } else {
         if ($options['findAll']) {
             // findAll option means that unpublished, hidden, trash, system may be included
             $selectors->add(new SelectorLessThan('status', Page::statusMax));
             $this->checkAccess = false;
         } else {
             if ($options['findOne'] || $options['findHidden']) {
                 // findHidden|findOne option, apply optimizations enabling hidden pages to be loaded
                 $selectors->add(new SelectorLessThan('status', Page::statusUnpublished));
             } else {
                 // no status is present, so exclude everything hidden and above
                 $selectors->add(new SelectorLessThan('status', Page::statusHidden));
             }
         }
     }
     if ($options['findOne']) {
         $selectors->add(new SelectorEqual('start', 0));
         $selectors->add(new SelectorEqual('limit', 1));
     }
 }
 /**
  * Pre-process the selectors to add Page status checks
  * 
  * @param Selectors $selectors
  * @param array $options
  *
  */
 protected function setupStatusChecks(Selectors $selectors, array &$options)
 {
     $maxStatus = null;
     $limit = 0;
     // for getTotal auto detection
     $start = 0;
     foreach ($selectors as $key => $selector) {
         $fieldName = $selector->field;
         if ($fieldName == 'status') {
             $value = $selector->value;
             if (!ctype_digit("{$value}")) {
                 // allow use of some predefined labels for Page statuses
                 if ($value == 'hidden') {
                     $selector->value = Page::statusHidden;
                 } else {
                     if ($value == 'unpublished') {
                         $selector->value = Page::statusUnpublished;
                     } else {
                         if ($value == 'locked') {
                             $selector->value = Page::statusLocked;
                         } else {
                             if ($value == 'trash') {
                                 $selector->value = Page::statusTrash;
                             } else {
                                 if ($value == 'max') {
                                     $selector->value = Page::statusMax;
                                 } else {
                                     $selector->value = 1;
                                 }
                             }
                         }
                     }
                 }
             }
             $not = false;
             if ($selector->operator == '!=' && !$selector->not || $selector->not && $selector->operator == '=') {
                 $s = new SelectorBitwiseAnd('status', $selector->value);
                 $s->not = true;
                 $not = true;
                 $selectors[$key] = $s;
             } else {
                 if ($selector->operator == '=' || $selector->operator == '!=' && $selector->not) {
                     $selectors[$key] = new SelectorBitwiseAnd('status', $selector->value);
                 } else {
                     $not = $selector->not;
                     // some other operator like: >, <, >=, <=
                 }
             }
             if (!$not && (is_null($maxStatus) || $selector->value > $maxStatus)) {
                 $maxStatus = (int) $selector->value;
             }
         } else {
             if ($fieldName == 'include' && $selector->operator == '=' && in_array($selector->value, array('hidden', 'all', 'unpublished', 'trash'))) {
                 if ($selector->value == 'hidden') {
                     $options['findHidden'] = true;
                 } else {
                     if ($selector->value == 'unpublished') {
                         $options['findUnpublished'] = true;
                     } else {
                         if ($selector->value == 'trash') {
                             $options['findTrash'] = true;
                         } else {
                             if ($selector->value == 'all') {
                                 $options['findAll'] = true;
                             }
                         }
                     }
                 }
                 $selectors->remove($key);
             } else {
                 if ($fieldName == 'check_access' || $fieldName == 'checkAccess') {
                     $this->checkAccess = (int) $selector->value > 0 ? true : false;
                     $selectors->remove($key);
                 } else {
                     if ($fieldName == 'limit') {
                         // for getTotal auto detect
                         $limit = (int) $selector->value;
                     } else {
                         if ($fieldName == 'start ') {
                             // for getTotal auto detect
                             $start = (int) $selector->value;
                         } else {
                             if ($fieldName == 'sort') {
                                 // sorting is not needed if we are only retrieving totals
                                 if ($options['loadPages'] === false) {
                                     $selectors->remove($selector);
                                 }
                             } else {
                                 if ($fieldName == 'getTotal' || $fieldName == 'get_total') {
                                     // whether to retrieve the total, and optionally what type: calc or count
                                     // this applies only if user hasn't themselves created a field called getTotal or get_total
                                     if (!$this->wire('fields')->get($fieldName)) {
                                         if (ctype_digit("{$selector->value}")) {
                                             $options['getTotal'] = (bool) $selector->value;
                                         } else {
                                             if (in_array($selector->value, array('calc', 'count'))) {
                                                 $options['getTotal'] = true;
                                                 $options['getTotalType'] = $selector->value;
                                             }
                                         }
                                         $selectors->remove($selector);
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     // foreach($selectors)
     if (!is_null($maxStatus) && empty($options['findAll']) && empty($options['findUnpublished'])) {
         // if a status was already present in the selector, without a findAll/findUnpublished, then just make sure the page isn't unpublished
         if ($maxStatus < Page::statusUnpublished) {
             $selectors->add(new SelectorLessThan('status', Page::statusUnpublished));
         }
     } else {
         if ($options['findAll']) {
             // findAll option means that unpublished, hidden, trash, system may be included
             // $selectors->add(new SelectorLessThan('status', Page::statusMax));
             $this->checkAccess = false;
         } else {
             if ($options['findOne'] || $options['findHidden']) {
                 // findHidden|findOne option, apply optimizations enabling hidden pages to be loaded
                 $selectors->add(new SelectorLessThan('status', Page::statusUnpublished));
             } else {
                 if ($options['findUnpublished']) {
                     $selectors->add(new SelectorLessThan('status', Page::statusTrash));
                 } else {
                     if ($options['findTrash']) {
                         $selectors->add(new SelectorLessThan('status', Page::statusDeleted));
                     } else {
                         // no status is present, so exclude everything hidden and above
                         $selectors->add(new SelectorLessThan('status', Page::statusHidden));
                     }
                 }
             }
         }
     }
     if ($options['findOne']) {
         // findOne option is never paginated, always starts at 0
         $selectors->add(new SelectorEqual('start', 0));
         $selectors->add(new SelectorEqual('limit', 1));
         // getTotal default is false when only finding 1 page
         if (is_null($options['getTotal'])) {
             $options['getTotal'] = false;
         }
     } else {
         if (!$limit && !$start) {
             // getTotal is not necessary since there is no limit specified (getTotal=same as count)
             if (is_null($options['getTotal'])) {
                 $options['getTotal'] = false;
             }
         } else {
             // get Total default is true when finding multiple pages
             if (is_null($options['getTotal'])) {
                 $options['getTotal'] = true;
             }
         }
     }
     $this->lastOptions = $options;
 }