uc_views_attribute_handler_field_combination.inc in Ubercart Views 6.3
thank you hanoii for providing this patch
File
uc_views_attribute/views/uc_views_attribute_handler_field_combination.incView source
<?php
/**
* @file
* thank you hanoii for providing this patch
*/
/**
* Field handler to provide a human-readable version of the stored serialized combination of attributes
*/
class uc_views_attribute_handler_field_combination extends views_handler_field {
/**
*
* @param integer $nid
* Node ID
* @return array
* An array where the key is the serialized combination that's not on the
* uc_product_adjustments db and the value is an array of
* attr_name => attr_option according to the combination
*
* @see uc_product_adjustments_form()
*/
function _uc_stock_extra_combinations($nid) {
$combinations = array();
$query_select = "SELECT DISTINCT";
$query_from = " FROM";
$query_where = " WHERE";
$query_order = " ORDER BY";
$result = db_query("SELECT pa.nid, pa.aid, pa.ordering, a.name, a.ordering, ao.aid, COUNT(po.oid) FROM {uc_product_attributes} AS pa LEFT JOIN {uc_attributes} AS a ON pa.aid = a.aid LEFT JOIN {uc_attribute_options} AS ao ON a.aid = ao.aid LEFT JOIN {uc_product_options} AS po ON ao.oid = po.oid AND po.nid = %d WHERE pa.nid = %d GROUP BY ao.aid, pa.aid, a.name, pa.ordering, a.ordering, pa.nid HAVING count(po.oid) > 0 ORDER BY pa.ordering, a.ordering", $nid, $nid);
$i = 1;
$values = array();
while ($prod_attr = db_fetch_object($result)) {
$query_select .= " ao{$i}.aid AS aid{$i}, ao{$i}.name AS name{$i}, ao{$i}.oid AS oid{$i}, po{$i}.ordering,";
$query_from .= " ({uc_product_options} AS po{$i} LEFT JOIN {uc_attribute_options} AS ao{$i} ON po{$i}.oid = ao{$i}.oid AND po{$i}.nid = %d),";
$values[] = $nid;
$query_where .= " ao{$i}.aid = " . $prod_attr->aid . " AND";
$query_order .= " po{$i}.ordering, ao{$i}.name,";
++$i;
$attribute_ids[] = $prod_attr->aid;
}
$num_prod_attr = count($attribute_ids);
// Remove last connecting parts (commas, "AND")
$query_select = rtrim($query_select, ',');
$query_from = rtrim($query_from, ',');
$query_where = substr($query_where, 0, strlen($query_where) - 4);
$query_order = rtrim($query_order, ',');
if ($num_prod_attr) {
$result = db_query($query_select . $query_from . $query_where . $query_order, $values);
while ($row = db_fetch_object($result)) {
$attrs_info = array();
$attrs = array();
for ($i = 1; $i <= $num_prod_attr; $i++) {
$aid_key = "aid{$i}";
$oid_key = "oid{$i}";
$name_key = "name{$i}";
$aid = $row->{$aid_key};
$attr = db_result(db_query("SELECT name FROM {uc_attributes} WHERE aid = %d", $aid));
$attrs_info[$attr] = $row->{$name_key};
$attrs[$aid] = $row->{$oid_key};
}
asort($attrs);
$combinations[serialize($attrs)] = $attrs_info;
}
}
// Exclude configured combinations
$result = db_query("SELECT * FROM {uc_product_adjustments} WHERE nid = %d", $nid);
while ($row = db_fetch_object($result)) {
// TODO: Remove unserialize/asort/serialize because rc6+ already sorts it
$c = unserialize($row->combination);
asort($c);
$c = serialize($c);
unset($combinations[$c]);
}
return $combinations;
}
/**
* Defines a few default options for the combination field
*/
function option_definition() {
$options = parent::option_definition();
$options['fetch_if_null'] = array(
'default' => FALSE,
);
return $options;
}
/**
* Adds form elements for a few options
*/
function options_form(&$form, &$form_state) {
// TODO: Add an option for grouping fields
parent::options_form($form, $form_state);
$form['fetch_if_null'] = array(
'#type' => 'checkbox',
'#title' => t('Fetch attributes if there is no combination'),
'#description' => t('If checked, and if the combination is not found for a specific SKU/model, get the attributes and options from other tables.'),
'#default_value' => $this->options['fetch_if_null'],
);
}
function query() {
// TODO: Don't add field to the query if we want to group them
return parent::query();
}
function pre_render($values) {
// TODO: Get the grouped values (by nid or by stock depending if used as a relationship or not)
// If there are no values to render (displaying a summary, or query returned no results),
// or if this is not a grouped field, do nothing specific.
if (isset($this->view->build_info['summary']) || empty($values) || !$this->options['group']) {
return parent::pre_render($values);
}
}
function render($values) {
$items = array();
$combination = $values->{$this->field_alias};
if (is_string($combination)) {
$combination = unserialize($combination);
$attributes = array();
foreach ($combination as $aid => $oid) {
$attribute = uc_attribute_load($aid);
$option = uc_attribute_option_load($oid);
$attributes[] = "{$attribute->name}: {$option->name}";
}
$items[] = implode($attributes, ', ');
return theme('item_list', $items);
}
else {
if ($this->options['fetch_if_null']) {
$nid = $values->nid;
$combinations = $this
->_uc_stock_extra_combinations($nid);
if (!empty($combinations)) {
foreach ($combinations as $combination => $attr_info) {
$attributes = array();
foreach ($attr_info as $attr => $option) {
$attributes[] = "{$attr}: {$option}";
}
$items[] = implode($attributes, ', ');
}
return theme('item_list', $items);
}
}
}
return parent::render($values);
}
}
Classes
Name | Description |
---|---|
uc_views_attribute_handler_field_combination | Field handler to provide a human-readable version of the stored serialized combination of attributes |