Новости Joomla

0 Пользователей и 1 Гость просматривают эту тему.
  • 41 Ответов
  • 4643 Просмотров
*

Serpent19

  • Захожу иногда
  • 68
  • 0 / 0
Здравствуйте.
Стоит следующая задача: нужно в списке категорий отобразить в таблице-форме названия, свойства (дополнительные поля) всех товаров, входящих в эту категорию, цену товара, поле для количества для покупки (только для зарегистрированных пользователей). Внизу формы кнопка "Купить".
Где копать? Как организовать цикл отображения товаров в таблице в категории, как скрыть кол-во, если юзер незарегистрирован? Как добавить в корзину количества для каждого товара? VM 1.1.9.
*

fsv

  • Moderator
  • 2781
  • 411 / 2
Слишком много вопросов для одной темы.
Для начала выставьте в настройках темы VM для отображения категории табличный вид, многие вопросы отпадут. Потом поэкспериментируйте с кодом \components\com_virtuemart\themes\default\templates\browse\includes\browse_listtable.tpl.php
И только потом вопросы - по одному по мере возникновения. Тогда у вас будет гораздо больше шансов получить от кого-нибудь ответ. А то так загрузили, что просто страшно начинать...
Веб-разработка: заказ. Только новая разработка.
*

Serpent19

  • Захожу иногда
  • 68
  • 0 / 0
Понятно. Первый вопрос.
В файл browse_notables.tpl.php после строки foreach( $products as $product ) { вставил
Код
require_once('administrator/components/com_virtuemart/html/shop.browse_table.php' );
Вот файл shop.browse_table.php:
Код
<?php
if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' );
if (!empty($num_products)) {
$cnt=0;
?>
<br /><table border="1"><tr>
<td align="center"><strong>Модель</strong></td>
<td align="center"><strong>Параметр 1</strong></td>
<td align="center"><strong>Параметр 2</strong></td>
<td align="center"><strong>Параметр 3</strong></td>
<td align="center"><strong>Параметр 4</strong></td>
<td align="center"><strong>Цена</strong></td>
<td align="center"><strong>Кол-во</strong></td>
<?
while ($cnt < $num_products) {
?>
</tr>
<td><?=$product['product_name']?></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<? $cnt++;
} // while
?>
</tr></table><br>

<?
} // if
?>
Таблица отображается в нужном месте, количество строк соответствует количеству товара. Какой массив нужно использовать? $product['product_name'] дает только первую строку правильно. Элеимент массива $product[$cnt]['product_name'] выдает пустую строку. Параметры "Параметр х" - дополнительные поля, в БД они есть и отображаются правильно в редакторе карточки товара.
*

fsv

  • Moderator
  • 2781
  • 411 / 2
В файл browse_notables.tpl.php

\components\com_virtuemart\themes\default\templates\browse\includes\browse_listtable.tpl.php

Чем специально созданный табличный шаблон не устраивает?
Откуда ваш shop.browse_table.php получает данные, чтобы их выводить? Ниоткуда. Сравните подготовку данных и подключение шаблонов в shop.browse.php.
Веб-разработка: заказ. Только новая разработка.
*

Serpent19

  • Захожу иногда
  • 68
  • 0 / 0
Чем специально созданный табличный шаблон не устраивает?
Я вывожу сводную таблицу перед шаблоном.
Т.е. мне нужно делать дополнительные запросы? Массив неоткуда взять?
*

Serpent19

  • Захожу иногда
  • 68
  • 0 / 0
Как правильно сделать запрос?
*

Serpent19

  • Захожу иногда
  • 68
  • 0 / 0
fsv, спасибо. Действительно, в файле "browse_listtable.tpl.php" все прозрачно. Файл shop.browse_table.php оказался не нужен. Создал массив и добавил код:
Код
if (!empty($row)) {
?>
<br /><table border="1"><tr>
<td align="center"><strong><?=$VM_LANG->_('PHPSHOP_PRODUCT_FORM_MODEL');?></strong></td>
<td align="center"><strong><?=$VM_LANG->_('PHPSHOP_PRODUCT_FORM_TEMP');?></strong></td>
<td align="center"><strong><?=$VM_LANG->_('PHPSHOP_PRODUCT_FORM_VOL');?></strong></td>
<td align="center"><strong><?=$VM_LANG->_('PHPSHOP_PRODUCT_FORM_VOLT1');?></strong></td>
<td align="center"><strong><?=$VM_LANG->_('PHPSHOP_PRODUCT_FORM_VOLT2');?></strong></td>
<td align="center"><strong><?=$VM_LANG->_('PHPSHOP_CART_PRICE');?></strong></td>
<? if( _SHOW_PRICES && $auth['show_prices'] ) { ?>
<td align="center"><strong><?=$VM_LANG->_('PHPSHOP_CART_QUANTITY');?></strong></td>
<? } // if
?> </tr> <?
for ($j=0;$j<$row;$j++) {
?> <tr>
<td><strong><?=$prod [$j]['product_name']?></strong></td>
<td align="center"><?=$prod [$j]['product_temp']?></td>
<td align="center"><?=$prod [$j]['product_vol']?></td>
<td align="center"><?=$prod [$j]['product_volt1']?></td>
<td align="center"><?=$prod [$j]['product_volt2']?></td>
<td><?=$prod [$j]['product_price']?></td>
<? if( _SHOW_PRICES && $auth['show_prices'] ) { ?>
<td>&nbsp;</td>
<? } // if
} // for
?> </tr> </table><br /><?

// Display the table
echo $table->toHtml();
} // if

Остался последний вопрос: в последней ячейке нужно поставить количество в input-форме, а под таблицей разместить кнопку "Купить". Т.е. получается покупка списком. Как это организовать?
*

fsv

  • Moderator
  • 2781
  • 411 / 2
в последней ячейке нужно поставить количество в input-форме, а под таблицей разместить кнопку "Купить". Т.е. получается покупка списком. Как это организовать?

Если кнопка в каждой строке, вы, наверное, видели - $data[$row][] = '<center>'.$product['form_addtocart'].'</center>'; (переделать под себя я так понял у вас без проблем).
Если одна кнопка под всей таблицей - не делал. Но начал бы примерно в следующем направлении:
- использовать заложенный функционал - указанную выше строку, оставить инпут для количества, кнопку скрыть, т.е. form_addtocart - в каждой строке/товаре;
- под таблицей - "самодельную" кнопку "купить", на нее скрипт, обходящий каждую строку и "нажимающий" на скрытые кнопки "купить". Окно-уведомление о покупке задолбает, его можно скрыть, не отключая AJAX, и свое уведомление в конце прикрутить (если надо).
Если не получится - посмотрел бы ps_cart, как перепилить наполнение корзины.
Чего тут нагородил, сам не знаю.  Так, "налету". Получится, отпишитесь, самому интересно.
Веб-разработка: заказ. Только новая разработка.
*

Serpent19

  • Захожу иногда
  • 68
  • 0 / 0
Да, нужна именно одна кнопка под всей таблицей...
Вот еще столкнулся с непоняткой. Если срабатывает условие:
Код
if( _SHOW_PRICES && $auth['show_prices'] ) {
$data[$row][] = $product['product_price'];
}
, то $product['product_price'] вообще пустой! А там цена должна быть в любом случае. Не должно быть поле ввода количества, если нет авторизации. Где копать?
*

fsv

  • Moderator
  • 2781
  • 411 / 2
Код
if ($auth[user_id] > 0) {
   ...
}
- проверка на авторизацию зарегистрированного юзера
Веб-разработка: заказ. Только новая разработка.
*

Serpent19

  • Захожу иногда
  • 68
  • 0 / 0
Да, но цена от этого не появляется. Даже если вставить это условие в формирование основного массива. Где-то раньше режется.
*

Serpent19

  • Захожу иногда
  • 68
  • 0 / 0
- использовать заложенный функционал - указанную выше строку, оставить инпут для количества, кнопку скрыть, т.е. form_addtocart - в каждой строке/товаре;
- под таблицей - "самодельную" кнопку "купить", на нее скрипт, обходящий каждую строку и "нажимающий" на скрытые кнопки "купить". Окно-уведомление о покупке задолбает, его можно скрыть, не отключая AJAX, и свое уведомление в конце прикрутить (если надо).
Если не получится - посмотрел бы ps_cart, как перепилить наполнение корзины.
Чего тут нагородил, сам не знаю.  Так, "налету". Получится, отпишитесь, самому интересно.
А как прикрутить скрипт опроса полей к дополнительной кнопке?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Идея интересная. Для товаров с аттрибутами есть такая опция: одна кнопка для всех дочерей, может быть, получится сделать такую же для категории?
А может быть, изменить переменную formId в функции handleAddToCart?
Направление, высказанное fsv то же интересное
form_addtocart - в каждой строке/товаре;
- под таблицей - "самодельную" кнопку "купить", на нее скрипт, обходящий каждую строку и "нажимающий" на скрытые кнопки "купить".
но мне кажется, тут надо править и browse_listtable  и form_addtocart, чтобы на странице осталась только одна большая форма, ведь каждая form_addtocart - это отдельная форма. То есть, чтобы все инпуты и наша кнопка находились внутри <form></form>.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Serpent19

  • Захожу иногда
  • 68
  • 0 / 0
Решил проблему с ценой. В настройках магазина указал, что цена показывается всегда, а при формировании таблицы в browse_listtable.tpl.php показываю форму покупки только, если ($auth[user_id] > 0), т.е. после авторизации пользователя. То же самое - во flypage.tpl.php.
*

fsv

  • Moderator
  • 2781
  • 411 / 2
А как прикрутить скрипт опроса полей к дополнительной кнопке?

Доп. кнопка id=mybutton
Что-то вроде:
Код
$("#mybutton").click(function(){
$("form.addtocart_form :submit[class=addtocart_button]").submit();
})
НЕ проверял.

Предполагаю, что понадобится  в addtocart_form.tpl.php над <form ... вставить
Код
<iframe style="display: none;" id="superframe" name="superframe"></iframe>
а в <form ...  дополнить  target="superframe" , а action="<?php echo $mm_action_url ?>index.php"  заменить на action="<?php echo $mm_action_url ?>/index.php?page=shop.product_details&flypage=flypage.tpl[ИЛИ ВАШ]&product_id=".$product_id."&category_id=".@$_REQUEST['category_id']."&option=com_virtuemart

Если получится, отпишитесь. Тема занятная.
Веб-разработка: заказ. Только новая разработка.
*

Serpent19

  • Захожу иногда
  • 68
  • 0 / 0
Оставил в таблице form_addtocart.

Заказчик поставил следующую задачу: в каталоге отображение оставить как есть и добавить пункт меню, чтобы выводились все товары с ценой и формой заказа.
Написал небольшой компонент, пока без разделений на категории и подкатегории (это понадобится, думаю, позже). Вопрос в цене на товар. Она отображается, например, так: 2566.00000.
Что нужно добавить в компонент, чтобы можно было воспользоваться функцией show_price и $form_addtocart?
require (ПУТЬ.'ps_product.php') не спасает. Или какой код нужно использовать, чтобы преобразовывать цену товара (с учетом валюты, налога, дисконта и т.д.)?
Код
	$db = &JFactory::getDBO();
$Query = "SELECT product_id,product_name,product_temp,product_vol,product_volt1,product_volt2 FROM #__vm_product WHERE product_publish='Y'";
$db->setQuery($Query);
$rows = $db->loadObjectList();
if (count($rows) > 0) { ?>
<br><table width="100%" class="table_cat"><tr>
<td class="table_cat_tr_solid" align="center"><strong>Модель</strong></td>
<td class="table_cat_tr_solid" align="center"><strong>Рабочая температура, град. С°</strong></td>
<td class="table_cat_tr_solid" align="center"><strong>Приведённый полезный объем, мм</strong></td>
<td class="table_cat_tr_solid" align="center"><strong>Цена</strong></td>
<td class="table_cat_tr_solid" align="center"><strong>Количество</strong></td>
</tr><?
foreach ($rows as $row) {
$Query = "SELECT product_price FROM #__vm_product_price WHERE product_id='".$row->product_id."'";
$db->setQuery($Query);
$rows2 = $db->loadObjectList();
$product_id = $row->product_id;
foreach ($rows2 as $price2) $price = $price2->product_price; ?>
<tr>
<td class="table_cat_tr"><b><?=$row->product_name;?></b></td>
<td class="table_cat_tr" align="center"><?=$row->product_temp;?></td>
<td class="table_cat_tr" align="center"><?=$row->product_vol;?></td>
<td class="table_cat_tr" align="right"><b><?=$price;?></b></td>
<td class="table_cat_tr" align="center"><?$form_addtocart;?></td>
</tr>
<?
} //foreach
?></table><?
} // if
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Так не пашет?
Код
round($price);
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Serpent19

  • Захожу иногда
  • 68
  • 0 / 0
Так не пашет?
Код
round($price);
Округлять не надо, нужен вид: 84 762.00 р.
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Округлять не надо, нужен вид: 84 762.00 р.
Так поставь
Код
round($price,2);
А...я понял. Сделай так
Код
require_once(Путь.'ps_product.php')
global $CURRENCY_DISPLAY
$price = $CURRENCY_DISPLAY->getFullValue($price);
« Последнее редактирование: 27.12.2012, 16:17:04 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Serpent19

  • Захожу иногда
  • 68
  • 0 / 0
А...я понял. Сделай так
Код
require_once(Путь.'ps_product.php')
global $CURRENCY_DISPLAY
$price = $CURRENCY_DISPLAY->getFullValue($price);
Fatal error: Class 'vmAbstractObject' not found in W:\home\wizebox\www\administrator\components\com_virtuemart\classes\ps_product.php on line 25
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Fatal error: Class 'vmAbstractObject' not found in W:\home\wizebox\www\administrator\components\com_virtuemart\classes\ps_product.php on line 25
Сам файл случайно не повредил? Какая версия VM?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Serpent19

  • Захожу иногда
  • 68
  • 0 / 0
Сам файл случайно не повредил? Какая версия VM?
Файл целый, в других местах цены корректно показывает. VM 1.1.9.
_________________________________________________________________________
Решил, как вместо формы form.addtocart_form оставить только поле ввода количества и общую кнопку "Перейти в корзину заказов": я добавляю в массив сессии cart свой массив и увеличиваю idx на количество элементов своего массива. Весь выбранный товар в корзине. В данном примере выводится список всего товара, отсортированного по наименованию.
Осталось корректно показать стоимость товара.
Код
	function getGreeting() {
if ($_GET["add"]==1) {
GoToCart();
exit;
}
$db = &JFactory::getDBO();
$Query = "SELECT product_id,product_name,product_temp,product_vol FROM #__vm_product WHERE product_publish='Y' ORDER BY product_name";
$db->setQuery($Query);
$rows = $db->loadObjectList();
global $id_quant;
if (count($rows) > 0) { ?>
<form action="/allmodels?add=1" method="post">
<br><table width="100%" class="table_cat"><tr>
<td class="table_cat_tr_solid" align="center"><strong>Модель</strong></td>
<td class="table_cat_tr_solid" align="center"><strong>Рабочая температура, град. С°</strong></td>
<td class="table_cat_tr_solid" align="center"><strong>Приведённый полезный объем, мм</strong></td>
<td class="table_cat_tr_solid" align="center"><strong>Цена</strong></td>
<td class="table_cat_tr_solid" align="center"><strong>Количество</strong></td>
</tr><?
foreach ($rows as $row) {
$Query = "SELECT product_price FROM #__vm_product_price WHERE product_id='".$row->product_id."'";
$db->setQuery($Query);
$rows2 = $db->loadObjectList();
$product_id = $row->product_id;
foreach ($rows2 as $price2) $price = $price2->product_price;
$product_id = $row->product_id;
?>
<tr>
<td class="table_cat_tr"><b><?=$row->product_name;?></b></td>
<td class="table_cat_tr" align="center"><?=$row->product_temp;?></td>
<td class="table_cat_tr" align="center"><?=$row->product_vol;?></td>
<td class="table_cat_tr" align="right"><b><?=$price;?></b></td>
<td class="table_cat_tr" align="center"><input name="id_quant[<?=$product_id;?>]" type="text" id="id_quant[<?=$product_id;?>]" size="4" maxlength="4" /></td>
</tr>
<?
} //foreach
?></table><br>
<div align="right"><input type="submit" name="button" id="button" value="Перейти в корзину заказов" /></div>
</form><?
} // if

return;
} // getGreeting

function GoToCart () {
$cnt = 0;
$db = &JFactory::getDBO();
foreach ($_POST["id_quant"] as $product_id => $id_quant) {
if ($id_quant>0) {
$product[$cnt]['quantity'] = $id_quant;
$product[$cnt]['product_id'] = $product_id;
$product[$cnt]['parent_id'] = $product_id;
$Query = "SELECT category_id FROM #__vm_product_category_xref WHERE product_id='".$product_id."'";
$db->setQuery($Query);
$rows = $db->loadObjectList();
foreach ($rows as $cat)
$product[$cnt]['category_id'] = $cat->category_id;
$product[$cnt]['description'] = NULL;
$cnt++;
}
}
for ($i=0;$i<$cnt;$i++) {
$_SESSION["cart"]["idx"]++;
$_SESSION["cart"][] = $product[$i];
}
?><META HTTP-EQUIV="refresh" content="0;URL=/katalog?page=shop.cart"><?
} // GoToCart
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
А так?
Код
$price = $GLOBALS['CURRENCY_DISPLAY']->getFullValue($price);
ps_product не подключай.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Serpent19

  • Захожу иногда
  • 68
  • 0 / 0
А так?
Код
$price = $GLOBALS['CURRENCY_DISPLAY']->getFullValue($price);
ps_product не подключай.
Тоже ошибка:
Fatal error: Call to a member function getFullValue() on a non-object in W:\home\wizebox\www\components\com_allmodels\models\AllModels.php on line 34
*

fsv

  • Moderator
  • 2781
  • 411 / 2
Написал небольшой компонент...

В одном компоненте пытаетесь использовать переменные из другого.
Попробуйте в начале прописать
require_once( JURI::root().'/components/com_virtuemart/virtuemart_parser.php' );
global $CURRENCY_DISPLAY;
и потом, где надо
$price = $CURRENCY_DISPLAY->getFullValue($price);  // - вид вывода менять в настройках VM "информация о магазине"
Веб-разработка: заказ. Только новая разработка.
*

Serpent19

  • Захожу иногда
  • 68
  • 0 / 0
Спасибо, заработало как надо, но только внес небольшие изменения:
Код
require_once('/components/com_virtuemart/virtuemart_parser.php');
global $CURRENCY_DISPLAY;
$price = $GLOBALS['CURRENCY_DISPLAY']->getFullValue($price);
*

Serpent19

  • Захожу иногда
  • 68
  • 0 / 0
Спасибо, заработало как надо, но только внес небольшие изменения:
Код
require_once('/components/com_virtuemart/virtuemart_parser.php');
global $CURRENCY_DISPLAY;
$price = $GLOBALS['CURRENCY_DISPLAY']->getFullValue($price);

Оказалось, что этот код выдает цену без НДС, т.е. неправильную. Чем заменить?
*

fsv

  • Moderator
  • 2781
  • 411 / 2
Оказалось, что этот код выдает цену без НДС, т.е. неправильную. Чем заменить?

А что в настройках: "с/без налога, ставка, на основании адреса продавца/покупателя" ?
Это я по памяти, там несколько иначе написано.
Веб-разработка: заказ. Только новая разработка.
*

Serpent19

  • Захожу иногда
  • 68
  • 0 / 0
А что в настройках: "с/без налога, ставка, на основании адреса продавца/покупателя" ?
Это я по памяти, там несколько иначе написано.
В настройках: Показывать цены, Виртуальный налог, Способ рассчета на адресе продавца.
В таблице категорий, карточке товара и в корзине цены показываются правильные, с учетом НДС.
Ошибка в моем компоненте, в строке
Код
$price = $GLOBALS['CURRENCY_DISPLAY']->getFullValue($price);
*

fsv

  • Moderator
  • 2781
  • 411 / 2
В таблице категорий, карточке товара и в корзине цены показываются правильные, с учетом НДС.
Ошибка в моем компоненте, в строке
Код
$price = $GLOBALS['CURRENCY_DISPLAY']->getFullValue($price);

если в вашем компоненте $price формируется так как вам нужно, и надо только после нее обозначение валюты магазина подставить:
$currency = $CURRENCY_DISPLAY->getSymbol() ;
...... = $price. ' ' .$currency ;
Веб-разработка: заказ. Только новая разработка.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Сортировка товаров по дате поступления

Автор coob

Ответов: 2
Просмотров: 2652
Последний ответ 21.06.2018, 08:40:05
от kungurskiy
Сортировка товаров категории по алфавиту

Автор atlet

Ответов: 5
Просмотров: 2174
Последний ответ 20.11.2015, 18:33:50
от atlet
404 для товаров которые удалены

Автор holovla

Ответов: 1
Просмотров: 2315
Последний ответ 06.05.2015, 19:42:13
от holovla
Усовершенствованный модуль категорий [Аккордион и прочее - the best ;) ]

Автор danik.html

Ответов: 749
Просмотров: 196886
Последний ответ 24.11.2014, 18:37:11
от slavakh
Модуль VirtueMart для фильтра товаров по категориям!

Автор maxmur

Ответов: 104
Просмотров: 52762
Последний ответ 08.08.2014, 11:47:37
от Хусен