- ShopCMS, DataLife Engine, XenForo и другие CMS - помощь и поддержка
- → Highest Reputation Content
Highest Reputation Content
#25878 Слайдер баннеров для ShopCMS
Написано zcz на 18 March 2013 - 01:43 PM
Представляю вашему вниманию новый модуль для организации слайдера.
О модуле:
Данный модуль позволяет создать на сайте слайдер изображения, с возможностью выставления ссылки для определенной картинки и описательного текста.
Модуль писался под заказ.
slider_by_zcz.rar 1.92МБ 129 Количество загрузок:
пример работы: shotshop.ru
#18727 Модуль "Быстрый заказ" by vsupport.club
Написано R.Sergey на 16 April 2012 - 01:24 AM
Получилось вроде неплохо, хотя еще есть кое-что что не мешало бы доделать.
screen.png 615.3К 67 Количество загрузок:
Ну и собственно демонстрация
http://www.youtube.com/watch?v=O_og9Kjl_Yk
Скачать модуль "Быстрый заказ" by vsupport.club
- 7
#35004 Авторизация/регистрация через соц.сети (uLogin)
Написано zcz на 03 November 2016 - 08:22 PM
ВСЕ ГОВОРИМ СПАСИБО stasikons
Собственно и говорить не о чем.
Модуль дает возможность регистрироваться и авторизовываться через соц.сети с помощью сервиса uLogin. ru
Усановка:
Заливаем файлы по своим папкам.
!ВКЛЮЧАЕМ ПРИНУДИТЕЛЬНУЮ ОЧИСТКУ КЕША!
Открываем index.php и находим строчку
if ( in_array($_GET["do"], array( "captcha", "cart", "rss", "compare", "yandex", "invoice_jur", "invoice_phys", "stat", "get_file" ))) {
в конце, после
"get_file"вставляем
, "ulogin"
открываем core/includes/admin/modules.php
перед строкой
array("id"=>"yandex", "name"=>"Яндекс.Маркет" )
ставим
//uLogin array("id"=>"ulogin", "name"=>"Настройки uLogin"), //END uLogin
открываем core/tpl/admin/menu.tpl.html и перед строкой
<table class="adn topj"><tr><td><img src="data/admin/drs.gif" alt=""></td><td width="100%"><a href="{$smarty.const.ADMIN_FILE}?dpt=modules&sub=yandex">{$smarty.const.ADMIN_STRING_YANDEX}</a></td></tr></table>
вставляем
{*uLogin*} <table class="adn topj"><tr><td><img src="data/admin/drs.gif" alt=""></td><td width="100%"><a href="{$smarty.const.ADMIN_FILE}?dpt=modules&sub=ulogin">uLogin</a></td></tr></table> {*END uLogin*}
На удивление, но работа с файлами закончена.
Теперь необходимо зарегистрироваться (если еще не сделали этого) в системе uLogin.ru
Что вам необходимо от этой системы - регистрация, подтверждение сайта и получение уникального ID для работы модуля.
Это я расписывать не буду - там все интуитивно понятно.
После подтверждения сайта и получения уникального ID (выглядит он примерно так 123ba45b), заходим в админку и кликаем по ссылке модуля для его установки и настройки.
Появляться на сайте uLogin, в принципе, нет никакой нужды, т.к. вся настройка модуля (кнопки, язык, доп.поля, и внешний вид) происходит уже у вас в админке.
Наслаждайтесь!
uLogin.rar 53.37К 14 Количество загрузок:
При регистрации берутся логин, имя, фамилия, емейл. Если каких-то из данных не хватает в соц.сети, то uLogin сам предлагает их заполнить.
доп.поля город и страна подключаются в админке (если не включены, то не записываются в базу)
т.е. после регистрации, клиент получает полный доступ ко всем функциям сайта и в дальнейшем может проходить авторизацию как через соц.сеть, так и по логину и паролю.
- 6
#31845 Штатные ошибки ShopCMS, из коробки :).
Написано badisoft на 09 November 2014 - 03:57 PM
================================================
Штатная ошибка. Из-за нее незарегистрированный пользователь не сможет скачать купленный им электронный товар.
В файле core/includes/processor/get_file.php
строку:
$q = db_query("select order_time from ".ORDERS_TABLE." where orderID=".orderID);
нужно заменить на:
$q = db_query("select order_time from ".ORDERS_TABLE." where orderID=".$orderID);
P.S. Чтобы незарегистрированный пользователь мог получить ссылку на электронный товар, нужно в общих настройках админ-панели поставить галочку напротив пункта E-mail отчеты для покупателей
=====================
Нашел ошибку в catalog_extra.php (штатную). Перепутаны таблицы, это вызывает ошибку SQL при удалении варианта характеристики.
Исправление:
#db_query("delete from ".CATEGORY_PRODUCT_OPTIONS_TABLE." where variantID=".$variantid);
db_query("delete from ".CATEGORY_PRODUCT_OPTION_VARIANTS." where variantID=".$variantid);
=============================
Штатная ошибка: При импорте из CSV варианты характеристик, содержащие символы '"<>& двоятся, т.е. создаются столько раз, сколько товаров с таким вариантом характеристики.
Исправление: в функции optOptionValueExists строку
" where optionID=".(int)$optionID." and option_value='".xEscSQL(trim($value_name))."';");
заменяем на
#" where optionID=".(int)$optionID." and option_value='".xEscSQL(trim($value_name))."';");
" where optionID=".(int)$optionID." and option_value='".xToText(trim($value_name))."';");
=============================
Есть в discount_functions.php функция _calculateGeneralPriceDiscount, возвращающая размер скидки в зависимости от суммы заказа. Выглядит она вот так:
function _calculateGeneralPriceDiscount( $orderPrice, $log )
{
$customerID = (int)regGetIdByLogin($log);
$q = db_query("select discount_id, price_range, percent_discount from ".
ORDER_PRICE_DISCOUNT_TABLE." order by price_range " );
$data = array();
while( $row = db_fetch_row($q) ) $data[] = $row;
if ( count($data) != 0 )
{
for( $i=0; $i<count($data)-1; $i++ )
{
if ( $data[$i][ "price_range" ] < $orderPrice
&& $orderPrice < $data[$i+1][ "price_range" ] )
return $data[$i][ "percent_discount" ];
}
if ( $data[ count($data)-1 ][ "price_range" ] < $orderPrice )
return $data[ count($data)-1 ][ "percent_discount" ];
}
return 0;
}
Если сумма заказа совпадает с суммой, от которой начинается новая скидка, то скидка будет ноль .
Т.е. если до 5000руб скидка 4%, а от 5000руб - 5%, то на заказ 4999руб будет скидка 4%, на 5001руб - 5%, а вот на 5000руб - 0% )).
В общем, зачем там такой развесистый код я не понял и заменил на:
function _calculateGeneralPriceDiscount( $orderPrice, $log )
{
$data = db_query("SELECT price_range, percent_discount FROM ".ORDER_PRICE_DISCOUNT_TABLE." ORDER BY price_range");
$discount = 0;
while( $row = db_fetch_row($data) ) if ($row['price_range'] <= $orderPrice) $discount = $row['percent_discount'];
return $discount;
}
===========================
Нашел не ошибку, но весьма странный стиль программирования.
файл cart_functions.php, функция cartGetCartContent()
$costUC = GetPriceProductWithOption( $variants, $shopping_cart_item["productID"] );
$tmp = array(
"productID" => $product["productID"],
...
"costUC" => $costUC,
"cost" => show_price($cart_item["Quantity"]*GetPriceProductWithOption($variants,$shopping_cart_item["productID"])),
...
Зачем вычислять второй раз GetPriceProductWithOption($variants,$shopping_cart_item["productID"]), когда ровно это же число находится в переменной $costUC строкой выше? Оно ведь нифига не бесплатно:
function GetPriceProductWithOption($variants, $productID)
{
$q=db_query("select Price from ".PRODUCTS_TABLE." where productID=".(int)$productID);
$r=db_fetch_row($q);
$base_price = (float)$r[0];
$full_price = (float)$base_price;
foreach($variants as $vars)
{
$q1=db_query("select price_surplus from ".PRODUCTS_OPTIONS_SET_TABLE.
" where productID=".(int)$productID." AND variantID=".(int)$vars);
$r1=db_fetch_row($q1);
$full_price += $r1["price_surplus"];
}
return $full_price;
}
т.е. при десяти возможных вариантах получаем лишних 11 SQL-запросов.
А если посмотреть, то и вообще всю функцию GetPriceProductWithOption можно заменить на "двухзапросную". Первым запросом получаем базовую цену, вторым - изменение от базовой для переданного набора вариантов.
function GetPriceProductWithOption($variants, $productID)
{
$row=db_fetch_assoc(db_query("SELECT Price FROM ".PRODUCTS_TABLE." WHERE productID=$productID LIMIT 1"));
if (!$variants) return $row['Price'];
$row1=db_fetch_assoc(db_query("SELECT SUM(price_surplus) AS price_surplus FROM ".PRODUCTS_OPTIONS_SET_TABLE." WHERE productID=$productID AND variantID IN (".implode(',',$variants).")"));
return $row['Price']+$row1['price_surplus'];
}
=================================
На этот раз ошибка ни на что не влияющая, но прикольная .
файл product_functions.php
функция GetExtraParametrs
в SQL-запросе чудный текст (два раза повторяется одно условие):
WHERE povvt.optionID='.$_Row['optionID'].' AND post.productID='.$_Row['productID'].' AND povvt.optionID='.$_Row['optionID']
==================================
Ошибка: штатный и аж четыре раза встречающийся в index.php код совершенно бессмысленен:
if ($smarty -> get_template_vars("main_content_template") == ("category.tpl.html" || "category_search_result.tpl.html"))
Это кусок условия вывода блоков. Левого, правого, верхнего, нижнего. Четыре одинаковых куска кода.
Правильно так:
if ($smarty -> get_template_vars("main_content_template") == "category.tpl.html" || get_template_vars("main_content_template") == "category_search_result.tpl.html")
==================================
Не ошибка. Просто заменяем многострочное извращение с ob_start() на var_export(), появившийся в PHP5
Снимает проблему "белого экрана" в некоторых редких случаях.
function db_query($s) //database query
[...]
/*
ob_start();
var_dump($_GET);
var_dump($_POST);
$tmpa=ob_get_contents();
ob_end_clean();
$out .= $tmpa;
*/
$out .= var_export($_REQUEST,true);
====================================
Аналогично.
function error_reporting_log($error_num, $error_var, $error_file, $error_line) {
[...]
/*
ob_start();
var_dump($_GET);
var_dump($_POST);
$tmpa = ob_get_contents();
ob_end_clean();
$out .= $tmpa;
*/
$out .= var_export($_REQUEST,true);
========================================
Если разрешено задавать количество товара при добавлении в корзину (опция "Разрешить указывать количество товара для добавления в корзину"), а у товара задана не единица в минимальном заказе (скажем, купить можно начиная от N штук), то при задании в окошке выбранного количества числа M получим в корзине не М товаров, а M+N-1. Происходит это потому, что товар добавляется поштучно в цикле от 1 до M (см. shopping_cart.php)
for ($mcn=0; $mcn<$_GET["multyaddcount"]; $mcn++) cartAddToCart( $_GET["add2cart"], $variants );
но при каждом "поштучном" добавлении происходит проверка корзины и если товара там еще нет (первое добавление), то добавляется не 1, а N (см. cart_functions.php, cartAddToCart)
$count_to_order = 1;
....
if ( $item_index == -1 ) $count_to_order = $min_order_amount;
....
db_query("UPDATE ".SHOPPING_CARTS_TABLE." SET Quantity=".(int)$count_to_order....
Решение:
1. в файле cart_functions.php в функции cartAddToCart заменяем
return true;
на
return $count_to_order;
все равно нигде (ни в одном месте из двух ) не проверяется, что вернула эта функция.
2. в файле cart.php находим строку cartAddToCart
и заменяем
for ( $mcn = 0; $mcn < $_GET["multyaddcount"]; $mcn++ )
cartAddToCart(( int ) $_GET["addproduct"], $variants);
на
for ( $mcn = 0; $mcn < $_GET["multyaddcount"]; $mcn+=$added )
if (!$added = cartAddToCart(( int ) $_GET["addproduct"], $variants)) break;
3. в файле shopping_cart.php находим строку cartAddToCart
и заменяем
for ($mcn=0; $mcn<$_GET["multyaddcount"]; $mcn++) cartAddToCart( $_GET["add2cart"], $variants );
на
for ($mcn=0; $mcn<$_GET["multyaddcount"]; $mcn+=$added) if (!$added = cartAddToCart( $_GET["add2cart"], $variants )) break;
============================================
В модулях курьерской доставки (файлы class.courier2.php и class.courier.php) SQL-таблица SS__courier_rates не имеет префикса, т.е. при двух и более сайтах в одной SQL-базе могут быть проблемы,
т.к. при удалении этого модуля доставки таблица чистится либо удаляется.
============================================
Не ошибка, просто упрощаем код:
1. в файле cart.php
заменяем
if ( isset ( $_SESSION["log"] ))
//taking products from database
{
$q = db_query("select itemID, Quantity FROM ".SHOPPING_CARTS_TABLE." WHERE customerID=".( int ) regGetIdByLogin($_SESSION["log"]));
while ( $row = db_fetch_row($q)) {
$q1 = db_query("select productID from ".SHOPPING_CART_ITEMS_TABLE." where itemID=".( int ) $row["itemID"]);
$r1 = db_fetch_row($q1);
$variants = GetConfigurationByItemId($row["itemID"]);
$k += GetPriceProductWithOption($variants, $r1["productID"]) * $row["Quantity"];
$cnt += $row["Quantity"];
}
}
else
if ( isset ( $_SESSION["gids"] ))
//...session vars
{
for ( $i = 0; $i < count($_SESSION["gids"]); $i++ ) {
if ( $_SESSION["gids"][$i] ) {
$t = db_query("select Price FROM ".PRODUCTS_TABLE." WHERE productID=".( int ) $_SESSION["gids"][$i]);
$rr = db_fetch_row($t);
$sum = $rr["Price"];
// $rr["Price"]
foreach ( $_SESSION["configurations"][$i] as $varconf ) {
$q1 = db_query("select price_surplus from ".PRODUCTS_OPTIONS_SET_TABLE." where variantID=".( int ) $varconf." AND productID=".( int ) $_SESSION["gids"][$i]);
$r1 = db_fetch_row($q1);
$sum += $r1["price_surplus"];
}
$k += $_SESSION["counts"][$i] * $sum;
$cnt += $_SESSION["counts"][$i];
}
}
}
на
$k = $resCart["total_price"];
#$k = $resCart["total_price"] - $resDiscount["discount_standart_unit"]; // если хотим видеть в корзине сумму сразу со скидкой
foreach ($resCart["cart_content"] as $rc) $cnt += $rc["quantity"];
2. в файле shopping_cart_info.php
заменяем
if (isset($_SESSION["log"])) //taking products from database
{
$q = db_query("select itemID, Quantity FROM ".SHOPPING_CARTS_TABLE.
" WHERE customerID=".regGetIdByLogin($_SESSION["log"]));
while ($row = db_fetch_row($q))
{
$q1=db_query("select productID from ".SHOPPING_CART_ITEMS_TABLE.
" where itemID=".$row["itemID"]);
$r1=db_fetch_row($q1);
if($r1["productID"]){
$variants=GetConfigurationByItemId( $row["itemID"] );
$k += GetPriceProductWithOption($variants, $r1["productID"])*$row["Quantity"];
$cnt+=$row["Quantity"];
}
}
}
else
if (isset($_SESSION["gids"])) //...session vars
{
for ($i=0; $i<count($_SESSION["gids"]); $i++)
{
if ($_SESSION["gids"][$i])
{
$t = db_query("select Price FROM ".PRODUCTS_TABLE." WHERE productID=".(int)$_SESSION["gids"][$i]);
$rr = db_fetch_row($t);
$sum=$rr["Price"];
// $rr["Price"]
foreach( $_SESSION["configurations"][$i] as $vars )
{
$q1=db_query("select price_surplus from ".PRODUCTS_OPTIONS_SET_TABLE.
" where variantID=".(int)$vars." AND productID=".(int)$_SESSION["gids"][$i]);
$r1=db_fetch_row($q1);
$sum+=$r1["price_surplus"];
}
$k += $_SESSION["counts"][$i]*$sum;
$cnt += $_SESSION["counts"][$i];
}
}
}
на
$resCart = cartGetCartContent();
$k = $resCart["total_price"];
#$resDiscount = dscCalculateDiscount($resCart["total_price"], isset ( $_SESSION["log"] ) ? $_SESSION["log"] : ""); // если хотим видеть в корзине сумму сразу со скидкой
#$k = $resCart["total_price"] - $resDiscount["discount_standart_unit"];
foreach ($resCart["cart_content"] as $rc) $cnt += $rc["quantity"];
=============================================
Не ошибка, хотя как посмотреть. Дополнение резко сокращает количество SQL-запросов при сохранении настроек товаров и категорий. Актуально для сайтов с большим количеством категорий. Например, штатно на тысяче категорий будет 16тысяч (!!!) SQL-запросов. Здесь, насколько я помню, четыре запроса не зависимо от количества категорий.
Установка:
В файле category_functions.php
1. в функции update_psCount
строку
update_pCount($parent);
заменяем на
update_pCount_new($parent);
2. куда-нибудь рядом добавляем две функции
function update_sCount_new($parent, $counts = array(1 => array ('subcats' => 0,'admin_count' => 0,'customer_count' => 0)))
{
global $mc;
foreach (array_keys ($mc,(int)$parent) as $val)
{
$counts[$val]['subcats'] = count(array_keys($mc, $val));
$counts[$val]['admin_count'] = 0;
$counts[$val]['customer_count'] = 0;
if ($counts[$val]['subcats']) $counts = update_sCount_new($val,$counts);
}
return $counts;
}
function update_pCount_new($parent)
{
global $fc;
$qstr = array(
"SELECT categoryID, COUNT(*) AS admcount, COUNT(NULLIF(enabled,0)) AS count FROM ".PRODUCTS_TABLE." GROUP BY categoryID",
"SELECT pc.categoryID, COUNT(*) AS admcount, COUNT(NULLIF(enabled,0)) AS count FROM ".CATEGORIY_PRODUCT_TABLE." AS pc JOIN ".PRODUCTS_TABLE." USING (productID) GROUP BY pc.categoryID");
$counts = update_sCount_new($parent);
foreach ($qstr as $str)
{
$data = db_query($str);
while ($row=db_fetch_assoc($data))
{
$categoryID = (int)$row['categoryID'];
while ($categoryID)
{
$counts[$categoryID]['admin_count'] += (int)$row['admcount'];
$counts[$categoryID]['customer_count'] += (int)$row['count'];
$categoryID = $fc[$categoryID]['parent'];
}
}
}
$data = db_query("SELECT categoryID, subcount, products_count, products_count_admin FROM ".CATEGORIES_TABLE);
while ($row = db_fetch_assoc($data))
{
$categoryID = (int)$row['categoryID'];
if ((int)$row['subcount'] != $counts[$categoryID]['subcats'] || (int)$row['products_count'] != $counts[$categoryID]['customer_count'] || (int)$row['products_count_admin'] != $counts[$categoryID]['admin_count'])
db_query("UPDATE ".CATEGORIES_TABLE." SET subcount=".$counts[$categoryID]['subcats'].", products_count=".$counts[$categoryID]['customer_count'].", products_count_admin=".$counts[$categoryID]['admin_count']." WHERE categoryID=$categoryID");
}
}
- 6
#30142 Еще один фильтр. Теперь на AJAX.
Написано badisoft на 09 March 2014 - 06:01 PM
Традиционное спасибо всем, кто помогал мне (явно или путем сообщения об ошибках) в предыдущем фильтре. Без него не было бы этого.Советы, рекомендации, пожелания, сообщения об ошибках продолжают приветствоваться.
Краткое описание:
-----------------
- Как и предыдущий этот фильтр не требует в каждой категории задавать список разрешенных к показу характеристик, а строит этот список сам суммируя характеристики всех товаров категории.
- Как и предыдущий этот фильтр работает ТОЛЬКО с характеристиками товаров, заданными в виде вариантов характеристик. Т.е. с характеристиками в виде текстовой строки этот фильтр НЕ РАБОТАЕТ.
- При установке-снятии галки на лету меняются количественные показатели у остальных вариантов выбора.
Варианты с "нулевым" количеством товаров дизаблятся.
- При перемещении движка цен аналогично, но "нулевые" варианты не дизаблятся, а убираются.
- выборка товаров (показ результата работы фильтра) делается сразу по нажатию любой галки.Точнее, по изменению любого элемента формы, т.е. галки чекбокса, движков, вида сортировки, количества товаров на странице. Но это отключаемо и изначально отключено (галка "Автопоказ").
- Я не стал (пока?) делать в этом фильтре изыски предыдущего (тип выбора - чекбосы, строка, селект, движки ).
По фактам установки предыдущего фильтра у меня сложилось уверенное впечатление, что никто этими возможностями не пользуется кроме заказчика возможности . А все остальные просто оставляют дефолтовые чекбоксы, это самое удобное.
По сути, преимуществ перед штатным у этого фильтра всего два - выбор более одного варианта для характеристики и получение результата тут же, без нажатия кнопки "Показать" и перезагрузки страницы.
Ну а задание показа/непоказа характеристик в кратком/полном описаниях, бывшее в предыдущем фильтре и вообще к фильтру не относится, есть отдельный модуль на эту тему.
Установка проста до безобразия:
-------------------------------
1. копируем файлы (они не совпадают по имени со штатными, можно смело копировать).
filter.php -> core/includes/processor/
filter.tpl.html -> core/tpl/user/[шаблон]/
filter_new.tpl.html -> core/tpl/user/[шаблон]/blocks
jquery.blockui.js -> data/[шаблон]/
jquery.form.js -> data/[шаблон]/
loading.gif -> data/[шаблон]/
2. В head.tpl.html вписываем линки на jquery-ui и css от него. Ну и на сам jquery, если он еще не вписан
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
3. в файле index.php
строку
if ( in_array($_GET["do"], array( "captcha", "cart", "rss", "compare", "yandex", "invoice_jur", "invoice_phys", "stat", "get_file" ))) {
заменяем на
# BEGIN filter-ajax
#if ( in_array($_GET["do"], array( "captcha", "cart", "rss", "compare", "yandex", "invoice_jur", "invoice_phys", "stat", "get_file" ))) {
if ( in_array($_GET["do"], array( "captcha", "cart", "rss", "compare", "yandex", "invoice_jur", "invoice_phys", "stat", "get_file", "filter" ))) {
# END filter-ajax
4. в файле index.tpl.html задаем, куда и как выводить результат работы фильтра,
замещающий все содержимое блока с id="filterResult".
Например, если строки
{* вывод центральной страницы *}
{include file="$main_content_template"}
заменить на
<div id="filterResult">
{* вывод центральной страницы *}
{include file="$main_content_template"}
</div>
то список отфильтрованного выведется вместо основного содержимого сайта, но верхние и нижние блоки останутся.
А если заменить
{* верхние блоки *}
{include file="blocks.tpl.html" binfo=$top_blocks bclass="hdbtop" balign="left"}
{* вывод центральной страницы *}
{include file="$main_content_template"}
{* нижние блоки *}
{include file="blocks.tpl.html" binfo=$bottom_blocks bclass="hdbtop" balign="left"}
на
<div id="filterResult">
{* верхние блоки *}
{include file="blocks.tpl.html" binfo=$top_blocks bclass="hdbtop" balign="left"}
{* вывод центральной страницы *}
{include file="$main_content_template"}
{* нижние блоки *}
{include file="blocks.tpl.html" binfo=$bottom_blocks bclass="hdbtop" balign="left"}
</div>
то список отфильтрованного заместит все центральное содержимое.
5. Создаем в "Управлении блоками" через "Добавить блок из файла" новый блок из файла filter_new.tpl.html
Посмотреть, как это работает можно на http://cpu.badisoft.ru - слева ниже большой красной кнопки "мобильная версия" есть блок "Новый фильтр на Аяксе" и в нем кнопка "Развернуть".
Прикрепленные файлы
- filter-ajax.zip 32.19К 170 Количество загрузок:
- 6
#29943 Другой шаблон при заходе с мобильного
Написано badisoft на 12 February 2014 - 08:55 PM
Расположение мобильного шаблона штатное: tpl.html-файлы в core/tpl/user/[имя шаблона], а остальной набор данных (js, css, картинки) - при необходимости - в data/[имя шаблона].
Спонсор дополнения: kery
Установка:
=========
1. копируем файлы
addon.php -> core/includes/admin/
is_mobile.php -> core/functions/
2. создаем каталог core/cache/mobile/
3. в файле index.php
3.1 после строки
$smarty = new Smarty;
вставляем
# BEGIN Mobile-template
if (isset($_GET['mobile_template'])) $_SESSION['mobile_template'] = ($_GET['mobile_template'] == 'yes');
if (!isset($_SESSION['mobile_template'])) $_SESSION['mobile_template'] = is_mobile();
if ($_SESSION['mobile_template'])
{
$smarty->compile_dir = 'core/cache/mobile';
$smarty->cache_dir = 'core/cache/mobile';
}
# END Mobile-template
3.2 вместо строки
if (isset($_SESSION["CUSTOM_DESIGN"]))
вставляем
# BEGIN Mobile-template
# if (isset($_SESSION["CUSTOM_DESIGN"]))
if ($_SESSION['mobile_template'])
{
$smarty->template_dir = "core/tpl/user/".CONF_MOBILE_TEMPLATE;
define('TPL', CONF_MOBILE_TEMPLATE);
}
elseif (isset($_SESSION["CUSTOM_DESIGN"]))
# BEGIN Mobile-template
4. Заходим в админку. Это нужно, чтобы чтобы отработал файл addon.php и создалась настройка выбора "мобильного" шаблона.
В админке в "Общих настройках" появится возможность задать еще один шаблон - для показа мобильным устройствам.
Принудительная смена шаблона происходит путем GET-запроса mobile_template=yes или mobile_template=no
Например, путем создания ссылки <a href="/?mobile_template=no">Обычная версия сайта</a> в мобильной версии.
В комплекте идут три совершенно не отлаженных мобильных минимум-миниморум шаблончика на jquery-mobile, найденные в инете. Они не имеют ни малейшего отношения к товарному наполнению и тематике сайта и добавлены просто для понимания, как все это работает.
Прикрепленные файлы
- Mobile-template.zip 240.7К 70 Количество загрузок:
- 6
#27366 Картинки "Скидка", "Топ продаж", "Акция", "Новинк...
Написано badisoft на 10 July 2013 - 11:12 PM
Ну и сортировать по этому критерию, как же без этого. Хотя и примитивненько, без красоты и изыска .
Cпонсор дополнения: wwwsasa2, автор картинок (и спонсор предыдущего похожего дополнения) poloskun
Установка:
----------
1. файлы *.png копируем в каталог /data/[шаблон]/
Файлы весьма условные. Тестовые. Для красоты создайте свои. Лишь бы они были 46х62px, либо надо поправить соответствующие width и height в коде.
3. в файле catalog_products_categories.php
3.1 перед строкой
$callBackParam = array();
вставляем
# BEGIN New-Top-Action-products
if (!db_fetch_row(db_query("SHOW COLUMNS FROM ".PRODUCTS_TABLE." LIKE 'newtopact'"))) db_query("ALTER TABLE ".PRODUCTS_TABLE." ADD newtopact tinyint(1) DEFAULT 0");
# END New-Top-Action-products
3.2 вместо строк
//save changes in current category
$data = ScanPostVariableWithId( array( "price", "enable", "left", "sort_order" ) );
вставляем
//save changes in current category
# BEGIN New-Top-Action-products
#$data = ScanPostVariableWithId( array( "price", "enable", "left", "sort_order" ) );
$data = ScanPostVariableWithId( array( "price", "enable", "left", "sort_order", "newtopact" ) );
# END New-Top-Action-products
3.3 перед ВТОРОЙ (!) найденной строкой
if ( isset($val["enable"]) )
вставляем
# BEGIN New-Top-Action-products
if ( isset($val["newtopact"]) ) db_query( "update ".PRODUCTS_TABLE." set newtopact=".(int)$val["newtopact"]." WHERE productID=".(int)$key );
# END New-Top-Action-products
4. в файле category.php
перед строкой
$smarty->assign( "categoryID", $categoryID);
вставляем
# BEGIN New-Top-Action-products
$smarty->assign( "pictures", array("","new.png","top.png","action.png","discount.png"));
# END New-Top-Action-products
5. в файле product_detailed.php
перед строкой
$smarty->assign("main_content_template", "product_detailed.tpl.html");
вставляем
# BEGIN New-Top-Action-products
$smarty->assign( "pictures", array("","new.png","top.png","action.png","discount.png"));
# END New-Top-Action-products
6. в файле product_functions.php
6.2 в функции prdSearchProductByTemplateAdmin
6.2.1 после строк
$order_by_clause = " order by ".xEscSQL($callBackParam["sort"])." DESC ";
}
вставляем
# BEGIN New-Top-Action-products
elseif ($callBackParam["sort"] == "newtopact") $order_by_clause = " ORDER BY newtopact DESC, sort_order";
# END New-Top-Action-products
6.2.2 вместо строки
" customers_rating, Price, in_stock, ".
вставляем
# BEGIN New-Top-Action-products
#" customers_rating, Price, in_stock, ".
" customers_rating, Price, in_stock, newtopact, ".
# END New-Top-Action-products
6.3 в функции prdSearchProductByTemplate
6.3.1 после строк
$order_by_clause = " order by ".xEscSQL($callBackParam["sort"])." DESC ";
}
вставляем
# BEGIN New-Top-Action-products
elseif ($callBackParam["sort"] == "new") $order_by_clause = " ORDER BY newtopact=1 DESC, sort_order";
elseif ($callBackParam["sort"] == "top") $order_by_clause = " ORDER BY newtopact=2 DESC, sort_order";
elseif ($callBackParam["sort"] == "act") $order_by_clause = " ORDER BY newtopact=3 DESC, sort_order";
elseif ($callBackParam["sort"] == "dis") $order_by_clause = " ORDER BY newtopact=4 DESC, sort_order";
# END New-Top-Action-products
6.3.2 вместо строки
" customers_rating, Price, in_stock, ".
вставляем
# BEGIN New-Top-Action-products
#" customers_rating, Price, in_stock, ".
" customers_rating, Price, in_stock, newtopact, ".
# END New-Top-Action-products
7. в файле catalog_products_categories.tpl.html
7.1 после строки
<td align="center"><a href='{$urlToSort}&sort=viewed_times&sort_dir=DESC' title="{$smarty.const.ADMIN_ADMIN_MENUNEW10}" class="liv">VT</a></td>
вставляем
{* BEGIN New-Top-Action-products *}
<td align="center"><a href='{$urlToSort}&sort=newtopact' title="Сортировка по Акция/Топ/Новинка/Скидка" class="liv">Доп.Картинка</a></td>
{* END New-Top-Action-products *}
7.2 после строки
<td align="center" {if !$products[i].enabled}class="toph3 gryy"{else}class="toph3"{/if}>{$products[i].viewed_times}</td>
вставляем
{* BEGIN New-Top-Action-products *}
<td align="center">
<select name="newtopact_{$products[i].productID}">
<option value="0"{if $products[i].newtopact==0} selected{/if}>---</option>
<option value="1"{if $products[i].newtopact==1} selected{/if}>Новинка</option>
<option value="2"{if $products[i].newtopact==2} selected{/if}>Топ продаж</option>
<option value="3"{if $products[i].newtopact==3} selected{/if}>Акция</option>
<option value="4"{if $products[i].newtopact==4} selected{/if}>Скидка</option>
</select>
</td>
{* END New-Top-Action-products *}
8. в файле category.tpl.html
вместо строк (таких строк обычно две, в начале страницы и в конце)
<td class="cattop" align="center">{$string_product_sort}</td>
вставляем
{* BEGIN New-Top-Action-products *}
{*<td class="cattop" align="center">{$string_product_sort}</td>*}
<td class="cattop" align="center">{$string_product_sort}
<a href="index.php?categoryID={$categoryID}&sort=new">(Новинки)</a>
<a href="index.php?categoryID={$categoryID}&sort=top">(Топ продаж)</a>
<a href="index.php?categoryID={$categoryID}&sort=act">(Акции)</a>
<a href="index.php?categoryID={$categoryID}&sort=dis">(Скидки)</a>
</td>
{* END New-Top-Action-products *}
9. в файле product_brief.tpl.html
вместо строки (в случае картинки справа)
<td class="imboxr"><a href="{if $smarty.const.CONF_MOD_REWRITE eq 1}product_{$product_info.productID}.html{else}index.php?productID={$product_info.productID}{/if}"><img src="data/small/{$product_info.picture}" alt="{$product_info.name}"></a></td>
вставляем
{* BEGIN New-Top-Action-products *}
{*<td class="imboxr"><a href="{if $smarty.const.CONF_MOD_REWRITE eq 1}product_{$product_info.productID}.html{else}index.php?productID={$product_info.productID}{/if}"><img src="data/small/{$product_info.picture}" alt="{$product_info.name}"></a></td>*}
<td class="imboxr">
{if $product_info.newtopact > 0}
<div style="position: relative;">
<div style="position: absolute; z-index: 1; top: 0px; left: 0px; background:url('data/{$smarty.const.TPL}/{$pictures[$product_info.newtopact]}'); height: 62px; width: 46px;">
<a href="{if $smarty.const.CONF_MOD_REWRITE eq 1}product_{$product_info.productID}.html{else}index.php?productID={$product_info.productID}{/if}">
<img src="data/{$smarty.const.TPL}/pixel.gif" width="46" height="62">
</a>
</div>
<a href="{if $smarty.const.CONF_MOD_REWRITE eq 1}product_{$product_info.productID}.html{else}index.php?productID={$product_info.productID}{/if}">
<img src="data/small/{$product_info.picture}" alt="{$product_info.name}">
</a>
</div>
{else}
<a href="{if $smarty.const.CONF_MOD_REWRITE eq 1}product_{$product_info.productID}.html{else}index.php?productID={$product_info.productID}{/if}">
<img src="data/small/{$product_info.picture}" alt="{$product_info.name}">
</a>
{/if}
</td>
{* END New-Top-Action-products *}
вместо строки (в случае картинки слева)
<td class="imboxl"><a href="{if $smarty.const.CONF_MOD_REWRITE eq 1}product_{$product_info.productID}.html{else}index.php?productID={$product_info.productID}{/if}"><img src="data/small/{$product_info.picture}" alt="{$product_info.name}"></a></td>
вставляем
{* BEGIN New-Top-Action-products *}
{*<td class="imboxl"><a href="{if $smarty.const.CONF_MOD_REWRITE eq 1}product_{$product_info.productID}.html{else}index.php?productID={$product_info.productID}{/if}"><img src="data/small/{$product_info.picture}" alt="{$product_info.name}"></a></td>*}
<td class="imboxl">
{if $product_info.newtopact > 0}
<div style="position: relative;">
<div style="position: absolute; z-index: 1; top: 0px; left: 0px; background:url('data/{$smarty.const.TPL}/{$pictures[$product_info.newtopact]}'); height: 62px; width: 46px;">
<a href="{if $smarty.const.CONF_MOD_REWRITE eq 1}product_{$product_info.productID}.html{else}index.php?productID={$product_info.productID}{/if}">
<img src="data/{$smarty.const.TPL}/pixel.gif" width="46" height="62">
</a>
</div>
<a href="{if $smarty.const.CONF_MOD_REWRITE eq 1}product_{$product_info.productID}.html{else}index.php?productID={$product_info.productID}{/if}">
<img src="data/small/{$product_info.picture}" alt="{$product_info.name}">
</a>
</div>
{else}
<a href="{if $smarty.const.CONF_MOD_REWRITE eq 1}product_{$product_info.productID}.html{else}index.php?productID={$product_info.productID}{/if}">
<img src="data/small/{$product_info.picture}" alt="{$product_info.name}">
</a>
{/if}
</td>
{* END New-Top-Action-products *}
10. в файле product_detailed.tpl.html
10.1 после строки
hs.lang.fullExpandTitle = '{$smarty.const.STRING_HS_FULLEXPANDTITLE}';
вставляем
{* BEGIN New-Top-Action-products *}
hs.headingEval = 'this.thumb.alt';
{* END New-Top-Action-products *}
10.2 ищем строку class="imboxr" (либо "imboxl" для картинки слева) и чуть ниже вместо строки
{if $product_info.big_picture} <a href="data/big/{$product_info.big_picture}" class="highslide" onclick="return hs.expand(this)"><img src="data/medium/{$product_info.thumbnail}" alt="{$product_info.name}" id="{$product_info.big_picture}"></a>{*
вставляем
{* BEGIN New-Top-Action-products *}
{*{if $product_info.big_picture}<a href="data/big/{$product_info.big_picture}" class="highslide" onclick="return hs.expand(this)"><img src="data/medium/{$product_info.thumbnail}" alt="{$product_info.name}" id="{$product_info.big_picture}"></a>*}
{if $product_info.big_picture}
{if $product_info.newtopact > 0}
<div style="position: relative;">
<div style="position: absolute; z-index: 1; top: 0px; left: 0px; background:url('data/{$smarty.const.TPL}/{$pictures[$product_info.newtopact]}'); height: 62px; width: 46px;">
<img src="data/{$smarty.const.TPL}/pixel.gif" width="46" height="62">
</div>
<a href="data/big/{$product_info.big_picture}" class="highslide" onclick="return hs.expand(this)"><img src="data/medium/{$product_info.thumbnail}" alt="<img src='data/{$smarty.const.TPL}/{$pictures[$product_info.newtopact]}'>" id="{$product_info.big_picture}"></a>
</div>
{else}
<a href="data/big/{$product_info.big_picture}" class="highslide" onclick="return hs.expand(this)"><img src="data/medium/{$product_info.thumbnail}" alt="{$product_info.name}" id="{$product_info.big_picture}"></a>
{/if}
{* END New-Top-Action-products *}{*
Пункты (9) и (10) приведены для дефолтового шаблона. В других шаблонах html-код может (и наверняка будет!) отличаться, так что придется проявить смекалку.
Прикрепленные файлы
- action.png 3.31К 99 Количество загрузок:
- discount.png 3.76К 100 Количество загрузок:
- new.png 2.77К 98 Количество загрузок:
- top.png 2.65К 79 Количество загрузок:
- 6
#26827 Расширенное управление характеристиками товаров
Написано micehide на 01 June 2013 - 05:54 PM
Актуально для версии ShopCMS 3.1.2
extra_features_v1.0.jpg 107.63К 230 Количество загрузок:
Список изменений:
- Полностью сохранена изначальная функциональность редактирования характеристик;
- Добавлена возможность "Конвертации" доп. характеристики из произвольного значения в набор возможных значений с корректной привязкой всех товаров каталога к соответствующему этим товарам значению выбранной характеристики.
- Устранена штатная ошибка ShopCMS в файле catalog_extra.php, при которой возникала ошибка SQL при удалении варианта характеристики (спасибо: badisoft);
- Регистронезависимая проверка, пример значения: Swarowski = SWAROVSKI)
Пишите комментарии, кто будет себе ставить и пробуйте сначала на тестовом каталоге (на всякий случай, т.к я тестировал модуль в разных вариантах).
- 6
#22915 Пробел в окне редактора Fсkeditor
Написано 64j на 10 October 2012 - 04:03 PM
В коде показывает
Всё бы хорошо, но если делать проверку на существование описания товара или категории, то описание не является пустым. То есть и описания нету, a и вроде как есть.
Обрыл кучу форумов с обсуждениями данного редактора, но советы , что были - не помогли.
Нашёл в чём причина.
в двух файлах
fckeditor/editor/js/fckeditorcode_gecko.js
fckeditor/editor/js/fckeditorcode_ie.js
найти в коде на 48 - 49 строке
A=E[1]+' '+F[1];и заменить на
A=E[1]+''+F[1];
- 6
#19545 Красивое двухуровневое меню категорий на JQ Lava lamp + Superfish
Написано drserg на 12 May 2012 - 05:59 PM
Добавил скриншот (но JQ скриншотом не опишешь).
Прикрепленные файлы
- lava_menu.rar 88.82К 67 Количество загрузок:
- 6
#16885 Делаем развесистый фильтр товаров (обкатка, написание, дополнения)
Написано badisoft на 25 February 2012 - 02:57 AM
Last update: 06.04.2014
Основные свойства модуля:
- модуль заменяет штатный фильтр товаров, позволяя фильтровать не по одной характеристике из выпадающего списка,
а по любому набору характеристик. Также этот фильтр работает не только в категориях, а везде.
- убрана необходимость в каждой категории задавать набор характеристик для фильтра, теперь этот набор строится
автоматически на лету. Характеристики и min/max-цены берутся по всем товарам выбранной категории, включая вложенные
любого уровня и дополнительные категории.
Заданные в "Редактировать категорию->Расширенный поиск->Выбрать параметры" галочки и точечки ни на что не влияют.
- добавлена возможность каждой характеристике задать ее тип при показе в фильтре (произвольная строка, набор чекбоксов, движки, выпадающий список с чекбоксами),
- добавлена возможность каждой характеристике задать ее показ/непоказ в фильтрах (см.ниже).
- фильтров теперь три. Первый (основной) и два дополнительных. Они совершенно равноправны, но в реальности второй и третий
нужны как дополнительные фильтры для каких-либо отдельных характеристик. Например, "Фильтр по производителю".
Для каждого фильтра показ/непоказ характеристики задается отдельно.
Установка:
1. переписываем файлы
ui.dropdownchecklist.standalone.css -> data\[шаблон]\
ui.dropdownchecklist-1.4-min.js -> data\[шаблон]\
jquery.selectBox.js -> data\[шаблон]\ (нужен только для filter3.tpl.html)
select-button.png -> data\[шаблон]\ (нужен только для filter3.tpl.html)
jquery.tinyTips.js -> data\[шаблон]\
tinyTips.css -> data\[шаблон]\
q.png -> data\[шаблон]\
filter1.tpl.html -> core\tpl\user\[шаблон]\blocks\
filter2.tpl.html -> core\tpl\user\[шаблон]\blocks\
filter3.tpl.html -> core\tpl\user\[шаблон]\blocks\
advanced_search_in_category_ef.php -> core\includes\
addon.php -> core\includes\admin
Файл addon.php нужен ОДИН РАЗ для создания в таблицах новых полей.
После первого же захода в админку его можно удалить, если он не удалился сам.
2. В head.tpl.html вписываем линки на jquery-ui и css от него. Ну и на сам jquery, если он еще не вписан
{* BEGIN ExtraFilter *}
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
{* END ExtraFilter *}
3. в файле catalog_extra.php (если он не менялся, то можно просто переписать файл из архива поверх)
вместо строки
$updateOptions = ScanPostVariableWithId( array( "extra_option", "extra_sort" ) );
вставляем
# BEGIN ExtraFilter
#$updateOptions = ScanPostVariableWithId( array( "extra_option", "extra_sort" ) );
$updateOptions = ScanPostVariableWithId( array( "extra_option", "extra_sort", "extra_filter1", "extra_filter2", "extra_filter3", "extra_type" ) );
# END ExtraFilter
4. в файле catalog_extra.tpl.html (если он не менялся, то можно просто переписать файл из архива поверх)
4.1 перед строкой
<td align="left" class="toph3">{$smarty.const.ADMIN_VALUE_VARIANTS}</td>
вставляем
{* BEGIN ExtraFilter *}
<td align="left">Фильтр1</td>
<td align="left">Фильтр2</td>
<td align="left">Фильтр3</td>
<td align="left">Тип фильтра</td>
{* END ExtraFilter *}
4.2 перед строкой
<td align="left" valign="middle" class="toph3"><span style="float: right;">({$options[i].count_variants})</span><a href="{$smarty.const.ADMIN_FILE}?dpt=catalog&sub=extra&optionID={$options[i][0]}" class="inl">{$smarty.const.ADMIN_VALUE_VARIANTS}</a></td>
вставляем
{* BEGIN ExtraFilter *}
<td align="left"><input type="checkbox" class="round" name="extra_filter1_{$options[i].optionID}" {if $options[i].filter1}checked{/if} title="Показывать характеристику в первом фильтре"></td>
<td align="left"><input type="checkbox" class="round" name="extra_filter2_{$options[i].optionID}" {if $options[i].filter2}checked{/if} title="Показывать характеристику во втором фильтре"></td>
<td align="left"><input type="checkbox" class="round" name="extra_filter3_{$options[i].optionID}" {if $options[i].filter3}checked{/if} title="Показывать характеристику в третьем фильтре"></td>
<td align="left">
<select name="extra_type_{$options[i].optionID}" title="Показывать характеристику как чекбоксы, строку ввода, слайдер или селект">
<option value="0"{if $options[i].filter_type==0} selected{/if}>Чекбоксы</option>
<option value="1"{if $options[i].filter_type==1} selected{/if}>Строка</option>
<option value="2"{if $options[i].filter_type==2} selected{/if}>Слайдер</option>
<option value="3"{if $options[i].filter_type==3} selected{/if}>Селект</option>
</select>
</td>
{* END ExtraFilter *}
5. в файле option_functions.php
5.1 в функции optGetOptions ищем строку
$SQL = 'select ps.optionID, ps.name, ps.sort_order, COUNT(povv.variantID) as count_variants FROM '.PRODUCT_OPTIONS_TABLE.' as ps
и заменяем ее на
# BEGIN ExtraFilter
#$SQL = 'select ps.optionID, ps.name, ps.sort_order, COUNT(povv.variantID) as count_variants FROM '.PRODUCT_OPTIONS_TABLE.' as ps
$SQL = 'select ps.optionID, ps.name, ps.sort_order, COUNT(povv.variantID) as count_variants, ps.filter1, ps.filter2, ps.filter3, ps.filter_type FROM '.PRODUCT_OPTIONS_TABLE.' as ps
5.2 в функции optUpdateOptions ищем строку
"', sort_order=".(int)$val["extra_sort"]." where optionID=".(int)$key);
и заменяем ее на
# BEGIN ExtraFilter
#"', sort_order=".(int)$val["extra_sort"]." where optionID=".(int)$key);
"', sort_order=".(int)$val["extra_sort"].
", filter1=".(isset($val["extra_filter1"])?1:0).
", filter2=".(isset($val["extra_filter2"])?1:0).
", filter3=".(isset($val["extra_filter3"])?1:0).
", filter_type=".(isset($val["extra_type"])?$val["extra_type"]:0).
" where optionID=".(int)$key);
# END ExtraFilter
6. в файле product_functions.php
6.2 в функции _testExtraParametrsTemplate
6.2.1 перед строками
// get category ID
$categoryID = $template["categoryID"];
вставляем
# BEGIN ExtraFilter
if (isset($_GET["extrafilter"])){
global $efTemplate;
$variants = array();
$filter_type = array();
foreach( $efTemplate as $key => $item )
if((string)$key != "categoryID" && isset($item["optionID"]))
{
if (is_array($item['value'])) $variants[$item["optionID"]] = $item['value'];
elseif ($item['value']>0) $variants[$item["optionID"]][] = $item['value'];
if (isset($item['filter_type'])) $filter_type[$item["optionID"]] = $item['filter_type'];
}
if (!$count = count($variants)) return true;
$filter = array();
foreach( $variants as $key => $item )
{
if (isset($filter_type[$key]))
{
switch ($filter_type[$key])
{
case '0':
$filter[] = "pos.variantID IN (".implode(",",$item).")";
break;
case '1':
$filter[] = "pos.optionID=".$key." AND povv.option_value LIKE '%".$item[0]."%'";
break;
case '2':
if ($item[2] == 'on') $count--;
else $filter[] = "pos.optionID=".$key." AND FLOOR(povv.option_value)>=".$item[0]." AND CEIL(povv.option_value)<=".$item[1];
break;
case '3':
$filter[] = "pos.variantID IN (".implode(',',$item).")";
break;
}
}
}
$row=db_fetch_row(db_query("SELECT count(DISTINCT pos.optionID) AS count FROM ".PRODUCTS_OPTIONS_SET_TABLE." AS pos
LEFT JOIN ".PRODUCTS_OPTIONS_VALUES_VARIANTS_TABLE." AS povv USING (variantID)
WHERE productID=".$productID. " AND (".implode(" OR ",$filter).")"));
return $row['count'] == $count;
}else{
# END ExtraFilter
6.2.2 перед завершающей функцию фигурной скобкой } вставляем
# BEGIN ExtraFilter
}
# END ExtraFilter
Должен получиться код
if (isset($_GET["extrafilter"])){
новый код функции
}else{
старый код функции
}
7. в файле category.php в функциях _getUrlToNavigate и _getUrlToSort
7.1 добавляем (там довольно очевидно куда - в блок аналогичных строк)
# BEGIN ExtraFilter
if ( isset($_GET["extrafilter"]) )
$url .= "&extrafilter=".$_GET["extrafilter"];
# END ExtraFilter
7.2 вместо
$url .= "¶m_".$key;
$url .= "=".$val["param"];
вставляем
# BEGIN ExtraFilter
#$url .= "¶m_".$key;
#$url .= "=".$val["param"];
if (is_array($val["param"])) foreach ($val["param"] as $vkey => $variant) $url .= "¶m_".$key."[".$vkey."]=".$variant;
else $url .= "¶m_".$key."=".$val["param"];
# END ExtraFilter
8. Подключаем в админке в "Управление блоками" основной фильтр (filter1.tpl.html) и ставим нужные галочки в "Характеристики товаров".
Второй фильтр (filter2.tpl.html) и третий фильтр (filter3.tpl.html) аналогично .
9. проверяем, пишем о проблемах.
Работающий пример можно посмотреть тут.
Характеристики там сгенерированы автоматически из описаний товаров, просто для демонстрации работы фильтра.
PS. Ну и, естественно, спасибо всем, кто тем или иным образом принимал и принимает участие в доделывании этого фильтра. Matit, micehide, R.Sergey и другие, кого я мог забыть или кто еще примет участие в будущем.
Прикрепленные файлы
- ExtraFilter.zip 29.39К 68 Количество загрузок:
- 6
#26259 Задолбали просители "пришлите мне файл, который я не могу скачать"
Написано badisoft на 10 April 2013 - 10:21 PM
Написано в основном для того, чтобы я не писал в личке одно и то же в двудесятый раз, а просто - бдыщ! - запостил ссылку на готовый текст. Так вот!
Я исключительно положительно и с пониманием отношусь к тому, что весьма не любой зарегистрировашийся пользователь может скачать что угодно из даунлоада или даже по ссылке в теме. Мне нравится этот сайт. Мне нравятся принципы его администрирования. Какого хрена я должен обманывать администрацию сайта втихую отдавая емейлом какой-либо недоступный контент с этого сайта? Не будет этого. Задолбали просить.
- 5
#26053 Редактирование заказа v.2.0 by vsupport.club
Написано R.Sergey на 02 April 2013 - 02:58 AM
Модуль позволяет редактировать все данные заказа:
- e-mail,
- Имя,
- Фамилия,
- Телефон,
- Адрес,
- Способ доставки (можно вводить произвольное значение, например если у Вас нет способа доставки Самовывоз, но Вы индивидуально договорились об этом с заказчиком, можно написать способ Самовывоз),
- Способ платы (так как и в доставке можно ввести произвольное значение),
- Характеристики товаров,
- Кол-во товара,
- Стоимость товара,
- Скидку в процентах, т.е. если у Вашего заказчика не было скидки, но Вы индивидуально ее предоставили это можно внести в заказ,
- Стоимость доставки.
Есть возможность добавлять/удалять товары в заказе.
Есть возможно добавлять комментарий администратора к заказу.
Изменена логика вывода информации о заказе, более нужная информация выведена в вернюю часть (см. скрин.), для удобства добавлены кнопки сохранить изменения, чтобы не путаться кнопка Изменить статус размещена отдельно от сохранения заказа.
edit_order.jpg 606.64К 189 Количество загрузок:
Скачать модуль "Редактирование заказа в админ. панели"
- 5
#34996 Добавить товар в избранное
Написано zcz на 01 November 2016 - 11:16 AM
Модуль позволяет реализовать на сайте блок "избранное".
Работает все на ajax, для зарегистрированных заноситься в базу, для посетителей в сессию.
Сразу скажу, что код в шаблонах написан под 3.1.3 версию, но переделать, думаю, труда не составит.
Все ajax и js (jquery) написаны универсально + есть закомментированные строки под старую и новую версию шаблона
Если в шаблоне не установлен jquery, то его необходимо будет поставить!
Установка:
!ВКЛЮЧАЕМ ПРИНУДИТЕЛЬНУЮ ОЧИСТКУ КЕША В АДМИНКЕ!
Заливаем файлы в свои директории.
Открываем index.php в корне (да он должен быть открытым.)
Находим строку
if ( in_array($_GET["do"], array( "captcha", "cart", "rss", "compare", "yandex", "invoice_jur", "invoice_phys", "stat", "get_file" ))) {
Заменяем на
if ( in_array($_GET["do"], array( "captcha", "cart", "rss", "compare", "yandex", "invoice_jur", "invoice_phys", "stat", "get_file", "favourites" ))) {
в файле core/config/tables.inc.php в самый низ перед закрывающим тегом ?> вставляем
if(!defined('FAVORITES_TABLE')) { define('FAVORITES_TABLE', 'ПРЕФИКС_favourites'); }
Открываем файл core/functions/product_functions.php
Находим функцию prdSearchProductByTemplate
в ней, в самом низу, перед $result[] = $row; вставляем
//вставка для избранных товаров if ( isset($_SESSION["log"]) ) { $select = mysql_query("SELECT customerID FROM ".CUSTOMERS_TABLE." WHERE `Login` = '".$_SESSION["log"]."' "); $rows = mysql_fetch_array($select); $favorit = mysql_query("SELECT productsID FROM ".FAVORITES_TABLE." WHERE customerID = '".$rows[0]."'"); $r = mysql_fetch_array($favorit); $prd = explode(",", $r[0]); foreach ($prd as $v) { if($v == $row['productID']) { $row["inF"] = 1; } } } else { $prd = explode(",", $_SESSION['f_prod']); foreach ($prd as $v) { if($v == $row['productID']) { $row["inF"] = 1; } } } //END вставка для избранных товаров
открываем core/tpl/user/ВАШ_ШАБЛОН/product_detailed.tpl.html
в нужном месте вставляем кусок кода для кнопки "в избранное"
{*Добавить в избранное*} <span id="favour_{$product_info.productID}"> {if $in_favorite eq 1} <a href="#" onclick="doFavoriteDel('pID={$product_info.productID}'); return false" class="btn btn-default">Удалить из избранного</a> {else} <a href="#" onclick="doFavorite('pID={$product_info.productID}'); return false" class="btn btn-default">В избранное</a> {/if} </span> {*END добавить в избранное*}
в файле core/tpl/user/ВАШ_ШАБЛОН/product_brief.tpl.html в нужном месте вставляем
{*Добавить в избранное*} <span id="favour_{$product_info.productID}"> {if $product_info.inF eq 1} <a href="#" onclick="doFavoriteDel('pID={$product_info.productID}'); return false" class="btn btn-default btn-xs">Удалить из избранного</a> {else} <a href="#" onclick="doFavorite('pID={$product_info.productID}'); return false" class="btn btn-default btn-xs">В избранное</a> {/if} </span> {*END добавить в избранное*}
в core/tpl/user/ВАШ_ШАБЛОН/index.tpl.html перед закрывающим тегом </body> добавляем
{* добавление в избранное *} <script src="data/{$smarty.const.TPL}/favourites.js"></script> {* END добавление в избранное *}
в htaccess необходимо в самый низ добавить строки
#Избранные товары RewriteRule ^favourites\.html$ index.php?favourites=yes [L] #END избранные товары
После всех изменений переходим на страницу http://ВАШ_САЙТ/favourites.html
Должен сработать первый запуск модуля и вылезти окошко об успешной установке.
Устанавливаем блок из "управления блоками" (добавить блок из файла) или вставляем вручную в нужном месте шаблона.
Если все шаги были выполнены верно, то можно наслаждаться новым модулем.
Добавить в избранное.rar 7.47К 25 Количество загрузок:
favourites_js_3_1_2.rar 902байт 8 Количество загрузок: - JS для shopcms 3.1.1 и 3.1.2
- 7
- ShopCMS, DataLife Engine, XenForo и другие CMS - помощь и поддержка
- → Highest Reputation Content