mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-12-26 16:48:49 +01:00
Add accessory_of field to import/export & update import plugin
This commit is contained in:
parent
0791bbb9f1
commit
72b30aaf93
@ -20,7 +20,15 @@ class resources_egw_record implements importexport_iface_egw_record
|
|||||||
{
|
{
|
||||||
private $identifier = '';
|
private $identifier = '';
|
||||||
private $record = array();
|
private $record = array();
|
||||||
|
|
||||||
|
static $types = array(
|
||||||
|
'select-account'=> array('creator', 'modifier'),
|
||||||
|
'date-time' => array('modified', 'created'),
|
||||||
|
'select-cat' => array('cat_id'),
|
||||||
|
'select-bool' => array('bookable'),
|
||||||
|
// Links is field name => app name
|
||||||
|
'links' => array('accessory_of' => 'resources')
|
||||||
|
);
|
||||||
/**
|
/**
|
||||||
* constructor
|
* constructor
|
||||||
* reads record from backend if identifier is given.
|
* reads record from backend if identifier is given.
|
||||||
|
@ -55,7 +55,7 @@ class resources_export_csv implements importexport_iface_export_plugin {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$types = importexport_export_csv::$types;
|
$types = resources_egw_record::$types;
|
||||||
$types['select-bool'] = array('bookable');
|
$types['select-bool'] = array('bookable');
|
||||||
|
|
||||||
foreach ($selection as $record) {
|
foreach ($selection as $record) {
|
||||||
|
@ -15,36 +15,8 @@
|
|||||||
/**
|
/**
|
||||||
* class to import resources from CSV
|
* class to import resources from CSV
|
||||||
*/
|
*/
|
||||||
class resources_import_csv implements importexport_iface_import_plugin {
|
class resources_import_csv extends importexport_basic_import_csv {
|
||||||
|
|
||||||
private static $plugin_options = array(
|
|
||||||
'fieldsep', // char
|
|
||||||
'charset', // string
|
|
||||||
'contact_owner', // int
|
|
||||||
'update_cats', // string {override|add} overides record
|
|
||||||
// with cat(s) from csv OR add the cat from
|
|
||||||
// csv file to exeisting cat(s) of record
|
|
||||||
'num_header_lines', // int number of header lines
|
|
||||||
'field_conversion', // array( $csv_col_num => conversion)
|
|
||||||
'field_mapping', // array( $csv_col_num => adb_filed)
|
|
||||||
'conditions', /* => array containing condition arrays:
|
|
||||||
'type' => exists, // exists
|
|
||||||
'string' => '#kundennummer',
|
|
||||||
'true' => array(
|
|
||||||
'action' => update,
|
|
||||||
'last' => true,
|
|
||||||
),
|
|
||||||
'false' => array(
|
|
||||||
'action' => insert,
|
|
||||||
'last' => true,
|
|
||||||
),*/
|
|
||||||
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* actions wich could be done to data entries
|
|
||||||
*/
|
|
||||||
protected static $actions = array( 'none', 'update', 'insert', 'delete', );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* conditions for actions
|
* conditions for actions
|
||||||
@ -53,66 +25,13 @@ class resources_import_csv implements importexport_iface_import_plugin {
|
|||||||
*/
|
*/
|
||||||
protected static $conditions = array( 'exists' );
|
protected static $conditions = array( 'exists' );
|
||||||
|
|
||||||
/**
|
|
||||||
* @var definition
|
|
||||||
*/
|
|
||||||
private $definition;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var bo
|
|
||||||
*/
|
|
||||||
private $bo;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var bool
|
|
||||||
*/
|
|
||||||
private $dry_run = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var bool is current user admin?
|
|
||||||
*/
|
|
||||||
private $is_admin = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
private $user = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* List of import warnings
|
|
||||||
*/
|
|
||||||
protected $warnings = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* List of import errors
|
|
||||||
*/
|
|
||||||
protected $errors = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* List of actions, and how many times that action was taken
|
|
||||||
*/
|
|
||||||
protected $results = array();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* imports entries according to given definition object.
|
* imports entries according to given definition object.
|
||||||
* @param resource $_stream
|
* @param resource $_stream
|
||||||
* @param string $_charset
|
* @param string $_charset
|
||||||
* @param definition $_definition
|
* @param definition $_definition
|
||||||
*/
|
*/
|
||||||
public function import( $_stream, importexport_definition $_definition ) {
|
public function init(importexport_definition $_definition ) {
|
||||||
$import_csv = new importexport_import_csv( $_stream, array(
|
|
||||||
'fieldsep' => $_definition->plugin_options['fieldsep'],
|
|
||||||
'charset' => $_definition->plugin_options['charset'],
|
|
||||||
));
|
|
||||||
|
|
||||||
$this->definition = $_definition;
|
|
||||||
|
|
||||||
// user, is admin ?
|
|
||||||
$this->is_admin = isset( $GLOBALS['egw_info']['user']['apps']['admin'] ) && $GLOBALS['egw_info']['user']['apps']['admin'];
|
|
||||||
$this->user = $GLOBALS['egw_info']['user']['account_id'];
|
|
||||||
|
|
||||||
// dry run?
|
|
||||||
$this->dry_run = isset( $_definition->plugin_options['dry_run'] ) ? $_definition->plugin_options['dry_run'] : false;
|
|
||||||
|
|
||||||
// fetch the resource bo
|
// fetch the resource bo
|
||||||
$this->bo = new resources_bo();
|
$this->bo = new resources_bo();
|
||||||
@ -120,112 +39,82 @@ class resources_import_csv implements importexport_iface_import_plugin {
|
|||||||
// For adding ACLs
|
// For adding ACLs
|
||||||
$this->acl_bo = CreateObject('resources.bo_acl',True);
|
$this->acl_bo = CreateObject('resources.bo_acl',True);
|
||||||
|
|
||||||
// set FieldMapping.
|
// For checking categories
|
||||||
$import_csv->mapping = $_definition->plugin_options['field_mapping'];
|
$this->start_time = time();
|
||||||
|
}
|
||||||
|
|
||||||
// set FieldConversion
|
/**
|
||||||
$import_csv->conversion = $_definition->plugin_options['field_conversion'];
|
* Import a single record
|
||||||
|
*
|
||||||
|
* You don't need to worry about mappings or translations, they've been done already.
|
||||||
|
* You do need to handle the conditions and the actions taken.
|
||||||
|
*
|
||||||
|
* Updates the count of actions taken
|
||||||
|
*
|
||||||
|
* @return boolean success
|
||||||
|
*/
|
||||||
|
protected function import_record(importexport_iface_egw_record &$record, &$import_csv)
|
||||||
|
{
|
||||||
|
// Check for a new category, it needs permissions set
|
||||||
|
$category = $GLOBALS['egw']->categories->read($record->cat_id);
|
||||||
|
|
||||||
//check if file has a header lines
|
if($category['last_mod'] >= $this->start_time) {
|
||||||
if ( isset( $_definition->plugin_options['num_header_lines'] ) && $_definition->plugin_options['num_header_lines'] > 0) {
|
// New category. Give read & write permissions to the current user's default group
|
||||||
$import_csv->skip_records($_definition->plugin_options['num_header_lines']);
|
$this->acl_bo->set_rights($record['cat_id'],
|
||||||
} elseif(isset($_definition->plugin_options['has_header_line']) && $_definition->plugin_options['has_header_line']) {
|
array($GLOBALS['egw_info']['user']['account_primary_group']),
|
||||||
// First method is preferred
|
array($GLOBALS['egw_info']['user']['account_primary_group']),
|
||||||
$import_csv->skip_records(1);
|
array(),
|
||||||
|
array(),
|
||||||
|
array()
|
||||||
|
);
|
||||||
|
// Refresh ACL
|
||||||
|
//$GLOBALS['egw']->acl->read_repository();
|
||||||
}
|
}
|
||||||
|
//error_log(__METHOD__.__LINE__.array2string($_definition->plugin_options['conditions']));
|
||||||
// Start counting successes
|
if ($this->definition->plugin_options['conditions']) {
|
||||||
$count = 0;
|
|
||||||
$this->results = array();
|
|
||||||
|
|
||||||
// Failures
|
|
||||||
$this->errors = array();
|
|
||||||
|
|
||||||
$types = importexport_export_csv::$types;
|
|
||||||
$types['select-bool'] = array('bookable');
|
|
||||||
$lookups = array();
|
|
||||||
$start_time = time();
|
|
||||||
|
|
||||||
while ( $record = $import_csv->get_record() ) {
|
foreach ( $this->definition->plugin_options['conditions'] as $condition ) {
|
||||||
$success = false;
|
$results = array();
|
||||||
|
switch ( $condition['type'] ) {
|
||||||
|
// exists
|
||||||
|
case 'exists' :
|
||||||
|
if($record->$condition['string']) {
|
||||||
|
$results = $this->bo->so->search(
|
||||||
|
array( $condition['string'] => $record->$condition['string']),
|
||||||
|
False
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// don't import empty records
|
if ( is_array( $results ) && count( array_keys( $results )) >= 1) {
|
||||||
if( count( array_unique( $record ) ) < 2 ) continue;
|
// apply action to all contacts matching this exists condition
|
||||||
|
$action = $condition['true'];
|
||||||
// Automatically handle human friendly values
|
foreach ( (array)$results as $resource ) {
|
||||||
importexport_import_csv::convert($record, $types, 'resources', $lookups,($_definition->plugin_options['convert']?$_definition->plugin_options['convert']:0));
|
$record->res_id = $resource['res_id'];
|
||||||
|
if ( $_definition->plugin_options['update_cats'] == 'add' ) {
|
||||||
// Check for a new category, it needs permissions set
|
if ( !is_array( $resource['cat_id'] ) ) $resource['cat_id'] = explode( ',', $resource['cat_id'] );
|
||||||
$category = $GLOBALS['egw']->categories->read($record['cat_id']);
|
if ( !is_array( $record->cat_id ) ) $record->cat_id = explode( ',', $record->cat_id );
|
||||||
|
$record->cat_id = implode( ',', array_unique( array_merge( $record->cat_id, $resource['cat_id'] ) ) );
|
||||||
if($category['last_mod'] >= $start_time) {
|
|
||||||
// New category. Give read & write permissions to the current user's default group
|
|
||||||
$this->acl_bo->set_rights($record['cat_id'],
|
|
||||||
array($GLOBALS['egw_info']['user']['account_primary_group']),
|
|
||||||
array($GLOBALS['egw_info']['user']['account_primary_group']),
|
|
||||||
array(),
|
|
||||||
array(),
|
|
||||||
array()
|
|
||||||
);
|
|
||||||
// Refresh ACL
|
|
||||||
//$GLOBALS['egw']->acl->read_repository();
|
|
||||||
}
|
|
||||||
//error_log(__METHOD__.__LINE__.array2string($_definition->plugin_options['conditions']));
|
|
||||||
$conditionexist=false;
|
|
||||||
if ( $_definition->plugin_options['conditions'] ) {
|
|
||||||
foreach ( $_definition->plugin_options['conditions'] as $condition ) {
|
|
||||||
switch ( $condition['type'] ) {
|
|
||||||
case 'exists' :
|
|
||||||
if ((isset($condition['true']['action'])&&!empty($condition['true']['action'])) ||
|
|
||||||
(isset($condition['false']['action'])&&!empty($condition['false']['action']))) $conditionexist=true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($conditionexist) {
|
|
||||||
foreach ( $_definition->plugin_options['conditions'] as $condition ) {
|
|
||||||
$results = array();
|
|
||||||
switch ( $condition['type'] ) {
|
|
||||||
// exists
|
|
||||||
case 'exists' :
|
|
||||||
if($record[$condition['string']]) {
|
|
||||||
$results = $this->bo->so->search(
|
|
||||||
array( $condition['string'] => $record[$condition['string']]),
|
|
||||||
False
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( is_array( $results ) && count( array_keys( $results )) >= 1) {
|
|
||||||
// apply action to all contacts matching this exists condition
|
|
||||||
$action = $condition['true'];
|
|
||||||
foreach ( (array)$results as $resource ) {
|
|
||||||
$record['res_id'] = $resource['res_id'];
|
|
||||||
if ( $_definition->plugin_options['update_cats'] == 'add' ) {
|
|
||||||
if ( !is_array( $resource['cat_id'] ) ) $resource['cat_id'] = explode( ',', $resource['cat_id'] );
|
|
||||||
if ( !is_array( $record['cat_id'] ) ) $record['cat_id'] = explode( ',', $record['cat_id'] );
|
|
||||||
$record['cat_id'] = implode( ',', array_unique( array_merge( $record['cat_id'], $resource['cat_id'] ) ) );
|
|
||||||
}
|
|
||||||
$success = $this->action( $action['action'], $record, $import_csv->get_current_position() );
|
|
||||||
}
|
}
|
||||||
} else {
|
$success = $this->action( $action['action'], $record->get_record_array(), $import_csv->get_current_position() );
|
||||||
$action = $condition['false'];
|
|
||||||
$success = ($this->action( $action['action'], $record, $import_csv->get_current_position() ));
|
|
||||||
}
|
}
|
||||||
break;
|
} else {
|
||||||
|
$action = $condition['false'];
|
||||||
|
$success = ($this->action( $action['action'], $record->get_record_array(), $import_csv->get_current_position() ));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
// not supported action
|
// not supported action
|
||||||
default :
|
default :
|
||||||
die('condition / action not supported!!!');
|
die('condition / action not supported!!!');
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
if ($action['last']) break;
|
|
||||||
}
|
}
|
||||||
} else {
|
if ($action['last']) break;
|
||||||
// unconditional insert
|
|
||||||
$success = $this->action( 'insert', $record, $import_csv->get_current_position() );
|
|
||||||
}
|
}
|
||||||
if($success) $count++;
|
} else {
|
||||||
|
// unconditional insert
|
||||||
|
$success = $this->action( 'insert', $record->get_record_array(), $import_csv->get_current_position() );
|
||||||
}
|
}
|
||||||
return $count;
|
return $success;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -235,7 +124,7 @@ class resources_import_csv implements importexport_iface_import_plugin {
|
|||||||
* @param array $_data contact data for the action
|
* @param array $_data contact data for the action
|
||||||
* @return bool success or not
|
* @return bool success or not
|
||||||
*/
|
*/
|
||||||
private function action ( $_action, $_data, $record_num = 0 ) {
|
protected function action ( $_action, Array $_data, $record_num = 0 ) {
|
||||||
switch ($_action) {
|
switch ($_action) {
|
||||||
case 'none' :
|
case 'none' :
|
||||||
return true;
|
return true;
|
||||||
@ -258,7 +147,7 @@ class resources_import_csv implements importexport_iface_import_plugin {
|
|||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
$result = $this->bo->save( $_data );
|
$result = $this->bo->save( $_data );
|
||||||
if($result) {
|
if($result && !is_numeric($result)) {
|
||||||
$this->errors[$record_num] = $result;
|
$this->errors[$record_num] = $result;
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
@ -335,29 +224,5 @@ class resources_import_csv implements importexport_iface_import_plugin {
|
|||||||
public function get_warnings() {
|
public function get_warnings() {
|
||||||
return $this->warnings;
|
return $this->warnings;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
/**
|
|
||||||
* Returns errors that were encountered during importing
|
|
||||||
* Maximum of one error message per record, but you can append if you need to
|
|
||||||
*
|
|
||||||
* @return Array (
|
|
||||||
* record_# => error message
|
|
||||||
* )
|
|
||||||
*/
|
|
||||||
public function get_errors() {
|
|
||||||
return $this->errors;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a list of actions taken, and the number of records for that action.
|
|
||||||
* Actions are things like 'insert', 'update', 'delete', and may be different for each plugin.
|
|
||||||
*
|
|
||||||
* @return Array (
|
|
||||||
* action => record count
|
|
||||||
* )
|
|
||||||
*/
|
|
||||||
public function get_results() {
|
|
||||||
return $this->results;
|
|
||||||
}
|
|
||||||
} // end of iface_export_plugin
|
|
||||||
?>
|
?>
|
||||||
|
@ -30,6 +30,7 @@ class resources_wizard_export_csv extends importexport_wizard_basic_export_csv
|
|||||||
'prize' => lang('Prize'),
|
'prize' => lang('Prize'),
|
||||||
'long_description' => lang('Long description'),
|
'long_description' => lang('Long description'),
|
||||||
'inventory_number' => lang('inventory number'),
|
'inventory_number' => lang('inventory number'),
|
||||||
|
'accessory_of' => lang('Accessory of')
|
||||||
);
|
);
|
||||||
|
|
||||||
// Custom fields
|
// Custom fields
|
||||||
@ -41,7 +42,7 @@ class resources_wizard_export_csv extends importexport_wizard_basic_export_csv
|
|||||||
|
|
||||||
public function wizard_step50(&$content, &$sel_options, &$readonlys, &$preserv) {
|
public function wizard_step50(&$content, &$sel_options, &$readonlys, &$preserv) {
|
||||||
if($this->debug || true) error_log(get_class($this) . '::wizard_step50->$content '.print_r($content,true));
|
if($this->debug || true) error_log(get_class($this) . '::wizard_step50->$content '.print_r($content,true));
|
||||||
// return
|
// return
|
||||||
if ($content['step'] == 'wizard_step50')
|
if ($content['step'] == 'wizard_step50')
|
||||||
{
|
{
|
||||||
switch (array_search('pressed', $content['button']))
|
switch (array_search('pressed', $content['button']))
|
||||||
|
@ -40,6 +40,7 @@ class resources_wizard_import_csv extends importexport_wizard_basic_import_csv
|
|||||||
'prize' => lang('Prize'),
|
'prize' => lang('Prize'),
|
||||||
'long_description' => lang('Long description'),
|
'long_description' => lang('Long description'),
|
||||||
'inventory_number' => lang('inventory number'),
|
'inventory_number' => lang('inventory number'),
|
||||||
|
'accessory_of' => lang('Accessory of')
|
||||||
);
|
);
|
||||||
|
|
||||||
$custom = config::get_customfields('resources', true);
|
$custom = config::get_customfields('resources', true);
|
||||||
|
@ -18,9 +18,7 @@
|
|||||||
<entry type="array" name="mapping">
|
<entry type="array" name="mapping">
|
||||||
<entry type="string" name="res_id">Resource ID</entry>
|
<entry type="string" name="res_id">Resource ID</entry>
|
||||||
<entry type="string" name="name">Name</entry>
|
<entry type="string" name="name">Name</entry>
|
||||||
<entry type="string" name="inventory_number">Inventory number</entry>
|
|
||||||
<entry type="string" name="short_description">Short description</entry>
|
<entry type="string" name="short_description">Short description</entry>
|
||||||
<entry type="string" name="long_description">Long description</entry>
|
|
||||||
<entry type="string" name="cat_id">Category</entry>
|
<entry type="string" name="cat_id">Category</entry>
|
||||||
<entry type="string" name="quantity">Quantity</entry>
|
<entry type="string" name="quantity">Quantity</entry>
|
||||||
<entry type="string" name="useable">Usable</entry>
|
<entry type="string" name="useable">Usable</entry>
|
||||||
@ -29,6 +27,9 @@
|
|||||||
<entry type="string" name="bookable">Bookable</entry>
|
<entry type="string" name="bookable">Bookable</entry>
|
||||||
<entry type="string" name="buyable">Buyable</entry>
|
<entry type="string" name="buyable">Buyable</entry>
|
||||||
<entry type="string" name="prize">Prize</entry>
|
<entry type="string" name="prize">Prize</entry>
|
||||||
|
<entry type="string" name="long_description">Long description</entry>
|
||||||
|
<entry type="string" name="inventory_number">Inventory number</entry>
|
||||||
|
<entry type="string" name="accessory_of">Accessory of</entry>
|
||||||
<entry type="string" name="all_custom_fields">resources</entry>
|
<entry type="string" name="all_custom_fields">resources</entry>
|
||||||
</entry>
|
</entry>
|
||||||
<entry type="string" name="delimiter">;</entry>
|
<entry type="string" name="delimiter">;</entry>
|
||||||
@ -36,7 +37,7 @@
|
|||||||
<entry type="string" name="begin_with_fieldnames">label</entry>
|
<entry type="string" name="begin_with_fieldnames">label</entry>
|
||||||
<entry type="string" name="convert">1</entry>
|
<entry type="string" name="convert">1</entry>
|
||||||
</entry>
|
</entry>
|
||||||
<entry type="string" name="modified">2012-10-10 12:43:09</entry>
|
<entry type="string" name="modified">2012-12-17 11:56:59</entry>
|
||||||
</entry>
|
</entry>
|
||||||
<entry type="array" name="import-resources">
|
<entry type="array" name="import-resources">
|
||||||
<entry type="string" name="name">import-resources</entry>
|
<entry type="string" name="name">import-resources</entry>
|
||||||
@ -54,32 +55,34 @@
|
|||||||
<entry type="array" name="csv_fields">
|
<entry type="array" name="csv_fields">
|
||||||
<entry type="string" name="0">Resource ID</entry>
|
<entry type="string" name="0">Resource ID</entry>
|
||||||
<entry type="string" name="1">Name</entry>
|
<entry type="string" name="1">Name</entry>
|
||||||
<entry type="string" name="2">Inventory number</entry>
|
<entry type="string" name="2">Short description</entry>
|
||||||
<entry type="string" name="3">Short description</entry>
|
<entry type="string" name="3">Category</entry>
|
||||||
<entry type="string" name="4">Long description</entry>
|
<entry type="string" name="4">Quantity</entry>
|
||||||
<entry type="string" name="5">Category</entry>
|
<entry type="string" name="5">Usable</entry>
|
||||||
<entry type="string" name="6">Quantity</entry>
|
<entry type="string" name="6">Location</entry>
|
||||||
<entry type="string" name="7">Usable</entry>
|
<entry type="string" name="7">Storage</entry>
|
||||||
<entry type="string" name="8">Location</entry>
|
<entry type="string" name="8">Bookable</entry>
|
||||||
<entry type="string" name="9">Storage</entry>
|
<entry type="string" name="9">Buyable</entry>
|
||||||
<entry type="string" name="10">Bookable</entry>
|
<entry type="string" name="10">Prize</entry>
|
||||||
<entry type="string" name="11">Buyable</entry>
|
<entry type="string" name="11">Long description</entry>
|
||||||
<entry type="string" name="12">Prize</entry>
|
<entry type="string" name="12">Inventory number</entry>
|
||||||
|
<entry type="string" name="13">Accessory of</entry>
|
||||||
</entry>
|
</entry>
|
||||||
<entry type="array" name="field_mapping">
|
<entry type="array" name="field_mapping">
|
||||||
<entry type="string" name="0">res_id</entry>
|
<entry type="string" name="0">res_id</entry>
|
||||||
<entry type="string" name="1">name</entry>
|
<entry type="string" name="1">name</entry>
|
||||||
<entry type="string" name="2">inventory_number</entry>
|
<entry type="string" name="2">short_description</entry>
|
||||||
<entry type="string" name="3">short_description</entry>
|
<entry type="string" name="3">cat_id</entry>
|
||||||
<entry type="string" name="4">long_description</entry>
|
<entry type="string" name="4">quantity</entry>
|
||||||
<entry type="string" name="5">cat_id</entry>
|
<entry type="string" name="5">useable</entry>
|
||||||
<entry type="string" name="6">quantity</entry>
|
<entry type="string" name="6">location</entry>
|
||||||
<entry type="string" name="7">useable</entry>
|
<entry type="string" name="7">storage_info</entry>
|
||||||
<entry type="string" name="8">location</entry>
|
<entry type="string" name="8">bookable</entry>
|
||||||
<entry type="string" name="9">storage_info</entry>
|
<entry type="string" name="9">buyable</entry>
|
||||||
<entry type="string" name="10">bookable</entry>
|
<entry type="string" name="10">prize</entry>
|
||||||
<entry type="string" name="11">buyable</entry>
|
<entry type="string" name="11">long_description</entry>
|
||||||
<entry type="string" name="12">prize</entry>
|
<entry type="string" name="12">inventory_number</entry>
|
||||||
|
<entry type="string" name="13">accessory_of</entry>
|
||||||
</entry>
|
</entry>
|
||||||
<entry type="string" name="field_conversion"/>
|
<entry type="string" name="field_conversion"/>
|
||||||
<entry type="array" name="conditions">
|
<entry type="array" name="conditions">
|
||||||
@ -98,7 +101,7 @@
|
|||||||
</entry>
|
</entry>
|
||||||
<entry type="string" name="convert">1</entry>
|
<entry type="string" name="convert">1</entry>
|
||||||
</entry>
|
</entry>
|
||||||
<entry type="string" name="modified">2012-10-10 12:55:25</entry>
|
<entry type="string" name="modified">2012-12-17 11:58:15</entry>
|
||||||
</entry>
|
</entry>
|
||||||
</entry>
|
</entry>
|
||||||
</entry>
|
</entry>
|
||||||
|
Loading…
Reference in New Issue
Block a user