function _uc_field_attribute_nodeapi in Ubercart Field attributes 7
@file uc_field_attribute.inc Node functions for uc_field_attribute
(C)2011 Michael Moritz miiimooo/at/drupal.org http://drupal.org/user/62954
2 calls to _uc_field_attribute_nodeapi()
File
- ./
uc_field_attribute.inc, line 9 - uc_field_attribute.inc Node functions for uc_field_attribute
Code
function _uc_field_attribute_nodeapi($node, $mode = NULL) {
if (!array_key_exists($node->type, uc_product_class_load())) {
return;
}
$attribute_settings = uc_field_attribute_load_settings($node->type);
foreach ($attribute_settings->fields as $fiid => $enabled) {
if (!$enabled) {
continue;
}
$bundle = field_extract_bundle('node', $node);
$instances = field_info_instances('node', $bundle);
$found = false;
foreach ($instances as $field_name => $instance) {
if ($instance['id'] == $fiid) {
$found = true;
break;
}
}
if (!$found) {
continue;
//TODO warning?
}
$instance = (object) $instance;
$attribute = uc_field_attribute_load($node->nid, $instance->id);
if (!$attribute) {
// dsm($instance);
$attribute = $instance;
$attribute->display = 1;
$attribute->name = $instance->field_name;
$attribute->options = array();
uc_attribute_save($attribute);
$attribute = (object) $attribute;
$field_attribute = array(
"aid" => $attribute->aid,
"nid" => $node->nid,
"field_instance_id" => $instance->id,
);
drupal_write_record('uc_field_attribute_node', $field_attribute);
// $attribute = (object) $field_attribute;
}
$product_attribute = (object) $attribute;
// dsm($product_attribute);
$attributes = uc_product_get_attributes($node->nid);
// UPDATE or INSERT
$exists = isset($attributes[$product_attribute->aid]);
// $primary_keys = ($is_new ? NULL : array('aid', 'nid'));
$product_attribute->nid = $node->nid;
/// NOTE no API for this?
if (!$exists) {
drupal_write_record('uc_product_attributes', $product_attribute);
$product_attribute = (object) $product_attribute;
}
$product_options = uc_field_attribute_options_load($product_attribute->aid);
$items = field_get_items('node', $node, $field_name);
foreach ($items as $index => $item) {
// this returns markup in an array
// could probably make the $display configurable
$value = field_view_value('node', $node, $field_name, $item);
$value = strip_tags($value['#markup']);
$product_attribute_oid = 0;
foreach ($product_attribute->options as $oid => $option) {
if ($option->name == $value) {
$product_attribute_oid = $oid;
unset($product_attribute->options[$oid]);
break;
}
}
if (!$product_attribute_oid) {
///TODO could this already exist - should probably check through the table first
$option = array(
"aid" => $product_attribute->aid,
'name' => $value,
'ordering' => $index,
);
$option = (object) $option;
uc_attribute_option_save($option);
$option = (object) $option;
$option->nid = $node->nid;
drupal_write_record('uc_product_options', $option);
drupal_write_record('uc_field_attribute_options', $option);
}
}
//at this point $product_attribute->options holds all options that have "disappeared"
//from the Field API field
foreach ($product_attribute->options as $oid => $option) {
db_delete('uc_product_options')
->condition('oid', $oid)
->condition('nid', $node->nid)
->execute();
db_delete('uc_attribute_options')
->condition('oid', $oid)
->execute();
db_delete('uc_field_attribute_options')
->condition('aid', $product_attribute->aid)
->condition('oid', $oid)
->execute();
}
}
}