diff --git a/application/views/helpers/FormDataFilter.php b/application/views/helpers/FormDataFilter.php index e648ca2e..55c2f741 100644 --- a/application/views/helpers/FormDataFilter.php +++ b/application/views/helpers/FormDataFilter.php @@ -20,8 +20,6 @@ class Zend_View_Helper_FormDataFilter extends Zend_View_Helper_FormElement private $fieldName; - private $addTo; - private $cachedColumnSelect; private $query; @@ -50,19 +48,13 @@ class Zend_View_Helper_FormDataFilter extends Zend_View_Helper_FormElement unset($attribs['columns']); } - if (array_key_exists('addTo', $attribs)) { - $this->addTo = $attribs['addTo']; - unset($attribs['addTo']); - } - // TODO: check for columns in attribs, preserve & remove them from the // array use attribs? class etc? disabled? // override _getInfo? - $this->fieldName = $name; - // $this->fieldName = $id; + if ($value === null) { - $value = Filter::matchAll(); + $value = $this->emptyExpression(); } elseif (is_string($value)) { $value = Filter::fromQueryString($value); } @@ -72,16 +64,19 @@ class Zend_View_Helper_FormDataFilter extends Zend_View_Helper_FormElement protected function renderFilter(Filter $filter, $level = 0) { - if ($level === 0 && $filter->isChain() && $filter->isEmpty()) { - return ''; + if ($level === 0 && ( + ($filter->isChain() && $filter->isEmpty()) + || $filter->isExpression())) { + $pre = ''; + } else { + $pre = $post = ''; } if ($filter instanceof FilterChain) { - return $this->renderFilterChain($filter, $level); + return $pre . $this->renderFilterChain($filter, $level) . $post; } elseif ($filter instanceof FilterExpression) { - return $this->renderFilterExpression($filter, $level); + return $pre . $this->renderFilterExpression($filter, $level) . $post; } else { throw new ProgrammingError('Got a Filter being neither expression nor chain'); } @@ -101,14 +96,9 @@ class Zend_View_Helper_FormDataFilter extends Zend_View_Helper_FormElement . ''; } - if ($this->addTo && $this->addTo == $filter->getId()) { - $parts[] = '
  • ' - . $this->renderNewFilter() - // . $this->cancelLink() - . '
  • '; - } - - return $this->beginChain($filter) . implode('', $parts) . $this->endChain($filter); + return $this->beginChain($filter) + . implode('', $parts) + . $this->endChain($filter); } protected function beginChain(FilterChain $filter) @@ -117,7 +107,7 @@ class Zend_View_Helper_FormDataFilter extends Zend_View_Helper_FormElement $list = $filter->isEmpty() ? '' : '' . "\n"; - return '
    ' . $this->selectOperator($filter) . $this->removeLink($filter) @@ -129,7 +119,7 @@ class Zend_View_Helper_FormDataFilter extends Zend_View_Helper_FormElement protected function endChain(FilterChain $filter) { $list = $filter->isEmpty() ? '' : "\n"; - return $list . "
    \n"; + return $list . "\n"; } protected function beginExpression(FilterExpression $filter) @@ -143,28 +133,6 @@ class Zend_View_Helper_FormDataFilter extends Zend_View_Helper_FormElement return "\n"; } - protected function eventuallyAddTo($html, Filter $filter, $level) - { - if ($this->addTo && $this->addTo === $filter->getId()) { - // $filter->replaceWith(Filter::matchAll(clone($filter))); - // $and = $filt = Filter::matchAll(clone($filter)); - // return $this->renderFilterChain($filter, $level); - - $html .= preg_replace( - //'/ class="autosubmit"/', - '/ class="/', - ' class="autofocus', - $this->selectOperator() - ) . ''; - } - - return $html; - } - protected function filterExpressionHtml(FilterExpression $filter, $level) { return $this->selectColumn($filter) @@ -177,11 +145,8 @@ class Zend_View_Helper_FormDataFilter extends Zend_View_Helper_FormElement protected function renderFilterExpression(FilterExpression $filter, $level) { return $this->beginExpression($filter) - . $this->eventuallyAddTo( - $this->filterExpressionHtml($filter, $level), - $filter, - $level - ) . $this->endExpression($filter); + . $this->filterExpressionHtml($filter, $level) + . $this->endExpression($filter); } protected function element(Filter $filter = null) @@ -252,9 +217,7 @@ class Zend_View_Helper_FormDataFilter extends Zend_View_Helper_FormElement protected function renderNewFilter() { - return $this->selectColumn() - . $this->selectSign() - . $this->element(); + return $this->renderFilterExpression($this->emptyExpression(), 0); } protected function arrayForSelect($array, $flip = false) @@ -278,11 +241,7 @@ class Zend_View_Helper_FormDataFilter extends Zend_View_Helper_FormElement $prefix = $this->fieldName . '[id_'; $suffix = '][' . $field . ']'; - if ($filter === null) { - return $prefix . 'new_' . ($this->addTo ?: '0') . $suffix; - } else { - return $prefix . $filter->getId() . $suffix; - } + return $prefix . $filter->getId() . $suffix; } protected function selectOperator(Filter $filter = null) diff --git a/library/Director/Web/Form/Element/DataFilter.php b/library/Director/Web/Form/Element/DataFilter.php index e3ae070a..c4eb2351 100644 --- a/library/Director/Web/Form/Element/DataFilter.php +++ b/library/Director/Web/Form/Element/DataFilter.php @@ -32,10 +32,6 @@ class DataFilter extends FormElement $value = $this->arrayToFilter($value); } - if ($value->isEmpty()) { - $value = Filter::matchAll(Filter::expression('', '=', '')); - } - } catch (Exception $e) { $value = null; // TODO: getFile, getLine @@ -45,77 +41,40 @@ class DataFilter extends FormElement } } + /** + * This method transforms filter form data into a filter + * and reacts on pressed buttons + */ protected function arrayToFilter($array) { if ($array === null) { + return null; return Filter::matchAll(); } - $firstKey = key($array); - if (! in_array($firstKey, array('id_1', 'id_new_0'))) { - die('FCK: ' . key($array)); - } - - $entry = array_shift($array); - $filter = $this->entryToFilter($entry); - if ($firstKey === 'id_new_0') { - $this->setAttrib('addTo', '0'); - } - - $remove = $strip = null; - - // TODO: This is for the first entry, duplicates code and has debug info - $filterId = $this->idToFilterId($firstKey); - switch ($this->entryAction($entry)) { - case 'cancel': - $remove = $filterId; - echo "cancel"; - break; - - case 'minus': - $strip = $filterId; - echo "minus"; - break; - - case 'plus': - $this->setAttrib('addTo', $filterId); - echo "plus"; - break; - } - + $filter = null; foreach ($array as $id => $entry) { - // TODO: addTo from FilterEditor - - $sub = $this->entryToFilter($entry); $filterId = $this->idToFilterId($id); - - switch ($this->entryAction($entry)) { - case 'cancel': - $remove = $filterId; - break; - - case 'minus': - $strip = $filterId; - break; - - case 'plus': - $this->setAttrib('addTo', $filterId); - break; - } - + $sub = $this->entryToFilter($entry); + $this->checkEntryForActions($filterId, $entry); $parentId = $this->parentIdFor($filterId); - $filter->getById($parentId)->addFilter($sub); + + if ($filter === null) { + $filter = $sub; + } else { + $filter->getById($parentId)->addFilter($sub); + } } - if ($remove) { + if ($remove = $this->getAttrib('removeFilter')) { if ($filter->getById($remove)->isRootNode()) { - $filter = Filter::matchAll(); + $filter = $this->emptyExpression(); } else { $filter->removeId($remove); } } - if ($strip) { + if ($strip = $this->getAttrib('stripFilter')) { $subId = $strip . '-1'; if ($filter->getId() === $strip) { $filter = $filter->getById($strip . '-1'); @@ -124,9 +83,45 @@ class DataFilter extends FormElement } } + if ($addTo = $this->getAttrib('addTo')) { + $parent = $filter->getById($addTo); + + if ($parent->isChain()) { + if ($parent->isEmpty()) { + $parent->addFilter($this->emptyExpression()); + } elseif ($parent->getOperatorName() === 'NOT') { + $andNot = Filter::matchAll(); + foreach ($parent->filters() as $sub) { + $andNot->addFilter(clone($sub)); + } + $clone->addFilter($this->emptyExpression()); + $filter->replaceById( + $parent->getId(), + Filter::not($andNot) + ); + } else { + $parent->addFilter($this->emptyExpression()); + } + } else { + $replacement = Filter::matchAll(clone($parent)); + if ($parent->isRootNode()) { + $filter = $replacement; + } else { + $filter->replaceById($parent->getId(), $replacement); + } + } + + $this->setAttrib('addTo', null); + } + return $filter; } + protected function emptyExpression() + { + return Filter::expression('', '=', ''); + } + protected function parentIdFor($id) { if (false === ($pos = strrpos($id, '-'))) { @@ -145,41 +140,72 @@ class DataFilter extends FormElement return $m[2]; } + protected function checkEntryForActions($filterId, $entry) + { + switch ($this->entryAction($entry)) { + case 'cancel': + $this->setAttrib('removeFilter', $filterId); + break; + + case 'minus': + $this->setAttrib('stripFilter', $filterId); + break; + + case 'plus': + case 'angle-double-right': + $this->setAttrib('addTo', $filterId); + break; + } + } + + /** + * Transforms a single submitted form component from an array + * into a Filter object + * + * @param Array $entry The array as submitted through the form + * + * @return Filter + */ protected function entryToFilter($entry) { if (array_key_exists('operator', $entry)) { return Filter::chain($entry['operator']); } else { - if ($entry['sign'] === 'true') { - return Filter::expression( - $entry['column'], - '=', - true - ); - } elseif ($entry['sign'] === 'in') { - if (array_key_exists('value', $entry)) { - if (is_array($entry['value'])) { - $value = array_filter($entry['value'], 'strlen'); - } elseif (empty($entry['value'])) { - $value = array(); - } else { - $value = array($entry['value']); - } - } else { + return $this->entryToFilterExpression($entry); + } + } + + protected function entryToFilterExpression($entry) + { + if ($entry['sign'] === 'true') { + return Filter::expression( + $entry['column'], + '=', + true + ); + } elseif ($entry['sign'] === 'in') { + if (array_key_exists('value', $entry)) { + if (is_array($entry['value'])) { + $value = array_filter($entry['value'], 'strlen'); + } elseif (empty($entry['value'])) { $value = array(); + } else { + $value = array($entry['value']); } - return Filter::expression( - $entry['column'], - '=', - $value - ); } else { - return Filter::expression( - $entry['column'], - $entry['sign'], - array_key_exists('value', $entry) ? $entry['value'] : null - ); + $value = array(); } + return Filter::expression( + $entry['column'], + '=', + $value + ); + } else { + return Filter::expression( + $entry['column'], + $entry['sign'], + array_key_exists('value', $entry) ? $entry['value'] : null + ); } }