Exemplo n.º 1
0
 /**
  * Get the list filter for the element
  * Note: uses FabDate as if date element first to be found in advanced search, and advanced search run on another element
  * the list model in getAdvancedSearchElementList() builds the first filter (this element) with the data from the first search
  * which was throwing '"500 - DateTime::__construct() ' errors
  *
  * see: http://fabrikar.com/forums/showthread.php?t=28231
  *
  * @param   int   $counter  Filter order
  * @param   bool  $normal   Do we render as a normal filter or as an advanced search filter
  * if normal include the hidden fields as well (default true, use false for advanced filter rendering)
  *
  * @return  string	filter html
  */
 public function getFilter($counter = 0, $normal = true)
 {
     $params = $this->getParams();
     $listModel = $this->getListModel();
     $table = $listModel->getTable();
     $element = $this->getElement();
     $origTable = $table->db_table_name;
     $fabrikDb = $listModel->getDb();
     $elName = $this->getFullName(true, false);
     $elName2 = $this->getFullName(false, false);
     $v = $this->filterName($counter, $normal);
     $class = $this->filterClass();
     // Correct default got
     $default = $this->getDefaultFilterVal($normal, $counter);
     $format = $params->get('date_table_format', 'Y-m-d');
     $fromTable = $origTable;
     // $$$ hugh - in advanced search, _aJoins wasn't getting set
     $joins = $listModel->getJoins();
     foreach ($joins as $aJoin) {
         // Not sure why the group id key wasn't found - but put here to remove error
         if (array_key_exists('group_id', $aJoin)) {
             if ($aJoin->group_id == $element->group_id && $aJoin->element_id == 0) {
                 $fromTable = $aJoin->table_join;
                 $elName = str_replace($origTable . '.', $fromTable . '.', $elName);
             }
         }
     }
     $where = $listModel->buildQueryPrefilterWhere($this);
     $elName = FabrikString::safeColName($elName);
     $requestName = $elName . '___filter';
     if (array_key_exists($elName, $_REQUEST)) {
         if (is_array($_REQUEST[$elName]) && array_key_exists('value', $_REQUEST[$elName])) {
             $_REQUEST[$requestName] = $_REQUEST[$elName]['value'];
         }
     }
     $htmlid = $this->getHTMLId();
     $fType = $this->getFilterType();
     $timeZone = new DateTimeZone(JFactory::getConfig()->get('offset'));
     if (in_array($fType, array('dropdown', 'checkbox', 'multiselect'))) {
         $rows = $this->filterValueList($normal);
     }
     $calOpts = $this->filterCalendarOpts();
     $return = array();
     switch ($fType) {
         case 'checkbox':
             $return[] = $this->checkboxFilter($rows, $default, $v);
             break;
         case 'range':
         case 'range-hidden':
             FabrikHelperHTML::loadcalendar();
             if (empty($default)) {
                 $default = array('', '');
             } else {
                 $d = new FabDate($default[0]);
                 $default[0] = $d->format($format);
                 $d = new FabDate($default[1]);
                 $default[1] = $d->format($format);
             }
             // Add wrapper div for list filter toggling
             $return[] = '<div class="fabrik_filter_container">';
             if ($fType === 'range-hidden') {
                 $return[] = '<input type="hidden" name="' . $v . '[0]' . '" class="' . $class . '" value="' . $default[0] . '" id="' . $htmlid . '-0" />';
                 $return[] = '<input type="hidden" name="' . $v . '[1]' . '" class="' . $class . '" value="' . $default[1] . '" id="' . $htmlid . '-1" />';
                 $return[] = '</div>';
             } else {
                 $return[] = JText::_('COM_FABRIK_DATE_RANGE_BETWEEN') . $this->calendar($default[0], $v . '[0]', $this->getFilterHtmlId(0), $format, $calOpts);
                 $return[] = '<br />' . JText::_('COM_FABRIK_DATE_RANGE_AND') . $this->calendar($default[1], $v . '[1]', $this->getFilterHtmlId(1), $format, $calOpts);
                 $return[] = '</div>';
             }
             break;
         case 'dropdown':
         case 'multiselect':
             /**
              *  cant do the format in the MySQL query as its not the same formatting
              *  e.g. M in MySQL is month and J's date code its minute
              */
             $max = count($rows) < 7 ? count($rows) : 7;
             $size = $element->filter_type === 'multiselect' ? 'multiple="multiple" size="' . $max . '"' : 'size="1"';
             $v = $fType === 'multiselect' ? $v . '[]' : $v;
             jimport('joomla.utilities.date');
             $ddData = array();
             foreach ($rows as $k => $o) {
                 if ($fabrikDb->getNullDate() === $o->text) {
                     $o->text = '';
                     $o->value = '';
                 } else {
                     $d = new FabDate($o->text);
                     $d->setTimeZone($timeZone);
                     $o->value = $d->toSql(true);
                     $o->text = $d->format($format, true);
                 }
                 if (!array_key_exists($o->value, $ddData)) {
                     $ddData[$o->value] = $o;
                 }
             }
             array_unshift($ddData, JHTML::_('select.option', '', $this->filterSelectLabel()));
             $return[] = JHTML::_('select.genericlist', $ddData, $v, 'class="' . $class . '" ' . $size . ' maxlength="19"', 'value', 'text', $default, $htmlid . '0');
             break;
         default:
         case 'field':
             FabrikHelperHTML::loadcalendar();
             if (is_array($default)) {
                 $default = array_shift($default);
             }
             if ($default !== '') {
                 $d = new FabDate($default);
                 $default = $d->format($format);
             }
             // Add wrapper div for list filter toggling
             $return[] = '<div class="fabrik_filter_container">';
             $return[] = $this->calendar($default, $v, $this->getFilterHtmlId(0), $format, $calOpts);
             $return[] = '</div>';
             break;
         case 'hidden':
             if (is_array($default)) {
                 $default = array_shift($default);
             }
             if (get_magic_quotes_gpc()) {
                 $default = stripslashes($default);
             }
             $default = htmlspecialchars($default);
             // Don't add id as caused issues with inline edit plugin and clashing ids.
             $return[] = '<input type="hidden" name="' . $v . '" class="' . $class . '" value="' . $default . '" />';
             break;
         case 'auto-complete':
             if (get_magic_quotes_gpc()) {
                 $default = stripslashes($default);
             }
             $default = htmlspecialchars($default);
             $return[] = '<input type="hidden" name="' . $v . '" class="' . $class . '" value="' . $default . '" id="' . $htmlid . '" />';
             $return[] = '<input type="text" name="' . $v . '-auto-complete" class="' . $class . ' autocomplete-trigger" value="' . $default . '" id="' . $htmlid . '-auto-complete" />';
             $autoId = '#' . $htmlid . '-auto-complete';
             if (!$normal) {
                 $autoId = '.advanced-search-list .autocomplete-trigger';
             }
             FabrikHelperHTML::autoComplete($autoId, $this->getElement()->id, $this->getFormModel()->getId(), 'date');
             break;
     }
     if ($normal) {
         $return[] = $this->getFilterHiddenFields($counter, $elName);
     } else {
         $return[] = $this->getAdvancedFilterHiddenFields();
     }
     return implode("\n", $return);
 }
Exemplo n.º 2
0
 /**
  * @param $rows
  * @param $default
  * @param $v
  *
  * @return string filter
  */
 protected function selectListFilter($rows, $default, $v)
 {
     $element = $this->getElement();
     $listModel = $this->getListModel();
     $fabrikDb = $listModel->getDb();
     $timeZone = new DateTimeZone($this->config->get('offset'));
     $params = $this->getParams();
     $format = $params->get('date_table_format', 'Y-m-d');
     /**
      *  cant do the format in the MySQL query as its not the same formatting
      *  e.g. M in MySQL is month and J's date code its minute
      */
     $max = count($rows) < 7 ? count($rows) : 7;
     $fType = $this->getFilterType();
     $size = $element->filter_type === 'multiselect' ? 'multiple="multiple" size="' . $max . '"' : 'size="1"';
     $v = $fType === 'multiselect' ? $v . '[]' : $v;
     jimport('joomla.utilities.date');
     $ddData = array();
     foreach ($rows as $k => $o) {
         if ($fabrikDb->getNullDate() === $o->text) {
             $o->text = '';
             $o->value = '';
         } else {
             $d = new FabDate($o->text);
             $d->setTimeZone($timeZone);
             $o->value = $d->toSql(true);
             $o->text = $d->format($format, true);
         }
         if (!array_key_exists($o->value, $ddData)) {
             $ddData[$o->value] = $o;
         }
     }
     array_unshift($ddData, JHTML::_('select.option', '', $this->filterSelectLabel()));
     $layout = $this->getLayout('list-filter-dropdown');
     $displayData = new stdClass();
     $displayData->rows = $ddData;
     $displayData->name = $v;
     $displayData->class = $this->filterClass();
     $displayData->size = $size;
     $displayData->default = $default;
     $displayData->htmlId = $this->getHTMLId();
     return $layout->render($displayData);
 }
Exemplo n.º 3
0
 /**
  * Get the list filter for the element
  * @param int filter order
  * @param bol do we render as a normal filter or as an advanced search filter
  * if normal include the hidden fields as well (default true, use false for advanced filter rendering)
  * @return string filter html
  */
 function getFilter($counter, $normal = true)
 {
     $params = $this->getParams();
     $listModel = $this->getListModel();
     $table = $listModel->getTable();
     $element = $this->getElement();
     $origTable = $table->db_table_name;
     $fabrikDb = $listModel->getDb();
     $elName = $this->getFullName(false, true, false);
     $elName2 = $this->getFullName(false, false, false);
     $ids = $listModel->getColumnData($elName2);
     $v = $this->filterName($counter, $normal);
     //corect default got
     $default = $this->getDefaultFilterVal($normal, $counter);
     $format = $params->get('date_table_format', '%Y-%m-%d');
     $fromTable = $origTable;
     $joinStr = '';
     // $$$ hugh - in advanced search, _aJoins wasn't getting set
     $joins = $listModel->getJoins();
     foreach ($joins as $aJoin) {
         // not sure why the group id key wasnt found - but put here to remove error
         if (array_key_exists('group_id', $aJoin)) {
             if ($aJoin->group_id == $element->group_id && $aJoin->element_id == 0) {
                 $fromTable = $aJoin->table_join;
                 $joinStr = " LEFT JOIN {$fromTable} ON " . $aJoin->table_join . "." . $aJoin->table_join_key . " = " . $aJoin->join_from_table . "." . $aJoin->table_key;
                 $elName = str_replace($origTable . '.', $fromTable . '.', $elName);
             }
         }
     }
     $where = $listModel->_buildQueryPrefilterWhere($this);
     $elName = FabrikString::safeColName($elName);
     //dont format here as the format string is different between mysql and php's calendar strftime
     $sql = "SELECT DISTINCT({$elName}) AS text, {$elName} AS value FROM `{$origTable}` {$joinStr}" . "\n WHERE {$elName} IN ('" . implode("','", $ids) . "')" . "\n AND TRIM({$elName}) <> '' {$where} GROUP BY text ASC";
     $requestName = $elName . "___filter";
     if (array_key_exists($elName, $_REQUEST)) {
         if (is_array($_REQUEST[$elName]) && array_key_exists('value', $_REQUEST[$elName])) {
             $_REQUEST[$requestName] = $_REQUEST[$elName]['value'];
         }
     }
     $htmlid = $this->getHTMLId();
     $timeZone = new DateTimeZone(JFactory::getConfig()->get('offset'));
     if (in_array($element->filter_type, array('dropdown'))) {
         $rows = $this->filterValueList($normal);
     }
     $calOpts = $this->filterCalendarOpts();
     $return = array();
     switch ($element->filter_type) {
         case "range":
             FabrikHelperHTML::loadcalendar();
             if (empty($default)) {
                 $default = array('', '');
             } else {
                 $default[0] = JFactory::getDate($default[0])->toFormat($format);
                 $default[1] = JFactory::getDate($default[1])->toFormat($format);
             }
             $return[] = JText::_('COM_FABRIK_DATE_RANGE_BETWEEN') . $this->calendar($default[0], $v . '[0]', $this->getHTMLId() . "_filter_range_0_" . JRequest::getVar('task'), $format, $calOpts);
             $return[] = '<br />' . JText::_('COM_FABRIK_DATE_RANGE_AND') . $this->calendar($default[1], $v . '[1]', $this->getHTMLId() . "_filter_range_1_" . JRequest::getVar('task'), $format, $calOpts);
             break;
         case "dropdown":
             // cant do the format in the MySQL query as its not the same formatting
             // e.g. M in mysql is month and J's date code its minute
             jimport('joomla.utilities.date');
             $ddData = array();
             foreach ($rows as $k => $o) {
                 if ($fabrikDb->getNullDate() === $o->text) {
                     $o->text = '';
                     $o->value = '';
                 } else {
                     $d = new FabDate($o->text);
                     $o->value = $d->toSql();
                     $o->text = $d->toFormat($format);
                 }
                 if (!array_key_exists($o->value, $ddData)) {
                     $ddData[$o->value] = $o;
                 }
             }
             array_unshift($ddData, JHTML::_('select.option', '', $this->filterSelectLabel()));
             $return[] = JHTML::_('select.genericlist', $ddData, $v, 'class="inputbox fabrik_filter" size="1" maxlength="19"', 'value', 'text', $default, $htmlid . "_filter_range_0");
             break;
         default:
         case "field":
             FabrikHelperHTML::loadcalendar();
             if (is_array($default)) {
                 $default = array_shift($default);
             }
             if ($default !== '') {
                 $default = JFactory::getDate($default)->toFormat($format);
             }
             $return[] = $this->calendar($default, $v, $htmlid . '_filter_range_0_' . JRequest::getVar('task'), $format, $calOpts);
             break;
         case 'hidden':
             if (is_array($default)) {
                 $default = array_shift($default);
             }
             if (get_magic_quotes_gpc()) {
                 $default = stripslashes($default);
             }
             $default = htmlspecialchars($default);
             $return[] = '<input type="hidden" name="' . $v . '" class="inputbox fabrik_filter" value="' . $default . '" id="' . $htmlid . '" />';
             break;
         case 'auto-complete':
             if (get_magic_quotes_gpc()) {
                 $default = stripslashes($default);
             }
             $default = htmlspecialchars($default);
             $return[] = '<input type="hidden" name="' . $v . '" class="inputbox fabrik_filter" value="' . $default . '" id="' . $htmlid . '" />';
             $return[] = '<input type="text" name="' . $v . '-auto-complete" class="inputbox fabrik_filter autocomplete-trigger" value="' . $default . '" id="' . $htmlid . '-auto-complete" />';
             $autoId = '#' . $htmlid . '-auto-complete';
             if (!$normal) {
                 $autoId = '#advanced-search-table .autocomplete-trigger';
             }
             FabrikHelperHTML::autoComplete($autoId, $this->getElement()->id, 'date');
             break;
     }
     if ($normal) {
         $return[] = $this->getFilterHiddenFields($counter, $elName);
     } else {
         $return[] = $this->getAdvancedFilterHiddenFields();
     }
     return implode("\n", $return);
 }