You've already forked joomla_test
first commit
This commit is contained in:
930
administrator/components/com_finder/helpers/indexer/adapter.php
Normal file
930
administrator/components/com_finder/helpers/indexer/adapter.php
Normal file
@ -0,0 +1,930 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_finder
|
||||
*
|
||||
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
|
||||
* @license GNU General Public License version 2 or later; see LICENSE
|
||||
*/
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
JLoader::register('FinderIndexer', __DIR__ . '/indexer.php');
|
||||
JLoader::register('FinderIndexerHelper', __DIR__ . '/helper.php');
|
||||
JLoader::register('FinderIndexerResult', __DIR__ . '/result.php');
|
||||
JLoader::register('FinderIndexerTaxonomy', __DIR__ . '/taxonomy.php');
|
||||
|
||||
/**
|
||||
* Prototype adapter class for the Finder indexer package.
|
||||
*
|
||||
* @package Joomla.Administrator
|
||||
* @subpackage com_finder
|
||||
* @since 2.5
|
||||
*/
|
||||
abstract class FinderIndexerAdapter extends JPlugin
|
||||
{
|
||||
/**
|
||||
* The context is somewhat arbitrary but it must be unique or there will be
|
||||
* conflicts when managing plugin/indexer state. A good best practice is to
|
||||
* use the plugin name suffix as the context. For example, if the plugin is
|
||||
* named 'plgFinderContent', the context could be 'Content'.
|
||||
*
|
||||
* @var string
|
||||
* @since 2.5
|
||||
*/
|
||||
protected $context;
|
||||
|
||||
/**
|
||||
* The extension name.
|
||||
*
|
||||
* @var string
|
||||
* @since 2.5
|
||||
*/
|
||||
protected $extension;
|
||||
|
||||
/**
|
||||
* The sublayout to use when rendering the results.
|
||||
*
|
||||
* @var string
|
||||
* @since 2.5
|
||||
*/
|
||||
protected $layout;
|
||||
|
||||
/**
|
||||
* The mime type of the content the adapter indexes.
|
||||
*
|
||||
* @var string
|
||||
* @since 2.5
|
||||
*/
|
||||
protected $mime;
|
||||
|
||||
/**
|
||||
* The access level of an item before save.
|
||||
*
|
||||
* @var integer
|
||||
* @since 2.5
|
||||
*/
|
||||
protected $old_access;
|
||||
|
||||
/**
|
||||
* The access level of a category before save.
|
||||
*
|
||||
* @var integer
|
||||
* @since 2.5
|
||||
*/
|
||||
protected $old_cataccess;
|
||||
|
||||
/**
|
||||
* The type of content the adapter indexes.
|
||||
*
|
||||
* @var string
|
||||
* @since 2.5
|
||||
*/
|
||||
protected $type_title;
|
||||
|
||||
/**
|
||||
* The type id of the content.
|
||||
*
|
||||
* @var integer
|
||||
* @since 2.5
|
||||
*/
|
||||
protected $type_id;
|
||||
|
||||
/**
|
||||
* The database object.
|
||||
*
|
||||
* @var object
|
||||
* @since 2.5
|
||||
*/
|
||||
protected $db;
|
||||
|
||||
/**
|
||||
* The table name.
|
||||
*
|
||||
* @var string
|
||||
* @since 2.5
|
||||
*/
|
||||
protected $table;
|
||||
|
||||
/**
|
||||
* The indexer object.
|
||||
*
|
||||
* @var FinderIndexer
|
||||
* @since 3.0
|
||||
*/
|
||||
protected $indexer;
|
||||
|
||||
/**
|
||||
* The field the published state is stored in.
|
||||
*
|
||||
* @var string
|
||||
* @since 2.5
|
||||
*/
|
||||
protected $state_field = 'state';
|
||||
|
||||
/**
|
||||
* Method to instantiate the indexer adapter.
|
||||
*
|
||||
* @param object &$subject The object to observe.
|
||||
* @param array $config An array that holds the plugin configuration.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
public function __construct(&$subject, $config)
|
||||
{
|
||||
// Get the database object.
|
||||
$this->db = JFactory::getDbo();
|
||||
|
||||
// Call the parent constructor.
|
||||
parent::__construct($subject, $config);
|
||||
|
||||
// Get the type id.
|
||||
$this->type_id = $this->getTypeId();
|
||||
|
||||
// Add the content type if it doesn't exist and is set.
|
||||
if (empty($this->type_id) && !empty($this->type_title))
|
||||
{
|
||||
$this->type_id = FinderIndexerHelper::addContentType($this->type_title, $this->mime);
|
||||
}
|
||||
|
||||
// Check for a layout override.
|
||||
if ($this->params->get('layout'))
|
||||
{
|
||||
$this->layout = $this->params->get('layout');
|
||||
}
|
||||
|
||||
// Get the indexer object
|
||||
$this->indexer = FinderIndexer::getInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the adapter state and push it into the indexer.
|
||||
*
|
||||
* @return boolean True on success.
|
||||
*
|
||||
* @since 2.5
|
||||
* @throws Exception on error.
|
||||
*/
|
||||
public function onStartIndex()
|
||||
{
|
||||
|
||||
// Get the indexer state.
|
||||
$iState = FinderIndexer::getState();
|
||||
|
||||
// Get the number of content items.
|
||||
$total = (int) $this->getContentCount();
|
||||
|
||||
// Add the content count to the total number of items.
|
||||
$iState->totalItems += $total;
|
||||
|
||||
// Populate the indexer state information for the adapter.
|
||||
$iState->pluginState[$this->context]['total'] = $total;
|
||||
$iState->pluginState[$this->context]['offset'] = 0;
|
||||
|
||||
// Set the indexer state.
|
||||
FinderIndexer::setState($iState);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to prepare for the indexer to be run. This method will often
|
||||
* be used to include dependencies and things of that nature.
|
||||
*
|
||||
* @return boolean True on success.
|
||||
*
|
||||
* @since 2.5
|
||||
* @throws Exception on error.
|
||||
*/
|
||||
public function onBeforeIndex()
|
||||
{
|
||||
// Get the indexer and adapter state.
|
||||
$iState = FinderIndexer::getState();
|
||||
$aState = $iState->pluginState[$this->context];
|
||||
|
||||
// Check the progress of the indexer and the adapter.
|
||||
if ($iState->batchOffset == $iState->batchSize || $aState['offset'] == $aState['total'])
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// Run the setup method.
|
||||
return $this->setup();
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to index a batch of content items. This method can be called by
|
||||
* the indexer many times throughout the indexing process depending on how
|
||||
* much content is available for indexing. It is important to track the
|
||||
* progress correctly so we can display it to the user.
|
||||
*
|
||||
* @return boolean True on success.
|
||||
*
|
||||
* @since 2.5
|
||||
* @throws Exception on error.
|
||||
*/
|
||||
public function onBuildIndex()
|
||||
{
|
||||
// Get the indexer and adapter state.
|
||||
$iState = FinderIndexer::getState();
|
||||
$aState = $iState->pluginState[$this->context];
|
||||
|
||||
// Check the progress of the indexer and the adapter.
|
||||
if ($iState->batchOffset == $iState->batchSize || $aState['offset'] == $aState['total'])
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// Get the batch offset and size.
|
||||
$offset = (int) $aState['offset'];
|
||||
$limit = (int) ($iState->batchSize - $iState->batchOffset);
|
||||
|
||||
// Get the content items to index.
|
||||
$items = $this->getItems($offset, $limit);
|
||||
|
||||
// Iterate through the items and index them.
|
||||
for ($i = 0, $n = count($items); $i < $n; $i++)
|
||||
{
|
||||
// Index the item.
|
||||
$this->index($items[$i]);
|
||||
|
||||
// Adjust the offsets.
|
||||
$offset++;
|
||||
$iState->batchOffset++;
|
||||
$iState->totalItems--;
|
||||
}
|
||||
|
||||
// Update the indexer state.
|
||||
$aState['offset'] = $offset;
|
||||
$iState->pluginState[$this->context] = $aState;
|
||||
FinderIndexer::setState($iState);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to change the value of a content item's property in the links
|
||||
* table. This is used to synchronize published and access states that
|
||||
* are changed when not editing an item directly.
|
||||
*
|
||||
* @param string $id The ID of the item to change.
|
||||
* @param string $property The property that is being changed.
|
||||
* @param integer $value The new value of that property.
|
||||
*
|
||||
* @return boolean True on success.
|
||||
*
|
||||
* @since 2.5
|
||||
* @throws Exception on database error.
|
||||
*/
|
||||
protected function change($id, $property, $value)
|
||||
{
|
||||
// Check for a property we know how to handle.
|
||||
if ($property !== 'state' && $property !== 'access')
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// Get the url for the content id.
|
||||
$item = $this->db->quote($this->getUrl($id, $this->extension, $this->layout));
|
||||
|
||||
// Update the content items.
|
||||
$query = $this->db->getQuery(true)
|
||||
->update($this->db->quoteName('#__finder_links'))
|
||||
->set($this->db->quoteName($property) . ' = ' . (int) $value)
|
||||
->where($this->db->quoteName('url') . ' = ' . $item);
|
||||
$this->db->setQuery($query);
|
||||
$this->db->execute();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to index an item.
|
||||
*
|
||||
* @param FinderIndexerResult $item The item to index as a FinderIndexerResult object.
|
||||
*
|
||||
* @return boolean True on success.
|
||||
*
|
||||
* @since 2.5
|
||||
* @throws Exception on database error.
|
||||
*/
|
||||
abstract protected function index(FinderIndexerResult $item);
|
||||
|
||||
/**
|
||||
* Method to reindex an item.
|
||||
*
|
||||
* @param integer $id The ID of the item to reindex.
|
||||
*
|
||||
* @return boolean True on success.
|
||||
*
|
||||
* @since 2.5
|
||||
* @throws Exception on database error.
|
||||
*/
|
||||
protected function reindex($id)
|
||||
{
|
||||
// Run the setup method.
|
||||
$this->setup();
|
||||
|
||||
// Get the item.
|
||||
$item = $this->getItem($id);
|
||||
|
||||
// Index the item.
|
||||
$this->index($item);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to remove an item from the index.
|
||||
*
|
||||
* @param string $id The ID of the item to remove.
|
||||
*
|
||||
* @return boolean True on success.
|
||||
*
|
||||
* @since 2.5
|
||||
* @throws Exception on database error.
|
||||
*/
|
||||
protected function remove($id)
|
||||
{
|
||||
// Get the item's URL
|
||||
$url = $this->db->quote($this->getUrl($id, $this->extension, $this->layout));
|
||||
|
||||
// Get the link ids for the content items.
|
||||
$query = $this->db->getQuery(true)
|
||||
->select($this->db->quoteName('link_id'))
|
||||
->from($this->db->quoteName('#__finder_links'))
|
||||
->where($this->db->quoteName('url') . ' = ' . $url);
|
||||
$this->db->setQuery($query);
|
||||
$items = $this->db->loadColumn();
|
||||
|
||||
// Check the items.
|
||||
if (empty($items))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// Remove the items.
|
||||
foreach ($items as $item)
|
||||
{
|
||||
$this->indexer->remove($item);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to setup the adapter before indexing.
|
||||
*
|
||||
* @return boolean True on success, false on failure.
|
||||
*
|
||||
* @since 2.5
|
||||
* @throws Exception on database error.
|
||||
*/
|
||||
abstract protected function setup();
|
||||
|
||||
/**
|
||||
* Method to update index data on category access level changes
|
||||
*
|
||||
* @param JTable $row A JTable object
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function categoryAccessChange($row)
|
||||
{
|
||||
$query = clone($this->getStateQuery());
|
||||
$query->where('c.id = ' . (int) $row->id);
|
||||
|
||||
// Get the access level.
|
||||
$this->db->setQuery($query);
|
||||
$items = $this->db->loadObjectList();
|
||||
|
||||
// Adjust the access level for each item within the category.
|
||||
foreach ($items as $item)
|
||||
{
|
||||
// Set the access level.
|
||||
$temp = max($item->access, $row->access);
|
||||
|
||||
// Update the item.
|
||||
$this->change((int) $item->id, 'access', $temp);
|
||||
|
||||
// Reindex the item
|
||||
$this->reindex($row->id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to update index data on category access level changes
|
||||
*
|
||||
* @param array $pks A list of primary key ids of the content that has changed state.
|
||||
* @param integer $value The value of the state that the content has been changed to.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function categoryStateChange($pks, $value)
|
||||
{
|
||||
/*
|
||||
* The item's published state is tied to the category
|
||||
* published state so we need to look up all published states
|
||||
* before we change anything.
|
||||
*/
|
||||
foreach ($pks as $pk)
|
||||
{
|
||||
$query = clone($this->getStateQuery());
|
||||
$query->where('c.id = ' . (int) $pk);
|
||||
|
||||
// Get the published states.
|
||||
$this->db->setQuery($query);
|
||||
$items = $this->db->loadObjectList();
|
||||
|
||||
// Adjust the state for each item within the category.
|
||||
foreach ($items as $item)
|
||||
{
|
||||
// Translate the state.
|
||||
$temp = $this->translateState($item->state, $value);
|
||||
|
||||
// Update the item.
|
||||
$this->change($item->id, 'state', $temp);
|
||||
|
||||
// Reindex the item
|
||||
$this->reindex($item->id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to check the existing access level for categories
|
||||
*
|
||||
* @param JTable $row A JTable object
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function checkCategoryAccess($row)
|
||||
{
|
||||
$query = $this->db->getQuery(true)
|
||||
->select($this->db->quoteName('access'))
|
||||
->from($this->db->quoteName('#__categories'))
|
||||
->where($this->db->quoteName('id') . ' = ' . (int) $row->id);
|
||||
$this->db->setQuery($query);
|
||||
|
||||
// Store the access level to determine if it changes
|
||||
$this->old_cataccess = $this->db->loadResult();
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to check the existing access level for items
|
||||
*
|
||||
* @param JTable $row A JTable object
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function checkItemAccess($row)
|
||||
{
|
||||
$query = $this->db->getQuery(true)
|
||||
->select($this->db->quoteName('access'))
|
||||
->from($this->db->quoteName($this->table))
|
||||
->where($this->db->quoteName('id') . ' = ' . (int) $row->id);
|
||||
$this->db->setQuery($query);
|
||||
|
||||
// Store the access level to determine if it changes
|
||||
$this->old_access = $this->db->loadResult();
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the number of content items available to index.
|
||||
*
|
||||
* @return integer The number of content items available to index.
|
||||
*
|
||||
* @since 2.5
|
||||
* @throws Exception on database error.
|
||||
*/
|
||||
protected function getContentCount()
|
||||
{
|
||||
$return = 0;
|
||||
|
||||
// Get the list query.
|
||||
$query = $this->getListQuery();
|
||||
|
||||
// Check if the query is valid.
|
||||
if (empty($query))
|
||||
{
|
||||
return $return;
|
||||
}
|
||||
|
||||
// Tweak the SQL query to make the total lookup faster.
|
||||
if ($query instanceof JDatabaseQuery)
|
||||
{
|
||||
$query = clone($query);
|
||||
$query->clear('select')
|
||||
->select('COUNT(*)')
|
||||
->clear('order');
|
||||
}
|
||||
|
||||
// Get the total number of content items to index.
|
||||
$this->db->setQuery($query);
|
||||
$return = (int) $this->db->loadResult();
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get a content item to index.
|
||||
*
|
||||
* @param integer $id The id of the content item.
|
||||
*
|
||||
* @return FinderIndexerResult A FinderIndexerResult object.
|
||||
*
|
||||
* @since 2.5
|
||||
* @throws Exception on database error.
|
||||
*/
|
||||
protected function getItem($id)
|
||||
{
|
||||
// Get the list query and add the extra WHERE clause.
|
||||
$query = $this->getListQuery();
|
||||
$query->where('a.id = ' . (int) $id);
|
||||
|
||||
// Get the item to index.
|
||||
$this->db->setQuery($query);
|
||||
$row = $this->db->loadAssoc();
|
||||
|
||||
// Convert the item to a result object.
|
||||
$item = JArrayHelper::toObject($row, 'FinderIndexerResult');
|
||||
|
||||
// Set the item type.
|
||||
$item->type_id = $this->type_id;
|
||||
|
||||
// Set the item layout.
|
||||
$item->layout = $this->layout;
|
||||
|
||||
return $item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get a list of content items to index.
|
||||
*
|
||||
* @param integer $offset The list offset.
|
||||
* @param integer $limit The list limit.
|
||||
* @param JDatabaseQuery $query A JDatabaseQuery object. [optional]
|
||||
*
|
||||
* @return array An array of FinderIndexerResult objects.
|
||||
*
|
||||
* @since 2.5
|
||||
* @throws Exception on database error.
|
||||
*/
|
||||
protected function getItems($offset, $limit, $query = null)
|
||||
{
|
||||
$items = array();
|
||||
|
||||
// Get the content items to index.
|
||||
$this->db->setQuery($this->getListQuery($query), $offset, $limit);
|
||||
$rows = $this->db->loadAssocList();
|
||||
|
||||
// Convert the items to result objects.
|
||||
foreach ($rows as $row)
|
||||
{
|
||||
// Convert the item to a result object.
|
||||
$item = JArrayHelper::toObject($row, 'FinderIndexerResult');
|
||||
|
||||
// Set the item type.
|
||||
$item->type_id = $this->type_id;
|
||||
|
||||
// Set the mime type.
|
||||
$item->mime = $this->mime;
|
||||
|
||||
// Set the item layout.
|
||||
$item->layout = $this->layout;
|
||||
|
||||
// Set the extension if present
|
||||
if (isset($row->extension))
|
||||
{
|
||||
$item->extension = $row->extension;
|
||||
}
|
||||
|
||||
// Add the item to the stack.
|
||||
$items[] = $item;
|
||||
}
|
||||
|
||||
return $items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the SQL query used to retrieve the list of content items.
|
||||
*
|
||||
* @param mixed $query A JDatabaseQuery object. [optional]
|
||||
*
|
||||
* @return JDatabaseQuery A database object.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function getListQuery($query = null)
|
||||
{
|
||||
// Check if we can use the supplied SQL query.
|
||||
$query = $query instanceof JDatabaseQuery ? $query : $this->db->getQuery(true);
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the plugin type
|
||||
*
|
||||
* @param integer $id The plugin ID
|
||||
*
|
||||
* @return string The plugin type
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function getPluginType($id)
|
||||
{
|
||||
// Prepare the query
|
||||
$query = $this->db->getQuery(true)
|
||||
->select($this->db->quoteName('element'))
|
||||
->from($this->db->quoteName('#__extensions'))
|
||||
->where($this->db->quoteName('extension_id') . ' = ' . (int) $id);
|
||||
$this->db->setQuery($query);
|
||||
$type = $this->db->loadResult();
|
||||
|
||||
return $type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get a SQL query to load the published and access states for
|
||||
* an article and category.
|
||||
*
|
||||
* @return JDatabaseQuery A database object.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function getStateQuery()
|
||||
{
|
||||
$query = $this->db->getQuery(true);
|
||||
|
||||
// Item ID
|
||||
$query->select('a.id');
|
||||
|
||||
// Item and category published state
|
||||
$query->select('a.' . $this->state_field . ' AS state, c.published AS cat_state');
|
||||
|
||||
// Item and category access levels
|
||||
$query->select('a.access, c.access AS cat_access')
|
||||
->from($this->table . ' AS a')
|
||||
->join('LEFT', '#__categories AS c ON c.id = a.catid');
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the query clause for getting items to update by time.
|
||||
*
|
||||
* @param string $time The modified timestamp.
|
||||
*
|
||||
* @return JDatabaseQuery A database object.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function getUpdateQueryByTime($time)
|
||||
{
|
||||
// Build an SQL query based on the modified time.
|
||||
$query = $this->db->getQuery(true)
|
||||
->where('a.modified >= ' . $this->db->quote($time));
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the query clause for getting items to update by id.
|
||||
*
|
||||
* @param array $ids The ids to load.
|
||||
*
|
||||
* @return JDatabaseQuery A database object.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function getUpdateQueryByIds($ids)
|
||||
{
|
||||
// Build an SQL query based on the item ids.
|
||||
$query = $this->db->getQuery(true)
|
||||
->where('a.id IN(' . implode(',', $ids) . ')');
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the type id for the adapter content.
|
||||
*
|
||||
* @return integer The numeric type id for the content.
|
||||
*
|
||||
* @since 2.5
|
||||
* @throws Exception on database error.
|
||||
*/
|
||||
protected function getTypeId()
|
||||
{
|
||||
// Get the type id from the database.
|
||||
$query = $this->db->getQuery(true)
|
||||
->select($this->db->quoteName('id'))
|
||||
->from($this->db->quoteName('#__finder_types'))
|
||||
->where($this->db->quoteName('title') . ' = ' . $this->db->quote($this->type_title));
|
||||
$this->db->setQuery($query);
|
||||
$result = (int) $this->db->loadResult();
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the URL for the item. The URL is how we look up the link
|
||||
* in the Finder index.
|
||||
*
|
||||
* @param integer $id The id of the item.
|
||||
* @param string $extension The extension the category is in.
|
||||
* @param string $view The view for the URL.
|
||||
*
|
||||
* @return string The URL of the item.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function getURL($id, $extension, $view)
|
||||
{
|
||||
return 'index.php?option=' . $extension . '&view=' . $view . '&id=' . $id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the page title of any menu item that is linked to the
|
||||
* content item, if it exists and is set.
|
||||
*
|
||||
* @param string $url The url of the item.
|
||||
*
|
||||
* @return mixed The title on success, null if not found.
|
||||
*
|
||||
* @since 2.5
|
||||
* @throws Exception on database error.
|
||||
*/
|
||||
protected function getItemMenuTitle($url)
|
||||
{
|
||||
$return = null;
|
||||
|
||||
// Set variables
|
||||
$user = JFactory::getUser();
|
||||
$groups = implode(',', $user->getAuthorisedViewLevels());
|
||||
|
||||
// Build a query to get the menu params.
|
||||
$query = $this->db->getQuery(true)
|
||||
->select($this->db->quoteName('params'))
|
||||
->from($this->db->quoteName('#__menu'))
|
||||
->where($this->db->quoteName('link') . ' = ' . $this->db->quote($url))
|
||||
->where($this->db->quoteName('published') . ' = 1')
|
||||
->where($this->db->quoteName('access') . ' IN (' . $groups . ')');
|
||||
|
||||
// Get the menu params from the database.
|
||||
$this->db->setQuery($query);
|
||||
$params = $this->db->loadResult();
|
||||
|
||||
// Check the results.
|
||||
if (empty($params))
|
||||
{
|
||||
return $return;
|
||||
}
|
||||
|
||||
// Instantiate the params.
|
||||
$params = json_decode($params);
|
||||
|
||||
// Get the page title if it is set.
|
||||
if ($params->page_title)
|
||||
{
|
||||
$return = $params->page_title;
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to update index data on access level changes
|
||||
*
|
||||
* @param JTable $row A JTable object
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function itemAccessChange($row)
|
||||
{
|
||||
$query = clone($this->getStateQuery());
|
||||
$query->where('a.id = ' . (int) $row->id);
|
||||
|
||||
// Get the access level.
|
||||
$this->db->setQuery($query);
|
||||
$item = $this->db->loadObject();
|
||||
|
||||
// Set the access level.
|
||||
$temp = max($row->access, $item->cat_access);
|
||||
|
||||
// Update the item.
|
||||
$this->change((int) $row->id, 'access', $temp);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to update index data on published state changes
|
||||
*
|
||||
* @param array $pks A list of primary key ids of the content that has changed state.
|
||||
* @param integer $value The value of the state that the content has been changed to.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function itemStateChange($pks, $value)
|
||||
{
|
||||
/*
|
||||
* The item's published state is tied to the category
|
||||
* published state so we need to look up all published states
|
||||
* before we change anything.
|
||||
*/
|
||||
foreach ($pks as $pk)
|
||||
{
|
||||
$query = clone($this->getStateQuery());
|
||||
$query->where('a.id = ' . (int) $pk);
|
||||
|
||||
// Get the published states.
|
||||
$this->db->setQuery($query);
|
||||
$item = $this->db->loadObject();
|
||||
|
||||
// Translate the state.
|
||||
$temp = $this->translateState($value, $item->cat_state);
|
||||
|
||||
// Update the item.
|
||||
$this->change($pk, 'state', $temp);
|
||||
|
||||
// Reindex the item
|
||||
$this->reindex($pk);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to update index data when a plugin is disabled
|
||||
*
|
||||
* @param array $pks A list of primary key ids of the content that has changed state.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function pluginDisable($pks)
|
||||
{
|
||||
// Since multiple plugins may be disabled at a time, we need to check first
|
||||
// that we're handling the appropriate one for the context
|
||||
foreach ($pks as $pk)
|
||||
{
|
||||
if ($this->getPluginType($pk) == strtolower($this->context))
|
||||
{
|
||||
// Get all of the items to unindex them
|
||||
$query = clone($this->getStateQuery());
|
||||
$this->db->setQuery($query);
|
||||
$items = $this->db->loadColumn();
|
||||
|
||||
// Remove each item
|
||||
foreach ($items as $item)
|
||||
{
|
||||
$this->remove($item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to translate the native content states into states that the
|
||||
* indexer can use.
|
||||
*
|
||||
* @param integer $item The item state.
|
||||
* @param integer $category The category state. [optional]
|
||||
*
|
||||
* @return integer The translated indexer state.
|
||||
*
|
||||
* @since 2.5
|
||||
*/
|
||||
protected function translateState($item, $category = null)
|
||||
{
|
||||
// If category is present, factor in its states as well
|
||||
if ($category !== null)
|
||||
{
|
||||
if ($category == 0)
|
||||
{
|
||||
$item = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Translate the state
|
||||
switch ($item)
|
||||
{
|
||||
// Published and archived items only should return a published state
|
||||
case 1;
|
||||
case 2:
|
||||
return 1;
|
||||
|
||||
// All other states should return a unpublished state
|
||||
default:
|
||||
case 0:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user