#1 2012-04-24 13:49

anton_slim
Пользователь

Мои доработки ошибок и дополнений к движку web-asyst shop script

По совету администратора 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}&nbsp;</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)

Неактивен

 

#2 2012-04-24 22:51

marimax
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

Добрый день. Спасибо. отличная доработка.
можете помочь, сделать две очень нужные доработки. Вопрос первый
Можете наглядно показать, как пошагово сделать экспорт и импорт через 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.

Неактивен

 

#3 2012-05-02 13:51

anton_slim
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

marimax написал:

Добрый день. Спасибо. отличная доработка.
можете помочь, сделать две очень нужные доработки.

1. А как вы себе это представляете, как это должно записываться в CSV файл ? на примере 5ти товаров, или это мне нужно придумать ?
2. Кидайте доступ, сделаю, после этого выложу сюда подробную мануалку, моему заказчику этого не требуется, сделаю сразу вам.

Неактивен

 

#4 2012-05-02 15:02

Hunter
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

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 = '';

а в какое именно место это добавляется? после какого кода (или перед каким) у меня просто версия постарее данного файла

Неактивен

 

#5 2012-05-03 11:36

anton_slim
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

Hunter написал:

а в какое именно место это добавляется? после какого кода (или перед каким) у меня просто версия постарее данного файла

я привел название файла и номера строк, поищите строку }else{ // insert query примерно на 114 строке

Неактивен

 

#6 2012-05-04 10:55

Hunter
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

нашел строчку
       

Код:

}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);

Неактивен

 

#7 2012-05-04 12:25

anton_slim
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

Hunter написал:

нашел строчку
       

Код:

}else{ // insert query

но у меня нет в этом файле вообще

Код:

$data_place = '';

значит вставляйте после

Код:

        }else{ // insert query
            if ($value['option_radio_type'] == "UN_DEFINED") continue;

скорее всего у вас другая версия движка, суть та же код немного другой

Отредактировано anton_slim (2012-05-04 12:26)

Неактивен

 

#8 2012-05-04 15:17

Hunter
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

вот есть такая функция, и только в ней упоминается 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)

Неактивен

 

#9 2012-05-04 19:39

anton_slim
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

см выше написал, после }else{ // insert query

Неактивен

 

#10 2012-05-07 13:38

TechnoMan
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

>6. Правильная настройка Webasyst под rewrite nginx
>Задача настроить rewrite без использования Apache, для nginx, чтобы работали все URL адреса при включенном режиме ЧПУ (в админке) решение настроить конфиг для nginx:

Добрый день.

Подскажите пожалуйста, а в каком файле этот конфиг поправлять?

Неактивен

 

#11 2012-05-08 13:28

anton_slim
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

у меня конфиг каждого сайта в отдельном файле, виртуальный хост как в апач, система 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)

Неактивен

 

#12 2012-05-09 16:15

lemad
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

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 = '';

Спасибо!

Неактивен

 

#13 2012-05-13 17:30

anton_slim
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

UPD: добавил еще одну доработку 8. Показ кол-ва удачных покупок по Email адресу в таблице Покупатели, буду дальше продолжать выкладывать по мере свободного времени.
Ребят у кого не получилось подключить доработку API Яндекс быстрый заказ ? напишите мне в skype, помогу

Так же хотелось бы узнать у сообщества, какие доработки вам нужны впервую очередь ? Хочется сделать то чего нужно большинству.

Отредактировано anton_slim (2012-05-13 17:31)

Неактивен

 

#14 2012-05-13 17:34

exsoft
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

anton_slim написал:

Так же хотелось бы узнать у сообщества, какие доработки вам нужны впервую очередь ? Хочется сделать то чего нужно большинству.

не плохо бы сделать отслеживание посылки на сайте, думаю меня многие поддержат.

Неактивен

 

#15 2012-05-14 10:16

anton_slim
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

UPD: добавлена 9я доработка - cpt_auxpages_getpage вывод информ страницы в шаблоне по ID страницы (slug)

Отредактировано anton_slim (2012-05-15 15:16)

Неактивен

 

#16 2012-05-14 10:17

Hunter
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

anton_slim написал:

UPD:
Так же хотелось бы узнать у сообщества, какие доработки вам нужны впервую очередь ? Хочется сделать то чего нужно большинству.

пакетная загрузка сопутствующих товаров из 1С (или из .csv или .txt или .xls файла - не важно)
вот это было б супер
(хотя возможно это и не нужно большинству, но некоторым оооочень надоsmile

Отредактировано Hunter (2012-05-14 10:18)

Неактивен

 

#17 2012-05-14 10:24

anton_slim
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

Hunter написал:

пакетная загрузка сопутствующих товаров из 1С (или из .csv или .txt или .xls файла - не важно)

а в 1С разве есть сопутствующие товары и они передаются через обмен ?

Отредактировано anton_slim (2012-05-14 10:25)

Неактивен

 

#18 2012-05-14 11:58

Hunter
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

ну у нас 7.7, с кучей допилов, это аналогично справочнику Аналоги у нас реализовано, туда заносятся сопутствующие, не знаю, может в 8-ке уже есть отдельный справочник стандартный, ведь потребность такая бывает
есть просто необходимость периодической выгрузки в WA - автоматизации процесса

пакетная выгрузка в WA ну даже не обязательно напрямую из 1С (что конечно лучше), можно просто из файла любого формата, предварительно выгруженного из 1С (со структурой выгрузки и форматами файлов как раз проблем нет), например через тот же импорт (например .csv)
просто у нас много этих сопутствующих и они постоянно добавляются/уточняются

я не нашел на форуме чтобы кто-то это сделал для своего магазина, и так и не понял реально ли это организовать (т.к. сопутствующие товары находятся в отдельной от продуктов таблице)
вот, тема по этому вопросу: http://forum.webasyst.ru/viewtopic.php?id=15284

Отредактировано Hunter (2012-05-14 12:00)

Неактивен

 

#19 2012-05-14 12:38

Tatyana
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

Мне очень нужна пакетная выгрузка из 1С! Особенно сопутствующие товары! Т.к в ручную добавлять на сайте просто не реально.
А еще выгрузка из 1 С товаров "Со скидкой", чтобы на сайте была и старая и новая цена.)

Неактивен

 

#20 2012-05-14 13:01

anton_slim
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

Tatyana Выгрузка из 1С и так реализована через обмен, в версии 8.2 Управление Торговлей
Hunter Сопутствующие товары сделать через импорт .xml реально, нужно придумать только формат, опишите его и я попробую реализовать, но лучше это сделать через 1С если она штатно это позволяет, потому что связь по ID из 1С надежнее чем по наименованию (на сайте и в 1с они могут отличаться)

Неактивен

 

#21 2012-05-14 15:08

Hunter
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

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 файл со структурой файла, описанного выше.

Неактивен

 

#22 2012-05-15 17:07

anton_slim
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

UPD: добавлена новая доработка 10. Вывод расширенных характеристик в брифе товара при просмотре каталога

Неактивен

 

#23 2012-05-17 00:09

anton_slim
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

Ну что ж поздравим alp-book со значком Быстрый заказ - http://clip2net.com/s/1Vz9a
Никакая статистика не нужна, просто нужно подождать и яндекс обновит всё сам, если пользователи юзают Профиль из Яндекса

Неактивен

 

#24 2012-05-17 21:40

elsov
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

51_cpt_connector', '16_auxpages_getpage - это величины постоянные или они для каждого свои ?

Неактивен

 

#25 2012-05-21 17:03

anton_slim
Пользователь

Re: Мои доработки ошибок и дополнений к движку web-asyst shop script

elsov написал:

51_cpt_connector', '16_auxpages_getpage - это величины постоянные или они для каждого свои ?

я так думаю что постоянны, подбирал методом тыка, пока не до конца понял как обрабатываются компоненты у движка, но если не заработает обратитесь, помогу допилить чтоб заработало.

Неактивен

 

Board footer

Powered by PunBB