Fork me on GitHub

Rapport de message :*
 

Re: Criteria is not null

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_arraystrtoupper($this->operator), array('IS NULL''IS NOT NULL')))
        {
            
$value '';
        }
        elseif (
'' === ($value trim($this->value))){
            return 
'';
        }
        elseif ( !
in_arraystrtoupper($this->operator), array('IN''NOT IN') ) ) {
            if ( ( 
substr$value0) != '`' ) && ( substr$value, -) != '`' ) ) {
                
$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'));

Propulsé avec XOOPS | Graphisme adapté par Tatane, Grosdunord, Montuy337513

67 Personne(s) en ligne (57 Personne(s) connectée(s) sur Forum) | Utilisateur(s): 0 | Invité(s): 67 | Plus ...