1. Уважаемые пользователи, прежде чем ответить в теме или создать новую,
    внимательно ознакомьтесь с правилами раздела

    Кому лень работать или руки не оттуда - пользуйтесь услугами специалистов
  2. Не задавайте глупых вопросов "Посоветуйте какой-нибудь компонент.."

    Есть JED!!! Ищите там!!!

virtuemart новое поле

Тема в разделе "Joomla", создана пользователем foodman, 5 ноя 2010.

Информация :
  • Уважаемые пользователи, прежде чем ответить в теме или создать новую, внимательно ознакомьтесь с правилами раздела
  • Не задавайте глупых вопросов "Посоветуйте какой-нибудь компонент.." Есть JED!!! Ищите там!!!
  • Аналоги ищите там же - на JED!!!
  • Новая версия? - У кого будет - тот выложит!
Статус темы:
Закрыта.
Модераторы: arman29, DMS, Genk0
  1. foodman

    foodman Создатель

    Регистр.:
    18 апр 2009
    Сообщения:
    26
    Симпатии:
    1
    Доброе время суток. Господа, как добавить новое поле в продукт где название, артикул, цена, маленькая картинка, цена, что бы можно было осуществлять сортировку по этому полю?
    [​IMG]
     
  2. cinemaxx

    cinemaxx Постоялец

    Регистр.:
    21 апр 2010
    Сообщения:
    59
    Симпатии:
    6
    Стабильное решение, которое безотказно работает на версиях 1.1.3 и 1.1.4. Итак приступим:

    0. Для реализации нам нужен PhpMyAdmin, Dreamweaver (блокнот тож сойдет) и немного терпения.

    1. Открываем базу данных нашего сайта и находим таблицу jos_vm_product. Заходим в нее, выбираем вкладку "Структура". Тут мы видим все поля нашего товара, такие как Артикул, Айди, цена и пр. Спускаемся вниз и находим "Добавить 1 поле(поля)" выбираем правее под каким полем хотим расположить наше будущее творение и жмем Ок. Теперь заполняем: Поле: product_new (можете вставить свое); Длина/значения: 64; Тип: VARCHAR; Сравнение: utf8_general_ci; Null: NOT NULL. Вдаваться в подробности за что отвечает каждая строчка не буду, таких мануалов итак полно. Остальные поля можно оставить пустыми. Сохраняем. Все... первый этап завершен.

    2. После создания поля в таблице ее нужно привязать к админке сайта. Для этого идем сюда: administrator/com_virtuemart/html/product.product_form.php. В файле product.product_form.php в районе 197 строки начинается таблица, в которой формируются строки при добавлении нового товара. Оптимальнее всего размещать новое поле под артикулом. Следовательно находим строки:

    1. <tr class="row1">
    2. <td width="21%" >
    3. <div style="text-align:right;font-weight:bold;"><?php echo $VM_LANG->
    4. _('PHPSHOP_PRODUCT_FORM_SKU') ?>:</div>
    5. </td>
    6. <td width="79%">
    7. <input type="text" class="inputbox" name="product_sku" value="<?php $db->sp("product_sku"); ?>" size="32" maxlength="64" />
    8. </td>
    9. </tr>

    и после них вставляем:

    1. <tr class="row1">
    2. <td width="21%" >
    3. <div style="text-align:right;font-weight:bold;"><?php echo $VM_LANG->_('PHPSHOP_PRODUCT_FORM_NEW') ?>:</div>
    4. </td>
    5. <td width="79%">
    6. <input type="text" class="inputbox" name="product_new" value="<?php $db->sp("product_new"); ?>" size="32" maxlength="64" />
    7. </td>
    8. </tr>

    Далее заходим в админку виртумарта и видим, что строка появилась, но вот название поля не отображается. Вспомним, что выше мы вставили следующую комбинацию:

    1. <?php echo $VM_LANG->_('PHPSHOP_PRODUCT_FORM_NEW') ?>

    Значит нам нужно задать это поле в языковом файле, для этого идем в administrator/com_virtuemart/languages/product/russian.php и добавляем под строкой:

    1. 'PHPSHOP_PRODUCT_FORM_SKU' => 'Артикул',

    вот такую:

    1. 'PHPSHOP_PRODUCT_FORM_NEW' => 'Новое поле',

    Теперь поле нормально отображается в админке, однако оно не связано с базой данных, в следующем шаге этим мы и займемся.

    3. Теперь нам нужно связать наше новое поле с базой данных нашего сайта. Для этого идем в administrator/components/com_virtuemart/classes/ps_product.php находим строчки:

    1. // Insert into DB
    2. $fields = array ( 'vendor_id' => $vendor_id,
    3. 'product_parent_id' => vmRequest::getInt('product_parent_id'),
    4. 'product_sku' => vmGet($d,'product_sku'),

    сразу под ними вставляем:

    1. 'product_new' => vmGet($d,'product_new'),

    Такая комбинация встречается в файле 2 раза, первый раз для добавления нового товара (в районе 272 строки), второй раз для его изменения (в районе 473 строки). То бишь если отредактировать только один раз, то новое поле будет добавляться при создании товара, но потом его нельзя будет отредактировать. Теперь можно зайти в админку и попробовать добавить новый товар с новым параметром, затем попробовать его изменить, если все прошло успешно и все данные нормально сохраняются, значит поле успешно связывается с бд.

    4. В этом шаге мы начнем реализацию отображения нового поля в категории и карточке товара, для этого предварительно нужно отредактировать 2 файла. Сначала идем в administrator/com_virtuemart/html/shop_browse_queries.php (файл отвечает за включение поля в выборку при обращении к карточке товара или к категории). Находим строчки:

    1. $fieldnames = "`product_name`,`products_per_row`,`category_browsepage`,`category_flypage`,`#__{vm}_category`.`category_id`,
    2. `#__{vm}_product`.`product_id`,`product_full_image`,`product_thumb_image`,
    3. `product_s_desc`,`product_parent_id`,`product_publish`,`product_in_stock`,`product_sku`,`product_url`,

    и вставляем `product_new` после `product_sku`. Следовательно у нас должно получиться так:

    1. $fieldnames = "`product_name`,`products_per_row`,`category_browsepage`,`category_flypage`,`#__{vm}_category`.`category_id`,
    2. `#__{vm}_product`.`product_id`,`product_full_image`,`product_thumb_image`,`product_s_desc`,
    3. `product_parent_id`,`product_publish`,`product_in_stock`,`product_sku`,`product_new`,`product_url`,

    Сохраняем файл. Теперь идем в administrator/com_virtuemart/html/shop_browse.php (файл отвечает за "заглушку", которую мы будем использовать в карточке товара и в категории, кто не знает, в данном случае заглушка - это пхп функция, которая выводит данные из нашего нового поля непосредственно на сайте). Ищем строки:

    1. // Unset these for the next product
    2. unset($full_image_width);
    3. unset($full_image_height);
    4.
    5. $products[$i]['product_name'] = shopMakeHtmlSafe( $product_name );
    6. $products[$i]['product_s_desc'] = $product_s_desc;
    7. $products[$i]['product_details'] = $product_details;
    8. $products[$i]['product_rating'] = $product_rating;
    9. $products[$i]['product_price'] = $product_price;
    10. $products[$i]['product_price_raw'] = $product_price_raw;
    11. $products[$i]['product_sku'] = $db_browse->f("product_sku");

    и после них добавляем:

    1. $products[$i]['product_new'] = $db_browse->f("product_new");

    Все, заглушка готова, теперь можно переходить к финальному этапу. Формированию шаблона категории и карточки товара.

    5. Открываем components/com_virtuemart/themes/default/templates/browse/ваш шаблон категории. В моем случае это browse_1. В файле можно заметить, что вывод формируется через функции вида <?php echo $product_title ?>, следовательно, чтобы вывести наше новое поле нужно вставить: <?php echo $product_new ?>. В качестве примера выкладываю примерный код шаблона категории:

    1. <?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' );
    2. mm_showMyFileName(__FILE__);
    3. ?>
    4. <div class="browseProductContainer">
    5.
    6.
    7. <h1><a title="<?php echo $product_name ?>" href="<?php echo $product_flypage ?>">
    8. <?php echo $product_name ?></a>
    9. </h1>
    10. <table border="1" width="100%" style="text-align:center;">
    11. <tr>
    12. <td>
    13. <script type="text/javascript">//<![CDATA[
    14. document.write('<a href="javascript:void window.open(\'<?php echo $product_full_image ?>\', \'win2\', \'status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,width=<?php echo $full_image_width ?>,height=<?php echo $full_image_height ?>,directories=no,location=no\');">');
    15. document.write( '<?php echo ps_product::image_tag( $product_thumb_image, 'class="browseProductImage" border="0" title="'.$product_name.'" alt="'.$product_name .'"' ) ?></a>' );
    16. //]]>
    17. </script>
    18. <noscript>
    19. <a href="<?php echo $product_full_image ?>" target="_blank" title="<?php echo $product_name ?>">
    20. <?php echo ps_product::image_tag( $product_thumb_image, 'class="browseProductImage" border="0" title="'.$product_name.'" alt="'.$product_name .'"' ) ?>
    21. </a>
    22. </noscript>
    23. </td>
    24. <td>
    25. <?php echo $product_new ?>
    26. </td>
    27. <td>
    28. <?php echo $product_s_desc ?>
    29. </td>
    30. <td>
    31. <?php echo $product_sku ?>
    32. </td>
    33. <td>
    34. <?php echo $product_price ?>
    35. </td>
    36. </tr>
    37. </table>
    38. <br />
    39. <span>
    40. <?php echo $form_addtocart ?>
    41. </span>
    42.
    43. </div>

    С карточкой товара все по аналогии. Всем спасибо за внимание, думаю информация будет полезна для разработчиков Интернет магазинов :)
     
    sanosan, LP-kuban и foodman нравится это.
  3. foodman

    foodman Создатель

    Регистр.:
    18 апр 2009
    Сообщения:
    26
    Симпатии:
    1
    спс помогло, вот только сортировку по новому полю не получается реализовать. случаем не вкурсе как?
     
  4. cinemaxx

    cinemaxx Постоялец

    Регистр.:
    21 апр 2010
    Сообщения:
    59
    Симпатии:
    6
    Приведу пример для поля "product_name_ru"

    в файле:
    administrator\components\com_virtuemart\virtuemart.cfg.php

    после:
    define('VM_REGISTRATION_TYPE', 'NO_REGISTRATION');
    добавляем:
    define('VM_BROWSE_ORDERBY_FIELD', 'product_name_ru');

    после:
    /* OrderByFields */
    global $VM_BROWSE_ORDERBY_FIELDS;
    добавляем:
    $VM_BROWSE_ORDERBY_FIELDS = array( 'product_name','product_name_ru' );

    в файле:
    administrator\components\com_virtuemart\html\admin.show_cfg.php
    после:
    <option value="product_cdate" <?php if (@VM_BROWSE_ORDERBY_FIELD == 'product_cdate') echo "selected=\"selected\""; ?>><?php echo $VM_LANG->_('PHPSHOP_LATEST') ?></option>
    добавляем:
    <option value="product_name_ru" <?php if (@VM_BROWSE_ORDERBY_FIELD == 'product_name_ru') echo "selected=\"selected\""; ?>><?php echo $VM_LANG->_('PHPSHOP_PRODUCT_FORM_NAME_RU') ?></option>

    после:
    <input name="conf_VM_BROWSE_ORDERBY_FIELDS[]" type="checkbox" value="product_sku" <?php if (in_array( 'product_sku', $VM_BROWSE_ORDERBY_FIELDS )) echo "checked=\"checked\""; ?> id="conf_VM_BROWSE_ORDERBY_FIELDS4" />
    <label for="conf_VM_BROWSE_ORDERBY_FIELDS4"><?php echo $VM_LANG->_('PHPSHOP_CART_SKU') ?></label><br />
    добавляем:
    <input name="conf_VM_BROWSE_ORDERBY_FIELDS[]" type="checkbox" value="product_name_ru" <?php if (in_array( 'product_name_ru', $VM_BROWSE_ORDERBY_FIELDS )) echo "checked=\"checked\""; ?> id="conf_VM_BROWSE_ORDERBY_FIELDS5" />
    <label for="conf_VM_BROWSE_ORDERBY_FIELDS5"><?php echo $VM_LANG->_('PHPSHOP_PRODUCT_FORM_NAME_RU') ?></label>

    затем идем в админку вирта и выбираем сортировку по новому полю
     
    sanosan и LP-kuban нравится это.
  5. serega69

    serega69 Создатель

    Регистр.:
    22 окт 2010
    Сообщения:
    19
    Симпатии:
    1
    спасибо, помогло
     
  6. foodman

    foodman Создатель

    Регистр.:
    18 апр 2009
    Сообщения:
    26
    Симпатии:
    1
    вопрос такой, появится ли сортировка по новому полю в блоке "сортировать по" которая находится над списком товаров?
     
  7. kunev

    kunev Постоялец

    Регистр.:
    28 сен 2009
    Сообщения:
    111
    Симпатии:
    4
    Ссори за офтоп, но я всё же по теме. сам столкнулся с недавних пор с такой проблемой когда хотелось бы внедрить отдельные поля на определённый товар, сам думал сделать подобное, до тех пор когда клиент сказал что будут в каталоге и другие товары с другими свойствами. Выходит что если добавить поле в первом случае, поле в админке будут соответствовать, но если привязать его к другому товару то выходит нужно создавать уже новое. Вообщем решил применить краткое описание, где описывают по необходимости все эти характеристики.
     
  8. cinemaxx

    cinemaxx Постоялец

    Регистр.:
    21 апр 2010
    Сообщения:
    59
    Симпатии:
    6
    Нет. Чтобы появилось необходимо добавить это поле по аналогии с остальными в com_virtuemart\themes\ШАБЛОН\templates\browse\includes\browse_orderbyfields.tpl.php

    И в файле administrator\components\com_virtuemart\html\shop_browse_queries.php немного добавляем в case свой пункт и выбор по умолчанию. Например для того-же product_name_ru
    switch( $orderby ) {
    case 'product_list':
    $orderbyField = '`#__{vm}_product_category_xref`.`product_list`'; break;
    case 'product_name':
    $orderbyField = '`#__{vm}_product`.`product_name`'; break;
    case 'product_price':
    $orderbyField = '`#__{vm}_product_price`.`product_price`'; break;
    case 'product_sku':
    $orderbyField = '`#__{vm}_product`.`product_sku`'; break;
    case 'product_cdate':
    $orderbyField = '`#__{vm}_product`.`cdate`'; break;
    case 'product_name_ru':
    $orderbyField = '`#__{vm}_product`.`product_name_ru`'; break;
    default:
    $orderbyField = '`#__{vm}_product`.`product_name_ru'; break;
    }
     
  9. foodman

    foodman Создатель

    Регистр.:
    18 апр 2009
    Сообщения:
    26
    Симпатии:
    1
    поле появилось но сортирует почему то по полю "название". Где может быть ошибка?
     
  10. cinemaxx

    cinemaxx Постоялец

    Регистр.:
    21 апр 2010
    Сообщения:
    59
    Симпатии:
    6
    Забыл про shop_browse_queries.php
    Дополнил свой ответ выше.
     
Статус темы:
Закрыта.