Skip to content

Commit

Permalink
Add support to textselect field for showing existing values along wit…
Browse files Browse the repository at this point in the history
…h preconfigured custom value list or value list via SQL query
  • Loading branch information
ggppdk committed Nov 22, 2018
1 parent 79eedfb commit 54d5e48
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 43 deletions.
2 changes: 1 addition & 1 deletion admin/helpers/fcfield/indexedfield.php
Original file line number Diff line number Diff line change
Expand Up @@ -1424,7 +1424,7 @@ function onDisplayFilter(&$filter, $value='', $formName='adminForm', $isSearchVi

// Get indexed element values
$item_pros = false;
$elements = FlexicontentFields::indexedField_getElements($filter, $item=null, static::$extra_props, $item_pros, $create_filter=true);
$elements = FlexicontentFields::indexedField_getElements($filter, $item=null, static::$extra_props, $item_pros, $is_filter=true);


// ***
Expand Down
2 changes: 1 addition & 1 deletion admin/models/items.php
Original file line number Diff line number Diff line change
Expand Up @@ -594,7 +594,7 @@ function renderFiltersHTML()

$item_pros = false;
$extra_props = ($filter->field_type == 'radioimage' || $filter->field_type == 'checkboximage') ? array('image', 'valgrp', 'state') : array();
$elements = FlexicontentFields::indexedField_getElements($filter, $item=null, $extra_props, $item_pros, $create_filter=true);
$elements = FlexicontentFields::indexedField_getElements($filter, $item=null, $extra_props, $item_pros, $is_filter=true);

$filter->isfilter = 1;

Expand Down
78 changes: 61 additions & 17 deletions plugins/flexicontent_fields/text/text.php
Original file line number Diff line number Diff line change
Expand Up @@ -879,32 +879,76 @@ function onIndexSearch(&$field, &$post, &$item)
function buildSelectOptions(&$field, &$item)
{
// Drop-down select elements depend on 'select_field_mode'
$select_field_mode = $field->parameters->get('select_field_mode', 0);
if ( $select_field_mode == 0 ) {
// All existing values
$field_elements = ' SELECT DISTINCT value, value as text '
.' FROM #__flexicontent_fields_item_relations '
.' WHERE field_id={field->id} AND value != "" GROUP BY value';
} else {
// Predefined elements or Elements via an SQL query
$select_field_mode = (int) $field->parameters->get('select_field_mode', 0);

$results_predefined = array();
$results_existing = array();

// Predefined elements, 1: Custom List, 2: Elements via an SQL query
if ($select_field_mode != 0)
{
$field_elements = $field->parameters->get('select_field_elements');

// Call function that parses or retrieves element via sql
$field->parameters->set('sql_mode', $select_field_mode === 2 || $select_field_mode === -2);
$field->parameters->set('field_elements', $field_elements);
$results_predefined = FlexicontentFields::indexedField_getElements($field, $item);
}

// All existing values
if ($select_field_mode <= 0)
{
$field_elements = 'SELECT DISTINCT value, value as text '
. ' FROM #__flexicontent_fields_item_relations '
. ' WHERE field_id={field->id} AND value != ""'
;

// Call function that parses or retrieves element via sql
$field->parameters->set('sql_mode', 1);
$field->parameters->set('field_elements', $field_elements);
$field->parameters->set('nocache', 1);
$results_existing = FlexicontentFields::indexedField_getElements($field, $item);
$field->parameters->set('nocache', null);
}

// Call function that parses or retrieves element via sql
$field->parameters->set('sql_mode', $select_field_mode==0 || $select_field_mode==2);
$field->parameters->set('field_elements', $field_elements);
$results = FlexicontentFields::indexedField_getElements($field, $item);

$options = array();
$default_prompt = $select_field_mode==0 ? 'FLEXI_FIELD_SELECT_EXISTING_VALUE' : 'FLEXI_FIELD_SELECT_VALUE';
$default_prompt = $select_field_mode === 0
? 'FLEXI_FIELD_SELECT_EXISTING_VALUE'
: 'FLEXI_FIELD_SELECT_VALUE';
$field_prompt = $field->parameters->get('select_field_prompt', $default_prompt);
$options[] = JHtml::_('select.option', '', '-'.JText::_($field_prompt).'-');
$options[] = JHtml::_('select.option', '', JText::_($field_prompt));

$lang_filter_values = $field->parameters->get( 'lang_filter_values', 0);
if ($results) foreach($results as $result) {
if ( !strlen($result->value) ) continue;
$options[] = JHtml::_('select.option', $result->value, ($lang_filter_values ? JText::_($result->text) : $result->text));

if ($results_predefined)
{
foreach($results_predefined as $result)
{
if (strlen($result->value))
{
$options[] = JHtml::_('select.option',
$result->value,
($lang_filter_values ? JText::_($result->text) : $result->text)
);
}
}
}

if ($results_existing)
{
foreach($results_existing as $result)
{
if (strlen($result->value) && (!$results_predefined || !isset($results_predefined[$result->value])))
{
$options[] = JHtml::_('select.option',
$result->value,
($lang_filter_values ? JText::_($result->text) : $result->text)
);
}
}
}

return $options;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,5 @@ FLEXI_FIELD_TEXT_INPUT="Text Input"
FLEXI_FIELD_DROP_DOWN_SELECT="Drop Down Select"
FLEXI_FIELD_SELECT_VALUE="Select value"
FLEXI_FIELD_SELECT_EXISTING_VALUE="Select existing value"
FLEXI_FIELD_TXTSELECT_ALL_EXISTING_N_CUSTOM_ELEMENTS="All existing values + Custom Elements"
FLEXI_FIELD_TXTSELECT_ALL_EXISTING_N_CUSTOM_SQL_QUERY="All existing values + SQL Query"
8 changes: 5 additions & 3 deletions plugins/flexicontent_fields/textselect/textselect.xml
Original file line number Diff line number Diff line change
Expand Up @@ -161,13 +161,15 @@
<field name="posttext_form" type="text" default="" filter="JComponentHelper::filterText" label="FLEXI_FIELD_VALUE_SUFFIX_TEXT" description="FLEXI_FIELD_VALUE_SUFFIX_TEXT_DESC" />

<field name="" type="separator" default="FLEXI_FIELD_DROP_DOWN_SELECT" level="level2" />
<field name="select_field_mode" type="multilist" subtype="radio" toggle_related="1" default="0" label="FLEXI_FIELD_SELECT_FIELD_MODE" description="FLEXI_FIELD_SELECT_FIELD_MODE_DESC"
<field name="select_field_mode" type="multilist" subtype="list" toggle_related="1" default="0" label="FLEXI_FIELD_SELECT_FIELD_MODE" description="FLEXI_FIELD_SELECT_FIELD_MODE_DESC"
inline_tip="SELECT ... AS value, ... AS text ... FROM ... WHERE _valgrp_in_ AND (...)" tip_class="elements_sql" tip_img="comments.png" preview_img="database_green.png"
inline_tip2="value1::label1%%&lt;br/&gt; value2::label2%% ..." tip_class2="elements_list" tip_img2="comments.png" preview_img2="text_area.png"
class="btn-group group-fcmethod">
<option value="0" show_list="" hide_list="elements_list,elements_sql,elements_box">FLEXI_FIELD_TXTSELECT_ALL_EXISTING_VALS</option>
class="">
<option value="1" show_list="elements_list,elements_box" hide_list="elements_sql" fcreadonly="{'field_elements':1}">FLEXI_FIELD_TXTSELECT_CUSTOM_ELEMENTS</option>
<option value="2" show_list="elements_sql,elements_box" hide_list="elements_list" fcreadonly="{'field_elements':0}" force_list="elements_field" >FLEXI_FIELD_TXTSELECT_CUSTOM_SQL_QUERY</option>
<option value="0" show_list="" hide_list="elements_list,elements_sql,elements_box">FLEXI_FIELD_TXTSELECT_ALL_EXISTING_VALS</option>
<option value="-1" show_list="elements_list,elements_box" hide_list="elements_sql" fcreadonly="{'field_elements':1}">FLEXI_FIELD_TXTSELECT_ALL_EXISTING_N_CUSTOM_ELEMENTS</option>
<option value="-2" show_list="elements_sql,elements_box" hide_list="elements_list" fcreadonly="{'field_elements':0}" force_list="elements_field" >FLEXI_FIELD_TXTSELECT_ALL_EXISTING_N_CUSTOM_SQL_QUERY</option>
</field>

<field name="select_field_elements" type="fcsortablelist" subtype="elements"
Expand Down
67 changes: 46 additions & 21 deletions site/classes/flexicontent.fields.php
Original file line number Diff line number Diff line change
Expand Up @@ -1956,36 +1956,46 @@ static function indexedField_getColsExprs($field, $item, $field_elements)


// Common method to get the allowed element values (field values with index,label,... properties) for fields that use indexed values
static function indexedField_getElements($field, $item, $extra_props=array(), &$item_pros=true, $create_filter=false, $and_clause=false)
static function indexedField_getElements($field, $item, $extra_props=array(), &$item_pros=true, $is_filter=false, $and_clause=false)
{
static $_elements_cache = null;
if ( isset($_elements_cache[$field->id]) ) return $_elements_cache[$field->id];
$canCache = true;
static $_elements_cache = array();

$sql_mode = $field->parameters->get( 'sql_mode', 0 ) ; // For fields that use this parameter
$field_elements = $field->parameters->get( 'field_elements', '' ) ;
$lang_filter_values = $field->parameters->get( 'lang_filter_values', 1);
// For fields that use this parameter
$sql_mode = (int) $field->parameters->get('sql_mode', 0);
$canCache = ! $field->parameters->get('nocache');

if ($canCache && isset($_elements_cache[$field->id][$is_filter]))
{
return $_elements_cache[$field->id][$is_filter];
}

$field_elements = $field->parameters->get('field_elements', '') ;
$lang_filter_values = $field->parameters->get('lang_filter_values', 1);

$default_extra_props = array('image', 'valgrp', 'state');

if ($create_filter)
if ($is_filter)
{
$filter_customize_options = $field->parameters->get('filter_customize_options', 0);
$filter_customize_options = (int) $field->parameters->get('filter_customize_options', 0);
$filter_custom_options = $field->parameters->get('filter_custom_options', '');

// Custom query for value retrieval
if ( $filter_customize_options && $filter_custom_options)
if ($filter_customize_options && $filter_custom_options)
{
$sql_mode = $filter_customize_options==1;
$sql_mode = $filter_customize_options === 1;
$field_elements = $filter_custom_options;
}

// Default query for value retrieval
else if ( !$field_elements )
elseif (!$field_elements)
{
$sql_mode = 1;
$field_elements = "SELECT value, value as text FROM #__flexicontent_fields_item_relations as fir WHERE field_id='{field_id}' AND value != '' GROUP BY value";
$field_elements = 'SELECT DISTINCT value, value as text '
. ' FROM #__flexicontent_fields_item_relations '
. ' WHERE field_id={field->id} AND value != ""'
;
}

// Set parameters may be used later
$field->parameters->set('sql_mode', $sql_mode);
$field->parameters->set('field_elements', $field_elements);
Expand All @@ -2003,31 +2013,36 @@ static function indexedField_getElements($field, $item, $extra_props=array(), &$
// Get/verify query string, check if item properties and other replacements are allowed and replace them
$query = preg_match('#^select#i', $field_elements) ? $field_elements : '';
$query = FlexicontentFields::doQueryReplacements($field_elements, $field, $item, $item_pros, $canCache);

if ($query)
{
$query = preg_replace('/_valgrp_in_/ui', ($and_clause ? $and_clause : ' 1 '), $query);
}

// Execute SQL query to retrieve the field value - label pair, and any other extra properties
$results = false;
if ( $query )

if ($query)
{
$db->setQuery($query);
$results = $db->loadObjectList('value');
$results = $db->setQuery($query)->loadObjectList('value');
}

if ($results && $lang_filter_values)
{
foreach ($results as $val=>$result)
{
$results[$val]->text = JText::_($result->text); // the text label
$results[$val]->text = JText::_($result->text);
}
}

// !! CHECK: DB query failed or produced an error (AN EMPTY ARRAY IS NOT AN ERROR)
if (!$query || !is_array($results))
{
if ( $canCache && !$and_clause ) $_elements_cache[$field->id] = false;
if ($canCache && !$and_clause)
{
$_elements_cache[$field->id][$is_filter] = false;
}

return false;
}
}
Expand All @@ -2038,26 +2053,32 @@ static function indexedField_getElements($field, $item, $extra_props=array(), &$
{
// Parse the elements used by field unsetting last element if empty
$listelements = preg_split("/[\s]*%%[\s]*/", $field_elements);
if ( empty($listelements[count($listelements)-1]) )

if (empty($listelements[count($listelements)-1]))
{
unset($listelements[count($listelements)-1]);
}

$props_needed = 2 + count($extra_props);

// Split elements into their properties: value, label, extra_prop1, extra_prop2
$listarrays = array();
$results = array();

foreach ($listelements as $listelement)
{
$listelement_props = preg_split("/[\s]*::[\s]*/", $listelement);

// Compatibility with previously stored elements, ignore missing 'valgrp' and 'state'
if (count($listelement_props) < $props_needed && count($listelement_props)==3 && $extra_props[1]=='valgrp') $listelement_props[] = null;
if (count($listelement_props) < $props_needed && count($listelement_props)==4 && $extra_props[2]=='state') $listelement_props[] = null;

if (count($listelement_props) < $props_needed)
{
echo "Error in field: ".$field->label." while splitting element: ".$listelement." properties needed: ".$props_needed." properties found: ".count($listelement_props);
return ($_elements_cache[$field->id] = false);
return ($_elements_cache[$field->id][$is_filter] = false);
}

$val = $listelement_props[0];
$results[$val] = new stdClass();
$results[$val]->value = $listelement_props[0];
Expand All @@ -2075,7 +2096,11 @@ static function indexedField_getElements($field, $item, $extra_props=array(), &$
}

// Return found elements, caching them if possible (if no item specific elements are used)
if ( $canCache && !$and_clause ) $_elements_cache[$field->id] = & $results;
if ($canCache && !$and_clause)
{
$_elements_cache[$field->id][$is_filter] = & $results;
}

return $results;
}

Expand Down

0 comments on commit 54d5e48

Please sign in to comment.