Мультисвойства для товаров

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

Julius123 M
Julius123 M
Репутация: 20
Сообщения: 225
Зарегистрирован: 05.02.2017
С нами: 7 лет 2 месяца

Сообщение #1 Julius123 » 29.03.2017, 11:05

Есть доработка для Simpla CMS чтобы указывать несколько значений для одного свойства товара, например Цвет: Синий, Красный. Но как бы не пытался переделать для Окай не получается, может кто сможет. Готов даже оплатить вознаграждением.


Множественные значения свойств
Измененные файлы
simpla/ProductAdmin.php
simpla/design/html/product.tpl
simpla/design/css/style.css
view/ProductView.php
simpla/ajax/import.php и simpla/ajax/export.php

Создать доработку системы для внесения множественного значения характеристик для
Simpla 2.3


Изменения в MySQL
Запрос в БД:

Код: Выделить всё

ALTER TABLE `s_options` CHANGE `value` `value` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
ALTER TABLE `s_options` DROP PRIMARY KEY , ADD PRIMARY KEY ( `product_id` , `feature_id` , `value` );


Содержимое запросов ниже:
Изменение длины текстового значения:
Необходимо для создания группового ключа по 3 значения:
ALTER TABLE `s_options` CHANGE `value` `value` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
Изменение группового ключа:
ALTER TABLE `s_options` DROP PRIMARY KEY ,
ADD PRIMARY KEY ( `product_id` , `feature_id` , `value` )

Измененные файлы

simpla/ProductAdmin.php

Обрабатываем входные данные из POST-запроса. Для этого находим и заменяем (стр. 245)

Код: Выделить всё

if(is_array($options))
foreach($options as $option)
{
   if(in_array($option->feature_id, $category_features))
      $this->features->update_option($product->id, $option->feature_id, $option->value);
}


на следующий код

Код: Выделить всё

if(is_array($options))
   foreach($options as $option)
   {
      if(in_array($option->feature_id, $category_features))
          if(is_array($option->value))
              foreach($option->value as $value)
                  $this->features->update_option($product->id, $option->feature_id, $value);
          else
        $this->features->update_option($product->id, $option->feature_id, $option->value);
   }


Преобразуем набор характеристик в массив свойств. Заменяем код (стр. 357)

Код: Выделить всё

if(is_array($options))
{
   $temp_options = array();
   foreach($options as $option)
      $temp_options[$option->feature_id] = $option;
   $options = $temp_options;
}


на следующий

Код: Выделить всё

if(is_array($options))
{
   $temp_options = array();
   foreach($options as $option) {
       $temp_options[$option->feature_id]->feature_id = $option->feature_id;
       if(is_array($option->value)) 
           $temp_options[$option->feature_id]->values = $option->value;   
       else
           $temp_options[$option->feature_id]->values[] = $option->value;   
   }
       
   $options = $temp_options;
}   


simpla/design/html/product.tpl

Заменяем строку (175)

Код: Выделить всё

line = $("<li><label class=property></label><input class='simpla_inp' type='text'/></li>");


на код

Код: Выделить всё

line = $("<li><label class=property></label><span><input class='simpla_inp' type='text'/> <span class='add'></span></span></li>");


Далее перед строкой (стр. 208)

Код: Выделить всё

// Добавление нового свойства товара


добавляем код, динамический добавляющий и удаляющий новое значение свойства

Код: Выделить всё

//Добавление нового значения свойства
$('.prop_ul .add').live('click', function() {
  $($(this).prev()).clone().val('').after(' <span class="delete"></span>').insertAfter($(this));
});
//Удаление значения свойства
$('.prop_ul .delete').live('click', function() {
   $(this).prev().remove();
   $(this).remove();   
});


Далее в этом же файле вместо кода (стр. 620)

Код: Выделить всё

<ul class="prop_ul">
        {foreach $features as $feature}
           {assign var=feature_id value=$feature->id}
           <li feature_id={$feature_id}><label class=property>{$feature->name}</label><input class="simpla_inp" type="text" name=options[{$feature_id}] value="{$options.$feature_id->value|escape}" /></li>
        {/foreach}
     </ul>


вставляем код

Код: Выделить всё

<ul class="prop_ul">
                {foreach $features as $feature}
                {assign var=i value=0}
                <li feature_id={$feature->id}>
                    <label class=property>{$feature->name}</label>
                    <span>
                    {if $options[$feature->id]->values}
                    {foreach $options[$feature->id]->values as $value}
                    <input class="simpla_inp" type="text" name="options[{$feature->id}][]" value="{$value|escape}" /> <span class="{if $i>0}delete{else}add{/if}"></span>
                    {assign var=i value=$i+1}
                    {/foreach}
                    {else}{*if $options[$feature->id->values*}
                    <input class="simpla_inp properties" type="text" name="options[{$feature->id}][]" value="" /> <span class="add"></span>
                    {/if}
                    </span>
                </li>
                {/foreach}
            </ul>   


simpla/design/css/style.css

В конце файла стилей добавляем определения для новый значений элементов

Код: Выделить всё

#product .prop_ul li { border-bottom: solid 1px #d0d0d0; width: auto; }
#product .prop_ul li span { }
#product .prop_ul input[type=text] {width: 250px!important; float: left; margin-bottom: 4px;}
#product .prop_ul li>span:not(:first-child) { margin-left: 170px; display: block; width: 276px; }
#product .prop_ul span.add, #product .prop_ul span.delete { display: inline-block; width: 16px; height: 16px; margin: 4px 2px 6px; background: url(../images/plus-circle.png) no-repeat; padding: 0; cursor: pointer; }
#product .prop_ul span.delete { background-image: url(../images/cross-circle-frame.png);}


view/ProductView.php

Добавляем обработчик множественных свойств в вывод товара (стр. 49)

Код: Выделить всё

$product->features = $this->features->get_product_options(array('product_id'=>$product->id));


Заменяем на код

Код: Выделить всё

$temp_options = array();
        foreach($product->features as $option) {
           $temp_options[$option->feature_id]->feature_id = $option->feature_id;
           $temp_options[$option->feature_id]->name = $option->name;
           $temp_options[$option->feature_id]->values[] = $option->value;   
        }
               
        foreach($temp_options as $id => $option)
           $temp_options[$id]->value = implode(', ', $temp_options[$id]->values);       
                   
        $product->features = $temp_options;


simpla/ajax/import.php

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

Заменяем строку (78)

Код: Выделить всё

          if(!isset($products[$option->product_id][$option->name]))
                    $products[$option->product_id][$option->name] = $option->value;


на код

Код: Выделить всё

                if(!isset($products[$option->product_id][$option->name]))
                    $products[$option->product_id][$option->name] = $option->value;
                else
                    $products[$option->product_id][$option->name] .= ','.$option->value; 


simpla/ajax/export.php

Заменяем строку (299)

Код: Выделить всё

$this->features->update_option($product_id, $feature_id, $feature_value);


на код

Код: Выделить всё

                    foreach(explode(',', $feature_value) as $f_value)       
                        $this->features->update_option($product_id, $feature_id, $f_value);

trainracing M
Аватара
trainracing M
Возраст: 31
Репутация: 13
Сообщения: 121
Зарегистрирован: 07.10.2016
С нами: 7 лет 6 месяцев
Сайт

Сообщение #2 trainracing » 30.03.2017, 10:39

class='simpla_inp' заменить на class='okay_inp'

Julius123 M
Julius123 M
Репутация: 20
Сообщения: 225
Зарегистрирован: 05.02.2017
С нами: 7 лет 2 месяца

Сообщение #3 Julius123 » 30.03.2017, 15:05

trainracing писал(а):class='simpla_inp' заменить на class='okay_inp'
Я так и делал.
Проблема именно в этом пункте:

simpla/design/html/product.tpl

Заменяем строку (175)

Код: Выделить всё

line = $("<li><label class=property></label><input class='simpla_inp' type='text'/></li>");


на код

Код: Выделить всё

line = $("<li><label class=property></label><span><input class='simpla_inp' type='text'/> <span class='add'></span></span></li>");


Далее перед строкой (стр. 208)

Код: Выделить всё

// Добавление нового свойства товара


добавляем код, динамический добавляющий и удаляющий новое значение свойства

Код: Выделить всё

//Добавление нового значения свойства
$('.prop_ul .add').live('click', function() {
  $($(this).prev()).clone().val('').after(' <span class="delete"></span>').insertAfter($(this));
});
//Удаление значения свойства
$('.prop_ul .delete').live('click', function() {
   $(this).prev().remove();
   $(this).remove();   
});


Далее в этом же файле вместо кода (стр. 620)

Код: Выделить всё

<ul class="prop_ul">
        {foreach $features as $feature}
           {assign var=feature_id value=$feature->id}
           <li feature_id={$feature_id}><label class=property>{$feature->name}</label><input class="simpla_inp" type="text" name=options[{$feature_id}] value="{$options.$feature_id->value|escape}" /></li>
        {/foreach}
     </ul>


вставляем код

Код: Выделить всё

<ul class="prop_ul">
                {foreach $features as $feature}
                {assign var=i value=0}
                <li feature_id={$feature->id}>
                    <label class=property>{$feature->name}</label>
                    <span>
                    {if $options[$feature->id]->values}
                    {foreach $options[$feature->id]->values as $value}
                    <input class="simpla_inp" type="text" name="options[{$feature->id}][]" value="{$value|escape}" /> <span class="{if $i>0}delete{else}add{/if}"></span>
                    {assign var=i value=$i+1}
                    {/foreach}
                    {else}{*if $options[$feature->id->values*}
                    <input class="simpla_inp properties" type="text" name="options[{$feature->id}][]" value="" /> <span class="add"></span>
                    {/if}
                    </span>
                </li>
                {/foreach}
            </ul> 



Вот этот код при замене не подходит, и свойства вообще пропадают.

Далее в этом же файле вместо кода (стр. 620)

Код: Выделить всё

<ul class="prop_ul">
        {foreach $features as $feature}
           {assign var=feature_id value=$feature->id}
           <li feature_id={$feature_id}><label class=property>{$feature->name}</label><input class="simpla_inp" type="text" name=options[{$feature_id}] value="{$options.$feature_id->value|escape}" /></li>
        {/foreach}
     </ul>


вставляем код

Код: Выделить всё

<ul class="prop_ul">
                {foreach $features as $feature}
                {assign var=i value=0}
                <li feature_id={$feature->id}>
                    <label class=property>{$feature->name}</label>
                    <span>
                    {if $options[$feature->id]->values}
                    {foreach $options[$feature->id]->values as $value}
                    <input class="simpla_inp" type="text" name="options[{$feature->id}][]" value="{$value|escape}" /> <span class="{if $i>0}delete{else}add{/if}"></span>
                    {assign var=i value=$i+1}
                    {/foreach}
                    {else}{*if $options[$feature->id->values*}
                    <input class="simpla_inp properties" type="text" name="options[{$feature->id}][]" value="" /> <span class="add"></span>
                    {/if}
                    </span>
                </li>
                {/foreach}
            </ul> 

Julius123 M
Julius123 M
Репутация: 20
Сообщения: 225
Зарегистрирован: 05.02.2017
С нами: 7 лет 2 месяца

Сообщение #4 Julius123 » 05.04.2017, 10:29

Вопрос исчерпан.


Вернуться в «Полезные решения для OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 9 гостей