Множественные значения свойств
Измененные файлы
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);