VM 2.x Настраиваемые поля на странице категории.

norka13

Создатель
Заблокирован
Регистрация
23 Фев 2009
Сообщения
41
Реакции
2
  • Автор темы
  • Заблокирован
  • #1
Нужно вывести настраиваемые поля на странице категории. В гугле нашла такой способ.
Код:
1) берете файл
 
VmSmallHelper.php
 
 
и кладете /components/com_virtuemart/helpers
 
 
2) Затем создаете настраиваемые поля и смотрите их ID в админке Virtuemart.
 
 
3) открываете файл /templates/[template_name]/html/com_virtuemart/category/default.php
 
и подключаете наш хелпер из пункта [1]
 
 
defined('_JEXEC') or die('Restricted access');
 
if(!class_exists("VmSmallHelper"))
    require(JPATH_VM_SITE.DS.'helpers'.DS.'vmsmallhelper.php');
 
4) находите строки
 
// Start the Output
 
foreach ($this->products as $product ) {
 
это вывод продуктов в цикле.
 
 
5) затем в том месте, где нужно вывести какое-то настраиваемое поле пишете следующее
 
echo VmSmallHelper::getCustomFieldValue($product, $iFieldId);
 
где $iFieldId заменяете на номер настраиваемого поля, которое смотрели в пункте [2]
Этот код выведет именно значение настраиваемого поля.
 
 
6) Если нужно получить все поле, то
$oField = VmSmallHelper::getCustomFieldValue($product, $iFieldId, true);
 
код вернет объект поля, сделайте
 
var_dump($oField);
 
увидете, какие свойства хранят какие значения
 
Вот и все:)

Вся эта прелесть работает, выводя только значение заданного поля.Например 24кВт
Вопрос. Как вывести заголовок поля. Например Мощность: 24кВт
 

Вложения

  • vmsmallhelper.rar
    854 байт · Просмотры: 52
Нужно вывести настраиваемые поля на странице категории. В гугле нашла такой способ.
Код:
1) берете файл
 
VmSmallHelper.php
 
 
и кладете /components/com_virtuemart/helpers
 
 
2) Затем создаете настраиваемые поля и смотрите их ID в админке Virtuemart.
 
 
3) открываете файл /templates/[template_name]/html/com_virtuemart/category/default.php
 
и подключаете наш хелпер из пункта [1]
 
 
defined('_JEXEC') or die('Restricted access');
 
if(!class_exists("VmSmallHelper"))
    require(JPATH_VM_SITE.DS.'helpers'.DS.'vmsmallhelper.php');
 
4) находите строки
 
// Start the Output
 
foreach ($this->products as $product ) {
 
это вывод продуктов в цикле.
 
 
5) затем в том месте, где нужно вывести какое-то настраиваемое поле пишете следующее
 
echo VmSmallHelper::getCustomFieldValue($product, $iFieldId);
 
где $iFieldId заменяете на номер настраиваемого поля, которое смотрели в пункте [2]
Этот код выведет именно значение настраиваемого поля.
 
 
6) Если нужно получить все поле, то
$oField = VmSmallHelper::getCustomFieldValue($product, $iFieldId, true);
 
код вернет объект поля, сделайте
 
var_dump($oField);
 
увидете, какие свойства хранят какие значения
 
Вот и все:)

Вся эта прелесть работает, выводя только значение заданного поля.Например 24кВт
Вопрос. Как вывести заголовок поля. Например Мощность: 24кВт
Видимо нужно копать здесь: если getCustomFieldValue($product, $iFieldId, true); получает значение то getCustomFieldName($product, $iFieldId, true); - получает название.(чисто теория)
 
Вышеприведённый способ имеет недостатки:
- если у одного товара есть доп. поля а у другого их нет - на странице появляются ошибки кода.
- у меня почему-то вообще не заработало, хотя я не подвергаю сомнению чужие слова - мои руки не самые прямые.
- чужой файл зачем загружать, когда должны быть решения стандартными средствами.

Я сделал так:
1) В папку component/com_virtuemart/category/ добавил файл default_addtocart.php, который взял из соседней папки "productdetails"
2) в файл com_virtuemart/category/default.php после строки
PHP:
<form method="post" class="product" action="index.php" id="addtocartproduct<?php echo $product->virtuemart_product_id ?>">
добавил код

PHP:
<!-- Пытаемся вставить ручные поля  -->
  <?php // Product custom_fields
  if (!empty($product->customfieldsCart)) {  ?>
  <div class="product-fields">
      <?php foreach ($product->customfieldsCart as $field)
      { ?><div style="display:inline-block;" class="product-field product-field-type-<?php echo $field->field_type ?>">
        <span class="product-fields-title" ><b><?php echo  JText::_($field->custom_title)?></b></span>
        <?php //echo JHTML::tooltip($field->custom_tip,  JText::_($field->custom_title), 'tooltip.png'); ?>
        <span class="product-field-display"><?php echo $field->display ?></span>
 
        <span class="product-field-desc"><?php echo $field->custom_field_desc ?></span>
        </div><br/ >
        <?php
      }
      ?>
  </div>
  <?php }
    /* Product custom Childs
    * to display a simple link use $field->virtuemart_product_id as link to child product_id
    * custom_value is relation value to child
    */
 
  if (!empty($product->customsChilds)) {  ?>
      <div class="product-fields">
        <?php foreach ($product->customsChilds as $field) {  ?>
            <div style="display:inline-block;" class="product-field product-field-type-<?php echo $field->field->field_type ?>">
            <span class="product-fields-title" ><b><?php echo JText::_($field->field->custom_title)?></b></span>
            <span class="product-field-desc"><?php echo JText::_($field->field->custom_value)?></span>
            <span class="product-field-display"><?php echo $field->display ?></span>
 
            </div><br/ >
            <?php
        } ?>
      </div>
  <?php } ?>

Ниже у меня идёт код отвечающий за кнопку "добавить в корзину", которая тоже добавлена на странице категорий.
 
  • Автор темы
  • Заблокирован
  • #4
Ну если судить по вашему коду то выведет все настраиваемые поля. а их бывает очень много. Как бы сделать лимит на вывод 4-5 полей. Так красиво было бы.
 
Ну если судить по вашему коду то выведет все настраиваемые поля. а их бывает очень много. Как бы сделать лимит на вывод 4-5 полей. Так красиво было бы.
А может кто знает как сделать вывод группы полей с кастом позицией. Ведь это в стандартном функционале начиная с версии 2.0.1.
Для просмотра ссылки Войди или Зарегистрируйся
 
Присоединюсь, тоже интересует как вывести хотя бы 5 кастомных поля на странице категорий, с возможностью их отсортировать по надобности...
 
я бы делал так:
для начала в шаблоне категории распечатал бы массив данных и посмотрел какие поля существуют:

Код:
echo '<pre>';       
print_r($product->customfields);
echo '</pre>';

просмотрев и выбрав нужные можно вывести их так, проверяя существует ли это значение

Код:
if($product->customfields[1]->virtuemart_custom_id == 8){
       echo $product->customfields[1]->custom_value;
}
 
Вышеприведённый способ имеет недостатки:
- если у одного товара есть доп. поля а у другого их нет - на странице появляются ошибки кода.
- у меня почему-то вообще не заработало, хотя я не подвергаю сомнению чужие слова - мои руки не самые прямые.
- чужой файл зачем загружать, когда должны быть решения стандартными средствами.

Я сделал так:
1) В папку component/com_virtuemart/category/ добавил файл default_addtocart.php, который взял из соседней папки "productdetails"
2) в файл com_virtuemart/category/default.php после строки
PHP:
<form method="post" class="product" action="index.php" id="addtocartproduct<?php echo $product->virtuemart_product_id ?>">
добавил код

PHP:
<!-- Пытаемся вставить ручные поля  -->
  <?php // Product custom_fields
  if (!empty($product->customfieldsCart)) {  ?>
  <div class="product-fields">
      <?php foreach ($product->customfieldsCart as $field)
      { ?><div style="display:inline-block;" class="product-field product-field-type-<?php echo $field->field_type ?>">
        <span class="product-fields-title" ><b><?php echo  JText::_($field->custom_title)?></b></span>
        <?php //echo JHTML::tooltip($field->custom_tip,  JText::_($field->custom_title), 'tooltip.png'); ?>
        <span class="product-field-display"><?php echo $field->display ?></span>
 
        <span class="product-field-desc"><?php echo $field->custom_field_desc ?></span>
        </div><br/ >
        <?php
      }
      ?>
  </div>
  <?php }
    /* Product custom Childs
    * to display a simple link use $field->virtuemart_product_id as link to child product_id
    * custom_value is relation value to child
    */
 
  if (!empty($product->customsChilds)) {  ?>
      <div class="product-fields">
        <?php foreach ($product->customsChilds as $field) {  ?>
            <div style="display:inline-block;" class="product-field product-field-type-<?php echo $field->field->field_type ?>">
            <span class="product-fields-title" ><b><?php echo JText::_($field->field->custom_title)?></b></span>
            <span class="product-field-desc"><?php echo JText::_($field->field->custom_value)?></span>
            <span class="product-field-display"><?php echo $field->display ?></span>
 
            </div><br/ >
            <?php
        } ?>
      </div>
  <?php } ?>

Ниже у меня идёт код отвечающий за кнопку "добавить в корзину", которая тоже добавлена на странице категорий.
Выводит поля в странице категории, но как бы сделать, чтобы - если поля- аттрибут корзины, еще и цену самого товара в зависимости от значения полей меняли при этом

и не найду строку такую <form method="post" class="product" action="index.php" id="addtocartproduct<?php echo $product->virtuemart_product_id ?>">
в
2) в файл com_virtuemart/category/default.php

это наверное вывод цены на странице категории нужно корректировать
 
я нашла то что мне нужно было - хотела на листе категории вывести изображение типа "новинка", вип", бюджетный" вот решение
Для просмотра ссылки Войди или Зарегистрируйся - там много вариантов


yep now its showing the image CF in the Category with products... it's working with:
Code: [Select]
<?php $custom_title = null;
if (!empty(
$product->customfields)) {
foreach (
$product->customfields as $field) {
if (
$field->is_hidden ) //OSP Для просмотра ссылки Войди или Зарегистрируйсяcontinue;
if (
$field->display) { ?>

<span class="product-field-display"><?php echo $field->display ?></span>
<?php } ?> <?php } ?> <?php } ?>
 
Если надо вывести только определённое поле или все поля кроме определенного(ных) можно поставить исключение на название поля или его, делается это так:
PHP:
<?php $custom_title = null;
if (!empty($product->customfields)) {
foreach ($product->customfields as $field) { if ($field->title == 'Картинка'):
if ($field->is_hidden )
if ($field->display) { ?>
<span class="product-field-display"><?php echo $field->display ?></span>
<?php } ?> <?php endif; } ?> <?php } ?>
в этом коде будет выводиться только поле сназванием Картнка,
не забываем перевести кодеровку в ANSI (без BOM) чтоб заработал код.
 
Назад
Сверху