Вы не авторизованы.
По совету администратора rat решил создать тему со своими доработками, буду сюда по мере свободного времени выкладывать свои доработки для версии движка 305.
Возможно они уже были исправлены кем-либо, либо в будущих версиях движка, но всё же.
Формат исходного кода - так как здесь нету форматирования исходного кода, к каждой строчке слева буду подписывать её номер, чтобы было проще ориентироваться. У вас эти строчки могут отличаться от моих, возможно из-за доработок, но все равно найти строчку будет проще.
Про кодировку:
Так как движок магазина полностью работает в кодировке utf-8, то все файлы должны редактировать в UTF-8
Например при открытие файла в nodepad++ если в меню Кодировать стоит Кодировать в ANSI, то нужно преобразовать в UTF-8 без BOM (скрин nodepad++ http://pix.am/yEF0/), иначе после сохранения файла русские символы будут отображаться вот так - http://pix.am/E5hE/
1. В админке не работает ссылка на картинку категории
скрин1
Решение
В файле /www/published/SC/html/scripts/modules/test/_methods/b_category_settings.php
заменить строку
239 $CategoryInfo['picture_href'] = "open_window('products_pictures/{$CategoryInfo['picture']}',$width,$height);return false;";
на
239 $CategoryInfo['picture_href'] = "open_window('". URL_PRODUCTS_PICTURES . "/{$CategoryInfo['picture']}',$width,$height);return false;";
результат
2. При огромном количестве доп. характеристик, база данных каждому товару присваивает все характеристики с пустыми значениями
При 9000 товаров и 950 характеристиках, мы получаем примерно 2 миллиона пустых ненужных значений.
Решение
В файле /www/published/SC/html/scripts/core_functions/configurator_functions.php
добавить строчку #115
114 }else{ // insert query 115 if ($value['option_radio_type'] == "UN_DEFINED") continue;
а так же выполнить mysql код в phpmyadmin:
DELETE FROM SC_product_options_values WHERE variantID IS NULL AND option_value_ru = '';
3. При редактировании заказа, иногда вылазиет mysql ошибка:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '00 where orderID = 20 and itemID = 23' at line 1
update SC_ordered_carts set Price = '8950', Quantity = 1, tax = 0,00 where orderID = 20 and itemID = 23
скрин1 скрин2
Решение
Файл /www/published/SC/html/scripts/modules/order_editor/class.order_editor.php
Заменить строчку:
144 $sql = "update ".ORDERED_CARTS_TABLE." set Price = '{$info['price']}', Quantity = {$info['qty']}, tax = {$info['tax']}". 145 " where orderID = {$order_id} and itemID = {$info['item_id']}";
на строчки:
144 $info['tax'] = str_replace(',', '.', $info['tax']); 145 $sql = "update ".ORDERED_CARTS_TABLE." set Price = '{$info['price']}', Quantity = {$info['qty']}, tax = '{$info['tax']}'". 146 " where orderID = {$order_id} and itemID = {$info['item_id']}";
4. Фиксированная цена при обновлении из 1с
Задача: в админке иметь возможность напротив каждого товара ставить галочку: fix_price (Фиксированная цена)
При обновлении из 1С если стоит эта галочка то не обновлять цену. Галочки фиксируются после нажатия в админке Сохранить цены и сортировку.
скрин1
Решение
Файл /www/published/SC/html/scripts/templates/backend/categories_products.html
Добавить после строки:
115 <form action='{$urlToSubmit}' method="post" name="MainForm" id="MainForm">
вот эти строчки:
{if (($smarty.const.CONF_CHECKSTOCK eq 1) && (($smarty.const.CONF_VKONTAKTE_ENABLED eq 1 && false)||($smarty.const.CONF_FACEBOOK_ENABLED eq 1)))} {assign var=colspan_1 value="6"} {assign var=colspan_2 value="11"} {elseif (($smarty.const.CONF_CHECKSTOCK eq 1) || ($smarty.const.CONF_VKONTAKTE_ENABLED eq 1 && false) || ($smarty.const.CONF_FACEBOOK_ENABLED eq 1))} {assign var=colspan_1 value="5"} {assign var=colspan_2 value="10"} {else} {assign var=colspan_1 value="4"} {assign var=colspan_2 value="9"} {/if}
заменить строку:
142 <td colspan="{if (($smarty.const.CONF_CHECKSTOCK eq 1) && (($smarty.const.CONF_VKONTAKTE_ENABLED eq 1 && false)||($smarty.const.CONF_FACEBOOK_ENABLED eq 1)))}6{elseif (($smarty.const.CONF_CHECKSTOCK eq 1) || ($smarty.const.CONF_VKONTAKTE_ENABLED eq 1 && false) || ($smarty.const.CONF_FACEBOOK_ENABLED eq 1))}5{else}4{/if}" style="border-left: solid 1px #F5F0BB;border-right: solid 1px #F5F0BB;border-bottom: solid 1px #F5F0BB;">
на
<td colspan="{$colspan_1}" style="border-left: solid 1px #F5F0BB;border-right: solid 1px #F5F0BB;border-bottom: solid 1px #F5F0BB;">
заменить строку:
154 <td colspan="{if (($smarty.const.CONF_CHECKSTOCK eq 1) && (($smarty.const.CONF_VKONTAKTE_ENABLED eq 1 && false)||($smarty.const.CONF_FACEBOOK_ENABLED eq 1)))}11{elseif (($smarty.const.CONF_CHECKSTOCK eq 1) || ($smarty.const.CONF_VKONTAKTE_ENABLED eq 1 && false) || ($smarty.const.CONF_FACEBOOK_ENABLED eq 1))}10{else}9{/if}">
на
<td colspan="{$colspan_2}">
заменить строку:
174 <td style="border-width: 0px;" colspan="{if (($smarty.const.CONF_CHECKSTOCK eq 1) && (($smarty.const.CONF_VKONTAKTE_ENABLED eq 1 && false)||($smarty.const.CONF_FACEBOOK_ENABLED eq 1)))}11{elseif (($smarty.const.CONF_CHECKSTOCK eq 1) || ($smarty.const.CONF_VKONTAKTE_ENABLED eq 1 && false) || ($smarty.const.CONF_FACEBOOK_ENABLED eq 1))}10{else}9{/if}">
на
<td style="border-width: 0px;" colspan="{$colspan_2}">
после строчки
<td align="right"><a href="{$product_url}">{$GridRows[i].customers_rating} </a></td>
добавить строку
<td><input {if $GridRows[i].fix_price}checked{/if} type="checkbox" title="Фикс. цена для 1с" name="fix_price_{$GridRows[i].productID}" value="1" /></td>
В файле /www/published/SC/html/scripts/modules/test/_methods/b_categories_products.php
строку
288 $data = scanArrayKeysForID($_POST, array( "price", "left", "sort_order" ) );
заменить на
$data = scanArrayKeysForID($_POST, array( "price", "left", "sort_order", "fix_price" ) );
после строки
298 if ( isset($val["sort_order"]) ){ 299 $sqlValues[] = 'sort_order = '.intval($val["sort_order"]); 300 }
добавить строку
// fix price $sqlValues[] = 'fix_price = '.(!empty($val["fix_price"]) ? '1' : 'NULL');
после строки
605 $gridEntry->registerHeader("prdset_product_rating", 'customers_rating', false, 'desc');
добавить строку
$gridEntry->registerHeader('fix_price');
В файле /www/published/SC/html/scripts/classes/class.product.php
После строки
7 var $Price;
добавить строчку
var $fix_price;
В файле /www/published/SC/html/scripts/classes/class.parser1cxml.php
заменить строку 376
376 if ( $priceValue!= 0 ) { 377 $productEntry->Price = $priceValue; 388 }
на строку
376 if ( $priceValue!= 0 && empty($productEntry->fix_price) ) { 377 $productEntry->Price = $priceValue; 388 }
Выполнить SQL запрос в phpmyadmin
ALTER TABLE `SC_products` ADD `fix_price` TINYINT( 1 ) NULL DEFAULT NULL AFTER `Price`
5. Автоматическое наложение прозрачного watermark на большие фотографии (ТОЛЬКО НА НОВЫЕ)
Задача: при загрузки фото из админки наложить на все большие картинки прозрачную png картинку
Примечание: ранее загруженные фото останутся без изменений, то есть без watermark
скрин1
Решение
Файл /www/published/SC/html/scripts/core_functions/picture_functions.php
Найти строчки:
405 //Future add watermark 406 $watermark_file = DIR_IMG.'/watermark.png'; 407 if(false&&$watermark_file && file_exists($watermark_file)){
заменить на
//Future add watermark //$watermark_file = DIR_IMG.'/watermark.png'; if($watermark_file && file_exists($watermark_file)){
Найти строчки:
422 if ( $position == 'right' ) { 423 $dest_x = imagesx($image) - $width - 5; 423 $dest_y = imagesy($image) - $height - 5; 424 }else{ 425 $dest_x = intval(imagesx($image)*0.5) - intval($width*0.5); 426 $dest_y = intval(imagesy($image)*0.5) - intval($height*0.5); 427 } 428 imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $width, $height, $alpha_level); 429 return $image;
заменить на
// не ставим watermark на слишком маненькие товары if (imagesx($image) < ($width + 10)) return $image; if ( $position == 'right' ) { $dest_x = imagesx($image) - $width - 0; $dest_y = imagesy($image) - $height - 0; }else{ $dest_x = intval(imagesx($image)*0.5) - intval($width*0.5); $dest_y = intval(imagesy($image)*0.5) - intval($height*0.5); } imagealphablending($watermark, true); if ($alpha_level !== null) { imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $width, $height, $alpha_level); } else { imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $width, $height); } return $image;
В файле /www/published/SC/html/scripts/modules/products/_methods/b_product_settings.php
Найти строчку
364 $temp_file = DIR_TEMP.'/'.getUnicFile(4, 'img.e.%s.temp', DIR_TEMP);
заменить на
$temp_file = DIR_TEMP.'/'.getUnicFile(4, 'img.e.%s.temp', DIR_TEMP); // Путь до вашего watermarka, формат png24, рекоменд. размер: не более 200х200 // где DIR_IMG = /www/published/publicdata/%DB_KEY%/attachments/SC/images $watermark_logo = DIR_IMG.'/logo_watermark_photo_50.png'; // расположение: right - справа внизу, left - слева внизу, можно дополнить если что функционал, по середине , вверху и тд. $watermark_position = 'right';
Найти строчку
459 $enlarged_file_name = getUnicFile(2, preg_replace('@\.([^\.]+)$@', '%s.$1', $enlarged_file_name), DIR_PRODUCTS_PICTURES); 460 461 if( 462 PEAR::isError($res = Functions::exec('img_resize', array($orig_file, CONF_PRDPICT_STANDARD_SIZE, CONF_PRDPICT_STANDARD_SIZE, $temp_file)))
заменить на
$enlarged_file_name = getUnicFile(2, preg_replace('@\.([^\.]+)$@', '%s.$1', $enlarged_file_name), DIR_PRODUCTS_PICTURES); if( PEAR::isError($res = Functions::exec('img_resize', array($orig_file, CONF_PRDPICT_ENLARGED_SIZE, CONF_PRDPICT_ENLARGED_SIZE, $temp_file, $watermark_logo, $watermark_position, null)))
6. Правильная настройка Webasyst под rewrite nginx
Задача настроить rewrite без использования Apache, для nginx, чтобы работали все URL адреса при включенном режиме ЧПУ (в админке)
решение настроить конфиг для nginx:
location / { if (!-e $request_filename) { rewrite (.*) /published/SC/html/scripts/index.php?__furl_path=$1&frontend=1 last; } index index.html index.php; } location /published/SC/html/scripts/ { if (!-e $request_filename) { rewrite /(.*) /published/SC/html/scripts/index.php?__furl_path=$1&frontend=1 last; } } # редирект с дубликатов /shop/, чтобы в яндексе не было одинаковых страниц по двум разным адресам location /shop/ { rewrite /shop/(.*)? /$1 permanent; } location ~ ^.+\.php.*$ { satisfy any; try_files $fastcgi_script_name =404; fastcgi_pass unix:/tmp/php-fpm.sock; fastcgi_pass_request_body off; fastcgi_param REQUEST_BODY_FILE $request_body_file; fastcgi_temp_path /home/nginx/fastcgi_temp 1 2; fastcgi_intercept_errors on; # for slowly operations, like 1c exchange, import, export fastcgi_read_timeout 2m; fastcgi_send_timeout 1m; fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCHEME $scheme; fastcgi_param GEO_COUNTRY_CITY $geo_country_city; # you can set php.ini options here # fastcgi_param PHP_ADMIN_VALUE "suhosin.get.max_value_length=4096"; include fastcgi_params; }
7. Подключение API Яндекс Быстрый заказ без статистики
Задача реализовать выгрузку личных данных с акаунта пользователя Яндекс Маркета для быстрого ввода данных и отображения значка "Быстрый заказ" в результатах поиска по Маркету
Скриншоты скрин1 скрин2 скрин3 скрин4 скрин5 скрин6
Решение
Первым делом на этой странице вводите адрес оформления заказа без параметров - например http://gelios52.ru/checkout/, если вы напишите http://gelios52.ru/checkout/?from_yamarket=1 то яндекс отрежет их и перебросит на http://gelios52.ru/checkout/, другими словами без ЧПУ работать не будет
Нажимаем зарегистрировать, и получаем код кнопки.
Далее открываем файл \www\published\SC\html\scripts\templates\frontend\checkout.your_info.html в кодировке utf-8:
перед строчкой
30 <tr><td colspan="2">
вставить
<tr><td colspan="2" style="border-bottom: 1px #ccc solid;"> <p id="checkout_yandex_account"> {if $YamarketIssetData} Ваши данные <b>успешно</b> заполнены с <big><strong style="color:#000"><span style="color:#f00">Я</span>ндекс</strong></big> <strong style="color:#FF8B00">маркета</strong> <a href="{"clear_yamarket=`$YamarketClearHash`"|set_query_html}">очистить</a> {else} СЮДА ВСТАВИТЬ КОД КНОПКИ - для пользователй Яндекс Маркета {/if} </p> </td> </tr>
не забудьте вставить код кнопки в нужное место которое я пометил большими буквами
В файле www\published\SC\html\scripts\templates\frontend\checkout.confirmation.html
Заменить строку
85 <textarea name="order_comment" cols="50" rows="3"></textarea>
на
<textarea name="order_comment" cols="50" rows="3" style="width:400px;height:140px">{$checkout_comment|escape:'html'}</textarea>
В файле www\published\SC\html\scripts\modules\abstract\_methods\checkout\your_info.php
Заменить строку
137 if(isset($_SESSION['log'])&&$_SESSION['log'])RedirectSQ('step=shipping');
на
if(isset($_SESSION['log'])&&$_SESSION['log'])RedirectSQ('step=shipping'); // Ваш URL_id: 2351. Используйте его для выгрузки статистики $current_urlpath = xHtmlSetQuery(); $yamarket_url_callback = 'http://' . $_SERVER['HTTP_HOST'] . $current_urlpath; $checkoutEntry = &Checkout::getInstance(_CHECKOUT_INSTANCE_NAME); // add info from yandex market to current session if (empty($_GET['from_yamarket']) && false !== strpos($_SERVER['HTTP_REFERER'], 'http://market.yandex.ru/addresses.xml?callback=' . urlencode($yamarket_url_callback))) { $checkoutEntry->Yamarket_importPostData(); RedirectSQ('from_yamarket=1', $current_urlpath); } // clear session info yandex market user if (!empty($_GET['clear_yamarket']) && $checkoutEntry->Yamarket_getData('clear_hash') && $_GET['clear_yamarket'] == $checkoutEntry->Yamarket_getData('clear_hash') ) { $checkoutEntry->Yamarket_clearData(); RedirectSQ('?', $current_urlpath); }
заменить строки
144 $smarty->assign('billing_as_shipping', 1); 146 $checkoutEntry = &Checkout::getInstance(_CHECKOUT_INSTANCE_NAME);
на
$smarty->assign('billing_as_shipping', 1); if ($checkoutEntry->Yamarket_issetData()) { $smarty->assign('YamarketIssetData', true); $smarty->assign('YamarketClearHash', $checkoutEntry->Yamarket_getData('clear_hash')); $checkoutEntry->Yamarket_mergeDataWithForm(); }
заменить
187 set_query('email_exists=&login_form=','',true);
на
set_query('from_yamarket=&email_exists=&login_form=','',true);
Файл www\published\SC\html\scripts\modules\abstract\_methods\checkout\confirmation.php
Добавить после строки
30 $smarty->assign( 'orderSum', $orderSum );
строчки
if ($checkoutEntry->Yamarket_issetData()) { $checkout_comment = $checkoutEntry->Yamarket_buildCommentData(); if ($checkout_comment) { $smarty->assign( 'checkout_comment', $checkout_comment ); } }
В файле www\published\SC\html\scripts\classes\class.checkout.php
после строчки
6 var $widgets = 0;
добавить строку
const YAMARKET_SESSION_KEY = 'u_YamarketUserInfo';
Добавить после строк
493 discount_coupon::postPlaceOrder($orderID); 494 495 return $orderID; 496 }
строчки в кодировке UTF-8
// load data comes from market.yandex.ru via POST function Yamarket_importPostData() { $yandex_market_info = array( 'id' => is_numeric($_POST['id']) ? $_POST['id'] : null, 'title' => mb_substr($_POST['title'], 0, 40), // улица 'street' => mb_substr($_POST['street'], 0, 60), // дом 'building' => mb_substr($_POST['building'], 0, 15), // корпус 'suite' => mb_substr($_POST['suite'], 0, 5), // № квартиры офиса 'flat' => mb_substr($_POST['flat'], 0, 5), // подъезд 'entrance' => mb_substr($_POST['entrance'], 0, 5), // этаж 'floor' => mb_substr($_POST['floor'], 0, 10), // домофон 'intercom' => mb_substr($_POST['intercom'], 0, 15), // город 'city' => mb_substr($_POST['city'], 0, 40), // страна 'country' => mb_substr($_POST['country'], 0, 50), // индекс 'zip' => mb_substr($_POST['zip'], 0, 8), // метро 'metro' => mb_substr($_POST['metro'], 0, 40), // груз. лифт 'cargolift' => mb_substr($_POST['cargolift'], 0, 3), // Фамилия 'lastname' => mb_substr($_POST['lastname'], 0, 60), // имя 'firstname' => mb_substr($_POST['firstname'], 0, 20), // отчество 'fathersname' => mb_substr($_POST['fathersname'], 0, 30), // телефон 'phone' => mb_substr($_POST['phone'], 0, 20), // доп. телефон 'phone-extra' => mb_substr($_POST['phone-extra'], 0, 20), 'email' => mb_substr($_POST['email'], 0, 30), 'comment' => mb_substr($_POST['comment'], 0, 500), 'operation_id' => preg_match('![a-z0-9]+!', $_POST['operation_id']) ? mb_substr($_POST['operation_id'], 0, 100) : null, 'clear_hash' => sha1(uniqid(rand(),1)), ); // join address from yandex in one line to form $yandex_market_info['address'] = array( $yandex_market_info['street'], $yandex_market_info['building'] ? 'д.' . $yandex_market_info['building'] : null, $yandex_market_info['suite'] ? 'корп.' . $yandex_market_info['suite'] : null, $yandex_market_info['flat'], $yandex_market_info['entrance'] ? 'подъезд ' . $yandex_market_info['entrance'] : null, $yandex_market_info['floor'] ? 'этаж ' . $yandex_market_info['floor'] : null, $yandex_market_info['intercom'] ? 'домофон ' . $yandex_market_info['intercom'] : null, ); $yandex_market_info['address'] = array_filter($yandex_market_info['address']); $yandex_market_info['address'] = implode(', ', $yandex_market_info['address']); $_SESSION[self::YAMARKET_SESSION_KEY] = $yandex_market_info; } function Yamarket_loadData() { return isset($_SESSION[self::YAMARKET_SESSION_KEY]) ? $_SESSION[self::YAMARKET_SESSION_KEY] : null; } function Yamarket_getData($key) { $data = $this->Yamarket_loadData(); return $data && isset($data[$key]) ? $data[$key] : null; } function Yamarket_issetData() { return isset($_SESSION[self::YAMARKET_SESSION_KEY]); } function Yamarket_clearData() { $this->clean(); $_SESSION[self::YAMARKET_SESSION_KEY] = null; unset($_SESSION[self::YAMARKET_SESSION_KEY]); } // merge current values with Yamarket, the yamarket info is not priority function Yamarket_mergeDataWithForm() { // key list from yandex $yandexkey2form = array( 'id' => null, 'title' => null, 'street' => null, 'building' => null, 'suite' => null, 'flat' => null, 'entrance' => null, 'floor' => null, 'intercom' => null, 'city' => 'shipping_address.city', 'country' => null, 'zip' => 'shipping_address.zip', 'metro' => null, 'cargolift' => null, 'address' => 'shipping_address.address', 'lastname' => array('customer_info.last_name', 'shipping_address.last_name'), 'firstname' => array('customer_info.first_name', 'shipping_address.first_name'), 'fathersname' => null, 'phone' => 'customer_info._custom_fields.1', 'phone-extra' => null, 'email' => 'customer_info.Email', 'comment' => null, 'operation_id' => null, ); $forms_data = $this->getData('forms_data'); if (null == $forms_data) $forms_data = array(); foreach ($yandexkey2form as $yandex_key => $form_keys) { if (null == $form_keys) continue; if (is_string($form_keys)) $form_keys = (array) $form_keys; foreach ($form_keys as $form_key) { $session_data_val = $this->Yamarket_getData($yandex_key); if (!$session_data_val) continue; // building the key string [customer_info][last_name] from customer_info.last_name $form_key = explode('.', $form_key); if (count($form_key) == 2 && !$forms_data[$form_key[0]][$form_key[1]]) { $forms_data[$form_key[0]][$form_key[1]] = $session_data_val; } else if (count($form_key) == 3 && !$forms_data[$form_key[0]][$form_key[1]][$form_key[2]]) { $forms_data[$form_key[0]][$form_key[1]][$form_key[2]] = $session_data_val; } } } //var_dump($this->Yamarket_loadData());die; //var_dump($forms_data);die; $this->setData('forms_data', $forms_data); } // build comment field for /checkout/?step=confirmation function Yamarket_buildCommentData() { $checkout_comment = array(); if ($this->Yamarket_getData('comment')) { $checkout_comment[] = $this->Yamarket_getData('comment'); } if ($this->Yamarket_getData('cargolift') == 'yes') { $checkout_comment[] = 'Имеется грузовой лифт.'; } if ($this->Yamarket_getData('metro')) { $checkout_comment[] = 'Ближайшая ст. метро - ' . $this->Yamarket_getData('metro'); } if ($this->Yamarket_getData('phone-extra')) { $checkout_comment[] = 'Доп. телефон - ' . $this->Yamarket_getData('phone-extra'); } return implode("\n", $checkout_comment); }
Пока что не реализовано:
- передача статистике о заказе для Яндекс Маркета (необязательно)
- Автоматический выбор области по Городу (из яндекса область не приходит)
- Многоязычность - работает только на русском языке
Про кнопку быстрого заказа Яндекс Маркет пишет
Предложения магазина, подключенного к Быстрому заказу, выделяются специальным значком только после того, как пользователи начинают часто использовать Быстрый заказ при оформлении покупок.
С каждым запросом данных Яндекс возвращает ID операции, по которому он просит отправлять в Яндекс статистику по каждой операции о том совершена ли покупка или нет, я это не реализовал, ибо скрипт написан за 2 часа, со статистикой не стал заморачиваться. Подробнее о статистике заказов читайте тут - http://help.yandex.ru/partnermarket/?id=1121700#stat
UPD: Ну что ж поздравим alp-book со значком Быстрый заказ - http://clip2net.com/s/1Vz9a
Никакая статистика не нужна, просто нужно подождать и яндекс обновит всё сам, если пользователи юзают Профиль из Яндекса.
8. Показ кол-ва удачных покупок по Email адресу в таблице Покупатели
Задача добавить колонку в меню Покупатели отображающую кол-во сделанных покупок с возможностью сортировки
скрин1 скрин2 скрин3
Внимание!! при большом кол-ве заказов могут наблюдаться тормоза на 2-3 сек, буду думать как исправить это.
Решение:
В файле \www\published\SC\html\scripts\modules\users\_methods\busers_list.php
Заменить строчку:
55 $gridEntry->query_select_rows = 'SELECT * FROM ?#TBL_USERS'. 56 ' WHERE 1 '.
на
$gridEntry->query_select_rows = 'SELECT `c`.*,COUNT(`o`.`customerID`) as `shop_cnt` FROM ?#TBL_USERS as `c`'. ' LEFT JOIN ?#ORDERS_TABLE as `o` ON (`o`.`customer_email` = `c`.`Email` AND `o`.`statusID` = ?#CONF_ORDSTATUS_DELIVERED)'. ' WHERE 1 '.
далее ниже строчку
63 $ActiveState; 64 65 $gridEntry->setRowHandler('$row[\'reg_datetime\'] = Time::standartTime($row[\'reg_datetime\']);return $row;');
заменить на
$ActiveState . ' GROUP BY `customerID`'; $gridEntry->setRowHandler('$row[\'reg_datetime\'] = Time::standartTime($row[\'reg_datetime\']);return $row;');
должно получится вот так:
55 $gridEntry->query_select_rows = 'SELECT `c`.*,COUNT(`o`.`customerID`) as `shop_cnt` FROM ?#TBL_USERS as `c`'. 56 ' LEFT JOIN ?#ORDERS_TABLE as `o` ON (`o`.`customer_email` = `c`.`Email` AND `o`.`statusID` = ?#CONF_ORDSTATUS_DELIVERED)'. 57 ' WHERE 1 '. 58 (isset($_GET['login'])?' AND Login LIKE "%'.xEscapeSQLstring($_GET['login']).'%"':''). 59 ( ( isset($_GET['custgroupID']) and $_GET['custgroupID'] > 0 ) ? ' AND custgroupID = '.xEscapeSQLstring($_GET['custgroupID']) : ''). 60 (isset($_GET['email'])?' AND Email LIKE "%'.xEscapeSQLstring($_GET['email']).'%"':''). 61 (isset($_GET['last_name'])?' AND last_name LIKE "%'.xEscapeSQLstring($_GET['last_name']).'%"':''). 62 (isset($_GET['first_name'])?' AND first_name LIKE "%'.xEscapeSQLstring($_GET['first_name']).'%"':''). 63 $ActiveState . 64 ' GROUP BY `customerID`';
далее еще ниже строчку
71 $gridEntry->registerHeader(translate("usr_custinfo_email"), 'Email');
заменить на
$gridEntry->registerHeader(translate("usr_custinfo_email"), 'Email'); $gridEntry->registerHeader(translate('str_products_success_count'), 'shop_cnt');
примечание далее Админке отредактируйте перевод и добавьте новую строку str_products_success_count в меню Языки и перевод (см скрин)
В файле \www\published\SC\html\scripts\templates\backend\users_list.html
после строчке
83 <td><a href='{$customer_url}'>{if $smarty.const.CONF_BACKEND_SAFEMODE eq 0}{$GridRows[i].Email|escape:'html'}{else}{"msg_safemode_info_blocked"|translate}{/if}</a></td>
добавить строку
<td><a href='{$customer_url}'>{$GridRows[i].shop_cnt}</a></td>
И выполнить sql код в phpmyadmin:
ALTER TABLE `SC_orders` ADD INDEX ( `customer_email` ); ALTER TABLE `SC_customers` ADD INDEX ( `Email` );
Моему заказчику данная доработка понадобилась для розыгрыша призов за совершение более 2х покупок
Чтобы вручную не прибавлять у двух покупателей с одинаковым Email, доработка считает кол-во покупок по Email а не по ID покупателя, поэтому оно может дублироваться - см скрин
9. Вывод контента информационной страницы в шаблоне по коду {cpt_auxpages_getpage ...}
Задача: сделать возможность из шаблона выводить контент информ. страницы по её коду (slug), например выводить вкладку гарантия внутри карточки товара из информ страницы Гарантия (warranty) через код {cpt_auxpages_getpage auxpage_slug='warranty' overridestyle=''}
скрин1 скрин2 скрин3 скрин4 скрин5
Решение:
Файл \www\published\SC\html\scripts\modules\auxpages\class.auxpages.php
после строчек
196 $this->__registerComponent('auxpages_navigation', 'cpt_lbl_auxpages_navigation', array(TPLID_GENERAL_LAYOUT), null, 197 array( 198 'select_pages' => array('type' => 'select', 'params' => array('name' => 'select_pages', 'title' => '', 'options' => array('all' => 'cpt_lbl_selectaux_type_all', 'selected' => 'cpt_lbl_selectaux_type_selected'), 'onchange' => 'var objDiv = getLayer("cpt-layer-auxpages"); objDiv.style.display=select_getCurrValue(this)=="all"?"none":"";', 'default_value' => 'all')), 199 'auxpages' => array('type' => 'auxpagegroup', 'params' => array('name' => 'auxpages', 'title'=> 'cpt_lbl_selectauxpages','value'=> '', 'options'=> array(), 'before_load' => '<script type="text/javascript">var objDiv = getLayer("cpts-select_pages-select_pages");getLayer("cpt-layer-auxpages").style.display = select_getCurrValue(objDiv)=="all"?"none":"";</script>')), 200 'view' => array('type' => 'radiogroup', 'params' => array('name' => 'view', 'title'=> 'cpt_lbl_view','value'=> 'vertical', 'options'=> array('vertical' => 'cpt_lbl_vertical', 'horizontal' => 'cpt_lbl_horizontal'))), 201 ));
добавить строчку
$this->__registerComponent('auxpages_getpage', 'cpt_lbl_auxpages_getpage', array(TPLID_GENERAL_LAYOUT));
после функции
287 function auxpgGetAuxPage( $aux_page_ID ){ 288 289 $sql = ' 290 SELECT * FROM ?#AUX_PAGES_TABLE WHERE aux_page_ID=? 291 '; 292 $q = db_phquery($sql,$aux_page_ID); 293 $row=db_fetch_row($q); 294 LanguagesManager::ml_fillFields(AUX_PAGES_TABLE, $row); 295 if(!strlen($row['aux_page_slug'])){ 296 $row['aux_page_slug'] = $row['aux_page_ID']; 297 } 298 return $row; 299 }
добавить функцию
function auxpgGetAuxPageBySlug( $aux_page_slug ){ $sql = ' SELECT * FROM ?#AUX_PAGES_TABLE WHERE aux_page_slug=? '; $q = db_phquery($sql,$aux_page_slug); $row=db_fetch_row($q); LanguagesManager::ml_fillFields(AUX_PAGES_TABLE, $row); return $row; }
перед функцией
250 function methodBAuxPage(){ 251 252 ActionsController::exec('AuxAdministrationController', array(ACTCTRL_POST, ACTCTRL_GET, ACTCTRL_AJAX, ACTCTRL_CUST), array('module' => &$this)); 253 }
добавить функцию
function cpt_auxpages_getpage() { list($local_settings) = $this->__getFromStack('call_params'); if(isset($local_settings['local_settings']))$local_settings = $local_settings['local_settings']; $auxpage_slug = $local_settings['auxpage_slug']; $aux_page = $this->auxpgGetAuxPageBySlug($auxpage_slug); print $aux_page['aux_page_text']; }
далее выполнить sql код в phpmydamin
INSERT INTO `SC_interface_interfaces` (`xInterfaceCaller`, `xInterfaceCalled`) VALUES ('51_cpt_connector', '16_auxpages_getpage');
Алгоритм вставки информ страницы в шаблон:
- Создайте информ. страницу в админке, например Гарантия, укажите её ID - например warranty см скрин
- Далее откройте любой шаблон, например \www\published\publicdata\%YOUR_DB_KEY%\attachments\SC\themes\demo\home.html либо через Админку - Дизайн - Редактирование шаблона
- Вставьте в него код с параметром auxpage_slug равным warranty (ID страницы) :
<!-- cpt_container_start -->{cpt_auxpages_getpage auxpage_slug='warranty' overridestyle=''}<!-- cpt_container_end -->
Теперь контент из информ. страницы Гарантия выводится в шаблоне
10. Вывод расширенных характеристик в брифе товара при просмотре каталога
Задача: при просмотре каталога, автоматически вывести заполненные расширенные характеристики товара по которым идет расширенный поиск.Причем не нужно выводить характеристики, которых у товара нет.
скрин1
Решение:
Файл \www\published\SC\html\scripts\includes\category.php
Заменить строку
72 for($i=0; $i<count($products); $i++)$products[$i]['allow_products_comparison'] = $show_comparison;
на
$productsID = array(); for($i=0; $i<count($products); $i++) { $productsID[] = $products[$i]['productID']; $products[$i]['allow_products_comparison'] = $show_comparison; } $optionValuesInProducts = optGetValuesForProducts($productsID, $optionsID);
перед строчкой
102 $smarty->assign( 'main_content_template', 'category.tpl.html');
добавить
$smarty->assign( 'optionValuesInProducts', $optionValuesInProducts);
Файл \www\published\SC\html\scripts\core_functions\option_functions.php
Добавить после
68 function optGetOptionById($optionID){ 69 70 $q = db_phquery('SELECT * FROM ?#PRODUCT_OPTIONS_TABLE WHERE optionID=?',$optionID); 71 if ( $row=db_fetch_row($q) ){ 72 73 LanguagesManager::ml_fillFields(PRODUCT_OPTIONS_TABLE, $row); 74 return $row; 75 }else return null; 76 } 77
строчки
/* get values ONLY for productsID AND optionsID */ function optGetValuesForProducts( array $productsID, array $optionsID ) { if (!$productsID) return array(); $option_value = LanguagesManager::ml_getLangFieldName('option_value'); $sql = <<<SQL SELECT `optionID`, `productID`, {$option_value} FROM `?#PRODUCT_OPTIONS_VALUES_TABLE` WHERE `productID` IN (?@) AND `{$option_value}` IS NOT NULL AND `{$option_value}` != '' SQL; $q = db_phquery($sql, $productsID); $result=array(); while( $row=db_fetch_assoc($q) ){ if (!in_array($row['optionID'], $optionsID)) { continue; } $result[$row['productID']][$row['optionID']] = $row[$option_value]; } return $result; }
Далее в шаблоне \www\published\SC\html\scripts\templates\frontend\product_brief.html
Вставить код вывода характеристик в удобное для вас место
например перед
{if $product_info.brief_description} <div class="prdbrief_brief_description">{$product_info.brief_description}</div> {/if}
вставить
<br /> <div class="prdbrief_brief_description"> <table> {assign var=productID value=$product_info.productID} {section name=i loop=$params} {assign var=optionID value=$params[i].optionID} {if $optionValuesInProducts.$productID.$optionID ne NULL} <tr><td><small>{$params[i].name}</small></td><td></td><td>{$optionValuesInProducts.$productID.$optionID}</td></tr> {/if} {/section} </table> </div>
усё, теперь у нас вместо скучного описания отображаются заполненные характеристики
11. "Вы уже смотрели" - вывод последних 50-ти товаров просмотренных текущим юзером
Задача: выводить блок просмотренных товаров, чтобы пользователь всегда смог найти товары которые просмотрел
скрин1
Решение: идея, html код и css взяты с сайта kupisuvenir.com.ua, за что ему большущее спасибо
Файл \published\SC\html\scripts\modules\products\scripts\product_detailed.php
после строки
if(!isset($a['productID']))RedirectSQ('?');
добавить
// Модуль просмотренных товаров if (!isset($_SESSION["product_viewed"])) { $_SESSION["product_viewed"] = array(); } if (!isset($_SESSION["product_viewed"][ $productID ])) { $_SESSION["product_viewed"][ $productID ] = array( 'name' => $a[LanguagesManager::ml_getLangFieldName('name')], 'PriceWithUnit' => $a["PriceWithUnit"], 'slug' => $a['slug'], 'productID' => $productID, 'thumbnail' => $a['thumbnail'] ? $a['thumbnail'] : ($a['picture'] ? $a['picture'] : null), ); // 50 - количество отображаемых товаров $max_viewed = 50; if (count($_SESSION["product_viewed"]) > $max_viewed) { $_SESSION["product_viewed"] = array_slice($_SESSION["product_viewed"], -$max_viewed, $max_viewed, true); } }
создать файл kernel/includes/smarty/plugins/modifier.array_reverse.php с содержимым:
<?php /* * Smarty plugin * ------------------------------------------------------------- * Type: modifier * Name: array_reverse * Purpose: PHP array_reverse function analog * ------------------------------------------------------------- */ function smarty_modifier_array_reverse($array) { return array_reverse($array); } /* vim: set expandtab: */ ?>
создать файл \published\SC\html\scripts\templates\frontend\widget_product_viewed.html с содержимым
{if $smarty.session.product_viewed} <div class="vuposmotreli"> <div class="cpt_viewed_products"> <h5>Вы уже посмотрели</h5> {foreach from=$smarty.session.product_viewed|@array_reverse item=_session_product_info} {if $_session_product_info.slug} {assign var=_product_url value="?ukey=product&productID=`$_session_product_info.productID`&product_slug=`$_session_product_info.slug`"|set_query_html} {else} {assign var=_product_url value="?ukey=product&productID=`$_session_product_info.productID`"|set_query_html} {/if} <div class="item"> {if $_session_product_info.thumbnail} <div class="picture"> <a href="{$_product_url}"> <img src="{$smarty.const.URL_PRODUCTS_PICTURES}/{$_session_product_info.thumbnail|escape:'url'}" alt="{$_session_product_info.name|escape:'html'}" title="{$_session_product_info.name|escape:'html'}"> </a> </div> {/if} <div class="name"> <a href='{$_product_url}'>{$_session_product_info.name|escape:'html'}</a> </div> <div class="totalPrice">{$_session_product_info.PriceWithUnit}</div> </div> {/foreach} </div> </div> {/if}
Добавить стили в админку, можете изменить их по своему вкусу
/* Vy uzhe smotreli */ .vuposmotreli {border-bottom-color: #DBDBDB;border-bottom-left-radius: 5px;border-bottom-right-radius: 5px;border-bottom-style: solid;border-bottom-width: 1px; border-left-color: #DBDBDB;border-left-style: solid;border-left-width: 1px;border-right-color: #DBDBDB;border-right-style: solid;border-right-width: 1px; border-top-color: #DBDBDB;border-top-left-radius: 5px;border-top-right-radius: 5px;border-top-style: solid;border-top-width: 1px;margin-bottom: 25px;margin-left: 10px;margin-right: 0px;margin-top: 30px; width: 200px;height: 100%;padding-bottom: 5px;padding-left: 5px;padding-right: 5px;padding-top: 5px; -moz-box-shadow: 0 0 3px #cfcfcf;-webkit-box-shadow: 0 0 3px #CFCFCF;box-shadow: 0 0 3px #CFCFCF;} .cpt_viewed_products h5 {background-color: #ffffff;color: #666666;font-family: "Arial";font-size: 15px;font-weight: 700;margin-top: -15px;margin-left: 20px;text-align: left !important;width: 150px; } .cpt_viewed_products div.name a { text-decoration:underline; line-height:17px;font-weight:normal;margin-bottom:0px;} .cpt_viewed_products div.picture a img {width:60px;} .cpt_viewed_products div.totalPrice {color:#FF3300; font-size:12px; font-weight:bold;margin:5px 0 0 65px;} #container_left_sidebar .cpt_viewed_products{padding:0px 0px 0px 5px;height:100%;} .cpt_viewed_products .name {padding:0 0 5px 65px;} .cpt_viewed_products .item {padding:15px 0 20px 0;width:190px} .cpt_viewed_products .picture {padding:0 0 0 0;float:left;}
Добавить в /www/published/publicdata/%ВАШ_КЛЮЧ%/attachments/SC/themes/%ВАША_ТЕМА%/index.html или в любой другой шаблон через админку строчку:
{include file="widget_product_viewed.html"}
там где нужно выводить список просмотренных товаров.
Готово, теперь у вас отображается блок с последними просмотренными товарами, можете изменить кол-во выводимых товаров в файле \published\SC\html\scripts\modules\products\scripts\product_detailed.php , с 50-ти на другое число
fixed bug: не отображались новые просмотренные товары при переполнении максимального числа, спасибо KDSS
fixed bug #2: не работал просмотр товаров в режиме без ЧПУ, смотрите код в файле \published\SC\html\scripts\modules\products\scripts\product_detailed.php, спасибо genixxx
fixed bug #3: при переполнении просмотренных товаров больше max_viewed, новые просмотренные товары начинали дублироваться, спасибо Andrey_M
продолжение следующих доработок, смотрите здесь
Отредактировано anton_slim (2012-09-20 09:24)
Неактивен
Добрый день. Спасибо. отличная доработка.
можете помочь, сделать две очень нужные доработки. Вопрос первый
Можете наглядно показать, как пошагово сделать экспорт и импорт через CSV, "Рекомендуем посмотреть" и "Тэги". как сделать так, чтоб их можно было экспортировать, как остальные параметры товара.
И второй вопрос.
Как сделать второе русское описание, вот нашел пошаговый алгоритм, но он расписан исключительно для спецов, но я не знаю многого, можете расписать все более подробно, чтоб пионер, смог, все повторить
алгоритм предложенный rosst написал:
Добавление поля в Добавить продукт - Основное
\published\SC\html\scrits\slasses\class.product.php - добавляем var $ваша_переменная;
В таблицу SC_products добавляем ваше_поле
В строки локализации добавляем перевод вашего_поля на рус и eng
\published\SC\html\scrits\templates\backend\product_settings.html - Вывод вашей переменной
Добавление столбца в список продуктов в категории
\published\SC\html\scripts\modules\test\_methods\b_categories_products.php - регистрируем заголовок столбца
\published\SC\html\scripts\templates\backend\categories_products.html - Вывод заголовка столбца
Сохранение дополнительного поля в таблицу SC_ordered_carts при оформлении заказа
В таблицу SC_ordered_carts добавляем ваше_поле при оформлении заказа (для вывода потом в инф. о заказе)
\published\SC\html\scripts\classes\class.shoppingcart.php - сохраняем ваше_поле в SC_ordered_carts
Добавление столбца в Редактирование заказа
\published\SC\html\scripts\core_functions\order_functions.php - в ф-цию ordGetOrderContent в запрос SELECT добавляем ваше_поле
\published\SC\html\scripts\templates\backend\order_editor\order.html - добавляем вывод вашего_поля
Добавление столбца в информацию о заказе
\published\SC\html\scripts\templates\backend\order_detailed.html - добавляем вывод вашего_поля
Вроде бы ничего не упустил.
Нашел вот это осталось, только перевести на примере description2.
Неактивен
marimax написал:
Добрый день. Спасибо. отличная доработка.
можете помочь, сделать две очень нужные доработки.
1. А как вы себе это представляете, как это должно записываться в CSV файл ? на примере 5ти товаров, или это мне нужно придумать ?
2. Кидайте доступ, сделаю, после этого выложу сюда подробную мануалку, моему заказчику этого не требуется, сделаю сразу вам.
Неактивен
anton_slim написал:
В файле /www/published/SC/html/scripts/core_functions/configurator_functions.php
добавить строчку #115Код:
114 }else{ // insert query 115 if ($value['option_radio_type'] == "UN_DEFINED") continue; 116 $data_place = '';
а в какое именно место это добавляется? после какого кода (или перед каким) у меня просто версия постарее данного файла
Неактивен
Hunter написал:
а в какое именно место это добавляется? после какого кода (или перед каким) у меня просто версия постарее данного файла
я привел название файла и номера строк, поищите строку }else{ // insert query примерно на 114 строке
Неактивен
нашел строчку
}else{ // insert query
но у меня нет в этом файле вообще
$data_place = '';
у меня вот такой кусок идет:
UPDATE ?#PRODUCT_OPTIONS_VALUES_TABLE SET '.LanguagesManager::sql_prepareFieldUpdate('option_value', $option_value).', option_type=? '.$where_clause.' '; db_phquery($dbq, $option_type); }else{ // insert query $dbq_inj = LanguagesManager::sql_prepareFieldInsert('option_value', $option_value); $dbq = ' INSERT ?#PRODUCT_OPTIONS_VALUES_TABLE (optionID, productID, '.$dbq_inj['fields'].', option_type) VALUES(?, ?, '.$dbq_inj['values'].', ?) '; db_phquery($dbq, $key, $productID, $option_type);
Неактивен
Hunter написал:
нашел строчку
Код:
}else{ // insert queryно у меня нет в этом файле вообще
Код:
$data_place = '';
значит вставляйте после
}else{ // insert query if ($value['option_radio_type'] == "UN_DEFINED") continue;
скорее всего у вас другая версия движка, суть та же код немного другой
Отредактировано anton_slim (2012-05-04 12:26)
Неактивен
вот есть такая функция, и только в ней упоминается option_radio_type:
function cfgUpdateOptionValue( $productID, $updatedValues ){ foreach( $updatedValues as $key => $value ){ if ( $updatedValues[$key]["option_radio_type"] == "UN_DEFINED" || $updatedValues[$key]["option_radio_type"] == "ANY_VALUE" ) { $option_type=0; } else{ $option_type=1; } if ( $updatedValues[$key]["option_radio_type"] == "UN_DEFINED" ){ $option_value = null; }else{ $option_value = $updatedValues[$key]; } $where_clause = " WHERE optionID='".xEscapeSQLstring($key)."' AND productID='".xEscapeSQLstring($productID)."'"; $q=db_query("SELECT COUNT(*) FROM ".PRODUCT_OPTIONS_VALUES_TABLE." ".$where_clause ); $r = db_fetch_row($q); if ( $r[0]==1 ){ // if row exists $dbq = ' UPDATE ?#PRODUCT_OPTIONS_VALUES_TABLE SET '.LanguagesManager::sql_prepareFieldUpdate('option_value', $option_value).', option_type=? '.$where_clause.' '; db_phquery($dbq, $option_type); }else{ // insert query $dbq_inj = LanguagesManager::sql_prepareFieldInsert('option_value', $option_value); $dbq = ' INSERT ?#PRODUCT_OPTIONS_VALUES_TABLE (optionID, productID, '.$dbq_inj['fields'].', option_type) VALUES(?, ?, '.$dbq_inj['values'].', ?) '; db_phquery($dbq, $key, $productID, $option_type); } } }
куда можно вставить Ваш код здесь?
Отредактировано Hunter (2012-05-04 15:18)
Неактивен
см выше написал, после }else{ // insert query
Неактивен
>6. Правильная настройка Webasyst под rewrite nginx
>Задача настроить rewrite без использования Apache, для nginx, чтобы работали все URL адреса при включенном режиме ЧПУ (в админке) решение настроить конфиг для nginx:
Добрый день.
Подскажите пожалуйста, а в каком файле этот конфиг поправлять?
Неактивен
у меня конфиг каждого сайта в отдельном файле, виртуальный хост как в апач, система freebsd8
конфиг моего магазина лежит в файле
/usr/local/etc/nginx/vhosts/gelios52.ru
тот конфиг что я привел выше не полный, полный конфиг сайта должен быть заключен в секцию server {}
server { server_name gelios52.ru; charset utf-8; root /home/gelios52/www; access_log /home/gelios52/logs/access.nginx.log main; error_log /home/gelios52/logs/error.nginx.log error; include conf/static.conf; include conf/deny.conf; location / { if (!-e $request_filename) { rewrite (.*) /published/SC/html/scripts/index.php?__furl_path=$1&frontend=1 last; } index index.html index.php; } location /published/SC/html/scripts/ { if (!-e $request_filename) { rewrite /(.*) /published/SC/html/scripts/index.php?__furl_path=$1&frontend=1 last; } } location /shop/ { rewrite /shop/(.*)? /$1 permanent; } location ~ ^.+\.php.*$ { satisfy any; try_files $fastcgi_script_name =404; fastcgi_pass unix:/tmp/php-fpm.sock; fastcgi_pass_request_body off; fastcgi_param REQUEST_BODY_FILE $request_body_file; fastcgi_temp_path /home/nginx/fastcgi_temp 1 2; fastcgi_intercept_errors on; fastcgi_read_timeout 2m; fastcgi_send_timeout 1m; fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCHEME $scheme; fastcgi_param GEO_COUNTRY_CITY $geo_country_city; # fastcgi_param PHP_ADMIN_VALUE "suhosin.get.max_value_length=4096"; include fastcgi_params; } }
в главном конфиг. файле /usr/local/etc/nginx/nginx.conf после основных настроек в секции http {} прописано:
# nginx config domains include /usr/local/etc/nginx/vhosts/*;
p.s. ну а вообще я бы рекомендовал вам нанять знающего человека, который бы вам все грамотно настроил, в nginx я разобрался не сразу, эту доработку я написал для знающих людей, и если вы не знаток, на живом магазине экспериментировать не советую.
Отредактировано anton_slim (2012-05-08 13:34)
Неактивен
2. При огромном количестве доп. характеристик, база данных каждому товару присваивает все характеристики с пустыми значениями
При 9000 товаров и 950 характеристиках, мы получаем примерно 2 миллиона пустых ненужных значений.
Решение
В файле /www/published/SC/html/scripts/core_functions/configurator_functions.php
добавить строчку #115
Код:
114 }else{ // insert query
115 if ($value['option_radio_type'] == "UN_DEFINED") continue;
а так же выполнить mysql код в phpmyadmin:
Код:
DELETE FROM SC_product_options_values WHERE variantID IS NULL AND option_value_ru = '';
Спасибо!
Неактивен
UPD: добавил еще одну доработку 8. Показ кол-ва удачных покупок по Email адресу в таблице Покупатели, буду дальше продолжать выкладывать по мере свободного времени.
Ребят у кого не получилось подключить доработку API Яндекс быстрый заказ ? напишите мне в skype, помогу
Так же хотелось бы узнать у сообщества, какие доработки вам нужны впервую очередь ? Хочется сделать то чего нужно большинству.
Отредактировано anton_slim (2012-05-13 17:31)
Неактивен
anton_slim написал:
Так же хотелось бы узнать у сообщества, какие доработки вам нужны впервую очередь ? Хочется сделать то чего нужно большинству.
не плохо бы сделать отслеживание посылки на сайте, думаю меня многие поддержат.
Неактивен
UPD: добавлена 9я доработка - cpt_auxpages_getpage вывод информ страницы в шаблоне по ID страницы (slug)
Отредактировано anton_slim (2012-05-15 15:16)
Неактивен
anton_slim написал:
UPD:
Так же хотелось бы узнать у сообщества, какие доработки вам нужны впервую очередь ? Хочется сделать то чего нужно большинству.
пакетная загрузка сопутствующих товаров из 1С (или из .csv или .txt или .xls файла - не важно)
вот это было б супер
(хотя возможно это и не нужно большинству, но некоторым оооочень надо
Отредактировано Hunter (2012-05-14 10:18)
Неактивен
Hunter написал:
пакетная загрузка сопутствующих товаров из 1С (или из .csv или .txt или .xls файла - не важно)
а в 1С разве есть сопутствующие товары и они передаются через обмен ?
Отредактировано anton_slim (2012-05-14 10:25)
Неактивен
ну у нас 7.7, с кучей допилов, это аналогично справочнику Аналоги у нас реализовано, туда заносятся сопутствующие, не знаю, может в 8-ке уже есть отдельный справочник стандартный, ведь потребность такая бывает
есть просто необходимость периодической выгрузки в WA - автоматизации процесса
пакетная выгрузка в WA ну даже не обязательно напрямую из 1С (что конечно лучше), можно просто из файла любого формата, предварительно выгруженного из 1С (со структурой выгрузки и форматами файлов как раз проблем нет), например через тот же импорт (например .csv)
просто у нас много этих сопутствующих и они постоянно добавляются/уточняются
я не нашел на форуме чтобы кто-то это сделал для своего магазина, и так и не понял реально ли это организовать (т.к. сопутствующие товары находятся в отдельной от продуктов таблице)
вот, тема по этому вопросу: http://forum.webasyst.ru/viewtopic.php?id=15284
Отредактировано Hunter (2012-05-14 12:00)
Неактивен
Мне очень нужна пакетная выгрузка из 1С! Особенно сопутствующие товары! Т.к в ручную добавлять на сайте просто не реально.
А еще выгрузка из 1 С товаров "Со скидкой", чтобы на сайте была и старая и новая цена.)
Неактивен
Tatyana Выгрузка из 1С и так реализована через обмен, в версии 8.2 Управление Торговлей
Hunter Сопутствующие товары сделать через импорт .xml реально, нужно придумать только формат, опишите его и я попробую реализовать, но лучше это сделать через 1С если она штатно это позволяет, потому что связь по ID из 1С надежнее чем по наименованию (на сайте и в 1с они могут отличаться)
Неактивен
anton_slim написал:
Tatyana Выгрузка из 1С и так реализована через обмен, в версии 8.2 Управление Торговлей
Hunter Сопутствующие товары сделать через импорт .xml реально, нужно придумать только формат, опишите его и я попробую реализовать, но лучше это сделать через 1С если она штатно это позволяет, потому что связь по ID из 1С надежнее чем по наименованию (на сайте и в 1с они могут отличаться)
естественно надежнее,
у нас реализовано что id = уникальному артикулу 1С
просто по-хорошему, xml это хорошо и правильно, но хотелось бы для 7.7
чтото типа парсера, который, как я уже писал в теме: http://forum.webasyst.ru/viewtopic.php?id=15284
через например обычный текстовый формат:
0555,0123,0124,0125
0666,0124,0128
0777
0888,0123,0128,0129,0130
где 0555,0666,0777,0888 - id товаров, к которым соответственно строкам привязаны id сопутствующих товаров
где разделитель либо запятая либо табуляция либо еще что-то
вообще сейчас у нас выгрузка с локального сервера, где крутится 1С, например цен и количества реализована автоматом по расписанию напрямую в базу WA через ssh-туннель, раз в час в течении рабочего дня, понимаю что это не комильфо с точки зрения правильности обмена (xml - правильнее), но зато это быстрее и меньше геморроя и можно гибко настраивать период выгрузки
вот по-хорошему бы хочется чтобы сопутствующие товары таким же макаром писАлись напрямую в БД.
но вполне устроит если можно бы чтото типа штатного импорта WA сделать например загрузку через cvs или txt файл со структурой файла, описанного выше.
Неактивен
UPD: добавлена новая доработка 10. Вывод расширенных характеристик в брифе товара при просмотре каталога
Неактивен
Ну что ж поздравим alp-book со значком Быстрый заказ - http://clip2net.com/s/1Vz9a
Никакая статистика не нужна, просто нужно подождать и яндекс обновит всё сам, если пользователи юзают Профиль из Яндекса
Неактивен
51_cpt_connector', '16_auxpages_getpage - это величины постоянные или они для каждого свои ?
Неактивен
elsov написал:
51_cpt_connector', '16_auxpages_getpage - это величины постоянные или они для каждого свои ?
я так думаю что постоянны, подбирал методом тыка, пока не до конца понял как обрабатываются компоненты у движка, но если не заработает обратитесь, помогу допилить чтоб заработало.
Неактивен