Вход Регистрация
Файл: concrete5.7.5.6/concrete/src/Legacy/DatabaseItemList.php
Строк: 168
<?php

namespace ConcreteCoreLegacy;

class 
DatabaseItemList extends ItemList
{
    protected 
$query '';
    protected 
$userQuery '';
    protected 
$debug false;
    protected 
$filters = array();
    protected 
$sortByString '';
    protected 
$groupByString '';
    protected 
$havingString '';
    protected 
$autoSortColumns = array();
    protected 
$userPostQuery '';
    protected 
$attributeClass '';

    public function 
getTotal()
    {
        if (
$this->total == -1) {
            
$db Loader::db();
            
$arr $this->executeBase(); // returns an associated array of query/placeholder values
            
$r $db->Execute($arr);
            
$this->total $r->NumRows();
        }

        return 
$this->total;
    }

    public function 
debug($dbg true)
    {
        
$this->debug $dbg;
    }

    protected function 
setQuery($query)
    {
        
$this->query $query ' ';
    }

    protected function 
getQuery()
    {
        return 
$this->query;
    }

    public function 
addToQuery($query)
    {
        
$this->userQuery .= $query ' ';
    }

    protected function 
setupAutoSort()
    {
        if (
count($this->autoSortColumns) > 0) {
            
$req $this->getSearchRequest();
            if (
                isset(
$req[$this->queryStringSortVariable])
                &&
                
in_array($req[$this->queryStringSortVariable], $this->autoSortColumns)
            ) {
                
$this->sortBy($req[$this->queryStringSortVariable], $req[$this->queryStringSortDirectionVariable]);
            }
        }
    }

    protected function 
executeBase()
    {
        
$db Loader::db();
        
$q $this->query $this->userQuery ' where 1=1 ';
        foreach (
$this->filters as $f) {
            
$column $f[0];
            
$comp $f[2];
            
$value $f[1];
            
// if there is NO column, then we have a free text filter that we just add on
            
if ($column == false || $column == '') {
                
$q .= 'and ' $f[1] . ' ';
            } else {
                if (
is_array($value)) {
                    if (
count($value) > 0) {
                        switch (
$comp) {
                            case 
'=':
                                
$comp 'in';
                                break;
                            case 
'!=':
                                
$comp 'not in';
                                break;
                        }
                        
$q .= 'and ' $column ' ' $comp ' (';
                        for (
$i 0$i count($value); $i++) {
                            if (
$i 0) {
                                
$q .= ',';
                            }
                            
$q .= $db->quote($value[$i]);
                        }
                        
$q .= ') ';
                    } else {
                        
$q .= 'and 1 = 2 ';
                    }
                } else {
                    
$comp = (is_null($value) && stripos($comp'is') === false) ? (($comp == '!=' || $comp == '<>') ? 'IS NOT' 'IS') : $comp;
                    
$q .= 'and ' $column ' ' $comp ' ' $db->quote($value) . ' ';
                }
            }
        }

        if (
$this->userPostQuery != '') {
            
$q .= ' ' $this->userPostQuery ' ';
        }

        if (
$this->groupByString != '') {
            
$q .= 'group by ' $this->groupByString ' ';
        }

        if (
$this->havingString != '') {
            
$q .= 'having ' $this->havingString ' ';
        }

        return 
$q;
    }

    protected function 
setupSortByString()
    {
        if (
$this->sortByString == '' && $this->sortBy != '') {
            
$this->sortByString $this->sortBy ' ' $this->sortByDirection;
        }
    }

    protected function 
setupAttributeSort()
    {
        if (
$this->attributeClass && is_callable(array($this->attributeClass'getList'))) {
            
$l call_user_func(array($this->attributeClass'getList'));
            foreach (
$l as $ak) {
                
$this->autoSortColumns[] = 'ak_' $ak->getAttributeKeyHandle();
            }
            if (
$this->sortBy != '' && in_array('ak_' $this->sortBy$this->autoSortColumns)) {
                
$this->sortBy 'ak_' $this->sortBy;
            }
        }
    }

    
/**
     * Returns an array of whatever objects extends this class (e.g. PageList returns a list of pages).
     */
    
public function get($itemsToGet 0$offset 0)
    {
        
$q $this->executeBase();
        
// handle order by
        
$this->setupAttributeSort();
        
$this->setupAutoSort();
        
$this->setupSortByString();

        if (
$this->sortByString != '') {
            
$q .= 'order by ' $this->sortByString ' ';
        }
        if (
$this->itemsPerPage && (intval($itemsToGet) || intval($offset))) {
            
$q .= 'limit ' $offset ',' $itemsToGet ' ';
        }

        
$db Loader::db();
        
$resp $db->GetAll($q);

        
$this->start $offset;

        return 
$resp;
    }

    
/**
     * Adds a filter to this item list.
     */
    
public function filter($column$value$comparison '=')
    {
        
$foundFilterIndex = -1;
        if (
$column) {
            foreach (
$this->filters as $key => $info) {
                if (
$info[0] == $column) {
                    
$foundFilterIndex $key;
                    break;
                }
            }
        }

        if (
$foundFilterIndex > -1) {
            
$this->filters[$foundFilterIndex] = array($column$value$comparison);
        } else {
            
$this->filters[] = array($column$value$comparison);
        }
    }

    public function 
getSearchResultsClass($field)
    {
        if (
$field instanceof AttributeKey) {
            
$field 'ak_' $field->getAttributeKeyHandle();
        }

        return 
parent::getSearchResultsClass($field);
    }

    public function 
sortBy($key$dir 'asc')
    {
        if (
$key instanceof AttributeKey) {
            
$key 'ak_' $key->getAttributeKeyHandle();
        }
        
parent::sortBy($key$dir);
    }

    public function 
groupBy($key)
    {
        if (
$key instanceof AttributeKey) {
            
$key 'ak_' $key->getAttributeKeyHandle();
        }
        
$this->groupByString $key;
    }

    public function 
having($column$value$comparison '=')
    {
        if (
$column == false) {
            
$this->havingString $value;
        } else {
            
$this->havingString $column ' ' $comparison ' ' $value;
        }
    }

    public function 
getSortByURL($column$dir 'asc'$baseURL false$additionalVars = array())
    {
        if (
$column instanceof AttributeKey) {
            
$column 'ak_' $column->getAttributeKeyHandle();
        }

        return 
parent::getSortByURL($column$dir$baseURL$additionalVars);
    }

    protected function 
setupAttributeFilters($join)
    {
        
$i 1;
        
$this->addToQuery($join);
        foreach (
$this->attributeFilters as $caf) {
            
$this->filter($caf[0], $caf[1], $caf[2]);
        }
    }

    public function 
filterByAttribute($column$value$comparison '=')
    {
        if (
is_array($column)) {
            
$column $column[key($column)] . '_' key($column);
        }
        
$this->attributeFilters[] = array('ak_' $column$value$comparison);
    }
}
Онлайн: 3
Реклама