%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/lightco1/www/lightingrepublic.com.au/administrator/components/com_docman/models/
Upload File :
Create Path :
Current File : /home/lightco1/www/lightingrepublic.com.au/administrator/components/com_docman/models/documents.php

<?php
/**
 * @package    DOCman
 * @copyright   Copyright (C) 2011 - 2013 Timble CVBA (http://www.timble.net)
 * @license     GNU GPLv3 <http://www.gnu.org/licenses/gpl.html>
 * @link        http://www.joomlatools.com
 */

class ComDocmanModelDocuments extends ComDocmanModelDefault
{
    public function __construct(KConfig $config)
    {
        parent::__construct($config);

        $this->_state
            ->insert('access', 'int')
            ->insert('access_raw', 'int')
            ->insert('category', 'int')
            ->insert('category_children', 'boolean')
            ->insert('created_by', 'int')
            ->insert('enabled', 'int')
            ->insert('status', 'cmd')
            ->insert('storage_type', 'identifier')
            ->insert('storage_path', 'com://admin/files.filter.path')
            ->insert('search_path', 'com://admin/files.filter.path')
            ->insert('search_by', 'string', 'exact')
            ->insert('search_date', 'date')
            ->insert('day_range', 'int')
            ;
    }

    protected function _buildQueryColumns(KDatabaseQuery $query)
    {
        $query->select('c.title AS category_title')
            ->select('c.slug AS category_slug')
            ->select('CONCAT_WS(\'-\', tbl.docman_document_id, tbl.slug) AS alias')
            ->select('tbl.access AS access_raw')
            ->select('(CASE tbl.access WHEN -1 THEN COALESCE(c.access, 1) ELSE tbl.access END) AS access')
            ->select('creator.name AS created_by_name')
            ->select('viewlevel.title AS access_title')
            ->select('IF(tbl.publish_on = 0, tbl.created_on, tbl.publish_on) AS publish_date')
            ;

        parent::_buildQueryColumns($query);
    }

    protected function _buildQueryJoins(KDatabaseQuery $query)
    {
        $query->join('LEFT', 'docman_categories AS c', 'tbl.docman_category_id = c.docman_category_id')
            ->join('LEFT', 'users AS creator', 'tbl.created_by = creator.id')
            ->join('LEFT', 'users AS modifier', 'tbl.modified_by = modifier.id')
            ->join('LEFT', 'viewlevels AS viewlevel', '(CASE tbl.access WHEN -1 THEN COALESCE(c.access, 1) ELSE tbl.access END) = viewlevel.id');

        parent::_buildQueryJoins($query);
    }

    protected function _buildQueryWhere(KDatabaseQuery $query)
    {
        $state = $this->_state;

        $query->where('1 = 1');

        if (is_array($state->page_conditions))
        {
            $where = array();
            foreach ($state->page_conditions as $condition)
            {
                if ($condition[0] === 'categories') {
                    $cats = array_map('intval', (array) $condition[1]);
                    $where[] = sprintf('tbl.docman_category_id IN (%s)', implode(', ', $cats));
                }

                if ($condition[0] === 'documents')
                {
                    $q = array();

                    if (!empty($condition[1]['categories']))
                    {
                        $cats    = array_map('intval', (array) $condition[1]['categories']);
                        $q[] = sprintf('tbl.docman_category_id IN (%s)', implode(', ', $cats));
                    }

                    if (!empty($condition[1]['created_by']))
                    {
                        $created_by = array_map('intval', (array) $condition[1]['created_by']);
                        $q[]    = sprintf('tbl.created_by IN (%s)', implode(', ', $created_by));
                    }

                    if ($q) {
                        $where[] = '('.implode(' AND ', $q).')';
                    }
                }
            }

            if ($where) {
                $where = '('.implode(' OR ', $where).')';

                $query->where[] = array(
                    'property' => '',
                    'condition' => 'AND '.$where
                );
            }
        }

        $query->where('1 = 1');

        $this->_buildQuerySearchKeyword($query);

        parent::_buildQueryWhere($query);

        $categories = (array) $state->category;
        if ($categories)
        {
            $include_children = $state->category_children;

            if ($include_children)
            {
                $query->join('inner', 'docman_category_relations AS r', 'r.descendant_id = tbl.docman_category_id')
                    ->where('r.ancestor_id', 'IN', $categories)
                    ->group('tbl.docman_document_id');
            }
            else {
                $query->where('tbl.docman_category_id','IN', $categories);
            }
        }

        if (is_numeric($state->enabled))
        {
            $user_enabled_clause = '';
            // Logged in users see their documents regardless of the access level
            if ($state->current_user) {
                $user_enabled_clause = sprintf('(tbl.created_by = %d) OR', $state->current_user);
            }

            $enabled = implode(', ', (array) $state->enabled);
            $query->where[] = array(
                'property' => '',
                'condition' => sprintf('AND (%s (tbl.enabled IN (%d)))', $user_enabled_clause, $enabled)
            );
        }

        if ($state->search_date || $state->day_range) {
            $date = $state->search_date ? "'".$state->search_date."'" : 'NOW()';
            if ($state->day_range) {
                $query->where[] = array(
                    'property' => '',
                    'condition' => 'AND tbl.created_on BETWEEN '.sprintf('DATE_SUB(%1$s, INTERVAL %2$d DAY) AND DATE_ADD(%1$s, INTERVAL %2$d DAY)', $date, $state->day_range
                ));
            }
        }

        if ($state->status === 'published') {
            $user_status_clause = '';
            // Logged in users see their documents regardless of the published status
            if ($state->current_user) {
                $user_status_clause = sprintf('(tbl.created_by = %d) OR', $state->current_user);
            }

            $now = JFactory::getDate()->toSql();

            $query->where[] = array('property' => '', 'condition' => sprintf('AND (%s (tbl.publish_on = 0 OR tbl.publish_on <= \'%s\'))', $user_status_clause, $now));
            $query->where[] = array('property' => '', 'condition' => sprintf('AND (%s (tbl.unpublish_on = 0 OR tbl.unpublish_on >= \'%s\'))', $user_status_clause, $now));
        } elseif ($state->status === 'pending') {
            $now = JFactory::getDate()->toSql();
            $query->where[] = array('property' => '', 'condition' => 'AND '.sprintf('(tbl.publish_on <> 0 AND tbl.publish_on >= \'%s\')', $now));
        } elseif ($state->status === 'expired') {
            $now = JFactory::getDate()->toSql();
            $query->where[] = array('property' => '', 'condition' => 'AND '.sprintf('(tbl.unpublish_on <> 0 AND tbl.unpublish_on <= \'%s\')', $now));
        }

        if ($state->access)
        {
            $user_clause = '';
            // Logged in users see their documents regardless of the access level
            if ($state->current_user) {
                $user_clause = sprintf('(tbl.created_by = %d) OR', $state->current_user);
            }

            $access = implode(', ', (array) $state->access);
            $query->where[] = array(
                'property' => '',
                'condition' => sprintf('AND (%s ((CASE tbl.access WHEN -1 THEN COALESCE(c.access, 1) ELSE tbl.access END) IN (%s)))', $user_clause, $access)
            );

            $query->where[] = array(
                'property' => '',
                'condition' => sprintf('AND (%s (c.access IN (%s)))', $user_clause, $access)
            );
        }

        if ($state->created_by) {
            $query->where('tbl.created_by', 'IN', $state->created_by);
        }

        if ($state->storage_type) {
            $query->where('tbl.storage_type','IN', $state->storage_type);
        }

        if ($state->storage_path) {
            $query->where('tbl.storage_path','IN', $state->storage_path);
        }

        if ($state->search_path !== null) {
            if ($state->search_path === '') {
                $operation = 'NOT LIKE';
                $path = "%/%";
            } else {
                $operation = 'LIKE';
                $path = $state->search_path;
            }
            $query->where('tbl.storage_path', $operation, $path);
        }
    }

    protected function _buildQuerySearchKeyword(KDatabaseQuery $query)
    {
        $state = $this->_state;

        $search = $state->search;

        if (!empty($search)) {
            $search_strings = array();

            switch ($state->search_by) {
                case 'exact':
                    $operation = 'LIKE';
                    $search_strings[] = '%'.$search.'%';
                break;
                case 'any':
                    $operation = 'RLIKE';
                    $search_strings[] = implode('|', explode(' ', $search));
                break;
                case 'all':
                    $operation = 'LIKE';
                    foreach (explode(' ', $search) as $keyword) {
                        $keyword = $this->getTable()->getDatabase()->quoteValue('%'.$keyword.'%');
                        $query->where[] = array(
                            'property' => '',
                            'condition' => 'AND '.sprintf('(tbl.title LIKE %1$s OR tbl.description LIKE %1$s)', $keyword)
                        );
                    }
                break;
            }

            if (count($search_strings))
            {
                // Don't laugh! This is used instead of paranthesis for OR blocks
                // since query builder does not support them for now
                $query->where('1 = 2');

                foreach ($search_strings as $where) {
                    $this->_buildQuerySearchWhere($query, $where, $operation);
                }

                // And this closes the OR block :)
                $query->where('2 = 2');
            }
        }
    }

    protected function _buildQuerySearchWhere(KDatabaseQuery $query, $search, $operation)
    {
        $query->where('tbl.title', $operation,  $search, 'OR');
        $query->where('tbl.description', $operation,  $search, 'OR');
    }
}

Zerion Mini Shell 1.0