Titre du sujet : Re: Criteria is not null par garrath sur 28/08/2006 22:29:21
Ca marche chez moi de cette façon. Pour moi IS NULL ou IS NOT NULL sont des operateurs donc j'ai modifié la classe criteria pour que cela soit pris comme tel (je mets tout le fichier criteria et pas que la methode render car j'ai modifie un truc aussi ailleurs)
<?php
// $Id: criteria.php 558 2006-06-20 06:35:23Z skalpa $
// ------------------------------------------------------------------------ //
// XOOPS - PHP Content Management System //
// Copyright (c) 2000 XOOPS.org //
// <http://www.xoops.org/> ... nbsp; //
// ------------------------------------------------------------------------ //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation; either version 2 of the License, or //
// (at your option) any later version. //
// //
// You may not change or alter any portion of this comment or credits //
// of supporting developers from this source code or any supporting //
// source code which is considered copyrighted (c) material of the //
// original comment or credit authors. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program; if not, write to the Free Software //
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //
// ------------------------------------------------------------------------ //
// Author: Kazumi Ono (AKA onokazu) //
// URL: http://www.myweb.ne.jp/, http://www.xoops.org/, http://jp.xoops.org/ //
// Project: The XOOPS Project //
// ------------------------------------------------------------------------- //
// Modified by: Nathan Dial //
// Date: 20 March 2003 //
// Desc: added experimental LDAP filter generation code //
// also refactored to remove about 20 lines of redundant code. //
// ------------------------------------------------------------------------- //
// Modified by: Lionel FORTE Aka Garrath //
// Date: 28 Aout 2006 //
// Desc: added IS NULL and IS NOT NULL test //
// ------------------------------------------------------------------------- //
/**
*
*
* @package kernel
* @subpackage database
*
* @author Kazumi Ono <onokazu@xoops.org>
* @copyright copyright (c) 2000-2003 XOOPS.org
*/
/**
* A criteria (grammar?) for a database query.
*
* Abstract base class should never be instantiated directly.
*
* @abstract
*
* @package kernel
* @subpackage database
*
* @author Kazumi Ono <onokazu@xoops.org>
* @copyright copyright (c) 2000-2003 XOOPS.org
*/
class CriteriaElement
{
/**
* Sort order
* @var string
*/
var $order = 'ASC';
/**
* @var string
*/
var $sort = '';
/**
* Number of records to retrieve
* @var int
*/
var $limit = 0;
/**
* Offset of first record
* @var int
*/
var $start = 0;
/**
* @var string
*/
var $groupby = '';
/**
* Constructor
**/
function CriteriaElement()
{
}
/**
* Render the criteria element
*/
function render()
{
}
/**#@+
* Accessor
*/
/**
* @param string $sort
*/
function setSort($sort)
{
$this->sort = $sort;
}
/**
* @return string
*/
function getSort()
{
return $this->sort;
}
/**
* @param string $order
*/
function setOrder($order)
{
if ('DESC' == strtoupper($order)) {
$this->order = 'DESC';
}
}
/**
* @return string
*/
function getOrder()
{
return $this->order;
}
/**
* @param int $limit
*/
function setLimit($limit=0)
{
$this->limit = intval($limit);
}
/**
* @return int
*/
function getLimit()
{
return $this->limit;
}
/**
* @param int $start
*/
function setStart($start=0)
{
$this->start = intval($start);
}
/**
* @return int
*/
function getStart()
{
return $this->start;
}
/**
* @param string $group
*/
function setGroupby($group){
$this->groupby = $group;
}
/**
* @return string
*/
function getGroupby(){
return ' GROUP BY '.$this->groupby;
}
/**#@-*/
}
/**
* Collection of multiple {@link CriteriaElement}s
*
* @package kernel
* @subpackage database
*
* @author Kazumi Ono <onokazu@xoops.org>
* @copyright copyright (c) 2000-2003 XOOPS.org
*/
class CriteriaCompo extends CriteriaElement
{
/**
* The elements of the collection
* @var array Array of {@link CriteriaElement} objects
*/
var $criteriaElements = array();
/**
* Conditions
* @var array
*/
var $conditions = array();
/**
* Constructor
*
* @param object $ele
* @param string $condition
**/
function CriteriaCompo($ele=null, $condition='AND')
{
if (isset($ele) && is_object($ele)) {
$this->add($ele, $condition);
}
}
/**
* Add an element
*
* @param object &$criteriaElement
* @param string $condition
*
* @return object reference to this collection
**/
function &add(&$criteriaElement, $condition='AND')
{
$this->criteriaElements[] =& $criteriaElement;
$this->conditions[] = $condition;
return $this;
}
/**
* Make the criteria into a query string
*
* @return string
*/
function render()
{
$ret = '';
$count = count($this->criteriaElements);
if ($count > 0) {
$ret = '('. $this->criteriaElements[0]->render();
for ($i = 1; $i < $count; $i++) {
// Garrath 28/08/2006
// Correction au cas ou criteriaElements[$i]->render()
// ne ramene rien pas la peine de mettre le AND ou OR
$critere = $this->criteriaElements[$i]->render();
if ($critere)
$ret .= ' '.$this->conditions[$i].' '.$critere;
}
$ret .= ')';
}
return $ret;
}
/**
* Make the criteria into a SQL "WHERE" clause
*
* @return string
*/
function renderWhere()
{
$ret = $this->render();
$ret = ($ret != '') ? 'WHERE ' . $ret : $ret;
return $ret;
}
/**
* Generate an LDAP filter from criteria
*
* @return string
* @author Nathan Dial ndial@trillion21.com
*/
function renderLdap(){
$retval = '';
$count = count($this->criteriaElements);
if ($count > 0) {
$retval = $this->criteriaElements[0]->renderLdap();
for ($i = 1; $i < $count; $i++) {
$cond = $this->conditions[$i];
if(strtoupper($cond) == 'AND'){
$op = '&';
} elseif (strtoupper($cond)=='OR'){
$op = '|';
}
$retval = "($op$retval" . $this->criteriaElements[$i]->renderLdap().")";
}
}
return $retval;
}
}
/**
* A single criteria
*
* @package kernel
* @subpackage database
*
* @author Kazumi Ono <onokazu@xoops.org>
* @copyright copyright (c) 2000-2003 XOOPS.org
*/
class Criteria extends CriteriaElement
{
/**
* @var string
*/
var $prefix;
var $function;
var $column;
var $operator;
var $value;
/**
* Constructor
*
* @param string $column
* @param string $value
* @param string $operator
**/
function Criteria($column, $value='', $operator='=', $prefix = '', $function = '') {
$this->prefix = $prefix;
$this->function = $function;
$this->column = $column;
$this->value = $value;
$this->operator = $operator;
}
/**
* Make a sql condition string
*
* @return string
**/
function render() {
// Garrath 28/08/2006
// Rajout test sur IS NULL ou IS NOT NULL
if ( in_array( strtoupper($this->operator), array('IS NULL', 'IS NOT NULL')))
{
$value = '';
}
elseif ('' === ($value = trim($this->value))){
return '';
}
elseif ( !in_array( strtoupper($this->operator), array('IN', 'NOT IN') ) ) {
if ( ( substr( $value, 0, 1 ) != '`' ) && ( substr( $value, -1 ) != '`' ) ) {
$value = "'$value'";
} elseif ( !preg_match( '/^[a-zA-Z0-9_.-`]*$/', $value ) ) {
$value = '``';
}
}
$clause = (!empty($this->prefix) ? "{$this->prefix}." : "") . $this->column;
if ( !empty($this->function) ) {
$clause = sprintf($this->function, $clause);
}
$clause .= " {$this->operator} $value";
return $clause;
}
/**
* Generate an LDAP filter from criteria
*
* @return string
* @author Nathan Dial ndial@trillion21.com, improved by Pierre-Eric MENUET pemen@sourceforge.net
*/
function renderLdap(){
if ($this->operator == '>') {
$this->operator = '>=';
}
if ($this->operator == '<') {
$this->operator = '<=';
}
if ($this->operator == '!=' || $this->operator == '<>') {
$operator = '=';
$clause = "(!(" . $this->column . $operator . $this->value . "))";
}
else {
if ($this->operator == 'IN') {
$newvalue = str_replace(array('(',')'),'',
$this->value);
$tab = explode(',',$newvalue);
foreach ($tab as $uid)
{
$clause .= '(' . $this->column . '=' . $uid
.')';
}
$clause = '(|' . $clause . ')';
}
else {
$clause = "(" . $this->column . $this->operator . $this->value . ")";
}
}
return $clause;
}
/**
* Make a SQL "WHERE" clause
*
* @return string
*/
function renderWhere() {
$cond = $this->render();
return empty($cond) ? '' : "WHERE $cond";
}
}
?>
a utiliser comme cela :
$criteria->add (new criteria('fax', '', 'is not null'));
|