1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-08 15:57:01 +02:00

Add support for OR-groups in "custom (field=value)" selections in InputfieldSelector. Simply use the existing "or" checkbox to apply the custom selector as an OR group.

This commit is contained in:
Ryan Cramer
2016-11-06 07:23:36 -05:00
parent 8d0c8de3ee
commit 21bf57eb79
3 changed files with 31 additions and 23 deletions

View File

@@ -480,7 +480,8 @@ var InputfieldSelector = {
var $orCheckbox = $row.find(".input-or");
var useOrValue = mayOrValue && $orCheckbox.is(":checked");
var useOrField = mayOrField && $orCheckbox.is(":checked");
var isOrGroup = (useOrField || useOrValue) && fieldName == '_custom';
if(useOrValue) { // && !$row.is('.has-or-value')) {
$row.addClass('has-or-value');
$row.find(".select-field, .select-operator, .select-subfield").attr('disabled', 'disabled');
@@ -505,6 +506,7 @@ var InputfieldSelector = {
mayOrField: mayOrField,
useOrValue: useOrValue,
useOrField: useOrField,
isOrGroup: isOrGroup,
checkbox: $orCheckbox
};
@@ -560,7 +562,9 @@ var InputfieldSelector = {
if(i === n) continue;
var si = selectors[i];
if(si === null || typeof si == "undefined" || typeof si.value == "undefined") continue;
if(si.mayOrField && si.value == s.value) {
if(si.field == '_custom' && si.isOrGroup) {
s.isOrGroup = true;
} else if(si.mayOrField && si.value == s.value) {
si.checkbox.show();
if(si.useOrField) {
s.field += '|' + si.field;
@@ -582,7 +586,12 @@ var InputfieldSelector = {
}
if(s.field == '_custom') {
selector += s.value;
if(s.isOrGroup) {
s.value = s.value.replace('(', '').replace(')', '');
selector += s.field + '=' + '(' + s.value + ')';
} else {
selector += s.value;
}
} else {
selector += s.field + s.operator + $.trim(s.value);
}

File diff suppressed because one or more lines are too long

View File

@@ -492,8 +492,7 @@ class InputfieldSelector extends Inputfield implements ConfigurableModule {
'label' => $this->_('Custom (field=value)'),
'operators' => array(),
'placeholder' => $this->_('field=value'),
),
),
//'parent' => $this->_('parent'),
);
@@ -1125,12 +1124,12 @@ class InputfieldSelector extends Inputfield implements ConfigurableModule {
$options[$item->id] = $inputfield->getPageLabel($item); // $item->get('title|name');
}
if(count($options) < 2
&& ($field->parent_id || $field->template_id)
&& ($field->findPagesCode || $field->findPagesSelector)) {
&& ($field->get('parent_id') || $field->get('template_id'))
&& ($field->get('findPagesCode') || $field->get('findPagesSelector'))) {
// see if we can locate options purely with the parent or template
$findSelector = array("include=unpublished, limit=500, sort=title, sort=name, ");
if($field->parent_id) $findSelector[] = "parent_id=" . (int) $field->parent_id;
if($field->template_id) $findSelector[] = "templates_id=" . (int) $field->template_id;
if($field->get('parent_id')) $findSelector[] = "parent_id=" . (int) $field->get('parent_id');
if($field->get('template_id')) $findSelector[] = "templates_id=" . (int) $field->get('template_id');
foreach($this->wire('pages')->find(implode(', ', $findSelector)) as $item) {
$options[$item->id] = $inputfield->getPageLabel($item); // $item->get('title|name');
}
@@ -1400,35 +1399,35 @@ class InputfieldSelector extends Inputfield implements ConfigurableModule {
$hasPageListSelect = strpos($field->get('inputfield'), 'PageListSelect') !== false;
// determine autocomplete state based on field settings and quantity of pages involved
if($field->findPagesSelector) {
if($field->get('findPagesSelector')) {
// user-specified selector determines which pages match
$selector = trim($field->findPagesSelector, ', ');
$selector = trim($field->get('findPagesSelector'), ', ');
if(strpos($selector, 'page.') !== false) {
// remove page.something impossible reference, if present
$selector = preg_replace('/[_a-zA-Z0-9]+[=<>!]+page\.[_a-zA-Z0-9]+[\s,]*/', '', $selector);
//$selector = preg_replace('/(^|,)\s*page\.[_a-zA-Z0-9][=<>!]+[^,]*/', '', $selector);
}
if($field->parent_id) $selector .= ",has_parent=" . (int) $field->parent_id;
} else if($field->parent_id) {
if($field->get('parent_id')) $selector .= ",has_parent=" . (int) $field->get('parent_id');
} else if($field->get('parent_id')) {
if($hasPageListSelect) {
$selector = "has_parent=" . (int) $field->parent_id;
$selector = "has_parent=" . (int) $field->get('parent_id');
} else {
$selector = "parent_id=" . (int) $field->parent_id;
$selector = "parent_id=" . (int) $field->get('parent_id');
}
}
if($field->template_id) {
if($field->get('template_id')) {
$selector .= ",templates_id=";
if(is_array($field->template_id)) {
if(count($field->template_id)) $selector .= implode('|', $field->template_id);
if(is_array($field->get('template_id'))) {
if(count($field->get('template_id'))) $selector .= implode('|', $field->get('template_id'));
} else {
$selector .= (int) $field->template_id;
$selector .= (int) $field->get('template_id');
}
}
if(empty($selector)) {
// if it's using a runtime code to determine, then we can't use autocomplete
if($field->findPagesCode) return '';
if($field->get('findPagesCode')) return '';
// otherwise just populate a selector that can match anything
$selector = "id>0";
}
@@ -1717,8 +1716,8 @@ class InputfieldSelector extends Inputfield implements ConfigurableModule {
// render a row for each value in the selector (usually 1)
foreach($values as $valueNum => $value) {
if($valueNum > 0) $rowClass .= " has-or-value";
if($fieldNum > 0 || $valueNum > 0) $orChecked = true;
if($valueNum > 0 || $quote == '(') $rowClass .= " has-or-value";
if($fieldNum > 0 || $valueNum > 0 || $quote == '(') $orChecked = true;
if(!strlen($value) && $quote) $value = "$quote{$value}$quote";
$operator = $selector->operator;
// convert to not operator when finding a not selector