Как проверить количество запасов на узле ubercart


Я использую пользовательскую функцию для отображения дочерних узлов термина таксономии при отображении страницы термина. Вот функция

function theme_name_child_terms($vid = 1) {
  if(arg(0) == 'taxonomy' && arg(1) == 'term') {   
    $children = taxonomy_get_children(arg(2), $vid);
      if(!$children) {
        $custom_parent = taxonomy_get_parents(arg(2));
          $parent_tree = array();
          foreach ($custom_parent as $custom_child => $key) {
            $parent_tree = taxonomy_get_tree($vid, $key->tid);
          }
          $children = $parent_tree;
      }

    $output = '<ul>';
    // Avoid unnecessary "Invalid foreach" errors showing up in the log:
    if (!empty($children)) {
        // If not empty, run the foreach loop:
        foreach ($children as $term) {
            // Then check to see if any nodes exist for that term id:
            $number_of_nodes = taxonomy_term_count_nodes($term->tid);
            // If there ARE nodes...
            if ($number_of_nodes > 0) {
              // ... then add them to the output:
              $output .= '<li>';
              $output .= l($term->name . ' (' . $number_of_nodes . ')', 'taxonomy/term/' . $term->tid);
              $output .= '</li>';
              }
        }
    }
    $output .= '</ul>';

    return $output;
  }
}

Это вывод: снимок экрана . Вы можете видеть, что в скобках указаны термины и количество узлов для товаров, которых больше нет в каталоге "ювелирные изделия", по мере их продажи.

Проблема, с которой я сталкиваюсь, заключается в том, что узлы, с которыми я имею дело, являются продуктами в каталоге ubercart - все товары уникальны так как это антикварная торговая площадка. Описанная выше функция по-прежнему учитывает "проданные" товары как узлы, связанные с термином - проданный товар, конечно, по-прежнему помечен термином таксономии. - итак, некоторые термины приводят к пустым страницам, потому что я отфильтровываю проданные узлы с точки зрения таксономии.

Можно ли добавить еще один шаг к функции, которая проверяет каждый узел, связанный с термином, если он имеет уровень запасов 1 или выше?

Я нашел следующую функцию в uc_stock.модуль:

/**
 * Get the stock level of a particular product SKU.
 *
 * @param $sku
 *   The Ubercart product SKU of the stock level to return.
 * @return:
 *   The SKU's stock level, or FALSE if not active.
 */
function uc_stock_level($sku) {
  $stock = db_fetch_object(db_query("SELECT active, stock FROM {uc_product_stock} WHERE sku = '%s'", $sku));

  if ($stock && $stock->active) {
    return $stock->stock;
  }

  return FALSE;
}

Я просто не могу понять, где и как вызвать эту функцию в исходной функции. Ему нужно передать "артикул" продукта, но я не уверен, как задать ему этот параметр. Я думаю, это должно быть что-то вроде:

$stock = uc_stock_level($sku);
  if ($stock > 0) {
    ...
  }

Любая помощь будет очень признательна.

 1
Author: NickTr, 2013-06-03

1 answers

Примечание: вот хорошая страница для закладки при использовании Ubercart с D6: http://www.ubercart.org/docs/api (в отличие от http://api.ubercart.me для случаев, когда вы используете D7).

Также обратите внимание: это оказалось намного более глубоким, чем я ожидал, но я уже был по колено в этом, поэтому решил, что закончу.;) Это сказало...


Вы определенно на правильном пути... Как вы сказали, вы могли бы просто предоставить функции uc_stock_level($sku) значение $sku, но это может быть большим количеством артикулов и, следовательно, довольно ресурсоемким.

Другая альтернатива, которая должна сработать, была бы примерно такой:

Измените эту часть вашего кода:

$output = '<ul>';
// Avoid unnecessary "Invalid foreach" errors showing up in the log:
if (!empty($children)) {
    // If not empty, run the foreach loop:
    foreach ($children as $term) {
        // Then check to see if any nodes exist for that term id:
        $number_of_nodes = taxonomy_term_count_nodes($term->tid);
        // If there ARE nodes...
        if ($number_of_nodes > 0) {
          // ... then add them to the output:
          $output .= '<li>';
          $output .= l($term->name . ' (' . $number_of_nodes . ')', 'taxonomy/term/' . $term->tid);
          $output .= '</li>';
          }
    }
}
$output .= '</ul>';

К чему-то вроде этого:

$output = '<ul>';
// Avoid unnecessary "Invalid foreach" errors showing up in the log:
if (!empty($children)) {
  // If not empty, run the foreach loop:
  foreach ($children as $term) {
    // Then check to see if any nodes exist for that term id:
    $number_of_nodes = taxonomy_term_count_nodes($term->tid);
    // And then check to see what the current stock level is:
    $stock_level = fetch_stock_level_from_termid($term->tid);
    // If there ARE nodes...
    if ($number_of_nodes > 0) {
      // And if the product is in stock...
      if ($stock_level > 0) {
        // ... then add them to the output:
        $output .= '<li>';
        $output .= l($term->name . ' (' . $number_of_nodes . ')', 'taxonomy/term/' . $term->tid);
        $output .= '</li>';
      }
    }
  }
}
$output .= '</ul>';

Затем вам также потребуется добавить функцию fetch_stock_level_from_termid() в свой код:

function fetch_stock_level_from_termid($term_id) {
  $sql = "SELECT SUM( {uc_product_stock}.stock ) AS stock
          FROM {uc_product_stock}
          INNER JOIN {node} ON {uc_product_stock}.nid = {node}.nid
          INNER JOIN {term_node} ON {node}.vid = {term_node}.vid
          WHERE {term_node}.tid = %d
          AND {node}.status = 1";
  $stock_available = db_result(db_query($sql, $term_id));
  return $stock_available;
}

Надеюсь, это поможет...:)

 1
Author: jerdiggity, 2013-06-04 04:10:50