За короткое время пошла тенденция вопросов на счет типов товаров в нашем многострадальном VirtueMart.
Хочу поделиться тем чем сам занимался и делал в этом направлении.
А то многие студенты задают на мой взгляд глупые вопросы, на которые ни кто не ответит в виду неплохого заработка за эту работу.
пока буду наполнять свой раздел, а на это жалко тратить время, но буду потому что вопросов много, а поиском мало кто умеет пользоваться, читайте если не найдете ответ у меня в теме тут:
http://joomlaforum.ru/index.php/topic,63679.new.html
http://joomlaforum.ru/index.php/topic,10485.new.html
http://joomlaforum.ru/index.php/topic,84177.new.html
http://joomlaforum.ru/index.php/topic,142431.new.html
http://joomlaforum.ru/index.php/topic,62702.new.html
http://joomlaforum.ru/index.php/topic,62430.new.html
http://joomlaforum.ru/index.php/topic,76548.new.html
http://joomlaforum.ru/index.php/topic,57984.new.html
http://joomlaforum.ru/index.php/topic,98462.new.html
http://joomlaforum.ru/index.php/topic,111435.new.htmlЕсть всем известные файлы работающие с
ТИПАМИ у VirtueMart это:
- administrator\components\com_virtuemart\html\product.product_product_type_form.php
- administrator\components\com_virtuemart\html\product.product_product_type_list.php
- administrator\components\com_virtuemart\html\product.product_type_form.php
- administrator\components\com_virtuemart\html\product.product_type_list.php
- administrator\components\com_virtuemart\html\product.product_type_parameter_form.php
- administrator\components\com_virtuemart\html\product.product_type_parameter_list.php
- administrator\components\com_virtuemart\classes\ps_product_product_type.php
- administrator\components\com_virtuemart\classes\ps_product_type.php
- administrator\components\com_virtuemart\classes\ps_product_type_parameter.php
- components\com_virtuemart\themes\vm_mynxx\templates\common\product_type.tpl.phpза вывод типов на страницах VM отвечает файл components\com_virtuemart\themes\vm_mynxx\templates\common\product_type.tpl.php вот его для начала и распишемприведу код файла (взят стандартный файл в разных шаблонах он может отличатся, но если компонент скачен с сайта разработчиков то он такой) и распишу что требуется в нем менять:
<?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?>
<?php if( empty($product_types)) return;
/**
* Available indexes:
*
* $product_type_params["parameter_label"] => The label for each product type parameter
* $product_type_params["parameter_description"] => The description of each product type parameter
* $product_type_params["tooltip"] => Same as above but wrapped in a tooltip
* $product_type_params["parameter_value"] => The actual value of the parameter for this product
* $product_type_params["parameter_unit"] => The unit of the parameter
* $product_type["product_type_name"] => The name of the product type
*
*/
?>
<!-- Tables of product_types -->
<?php
foreach( $product_types as $product_type ) {
foreach( $product_type as $attr => $val ) {
//echo $attr." - ".$val."<br />";
$this->set( $attr, $val );
}
?><br /><table width="100%" cellspacing="0" cellpadding="0" border="0">
<tr><td colspan="2"><strong><?php
echo $VM_LANG->_('PHPSHOP_PRODUCT_TYPE_PARAMETERS_IN_CATEGORY').": ".$product_type["product_type_name"];
?></strong></td></tr><?php
$i = 0;
if ( !empty( $product_type["parameters"] ) ) {
foreach( $product_type["parameters"] as $product_type_params ) {
foreach( $product_type_params as $attr => $val ) {
$this->set( $attr, $val );
}
if ( $i++ % 2 ) {
$bgcolor = 'row0';
}
else {
$bgcolor = 'row1';
}
if ( $i > $product_type["product_type_count_params"] ) {
break;
}
?><tr class="<?php echo $bgcolor;?> height="18">
<td width="30%"><?php echo $product_type_params["parameter_label"];
if ( !empty($product_type_params["tooltip"] ) ) { ?>
<?php echo $product_type_params["tooltip"];
}
?>
</td><td><?php echo $product_type_params["parameter_value"];
if ( !empty($product_type_params["parameter_unit"] ) ) {
echo " ".$product_type_params["parameter_unit"];
} ?>
</td></tr>
<?php
}
}
?>
</table><?php
}
?>
теперь распишем какая строка за что отвечает/**
* Available indexes://Перечень переменных
*
* $product_type_params["parameter_label"] => The label for each product type parameter
* $product_type_params["parameter_description"] => The description of each product type parameter
* $product_type_params["tooltip"] => Same as above but wrapped in a tooltip
* $product_type_params["parameter_value"] => The actual value of the parameter for this product
* $product_type_params["parameter_unit"] => The unit of the parameter
* $product_type["product_type_name"] => The name of the product type
*
*/
?>
<!-- Tables of product_types -->
foreach( $product_types as $product_type ) { // Цикл по всем последним продуктам
?><br /><table width="100%" cellspacing="0" cellpadding="0" border="0"> //Таблица вывода на странице
<tr><td colspan="2"><strong><?php //первая строка вывода названия типов
echo $VM_LANG->_('PHPSHOP_PRODUCT_TYPE_PARAMETERS_IN_CATEGORY')//само название редактируем в языковых файлах administrator\components\com_virtuemart\languages\common\
$i = 0;//массив свойств типа в БД
if ( $i++ % 2 ) {//указываем каким строкам привязать класс чередование % 2 это через строчку
$bgcolor = 'row0';//присваеваем строкам таблицы класс первая строка будет class="row0"
$bgcolor = 'row1';//присваеваем строкам таблицы класс вторая строка будет class="row1"
?><tr class="<?php echo $bgcolor;?> height="18">тут регулируем высоту строки
<td width="30%"><?php echo $product_type_params["parameter_label"]; //это первая колонка таблицы отвечающая за вывод названий свойств типа, тут регулируем ширину первого столбца width="30%" 30 меняем на то что надо
<?php echo $product_type_params["tooltip"]; это вывод подсказки если есть описание свойства его можно удалить ил переместить в нужное место
</td><td><?php echo $product_type_params["parameter_value"];это вторая колонка таблицы выводит описание свойств типа
опишим работу со стилями этого файла как видно выше есть таблицы в которых разделены строки на два класса и чередуются это:
class="row0"
class="row1"
вот ими и играем в стилях CSSно иногда этого мало потому что разные строки (поля) бывают разделителями и их нужно выделить по другому отдельно от всех строк, существует два варианта
1 - поменять class
2 - добавить id
в этом случае делаем так:
в строке
<tr class="<?php echo $bgcolor;?> height="18">
меняем class или добавляем id
получается к примеру с добавлением id
<tr class="<?php echo $bgcolor;?>" id="<?php echo $product_type_params["parameter_type"];?>" height="18">
где <?php echo $product_type_params["parameter_type"];?> отвечает за вывод символов из БД которые прописываются разным по назначению полям, вот потом при помощи стилей можно им назначать отдельные стили отображения
иногда надо вывести ТИПЫ в категории в отображении товаров browse
но не нужно полное отображение свойств, т.е. вывести скажем не все строки а только 5 первыхтут главное это, то что надо для отображения типов на странице browse определится с выводом если необходимо вывести типы в другом стилевом отображении надо стелать копию файла
- components\com_virtuemart\themes\vm_mynxx\templates\common\product_type.tpl.php
и назвать её к примеру product_type1.tpl.php
найти в файле
administrator\components\com_virtuemart\classes\ps_product_type.php
строки
$tpl->set( 'product_types', $product_types );
$html .= $tpl->fetch( 'common/product_type.tpl.php' ) ;
return $html;
}
и встанить после них дополнительно код
/* */
function list_product_types($product_id) {
global $VM_LANG;
$tpl = vmTemplate::getInstance();
if (!$this->product_in_product_type($product_id)) {
return "";
}
// $dbag = product_types;
$dbag = new ps_DB;
// $dba = Attributes of product_type param, holds product_id and values assign to each param;
$dba = new ps_DB;
// $dbp = Parameters of product_type, holds definitions of each parameter, but not value ;
$dbp = new ps_DB;
$html ="";
$q = "SELECT * FROM #__{vm}_product_product_type_xref ";
$q .= "LEFT JOIN #__{vm}_product_type USING (product_type_id) ";
$q .= "WHERE product_id='$product_id' AND product_type_publish='Y' ";
$q .= "ORDER BY product_type_list_order";
$dbag->query( $q );
$q = "SELECT * FROM #__{vm}_product_type_parameter ";
$q .= "WHERE product_type_id=";
$pt = 0; //product_type counter;
while ($dbag->next_record()) { // Show all Product Type
if ($dbag->f("product_type_flypage")) {
$flypage_file = VM_THEMEPATH."templates/".$dbag->f("product_type_flypage").".php";
if (file_exists($flypage_file)) {
$html .= include($flypage_file);
continue;
}
}
$product_types[$pt]["product_type_name"] = $dbag->f("product_type_name");
// SELECT parameter value of product
$q2 = "SELECT * FROM #__{vm}_product_type_".$dbag->f("product_type_id");
$q2 .= " WHERE product_id='$product_id'";
$dbp->query($q2);
// SELECT parameter of Product Type
$dba->query($q.$dbag->f("product_type_id")." ORDER BY parameter_list_order");
$i=0; // parameter counter;
while ($dba->next_record()) {
$product_type_param[$i]["parameter_label"] = $dba->f("parameter_label");
$parameter_description = $dba->f("parameter_description");
$product_type_param[$i]["parameter_description"] = $parameter_description;
if (!empty($parameter_description)) {
$product_type_param[$i]["tooltip"] = vmToolTip($parameter_description, $VM_LANG->_('PHPSHOP_PRODUCT_TYPE_PARAMETER_FORM_DESCRIPTION'));
}
$product_type_param[$i]["parameter_value"] = $dbp->f($dba->f("parameter_name"));
$product_type_param[$i]["parameter_unit"] = $dba->f("parameter_unit");
$product_type_param[$i]["parameter_type"] = $dba->f("parameter_type");
$i++;
}
$product_types[$pt]["product_type_count_params"] = $i;
$product_types[$pt]["parameters"] = $product_type_param;
$pt++;
}
$tpl->set( 'product_types', $product_types );
$html .= $tpl->fetch( 'common/product_types1.tpl.php' ) ;
return $html;
}
/* */
если посмотрите то все поймете сами что добавили и изменили в коде
далее выводим наши 5 (пять) строк свойств типа
делаем это вфайле
components/com_virtuemart/themes/шаблон/templates/common/product_type.tpl.php
или нами добавленном
components/com_virtuemart/themes/шаблон/templates/common/product_type1.tpl.php
находим код
if ( $i++ %2 ) {
$bgcolor = 'row0';
}
else {
$bgcolor = 'row1';
}
и меняем на код
if ( $i++ %2 ) {
$bgcolor = 'row0';
}
else {
$bgcolor = 'row1';
}
if ( $i == 5 ) {
break;
}
где
if ( $i == 5 ) {//количество строк вывода
break;
}
опять есть подводный камень если сверху есть разделитель который выводит информацию о свойствах или поле которое надо скрыть, то ставим if ( $i == 6 ),
а первую строку скрываем с помощью
display:none; или visibility: hidden;
то что надо вставить в shop.browse.php для вывода типов на странице browse опишу позже, но если посмотрите в перечисленные темы найдете там
******************************************************************************************************
недавно был вопрос как поступить и вывести при создании нового товара один единственный
ТИП, прикрепить его автоматически всем товарам, чтоб при создании нового товара он автоматически был в товаре
есть дав решения которые я знаю
все просто надо взять файл
administrator\components\com_virtuemart\classes\ps_product_type.php
найти в нем
$_REQUEST['product_type_id'] = $product_type_id;
и заменить на
$_REQUEST['product_type_id'] = 1;
beagler описывал решение взятое с форума разработчиков
I needed this too, and in my case I only have one product type.
Another way to do the same thing (without any hacks) is to go to Product Type List, and under the Products column click on Show to display the products associated with that product id. You can then add a new product and it will have that product type already activated. Do not use my hack if you plan to use more than one product type, because my hack forces a single product type.
I am using Joomla 1.5.8 with VM 1.1.2. Here's what worked for me:
Open /administrator/components/com_virtuemart/classes/ps_main.php
Right at the beginning of the file and right after this first line:
Code:
if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' );
Insert this:
Code:
$_REQUEST['product_type_id']=1;
In this case, my product_type_id is one. You can double-check this in phpMyAdmin, however I believe if you have only added one product type it will have an ID of 1 by default.
Would be nice for this to be an option in the main store config, or in the product types area.
но в этом решение есть минус выводится поиск в разделах просмотра категории и карточке товарар, но если кому оно подойдет то может им пользоваться
продолжение следует...
PS Тема создана для готовых решений просьба писать только то что решено, не постить вопросы на них отвечать не буду,
только если у кого ума не хватит то на платной основе.