diff --git a/core/oql/expression.class.inc.php b/core/oql/expression.class.inc.php index 266942353..cea3be642 100644 --- a/core/oql/expression.class.inc.php +++ b/core/oql/expression.class.inc.php @@ -931,7 +931,10 @@ class FieldExpression extends UnaryExpression $sSearchType = AttributeDefinition::SEARCH_WIDGET_TYPE; } - return array('ref' => $this->GetParent().'.'.$this->GetName(), 'widget' => $sSearchType); + return array( + 'widget' => $sSearchType, + 'ref' => $this->GetParent().'.'.$this->GetName(), + ); } } diff --git a/sources/application/search/criterionconversion/criteriontosearchform.class.inc.php b/sources/application/search/criterionconversion/criteriontosearchform.class.inc.php index 3fde3b554..f884d3739 100644 --- a/sources/application/search/criterionconversion/criteriontosearchform.class.inc.php +++ b/sources/application/search/criterionconversion/criteriontosearchform.class.inc.php @@ -58,32 +58,36 @@ class CriterionToSearchForm extends CriterionConversionAbstract protected static function TextToSearchForm($aCriteria) { $sOperator = $aCriteria['operator']; - $aValues = $aCriteria['values']; + $sValue = $aCriteria['values'][0]['value']; - $value = $aValues[0]['value']; - - $bStartWithPercent = $value{0} == '%' ? true : false; - $bEndWithPercent = $value{0} == '%' ? true : false; + $bStartWithPercent = substr($sValue, 0, 1) == '%' ? true : false; + $bEndWithPercent = substr($sValue, -1) == '%' ? true : false; switch (true) { - case ('' == $value and ($sOperator == '=' or $sOperator == 'LIKE')): + case ('' == $sValue and ($sOperator == '=' or $sOperator == 'LIKE')): $aCriteria['operator'] = CriterionConversionAbstract::OP_EMPTY; break; - case ('' == $value and $sOperator == '!='): + case ('' == $sValue and $sOperator == '!='): $aCriteria['operator'] = CriterionConversionAbstract::OP_NOT_EMPTY; break; case ($sOperator == 'LIKE' && $bStartWithPercent && $bEndWithPercent): $aCriteria['operator'] = CriterionConversionAbstract::OP_CONTAINS; - $aValues[0]['value'] = substr($value, 1, strlen($value) - 2); + $sValue = substr($sValue, 1, -1); + $aCriteria['values'][0]['value'] = $sValue; + $aCriteria['values'][0]['label'] = $sValue; break; case ($sOperator == 'LIKE' && $bStartWithPercent): $aCriteria['operator'] = CriterionConversionAbstract::OP_ENDS_WITH; - $aValues[0]['value'] = substr($value, 1, strlen($value) - 1); + $sValue = substr($sValue, 1); + $aCriteria['values'][0]['value'] = $sValue; + $aCriteria['values'][0]['label'] = $sValue; break; case ($sOperator == 'LIKE' && $bEndWithPercent): $aCriteria['operator'] = CriterionConversionAbstract::OP_STARTS_WITH; - $aValues[0]['value'] = substr($value, 0, strlen($value) - 1); + $sValue = substr($sValue, 0, -1); + $aCriteria['values'][0]['value'] = $sValue; + $aCriteria['values'][0]['label'] = $sValue; break; } diff --git a/sources/application/search/searchform.class.inc.php b/sources/application/search/searchform.class.inc.php index 05d7a73ea..57c56b4ec 100644 --- a/sources/application/search/searchform.class.inc.php +++ b/sources/application/search/searchform.class.inc.php @@ -110,7 +110,7 @@ class SearchForm $oBaseSearch = $oSearch->DeepClone(); $oBaseSearch->ResetCondition(); - $sBaseOQL = $sBaseOql = str_replace(' WHERE 1', '', $oBaseSearch->ToOQL()); + $sBaseOQL = str_replace(' WHERE 1', '', $oBaseSearch->ToOQL()); if (!isset($aExtraParams['table_id'])) diff --git a/test/application/search/CriterionConversionTest.php b/test/application/search/CriterionConversionTest.php index 4f3e43ee0..b90098bed 100644 --- a/test/application/search/CriterionConversionTest.php +++ b/test/application/search/CriterionConversionTest.php @@ -29,6 +29,7 @@ namespace Combodo\iTop\Test\UnitTest\Application\Search; use Combodo\iTop\Application\Search\CriterionConversion\CriterionToOQL; +use Combodo\iTop\Application\Search\CriterionConversion\CriterionToSearchForm; use Combodo\iTop\Test\UnitTest\ItopDataTestCase; class CriterionConversionTest extends ItopDataTestCase @@ -145,4 +146,139 @@ class CriterionConversionTest extends ItopDataTestCase ), ); } + + /** + * @dataProvider ToSearchFormProvider + */ + function testToSearchForm($aCriterion, $sExpectedOperator) + { + $aRes = CriterionToSearchForm::Convert($aCriterion); + $this->debug($aRes); + $this->assertEquals($sExpectedOperator, $aRes[0]['operator']); + } + + function ToSearchFormProvider() + { + return array( + '=' => array( + json_decode('[ + { + "ref": "Contact.name", + "widget": "string", + "values": [ + { + "value": "toto", + "label": "toto" + } + ], + "operator": "=", + "oql": "(`Contact`.`name` = \'toto\')" + } + ]', true), + '=' + ), + 'starts_with' => array( + json_decode('[ + { + "ref": "Contact.name", + "widget": "string", + "values": [ + { + "value": "toto%", + "label": "toto%" + } + ], + "operator": "LIKE", + "oql": "(`Contact`.`name` LIKE \'toto%\')" + } + ]', true), + 'starts_with' + ), + 'ends_with' => array( + json_decode('[ + { + "ref": "Contact.name", + "widget": "string", + "values": [ + { + "value": "%toto", + "label": "%toto" + } + ], + "operator": "LIKE", + "oql": "(`Contact`.`name` LIKE \'%toto\')" + } + ]', true), + 'ends_with' + ), + 'contains' => array( + json_decode('[ + { + "widget": "string", + "ref": "Contact.name", + "values": [ + { + "value": "%toto%", + "label": "%toto%" + } + ], + "operator": "LIKE", + "oql": "(`Contact`.`name` LIKE \'%toto%\')" + } + ]', true), + 'contains' + ), + 'empty1' => array( + json_decode('[ + { + "widget": "string", + "ref": "Contact.name", + "values": [ + { + "value": "", + "label": "" + } + ], + "operator": "LIKE", + "oql": "(`Contact`.`name` LIKE \'\')" + } + ]', true), + 'empty' + ), + 'empty2' => array( + json_decode('[ + { + "widget": "string", + "ref": "Contact.name", + "values": [ + { + "value": "", + "label": "" + } + ], + "operator": "=", + "oql": "(`Contact`.`name` = \'\')" + } + ]', true), + 'empty' + ), + 'not_empty' => array( + json_decode('[ + { + "widget": "string", + "ref": "Contact.name", + "values": [ + { + "value": "", + "label": "" + } + ], + "operator": "!=", + "oql": "(`Contact`.`name` != \'\')" + } + ]', true), + 'not_empty' + ), + ); + } }