Вопросmodule_invoke как же?

Есть в Ubercart такой модуль uc_cart.module
В нем присутствует хук hook_cart_pane

function uc_cart_cart_pane($items) {
  $body = '';
  if (!is_null($items)) {
    $body = '<div id="cart-form-pane">' . drupal_get_form('uc_cart_view_form', $items) . '</div>';
  }
 
  $panes[] = array(
    'id' => 'cart_form',
    'title' => t('Default cart form'),
    'enabled' => TRUE,
    'weight' => 0,
    'body' => $body,
  );
 
  return $panes;
}

Собственно вопрос как этот хук вытащить с помощью module_invoke в template.php для создания своей функции?

Комментарии

Аватар пользователя Spleshka
Spleshka написал:

Ну согласно API следующим образом:

<?php print module_invoke('uc_cart', 'cart_pane', $items); ?>

Где $items - массив с вашими айтемамы. Вот и вся хитрость :)

16.09.2011 14:24
Аватар пользователя zakraben
zakraben написал:

Вот и я о том же, согласно API... но не работает к сожалению
Вернее выводит просто запись Array

16.09.2011 15:26
Аватар пользователя zakraben
zakraben написал:

В общем если так не выходит, тогда вопрос другого плана. Как вытащить содержание корзины(положеных товаров в корзину)в любую ноду или в любой блок? Я надеялся сделать через module_invoke - но не прокатило )))

16.09.2011 16:08
Аватар пользователя Spleshka
Spleshka написал:

Вот этот кусок кода поможет (я его взял из hook_block uc_cart.module, убрав ненужную обработку и проверку на включенное кэширование):

<?php 
  $product_count = count(uc_cart_get_contents());  
  $items = FALSE;
  $item_count = 0;
  $total = 0;
  if ($product_count) {
    foreach (uc_cart_get_contents() as $item) {
      $display_item = module_invoke($item->module, 'cart_display', $item);
      if (!empty($display_item)) {
        $items[] = array(
          'nid' => $display_item['nid']['#value'],
          'qty' => t('@qty&times;', array('@qty' => $display_item['qty']['#default_value'])),
          'title' => $display_item['title']['#value'],
          'price' => $display_item['#total'],
          'desc' => isset($display_item['description']['#value']) ? $display_item['description']['#value'] : FALSE,
        );
      }
      $item_count += $item->qty;
      $total += $display_item['#total'];
    }
  }
 
  drupal_set_message('Items count: '. $item_count);
  drupal_set_message('Total: '. $total);
  drupal_set_message('Items: '. print_r($items, 1));
?>
16.09.2011 19:29
Аватар пользователя Spleshka
Spleshka написал:

Хотя можно немного оптимизировать код:

<?php 
  $cart_content = uc_cart_get_contents();
  $product_count = count($cart_content);  
  $items = FALSE;
  $item_count = 0;
  $total = 0;
  if ($product_count) {
    foreach ($cart_content as $item) {
      $display_item = module_invoke($item->module, 'cart_display', $item);
      if (!empty($display_item)) {
        $items[] = array(
          'nid' => $display_item['nid']['#value'],
          'qty' => t('@qty&times;', array('@qty' => $display_item['qty']['#default_value'])),
          'title' => $display_item['title']['#value'],
          'price' => $display_item['#total'],
          'desc' => isset($display_item['description']['#value']) ? $display_item['description']['#value'] : FALSE,
        );
      }
      $item_count += $item->qty;
      $total += $display_item['#total'];
    }
  }
 
  drupal_set_message('Items count: '. $item_count);
  drupal_set_message('Total: '. $total);
  drupal_set_message('Items: '. print_r($items, 1));
?>
16.09.2011 19:32
Аватар пользователя zakraben
zakraben написал:

Ага, наполовину пашет. Это получается код из блока. А как же сама страница /cart? вот из нее бы вытащить данные в свою функцию. Там и картинки и кнопки остальные. Просто не могу понять какие хуки подцепить. И то пробовал и другое. По темизации тапировскую таблицу курить нужно, а как вытянуть корзину - хз. Сама задумка вытянуть все данные и сделать всплывающую корзину для просмотра товаров.

Если есть какие-то другие пути реализации корзины в popup окне, поделитесь пожалуйста.

16.09.2011 20:17
Аватар пользователя zakraben
zakraben написал:
Display the cart view page.
 *
 * Show the products in the cart with a form to adjust cart contents or go to
 * checkout.
 */
function uc_cart_view() {
  // Failsafe so that this function only works when called with no arguments.
  // This prevents the accidental wiping of the cart_order session variable.
  if (func_num_args() > 0) {
    return drupal_not_found();
  }
 
  // Clear the cart order session variable if it exists.
  if (!empty($_SESSION['cart_order'])) {
    unset($_SESSION['cart_order']);
  }
 
  // Load the array of shopping cart items.
  $items = uc_cart_get_contents();
 
  // Display the empty cart page if there are no items in the cart.
  if (empty($items)) {
    return theme('uc_empty_cart');
  }
 
  // Load through the cart panes...
  $output = '';
  foreach (uc_cart_cart_pane_list($items) as $pane) {
    // If the pane is enabled...
    if ($pane['enabled']) {
      // Add its output to the cart view.
      $output .= $pane['body'];
    }
  }
 
  // Add a custom cart breadcrumb if specified.
  if (($text = variable_get('uc_cart_breadcrumb_text', '')) !== '') {
    $link = l($text, variable_get('uc_cart_breadcrumb_url', '<front>'));
    drupal_set_breadcrumb(array($link));
  }
 
  return $output;
}

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

16.09.2011 21:17
Аватар пользователя Spleshka
Spleshka написал:

Ну смотри. Напиши в темплейте такую функцию:

function ubercart_popup() {
  if (module_exists('uc_cart')) {
    $items = uc_cart_get_contents();   
    if (empty($items)) {
      return theme('uc_empty_cart');
    }   
    $output = '';
    foreach (uc_cart_cart_pane_list($items) as $pane) {
      if ($pane['enabled']) {
        $output .= $pane['body'];
      }
    }    
    return '<div id = "uc_popup">'. $output .'</div>';  
  }
}

И выведи эту функцию в page.tpl.php, например, перед закрывающим тэгом </body>:

<?php print ubercart_popup(); ?>

Дальше в стилях пропиши (примерно):

#uc_popup {
  display: none;
  position: absolute;
  left: 30%;
  top: 100px;
  z-index: 9999;
}

И подключи js, который при клике на нужную кнопку, показывает/скрывает корзину:

$('a.someclass').click(function() {
  $('#uc_popup').toggle();
});

Вот и всё. Само собой, css и js можно потом усложнить, чтобы добиться красивого вывода корзины :)

16.09.2011 22:31
Аватар пользователя zakraben
zakraben написал:

РАОТАЕТ!!!!!!!! :YAHOO:
Спасибо большое!

17.09.2011 00:35
Аватар пользователя zakraben
zakraben написал:

Еще есть вариант вывести корзину в всплывающем окне через модуль popups api правда там через селекторы в контенте настраивать нужно.

17.09.2011 11:27
Аватар пользователя Spleshka
Spleshka написал:

Ну выводить можно уже многими способами :) Вопрос ведь был как вытянуть инфу из уберкарта :)

18.09.2011 16:08

Комментировать