Jump to content

Дополнительные услуги


Recommended Posts

Сделал себе в админке и в карточке товара доп. услуги, например "подарочная упаковка"

Готов поделиться решением если инитересно

Зачем создаете тему в готовых решениях если решение не расшарили?
Link to post
Share on other sites

1. Через phpmyadmin создаем две таблицы:

 

CREATE TABLE IF NOT EXISTS `s_dopservice` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `description` text NOT NULL,
  `free_from` float(10,2) NOT NULL,
  `price` float(10,2) NOT NULL,
  `enabled` tinyint(1) NOT NULL DEFAULT '0',
  `position` int(11) NOT NULL,
  `separate_payment` int(1) DEFAULT '1',
  PRIMARY KEY (`id`),
  KEY `position` (`position`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 

 

CREATE TABLE IF NOT EXISTS `s_orders_dopservice` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `orders_id` int(11) DEFAULT NULL,
  `dopservice_id` int(11) DEFAULT NULL,
  `dopservice_price` float(10,2) NOT NULL DEFAULT '0.00',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 

2. В папку simpla заливаем два файла:
http://erosexyn.ru/DopService.7z

 

3. В папку api заливаем файл:
http://erosexyn.ru/Dopservice2.7z 

 

 

Link to post
Share on other sites

4. В папку simpla/design/html заливаем два файла:
http://erosexyn.ru/DopService3.7z

 

3. Открываем файл api/Managers.php 
 

4. Находим строчку:

 

 

public $permissions_list = array('products', 'categories', 'brands', 'features', 'orders', 'labels',
        'users', 'groups', 'coupons', 'pages', 'blog', 'news', 'comments', 'feedbacks', 'import', 'export',
        'backup', 'stats', 'design', 'settings', 'currency', 'delivery', 'payment', 'managers', 'license');
 

 

 

Добавляем после 'license': ,'dopservice', 'dopservices' Должно получиться:

 

 

public $permissions_list = array('products', 'categories', 'brands', 'features', 'orders', 'labels',
        'users', 'groups', 'coupons', 'pages', 'blog', 'news', 'comments', 'feedbacks', 'import', 'export',
        'backup', 'stats', 'design', 'settings', 'currency', 'delivery', 'payment', 'managers', 'license','dopservice', 'dopservices',);
 

 

 

4. Открываем файл api/Notify.php

5. Находим строчку (92 сторка):

 

 

// Способ доставки
        $delivery = $this->delivery->get_delivery($order->delivery_id);
        $this->design->assign('delivery', $delivery);
 

 

 

После нее вставляем:

 

 

$dopservice = $this->dopservice->get_orders_dopservice($order->id);
        $this->design->assign('dopservices', $dopservice);
        
        $dopservice_price = $this->dopservice->get_orders_price_dopservice($order->id);
        $this->design->assign('dopservice_price', $dopservice_price);
 

 

Link to post
Share on other sites

Вместо  $order->total_price пишем: $order->total_price = $order->total_price + $dopservice_price->dprice; 

 

6. В этом же файле находим (155 сторка):

 

 

// Способ доставки
        $delivery = $this->delivery->get_delivery($order->delivery_id);        $this->design->assign('delivery', $delivery);   
 

 

 

Ниже добавляем:

 

 

$dopservices = $this->dopservice->get_orders_dopservice($order->id);
        $this->design->assign('dopservices', $dopservices);       
        
        $dopservice_price = $this->dopservice->get_orders_price_dopservice($order->id);
        $this->design->assign('dopservice_price', $dopservice_price);
                
        $order->total_price = $order->total_price + $dopservice_price->dprice; 
 

 

 

7. Открываем api/Orders.php 

8. После функции: 

 

 

public function delete_order_labels($id, $labels_ids)

    {

        $labels_ids = (array)$labels_ids;

        if(is_array($labels_ids))

        foreach($labels_ids as $l_id)

            $this->db->query("DELETE FROM __orders_labels WHERE order_id=? AND label_id=?", $id, $l_id);

    }
 

 

Добавлем: 

 

//Управление доп. услугами

    function get_order_dopservice($order_id = array())

    {

        if(empty($order_id))

            return array();



        $dopservice_id_filter = $this->db->placehold('AND orders_id in(?@)', (array)$order_id);

                

        $query = $this->db->placehold("SELECT ol.orders_id, l.id, l.name, l.position, l.price, l.free_from

                    FROM __dopservice l LEFT JOIN __orders_dopservice ol ON ol.dopservice_id = l.id

                    WHERE

                    1

                    $dopservice_id_filter

                    ORDER BY position

                    ");

        

        $this->db->query($query);

        return $this->db->results();

    }

    

    public function update_order_dopservice($id, $dopservice_ids)

    {

        $dopservice_ids = (array)$dopservice_ids;

        $query = $this->db->placehold("DELETE FROM __orders_dopservice WHERE orders_id=?", intval($id));

        $this->db->query($query);

        if(is_array($dopservice_ids))

        foreach($dopservice_ids as $l_id)

            $this->db->query("INSERT INTO __orders_dopservice SET orders_id=?, dopservice_id=?", $id, $l_id);

    }



    public function add_order_dopservice($id, $dopservice_ids)

    {

        $dopservice_ids = (array)$dopservice_ids;

        if(is_array($dopservice_ids))

        foreach($dopservice_ids as $l_id)

        {

            $this->db->query("INSERT INTO __orders_dopservice SET orders_id=?, dopservice_id=?", $id, $l_id);


        }

    }



    public function delete_order_dopservice($id, $labels_ids)

    {

        $dopservice_ids = (array)$dopservice_ids;

        if(is_array($dopservice_ids))

        foreach($dopservice_ids as $l_id)

            $this->db->query("DELETE FROM __orders_dopservice WHERE orders_id=? AND dopservice_id=?", $id, $l_id);

    }
//
 

 

Link to post
Share on other sites

9. Открываем api/Simpla_classic.php

10. После require_once('api/Delivery.php'); добавляем require_once('api/Dopservice.php');

11. После 

 

$this->delivery        = &self::$simpla_instance->delivery;
 

 

 Добавляем:

 

$this->dopservice = &self::$simpla_instance->dopservice;
 

 

12. После 

 

$this->delivery        = new Delivery(); 
 

 

Добавляем: 

 

$this->dopservice = new Dopservice();
 

 

 

13. В нужном месте шаблона cart.tpl вставляем:

 

{* Дополнительные услуги *}
{if $dopservices}
<h2>Выберите Допольнительные услуги:</h2>
<ul id="deliveries">

    {foreach $dopservices as $dopservice}

    <li>
        <div class="checkbox">
            <input type="checkbox" name="dopservice[]" value="{$dopservice->id}" {if $dopservice_id==$dopservice->id}checked{elseif $dopservice@first}checked{/if} id="dopservices_{$dopservice->id}">
        </div>
        <h3>
            <label for="dopservices_{$dopservice->id}">
            


                {$dopservice->name}
{if $cart->total_price < $dopservice->free_from && $dopservice->price>0}
({$dopservice->price|convert} {$currency->sign})
    {elseif $cart->total_price >= $dopservice->free_from}
(бесплатно)
    {/if}






            </label>
        </h3>
            <div class="description">
            {$dopservice->description}
            </div>
    </li>
    {/foreach}
</ul>
{/if}

 

 

14. В файле шаблона: email_order.tpl вставляем:

 

{if $dopservices}

    {foreach $dopservices as $dopservice}
    <tr>
        <td style="padding:6px; width:100; padding:6px; background-color:#ffffff; border:1px solid #e0e0e0;font-family:arial;"></td>
        <td style="padding:6px; background-color:#f0f0f0; border:1px solid #e0e0e0;font-family:arial;">
            <b><font color="green">Доп. услуга: {$dopservice->name}</font></b><br />
<i>
            {$dopservice->description}
     </i>
        </td>
        <td align="right" style="padding:6px; text-align:right; width:170; background-color:#ffffff; border:1px solid #e0e0e0;font-family:arial;">
            {if $cart->total_price < $dopservice->free_from && $dopservice->price>0}
{$dopservice->price|convert} {$currency->sign}
    {elseif $cart->total_price >= $dopservice->free_from}
бесплатно
    {/if}
        </td>
    </tr>



    {/foreach}

{/if}

 

 

15. Открываем simpla/CurrencyAdmin.php

16. После 

 

$this->db->query("UPDATE __delivery SET price=price*?, free_from=free_from*?", $coef, $coef);  
 

 

Добавляем: 

 

$this->db->query("UPDATE __dopservice SET price=price*?, free_from=free_from*?", $coef, $coef);
 

 

 

 

Link to post
Share on other sites

17. Открываем simpla/IndexAdmin.php

18. После 
 

'DeliveryAdmin' => 'delivery',
 

 

Добавляем:

 

'DopservicesAdmin' => 'dopservices',
'DopserviceAdmin' => 'dopservice',
 

 

19. Открываем simpla/OrderAdmin.php

20. После 

 

$this->design->assign('subtotal', $subtotal);
 

 


Добавляем:

 

$dopservice_price = $this->dopservice->get_orders_price_dopservice($order->id);
$this->design->assign('dopservice_price', $dopservice_price->dprice);
$order->total_price = $order->total_price + $dopservice_price->dprice;
 

 

21. После:

 

$this->design->assign('order_labels', $order_labels);
 

 

Добавляем:

 

// Доп. услуги

         $dopservices = $this->orders->get_dopservices();

         $this->design->assign('dopservices', $dopservices);

$dopservices_in_order = $this->orders->get_order_dopservice($order->id);

         $this->design->assign('dopservices_in_order', $dopservices_in_order);
         

         $this->design->assign('order_dopservices', $order_dopservices);         
 

 

 

Все! Если будут вопросы пишите

   
Link to post
Share on other sites

Сделал себе в админке и в карточке товара доп. услуги, например "подарочная упаковка"

А Вы не могли бы объяснить хоть немного Ваш замысел, то есть дать описание хоть краткое?

 

Непонятно как минимум следующее:

1. Пишете "Сделал ... в карточке товара", а судя по описанию, в карточке товара у Вас НИЧЕГО не меняется.

2. Насколько можно понять из описания, допуслуга добавляется на странице корзины и относится к ЗАКАЗУ, а никак не к товару. Допуслуга только одна может быть выбрана?

3. Версия какая? Упоминающийся у Вас api/Simpla_classic.php в последних версиях не используется.

Link to post
Share on other sites

Упоминающийся у Вас api/Simpla_classic.php в последних версиях не используется.

Этот файл вообще никогда не использовался, я на этот счет общался с Денисом.
Link to post
Share on other sites

Да действительно это моя оплошность! Доп услуги появляются в корзине и в заказе!

Файл остался уже не помню зачем и откуда - он действительно не используется

Версия симплы 2.2.4

Link to post
Share on other sites

А Вы не могли бы объяснить хоть немного Ваш замысел, то есть дать описание хоть краткое?

 

Непонятно как минимум следующее:

1. Пишете "Сделал ... в карточке товара", а судя по описанию, в карточке товара у Вас НИЧЕГО не меняется.

2. Насколько можно понять из описания, допуслуга добавляется на странице корзины и относится к ЗАКАЗУ, а никак не к товару. Допуслуга только одна может быть выбрана?

3. Версия какая? Упоминающийся у Вас api/Simpla_classic.php в последних версиях не используется.

 Доп услуги чекбоксами сделаны - т.е можно выбрать неограниченное кол-во доп услуг

Link to post
Share on other sites

В действительности у Вас доп услуга есть часть ЗАКАЗА, то есть выступает фактически как ТОВАР.

И намного проще было бы оформить ее технически как ТОВАР, например, из специальной (неактивной) категории. На странице корзины вставить доп услуги как товары с возможностью добавления. И добавить контроль корзины и запись заказа: количество таких специальных товаров - 0 или 1, ставить цену нулевую, если надо. Понадобятся изменения всего лишь в 3-5 файлах и не придется ничего или почти ничего менять в структуре базы.

 

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

И описаны явно не все изменения. Например, согласно текущему описанию страница доп услуг в админке будет секретной, так как НИГДЕ НЕ БУДЕТ ссылок на нее, поскольку не меняются соседние шаблоны админки. Вероятнее всего, подобных моментов еще немало. И если их все поправить, то будет уже порядка 30 пунктов изменений...

Link to post
Share on other sites

Зачем так радикально?  Идея вполне хорошая и жизнеспособная.

Тема пусть живет, может, кому пригодится. Народу на форуме немало, кто любит попа, а кто попадью...

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...