| Current Path : /home/zieirix/www/administrator/components/com_faqbookpro/tables/ |
| Current File : /home/zieirix/www/administrator/components/com_faqbookpro/tables/topic.php |
<?php
/**
* @title Minitek FAQ Book
* @copyright Copyright (C) 2011-2020 Minitek, All rights reserved.
* @license GNU General Public License version 3 or later.
* @author url https://www.minitek.gr/
* @developers Minitek.gr
*/
defined('_JEXEC') or die;
class FAQBookProTableTopic extends JTableNested
{
public function __construct($db)
{
parent::__construct('#__minitek_faqbook_topics', 'id', $db);
}
protected function _getAssetName()
{
$k = $this->_tbl_key;
return 'com_faqbookpro.topic.' . (int) $this->$k;
}
protected function _getAssetTitle()
{
return $this->title;
}
protected function _getAssetParentId(JTable $table = null, $id = null)
{
$assetId = null;
// This is a topic under a topic.
if ($this->parent_id > 1)
{
// Build the query to get the asset id for the parent topic.
$query = $this->_db->getQuery(true)
->select($this->_db->quoteName('asset_id'))
->from($this->_db->quoteName('#__minitek_faqbook_topics'))
->where($this->_db->quoteName('id') . ' = ' . $this->parent_id);
// Get the asset id from the database.
$this->_db->setQuery($query);
if ($result = $this->_db->loadResult())
{
$assetId = (int) $result;
}
}
// This is a topic that needs to parent with the parent section.
elseif ($assetId === null)
{
// Build the query to get the asset id for the parent section.
$query = $this->_db->getQuery(true)
->select($this->_db->quoteName('asset_id'))
->from($this->_db->quoteName('#__minitek_faqbook_sections'))
->where($this->_db->quoteName('id') . ' = ' . $this->section_id);
// Get the asset id from the database.
$this->_db->setQuery($query);
if ($result = $this->_db->loadResult())
{
$assetId = (int) $result;
}
}
// Return the asset id.
if ($assetId)
{
return $assetId;
}
else
{
return parent::_getAssetParentId($table, $id);
}
}
public function check()
{
// Check for a title.
if (trim($this->title) == '')
{
$this->setError(JText::_('COM_FAQBOOKPRO_ERROR_TOPIC_MUST_HAVE_A_TITLE'));
return false;
}
$this->alias = trim($this->alias);
if (empty($this->alias))
{
$this->alias = $this->title;
}
$this->alias = JApplication::stringURLSafe($this->alias);
if (trim(str_replace('-', '', $this->alias)) == '')
{
$this->alias = JFactory::getDate()->format('Y-m-d-H-i-s');
}
return true;
}
public function bind($array, $ignore = '')
{
if (isset($array['params']) && is_array($array['params']))
{
$registry = new JRegistry;
$registry->loadArray($array['params']);
$array['params'] = (string) $registry;
}
if (isset($array['metadata']) && is_array($array['metadata']))
{
$registry = new JRegistry;
$registry->loadArray($array['metadata']);
$array['metadata'] = (string) $registry;
}
// Bind the rules.
if (isset($array['rules']) && is_array($array['rules']))
{
$rules = new JAccessRules($array['rules']);
$this->setRules($rules);
}
return parent::bind($array, $ignore);
}
public function store($updateNulls = false)
{
$date = JFactory::getDate();
$user = JFactory::getUser();
if ($this->id)
{
// Existing topic
$this->modified_time = $date->toSql();
$this->modified_user_id = $user->get('id');
}
else
{
// New topic
$this->created_time = $date->toSql();
$this->created_user_id = $user->get('id');
}
// Verify that the alias is unique within this section and parent topic
$table = JTable::getInstance('Topic', 'FAQBookProTable', array('dbo' => $this->getDbo()));
if ($table->load(array('alias' => $this->alias, 'parent_id' => $this->parent_id, 'section_id' => $this->section_id))
&& ($table->id != $this->id || $this->id == 0))
{
$this->setError(JText::_('COM_FAQBOOKPRO_ERROR_TOPIC_UNIQUE_ALIAS'));
return false;
}
return parent::store($updateNulls);
}
public function setLocation($referenceId, $position = 'after')
{
// Make sure the location is valid.
if (($position != 'before') && ($position != 'after') && ($position != 'first-child') && ($position != 'last-child'))
{
throw new InvalidArgumentException(sprintf('%s::setLocation(%d, *%s*)', get_class($this), $referenceId, $position));
}
// Set the location properties.
$this->_location = $position;
$this->_location_id = $referenceId;
}
public function rebuild($parentId = null, $leftId = 0, $level = 0, $path = '')
{
// If no parent is provided, try to find it.
if ($parentId === null)
{
// Get the root item.
$parentId = $this->getRootId();
if ($parentId === false)
{
return false;
}
}
$query = $this->_db->getQuery(true);
// Build the structure of the recursive query.
if (!isset($this->_cache['rebuild.sql']))
{
$query->clear()
->select($this->_tbl_key . ', alias')
->from($this->_tbl)
->where('parent_id = %d');
// If the table has an ordering field, use that for ordering.
if (property_exists($this, 'ordering'))
{
$query->order('parent_id, ordering, lft');
}
else
{
$query->order('parent_id, lft');
}
$this->_cache['rebuild.sql'] = (string) $query;
}
// Make a shortcut to database object.
// Assemble the query to find all children of this node.
$this->_db->setQuery(sprintf($this->_cache['rebuild.sql'], (int) $parentId));
$children = $this->_db->loadObjectList();
// The right value of this node is the left value + 1
$rightId = $leftId + 1;
// Execute this function recursively over all children
foreach ($children as $node)
{
$rightId = $this->rebuild($node->{$this->_tbl_key}, $rightId, $level + 1, $path . (empty($path) ? '' : '/') . $node->alias);
// If there is an update failure, return false to break out of the recursion.
if ($rightId === false)
{
return false;
}
}
// We've got the left value, and now that we've processed
// the children of this node we also know the right value.
$query->clear()
->update($this->_tbl)
->set('lft = ' . (int) $leftId)
->set('rgt = ' . (int) $rightId)
->set('level = ' . (int) $level)
->set('path = ' . $this->_db->quote($path))
->where($this->_tbl_key . ' = ' . (int) $parentId);
$this->_db->setQuery($query)->execute();
// Return the right value of this node + 1.
return $rightId + 1;
}
public function rebuildPath($pk = null)
{
$fields = $this->getFields();
// If there is no alias or path field, just return true.
if (!array_key_exists('alias', $fields) || !array_key_exists('path', $fields))
{
return true;
}
$k = $this->_tbl_key;
$pk = (is_null($pk)) ? $this->$k : $pk;
// Get the aliases for the path from the node to the root node.
$query = $this->_db->getQuery(true)
->select('p.alias')
->from($this->_tbl . ' AS n, ' . $this->_tbl . ' AS p')
->where('n.lft BETWEEN p.lft AND p.rgt')
->where('n.' . $this->_tbl_key . ' = ' . (int) $pk)
->order('p.lft');
$this->_db->setQuery($query);
$segments = $this->_db->loadColumn();
// Make sure to remove the root path if it exists in the list.
if ($segments[0] == 'root')
{
array_shift($segments);
}
// Build the path.
$path = trim(implode('/', $segments), ' /\\');
// Update the path field for the node.
$query->clear()
->update($this->_tbl)
->set('path = ' . $this->_db->quote($path))
->where($this->_tbl_key . ' = ' . (int) $pk);
$this->_db->setQuery($query)->execute();
// Update the current record's path to the new one:
$this->path = $path;
return true;
}
public function delete($pk = null, $children = false)
{
return parent::delete($pk, $children);
}
}