Умный поиск по VirtueMart 3

  • 1 Ответов
  • 713 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

Оффлайн a1ma2

Умный поиск по VirtueMart 3
« : 10.09.2015, 21:16:36 »
В общем хочу настроить умный поиск под VirtueMart 3. Написал плагин, но что то идет не так. Магазин не индексируется. Кто может взглянуть на код и исправить или показать что я сделал не так. уже трое суток мучаюсь, не получается.. ребята, выручайте

[spoiler]<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Finder.Product
 *
 * @copyright   Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die('Restricted access');
defined('DS') or define('DS'DIRECTORY_SEPARATOR);

use 
Joomla\Registry\Registry;

require_once 
JPATH_ADMINISTRATOR '/components/com_finder/helpers/indexer/adapter.php';
require_once 
JPATH_ADMINISTRATOR '/components/com_virtuemart/helpers/config.php';

/**
 * Smart Search adapter for com_content.
 *
 * @since  2.5
 */
class PlgFinderProduct extends FinderIndexerAdapter
{
/**
 * The plugin identifier.
 *
 * @var    string
 * @since  2.5
 */
protected $context 'Product';

/**
 * The extension name.
 *
 * @var    string
 * @since  2.5
 */
protected $extension 'com_virtuemart';

/**
 * The sublayout to use when rendering the results.
 *
 * @var    string
 * @since  2.5
 */
protected $layout 'product';

/**
 * The type of content that the adapter indexes.
 *
 * @var    string
 * @since  2.5
 */
protected $type_title 'Product Link';

/**
 * The table name.
 *
 * @var    string
 * @since  2.5
 */
protected $table '#__virtuemart_productst';

/**
 * Load the language file on instantiation.
 *
 * @var    boolean
 * @since  3.1
 */
protected $autoloadLanguage true;

/**
 * Method to update the item link information when the item category is
 * changed. This is fired when the item category is published or unpublished
 * from the list view.
 *
 * @param   string   $extension  The extension whose category has been updated.
 * @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
 */
public function onFinderCategoryChangeState($extension$pks$value)
{
// Make sure we're handling com_weblinks categories
if ($extension == 'com_virtuemart')
{
$this->categoryStateChange($pks$value);
}
}

/**
 * Method to remove the link information for items that have been deleted.
 *
 * @param   string  $context  The context of the action being performed.
 * @param   JTable  $table    A JTable object containing the record to be deleted
 *
 * @return  boolean  True on success.
 *
 * @since   2.5
 * @throws  Exception on database error.
 */
public function onFinderAfterDelete($context$table)
{
if ($context == 'com_virtuemart.product')
{
$id $table->id;
}
elseif ($context == 'com_finder.index')
{
$id $table->link_id;
}
else
{
return true;
}
// Remove item from the index.
return $this->remove($id);
}

/**
 * Smart Search after save content method.
 * Reindexes the link information for an article that has been saved.
 * It also makes adjustments if the access level of an item or the
 * category to which it belongs has changed.
 *
 * @param   string   $context  The context of the content passed to the plugin.
 * @param   JTable   $row      A JTable object.
 * @param   boolean  $isNew    True if the content has just been created.
 *
 * @return  boolean  True on success.
 *
 * @since   2.5
 * @throws  Exception on database error.
 */
public function onFinderAfterSave($context$row$isNew)
{
// We only want to handle product links here. We need to handle front end and back end editing.
if ($context == 'com_virtuemart.product' || $context == 'com_virtuemart.form' )
{
// Check if the access levels are different
if (!$isNew && $this->old_access != $row->access)
{
// Process the change.
$this->itemAccessChange($row);
}

// Reindex the item
$this->reindex($row->id);
}

// Check for access changes in the category
if ($context == 'com_virtuemart.category')
{
// Check if the access levels are different
if (!$isNew && $this->old_cataccess != $row->access)
{
$this->categoryAccessChange($row);
}
}

return true;
}

/**
 * Smart Search before content save method.
 * This event is fired before the data is actually saved.
 *
 * @param   string   $context  The context of the content passed to the plugin.
 * @param   JTable   $row      A JTable object.
 * @param   boolean  $isNew    If the content is just about to be created.
 *
 * @return  boolean  True on success.
 *
 * @since   2.5
 * @throws  Exception on database error.
 */
public function onFinderBeforeSave($context$row$isNew)
{
// We only want to handle product links here
if ($context == 'com_virtuemart.product' || $context == 'com_virtuemart.form')
{
// Query the database for the old access level if the item isn't new
if (!$isNew)
{
$this->checkItemAccess($row);
}
}

// Check for access levels from the category
if ($context == 'com_virtuemart.category')
{
// Query the database for the old access level if the item isn't new
if (!$isNew)
{
$this->checkCategoryAccess($row);
}
}

return true;
}

/**
 * Method to update the link information for items that have been changed
 * from outside the edit screen. This is fired when the item is published,
 * unpublished, archived, or unarchived from the list view.
 *
 * @param   string   $context  The context for the content passed to the plugin.
 * @param   array    $pks      An array 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
 */
public function onFinderChangeState($context$pks$value)
{
// We only want to handle product links here
if ($context == 'com_virtuemart.product' || $context == 'com_virtuemart.form')
{
$this->itemStateChange($pks$value);
}
// Handle when the plugin is disabled
if ($context == 'com_plugins.plugin' && $value === 0)
{
$this->pluginDisable($pks);
}

}

/**
 * Method to index an item. The item must be a FinderIndexerResult object.
 *
 * @param   FinderIndexerResult  $item    The item to index as an FinderIndexerResult object.
 * @param   string               $format  The item format.  Not used.
 *
 * @return  void
 *
 * @since   2.5
 * @throws  Exception on database error.
 */
protected function index(FinderIndexerResult $item$format 'html')
{
$item->setLanguage();

// Check if the extension is enabled.
if (JComponentHelper::isEnabled($this->extension) == false)
{
return;
}

// Initialise the item parameters.
$registry = new Registry;
$registry->loadString($item->params);
$item->params JComponentHelper::getParams('com_virtuemart'true);
$item->params->merge($registry);

$registry = new Registry;
$registry->loadString($item->metadata);
$item->metadata $registry;

// Trigger the onProductPrepare event.
$item->summary FinderIndexerHelper::prepareProduct($item->summary$item->params);
$item->body FinderIndexerHelper::prepareProduct($item->body$item->params);

// Build the necessary route and path information.
$item->url $this->getUrl($item->id$this->extension$this->layout);
/*$item->route = ContentHelperRoute::getArticleRoute($item->slug, $item->catid, $item->language);*/
$item->route 'index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' $item->id '&virtuemart_category_id=' $item->virtuemart_category_id;
$item->path FinderIndexerHelper::getContentPath($item->route);

// Get the menu title if it exists.
$title $this->getItemMenuTitle($item->url);

// Adjust the title if necessary.
if (!empty($title) && $this->params->get('use_menu_title'true))
{
$item->title $title;
}

// Add the meta-author.
$item->metaauthor $item->metadata->get('author');

// Add the meta-data processing instructions.
$item->addInstruction(FinderIndexer::META_CONTEXT'link');
$item->addInstruction(FinderIndexer::META_CONTEXT'metakey');
$item->addInstruction(FinderIndexer::META_CONTEXT'metadesc');
$item->addInstruction(FinderIndexer::META_CONTEXT'metaauthor');
$item->addInstruction(FinderIndexer::META_CONTEXT'author');
$item->addInstruction(FinderIndexer::META_CONTEXT'created_by_alias');

// Translate the state. Articles should only be published if the category is published.
$item->state $this->translateState($item->state$item->cat_state);

// Add the type taxonomy data.
$item->addTaxonomy('Type''Product Link');

// Add the author taxonomy data.
if (!empty($item->author) || !empty($item->created_by_alias))
{
$item->addTaxonomy('Author', !empty($item->created_by_alias)? $item->created_by_alias $item->author);
}

// Add the category taxonomy data.
$item->addTaxonomy('Category'$item->category_name$item->cat_state$item->cat_access);

// Add the language taxonomy data.
$item->addTaxonomy('Language'$item->language);

// Get content extras.
FinderIndexerHelper::getContentExtras($item);

// Index the item.
$this->indexer->index($item);
}

/**
 * Method to setup the indexer to be run.
 *
 * @return  boolean  True on success.
 *
 * @since   2.5
 */
protected function setup()
{
// Load dependent classes.
include_once JPATH_SITE '/components/com_virtuemart/router.php';

return true;
}

/**
 * Method to get the SQL query used to retrieve the list of content items.
 *
 * @param   mixed  $query  A JDatabaseQuery object or null.
 *
 * @return  JDatabaseQuery  A database object.
 *
 * @since   2.5
 */
protected function getListQuery($query null)
{
$db JFactory::getDbo();

// Check if we can use the supplied SQL query.
$query $query instanceof JDatabaseQuery $query $db->getQuery(true)
->select('a.virtuemart_product_id as id, a.published as state, a.published as access, aa.product_s_desc as summary')
->select('aa.slug as alias, aa.slug AS link, aa.slug AS slug')
->select('aa.metakey as metakey, aa.metadesc as metadesc')
->select('c.virtuemart_category_id as virtuemart_category_id, IFNULL(cc.category_name,\'no-vm-category\') as category_name')
->select('\'1\' as cat_state, \'1\' as cat_access')
->select('a.created_on as created, a.created_by, a.modified_on as modified, a.modified_by');

// Handle the alias CASE WHEN portion of the query
$case_when_item_alias ' CASE WHEN ';
$case_when_item_alias .= $query->charLength('aa.product_name''!=''');
$case_when_item_alias .= ' THEN ';
$a_id $query->castAsChar('a.virtuemart_product_id');
$case_when_item_alias .= $query->concatenate(array('a.product_sku''aa.product_name'), ':');
$case_when_item_alias .= ' ELSE ';
$case_when_item_alias .= $a_id ' END as title';
$query->select($case_when_item_alias);

$case_when_item_alias ' CASE WHEN ';
$case_when_item_alias .= $query->charLength('a.product_sku''!=''');
$case_when_item_alias .= ' THEN ';
$a_id $query->castAsChar('aa.product_desc');
$case_when_item_alias .= $query->concatenate(array('REPLACE(a.product_sku, \'-\', \' \')''aa.product_desc'), ':');
$case_when_item_alias .= ' ELSE ';
$case_when_item_alias .= $a_id ' END as catslug';
$query->select($case_when_item_alias)

->select('u.name AS author')
->from('#__virtuemart_products AS a')
->join('LEFT''#__virtuemart_products_'.$this->defaultVMLang.' AS aa ON aa.virtuemart_product_id = a.virtuemart_product_id')
->join('LEFT''#__virtuemart_product_categories AS c ON c.virtuemart_product_id = a.virtuemart_product_id')
->join('LEFT''#__virtuemart_categories_'.$this->defaultVMLang.' AS cc ON cc.virtuemart_category_id = c.virtuemart_category_id')
->join('LEFT''#__virtuemart_categories AS ccc ON ccc.virtuemart_category_id = cc.virtuemart_category_id')                                    
->join('LEFT''#__users AS u ON u.id = a.created_by')
->where('a.published = 1');

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.date >= ' $this->db->quote($time));

return $query;
}
}
[/spoiler]

*

Оффлайн gartes

Re: Умный поиск по VirtueMart 3
« Ответ #1 : 11.09.2015, 20:09:32 »
 :o так Вам наверное не ответят... Вы бы хотя бы ссылку на сайт прикрутили..
Лично мне не понятно как даже Ваш плагин умного поиска может повлиять на индексацию сайта.
Такое может только в том случае быть если у Вас вообще весь товар только через поиск доступен.
Давайте ссылку на сайт там дальше посмотрим.