%PDF- %PDF-
| Direktori : /home1/lightco1/www/lightingrepublic.com.au/components/com_docman/models/ |
| Current File : //home1/lightco1/www/lightingrepublic.com.au/components/com_docman/models/default.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 ComDocmanModelDefault extends ComDefaultModelDefault
{
/**
* @var ComDocmanModelPages
*/
protected static $_pages_model;
/**
* Constructor
*
* @param KConfig $config Configuration options
*/
public function __construct(KConfig $config)
{
parent::__construct($config);
self::$_pages_model = $this->getService('com://site/docman.model.pages');
$this->_state
->insert('page', 'int')
->insert('page_conditions', 'raw', array())
->insert('current_user', 'int')
->insert('access', 'int')
->insert('status', 'cmd')
;
}
/**
* Returns all component pages
*
* @return array
*/
protected function _getPages()
{
$pages = self::$_pages_model->reset()->getList();
return $pages;
}
/**
* Returns pages that point to the list view with a root category selected
*
* @return array
*/
protected function _getCategoryPages()
{
$pages = self::$_pages_model->reset()->view('list')->getList();
foreach ($pages as $i => $page) {
if (empty($page->query['slug'])) {
unset($pages[$i]);
}
}
return $pages;
}
/**
* Returns pages that point to the list view without a root category
*
* @return array
*/
protected function _getCategoriesPages()
{
$pages = self::$_pages_model->reset()->view('list')->getList();
foreach ($pages as $i => $page) {
if (!empty($page->query['slug'])) {
unset($pages[$i]);
}
}
return $pages;
}
/**
* Finds the first available page for a row
*
* If the $row is a document, it will look for a document page first
* before looking at list view pages.
*
* @param KDatabaseRowInterface $row
*
* @return int
*/
protected function _findPage(KDatabaseRowInterface $row)
{
$itemid = 0;
$key = $row->docman_category_id ? $row->docman_category_id : $row->id;
if ($row instanceof ComDocmanDatabaseRowDocument)
{
$document_pages = self::$_pages_model->reset()->view('document')->getList();
foreach ($document_pages as $page)
{
if (!empty($this->_state->page) && !in_array($page->id, (array) $this->_state->page)) {
continue;
}
if (isset($page->query['slug']) && $row->slug === $page->query['slug']) {
$itemid = $page->id;
break;
}
}
}
if (!$itemid)
{
$category_pages = $this->_getCategoryPages();
foreach ($category_pages as $page)
{
if (!empty($this->_state->page) && !in_array($page->id, (array) $this->_state->page)) {
continue;
}
if (in_array($key, $page->children)) {
$itemid = $page->id;
break;
}
}
}
if (!$itemid && $row instanceof ComDocmanDatabaseRowDocument)
{
$documents_pages = self::$_pages_model->reset()->view('filteredlist')->getList();
foreach ($documents_pages as $page)
{
if (!empty($this->_state->page) && !in_array($page->id, (array) $this->_state->page)) {
continue;
}
$categories = (array) $page->params->get('category');
$created_by = (array) $page->params->get('created_by');
if ((empty($categories) || in_array($key, $categories))
&& (empty($created_by) || in_array($row->created_by, $created_by))
) {
$itemid = $page->id;
break;
}
}
}
if (!$itemid)
{
foreach ($this->_getCategoriesPages() as $page)
{
$itemid = $page->id;
break;
}
}
return $itemid;
}
/**
* Set the model state properties
*
* Overloaded to automatically set page_category state if page state is passed
*
* @param string|array|object $property The name of the property, an associative array or an object
* @param mixed $value The value of the property
* @return KModelTable
*/
public function set($property, $value = null)
{
$source = null;
// If the page is passed in an object or array we unset it since
// it's gonna get set by calling setPageState() method
if (!empty($property->page))
{
$source = $property->page;
unset($property->page);
}
elseif (is_array($property) && !empty($property['page']))
{
$source = $property['page'];
unset($property['page']);
}
elseif ($property === 'page')
{
$source = $value;
}
// We have a page state to handle
if ($source !== null)
{
$this->_setPageState($source);
// We already set it above in _setPageState
if ($property === 'page') {
return $this;
}
}
return parent::set($property, $value);
}
/**
* @param $pages int|array Page IDs
*/
protected function _setPageState($pages)
{
if ($pages === 'all') {
$pages = array_keys($this->_getPages());
}
// Get rid of KConfig
$pages = (array) KConfig::unbox($pages);
$conditions = array();
if ($pages)
{
$all_pages = $this->_getPages();
$categories = array();
foreach ($pages as $id)
{
if (!isset($all_pages[$id])) {
continue;
}
$page = $all_pages[$id];
if ($page->query['view'] === 'list')
{
// If we have a category view to the root category everything is reachable
if (empty($page->query['slug']))
{
$categories = array();
$conditions = array();
break;
}
$categories = array_merge($categories, $page->children);
}
elseif ($page->query['view'] === 'filteredlist')
{
$conditions[] = array('documents', array(
'created_by' => $page->params->get('created_by'),
'categories' => $page->params->get('category')
));
}
}
if ($categories) {
$conditions[] = array('categories', array_unique($categories));
}
}
parent::set('page', $pages);
parent::set('page_conditions', $conditions);
}
/**
* Method to get a item object which represents a table row
*
* Overridden to add itemid to the returned results
*
* @return KDatabaseRowInterface
*/
public function getItem()
{
$item = parent::getItem();
if ($item) {
$item->itemid = $this->_findPage($item);
}
return $item;
}
/**
* Get a list of items which represents a table rowset
*
* Overridden to add itemid to the returned results
*
* @return KDatabaseRowsetInterface
*/
public function getList()
{
$list = parent::getList();
if ($list)
{
foreach ($list as $item) {
$item->itemid = $this->_findPage($item);
}
}
return $list;
}
}