Spade
Mini Shell
| Directory:~$ /home/lmsyaran/www/joomla5/components/com_fabrik/models/ |
| [Home] [System Details] [Kill Me] |
<?php
/**
* List Advanced Search Model
*
* @package Joomla
* @subpackage Fabrik
* @copyright Copyright (C) 2005-2020 Media A-Team, Inc. - All rights
reserved.
* @license GNU/GPL http://www.gnu.org/copyleft/gpl.html
*/
// No direct access
defined('_JEXEC') or die('Restricted access');
use Joomla\CMS\Language\Text;
use Joomla\CMS\Session\Session;
use Joomla\String\StringHelper;
use Joomla\CMS\HTML\HTMLHelper;
jimport('joomla.application.component.model');
/**
* List Advanced Search Class
*
* @package Joomla
* @subpackage Fabrik
* @since 3.3.4
*/
class FabrikFEModelAdvancedSearch extends FabModel
{
/**
* @var FabrikFEModelList
*/
protected $model;
/**
* Previously submitted advanced search data
*
* @var array
*/
protected $advancedSearchRows = null;
/**
* Set list model
*
* @param FabrikFEModelList $model
*
* @return void
*/
public function setModel($model)
{
$this->model = $model;
}
/**
* Called from
index.php?option=com_fabrik&view=list&layout=_advancedsearch&tmpl=component&listid=4
* advanced search popup view
*
* @return object advanced search options
*/
public function opts()
{
$model = $this->model;
$params = $model->getParams();
$opts = new stdClass;
// $$$ rob - 20/208/2012 if list advanced search off return nothing
if ($params->get('advanced-filter') == 0)
{
return $opts;
}
$defaultStatement =
$params->get('advanced-filter-default-statement',
'<>');
$opts->defaultStatement = $defaultStatement;
$list = $model->getTable();
$listRef = $model->getRenderContext();
$opts->conditionList = FabrikHelperHTML::conditionList($listRef,
'');
list($fieldNames, $firstFilter) =
$this->getAdvancedSearchElementList();
$statements = $this->getStatementsOpts();
$opts->elementList = HTMLHelper::_('select.genericlist',
$fieldNames, 'fabrik___filter[list_' . $listRef .
'][key][]',
'class="form-select-sm key" size="1" ',
'value', 'text');
$opts->statementList = HTMLHelper::_('select.genericlist',
$statements, 'fabrik___filter[list_' . $listRef .
'][condition][]',
'class="form-select-sm" ', 'value',
'text', $defaultStatement);
$opts->listid = $list->id;
$opts->listref = $listRef;
$opts->ajax = $model->isAjax();
$opts->counter = count($this->getadvancedSearchRows()) - 1;
$elements = $model->getElements();
$arr = array();
foreach ($elements as $e)
{
$key = $e->getFilterFullName();
$arr[$key] = array('id' => $e->getId(),
'plugin' => $e->getElement()->plugin);
}
$opts->elementMap = $arr;
return $opts;
}
/**
* Get a list of elements that are included in the advanced search
drop-down list
*
* @return array list of fields names and which is the first filter
*/
private function getAdvancedSearchElementList()
{
$model = $this->model;
$first = false;
$firstFilter = false;
$fieldNames[] = HTMLHelper::_('select.option', '',
Text::_('COM_FABRIK_PLEASE_SELECT'));
$elementModels = $model->getElements();
foreach ($elementModels as $elementModel)
{
if (!$elementModel->canView('list'))
{
continue;
}
$element = $elementModel->getElement();
$elParams = $elementModel->getParams();
if ($elParams->get('inc_in_adv_search', 1))
{
$elName = $elementModel->getFilterFullName();
if (!$first)
{
$first = true;
$firstFilter = $elementModel->getFilter(0, false);
}
$fieldNames[] = HTMLHelper::_('select.option', $elName,
strip_tags(Text::_($element->label)));
}
}
return array($fieldNames, $firstFilter);
}
/**
* Build an array of html data that gets inserted into the advanced search
popup view
*
* @return array html lists/fields
*/
public function getAdvancedSearchRows()
{
if (isset($this->advancedSearchRows))
{
return $this->advancedSearchRows;
}
$model = $this->model;
$statements = $this->getStatementsOpts();
$input = $this->app->getInput();
$rows = array();
$elementModels = $model->getElements();
list($fieldNames, $firstFilter) =
$this->getAdvancedSearchElementList();
$prefix = 'fabrik___filter[list_' .
$model->getRenderContext() . '][';
$type = '<input type="hidden" name="' .
$prefix . 'search_type][]" value="advanced"
/>';
$grouped = '<input type="hidden" name="' .
$prefix . 'grouped_to_previous][]" value="0"
/>';
$filters = $this->filterValues();
$counter = 0;
if (array_key_exists('key', $filters))
{
foreach ($filters['key'] as $key)
{
foreach ($elementModels as $elementModel)
{
$testKey =
FabrikString::safeColName($elementModel->getFullName(false, false));
if ($testKey == $key)
{
break;
}
}
$join = $filters['join'][$counter];
$condition = $filters['condition'][$counter];
$value = $filters['origvalue'][$counter];
$v2 = $filters['value'][$counter];
$jsSel = '=';
switch ($condition)
{
case 'NOTEMPTY':
$jsSel = 'NOTEMPTY';
break;
case 'EMPTY':
$jsSel = 'EMPTY';
break;
case "<>":
$jsSel = '<>';
break;
case "=":
$jsSel = 'EQUALS';
break;
case "<":
$jsSel = '<';
break;
case ">":
$jsSel = '>';
break;
default:
$firstChar = StringHelper::substr($v2, 1, 1);
$lastChar = StringHelper::substr($v2, -2, 1);
switch ($firstChar)
{
case '%':
$jsSel = ($lastChar == '%') ? 'CONTAINS' :
$jsSel = 'ENDS WITH';
break;
default:
if ($lastChar == '%')
{
$jsSel = 'BEGINS WITH';
}
break;
}
break;
}
if (is_string($value))
{
$value = trim(trim($value, '"'), '%');
}
if ($counter == 0)
{
$join = Text::_('COM_FABRIK_WHERE') . '<input
type="hidden" value="WHERE" name="' . $prefix
. 'join][]" />';
}
else
{
$join = FabrikHelperHTML::conditionList($model->getRenderContext(),
$join);
}
$lineElName =
FabrikString::safeColName($elementModel->getFullName(true, false));
$orig = $input->get($lineElName);
$input->set($lineElName, array('value' => $value));
$filter = $elementModel->getFilter($counter, false);
$input->set($lineElName, $orig);
$key = HTMLHelper::_('select.genericlist', $fieldNames,
$prefix . 'key][]', 'class="form-select-sm key "
size="1" ', 'value', 'text', $key);
$jsSel = HTMLHelper::_('select.genericlist', $statements,
$prefix . 'condition][]', 'class="form-select-sm "
size="1" ', 'value', 'text', $jsSel);
$rows[] = array('join' => $join, 'element' =>
$key, 'condition' => $jsSel, 'filter' => $filter,
'type' => $type,
'grouped' => $grouped);
$counter++;
}
}
if ($counter == 0)
{
$params = $model->getParams();
$join = Text::_('COM_FABRIK_WHERE') . '<input
type="hidden" name="' . $prefix . 'join][]"
value="WHERE" />';
$key = HTMLHelper::_('select.genericlist', $fieldNames,
$prefix . 'key][]', 'class="form-select-sm key"
size="1" ', 'value', 'text',
'');
$defaultStatement =
$params->get('advanced-filter-default-statement',
'<>');
$jsSel = HTMLHelper::_('select.genericlist', $statements,
$prefix . 'condition][]', 'class="form-select-sm"
size="1" ', 'value', 'text',
$defaultStatement);
$rows[] = array('join' => $join, 'element' =>
$key, 'condition' => $jsSel, 'filter' =>
$firstFilter, 'type' => $type,
'grouped' => $grouped);
}
$this->advancedSearchRows = $rows;
return $rows;
}
/**
* Get a list of submitted advanced filters
*
* @return array advanced filter values
*/
public function filterValues()
{
$model = $this->model;
$filters = $model->getFilterArray();
$advanced = array();
$iKeys = array_keys(FArrayHelper::getValue($filters, 'key',
array()));
foreach ($iKeys as $i)
{
$searchType = FArrayHelper::getValue($filters['search_type'],
$i);
if (!is_null($searchType) && $searchType ==
'advanced')
{
foreach (array_keys($filters) as $k)
{
if (array_key_exists($k, $advanced))
{
// some keys may not exist for all filters
$kf = FArrayHelper::getValue($filters, $k, array());
if (is_array($advanced[$k]))
{
$advanced[$k][] = FArrayHelper::getValue($kf, $i, '');
}
}
else
{
$advanced[$k] = array_key_exists($i, $filters[$k]) ?
array(($filters[$k][$i])) : '';
}
}
}
}
return $advanced;
}
/**
* Build the advanced search link
*
* @return string <a href...> link
*/
public function link()
{
$model = $this->model;
$params = $model->getParams();
if ($params->get('advanced-filter', '0'))
{
$displayData = new stdClass;
$displayData->url = $this->url();
$displayData->tmpl = $model->getTmpl();
$layout =
FabrikHelperHTML::getLayout('list.fabrik-advanced-search-button');
return $layout->render($displayData);
}
else
{
return '';
}
}
/**
* Get the URL used to open the advanced search window
*
* @return string
*/
public function url()
{
$model = $this->model;
$table = $model->getTable();
$url = COM_FABRIK_LIVESITE . 'index.php?option=com_' .
$this->package .
'&format=partial&view=list&layout=_advancedsearch&tmpl=component&listid='
. $table->id . '&nextview=' .
$this->app->getInput()->get('view', 'list');
// Defines if we are in a module or in the component.
$url .= '&scope=' . $this->app->scope;
$url .= '&tkn=' . Session::getFormToken();
return $url;
}
/**
* Called via advanced search to load in a given element filter
*
* @return string html for filter
*/
public function elementFilter()
{
$model = $this->model;
$input = $this->app->getInput();
$elementId = $input->getId('elid');
$pluginManager = FabrikWorker::getPluginManager();
$className = $input->get('plugin');
$plugin = $pluginManager->getPlugIn($className, 'element');
$plugin->setId($elementId);
$plugin->getElement();
if ($input->get('context') == 'visualization')
{
$container = $input->get('parentView');
}
else
{
$container = 'listform_' . $model->getRenderContext();
}
$script = $plugin->filterJS(false, $container);
FabrikHelperHTML::addScriptDeclaration($script);
echo $plugin->getFilter($input->getInt('counter', 0),
false);
}
/**
* Get a list of advanced search options
*
* @return array of JHTML options
*/
protected function getStatementsOpts()
{
$statements = array();
$statements[] = HTMLHelper::_('select.option', '=',
Text::_('COM_FABRIK_EQUALS'));
$statements[] = HTMLHelper::_('select.option',
'<>', Text::_('COM_FABRIK_NOT_EQUALS'));
$statements[] = HTMLHelper::_('select.option', 'BEGINS
WITH', Text::_('COM_FABRIK_BEGINS_WITH'));
$statements[] = HTMLHelper::_('select.option',
'CONTAINS', Text::_('COM_FABRIK_CONTAINS'));
$statements[] = HTMLHelper::_('select.option', 'ENDS
WITH', Text::_('COM_FABRIK_ENDS_WITH'));
$statements[] = HTMLHelper::_('select.option',
'>', Text::_('COM_FABRIK_GREATER_THAN'));
$statements[] = HTMLHelper::_('select.option',
'<', Text::_('COM_FABRIK_LESS_THAN'));
$statements[] = HTMLHelper::_('select.option',
'EMPTY', Text::_('COM_FABRIK_IS_EMPTY'));
$statements[] = HTMLHelper::_('select.option',
'NOTEMPTY', Text::_('COM_FABRIK_IS_NOT_EMPTY'));
return $statements;
}
}