Вход Регистрация
Файл: 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 > 0 && (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);
    }
}
Онлайн: 2
Реклама