Не показывать в письмах о заказе поле адреса по условию

  • 15 Ответов
  • 710 Просмотров

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

*

sashgera

  • Осваиваюсь на форуме
  • ***
  • 105
  • 0
Здравствуйте

Оформление заказа происходит на одной странице
При выборе варианта доставки "Самовывоз" - скрывается поле "Адрес получателя"
скрытие сделал JS примерно так:
Код: javascript
if ($("input:checked").val() == "standard_shipping%7C%D0%A1%D0%B0%D0%BC%D0%BE%D0%B2%D1%8B%D0%B2%D0%BE%D0%B7%7C%D1%81%D0%BE+%D1%81%D0%BA%D0%BB%D0%B0%D0%B4%D0%B0%7C0.00%7C3") {
$("#vm_myadres_div, #vm_myadres_input").hide();
}
else
$("#vm_myadres_div, #vm_myadres_input").show();


Как сделать так, чтобы скрытое при оформлении заказа поле "Адрес получателя" не приходило в письмах админу и покупателю?

Названия полей адреса, которые приходят в письмах, формируются здесь:
components/com_virtuemart/themes/default/templates/order_emails/confirmation_email.tpl.php
Код: php
<td><b><?php echo $VM_LANG->_($field->title)? $VM_LANG->_($field->title) : $field->title ?>:</b>

Пожалуйста, помогите в этом вопросе или подскажите где копать.

*

fsv

  • Moderator
  • *****
  • 2506
  • 367
в confirmation_email.tpl.php  посмотрите, что из себя представляет переменная $order_shipping , давно было, могу ошибаться, вроде как она составная. Получите из нее переменную, которую можно проверить на "самовывоз" (возможно, по id способа платежа, т.к. название в админке изменить легче, чем id в базе).
Далее смотрите адресные блоки кода. После
Код
if( $field->name == 'email') $field->name = 'user_email';
можно добавить
Код
if( "самовывоз" ){
    if( $field->name == 'поле_которое_надо_не_отсылать') continue;
}

Первое, что в голову пришло. Еще можно посмотреть формирование $registrationfields до передачи в шаблон письма.
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения

*

sashgera

  • Осваиваюсь на форуме
  • ***
  • 105
  • 0
fsv, но в этом случае поля "Адрес получателя" просто не будет в письмах при любых раскладах.
А нужно,  если поле "Адрес получателя" скрыто при оформлении заказа  - то и в письмах его нет.
А если не скрыто, то соответственно покупатель это поле заполняет и оно будет присутствовать в письмах
« Последнее редактирование: 06.10.2015, 19:33:07 от sashgera »

*

fsv

  • Moderator
  • *****
  • 2506
  • 367
Я так понял, что поле скрывается, и его не надо в письмо только при самовывозе. Поэтому и предложил проверять в шаблоне письма на этот вид доставки, если он, поле не выводится. Там поля в цикле выводятся, в данном случае его вывод будет пропущен, хотя оно в переменной будет всегда. Почему при любом раскладе? Пробовали?
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения

*

sashgera

  • Осваиваюсь на форуме
  • ***
  • 105
  • 0
fsv, как получить переменную из $order_shipping проверить на "самовывоз" я не знаю. Сможете помочь?
Пробовал так, по значению value "Самовывоза":
Код: javascript
if( "standard_shipping%7C%D0%A1%D0%B0%D0%BC%D0%BE%D0%B2%D1%8B%D0%B2%D0%BE%D0%B7%7C%D1%81%D0%BE+%D1%81%D0%BA%D0%BB%D0%B0%D0%B4%D0%B0%7C0.00%7C3" ){
    if( $field->name == 'vm_myadres') continue;
}
но поле "Адрес получателя" в письмах скрыто, при любом варианте доставки

*

fsv

  • Moderator
  • *****
  • 2506
  • 367
но поле "Адрес получателя" в письмах скрыто, при любом варианте доставки
потому что сейчас: "если true, пропускаем" (всегда)

Над первым foreach адресных полей:
Код
$ship_info_arr = explode("|", $db->f("ship_method_id") );

Просмотрите полученный массив (потом это удалите!):
Код
echo '<pre>'.print_r($ship_info_arr, true).'</pre>';
Найдите для самовывоза уникальный элемент массива. Пусть это будет второй элемент "Самовывоз", класс доставки может повторяться (не уникальный).
Только если вы в админке измените название доставки, все накроется. Для надежности можете запрос в базу на получение id этой доставки написать.

Тогда там, где выше написал:
Код
if( $ship_info_arr[1] == "Самовывоз" ){
    if( $field->name == 'vm_myadres') continue;
}
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения

*

sashgera

  • Осваиваюсь на форуме
  • ***
  • 105
  • 0
fsv, спасибо, все получилось.
к Самовывозу добавил еще одно поле
повторил все тоже самое для Доставки по Москве, здесь только одно поле в письме выводить не нужно
Код: php
$ship_info_arr = explode("|", $db->f("ship_method_id") );
$ship_info_arr2 = explode("|", $db->f("ship_method_id") );

foreach( $shippingfields as $field ) {
   if( $field->name == 'email') $field->name = 'user_email';

   if( $ship_info_arr[1] == "Самовывоз" ){
      if( $field->name == 'vm_myadres') continue;
      if( $field->name == 'vm_pasport') continue;
   }
   if( $ship_info_arr2[1] == "Доставка по Москве" ){
      if( $field->name == 'vm_pasport') continue;
   }

Только если вы в админке измените название доставки, все накроется. Для надежности можете запрос в базу на получение id этой доставки написать.
Вывод полей в письмах пропускаться не будет? Или сайт накроется?
Мне очень неудобно спрашивать – а как сделать запрос в БД на получение id доставки?


*

fsv

  • Moderator
  • *****
  • 2506
  • 367
Вот это
$ship_info_arr = explode("|", $db->f("ship_method_id") );
$ship_info_arr2 = explode("|", $db->f("ship_method_id") );
масло масляное, не надо. На просмотр оба массива, и вы увидите, что они одинаковые. В каждом заказе $db одна.
Один раз получаете массив, в обоих проверках его используете.

Сайт не накроется, поля выводится начнут. Запрос - смотреть надо.

Забыл, шаблон письма в utf-8 без бум, иначе проверка на совпадение с кириллической строкой не пройдет. Но раз получилось, и сами знаете.
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения

*

sashgera

  • Осваиваюсь на форуме
  • ***
  • 105
  • 0
fsv, внес изменения:
Код: php
$ship_info_arr = explode("|", $db->f("ship_method_id") );

if( $ship_info_arr[1] == "Самовывоз" ){
  if( $field->name == 'vm_myadres') continue;
  if( $field->name == 'vm_pasport') continue;
}
if( $ship_info_arr[1] == "Доставка по Москве" ){
  if( $field->name == 'vm_pasport') continue;
}
ну, если вдруг приспичит изменить название доставки, то наверное, можно потом поправить в коде?
Например
Код: php
if( $ship_info_arr[1] == "Доставка по Москве" ){
на
Код: php
if( $ship_info_arr[1] == "Доставка по МО" ){

*

fsv

  • Moderator
  • *****
  • 2506
  • 367
ну, если вдруг приспичит изменить название доставки, то наверное, можно потом поправить в коде?
да
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения

*

sashgera

  • Осваиваюсь на форуме
  • ***
  • 105
  • 0
fsv, спасибо, вы мне здорово помогли!

*

sashgera

  • Осваиваюсь на форуме
  • ***
  • 105
  • 0
fsv, у меня еще вопрос, если сможете, пожалуйста, помогите
В письмах, название товара сделал ссылкой:
Код: php
<?php
$q  = "SELECT product_id FROM #__{vm}_product WHERE product_name='".$dboi->f("product_name")."'";
$db->query($q);
$db->next_record();
$product_id = $db->f("product_id");
?>
<tr class="Stil1">
<td><?php echo $my_qty ?></td>
<td><a href="http://www.МойСайт/component/virtuemart/?page=shop.product_details&product_id=<?php echo $product_id ?>"><?php $dboi->p("product_name")?> <?php echo ($dboi->f("product_attribute")? ' ('.$dboi->f("product_attribute").')' : ''); ?></a></td>

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



если запрос делаю так (изменяю 3-ю строку), то поля скрываются и у покупателя, и у админа, но ссылка получается одинаковой для всех товаров (если в корзине было более одного товара):
Код: php
<?php
$q  = "SELECT product_id FROM #__{vm}_product WHERE product_name='".$dboi->f("product_name")."'";
$db->query(); //изменяю 3-ю строку
$db->next_record();
$product_id = $db->f("product_id");
?>
« Последнее редактирование: 25.10.2015, 22:58:03 от sashgera »

*

fsv

  • Moderator
  • *****
  • 2506
  • 367
Вы пытаетесь получить id товара. Он известен, внутри цикла  while($dboi->next_record()) {...}
Код
$prid=$dboi->f("product_id");

Вот откопал вариант письма, более чем 2,5-годичной давности. Там есть ссылка на товар.
Не для копипаста! Там перепиленный вариант под конкретную ситуацию. Но ссылку на товар рассмотреть при желании можно.

Спойлер
[свернуть]

Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения

*

sashgera

  • Осваиваюсь на форуме
  • ***
  • 105
  • 0
сделал так, теперь есть и ссылка товара и скрываются поля
Код: php
<td>
<?php
$prid=$dboi->f("product_id");
$mydb = &JFactory::getDBO();         
$mydb->setQuery("SELECT product_name FROM #__vm_product WHERE product_id=(SELECT product_parent_id FROM #__vm_product WHERE product_id=$prid)");
?>       
<a href="<?php echo JURI::root(); ?>/index.php?page=shop.product_details&flypage=flypage.tpl&product_id=<?php echo $prid ?>"><?php $dboi->p("product_name")?> <?php echo ($dboi->f("product_attribute")? ' ('.$dboi->f("product_attribute").')' : ''); ?></a></td>

fsv, большое спасибо! Вы меня снова выручили

*

fsv

  • Moderator
  • *****
  • 2506
  • 367
это, вроде, как ни к чему тут:
Код
$mydb = &JFactory::getDBO();         
$mydb->setQuery("SELECT product_name FROM #__vm_product WHERE product_id=(SELECT product_parent_id FROM #__vm_product WHERE product_id=$prid)");
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения

*

sashgera

  • Осваиваюсь на форуме
  • ***
  • 105
  • 0
fsv, все понял, еще раз спасибо!