Virtuemart搜索结果指向类别NOT产品详细信息页面

时间:2016-11-01 15:51:24

标签: search joomla virtuemart

继承旧的Joomla网站我从2012年大约2.5升级到现在的3.6.4,使用Virtuemart 3.0.16(使用PHP7.0)。

默认的Joomla搜索模块结果显示为:

  

[Lorem Ipsum产品链接]
  Lorem ipsum dolor坐下来,精致的adipistur elit。 Aenean accumsan est mi,et volutpat quam blandit a。 Etiam blandit,massa ac consequat dapibus产品描述。

除了产品标题的超链接错误地指向产品类别而不是产品详细信息页面。

我相信我已将问题定位在此位置:/plugins/search/virtuemart/virtuemart.php。约。第223行:

$row->virtuemart_product_id . '&virtuemart_category_id=' . $row->cat_id;

我不知道如何将php更改为正确的格式以指向产品本身。我试图将语言从类别更改为产品ID声明,但这会产生混合匹配的产品链接。

如何编辑此文件以使产品标题链接指向实际产品详细信息页面而不是类别?

<?php

/**
 *
 * A search plugin for com_search
 *
 * @author Valérie Isaksen
 * @author Samuel Mehrbrodt
 * @version $Id: authorize.php 5122 2011-12-18 22:24:49Z alatak $
 * @package VirtueMart
 * @subpackage search
 * @copyright Copyright (C) 2004-2008 soeren - All rights reserved.
 * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
 * VirtueMart is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses.
 * See /administrator/components/com_virtuemart/COPYRIGHT.php for copyright notices and details.
 *
 * http://virtuemart.net
 * @modified by Jeno Kovacs --- Offlajn.com 2014 
 * @description image & price support for Universal AJAX Live Search  
 */
// no direct access
defined ('_JEXEC') or die('Restricted access');

class PlgSearchVirtuemart extends JPlugin {
    /**
     * @return array An array of search areas
     */
    function onContentSearchAreas () {
        $this->loadLanguage();
        static $areas = array(
            'virtuemart' => 'PLG_SEARCH_VIRTUEMART_PRODUCTS'
        );
        return $areas;
    }

    /**
     * Content Search method
     * The sql must return the following fields that are used in a common display
     * routine: href, title, section, created, text, browsernav
     *
     * @param string $text Target search string
     * @param string $phrase matching option, exact|any|all
     * @param string $ordering ordering option, newest|oldest|popular|alpha|category
     * @param mixed  $areas An array if the search it to be restricted to areas, null if search all
     *
     * @return array An array of database result objects
     */
    function onContentSearch ($text, $phrase = '', $ordering = '', $areas = NULL) {
        $db = JFactory::getDbo();

        if (is_array($areas)) {
            if (!array_intersect ($areas, array_keys ($this->onContentSearchAreas()))) {
                return array();
            }
        }

        $limit = $this->params->get('search_limit', 50);
        switch($this->params->get('subtitledisplay', '1')) {
            case '1':
                $category_field = 'category_name';
                break;
            case '2':
                $category_field = 'customtitle';
                break;
        }
        $search_product_description = (bool) $this->params->get('enable_product_description_search', TRUE);
        $search_product_s_description = (bool) $this->params->get('enable_product_short_description_search', TRUE);
        $search_customfields = (bool) $this->params->get('enable_customfields', TRUE);
        $customfield_ids_condition = "";
        if ($search_customfields) {
            $value = trim($this->params->get('customfields', ""));

            // Remove all spaces
            $value = str_replace(' ', '', $value);
            if (!empty($value)){
                $customfield_ids = explode(",", $value);

                // Make sure we have only integers
                foreach($customfield_ids as &$id) {
                    $id = intval($id);
                }
                // The custom field ID must be either in the list specified or NULL.
                $customfield_ids_condition = "AND cf.virtuemart_custom_id IN (" .
                    implode(',', $customfield_ids) . ")";
            }

        }

        if (!class_exists('VmConfig')) {

        // FIX THE MISSING DS ERROR ON JOOMLA 3 VM BETTER SEARCH PLUGIN : https://forum.virtuemart.net/index.php?topic=125681.0
        defined('DS') or define('DS', DIRECTORY_SEPARATOR);

        require(JPATH_ADMINISTRATOR . DS . 'components' . DS . 'com_virtuemart' . DS . 'helpers' . DS . 'config.php');
        }
        VmConfig::loadConfig();

        $text = trim($text);
        if (empty($text))
            return array();

        switch ($phrase) {
            case 'exact':
                $wheres2 = array();
                // product_sku should be exact match
                $text = $db->quote("%$text%", TRUE);
                $wheres2[] = "p.product_sku LIKE $text";
                $wheres2[] = "a.product_name LIKE $text";
                $wheres2[] = "b.$category_field LIKE $text";
                if ($search_product_s_description)
                    $wheres2[] = "a.product_s_desc LIKE $text";
                if ($search_product_description)
                    $wheres2[] = "a.product_desc LIKE $text";
                if ($search_customfields)
                    $wheres2[] = "(cf.customfield_value LIKE $text $customfield_ids_condition)";
                $where = '(' . implode (') OR (', $wheres2) . ')';
                break;
            case 'all':
            case 'any':
            default:
                $words = explode (' ', $text);
                $wheres = array();
                foreach ($words as $word) {
                    $wheres2 = array();
                    // product_sku should be exact match
          $word = $db->quote("%$word%", TRUE);
                    $wheres2[] = "p.product_sku LIKE $word";                    
                    $wheres2[] = "a.product_name LIKE $word";
                    $wheres2[] = "b.$category_field LIKE $word";
                    if ($search_product_s_description)
                        $wheres2[] = "a.product_s_desc LIKE $word";
                    if ($search_product_description)
                        $wheres2[] = "a.product_desc LIKE $word";
                    if ($search_customfields)
                        $wheres2[] = "(cf.customfield_value LIKE $word $customfield_ids_condition)";

                    $wheres[] = implode (' OR ', $wheres2);
                }
                $where = '(' . implode (($phrase == 'all' ? ') AND (' : ') OR ('), $wheres) . ')';
                break;
        }
        switch($ordering) {
            case 'alpha':
                $order = 'a.product_name ASC';
                break;
            case 'category':
                $order = 'b.category_name ASC, a.product_name ASC';
                break;
            case 'popular':
                $order = 'a.product_name ASC';
                break;
            case 'newest':
                $order = 'p.created_on DESC';
                break;
            case 'oldest':
                $order = 'p.created_on ASC';
                break;
            default:
                $order = 'a.product_name ASC';
        }

        $shopper_group_condition="";
        $currentVMuser = VmModel::getModel('user')->getUser();
        $virtuemart_shoppergroup_ids = (array)$currentVMuser->shopper_groups;

        if (is_array($virtuemart_shoppergroup_ids)) {
            $sgrgroups = array();
            foreach($virtuemart_shoppergroup_ids as $virtuemart_shoppergroup_id) {
                $sgrgroups[] = 'psgr.`virtuemart_shoppergroup_id`= "' . (int)$virtuemart_shoppergroup_id . '" ';
            }
            $sgrgroups[] = 'psgr.`virtuemart_shoppergroup_id` IS NULL ';
            $shopper_group_condition = " AND ( " . implode (' OR ', $sgrgroups) . " ) ";
        }

        $uncategorized_products_condition = VmConfig::get('show_uncat_child_products') ?
            '' : ' AND b.virtuemart_category_id > 0 ';

        $query = "
                SELECT DISTINCT
                    a.product_name AS title,
                    a.product_s_desc AS text,
                    p.created_on as created,
                    p.published,
                    '2' AS browsernav,
                 (SELECT m.file_url AS path
                  FROM #__virtuemart_medias AS m
                    LEFT JOIN #__virtuemart_product_medias AS me ON m.virtuemart_media_id = me.virtuemart_media_id
                    WHERE me.virtuemart_product_id = a.virtuemart_product_id ORDER BY me.ordering ASC LIMIT 1 ) AS image,
                    GROUP_CONCAT(DISTINCT b.$category_field
                        ORDER BY b.$category_field SEPARATOR ', ') as section,
                    (SELECT pc2.virtuemart_category_id
                        FROM #__virtuemart_product_categories as pc2
                        WHERE pc2.virtuemart_product_id = a.virtuemart_product_id LIMIT 1) AS cat_id
                FROM `#__virtuemart_products_" . VmConfig::$vmlang . "` AS a
                JOIN #__virtuemart_products AS p USING (`virtuemart_product_id`)
                LEFT JOIN `#__virtuemart_product_categories` AS xref
                        ON xref.`virtuemart_product_id` = a.`virtuemart_product_id`
                LEFT JOIN `#__virtuemart_categories_" . VmConfig::$vmlang . "` AS b
                        ON b.`virtuemart_category_id` = xref.`virtuemart_category_id`
                LEFT JOIN `#__virtuemart_product_shoppergroups` as `psgr`
                        ON (`psgr`.`virtuemart_product_id`=`a`.`virtuemart_product_id`)
                LEFT JOIN `#__virtuemart_product_customfields` AS cf
                        ON cf.virtuemart_product_id = a.virtuemart_product_id
                LEFT JOIN `#__virtuemart_customs` AS customs
                        ON customs.virtuemart_custom_id = cf.virtuemart_customfield_id
                WHERE
                        ($where)
                        AND p.published='1'
                        $shopper_group_condition
                        $uncategorized_products_condition
                GROUP BY xref.virtuemart_product_id
                ORDER BY $order";
        $db->setQuery($query, 0, $limit);
//echo $query; exit;
        $rows = $db->loadObjectList();
        if ($rows) {
            foreach ($rows as $key => $row) {
                $rows[$key]->href = 'index.php?option=com_virtuemart&view=productdetails' .
                    // line below somehow changes search result links without changing title
                    $row->virtuemart_product_id . '&virtuemart_category_id=' . $row->cat_id;
          $rows[$key]->price = $this->getPrice($row->virtuemart_product_id);
          if($row->image != "" && (false === strpos($row->image, "stories"))) {
            $rows[$key]->image = "images/stories/virtuemart/product/".$row->image;
          }          
            }
        }
        return $rows;
    }

  function getPrice($pid) {
     if (!class_exists('CurrencyDisplay')) {
          require_once(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'currencydisplay.php');
    }  
    $product_model = VmModel::getModel('product');
    $currency = CurrencyDisplay::getInstance();
        $product = $product_model->getProduct($pid,TRUE,TRUE,TRUE,1);
        $p = str_replace("PricesalesPrice", "", $currency->createPriceDiv ('salesPrice', '', $product->prices));
    return $p;
  }  
}

1 个答案:

答案 0 :(得分:0)

我的伪解决方案是从与我正在使用的版本相匹配的vanilla Virtuemart下载中导入上述的virtuemart.php文件。

提取的文件位于com_virtuemart.3.0.14_ext_aio.zip:/admin/plugins/search/virtuemart/virtuemart.php。

将原始帖子的php文件重命名为.bak,并将此文件放在同一位置。结果现在表现得像股票Joomla搜索(没有所有自定义样式)。