%PDF- %PDF-
| Direktori : /home1/lightco1/www/lightingrepublic.com.au/administrator/components/com_docman/models/ |
| Current File : //home1/lightco1/www/lightingrepublic.com.au/administrator/components/com_docman/models/nodes.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 ComDocmanModelNodes extends ComDocmanModelDefault
{
public function __construct(KConfig $config)
{
parent::__construct($config);
$this->_state
->remove('sort')->insert('sort', 'cmd', 'title')
->insert('parent_id', 'int')
->insert('include_self', 'boolean', false)
->insert('level', 'int');
}
/**
* Specialized to NOT use a count query since all the inner joins get confused over it
*
* @see KModelTable::getTotal()
*/
public function getTotal()
{
// Get the data if it doesn't already exist
if (!isset($this->_total)) {
if ($this->isConnected()) {
$query = $this->getTable()->getDatabase()->getQuery();
$this->_buildQueryColumns($query);
$this->_buildQueryFrom($query);
$this->_buildQueryJoins($query);
$this->_buildQueryWhere($query);
$this->_buildQueryGroup($query);
$this->_buildQueryHaving($query);
$total = count($this->getTable()->select($query, KDatabase::FETCH_FIELD_LIST));
$this->_total = $total;
}
}
return $this->_total;
}
protected function _buildQueryColumns(KDatabaseQuery $query)
{
$query->select('COUNT(crumbs.ancestor_id) AS level')
->select('GROUP_CONCAT(crumbs.ancestor_id ORDER BY crumbs.level DESC SEPARATOR \'/\') AS path');
if ($this->getTable()->hasBehavior('orderable')) {
if (!$query->count) {
$query->select('o2.custom AS ordering');
}
if (in_array($this->_state->sort, array('title', 'created_on', 'custom'))) {
$column = sprintf('GROUP_CONCAT(LPAD(`o`.`%s`, 5, \'0\') ORDER BY crumbs.level DESC SEPARATOR \'/\') AS order_path', $this->_state->sort);
$query->select($column);
}
}
parent::_buildQueryColumns($query);
}
protected function _buildQueryJoins(KDatabaseQuery $query)
{
$relation = $this->getTable()->getRelationTable();
$id_column = $this->getTable()->getIdentityColumn();
$query->join('inner', '#__'.$relation.' AS crumbs', 'crumbs.descendant_id = tbl.'.$id_column);
if ($this->getTable()->hasBehavior('orderable')) {
// This one is to have a breadcrumbs style order like 1/3/4
if (in_array($this->_state->sort, array('title', 'created_on', 'custom'))) {
$query->join('inner', '#__docman_category_orderings AS o', 'crumbs.ancestor_id = o.'.$id_column);
}
// This one is to display the custom ordering in backend
if (!$query->count) {
$query->join('left', '#__docman_category_orderings AS o2', 'tbl.'.$id_column.' = o2.'.$id_column);
}
}
if ($this->_state->parent_id) {
$query->join('inner', '#__'.$relation.' AS r', 'r.descendant_id = tbl.'.$id_column);
}
parent::_buildQueryJoins($query);
}
protected function _buildQueryWhere(KDatabaseQuery $query)
{
parent::_buildQueryWhere($query);
$state = $this->_state;
if ($state->parent_id) {
$id_column = $this->getTable()->getIdentityColumn();
$query->where('r.ancestor_id', 'IN', $state->parent_id);
if (empty($state->include_self)) {
$query->where('tbl.'.$id_column, 'NOT IN', $state->parent_id);
}
if ($state->level !== null) {
$query->where('r.level', 'IN', $state->level);
}
}
}
protected function _buildQueryGroup(KDatabaseQuery $query)
{
$query->group('tbl.'.$this->getTable()->getIdentityColumn());
parent::_buildQueryGroup($query);
}
protected function _buildQueryHaving(KDatabaseQuery $query)
{
// If we have a parent id level is set using the where clause
if (!$this->_state->parent_id && $this->_state->level !== null) {
// Query object does not support operators in having clauses
// So we need to build the string ourselves
$query->having('level IN ('.implode(',', (array) $this->_state->level).')');
}
parent::_buildQueryHaving($query);
}
protected function _buildQueryOrder(KDatabaseQuery $query)
{
$sort = 'path';
$direction = 'ASC';
// If we are fetching the immediate children of a category we can sort however we want
if ($this->_state->level == 1 && !is_null($this->_state->parent_id) && $this->_state->sort !== 'custom') {
$sort = $this->_state->sort;
$direction = $this->_state->direction;
}
elseif ($this->getTable()->hasBehavior('orderable')
&& in_array($this->_state->sort, array('title', 'created_on', 'custom'))
) {
$sort = 'order_path';
}
$query->order($sort, $direction);
}
}