Как проверить количество запасов на узле 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 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;
}
Надеюсь, это поможет...:)