Compare commits

..

No commits in common. "main" and "rel_8.x_sourceGuardian_from_PHP8.0" have entirely different histories.

450 changed files with 59809 additions and 12 deletions

27
.htaccess Normal file
View File

@ -0,0 +1,27 @@
# disabling file access
Options -Indexes
<FilesMatch ".*">
<IfModule mod_authz_core.c>
# Apache 2.4
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
order deny,allow
deny from all
</IfModule>
</FilesMatch>
<FilesMatch "\.(png|jpe?g|gif|css|js)$">
<IfModule mod_authz_core.c>
# Apache 2.4
Require all granted
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
order deny,allow
allow from all
</IfModule>
</FilesMatch>

2
.php-cs-fixer.php Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,72 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin\Popups;
use OxidEsales\Eshop\Application\Model\Category;
class d3_attribute2category_extsearch_ajax extends d3_attribute_extsearch_ajax_abstract
{
/**
* Columns array
*
* @var array
*/
protected $_aColumns = [
'container1' => [ // field , table, visible, multilanguage, ident
['oxtitle', 'oxcategories', 1, 1, 0],
['oxdesc', 'oxcategories', 1, 1, 0],
['oxid', 'oxcategories', 0, 0, 0],
['oxid', 'oxcategories', 0, 0, 1],
],
'container2' => [
['oxtitle', 'oxcategories', 1, 1, 0],
['oxdesc', 'oxcategories', 1, 1, 0],
['oxid', 'oxcategories', 0, 0, 0],
['oxid', 'd3extsearch_attribute2object', 0, 0, 1],
['oxid', 'oxcategories', 0, 0, 1],
],
];
/**
* @return string
*/
public function getObjectModel()
{
return Category::class;
}
public function getLeftColumnTitle()
{
return 'D3_EXTSEARCH_AJAX_ALLCATEGORIES';
}
public function getRightColumnTitle()
{
return 'D3_EXTSEARCH_AJAX_SETCATEGORIES';
}
public function getObjectIdField()
{
return 'oxcategories.oxid';
}
public function getContainerKey()
{
return 'd3_attribute2category_extsearch';
}
}

View File

@ -0,0 +1,72 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin\Popups;
use OxidEsales\Eshop\Application\Model\Manufacturer;
class d3_attribute2manufacturer_extsearch_ajax extends d3_attribute_extsearch_ajax_abstract
{
/**
* Columns array
*
* @var array
*/
protected $_aColumns = [
'container1' => [ // field , table, visible, multilanguage, ident
['oxtitle', 'oxmanufacturers', 1, 1, 0],
['oxshortdesc', 'oxmanufacturers', 1, 1, 0],
['oxid', 'oxmanufacturers', 0, 0, 0],
['oxid', 'oxmanufacturers', 0, 0, 1],
],
'container2' => [
['oxtitle', 'oxmanufacturers', 1, 1, 0],
['oxshortdesc', 'oxmanufacturers', 1, 1, 0],
['oxid', 'oxmanufacturers', 0, 0, 0],
['oxid', 'd3extsearch_attribute2object', 0, 0, 1],
['oxid', 'oxmanufacturers', 0, 0, 1],
],
];
/**
* @return string
*/
public function getObjectModel()
{
return Manufacturer::class;
}
public function getLeftColumnTitle()
{
return 'D3_EXTSEARCH_AJAX_ALLMANUFACTURERS';
}
public function getRightColumnTitle()
{
return 'D3_EXTSEARCH_AJAX_SETMANUFACTURERS';
}
public function getObjectIdField()
{
return 'oxmanufacturers.oxid';
}
public function getContainerKey()
{
return 'd3_attribute2manufacturer_extsearch';
}
}

View File

@ -0,0 +1,72 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin\Popups;
use OxidEsales\Eshop\Application\Model\Vendor;
class d3_attribute2vendor_extsearch_ajax extends d3_attribute_extsearch_ajax_abstract
{
/**
* Columns array
*
* @var array
*/
protected $_aColumns = [
'container1' => [ // field , table, visible, multilanguage, ident
['oxtitle', 'oxvendor', 1, 1, 0],
['oxshortdesc', 'oxvendor', 1, 1, 0],
['oxid', 'oxvendor', 0, 0, 0],
['oxid', 'oxvendor', 0, 0, 1],
],
'container2' => [
['oxtitle', 'oxvendor', 1, 1, 0],
['oxshortdesc', 'oxvendor', 1, 1, 0],
['oxid', 'oxvendor', 0, 0, 0],
['oxid', 'd3extsearch_attribute2object', 0, 0, 1],
['oxid', 'oxvendor', 0, 0, 1],
],
];
/**
* @return string
*/
public function getObjectModel()
{
return Vendor::class;
}
public function getLeftColumnTitle()
{
return 'D3_EXTSEARCH_AJAX_ALLVENDORS';
}
public function getRightColumnTitle()
{
return 'D3_EXTSEARCH_AJAX_SETVENDORS';
}
public function getObjectIdField()
{
return 'oxvendor.oxid';
}
public function getContainerKey()
{
return 'd3_attribute2vendor_extsearch';
}
}

View File

@ -0,0 +1,175 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin\Popups;
use D3\Extsearch\Application\Model\Constants;
use D3\Extsearch\Application\Model\d3extsearch_attribute2object;
use Exception;
use OxidEsales\Eshop\Application\Controller\Admin\ListComponentAjax;
use OxidEsales\Eshop\Application\Model\Attribute;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Model\MultiLanguageModel;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
use OxidEsales\EshopCommunity\Internal\Container\ContainerFactory;
use OxidEsales\EshopCommunity\Internal\Framework\Database\ConnectionProviderInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
abstract class d3_attribute_extsearch_ajax_abstract extends ListComponentAjax
{
abstract public function getObjectModel();
abstract public function getLeftColumnTitle();
abstract public function getRightColumnTitle();
abstract public function getObjectIdField();
abstract public function getContainerKey();
/**
* @return string
*/
public function getTplName()
{
return '@'. Constants::OXID_MODULE_ID .'/admin/popups/d3_attribute_extsearch_ajax';
}
/**
* @return string
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
protected function getQuery()
{
$connection = ContainerFactory::getInstance()->getContainer()->get(ConnectionProviderInterface::class)->get();
$oRequest = Registry::get(Request::class);
$sId = $oRequest->getRequestEscapedParameter('oxid');
$sSynchId = $oRequest->getRequestEscapedParameter('synchoxid');
/** @var MultiLanguageModel $oObject */
$oObject = oxNew($this->getObjectModel());
$sObjectTable = $oObject->getViewName();
$oA2O = oxNew(d3extsearch_attribute2object::class);
$sA2OTable = $oA2O->getViewName();
if (!$sId) {
$sQAdd = " from {$sObjectTable}";
} else {
$sQAdd = " from {$sA2OTable}, {$sObjectTable} " .
"where {$sObjectTable}.oxid={$sA2OTable}.oxobjectid " .
" and {$sA2OTable}.oxattributeid = " . $connection->quote($sId) .
" and {$sA2OTable}.oxtype = '{$oObject->getCoreTableName()}' ";
}
if ($sSynchId && $sSynchId != $sId) {
// performance
$sSubSelect = " select {$sObjectTable}.oxid from {$sA2OTable}, {$sObjectTable} " .
"where {$sObjectTable}.oxid={$sA2OTable}.oxobjectid " .
" and {$sA2OTable}.oxattributeid = " . $connection->quote($sSynchId) .
" and {$sA2OTable}.oxtype = '{$oObject->getCoreTableName()}' ";
if (stristr($sQAdd, 'where') === false) {
$sQAdd .= ' where ';
} else {
$sQAdd .= ' and ';
}
$sQAdd .= " {$sObjectTable}.oxid not in ( $sSubSelect ) ";
}
//dumpvar($sQAdd);
//die();
return $sQAdd;
}
/**
* Removes selected items from list
*
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function removeAttributeObject()
{
$connection = ContainerFactory::getInstance()->getContainer()->get(ConnectionProviderInterface::class)->get();
$oRequest = Registry::get(Request::class);
$aChosenObjects = $this->getActionIds('d3extsearch_attribute2object.oxid');
$oA2O = oxNew(d3extsearch_attribute2object::class);
$sA2OTable = $oA2O->getViewName();
/** @var Attribute $oAttribute */
$oAttribute = oxNew(Attribute::class);
$oAttribute->setId($oRequest->getRequestEscapedParameter('oxid'));
if (method_exists($oAttribute, 'executeDependencyEvent')) {
$oAttribute->executeDependencyEvent();
}
if ($oRequest->getRequestParameter('all')) {
$sQ = $this->addFilter("delete {$sA2OTable}.* " . $this->getQuery());
$connection->prepare($sQ)->executeStatement();
} elseif (is_array($aChosenObjects)) {
$sChosenObjects = implode(", ", array_map([$connection, 'quote'], $aChosenObjects));
$sQ = "delete from {$sA2OTable} where {$sA2OTable}.oxid in (" . $sChosenObjects . ") ";
$connection->prepare($sQ)->executeStatement();
}
}
/**
* @throws DatabaseConnectionException
* @throws Exception
*/
public function addAttributeObject()
{
$oRequest = Registry::get(Request::class);
$aChosenObjects = $this->getActionIds($this->getObjectIdField());
$soxId = $oRequest->getRequestEscapedParameter('synchoxid');
/** @var Attribute $oAttribute */
$oAttribute = oxNew(Attribute::class);
$oAttribute->setId($soxId);
if (method_exists($oAttribute, 'executeDependencyEvent')) {
$oAttribute->executeDependencyEvent();
}
/** @var MultiLanguageModel $oObject */
$oObject = oxNew($this->getObjectModel());
if ($oRequest->getRequestEscapedParameter('all')) {
$sObjectTable = $oObject->getViewName();
$aChosenObjects = $this->getAll($this->addFilter("select $sObjectTable.oxid " . $this->getQuery()));
}
if ($soxId && $soxId != "-1" && is_array($aChosenObjects)) {
foreach ($aChosenObjects as $sChosenObject) {
$oAssignment = oxNew(d3extsearch_attribute2object::class);
$oAssignment->assign(
[
'oxattributeid' => $soxId,
'oxobjectid' => $sChosenObject,
'oxtype' => $oObject->getCoreTableName(),
]
);
$oAssignment->save();
}
}
if (method_exists($oObject, 'executeDependencyEvent')) {
$oObject->executeDependencyEvent($aChosenObjects);
}
}
}

View File

@ -0,0 +1,123 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin;
use D3\Extsearch\Application\Controller\Admin\Popups\d3_attribute2category_extsearch_ajax;
use D3\Extsearch\Application\Controller\Admin\Popups\d3_attribute2manufacturer_extsearch_ajax;
use D3\Extsearch\Application\Controller\Admin\Popups\d3_attribute2vendor_extsearch_ajax;
use D3\Extsearch\Application\Model\Constants;
use D3\ModCfg\Application\Model\Configuration\d3_cfg_mod;
use Doctrine\DBAL\Exception as DBALException;
use Exception;
use OxidEsales\Eshop\Application\Controller\Admin\AdminDetailsController;
use OxidEsales\Eshop\Application\Model\Attribute;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
class d3_attribute_extsearch extends AdminDetailsController
{
/**
* Current class template name.
*
* @var string
*/
protected $_sThisTemplate = '@'. Constants::OXID_MODULE_ID .'/admin/d3_attribute_extsearch';
/**
* @return string
*/
public function render()
{
$sRet = parent::render();
$soxId = $this->getEditObjectId();
$this->addTplParam("oxid", $soxId);
if ($soxId != "-1") {
/** @var Attribute $oItem */
$oItem = oxNew(Attribute::class);
$oItem->load($soxId);
$this->addTplParam("edit", $oItem);
}
$iAoc = Registry::get(Request::class)->getRequestEscapedParameter("aoc");
if ($iAoc == 1) {
/** @var d3_attribute2category_extsearch_ajax $oAjax */
$oAjax = oxNew(d3_attribute2category_extsearch_ajax::class);
$this->_aViewData['oAjaxView'] = $oAjax;
return $oAjax->getTplName();
} elseif ($iAoc == 2) {
/** @var d3_attribute2manufacturer_extsearch_ajax $oAjax */
$oAjax = oxNew(d3_attribute2manufacturer_extsearch_ajax::class);
$this->_aViewData['oAjaxView'] = $oAjax;
return $oAjax->getTplName();
} elseif ($iAoc == 3) {
/** @var d3_attribute2vendor_extsearch_ajax $oAjax */
$oAjax = oxNew(d3_attribute2vendor_extsearch_ajax::class);
$this->_aViewData['oAjaxView'] = $oAjax;
return $oAjax->getTplName();
}
return $sRet;
}
/**
* @throws Exception
*/
public function save()
{
parent::save();
$soxId = $this->getEditObjectId();
$aParams = Registry::get(Request::class)->getRequestEscapedParameter("editval");
/** @var Attribute $oAttr */
$oAttr = oxNew(Attribute::class);
if ($soxId != "-1") {
$oAttr->loadInLang($this->_iEditLang, $soxId);
} else {
$aParams['oxattribute__oxid'] = null;
}
//Disable editing for derived items
if ($oAttr->isDerived()) {
return;
}
$oAttr->setLanguage(0);
$oAttr->assign($aParams);
$oAttr->setLanguage($this->_iEditLang);
$oAttr->save();
$this->setEditObjectId($oAttr->getId());
}
/**
* @return d3_cfg_mod|false
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function d3GetSet()
{
return d3_cfg_mod::get('d3_extsearch');
}
}

View File

@ -0,0 +1,102 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin;
use D3\Extsearch\Application\Model\Constants;
use D3\ModCfg\Application\Model\Configuration\d3_cfg_mod;
use Doctrine\DBAL\Exception as DBALException;
use Exception;
use OxidEsales\Eshop\Application\Controller\Admin\AdminDetailsController;
use OxidEsales\Eshop\Application\Model\Category;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
class d3_category_extsearch extends AdminDetailsController
{
/**
* Current class template name.
*
* @var string
*/
protected $_sThisTemplate = '@'. Constants::OXID_MODULE_ID .'/admin/d3_category_extsearch';
/**
* @return string
*/
public function render()
{
$sRet = parent::render();
$soxId = $this->getEditObjectId();
$this->addTplParam("oxid", $soxId);
if ($soxId != "-1") {
/** @var Category $oItem */
$oItem = oxNew(Category::class);
$oItem->load($soxId);
$this->addTplParam("edit", $oItem);
}
return $sRet;
}
/**
* @throws Exception
*/
public function save()
{
parent::save();
$soxId = $this->getEditObjectId();
$aParams = Registry::get(Request::class)->getRequestEscapedParameter("editval");
/** @var Category $oCategory */
$oCategory = oxNew(Category::class);
if ($soxId != "-1") {
$oCategory->loadInLang($this->_iEditLang, $soxId);
} else {
$aParams['oxcategories__oxid'] = null;
}
//Disable editing for derived items
if ($oCategory->isDerived()) {
return;
}
$oCategory->setLanguage(0);
$oCategory->assign($aParams);
$oCategory->setLanguage($this->_iEditLang);
$oCategory->save();
$this->setEditObjectId($oCategory->getId());
}
/**
* @return d3_cfg_mod|false
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function d3GetSet()
{
return d3_cfg_mod::get('d3_extsearch');
}
}

View File

@ -0,0 +1,32 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin;
use D3\ModCfg\Application\Controller\Admin\d3_cfg_mod_;
class d3_cfg_extsearch extends d3_cfg_mod_
{
/**
* @return string
*/
public function render()
{
$this->addTplParam('sListClass', d3_cfg_extsearch_list::class);
$this->addTplParam('sMainClass', d3_cfg_extsearch_main::class);
return parent::render();
}
}

View File

@ -0,0 +1,36 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin;
use D3\ModCfg\Application\Controller\Admin\d3_cfg_mod_licence;
use D3\ModCfg\Application\Model\Log\d3log;
class d3_cfg_extsearch_licence extends d3_cfg_mod_licence
{
protected $_sModId = 'd3_extsearch';
protected $_hasNewsletterForm = false;
protected $_sLogType = d3log::CRITICAL;
protected $_sBlogFeed = "https://blog.oxidmodule.com/feeds/categories/9-erweiterte-Suche.rss";
protected $_sHelpLinkMLAdd = 'D3_EXTSEARCH_HELPLINK_CONFIG';
protected $_sMenuItemTitle = 'D3MXEXTSEARCH';
protected $_sMenuSubItemTitle = 'D3MXEXTSEARCH_SETTINGS';
}

View File

@ -0,0 +1,35 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin;
use D3\ModCfg\Application\Controller\Admin\d3_cfg_mod_list;
class d3_cfg_extsearch_list extends d3_cfg_mod_list
{
protected $_blD3ShowLangSwitch = true;
/**
* @return string
*/
public function render()
{
$sRet = parent::render();
$this->addTplParam("default_edit", "d3_cfg_extsearch_main");
return $sRet;
}
}

View File

@ -0,0 +1,623 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin;
use D3\Extsearch\Application\Model\Constants;
use D3\Extsearch\Application\Model\d3_search_generator;
use D3\Extsearch\Core\d3_extsearch_conf;
use D3\Extsearch\Modules\Application\Model\d3_oxsearch_extsearch;
use D3\ModCfg\Application\Controller\Admin\d3_cfg_mod_main;
use D3\ModCfg\Application\Model\Configuration\d3_cfg_mod;
use D3\ModCfg\Application\Model\d3utils;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\Exception as DBALException;
use Doctrine\DBAL\Query\QueryBuilder;
use OxidEsales\Eshop\Application\Model\Article;
use OxidEsales\Eshop\Application\Model\Search;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\FileException;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Model\MultiLanguageModel;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
use OxidEsales\Eshop\Core\Output;
use OxidEsales\EshopCommunity\Internal\Container\ContainerFactory;
use OxidEsales\EshopCommunity\Internal\Framework\Database\ConnectionProviderInterface;
use OxidEsales\EshopCommunity\Internal\Framework\Database\QueryBuilderFactoryInterface;
use OxidEsales\EshopCommunity\Internal\Framework\Templating\TemplateRenderer;
use OxidEsales\EshopCommunity\Internal\Framework\Templating\TemplateRendererBridgeInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use RuntimeException;
class d3_cfg_extsearch_main extends d3_cfg_mod_main
{
protected $_sThisTemplate = '@'. Constants::OXID_MODULE_ID .'/admin/d3_cfg_extsearch_main';
protected $_sModId = 'd3_extsearch';
protected $_blUseModCfgStdObject = true;
public $blSearchColsSet = false;
public $aSearchCols = [];
protected $_blHasDebugSwitch = true;
protected $_blHasTestModeSwitch = false;
protected $_sDebugHelpTextIdent = 'D3_EXTSEARCH_MAIN_DEBUGACTIVE_DESC';
protected $_iUnindexedArticles = false;
public $oD3Generator;
protected $_sHelpLinkMLAdd = 'D3_EXTSEARCH_HELPLINK_CONFIG';
protected $_sMenuItemTitle = 'D3MXEXTSEARCH';
protected $_sMenuSubItemTitle = 'D3MXEXTSEARCH_SETTINGS';
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function getIndexStatus()
{
if ($this->_iUnindexedArticles === false) {
$this->_iUnindexedArticles = 0;
startProfile(__METHOD__);
try {
$this->_iUnindexedArticles = $this->d3getGenerator()->getMaxUpdatePos();
} catch (DatabaseErrorException $e) {
}
stopProfile(__METHOD__);
}
return $this->_iUnindexedArticles;
}
/**
* @return string
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
*/
public function render()
{
startProfile(__METHOD__);
$this->addTplParam("oConfig", Registry::getConfig());
$this->assertSearchFields();
$sRet = parent::render();
stopProfile(__METHOD__);
return $sRet;
}
/**
* @return d3_search_generator
*/
public function d3getGenerator()
{
if (!$this->oD3Generator) {
$this->oD3Generator = oxNew(d3_search_generator::class);
}
return $this->oD3Generator;
}
/**
* Generiert aus jedem Artikel auf Grundlage der zu verwendenden Felder den phonetischen Code
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
*/
public function generatePhoneticStrings(): void
{
startProfile(__METHOD__);
/** @var d3utils $oD3Utils */
$oD3Utils = Registry::get(d3utils::class);
$iArtPos = $this->d3getGenerator()->getArtPos();
$iProcessedArticles = $this->d3getGenerator()->updateArticles();
// bestimmt die maximal zu updatende Anzahl Artikel
$iMaxPos = Registry::get(Request::class)->getRequestEscapedParameter('iMaxPos');
if (!$iMaxPos) {
if ($this->getCheckOxartextendsQuery()->execute()->fetchOne()) {
$this->showHtmlMessage(
Registry::getLang()->translateString('D3_EXTSEARCH_MAIN_GENERATOR_NOTE'),
sprintf(
Registry::getLang()->translateString('D3_EXTSEARCH_MAIN_GENERATOR_INCONSISTENTTABLE'),
$this->getHelpURL()
)
);
}
// nicht betroffene Artikel auf aktuelles Datum setzen
$iMaxPos = $this->d3getGenerator()->getMaxUpdatePos();
}
try {
$iProcessedArticles = $this->d3getGenerator()->updateArticles();
} catch (RuntimeException $e) {
die($e->getMessage());
}
if ($iProcessedArticles > 0) {
$iNewPos = $iArtPos + $iProcessedArticles;
$aParams = [
'cl' => $this->getClassKey(),
'fnc' => __FUNCTION__,
'iArtPos' => $iNewPos,
'iMaxPos' => $iMaxPos,
'type' => Registry::get(Request::class)->getRequestEscapedParameter('type'),
];
$sURL = $oD3Utils->getAdminClassUrl($aParams);
$this->showProcessingInfos($iArtPos, $iMaxPos, $sURL);
} else {
$this->showHtmlMessage(
Registry::getLang()->translateString('D3_EXTSEARCH_MAIN_GENERATOR_FINISHED'),
sprintf(
Registry::getLang()->translateString('D3_EXTSEARCH_MAIN_GENERATOR_PROCESSED'),
(string) $iArtPos,
(string) ceil($iArtPos / count(Registry::getLang()->getLanguageIds()))
)
);
}
Registry::getConfig()->pageClose();
stopProfile(__METHOD__);
die();
}
/**
* @param $sArtPos
* @param $iMaxPos
* @param $sURL
*/
public function showProcessingInfos($sArtPos, $iMaxPos, $sURL)
{
startProfile(__METHOD__);
$iProcessedPercent = 0;
if ($sArtPos > 0) {
$iPercent = 100 / $iMaxPos * $sArtPos;
$iProcessedPercent = floor($iPercent);
}
$sTitle = sprintf(
Registry::getLang()->translateString('D3_EXTSEARCH_MAIN_GENERATOR_PROCESSING'),
$iProcessedPercent
);
$templateRenderer = $this->getTemplateRenderer();
$context = [
'sCharset' => $this->getCharSet(),
'sTitle' => $sTitle,
'sRefreshUrl' => $sURL,
'sMessage' => sprintf(
Registry::getLang()->translateString('D3_EXTSEARCH_MAIN_GENERATOR_PROCESSING1'),
(string) $sArtPos,
(string) $iMaxPos,
(string) ceil($sArtPos / count(Registry::getLang()->getLanguageIds()))
),
'iProgressPercent' => $sArtPos > 0 ? $iProcessedPercent : null,
'blWait' => true,
];
$sTplFile = '@'. Constants::OXID_MODULE_ID .'/admin/d3_extsearch_popup';
$outputManager = oxNew(Output::class);
$outputManager->setCharset(Registry::getConfig()->getActiveView()->getCharSet());
$outputManager->sendHeaders();
$outputManager->output('content', $templateRenderer->renderTemplate($sTplFile, $context));
Registry::getConfig()->pageClose();
$outputManager->flushOutput();
stopProfile(__METHOD__);
}
/**
* @return TemplateRenderer
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
protected function getTemplateRenderer(): TemplateRenderer
{
return ContainerFactory::getInstance()->getContainer()
->get(TemplateRendererBridgeInterface::class)
->getTemplateRenderer();
}
/**
* @return QueryBuilder
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function getCheckOxartextendsQuery(): QueryBuilder
{
$oArt = oxNew(Article::class);
$sArtTblName = $oArt->getViewName();
$oArtExtends = oxNew(MultiLanguageModel::class);
$oArtExtends->init('oxartextends');
$sArtExtTblName = $oArtExtends->getViewName();
$oQB = ContainerFactory::getInstance()->getContainer()->get(QueryBuilderFactoryInterface::class)->create();
$oQB->select('count(oa.oxid)')
->from($sArtTblName, 'oa')
->leftJoin('oa', $sArtExtTblName, 'oae', 'oa.oxid = oae.oxid')
->where('oae.oxid IS NULL')
->setMaxResults(1);
return $oQB;
}
/**
* Generiert aus jedem Semantic-Lexikoneintrag den phonetischen Code
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
*/
public function generatePhoneticSemantic()
{
startProfile(__METHOD__);
/** @var d3utils $oD3Utils */
$oD3Utils = Registry::get(d3utils::class);
$iTermPos = Registry::get(Request::class)->getRequestEscapedParameter('iTermPos');
if (!$iTermPos) {
$iTermPos = 0;
}
$iMaxPos = Registry::get(Request::class)->getRequestEscapedParameter('iMaxPos');
if (!$iMaxPos) {
$iMaxPos = $this->d3getGenerator()->getMaxSemanticUpdatePos();
}
try {
$iProcessedTerms = $this->d3getGenerator()->updateSemantics($iTermPos);
} catch (RuntimeException $e) {
die($e->getMessage());
}
if ($iProcessedTerms > 0) {
$iNewPos = $iTermPos + $iProcessedTerms;
$aParams = [
'cl' => $this->getClassKey(),
'fnc' => __FUNCTION__,
'iTermPos' => $iNewPos,
'iMaxPos' => $iMaxPos,
];
$sURL = $oD3Utils->getAdminClassUrl($aParams);
$this->showProcessingSemanticInfos($iTermPos, $iMaxPos, $sURL);
} else {
$this->showHtmlMessage(
Registry::getLang()->translateString('D3_EXTSEARCH_MAIN_GENERATOR_FINISHED'),
sprintf(Registry::getLang()->translateString('D3_EXTSEARCH_MAIN_GENERATOR_TERMPROCESSED'), $iTermPos)
);
}
Registry::getConfig()->pageClose();
stopProfile(__METHOD__);
die();
}
/**
* @param $iTermPos
* @param $iMaxPos
* @param $sURL
*/
public function showProcessingSemanticInfos($iTermPos, $iMaxPos, $sURL)
{
$iProcessedPercent = 0;
if ($iTermPos > 0) {
$iPercent = 100 / $iMaxPos * $iTermPos;
$iProcessedPercent = floor($iPercent);
}
$sTitle = sprintf(
Registry::getLang()->translateString('D3_EXTSEARCH_MAIN_GENERATOR_PROCESSING'),
$iProcessedPercent
);
$templateRenderer = $this->getTemplateRenderer();
$context = [
'sCharset' => $this->getCharSet(),
'sTitle' => $sTitle,
'sRefreshUrl' => $sURL,
'sMessage' => sprintf(
Registry::getLang()->translateString('D3_EXTSEARCH_MAIN_GENERATOR_PROCESSING3'),
(string) $iTermPos,
(string) $iMaxPos
),
'iProgressPercent' => $iTermPos > 0 ? $iProcessedPercent : null,
'blWait' => true,
];
$sTplFile = '@'. Constants::OXID_MODULE_ID .'/admin/d3_extsearch_popup';
$outputManager = oxNew(Output::class);
$outputManager->setCharset(Registry::getConfig()->getActiveView()->getCharSet());
$outputManager->sendHeaders();
$outputManager->output('content', $templateRenderer->renderTemplate($sTplFile, $context));
Registry::getConfig()->pageClose();
$outputManager->flushOutput();
}
/**
* @param $sTitle
* @param $sMessage
*/
public function showHtmlMessage($sTitle, $sMessage)
{
$sCharSet = "UTF-8";
$templateRenderer = $this->getTemplateRenderer();
$context = [
'sCharset' => $sCharSet,
'sTitle' => $sTitle,
'sMessage' => $sMessage,
];
$sTplFile = '@'. Constants::OXID_MODULE_ID .'/admin/d3_extsearch_popup';
$outputManager = oxNew(Output::class);
$outputManager->setCharset(Registry::getConfig()->getActiveView()->getCharSet());
$outputManager->sendHeaders();
$outputManager->output('content', $templateRenderer->renderTemplate($sTplFile, $context));
Registry::getConfig()->pageClose();
$outputManager->flushOutput();
die();
}
/**
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function startSortAnalysis()
{
$aParams = [
'cl' => $this->getClassKey(),
'fnc' => __FUNCTION__,
];
$aAllList = [];
$aUsedFields = [];
$aFieldNames = [];
$templateRenderer = $this->getTemplateRenderer();
$context = [
'sCharSet' => $this->getCharSet(),
'sFormUrl' => d3utils::getInstance()->getAdminClassUrl($aParams),
'sHiddenSid'=> $this->getViewConfig()->getHiddenSid(),
'sClass' => $this->getClassKey(),
'sFnc' => __FUNCTION__,
'sSearchParam' => Registry::get(Request::class)->getRequestEscapedParameter('searchparam'),
];
if (Registry::get(Request::class)->getRequestEscapedParameter('searchparam')) {
/** @var d3_oxsearch_extsearch $oSearch */
$oSearch = oxNew(Search::class);
$aAllList = $oSearch->d3GetPriorityDebugArticleList();
$aAllKeys = array_keys($aAllList);
$aAllowedFields = [ 'oxartnum', 'oxtitle', 'oxvarselect', 'd3push', 'd3priority' ];
if (count($aAllList)) {
foreach (array_keys($aAllList[$aAllKeys[0]]) as $sFieldName) {
if (in_array(strtolower($sFieldName), $aAllowedFields) || strstr($sFieldName, '_IN_')) {
$aUsedFields[] = $sFieldName;
if (strstr($sFieldName, '_IN_') && strstr($sFieldName, '@@')) {
$sFieldName = $this->translateAnalysisFields($sFieldName);
}
$aFieldNames[] = $sFieldName;
}
}
}
}
$context['aUsedFields'] = $aUsedFields;
$context['aFieldNames'] = $aFieldNames;
$context['aAllList'] = $aAllList;
$sTplFile = '@'. Constants::OXID_MODULE_ID .'/admin/d3_cfg_extsearch_main_sortanalysis';
$sContent = $templateRenderer->renderTemplate($sTplFile, $context);
$outputManager = oxNew(Output::class);
$outputManager->setCharset(Registry::getConfig()->getActiveView()->getCharSet());
$outputManager->sendHeaders();
$outputManager->output('content', $sContent);
Registry::getConfig()->pageClose();
$outputManager->flushOutput();
die();
}
public function translateAnalysisFields($sFieldName)
{
$aFieldName = explode('@@', $sFieldName);
$searchParam = $aFieldName[0];
$sTranslationIdent = "D3_EXTSEARCH_MAIN_SORTDEBUG" . $aFieldName[1];
$sFieldName = $aFieldName[2];
return sprintf(Registry::getLang()->translateString($sTranslationIdent), $searchParam, $sFieldName);
}
/**
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function save()
{
startProfile(__METHOD__);
parent::save();
$myConfig = Registry::getConfig();
$sShopId = Registry::getConfig()->getShopId();
$aConfVars = Registry::get(Request::class)->getRequestEscapedParameter('confbools');
if (is_array($aConfVars)) {
foreach ($aConfVars as $sName => $sValue) {
$myConfig->saveShopConfVar(
'bool',
$sName,
$sValue,
$sShopId
);
}
}
stopProfile(__METHOD__);
}
/**
* @return void
* @throws ContainerExceptionInterface
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws NotFoundExceptionInterface
*/
protected function assertSearchFields()
{
$fields = d3_cfg_mod::get($this->_sModId)->getValue('aExtSearch_similarSearchFields');
$connection = ContainerFactory::getInstance()->getContainer()->get(ConnectionProviderInterface::class)->get();
$sSelectOa = 'SHOW FULL COLUMNS FROM '. $connection->quoteIdentifier(oxNew(Article::class)->getCoreTableName());
$sSelectOae = 'SHOW FULL COLUMNS FROM '. $connection->quoteIdentifier('oxartextends');
$records = array_merge(
$connection->prepare($sSelectOae)->executeQuery()->fetchAllAssociative(),
$connection->prepare($sSelectOa)->executeQuery()->fetchAllAssociative()
);
$usedCollation = null;
$differentCollationFields = [];
$missingFields = [];
array_walk($records, function ($item) use (&$usedCollation) {
if ($item['Field'] === 'OXTITLE') {
$usedCollation = $item['Collation'];
}
});
foreach ($fields as $fieldname) {
$exists = false;
$re = '/(\d+\s*=>\s*)?(.*)\s?/m';
preg_match($re, $fieldname, $matches);
$fieldname = trim($matches[2]);
reset($records);
array_walk($records, function ($item) use ($usedCollation, $fieldname, &$exists, &$differentCollationFields) {
if ($item['Field'] === strtoupper($fieldname)) {
$exists = true;
}
if ($item['Field'] === strtoupper($fieldname) && $item['Collation'] !== null && $item['Collation'] !== $usedCollation) {
$differentCollationFields[] = $fieldname;
}
});
if (!$exists) {
$missingFields[] = $fieldname;
}
}
if (count($differentCollationFields)) {
Registry::getUtilsView()->addErrorToDisplay(
sprintf(
Registry::getLang()->translateString('D3_EXTSEARCH_MAIN_COLLATIONERROR'),
'"'.implode('", "', array_unique($differentCollationFields)).'"'
)
);
}
if (count($missingFields)) {
Registry::getUtilsView()->addErrorToDisplay(
sprintf(
Registry::getLang()->translateString('D3_EXTSEARCH_MAIN_NOTEXISTINGFIELDS'),
'"'.implode('", "', array_unique($missingFields)).'"'
)
);
}
}
/**
* @return int
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function getArticleCountPerTick()
{
return $this->d3getGenerator()->getArticleCountPerTick();
}
/**
* @return array
* @throws FileException
*/
public function getPhoneticLanguages()
{
return $this->d3getGenerator()->getPhoneticLanguages();
}
/**
* @return mixed
*/
public function d3getFilterPageId()
{
return "search##".
Registry::getLang()->getLanguageAbbr()."##".
Registry::getConfig()->getShopId()."##".
md5(rawurlencode(strtolower(Registry::get(Request::class)->getRequestEscapedParameter('searchparam'))));
}
/**
* @return bool
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
*/
public function d3UseAlistFilters()
{
return $this->d3GetSet()->getLicenseConfigData(d3_extsearch_conf::SERIAL_BIT_HAS_FILTERS_IN_ALIST, false) || $this->d3GetSet()->isDemo();
}
}

View File

@ -0,0 +1,53 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin;
use D3\Extsearch\Application\Model\Constants;
use D3\Extsearch\Core\d3_extsearch_conf;
use D3\ModCfg\Application\Controller\Admin\d3_cfg_mod_main;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\StandardException;
class d3_cfg_extsearch_navigation extends d3_cfg_mod_main
{
protected $_sThisTemplate = '@'. Constants::OXID_MODULE_ID .'/admin/d3_cfg_extsearch_navigation';
protected $_sModId = 'd3_extsearch';
protected $_sHelpLinkMLAdd = 'D3_EXTSEARCH_HELPLINK_CONFIG';
protected $_sMenuItemTitle = 'D3MXEXTSEARCH';
protected $_sMenuSubItemTitle = 'D3MXEXTSEARCH_SETTINGS';
/**
* @return bool
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
*/
public function d3UseAlistFilters()
{
return $this->d3GetSet()->getLicenseConfigData(d3_extsearch_conf::SERIAL_BIT_HAS_FILTERS_IN_ALIST, false) || $this->d3GetSet()->isDemo();
}
}

View File

@ -0,0 +1,175 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin;
use D3\Extsearch\Application\Model\Constants;
use D3\ModCfg\Application\Controller\Admin\d3_cfg_mod_main;
use D3\ModCfg\Application\Model\d3filesystem;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Application\Model\Shop;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Output;
use OxidEsales\EshopCommunity\Internal\Container\ContainerFactory;
use OxidEsales\EshopCommunity\Internal\Framework\Templating\TemplateRenderer;
use OxidEsales\EshopCommunity\Internal\Framework\Templating\TemplateRendererBridgeInterface;
class d3_cfg_extsearch_plugins extends d3_cfg_mod_main
{
protected $_sThisTemplate = '@'. Constants::OXID_MODULE_ID .'/admin/d3_cfg_extsearch_plugins';
protected $_sModId = 'd3_extsearch';
protected $_sOldPluginName = 'se_browserinstall.xml';
protected $_sHelpLinkMLAdd = 'D3_EXTSEARCH_HELPLINK_CONFIG';
protected $_sMenuItemTitle = 'D3MXEXTSEARCH';
protected $_sMenuSubItemTitle = 'D3MXEXTSEARCH_SETTINGS';
/**
* ruft oxutils-Funktion auf, die vom Template aus nicht verfuegbar ist
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
*/
public function save()
{
if ($_FILES['value']['name']['sExtSearch_PluginIcon']) {
if (copy(
$_FILES['value']['tmp_name']['sExtSearch_PluginIcon'],
Registry::getConfig()->getConfigParam(
'sShopDir'
) . $_FILES['value']['name']['sExtSearch_PluginIcon']
)
) {
$oSet = $this->d3GetSet();
$oSet->setValue('sExtSearch_PluginIcon', $_FILES['value']['name']['sExtSearch_PluginIcon']);
$oSet->save();
};
}
parent::save();
return;
}
/**
* @return string
*/
public function getPluginFileName()
{
/** @var Shop $oShop */
$oShop = Registry::getConfig()->getActiveShop();
$oFS = oxNew(d3filesystem::class);
if ($oFS->exists(
$oFS->trailingslashit(Registry::getConfig()->getConfigParam('sShopDir')) . $this->_sOldPluginName
)
) {
$sFileName = $this->_sOldPluginName;
} else {
$sPattern = "[^a-zA-Z0-9]";
$sFileName = 'searchplugin_' . strtolower(
preg_replace('@' . $sPattern . '@', '_', $oShop->getFieldData('oxname'))
) . ".xml";
}
return $sFileName;
}
/**
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function generatePluginFile()
{
$oShop = Registry::getConfig()->getActiveShop();
/** @var d3filesystem $oFS */
$oFS = oxNew(d3filesystem::class);
$sIconData = false;
$blHasIcon = false;
$aImgInfo = [];
if ($this->d3GetSet()->getValue('sExtSearch_PluginIcon')) {
$sImgPath = $oFS->trailingslashit(Registry::getConfig()->getConfigParam('sShopDir')) .
$this->d3GetSet()->getValue('sExtSearch_PluginIcon');
$aImgInfo = getimagesize($sImgPath);
$fp_img = fopen($sImgPath, "r");
$sIconData = fread($fp_img, filesize($sImgPath));
fclose($fp_img);
$blHasIcon = count($aImgInfo) ? true : false;
}
$templateRenderer = $this->getTemplateRenderer();
$sTplFile = '@'. Constants::OXID_MODULE_ID .'/admin/d3_extsearch_plugin';
$context = [
'oShop' => $oShop,
'blHasIcon' => $blHasIcon,
'aImgInfo' => $aImgInfo,
'sBase64Icon' => base64_encode($sIconData),
'sShopUrl' => Registry::getConfig()->getConfigParam('sShopURL'),
];
$sFileContent = $templateRenderer->renderTemplate($sTplFile, $context);
$sFileName = $oFS->trailingslashit(Registry::getConfig()->getConfigParam('sShopDir')) .
$this->getPluginFileName();
$sMessage = $oFS->createFile($sFileName, $sFileContent, true)
? Registry::getLang()->translateString('D3_EXTSEARCH_PLUGIN_CREATE_SUCC')
: Registry::getLang()->translateString('D3_EXTSEARCH_PLUGIN_CREATE_NSUCC');
$sCharSet = "UTF-8";
$sTitle = Registry::getLang()->translateString('D3_EXTSEARCH_MAIN_GENERATOR_NOTE');
$context = [
'sCharset' => $sCharSet,
'sTitle' => $sTitle,
'sMessage' => $sMessage,
];
$sTplFile = '@'. Constants::OXID_MODULE_ID .'/admin/d3_extsearch_popup';
$content = $templateRenderer->renderTemplate($sTplFile, $context);
$outputManager = oxNew(Output::class);
$outputManager->setCharset(Registry::getConfig()->getActiveView()->getCharSet());
$outputManager->sendHeaders();
$outputManager->output('content', $content);
Registry::getConfig()->pageClose();
$outputManager->flushOutput();
die();
}
protected function getTemplateRenderer(): TemplateRenderer
{
return ContainerFactory::getInstance()->getContainer()
->get(TemplateRendererBridgeInterface::class)
->getTemplateRenderer();
}
}

View File

@ -0,0 +1,32 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin;
use D3\Extsearch\Application\Model\Constants;
use D3\ModCfg\Application\Controller\Admin\d3_cfg_mod_main;
class d3_cfg_extsearch_quicksearch extends d3_cfg_mod_main
{
protected $_sThisTemplate = '@'. Constants::OXID_MODULE_ID .'/admin/d3_cfg_extsearch_quicksearch';
protected $_sModId = 'd3_extsearch';
protected $_sHelpLinkMLAdd = 'D3_EXTSEARCH_HELPLINK_CONFIG';
protected $_sMenuItemTitle = 'D3MXEXTSEARCH';
protected $_sMenuSubItemTitle = 'D3MXEXTSEARCH_SETTINGS';
}

View File

@ -0,0 +1,176 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin;
use D3\Extsearch\Application\Model\Constants;
use D3\Extsearch\Application\Model\d3_extsearch_statisticlog;
use D3\Extsearch\Application\Model\d3_search;
use D3\ModCfg\Application\Controller\Admin\d3_cfg_mod_main;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Model\BaseModel;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
use stdClass;
class d3_cfg_extsearch_statistik extends d3_cfg_mod_main
{
protected $_sThisTemplate = '@'. Constants::OXID_MODULE_ID .'/admin/d3_cfg_extsearch_statistik';
protected $_sModId = 'd3_extsearch';
public $aSearchwords = [];
protected $_sHelpLinkMLAdd = 'D3_EXTSEARCH_HELPLINK_CONFIG';
protected $_sMenuItemTitle = 'D3MXEXTSEARCH';
protected $_sMenuSubItemTitle = 'D3MXEXTSEARCH_STATISTIC';
public $oD3OwnSearchHandler;
/**
* @return string
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
*/
public function render()
{
$sRet = parent::render();
$this->addTplParam('aTimes', $this->_getAvailableLogTime());
$this->addTplParam('aParams', Registry::get(Request::class)->getRequestEscapedParameter('statparams'));
return $sRet;
}
/**
* @return array
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
protected function _getAvailableLogTime()
{
$oStatistic = oxNew(d3_extsearch_statisticlog::class);
return $oStatistic->getAvailableLogTime();
}
/**
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function generateStatList()
{
/** @var d3_extsearch_statisticlog $oStat */
$oStat = oxNew(d3_extsearch_statisticlog::class);
$oStatList = $oStat->getStatisticList();
if ($oStatList->count()) {
/** @var BaseModel $oStatItem */
foreach ($oStatList as $oStatItem) {
$sFilterKey = base64_encode($oStatItem->getFieldData('OXSEARCHPARAM')) .
substr(base64_encode($oStatItem->getFieldData('OXPARAMETER')), 0, 16) .
substr(base64_encode($oStatItem->getFieldData('OXPARAMETER')), -16, 16);
$oSearchWord = new stdClass();
$oSearchWord->sWord = $oStatItem->getFieldData('OXSEARCHPARAM');
$oSearchWord->iCount = $oStatItem->getFieldData('COUNTER') + $this->aSearchwords[$sFilterKey]->iCount;
$oSearchWord->blGraph = $oStatItem->getFieldData('GRAPH');
$oSearchWord->aFilters = $this->_extractFilters($oStatItem->getFieldData('OXPARAMETER'));
$oSearchWord->sFilters = $this->_exportFilters($oStatItem->getFieldData('OXPARAMETER'));
$oSearchWord->iLang = $oStatItem->getFieldData('OXLANG');
$this->aSearchwords[$sFilterKey] = $oSearchWord;
}
}
}
/**
* @param $sFilters
* @return string
*/
protected function _exportFilters($sFilters)
{
$aFilters = unserialize($sFilters);
if (is_array($aFilters)) {
return base64_encode($sFilters);
}
return '';
}
/**
* @param $sFilters
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
protected function _extractFilters($sFilters)
{
$sFilters = html_entity_decode($sFilters);
$aFilters = unserialize($sFilters);
$oFilterList = $this->_d3GetOwnSearchHandler()->getFilterList();
$aPreparedFilters = [];
if (is_array($aFilters)) {
foreach ($aFilters as $sType => $sValue) {
$oFilter = $oFilterList->getFilterByStatisticLogId($sType);
$aPreparedFilters[] = $oFilter->getStatisticLogFilterObject($sValue);
}
}
return $aPreparedFilters;
}
/**
* @return array
*/
public function getStatList()
{
return $this->aSearchwords;
}
/**
* @return array
*/
public function getLangList()
{
return Registry::getLang()->getLanguageArray(null, true);
}
/**
* performance, use a class wide instance
*
* @return d3_search
*/
protected function _d3GetOwnSearchHandler()
{
if (!$this->oD3OwnSearchHandler) {
$this->oD3OwnSearchHandler = oxNew(d3_search::class);
}
return $this->oD3OwnSearchHandler;
}
}

View File

@ -0,0 +1,38 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin;
use D3\ModCfg\Application\Controller\Admin\Log\d3_cfg_log;
class d3_cfg_extsearchlog extends d3_cfg_log
{
protected $_sModId = 'd3_extsearch';
/**
* @return string
*/
public function d3getAdditionalUrlParams()
{
$sRet = parent::d3getAdditionalUrlParams();
if ($this->_sModId) {
$sRet .= '&sD3ModId='.$this->_sModId;
}
return $sRet;
}
}

View File

@ -0,0 +1,24 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin;
use D3\ModCfg\Application\Controller\Admin\Log\d3_cfg_log_list;
class d3_cfg_extsearchlog_list extends d3_cfg_log_list
{
protected $_sModId = 'd3_extsearch';
}

View File

@ -0,0 +1,33 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin;
use D3\ModCfg\Application\Controller\Admin\d3_cfg_mod_;
class d3_cfg_extsearchstat extends d3_cfg_mod_
{
/**
* @return string
*/
public function render()
{
$this->addTplParam('sListClass', d3_cfg_extsearchstat_list::class);
$this->addTplParam('sMainClass', d3_cfg_extsearch_statistik::class);
return parent::render();
}
}

View File

@ -0,0 +1,38 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin;
use D3\ModCfg\Application\Controller\Admin\d3_cfg_mod_list;
class d3_cfg_extsearchstat_list extends d3_cfg_mod_list
{
protected $_blD3ShowLangSwitch = false;
protected $_sListClass = null;
/**
* @return string
*/
public function render()
{
$sRet = parent::render();
$this->addTplParam("default_edit", "d3_cfg_extsearch_statistik");
return $sRet;
}
}

View File

@ -0,0 +1,35 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin;
use D3\ModCfg\Application\Controller\Admin\d3_cfg_mod_;
class d3_cfg_extsearchsyneditor extends d3_cfg_mod_
{
protected $_hasListItems = true;
/**
* @return string
*/
public function render()
{
$this->addTplParam('sListClass', d3_cfg_extsearchsyneditor_list::class);
$this->addTplParam('sMainClass', d3_cfg_extsearchsyneditor_main::class);
return parent::render();
}
}

View File

@ -0,0 +1,65 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin;
use D3\Extsearch\Application\Model\Constants;
use D3\Extsearch\Application\Model\d3_extsearch_term;
use D3\ModCfg\Application\Controller\Admin\d3_cfg_mod_list;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
class d3_cfg_extsearchsyneditor_list extends d3_cfg_mod_list
{
protected $_blD3ShowLangSwitch = true;
protected $_sThisTemplate = '@'. Constants::OXID_MODULE_ID .'/admin/d3_cfg_extsearchsyneditor_list';
protected $_sListClass = d3_extsearch_term::class;
protected $_blEmployMultilanguage;
protected $_sDefSortField = 'word';
protected $_sDefSortOrder = 'asc';
protected $_blShowListItems = true;
/**
* @return null|string
*/
public function render()
{
$sRet = parent::render();
$this->addTplParam("default_edit", "d3_cfg_extsearchsyneditor_main");
return $sRet;
}
/**
* @param array $whereQuery
* @param string $sqlFull
*
* @return string
* @throws DatabaseConnectionException
*/
protected function prepareWhereQuery($whereQuery, $sqlFull)
{
$sqlFull = parent::prepareWhereQuery( $whereQuery, $sqlFull);
if (method_exists($this, 'getItemListBaseObject')) {
$sqlFull .= " AND (" . $this->getItemListBaseObject()->getCoreTableName() . ".word != '') ";
} else {
$sqlFull .= " AND (" . $this->_oList->getBaseObject()->getCoreTableName() . ".word != '') ";
}
return $sqlFull;
}
}

View File

@ -0,0 +1,250 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin;
use D3\Extsearch\Application\Model\Constants;
use D3\Extsearch\Application\Model\d3_extsearch_synset;
use D3\Extsearch\Application\Model\d3_extsearch_term;
use D3\Extsearch\Application\Model\d3_semantic;
use D3\ModCfg\Application\Controller\Admin\d3_cfg_mod_main;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\DatabaseException;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
class d3_cfg_extsearchsyneditor_main extends d3_cfg_mod_main
{
protected $_sThisTemplate = '@'. Constants::OXID_MODULE_ID .'/admin/d3_cfg_extsearchsyneditor_main';
protected $_sModId = 'd3_extsearch';
protected $_aNonIndexedFields = ['oxartnum'];
protected $_sSavedId = null;
protected $_blUseOwnOxid = true;
public $sSearchTerm;
public $sAction;
public $sSynsetId;
public $aSynList;
protected $_aNaviItems = [
'new' => [
'sScript' => 'top.basefrm.list.EditThis( -1 );return false;',
'sTranslationId' => 'D3_EXTSEARCH_SYNED_MAIN_NEWWORD',
],
];
protected $_sMenuItemTitle = 'D3MXEXTSEARCH';
protected $_sMenuSubItemTitle = 'D3MXEXTSEARCH_SYNEDITOR';
public function init()
{
$this->sSearchTerm = Registry::get(Request::class)->getRequestEscapedParameter('searchterm');
$this->sAction = Registry::get(Request::class)->getRequestEscapedParameter('action');
$this->sSynsetId = Registry::get(Request::class)->getRequestEscapedParameter('synsetid');
parent::init();
}
/**
* @return string
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
*/
public function render()
{
$sRet = parent::render();
/** @var d3_extsearch_term $oTerm */
$oTerm = oxNew(d3_extsearch_term::class);
$this->addTplParam('edit', $oTerm);
/** @var d3_extsearch_synset $oSynset */
$oSynset = oxNew(d3_extsearch_synset::class);
$this->addTplParam('synset', $oSynset);
if (method_exists($this, 'getEditObjectId')) {
$soxId = $this->getEditObjectId();
} else {
$soxId = Registry::get(Request::class)->getRequestEscapedParameter("oxid");
$this->addTplParam("oxid", $soxId);
// check if we right now saved a new entry
if ($this->_sSavedId) {
$soxId = $this->_sSavedId;
$this->addTplParam("oxid", $soxId);
// for reloading upper frame
$this->addTplParam("updatelist", "1");
}
}
if ($soxId && $soxId != "-1") {
// load object
if (!$oTerm->load($soxId)) {
$soxId = '-1';
$this->addTplParam('oxid', $soxId);
} else {
$oTerm->load($soxId);
$oSynset->load($oTerm->getFieldData('synset_id'));
}
}
return $sRet;
}
/**
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseException
*/
public function save()
{
if (method_exists($this, 'getEditObjectId')) {
$soxId = $this->getEditObjectId();
} else {
$soxId = Registry::get(Request::class)->getRequestEscapedParameter("oxid");
}
$aParams = Registry::get(Request::class)->getRequestEscapedParameter("editval");
// default values
$aParams = $this->addDefaultValues($aParams);
/** @var d3_extsearch_term $oTerm */
$oTerm = oxNew(d3_extsearch_term::class);
$oTerm->setLanguage($this->_iEditLang);
/** @var d3_extsearch_synset $oSynset */
$oSynset = oxNew(d3_extsearch_synset::class);
if ($soxId != "-1") {
$oTerm->loadInLang($this->_iEditLang, $soxId);
} else {
$aParams['d3_extsearch_term__oxid'] = null;
$aParams['d3_extsearch_term__synset_id'] = $this->getNextSynsetId();
}
$oTerm->setLanguage(0);
$aParams['d3_extsearch_term__word'] = trim($aParams['d3_extsearch_term__word']);
$oTerm->assign($aParams);
$oTerm->setLanguage($this->_iEditLang);
$oTerm->save();
$aSynsetParams = Registry::get(Request::class)->getRequestEscapedParameter("synset");
$oSynset->load($oTerm->getFieldData('synset_id'));
$oSynset->assign($aSynsetParams);
$oSynset->save();
if (method_exists($this, 'setEditObjectId')) {
$this->setEditObjectId($oTerm->getId());
} elseif ($soxId == "-1") {
$this->_sSavedId = $oTerm->getId();
}
}
/**
* @param $aParams
* @return mixed
*/
public function addDefaultValues($aParams)
{
return $aParams;
}
/**
* @return mixed
*/
public function getLanguageList()
{
return Registry::getLang()->getLanguageArray(Registry::getLang()->getTplLanguage());
}
/**
* @return mixed
* @throws DBALException
* @throws DatabaseConnectionException
*/
public function getNextSynsetId()
{
/** @var d3_semantic $oSemantic */
$oSemantic = oxNew(d3_semantic::class);
return $oSemantic->getNextSynsetId();
}
/**
* @param $binValue
* @return int
*/
public function convertBin2Int($binValue)
{
return ord($binValue);
}
/**
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function searchSynonymLists()
{
/** @var d3_semantic $oSemantic */
$oSemantic = oxNew(d3_semantic::class);
$this->aSynList = $oSemantic->getSynonymListsForWord($this->sSearchTerm);
}
/**
* @return mixed
*/
public function getSynonymLists()
{
return $this->aSynList;
}
/**
* @return mixed
*/
public function getSearchTerm()
{
return $this->sSearchTerm;
}
/**
* @return mixed
*/
public function getAction()
{
return $this->sAction;
}
/**
* @return mixed
*/
public function getSynsetId()
{
return $this->sSynsetId;
}
}

View File

@ -0,0 +1,214 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller\Admin;
use D3\Extsearch\Application\Model\Constants;
use D3\Extsearch\Application\Model\d3_extsearch_term;
use D3\Extsearch\Application\Model\d3_semantic;
use D3\ModCfg\Application\Controller\Admin\d3_cfg_mod_main;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\DatabaseException;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
class d3_cfg_extsearchsyneditor_manage extends d3_cfg_mod_main
{
protected $_sThisTemplate = '@'. Constants::OXID_MODULE_ID .'/admin/d3_cfg_extsearchsyneditor_manage';
protected $_sModId = 'd3_extsearch';
protected $_aNonIndexedFields = ['oxartnum'];
protected $_blUseOwnOxid = true;
public $sSearchTerm;
public $sAction;
public $sSynsetId;
public $aSynList;
protected $_aNaviItems = [
'new' => [
'sScript' => 'top.basefrm.list.editThis( -1 );return false;',
'sTranslationId' => 'D3_EXTSEARCH_SYNED_MAIN_NEWWORD',
],
];
protected $_sMenuItemTitle = 'D3MXEXTSEARCH';
protected $_sMenuSubItemTitle = 'D3MXEXTSEARCH_SYNEDITOR';
public function init()
{
$this->sSearchTerm = Registry::get(Request::class)->getRequestEscapedParameter('searchterm');
$this->sAction = Registry::get(Request::class)->getRequestEscapedParameter('action');
$this->sSynsetId = Registry::get(Request::class)->getRequestEscapedParameter('synsetid');
parent::init();
}
/**
* @return string
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
*/
public function render()
{
$sRet = parent::render();
/** @var d3_extsearch_term $oTerm */
$oTerm = oxNew(d3_extsearch_term::class);
if (method_exists($this, 'getEditObjectId')) {
$soxId = $this->getEditObjectId();
} else {
$soxId = Registry::get(Request::class)->getRequestEscapedParameter("oxid");
}
if ($soxId && $soxId != "-1") {
// load object
$oTerm->load($soxId);
}
$this->addTplParam('aSynList', $oTerm->getSynonymArrayForSynsetId());
$this->addTplParam('edit', $oTerm);
return $sRet;
}
public function save()
{
$soxId = $this->getEditObjectId();
$aParams = Registry::get(Request::class)->getRequestEscapedParameter("editval");
// default values
$aParams = $this->addDefaultValues($aParams);
$oTerm = oxNew(d3_extsearch_term::class);
$oTerm->setLanguage($this->_iEditLang);
if ($soxId != "-1") {
$oTerm->loadInLang($this->_iEditLang, $soxId);
} else {
$aParams['d3_extsearch_term__oxid'] = null;
$aParams['d3_extsearch_term__synset_id'] = $this->getNextSynsetId();
}
$oTerm->setLanguage(0);
$aParams['d3_extsearch_term__word'] = trim($aParams['d3_extsearch_term__word']);
$oTerm->assign($aParams);
$oTerm->setLanguage($this->_iEditLang);
$oTerm->save();
$this->setEditObjectId($oTerm->getId());
}
/**
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseException
*/
public function savesynonym()
{
$oTerm = oxNew(d3_extsearch_term::class);
$oTerm->assign(Registry::get(Request::class)->getRequestEscapedParameter('editval'));
$oTerm->save();
$this->addTplParam('updatelist', 1);
}
public function deletesynonym()
{
$oTerm = oxNew(d3_extsearch_term::class);
$oTerm->delete(Registry::get(Request::class)->getRequestEscapedParameter('deloxid'));
$this->addTplParam('updatelist', 1);
}
/**
* @param $aParams
* @return mixed
*/
public function addDefaultValues($aParams)
{
return $aParams;
}
/**
* @return mixed
*/
public function getLanguageList()
{
return Registry::getLang()->getLanguageArray();
}
/**
* @return mixed
* @throws DBALException
* @throws DatabaseConnectionException
*/
public function getNextSynsetId()
{
$oSemantic = oxNew(d3_semantic::class);
return $oSemantic->getNextSynsetId();
}
/**
* @param $binValue
* @return int
*/
public function convertBin2Int($binValue)
{
return ord($binValue);
}
/**
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function searchSynonymLists()
{
$oSemantic = oxNew(d3_semantic::class);
$this->aSynList = $oSemantic->getSynonymListsForWord($this->sSearchTerm);
}
public function getSynonymLists()
{
return $this->aSynList;
}
public function getSearchTerm()
{
return $this->sSearchTerm;
}
public function getAction()
{
return $this->sAction;
}
public function getSynsetId()
{
return $this->sSynsetId;
}
}

View File

@ -0,0 +1,67 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller;
use D3\Extsearch\Application\Model\d3_search_generator;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Core\Controller\BaseController;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\FileException;
class d3_extsearch_cron_response extends BaseController
{
/**
* @return int
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
*/
public function generateIndex()
{
startProfile(__METHOD__);
$generator = oxNew(d3_search_generator::class);
$iProcessedArticles = $generator->updateArticles(true);
stopProfile(__METHOD__);
return $iProcessedArticles;
}
/**
* Generiert aus jedem Semantic-Lexikoneintrag den phonetischen Code
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
*/
public function generatePhoneticSemantic()
{
startProfile(__METHOD__);
$generator = oxNew(d3_search_generator::class);
$useNoTicker = true;
$iTermPos = 0;
$iProcessedTerms = $generator->updateSemantics($iTermPos, $useNoTicker);
stopProfile(__METHOD__);
return $iProcessedTerms;
}
}

View File

@ -0,0 +1,137 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller;
use D3\Extsearch\Application\Model\d3_search;
use D3\ModCfg\Application\Model\Configuration\d3_cfg_mod;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Core\ConfigFile;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Output;
use OxidEsales\Eshop\Core\Controller\BaseController;
class d3_extsearch_response extends BaseController
{
private $_sModId = 'd3_extsearch';
public $oD3SearchHandler;
public function render()
{
throw oxNew(StandardException::class, 'missing function name');
}
/**
* @param $aParams
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
* @throws StandardException
*/
public function getSuggestContent()
{
startProfile(__METHOD__);
Registry::getConfig()->setActiveView($this);
ob_start();
// disable displaying debug informations, that will destroy JSON document
// parameter "d3forcedebug=1" enables forced debug mode
$forcedDebug = (bool) Registry::getRequest()->getRequestEscapedParameter('d3forcedebug');
if (!$forcedDebug) {
Registry::getConfig()->setConfigParam('iDebug', 0);
Registry::get(ConfigFile::class)->setVar('iDebug', 0);
}
$outputManager = oxNew(Output::class);
$outputManager->setCharset(Registry::getConfig()->getActiveView()->getCharSet());
$outputManager->setOutputFormat($forcedDebug ? Output::OUTPUT_FORMAT_HTML : Output::OUTPUT_FORMAT_JSON);
$outputManager->sendHeaders();
// fetch debug contents and add it after suggest window
$sContent = $this->_getD3SearchHandler()->suggestGetContent(
Registry::getRequest()->getRequestEscapedParameter('searchParam')
);
$sContent .= ob_get_contents();
ob_end_clean();
$outputManager->output('searchparam', Registry::getRequest()->getRequestEscapedParameter('searchParam'));
$outputManager->output('content', $sContent);
Registry::getConfig()->pageClose();
$outputManager->flushOutput();
$this->_addProfiling();
stopProfile(__METHOD__);
Registry::getConfig()->pageClose();
exit;
}
/**
* performance, use a class wide instance
*
* @return d3_search
*/
protected function _getD3SearchHandler()
{
if (!$this->oD3SearchHandler) {
$this->oD3SearchHandler = oxNew(d3_search::class);
}
return $this->oD3SearchHandler;
}
/**
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
protected function _addProfiling()
{
startProfile(__METHOD__);
d3_cfg_mod::get($this->_sModId)->d3getLog()->d3GetProfiling();
stopProfile(__METHOD__);
}
/**
* @return string
*/
public function d3getFilterPageId()
{
/** @var array<string|int, mixed> $mArgs */
$mArgs = func_get_args();
$sPageId = "search##".
Registry::getLang()->getLanguageAbbr()."##".
Registry::getConfig()->getShopId()."##".
md5(rawurlencode(strtolower($mArgs['searchParam'])));
return $sPageId;
}
}

View File

@ -0,0 +1,857 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Application\Controller;
use D3\Extsearch\Modules\Application\Model\d3_oxsearch_extsearch;
use D3\Extsearch\Modules\Application\Controller\d3_alist_extsearch;
use D3\Extsearch\Application\Model\Filters\d3FilterList;
use D3\Extsearch\Application\Model\Filters\d3Filter;
use D3\Extsearch\Application\Model\d3_search;
use D3\Extsearch\Core\d3_extsearch_conf;
use D3\ModCfg\Application\Model\Configuration\d3_cfg_mod;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Application\Controller\ManufacturerListController;
use OxidEsales\Eshop\Application\Controller\VendorListController;
use OxidEsales\Eshop\Application\Controller\ArticleListController;
use OxidEsales\Eshop\Application\Controller\SearchController;
use OxidEsales\Eshop\Application\Model\ArticleList;
use OxidEsales\Eshop\Application\Model\CategoryList;
use OxidEsales\Eshop\Application\Model\Search;
use OxidEsales\Eshop\Application\Model\VendorList;
use OxidEsales\Eshop\Application\Model\ManufacturerList;
use OxidEsales\Eshop\Application\Model\Category;
use OxidEsales\Eshop\Application\Model\Manufacturer;
use OxidEsales\Eshop\Application\Model\Vendor;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\FileException;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
use OxidEsales\Eshop\Core\Str;
use OxidEsales\Eshop\Core\StrMb;
class d3_xlist_extsearch
{
private $_sModId = 'd3_extsearch';
protected $_oaListController;
/** @var null|d3_oxsearch_extsearch */
public $oD3SearchHandler;
public $oD3OwnSearchHandler = null;
public $aPriceSteps;
public $aPriceSelector;
public $sPriceSelector;
protected $_sD3AdditionalParams = null;
protected $_aSelectedAttributes;
private $_blUseAlistFilter;
/**
* d3_xlist_extsearch constructor.
* @param $oListController
* @throws StandardException
*/
public function __construct($oListController)
{
if (false == ($oListController instanceof ArticleListController)
&& false == ($oListController instanceof SearchController)
) {
$sMessage = 'Argument passed to '.__METHOD__.' must be an instance of ArticleListController or SearchController';
$oException = oxNew(StandardException::class, $sMessage);
throw $oException;
}
$this->_oaListController = $oListController;
}
/**
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function render()
{
if ($this->d3GetSet()->isActive() && $this->_d3UseAlistFilters()) {
$this->_d3AddAllTplParams();
}
}
/**
* @param Category|Manufacturer|Vendor $oCategory
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function addAListFilters($oCategory)
{
if (false == $this->_d3UseAlistFilters()) {
return;
}
$oFilterList = $this->d3GetOwnSearchHandler()->getFilterList();
if (false == method_exists($oCategory, 'isPriceCategory') // in case of manufacturerlist class
|| false == $oCategory->isPriceCategory()
) {
$aExclude = [];
if ($this->getaListController() instanceof VendorListController) {
$sActCat = Registry::get(Request::class)->getRequestEscapedParameter('cnid');
/** @var StrMb $oStrMb */
$oStrMb = Str::getStr();
$_POST["searchvendor"] = ($oStrMb->preg_match('/^v_.?/i', $sActCat)) ? str_replace(
'v_',
'',
$sActCat
) : null;
$aExclude[] = d3FilterList::VendorFilterId;
} elseif ($this->getaListController() instanceof ManufacturerListController) {
$_POST["searchmanufacturer"] = Registry::get(Request::class)->getRequestEscapedParameter('mnid');
$aExclude[] = d3FilterList::ManufacturerFilterId;
} elseif ($this->getaListController() instanceof ArticleListController) {
$_POST["searchcnid"] = Registry::get(Request::class)->getRequestEscapedParameter('cnid');
$aExclude[] = d3FilterList::CategoryFilterId;
}
/** @var d3Filter $oFilter */
foreach ($oFilterList->getAllExcept($aExclude) as $oFilter) {
$oFilter->generateFilterList();
}
} elseif (method_exists($oCategory, 'isPriceCategory') // in case of manufacturerlist class
&& $oCategory->isPriceCategory()
) {
$oCur = Registry::getConfig()->getActShopCurrencyObject();
$iCurPrecision = $oCur->decimal;
$pow = pow(10, $iCurPrecision);
$aPriceSelector = [
'min' => $oCategory->getFieldData('oxpricefrom'),
'max' => $oCategory->getFieldData('oxpriceto'),
];
$aPSOV = [
'min' => $oCategory->getFieldData('oxpricefrom') * $pow,
'max' => $oCategory->getFieldData('oxpriceto') * $pow,
];
$_POST["d3psov"] = $aPSOV;
$_POST["priceselector"] = $aPriceSelector;
$aExclude = [
d3FilterList::CategoryFilterId,
];
/** @var d3Filter $oFilter */
foreach ($oFilterList->getAllExcept($aExclude) as $oFilter) {
$oFilter->generateFilterList();
}
}
}
/**
* @param $iArticleCount
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function addSearchFilters($iArticleCount)
{
$oFilterList = $this->d3GetOwnSearchHandler()->getFilterList();
/** @var d3Filter $oFilter */
foreach ($oFilterList->getArray() as $oFilter) {
if ($oFilter->canBeUsed($iArticleCount)) {
$oFilter->generateFilterList();
}
}
}
/**
* @param ArticleList $oArtList
*
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function setTplParams($oArtList)
{
$this->getaListController()->addTplParam('blD3ShowFilters', $this->d3CanShowFilters($oArtList));
$this->getaListController()->addTplParam('blD3HasSelectedFilters', $this->d3GetOwnSearchHandler()->d3HasSelectedFilters());
}
/**
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function _d3AddAllTplParams()
{
$sSeparator = htmlspecialchars(ini_get('arg_separator.output'));
// set TPL parameter, if category and vendor selectlists on frontends left side shouldn't changed
if (false == strstr($this->getaListController()->getViewDataElement('additionalparams'), $sSeparator.'isextsearch=') //
&& ($sExtSearchFlag = Registry::get(Request::class)->getRequestEscapedParameter('isextsearch')) //
) {
$this->getaListController()->addTplParam(
'additionalparams',
$this->getaListController()->getViewDataElement('additionalparams') . $sSeparator.'isextsearch='.$sExtSearchFlag
);
$this->getaListController()->addTplParam('isextsearch', $sExtSearchFlag);
}
/** @var d3Filter $oFilter */
foreach ($this->d3GetOwnSearchHandler()->getFilterList() as $oFilter) {
if ($oFilter->hasUserSelection()) {
$this->_sD3AdditionalParams .= $oFilter->getD3AdditionalParams();
}
}
// send browser plugin status to smarty
$this->getaListController()->addTplParam('blSearchPluginLink', $this->d3GetSet()->getValue('blExtSearch_enablePluginLink'));
}
/**
* @param ArticleList $oArtList
*
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3CanShowFilters($oArtList)
{
if ($oArtList->count() == 0) {
return false;
}
$oFilterList = $this->d3GetOwnSearchHandler()->getFilterList();
/** @var d3Filter $oFilter */
foreach ($oFilterList->getArray() as $oFilter) {
if ($oFilter->canShowFilter()) {
return true;
}
}
return false;
}
/**
* @return d3_cfg_mod
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function d3GetSet()
{
$oSet = d3_cfg_mod::get($this->_d3getModId());
// set "allow search without searchparam"
$oSet->setValue(d3_extsearch_conf::CONF_ALLOWEMPTYSEARCHSTR, true);
return $oSet;
}
/**
* @return string
*/
private function _d3getModId()
{
return $this->_sModId;
}
/**
* performance, use a class wide instance
*
* @return d3_oxsearch_extsearch
*/
public function d3GetSearchHandler(): d3_oxsearch_extsearch
{
if (!$this->oD3SearchHandler) {
/** @var d3_oxsearch_extsearch $searchHandler */
$searchHandler = oxNew(Search::class);
$this->oD3SearchHandler = $searchHandler;
}
return $this->oD3SearchHandler;
}
/**
* performance, use a class wide instance
*
* @return d3_search
*/
public function d3GetOwnSearchHandler()
{
if (!$this->oD3OwnSearchHandler) {
$this->oD3OwnSearchHandler = oxNew(d3_search::class);
}
return $this->oD3OwnSearchHandler;
}
/**
* Template variable getter. Returns hits related vendor list
*
* @return CategoryList
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetCategoryList()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getCategoryFilter()->getFilterList();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasCategoryList()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getCategoryFilter()->canShowFilter();
}
/**
* Template variable getter. Returns hits related vendor list
* @return Vendorlist
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetVendorList()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getVendorFilter()->getFilterList();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasVendorList()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getVendorFilter()->canShowFilter();
}
/**
* Template variable getter. Returns hits related manufacturer list
* @return Manufacturerlist
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetManufacturerList()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getManufacturerFilter()->getFilterList();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasManufacturerList()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getManufacturerFilter()->canShowFilter();
}
/**
* Template variable getter. Returns hits related attribute list (generating in $this->_d3GetAttributeList())
*
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetAttributeList()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getAttributeFilter()->getFilterList();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasAttributeList()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getAttributeFilter()->canShowFilter();
}
/**
* Template variable getter. Returns price selector list
*
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws FileException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3getPriceSteps()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getPriceFilter()->getFilterList();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasjQuerySlider()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getPriceFilter()->canHaveMultipleSelection();
}
/**
* @param string $sBase
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3AddBaseUrlParams($sBase = '')
{
$sRet = '';
if ($this->d3GetSet()->isActive()) {
$sSeparator = htmlspecialchars(ini_get('arg_separator.output'));
if (substr($sBase, -1) !== $sSeparator) {
$sRet .= $sSeparator;
}
$blExcludeShopHandledSingleParameters = $this->isControllerClass(SearchController::class) ? true : false;
/** @var d3Filter $oFilter */
foreach ($this->d3GetOwnSearchHandler()->getFilterList() as $oFilter) {
$blExists = false;
foreach ($oFilter->getParameterCheckPattern('@', $blExcludeShopHandledSingleParameters) as $sPattern) {
if (preg_match($sPattern, $sBase)) {
$blExists = true;
break;
}
}
if (false === $blExists) {
$sRet .= $oFilter->getNavigationParameterString(false, $blExcludeShopHandledSingleParameters);
}
}
$sRet = in_array($sRet, ['&amp;', '&']) ? '' : $sRet;
if (false == strstr($sBase, $sSeparator.'isextsearch=')
&& (strlen($sRet) || $this->d3GetOwnSearchHandler()->getFilterList()->getAttributeFilter()->d3HasAttributeValues())
) {
$sRet .= "isextsearch=alist".$sSeparator;
}
}
return $sRet;
}
public function isControllerClass($sCheckClassKey)
{
$sClassKey = Registry::getConfig()->getActiveView()->getClassKey();
return strtolower($sClassKey) === strtolower($sCheckClassKey);
}
/**
* @return string
*/
public function d3GetDeselectValue()
{
return $this->d3GetSearchHandler()->d3GetDeselectValue();
}
/**
* @return string
*/
public function d3getFilterPageId()
{
switch (true) {
case $this->getaListController() instanceof ManufacturerListController:
$sIdent = Registry::get(Request::class)->getRequestEscapedParameter('mnid');
break;
default:
$sIdent = Registry::get(Request::class)->getRequestEscapedParameter('cnid');
}
$sPageId = '##'.
Registry::getLang()->getLanguageAbbr()."##".
Registry::getConfig()->getShopId()."##".
$sIdent;
return $sPageId;
}
/**
* @param $sOptionTitle
*
* @return string
*/
public function d3GetMultipleSelectionTranslation($sOptionTitle)
{
return sprintf(Registry::getLang()->translateString('D3_EXTSEARCH_EXT_MULTIPLESELECT'), $sOptionTitle);
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasFilters()
{
$oFilterList = $this->d3GetOwnSearchHandler()->getFilterList();
/** @var d3Filter $oFilter */
foreach ($oFilterList->getArray() as $oFilter) {
if ($oFilter->canShowFilter()) {
return true;
}
}
return false;
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasPriceFilter()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getPriceFilter()->canShowFilter();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3CanShowPriceFilterSlider()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getPriceFilter()->canShowPriceFilterSlider();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderInfoMinValue()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getPriceFilter()->getPriceSliderInfoMinValue();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderInfoMaxValue()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getPriceFilter()->getPriceSliderInfoMaxValue();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderInputMinValue()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getPriceFilter()->getPriceSliderInputMinValue();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderInputMaxValue()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getPriceFilter()->getPriceSliderInputMaxValue();
}
/**
* @return float|int
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function d3getPricePrecision()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getPriceFilter()->getPricePrecision();
}
/**
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3getPriceLimits()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getPriceFilter()->getPriceLimits();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderOriginalMinValue()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getPriceFilter()->getPriceSliderOriginalMinValue();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderOriginalMaxValue()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getPriceFilter()->getPriceSliderOriginalMaxValue();
}
/**
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function d3ClearFilter()
{
$this->d3GetSearchHandler()->d3ClearFilters();
$oView = Registry::getConfig()->getActiveView();
$oView->setFncName(null);
}
/**
* @param $aParams
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function addNavigationParams($aParams)
{
$aAddParams = [];
if ($this->d3GetSet()->isActive()
&& $this->_d3UseAlistFilters()
) {
$this->d3GetSearchHandler()->d3RemoveEmptyParameters($aParams);
if (strlen(Registry::get(Request::class)->getRequestEscapedParameter('searchparam'))) {
$aAddParams['searchparam'] = htmlspecialchars(
html_entity_decode(Registry::get(Request::class)->getRequestEscapedParameter('searchparam'))
);
}
/** @var d3Filter $oFilter */
foreach ($this->d3GetOwnSearchHandler()->getFilterList() as $oFilter) {
$aAddParams = array_merge($aAddParams, $oFilter->getNavigationParameterList());
}
if ((count($aAddParams) || $this->d3GetOwnSearchHandler()->getFilterList()->getAttributeFilter()->d3HasAttributeValues()) &&
($sExtSearchFlag = Registry::get(Request::class)->getRequestEscapedParameter('isextsearch'))
) {
$aAddParams['isextsearch'] = $sExtSearchFlag;
}
}
return array_merge($aParams, $aAddParams);
}
/**
* returns all selections (inclusive attributes) as a merged array
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function getAllSelections()
{
$selections = [];
/** @var d3Filter $oFilter */
foreach ($this->d3GetOwnSearchHandler()->getFilterList() as $oFilter) {
$selection = $oFilter->getUserSelection();
if (!(is_array($selection) && !count($selection))) {
$selections[] = $selection;
}
}
return $selections;
}
/**
* returns a unique hash from selected filter combination
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function getHashedSelections()
{
return md5(serialize($this->getAllSelections()));
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
private function _d3UseAlistFilters()
{
if (null === $this->_blUseAlistFilter) {
$this->_blUseAlistFilter = ($this->d3GetSet()->getLicenseConfigData(d3_extsearch_conf::SERIAL_BIT_HAS_FILTERS_IN_ALIST, false)
|| $this->d3GetSet()->isDemo())
&& $this->d3GetSet()->getValue(d3_extsearch_conf::CONF_USEFILTERSINLISTS);
}
return $this->_blUseAlistFilter;
}
/**
* @return d3_alist_extsearch|ArticleListController
*/
public function getaListController()
{
return $this->_oaListController;
}
/**
* @return string
*/
public function getD3AdditionalParams()
{
return $this->_sD3AdditionalParams;
}
}

View File

@ -0,0 +1,2 @@
<?php ?><?php /** This Software is the property of DÂł Data Development and is protected by copyright law - it is NOT Freeware. Any unauthorized use of this software without a valid license key is a violation of the license agreement and will be prosecuted by civil and criminal law. Inhaber: Thomas Dartsch Alle Rechte vorbehalten @package erweiterte_Suche @version 8.0.1.0 SourceGuardian (26.06.2024) @author Daniel Seifert support@shopmodule.com @copyright (C) 2024, D3 Data Development @see https://www.d3data.de */ ?><?php
if(!function_exists('sg_load')){$__v=phpversion();$__x=explode('.',$__v);$__v2=$__x[0].'.'.(int)$__x[1];$__u=strtolower(substr(php_uname(),0,3));$__ts=(@constant('PHP_ZTS') || @constant('ZEND_THREAD_SAFE')?'ts':'');$__f=$__f0='ixed.'.$__v2.$__ts.'.'.$__u;$__ff=$__ff0='ixed.'.$__v2.'.'.(int)$__x[2].$__ts.'.'.$__u;$__ed=@ini_get('extension_dir');$__e=$__e0=@realpath($__ed);$__dl=function_exists('dl') && function_exists('file_exists') && @ini_get('enable_dl') && !@ini_get('safe_mode');if($__dl && $__e && version_compare($__v,'5.2.5','<') && function_exists('getcwd') && function_exists('dirname')){$__d=$__d0=getcwd();if(@$__d[1]==':') {$__d=str_replace('\\','/',substr($__d,2));$__e=str_replace('\\','/',substr($__e,2));}$__e.=($__h=str_repeat('/..',substr_count($__e,'/')));$__f='/ixed/'.$__f0;$__ff='/ixed/'.$__ff0;while(!file_exists($__e.$__d.$__ff) && !file_exists($__e.$__d.$__f) && strlen($__d)>1){$__d=dirname($__d);}if(file_exists($__e.$__d.$__ff)) dl($__h.$__d.$__ff); else if(file_exists($__e.$__d.$__f)) dl($__h.$__d.$__f);}if(!function_exists('sg_load') && $__dl && $__e0){if(file_exists($__e0.'/'.$__ff0)) dl($__ff0); else if(file_exists($__e0.'/'.$__f0)) dl($__f0);}if(!function_exists('sg_load')){$__ixedurl='https://www.sourceguardian.com/loaders/download.php?php_v='.urlencode($__v).'&php_ts='.($__ts?'1':'0').'&php_is='.@constant('PHP_INT_SIZE').'&os_s='.urlencode(php_uname('s')).'&os_r='.urlencode(php_uname('r')).'&os_m='.urlencode(php_uname('m'));$__sapi=php_sapi_name();if(!$__e0) $__e0=$__ed;if(function_exists('php_ini_loaded_file')) $__ini=php_ini_loaded_file(); else $__ini='php.ini';if((substr($__sapi,0,3)=='cgi')||($__sapi=='cli')||($__sapi=='embed')){$__msg="\nPHP script '".__FILE__."' is protected by SourceGuardian and requires a SourceGuardian loader '".$__f0."' to be installed.\n\n1) Download the required loader '".$__f0."' from the SourceGuardian site: ".$__ixedurl."\n2) Install the loader to ";if(isset($__d0)){$__msg.=$__d0.DIRECTORY_SEPARATOR.'ixed';}else{$__msg.=$__e0;if(!$__dl){$__msg.="\n3) Edit ".$__ini." and add 'extension=".$__f0."' directive";}}$__msg.="\n\n";}else{$__msg="<html><body>PHP script '".__FILE__."' is protected by <a href=\"https://www.sourceguardian.com/\">SourceGuardian</a> and requires a SourceGuardian loader '".$__f0."' to be installed.<br><br>1) <a href=\"".$__ixedurl."\" target=\"_blank\">Click here</a> to download the required '".$__f0."' loader from the SourceGuardian site<br>2) Install the loader to ";if(isset($__d0)){$__msg.=$__d0.DIRECTORY_SEPARATOR.'ixed';}else{$__msg.=$__e0;if(!$__dl){$__msg.="<br>3) Edit ".$__ini." and add 'extension=".$__f0."' directive<br>4) Restart the web server";}}$__msg.="</body></html>";}die($__msg);exit();}}return sg_load('7A3737B3B37C1D97AAQAAAAhAAAABKgAAACABAAAAAAAAAD/NSMcx4QQItd6EURjPe7MWLOJIr6Gfg0gb8L/IGI0euzndJ6xe0ctoAVz3SB/lKvaEosl2PV1pfmBelcL+NFPhZ4/2WnRz3/0Zb07YsPjUIYpuisu51/lLVYMj+CmSaE9wCEslYCjj8LeBiWEcu8VDEBTA6jiuaxEZ0zYSxIUbtrEgV+WpvxhgHjDrwfSIE/XathObSlaUaAXIMfApVHmpsIJyrwpV4MACAAAAJgBAACsGWeye1CSKeN66uEY8/+1rFZTB0ZvrJNWLC6rQgvfYfEkmQ2CH6QBW7hyoPegNYeABlbRqiA/He4/l6pLuUDBGob4qAabZcHSzUBSP5BMXh5UEHGSTwMH8FSh2g8PUrwr1BIWJi4fjoezirLuJYSoxYNZgp1MJAJKqXM/Y+IsRpFQv4hiNZ3cEg2VzD2kGlXe7usCQOsxMnHZxC6w6cRO6xsJhGm7X3JjoaEVMV7LXN4ka2unqSHD9qce+Zk/qa3rDkXblpGlVZ42wDkGQTkN5juYXC6jFdeG1XhwEpsxQOjoC3i91VnbS+F1WC8LCfHGE4pHbc0v/bdHJC4P4ziL1Kg9+1Qc9TregbWV1EKE2MwXS7JupMrIFcPZcGyG2E/3fpIo+ujz2rbVFYkC64gFeRLbDgDMFDkk528DMFMewp1CjdoyVOwZOrkyQ3SRUNK+o0AV4lTHMBA1xA5uXUYOS5WHNm3O52W28Dn/RzBPt4VIFdfYSAVY2BjyydUkDcFxNusoygri4tvor9gGKxMuvH8DgYX71qpRAAAAiAEAAO96RdpCsBSI3IzoCs5fjd0y9SZH2Ez+8tlar57sym2qrMnqIs9SWa6oNV0tXYENveNXvqU3AFKmJllI9a1KN7A6sItAfusPfQ/tXfcRBv+7fWKsaNfoZMgU7CcDs1edG5ic/Op+sYvu55nF+qGBmlIErIKBk2JKj0aClGNTDbNjmBO5Vh/UGgd7tLJY3sStKaAepYmirWuGx18/vJS41CQaYAlHqY5u2UqVFvepbiDNHG7mS6TRbbzx7xbhvIIHqWMiZTw6NhP4uxogoU8743fmILsXGnzE+VIiSO4kIzLxOXa9FZNm3u0n6WadLz2X2Zrhfqj/gbFQPklyiMg8E9k5z6JbjvneZOX9obobmuOpDw6RcJvzfBGAVxh6YQE6hix96YyGr/j+DVnCIraOiRzX0bNDjk5dbns70Te+YNnrhFfFXS3emptFHcEF2h4ikFs8ON1gj4fwPwVox8LFtluYuEiuAp77MymIgf5+z2FB+ErhFjYXgzd1M7VDEJJEoN9ybd9oUaoFUgAAAIgBAAAoJ7JHYxNHSVEFHN27c+YEuF0Om5iwN/fyG3nuEJ/VOj82eRHCNtlLAabhM7+Qr22OYrslTUKFXyBbw5l1CxqvLlRAb0Eirs1ecohjWhy1QVvzFKtlFclECdIGF+TvGLyzSYWeLvMRvobB5izlzg9EkV4rzZFmENM2AyzTJnQs4UdfpIetaDESmoxldc/vQ+inE16PD/HvyVs8f6pTL5N1hDO7pY+ojRhls1uCEivPnYywT46QWdxylZDQT9R41Wlqphvxy7WL6Yr4uetTndh+O+oMipbP7D2iYriieeyAmG7+kJo5bherjpguZsNJkB0DJ8mMWJDoBZ1sr5W7aCDZOR/kiM/QQ7RqIRgSygwIuDO+YONVq2qbMRVmV7ODF4PwmKrb9iuJNT5ZIW6m9ajOjJNO0zLZG1LXk7jhAgChj4WnTeWj0gQtWeIfGphoxOMmxagMqHWj4LxYx+/cy5evyXisHq6+Pdr2LJLvB5zrXjJY7SSYT9BVTkDe1e2o1WlQCsqsEKS/bgAAAAA=');

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,24 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
// @codeCoverageIgnoreStart
$sLangName = "Deutsch";
$aLang = include __DIR__."/d3_extsearch_translations.php";
// @codeCoverageIgnoreEnd

View File

@ -0,0 +1,110 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
// @codeCoverageIgnoreStart
return [
'charset' => 'UTF-8',
'D3_EXTSEARCH_FIELD_NOTICE' => 'Suchbegriff',
'D3_EXTSEARCH_QUICK_HITS' => 'Treffer fĂĽr',
'D3_EXTSEARCH_QUICK_SIMILARHITS' => 'ähnliche Treffer für',
'D3_EXTSEARCH_QUICK_MULTIPLEHITS' => 'Vorschläge für Ihre Suche',
'D3_EXTSEARCH_QUICK_TOBASKET' => 'in den Warenkorb',
'D3_EXTSEARCH_QUICK_SEARCH' => 'Suche ...',
'D3_EXTSEARCH_QUICK_NOHIT' => 'Leider wurden keine Artikel gefunden.',
'D3_EXTSEARCH_QUICK_TOMUCHHITS' => 'FĂĽr die Ergebnisliste wurden zu viele Treffer gefunden. <br>Klicken Sie hier fĂĽr die Listenansicht.',
'D3_EXTSEARCH_QUICK_STARTSEARCH' => 'weiter suchen...',
'D3_EXTSEARCH_QUICK_ARTICLE' => 'Artikel',
'D3_EXTSEARCH_QUICK_CATEGORY' => 'Kategorie',
'D3_EXTSEARCH_QUICK_MANUFACTURER' => 'Marke',
'D3_EXTSEARCH_QUICK_VENDOR' => 'Lieferant',
'D3_EXTSEARCH_QUICK_CONTENT' => 'Information',
'D3_EXTSEARCH_QUICK_CLOSE' => 'Suchfenster schliessen',
'D3_EXTSEARCH_EXT_NOARTMSG' => 'Zu Ihrem Begriff wurde leider kein Artikel gefunden. Wir haben daher ähnliche Artikel für Sie mit folgender Suche gezeigt:',
'D3_EXTSEARCH_EXT_LESSARTMSG' => 'Zu Ihrem Begriff wurde leider nur sehr wenige Artikel gefunden. Wir haben die Liste mit ähnlichen Artikel aufgefüllt.',
'D3_EXTSEARCH_EXT_PLUGINHEADLINE' => 'Schneller suchen, schneller finden...',
'D3_EXTSEARCH_EXT_PLUGINBROWSERERROR' => 'Diese Sucherweiterung funktioniert derzeit leider nur mit Mozilla Firefox ab Version 2.0 oder Microsoft Internet Explorer ab Version 7.',
'D3_EXTSEARCH_EXT_PLUGININSTALLMSG' => 'Installieren Sie unsere kostenlose Sucherweiterung. Damit fĂĽgen Sie unseren Shop zur Suchfunktion Ihres Browsers (rechts oben) hinzu. So werden Sie jederzeit und von jeder Stelle aus sofort fĂĽndig.<br>(verfĂĽgbar im Mozilla Firefox ab Version 2 und Microsoft Internet Explorer ab Version 7)',
'D3_EXTSEARCH_EXT_PLUGININSTALLBTN' => 'Sucherweiterung installieren',
'D3_EXTSEARCH_EXT_SEARCHBOX' => 'Filter',
'D3_EXTSEARCH_EXT_CHOOSECAT' => 'wählen Sie eine Kategorie',
'D3_EXTSEARCH_EXT_HITSINCAT' => 'Treffer in',
'D3_EXTSEARCH_EXT_THISCAT' => 'diesen Kategorien:',
'D3_EXTSEARCH_EXT_ALLCATHITS' => 'zeige Treffer aller Kategorien',
'D3_EXTSEARCH_EXT_CATEGORIES' => 'Kategorien:',
'D3_EXTSEARCH_EXT_SEARCHINCATEGORIES' => 'suche in allen Kategorien',
'D3_EXTSEARCH_EXT_HITSINVENDOR' => 'Treffer von',
'D3_EXTSEARCH_EXT_THISVENDORS' => 'dazugehörige Lieferanten:',
'D3_EXTSEARCH_EXT_VENDORS' => 'Lieferanten:',
'D3_EXTSEARCH_EXT_SEARCHINVENDORS' => 'suche in allen Lieferanten',
'D3_EXTSEARCH_EXT_ALLVENDORHITS' => 'zeige Treffer aller Lieferanten',
'D3_EXTSEARCH_EXT_CHOOSEVENDOR' => 'wählen Sie einen Lieferant',
'D3_EXTSEARCH_EXT_HITSINMANUFACTURER' => 'Treffer von',
'D3_EXTSEARCH_EXT_THISMANUFACTURERS' => 'dazugehörige Marken:',
'D3_EXTSEARCH_EXT_MANUFACTURERS' => 'Marken:',
'D3_EXTSEARCH_EXT_SEARCHINMANUFACTURERS' => 'suche in allen Marken',
'D3_EXTSEARCH_EXT_ALLMANUFACTURERHITS' => 'zeige Treffer aller Marken',
'D3_EXTSEARCH_EXT_CHOOSEMANUFACTURER' => 'wählen Sie eine Marke',
'D3_EXTSEARCH_EXT_HITSATTRIBS' => 'Eigenschaften der Treffer',
'D3_EXTSEARCH_EXT_ATTRIBSNOSELECTION' => '%1$s wählen',
'D3_EXTSEARCH_EXT_ATTRIBSDESELECT' => '%1$s abwählen',
'D3_EXTSEARCH_EXT_ATTRIB_NOASSIGN' => 'zu "%s" nicht zugeordnete Artikel',
'D3_EXTSEARCH_EXT_MULTIPLESELECT' => '"%s" mehrfach wählen',
'D3_EXTSEARCH_EXT_ASSIGNFILTER' => 'Filter anwenden',
'D3_EXTSEARCH_EXT_UNASSIGNFILTER' => 'abwählen',
'D3_EXTSEARCH_EXT_CLEARFILTER' => 'Alle Filter löschen',
'D3_EXTSEARCH_EXT_START_SEARCH' => 'Suche starten',
'D3_EXTSEARCH_EXT_ALL' => 'Alle',
'D3_EXTSEARCH_EXT_CHOOSEPRICE' => 'wählen Sie eine Preisspanne',
'D3_EXTSEARCH_EXT_DESELECTPRICE' => 'alle Preise anzeigen',
'D3_EXTSEARCH_EXT_PRICECATS' => 'Preisspannen',
'D3_EXTSEARCH_EXT_PRICEFROM' => 'von',
'D3_EXTSEARCH_EXT_PRICETO' => 'bis',
'D3_EXTSEARCH_EXT_SIMILAR' => '(ähnlich)',
'D3_EXTSEARCH_EXT_CATHIT' => '(Treffer aus Kategorie)',
'D3_EXTSEARCH_EXT_CMSHEADLINE' => 'Informationen',
'D3_EXTSEARCH_EXT_NOARTDESELECT' => 'FĂĽr diese Seite wurden Filter gesetzt, die zu keinem Ergebnis fĂĽhren. '.
'Setzen Sie die Filter zurĂĽck, um alle Artikel dieser Seite zu sehen.',
'D3_EXTSEARCH_IAS_SEARCH' => 'Suche',
'D3_EXTSEARCH_IAS_STARTSEARCH' => 'Suchen',
'D3_EXTSEARCH_RSS_ATTRIBS' => '| %1$s: %2$s ',
'D3_EXTSEARCH_RSS_INDEXFILTER' => '| Index: %1$s ',
'D3_EXTSEARCH_RSS_PRICEFILTER' => '| Preis: %1$s ',
'D3_EXTSEARCH_ORDER_BYPRIO' => 'Relevanz',
'WIDGET_LOCATOR_SORT_D3PRIORITY' => 'Relevanz',
'D3PRIORITY' => 'Relevanz',
'D3_EXTSEARCH_SEARCHINPROGRESS' => 'Suche wird ausgefĂĽhrt',
'D3_CUSTOMFIELDTEXT_LIKETITLE' => 'Begriff enthalten in Titel',
'D3_CUSTOMFIELDTEXT_ISARTNUM' => 'Begriff ist gleich Artikelnummer',
'D3_CUSTOMFIELDTEXT_ISBETWEENSTOCK' => 'Auswahl ist innerhalb des Lagerstandes',
'D3_CUSTOMFIELDTEXT_CHOOSESTOCK' => 'Bitte Lagerstand wählen',
'D3_CUSTOMFIELDTEXT_ISBETWEENPRICE' => 'Auswahl ist innerhalb der Preisspanne',
'D3_CUSTOMFIELDTEXT_CHOOSEPRICE' => 'Bitte Preis wählen',
'D3_EXTSEARCH_DEBUG_UNABLE_QUERY' => 'Query kann auf Grund gestellter Bedingungen nicht generiert werden.',
];
// @codeCoverageIgnoreEnd

View File

@ -0,0 +1,24 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
// @codeCoverageIgnoreStart
$sLangName = "English";
$aLang = include __DIR__."/d3_extsearch_translations.php";
// @codeCoverageIgnoreEnd

View File

@ -0,0 +1,110 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
// @codeCoverageIgnoreStart
return [
'charset' => 'UTF-8',
'D3_EXTSEARCH_FIELD_NOTICE' => 'search item',
'D3_EXTSEARCH_QUICK_HITS' => 'Hits for',
'D3_EXTSEARCH_QUICK_SIMILARHITS' => 'similar hits for',
'D3_EXTSEARCH_QUICK_MULTIPLEHITS' => 'suggestions',
'D3_EXTSEARCH_QUICK_TOBASKET' => 'add to shopping cart',
'D3_EXTSEARCH_QUICK_SEARCH' => 'Searching...',
'D3_EXTSEARCH_QUICK_NOHIT' => 'No articles found.',
'D3_EXTSEARCH_QUICK_TOMUCHHITS' => 'There are to much hits for this view. <br>Please click here for list view.',
'D3_EXTSEARCH_QUICK_STARTSEARCH' => 'start further search...',
'D3_EXTSEARCH_QUICK_ARTICLE' => 'article',
'D3_EXTSEARCH_QUICK_CATEGORY' => 'category',
'D3_EXTSEARCH_QUICK_MANUFACTURER' => 'brand',
'D3_EXTSEARCH_QUICK_VENDOR' => 'vendor',
'D3_EXTSEARCH_QUICK_CONTENT' => 'information',
'D3_EXTSEARCH_QUICK_CLOSE' => 'window close',
'D3_EXTSEARCH_EXT_NOARTMSG' => 'To this term were only found a few articles. We show you similar articles. ',
'D3_EXTSEARCH_EXT_LESSARTMSG' => 'To this term were only found a few articles. We added some similar articles to the list.',
'D3_EXTSEARCH_EXT_PLUGINHEADLINE' => 'search faster, find faster',
'D3_EXTSEARCH_EXT_PLUGINBROWSERERROR' => 'This search extension works in Mozilla Firefox from version 2.0 on and Microsoft Internet Explorer from version 7 on.',
'D3_EXTSEARCH_EXT_PLUGININSTALLMSG' => 'Install our free search extension. This will add our shop to the search function of your browser (top right). So you will find what you are looking for anytime and anywhere.<br>(available in Mozilla Firefox from version 2 and Microsoft Internet Explorer from version 7)',
'D3_EXTSEARCH_EXT_PLUGININSTALLBTN' => 'install plugin for advanced search',
'D3_EXTSEARCH_EXT_SEARCHBOX' => 'filters',
'D3_EXTSEARCH_EXT_CHOOSECAT' => 'choose a category',
'D3_EXTSEARCH_EXT_HITSINCAT' => 'hits in',
'D3_EXTSEARCH_EXT_THISCAT' => 'these categories:',
'D3_EXTSEARCH_EXT_ALLCATHITS' => 'show hits for all categories',
'D3_EXTSEARCH_EXT_CATEGORIES' => 'Categories:',
'D3_EXTSEARCH_EXT_SEARCHINCATEGORIES' => 'search in all categories',
'D3_EXTSEARCH_EXT_HITSINVENDOR' => 'hits for',
'D3_EXTSEARCH_EXT_THISVENDORS' => 'associated vendors:',
'D3_EXTSEARCH_EXT_VENDORS' => 'Vendors:',
'D3_EXTSEARCH_EXT_SEARCHINVENDORS' => 'search in all vendors',
'D3_EXTSEARCH_EXT_ALLVENDORHITS' => 'show all vendor hits',
'D3_EXTSEARCH_EXT_CHOOSEVENDOR' => 'choose a vendor',
'D3_EXTSEARCH_EXT_HITSINMANUFACTURER' => 'hits for',
'D3_EXTSEARCH_EXT_THISMANUFACTURERS' => 'associated brand:',
'D3_EXTSEARCH_EXT_MANUFACTURERS' => 'Brand:',
'D3_EXTSEARCH_EXT_SEARCHINMANUFACTURERS' => 'search in all brands',
'D3_EXTSEARCH_EXT_ALLMANUFACTURERHITS' => 'show all brand hits',
'D3_EXTSEARCH_EXT_CHOOSEMANUFACTURER' => 'choose a brand',
'D3_EXTSEARCH_EXT_HITSATTRIBS' => 'associated specifications',
'D3_EXTSEARCH_EXT_ATTRIBSNOSELECTION' => 'choose %1$s',
'D3_EXTSEARCH_EXT_ATTRIBSDESELECT' => 'deselect %1$s',
'D3_EXTSEARCH_EXT_ATTRIB_NOASSIGN' => 'not to "%s" assigned articles',
'D3_EXTSEARCH_EXT_MULTIPLESELECT' => 'select multiple "%s"',
'D3_EXTSEARCH_EXT_ASSIGNFILTER' => 'assign filter',
'D3_EXTSEARCH_EXT_UNASSIGNFILTER' => 'deselect',
'D3_EXTSEARCH_EXT_CLEARFILTER' => 'clear all filters',
'D3_EXTSEARCH_EXT_START_SEARCH' => 'start search',
'D3_EXTSEARCH_EXT_ALL' => 'all',
'D3_EXTSEARCH_EXT_CHOOSEPRICE' => 'choose a price range',
'D3_EXTSEARCH_EXT_DESELECTPRICE' => 'show all price ranges',
'D3_EXTSEARCH_EXT_PRICECATS' => 'price range',
'D3_EXTSEARCH_EXT_PRICEFROM' => 'from',
'D3_EXTSEARCH_EXT_PRICETO' => 'to',
'D3_EXTSEARCH_EXT_SIMILAR' => '(similar)',
'D3_EXTSEARCH_EXT_CATHIT' => '(hit from category)',
'D3_EXTSEARCH_EXT_CMSHEADLINE' => 'informations',
'D3_EXTSEARCH_EXT_NOARTDESELECT' => 'For this site, filters have been set which do not lead to any result. '.
'Reset the filter to see all articles on this page.',
'D3_EXTSEARCH_IAS_SEARCH' => 'search',
'D3_EXTSEARCH_IAS_STARTSEARCH' => 'search',
'D3_EXTSEARCH_RSS_ATTRIBS' => '| %1$s: %2$s',
'D3_EXTSEARCH_RSS_INDEXFILTER' => '| Index: %1$s',
'D3_EXTSEARCH_RSS_PRICEFILTER' => '| Price: %1$s',
'D3_EXTSEARCH_ORDER_BYPRIO' => 'relevance',
'WIDGET_LOCATOR_SORT_D3PRIORITY' => 'relevance',
'D3PRIORITY' => 'relevance',
'D3_EXTSEARCH_SEARCHINPROGRESS' => 'search will performed',
'D3_CUSTOMFIELDTEXT_LIKETITLE' => 'Term included in title',
'D3_CUSTOMFIELDTEXT_ISARTNUM' => 'Term is equal to item number',
'D3_CUSTOMFIELDTEXT_ISBETWEENSTOCK' => 'Selection is within the stock',
'D3_CUSTOMFIELDTEXT_CHOOSESTOCK' => 'Please select stock',
'D3_CUSTOMFIELDTEXT_ISBETWEENPRICE' => 'Selection is within the price',
'D3_CUSTOMFIELDTEXT_CHOOSEPRICE' => 'Please select stock',
'D3_EXTSEARCH_DEBUG_UNABLE_QUERY' => 'unable to generate query because of chosen settings',
];
// @codeCoverageIgnoreEnd

View File

@ -0,0 +1,28 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* https://www.d3data.de
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link https://www.oxidmodule.com
*/
// @codeCoverageIgnoreStart
$sLangName = 'Deutsch';
// -------------------------------
// RESOURCE IDENTITFIER = STRING
// -------------------------------
$aLang = include __DIR__."/../../de/d3_extsearch_translations.php";
// @codeCoverageIgnoreEnd

View File

@ -0,0 +1,28 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* https://www.d3data.de
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link https://www.oxidmodule.com
*/
// @codeCoverageIgnoreStart
$sLangName = 'English';
// -------------------------------
// RESOURCE IDENTITFIER = STRING
// -------------------------------
$aLang = include __DIR__."/../../en/d3_extsearch_translations.php";
// @codeCoverageIgnoreEnd

View File

@ -0,0 +1,28 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* https://www.d3data.de
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link https://www.oxidmodule.com
*/
// @codeCoverageIgnoreStart
$sLangName = 'Deutsch';
// -------------------------------
// RESOURCE IDENTITFIER = STRING
// -------------------------------
$aLang = include __DIR__."/../../de/d3_extsearch_translations.php";
// @codeCoverageIgnoreEnd

View File

@ -0,0 +1,28 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* https://www.d3data.de
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link https://www.oxidmodule.com
*/
// @codeCoverageIgnoreStart
$sLangName = 'English';
// -------------------------------
// RESOURCE IDENTITFIER = STRING
// -------------------------------
$aLang = include __DIR__."/../../en/d3_extsearch_translations.php";
// @codeCoverageIgnoreEnd

View File

@ -0,0 +1,458 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
// @codeCoverageIgnoreStart
$sModId = 'd3_extsearch';
$sD3Help_mappedTo = '<p>Unsere Module sind fĂĽr die Standardthemes des '.
'OXID-Shops vorbereitet. Sie mĂĽssen hier nichts eintragen, wenn sich das von Ihnen im Shop verwendete Theme von '.
'einem dieser Standard-Themes ableitet (vererbt wird). Handelt es sich um ein komplett eigenes Theme, so tragen '.
'Sie dessen Parent-Theme-ID bei dem OXID-Standard-Theme ein, dem es am nächsten kommt.</p>'.
'<p>Weitere Informationen hierzu finden Sie in unserem <a '.
'href="https://faq.d3data.de/allgemein/template-bloecke-dem-eigenen-theme-zuordnen/" target="FAQ">FAQ-Eintrag</a>.</p>';
return [
'charset' => 'UTF-8',
'D3MXEXTSEARCH' => '<i class="fa fa-fw fa-search-plus"></i> Erweiterte Suche',
'D3MXEXTSEARCH_SETTINGS' => 'Einstellungen',
'D3MXEXTSEARCH_STATISTIC' => 'Statistik',
'D3MXEXTSEARCH_SYNEDITOR' => 'Synonym-Editor',
'D3TBCLEXTSEARCH_SYNEDITOR_MAIN' => 'Stamm',
'D3TBCLEXTSEARCH_SYNEDITOR_MANAGE' => 'Synonyme bearbeiten',
'D3TBCLEXTSEARCH_SETTINGS_RESULTS' => 'Grundeinstellungen',
'D3TBCLEXTSEARCH_SETTINGS_NAVIGATION' => 'Filter + Anzeige',
'D3TBCLEXTSEARCH_SETTINGS_QUICK' => 'Schnelltreffer',
'D3TBCLEXTSEARCH_SETTINGS_BROWSER' => 'Browser-Plugin',
'D3TBCLEXTSEARCH_SETTINGS_STATISTIK' => 'Statistik',
'D3_EXTSEARCH_LIST_SETTLANG' => 'Einstellungen fĂĽr Sprache',
'D3_EXTSEARCH_HELPLINK' => 'Fragen-zu-speziellen-Modulen/Erweiterte-Suche/',
'D3_EXTSEARCH_HELPLINK_CONFIG' => '',
'D3_EXTSEARCH_TRANSL' => 'Erweiterte Suche',
'D3_EXTSEARCH_CONFIGVARS_SADDTITLE' => 'Modul-Edition:',
'D3_EXTSEARCH_CONFIGVARS_BLUSEFILTERINARTICLELISTS' => 'Filter in Artikellisten verfĂĽgbar:',
'D3_EXTSEARCH_CONFIGVARS_FEATUREBIT1' => 'Filter in Artikellisten verfĂĽgbar:',
'D3_EXTSEARCH_MAIN_DEBUGACTIVE_DESC' => 'Der Debugmodus gibt die verwendeten Datenbankabfragen zur einfacheren Programmierung und Fehlersuche in der Browser-Konsole und FirePHP-Konsole aus (Ajax-Requests können aus technischen Gründen nur in FirePHP ausgegeben werden). Zur Anzeige der Abfragen installieren Sie bitte das FirePHP-AddOn für Ihren Browser. Alternativ verwenden Sie den GET-Parameter "d3forcedebug=1" am Ajax-Request für erzwungene Debugausgaben. Deaktivieren Sie den Debugmodus bitte unbedingt für den Livebetrieb, da mit aktiviertem Debugmodus das Datenbank-Caching nicht verwendet wird.',
'D3_EXTSEARCH_MAIN_MAINSETTINGS' => 'allgemeine Einstellungen',
'D3_EXTSEARCH_MAIN_FIELDLIST' => 'diese Felder fĂĽr die Ă„hnlichkeitssuche und die Schnellsuche verwenden<br>Relevanz => Feldname (Bsp.: 50 => oxtitle)',
'D3_EXTSEARCH_MAIN_SORTDEBUG' => 'Ergebnis-Feld-Analyse',
'D3_EXTSEARCH_MAIN_SORTDEBUG_DESC' => 'Geben Sie Ihren Suchbegriff ein. <br>In der Tabelle werden zum Artikel auch die Relevanzwerte zu jedem Feld ausgegeben, in welchem der Treffer gefunden wurde. Die Relevanzwerte "... in / im ..." definieren Sie in den Einstellungen der "erweiterten Suche". "D3PUSH" ist die Wichtigkeit des Artikels. Die Relevanz jedes Artikels in der Trefferliste ("d3Priority") ergibt sich aus der folgenden Formel: <blockquote>((Summe aus allen "... in / im ..."-Feldern) x D3PUSH) + D3PUSH</blockquote>',
'D3_EXTSEARCH_MAIN_SORTDEBUG_START' => 'Suche starten',
'D3_EXTSEARCH_MAIN_SORTDEBUG_WORD_IN_' => '"%1$s" als komplettes Wort im Feld "%2$s"',
'D3_EXTSEARCH_MAIN_SORTDEBUG_PART_IN_' => '"%1$s" als Wortbestandteil im Feld "%2$s"',
'D3_EXTSEARCH_MAIN_SORTDEBUG_article_IN_category' => 'Artikel in Kategorie',
'D3_EXTSEARCH_MAIN_SORTDEBUG_article_IN_manufacturer' => 'Artikel in Hersteller oder Lieferant',
'D3_EXTSEARCH_MAIN_NOFIELDSDEFINED' => '<b>Keine Felder definiert.</b><br>Standard: \'oxtitle\', \'oxsearchkeys\' und \'oxartnum\'',
'D3_EXTSEARCH_MAIN_FIELDLIST_DESC' => 'Tragen Sie hier die Artikel-Tabellenfelder (aus Tabellen "oxarticles" oder "oxartextends") ein, in denen gesucht werden soll. Die Feldbezeichnungen entnehmen Sie bitte der Shopdatenbank. Die Standardeinträge sind oxtitle, oxsearchkeys, oxartnum. Damit wird regulär im Titel, den Suchbegriffen und der Artikelnummer gesucht. Tragen Sie jedes Feld in eine separate Zeile, gefolgt von einem Zeilenumbruch ein. Für weitere Optionen des Moduls kann es nötig sein, hier noch Einträge hinzuzufügen. Ändern Sie diese Eintragungen, muß der Suchindex noch einmal neu erzeugt werden.<br><br>Neben den Feldern können Sie hier auch angeben, wie wichtig das jeweilige Datenfeld für die Ergebnisse ist. Tragen Sie vor den Feldnamen mit => getrennt die Relevanz des jeweiligen Feldes ein. Je höher die Relevanz, umso höher wird ein Artikel gezeigt, wenn der Suchbegriff in diesem Feld vorkommt (separat zu aktivieren). Wird der Suchbegriff in mehreren Feldern gefunden, addiert sich die Relevanz. Ist keine Relevanz angegeben, erhält das Feld automatisch den Wert 10. Weitere Informationen hierzu finden Sie im Handbuch im Kapitel "Relevanz und Wichtigkeiten".',
'SHOP_CONFIG_SEARCHFIELDS' => 'Felder, in denen gesucht wird<br>"erweiterte Suche" verwendet eigene Einstellungen / Bearbeiten in <input type="button" onclick="document.getElementById(\'myedit\').target = \'basefrm\'; document.getElementById(\'myedit\').fnc.value=\'\';document.getElementById(\'myedit\').cl.value=\'d3_cfg_extsearch_main\';document.getElementById(\'myedit\').submit();" value="erweiterte Suche">',
'SHOP_CONFIG_SEARCHUSEAND' => 'Wenn mehrere Suchbegriffe eingegeben werden, mĂĽssen alle Suchbegriffe in einem Suchergebnis vorkommen (AND). (Wenn die Option nicht aktiv ist, muss nur ein Suchbegriff vorkommen (OR).)',
'D3_EXTSEARCH_MAIN_PUTINLEAVEOUT' => 'Auslassungen oder EinfĂĽgungen erlauben',
'D3_EXTSEARCH_MAIN_PUTINLEAVEOUT_DESC' => 'Setzen Sie diese Option, können die zu findenden Artikel auch weniger (ausgelassene) oder mehr (eingeschobene) Buchstaben als Ihr Suchbegriff haben. Bei schwierigen Suchbegriffen kann sich die Aktivierung möglicherweise lohnen. Haben Sie jedoch verständliche Artikeltitel, empfehlen wir, dies vorerst nicht zu aktivieren. Beispiel: Die Suche nach "Lampeschirm" findet so auch "Lampenschirm".',
'D3_EXTSEARCH_MAIN_MULIPLEWORDS' => 'Verwendung mehrerer Suchworte',
'D3_EXTSEARCH_MAIN_MULIPLEWORDS_DESC' => 'Legen Sie hier fest, wie das Modul mit mehreren Suchbegriffen umgehen soll. So können Sie festlegen, ob mit dem kompletten, zusammenhängenden Begriff gesucht werden soll. Dann muss der Suchbegriff zwingend in einem Feld vorkommen. Stellen Sie ein, dass jeder Suchbegriff separat verwendet wird, können die Suchbegriffe über die Artikelfelder verstreut sein. Diese Einstellung empfehlen wir als Standard. Alternativ bieten Sie Ihren Kunden die Verwendung von Suchsyntax an. Dies kann für technikorientierte Shops besonders sinnvoll sein.<br><br>Für die Syntax gibt es folgende Fälle:<br><br><ul><li>In Anführungszeichen ( “ ) eingeschlossen: sucht oder vermeidet die komplette Wortgruppe, ansonsten wird jedes Wort einzeln verwendet, Apostrophe werden derzeit nicht unterstützt</li><li>Vorgestelltes Minus (-): Wort oder Wortgruppe darf in Treffern nicht vorkommen</li><li>Vorgestelltes Plus (+) (optional): Wort oder Wortgruppe muss in Treffern enthalten sein</li><li>Ohne Vorzeichen wird Plus angenommen</li><li>Vorzeichen und Einschluss in Anführungszeichen können kombiniert werden</li></ul><br>Mögliche Anwendungen:<br><ul><li>eins</li><li>"eins zwei"</li><li>+eins</li><li>+"eins zwei"</li><li>–drei</li><li>-"drei vier"</li></ul>',
'D3_EXTSEARCH_MAIN_MULIPLEWORDS_SINGLE' => 'jedes Wort wird separat gesucht',
'D3_EXTSEARCH_MAIN_MULIPLEWORDS_WHOLE' => 'wird nur als zusammenhängender Begriff gesucht',
'D3_EXTSEARCH_MAIN_MULIPLEWORDS_SYNTAX' => 'vom Nutzer ĂĽber Suchsyntax steuerbar',
'D3_EXTSEARCH_MAIN_SORTING' => 'Artikelsortierung',
'D3_EXTSEARCH_MAIN_ORDERBYPRIORITY' => 'Treffer nach Relevanz sortieren',
'D3_EXTSEARCH_MAIN_ORDERBYPRIORITY_DESC' => 'Die Relevanz definiert, wie gut ein gefundener Artikel zum Suchbegriff passt. (Daher ist die Relevanzsortierung auch nur in der Suche verfügbar. In Kategorien steht diese nicht zur Verfügung.) Kommt der Suchbegriff am Artikel vor, soll dieser natürlich in den Treffern gezeigt werden. Jedoch sind die Treffer, bei denen der Suchbegriff im Titel erscheint, sicher für Ihren Kunden sinnvoller, als wenn das gesuchte Wort irgendwo in der späteren Beschreibung auftaucht. Bei der Definition der zu verwendenden Suchfelder können Sie angeben, wie hoch der Treffer für jedes einzelne Suchfeld bewertet wird. Weitere Informationen hierzu finden Sie im Modulhandbuch im Kapitel "Relevanz und Wichtigkeiten".<br><br>Aktivieren Sie die Option "Treffer nach Relevanz sortieren", wenn die Suche die Reihenfolge der Artikel nach dieser Logik ändern darf. Zu den schon vorhandenen Sortiermöglichkeiten wird automatisch die Relevanzsortierung hinzugefügt.<br><br>Hat der Kunde keine eigene Treffersortierung gewählt, werden die Suchtreffer dann nach Ihrer eingestellten Relevanz sortiert. Die Relevanz legen Sie an den für die Suche definierten Datenbankfeldern fest. Die Summe der Relevanz der Felder, die den Suchbegriff enthalten, wird dann als Sortierkriterium verwendet. In Verbindung mit der Wichtigkeit der Artikel (separat zu aktivieren) kann sich die Relevanz vervielfachen. Die Sortierung Ihrer Artikel können Sie in der "Ergebnis-Feld-Analyse" nachvollziehen.',
'D3_EXTSEARCH_MAIN_ORDERBYPUSH' => 'Treffer nach Wichtigkeit sortieren',
'D3_EXTSEARCH_MAIN_ORDERBYPUSH_DESC' => 'Sicher unterscheiden Sie in Ihrem Artikelsortiment nach Haupartikeln, Nebenartikeln und sonstigem Zubehör. Auch diese Einstufung können Sie in den Suchergebnissen berücksichtigen lassen. So werden bei Aktivierung dieser Einstellung Ihren Kunden die Hauptartikel eher gezeigt, weniger wichtige Produkte tauchen in den Treffern erst später auf.<br><br>Wie wichtig ein Artikel im Sortiment ist, legen Sie am Artikel selbst fest. Im Adminbereich des Shops finden Sie die Einstellung unter "Artikel verwalten -> Artikel -> Erweitert -> Wichtigkeit des Artikels im Sortiment". Über externe Importe oder Warenwirtschaftsanbindungen können Sie die Einstellung über das Feld "d3push" mit den Werten 1 (normal) bis 3 (besonders wichtig) befüllen.',
'D3_EXTSEARCH_MAIN_ORDERBYALTERNATIVE' => 'alternative Sortierung bei identischem Relevanzsortierwert',
'D3_EXTSEARCH_MAIN_ORDERBYALTERNATIVE_DESC' => 'Die Sortierreihenfolge wird auf Basis der hier gesetzten Einstellungen für jeden Artikel berechnet. Haben mehrere Artikel einen identischen Sortierwert, können diese untereinander nach einem weiteren Kriterium sortiert werden. Als Angabe ist hier der Name eines Feldes der Artikel-Tabelle zugelassen (ohne Sprach-Zusatz). Mit asc und desc stellen Sie ein, ob auf- oder absteigend sortiert wird.',
'D3_EXTSEARCH_MAIN_VARIANTSETTINGS' => 'Variantensuche',
'D3_EXTSEARCH_MAIN_VARIANTSEARCH' => 'Shop sucht auch nach Variantenartikeln',
'D3_EXTSEARCH_MAIN_VARIANTUSAGE' => 'wird eine Artikelvariante gefunden, wird ...',
'D3_EXTSEARCH_MAIN_VARIANTUSAGE_SHOWPARENT' => '... deren Elternartikel in der Trefferliste gezeigt',
'D3_EXTSEARCH_MAIN_VARIANTUSAGE_SHOWVARIANT' => '... die Variante selbst in der Trefferliste gezeigt',
'D3_EXTSEARCH_MAIN_SHOWVARIANTSWITHOUTFILTERS' => 'zeige Varianten auch ohne Filterung',
'D3_EXTSEARCH_MAIN_SHOWVARIANTSWITHOUTFILTERS_DESC'=> 'Die Anzeige von Variantenartikeln ist meist nur dann sinnvoll, wenn speziell danach gefiltert wird. Sollen die Variantenartikel auch ohne Filterung gezeigt werden, aktivieren Sie diese Option. Die Artikellisten können dann umfangreicher werden. Diese Option wirkt auf Suchergebnisse und (sofern aktiv) auch auf Kategorien.',
'D3_EXTSEARCH_MAIN_VARIANTINALIST' => 'spezielle Variantenbehandlung wird auch in Artikellisten verwendet',
'D3_EXTSEARCH_MAIN_VARIANTCHECKPARENTACTIVE' => 'Aktivstatus des Elternartikel ausdrĂĽcklich prĂĽfen',
'D3_EXTSEARCH_MAIN_VARIANTUSAGE_DESC' => '<p>Stellen Sie hier ein, ob bei einer gefundenen Variante diese Variante selbst oder deren Elternartikel in der Trefferliste gezeigt werden soll. Beachten Sie bei der Anzeige des Elternartikels anstatt der Variante bitte darauf, dass die Elternartikel auch aktiv und auswählbar sein müssen. Eine zusätzliche Prüfung darauf findet nur statt, wenn diese ausdrücklich konfiguriert wurde.</p><p>Bei der Anzeige der Elternartikel wird an den verwendbaren Filtern weiterhin die Anzahl der dazu passenden Varianten gezeigt, da diese weiterhin Basis für die Filter sind. Diese Abweichung kann den Shopbesucher verwirren. Deaktivieren Sie in diesem Fall die Darstellung der Anzahl zum Filter gefundener Artikel.</p>',
'D3_EXTSEARCH_MAIN_VARIANTINALIST_DESC' => 'Sollen auch Kategorie-, Lieferanten- und Herstellerseiten diese Varianteneinstellungen verwenden, aktivieren Sie diese Option. Varianten werden nur in gefilterten Artikellisten gezeigt. Die Kategoriezuordnung wird vom Elternartikel bezogen. Attribute, Hersteller- und Lieferanten mĂĽssen den Varianten direkt zugeordnet sein. Attribute, Hersteller und Lieferanten des Elternartikels werden nicht beachtet.',
'D3_EXTSEARCH_MAIN_VARIANTSEARCH_DESC' => 'Statt wie üblich nur nach regulären Artikeln zu suchen, findet der Shop mit dieser Option auch einzelne Variantenartikel. Tragen Sie bitte zusätzlich in der Feldliste des Moduls und im Shop unter \'Stammdaten -> Grundeinstellungen -> Einstell. -> Suche\' den Feldname \'oxvarselect\' ein und generieren Sie den Suchindex neu.',
'D3_EXTSEARCH_MAIN_VARIANTCHECKPARENTACTIVE_DESC' => 'Aus Performancegründen gehen wir pauschal davon aus, dass aktive und kaufbare Variantenartikel auch einen aktiven Elternartikel haben. Kann dies in Ihrem Shop abweichen, setzen Sie diese Option. Dann wird für jeden Variantenartikel geprüft, ob dessen Elternartikel auch verfügbar ist.<br><br>Beachten Sie, dass diese Option viel Leistung benötigt. Stellen Sie besser alternativ über die Datenbank sicher, dass Varianten von inaktiven Elternartikeln ebenfalls nicht aktiv sind.',
'D3_EXTSEARCH_MAIN_OWNFORMFIELDS' => 'individuelle Filterfelder nutzen',
'D3_EXTSEARCH_MAIN_OWNFORMFIELDS_DESC' => 'Durch diese Option können Sie in einer einfachen Art dem Kunden weitere Felder zur Einschränkung der Treffer anbieten. Dieser Funktion haben wir ein eigenes Kapitel im Modulhandbuch gewidmet (siehe dazu "Technische Erläuterungen").',
'D3_EXTSEARCH_MAIN_LOGSETTINGS' => 'Statistik',
'D3_EXTSEARCH_MAIN_LOGHITLESS' => 'ergebnislose Suchaktionen fĂĽr Statistik mitschreiben',
'D3_EXTSEARCH_MAIN_LOGHITLESS_DESC' => 'Startet der Kunde eine Suchanfrage, die keine Ergnisse liefern kann, werden die Suchbegriffe für Sie aufgezeichnet. Sie finden die Aufstellung dann unter der Registerkarte \'Logging\' und können Ihre Produkte ggf. auch für diese Begriffe optimieren.',
'D3_EXTSEARCH_MAIN_LOGFORSEARCH' => 'alle Suchanfragen fĂĽr Statistik mitschreiben (auch ohne shopweites Logging)',
'D3_EXTSEARCH_MAIN_LOGFORSEARCH_DESC' => 'Schreibt alle Suchanfragen fĂĽr die modulinterne Statistik mit. Diese Einstellung kann auch gesetzt werden, ohne daĂź andere Shopfunktionen mitgeschrieben werden. Ist das shopweite Logging aktiviert, werden die Suchanfragen generell mitgeschrieben.',
'D3_EXTSEARCH_MAIN_PHONETICS' => 'phonetische Suche (nach Klang)',
'D3_EXTSEARCH_MAIN_PHONETICS_DESC' => 'Hierbei handelt es sich um die fehlertolerante Suche, die klangähnliche Treffer findet, auch wenn diese anders geschrieben wurden. Damit wird die Suche für Schreibfehler tolerant.',
'D3_EXTSEARCH_MAIN_SIMILARSEARCH' => 'wenn kein Suchergebnis, Shop sucht nach ähnlichen klingenden Artikel (Bsp.: Suche: <i>Pflan<b>s</b>e</i>, Treffer: <i>Pflan<b>z</b>e</i>)',
'D3_EXTSEARCH_MAIN_SIMILARSEARCH_DESC' => 'Hier aktivieren (oder deaktivieren) Sie die phonetische Suche. Damit fangen Sie zum Beispiel Schreibfehler in der Suchabfrage ab und der Kunde findet seine gewünschten Artikel trotzdem mit großer Wahrscheinlichkeit. Ist gleichzeitig die Suche nach Sinn (Semantic) aktiviert, wird zuerst versucht, sinngleiche Treffer zu finden. Schlägt dies fehl, werden Treffer über die Klangsuche ermittelt.',
'D3_EXTSEARCH_MAIN_PHONETICLANG' => 'fĂĽr die Ă„hnlichkeitssuche verwendete Sprache',
'D3_EXTSEARCH_MAIN_PHONETICLANG_DESC' => 'Da sich die verschiedenen menschlichen Sprachen in Ihrer Aussprache und in der Wort- bzw. Buchstabenzusammensetzung unterscheiden, ist für ein optimales Suchergebnis ein sprachenabhängiges Verfahren zur Indexgenerierung nötig. Sollten Sie in Ihrem Shop hauptsächlich eine andere Sprache als die nebenstehend Angezeigte verwenden, fragen Sie bei uns nach, ob auch ein Modul für Ihre Sprache zur Verfügung steht.<br><br>Im Standard liefern wir für die deutsche Sprache 2 Optionen mit. Wir empfehlen die Verwendung der Option "deutsch mit Vokalen", da hierin die Treffergenauigkeit deutlich höher ist.',
'D3_EXTSEARCH_MAIN_SIMILAREXTLIST_1' => 'Shop zeigt zusätzlich ähnliche klingende Treffer, wenn reguläre Suche maximal',
'D3_EXTSEARCH_MAIN_SIMILAREXTLIST_2' => 'Treffer',
'D3_EXTSEARCH_MAIN_SIMILAREXTLIST_DESC' => 'Wenn die Suche nur wenige Treffer erzielt, kann man dem Kunden so auch ähnliche Artikel liefern. Diese ähnlichen Artikel werden in der Ergebnisliste nach den tatsächlichen Treffern gezeigt. Der Kunde wird mit einer Meldung über die aufgefüllte Liste informiert. Setzen Sie diese Einstellung bitte jedoch mit Bedacht ein, da die zusätzlichen Treffer die Kunden verwirren könnten.',
'D3_EXTSEARCH_MAIN_MINPHONLENGTH' => 'Treffergenauigkeit bei kurzen Suchworten',
'D3_EXTSEARCH_MAIN_MINPHONLENGTH_LESS' => 'weniger Genauigkeit',
'D3_EXTSEARCH_MAIN_MINPHONLENGTH_REG' => 'normale Genauigkeit',
'D3_EXTSEARCH_MAIN_MINPHONLENGTH_MORE' => 'mehr Genauigkeit',
'D3_EXTSEARCH_MAIN_MINPHONLENGTH_DESC' => 'Die indizierte Ähnlichkeitssuche kann erst ab einer bestimmten Wortlänge sinnvoll und effizient arbeiten. Daher bringt die phonetische Suche zwei verschiedene Abarbeitungswege mit: Die Suche über den vorher generierten Index und die zur Laufzeit definierte Ähnlichkeit.<br><br>Beide Methoden haben jeweils Vor- und Nachteile:<br><ul><li>Die indexbasierte Suche ist sehr treffgenau und schnell. Jedoch erfordert diese eine Mindestlänge an relevanten Zeichen. Sind die Suchbegriffe kürzer, lässt die Genauigkeit rapide nach und bei zu kurzen Suchworten würde sogar das ganze Shopsortiment gezeigt.</li><li>Bei kurzen Suchworten wird nun automatisch die Ähnlichkeit zur Laufzeit berechnet. Deren Stärken liegt in der Erkennung kurzer Suchworte. Zwar ist sie nicht ganz so genau, wie die Indexsuche. Da die Worte aber kurz sind, spielt dies hier keine so wichtige Rolle. Zu beachten ist jedoch, dass diese Art der Suche etwas mehr Rechenleistung benötigt und daher langsamer ist.</li></ul><br><br>Ab wann wird nun von einer Technik zur anderen umgeschaltet? Wird eine Suche gestartet, prüft das Modul an Hand der Wortlänge, welche Technik am sinnvollsten ist. Sie können nun über den Schalter `Treffergenauigkeit bei kurzen Suchworten` definieren, wie schnell auf die indexbasierte Suche umgeschaltet wird. Ziel sollte sein, schnellstmöglich auf den Index zu wechseln, ohne jedoch zu viele Treffer zu generieren. Die Einstellmöglichkeiten erstrecken sich auf (phonetische relevante) Wortlängen zwischen 3 und 5 Zeichen. Führen Sie mit den für Ihren Shop typischen Suchbegriffen einfach ein paar Versuche durch und variieren Sie die Einstellungen entsprechend. Bei Unklarheiten kontaktieren Sie uns bitte einfach.',
'D3_EXTSEARCH_MAIN_SEMANTICS' => 'semantische Suche (nach Sinn)',
'D3_EXTSEARCH_MAIN_SEMANTICS_DESC' => 'Semantische Begriffe, sind Worte, die einen ähnlichen Sinn wie das Suchwort haben. Suchen Sie nach "Becher", werden auch Artikel gefunden, die als Inhalt "Tasse" haben.<br><br>Für die Verwendung der semantischen Suche ist ein passendes Lexikon notwendig. Dieses können Sie selbst nach eigenen Anforderungen im Synonym-Editor befüllen (empfohlen). Hinweise zu dessen Bedienung finden Sie im Handbuch.<br><br>Alternativ stellen wir auch eine umfangreiche Standarddatenbank zur Verfügung. Den Link dazu finden Sie in der Installationsanleitung des Moduls.',
'D3_EXTSEARCH_MAIN_SEMANTICSEARCH' => 'Shop sucht nach Artikeln mit ähnlichem Sinn (Bsp.: Suche: <i>Gew&auml;chs</i>, Treffer: <i>Pflanze</i>)',
'D3_EXTSEARCH_MAIN_SEMANTICSEARCH_MISSING' => 'Shop sucht nach Artikeln mit ähnlichem Sinn (Bsp.: Suche: <i>Gew&auml;chs</i>, Treffer: <i>Pflanze</i>)<br><b>Lexikon ist nicht installiert!</b>',
'D3_EXTSEARCH_MAIN_SEMANTICSEARCH_DESC' => 'Setzen Sie diesen Haken, um eine sinngleiche Suche im Shop zu ermöglichen. Durch z.B. regionale Unterschiede kann es vorkommen, daß Ihre Kunden einen Artikel zwar anders bezeichnen, jedoch Ihr Produkt meinen. Gibt der Kunde nun seinen Wunsch ein, bekommt er gegebenenfalls die Begriffe gezeigt, die in Ihrem Shop das gewünschte Produkt besser beschreiben.',
'D3_EXTSEARCH_MAIN_SEMANTICUSEPHONETIC' => 'enthält das Suchwort Schreibfehler, wird zusätzlich zur Sinnsuche versucht, die richtige Schreibweise zu ermitteln; erzeugt jedoch ggf. stark abweichende Treffer; erfordert aktivierte phonetische Suche',
'D3_EXTSEARCH_MAIN_SEMANTICUSEPHONETIC_DESC' => 'Diese Einstellung erlaubt zur sinngleichen Suche auch die phonetische Suche, wenn keine sinngleichen Worte gefunden werden. Da hier jedoch der gewünschte Sinn nicht eindeutig klar ist, werden unter Umständen stark abweichende Treffer gezeigt. Wir empfehlen die Verwendung dieser Einstellung nur eingeschränkt.<br>Für die Verwendung dieser Einstellung, lassen Sie zuvor den Index für die sinngleiche Suche erstellen: "D3 Module -> erweiterte Suche -> Einstellungen -> Grundeinstellungen -> Suchindex -> Lexikon für die sinngleiche Suche neu indizieren".',
'D3_EXTSEARCH_MAIN_SAVE' => 'Speichern',
'D3_EXTSEARCH_MAIN_INDEX' => 'Suchindex',
'D3_EXTSEARCH_MAIN_INDEX_DESC' => 'Dass die Ähnlichkeitssuche arbeiten kann, ist die Generierung eines Suchindex nötig. Dazu werden die definierten Suchfelder mit einem sprachabhängigen Schlüssel für die Suche vorbereitet. So verläuft die eigentliche Suchabfrage nicht bedeutend langsamer als eine reguläre Artikelsuche. (Auf die Ausführungszeit anderer Einstellungen hat der Suchindex jedoch keine Auswirkungen.) Der Index wird automatisch aktualisiert, wenn Sie Ihre Artikel über den Adminbereich des Shops einpflegen oder das von Ihnen genutzte Importtool das Shop-Framework verwendet (Auskunft dazu kann Ihnen Ihr Oxid-Partner erteilen). Verwalten Sie Ihre Artikel über andere Wege, generieren Sie den Suchindex nach jedem Artikel-Update neu. Die Generierung benötigt durchaus etwas Rechenleistung, ist jedoch meist in wenigen Sekunden abgeschlossen.<br><br>Die Neugenerierung ist ebenfalls nötig, wenn Änderungen an den zu verwendenden Feldnamen vorgenommen werden.',
'D3_EXTSEARCH_MAIN_INDEXARTCNT' => 'Artikel pro Durchlauf fĂĽr Index aufarbeiten',
'D3_EXTSEARCH_MAIN_INDEXARTCNT_DESC' => 'Der Webserver bricht Scripte nach einer gewissen Laufzeit aus Sicherheitsgründen ab. Um die Generierung des Suchindexes dennoch fertigstellen zu können, verarbeitet dieses Script nur eine gewisse Anzahl Artikel und startet sich dann neu. Legen Sie hier fest, wie viele Artikel in einem Durchlauf bearbeitet werden sollen. Bricht die Generierung mit einem Fehler ab, reduzieren Sie die Zahl. Je niedriger die Anzahl, um so länger benötigt jedoch das Script.',
'D3_EXTSEARCH_MAIN_INDEXERR' => 'Der benötigte Index für die fehlertolerante Suche ist lückenhaft. Klicken Sie hier, um die Liste neu zu generieren:',
'D3_EXTSEARCH_MAIN_INDEXNOERR' => 'Der benötigte Index für die fehlertolerante Suche scheint vollständig. Im Moment ist keine Aktion nötig, wenn Sie die Sprache nicht geändert haben oder Artikel importiert haben.<br>Der Index muß für jede Sprache des Shop separat erstellt werden.',
'D3_EXTSEARCH_MAIN_GENINDEXCMPL' => 'phonetischen Suchindex aktualisieren',
'D3_EXTSEARCH_MAIN_GENINDEXCMPL_DESC' => 'Generiert für veränderte oder neue Artikel den Suchindex neu.',
'D3_EXTSEARCH_MAIN_GENSEMANTICINDEX' => 'Lexikon fĂĽr sinngleiche Suche neu indizieren',
'D3_EXTSEARCH_MAIN_GENSEMANTICINDEX_DESC' => 'Für die Verbindung von sinngleicher Suche und phonetischer Suche benötigt auch das Lexikon den phonetischen Index. Mit dieser Schaltfläche starten Sie die Neuindizierung des Lexikons. Im Normalfall ist dies jedoch nicht notwendig.',
'D3_EXTSEARCH_MAIN_SHOW_POPUP' => 'PopUp während des Suchvorgangs zeigen',
'D3_EXTSEARCH_MAIN_SHOW_POPUP_DESC' => 'Um ungeduldige Kunden während des Suchvorgangs zu informieren, können Sie ein Informations-PopUp anzeigen lassen. Dieses können Sie Ihrem Shoplayout entsprechend auch inhaltlich und grafisch gestalten.',
'D3_EXTSEARCH_MAIN_CATEGORY' => 'Suche in Kategoriennamen',
'D3_EXTSEARCH_MAIN_CATEGORY_SEARCH' => 'auch in Kategorienamen suchen und enthaltene Artikel finden',
'D3_EXTSEARCH_MAIN_CATEGORY_SEARCH_DESC' => 'Die Standardsuche findet nur Treffer in den angelegten Artikeln. Möglicherweise sucht Ihr Kunden aber einen Begriff, mit dem Sie eine ganze Kategorie benannt haben. Haben Sie diesen Haken gesetzt, wird auch in den Kategorienamen nach den Suchbegriffen gesucht.',
'D3_EXTSEARCH_MAIN_CATEGORY_ANDOR_DESC' => 'Diese Einstellung wird nur fĂĽr die Suche in Kategorienamen verwendet. FĂĽr die Artikelsuche gibt es eine eigene Einstellung.',
'D3_EXTSEARCH_MAIN_CATEGORY_ARTHANDLING' => 'Kategorie selbst oder deren Artikel anzeigen',
'D3_EXTSEARCH_MAIN_CATEGORY_ARTINCAT' => 'Artikel aus Kategorie anzeigen',
'D3_EXTSEARCH_MAIN_CATEGORY_CATINLIST' => 'Kategorie zur Auswahl anzeigen',
'D3_EXTSEARCH_MAIN_CATEGORY_PRIORITY' => 'Relevanz bei Kategorietreffern',
'D3_EXTSEARCH_MAIN_CATEGORY_PRIORITY_DESC' => 'Artikeltreffer erhalten ihre Relevanz auf Grund der an den Feldern eingestellten Relevanzzahlen. Treffer, die auf Grund ihrer Kategoriezugehörigkeit gefunden werden, können ihre Relevanz so nicht enthalten. Definieren Sie hier, welchen Platz in der Artikelliste diese Treffer erhalten sollen.',
'D3_EXTSEARCH_MAIN_MANUFACTURER' => 'Suche in Marken- und Lieferantennamen',
'D3_EXTSEARCH_MAIN_MANUFACTURER_SEARCH' => 'auch in Marken- und Lieferantennamen suchen und enthaltene Artikel finden',
'D3_EXTSEARCH_MAIN_MANUFACTURER_SEARCH_DESC' => 'Die Standardsuche findet nur Treffer in den angelegten Artikeln. Möglicherweise sucht Ihr Kunden aber einen Begriff, mit dem Sie eine Marke oder einen Lieferanten benannt haben. Haben Sie diesen Haken gesetzt, wird auch in den Marken- bzw. Lieferantennamen nach den Suchbegriffen gesucht.',
'D3_EXTSEARCH_MAIN_MANUFACTURER_ANDOR_DESC' => 'Diese Einstellung wird nur fĂĽr die Suche in Marken- und Lieferantennamen verwendet. FĂĽr die Artikelsuche gibt es eine eigene Einstellung.',
'D3_EXTSEARCH_MAIN_MANUFACTURER_PRIORITY' => 'Relevanz bei Marken-/Lieferantentreffern',
'D3_EXTSEARCH_MAIN_MANUFACTURER_PRIORITY_DESC' => 'Artikeltreffer erhalten ihre Relevanz auf Grund der an den Feldern eingestellten Relevanzzahlen. Treffer, die auf Grund ihrer Marken- bzw. Lieferantenzugehörigkeit gefunden werden, können ihre Relevanz so nicht enthalten. Definieren Sie hier, welchen Platz in der Artikelliste diese Treffer erhalten sollen.',
'D3_EXTSEARCH_MAIN_ADMINPANEL' => 'Adminbereich',
'D3_EXTSEARCH_MAIN_ADMINSHOWVARIANTS' => 'zeige nach Suche auch Varianten in Artikelliste',
'D3_EXTSEARCH_MAIN_ADMINSHOWVARIANTS_DESC' => 'Möchten Sie im Adminbereich Ihre Artikel bearbeiten ("Artikel verwalten -> Artikel"), können Sie dort nach vorhandenen Artikeln suchen. Die Standardsuche berücksichtigt jedoch keine Variantenartikel. Möchten Sie diese dort ebenfalls suchbar machen, aktivieren Sie diese Option.',
'D3_EXTSEARCH_MAIN_USEARTNUMSEARCH' => 'speziell nach Artikelnummern suchen',
'D3_EXTSEARCH_MAIN_USEARTNUMSEARCH_DESC' => 'Ist diese Option markiert, wird vor dem eigentlichen Suchdurchlauf ausdrücklich nach einer zum Suchbegriff passenden Artikelnummer gesucht. Gefundene Artikel werden dargestellt und die Suche beendet. Dies kann bei häufiger Verwendung zu schnelleren Suchergebnissen führen.',
'D3_EXTSEARCH_MAIN_DONTUSEOWNDBVIEWS' => 'Datenbankabfragen verwenden <b>nicht</b> die moduleigenen View-Tabellen',
'D3_EXTSEARCH_MAIN_DONTUSEOWNDBVIEWS_DESC' => 'Aus Performance-Gründen verwendet die Suche nicht die shopeigenen View-Tabellen, sondern bringt optimierte Versionen dessen mit. Je nach Größe des Datenbank kann deren Verwendung die Geschwindigkeit von Datenbankabfragen bis um den Faktor 100 beschleunigen. Sollen die spezialisierten View-Tabellen <b>nicht</b> verwendet werden, setzen Sie diesen Haken. Dann werden die Abfragen über die shopeigenen View-Tabellen geleitet.<br>Beachten Sie, dass bei deaktivierung dieser Option die View-Tabellen noch einmal aktualisiert werden müssen.',
'D3_EXTSEARCH_MAIN_GENERATOR_INCONSISTENTTABLE' => 'Die Artikel-Tabelle der Datenbank ist mit der Langtext-Tabelle nicht konsistent. Bitte bereinigen Sie dies vor der AusfĂĽhrung des Generators. <br><br>Weitere Informationen finden Sie in der FAQ unter <a href="%1$s" target="_new">%1$s</a>.',
'D3_EXTSEARCH_MAIN_GENERATOR_INCONSISTENTTABLE_NOLINK' => 'Die Artikel-Tabelle der Datenbank ist mit der Langtext-Tabelle nicht konsistent. Bitte bereinigen Sie dies vor der AusfĂĽhrung des Generators.',
'D3_EXTSEARCH_MAIN_GENERATOR_FINISHED' => 'Beendet.',
'D3_EXTSEARCH_MAIN_GENERATOR_NOTE' => 'Hinweis',
'D3_EXTSEARCH_MAIN_GENERATOR_PROCESSED' => '%1$s Artikelsprachen (ca. %2$s Artikel) bearbeitet<br>Generierung abgeschlossen!',
'D3_EXTSEARCH_MAIN_GENERATOR_TERMPROCESSED' => '%1$s Wort/Wörter bearbeitet<br>Generierung abgeschlossen!',
'D3_EXTSEARCH_MAIN_GENERATOR_PROCESSING' => 'Bearbeite %1$s&#37;',
'D3_EXTSEARCH_MAIN_GENERATOR_PROCESSING1' => 'Bearbeite %1$s / %2$s Artikelsprachen (ca. %3$s Artikel)',
'D3_EXTSEARCH_MAIN_GENERATOR_PROCESSING3' => 'Bearbeite %1$s / %2$s Begriffe',
'D3_EXTSEARCH_MAIN_GENERATOR_PROCESSING2' => '%1$s&#37; bearbeitet',
'D3_EXTSEARCH_MAIN_GENERATOR_WAIT' => 'Bitte warten...',
'D3_EXTSEARCH_MAIN_GENERATOR_CLOSEWND' => 'Fenster schlieĂźen',
'D3_EXTSEARCH_MAIN_GENERATOR_EXCEPTION' => 'Generierungsfehler, der Index kann leider nicht erstellt werden.',
'D3_EXTSEARCH_MAIN_COLLATIONERROR' => 'Folgende Felder verwenden abweichende Collations und sollten nicht fĂĽr die Suche verwendet werden: %1$s.',
'D3_EXTSEARCH_MAIN_NOTEXISTINGFIELDS' => 'Folgende Felder existieren nicht und können nicht für die Suche verwendet werden: %1$s.',
'D3_EXTSEARCH_NAVI_MAINSETTINGS' => 'allgemeine Einstellungen',
'D3_EXTSEARCH_NAVI_DISPTYPE' => 'Art der Filter-Anzeige',
'D3_EXTSEARCH_NAVI_DISPTYPE_LINKLIST' => 'als Linkliste',
'D3_EXTSEARCH_NAVI_DISPTYPE_DROPDOWN' => 'als DropDown-Liste',
'D3_EXTSEARCH_NAVI_DISPTYPE_DESC' => 'Stellen Sie hier die Anzeigeform der Kategorie-, Lieferanten- und Markenlisten ein. Die DropDown-Listen sparen in der Anzeige Platz, können jedoch bei vielen Einträgen unübersichtlich lang werden. Alternativ empfehlen sich Linklisten, die in ihrer Länge auch eingeschränkt werden können.<br>Beide Anzeigeformen lassen sich im Template nachbearbeiten.',
'D3_EXTSEARCH_NAVI_EMPTYSEARCH' => 'Suche ohne Suchbegriff zulassen',
'D3_EXTSEARCH_NAVI_EMPTYSEARCH_DESC' => 'Es kann durchaus sinnvoll sein, auch Suchvorgänge ohne einen Suchbegriff zuzulassen. Möglicherweise werden die dann erhaltenen Treffer erst durch eine zusätzliche Einstellung gefiltert oder Sie möchten ein umfangreiches Suchformular aufbauen, welches möglicherweise kein frei definierbares Suchwort enthält.',
'D3_EXTSEARCH_NAVI_CATFILTER' => 'Kategoriefilter',
'D3_EXTSEARCH_NAVI_CATLIST' => 'zeige Kategorienliste',
'D3_EXTSEARCH_NAVI_CATLIST_DESC' => 'Setzen Sie den Haken, um Ihrem Kunden bei einer umfangreichen Trefferliste eine Auswahl der betroffenen Kategorien anzuzeigen. Damit kann er sein Suchergebnis gezielt einschränken und verbessern. Angezeigt wird der Kategoriename und die Anzahl der darin enthaltenen Artikel der Trefferliste.',
'D3_EXTSEARCH_NAVI_CATLIST_SORT' => 'sortiert nach',
'D3_EXTSEARCH_NAVI_CATLIST_SORT_COUNT' => 'Anzahl der enthaltenen Artikel',
'D3_EXTSEARCH_NAVI_CATLIST_SORT_DATA' => 'einstellbare Sortierreihenfolge',
'D3_EXTSEARCH_NAVI_CATLIST_SORT_DESC' => 'Legen Sie hier fest, nach welchem Kriterium die Kategorieliste sortiert sein soll. Auf die Darstellung hat dies jedoch keinen EinfluĂź.',
'D3_EXTSEARCH_NAVI_CATLIST_MORE_DESC' => 'Weitere Einstellungen zu Kategoriefiltern finden Sie direkt an den jeweiligen Kategorien im Tab fĂĽr die Sucheinstellungen.',
'D3_EXTSEARCH_NAVI_FILTER_DISPLAYTYPE' => 'angezeigte Auswahl',
'D3_EXTSEARCH_NAVI_FILTER_DISPLAYTYPE_COMBINED' => 'Einfach- und Mehrfachauswahl umschaltbar',
'D3_EXTSEARCH_NAVI_FILTER_DISPLAYTYPE_SINGLE' => 'nur Einfachauswahl',
'D3_EXTSEARCH_NAVI_FILTER_DISPLAYTYPE_MULTI' => 'nur Mehrfachauswahl',
'D3_EXTSEARCH_NAVI_FILTER_DISPLAYTYPE_DESC' => 'Stellen Sie ein, wie die Filter dem Shopbesucher gezeigt werden sollen.<br><br>Einfachauswahl stellt ein DropDown dar, welches den einzelnen Eintrag nach Auswählen sofort absendet. Ein weiterer Eintrag aus diesem Filter ist nicht wählbar.<br><br>Mehrfachauswahl stellt alle Einträge als Checkboxen dar. Der Kunde kann alle gewünschte Einträge auswählen und sendet diese gesamt ab.',
'D3_EXTSEARCH_NAVI_FILTER_MORE_DESC' => 'Weitere Einstellungen zu Attributsfiltern finden Sie direkt an den jeweiligen Attributen im Tab fĂĽr die Sucheinstellungen.',
'D3_EXTSEARCH_NAVI_CATLISTMAINCATEGORIESONLY' => 'nur Hauptkategorien der Artikel anzeigen',
'D3_EXTSEARCH_NAVI_CATLISTMAINCATEGORIESONLY_DESC'=> 'Die Option verhindert das Auflisten zusätzlich zugeordneter Kategorien als Filter. Er werden ausschließlich die Hauptkategorien der gefundenen Artikel gezeigt.',
'D3_EXTSEARCH_NAVI_VENDORFILTER' => 'Lieferantenfilter',
'D3_EXTSEARCH_NAVI_VENDORLIST' => 'zeige Lieferantenliste',
'D3_EXTSEARCH_NAVI_VENDORLIST_DESC' => 'Ebenso wie für die Kategorien gibt es auch die Möglichkeit, die Trefferliste noch einmal nach den Lieferanten zu filtern. Dies schalten Sie hier ein. Diese Option ist nur verfügbar, wenn Sie generell die Lieferantent im Shop aktiviert haben und auch eine Suche danach erlauben. (\'Lieferantenliste laden und anzeigen\')',
'D3_EXTSEARCH_NAVI_VENDORLIST_SORT' => 'sortiert nach',
'D3_EXTSEARCH_NAVI_VENDORLIST_SORT_COUNT' => 'Anzahl der enthaltenen Artikel',
'D3_EXTSEARCH_NAVI_VENDORLIST_SORT_ALPHA' => 'alphabetisch',
'D3_EXTSEARCH_NAVI_VENDORLIST_SORT_DESC' => 'Bestimmen Sie die Anzeigereihenfolge, in der die Lieferanten aufgelistet sein sollen.',
'D3_EXTSEARCH_NAVI_MANUFACTURERFILTER' => 'Markenfilter',
'D3_EXTSEARCH_NAVI_MANUFACTURERLIST' => 'zeige Markenliste',
'D3_EXTSEARCH_NAVI_MANUFACTURERLIST_DESC' => 'Ebenso wie für die Kategorien gibt es auch die Möglichkeit, die Trefferliste noch einmal nach den Marken zu filtern. Dies schalten Sie hier ein. Diese Option ist nur verfügbar, wenn Sie generell die Marken im Shop aktiviert haben und auch eine Suche danach erlauben. (\'Markenliste laden und anzeigen\')',
'D3_EXTSEARCH_NAVI_MANUFACTURERLIST_SORT' => 'sortiert nach',
'D3_EXTSEARCH_NAVI_MANUFACTURERLIST_SORT_COUNT' => 'Anzahl der enthaltenen Artikel',
'D3_EXTSEARCH_NAVI_MANUFACTURERLIST_SORT_ALPHA' => 'alphabetisch',
'D3_EXTSEARCH_NAVI_MANUFACTURERLIST_SORT_DESC' => 'Bestimmen Sie die Anzeigereihenfolge, in der die Marken aufgelistet sein sollen.',
'D3_EXTSEARCH_NAVI_REDIRECTS' => 'Weiterleitungen',
'D3_EXTSEARCH_NAVI_UNIQUEHIT' => 'bei 1 Artikeltreffer, Shop wechselt direkt zur Detailseite des Artikels',
'D3_EXTSEARCH_NAVI_UNIQUEHIT_DESC' => 'Hat Ihr Kunde so präzise gesucht, daß er die gewünschte Information als Einziges in der Trefferliste hat, können Sie ihm den Umweg über die Trefferliste ersparen und liefern ihm sofort die Detailseite des gefunden Artikels.',
'D3_EXTSEARCH_NAVI_UNIQUECONTENTHIT' => 'bei 1 CMS-/Texttreffer, Shop wechselt direkt zur CMS-Seite',
'D3_EXTSEARCH_NAVI_UNIQUECONTENTHIT_DESC' => 'Enthält das Suchergebniss keine Artikel, jedoch einen einzigen CMS-Text, wird direkt auf die passende CMS-Seite weitergeleitet. Der Benutzer verlässt damit die Suchfunktion des Shops, seine Sucheinstellungen sind dann nicht mehr verfügbar.',
'D3_EXTSEARCH_NAVI_UNIQUEVENDORHIT' => 'bei 1 Lieferantentreffer, Shop wechselt direkt zur Lieferanten-Seite des Shops',
'D3_EXTSEARCH_NAVI_UNIQUEVENDORHIT_DESC' => 'Enthält das Suchergebniss keine Artikel, jedoch einen einzigen Lieferant, wird direkt auf die passende Lieferanten-Seite Ihres Shops weitergeleitet. Diese Option erfordert die "Suche in Marken- und Lieferantennamen". Der Benutzer verlässt damit die Suchfunktion des Shops, seine Sucheinstellungen sind dann nicht mehr verfügbar.',
'D3_EXTSEARCH_NAVI_UNIQUEMANUFACTURERHIT' => 'bei 1 Markentreffer, Shop wechselt direkt zur Marken-Seite des Shops',
'D3_EXTSEARCH_NAVI_UNIQUEMANUFACTURERHIT_DESC' => 'Enthält das Suchergebniss keine Artikel, jedoch eine einzige Marke, wird direkt auf die passende Marken-Seite Ihres Shops weitergeleitet. Diese Option erfordert die "Suche in Marken- und Lieferantennamen". Der Benutzer verlässt damit die Suchfunktion des Shops, seine Sucheinstellungen sind dann nicht mehr verfügbar.',
'D3_EXTSEARCH_NAVI_CONTENTS' => 'Informationsseiten / CMS-Texte',
'D3_EXTSEARCH_NAVI_CONTENTLIST' => 'suche in CMS-Texten',
'D3_EXTSEARCH_NAVI_CONTENTLIST_DESC' => 'Aktivieren Sie diese Option, wenn Sie Ihren Kunden auch Informationstexte suchbar machen wollen. Beachten Sie bitte, dass Sie jeden einzelnen CMS-Text fĂĽr die Suche aktivieren mĂĽssen. Damit wird vermieden, dass z.B. Infotexte, die fĂĽr E-Mails bestimmt sind, von der Suche berĂĽcksichtigt werden. Das Aktivieren nehmen Sie direkt am Text vor: <br><br>"Kundeninformationen -> CMS-Seiten -> Stamm -> kann gesucht werden"',
'D3_EXTSEARCH_NAVI_ATTRIBUTEFILTER' => 'Attributfilter',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST' => 'zeige Attributsliste',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_DESC' => 'Aktivieren Sie diese Option, wenn auch nach Attributen gefiltert werden soll.<br>Jedes Attribut kann in dessen Einstellungen ("Artikel verwalten > Attribute") von der Filterung ausgeschlossen werden, wenn dies nicht sinnvoll ist.',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_ASSIGNMENT' => 'verwende Attributsaktivierung pro Kategorie, Hersteller und Lieferant',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_ASSIGNMENT_DESC' => 'Sollen an diesen Elementen nicht alle verfügbaren Attribute zur Filterung angeboten werden, können Sie <br><ul><li>jedes Attribut generell von der Filterung ausschließen oder</li><li>alternativ auch definieren, welches Attribut bei welchem dieser Elemente verwendet werden darf</li></ul> Möchten Sie die individuelle Zuordnung nutzen, aktivieren Sie bitte diese Option. Aus Performancegründen ist diese nicht pauschal aktiviert.<br><br>Die Zuordnungen setzen Sie bitte an der jeweiligen Kategorie, Hersteller, Lieferant oder korrespondierend am jeweiligen Attribut.',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_ASSIGNMENT_NA' => 'Zuordnungsverwendung ist nicht aktiviert.',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_ASSIGNMENT_NA_DESC' => 'Die Verwendung der Zuordnungen muss aus Performcegründen in den Einstellungen des Moduls aktiviert werden (D3 Module -> Erweiterte Suche -> Einstellungen -> Filter + Anzeige -> Attributfilter -> verwende Attributsaktivierung pro Kategorie). Bis dahin können Sie die Zuordnung setzen. Verwendet werden diese jedoch erst nach Aktivierung.',
'D3_EXTSEARCH_NAVI_ATTRIBUTES_COMBINE' => 'mehrfache Attributselektionen werden mit "ODER" verknĂĽpft',
'D3_EXTSEARCH_NAVI_ATTRIBUTES_COMBINE_DESC' => 'Aktivieren Sie diese Option, wenn beispielsweise bei gewählter Farbe und gewähltem Material auch Artikel gezeigt werden sollen, die nur eine der Eigenschaften haben. Ohne diese Option werden nur Artikel gezeigt, die beide Eigenschaften gleichzeitig besitzen.',
'D3_EXTSEARCH_NAVI_ATTRIBUTES_SORT' => 'Attribute sortiert nach',
'D3_EXTSEARCH_NAVI_ATTRIBUTES_SORT_POS' => 'einstellbarer Attributsposition',
'D3_EXTSEARCH_NAVI_ATTRIBUTES_SORT_TITLE' => 'Attributstitel',
'D3_EXTSEARCH_NAVI_ATTRIBUTES_SORT_DESC' => 'Hier definieren Sie die Reihenfolge der angezeigten Attribute.',
'D3_EXTSEARCH_NAVI_ATTRIBUTEVALUES_COMBINE' => 'mehrfache Attributwertselektionen ("Mehrfachauswahl") werden mit "UND" verknĂĽpft',
'D3_EXTSEARCH_NAVI_ATTRIBUTEVALUES_COMBINE_DESC' => 'Aktivieren Sie diese Option, wenn beispielsweise bei gewählter Farbe "rot" und "grün" nur Artikel gezeigt werden sollen, die beide Farben gleichzeitig haben. Ohne diese Option werden auch Artikel gezeigt, die nur eine der beiden Eigenschaften besitzen.',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_SORT' => 'Attributswerte sortiert nach',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_SORT_COUNT' => 'Anzahl der enthaltenen Artikel',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_SORT_POS' => 'einstellbarer Attributslistenposition',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_SORT_TITLE' => 'Attributwerttitel',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_SORT_DESC' => 'Hier definieren Sie die Reihenfolge der angezeigten Attributwerte.<br><br>Die Attributlistenposition lässt sich in der Datenbank hinterlegen. Leider bietet der OXID-Shop im Standard keine Möglichkeit, diese Werte im Backend zu verändern.',
'D3_EXTSEARCH_NAVI_NOATTRIBUTEARTS' => 'auch nach nicht dem jeweiligen Attribut zugeordneten Artikeln filtern',
'D3_EXTSEARCH_NAVI_NOATTRIBUTEARTS_DESC' => 'Die Attributsfilter bieten mit dieser Option die Wahlmöglichkeit, auch nach Artikeln zu filtern, die z.B. ausdrücklich keiner Farbe oder keinem Material zugeordnet sind.',
'D3_EXTSEARCH_NAVI_SHOWNOTSELECTABLEATTRIBUTES' => 'nicht (sicher) wählbare Attributswerte werden nicht ausgeblendet',
'D3_EXTSEARCH_NAVI_SHOWNOTSELECTABLEATTRIBUTES_DESC' => 'Bei der Artikelfilterung über Attribute werden andere, nicht sicher wählbare Attribute normalerweise ausgeblendet. Wenn gewünscht ist, dass der Shopbesucher seine Trefferliste mit zusätzlichen Attributswerten ergänzt, können diese angezeigt werden. Jedoch können dann ggf. ungültige Attributskombinationen gewählt werden, die zu keinem Treffer führen.<br>Beachten Sie, dass zur Ermittlung dieser Attribute eine zusätzliche Datenabfrage ausgeführt wird. Je nach Artikel-Attributs-Struktur kann dies zusätzliche Ladezeit benötigen. Die Anzeige der Anzahl der verfügbaren Artikel sollte dann deaktiviert werden, da die Werte zwar noch richtig, dann aber nicht mehr plausibel sind.',
'D3_EXTSEARCH_NAVI_CONTENTSEARCHINLONGTEXT' => 'in CMS-Texten auch Langtexte durchsuchen',
'D3_EXTSEARCH_NAVI_CONTENTLONG_DESC' => 'Soll neben dem Titel Ihres Textes auch der Inhalt durchsucht werden, aktivieren Sie diese Optionen. Beachten Sie, dass dies mehr Leistung erfordert.',
'D3_EXTSEARCH_NAVI_SMALLLISTITEMS' => 'Kategorie-, Lieferanten-, Marken- und Textlisten begrenzen<br>(Kunde kann alle Treffer auf Wunsch anzeigen, funktioniert nur bei "Linklisten")',
'D3_EXTSEARCH_NAVI_SMALLLISTITEMS_2' => ' Einträge',
'D3_EXTSEARCH_NAVI_SMALLLISTITEMS_DESC' => 'Bei vielen Suchtreffern kann auch die Kategorie-, Marken-, Lieferanten- und Textliste sehr lang werden. Die Artikeltreffer rutschen so vielleicht nach unten aus dem Anzeigebereich heraus. Beschränken Sie die Anzahl der angezeigten Kategorien und Marken, um diese Listen kurz zu halten. Werden diese Listen dann tatsächlich gekürzt, steht Ihrem Kunden eine Schaltfläche zur Verfügung, um diese Listen auf Wunsch komplett anzuzeigen.',
'D3_EXTSEARCH_NAVI_ALISTFILTER' => 'Filter werden auch in Artikellisten gezeigt',
'D3_EXTSEARCH_NAVI_ALISTFILTER_DESC' => 'Auch Artikellisten können mit Filtern eingeschränkt werden. Filterungen sind in Kategorieansichten, Hersteller- und Lieferantenlisten möglich. Als Filter stehen die Einschränkungen über Kategorien, Hersteller, Lieferanten, Attribute oder Preise zur Verfügung. Als Optionen werden die Einstellungen für die Suche verwendet.<br>Ist dieser Eintrag nicht wählbar, ist diese Option wahrscheinlich in Ihrer Modullizenz nicht enthalten. Lassen Sie Ihre Lizenz hierfür erweitern.',
'D3_EXTSEARCH_NAVI_PRICELIST' => 'zeige Preiskategorien',
'D3_EXTSEARCH_NAVI_PRICEFILTER' => 'Preisfilter',
'D3_EXTSEARCH_NAVI_PRICELIST_DESC' => 'Alle gefundenen Artikel werden in Preiskategorien aufgeteilt und diese als weitere Filterkriterien angeboten. So kann der Kunde eine gewisse Preisspanne für seine gewünschten Artikel wählen. Rabatte sind in den Kategoriepreisen nicht berücksichtig. Gefundene Artikel sind in dem Fall preiswerter, als die Suchanfrage vorgibt.',
'D3_EXTSEARCH_NAVI_PRICELIST_ITEMS' => 'maximale Anzahl der Preiskategorien',
'D3_EXTSEARCH_NAVI_PRICELIST_ITEMS_DESC' => 'So viele Preisspannen werden maximal angezeigt. Im Normalfall kann dies jedoch weniger sein, da leere Preisspannen (also ohne enthaltene Artikel) ausgefiltert werden. (nur wirksam bei Darstellung als DropDown-Liste)',
'D3_EXTSEARCH_NAVI_PRICELIST_ROUNDED' => 'Preisspannen werden gerundet',
'D3_EXTSEARCH_NAVI_PRICELIST_ROUNDED_DESC' => 'Die kleinste Preisspanne beginnt beim kleinstmöglichen Preis, die größte Preisspanne erstreckt sich bis zum höchten Preis. Die Grenzen dazwischen werden errechet. Diese können unter Umständen jedoch bei krummen Cent-Beträgen liegen. Mit der Option werden die Preise der Spannen gerundet, die Spannen sind jedoch dann weniger aussagekräftig. (nur wirksam bei Darstellung als DropDown-Liste)',
'D3_EXTSEARCH_NAVI_PRICELIST_DISPLAY' => 'Anzeige der Preisspannen',
'D3_EXTSEARCH_NAVI_PRICELIST_DISPLAY_DESC' => 'Neben den schon gewohnten Dropdown- bzw. Linklisten können Sie für die Preisspannen auch Schieberegler verwenden. Das macht die Auswahl für Ihre Kunden intuitiver.',
'D3_EXTSEARCH_NAVI_PRICELIST_DISPLAY_LISTTYPE' => 'als Dropdown',
'D3_EXTSEARCH_NAVI_PRICELIST_DISPLAY_SLIDER' => 'als Schieberegler',
'D3_EXTSEARCH_NAVI_HIGHLIGHT' => 'gefundene Textstellen werden in Suchergebnissen hervorgehoben',
'D3_EXTSEARCH_NAVI_HIGHLIGHT_DESC' => 'Manchmal taucht der gesuchte Begriff erst mitten in Beschreibungen auf. Mit dieser Option heben Sie den Begriff optisch hervor.<br><br>Stellen Sie dazu im Template \'d3_ext_search_highlight.tpl\' ein, wie die Hervorhebung aussehen soll. Ersetzen Sie dann in \'inc/product.tpl\' alle Variablen, die Hervorhebungen enthalten sollen, gegen den Smarty-Aufruf \[\{ d3_extsearch_highlight text=$variablenname \}\], wobei $variablenname gegen die tatsächliche Textvariable ersetzt wird.',
'D3_EXTSEARCH_NAVI_DONTSHOWFILTERARTICLECOUNT' => 'Anzahl zum Filter gefundener Artikel wird <b>nicht</b> angezeigt',
'D3_EXTSEARCH_NAVI_DONTSHOWFILTERARTICLECOUNT_DESC'=> 'An den angebotenen Artikelfiltern wird die Anzahl der dazu passenden Artikel gezeigt. Wenn die Anzeige nicht gewĂĽnscht ist, kann diese hier deaktiviert werden.',
'D3_EXTSEARCH_NAVI_INDEXFILTER' => 'Buchstabenindex',
'D3_EXTSEARCH_NAVI_SHOWINDEX' => 'zeige Buchstabenindex',
'D3_EXTSEARCH_NAVI_SHOWINDEX_DESC' => 'Dieser Index sind kleine Tabs oberhalb der Trefferliste, mit denen Ihren Kunden die Artikel nach deren Anfangsbuchstaben selektieren können. Die Anzeige des Buchstabenindex kann über CSS und den beiliegenden Templates bearbeitet werden.',
'D3_EXTSEARCH_NAVI_FILTERFIELDNAME' => 'Feldname, nach dem gefiltert wird',
'D3_EXTSEARCH_NAVI_FILTERFIELDNAME_DESC' => 'An Hand dieses Feldnamens wird der Indexbuchstabe ermittelt und die Artikel bei Auswahl eines Buchstabens gefiltert. Möglich sind hier alle Felder aus der Tabelle oxarticles (ohne Sprachzusatz).',
'D3_EXTSEARCH_NAVI_OWNFORMFIELDS' => 'individuelle Filter',
'D3_EXTSEARCH_NAVI_SAVE' => 'Speichern',
'D3_EXTSEARCH_QUICK' => 'Schnelltreffer',
'D3_EXTSEARCH_QUICK_ACTIVE' => 'bei Eingabe des Suchbegriffs werden Vorschläge geliefert',
'D3_EXTSEARCH_QUICK_ACTIVE_DESC' => '<img src="../modules/d3/extsearch/out/admin/img/d3_extsearch_quicksearch.jpg"><br>Geben Sie Ihrem Kunden die Möglichkeit, Artikel noch schneller zu finden. Die Schnellsuche stellt schon während der Eingabe des Suchbegriffs die ersten Treffer in einem eigenen Rahmen dar.<br>In mobilen Ansichten wird die Schnelltrefferliste aus Gründen der Bedienbarkeit nicht gezeigt.<br><br>Das Ergebnisfenster der Schnellsuche kann über CSS und Templateanpassungen individuell gestaltet werden.',
'D3_EXTSEARCH_QUICK_FULLOBJECTS' => 'Schnellsuche lädt komplette Objekte, statt performanceoptimierter Zuweisung',
'D3_EXTSEARCH_QUICK_FULLOBJECTS_DESC' => 'Für die gewöhnliche Darstellung der Schnellsuche reicht eine performanceoptimierte Zuweisung der Ergebnisdaten. Für die Anzeige von bestimmten Informationen (z.B. berechnete Preise etc.) ist es erforderlich, die kompletten Objekte zu laden. Dies vermindert jedoch die Ladegeschwindigkeit.',
'D3_EXTSEARCH_QUICK_COUNT' => 'maximale Anzahl der zu ladenden Artikel in der Schnellsuche',
'D3_EXTSEARCH_QUICK_COUNT_DESC' => 'Aus Performancegründen werden die Schnellsuchtreffer nur bis zu dieser definierten Anzahl gezeigt. Werden mehr Treffer gefunden, blendet sich die Artikelliste nicht ein, statt dessen wird ein Hinweis gezeigt. Erhöhen Sie den Wert, wenn Sie für häufig vorkommende Suchbegriffe keine Schnelltreffer erhalten. Kontrollieren Sie aber bitte unbedingt danach die Last Ihres Servers / Accounts. Der Standardwert ist 200.',
'D3_EXTSEARCH_QUICK_LOADCATEGORIES' => 'zusätzlich auch nach entsprechend benannten Kategorien suchen',
'D3_EXTSEARCH_QUICK_LOADCATEGORIES_DESC' => 'Neben Artikeln werden in der Schnellsuche auch Kategorien gesucht. Beachten Sie bitte, dass diese Option zusätzliche Resourcen verbraucht, die die Schnellsuche langsamer werden lassen.',
'D3_EXTSEARCH_QUICK_LOADMANUFACTURERS' => 'zusätzlich auch nach entsprechend benannten Marken suchen',
'D3_EXTSEARCH_QUICK_LOADMANUFACTURERS_DESC' => 'Neben Artikeln werden in der Schnellsuche auch Marken gesucht. Beachten Sie bitte, dass diese Option zusätzliche Resourcen verbraucht, die die Schnellsuche langsamer werden lassen.',
'D3_EXTSEARCH_QUICK_LOADVENDORS' => 'zusätzlich auch nach entsprechend benannten Lieferanten suchen',
'D3_EXTSEARCH_QUICK_LOADVENDORS_DESC' => 'Neben Artikeln werden in der Schnellsuche auch Lieferanten gesucht. Beachten Sie bitte, dass diese Option zusätzliche Resourcen verbraucht, die die Schnellsuche langsamer werden lassen.',
'D3_EXTSEARCH_QUICK_LOADCONTENT' => 'zusätzlich auch nach entsprechend benannten Texten suchen',
'D3_EXTSEARCH_QUICK_LOADCONTENT_DESC' => 'Neben Artikeln werden in der Schnellsuche auch Texte gesucht. Beachten Sie bitte, dass diese Option zusätzliche Resourcen verbraucht, die die Schnellsuche langsamer werden lassen.<br><br>Für die Verwendung dieser Option ist es erforderlich, dass die Textsuche auch für die reguläre Trefferliste aktiviert ist (Tab "Grundeinstellungen").',
'D3_EXTSEARCH_QUICK_CMPLOBJ' => 'vor Oxid 4.3.0: komplettes Artikel-Objekt laden, sonst nur ID, Titel und Icon.<br>Nur bei Bedarf aktivieren, verbraucht mehr Ressourcen. ',
'D3_EXTSEARCH_QUICK_CMPLOBJ_DESC' => 'Die Darstellung der Schnelltreffer kann von Ihnen in einem Template grafisch an Ihren Shop angepaßt werden. Vielleicht benötigen Sie für Ihre gewünschte Darstellung noch weitere Daten außer dem Arikelnamen und dem Link zum Artikel. So lassen sich z.B. auch Miniaturbilder, der Preis oder auch gleich ein Warenkorbbutton einblenden. Dazu benötigen Sie jedoch Informationen, die so im Standard nicht verfügbar sind. Setzen Sie diesen Haken, um alle Artikeldaten verfügbar zu machen.<br><br>Ab Shopversion 4.3.0 ist es unbedingt notwendig, das komplette Artikelobjekt zu laden. Diese Einstellung wird dann ignoriert.',
'D3_EXTSEARCH_QUICK_LOADVARIANTS' => 'Variantenartikel laden und in der Schnellsuche anzeigen<br>Tragen Sie dazu in den Suchfeldern zusätzlich \'oxvarselect\' ein.',
'D3_EXTSEARCH_QUICK_LOADVARIANTS_DESC' => 'Normalerweise sucht die Shopsuche nicht nach Artikelvarianten. Haben Sie jedoch viele Variantenartikel in Ihrem Shop, kann es sinnvoll sein, die Suche dafĂĽr freizuschalten.',
'D3_EXTSEARCH_QUICK_SAVE' => 'Speichern',
'D3_EXTSEARCH_QUICK_TPLNOTICE' => 'Hinweis: Um das Fenster der Schnellsuche grafisch anzupassen, erweitern Sie die Templateblöcke in \'d3_ext_search_suggestsearch.tpl\'.',
'D3_EXTSEARCH_QUICK_IAS' => 'interaktive Suche (Markier-Suche)',
'D3_EXTSEARCH_QUICK_SHOWIAS' => 'zeige interaktive Suche (Markier-Suche)',
'D3_EXTSEARCH_QUICK_SHOWIAS_DESC' => 'Markieren Sie im Shop ein Wort, wird Ihnen in dessen Nähe ein kleines Formular eingeblendet, mit dessen Hilfe Sie sofort nach dem markierten Wort suchen können. Klicken Sie an eine andere Stelle im Shop, verschwindet das Fenster wieder.',
'D3_EXTSEARCH_STAT_TYPE' => 'Auswertung:',
'D3_EXTSEARCH_STAT_NOHITS' => 'keine Auswertungen vorhanden',
'D3_EXTSEARCH_STAT_TYPEHITLESS' => 'Suchabfragen ohne Treffer',
'D3_EXTSEARCH_STAT_TYPEMOSTHITS' => 'Suchabfragen mit den meisten Treffern',
'D3_EXTSEARCH_STAT_TYPEMOSTSEARCHES' => 'häufigste Suchbegriffe',
'D3_EXTSEARCH_STAT_LANG' => 'Sprache:',
'D3_EXTSEARCH_STAT_TIME' => 'Zeitraum:',
'D3_EXTSEARCH_STAT_GENERATESTAT' => 'Auswertung erstellen',
'D3_EXTSEARCH_STAT_SEARCHWORD' => 'Suchwort',
'D3_EXTSEARCH_STAT_HITS' => 'Treffer',
'D3_EXTSEARCH_STAT_SEARCHES' => 'Anfragen',
'D3_EXTSEARCH_STAT_TYPES_CATEGORY' => 'Kategorie',
'D3_EXTSEARCH_STAT_TYPES_PRICE' => 'Preis',
'D3_EXTSEARCH_STAT_TYPES_VENDOR' => 'Lieferant',
'D3_EXTSEARCH_STAT_TYPES_MANUFACTURER' => 'Marken',
'D3_EXTSEARCH_STAT_TYPES_OWNLIKE' => 'eig. Suchfeld (LIKE)',
'D3_EXTSEARCH_STAT_TYPES_OWNIS' => 'eig. Suchfeld (IS)',
'D3_EXTSEARCH_STAT_TYPES_OWNBITSET' => 'eig. Suchfeld (BITSET)',
'D3_EXTSEARCH_STAT_TYPES_OWNVALUE' => '%s => "%s"',
'D3_EXTSEARCH_STAT_TYPES_ATTRIBUTE' => 'Attribute',
'D3_EXTSEARCH_STAT_TYPES_INDEXLETTER' => 'Indexbuchstabe',
'D3_EXTSEARCH_STAT_TYPES_UNKNOWN' => 'unbekannte Filterung',
'D3_EXTSEARCH_STAT_STATDESC_HITLESS' => 'ergebnislose Suchanfragen in %s nach "%s" ',
'D3_EXTSEARCH_STAT_STATDESC_MOSTSEARCHES' => 'Suchanfragen in %s nach "%s" ',
'D3_EXTSEARCH_STAT_NOITEMS' => 'für die Einstellungen sind keine Einträge vorhanden',
'D3_EXTSEARCH_STAT_NOITEMS_DESC' => 'Wenn Sie hier Daten erwartet haben, kontrollieren Sie bitte, ob die Statistikerfassung in den Moduleinstellungen passend aktiviert ist.',
'D3_EXTSEARCH_STAT_SELECTFILTER' => 'Setzen Sie den gewĂĽnschten Filter und schicken Ihre Auswahl ab, um Ergebnisse zu erhalten.',
'D3_EXTSEARCH_PLUGIN_SETTINGS' => 'Einstellungen',
'D3_EXTSEARCH_PLUGIN_SEARCHACTIVE' => 'dem Nutzer im Browser anbieten, das Such-Plugin zu installieren',
'D3_EXTSEARCH_PLUGIN_SEARCHACTIVE_DESC' => 'In aktuellen Browsern finden Sie im rechten oberen Eck eine Möglichkeit, von jeder beliebigen Stelle im Internet aus die wichtigsten Suchmaschinen zu starten. Bieten Sie Ihren Kunden an, auch Ihren Shop in diese Liste hinzuzufügen. So reicht es, in der Drop-Down-Box Ihren Shop auszuwählen und den Suchbegriff einzugeben. Sofort wird Ihr Shop mit den Suchtreffern gezeigt. Als Text wird Ihr Shoptitel verwendet, ein Icon können Sie weiter unten festlegen.',
'D3_EXTSEARCH_PLUGIN_INSTALLLINK' => 'einen Installationslink in der Shop-Suche anzeigen',
'D3_EXTSEARCH_PLUGIN_INSTALLLINK_DESC' => 'Kann Ihr Kunden Ihren Shop in die Suchmaschinenliste hinzufügen, wird dies im Browser durch eine farbige Umrandung angezigt. Dies ist jedoch nur wenig auffällig, viele Nutzer übersehen dies. Stellen Sie in den Suchergebnissen besser noch einen zusätzlichen Link dar, um auf diese Funktion hinzuweisen.',
'D3_EXTSEARCH_PLUGIN_SEARCHICON' => 'Icon fĂĽr Browserplugin',
'D3_EXTSEARCH_PLUGIN_CHOOSEICON' => 'Bitte wählen Sie noch ein Icon.',
'D3_EXTSEARCH_PLUGIN_SEARCHICON_DESC' => 'Legen Sie hier das Icon fest, welches im Browser-Plugin angezigt werden soll. Das Icon muß ein Größe von 16 x 16 Pixeln haben und im PNG- oder JPG-Format vorliegen.',
'D3_EXTSEARCH_PLUGIN_SAVE' => 'Speichern',
'D3_EXTSEARCH_PLUGIN_GENERATE' => 'Generierung',
'D3_EXTSEARCH_PLUGIN_GENERATE_DESC' => 'Haben Sie Ihren Shoptitel geändert, ein neues Icon festgelegt oder sogar Ihren Shop auf eine neue Adresse umgezogen, ist es nötig, das Suchplugin zu aktualisieren. Weisen Sie bitte auch Ihre Kunden darauf hin, das Plugin zu aktualisieren. Es erneuert sich nicht automatisch.',
'D3_EXTSEARCH_PLUGIN_STARTGENERATING' => 'Erstellung durchfĂĽhren',
'D3_EXTSEARCH_PLUGIN_GENERATEFILE' => 'Installations-Datei erstellen:',
'D3_EXTSEARCH_PLUGIN_GENERATENOTICE' => 'Mit der Erstellung der Installations-Datei haben Sie alle erforderlichen Schritte durchgefĂĽhrt. Startet Ihr Kunde die Integration, wird diese Datei automatisch von Ihrem Server ausgelesen.',
'D3_EXTSEARCH_PLUGIN_CREATE_SUCC' => 'Plugindatei wurde erfolgreich generiert.',
'D3_EXTSEARCH_PLUGIN_CREATE_NSUCC' => 'Plugindatei konnte nicht erstellt werden.',
'D3_EXTSEARCH REPORT_MOSTSEARCHES' => 'Suchbegriffe (nur im Suchmodul verfgb.)',
'D3_EXTSEARCH_STATISTIC_MOSTSEARCHES' => 'häufigste Suchbegriffe',
'D3_EXTSEARCH_STATISTIC_MOST_DESC' => 'So oft wurde der gewählte Begriff gesucht',
'D3_EXTSEARCH_STATISTIC_FURTHERFILTERS' => '(durch weitere Filter eingeschränkt)',
'D3_EXTSEARCH_CONTENT_SEARCHABLE' => 'CMS kann gesucht werden',
'D3_EXTSEARCH_PUSH' => 'Wichtigkeit des Artikels im Sortiment',
'D3_EXTSEARCH_PUSH_1' => 'normal',
'D3_EXTSEARCH_PUSH_2' => 'wichtiger',
'D3_EXTSEARCH_PUSH_3' => 'besonders wichtig',
'D3_EXTSEARCH_PUSH_DESC' => 'DÂł Modul "erweiterte Suche": Die Wichtigkeit definiert die erste Reihenfolge der Artikel in der Suche (bei Verwendung der "erweiterten Suche"). In Verbindung mit Feldrelevanz funktioniert die Wichtigkeit als Faktor. Besonders wichtige Artikel haben zum Beispiel die 3 fache Relevanz von normal gewichteten Artikeln. Beachten Sie dies auch bei der Vergabe der Feldrelevanz.',
'D3_EXTSEARCH_ATTRIBUTE_NOTUSE4FILTER' => 'Attribut fĂĽr Filter NICHT verwenden',
'D3_EXTSEARCH_ATTRIBUTE_NOTUSE4FILTER_DESC' => 'Bestimmte Attribute können aus der Filterliste ausgeschlossen werden, wenn diese beispielsweise nur für die Artikelverwaltung genutzt werden.',
'D3_EXTSEARCH_ATTRIBUTE_HIDEONEITEMFILTER' => 'Filter mit weniger als 1 Eintrag ausblenden',
'D3_EXTSEARCH_ATTRIBUTE_HIDEONEITEMFILTER_DESC' => 'Hat der Filter dieses Attributs nur 1 Eintrag, wird er nicht angezeigt, um die Filterliste ĂĽbersichtlich zu halten.',
'D3_EXTSEARCH_ATTRIBUTE_USECORRESPONDINGVALUES' => 'fĂĽgt korrespondierende Attributwerte hinzu',
'D3_EXTSEARCH_ATTRIBUTE_USECORRESPONDINGVALUES_DESC' => '<p>Wenn zum ausgewählten Attributswert Synonyme im Synonym-Editor gepflegt sind, werden diese zur Auswahl hinzugefügt, ohne dass der Kunde diese ausdrücklich wählen muss.</p><p>Dies ist zum Beispiel für sinngleiche oder sehr ähnliche Werte sinnvoll (z.B. Kleidungsgrößen im EU- und US-Format).</p>',
'D3_EXTSEARCH_CATEGORY_NOTUSE4FILTER' => 'Kategorie fĂĽr Filter und Kategorieergebnisse NICHT verwenden',
'D3_EXTSEARCH_SYNED_NOLEXICON' => 'Das semantische Lexikon ist nicht installiert! Weitere Informationen hierzu finden Sie im Modulhandbuch.',
'D3_EXTSEARCH_SYNED_WORD' => 'Wort',
'D3_EXTSEARCH_SYNED_WORD_DESC' => 'Suchen Sie nach einem bestimmten Begriff, geben Sie diesen hier ein und senden die Eingabe ab.',
'D3_EXTSEARCH_SYNED_ALTWORD' => 'sinnähnliche Worte',
'D3_EXTSEARCH_SYNED_SYNSETID' => 'Synonym-ID',
'D3_EXTSEARCH_SYNED_SYNSETID_DESC' => 'Suchen Sie nach einer bestimmten Synonym-ID, geben Sie diese hier ein und senden die Eingabe ab.',
'D3_EXTSEARCH_SYNED_SAVENEWSYN' => 'neues Synonym speichern',
'D3_EXTSEARCH_SYNED_SAVENEWSYN_DESC' => 'Legen Sie hier einen weiteren Begriff für die gewählte Bedeutung ab.',
'D3_EXTSEARCH_SYNED_DELETESYN' => 'Soll das Synonym wirklich gelöscht werden?',
'D3_EXTSEARCH_SYNED_MAIN_NEWWORD' => 'Neues Wort / Wortgruppe',
'D3_EXTSEARCH_SYNED_MAIN_WORD' => 'Wort / Wortgruppe:',
'D3_EXTSEARCH_SYNED_MAIN_WORD_DESC' => 'Möchten Sie für eine neue Wortbedeutung passende Begriffe anlegen, notieren Sie hier den ersten Begriff. Fügen Sie den Begriff hier nur ein, wenn die Wortbedeutung noch nicht im Lexikon existiert. Ansonsten tragen Sie den neuen Begriff in der passenden Bedeutung im Tab "Synonyme bearbeiten" nach.',
'D3_EXTSEARCH_SYNED_MAIN_COMMENT' => 'Kommentar:',
'D3_EXTSEARCH_SYNED_MAIN_COMMENT_DESC' => 'Der Kommentar dient ausschließlich dazu, weitere interne Erklärungen zum Begriff ablegen zu können. Er wird für die Suche nicht verwendet.',
'D3_EXTSEARCH_SYNED_MAIN_SYNSETID' => 'Synonym-ID:',
'D3_EXTSEARCH_SYNED_MAIN_SYNSETID_DESC' => 'Unter einer einheitlichen Synonym-ID werden alle Begriffe mit gleicher Bedeutung abgelegt. Bei Neueinträgen wird automatisch eine neue ID vergeben. Wurde ein Begriff versehentlich der falschen Bedeutung zugewiesen, suchen Sie sich aus der passenden Bedeutung die Synonym-Id und ändern diese an Ihrem Begriff.',
'D3_EXTSEARCH_SYNED_MAIN_ISVISIBLE' => 'aktiv:',
'D3_EXTSEARCH_SYNED_MAIN_ISVISIBLE_DESC' => 'Möchten Sie die Synonymgruppe (derzeit) nicht verwenden, entfernen Sie den Haken.',
'D3_EXTSEARCH_SYNED_MAIN_LANGUAGE' => 'Sprache:',
'D3_EXTSEARCH_SYNED_MAIN_LANGUAGE_DESC' => 'Bestimmen Sie hieran, aus welcher Sprache der ausgewählte Begriff stammt und in welcher dieser verwendet werden soll. Es stehen nur die im Shop aktivierten Sprachen zur Verfügung.',
'D3_EXTSEARCH_SYNED_MAIN_LANGUAGE_DISABLED' => '(deaktiviert)',
'D3_EXTSEARCH_SYNED_MAIN_SYNONYMUSE' => 'Synonym wird genutzt fĂĽr',
'D3_EXTSEARCH_SYNED_MAIN_SYNONYMUSEFORTERMS' => 'Ergänzung der Suchbegriffe',
'D3_EXTSEARCH_SYNED_MAIN_SYNONYMUSEFORTERMS_DESC' => 'Sofern die Synonymverwendung in den Modulgrundeinstellungen aktiviert ist, wird dieses Synonym verwendet, wenn der Shopbesucher nach einem der anderen zugeordneten Begriffen sucht. So lassen sich z.B. regionale Begriffe suchbar machen, ohne diese an allen Artikeln zu pflegen.',
'D3_EXTSEARCH_SYNED_MAIN_SYNONYMUSEFORATTRIBUTES' => 'korrespondierende Attributwerte',
'D3_EXTSEARCH_SYNED_MAIN_SYNONYMUSEFORATTRIBUTES_DESC' => 'Sind für einzelne Attribute korrespondierende Werte aktiviert, wird dieses Synonym zusätzlich verwendet, wenn nach einem der anderen zugeordneten Begriffe gefiltert wird. So lassen sich z.B. landesabhängige Kleidungsgrößen übergreifend suchen.',
'D3_EXTSEARCH_SYNED_MANAGE_DESC' => 'Die hier gezeigten Synonyme sind alternative Begriffe für die oben gewählte Bedeutung.',
'D3_EXTSEARCH_SYNED_MANAGE_EDIT' => 'bearbeiten',
'D3_EXTSEARCH_SYNED_MANAGE_EDIT_DESC' => 'Möchten Sie zusätzliche Details zu dem Begriff hinterlegen oder diesen einer anderen Bedeutung zuordnen, klicken Sie auf das Symbol. Der Adminbereich wechselt zum Bearbeitungsbereich für genau den Begriff.',
'D3_EXTSEARCH_SYNED_MANAGE_SYNONYM' => 'Synonym',
'D3_EXTSEARCH_SETTINGS' => 'Einstellungen fĂĽr <img src="https://logos.oxidmodule.com/d3logo.svg" style="width: 1rem; height: 1rem" alt="DÂł" title="DÂł Data Development"> erweiterte Suche',
'D3_EXTSEARCH_SETTINGS_DESC' => 'Verwendung erfordert aktiviertes Modul',
'tbclattribute_extsearch' => 'Such- und Filtereinstellungen',
'D3_EXTSEARCH_ASSIGNCATEGORIES' => 'filterbare Kategorien zuordnen',
'D3_EXTSEARCH_ASSIGNCATEGORIES_DESC' => 'Soll das gewählte Attribut nur an bestimmten Kategorien zur Filterung gezeigt werden, ordnen Sie diese Kategorien hier zu. Ohne eine Zuordnung wird das Attribut an allen Kategorien zur Filterung verwendet, in denen entsprechende Artikel verfügbar sind.<br><br>Die Zuordnung wirkt nur, wenn das Attribut nicht grundsätzlich von der Verwendung als Filter ausgeschlossen ist (Artikel verwalten -> Attribute -> Such- und Filtereinstellungen -> Attribut wird in Ergebnislisten für Filter NICHT verwendet) und die Verwendung dieser individuellen Zuordnung in den Modulgrundeinstellungen aktiviert wurde (D3 Module -> Erweiterte Suche -> Einstellungen -> Filter + Anzeige -> Attributfilter -> verwende Attributsaktivierung pro Kategorie, Hersteller und Lieferant).',
'D3_EXTSEARCH_ASSIGNMANUFACTURERS' => 'filterbare Marken zuordnen',
'D3_EXTSEARCH_ASSIGNMANUFACTURERS_DESC' => 'Soll das gewählte Attribut nur an bestimmten Marken zur Filterung gezeigt werden, ordnen Sie diese Marken hier zu. Ohne eine Zuordnung wird das Attribut an allen Marken zur Filterung verwendet, in denen entsprechende Artikel verfügbar sind.<br><br>Die Zuordnung wirkt nur, wenn das Attribut nicht grundsätzlich von der Verwendung als Filter ausgeschlossen ist (Artikel verwalten -> Attribute -> Such- und Filtereinstellungen -> Attribut wird in Ergebnislisten für Filter NICHT verwendet) und die Verwendung dieser individuellen Zuordnung in den Modulgrundeinstellungen aktiviert wurde (D3 Module -> Erweiterte Suche -> Einstellungen -> Filter + Anzeige -> Attributfilter -> verwende Attributsaktivierung pro Kategorie, Hersteller und Lieferant).',
'D3_EXTSEARCH_ASSIGNVENDORS' => 'filterbare Lieferanten zuordnen',
'D3_EXTSEARCH_ASSIGNVENDORS_DESC' => 'Soll das gewählte Attribut nur an bestimmten Herstellern zur Filterung gezeigt werden, ordnen Sie diese Lieferanten hier zu. Ohne eine Zuordnung wird das Attribut an allen Lieferanten zur Filterung verwendet, in denen entsprechende Artikel verfügbar sind.<br><br>Die Zuordnung wirkt nur, wenn das Attribut nicht grundsätzlich von der Verwendung als Filter ausgeschlossen ist (Artikel verwalten -> Attribute -> Such- und Filtereinstellungen -> Attribut wird in Ergebnislisten für Filter NICHT verwendet) und die Verwendung dieser individuellen Zuordnung in den Modulgrundeinstellungen aktiviert wurde (D3 Module -> Erweiterte Suche -> Einstellungen -> Filter + Anzeige -> Attributfilter -> verwende Attributsaktivierung pro Kategorie, Hersteller und Lieferant).',
'tbclcategory_extsearch' => 'Such- und Filtereinstellungen',
'D3_EXTSEARCH_AJAX_ALLCATEGORIES' => 'Alle Kategorien',
'D3_EXTSEARCH_AJAX_SETCATEGORIES' => 'Zugeordnete Kategorien',
'D3_EXTSEARCH_AJAX_ALLMANUFACTURERS' => 'Alle Marken',
'D3_EXTSEARCH_AJAX_SETMANUFACTURERS' => 'Zugeordnete Marken',
'D3_EXTSEARCH_AJAX_ALLVENDORS' => 'Alle Lieferanten',
'D3_EXTSEARCH_AJAX_SETVENDORS' => 'Zugeordnete Lieferanten',
'GENERAL_AJAX_SORT_D3NOTUSE4FILTER' => 'nicht fĂĽr Filter verwendbar',
'GENERAL_AJAX_SORT_OXSHORTDESC' => 'Kurzbeschreibung',
'D3_EXTSEARCH_UPDATE_GENPHONETIC' => '"erweiterte Suche": Das Modulupdate fĂĽhrte Ă„nderungen in der Datenbankstruktur fĂĽr die Ă„hnlichkeitssuche aus. Aktualisieren Sie deshalb nach Abschluss dieser Installation den Suchindex im Adminbereich des Moduls.',
'GENERAL_ARTICLE_D3_PHONETIC' => 'erwSuche - phonetischer Index', // Multilang-Fields for importer
'GENERAL_ARTICLE_D3_SEARCHINDEXDATE' => 'erwSuche - Datum letzte Indizierung', // Multilang-Fields for importer
'GENERAL_ARTICLE_D3PUSH' => 'erwSuche - Artikelwichtigkeit', // Multilang-Fields for importer
'GENERAL_ARTICLE_D3CONTENTHASH' => 'extSearch - Hash der indizierten Inhalte', // Multilang-Fields for importer
'GENERAL_ARTICLE_OXVARSELECT' => 'Variantentitel',
'D3_EXTSEARCH_CLI_COMMON_RUNFROMCLI' => 'Dieses Script muss von der Befehlszeile aus ausgefĂĽhrt werden. / This script has to be run from the command line',
'D3_EXTSEARCH_CLI_COMMON_UNVALIDSHOPID' => 'ungĂĽltige Shop-ID',
'D3_EXTSEARCH_CLI_COMMON_NOGENERATORSCRIPT' => 'Keine Generierungssprache definiert, setzen Sie diese bitte in den Einstellungen des Moduls.',
'D3_EXTSEARCH_CLI_HELP' => 'Ermöglicht automatisierte Aufgaben / Wartung des Moduls "erweiterte Suche".',
'D3_EXTSEARCH_CLI_OPTION_VERSION' => 'zeigt Version',
'D3_EXTSEARCH_CLI_OPTION_QUIET' => 'verhindert die Anzeige der Ausgabe',
'D3_EXTSEARCH_CLI_OPTION_LANG' => 'optional - Sprache der ausgegebenen Meldungen, mögliche Werte sind: "%1$s"',
'D3_EXTSEARCH_CLI_OPTION_HELP' => 'Diesen Hilfetext anzeigen und den Aufruf verlassen.',
'D3_EXTSEARCH_CLI_OPTION_NOCOLORS' => 'Verwendet keine Farben in der Ausgabe. NĂĽtzlich bei der Weitergabe der Ausgabe an andere Tools oder Dateien.',
'D3_EXTSEARCH_CLI_OPTION_LOGLEVELS' => 'Kleinstes Level der anzuzeigenden Meldungen. Standard ist "info". GĂĽltige Stufen sind: "debug", "info", "notice", "success", "warning", "error", "critical", "alert", "emergency".',
'D3_EXTSEARCH_CLI_COMMAND' => 'Dieses Tool akzeptiert einen Befehl als ersten Parameter, wie unten beschrieben:',
'D3_EXTSEARCH_CLI_COMMAND_GENERATEINDEX' => 'phonetischen Suchindex aktualisieren',
'D3_EXTSEARCH_CLI_COMMAND_GENERATESEMANTIC' => 'Lexikon fĂĽr sinngleiche Suche neu indizieren',
'D3_EXTSEARCH_CLI_COMMAND_FIXARTEXTENDS' => 'Langtexttabelle bereinigen',
'D3_EXTSEARCH_CLI_ARGUMENT_SHOPID' => 'ID des ausgewählten Shops, mögliche Werte sind: "%1$s"',
'D3_EXTSEARCH_CLI_ARGUMENT_ENCLOSER' => '", "',
'D3_EXTSEARCH_CLI_GENERATOR_PROCESSING' => 'Verarbeitung gestartet ...',
'D3_EXTSEARCH_CLI_GENERATOR_PROCESSED' => '%1$s Artikelsprachen (ca. %2$s Artikel) bearbeitet - Generierung abgeschlossen!',
'D3_EXTSEARCH_CLI_GENERATOR_TERMPROCESSED' => '%1$s Wort/Wörter bearbeitet - Generierung abgeschlossen!',
'D3_EXTSEARCH_CLI_FINISHED_SUCCFESSFULLY' => 'Das Script wurde erfolgreich beendet.',
'SHOP_MODULE_GROUP_d3thememapping_global' => 'Template-Blöcke dem eigenen Theme zuordnen (globale Einstellungen für D3-Module)',
'SHOP_MODULE_GROUP_d3thememapping_module' => 'Template-Blöcke dem eigenen Theme zuordnen (Einstellung nur für dieses Modul)',
'SHOP_MODULE_d3custParentThemeMappedToWave_'.$sModId => 'Ist das hier eingetragene Theme aktiv, werden die "<b>Wave</b>"-Templateblöcke des Moduls verwendet.',
'SHOP_MODULE_d3custParentThemeMappedToApex_'.$sModId => 'Ist das hier eingetragene Theme aktiv, werden die "<b>Apex</b>"-Templateblöcke des Moduls verwendet.',
'HELP_SHOP_MODULE_d3custParentThemeMappedToWave_'.$sModId => $sD3Help_mappedTo,
'HELP_SHOP_MODULE_d3custParentThemeMappedToApex_'.$sModId => $sD3Help_mappedTo,
];
// @codeCoverageIgnoreEnd

View File

@ -0,0 +1,458 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
// @codeCoverageIgnoreStart
$sModId = 'd3_extsearch';
$sD3Help_mappedTo = '<p>Our modules are prepared for the default themes of the OXID eShop. '.
'You don\'t need to enter anything here, if your used shop theme is (or extends) a default OXID theme. '.
'Is it a completely individual Theme, please enter the parent theme id '.
'to the OXID default theme that is closest to it.</p>'.
'<p>Read further informations in our <a '.
'href="https://faq.d3data.de/allgemein/template-bloecke-dem-eigenen-theme-zuordnen/" target="FAQ">FAQ</a>.</p>';
return [
'charset' => 'UTF-8',
'D3MXEXTSEARCH' => '<i class="fa fa-fw fa-search-plus"></i> Extended Search',
'D3MXEXTSEARCH_SETTINGS' => 'Settings',
'D3MXEXTSEARCH_STATISTIC' => 'Statistic',
'D3MXEXTSEARCH_SYNEDITOR' => 'Synonym Editor',
'D3TBCLEXTSEARCH_SYNEDITOR_MAIN' => 'Main',
'D3TBCLEXTSEARCH_SYNEDITOR_MANAGE' => 'Edit synonyms',
'D3TBCLEXTSEARCH_SETTINGS_RESULTS' => 'Base Settings',
'D3TBCLEXTSEARCH_SETTINGS_NAVIGATION' => 'Filters + Display Settings',
'D3TBCLEXTSEARCH_SETTINGS_QUICK' => 'Suggest Search',
'D3TBCLEXTSEARCH_SETTINGS_BROWSER' => 'Browser Plugins',
'D3TBCLEXTSEARCH_SETTINGS_STATISTIK' => 'Statistic',
'D3_EXTSEARCH_LIST_SETTLANG' => 'settings for language',
'D3_EXTSEARCH_HELPLINK' => 'Fragen-zu-speziellen-Modulen/Erweiterte-Suche/',
'D3_EXTSEARCH_HELPLINK_CONFIG' => '',
'D3_EXTSEARCH_TRANSL' => 'Extended Search',
'D3_EXTSEARCH_CONFIGVARS_SADDTITLE' => 'module edition:',
'D3_EXTSEARCH_CONFIGVARS_BLUSEFILTERINARTICLELISTS' => 'filters in article lists available:',
'D3_EXTSEARCH_CONFIGVARS_FEATUREBIT1' => 'filters in article lists available:',
'D3_EXTSEARCH_MAIN_DEBUGACTIVE_DESC' => 'In debug mode, the used database queries are displayed in the browser console and FirePHP console for easier programming and troubleshooting (Ajax requests can only be issued in FirePHP for technical reasons.). To view the queries, please install the FirePHP add-on for your browser. Alternatively, use the GET parameter "d3forcedebug=1" on the Ajax request for forced debug output. Please deactivate the debug mode for live operation, as database caching is not used with activated debug mode.',
'D3_EXTSEARCH_MAIN_MAINSETTINGS' => 'Common Settings',
'D3_EXTSEARCH_MAIN_FIELDLIST' => 'these fields will used in similar and quicksearch<br>relevance => field name (example.: 50 => oxtitle)',
'D3_EXTSEARCH_MAIN_SORTDEBUG' => 'result field analysis',
'D3_EXTSEARCH_MAIN_SORTDEBUG_DESC' => 'Insert your search term. <br>In the table you\'ll get all relevance values according to every field, which fits to the hit. You can change all relevance values "... in ..." in the "extended search" settings. "D3PUSH" is the articles importance. The relevance for each article in the result list ("d3Priority") is calculated by this formula: <blockquote>((sum from all "... in ..." fields) x D3PUSH) + D3PUSH</blockquote>',
'D3_EXTSEARCH_MAIN_SORTDEBUG_START' => 'start search',
'D3_EXTSEARCH_MAIN_SORTDEBUG_WORD_IN_' => '"%1$s" as a complete word in the field "%2$s"',
'D3_EXTSEARCH_MAIN_SORTDEBUG_PART_IN_' => '"%1$s" as part of a word in the field "%2$s"',
'D3_EXTSEARCH_MAIN_SORTDEBUG_article_IN_category' => 'article in category',
'D3_EXTSEARCH_MAIN_SORTDEBUG_article_IN_manufacturer' => 'article in manufacturer or vendor',
'D3_EXTSEARCH_MAIN_NOFIELDSDEFINED' => '<b>There are no fields defined.</b><br>Standard: \'oxtitle\', \'oxsearchkeys\' and \'oxartnum\'',
'D3_EXTSEARCH_MAIN_FIELDLIST_DESC' => 'Here you enter the article table fields (from tables "oxarticles" or "oxartextends") in which you want to search. The field names can be found in the shop database. The default entries are oxtitle, oxsearchkeys, oxartnum. This is a regular search in the title, the search terms and the article number. Enter each field in a separate line followed by a line break. For further options of the module it may be necessary to add entries here. If you change these entries, the search index must be recreated again. <br> <br> In addition to the fields, you can also specify here how important the respective data field is for the results. Enter the relevance of the respective field before the field names with => separated. The higher the relevance, the higher an article will be shown if the search term occurs in this field (to be activated separately). If the search term is found in several fields, the relevance adds up. If no relevance is specified, the field automatically receives the value 10. Further information can be found in the manual in the chapter "Relevance and Importance".',
'SHOP_CONFIG_SEARCHFIELDS' => 'Fields to be considered in Search<br>"extended search" use own settings / edit in <input type="button" onclick="document.getElementById(\'myedit\').target = \'basefrm\'; document.getElementById(\'myedit\').fnc.value=\'\';document.getElementById(\'myedit\').cl.value=\'d3_cfg_extsearch_main\';document.getElementById(\'myedit\').submit();" value="extended search">',
'SHOP_CONFIG_SEARCHUSEAND' => 'If several search terms are entered, all search terms must appear in a search result (AND). (If the option is not active, only one search term must occur (OR).)',
'D3_EXTSEARCH_MAIN_PUTINLEAVEOUT' => 'allow included and excluded letters in search string',
'D3_EXTSEARCH_MAIN_PUTINLEAVEOUT_DESC' => 'If you set this option, the articles to be found may also have fewer (omitted) or more (inserted) letters than your search term. With difficult search terms, activation may be worthwhile. However, if you have understandable article titles, we recommend that you do not activate them for the time being. Example: The search for "lamshade" also finds "lampshade".',
'D3_EXTSEARCH_MAIN_MULIPLEWORDS' => 'use of multiple search words',
'D3_EXTSEARCH_MAIN_MULIPLEWORDS_DESC' => 'Specify how the module handles multiple search terms. This will allow you to decide whether to search with the complete, connected term. Then the search term must necessarily occur in a field. If you specify that each search term is used separately, the search terms may be scattered across the article fields. We recommend this setting as standard. Alternatively, you offer your customers the use of search syntax. This can be particularly useful for technology-oriented stores. <br> <br> The syntax has the following cases: <br> <br> <ul> <li> In quotation marks (") included: seeks or avoids the entire phrase, otherwise each word is used singly, apostrophes are currently not supported </li> <li> Minus (-): word or phrase should not appear in hits </li> <li> Suggested plus (+) (optional): word or Word phrase must be included in hits </li> <li> Unsigned plus is accepted </li> <li> Sign and enclose quotes can be combined </li> </ul> <br> Possible applications: <br> <ul> <li> one </li> <li> "one two" </li> <li> + one </li> <li> + "one two" </li> <li> -three </li> <li> - "three four" </li> </ul>',
'D3_EXTSEARCH_MAIN_MULIPLEWORDS_SINGLE' => 'every word will searched separatly',
'D3_EXTSEARCH_MAIN_MULIPLEWORDS_WHOLE' => 'will used as complete string',
'D3_EXTSEARCH_MAIN_MULIPLEWORDS_SYNTAX' => 'user controlled by search syntax',
'D3_EXTSEARCH_MAIN_SORTING' => 'Article Sorting',
'D3_EXTSEARCH_MAIN_ORDERBYPRIORITY' => 'sort hits by relevance',
'D3_EXTSEARCH_MAIN_ORDERBYPRIORITY_DESC' => 'Relevance defines how well a found article matches the search term. (Therefore, the relevance sorting is only available in the search.) In categories, this is not available.) If the search term on the article, it should of course be shown in the hits. However, the hits where the search term appears in the title are certainly more meaningful to your client than if the word you are looking for appears somewhere in the later description. When defining the search fields to use, you can specify how high the hit is scored for each search field. For more information, please refer to the module manual in the chapter "Relevance and Importance". <br> <br> Activate the option "Sort hits by relevance", if the search is allowed to change the order of articles according to this logic. The relevance sorting is automatically added to the existing sorting options. <br> <br> If the customer has not selected his own hit sorting, the search hits are then sorted according to their set relevance. You determine the relevance to the database fields defined for the search. The sum of the relevance of the fields containing the search term is then used as a sorting criterion. In connection with the importance of the articles (to be activated separately) the relevance can multiply. You can follow the sorting of your articles in the "Result field analysis".',
'D3_EXTSEARCH_MAIN_ORDERBYPUSH' => 'sort hits by importance',
'D3_EXTSEARCH_MAIN_ORDERBYPUSH_DESC' => 'Certainly you differentiate in your article assortment according to main articles, Nebenartikeln and other accessories. This rating can also be included in the search results. For example, if you enable this setting, your customers will be shown the main items, less important items will appear later in the hits. <br> <br> How important an item in the assortment is, you decide on the item itself. In the admin section of the shop, you will find the setting under "Manage articles -> Articles -> Advanced -> Importance of the article in the assortment". You can fill the setting with the values 1 (normal) to 3 (particularly important) via the field "d3push" via external imports or merchandise management connections.',
'D3_EXTSEARCH_MAIN_ORDERBYALTERNATIVE' => 'additional sorting with identical relevance sort value',
'D3_EXTSEARCH_MAIN_ORDERBYALTERNATIVE_DESC' => 'The sort order is calculated based on the settings set here for each item. If several articles have an identical sorting value, they can be sorted among themselves according to a further criterion. The name of a field of the article table is allowed here (without language addition). Use asc and desc to set whether to sort in ascending or descending order.',
'D3_EXTSEARCH_MAIN_VARIANTSETTINGS' => 'Variant Search',
'D3_EXTSEARCH_MAIN_VARIANTSEARCH' => 'shop search for variant articles too',
'D3_EXTSEARCH_MAIN_VARIANTUSAGE' => 'if an article variant is found, show ...',
'D3_EXTSEARCH_MAIN_VARIANTUSAGE_SHOWPARENT' => '... there parent article in list',
'D3_EXTSEARCH_MAIN_VARIANTUSAGE_SHOWVARIANT' => '... the variant itself in list',
'D3_EXTSEARCH_MAIN_SHOWVARIANTSWITHOUTFILTERS' => 'show variants even without filtering',
'D3_EXTSEARCH_MAIN_SHOWVARIANTSWITHOUTFILTERS_DESC'=> 'Displaying variant articles is usually only useful when filtering specifically for them. If the variant articles should also be shown without filtering, activate this option. The article lists can then become more extensive. This option affects search results and (if active) also categories.',
'D3_EXTSEARCH_MAIN_VARIANTINALIST' => 'special variant handling are also used in article lists',
'D3_EXTSEARCH_MAIN_VARIANTCHECKPARENTACTIVE' => 'check parent article active status explicitly',
'D3_EXTSEARCH_MAIN_VARIANTUSAGE_DESC' => '<p>Set here whether, in the case of a variant found, this variant itself or its parent article should be shown in the result list. When displaying the parent article instead of the variant, please note that the parent articles must also be active and selectable. An additional check for this only takes place if it has been explicitly configured.</p><p>When the parent articles are displayed, the number of matching variants is still shown at the usable filters, as these are the basis for the filters. This discrepancy can confuse the shop visitor. In this case, deactivate the display of the number of articles found for the filter.',
'D3_EXTSEARCH_MAIN_VARIANTINALIST_DESC' => 'If category, vendor and manufacturer pages are also to use these variant settings, activate this option. Variants are only shown in filtered item lists. The category assignment is obtained from the parent item. Attributes, manufacturer and vendor must be assigned directly to the variants. Attributes, manufacturers and vendors of the parent item are disregarded.',
'D3_EXTSEARCH_MAIN_VARIANTSEARCH_DESC' => 'Instead of searching for regular articles as usual, the shop also finds individual variant articles with this option. Please also enter \'oxvarselect\' in the field list and regenerate the search index.',
'D3_EXTSEARCH_MAIN_VARIANTCHECKPARENTACTIVE_DESC' => 'For performance reasons, we generally assume that active and purchasable variant articles also have an active parent article. If this can differ in your shop, set this option. Then, for each variant article, it is checked if its parent article is also available. <br> <br> Note that this option requires a lot of power. Alternatively, make sure through the database that variants of inactive parent articles are also not active.',
'D3_EXTSEARCH_MAIN_OWNFORMFIELDS' => 'check for individual filter form fields',
'D3_EXTSEARCH_MAIN_OWNFORMFIELDS_DESC' => 'This option allows you to offer the customer additional fields for restricting hits in a simple way. We dedicated this function to a separate chapter in the module manual (see "Technical Explanations").',
'D3_EXTSEARCH_MAIN_LOGSETTINGS' => 'Statistic',
'D3_EXTSEARCH_MAIN_LOGHITLESS' => 'log resultless searches in statistic',
'D3_EXTSEARCH_MAIN_LOGHITLESS_DESC' => 'If the customer starts a search query that can not provide results, the search terms are recorded for you. You will find the list under the \'Logging\' tab and can also optimize your products for these terms.',
'D3_EXTSEARCH_MAIN_LOGFORSEARCH' => 'log all search queries in statistic',
'D3_EXTSEARCH_MAIN_LOGFORSEARCH_DESC' => 'logs all searches for the in-module statistics. This setting can also be set without other shop functions being logged. If the shop-wide logging is activated, the search queries are generally written.',
'D3_EXTSEARCH_MAIN_PHONETICS' => 'Phonetic Search (search for similar sound)',
'D3_EXTSEARCH_MAIN_PHONETICS_DESC' => 'This is the fault-tolerant search that finds sound-like hits, even if they were written differently. This makes the search for typographical errors tolerant.',
'D3_EXTSEARCH_MAIN_SIMILARSEARCH' => 'if there is no search result, shop search for similar-sounding articles (e.g.: search: <i>Pflan<b>s</b>e</i>, result: <i>Pflan<b>z</b>e</i>)',
'D3_EXTSEARCH_MAIN_SIMILARSEARCH_DESC' => 'Here you activate (or deactivate) the phonetic search. For example, this will catch you from typing errors in the search query, and the customer will most likely find your desired articles. If at the same time the search for meaning (semantic) is activated, it is first tried to find matching matches. If this fails, hits are determined by the sound search.',
'D3_EXTSEARCH_MAIN_PHONETICLANG' => 'for similar search used language',
'D3_EXTSEARCH_MAIN_PHONETICLANG_DESC' => 'Since the different human languages differ in their pronunciation and in the word or letter composition, a language-dependent index generation process is necessary for an optimal search result. If you mainly use a different language in your shop than the one shown opposite, please ask us if a module for your language is also available. <br> <br> In the standard version we supply 2 options for the German language. We recommend using the option "German with Vowels", because the accuracy of the search is much higher.',
'D3_EXTSEARCH_MAIN_SIMILAREXTLIST_1' => 'shop show additional similar-sounding articles, if regular search contains max.',
'D3_EXTSEARCH_MAIN_SIMILAREXTLIST_2' => 'results',
'D3_EXTSEARCH_MAIN_SIMILAREXTLIST_DESC' => 'If the search scores only a few hits, you can also provide the customer with similar items. These similar items are shown in the result list after the actual matches. The customer will be informed with a message about the filled-in list. Please use this setting wisely, as the additional hits could confuse the customers.',
'D3_EXTSEARCH_MAIN_MINPHONLENGTH' => 'result precision on short search terms',
'D3_EXTSEARCH_MAIN_MINPHONLENGTH_LESS' => 'less precision',
'D3_EXTSEARCH_MAIN_MINPHONLENGTH_REG' => 'normal precision',
'D3_EXTSEARCH_MAIN_MINPHONLENGTH_MORE' => 'more precision',
'D3_EXTSEARCH_MAIN_MINPHONLENGTH_DESC' => 'The indexed similarity search can only work sensibly and efficiently after a certain word length. Therefore, the phonetic search has two different ways of doing things: searching through the previously generated index and the similarity defined at runtime. <br> <br> Both methods have advantages and disadvantages: <br> <ul> <li> The index-based Search is very accurate and fast. However, this requires a minimum length of relevant characters. If the search terms are shorter, the accuracy decreases rapidly and if the search terms are too short, even the entire range of shops would be displayed. </li> <li> For short search words, the similarity to the runtime is automatically calculated. Their strengths lie in the recognition of short search words. Although it is not quite as accurate as the index search. But since the words are short, this does not matter so much here. It should be noted, however, that this type of search requires a bit more processing power and is therefore slower. </li> </ul> <br> <br> When will you switch from one technique to another? If a search is started, the module checks which word makes the most appropriate technique. You can now define how quickly to switch to the index-based search by using the "Search accuracy with short search words" switch. The goal should be to switch to the index as fast as possible, but without generating too many hits. The setting possibilities extend to (phonetic relevant) word lengths between 3 and 5 characters. Just do a few experiments with the search terms that are typical for your shop and vary the settings accordingly. If you have any questions, please contact us.',
'D3_EXTSEARCH_MAIN_SEMANTICS' => 'Semantic Search (search for similar type)',
'D3_EXTSEARCH_MAIN_SEMANTICS_DESC' => 'Semantic terms are words that have a similar meaning to the search term. If you are looking for "mugs", you will also find articles that have "cup" content. <br> <br> A suitable lexicon is required for using the semantic search. You can fill this yourself according to your own requirements in the synonym editor (recommended). Information on its operation can be found in the manual. <br> <br> Alternatively, we also provide an extensive standard database. The link can be found in the installation instructions of the module.',
'D3_EXTSEARCH_MAIN_SEMANTICSEARCH' => 'shop search for articles with similar sense (e.g.: search: <i>Gew&auml;chs</i>, result: <i>Pflanze</i>)',
'D3_EXTSEARCH_MAIN_SEMANTICSEARCH_MISSING' => 'shop search for articles with similar sense (e.g.: search: <i>Gew&auml;chs</i>, result: <i>Pflanze</i>)<br><b>Semantic lexicon isn\'t installed!</b>',
'D3_EXTSEARCH_MAIN_SEMANTICSEARCH_DESC' => 'Check this box to enable a similar search in the shop. By e.g. Regional differences may cause your customers to label an item differently, but they may mean your product. If the customer now submits his request, he may be shown the terms that better describe the desired product in your shop.',
'D3_EXTSEARCH_MAIN_SEMANTICUSEPHONETIC' => 'if the search term contains spelling errors, in addition to the search for meaning, the correct spelling is tried; however, may produce strongly deviant hits; requires activated phonetic search',
'D3_EXTSEARCH_MAIN_SEMANTICUSEPHONETIC_DESC' => 'This setting also allows the same search for the phonetic search, if no similar words are found. However, since the desired meaning is not clear, under certain circumstances strongly deviating hits are shown. We recommend that you use this setting only to a limited extent. <br> To use this setting, first create the index for the same search: "D3 Modules -> Extended Search -> Settings -> Basic Settings -> Search Index -> Dictionary for the reindex the same search ".',
'D3_EXTSEARCH_MAIN_SAVE' => 'save',
'D3_EXTSEARCH_MAIN_INDEX' => 'Search Index',
'D3_EXTSEARCH_MAIN_INDEX_DESC' => 'That the similarity search can work requires the generation of a search index. For this, the defined search fields are prepared for the search with a language-dependent key. Thus, the actual search query is not significantly slower than a regular article search. (However, the search index has no effect on the execution time of other settings.) The index is automatically updated if you enter your articles in the admin area of the shop or if the import tool you are using uses the shop framework (your Oxid partner can provide information on this To give). Manage your articles by other means, regenerate the search index after each article update. The generation requires some computing power, but is usually completed in a few seconds. <br> <br> The regeneration is also necessary if changes are made to the field names to be used.',
'D3_EXTSEARCH_MAIN_INDEXARTCNT' => 'articles per work up run for index',
'D3_EXTSEARCH_MAIN_INDEXARTCNT_DESC' => 'The web server aborts scripts after a certain period of time for security reasons. In order to be able to finish the generation of the search index nevertheless, this script processes only a certain number of articles and then restarts. Define here how many articles should be processed in one go. If the generation terminates with an error, reduce the number. The lower the number, the longer the script needs.',
'D3_EXTSEARCH_MAIN_INDEXERR' => 'The required index for the fault-tolerant search is incomplete. Click here to regenerate the list:',
'D3_EXTSEARCH_MAIN_INDEXNOERR' => 'The required index for the fault-tolerant search seems to be complete. At the moment, no action is necessary if you have not changed the language or have imported articles. <br> The index must be created separately for each language of the shop.',
'D3_EXTSEARCH_MAIN_GENINDEXCMPL' => 'Generate outdated phonetic search index',
'D3_EXTSEARCH_MAIN_GENINDEXCMPL_DESC' => 'Generates the search index for all changed or added articles in the shop.',
'D3_EXTSEARCH_MAIN_GENSEMANTICINDEX' => 'Reindex lexicon for same meaning search',
'D3_EXTSEARCH_MAIN_GENSEMANTICINDEX_DESC' => 'For the connection of same meaning search and phonetic search also the lexicon needs the phonetic index. With this button you start the reindexing of the lexicon. Normally this is not necessary.',
'D3_EXTSEARCH_MAIN_SHOW_POPUP' => 'show popup while searching',
'D3_EXTSEARCH_MAIN_SHOW_POPUP_DESC' => 'To inform impatient customers during the search process, you can display an information pop-up. You can also design this according to your shop layout in terms of content and graphics.',
'D3_EXTSEARCH_MAIN_CATEGORY' => 'Search in category titles',
'D3_EXTSEARCH_MAIN_CATEGORY_SEARCH' => 'search in category titles too and show containing articles',
'D3_EXTSEARCH_MAIN_CATEGORY_SEARCH_DESC' => 'The default search finds only hits in the created articles. However, your customer may be looking for a term that lets you name a whole category. If you have set this check, the search term will also be searched in the category name.',
'D3_EXTSEARCH_MAIN_CATEGORY_ANDOR_DESC' => 'This setting is only used for searching in category names. There is a separate setting for the article search.',
'D3_EXTSEARCH_MAIN_CATEGORY_ARTHANDLING' => 'Show category yourself or their products',
'D3_EXTSEARCH_MAIN_CATEGORY_ARTINCAT' => 'Show articles from category',
'D3_EXTSEARCH_MAIN_CATEGORY_CATINLIST' => 'Show category for selection',
'D3_EXTSEARCH_MAIN_CATEGORY_PRIORITY' => 'relevance at category results',
'D3_EXTSEARCH_MAIN_CATEGORY_PRIORITY_DESC' => 'Article hits get their relevance based on the relevance numbers set on the fields. Hits found on the basis of their category affiliation can not contain their relevance in this way. Define here which place in the article list should receive these hits.',
'D3_EXTSEARCH_MAIN_MANUFACTURER' => 'Search in brand and vendor titles',
'D3_EXTSEARCH_MAIN_MANUFACTURER_SEARCH' => 'search in brand and vendor titles too and show assigned articles',
'D3_EXTSEARCH_MAIN_MANUFACTURER_SEARCH_DESC' => 'The default search finds only hits in the created articles. However, your customer may be looking for a term by which you have named a brand or vendor. If you have set this checkbox, the search terms are searched in the brand or vendor name.',
'D3_EXTSEARCH_MAIN_MANUFACTURER_ANDOR_DESC' => 'This setting is only used for the search in brand and vendor names. There is a separate setting for the article search.',
'D3_EXTSEARCH_MAIN_MANUFACTURER_PRIORITY' => 'relevance at brand / vendor results',
'D3_EXTSEARCH_MAIN_MANUFACTURER_PRIORITY_DESC' => 'Article hits get their relevance based on the relevance numbers set on the fields. Hits found on the basis of their brand or vendor affiliation can not contain their relevance in this way. Define here which place in the article list should receive these hits.',
'D3_EXTSEARCH_MAIN_ADMINPANEL' => 'Admin Panel',
'D3_EXTSEARCH_MAIN_ADMINSHOWVARIANTS' => 'in searchresults show variants in article list too',
'D3_EXTSEARCH_MAIN_ADMINSHOWVARIANTS_DESC' => 'If you would like to edit your articles in the admin area ("Manage articles -> Articles"), you can search for existing articles there. However, the default search does not take into account variant articles. If you also want to make them searchable, activate this option.',
'D3_EXTSEARCH_MAIN_USEARTNUMSEARCH' => 'perform a specialized artnum search',
'D3_EXTSEARCH_MAIN_USEARTNUMSEARCH_DESC' => 'If this option is checked, an item number matching the search term is explicitly searched before the actual search run. Found articles are displayed and the search ends. This can lead to faster search results if used frequently.',
'D3_EXTSEARCH_MAIN_DONTUSEOWNDBVIEWS' => 'Database queries <b> do not </b> use the module-specific view tables',
'D3_EXTSEARCH_MAIN_DONTUSEOWNDBVIEWS_DESC' => 'For performance reasons, the search does not use the system-specific view tables, but comes with optimized versions of it. Depending on the size of the database, their use can speed the speed of database queries up to a factor of 100. If you do <b>not</b> want to use the specialized view tables, check this box. The queries are then routed through the on-look view tables. <br> Note that disabling this option requires the view tables to be updated again.',
'D3_EXTSEARCH_MAIN_GENERATOR_INCONSISTENTTABLE' => 'The database article table is inconsistent to longtext table. Please fix it before executing this generator.<br><br>For further informations, check out our FAQ at <a href="%1$s" target="_new">%1$s</a>.',
'D3_EXTSEARCH_MAIN_GENERATOR_INCONSISTENTTABLE_NOLINK' => 'The database article table is inconsistent to longtext table. Please fix it before executing this generator.',
'D3_EXTSEARCH_MAIN_GENERATOR_FINISHED' => 'Finished.',
'D3_EXTSEARCH_MAIN_GENERATOR_NOTE' => 'Notice',
'D3_EXTSEARCH_MAIN_GENERATOR_PROCESSED' => '%1$s article language(s) (ca. %2$s article(s)) processed<br>Finished!',
'D3_EXTSEARCH_MAIN_GENERATOR_TERMPROCESSED' => '%1$s term(s) processed<br>Finished!',
'D3_EXTSEARCH_MAIN_GENERATOR_PROCESSING' => 'Processing %1$s&#37;',
'D3_EXTSEARCH_MAIN_GENERATOR_PROCESSING1' => 'Processing: %1$s / %2$s article language(s) (ca. %3$s article(s))',
'D3_EXTSEARCH_MAIN_GENERATOR_PROCESSING3' => 'Processing: %1$s / %2$s term(s)',
'D3_EXTSEARCH_MAIN_GENERATOR_PROCESSING2' => '%1$s&#37; finished',
'D3_EXTSEARCH_MAIN_GENERATOR_WAIT' => 'Please wait...',
'D3_EXTSEARCH_MAIN_GENERATOR_CLOSEWND' => 'close window',
'D3_EXTSEARCH_MAIN_GENERATOR_EXCEPTION' => 'Generation error, the index can unfortunately not be created.',
'D3_EXTSEARCH_MAIN_COLLATIONERROR' => 'The following fields use different collations and should not be used for the search: %1$s.',
'D3_EXTSEARCH_MAIN_NOTEXISTINGFIELDS' => 'The following fields do not exist and cannot be used for the search: %1$s.',
'D3_EXTSEARCH_NAVI_MAINSETTINGS' => 'Common Settings',
'D3_EXTSEARCH_NAVI_DISPTYPE' => 'Type of filter display',
'D3_EXTSEARCH_NAVI_DISPTYPE_LINKLIST' => 'as link list',
'D3_EXTSEARCH_NAVI_DISPTYPE_DROPDOWN' => 'as dropdown list',
'D3_EXTSEARCH_NAVI_DISPTYPE_DESC' => 'Here you set the display form of the category, supplier and brand lists. The drop-down lists save space in the display, but can be confusing for many entries. Alternatively, link lists are recommended, which can be restricted in their length. <br> Both forms of display can be edited in the template.',
'D3_EXTSEARCH_NAVI_EMPTYSEARCH' => 'allow search without a term',
'D3_EXTSEARCH_NAVI_EMPTYSEARCH_DESC' => 'It may be useful to allow searches without a search term. It may be that the resulting hits are filtered by an additional setting or you want to build an extensive search form, which may not contain a freely definable search term.',
'D3_EXTSEARCH_NAVI_CATFILTER' => 'Category Filter',
'D3_EXTSEARCH_NAVI_CATLIST' => 'show category list',
'D3_EXTSEARCH_NAVI_CATLIST_DESC' => 'Check the box to show your customer a selection of the affected categories for a comprehensive hit list. This allows him to narrow down and improve his search results. The category name and the number of articles in the hit list are displayed.',
'D3_EXTSEARCH_NAVI_CATLIST_SORT' => 'sort by',
'D3_EXTSEARCH_NAVI_CATLIST_SORT_COUNT' => 'count of related articles',
'D3_EXTSEARCH_NAVI_CATLIST_SORT_DATA' => 'adjustable sort',
'D3_EXTSEARCH_NAVI_CATLIST_SORT_DESC' => 'Define the criterion according to which the category list should be sorted. However, this has no influence on the presentation.',
'D3_EXTSEARCH_NAVI_CATLIST_MORE_DESC' => 'Further settings for category filters can be found directly at the respective categories in the tab for the search settings.',
'D3_EXTSEARCH_NAVI_FILTER_DISPLAYTYPE' => 'displayed selection',
'D3_EXTSEARCH_NAVI_FILTER_DISPLAYTYPE_COMBINED' => 'switchable single and multi selection',
'D3_EXTSEARCH_NAVI_FILTER_DISPLAYTYPE_SINGLE' => 'single selection only',
'D3_EXTSEARCH_NAVI_FILTER_DISPLAYTYPE_MULTI' => 'multi selection only',
'D3_EXTSEARCH_NAVI_FILTER_DISPLAYTYPE_DESC' => 'Set how the filters are to be shown to the shopper.<br><br>Single selection displays a DropDown, which submits the single entry immediately after selection. Another entry from this filter is not selectable.<br><br>Multi selection displays all entries as checkboxes. The customer can select all desired entries and submit them off altogether.',
'D3_EXTSEARCH_NAVI_FILTER_MORE_DESC' => 'Further settings for attribute filters can be found directly at the respective attributes in the tab for the search settings.',
'D3_EXTSEARCH_NAVI_CATLISTMAINCATEGORIESONLY' => 'only show main categories of the articles',
'D3_EXTSEARCH_NAVI_CATLISTMAINCATEGORIESONLY_DESC'=> 'The option prevents listing additional assigned categories as filters. Only the main categories of the found items are shown.',
'D3_EXTSEARCH_NAVI_VENDORFILTER' => 'Vendor Filter',
'D3_EXTSEARCH_NAVI_VENDORLIST' => 'show vendor list',
'D3_EXTSEARCH_NAVI_VENDORLIST_DESC' => 'Just as for the categories, there is also the option of filtering the hit list once again for the vendors. You switch this on here. This option is only available if you have generally activated the vendors in the shop and also allow a search for it. (\'Load and display vendor list\')',
'D3_EXTSEARCH_NAVI_VENDORLIST_SORT' => 'sort by',
'D3_EXTSEARCH_NAVI_VENDORLIST_SORT_COUNT' => 'count of related articles',
'D3_EXTSEARCH_NAVI_VENDORLIST_SORT_ALPHA' => 'alphabetical',
'D3_EXTSEARCH_NAVI_VENDORLIST_SORT_DESC' => 'Determine the display order in which the vendors should be listed.',
'D3_EXTSEARCH_NAVI_MANUFACTURERFILTER' => 'Brand Filter',
'D3_EXTSEARCH_NAVI_MANUFACTURERLIST' => 'show brand list',
'D3_EXTSEARCH_NAVI_MANUFACTURERLIST_DESC' => 'Just as for the categories, there is also the option of filtering the hit list again by manufacturer. You switch this on here. This option is only available if you have generally activated the manufacturers in the shop and also allow a search for them. (\'Load and display manufacturer list\')',
'D3_EXTSEARCH_NAVI_MANUFACTURERLIST_SORT' => 'sort by',
'D3_EXTSEARCH_NAVI_MANUFACTURERLIST_SORT_COUNT' => 'count of related articles',
'D3_EXTSEARCH_NAVI_MANUFACTURERLIST_SORT_ALPHA' => 'alphabetical',
'D3_EXTSEARCH_NAVI_MANUFACTURERLIST_SORT_DESC' => 'Determine the display order in which the manufacturers should be listed.',
'D3_EXTSEARCH_NAVI_REDIRECTS' => 'Redirects',
'D3_EXTSEARCH_NAVI_UNIQUEHIT' => 'at 1 article hit, shop goes directly to the detail page of the article',
'D3_EXTSEARCH_NAVI_UNIQUEHIT_DESC' => 'If your customer has searched so precisely that he has the desired information as the only one in the hit list, you can spare him the detour via the hit list and immediately supply him with the detail page of the article found.',
'D3_EXTSEARCH_NAVI_UNIQUECONTENTHIT' => 'at 1 CMS / text hit, shop changes directly to the CMS page',
'D3_EXTSEARCH_NAVI_UNIQUECONTENTHIT_DESC' => 'If the search result contains no articles, but a single CMS text, it will be redirected directly to the appropriate CMS page. The user leaves the search function of the shop, his search settings are then no longer available.',
'D3_EXTSEARCH_NAVI_UNIQUEVENDORHIT' => 'at 1 vendor hit, shop goes directly to the vendor page of the shop',
'D3_EXTSEARCH_NAVI_UNIQUEVENDORHIT_DESC' => 'If the search result does not contain any articles, but only one vendor, it will be forwarded directly to the appropriate vendor page of your shop. This option requires "Search by manufacturer and vendor name". The user leaves the search function of the shop, his search settings are then no longer available.',
'D3_EXTSEARCH_NAVI_UNIQUEMANUFACTURERHIT' => 'at 1 manufacturer, shop goes directly to the manufacturer page of the shop',
'D3_EXTSEARCH_NAVI_UNIQUEMANUFACTURERHIT_DESC' => 'If the search result contains no articles, but a single manufacturer, it will be forwarded directly to the appropriate manufacturer page of your shop. This option requires "Search by manufacturer and vendor name". The user leaves the search function of the shop, his search settings are then no longer available.',
'D3_EXTSEARCH_NAVI_CONTENTS' => 'Information pages / CMS Texts',
'D3_EXTSEARCH_NAVI_CONTENTLIST' => 'search in CMS pages',
'D3_EXTSEARCH_NAVI_CONTENTLIST_DESC' => 'Activate this option if you also want to make your information searchable for your customers. Please note that you have to activate every single CMS text for the search. This avoids that e.g. Info texts intended for e-mails are to be considered by the search. Activate directly on the text: <br> <br> "Customer Information -> CMS Pages -> Main -> can be searched"',
'D3_EXTSEARCH_NAVI_ATTRIBUTEFILTER' => 'Attribute Filter',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST' => 'show attribute list',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_DESC' => 'Set this option, if attributes can used for filtering. <br>Every attribute can excluded from usage on its setting page ("Administer Products > Attributes").',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_ASSIGNMENT' => 'use attribute activation per category, vendor, manufacturer',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_ASSIGNMENT_DESC' => 'If not all available attributes are to be offered for filtering in these elements, you can <ul> <li> generally exclude each attribute from the filtering or </li> <li> alternatively also define which attribute may be used in which element </li> </ul> If you would like to use the individual assignment, please activate this option. For performance reasons, this is not activated per default. <br> <br> Please set the assignments to the respective category, vendor, manufacturer or corresponding to the respective attribute.',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_ASSIGNMENT_NA' => 'Assignment Usage are not enabled.',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_ASSIGNMENT_NA_DESC' => 'The use of the assignments must be activated for performance reasons in the settings of the module (D3 Modules -> Extended Search -> Settings -> Filter + Display -> Attribute Filter -> Use attribute activation per category). Until then you can set the assignment. However, these are only used after activation.',
'D3_EXTSEARCH_NAVI_ATTRIBUTES_COMBINE' => 'multiple attribute selection will combined via "OR"',
'D3_EXTSEARCH_NAVI_ATTRIBUTES_COMBINE_DESC' => 'Activate this option if, for example, you also want to show articles that have only one of the properties when the selected color and material have been selected. Without this option, only items that have both properties at the same time will be shown.',
'D3_EXTSEARCH_NAVI_ATTRIBUTES_SORT' => 'attributes sort by',
'D3_EXTSEARCH_NAVI_ATTRIBUTES_SORT_POS' => 'adjustable attribute position',
'D3_EXTSEARCH_NAVI_ATTRIBUTES_SORT_TITLE' => 'attribute title',
'D3_EXTSEARCH_NAVI_ATTRIBUTES_SORT_DESC' => 'Here you define the order of the displayed attributes.',
'D3_EXTSEARCH_NAVI_ATTRIBUTEVALUES_COMBINE' => 'multiple attribute value selections ("multi selection") will combined via "AND"',
'D3_EXTSEARCH_NAVI_ATTRIBUTEVALUES_COMBINE_DESC' => 'Activate this option, for example, if the selected color "red" and "green" only show items that have both colors at the same time. Without this option, articles with only one of the two properties will also be shown.',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_SORT' => 'attribute values sort by',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_SORT_COUNT' => 'count of related articles',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_SORT_POS' => 'adjustable attribute list position',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_SORT_TITLE' => 'attribute value title',
'D3_EXTSEARCH_NAVI_ATTRIBUTELIST_SORT_DESC' => 'Here you define the order of the displayed attribute values. <br> <br> The attribute list position can be stored in the database. Unfortunately, the OXID shop does not offer a standard way to change these values in the backend.',
'D3_EXTSEARCH_NAVI_NOATTRIBUTEARTS' => 'allow filter for articles, wich aren\'t assigned to this attribute',
'D3_EXTSEARCH_NAVI_NOATTRIBUTEARTS_DESC' => 'With this option, the attribute filters offer the option of filtering for items that are e.g. expressly assigned to no color or material.',
'D3_EXTSEARCH_NAVI_SHOWNOTSELECTABLEATTRIBUTES' => 'don\'t hide not (safely) selectable attribute values',
'D3_EXTSEARCH_NAVI_SHOWNOTSELECTABLEATTRIBUTES_DESC' => 'When filtering articles via attributes, other attributes that cannot be selected with certainty are normally hidden. If the shop visitor wishes to add additional attribute values to his hit list, these can be displayed. However, invalid attribute combinations may then be selected that do not result in a hit.<br>Note that an additional data query is executed to determine these attributes. Depending on the article attribute structure, this may require additional loading time. The display of available items count should then be deactivated, as the values are still correct but then no longer plausible.',
'D3_EXTSEARCH_NAVI_CONTENTSEARCHINLONGTEXT' => 'search in CMS longtexts too',
'D3_EXTSEARCH_NAVI_CONTENTLONG_DESC' => 'If you also want to search the content of the title of your text, activate these options. Note that this requires more power.',
'D3_EXTSEARCH_NAVI_SMALLLISTITEMS' => 'Limit category, vendor, manufacturer and text lists <br> (customer can show all results on request, only works with "link lists")',
'D3_EXTSEARCH_NAVI_SMALLLISTITEMS_2' => ' entries',
'D3_EXTSEARCH_NAVI_SMALLLISTITEMS_DESC' => 'For many search hits, the list of categories, manufacturers, vendors and texts can be very long. The article hits may slip out of the display area. Limit the number of categories and manufacturers displayed to keep these lists short. If these lists are then actually shortened, your customer will have a button available to display these lists completely on request.',
'D3_EXTSEARCH_NAVI_ALISTFILTER' => 'show filters in article lists too (e.g. category, brand, vendor)',
'D3_EXTSEARCH_NAVI_ALISTFILTER_DESC' => 'Article lists can also be restricted with filters. Filtering is possible in category views, manufacturer and vendor lists. Here you have category, manufacturer, supplier, attribute and price filters available. Options are the settings for the search. <br> If this entry is not selectable, this option is probably not included in your module license. Have your license extended for this.',
'D3_EXTSEARCH_NAVI_PRICELIST' => 'show price steps',
'D3_EXTSEARCH_NAVI_PRICEFILTER' => 'Price Filter',
'D3_EXTSEARCH_NAVI_PRICELIST_DESC' => 'All found articles are divided into price categories and offered as further filter criteria. Thus, the customer can choose a certain price range for his desired items. Discounts are not included in the category prices. Found articles are less expensive than the search request.',
'D3_EXTSEARCH_NAVI_PRICELIST_ITEMS' => 'maximum count of price steps',
'D3_EXTSEARCH_NAVI_PRICELIST_ITEMS_DESC' => 'So many price ranges are displayed at the maximum. Normally, however, this can be less, since empty price ranges (ie without contained articles) are filtered out. (only effective when displayed as dropdown list)',
'D3_EXTSEARCH_NAVI_PRICELIST_ROUNDED' => 'price limits will rounded',
'D3_EXTSEARCH_NAVI_PRICELIST_ROUNDED_DESC' => 'The smallest price range starts at the lowest possible price, the largest price range extends to the highest price. The boundaries in between are calculated. However, these can sometimes be at crooked cents. With the option, the prices of the margins are rounded, but the margins are less meaningful. (only effective when displayed as dropdown list)',
'D3_EXTSEARCH_NAVI_PRICELIST_DISPLAY' => 'price steps display type',
'D3_EXTSEARCH_NAVI_PRICELIST_DISPLAY_DESC' => 'In addition to the usual dropdown or link lists, you can also use sliders for the price ranges. This makes the selection more intuitive for your customers.',
'D3_EXTSEARCH_NAVI_PRICELIST_DISPLAY_LISTTYPE' => 'as dropdown',
'D3_EXTSEARCH_NAVI_PRICELIST_DISPLAY_SLIDER' => 'as slider',
'D3_EXTSEARCH_NAVI_HIGHLIGHT' => 'highlight found contents in search results',
'D3_EXTSEARCH_NAVI_HIGHLIGHT_DESC' => 'Sometimes the term you are looking for appears in the middle of descriptions. Use this option to visually highlight the term. <br> <br> To do so, set what the highlighting should look like in the template \'d3_ext_search_highlight.tpl\'. In \'inc/product.tpl\', replace all variables that should contain accents with the Smarty call \[\{d3_extsearch_highlight text=$variable name\}\], replacing $ variable-name with the actual text variable.',
'D3_EXTSEARCH_NAVI_DONTSHOWFILTERARTICLECOUNT' => 'Number of items found for the filter is <b>not</b> displayed',
'D3_EXTSEARCH_NAVI_DONTSHOWFILTERARTICLECOUNT_DESC'=> 'The number of matching items is shown on the offered item filters. If the display is not wanted, it can be deactivated here.',
'D3_EXTSEARCH_NAVI_INDEXFILTER' => 'Index Letters',
'D3_EXTSEARCH_NAVI_SHOWINDEX' => 'show index letters',
'D3_EXTSEARCH_NAVI_SHOWINDEX_DESC' => 'This index is a small tab above the hit list, which allows your customers to select the articles by their first letter. The display of the letter index can be edited via CSS and the enclosed templates.',
'D3_EXTSEARCH_NAVI_FILTERFIELDNAME' => 'used field name for index letter',
'D3_EXTSEARCH_NAVI_FILTERFIELDNAME_DESC' => 'Using this field name, the index letter is determined and the articles are filtered by selecting a letter. All fields from the table oxarticles (without language addition) are possible here.',
'D3_EXTSEARCH_NAVI_OWNFORMFIELDS' => 'individual filters',
'D3_EXTSEARCH_NAVI_SAVE' => 'save',
'D3_EXTSEARCH_QUICK' => 'suggest results',
'D3_EXTSEARCH_QUICK_ACTIVE' => 'when entering the search term suggestions are delivered',
'D3_EXTSEARCH_QUICK_ACTIVE_DESC' => '<img src="../modules/d3/extsearch/out/admin/img/d3_extsearch_quicksearch.jpg"><br>Give your customer the opportunity to find items even faster. The quick search already shows the first hits in a separate frame while entering the search term. <br> In mobile views, the quick hit list is not shown for reasons of usability. <br> <br> The results window of the quick search can be customized via CSS and template adjustments be designed.',
'D3_EXTSEARCH_QUICK_FULLOBJECTS' => 'Suggest search loads complete objects, instead of performance-optimized allocation',
'D3_EXTSEARCH_QUICK_FULLOBJECTS_DESC' => 'For the usual representation of the suggest search, a performance-optimized assignment of the result data is sufficient. For the display of certain information (e.g., calculated prices, etc.), it is necessary to load the complete objects. However, this reduces the charging speed.',
'D3_EXTSEARCH_QUICK_COUNT' => 'maximum number of items to be loaded in the suggest search',
'D3_EXTSEARCH_QUICK_COUNT_DESC' => 'For performance reasons, the suggest search hits are only shown from a maximum number. If more hits are found, the article list does not blend in, instead a hint is shown. Increase the value if you do not get suggest hits for common search terms. But please check the load of your server / account afterwards. The default value is 200.',
'D3_EXTSEARCH_QUICK_LOADCATEGORIES' => 'In addition, search for appropriately named categories',
'D3_EXTSEARCH_QUICK_LOADCATEGORIES_DESC' => 'In addition to articles, categories are also searched in the suggest search. Please note that this option consumes additional resources, which slow down the suggest search.',
'D3_EXTSEARCH_QUICK_LOADMANUFACTURERS' => 'In addition, also search for appropriately named manufacturers',
'D3_EXTSEARCH_QUICK_LOADMANUFACTURERS_DESC' => 'In addition to articles, the suggest Search also searches for manufacturers. Please note that this option consumes additional resources, which slow down the suggest search.',
'D3_EXTSEARCH_QUICK_LOADVENDORS' => 'In addition, also search for appropriately named vendors',
'D3_EXTSEARCH_QUICK_LOADVENDORS_DESC' => 'In addition to articles, vendors are also searched in the suggest search. Please note that this option consumes additional resources, which slow down the suggest search.',
'D3_EXTSEARCH_QUICK_LOADCONTENT' => 'In addition, also search for appropriately named texts',
'D3_EXTSEARCH_QUICK_LOADCONTENT_DESC' => 'Besides articles, texts are also searched in the suggest search. Please note that this option consumes additional resources, which slow down the suggest search. <br> <br> To use this option, it is necessary that the text search is also activated for the regular hit list ("Basic settings" tab).',
'D3_EXTSEARCH_QUICK_CMPLOBJ' => 'before Oxid 4.3.0: load entire article object, otherwise only ID, title and icon. <br> Activate only when needed, consumes more resources. ',
'D3_EXTSEARCH_QUICK_CMPLOBJ_DESC' => 'The presentation of the suggest matches can be adjusted graphically by you in a template to your shop. You may need additional data for your desired display except the article name and link to the article. Thus, for example, also thumbnails, the price or a shopping cart button. For this you need information that is not available in the standard version. Set this checkbox to make all article data available. <br> <br> From Shop version 4.3.0 it is absolutely necessary to load the complete article object. This setting is then ignored.',
'D3_EXTSEARCH_QUICK_LOADVARIANTS' => 'Load variant articles and show them in the suggest search <br> Enter additionally \'oxvarselect\' in the search fields.',
'D3_EXTSEARCH_QUICK_LOADVARIANTS_DESC' => 'Normally the shop search does not search for product variants. However, if you have many variant articles in your shop, it may make sense to unlock the search.',
'D3_EXTSEARCH_QUICK_SAVE' => 'save',
'D3_EXTSEARCH_QUICK_TPLNOTICE' => 'Note: To graphically customize the suggest result window, expand the template blocks in \'d3_ext_search_suggestsearch.tpl\'.',
'D3_EXTSEARCH_QUICK_IAS' => 'interactive search (selection search)',
'D3_EXTSEARCH_QUICK_SHOWIAS' => 'show interactive search (if text part is selected)',
'D3_EXTSEARCH_QUICK_SHOWIAS_DESC' => 'If you mark a word in the shop, a small form will be displayed near you, with the help of which you can immediately search for the highlighted word. If you click elsewhere in the shop, the window disappears.',
'D3_EXTSEARCH_STAT_TYPE' => 'evaluation:',
'D3_EXTSEARCH_STAT_NOHITS' => 'no evaluations available',
'D3_EXTSEARCH_STAT_TYPEHITLESS' => 'Search queries without hits',
'D3_EXTSEARCH_STAT_TYPEMOSTHITS' => 'Search queries with the most hits',
'D3_EXTSEARCH_STAT_TYPEMOSTSEARCHES' => 'most common search terms',
'D3_EXTSEARCH_STAT_LANG' => 'language:',
'D3_EXTSEARCH_STAT_TIME' => 'period:',
'D3_EXTSEARCH_STAT_GENERATESTAT' => 'Create evaluation',
'D3_EXTSEARCH_STAT_SEARCHWORD' => 'search term',
'D3_EXTSEARCH_STAT_HITS' => 'hits',
'D3_EXTSEARCH_STAT_SEARCHES' => 'requests',
'D3_EXTSEARCH_STAT_TYPES_CATEGORY' => 'category',
'D3_EXTSEARCH_STAT_TYPES_PRICE' => 'price',
'D3_EXTSEARCH_STAT_TYPES_VENDOR' => 'vendor',
'D3_EXTSEARCH_STAT_TYPES_MANUFACTURER' => 'brand',
'D3_EXTSEARCH_STAT_TYPES_OWNLIKE' => 'own search field (LIKE)',
'D3_EXTSEARCH_STAT_TYPES_OWNIS' => 'own search field (IS)',
'D3_EXTSEARCH_STAT_TYPES_OWNBITSET' => 'own search field (BITSET)',
'D3_EXTSEARCH_STAT_TYPES_OWNVALUE' => '%s => "%s"',
'D3_EXTSEARCH_STAT_TYPES_ATTRIBUTE' => 'attributes',
'D3_EXTSEARCH_STAT_TYPES_INDEXLETTER' => 'index letter',
'D3_EXTSEARCH_STAT_TYPES_UNKNOWN' => 'unknown filter',
'D3_EXTSEARCH_STAT_STATDESC_HITLESS' => 'hitless searches in %s to "%s" ',
'D3_EXTSEARCH_STAT_STATDESC_MOSTSEARCHES' => 'searches in %s to "%s" ',
'D3_EXTSEARCH_STAT_NOITEMS' => 'there are no items for your search',
'D3_EXTSEARCH_STAT_NOITEMS_DESC' => 'If you have expected data here, please check whether statistics collection is activated appropriately in the module settings.',
'D3_EXTSEARCH_STAT_SELECTFILTER' => 'Set the desired filter and send your selection to get results.',
'D3_EXTSEARCH_PLUGIN_SETTINGS' => 'settings',
'D3_EXTSEARCH_PLUGIN_SEARCHACTIVE' => 'offer the user in the browser to install the search plugin',
'D3_EXTSEARCH_PLUGIN_SEARCHACTIVE_DESC' => 'In current browsers you will find in the upper right corner a possibility to start the most important search engines from anywhere on the Internet. Offer your customers to add your shop to this list too. So it is enough to select your shop in the drop-down box and enter the search term. Immediately your shop will be shown with the search hits. Your shop title is used as description text, you can define an icon below.',
'D3_EXTSEARCH_PLUGIN_INSTALLLINK' => 'show an installation link in the shop search',
'D3_EXTSEARCH_PLUGIN_INSTALLLINK_DESC' => 'If your customer can add your shop to the search engine list, this is indicated in the browser by a colored border. However, this is not very noticeable, many users missed this out. It\'s better to add an additional link in the search results to indicate this feature.',
'D3_EXTSEARCH_PLUGIN_SEARCHICON' => 'Icon for browser plugin',
'D3_EXTSEARCH_PLUGIN_CHOOSEICON' => 'Please choose an icon.',
'D3_EXTSEARCH_PLUGIN_SEARCHICON_DESC' => 'Define the icon which should be displayed in the browser plugin. The icon must have a size of 16 x 16 pixels and be available in PNG or JPG format.',
'D3_EXTSEARCH_PLUGIN_SAVE' => 'save',
'D3_EXTSEARCH_PLUGIN_GENERATE' => 'generation',
'D3_EXTSEARCH_PLUGIN_GENERATE_DESC' => 'If you have changed your shop title, set a new icon or even moved your shop to a new address, it is necessary to update the search plugin. Please also advise your customers to update the plugin. It does not renew itself automatically.',
'D3_EXTSEARCH_PLUGIN_STARTGENERATING' => 'start Creation',
'D3_EXTSEARCH_PLUGIN_GENERATEFILE' => 'Create installation file:',
'D3_EXTSEARCH_PLUGIN_GENERATENOTICE' => 'With the creation of the installation file you have completed all necessary steps. If your customer starts the integration, this file is automatically read from your server.',
'D3_EXTSEARCH_PLUGIN_CREATE_SUCC' => 'Plugin file was generated successfully.',
'D3_EXTSEARCH_PLUGIN_CREATE_NSUCC' => 'Plugin file could not be created.',
'D3_EXTSEARCH REPORT_MOSTSEARCHES' => 'Search terms (only available in search module)',
'D3_EXTSEARCH_STATISTIC_MOSTSEARCHES' => 'most common search terms',
'D3_EXTSEARCH_STATISTIC_MOST_DESC' => 'So often the chosen term was searched',
'D3_EXTSEARCH_STATISTIC_FURTHERFILTERS' => '(limited by further filters)',
'D3_EXTSEARCH_CONTENT_SEARCHABLE' => 'CMS is searchable',
'D3_EXTSEARCH_PUSH' => 'importance of these article in the whole assortment',
'D3_EXTSEARCH_PUSH_1' => 'normal',
'D3_EXTSEARCH_PUSH_2' => 'important',
'D3_EXTSEARCH_PUSH_3' => 'very important',
'D3_EXTSEARCH_PUSH_DESC' => 'DÂł Modul "extended Suche": The importance defines the first order of the articles in the search (when using the "extended search"). In combination with field relevance, importance functions as a factor. For example, particularly important articles have the 3 times relevance of normally weighted articles. Note this also when assigning the field relevance.',
'D3_EXTSEARCH_ATTRIBUTE_NOTUSE4FILTER' => 'DO NOT use attribute for filter',
'D3_EXTSEARCH_ATTRIBUTE_NOTUSE4FILTER_DESC' => 'Certain attributes can be excluded from the filter list if, for example, they are only used for article management.',
'D3_EXTSEARCH_ATTRIBUTE_HIDEONEITEMFILTER' => 'Hide filter with less than 1 entry',
'D3_EXTSEARCH_ATTRIBUTE_HIDEONEITEMFILTER_DESC' => 'If the filter for this attribute only has 1 entry, it is not displayed in order to keep the filter list clear.',
'D3_EXTSEARCH_ATTRIBUTE_USECORRESPONDINGVALUES' => 'adds corresponding attribute values',
'D3_EXTSEARCH_ATTRIBUTE_USECORRESPONDINGVALUES_DESC' => '<p>If synonyms are set for the selected attribute value in the synonym editor, they are added to the selection without the customer having to select them explicitly.</p><p>This is useful, for example, for identical or very similar values (e.g. clothing sizes in the EU and US formats).</p>',
'D3_EXTSEARCH_CATEGORY_NOTUSE4FILTER' => 'DO NOT use category for filters and category results',
'D3_EXTSEARCH_SYNED_NOLEXICON' => 'The semantic lexicon isn\'t installed! Please check manual for further informations.',
'D3_EXTSEARCH_SYNED_WORD' => 'word',
'D3_EXTSEARCH_SYNED_WORD_DESC' => 'Search for a specific term, enter it here and submit.',
'D3_EXTSEARCH_SYNED_ALTWORD' => 'same meaning words',
'D3_EXTSEARCH_SYNED_SYNSETID' => 'Synonym ID',
'D3_EXTSEARCH_SYNED_SYNSETID_DESC' => 'Search for a specific synonym ID, enter it here and submit.',
'D3_EXTSEARCH_SYNED_SAVENEWSYN' => 'save new synonym',
'D3_EXTSEARCH_SYNED_SAVENEWSYN_DESC' => 'Define another term for the chosen meaning here.',
'D3_EXTSEARCH_SYNED_DELETESYN' => 'Should the synonym really be deleted?',
'D3_EXTSEARCH_SYNED_MAIN_NEWWORD' => 'New term / phrase',
'D3_EXTSEARCH_SYNED_MAIN_WORD' => 'term / phrase:',
'D3_EXTSEARCH_SYNED_MAIN_WORD_DESC' => 'If you would like to create suitable terms for a new word meaning, note the first term here. Insert the term here only if the word meaning does not yet exist in the lexicon. Otherwise, enter the new term in the appropriate meaning in the "Edit synonyms" tab.',
'D3_EXTSEARCH_SYNED_MAIN_COMMENT' => 'comment:',
'D3_EXTSEARCH_SYNED_MAIN_COMMENT_DESC' => 'The comment serves exclusively to make further internal explanations to the term. It is not used for the search.',
'D3_EXTSEARCH_SYNED_MAIN_SYNSETID' => 'Synonym ID:',
'D3_EXTSEARCH_SYNED_MAIN_SYNSETID_DESC' => 'In a uniform synonym ID, all terms with the same meaning are stored. New entries will automatically be assigned a new ID. If a term has been mistakenly assigned the wrong meaning, choose the synonym ID from the appropriate meaning and change it to your term.',
'D3_EXTSEARCH_SYNED_MAIN_ISVISIBLE' => 'active:',
'D3_EXTSEARCH_SYNED_MAIN_ISVISIBLE_DESC' => 'If you do not want to use the synonym group (at present), remove the checkmark.',
'D3_EXTSEARCH_SYNED_MAIN_LANGUAGE' => 'language:',
'D3_EXTSEARCH_SYNED_MAIN_LANGUAGE_DESC' => 'Determine from this, from which language the selected term originates and in which this is to be used. Only the languages activated in the shop are available.',
'D3_EXTSEARCH_SYNED_MAIN_LANGUAGE_DISABLED' => '(disabled)',
'D3_EXTSEARCH_SYNED_MAIN_SYNONYMUSE' => 'Synonym is used',
'D3_EXTSEARCH_SYNED_MAIN_SYNONYMUSEFORTERMS' => 'to supplement the search terms',
'D3_EXTSEARCH_SYNED_MAIN_SYNONYMUSEFORTERMS_DESC' => 'If the synonym use is activated in the module basic settings, this synonym is used when the shop visitor searches for one of the other assigned terms. For example, regional terms can be made searchable without having to maintain them on all articles.',
'D3_EXTSEARCH_SYNED_MAIN_SYNONYMUSEFORATTRIBUTES' => 'for corresponding attribute values',
'D3_EXTSEARCH_SYNED_MAIN_SYNONYMUSEFORATTRIBUTES_DESC' => 'If corresponding values are activated for some attributes, this synonym is also used when filtering by one of the other assigned terms. For example, you can search for country-specific clothing sizes.',
'D3_EXTSEARCH_SYNED_MANAGE_DESC' => 'The synonyms shown here are alternative terms for the meaning chosen above.',
'D3_EXTSEARCH_SYNED_MANAGE_EDIT' => 'edit',
'D3_EXTSEARCH_SYNED_MANAGE_EDIT_DESC' => 'If you want to add additional details to the term or assign it to a different meaning, click on the symbol. The admin area changes to the editing area for exactly the term.',
'D3_EXTSEARCH_SYNED_MANAGE_SYNONYM' => 'Synonym',
'D3_EXTSEARCH_SETTINGS' => 'Settings for <img src="https://logos.oxidmodule.com/d3logo.svg" style="width: 1rem; height: 1rem" alt="DÂł" title="DÂł Data Development"> Extended Search',
'D3_EXTSEARCH_SETTINGS_DESC' => 'Use requires activated module',
'tbclattribute_extsearch' => 'Search and filter settings',
'D3_EXTSEARCH_ASSIGNCATEGORIES' => 'assign filterable categories',
'D3_EXTSEARCH_ASSIGNCATEGORIES_DESC' => 'If the selected attribute should only be shown for filtering at certain categories, assign these categories here. Without an assignment, the attribute is used for filtering in all categories in which corresponding articles are available. <br> <br> The assignment only works if the attribute is not always excluded from being used as a filter (Manage Articles -> Attributes -> Search and Filter Settings -> Attribute is NOT used in Filter Result Lists) and the use of this custom mapping has been enabled in the Basic Module Settings (D3 Modules -> Extended Search -> Preferences -> Filter + Display -> Attribute Filter -> Use attribute activation per category, manufacturer and vendor).',
'D3_EXTSEARCH_ASSIGNMANUFACTURERS' => 'assign filterable manufacturers',
'D3_EXTSEARCH_ASSIGNMANUFACTURERS_DESC' => 'If the selected attribute should only be shown for filtering at certain manufacturers, assign these manufacturer here. Without an assignment, the attribute is used for filtering in all manufacturers in which corresponding articles are available. <br> <br> The assignment only works if the attribute is not always excluded from being used as a filter (Manage Articles -> Attributes -> Search and Filter Settings -> Attribute is NOT used in Filter Result Lists) and the use of this custom mapping has been enabled in the Basic Module Settings (D3 Modules -> Extended Search -> Preferences -> Filter + Display -> Attribute Filter -> Use attribute activation per category, manufacturer and vendor).',
'D3_EXTSEARCH_ASSIGNVENDORS' => 'assign filterable vendors',
'D3_EXTSEARCH_ASSIGNVENDORS_DESC' => 'If the selected attribute should only be shown for filtering at certain vendors, assign these vendor here. Without an assignment, the attribute is used for filtering in all vendors in which corresponding articles are available. <br> <br> The assignment only works if the attribute is not always excluded from being used as a filter (Manage Articles -> Attributes -> Search and Filter Settings -> Attribute is NOT used in Filter Result Lists) and the use of this custom mapping has been enabled in the Basic Module Settings (D3 Modules -> Extended Search -> Preferences -> Filter + Display -> Attribute Filter -> Use attribute activation per category, manufacturer and vendor).',
'tbclcategory_extsearch' => 'Search and filter settings',
'D3_EXTSEARCH_AJAX_ALLCATEGORIES' => 'All categories',
'D3_EXTSEARCH_AJAX_SETCATEGORIES' => 'Assigned categories',
'D3_EXTSEARCH_AJAX_ALLMANUFACTURERS' => 'All manufacturers',
'D3_EXTSEARCH_AJAX_SETMANUFACTURERS' => 'Assigned manufacturers',
'D3_EXTSEARCH_AJAX_ALLVENDORS' => 'All vendors',
'D3_EXTSEARCH_AJAX_SETVENDORS' => 'Assigned vendors',
'GENERAL_AJAX_SORT_D3NOTUSE4FILTER' => 'not useable for filters',
'GENERAL_AJAX_SORT_OXSHORTDESC' => 'shortdescription',
'D3_EXTSEARCH_UPDATE_GENPHONETIC' => '"extended search": The module update made changes in the database structure for the similarity search. Therefore, after completing this installation, update the search index in the admin area of the module.',
'GENERAL_ARTICLE_D3_PHONETIC' => 'extSearch - phonetic index', // Multilang-Fields for importer
'GENERAL_ARTICLE_D3_SEARCHINDEXDATE' => 'extSearch - date of last search index generating', // Multilang-Fields for importer
'GENERAL_ARTICLE_D3PUSH' => 'extSearch - product importance', // Multilang-Fields for importer
'GENERAL_ARTICLE_D3CONTENTHASH' => 'extSearch - hash of indexed contents', // Multilang-Fields for importer
'GENERAL_ARTICLE_OXVARSELECT' => 'variant title',
'D3_EXTSEARCH_CLI_COMMON_RUNFROMCLI' => 'This script has to be run from the command line',
'D3_EXTSEARCH_CLI_COMMON_UNVALIDSHOPID' => 'unvalid shop id',
'D3_EXTSEARCH_CLI_COMMON_NOGENERATORSCRIPT' => 'No generation language defined, please set it in the module settings.',
'D3_EXTSEARCH_CLI_HELP' => 'Enables automated tasks / maintenance of the "extended search" module.',
'D3_EXTSEARCH_CLI_OPTION_VERSION' => 'print version',
'D3_EXTSEARCH_CLI_OPTION_QUIET' => 'prevents output from being displayed',
'D3_EXTSEARCH_CLI_OPTION_LANG' => 'optional - language of the output messages, possible values are: "%1$s"',
'D3_EXTSEARCH_CLI_OPTION_HELP' => 'Display this help screen and exit immeadiately.',
'D3_EXTSEARCH_CLI_OPTION_NOCOLORS' => 'Do not use any colors in output. Useful when piping output to other tools or files.',
'D3_EXTSEARCH_CLI_OPTION_LOGLEVELS' => 'Minimum level of messages to display. Default is "info". Valid levels are: "debug", "info", "notice", "success", "warning", "error", "critical", "alert", "emergency".',
'D3_EXTSEARCH_CLI_COMMAND' => 'This tool accepts a command as first parameter as outlined below:',
'D3_EXTSEARCH_CLI_COMMAND_GENERATEINDEX' => 'Generate outdated phonetic search index',
'D3_EXTSEARCH_CLI_COMMAND_GENERATESEMANTIC' => 'Reindex lexicon for a search with the same meaning',
'D3_EXTSEARCH_CLI_COMMAND_FIXARTEXTENDS' => 'Clean up long text table',
'D3_EXTSEARCH_CLI_ARGUMENT_SHOPID' => 'ID of the selected shop, possible values are: "%1$s"',
'D3_EXTSEARCH_CLI_ARGUMENT_ENCLOSER' => '", "',
'D3_EXTSEARCH_CLI_GENERATOR_PROCESSING' => 'processing ...',
'D3_EXTSEARCH_CLI_GENERATOR_PROCESSED' => '%1$s article language(s) (ca. %2$s article(s)) edited - generation completed!',
'D3_EXTSEARCH_CLI_GENERATOR_TERMPROCESSED' => '%1$s word(s) edited - generation completed!',
'D3_EXTSEARCH_CLI_FINISHED_SUCCFESSFULLY' => 'script successfully finished',
'SHOP_MODULE_GROUP_d3thememapping_global' => 'assign template blocks to your individual theme (global setting for D3 modules)',
'SHOP_MODULE_GROUP_d3thememapping_module' => 'assign template blocks to your individual theme (setting for this module only)',
'SHOP_MODULE_d3custParentThemeMappedToWave_'.$sModId => 'If this herein referenced theme is active, "<b>Wave</b>" template blocks of the module is used.',
'SHOP_MODULE_d3custParentThemeMappedToApex_'.$sModId => 'If this herein referenced theme is active, "<b>Apex</b>" template blocks of the module is used.',
'HELP_SHOP_MODULE_d3custParentThemeMappedToWave_'.$sModId => $sD3Help_mappedTo,
'HELP_SHOP_MODULE_d3custParentThemeMappedToApex_'.$sModId => $sD3Help_mappedTo,
];
// @codeCoverageIgnoreEnd

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

155
IntelliSenseHelper.php Normal file
View File

@ -0,0 +1,155 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Modules\Application\Component
{
use OxidEsales\Eshop\Application\Component\BasketComponent;
use OxidEsales\Eshop\Application\Component\UtilsComponent;
use OxidEsales\Eshop\Application\Component\Widget\ArticleBox;
use OxidEsales\Eshop\Application\Component\Widget\ArticleDetails;
class d3_oxcmp_basket_extsearch_parent extends BasketComponent
{
}
class d3_oxcmp_utils_extsearch_parent extends UtilsComponent
{
}
class d3_oxwarticledetails_extsearch_parent extends ArticleDetails
{
}
class d3_oxwarticlebox_extsearch_parent extends ArticleBox
{
}
}
namespace D3\Extsearch\Modules\Application\Controller\Admin
{
use OxidEsales\Eshop\Application\Controller\Admin\ArticleList;
use OxidEsales\VisualCmsModule\Application\Controller\Admin\VisualCmsAdmin;
class d3_article_list_extsearch_parent extends ArticleList
{
}
class d3_ddoevisualcmsadmin_extsearch_parent extends VisualCmsAdmin
{
}
}
namespace D3\Extsearch\Modules\Application\Controller
{
use OxidEsales\Eshop\Application\Component\Locator as LocatorAlias;
use OxidEsales\Eshop\Application\Controller\ArticleDetailsController as ArticleDetailsControllerAlias;
use OxidEsales\Eshop\Application\Controller\ArticleListController as ArticleListControllerAlias;
use OxidEsales\Eshop\Application\Controller\ManufacturerListController as ManufacturerListControllerAlias;
use OxidEsales\Eshop\Application\Controller\SearchController as SearchControllerAlias;
use OxidEsales\Eshop\Application\Controller\VendorListController as VendorListControllerAlias;
class d3_ext_search_parent extends SearchControllerAlias
{
}
class d3_alist_extsearch_parent extends ArticleListControllerAlias
{
}
class d3_manufacturerlist_extsearch_parent extends ManufacturerListControllerAlias
{
}
class d3_vendorlist_extsearch_parent extends VendorListControllerAlias
{
}
class d3_details_extsearch_parent extends ArticleDetailsControllerAlias
{
}
class d3_oxlocator_extsearch_parent extends LocatorAlias
{
}
}
namespace D3\Extsearch\Modules\Application\Model
{
use OxidEsales\Eshop\Application\Model\Article;
use OxidEsales\Eshop\Application\Model\ArticleList;
use OxidEsales\Eshop\Application\Model\Attribute;
use OxidEsales\Eshop\Application\Model\Category;
use OxidEsales\Eshop\Application\Model\Manufacturer;
use OxidEsales\Eshop\Application\Model\Search;
use OxidEsales\Eshop\Application\Model\Shop;
use OxidEsales\Eshop\Application\Model\Vendor;
use OxidEsales\Eshop\Core\Model\BaseModel;
class d3_oxsearch_extsearch_parent extends Search
{
}
class d3_oxarticle_phonetic_parent extends Article
{
}
class d3_oxarticlelist_extsearch_parent extends ArticleList
{
}
class d3_attribute_extsearch_parent extends Attribute
{
}
class d3_oxshop_extsearch_parent extends Shop
{
}
class d3_basemodel_extsearch_parent extends BaseModel
{
}
class d3_category_extsearch_parent extends Category
{
}
class d3_manufacturer_extsearch_parent extends Manufacturer
{
}
class d3_vendor_extsearch_parent extends Vendor
{
}
}
namespace D3\Extsearch\Modules\Core
{
use OxidEsales\Eshop\Core\UtilsView;
class d3_oxutilsview_extsearch_parent extends UtilsView
{
}
}
namespace D3\Extsearch\Modules\PsCache\Core
{
use ProudSourcing\psCache\Core\CacheCore;
class d3_CacheCore_extsearch_parent extends CacheCore
{
}
}

View File

@ -0,0 +1,84 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Modules\Application\Component;
use D3\Extsearch\Application\Model\d3_search;
use D3\Extsearch\Application\Model\Filters\d3Filter;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
class d3_oxcmp_basket_extsearch extends d3_oxcmp_basket_extsearch_parent
{
protected $_oOwnSearchHandler;
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
protected function getRedirectUrl(): string
{
$sUrl = parent::getRedirectUrl();
$aParamList = [];
/** @var d3Filter $oFilter */
foreach ($this->d3getOwnSearchHandler()->getFilterList() as $oFilter) {
if (! $oFilter->isUsingSessionStorage()) {
$aParamList = array_merge($aParamList, $oFilter->getRequestParameterNameList(true));
}
}
$aParamList = array_unique($aParamList);
$sAdd = '';
foreach ($aParamList as $sParam) {
$mTransferParam = Registry::get(Request::class)->getRequestEscapedParameter($sParam);
if ($mTransferParam) {
if (is_array($mTransferParam)) {
foreach ($mTransferParam as $key => $value) {
$sAdd .= $sParam . '[' . $key . ']=' . $value . '&';
}
} else {
$sAdd .= $sParam . '=' . Registry::get(Request::class)->getRequestEscapedParameter($sParam) . "&";
}
}
}
$sUrl .= $sAdd;
return $sUrl;
}
/**
* performance, use a class wide instance
*
* @return d3_search
*/
protected function d3getOwnSearchHandler(): d3_search
{
if (!$this->_oOwnSearchHandler) {
/** @var d3_search $oSearch */
$oSearch = oxNew(d3_search::class);
$this->_oOwnSearchHandler = $oSearch;
}
return $this->_oOwnSearchHandler;
}
}

View File

@ -0,0 +1,261 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Modules\Application\Component;
use D3\Extsearch\Application\Model\d3_search;
use D3\Extsearch\Core\d3_extsearch_conf;
use D3\ModCfg\Application\Model\d3utils;
use D3\ModCfg\Application\Model\Configuration\d3_cfg_mod;
use D3\ModCfg\Application\Model\d3filesystem;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Application\Model\Shop;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\FileException;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
use OxidEsales\Eshop\Application\Model\Search;
use OxidEsales\Eshop\Core\Controller\BaseController;
use OxidEsales\Eshop\Application\Controller\FrontendController;
class d3_oxcmp_utils_extsearch extends d3_oxcmp_utils_extsearch_parent
{
private $_sModId = 'd3_extsearch';
public $blIsComponent = true;
protected $_sOldPluginName = 'se_browserinstall.xml';
public $aArtExtendsFields = ['oxlongdesc', 'oxtags'];
protected $_d3SimilarQuickSearch;
/** @var null|d3_search */
public $oD3SearchHandler;
/** @var null|Search */
public $oD3oxSearchHandler;
/**
* constructor
*/
public function __construct()
{
// required for parent class method check
$this->setClassKey('oxcmp_utils');
/** @var d3utils $oD3Utils */
$oD3Utils = Registry::get(d3utils::class);
if ($oD3Utils->hasParentClassMethod($this, '__construct')) {
parent::__construct();
}
}
/**
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
*/
public function init()
{
parent::init();
if (!$this->isAdmin()) {
if ($this->d3GetSet()->isActive()) {
/** @var BaseController $oParentView */
$oParentView = $this->getParent();
$oParentView->addTplParam('blD3ShowIAS', $this->d3GetSet()->getValue('blExtSearch_ShowIAS'));
$oParentView->addTplParam('blD3EmptySearch', $this->d3GetSet()->getValue(d3_extsearch_conf::CONF_ALLOWEMPTYSEARCHSTR));
$oParentView->addTplParam('blD3ShowSearchPopup', $this->d3GetSet()->getValue('blExtSearch_ShowPopup'));
$oParentView->addTplParam('sSearchPluginURL', $this->d3GetSearchPluginUrl());
$oParentView->addTplParam('oD3ExtSearchCmpUtils', $this);
$oParentView->addTplParam('blUseSuggestSearch', $this->d3GetSet()->getValue('blExtSearch_enableAjaxSearch'));
}
}
}
/**
* @return mixed
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function render()
{
$ret = parent::render();
if (!$this->isAdmin() && $this->d3GetSet()->isActive()) {
/** @var BaseController $oParentView */
$oParentView = $this->getParent();
$oParentView->addTplParam(
'blSearchPluginInstall',
$this->d3GetSet()->getValue('blExtSearch_enablePluginBrowserInstall')
);
$oParentView->addTplParam('blOwnFormFields', $this->d3GetSet()->getValue(d3_extsearch_conf::CONF_CUSTOMFILTER_USE));
$oParentView->addTplParam('sAboveTheFoldCssFile', $this->d3GetAtfCssFile());
}
if (!$this->isAdmin()
&& $this->d3GetSet()->isActive()
&& $this->d3GetSet()->getValue('blExtSearch_enableAjaxSearch')
) {
/** @var BaseController $oParentView */
$oParentView = $this->getParent();
$oParentView->addTplParam('sD3QSWaitMessage', $this->getD3SearchHandler()->suggestGetWaitMessage());
}
// change OXIDs list type dependend by search only parameters
if (!$this->isAdmin() //
&& $this->d3GetSet()->isActive() //
&& $this->d3GetSet()->getValue(d3_extsearch_conf::CONF_USEFILTERSINLISTS)
) {
/** @var FrontendController $oParentView */
$oParentView = $this->getParent();
if ($oParentView->getListType() == 'search'
&& Registry::get(Request::class)->getRequestEscapedParameter('isextsearch') == 'alist'
) {
$oParentView->setListType('list');
}
}
return $ret;
}
/**
* @return bool|string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
*/
public function d3GetAtfCssFile()
{
$sFilePath = "out/src/css/abovethefold/d3extsearch_".$this->d3GetSet()->getMappedThemeId()."_".
strtolower(Registry::getConfig()->getActiveView()->getClassKey()).".min.css";
$sDir = Registry::getConfig()->getActiveView()->getViewConfig()->getModulePath(
'd3_extsearch'
) . $sFilePath;
$fs = oxNew(d3filesystem::class);
return $fs->exists($sDir) ? $sDir : false;
}
/**
* @return d3_cfg_mod
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
private function d3GetSet()
{
return d3_cfg_mod::get($this->d3getModId());
}
/**
* @return string
*/
private function d3getModId()
{
return $this->_sModId;
}
/**
* performance, use a class wide instance
*
* @return d3_search
*/
protected function getD3SearchHandler()
{
if (!$this->oD3SearchHandler) {
$this->oD3SearchHandler = oxNew(d3_search::class);
}
return $this->oD3SearchHandler;
}
/**
* generates article list for browsers search engines
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws FileException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3_browser_suggest()
{
// zwingend, um die Gueltigkeit des Dokuments sicherzustellen
// faengt Fehlausgaben anderer Module ab
ob_end_clean();
// we don't require a complete object
$blOldFullObject = $this->d3GetSet()->getValue('blExtSearch_QuickSearchLoadFullObject');
$this->d3GetSet()->setValue('blExtSearch_QuickSearchLoadFullObject', false);
echo $this->getD3SearchHandler()->browserSuggestGetContent();
// restore setting
$this->d3GetSet()->setValue('blExtSearch_QuickSearchLoadFullObject', $blOldFullObject);
Registry::getConfig()->pageClose();
die();
}
/**
* @return bool|string
*/
protected function d3GetSearchPluginUrl()
{
/** @var Shop $oShop */
$oShop = Registry::getConfig()->getActiveShop();
$oFS = oxNew(d3filesystem::class);
if ($oFS->exists(
$oFS->trailingslashit(Registry::getConfig()->getConfigParam('sShopDir')) . $this->_sOldPluginName
)
) {
$sFileName = $this->_sOldPluginName;
} else {
$sPattern = "[^a-zA-Z0-9]";
$sFileName = 'searchplugin_' . strtolower(
preg_replace('@' . $sPattern . '@', '_', $oShop->getFieldData('oxname'))
) . ".xml";
}
$sURI = $oFS->trailingslashit(Registry::getConfig()->getConfigParam('sShopURL')) . $sFileName;
$sPath = $oFS->trailingslashit(Registry::getConfig()->getConfigParam('sShopDir')) . $sFileName;
if ($oFS->exists($sPath)) {
return $sURI;
}
return false;
}
}

View File

@ -0,0 +1,51 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Modules\Application\Component;
use OxidEsales\Eshop\Core\Request;
use OxidEsales\Eshop\Core\Registry;
class d3_oxwarticlebox_extsearch extends d3_oxwarticlebox_extsearch_parent
{
/**
* @return mixed
*/
public function d3getFilterPageId()
{
switch (strtolower($this->getListType())) {
case 'search':
$sClassNameAdd = 'search##';
$sIdent = md5(rawurlencode(strtolower(Registry::get(Request::class)->getRequestEscapedParameter('searchparam'))));
break;
case 'manufacturer':
$sClassNameAdd = '##';
$sIdent = Registry::get(Request::class)->getRequestEscapedParameter('mnid');
break;
default:
$sClassNameAdd = '##';
$sIdent = Registry::get(Request::class)->getRequestEscapedParameter('cnid');
}
$sPageId = $sClassNameAdd.
Registry::getLang()->getLanguageAbbr()."##".
Registry::getConfig()->getShopId()."##".
$sIdent;
return $sPageId;
}
}

View File

@ -0,0 +1,326 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Modules\Application\Component;
use D3\Extsearch\Modules\Application\Model\d3_oxsearch_extsearch;
use D3\Extsearch\Modules\Application\Controller\d3_ext_search;
use D3\Extsearch\Modules\Application\Controller\d3_alist_extsearch;
use D3\Extsearch\Modules\Application\Controller\d3_manufacturerlist_extsearch;
use D3\Extsearch\Modules\Application\Controller\d3_vendorlist_extsearch;
use D3\Extsearch\Application\Model\d3_search;
use D3\ModCfg\Application\Model\Configuration\d3_cfg_mod;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Request;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Application\Model\Search;
use OxidEsales\Eshop\Application\Controller\SearchController;
use OxidEsales\Eshop\Application\Controller\ArticleListController;
use OxidEsales\Eshop\Application\Controller\ManufacturerListController;
use OxidEsales\Eshop\Application\Controller\VendorListController;
class d3_oxwarticledetails_extsearch extends d3_oxwarticledetails_extsearch_parent
{
/** @var null|d3_oxsearch_extsearch */
public $oD3SearchHandler = null;
/** @var null|d3_search */
public $oD3OwnSearchHandler = null;
protected $_aSelectedAttributes;
private $_sModId = 'd3_extsearch';
public function init()
{
if (! in_array('oxcmp_utils', array_change_key_case(array_keys($this->_aComponentNames)), CASE_LOWER)) {
$this->_aComponentNames['oxcmp_utils'] = 1;
}
parent::init();
}
/**
* performance, use a class wide instance
*
* @return d3_oxsearch_extsearch
*/
protected function d3GetSearchHandler(): d3_oxsearch_extsearch
{
if (!$this->oD3SearchHandler) {
/** @var d3_oxsearch_extsearch $searchHandler */
$searchHandler = oxNew(Search::class);
$this->oD3SearchHandler = $searchHandler;
}
return $this->oD3SearchHandler;
}
/**
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function getAttributeFilters()
{
if (null == $this->_aSelectedAttributes) {
$this->_aSelectedAttributes = $this->d3GetSearchHandler()->getAttributeFilters();
$this->addTplParam('aD3AttribFilters', $this->_aSelectedAttributes);
}
return $this->_aSelectedAttributes;
}
/**
* @return mixed
*/
public function d3getFilterPageId()
{
switch (strtolower($this->getListType())) {
case 'search':
$sClassNameAdd = 'search##';
$sIdent = md5(rawurlencode(strtolower(Registry::get(Request::class)->getRequestEscapedParameter('searchparam'))));
break;
case 'manufacturer':
$sClassNameAdd = '##';
$sIdent = Registry::get(Request::class)->getRequestEscapedParameter('mnid');
break;
default:
$sClassNameAdd = '##';
$sIdent = Registry::get(Request::class)->getRequestEscapedParameter('cnid');
}
$sPageId = $sClassNameAdd.
Registry::getLang()->getLanguageAbbr()."##".
Registry::getConfig()->getShopId()."##".
$sIdent;
return $sPageId;
}
/**
* @return d3_alist_extsearch|d3_ext_search|d3_manufacturerlist_extsearch|d3_vendorlist_extsearch
*/
public function d3GetBaseController()
{
$sListType = Registry::get(Request::class)->getRequestEscapedParameter('listtype');
if ('search' == $sListType) {
/** @var d3_ext_search|d3_alist_extsearch|d3_manufacturerlist_extsearch|d3_vendorlist_extsearch $oController */
$oController = oxNew(SearchController::class);
} elseif ('vendor' == $sListType) {
$oController = oxNew(VendorListController::class);
} elseif ('manufacturer' == $sListType) {
$oController = oxNew(ManufacturerListController::class);
} else {
$oController = oxNew(ArticleListController::class);
}
return $oController;
}
/**
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function getNavigationParams()
{
$aParams = parent::getNavigationParams();
$oController = $this->d3GetBaseController();
$aSearchParams = $oController->getNavigationParams();
$this->d3GetSearchHandler()->d3RemoveEmptyParameters($aParams);
$aParams = array_merge($aSearchParams, $aParams);
return $aParams;
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function getSearchCategory()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getCategoryFilter()->getUserSingleSelection();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3CategoryFilterUseMultipleValues()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getCategoryFilter()->hasUserMultiSelection();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function getSearchVendor()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getVendorFilter()->getUserSingleSelection();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3VendorFilterUseMultipleValues()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getVendorFilter()->hasUserMultiSelection();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function getSearchManufacturer()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getManufacturerFilter()->getUserSingleSelection();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3ManufacturerFilterUseMultipleValues()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getManufacturerFilter()->hasUserMultiSelection();
}
/**
* performance, use a class wide instance
*
* @return d3_search
*/
public function d3GetOwnSearchHandler()
{
if (!$this->oD3OwnSearchHandler) {
$this->oD3OwnSearchHandler = oxNew(d3_search::class);
}
return $this->oD3OwnSearchHandler;
}
/**
* Returns page sort identificator. It is used as identificator in session variable aSorting[ident]
*
* @return string
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
*/
public function getSortIdent()
{
if ($this->d3GetSet()->isActive()
&& Registry::get(Request::class)->getRequestParameter('isextsearch') === 'search'
) {
return 'd3extsearch';
} elseif (method_exists(get_parent_class(), 'getSortIdent')) {
return parent::getSortIdent();
} else {
return '';
}
}
/**
* @return d3_cfg_mod
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function d3GetSet()
{
return d3_cfg_mod::get($this->d3getModId());
}
/**
* @return string
*/
private function d3getModId()
{
return $this->_sModId;
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function canCache()
{
$canCache = parent::canCache();
return $canCache && $this->d3CanCache();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3CanCache()
{
$oController = $this->d3GetBaseController();
return false === method_exists($oController, 'd3GetXListController') ||
((bool) count($oController->d3GetXListController()->getAllSelections())) === false;
}
}

View File

@ -0,0 +1,277 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Modules\Application\Controller\Admin;
use D3\ModCfg\Application\Model\Configuration\d3_cfg_mod;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Application\Model\Article;
use OxidEsales\Eshop\Application\Model\Object2Category;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
use OxidEsales\Eshop\Core\Str;
use OxidEsales\Eshop\Core\StrMb;
use OxidEsales\EshopCommunity\Internal\Container\ContainerFactory;
use OxidEsales\EshopCommunity\Internal\Framework\Database\ConnectionProviderInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
class d3_article_list_extsearch extends d3_article_list_extsearch_parent
{
private $_sModId = 'd3_extsearch';
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function render()
{
$sRet = parent::render();
if ($this->d3GetSet()->getValue('blExtSearch_adminShowVariants')) {
if (false == is_array($this->getViewDataElement("pwrsearchfields")) ||
!in_array('oxvarselect', $this->getViewDataElement("pwrsearchfields"))
) {
$aSearchFields = $this->getViewDataElement("pwrsearchfields");
$aSearchFields[] = 'oxvarselect';
$this->addTplParam("pwrsearchfields", $aSearchFields);
}
}
return $sRet;
}
/**
* @return d3_cfg_mod
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
protected function d3GetSet()
{
return d3_cfg_mod::get($this->d3getModId());
}
/**
* @return string
*/
private function d3getModId()
{
return $this->_sModId;
}
/**
* @param null $oListObject
*
* @return mixed|string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function buildSelectString($oListObject = null)
{
$sSql = parent::buildSelectString($oListObject);
// wenn fĂĽr Admin Variantensuche
if ($this->d3GetSet()->isActive()
&& $this->d3GetSet()->getValue('blExtSearch_adminShowVariants')
&& $this->d3IsSearch()
) {
$sViewName = $oListObject->getViewName();
$connection = ContainerFactory::getInstance()->getContainer()->get(ConnectionProviderInterface::class)->get();
$aReplSearch = [
'from ' . $sViewName,
", " . $connection->quoteIdentifier("{$sViewName}.oxtitle"),
", " . $connection->quoteIdentifier("{$sViewName}.oxvarselect"),
];
$aReplReplacement = [
'from ' . $sViewName . ' LEFT JOIN ' . $oListObject->getViewName() . ' oxp ON ' . $sViewName . '.oxparentid = oxp.oxid',
", if($sViewName.oxparentid, CONCAT(oxp.oxtitle,' ', $sViewName.oxvarselect), $sViewName.oxtitle) as oxtitle",
", if($sViewName.oxparentid, CONCAT(oxp.oxtitle,' ', $sViewName.oxvarselect), $sViewName.oxvarselect) as oxvarselect",
];
$sSql = str_replace($aReplSearch, $aReplReplacement, $sSql);
}
return $sSql;
}
/**
* Adding empty parent check
*
* @param array $whereQuery SQL condition array
* @param string $fullQuery SQL query string
*
* @return mixed|string
* @throws ContainerExceptionInterface
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws NotFoundExceptionInterface
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function prepareWhereQuery($whereQuery, $fullQuery)
{
$fullQuery = parent::prepareWhereQuery( $whereQuery, $fullQuery);
// wenn fĂĽr Admin Variantensuche
if ($this->d3GetSet()->isActive()
&& $this->d3GetSet()->getValue('blExtSearch_adminShowVariants')
&& $this->d3IsSearch()
) {
$oArticle = oxNew(Article::class);
$aReplSearch = [" and " . $oArticle->getViewName() . ".oxparentid = '' "];
$aReplReplacement = [''];
$connection = ContainerFactory::getInstance()->getContainer()->get(ConnectionProviderInterface::class)->get();
$sSearchKey = strtolower($oArticle->getViewName()) . '.oxtitle';
$aLowerWhere = array_change_key_case( $whereQuery);
$aKeys = array_keys($aLowerWhere);
$aOrgKeys = array_keys( $whereQuery);
$sIdent = array_search($sSearchKey, $aKeys);
$sOrgSearchKey = $aOrgKeys[$sIdent];
$sQuotedOrgSearchKey = $connection->quoteIdentifier($sOrgSearchKey);
if (in_array($sSearchKey, $aKeys)) {
$aReplSearch[] = '( ' . $sQuotedOrgSearchKey . " like '" . $whereQuery[ $sOrgSearchKey] . "' )";
$aReplReplacement[] = '( ' . $sQuotedOrgSearchKey . " like '" . $whereQuery[ $sOrgSearchKey] . "' OR " .
$connection->quoteIdentifier("oxp.oxtitle") . " LIKE '" . $whereQuery[ $sOrgSearchKey] . "' )";
}
$fullQuery = str_replace( $aReplSearch, $aReplReplacement, $fullQuery);
}
return $fullQuery;
}
/**
* Sets articles sorting by category.
*
* @param string $query sql string
*
* @return string
* @throws ContainerExceptionInterface
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws NotFoundExceptionInterface
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function changeselect($query)
{
$query = parent::changeselect( $query);
$sType = false;
$sValue = false;
// wenn fĂĽr Admin Variantensuche
if ($this->d3GetSet()->isActive()
&& $this->d3GetSet()->getValue('blExtSearch_adminShowVariants')
&& $this->d3IsSearch()
) {
$connection = ContainerFactory::getInstance()->getContainer()->get(ConnectionProviderInterface::class)->get();
$sArtCat = Registry::get(Request::class)->getRequestEscapedParameter("art_category");
if ($sArtCat && strstr($sArtCat, "@@") !== false) {
[$sType, $sValue] = explode("@@", $sArtCat);
} elseif ($sArtCat) {
$sValue = $sArtCat;
$sType = 'cat';
}
$oArticle = oxNew(Article::class);
$sTable = $oArticle->getViewName();
// D3 pattern changed
$sPattern = "from\s+$sTable\s+(.*?)\s{0,1}where";
switch ($sType) {
// add category
case 'cat':
/** @var StrMb $oStr */
$oStr = Str::getStr();
$oO2C = oxNew(Object2Category::class);
$sO2CView = $oO2C->getViewName();
// d3 sumatch added again (\\1)
$sLJAdd = strstr(
$query,
$sO2CView
) ? '' : " LEFT JOIN $sO2CView ON $sTable.oxid = $sO2CView.oxobjectid ";
// 2012-07-04 changed to lowercase, because OXID regexp doesn't match uppercase :(
$sInsert = "from $sTable \\1 $sLJAdd where ".$connection->quoteIdentifier("{$sO2CView}.oxcatnid")." = " .
$connection->quote(
$sValue
) . " AND ";
// D3 pattern changed
$query = $oStr->preg_replace( "/$sPattern/i", $sInsert, $query);
break;
// add category
case 'mnf':
$query .= " and $sTable.oxmanufacturerid = " . $connection->quote( $sValue);
break;
// add vendor
case 'vnd':
$query .= " and $sTable.oxvendorid = " . $connection->quote( $sValue);
break;
}
}
return $query;
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
protected function d3IsSearch(): bool
{
if ($this->d3GetSet()->getFieldData('oxactive')
&& $aWhere = Registry::get(Request::class)->getRequestEscapedParameter('where')
) {
if (is_array($aWhere)) {
$aWhere = $aWhere['oxarticles'];
foreach ($aWhere as $sValue) {
if (is_string($sValue) &&
strlen($sValue)
) {
return true;
}
}
}
}
return false;
}
}

View File

@ -0,0 +1,50 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Modules\Application\Controller\Admin;
use D3\Extsearch\Application\Model\Constants;
use OxidEsales\Eshop\Application\Model\Content;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
class d3_ddoevisualcmsadmin_extsearch extends d3_ddoevisualcmsadmin_extsearch_parent
{
public function render()
{
// @phpstan-ignore-next-line
$sRet = parent::render();
// @phpstan-ignore-next-line
$this->addTplParam('sOriginalTplName', $sRet);
$sRet = '@'.Constants::OXID_MODULE_ID.'/d3_ddeovisualcmsadmin_extsearch';
return $sRet;
}
public function d3GetIsSearchStatus()
{
$oContent = oxNew(Content::class);
if (($oContent->load(Registry::get(Request::class)->getRequestEscapedParameter('id')))
&& $oContent->getFieldData('d3issearchable')
) {
echo 'true';
} else {
echo "false";
}
die();
}
}

View File

@ -0,0 +1,765 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Modules\Application\Controller;
use D3\Extsearch\Modules\Application\Model\d3_oxsearch_extsearch;
use D3\Extsearch\Application\Controller\d3_xlist_extsearch;
use D3\Extsearch\Application\Model\d3_search;
use D3\Extsearch\Application\Model\Filters\d3Filter;
use D3\Extsearch\Core\d3_extsearch_conf;
use D3\ModCfg\Application\Model\Configuration\d3_cfg_mod;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Application\Model\Category;
use OxidEsales\Eshop\Application\Model\ArticleList;
use OxidEsales\Eshop\Application\Model\ManufacturerList;
use OxidEsales\Eshop\Application\Model\VendorList;
use OxidEsales\Eshop\Application\Model\CategoryList;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\FileException;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Registry;
class d3_alist_extsearch extends d3_alist_extsearch_parent
{
/** @var null|d3_xlist_extsearch */
protected $_oXListController;
private $_blUseAlistFilter;
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function render()
{
$this->d3GetXListController()->render();
return parent::render();
}
/**
* @param Category $manufacturer
*
* @return ArticleList
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function loadArticles($manufacturer)
{
$oArtList = parent::loadArticles( $manufacturer);
/** @var int $pageCount */
$pageCount = $this->_iCntPages;
if ($pageCount || $oArtList->count()) {
$this->d3GetXListController()->addAListFilters( $manufacturer);
}
$this->d3GetXListController()->setTplParams($oArtList);
return $oArtList;
}
/**
* @return bool|string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function getSearchCategory()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getCategoryFilter()->getUserSingleSelection();
}
/**
* @return bool|string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function getSearchVendor()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getVendorFilter()->getUserSingleSelection();
}
/**
* @return bool|string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function getSearchManufacturer()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getManufacturerFilter()->getUserSingleSelection();
}
/**
* @param string $url
* @param int $currentPage
* @param int $languageId
*
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function addPageNrParam($url, $currentPage, $languageId = null)
{
if (false == $this->d3UseAlistFilters()) {
return parent::addPageNrParam( $url, $currentPage, $languageId);
}
$url = parent::addPageNrParam( $url, $currentPage, $languageId);
$sUrlAdd = $this->getViewDataElement('additionalparams');
if ($sUrlAdd) {
$url .= (( strpos( $url, '?') === false) ? '?' : '') . $sUrlAdd;
}
return $url;
}
/**
* returns additional url params for dynamic url building
*
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function getDynUrlParams()
{
$sRet = parent::getDynUrlParams();
if ($this->d3UseAlistFilters()) {
$sRet .= $this->d3GetXListController()->d3AddBaseUrlParams($sRet);
}
return $sRet;
}
/**
* Returns additional URL parameters which must be added to list products urls
*
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function getAddUrlParams()
{
$sAddParams = parent::getAddUrlParams();
if ($this->d3UseAlistFilters()) {
$sAddParams .= $this->d3GetXListController()->d3AddBaseUrlParams($sAddParams);
}
return $sAddParams;
}
/**
* Returns additional URL parameters which must be added to list products seo urls
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function getAddSeoUrlParams()
{
$sAddParams = parent::getAddUrlParams();
if ($this->d3UseAlistFilters()) {
$sAddParams .= $this->d3GetXListController()->d3AddBaseUrlParams($sAddParams);
}
return $sAddParams;
}
/**
* Returns array of params => values which are used in hidden forms and as additional url params
*
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function getNavigationParams()
{
$aParams = parent::getNavigationParams();
$aParams = $this->d3GetXListController()->addNavigationParams($aParams);
return $aParams;
}
/**
* @return string
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
*/
public function getAdditionalParams()
{
$this->_sAdditionalParams = parent::getAdditionalParams();
if ($this->d3GetSet()->isActive()) {
$sSeparator = htmlspecialchars(ini_get('arg_separator.output'));
$this->_sAdditionalParams .= $this->d3GetXListController()->getD3AdditionalParams();
if (!strstr($this->_sAdditionalParams, $sSeparator.'isextsearch=')
&& $this->d3haveFiltersUserSelection()
) {
$this->_sAdditionalParams .= $sSeparator.'isextsearch=alist';
}
}
return $this->_sAdditionalParams;
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3haveFiltersUserSelection()
{
/** @var d3Filter $oFilter */
foreach ($this->d3GetOwnSearchHandler()->getFilterList() as $oFilter) {
if ($oFilter->hasUserSelection()) {
return true;
}
}
return false;
}
/**
* @return string
*/
public function d3getFilterPageId()
{
return $this->d3GetXListController()->d3getFilterPageId();
}
/**
* @return d3_cfg_mod
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function d3GetSet()
{
return $this->d3GetXListController()->d3GetSet();
}
/**
* @return d3_oxsearch_extsearch
*/
protected function d3GetSearchHandler(): d3_oxsearch_extsearch
{
return $this->d3GetXListController()->d3GetSearchHandler();
}
/**
* @return d3_search
*/
protected function d3GetOwnSearchHandler()
{
return $this->d3GetXListController()->d3GetOwnSearchHandler();
}
/**
* @return CategoryList
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetCategoryList(): CategoryList
{
return $this->d3GetXListController()->d3GetCategoryList();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasCategoryList(): bool
{
return $this->d3GetXListController()->d3HasCategoryList();
}
/**
* @return VendorList
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetVendorList(): VendorList
{
return $this->d3GetXListController()->d3GetVendorList();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasVendorList(): bool
{
return $this->d3GetXListController()->d3HasVendorList();
}
/**
* @return ManufacturerList
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetManufacturerList(): ManufacturerList
{
return $this->d3GetXListController()->d3GetManufacturerList();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasManufacturerList(): bool
{
return $this->d3GetXListController()->d3HasManufacturerList();
}
/**
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetAttributeList(): array
{
return $this->d3GetXListController()->d3GetAttributeList();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasAttributeList()
{
return $this->d3GetXListController()->d3HasAttributeList();
}
/**
* @param $sAttrId
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3AttributeFilterUseMultipleValues($sAttrId)
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getAttributeFilter()->hasUserMultiSelection($sAttrId);
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3CategoryFilterUseMultipleValues()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getCategoryFilter()->hasUserMultiSelection();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3VendorFilterUseMultipleValues()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getVendorFilter()->hasUserMultiSelection();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3ManufacturerFilterUseMultipleValues()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getManufacturerFilter()->hasUserMultiSelection();
}
/**
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws FileException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3getPriceSteps()
{
return $this->d3GetXListController()->d3getPriceSteps();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasjQuerySlider()
{
return $this->d3GetXListController()->d3HasjQuerySlider();
}
/**
* @return string
*/
public function d3GetDeselectValue()
{
return $this->d3GetXListController()->d3GetDeselectValue();
}
/**
* @param $sOptionTitle
* @return string
*/
public function d3GetMultipleSelectionTranslation($sOptionTitle)
{
return $this->d3GetXListController()->d3GetMultipleSelectionTranslation($sOptionTitle);
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasFilters()
{
return $this->d3GetXListController()->d3HasFilters();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasPriceFilter()
{
return $this->d3GetXListController()->d3HasPriceFilter();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3CanShowPriceFilterSlider()
{
return $this->d3GetXListController()->d3CanShowPriceFilterSlider();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderInfoMinValue()
{
return $this->d3GetXListController()->d3GetPriceSliderInfoMinValue();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderInfoMaxValue()
{
return $this->d3GetXListController()->d3GetPriceSliderInfoMaxValue();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderInputMinValue()
{
return $this->d3GetXListController()->d3GetPriceSliderInputMinValue();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderInputMaxValue()
{
return $this->d3GetXListController()->d3GetPriceSliderInputMaxValue();
}
/**
* @return float|int
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function d3getPricePrecision()
{
return $this->d3GetXListController()->d3getPricePrecision();
}
/**
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3getPriceLimits()
{
return $this->d3GetXListController()->d3getPriceLimits();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderOriginalMinValue()
{
return $this->d3GetXListController()->d3GetPriceSliderOriginalMinValue();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderOriginalMaxValue()
{
return $this->d3GetXListController()->d3GetPriceSliderOriginalMaxValue();
}
/**
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function d3ClearFilter()
{
$this->d3GetXListController()->d3ClearFilter();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
private function d3UseAlistFilters()
{
if (null === $this->_blUseAlistFilter) {
$this->_blUseAlistFilter = $this->d3GetSet()->isActive()
&& ($this->d3GetSet()->getLicenseConfigData(d3_extsearch_conf::SERIAL_BIT_HAS_FILTERS_IN_ALIST, false) || $this->d3GetSet()->isDemo())
&& $this->d3GetSet()->getValue(d3_extsearch_conf::CONF_USEFILTERSINLISTS);
}
return $this->_blUseAlistFilter;
}
/**
* @return d3_xlist_extsearch
*/
public function d3GetXListController()
{
if (false == $this->_oXListController) {
$this->_oXListController = oxNew(d3_xlist_extsearch::class, $this);
}
return $this->_oXListController;
}
/**
* checks if this view can be cached
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function canCache()
{
$canCache = parent::canCache();
return $canCache && $this->d3CanCache();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3CanCache()
{
// need function check, because canCache is called before the filters are reset
return trim(strtolower(Registry::getRequest()->getRequestEscapedParameter('fnc'))) === 'd3clearfilter' ||
((bool) count($this->d3GetXListController()->getAllSelections())) === false;
}
}

View File

@ -0,0 +1,323 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Modules\Application\Controller;
use D3\Extsearch\Modules\Application\Model\d3_oxsearch_extsearch;
use D3\ModCfg\Application\Model\Configuration\d3_cfg_mod;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Application\Model\Search;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
use OxidEsales\Eshop\Application\Controller\SearchController;
use OxidEsales\Eshop\Application\Controller\ArticleListController;
use OxidEsales\Eshop\Application\Controller\VendorListController;
use OxidEsales\Eshop\Application\Controller\ManufacturerListController;
class d3_details_extsearch extends d3_details_extsearch_parent
{
/** @var null|d3_oxsearch_extsearch */
public $oD3SearchHandler = null;
protected $_aSelectedAttributes;
private $_sModId = 'd3_extsearch';
/**
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function getNavigationParams()
{
$aParams = parent::getNavigationParams();
$oController = $this->d3GetBaseController();
$aSearchParams = $oController->getNavigationParams();
$aParams = array_merge($aSearchParams, $aParams);
$this->d3GetSearchHandler()->d3RemoveEmptyParameters($aParams);
return $aParams;
}
/**
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function getAttributeFilters()
{
if (null == $this->_aSelectedAttributes) {
$this->_aSelectedAttributes = $this->d3GetSearchHandler()->getAttributeFilters();
$this->addTplParam('aD3AttribFilters', $this->_aSelectedAttributes);
}
return $this->_aSelectedAttributes;
}
/**
* performance, use a class wide instance
*
* @return d3_oxsearch_extsearch
*/
protected function d3GetSearchHandler(): d3_oxsearch_extsearch
{
if (!$this->oD3SearchHandler) {
/** @var d3_oxsearch_extsearch $searchHandler */
$searchHandler = oxNew(Search::class);
$this->oD3SearchHandler = $searchHandler;
}
return $this->oD3SearchHandler;
}
/**
* @return mixed
*/
public function d3getFilterPageId()
{
switch (strtolower($this->getListType())) {
case 'search':
$sClassNameAdd = 'search##';
$sIdent = md5(rawurlencode(strtolower(Registry::get(Request::class)->getRequestEscapedParameter('searchparam'))));
break;
case 'manufacturer':
$sClassNameAdd = '##';
$sIdent = Registry::get(Request::class)->getRequestEscapedParameter('mnid');
break;
default:
$sClassNameAdd = '##';
$sIdent = Registry::get(Request::class)->getRequestEscapedParameter('cnid');
}
$sPageId = $sClassNameAdd.
Registry::getLang()->getLanguageAbbr()."##".
Registry::getConfig()->getShopId()."##".
$sIdent;
return $sPageId;
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function getDynUrlParams()
{
$sRet = parent::getDynUrlParams();
$oController = $this->d3GetBaseController();
if (method_exists($oController, 'd3GetXListController')) {
$sRet .= $oController->d3GetXListController()->d3AddBaseUrlParams($sRet);
} else {
$sRet .= $oController->d3AddBaseUrlParams($sRet);
}
return $sRet;
}
/**
* @return d3_alist_extsearch|d3_ext_search|d3_manufacturerlist_extsearch|d3_vendorlist_extsearch
*/
public function d3GetBaseController()
{
$sListType = Registry::get(Request::class)->getRequestEscapedParameter('listtype');
if ('search' == $sListType) {
/** @var d3_ext_search|d3_alist_extsearch|d3_manufacturerlist_extsearch|d3_vendorlist_extsearch $oController */
$oController = oxNew(SearchController::class);
} elseif ('vendor' == $sListType) {
$oController = oxNew(VendorListController::class);
} elseif ('manufacturer' == $sListType) {
$oController = oxNew(ManufacturerListController::class);
} else {
$oController = oxNew(ArticleListController::class);
}
return $oController;
}
/**
* Returns page sort identificator. It is used as identificator in session variable aSorting[ident]
*
* @return string
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
*/
public function getSortIdent()
{
if ($this->d3GetSet()->isActive()
&& Registry::get(Request::class)->getRequestParameter('isextsearch') === 'search'
) {
return 'd3extsearch';
} elseif (method_exists(get_parent_class(), 'getSortIdent')) {
return parent::getSortIdent();
} else {
return '';
}
}
/**
* @return d3_cfg_mod
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function d3GetSet()
{
return d3_cfg_mod::get($this->d3getModId());
}
/**
* @return string
*/
private function d3getModId()
{
return $this->_sModId;
}
/**
* checks if this view can be cached
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function canCache()
{
$canCache = parent::canCache();
return $canCache && $this->d3CanCache();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3CanCache()
{
$oController = $this->d3GetBaseController();
return false === method_exists($oController, 'd3GetXListController') ||
((bool) count($oController->d3GetXListController()->getAllSelections())) === false;
}
/**
* Search bread crumb
*
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function getSearchBreadCrumb()
{
return $this->d3ExtendBreadCrumpLink(parent::getSearchBreadCrumb());
}
/**
* Category bread crumb
*
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function getCategoryBreadCrumb()
{
return $this->d3ExtendBreadCrumpLink(parent::getCategoryBreadCrumb());
}
/**
* vendor bread crumb
*
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function getVendorBreadCrumb()
{
return $this->d3ExtendBreadCrumpLink(parent::getVendorBreadCrumb());
}
/**
* @param array $paths
*
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function d3ExtendBreadCrumpLink(array $paths): array
{
$pathKeys = array_keys($paths);
$baseController = $this->d3GetBaseController();
$link = $paths[end($pathKeys)]['link'];
if (method_exists($baseController, 'd3GetXListController')) {
$link .= $baseController->d3GetXListController()->d3AddBaseUrlParams($link);
} else {
$link .= $baseController->d3AddBaseUrlParams($link);
}
$paths[end($pathKeys)]['link'] = $link;
return $paths;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,763 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Modules\Application\Controller;
use D3\Extsearch\Modules\Application\Model\d3_oxsearch_extsearch;
use D3\Extsearch\Application\Controller\d3_xlist_extsearch;
use D3\Extsearch\Application\Model\d3_search;
use D3\Extsearch\Application\Model\Filters\d3Filter;
use D3\Extsearch\Core\d3_extsearch_conf;
use D3\ModCfg\Application\Model\Configuration\d3_cfg_mod;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Application\Model\Manufacturer;
use OxidEsales\Eshop\Application\Model\ManufacturerList;
use OxidEsales\Eshop\Application\Model\VendorList;
use OxidEsales\Eshop\Application\Model\CategoryList;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\FileException;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Registry;
class d3_manufacturerlist_extsearch extends d3_manufacturerlist_extsearch_parent
{
/** @var null|d3_xlist_extsearch */
protected $_oXListController;
private $_blUseAlistFilter;
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function render()
{
$this->d3GetXListController()->render();
return parent::render();
}
/**
* @param Manufacturer $oManufacturer
*
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function loadArticles($oManufacturer)
{
$aRet = parent::loadArticles( $oManufacturer);
[$oArtList, $iArtCnt] = $aRet;
if ($this->_iCntPages || $iArtCnt) {
$this->d3GetXListController()->addAListFilters( $oManufacturer);
}
$this->d3GetXListController()->setTplParams($oArtList);
return $aRet;
}
/**
* @return bool|string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function getSearchCategory()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getCategoryFilter()->getUserSingleSelection();
}
/**
* @return bool|string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function getSearchVendor()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getVendorFilter()->getUserSingleSelection();
}
/**
* @return bool|string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function getSearchManufacturer()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getManufacturerFilter()->getUserSingleSelection();
}
/**
* @param string $sUrl
* @param int $iPage
* @param int|null $iLang
*
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function addPageNrParam($sUrl, $iPage, $iLang = null)
{
if (false == $this->d3UseAlistFilters()) {
return parent::addPageNrParam($sUrl, $iPage, $iLang);
}
$sUrl = parent::addPageNrParam($sUrl, $iPage, $iLang);
$sUrlAdd = $this->getViewDataElement('additionalparams');
if ($sUrlAdd) {
$sUrl .= ((strpos($sUrl, '?') === false) ? '?' : '') . $sUrlAdd;
}
return $sUrl;
}
/**
* returns additional url params for dynamic url building
*
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function getDynUrlParams()
{
$sRet = parent::getDynUrlParams();
if ($this->d3UseAlistFilters()) {
$sRet .= $this->d3GetXListController()->d3AddBaseUrlParams($sRet);
}
return $sRet;
}
/**
* Returns additional URL parameters which must be added to list products urls
*
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function getAddUrlParams()
{
$sAddParams = parent::getAddUrlParams();
if ($this->d3UseAlistFilters()) {
$sAddParams .= $this->d3GetXListController()->d3AddBaseUrlParams($sAddParams);
}
return $sAddParams;
}
/**
* Returns additional URL parameters which must be added to list products seo urls
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function getAddSeoUrlParams()
{
$sAddParams = parent::getAddUrlParams();
if ($this->d3UseAlistFilters()) {
$sAddParams .= $this->d3GetXListController()->d3AddBaseUrlParams($sAddParams);
}
return $sAddParams;
}
/**
* Returns array of params => values which are used in hidden forms and as additional url params
*
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function getNavigationParams()
{
$aParams = parent::getNavigationParams();
$aParams = $this->d3GetXListController()->addNavigationParams($aParams);
return $aParams;
}
/**
* @return string
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
*/
public function getAdditionalParams()
{
$this->_sAdditionalParams = parent::getAdditionalParams();
if ($this->d3GetSet()->isActive()) {
$sSeparator = htmlspecialchars(ini_get('arg_separator.output'));
$this->_sAdditionalParams .= $this->d3GetXListController()->getD3AdditionalParams();
if (!strstr($this->_sAdditionalParams, $sSeparator.'isextsearch=')
&& $this->d3HaveFiltersUserSelection()
) {
$this->_sAdditionalParams .= $sSeparator.'isextsearch=alist';
}
}
return $this->_sAdditionalParams;
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HaveFiltersUserSelection()
{
/** @var d3Filter $oFilter */
foreach ($this->d3GetOwnSearchHandler()->getFilterList() as $oFilter) {
if ($oFilter->hasUserSelection()) {
return true;
}
}
return false;
}
/**
* @return string
*/
public function d3getFilterPageId()
{
return $this->d3GetXListController()->d3getFilterPageId();
}
/**
* @return d3_cfg_mod
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function d3GetSet()
{
return $this->d3GetXListController()->d3GetSet();
}
/**
* @return d3_oxsearch_extsearch
*/
protected function d3GetSearchHandler(): d3_oxsearch_extsearch
{
return $this->d3GetXListController()->d3GetSearchHandler();
}
/**
* @return d3_search
*/
protected function d3GetOwnSearchHandler()
{
return $this->d3GetXListController()->d3GetOwnSearchHandler();
}
/**
* @return CategoryList
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetCategoryList()
{
return $this->d3GetXListController()->d3GetCategoryList();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasCategoryList()
{
return $this->d3GetXListController()->d3HasCategoryList();
}
/**
* @return VendorList
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetVendorList()
{
return $this->d3GetXListController()->d3GetVendorList();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasVendorList()
{
return $this->d3GetXListController()->d3HasVendorList();
}
/**
* @return ManufacturerList
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetManufacturerList()
{
return $this->d3GetXListController()->d3GetManufacturerList();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasManufacturerList()
{
return $this->d3GetXListController()->d3HasManufacturerList();
}
/**
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetAttributeList()
{
return $this->d3GetXListController()->d3GetAttributeList();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasAttributeList()
{
return $this->d3GetXListController()->d3HasAttributeList();
}
/**
* @param $sAttrId
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3AttributeFilterUseMultipleValues($sAttrId)
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getAttributeFilter()->hasUserMultiSelection($sAttrId);
}
/**
* @return array|null
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3CategoryFilterUseMultipleValues()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getCategoryFilter()->getUserMultiSelection();
}
/**
* @return array|null
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3VendorFilterUseMultipleValues()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getVendorFilter()->getUserMultiSelection();
}
/**
* @return array|null
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3ManufacturerFilterUseMultipleValues()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getManufacturerFilter()->getUserMultiSelection();
}
/**
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws FileException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3getPriceSteps()
{
return $this->d3GetXListController()->d3getPriceSteps();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasjQuerySlider()
{
return $this->d3GetXListController()->d3HasjQuerySlider();
}
/**
* @return string
*/
public function d3GetDeselectValue()
{
return $this->d3GetXListController()->d3GetDeselectValue();
}
/**
* @param $sOptionTitle
* @return string
*/
public function d3GetMultipleSelectionTranslation($sOptionTitle)
{
return $this->d3GetXListController()->d3GetMultipleSelectionTranslation($sOptionTitle);
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasFilters()
{
return $this->d3GetXListController()->d3HasFilters();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasPriceFilter()
{
return $this->d3GetXListController()->d3HasPriceFilter();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3CanShowPriceFilterSlider()
{
return $this->d3GetXListController()->d3CanShowPriceFilterSlider();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderInfoMinValue()
{
return $this->d3GetXListController()->d3GetPriceSliderInfoMinValue();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderInfoMaxValue()
{
return $this->d3GetXListController()->d3GetPriceSliderInfoMaxValue();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderInputMinValue()
{
return $this->d3GetXListController()->d3GetPriceSliderInputMinValue();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderInputMaxValue()
{
return $this->d3GetXListController()->d3GetPriceSliderInputMaxValue();
}
/**
* @return float|int
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function d3getPricePrecision()
{
return $this->d3GetXListController()->d3getPricePrecision();
}
/**
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3getPriceLimits()
{
return $this->d3GetXListController()->d3getPriceLimits();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderOriginalMinValue()
{
return $this->d3GetXListController()->d3GetPriceSliderOriginalMinValue();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderOriginalMaxValue()
{
return $this->d3GetXListController()->d3GetPriceSliderOriginalMaxValue();
}
/**
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function d3ClearFilter()
{
$this->d3GetXListController()->d3ClearFilter();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
private function d3UseAlistFilters()
{
if (null === $this->_blUseAlistFilter) {
$this->_blUseAlistFilter = $this->d3GetSet()->isActive()
&& ($this->d3GetSet()->getLicenseConfigData(d3_extsearch_conf::SERIAL_BIT_HAS_FILTERS_IN_ALIST, false) || $this->d3GetSet()->isDemo())
&& $this->d3GetSet()->getValue(d3_extsearch_conf::CONF_USEFILTERSINLISTS);
}
return $this->_blUseAlistFilter;
}
/**
* @return d3_xlist_extsearch
*/
public function d3GetXListController()
{
if (false == $this->_oXListController) {
$this->_oXListController = oxNew(d3_xlist_extsearch::class, $this);
}
return $this->_oXListController;
}
/**
* checks if this view can be cached
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function canCache()
{
$canCache = parent::canCache();
return $canCache && $this->d3CanCache();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3CanCache()
{
// need function check, because canCache is called before the filters are reset
return trim(strtolower(Registry::getRequest()->getRequestEscapedParameter('fnc'))) === 'd3clearfilter' ||
((bool) count($this->d3GetXListController()->getAllSelections())) === false;
}
}

View File

@ -0,0 +1,488 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Modules\Application\Controller;
use D3\Extsearch\Modules\Application\Model\d3_oxarticlelist_extsearch;
use D3\Extsearch\Application\Model\d3_search;
use D3\Extsearch\Application\Model\Filters\d3Filter;
use D3\Extsearch\Core\d3_extsearch_conf;
use D3\ModCfg\Application\Model\Configuration\d3_cfg_mod;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Application\Model\Manufacturer;
use OxidEsales\Eshop\Application\Model\Vendor;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Registry;
use OxidEsales\Eshop\Core\Request;
use OxidEsales\Eshop\Application\Model\Article;
use OxidEsales\Eshop\Application\Model\Category;
use OxidEsales\Eshop\Application\Model\ArticleList;
use OxidEsales\Eshop\Application\Controller\FrontendController;
use stdClass;
class d3_oxlocator_extsearch extends d3_oxlocator_extsearch_parent
{
/** @var null|Article */
protected $_oNextProduct = null;
/** @var null|Article */
protected $_oBackProduct = null;
/** @var array */
protected $_aD3Params = [];
private $_sModId = 'd3_extsearch';
/** @var d3_details_extsearch */
protected $_d3LocatorTarget;
/** @var null|d3_search */
public $oD3OwnSearchHandler;
/**
* @param Article $oCurrArticle
* @param d3_details_extsearch $oLocatorTarget
*/
public function setLocatorData($oCurrArticle, $oLocatorTarget)
{
$this->_d3LocatorTarget = $oLocatorTarget;
parent::setLocatorData($oCurrArticle, $oLocatorTarget);
}
/**
* @param d3_ext_search $oLocatorTarget
* @param Article $oCurrArticle
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function setListLocatorData($oLocatorTarget, $oCurrArticle)
{
parent::setListLocatorData($oLocatorTarget, $oCurrArticle);
/** @var Category|false $oCategory */
$oCategory = $oLocatorTarget->getActiveCategory();
if ($this->d3ExtSearchNeedExtensionForCurrentLocator()
&& $oCategory
) {
$sSeparator = htmlspecialchars(ini_get('arg_separator.output'));
// loading data for article navigation
/** @var d3_oxarticlelist_extsearch $oIdList */
$oIdList = oxNew(ArticleList::class);
if ($oLocatorTarget->showSorting()) {
$oLocatorTarget->getSorting($this->d3GetSortIdent($oLocatorTarget));
$oIdList->setCustomSorting($oLocatorTarget->getSortingSql($this->d3GetSortIdent($oLocatorTarget)));
}
if ($oCategory->isPriceCategory()) {
$oIdList->loadPriceIds($oCategory->getFieldData('oxpricefrom'), $oCategory->getFieldData('oxpriceto'));
} else {
$sActCat = $oCategory->getId();
$oIdList->loadCategoryIds($sActCat, Registry::getSession()->getVariable('session_attrfilter'));
}
//page number
$iPage = $this->findActPageNumber($oLocatorTarget->getActPage(), $oIdList, $oCurrArticle);
$sAddSearch = $this->d3GetSearchUrlAdd();
// setting product position in list, amount of articles etc
$oCategory->__set('iCntOfProd', $oIdList->count());
$oCategory->__set('iProductPos', $this->getProductPos($oCurrArticle, $oIdList, $oLocatorTarget));
$sPageNr = $this->getPageNumber($iPage);
$oCategory->__set('toListLink', $this->makeLink($oCategory->__get('link'), $sPageNr . ($sPageNr ? $sSeparator : '') . $sAddSearch));
$this->_oNextProduct ?
$oCategory->__set('nextProductLink', $this->makeLink($this->_oNextProduct->getLink(), $sAddSearch)) :
null;
$this->_oBackProduct ?
$oCategory->__set('prevProductLink', $this->makeLink($this->_oBackProduct->getLink(), $sAddSearch)) :
null;
$sFormat = Registry::getLang()->translateString('searchResult');
$oLocatorTarget->setSearchTitle(sprintf($sFormat, $this->d3GetParamForSearch('searchparam', true)));
// for compatibility reasons for a while. will be removed in future
$oLocatorTarget->addTplParam('sSearchTitle', $oLocatorTarget->getSearchTitle());
if ($this->d3GetRawUrlParamForSearch('searchparam')) {
$oLocatorTarget->addTplParam('searchparam', $this->d3GetRawUrlParamForSearch('searchparam'));
}
/** @var d3Filter $oFilter */
foreach ($this->d3GetOwnSearchHandler()->getFilterList()->getArray() as $oFilter) {
foreach ($oFilter->getNavigationParameterArray() as $sKey => $sValue) {
$oLocatorTarget->addTplParam($sKey, $sValue);
}
}
if ($this->d3GetParamForSearch('searchparam', true)) {
$oLocatorTarget->addTplParam('searchparamforhtml', $this->d3GetParamForSearch('searchparam', true));
}
if ($this->d3GetParamForSearch('isextsearch', false)) {
$oLocatorTarget->addTplParam('isextseach', Registry::get(Request::class)->getRequestEscapedParameter('isextsearch'));
}
$oCategory->__set('toListLink', $oCategory->__get('toListLink') . $sSeparator.'d3avoiddirectshow=1');
$oLocatorTarget->setActiveCategory($oCategory);
// for compatibility reasons for a while. will be removed in future
$oLocatorTarget->addTplParam('actCategory', $oLocatorTarget->getActiveCategory());
}
}
/**
* @param FrontendController $oLocatorTarget
* @param Article $oCurrArticle
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function setVendorLocatorData($oLocatorTarget, $oCurrArticle)
{
parent::setVendorLocatorData($oLocatorTarget, $oCurrArticle);
/** @var Vendor|false $oVendor */
$oVendor = $oLocatorTarget->getActVendor();
if ($this->d3ExtSearchNeedExtensionForCurrentLocator()
&& $oVendor
) {
$sVendorId = $oVendor->getId();
// loading data for article navigation
$oIdList = oxNew(ArticleList::class);
if ($oLocatorTarget->showSorting()) {
$oIdList->setCustomSorting($oLocatorTarget->getSortingSql($oLocatorTarget->getSortIdent()));
}
$oIdList->loadVendorIDs($sVendorId);
//page number
$iPage = $this->findActPageNumber($oLocatorTarget->getActPage(), $oIdList, $oCurrArticle);
$sAddSearch = $this->d3GetSearchUrlAdd();
// setting product position in list, amount of articles etc
$oVendor->__set('iCntOfProd', $oIdList->count());
$oVendor->__set('iProductPos', $this->getProductPos($oCurrArticle, $oIdList, $oLocatorTarget));
$oVendor->__set('toListLink', $this->makeLink($oVendor->getLink(), $this->getPageNumber($iPage) . $sAddSearch));
$this->_oNextProduct ?
$oVendor->__set('nextProductLink', $this->makeLink($this->_oNextProduct->getLink(), $sAddSearch)) :
null;
$this->_oBackProduct ?
$oVendor->__set('prevProductLink', $this->makeLink($this->_oBackProduct->getLink(), $sAddSearch)) :
null;
$oLocatorTarget->setActiveCategory($oVendor);
}
}
/**
* @param FrontendController $oLocatorTarget
* @param Article $oCurrArticle
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function setManufacturerLocatorData($oLocatorTarget, $oCurrArticle)
{
parent::setManufacturerLocatorData($oLocatorTarget, $oCurrArticle);
/** @var false|Manufacturer $oManufacturer */
$oManufacturer = $oLocatorTarget->getActManufacturer();
if ($this->d3ExtSearchNeedExtensionForCurrentLocator()
&& $oManufacturer
) {
$sManufacturerId = $oManufacturer->getId();
// loading data for article navigation
$oIdList = oxNew(ArticleList::class);
if ($oLocatorTarget->showSorting()) {
$oIdList->setCustomSorting($oLocatorTarget->getSortingSql($oLocatorTarget->getSortIdent()));
}
$oIdList->loadManufacturerIDs($sManufacturerId);
//page number
$iPage = $this->findActPageNumber($oLocatorTarget->getActPage(), $oIdList, $oCurrArticle);
$sAddSearch = $this->d3GetSearchUrlAdd();
// setting product position in list, amount of articles etc
$oManufacturer->__set('iCntOfProd', $oIdList->count());
$oManufacturer->__set('iProductPos', $this->getProductPos($oCurrArticle, $oIdList, $oLocatorTarget));
$oManufacturer->__set('toListLink', $this->makeLink($oManufacturer->getLink(), $this->getPageNumber($iPage). $sAddSearch));
$this->_oNextProduct ?
$oManufacturer->__set('nextProductLink', $this->makeLink($this->_oNextProduct->getLink(), $sAddSearch)) :
null;
$this->_oBackProduct ?
$oManufacturer->__set('prevProductLink', $this->makeLink($this->_oBackProduct->getLink(), $sAddSearch)) :
null;
// active Manufacturer
$oLocatorTarget->setActiveCategory($oManufacturer);
}
}
/**
* @param d3_ext_search $oLocatorTarget
* @param Article $oCurrArticle
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function setSearchLocatorData($oLocatorTarget, $oCurrArticle)
{
if (false == $this->d3ExtSearchNeedExtensionForCurrentLocator()) {
parent::setSearchLocatorData($oLocatorTarget, $oCurrArticle);
return;
}
/** @var Category|stdClass $oSearchCat */
$oSearchCat = $oLocatorTarget->getActSearch();
$sSeparator = htmlspecialchars(ini_get('arg_separator.output'));
// loading data for article navigation
/** @var d3_oxarticlelist_extsearch $oIdList */
$oIdList = oxNew(ArticleList::class);
if ($oLocatorTarget->showSorting()) {
$oLocatorTarget->getSorting($this->d3GetSortIdent($oLocatorTarget));
$oIdList->setCustomSorting($oLocatorTarget->getSortingSql($this->d3GetSortIdent($oLocatorTarget)));
}
$oIdList->loadSearchIds(
$this->d3GetParamForSearch('searchparam', false),
$this->d3GetRawUrlParamForSearch('searchcnid'),
$this->d3GetRawUrlParamForSearch('searchvendor'),
$this->d3GetRawUrlParamForSearch('searchmanufacturer')
);
//page number
$iPage = $this->findActPageNumber($oLocatorTarget->getActPage(), $oIdList, $oCurrArticle);
$sAddSearch = $this->d3GetSearchUrlAdd();
// setting product position in list, amount of articles etc
$oSearchCat->iCntOfProd = $oIdList->count();
$oSearchCat->iProductPos = $this->getProductPos($oCurrArticle, $oIdList, $oLocatorTarget);
$sPageNr = $this->getPageNumber($iPage);
$oSearchCat->toListLink =
$this->makeLink($oSearchCat->link, $sPageNr . ($sPageNr ? $sSeparator : '') . $sAddSearch);
$oSearchCat->nextProductLink =
$this->_oNextProduct ? $this->makeLink($this->_oNextProduct->getLink(), $sAddSearch) : null;
$oSearchCat->prevProductLink =
$this->_oBackProduct ? $this->makeLink($this->_oBackProduct->getLink(), $sAddSearch) : null;
$sFormat = Registry::getLang()->translateString('searchResult');
$oLocatorTarget->setSearchTitle(sprintf($sFormat, $this->d3GetParamForSearch('searchparam', true)));
// for compatibility reasons for a while. will be removed in future
$oLocatorTarget->addTplParam('sSearchTitle', $oLocatorTarget->getSearchTitle());
if ($this->d3GetRawUrlParamForSearch('searchparam')) {
$oLocatorTarget->addTplParam('searchparam', $this->d3GetRawUrlParamForSearch('searchparam'));
}
/** @var d3Filter $oFilter */
foreach ($this->d3GetOwnSearchHandler()->getFilterList() as $oFilter) {
if ($oFilter->hasUserSelection()) {
foreach ($oFilter->getNavigationParameterArray() as $sId => $sValue) {
$oLocatorTarget->addTplParam($sId, $sValue);
}
}
}
if ($this->d3GetParamForSearch('searchparam', true)) {
$oLocatorTarget->addTplParam('searchparamforhtml', $this->d3GetParamForSearch('searchparam', true));
}
$oSearchCat->toListLink = $oSearchCat->toListLink . $sSeparator.'d3avoiddirectshow=1';
$oLocatorTarget->setActiveCategory($oSearchCat);
// for compatibility reasons for a while. will be removed in future
$oLocatorTarget->addTplParam('actCategory', $oLocatorTarget->getActiveCategory());
}
/**
* @param $oLocatorTarget
*
* @return string
*/
public function d3GetSortIdent($oLocatorTarget)
{
if (method_exists($oLocatorTarget, 'getSortIdent')) {
return $oLocatorTarget->getSortIdent();
}
return 'alist';
}
/**
* @param $sParamName
* @param bool $blFormParam
*
* @return mixed
*/
protected function d3GetParamForSearch($sParamName, $blFormParam = false)
{
if (!isset($this->_aD3Params[$sParamName . $blFormParam]) || !$this->_aD3Params[$sParamName . $blFormParam]) {
$this->_aD3Params[$sParamName . $blFormParam] =
$blFormParam ?
Registry::get(Request::class)->getRequestParameter($sParamName) :
Registry::get(Request::class)->getRequestEscapedParameter($sParamName);
}
return $this->_aD3Params[$sParamName . $blFormParam];
}
/**
* @param $sParamName
*
* @return string
*/
protected function d3GetRawUrlParamForSearch($sParamName)
{
return rawurldecode($this->d3GetParamForSearch($sParamName));
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function d3GetSearchUrlAdd()
{
$sSeparator = htmlspecialchars(ini_get('arg_separator.output'));
$sAddSearch = "searchparam=" . $this->d3GetRawUrlParamForSearch('searchparam').$sSeparator;
$sAddSearch .= "listtype=" . $this->_sType.$sSeparator;
$sAddSearch2 = '';
/** @var d3Filter $oFilter */
foreach ($this->d3GetOwnSearchHandler()->getFilterList() as $oFilter) {
$sAddSearch2 .= $oFilter->getNavigationParameterString();
}
if (Registry::get(Request::class)->getRequestEscapedParameter('isextsearch') &&
(strlen($sAddSearch2) || $this->_d3LocatorTarget->getAttributeFilters())
) {
$sAddSearch2 .= $sSeparator."isextsearch=" . Registry::get(Request::class)->getRequestEscapedParameter('isextsearch');
}
return $sAddSearch.$sAddSearch2;
}
/**
* @return string
*/
private function d3getModId()
{
return $this->_sModId;
}
/**
* @return d3_cfg_mod
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
protected function d3GetSet()
{
return d3_cfg_mod::get($this->d3getModId());
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
* @throws StandardException
*/
private function d3UseAlistFilters()
{
return ($this->d3GetSet()->getLicenseConfigData(d3_extsearch_conf::SERIAL_BIT_HAS_FILTERS_IN_ALIST, false)
|| $this->d3GetSet()->isDemo())
&& $this->d3GetSet()->getValue(d3_extsearch_conf::CONF_USEFILTERSINLISTS);
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function d3ExtSearchNeedExtensionForCurrentLocator(): bool
{
if (! $this->d3GetSet()->isActive() //
|| ! method_exists(Registry::getConfig()->getActiveView(), 'getListType')
|| ( //
! $this->d3UseAlistFilters() //
&& Registry::getConfig()->getActiveView()->getListType() != 'search' //
) //
) {
return false;
}
return true;
}
/**
* performance, use a class wide instance
*
* @return d3_search
*/
public function d3GetOwnSearchHandler()
{
if (!$this->oD3OwnSearchHandler) {
$this->oD3OwnSearchHandler = oxNew(d3_search::class);
}
return $this->oD3OwnSearchHandler;
}
}

View File

@ -0,0 +1,763 @@
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
*
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
*
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\Extsearch\Modules\Application\Controller;
use D3\Extsearch\Modules\Application\Model\d3_oxsearch_extsearch;
use D3\Extsearch\Application\Controller\d3_xlist_extsearch;
use D3\Extsearch\Application\Model\d3_search;
use D3\Extsearch\Application\Model\Filters\d3Filter;
use D3\Extsearch\Core\d3_extsearch_conf;
use D3\ModCfg\Application\Model\Configuration\d3_cfg_mod;
use D3\ModCfg\Application\Model\Exception\d3_cfg_mod_exception;
use D3\ModCfg\Application\Model\Exception\d3ShopCompatibilityAdapterException;
use Doctrine\DBAL\Exception as DBALException;
use OxidEsales\Eshop\Application\Model\Vendor;
use OxidEsales\Eshop\Application\Model\ManufacturerList;
use OxidEsales\Eshop\Application\Model\VendorList;
use OxidEsales\Eshop\Application\Model\CategoryList;
use OxidEsales\Eshop\Core\Exception\DatabaseConnectionException;
use OxidEsales\Eshop\Core\Exception\DatabaseErrorException;
use OxidEsales\Eshop\Core\Exception\FileException;
use OxidEsales\Eshop\Core\Exception\StandardException;
use OxidEsales\Eshop\Core\Registry;
class d3_vendorlist_extsearch extends d3_vendorlist_extsearch_parent
{
/** @var null|d3_xlist_extsearch */
protected $_oXListController;
private $_blUseAlistFilter;
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function render()
{
$this->d3GetXListController()->render();
return parent::render();
}
/**
* @param Vendor $oVendor
*
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function loadArticles($oVendor)
{
$aRet = parent::loadArticles( $oVendor);
[$oArtList, $iArtCnt] = $aRet;
if ($this->_iCntPages || $iArtCnt) {
$this->d3GetXListController()->addAListFilters( $oVendor);
}
$this->d3GetXListController()->setTplParams($oArtList);
return $aRet;
}
/**
* @return bool|string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function getSearchCategory()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getCategoryFilter()->getUserSingleSelection();
}
/**
* @return bool|string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function getSearchVendor()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getVendorFilter()->getUserSingleSelection();
}
/**
* @return bool|string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function getSearchManufacturer()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getManufacturerFilter()->getUserSingleSelection();
}
/**
* @param string $sUrl
* @param int $iPage
* @param int|null $languageId
*
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
protected function addPageNrParam($sUrl, $iPage, $languageId = null)
{
if (false == $this->d3UseAlistFilters()) {
return parent::addPageNrParam($sUrl, $iPage, $languageId);
}
$sUrl = parent::addPageNrParam($sUrl, $iPage, $languageId);
$sUrlAdd = $this->getViewDataElement('additionalparams');
if ($sUrlAdd) {
$sUrl .= ((strpos($sUrl, '?') === false) ? '?' : '') . $sUrlAdd;
}
return $sUrl;
}
/**
* returns additional url params for dynamic url building
*
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function getDynUrlParams()
{
$sRet = parent::getDynUrlParams();
if ($this->d3UseAlistFilters()) {
$sRet .= $this->d3GetXListController()->d3AddBaseUrlParams($sRet);
}
return $sRet;
}
/**
* Returns additional URL parameters which must be added to list products urls
*
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function getAddUrlParams()
{
$sAddParams = parent::getAddUrlParams();
if ($this->d3UseAlistFilters()) {
$sAddParams .= $this->d3GetXListController()->d3AddBaseUrlParams($sAddParams);
}
return $sAddParams;
}
/**
* Returns additional URL parameters which must be added to list products seo urls
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function getAddSeoUrlParams()
{
$sAddParams = parent::getAddUrlParams();
if ($this->d3UseAlistFilters()) {
$sAddParams .= $this->d3GetXListController()->d3AddBaseUrlParams($sAddParams);
}
return $sAddParams;
}
/**
* Returns array of params => values which are used in hidden forms and as additional url params
*
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function getNavigationParams()
{
$aParams = parent::getNavigationParams();
$aParams = $this->d3GetXListController()->addNavigationParams($aParams);
return $aParams;
}
/**
* @return string
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
*/
public function getAdditionalParams()
{
$this->_sAdditionalParams = parent::getAdditionalParams();
if ($this->d3GetSet()->isActive()) {
$sSeparator = htmlspecialchars(ini_get('arg_separator.output'));
$this->_sAdditionalParams .= $this->d3GetXListController()->getD3AdditionalParams();
if (!strstr($this->_sAdditionalParams, $sSeparator.'isextsearch=')
&& $this->d3HaveFiltersUserSelection()
) {
$this->_sAdditionalParams .= $sSeparator.'isextsearch=alist';
}
}
return $this->_sAdditionalParams;
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HaveFiltersUserSelection()
{
/** @var d3Filter $oFilter */
foreach ($this->d3GetOwnSearchHandler()->getFilterList() as $oFilter) {
if ($oFilter->hasUserSelection()) {
return true;
}
}
return false;
}
/**
* @return string
*/
public function d3getFilterPageId()
{
return $this->d3GetXListController()->d3getFilterPageId();
}
/**
* @return d3_cfg_mod
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function d3GetSet()
{
return $this->d3GetXListController()->d3GetSet();
}
/**
* @return d3_oxsearch_extsearch
*/
protected function d3GetSearchHandler(): d3_oxsearch_extsearch
{
return $this->d3GetXListController()->d3GetSearchHandler();
}
/**
* @return d3_search
*/
protected function d3GetOwnSearchHandler()
{
return $this->d3GetXListController()->d3GetOwnSearchHandler();
}
/**
* @return CategoryList
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetCategoryList()
{
return $this->d3GetXListController()->d3GetCategoryList();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasCategoryList()
{
return $this->d3GetXListController()->d3HasCategoryList();
}
/**
* @return VendorList
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetVendorList()
{
return $this->d3GetXListController()->d3GetVendorList();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasVendorList()
{
return $this->d3GetXListController()->d3HasVendorList();
}
/**
* @return ManufacturerList
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetManufacturerList()
{
return $this->d3GetXListController()->d3GetManufacturerList();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasManufacturerList()
{
return $this->d3GetXListController()->d3HasManufacturerList();
}
/**
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetAttributeList()
{
return $this->d3GetXListController()->d3GetAttributeList();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasAttributeList()
{
return $this->d3GetXListController()->d3HasAttributeList();
}
/**
* @param $sAttrId
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3AttributeFilterUseMultipleValues($sAttrId)
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getAttributeFilter()->hasUserMultiSelection($sAttrId);
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3CategoryFilterUseMultipleValues()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getCategoryFilter()->hasUserMultiSelection();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3VendorFilterUseMultipleValues()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getVendorFilter()->hasUserMultiSelection();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3ManufacturerFilterUseMultipleValues()
{
return $this->d3GetOwnSearchHandler()->getFilterList()->getManufacturerFilter()->hasUserMultiSelection();
}
/**
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws FileException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3getPriceSteps()
{
return $this->d3GetXListController()->d3getPriceSteps();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasjQuerySlider()
{
return $this->d3GetXListController()->d3HasjQuerySlider();
}
/**
* @return string
*/
public function d3GetDeselectValue()
{
return $this->d3GetXListController()->d3GetDeselectValue();
}
/**
* @param $sOptionTitle
* @return string
*/
public function d3GetMultipleSelectionTranslation($sOptionTitle)
{
return $this->d3GetXListController()->d3GetMultipleSelectionTranslation($sOptionTitle);
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasFilters()
{
return $this->d3GetXListController()->d3HasFilters();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3HasPriceFilter()
{
return $this->d3GetXListController()->d3HasPriceFilter();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3CanShowPriceFilterSlider()
{
return $this->d3GetXListController()->d3CanShowPriceFilterSlider();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderInfoMinValue()
{
return $this->d3GetXListController()->d3GetPriceSliderInfoMinValue();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderInfoMaxValue()
{
return $this->d3GetXListController()->d3GetPriceSliderInfoMaxValue();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderInputMinValue()
{
return $this->d3GetXListController()->d3GetPriceSliderInputMinValue();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderInputMaxValue()
{
return $this->d3GetXListController()->d3GetPriceSliderInputMaxValue();
}
/**
* @return float|int
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function d3getPricePrecision()
{
return $this->d3GetXListController()->d3getPricePrecision();
}
/**
* @return array
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3getPriceLimits()
{
return $this->d3GetXListController()->d3getPriceLimits();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderOriginalMinValue()
{
return $this->d3GetXListController()->d3GetPriceSliderOriginalMinValue();
}
/**
* @return string
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws FileException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3GetPriceSliderOriginalMaxValue()
{
return $this->d3GetXListController()->d3GetPriceSliderOriginalMaxValue();
}
/**
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
*/
public function d3ClearFilter()
{
$this->d3GetXListController()->d3ClearFilter();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
private function d3UseAlistFilters()
{
if (null === $this->_blUseAlistFilter) {
$this->_blUseAlistFilter = $this->d3GetSet()->isActive()
&& ($this->d3GetSet()->getLicenseConfigData(d3_extsearch_conf::SERIAL_BIT_HAS_FILTERS_IN_ALIST, false) || $this->d3GetSet()->isDemo())
&& $this->d3GetSet()->getValue(d3_extsearch_conf::CONF_USEFILTERSINLISTS);
}
return $this->_blUseAlistFilter;
}
/**
* @return d3_xlist_extsearch
*/
public function d3GetXListController()
{
if (! $this->_oXListController) {
$this->_oXListController = oxNew(d3_xlist_extsearch::class, $this);
}
return $this->_oXListController;
}
/**
* checks if this view can be cached
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function canCache()
{
$canCache = parent::canCache();
return $canCache && $this->d3CanCache();
}
/**
* @return bool
* @throws DBALException
* @throws DatabaseConnectionException
* @throws DatabaseErrorException
* @throws StandardException
* @throws d3ShopCompatibilityAdapterException
* @throws d3_cfg_mod_exception
*/
public function d3CanCache()
{
// need function check, because canCache is called before the filters are reset
return trim(strtolower(Registry::getRequest()->getRequestEscapedParameter('fnc'))) === 'd3clearfilter' ||
((bool) count($this->d3GetXListController()->getAllSelections())) === false;
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,12 +1,26 @@
# Extended Search
- 6.x - OXID 6.0 to 6.2
- [for ionCube from PHP 5.6](https://github.com/d3datadevelopment/ExtSearch/tree/rel_6.x_ioncube_from_PHP5.6)
- [for ionCube from PHP 7.1](https://github.com/d3datadevelopment/ExtSearch/tree/rel_6.x_ioncube_from_PHP7.1)
- 7.x - OXID 6.3 to 6.5
- [for ionCube from PHP 7.3](https://github.com/d3datadevelopment/ExtSearch/tree/rel_7.x_ioncube_from_PHP7.3)
- [for SourceGuardian from PHP 8.0](https://github.com/d3datadevelopment/ExtSearch/tree/rel_7.x_sourceGuardian_from_PHP8.0)
- 8.x - OXID 7.x
- [for SourceGuardian from PHP 8.0](https://github.com/d3datadevelopment/ExtSearch/tree/rel_8.x_sourceGuardian_from_PHP8.0)
** main branch left blank **
# DÂł erweiterte Suche fĂĽr OXID eShop
fehlertolerante Suche mit zusätzlichen Filter- und Anzeigemöglichkeiten
## Systemanforderungen:
- installierter OXID eShop
- PHP-Version, fĂĽr die Installationspakete verfĂĽgbar sind
- Installation via Composer
- ionCube Loader oder SourceGuardian
- D3 Modul Connector
Die jeweils geforderten Versionen und sonstige Anforderungen entnehmen Sie bitte der Dokumentation im docs-Verzeichnis dieses Paketes.
## Installation:
Eine detaillierte Installationsanleitung finden Sie im docs-Verzeichnis dieses Pakets.
## weitere Lizenzen und Nutzungsbedingungen
### noUiSlider
(https://github.com/leongersen/noUiSlider/blob/master/LICENSE.md - Stand: 10.11.2023)
```
MIT License
Copyright (c) 2019 LĂ©on Gersen
```

11
assets/.htaccess Normal file
View File

@ -0,0 +1,11 @@
<FilesMatch ".*">
<IfModule mod_authz_core.c>
# Apache 2.4
Require all granted
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
order deny,allow
allow from all
</IfModule>
</FilesMatch>

File diff suppressed because one or more lines are too long

11
assets/out/.htaccess Normal file
View File

@ -0,0 +1,11 @@
<FilesMatch ".*">
<IfModule mod_authz_core.c>
# Apache 2.4
Require all granted
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
order deny,allow
allow from all
</IfModule>
</FilesMatch>

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 B

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,14 @@
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
* https://www.d3data.de
*
* @license
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link https://www.oxidmodule.com
*/
let d3ExtsearchIAS=function(){"use strict";return function(e){let t={sElementId:"IAS_box",sInputElementId:"IAS_input",sCloseElementId:"IAS_closebtn",iPosOffset:10,sLastSelection:"",iDelay:600,oClearWnd:null},n=function(){let e;return window.getSelection?e=window.getSelection():document.getSelection?e=document.getSelection():document.selection&&(e=document.selection.createRange().text),e.toString()},o=function(){console.debug("clear IAS window"),document.querySelector("#"+t.sElementId).style.display="none",t.sLastSelection=""},l=function(e){console.debug("check IAS window"),n()?function(e){console.debug("show IAS window");let o=document.querySelector("#"+t.sElementId),l=document.querySelector("#"+t.sInputElementId);if(o){let c=n();c!==t.sLastSelection&&c.length>0&&(o.style.display="block",o.style.top=e.pageY+t.iPosOffset+"px",o.style.left=e.pageX+t.iPosOffset+"px",l.value=c,t.sLastSelection=c)}}(e):o()};!function(e){console.debug("IAS initialized"),t={...t,...e},console.debug("IAS: set mouse events"),document.querySelector("#"+t.sElementId).addEventListener("mouseup",function(e){e.stopPropagation()}),document.querySelector("body").addEventListener("mouseup",function(e){l(e)}),document.querySelector("#"+t.sCloseElementId).addEventListener("click",function(){o()})}(e)}}();

Some files were not shown because too many files have changed in this diff Show More