VirtueMart - как добавить поле к товару

Другими словами, как добавить всем товарам еще один атрибут, чтоб потом иметь возможность значение в карточке товара, и выводить его на flypage - странице товара. VirtueMart 1.0.5 (Joomla Paranoia MCE! 1.0.8.2, но, мне кажется, это некритично:)

  1. Сначала надо добавить поле в Конфигурация импорта/экспорта CSV:
    Админка/Товары/Использовать загрузку CSV/Конфигурация (Админка/ Products/Use CSV upload/Configuration). Запомните имя, которое ему дали - например, у меня это regcert - от “регистрационный сертификат”. Выбирая имя, постарайтесь, чтобы оно не совпало со всей той кучей переменных, которые там уже существует ;)
  2. добавляем руцями поле в базу, размерность по вкусу:
    alter table jos_vm_product add regcert varchar(55) default NULL;
  3. добавляем поле в карточку товара:
    administrator/components/com_virtuemart/html/product.product_form.php
    Где именно? по вкусу между </tr> и <tr> ;)

    <tr><td style="text-align:right;font-weight:bold;">
            Рег. удостоверение №:</td>
            <td valign="top" align="left" width="69%">
              <input type="text" name="regcert” class=”inputbox” size=”32″
             value=”<?php echo $db->sf("regcert"); ?>”/>
    </td></tr>
  4. Чтобы поле выводилось на странице товара: administrator/components/com_virtuemart/html/templates/product_details/flypage.php добавляем в нужном месте {regcert}
  5. Чтобы ему присваивалось значение:
    administrator/components/com_virtuemart/html/shop.product_details.php
    где-то начиная со строки 385 приводим к виду

    $template = str_replace( “{product_type}”, $product_type, $template ); // Changed Product Type
    $template = str_replace( “{product_packaging}”, $product_packaging, $template ); // Changed Packaging
    $template = str_replace( “{regcert}”, $regcert, $template ); // Регистрационное удостоверение № 

    .. и присвоить значение $regcert, в этом же файле, чуть выше:
    $regcert =$db_product->f(’regcert‘);

В этом виде магазин готов принимать значение этого поля через CSV, показывает его в админке и на странице.
Проверить так:
update jos_vm_product set regcert=”sdfhvdjvbdvh dhvb sd” where product_sku=”ваш_артикул“;

Осталось только, чтоб значение этого поля, поправленое в админке VirtueMart, сохранялось. Еще не успел расколупать, сейчас займусь :)

47 Responses to “VirtueMart - как добавить поле к товару”

  1. Геннадий Says:

    Жаль что Вы не продолжили тему!
    (Осталось только, чтоб значение этого поля, поправленое в админке VirtueMart, сохранялось. Еще не успел расколупать, сейчас займусь :))
    Было бы интересно написать такой патч, или описать в статье как добавить поле к товару которое в свою очередь является атрибутом с ограничением допустимых значений (например покупатель выбирает от 20 до 40% чего либо) если он ошибается набирает 10 процентов то после перехода получает сообщение, что он неправильно ввел значение атрибута!!!

    (Включена подписка на комментарии)

  2. Путник Says:

    к сожалению, пока не добрался. Для меня сейчас гораздо важнее интеграция этого хозяйства и 1С.
    Если про фиксированный выбор - на скорую руку можно заменить через спиок атрибутов, например
    Концентрация,20%[+1],25%[+1],30%,35%[-1],40%[-1];
    Покупателю и придется что-то выбрать, и не даст выбрать “не то”.

  3. Путник Says:

    Закончил интеграцию 1С и VirtueMart/Joomla!
    http://putnik.net.ua/index.php/comps/web/2006/07/18/virtuemart-1c-integratsiya/

  4. Дмитрий Says:

    Уважаемый Путник! Для того, чтобы значение поля, которое мы добавили и поправленое в админке VirtueMart, сохранялось, в product.product_form.php его нужно вставлять вот так

    :

    sp(”my_depth”); ?>” size=”15″ maxlength=”15″ />

    (Включена подписка на комментарии)

  5. Путник Says:

    2Дмитрий: к сожалению, коммент получился покоцаным, скорее всего из-за тегов. Было бы здорово или запостить его еще раз с учетом этого, или через вот эту форму, а я выложу сюда.
    Обновление 30/08: К сожалению, Дмитрий ничего не прислал второй раз… :(

  6. Татьяна Says:

    Уважаемые, а можно ли сделать так чтоб по тем полям что добавили можно было сделать сортровку уже на сайте , тоесть например есть несколько производителей (Шины Michlien и шины Contintntal) выбираешь напимер Contintntal, далее идет размерность и сезонность которые тоже выбирает конечный пользователь
    в общем моно сделать мнесколько выпадающих менюшек
    1- производитель - (предложен список производителей) открываем выбираем
    2 - сезонность (предложены зима лето например)
    2- размерность - (тоже предложено несколько параметров)
    Извините что довольно сумбурно написано - пример того что хотелось бы сделать на сайте предложен вот тут http://www.prokoloff.net/rus/select_t/

    (Включена подписка на комментарии)

  7. Путник Says:

    Именно такой формы не будет точно - только если сами допишете, сильно узкоспециализированное решение, имхо.
    Я бы сначала сделал так, как тут (потому, что это у меня уже сделано:) )- это фильтр по производителю, а потом копать в сторону shop.browse.php и VM_BROWSE_ORDERBY_FIELDS.

    Upd: Или стандартная возможностьфильтра по производителю - имхо вполне подходит…

  8. Дмитрий Says:

    Татьяна, Вам уже объясняли на форуме, что такого в Virtuemat не сделаешь. Правильно говорит товарит - очень узкое специализированное решение.
    Какие же порой люди упрямые бывают :)

    (Включена подписка на комментарии)

  9. Путник Says:

    Нууууу, если посильнее упереться, то можно и сделать…. но это должен быть очень хороший стимул :)
    Попробуйте заказать кому-нибудь.
    зы: не возьмусь, т.к. быстро не получится, а на долго - времени нет, а копать глубоко надо :(

  10. Дмитрий Says:

    Мой программист мог бы это сделать и в разумные сроки. Такой поиск будет стоить 2000-2500 рублей (около 80-100$)

    (Включена подписка на комментарии)

  11. Татьяна Says:

    Упертые - конечно - а как вы думаете прогресс движется? если топтаться на месте то ясен пень ничего не сделаешь, а то что обрываю все форумы по этому вопросу - ну пристите - 1 объяснил что нельзя , 2-ой может и сможет помочь ;)

    Дмитрий - дайте свои контакты - спишeмся
    напишите мне письмо на ящик alex_sal [гав] list.ru - пообщаемся или в асю 305655755

    (Включена подписка на комментарии)

  12. Путник Says:

    Мне комисионные плз!!!!!!! За сводничество ;)
    шутка :)

  13. Татьяна Says:

    в любом случае спасибо за сводничество ;)

    (Включена подписка на комментарии)

  14. Татьяна Says:

    Все - решение найдено господа, осталось только причесать!!!
    Для того чтобы вывести дополнительные параметры в VirtueMart нужно найти файл mod_virtuemart.php в папке modules
    найти стороку с таким содержимым:
    /* Get module parameters */….
    строка: $show_product_parameter_search = $params->get( ’show_product_parameter_search’, ‘no’ );
    по умолчанию …$params->get( ’show_product_parameter_search’, ‘no’ ) …
    Заменить $params->get( ’show_product_parameter_search’, ‘YES’ )
    тем самым разрешается поиск по дополнительным параметрам типов товаров.

    Кто сказал что такого нельзя сделать? ;)

    (Включена подписка на комментарии)

  15. Дмитрий Says:

    Очень интересно, посмотри, что у тебя получится :)

    Если смотреть тот сайт, который Вы указали, то списки можно сделать, если постараться. Мне вот интересно, как Вы сделаете возможность выбор по сезонам. Втом виде, в котором это реализовано на сайте http://www.prokoloff.net/rus/select_t/ думаю стандартными средства не выйдет. Конечно, если хорошо знаете php и есть опыт программирования под joomla, nj будто намного проще

    (Включена подписка на комментарии)

  16. Татьяна Says:

    по сезонам выпадающая менюшка получилась и там можно выбрать , час причешем все - покажу что вышло

    (Включена подписка на комментарии)

  17. Orphis Says:

    2) добавляем руцями поле в базу, размерность по вкусу:
    alter table jos_vm_product add regcert varchar(55) default NULL;

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

    (Включена подписка на комментарии)

  18. Андрей Says:

    Путник, а подскажите пожалуйста, как быть в следующей ситуации?
    Я варю каши на разных продуктах: воде и молоке. Так вот вопрос: можно ли сделать, чтобы на странице просмотра моих товаров выводилось 2 цены: каша на молоке 10р., каша на воде 5р.?

    Можно конечно через аттрибуты товара сделать, но как то неудобно получается - человек должен зайти в продукт чтобы увидеть, сколько будет стоить товар в различных исполнениях.

    Заранее благодарю за ответ

    (Включена подписка на комментарии)

  19. Путник Says:

    2Татьяна: и где обещаные результаты? ;)

    2Orphis: база - одна. Вашего сайта. Пожалуйста, сначала поймите, как выполнять постейшие sql-запросы (например, select * from jos_vm_product). после этого будет легче :)

    2Андрей: А почему неудобно? а если у Вас разная фасовка - автоматически цена должна быть разной, ведь так?
    Если же хочется, чтоб виделись все цены сразу - можно на странице категории каждому товару подцепить еще соответствующую табличку, только нагормождение большое будет…

  20. Андрей Says:

    Путник, спасибо за ответ! вот как раз хотел спросить о технической стороне подцепления таблички.
    наткнулся на следующую проблему. В csv файл вбил данные по длине, высоте и ширине. теперь в shop.browse.php добавил:
    $product_cell = str_replace( “{product_length}”, $db_browse->f(”product_length”), $product_cell );
    а в темплейте соответственно добавил строчку {product_length}. Только вот результата нет - и не ругается, но и на страничке пустое место выводит. Не подскажите, в чем может быть проблема?

    (Включена подписка на комментарии)

  21. Андрей Says:

    Все, отыскал.. надо было поправить еще shop_browse_queries.php
    Теперь я при размерах.. осталось только разобраться, как сделать чтобы не выводило такого большого количества нулей: 252.0000мм

    (Включена подписка на комментарии)

  22. Путник Says:

    2Андрей: С решением!:)
    самое первое, что пришло в голову - может, printf?

  23. Андрей Says:

    сделал так: зашел в mySQL и сменил формат для нужных ячеек с 10.4 на 10.0. Помогло! сенк за ответ.

    (Включена подписка на комментарии)

  24. TyT Says:

    Подскажите как заставить принимать значения введенные в админке…
    с советом Дмитрия чет не разобрался :(
    [quote]
    sp(”my_depth”); ?>” size=”15″ maxlength=”15″ />
    [/quote]
    вместо sf sp вписать надо или как? или фокус в my_depth?

    наставте на путь истинный ато уже не в моготу…

    (Включена подписка на комментарии)

  25. Путник Says:

    2TyT: сорри, код невозможно вставить в комменты таким образом.
    Именно поэтому не работает код Дмитрия, если его вставить в точности так, как он есть тут в комментах.

    зы: Если бы Дмитрий прислал его мне через Feedback - контакты, то я б исправил, чесслово!

  26. TyT Says:

    Такс… разобрался :)
    подправил еще дополнительно по аналогии с родными полями (product_height например)
    shop_browse_queries.php
    ps_csv.php
    ps_product.php

    задал в языковых фалах переменные с названием новых пунктов

    и изменение товара из админки заработало…
    остался вопрос :(

    я во flypage.php вывожу значение полей используя языковые файлы

    {vm_lang:_НАЗВАНИЕ_МОЕГО_ПОЛЯ} : {значение_моего_поля}

    но если значение поля не заданно, выводится только _НАЗВАНИЕ_МОЕГО_ПОЛЯ:

    какое условие надо создать (как его оформить) чтобы при пустом поле _НАЗВАНИЕ_МОЕГО_ПОЛЯ не выводилось

    типа:

    {vm_lang:_НАЗВАНИЕ_МОЕГО_ПОЛЯ} {значение_моего_поля}

    (Включена подписка на комментарии)

  27. Путник Says:

    Дополнение от ТуТ, за что ему респект:
    Чтобы поле выводилось только при наличии значения:
    Если по вышеописанному примеру то так:
    Вместо

    $regcert =$db_product->f(’regcert‘);

    писать:

    if ( $db_product->f(’regcert’) ) {
        $regcert = “<br >Рег. удостоверение №: ”.$db_product->f(’regcert’);
        } else {$regcert = “”;}

    и потом во флайпейдже вставлять только заглушку {regcert}

    при желании забиваем в языковые файлы переменную типа
    _REGCERT = “Рег. удостоверение №:”;

    тогда во shop.product_details.php писать:

    if ( $db_product->f(’regcert’) ) {
        $regcert = “<br >”.$VM_LANG->_REGCERT.” ”.$db_product->f(’regcert’);
        } else {$regcert = “”;}

  28. KillDead Says:

    Спасибо за решение проблемы с “Чтобы поле выводилось только при наличии значения”. Вот только как сделать аналогично для shop.browse.php, т.е. для страницы, где отображается сразу несколько товаров.

    Заранее благодарю за ответ

  29. Путник Says:

    аналогично, только гайки крутить в той обработке, которая непосредственно товар выводит.
    Если ничего не путаю, то это действительно shop.browse.php,
    у меня на 338 строке, начинается с

    /*** Start printing out all products (in that category) ***/
    while ($db_browse->next_record()) {

  30. KillDead Says:

    Вроде всё легко, но
    // if ($db_browse->f(’izdatelstvo’) ) {
    // $izdatelstvo= $db_browse->f(’izdatelstvo’).”, “;
    // } else {$izdatelstvo= “”;}
    либо
    // $izdatelstvo= $dbр->f(’izdatelstvo’).”, “;

    не работает. Ещё несколько вариаций пришло на ум - тоже нет эффекта. Вроде вообще не тут надо менять.
    Мож shop_browse_queries.php надо поцокать? Там же всё внесённые переменные обитают.

  31. Путник Says:

    db_browse->f или dbр->f - не помню. В любом случае сначала выяснить, а потом заворачивать в иф :)

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

    еще момент - чтотименно не должно показываться - только значение? так оно и так если пустое - не покажется. А если чтоб, например, рамочка вокруг него тоже не появлялась - так и надо рамочку засунуть в if.

    shop_browse_queries.php - он формирует запрос, а обрабатывается рез-т уже в shop.browse. Если бы надо было какой-то хитрый фильттр ставить - тогда, может, еще есть смысл, и то под вопросом.

  32. KillDead Says:

    Понял, где ошибка:
    была строчка
    //$product_cell = str_replace( “{izdatelstvo}”, $db_browse->f(”izdatelstvo”), $product_cell );

    , а надо
    //$product_cell = str_replace( “{izdatelstvo}”, $izdatelstvo , $product_cell );
    Всё работает.

  33. Евгений Says:

    Путем “соединения” этой статьи и этого поста на форуме (с изменениями) http://forum.virtuemart.ru/index.php?topic=815.0 , и правки еще одного файла - prodict.product_display я таки заставил добавиться еще два поля : )) и заставил все работать в админке

    Будет время, отпишу все подробно

    (Включена подписка на комментарии)

  34. Путник Says:

    2 Евгений: напишите, пожалуйста. Мне будет совсем не жалко поставить ссылку на Ваш будущий(?) сайт :)

  35. Сергей Says:

    Напишите пожалуйста как сделать так, чтобы запись из админки записывалась!
    Я всё сделал, всё работает, только вот записи в админке нет….
    Спасибо!

    (Включена подписка на комментарии)

  36. сергей Says:

    а как вывести это новое поле при просмотре списка товаров в browse_listtable.tpl.php?

    (Включена подписка на комментарии)

  37. Михаил Says:

    Как все таки сделать чтоб изменения нового поля из админки сохранялось?

    (Включена подписка на комментарии)

  38. Путник Says:

    Михаил - не делал я этого. У меня все такие поля обновляются из 1С, и централизованно правятся там.

  39. Михаил Says:

    Пока ждал ответа знающих нашел сам как.

    правда под версию VM 1.1
    Суть такая, проделов все выше описанное идем в /administrator/components/com_virtuemart/classes/ps_product.php

    там находим функциии add() и update().
    в них есть вот такое:

    $fields = array ( ‘vendor_id’ => $vendor_id,

    вот в эти массиивы по аналогии и дописываем новое поле.

    (Включена подписка на комментарии)

  40. Maxim Says:

    Доброго времени суток! После прочтения недюженного количества форумов я так и не нашел ответа на свой вопрос. Очень надеюсь, что здесь мне подскажут.
    Задача состоит в следующем:
    1. Добавить новые поля в административной части при добавлении нового товара. Т.е. помимо стандартных полей типа “Артикул”, “Наименование”, “Краткое описание”, “Полное описание”, надо добавить еще поля “Год выпуска”, “Качество” и др.
    2. Сделать отображение товара примерно как на сайте numizmat.net.

    Очень прошу помочь. Подскажите хотя бы где копать. Я еще не очень хорошо знаком со структурой директорий в ВиртуМарте!
    Заранее благодарю Вас.


    С уважением, Валуев Максим!

    (Включена подписка на комментарии)

  41. Путник Says:

    2 Maxim: пожалуйста, перечитйте все, что написано выше. Если Вы это все попробуете, и не поможет - напишите, что именно Вы делали, и на чем остановились.

  42. WebSerfer Says:

    Я хочу поменять два поля местами - поле артикул с полем название. Перерыл код, изменял, но пока так ничего и не получилось… везде старые мануалы, а жаль… неужели в базу придется лезть?

    (Включена подписка на комментарии)

  43. Путник Says:

    WebSerfer: где поменять?

  44. WebSerfer Says:

    Ну, в таблице, где выводиться список товаров. В корзине я изменил вывод, а вот в основном меню пока не получается…

    (Включена подписка на комментарии)

  45. Maxim Says:

    Зашел написать слова благодарности. Спасибо всем, кто участвовал в разрешении данной проблемы. Благодаря вашим постам у меня все получилось. ВУыглядит это примерно так vipcoins.net!!! Если кому надо, могу поделиться исходником! ))

    (Включена подписка на комментарии)

  46. Igor Says:

    Всем доброго время суток.
    Работаю с joomla 1.5.15, VirtueMart 1.1.4
    Добавил два поля по описанной технологии (всем спасибо за пост).
    В flypage все работает, из админки данные сохраняются.
    Возникли проблемы, не могу получить информацию в списке товаров (browse_1.php):

    Добавил сведения о своих полях в shop.browse.php

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

    Что надо еще добавить, чтобы получить данные из новых полей в browse_1.php?

  47. Константин Says:

    по поводу добавления поля к browse.php смотри http://joomlaforum.ru/index.php?topic=36710.0

Оставить комментарий - Feel free to ask me in English

Он появится после того, как будет одобрен. - All comments are pre-moderated.

Внимание! Пожалуйста, не пишите в комментарии [url=... или [url]... - это будет считаться спамом. Если хотите дать ссылку - пишите просто адрес, до 2х на один коммент.
Attention! Please don't use "[url=..." or "[url]..." in comment's body or it will be deleted as spam
If you want to send me a link just type url, up to 2 urls in one comment.

Спасибо за отзыв! Thank you for a comment!