/** this takes the parsed array originally returned from parse_field_mask($display_mask) and expands it with the specific $item_instance_r information. */ function _expand_title_mask($item_instance_r, $mask, &$mask_element_rs, $config_var_rs = NULL) { // if no parsed mask elements, then return $mask. if (is_empty_or_not_array($mask_element_rs)) { // only return mask if there is something to return. if (strlen($mask) > 0) { return $mask; } else { return $item_instance_r['title']; } } for ($i = 0; $i < count($mask_element_rs); $i++) { // no array set, or simple attribute variable 's_attribute_type.option' not set. if (is_not_empty_array($mask_element_rs[$i]) && !isset($mask_element_rs[$i]['s_attribute_type']) && !isset($mask_element_rs[$i]['option'])) { // replace the array index. switch ($mask_element_rs[$i]['type']) { case 'ifdef': // ifdef(s_attribute_type, "if_mask"[, "else_mask"]) if (is_item_attribute_set($item_instance_r['item_id'], $item_instance_r['instance_no'], strtoupper($mask_element_rs[$i]['varname']))) { $value = $this->_expand_title_mask($item_instance_r, $mask_element_rs[$i]['if_mask'], $mask_element_rs[$i]['if_mask_elements']); } else { if (strlen($mask_element_rs[$i]['else_mask']) > 0) { $value = $this->_expand_title_mask($item_instance_r, $mask_element_rs[$i]['else_mask'], $mask_element_rs[$i]['else_mask_elements']); } else { $value = NULL; } } break; case 'if': // if(varname[<|<=|>=|>|==|!=]value, "if_mask"[, "else_mask"]) if ($mask_element_rs[$i]['varname'] == 'instance_no') { $value = $item_instance_r['instance_no']; } else { if ($mask_element_rs[$i]['varname'] == 's_status_type') { $value = $item_instance_r['s_status_type']; } else { if ($mask_element_rs[$i]['varname'] == 's_item_type') { $value = $item_instance_r['s_item_type']; } else { $value = fetch_attribute_val($item_instance_r['item_id'], $item_instance_r['instance_no'], strtoupper($mask_element_rs[$i]['varname'])); } } } // the attribute is defined, so now lets do the comparison. if ($value !== false) { if ($this->_test_if_condition($value, $mask_element_rs[$i]['op'], $mask_element_rs[$i]['value'])) { $value = $this->_expand_title_mask($item_instance_r, $mask_element_rs[$i]['if_mask'], $mask_element_rs[$i]['if_mask_elements']); } else { if (strlen($mask_element_rs[$i]['else_mask']) > 0) { $value = $this->_expand_title_mask($item_instance_r, $mask_element_rs[$i]['else_mask'], $mask_element_rs[$i]['else_mask_elements']); } else { $value = NULL; } } } else { $value = NULL; } break; case 'switch': if ($mask_element_rs[$i]['varname'] == 'instance_no') { $value = $item_instance_r['instance_no']; } else { if ($mask_element_rs[$i]['varname'] == 's_status_type') { $value = $item_instance_r['s_status_type']; } else { if ($mask_element_rs[$i]['varname'] == 's_item_type') { $value = $item_instance_r['s_item_type']; } else { $value = fetch_attribute_val($item_instance_r['item_id'], $item_instance_r['instance_no'], strtoupper($mask_element_rs[$i]['varname'])); } } } // the attribute is defined, so now lets do the comparison. if (!empty($value)) { if (is_not_empty_array($mask_element_rs[$i]['cases'])) { for ($j = 0; $j < count($mask_element_rs[$i]['cases']); $j++) { // if a match. if (strcmp($value, $mask_element_rs[$i]['cases'][$j]['case']) === 0) { $value = $this->_expand_title_mask($item_instance_r, $mask_element_rs[$i]['cases'][$j]['result']['mask'], $mask_element_rs[$i]['cases'][$j]['result']['mask_elements']); break 2; // break out of switch } } } if (is_not_empty_array($mask_element_rs[$i]['default_case'])) { $value = $this->_expand_title_mask($item_instance_r, $mask_element_rs[$i]['default_case']['mask'], $mask_element_rs[$i]['cases']['default_case']['mask_elements']); } } else { $value = NULL; } break; case 'theme_img': if (strlen($mask_element_rs[$i]['value']) > 0) { $value = $mask_element_rs[$i]['value']; } else { if ($mask_element_rs[$i]['value'] === NULL && strlen($vtitle = $this->_expand_title_mask(array('s_item_type' => $item_instance_r['s_item_type']), $mask_element_rs[$i]['title_mask'], $mask_element_rs[$i]['title_mask_elements'])) > 0) { if (!is_array($this->_opendb_title_mask_macro_rs['theme_img'])) { $this->_opendb_title_mask_macro_rs = array_merge($this->_opendb_title_mask_macro_rs, array('theme_img' => array())); } // this variable will be an array of all theme_img elements encountered if (strlen($this->_opendb_title_mask_macro_rs['theme_img'][$mask_element_rs[$i]['img']]) == 0) { $this->_opendb_title_mask_macro_rs['theme_img'] = array_merge($this->_opendb_title_mask_macro_rs['theme_img'], array($mask_element_rs[$i]['img'] => $vtitle)); } $mask_element_rs[$i]['value'] = theme_image($mask_element_rs[$i]['img'], $vtitle); $value = $mask_element_rs[$i]['value']; } else { // an indicator to not try generic expand_title_mask for $s_item_type, because it does not work. $mask_element_rs[$i]['value'] = ''; $vtitle = $this->_expand_title_mask($item_instance_r, $mask_element_rs[$i]['title_mask'], $mask_element_rs[$i]['title_mask_elements']); $value = theme_image($mask_element_rs[$i]['img'], $vtitle); } } break; case 'config_var_key': // config_var_key(name, value) if (is_not_empty_array($config_var_rs) && is_array($config_var_rs[$mask_element_rs[$i]['name']])) { if (is_array($mask_element_rs[$i]['value'])) { $srchvalue = $this->_expand_title_mask($item_instance_r, $mask_element_rs[$i]['value']['mask'], $mask_element_rs[$i]['value']['elements'], $config_var_rs); } else { $srchvalue = $mask_element_rs[$i]['value']; } $tmpvalue = array_search2($srchvalue, $config_var_rs[$mask_element_rs[$i]['name']]); if ($tmpvalue !== false) { $value = $tmpvalue; } else { $value = ''; } } else { $value = ''; } break; case 'config_var_value': // config_var_value(name, keyid) if (is_not_empty_array($config_var_rs) && is_array($config_var_rs[$mask_element_rs[$i]['name']])) { if (is_array($mask_element_rs[$i]['key'])) { $srchkey = $this->_expand_title_mask($item_instance_r, $mask_element_rs[$i]['key']['mask'], $mask_element_rs[$i]['key']['elements'], $config_var_rs); } else { $srchkey = $mask_element_rs[$i]['key']; } if (isset($config_var_rs[$mask_element_rs[$i]['name']][$srchkey])) { $value = $config_var_rs[$mask_element_rs[$i]['name']][$srchkey]; } else { $value = ''; } } else { $value = ''; } break; default: // no valid function specified, so set to empty. $value = ''; } } else { $value = $this->_get_mask_variable_value($mask_element_rs[$i], $item_instance_r); } // now do the replacement. $mask = str_replace('{' . $i . '}', $value, $mask); } //for($i=0; $i<count($mask_element_rs); $i++) // now return expanded subject. return $mask; }
function handle_item_attributes($op, $item_r, $HTTP_VARS, &$errors) { // for these operations, no instance_no context is possible // item instance attributes will be handled in a separate call to this function, as a updateinstance op if ($op == 'insert' || $op == 'update') { $item_r['instance_no'] = NULL; } $attr_results = fetch_item_attribute_type_rs($item_r['s_item_type'], is_numeric($item_r['instance_no']) ? 'instance_attribute_ind' : 'item_attribute_ind', FALSE); if ($attr_results) { $attributes_updated = 0; while ($item_attribute_type_r = db_fetch_assoc($attr_results)) { // For all operations the {DURATION,TITLE,STATUSTYPE,STATUSCMNT,ITEM_ID} cannot be // updated because they exist at item/item_instance level. if ($item_attribute_type_r['s_field_type'] != 'DURATION' && $item_attribute_type_r['s_field_type'] != 'TITLE' && $item_attribute_type_r['s_field_type'] != 'STATUSTYPE' && $item_attribute_type_r['s_field_type'] != 'STATUSCMNT' && $item_attribute_type_r['s_field_type'] != 'ITEM_ID') { $fieldname = get_field_name($item_attribute_type_r['s_attribute_type'], $item_attribute_type_r['order_no']); // save it in case we are in refresh mode. $orig_fieldname = $fieldname; if (!is_array($HTTP_VARS[$fieldname])) { if (preg_match("/new([0-9]+)/", $HTTP_VARS[$fieldname], $matches) && isset($HTTP_VARS[$fieldname . '_' . $matches[0]])) { $fieldname = $fieldname . '_' . $matches[0]; } else { if ($HTTP_VARS[$fieldname] == 'old') { // make sure this is a refresh value and not just a field with the value 'old' if (isset($HTTP_VARS[$fieldname . '_new0'])) { $fieldname = $fieldname . '_old'; } } } } if (is_multivalue_attribute_type($item_attribute_type_r['s_attribute_type'])) { $value_r = NULL; if (is_array($HTTP_VARS[$fieldname])) { $value_r = $HTTP_VARS[$fieldname]; } else { if (isset($HTTP_VARS[$fieldname])) { $value_r[] = $HTTP_VARS[$fieldname]; } } if (is_item_attribute_set($item_r['item_id'], $item_r['instance_no'], $item_attribute_type_r['s_attribute_type'], $item_attribute_type_r['order_no'])) { if (update_item_attributes($item_r['item_id'], $item_r['instance_no'], $item_r['s_item_type'], $item_attribute_type_r['s_attribute_type'], $item_attribute_type_r['order_no'], $value_r)) { $attributes_updated++; } } else { if (is_not_empty_array($value_r)) { if (insert_item_attributes($item_r['item_id'], $item_r['instance_no'], $item_r['s_item_type'], $item_attribute_type_r['s_attribute_type'], $item_attribute_type_r['order_no'], $value_r)) { $attributes_updated++; } } } } else { $file_r = NULL; if (is_array($_FILES) && is_array($_FILES[$fieldname . '_upload']) && is_uploaded_file($_FILES[$fieldname . '_upload']['tmp_name'])) { $value = basename($_FILES[$fieldname . '_upload']['name']); $file_r = $_FILES[$fieldname . '_upload']; } else { // normal field $value = $HTTP_VARS[$fieldname]; } // If attribute value found - an existing attribute, so do an update. if (is_item_attribute_set($item_r['item_id'], $item_r['instance_no'], $item_attribute_type_r['s_attribute_type'], $item_attribute_type_r['order_no'])) { if (update_item_attributes($item_r['item_id'], $item_r['instance_no'], $item_r['s_item_type'], $item_attribute_type_r['s_attribute_type'], $item_attribute_type_r['order_no'], $value, $file_r)) { $attributes_updated++; } } else { if (strlen($value) > 0) { if (insert_item_attributes($item_r['item_id'], $item_r['instance_no'], $item_r['s_item_type'], $item_attribute_type_r['s_attribute_type'], $item_attribute_type_r['order_no'], $value, $file_r)) { $attributes_updated++; } } } } } } //while db_free_result($attr_results); // Indicate how many attributes updated. return $attributes_updated; } else { return FALSE; } }