I just wanted to add between and null condition to filter data in all gridviews across entire app and as it was a simple alteration of compare method of CDbCriteria I enjoy to share it with others
class RmDbCriteria extends CDbCriteria
{
public function compare($column, $value, $partialMatch=false, $operator='AND', $escape=true, $nullSign='null', $betweenSign='-')
{
if(is_array($value))
{
if($value===array())
return $this;
return $this->addInCondition($column,$value,$operator);
}
else
$value="$value";
if(preg_match('/^(?:\s*([\w\d\s]*)(<>|<=|>=|<|>|=|'.$betweenSign.'))?(.*)$/',$value,$matches))
{
$value1=$matches[1];
$value=$matches[3];
$op=$matches[2];
}
else
$op='';
if($value==='')
return $this;
if($partialMatch)
{
if($value==$nullSign)
{
$this->addCondition($column.' is null');
return $this;
}
if($op==='')
return $this->addSearchCondition($column,$value,$escape,$operator);
if($op==='<>')
return $this->addSearchCondition($column,$value,$escape,$operator,'NOT LIKE');
}
else if($op==='')
$op='=';
if($op==$betweenSign)
{
$this->addBetweenCondition($column,$value1,$value);
return $this;
}
if($value==$nullSign && $nullSign!='0')
{
$this->addCondition($column.' is null');
return $this;
}
if($nullSign=='0')
{
$column='IFNULL('.$column.',0)';
}
$this->addCondition($column.$op.self::PARAM_PREFIX.self::$paramCount,$operator);
$this->params[self::PARAM_PREFIX.self::$paramCount++]=$value;
return $this;
}
}
with this in place you can filter between two values in gridview by "-" (or your desired charachter)
eg: 5-10 means >=5 and <=10
you can filter null values as well
and if you set nullSign as zero it treats null as zero