Основные отличия от модуля namer-а:
- картинки можно присваивать не только новым создаваемым вариантам, но и любому уже имеющемуся
- файлы картинок удаляются при удалении варианта
- файл картинки сохраняет исходное имя если такого файла нет либо получает имя *_1.*, *_2.*, *_3.* и так далее, т.е. первое по счету не занятое.
Где-то получилось сложнее, чем в модуле namer-а, где-то проще. Изменения в коде product_brief.tpl.html и product_detailed.tpl.html (пункты 7 и 8) родные namer-овские, ничего не менял, т.к. "другой модуль" этих файлы не затрагивает.
Спонсор создания инструкции - l17l
Что не понятно - спрашивайте. Но не в личке, а тут.
Админка выглядит примерно так:
1.JPG 48.1К 167 Количество загрузок:
================================================
Инструкция по установке модуля картинок для вариантов характеристик и вывода их (картинок) в шаблонах краткого и полного описания.
1. в файле option_functions.php
1.1 в функции optGetOptionValues строку
$q = db_query("select variantID, optionID, option_value, sort_order from ".
заменяем на
# BEGIN variants-with-pictures
#$q = db_query("select variantID, optionID, option_value, sort_order from ".
$q = db_query("select variantID, optionID, option_value, sort_order, picture from ".
# END variants-with-pictures
1.2 в конец файла добавляем функцию
# BEGIN variants-with-pictures
function optaddoptionvalue_by_namer( $optionID, $value, $sort_order, $picture )
{
db_query( "insert into ".PRODUCTS_OPTIONS_VALUES_VARIANTS_TABLE." (optionID, option_value, sort_order, picture) values('".$optionID."', '".xtotext($value)."', '".$sort_order."', '".xtotext($picture)."')");
return db_insert_id();
}
# END variants-with-pictures
2. в файле product_functions.php
2.1 в функции GetExtraParametrs
строку
$sql = 'select povvt.option_value, povvt.variantID, post.price_surplus
заменяем на
# BEGIN variants-with-pictures
#$sql = 'select povvt.option_value, povvt.variantID, post.price_surplus
$sql = 'select povvt.option_value, povvt.variantID, povvt.picture, post.price_surplus
# END variants-with-pictures
после строки
$_Row['values_to_select'][$i]['option_value'] = $_Rowue['option_value'];
вставляем
# BEGIN variants-with-pictures
$_Row['values_to_select'][$i]['picture'] = $_Rowue['picture'];
# END variants-with-pictures
3. в файле catalog_extra.php
3.1 перед строкой
if (isset($_GET["save_successful"])) //update was successful
вставляем
# BEGIN variants-with-pictures
if (!db_fetch_row(db_query("SHOW COLUMNS FROM ".PRODUCTS_OPTIONS_VALUES_VARIANTS_TABLE." LIKE 'picture'"))) db_query("ALTER TABLE ".PRODUCTS_OPTIONS_VALUES_VARIANTS_TABLE." ADD picture varchar(50) NULL");
if(!file_exists("data/option_image")) mkdir("data/option_image");
# END variants-with-pictures
3.2 перед строкой
// update existing values
вставляем
# BEGIN variants-with-pictures
$updatePictures = ScanFilesVariableWithId(array( "add_picture"));
foreach( $updatePictures as $key => $val )
{
if ( isset($val["add_picture"]) )
{
$picture = saveVariantsPicture('add_picture_'.$key);
if ($picture)
{
$row = db_fetch_assoc(db_query("SELECT picture from ".PRODUCTS_OPTIONS_VALUES_VARIANTS_TABLE." WHERE variantID=$key"));
if ($picture != $row['picture'])
{
if (!empty($row['picture']) && file_exists("data/option_image/".$row['picture'])) unlink("data/option_image/".$row['picture']);
db_query("UPDATE ".PRODUCTS_OPTIONS_VALUES_VARIANTS_TABLE." SET picture='$picture' WHERE variantID=$key");
}
}
}
}
# END variants-with-pictures
3.3 строки
optAddOptionValue($_POST["optionID"], $_POST["add_value"],
(int)$_POST["add_sort"] );
заменяем на
# BEGIN variants-with-pictures
#optAddOptionValue($_POST["optionID"], $_POST["add_value"],
#(int)$_POST["add_sort"] );
optAddOptionValue_by_namer($_POST["optionID"], $_POST["add_value"], (int)$_POST["add_sort"], saveVariantsPicture('add_option_picture'));
# END variants-with-pictures
3.4 после строки
$variantid = (int)$_GET["kill_value"];
вставляем
# BEGIN variants-with-pictures
$row = db_fetch_assoc(db_query("SELECT picture from ".PRODUCTS_OPTIONS_VALUES_VARIANTS_TABLE." WHERE variantID=".$variantid));
if (!empty($row['picture']) && file_exists("data/option_image/".$row['picture'])) unlink("data/option_image/".$row['picture']);
# END variants-with-pictures
3.5 в конец файла вставляем
# BEGIN variants-with-pictures
function saveVariantsPicture($add_picture)
{
if($_FILES[$add_picture]['tmp_name'])
{
if(!is_uploaded_file($_FILES[$add_picture]['tmp_name'])) die("Проблема загрузки файла");
if(substr($_FILES[$add_picture]['type'],0,5) != 'image') die ("Разрешена загрузка только изображений");
if (filesize($_FILES[$add_picture]['tmp_name']) > 20000) die ("Размер файла превышает допустимый (20 КБ)");
$picture = $_FILES[$add_picture]['name'];
$expl = explode(".",$picture,2);
$i=1;
while (file_exists("data/option_image/".$picture)) $picture = $expl[0]."_".$i++.".".$expl[1];
if (!move_uploaded_file($_FILES[$add_picture]['tmp_name'],"data/option_image/".$picture)) die("Не удалось скопировать файл из временного каталога сервера в каталог data/option_image");
return $picture;
}
else return NULL;
}
# END variants-with-pictures
4. в файле catalog_extra.tpl.html
4.1 вместо строки
<form action="{$smarty.const.ADMIN_FILE}" method=POST name="formext" id="formext">
вставляем
{* BEGIN variants-with-pictures *}
{*<form action="{$smarty.const.ADMIN_FILE}" method=POST name="formext" id="formext">*}
<form action="{$smarty.const.ADMIN_FILE}" method=POST name="formext" id="formext" enctype="multipart/form-data">
{* END variants-with-pictures *}
4.3 перед строкой
<td align="left" class="toph3" width="100%">{$smarty.const.ADMIN_ONE_VALUE}</td>
вставляем
{* BEGIN variants-with-pictures *}
<td align="left" class="toph3">Картинка</td>
{* END variants-with-pictures *}
4.4 строку
<td align="left"><input name="option_value_{$values[i].variantID}" type=text value="{$values[i].option_value}" class="textp" size="30"></td>
заменяем на
{* BEGIN variants-with-pictures *}
{*<td align="left"><input name="option_value_{$values[i].variantID}" type=text value="{$values[i].option_value}" class="textp" size="30"></td>*}
<td align="left" valign="middle">
{if $values[i].picture}
<img src="data/option_image/{$values[i].picture}" alt="" width="50" style="vertical-align:middle;">
{else}
<img src="data/admin/pixel.gif" alt="" width="50" height="1">
{/if}
</td>
<td align="left">
<input name="option_value_{$values[i].variantID}" type=text value="{$values[i].option_value}" class="textp" size="70">
<input type=file class="file" name="add_picture_{$values[i].variantID}" value="" size="26">
</td>
{* END variants-with-pictures *}
4.5 строки
<td align="left" width="100%">{$smarty.const.ADMIN_SORT_ORDER}</td></tr>
<tr class="lins">
<td align="left"><input name="add_value" type=text value="" class="textp" size="46"></td>
заменяем на
{* BEGIN variants-with-pictures *}
{*
<td align="left" width="100%">{$smarty.const.ADMIN_SORT_ORDER}</td></tr>
<tr class="lins">
<td align="left"><input name="add_value" type=text value="" class="textp" size="46"></td>
*}
<td align="left" width="20%">{$smarty.const.ADMIN_SORT_ORDER}</td></tr>
<tr class="lins">
<td align="left">
<input type=text class="textp" name="add_value" value="" size="70">
<input type=file class="file" name="add_option_picture" value="" size="26">
</td>
{* END variants-with-pictures *}
5. Заходим в админке в "характристики товаров". При этом создадутся новые необходимые поля в таблицах.
7. в файле product_brief.tpl.html
7.1 ниже строки
{if $smarty.section.k.index == 0}
находится шаблон select-а примерно такого вида (пустые строки и пробелы удалены):
<select name='option_select_{$select_counter_var}_{$product_info.productID}' onchange='GetCurrentCurrency_{$product_info.productID}();' class="WCHhider">
{section name=j loop=$product_info.product_extra[i].values_to_select}
<option value='{$product_info.product_extra[i].values_to_select[j].price_surplus}:{$product_info.product_extra[i].values_to_select[j].variantID}' {if $product_info.product_extra[i].values_to_select[j].variantID eq $product_info.product_extra[i].variantID}selected{/if}>{$product_info.product_extra[i].values_to_select[j].option_value}</option>
{/section}
</select>
его надо заменить на
{section name=j loop=$product_info.product_extra[i].values_to_select}
<br>
{if $product_info.product_extra[i].values_to_select[j].picture ne NULL}
<img src="data/option_image/{$product_info.product_extra[i].values_to_select[j].picture}" alt="" width="50" style="vertical-align:middle;">
{/if}
<input type="radio" onclick="GetCurrentCurrency_{$product_info.productID}({$product_info.product_extra[i].values_to_select[j].price_surplus}, {$product_info.product_extra[i].values_to_select[j].variantID});" name='option_select_{$select_counter_var}_{$product_info.productID}' value='{$product_info.product_extra[i].values_to_select[j].price_surplus}:{$product_info.product_extra[i].values_to_select[j].variantID}' {if $product_info.product_extra[i].values_to_select[j].variantID eq $product_info.product_extra[i].variantID}checked{/if}>
{$product_info.product_extra[i].values_to_select[j].option_value}
<br>
{/section}
7.2 в JS-функции GetCurrentCurrency_{$product_info.productID}()
строку
_value=document.MainForm1_{$product_info.productID}.option_select_{$select_counter_var2}_{$product_info.productID}.value;
заменяем на
_value = "";
for (var i=0; i < document.MainForm1_{$product_info.productID}.option_select_{$select_counter_var2}_{$product_info.productID}.length; i++)
if (document.MainForm1_{$product_info.productID}.option_select_{$select_counter_var2}_{$product_info.productID}[i].checked)
_value=document.MainForm1_{$product_info.productID}.option_select_{$select_counter_var2}_{$product_info.productID}[i].value;
8. в файле product_detailed.tpl.html
8.1 ниже строки
{if $smarty.section.k.index == 0}
находится шаблон select-а примерно такого вида (пустые строки и пробелы удалены):
<select name='option_select_{$select_counter_var}' onchange='GetCurrentCurrency();' class="WCHhider">
{section name=j loop=$product_extra[i].values_to_select}
<option value='{$product_extra[i].values_to_select[j].price_surplus}:{$product_extra[i].values_to_select[j].variantID}' {if $product_extra[i].values_to_select[j].variantID eq $product_extra[i].variantID}selected{/if}>{$product_extra[i].values_to_select[j].option_value}</option>
{/section}
</select>
его надо заменить на
{section name=j loop=$product_extra[i].values_to_select}
<br>
{if $product_extra[i].values_to_select[j].picture ne NULL}
<img src="data/option_image/{$product_extra[i].values_to_select[j].picture}" alt="" width="50" style="vertical-align:middle;">
{/if}
<input type="radio" onclick="GetCurrentCurrency();" name='option_select_{$select_counter_var}' value='{$product_extra[i].values_to_select[j].price_surplus}:{$product_extra[i].values_to_select[j].variantID}' {if $product_extra[i].values_to_select[j].variantID eq $product_extra[i].variantID}checked{/if}>
{$product_extra[i].values_to_select[j].option_value}
<br>
{/section}
8.2 в JS-функции GetCurrentCurrency()
строку
_value = document.MainForm.option_select_{$select_counter_var2}.value;
заменяем на
_value = "";
for (var i=0; i < document.MainForm.option_select_{$select_counter_var2}.length; i++)
if (document.MainForm.option_select_{$select_counter_var2}[i].checked)
_value=document.MainForm.option_select_{$select_counter_var2}[i].value;