Как добавить кнопку заказа к ноде? [Решено]

Главные вкладки

Аватар пользователя lipinart lipinart 19 сентября 2016 в 9:01

Подразумевается, что кнопка как поле ноды доступно в любом view_mode и views. При клике на кнопку вызывается кастомная форма заказа, в которую передаются значения полей текущей ноды: артикул (product_sku) и цена (product_price).
В таком случае, будет достаточно получить nid (node ID), чтобы потом загрузить объект ноды и получить необходимые значения.
В отличии от корзины модуля drupal_commerce, где в рендер отдается форма с количеством и кнопкой, можно все упростить до простой ссылки вида:

<a href="chekout?456" class="btn ajax">Заказать</a>

где chekout - адрес формы, а 456 - nid

Самое простое - напрямую в шаблоне:

<a href="chekout?<?php print $node->nid; ?>" class="btn ajax">Заказать</a>

опасно, при смене темы или редактировании функционал может отвалится.

Думал в hook_install() создать новое текстовое поле, но придется дергать все ноды ради того, чтобы получить nid, обернуть в ссылку и сохранить в поле.

Комментарии

Аватар пользователя lipinart lipinart 19 сентября 2016 в 11:31

Вот, что получилось:

<?php
/**
 * Add extra-field for node:
 * Implements hook_field_extra_fields().
 */
function mymodule_field_extra_fields() {
    
// product - entity type
    // checkout - field name
  
$extra_fields['node']['product']['display']['checkout'] = array(
    
'label' => t('Buy'),            // Label
    
'description' => t('Add buy button'), // Description
    
'weight' => 10,                     // Default weight
  
);
  return 
$extra_fields;
}

/**
 * Implements hook_node_view().
 */
function mymodule_node_view($node$view_mode$langcode) {
  static 
$extra_fields = array();
 
  
$key 'node:' $node->type ':' $view_mode;
  if (!isset(
$extra_fields[$key])) {
    
$extra_fields[$key] = field_extra_fields_get_display('node'$node->type$view_mode);
  }
 
  if (isset(
$extra_fields[$key]['checkout']) && $extra_fields[$key]['checkout']['visible']) {
    
$node->content['checkout'] = array(
      
'#markup' => '<a href="checout?' $node->nid '">' t('Buy') . '</a>',
      
'#weight' => $extra_fields[$key]['checkout']['weight'],
    );
  }
}
?>

В Display manager можно управлять положением поля, но вьюс его не видит Sad

Аватар пользователя gun_dose gun_dose 19 сентября 2016 в 11:53

А, вам во вьюс надо? Так возьмите просто выведите nid, а в настройках поля укажите "Заменить выводимое полем значение" и впишите

<a href="chekout?[nid]" class="btn ajax">Заказать</a>