/**
  * This function iterates over `dsParamFILTERS` and builds the relevant
  * `$where` and `$joins` parameters with SQL. This SQL is generated from
  * `Field->buildDSRetrievalSQL`. A third parameter, `$group` is populated
  * with boolean from `Field->requiresSQLGrouping()`
  *
  * @param string $where
  * @param string $joins
  * @param boolean $group
  */
 public function processFilters(&$where, &$joins, &$group)
 {
     if (!is_array($this->dsParamFILTERS) || empty($this->dsParamFILTERS)) {
         return;
     }
     $pool = FieldManager::fetch(array_keys($this->dsParamFILTERS));
     self::$_fieldPool += $pool;
     foreach ($this->dsParamFILTERS as $field_id => $filter) {
         if (is_array($filter) && empty($filter) || trim($filter) == '') {
             continue;
         }
         if (!is_array($filter)) {
             $filter_type = $this->__determineFilterType($filter);
             $value = preg_split('/' . ($filter_type == DS_FILTER_AND ? '\\+' : '(?<!\\\\),') . '\\s*/', $filter, -1, PREG_SPLIT_NO_EMPTY);
             $value = array_map('trim', $value);
             $value = array_map(array('Datasource', 'removeEscapedCommas'), $value);
         } else {
             $value = $filter;
         }
         if ($field_id != 'id' && $field_id != 'system:date' && !self::$_fieldPool[$field_id] instanceof Field) {
             throw new Exception(__('Error creating field object with id %1$d, for filtering in data source %2$s. Check this field exists.', array($field_id, '<code>' . $this->dsParamROOTELEMENT . '</code>')));
         }
         if ($field_id == 'id') {
             $c = 'IN';
             if (stripos($value[0], 'not:') === 0) {
                 $value[0] = preg_replace('/^not:\\s*/', null, $value[0]);
                 $c = 'NOT IN';
             }
             $where = " AND `e`.id " . $c . " ('" . implode("', '", $value) . "') ";
         } else {
             if ($field_id == 'system:date') {
                 require_once TOOLKIT . '/fields/field.date.php';
                 $date = new fieldDate();
                 $date->buildDSRetrievalSQL($value, $joins, $where, $filter_type == DS_FILTER_AND ? true : false);
                 $where = preg_replace('/`t\\d+`.value/', '`e`.creation_date', $where);
             } else {
                 // For deprecated reasons, call the old, typo'd function name until the switch to the
                 // properly named buildDSRetrievalSQL function.
                 if (!self::$_fieldPool[$field_id]->buildDSRetrivalSQL($value, $joins, $where, $filter_type == DS_FILTER_AND ? true : false)) {
                     $this->_force_empty_result = true;
                     return;
                 }
                 if (!$group) {
                     $group = self::$_fieldPool[$field_id]->requiresSQLGrouping();
                 }
             }
         }
     }
 }
     $value = array_map(array('Datasource', 'removeEscapedCommas'), $value);
 } else {
     $value = $filter;
 }
 if (!isset($fieldPool[$field_id]) || !is_object($fieldPool[$field_id])) {
     $fieldPool[$field_id] =& $entryManager->fieldManager->fetch($field_id);
 }
 if ($field_id != 'id' && $field_id != 'system:date' && !$fieldPool[$field_id] instanceof Field) {
     throw new Exception(__('Error creating field object with id %1$d, for filtering in data source "%2$s". Check this field exists.', array($field_id, $this->dsParamROOTELEMENT)));
 }
 if ($field_id == 'id') {
     $where = " AND `e`.id IN ('" . implode("', '", $value) . "') ";
 } else {
     if ($field_id == 'system:date') {
         require_once TOOLKIT . '/fields/field.date.php';
         $date = new fieldDate(Frontend::instance());
         // Create an empty string, we don't care about the Joins, we just want the WHERE clause.
         $empty = "";
         $date->buildDSRetrievalSQL($value, $empty, $where, $filter_type == DS_FILTER_AND ? true : false);
         $where = preg_replace('/`t\\d+`.value/', '`e`.creation_date', $where);
     } else {
         // For deprecated reasons, call the old, typo'd function name until the switch to the
         // properly named buildDSRetrievalSQL function.
         if (!$fieldPool[$field_id]->buildDSRetrivalSQL($value, $joins, $where, $filter_type == DS_FILTER_AND ? true : false)) {
             $this->_force_empty_result = true;
             return;
         }
         if (!$group) {
             $group = $fieldPool[$field_id]->requiresSQLGrouping();
         }
     }
 /**
  * This function iterates over `dsParamFILTERS` and builds the relevant
  * `$where` and `$joins` parameters with SQL. This SQL is generated from
  * `Field->buildDSRetrievalSQL`. A third parameter, `$group` is populated
  * with boolean from `Field->requiresSQLGrouping()`
  *
  * @param string $where
  * @param string $joins
  * @param boolean $group
  */
 public function processFilters(&$where, &$joins, &$group)
 {
     if (!is_array($this->dsParamFILTERS) || empty($this->dsParamFILTERS)) {
         return;
     }
     $pool = FieldManager::fetch(array_filter(array_keys($this->dsParamFILTERS), 'is_int'));
     self::$_fieldPool += $pool;
     if (!is_string($where)) {
         $where = '';
     }
     foreach ($this->dsParamFILTERS as $field_id => $filter) {
         if (is_array($filter) && empty($filter) || trim($filter) == '') {
             continue;
         }
         if (!is_array($filter)) {
             $filter_type = $this->__determineFilterType($filter);
             $value = preg_split('/' . ($filter_type == DataSource::FILTER_AND ? '\\+' : '(?<!\\\\),') . '\\s*/', $filter, -1, PREG_SPLIT_NO_EMPTY);
             $value = array_map('trim', $value);
             $value = array_map(array('Datasource', 'removeEscapedCommas'), $value);
         } else {
             $value = $filter;
         }
         if (!in_array($field_id, self::$_system_parameters) && $field_id != 'id' && !self::$_fieldPool[$field_id] instanceof Field) {
             throw new Exception(__('Error creating field object with id %1$d, for filtering in data source %2$s. Check this field exists.', array($field_id, '<code>' . $this->dsParamROOTELEMENT . '</code>')));
         }
         // Support system:id as well as the old 'id'. #1691
         if ($field_id === 'system:id' || $field_id === 'id') {
             $c = 'IN';
             if (stripos($value[0], 'not:') === 0) {
                 $value[0] = preg_replace('/^not:\\s*/', null, $value[0]);
                 $c = 'NOT IN';
             }
             // Cast all ID's to integers.
             $value = array_map(create_function('$x', 'return (int)$x;'), $value);
             $count = array_sum($value);
             $value = array_filter($value);
             // If the ID was cast to 0, then we need to filter on 'id' = 0,
             // which will of course return no results, but without it the
             // Datasource will return ALL results, which is not the
             // desired behaviour. RE: #1619
             if ($count === 0) {
                 $value[] = '0';
             }
             // If there are no ID's, no need to filter. RE: #1567
             if (!empty($value)) {
                 $where .= " AND `e`.id " . $c . " (" . implode(", ", $value) . ") ";
             }
         } else {
             if ($field_id === 'system:creation-date' || $field_id === 'system:modification-date' || $field_id === 'system:date') {
                 require_once TOOLKIT . '/fields/field.date.php';
                 $date_joins = '';
                 $date_where = '';
                 $date = new fieldDate();
                 $date->buildDSRetrievalSQL($value, $date_joins, $date_where, $filter_type == DataSource::FILTER_AND ? true : false);
                 // Replace the date field where with the `creation_date` or `modification_date`.
                 $date_where = preg_replace('/`t\\d+`.date/', $field_id !== 'system:modification-date' ? '`e`.creation_date_gmt' : '`e`.modification_date_gmt', $date_where);
                 $where .= $date_where;
             } else {
                 // For deprecated reasons, call the old, typo'd function name until the switch to the
                 // properly named buildDSRetrievalSQL function.
                 if (!self::$_fieldPool[$field_id]->buildDSRetrivalSQL($value, $joins, $where, $filter_type == DataSource::FILTER_AND ? true : false)) {
                     $this->_force_empty_result = true;
                     return;
                 }
                 if (!$group) {
                     $group = self::$_fieldPool[$field_id]->requiresSQLGrouping();
                 }
             }
         }
     }
 }
 /**
  * Get where and join information to build a query.
  *
  * The information returned by this function can be used in the
  * fetch() methods of the EntryManager class. If you only need
  * to fetch data the getSlice function is recommended.
  *
  * @return array
  */
 public function getWhereJoinsAndGroup($count_only = false)
 {
     $where = NULL;
     $joins = NULL;
     if (is_array($this->dsParamFILTERS) && !empty($this->dsParamFILTERS)) {
         foreach ($this->dsParamFILTERS as $field_id => $filter) {
             if (is_array($filter) && empty($filter) || trim($filter) == '') {
                 continue;
             }
             if (!is_array($filter)) {
                 $filter_type = $this->__determineFilterType($filter);
                 $value = preg_split('/' . ($filter_type == DS_FILTER_AND ? '\\+' : '(?<!\\\\),') . '\\s*/', $filter, -1, PREG_SPLIT_NO_EMPTY);
                 $value = array_map('trim', $value);
                 $value = array_map(array('Datasource', 'removeEscapedCommas'), $value);
             } else {
                 $value = $filter;
             }
             if (!isset($fieldPool[$field_id]) || !is_object($fieldPool[$field_id])) {
                 $fieldPool[$field_id] =& FieldManager::fetch($field_id);
             }
             if ($field_id != 'id' && $field_id != 'system:date' && !$fieldPool[$field_id] instanceof Field) {
                 throw new Exception(__('Error creating field object with id %1$d, for filtering in data source "%2$s". Check this field exists.', array($field_id, $this->dsParamROOTELEMENT)));
             }
             if ($field_id == 'id') {
                 $where = " AND `e`.id IN ('" . implode("', '", $value) . "') ";
             } elseif ($field_id == 'system:date') {
                 $date = new fieldDate(Frontend::instance());
                 // Create an empty string, we don't care about the Joins, we just want the WHERE clause.
                 $empty = "";
                 $date->buildDSRetrievalSQL($value, $empty, $where, $filter_type == DS_FILTER_AND ? true : false);
                 $where = preg_replace('/`t\\d+`.value/', '`e`.creation_date', $where);
             } else {
                 if (!$fieldPool[$field_id]->buildDSRetrievalSQL($value, $joins, $where, $filter_type == DS_FILTER_AND ? true : false)) {
                     $this->_force_empty_result = true;
                     return;
                 }
                 if (!$group) {
                     $group = $fieldPool[$field_id]->requiresSQLGrouping();
                 }
             }
         }
     }
     $where .= ' AND `d`.`value` IS NOT NULL';
     $joins .= ' LEFT JOIN tbl_entries_data_' . FieldManager::fetchFieldIDFromElementName($this->emailField, $this->getSource()) . ' AS `d` ON `e`.`id` = `d`.`entry_id`';
     if ($this->newsletter_id !== NULL) {
         $joins .= ' LEFT OUTER JOIN tbl_tmp_email_newsletters_sent_' . $this->newsletter_id . ' AS `n` ON `d`.`value` = `n`.`email`';
         $where .= ' AND `n`.`email` IS NULL GROUP BY `d`.`value`';
     } elseif ($count_only != true) {
         $where .= ' GROUP BY `d`.`value`';
     }
     return array('where' => $where, 'joins' => $joins);
 }
Exemple #5
0
 /**
  * Convert string to Datetime object. Log error, if given date is invalid.
  *
  * @param string $string
  *  String to be converted to Datetime object
  * @return Datetime
  *	Returns a Datetime object on success or `NULL` on failure
  */
 private function __getDate($string)
 {
     // Get date and time object
     try {
         $date = new DateTime(fieldDate::cleanFilterString(Lang::standardizeDate($string)));
     } catch (Exception $e) {
         Symphony::$Log->pushToLog('Date and Time could not parse the following date: ' . trim($string) . '. It will be ignored for data source filtering.', E_ERROR, true);
         $date = NULL;
     }
     return $date;
 }
 public function prepareReadableValue($data, $entry_id = null, $truncate = false, $defaultValue = null)
 {
     $defaultValue = __('No Date');
     return parent::prepareReadableValue($data, $entry_id, $truncate, $defaultValue);
 }