Esempio n. 1
0
 /**
  * this builds an array containing the filters value and condition
  * If no date time option, then we change the filter into a ranged filter to search
  * the whole day for records.
  * @param	string	initial $value all filters should submit as sql format
  * @param	string	intial $condition
  * @param	string	eval - how the value should be handled
  * @return	array	(value condition) values in sql format
  */
 function getFilterValue($value, $condition, $eval)
 {
     // if its a search all value it may not be a date - so use parent method.
     // see http://fabrikar.com/forums/showthread.php?t=25255
     if (!FabrikWorker::isDate($value)) {
         if ($this->rangeFilterSet) {
             // its alreay been set as a range expression - so split that into an array
             $condition = 'between';
             $value = explode(' AND ', $value);
             foreach ($value as &$v) {
                 $v = str_replace(array("'", '"'), '', $v);
             }
         }
         return parent::getFilterValue($value, $condition, FABRIKFILTER_QUERY);
     }
     $params = $this->getParams();
     $store_as_local = (int) $params->get('date_store_as_local', 0);
     if (!$params->get('date_showtime', 0) || $store_as_local) {
         $this->_resetToGMT = false;
     }
     $exactTime = $this->formatContainsTime($params->get('date_table_format'));
     // $$$ rob if filtering in querystring and ranged value set then force filter type to range
     $filterType = is_array($value) ? 'range' : $this->getElement()->filter_type;
     switch ($filterType) {
         case 'range':
             // ranged dates should be sent in sql format
             break;
         case 'field':
         case 'dropdown':
         case 'auto-complete':
         default:
             //odity when filtering from qs
             $value = str_replace("'", '', $value);
             // parse through JDate, to allow for special filters such as 'now' 'tomorrow' etc
             // for searches on simply the year - JDate will presume its a timestamp and mung the results
             // so we have to use this specific format string to get now and next
             if (is_numeric($value) && strlen($value) == 4) {
                 // will only work on php 5.3.6
                 $value = JFactory::getDate('first day of January ' . $value)->toSql();
                 $next = JFactory::getDate('first day of January ' . ($value + 1));
             } elseif ($this->isMonth($value)) {
                 $value = JFactory::getDate('first day of ' . $this->untranslateMonth($value))->toSql();
                 $next = JFactory::getDate('last day of ' . $this->untranslateMonth($value))->setTime(23, 59, 59);
             } else {
                 $value = JFactory::getDate($value)->toSql();
                 $next = JFactory::getDate(strtotime($this->addDays($value, 1)) - 1);
             }
             // only set to a range if condition is matching (so dont set to range for < or > conditions)
             if ($condition == 'contains' || $condition == '=' || $condition == 'REGEXP') {
                 if (!$params->get('date_showtime', 0) || $exactTime == false) {
                     //$$$ rob turn into a ranged filter to search the entire day
                     // values should be in sql format
                     $value = (array) $value;
                     $condition = 'BETWEEN';
                     $value[1] = $next->toSql();
                     // set a flat to stop getRangedFilterValue from adding an additional day to end value
                     $this->rangeFilterSet = true;
                 }
             }
             break;
     }
     $this->_resetToGMT = true;
     $value = parent::getFilterValue($value, $condition, $eval);
     return $value;
 }
Esempio n. 2
0
 /**
  * this builds an array containing the filters value and condition
  * If no date time option, then we change the filter into a ranged filter to search
  * the whole day for records.
  * @param string initial $value
  * @param string intial $condition
  * @param string eval - how the value should be handled
  * @return array (value condition) values should be in mySQL format
  */
 function getFilterValue($value, $condition, $eval)
 {
     $params =& $this->getParams();
     $store_as_local = (int) $params->get('date_store_as_local', 0);
     if (!$params->get('date_showtime', 0) || $store_as_local) {
         $this->_resetToGMT = false;
     }
     $exactTime = $this->formatContainsTime($params->get('date_table_format'));
     $filterType =& $this->getElement()->filter_type;
     switch ($filterType) {
         case 'field':
         case 'dropdown':
             $mysql = $this->tableDateToMySQL($value);
             if ($mysql !== false) {
                 $value = $mysql;
             }
             if (!$params->get('date_showtime', 0) || $exactTime == false) {
                 //$$$ rob turn into a ranged filter to search the entire day
                 $value = (array) $value;
                 $condition = 'BETWEEN';
                 $value[1] = date("Y-m-d H:i:s", strtotime($this->addDays($value[0], 1)) - 1);
             }
             break;
         case 'ranged':
             $value = (array) $value;
             foreach ($value as &$v) {
                 $mysql = $this->tableDateToMySQL($v);
                 if ($mysql !== false) {
                     $v = $mysql;
                 }
             }
             break;
     }
     $this->_resetToGMT = true;
     return parent::getFilterValue($value, $condition, $eval);
 }
Esempio n. 3
0
 /**
  * Builds an array containing the filters value and condition
  *
  * @param   string  $value      initial value
  * @param   string  $condition  intial $condition
  * @param   string  $eval       how the value should be handled
  *
  * @return  array	(value condition)
  */
 public function getFilterValue($value, $condition, $eval)
 {
     /* if its a search all value it may not be a date - so use parent method.
      * see http://fabrikar.com/forums/showthread.php?t=25255
      */
     if (!FabrikWorker::isDate($value)) {
         if ($this->rangeFilterSet) {
             // Its alreay been set as a range expression - so split that into an array
             $condition = 'between';
             $value = explode(' AND ', $value);
             foreach ($value as &$v) {
                 $v = str_replace(array("'", '"'), '', $v);
             }
         }
         return parent::getFilterValue($value, $condition, FABRIKFILTER_QUERY);
     }
     $params = $this->getParams();
     $store_as_local = (int) $params->get('date_store_as_local', 0);
     if (!$params->get('date_showtime', 0) || $store_as_local) {
         $this->resetToGMT = false;
     }
     $exactTime = $this->formatContainsTime($params->get('date_table_format'));
     // $$$ rob if filtering in querystring and ranged value set then force filter type to range
     $filterType = is_array($value) ? 'range' : $this->getElement()->filter_type;
     switch ($filterType) {
         case 'range':
             // Ranged dates should be sent in sql format
             break;
         case 'field':
         case 'dropdown':
         case 'auto-complete':
         default:
             // Odity when filtering from qs
             $value = str_replace("'", '', $value);
             /**
              *  parse through JDate, to allow for special filters such as 'now' 'tomorrow' etc
              *  for searches on simply the year - JDate will presume its a timestamp and mung the results
              *  so we have to use this specific format string to get now and next
              */
             if (is_numeric($value) && JString::strlen($value) == 4) {
                 // Will only work on php 5.3.6
                 $value = JFactory::getDate('first day of January ' . $value)->toSql();
                 $next = JFactory::getDate('first day of January ' . ($value + 1));
             } elseif ($this->isMonth($value)) {
                 $value = JFactory::getDate('first day of ' . $this->untranslateMonth($value))->toSql();
                 $next = JFactory::getDate('last day of ' . $this->untranslateMonth($value))->setTime(23, 59, 59);
             } elseif (trim(JString::strtolower($value)) === 'last week') {
                 $value = JFactory::getDate('last week')->toSql();
                 $next = JFactory::getDate();
             } elseif (trim(JString::strtolower($value)) === 'last month') {
                 $value = JFactory::getDate('last month')->toSql();
                 $next = JFactory::getDate();
             } elseif (trim(JString::strtolower($value)) === 'last year') {
                 $value = JFactory::getDate('last year')->toSql();
                 $next = JFactory::getDate();
             } elseif (trim(JString::strtolower($value)) === 'next week') {
                 $value = JFactory::getDate()->toSql();
                 $next = JFactory::getDate('next week');
             } elseif (trim(JString::strtolower($value)) === 'next month') {
                 $value = JFactory::getDate()->toSql();
                 $next = JFactory::getDate('next month');
             } elseif (trim(JString::strtolower($value)) === 'next year') {
                 $value = JFactory::getDate()->toSql();
                 $next = JFactory::getDate('next year');
             } else {
                 $value = JFactory::getDate($value)->toSql();
                 /**
                  *  $$$ hugh - strip time if not needed.  Specific case is element filter,
                  *  first time submitting filter from list, will have arbitrary "now" time.
                  *  Dunno if this will break anything else!
                  */
                 if (!$exactTime) {
                     $value = $this->setMySQLTimeToZero($value);
                 }
                 $next = JFactory::getDate(strtotime($this->addDays($value, 1)) - 1);
                 /**
                  *  $$$ now we need to reset $value to GMT.
                  *  Probably need to take $store_as_local into account here?
                  */
                 $this->resetToGMT = true;
                 $value = $this->toMySQLGMT(JFactory::getDate($value));
                 $this->resetToGMT = false;
             }
             // Only set to a range if condition is matching (so dont set to range for < or > conditions)
             if ($condition == 'contains' || $condition == '=' || $condition == 'REGEXP') {
                 if (!$params->get('date_showtime', 0) || $exactTime == false) {
                     // $$$ rob turn into a ranged filter to search the entire day  values should be in sql format
                     $value = (array) $value;
                     $condition = 'BETWEEN';
                     $value[1] = $next->toSql();
                     // Set a flat to stop getRangedFilterValue from adding an additional day to end value
                     $this->rangeFilterSet = true;
                 }
             } elseif ($condition == 'is null') {
                 $value = "";
             }
             break;
     }
     $this->resetToGMT = true;
     $value = parent::getFilterValue($value, $condition, $eval);
     return $value;
 }