Termékek képének megjelenítése a fizetési oldalakon

aboros képe

Napok óta küzdök egy problémával. Szeretném, ha az Übercart megjeleníté a rendelésben szereplő termékek képét a rendelési folyamat közben végig. A kosár tartalmát nézve meg is teszi ezt, de a /cart/checkout és a /cart/checkout/review oldalakon már nem. Mivel a szóban forgó áruház egészen konkrétan képeket árul, nagyon fontos lenne, hogy a vevő a vásárlás befejezéséig minden lépésnél lássa a képet, ne csak annak címét.

Áttúrtam a bolt beállításokat amennyire csak lehet és sajnos ilyen lehetőséget sehol nem találtam. Lehetséges, hogy ehhez valamiféle saját modulra lesz szükségem? Csinált valaki már ilyet? Merre induljak? Az uc_cart.module -ban találtam egy ilyet: theme_uc_cart_checkout_review .. de ez meg 'pane' -ekben gondolkodik, maguk a termékek nem is tudom hogyan kerülnek bele.

Nagyon örülnék, ha valaki tudna segíteni, legalább egy kis iránymutatással, mert már kezdek ettől a feladattól begolyózni. Előre is kösz!

Melyik modulhoz, modulokhoz kapcsolódik a téma?: 
Drupal verzió: 
pp képe

Én ilyenkor a hook_menu-ben megnézem, hogy milyen függvény valósítja meg a fent jelzett útvonalakat és onnan oknyomozok, hogy hogyan áll össze a tartalom és hogyan tudok belenyúlni.

pp

0
0
aboros képe

sőt, tőled láttam ezt a trükköt valamikor, már nem emlékszem..

function uc_cart_menu($may_cache) {
  $items = array();
 
  if ($may_cache) {
    $items[] = array(
      'path' => 'admin/store/settings/cart',
      'title' => t('Cart settings'),
      'description' => t('Configure the cart settings.'),
      'callback' => 'uc_cart_cart_settings_overview',
      'access' => user_access('administer store'),
    );
    /* és még itt egy raklap settings menü */
 
    $items[] = array(
      'path' => 'admin/store/settings/checkout',
      'title' => t('Checkout settings'),
      'description' => t('Configure the checkout settings.'),
      'callback' => 'uc_cart_checkout_settings_overview',
      'access' => user_access('administer store'),
    );
    $items[] = array(
      'path' => 'admin/store/settings/checkout/overview',
      'title' => t('Overview'),
      'description' => t('View the checkout settings.'),
      'access' => user_access('administer store'),
      'weight' => -10,
      'type' => MENU_DEFAULT_LOCAL_TASK,
    );
 
    /* és még egy csomó menu local task, de azok beállítások szintén */
 
#na itt végre a menu callbackek
    $items[] = array(
      'path' => 'cart',
      'title' => t('Shopping cart'),
      'description' => t('View/modify the contents of your shopping cart or proceed to checkout.'),
      'callback' => 'uc_cart_view',
      'access' => user_access('access content'),
      'type' => MENU_CALLBACK,
    );
    $items[] = array(
      'path' => 'cart/checkout',
      'title' => t('Checkout'),
      'description' => t('Purchase the items in your shopping cart.'),
      'callback' => 'uc_cart_checkout',
      'access' => user_access('access content'),
      'type' => MENU_CALLBACK,
    );
    $items[] = array(
      'path' => 'cart/checkout/review',
      'title' => t('Review order'),
      'description' => t('Review an order before final submission.'),
      'callback' => 'uc_cart_checkout_review',
      'access' => user_access('access content'),
      'type' => MENU_CALLBACK,
    );
    $items[] = array(
      'path' => 'cart/checkout/complete',
      'title' => t('Order complete'),
      'description' => t('Display information upon completion of an order.'),
      'callback' => 'uc_cart_checkout_complete',
      'access' => user_access('access content'),
      'type' => MENU_CALLBACK,
    );
  }
 
  return $items;
}

engem a cart/checkout és a cart/checkout/review urlek érdekelnek.
utóbbi callbackjében találtam ezt a végén:

$output = theme('uc_cart_checkout_review', $help, $data, $form);
 
return $output;

és aztán meg is találtam ezután már ezt:

function theme_uc_cart_checkout_review($help, $panes, $form) {
  drupal_add_css(drupal_get_path('module', 'uc_cart') .'/uc_cart.css');
 
  $output = '<div>'. check_markup(variable_get('uc_checkout_review_instructions',  uc_get_message('review_instructions')), variable_get('uc_checkout_review_instructions_format', 3), FALSE)
           .'</div><table class="order-review-table">';
 
  foreach ($panes as $title => $data) {
    $output .= '<tr class="pane-title-row"><td colspan="2">'. $title
              .'</td></tr>';
    if (is_array($data)) {
      foreach ($data as $row) {
        if (is_array($row)) {
          if (isset($row['border'])) {
            $border = ' class="row-border-'. $row['border'] .'"';
          }
          else {
            $border = '';
          }
          $output .= '<tr valign="top"'. $border .'><td class="title-col" '
                    .'nowrap>'. $row['title'] .':</td><td class="data-col">'
                   . $row['data'] .'</td></tr>';
        }
        else {
          $output .= '<tr valign="top"><td colspan="2">'. $row .'</td></tr>';
        }
      }
    }
    else {
      $output .= '<tr valign="top"><td colspan="2">'. $data .'</td></tr>';
    }
  }
 
  $output .= '<tr class="review-button-row"><td colspan="2">'. $form
            .'</td></tr></table>';
 
  return $output;
}

mi a búbánat ez a $panes? ez valami TAPir cucc? mi ez? gondolta aboros... persze devel dolgai (dev load, dev render) nem is jelennek meg a kérdéses urlen.. :(

most próbálom ezt a sminkfüggvényt darabjaira szedni majd, hogy mi a fene történik itt, de igazából csak annyit szeretnék, hogy a szerencsétlen node title mezője mellett jelenjen már meg a kép is. nagy lenne. és minden szutyok táblázatot lehet állítani a bolt adminisztrációból egyébként, pl ki tudom venni a szóban forgó urlen megjelenő dolgok közül a számlázási címet pl ha akarom (gondolom ez egy $pane). ugyanitt a terméket is ki tudom venni, de csak "egybe" és nincs olyan opció, hogy kép mutatása e vagy sem.

majdcsak találok valami megoldást azért.
talán tényleg a termék egy ilyen "pane" és talán azt ha elkapom, benne van a node id és akkor már nyertem, de ez csak most jutott eszembe, ahogy írtam és mégegyszer végiggondoltam, hogy mi történhet itt.

0
0

-
clear: both;

pp képe

A callback a $data változóba tolja bele a cuccokat (talán pont a kulcs lesz a megoldás kulcsa is. ;))

Szóval a callback mit tol a data-ba?

pp

0
0
Pasqualle képe

csak a szemleltetes kedveert, hogy miaza a $panes:

$output = theme('uc_cart_checkout_review', $help, $data, $form);
function theme_uc_cart_checkout_review($help, $panes, $form) {

0
0
aboros képe

a cart/checkout/review oldalon a 'kosár tartalma' paneben a data egy string, html táblázatban a termékek neve és azok paraméterei. :(
más panekben (pl szállítási cím) tömbben vannak az adatok.

vagy nem értem a kérdést. :)

0
0

-
clear: both;

pp képe

A kérdés az, hogy a sminkben tudod-e azonosítani valahogy a terméket, tehát a node-id-t visszaszedni, mert akkor betöltheted a node-ot és akkor olyan adatot jelenítesz meg amilyet akarsz. (nem szép, de működő megoldás)

pp

0
0
aboros képe

pont ez a bajom. ha tudnám a terméket azonosítani, akkor nem kérdeznék. :)

a theme_cart_review_table azzal kezd, hogy $items = uc_cart_get_contents(); és ott az egyes $itemekben benne van a node id. úgyhogy az már megoldódott, hogy a cart/checkout oldalon megjelennek a termékképek.

viszont nekem a cart/checkout/review oldalon is kellenének a képek, amit pedig a theme_uc_cart_checkout_review -val tudok befolyásolni, de ott már csak $panes van.

..
foreach ($panes as $title => $data) {
    $output .= '<tr class="pane-title-row"><td colspan="2">'. $title
              .'</td></tr>';
    if (is_array($data)) {
#itt nincsenek a termekek, mert ha itt print_r($data) akkor ott a termekek nincsenek..
    }
    else {
#ha ezt itt kikommentezem, nem jelennek meg a termekek
      $output .= '<tr valign="top"><td colspan="2">'. $data .'</td></tr>';
    }
  }

azt már nem tudom, hogy az a html adat hogyan kerül abba a panebe, de az egy teljesen összeállított html táblázat már. fogalmam sincs hol állítódik össze. :(

0
0

-
clear: both;

sgabe képe

Van a cart modulban egy uc_checkout_pane_cart.inc fájl egy theme_cart_review_table függvénnyel amiben az $item tömbben ott leledzik a kép is, alább láthatod módosítva.

<?php
function theme_cart_review_table($show_subtotal = TRUE) {
  $items = uc_cart_get_contents();
  $subtotal = 0;
 
  $output = '<table class="cart-review"><thead>'
           .'<tr class="first last odd"><td class="first odd image">'. t('Image')
           .'</td><td class="even odd qty">'. t('Qty')
           .'</td><td class="even products">'. t('Products')
           .'</td><td class="last odd price">'. t('Price')
           .'</td></tr></thead><tbody>';
 
  $row = 1;
  for ($i = 0; $i < count($items); $i++) {
    $item = $items[$i];
    $rows = array();
    foreach ($item->options as $option) {
      // $rows[] = $option['attribute'] .': '. $option['name'];
      $rows[] = t('@attribute: @option', array('@attribute' => $option['attribute'], '@option' => $option['name']));
    }
    $desc = check_plain($item->title) . theme('item_list', $rows, NULL, 'ul', array('class' => 'product-options'));
 
    $total = ($item->qty) ? $item->qty * $item->price : $item->price;
    $subtotal += $total;
    $imagepath = $item->image['filepath'];
    $imagetitle = $item->image['title'];
    $imagealt = $item->image['alt'];
    $qty = ($item->qty) ? $item->qty : '';
    $tr_class = ($i % 2 == 0) ? 'even' : 'odd';
    if ($show_subtotal && $i == count($items)) {
      $tr_class .= ' last';
    }
 
    $output .= '<tr class="'. $tr_class .'"><td class="image">'.theme('imagecache', 'cart', $imagepath, $imagealt, $imagetitle)
    		  .'</td><td class="qty">'
             . t('!qtyx', array('!qty' => $qty)) .'</td><td class="products">'
             . $desc .'</td><td class="price">'. uc_currency_format($total)
              .'</td></tr>';
  }
  if ($show_subtotal) {
    $tr_class = ($tr_class == 'even') ? 'odd' : 'even';
    $output .= '<tr class="'. $tr_class .' last"><td class="subtotal" '
              .'colspan="4"><span id="subtotal-title">'. t('Subtotal:')
              .'</span> '. uc_currency_format($subtotal) .'</td></tr>';
  }
  $output .= '</tbody></table>';
 
  return $output;
}
?>
0
0
aboros képe

fent idézett sminkfüggvénnyel meg tudtam csinálni, hogy a cart/checkout oldalon megjelnjenek szépen a termékek képei, viszont a cart/checkout/review oldalra ez már nem hatott, ott megint ezekkel a 'pane' -ekkel szórakozik és a termékeim már csak egy html táblázatként vannak jelen a kapcsolódó sminkfunkcióban ami ez:

/**
 * Theme the checkout review order page.
 *
 * @param $help
 *   A string containing the review order page help message.
 * @param $panes
 *   An associative array for each checkout pane that has information to add to
 *   the review page.  The key is the pane's title and the value is either the
 *   data returned for that pane or an array of returned data.
 * @param $form
 *   The HTML version of the form that by default includes the 'Back' and
 *   'Submit order' buttons at the bottom of the review page.
 * @return
 *   A string of HTML for the page contents.
 * @ingroup themeable
 */
function framework_uc_cart_checkout_review($help, $panes, $form) {
	#drupal_set_message('aboros');
  drupal_add_css(drupal_get_path('module', 'uc_cart') .'/uc_cart.css');
 
  $output = '<div>'. check_markup(variable_get('uc_checkout_review_instructions',  uc_get_message('review_instructions')), variable_get('uc_checkout_review_instructions_format', 3), FALSE)
           .'</div><table class="order-review-table">';
	$pane_n = 0;
  foreach ($panes as $title => $data) {
    $output .= '<tr class="pane-title-row"><td colspan="2">'. $title
              .'</td></tr>';
    if (is_array($data)) {
    	$row_n = 0;
      foreach ($data as $row) {
 
        if (is_array($row)) {
        	$class = 'class="pane-'.$pane_n.' row-'.$row_n;
          if (isset($row['border'])) {
            $class .= ' row-border-'. $row['border'] .'"';
          }
          else {
            $class .= '"';
          }
          $output .= '<tr valign="top"'. $class .'><td class="title-col" '
                    .'nowrap>'. $row['title'] .':</td><td class="data-col">'
                   . $row['data'] .'</td></tr>';
        	$row_n++;
        }
        else {
          $output .= '<tr valign="top"><td colspan="2">'. $row .'</td></tr>';
        }
      }
    }
    else {
      $output .= '<tr valign="top"><td colspan="2">'. $data .'</td></tr>';
    }
    $pane_n++;
  }
 
  $output .= '<tr class="review-button-row"><td colspan="2">'. $form
            .'</td></tr></table>';
 
  return $output;
}

na ebben már nincsenek $item -ek, csak $pane -ek vannak és azokban data, de a termékeket tartalmazó pane -ben már renderelt html táblázat van és az istennek nem bírok rájönni, hogy hogyan kerül az oda. :(

0
0

-
clear: both;

sgabe képe

Van egy uc_cart_checkout_pane.inc fájl is a cart modulban, ennek rögtön az első uc_checkout_pane_cart(); függvénye kell neked. A 'review' esetén az $items változóban ugyanúgy ott a kép, ahogy az előbbiekben írtam.

<?php
/**
 * Display the cart contents for review during checkout.
 */
function uc_checkout_pane_cart($op) {
  switch ($op) {
    case 'view':
      $contents['cart_review_table'] = array(
        '#value' => theme('cart_review_table'),
        '#weight' => variable_get('uc_pane_cart_field_cart_weight', 2),
      );
      return array('contents' => $contents, 'next-button' => FALSE);
 
    case 'review':
      $items = uc_cart_get_contents();
      $output = '<table>';
      foreach ($items as $item) {
        $rows = array();
        foreach ($item->options as $option) {
          $rows[] = t('@attribute: @option', array('@attribute' => $option['attribute'], '@option' => $option['name']));
        }
        // kep utvonala, cime es alt szovege
        $imagepath = $item->image['filepath'];
    	$imagetitle = $item->image['title'];
    	$imagealt = $item->image['alt'];
        $desc = check_plain($item->title) . theme('item_list', $rows, NULL, 'ul', array('class' => 'product-options'));
        // kep elhelyezese egy uj oszlopban
        $output .= '<tr valign="top"><td>'.theme('imagecache', 'cart', $imagepath, $imagealt, $imagetitle).'</td><td>'. $item->qty .'x</td><td width="100%">'. $desc
                  .'</td><td nowrap="nowrap">'. uc_currency_format($item->price * $item->qty) .'</td></tr>';
      }
      $output .= '</table>';
      $review[] = $output;
      return $review;
  }
}?>
0
0
aboros képe

szuper, köszi! először arra gondoltam megkérdezem, hogy a fenébe derítetted ezt ki, tán soronként elolvastad az .incet? aztán megnéztem, és rögtön tényleg az elején ott van, hogy

/**
* Display the cart contents for review during checkout.
*/

olvashatnék, ha már van szemem. nagyon kösz!

sajnos ez nem egy sminkfüggvény, úgyhogy magába a modulba tudom csak befolyásolni a működést. az utókor számára leírom, így oldottam meg az egész feladatot:

  • a cart/checkout oldalnak van egy sminkfüggvénye, abba be lehet tenni könnyedén a képet így:
    template.php
    /* fizetes oldal sminkelese, hogy megjelenjenek a kepek */
     
    function framework_cart_review_table($show_subtotal = TRUE) {
    	#drupal_set_message('aboros');
      $items = uc_cart_get_contents();
      $subtotal = 0;
     
      $output = '<table class="cart-review"><thead>'
               .'<tr class="first last odd"><td class="first odd qty">'. t('Qty')
               .'</td><td class="even products">'. t('Products')
               .'</td><td class="last odd price">'. t('Price')
               .'</td></tr></thead><tbody>';
     
      $row = 1;
      for ($i = 0; $i < count($items); $i++) {
        $item = $items[$i];
        $rows = array();
        foreach ($item->options as $option) {
          // $rows[] = $option['attribute'] .': '. $option['name'];
          $rows[] = t('@attribute: @option', array('@attribute' => $option['attribute'], '@option' => $option['name']));
        }
        /* begin: aboros display field_image_cache first item */
        $node = node_load($item->nid);
        $img = theme('imagecache', 'product_list', $node->field_image_cache[0]['filepath']);
        /* end: aboros ! note: $img is inserted in the next line!
        $desc = check_plain($item->title) . '<br />' . $img . theme('item_list', $rows, NULL, 'ul', array('class' => 'product-options'));
     
        $total = ($item->qty) ? $item->qty * $item->price : $item->price;
        $subtotal += $total;
        $qty = ($item->qty) ? $item->qty : '';
        $tr_class = ($i % 2 == 0) ? 'even' : 'odd';
        if ($show_subtotal && $i == count($items)) {
          $tr_class .= ' last';
        }
     
        $output .= '<tr class="'. $tr_class .'"><td class="qty">'
                 . t('!qtyx', array('!qty' => $qty)) .'</td><td class="products">'
                 . $desc .'</td><td class="price">'. uc_currency_format($total)
                  .'</td></tr>';
      }
      if ($show_subtotal) {
        $tr_class = ($tr_class == 'even') ? 'odd' : 'even';
        $output .= '<tr class="'. $tr_class .' last"><td class="subtotal" '
                  .'colspan="4"><span id="subtotal-title">'. t('Subtotal:')
                  .'</span> '. uc_currency_format($subtotal) .'</td></tr>';
      }
      $output .= '</tbody></table>';
     
      return $output;
    }
  • ha arra is szükségünk van, hogy a cart/checkout/review oldalon is megjelenjenek a megvásárlásra kiválasztott termékek képei, akkor azt már sajnos csak az uc_cart modul hekkelésével érhetjük el (thx: sgabe), így:
    uc_cart_checkout_pane.inc fileban szereplő azonos nevű eljárást cseréljük erre:
    function uc_checkout_pane_cart($op) {
      switch ($op) {
        case 'view':
          $contents['cart_review_table'] = array(
            '#value' => theme('cart_review_table'),
            '#weight' => variable_get('uc_pane_cart_field_cart_weight', 2),
          );
          return array('contents' => $contents, 'next-button' => FALSE);
     
        case 'review':
          $items = uc_cart_get_contents();
          $output = '<table>';
          foreach ($items as $item) {
            $rows = array();
            foreach ($item->options as $option) {
              $rows[] = t('@attribute: @option', array('@attribute' => $option['attribute'], '@option' => $option['name']));
            }
            /* begin: aboros insert field_image_cache image dirthack */
            $node = node_load($item->nid);
            $img = theme('imagecache', 'product_list', $node->field_image_cache[0]['filepath']);
            /* end: aboros ! note: $img added next line! */
            $desc = check_plain($item->title) . '<br />' . $img . theme('item_list', $rows, NULL, 'ul', array('class' => 'product-options'));
            $output .= '<tr valign="top"><td>'. $item->qty .'x</td><td width="100%">'. $desc
                      .'</td><td nowrap="nowrap">'. uc_currency_format($item->price * $item->qty) .'</td></tr>';
          }
          $output .= '</table>';
          $review[] = $output;
          return $review;
      }
    }

nagyon kösz a segítséget mindenkinek!

0
0

-
clear: both;

sgabe képe

csak azt nem értem miért node loaddal csinálod, amikor az $item tömbben benne van a termék képe is?

0
0
aboros képe

én kiírtam az $item -et print_r -el és abban nem láttam a képet..
megnézem mégegyszer, de ha ott van, akkor tényleg olvasnom kéne inkább gyakorolni. :)

0
0

-
clear: both;

sgabe képe

én tettem bele, mindenesetre egyszerűbb és jobb megoldás is szerintem mint node_loadolni mindig :)

0
0
aboros képe

most nézem, hogy a leírt megoldás első kódrésze is el van törve középen, nincs meg az egész.. :) kemény hét volt na. :)

0
0

-
clear: both;