Example #1
0
 /**
  * Save the value to the DB
  *
  * @param mixed $value
  * @param int $id
  * @param string $name
  * @param array $options
  * @param array $fields
  * @param array $pod
  * @param object $params
  *
  * @since 2.3
  */
 public function save($value, $id = null, $name = null, $options = null, $fields = null, $pod = null, $params = null)
 {
     if (empty(self::$api)) {
         self::$api = pods_api();
     }
     // File title / field handling
     foreach ($value as $id) {
         $title = false;
         if (is_array($id)) {
             if (isset($id['title']) && 0 < strlen(trim($id['title']))) {
                 $title = trim($id['title']);
             }
             if (isset($id['id'])) {
                 $id = (int) $id['id'];
             } else {
                 $id = 0;
             }
         }
         if (empty($id)) {
             continue;
         }
         // Update the title if set
         if (false !== $title && 1 == pods_var(self::$type . '_edit_title', $options, 0)) {
             $attachment_data = array('ID' => $id, 'post_title' => $title);
             self::$api->save_wp_object('media', $attachment_data);
         }
     }
 }
Example #2
0
 /**
  * Singleton handling for a basic pods_api() request
  *
  * @param string $pod (optional) The pod name
  * @param string $format (deprecated) Format for import/export, "php" or "csv"
  *
  * @return \PodsAPI
  *
  * @since 2.3.5
  */
 public static function init($pod = null, $format = null)
 {
     if (null !== $pod || null !== $format) {
         return new PodsAPI($pod, $format);
     } elseif (!is_object(self::$instance)) {
         self::$instance = new PodsAPI();
     }
     return self::$instance;
 }
Example #3
0
 /**
  * Export data from all items
  *
  * @see PodsAPI::export
  *
  * @param array $params An associative array of parameters
  *
  * @return array Data arrays of all exported pod items
  *
  * @since 2.3
  */
 public function export_data($params = null)
 {
     $defaults = array('fields' => null, 'depth' => 2, 'params' => null);
     if (empty($params)) {
         $params = $defaults;
     } else {
         $params = array_merge($defaults, (array) $params);
     }
     return $this->api->export($this, $params);
 }
Example #4
0
 /**
  * Singleton-ish handling for a basic pods_api() request
  *
  * @param string $pod (optional) The pod name
  * @param string $format (deprecated) Format for import/export, "php" or "csv"
  *
  * @return \PodsAPI
  *
  * @since 2.3.5
  */
 public static function init($pod = null, $format = null)
 {
     if (null !== $pod || null !== $format) {
         if (!isset(self::$instances[$pod])) {
             // Cache API singleton per Pod
             self::$instances[$pod] = new PodsAPI($pod, $format);
         }
         return self::$instances[$pod];
     } elseif (!is_object(self::$instance)) {
         self::$instance = new PodsAPI();
     }
     return self::$instance;
 }
 /**
  * Delete the value from the DB
  *
  * @param int $id
  * @param string $name
  * @param array $options
  * @param array $pod
  *
  * @since 2.3
  */
 public function delete($id = null, $name = null, $options = null, $pod = null)
 {
     if (empty(self::$api)) {
         self::$api = pods_api();
     }
     $simple_tableless_objects = $this->simple_objects();
     // Bidirectional relationship requirement checks
     $related_object = pods_var(self::$type . '_object', $options, '');
     // pod, post_type, taxonomy, etc..
     $related_val = pods_var(self::$type . '_val', $options, $related_object, null, true);
     // pod name, post type name, taxonomy name, etc..
     $related_sister_id = (int) pods_var('sister_id', $options, 0);
     if (!empty($related_sister_id) && !in_array($related_object, $simple_tableless_objects)) {
         $related_pod = self::$api->load_pod(array('name' => $related_val, 'table_info' => false), false);
         if (false !== $related_pod && ('pod' == $related_object || $related_object == $related_pod['type'])) {
             $related_field = false;
             // Ensure sister_id exists on related Pod
             foreach ($related_pod['fields'] as $related_pod_field) {
                 if ('pick' == $related_pod_field['type'] && $related_sister_id == $related_pod_field['id']) {
                     $related_field = $related_pod_field;
                     break;
                 }
             }
             if (!empty($related_field)) {
                 $values = self::$api->lookup_related_items($options['id'], $pod['id'], $id, $options, $pod);
                 if (!empty($values)) {
                     $no_conflict = pods_no_conflict_check($related_pod['type']);
                     if (!$no_conflict) {
                         pods_no_conflict_on($related_pod['type']);
                     }
                     self::$api->delete_relationships($values, $id, $related_pod, $related_field);
                     if (!$no_conflict) {
                         pods_no_conflict_off($related_pod['type']);
                     }
                 }
             }
         }
     }
 }
Example #6
0
 /**
  * Recursively join tables based on fields
  *
  * @param array $traverse_recurse Array of traversal options
  *
  * @return array Array of table joins
  *
  * @since 2.0
  */
 function traverse_recurse($traverse_recurse)
 {
     global $wpdb;
     $defaults = array('pod' => null, 'fields' => array(), 'joined' => 't', 'depth' => 0, 'joined_id' => 'id', 'joined_index' => 'id', 'params' => new stdClass(), 'last_table_info' => array());
     $traverse_recurse = array_merge($defaults, $traverse_recurse);
     $joins = array();
     if (0 == $traverse_recurse['depth'] && !empty($traverse_recurse['pod']) && !empty($traverse_recurse['last_table_info']) && isset($traverse_recurse['last_table_info']['id'])) {
         $pod_data = $traverse_recurse['last_table_info'];
     } elseif (empty($traverse_recurse['pod'])) {
         if (!empty($traverse_recurse['params']) && !empty($traverse_recurse['params']->table) && 0 === strpos($traverse_recurse['params']->table, $wpdb->prefix)) {
             if ($wpdb->posts == $traverse_recurse['params']->table) {
                 $traverse_recurse['pod'] = 'post_type';
             } elseif ($wpdb->terms == $traverse_recurse['params']->table) {
                 $traverse_recurse['pod'] = 'taxonomy';
             } elseif ($wpdb->users == $traverse_recurse['params']->table) {
                 $traverse_recurse['pod'] = 'user';
             } elseif ($wpdb->comments == $traverse_recurse['params']->table) {
                 $traverse_recurse['pod'] = 'comment';
             } else {
                 return $joins;
             }
             $pod_data = array();
             if (in_array($traverse_recurse['pod'], array('user', 'comment'))) {
                 $pod = $this->api->load_pod(array('name' => $traverse_recurse['pod'], 'table_info' => true));
                 if (!empty($pod) && $pod['type'] == $pod) {
                     $pod_data = $pod;
                 }
             }
             if (empty($pod_data)) {
                 $pod_data = array('id' => 0, 'name' => '_table_' . $traverse_recurse['pod'], 'type' => $traverse_recurse['pod'], 'storage' => 'taxonomy' == $traverse_recurse['pod'] ? 'none' : 'meta', 'fields' => array(), 'object_fields' => $this->api->get_wp_object_fields($traverse_recurse['pod']));
                 $pod_data = array_merge($this->api->get_table_info($traverse_recurse['pod'], ''), $pod_data);
             }
             $traverse_recurse['pod'] = $pod_data['name'];
         } else {
             return $joins;
         }
     } else {
         $pod_data = $this->api->load_pod(array('name' => $traverse_recurse['pod'], 'table_info' => true), false);
         if (empty($pod_data)) {
             return $joins;
         }
     }
     if (isset($pod_data['object_fields'])) {
         $pod_data['fields'] = array_merge($pod_data['fields'], $pod_data['object_fields']);
     }
     $tableless_field_types = PodsForm::tableless_field_types();
     $simple_tableless_objects = PodsForm::field_method('pick', 'simple_objects');
     $file_field_types = PodsForm::file_field_types();
     if (!isset($this->traversal[$traverse_recurse['pod']])) {
         $this->traversal[$traverse_recurse['pod']] = array();
     }
     if ((empty($pod_data['meta_table']) || $pod_data['meta_table'] == $pod_data['table']) && (empty($traverse_recurse['fields']) || !isset($traverse_recurse['fields'][$traverse_recurse['depth']]) || empty($traverse_recurse['fields'][$traverse_recurse['depth']]))) {
         return $joins;
     }
     $field = $traverse_recurse['fields'][$traverse_recurse['depth']];
     $ignore_aliases = array('wpml_languages', 'polylang_languages');
     $ignore_aliases = $this->do_hook('traverse_recurse_ignore_aliases', $ignore_aliases, $field, $traverse_recurse);
     if (in_array($field, $ignore_aliases)) {
         return $joins;
     }
     $meta_data_table = false;
     if (!isset($pod_data['fields'][$field]) && 'd' == $field && isset($traverse_recurse['fields'][$traverse_recurse['depth'] - 1])) {
         $field = $traverse_recurse['fields'][$traverse_recurse['depth'] - 1];
         $field_type = 'pick';
         if (isset($traverse_recurse['last_table_info']['pod']['fields'][$field])) {
             $field_type = $traverse_recurse['last_table_info']['pod']['fields'][$field]['type'];
         } elseif (isset($traverse_recurse['last_table_info']['pod']['object_fields'][$field])) {
             $field_type = $traverse_recurse['last_table_info']['pod']['object_fields'][$field]['type'];
         }
         $pod_data['fields'][$field] = array('id' => 0, 'name' => $field, 'type' => $field_type, 'pick_object' => $traverse_recurse['last_table_info']['pod']['type'], 'pick_val' => $traverse_recurse['last_table_info']['pod']['name']);
         $meta_data_table = true;
     }
     // Fallback to meta table if the pod type supports it
     if (!isset($pod_data['fields'][$field])) {
         $last = end($traverse_recurse['fields']);
         if ('post_type' == $pod_data['type'] && !isset($pod_data['object_fields'])) {
             $pod_data['object_fields'] = $this->api->get_wp_object_fields('post_type', $pod_data);
         }
         if ('post_type' == $pod_data['type'] && isset($pod_data['object_fields'][$field]) && in_array($pod_data['object_fields'][$field]['type'], $tableless_field_types)) {
             $pod_data['fields'][$field] = $pod_data['object_fields'][$field];
         } elseif (in_array($pod_data['type'], array('post_type', 'media', 'user', 'comment')) && 'meta_value' == $last) {
             $pod_data['fields'][$field] = PodsForm::field_setup(array('name' => $field));
         } else {
             if ('post_type' == $pod_data['type']) {
                 $pod_data['object_fields'] = $this->api->get_wp_object_fields('post_type', $pod_data, true);
                 if ('post_type' == $pod_data['type'] && isset($pod_data['object_fields'][$field]) && in_array($pod_data['object_fields'][$field]['type'], $tableless_field_types)) {
                     $pod_data['fields'][$field] = $pod_data['object_fields'][$field];
                 } else {
                     return $joins;
                 }
             } else {
                 return $joins;
             }
         }
     }
     $traverse = $pod_data['fields'][$field];
     if ('taxonomy' == $traverse['type']) {
         $traverse['table_info'] = $this->api->get_table_info($traverse['type'], $traverse['name']);
     } elseif (in_array($traverse['type'], $file_field_types)) {
         $traverse['table_info'] = $this->api->get_table_info('post_type', 'attachment');
     } elseif (!in_array($traverse['type'], $tableless_field_types)) {
         $traverse['table_info'] = $this->api->get_table_info($pod_data['type'], $pod_data['name'], $pod_data['name'], $pod_data);
     } elseif (empty($traverse['table_info']) || in_array($traverse['pick_object'], $simple_tableless_objects) && !empty($traverse_recurse['last_table_info'])) {
         if (in_array($traverse['pick_object'], $simple_tableless_objects) && !empty($traverse_recurse['last_table_info'])) {
             $traverse['table_info'] = $traverse_recurse['last_table_info'];
             if (!empty($traverse['table_info']['meta_table'])) {
                 $meta_data_table = true;
             }
         } elseif (!in_array($traverse['type'], $tableless_field_types) && isset($traverse_recurse['last_table_info']) && !empty($traverse_recurse['last_table_info']) && 0 == $traverse_recurse['depth']) {
             $traverse['table_info'] = $traverse_recurse['last_table_info'];
         } else {
             $traverse['table_info'] = $this->api->get_table_info($traverse['pick_object'], $traverse['pick_val'], null, $traverse['pod'], $traverse);
         }
     }
     if (isset($this->traversal[$traverse_recurse['pod']][$traverse['name']])) {
         $traverse = array_merge($traverse, (array) $this->traversal[$traverse_recurse['pod']][$traverse['name']]);
     }
     $traverse = $this->do_hook('traverse', $traverse, compact('pod', 'fields', 'joined', 'depth', 'joined_id', 'params'));
     if (empty($traverse)) {
         return $joins;
     }
     $traverse = pods_sanitize($traverse);
     $traverse['id'] = (int) $traverse['id'];
     if (empty($traverse['id'])) {
         $traverse['id'] = $field;
     }
     $table_info = $traverse['table_info'];
     $this->traversal[$traverse_recurse['pod']][$field] = $traverse;
     $field_joined = $field;
     if (0 < $traverse_recurse['depth'] && 't' != $traverse_recurse['joined']) {
         if ($meta_data_table && ('pick' != $traverse['type'] || !in_array(pods_var('pick_object', $traverse), $simple_tableless_objects))) {
             $field_joined = $traverse_recurse['joined'] . '_d';
         } else {
             $field_joined = $traverse_recurse['joined'] . '_' . $field;
         }
     }
     $rel_alias = 'rel_' . $field_joined;
     if (pods_var('search', $traverse_recurse['params'], false) && empty($traverse_recurse['params']->filters)) {
         if (0 < strlen(pods_var('filter_' . $field_joined, 'get'))) {
             $val = absint(pods_var('filter_' . $field_joined, 'get'));
             $search = "`{$field_joined}`.`{$table_info['field_id']}` = {$val}";
             if ('text' == $this->search_mode) {
                 $val = pods_var('filter_' . $field_joined, 'get');
                 $search = "`{$field_joined}`.`{$traverse['name']}` = '{$val}'";
             } elseif ('text_like' == $this->search_mode) {
                 $val = pods_sanitize(pods_sanitize_like(pods_var_raw('filter_' . $field_joined)));
                 $search = "`{$field_joined}`.`{$traverse['name']}` LIKE '%{$val}%'";
             }
             $this->search_where[] = " {$search} ";
         }
     }
     $the_join = null;
     $joined_id = $table_info['field_id'];
     $joined_index = $table_info['field_index'];
     if ('taxonomy' == $traverse['type']) {
         $rel_tt_alias = 'rel_tt_' . $field_joined;
         if ($meta_data_table) {
             $the_join = "\n                    LEFT JOIN `{$table_info['pod_table']}` AS `{$field_joined}` ON\n                        `{$field_joined}`.`{$table_info['pod_field_id']}` = `{$traverse_recurse['rel_alias']}`.`{$traverse_recurse['joined_id']}`\n                ";
         } else {
             $the_join = "\n                    LEFT JOIN `{$wpdb->term_relationships}` AS `{$rel_alias}` ON\n                        `{$rel_alias}`.`object_id` = `{$traverse_recurse['joined']}`.`ID`\n\n                    LEFT JOIN `{$wpdb->term_taxonomy}` AS `{$rel_tt_alias}` ON\n                        `{$rel_tt_alias}`.`taxonomy` = '{$traverse['name']}'\n                        AND `{$rel_tt_alias}`.`term_taxonomy_id` = `{$rel_alias}`.`term_taxonomy_id`\n\n                    LEFT JOIN `{$table_info['table']}` AS `{$field_joined}` ON\n                        `{$field_joined}`.`{$table_info['field_id']}` = `{$rel_tt_alias}`.`{$table_info['field_id']}`\n                ";
             // Override $rel_alias
             $rel_alias = $field_joined;
             $joined_id = $table_info['field_id'];
             $joined_index = $table_info['field_index'];
         }
     } elseif (in_array($traverse['type'], $tableless_field_types) && ('pick' != $traverse['type'] || !in_array(pods_var('pick_object', $traverse), $simple_tableless_objects))) {
         if (pods_tableless()) {
             $the_join = "\n                    LEFT JOIN `{$table_info['meta_table']}` AS `{$rel_alias}` ON\n                        `{$rel_alias}`.`{$table_info['meta_field_index']}` = '{$traverse['name']}'\n                        AND `{$rel_alias}`.`{$table_info['meta_field_id']}` = `{$traverse_recurse['joined']}`.`{$traverse_recurse['joined_id']}`\n\n                    LEFT JOIN `{$table_info['meta_table']}` AS `{$field_joined}` ON\n                        `{$field_joined}`.`{$table_info['meta_field_index']}` = '{$traverse['name']}'\n                        AND `{$field_joined}`.`{$table_info['meta_field_id']}` = CONVERT( `{$rel_alias}`.`{$table_info['meta_field_value']}`, SIGNED )\n                ";
             $joined_id = $table_info['meta_field_id'];
             $joined_index = $table_info['meta_field_index'];
         } elseif ($meta_data_table) {
             $the_join = "\n                    LEFT JOIN `{$table_info['pod_table']}` AS `{$field_joined}` ON\n                        `{$field_joined}`.`{$table_info['pod_field_id']}` = `{$traverse_recurse['rel_alias']}`.`{$traverse_recurse['joined_id']}`\n                ";
         } else {
             $the_join = "\n                    LEFT JOIN `@wp_podsrel` AS `{$rel_alias}` ON\n                        `{$rel_alias}`.`field_id` = {$traverse['id']}\n                        AND `{$rel_alias}`.`item_id` = `{$traverse_recurse['joined']}`.`{$traverse_recurse['joined_id']}`\n\n                    LEFT JOIN `{$table_info['table']}` AS `{$field_joined}` ON\n                        `{$field_joined}`.`{$table_info['field_id']}` = `{$rel_alias}`.`related_item_id`\n                ";
         }
     } elseif ('meta' == $pod_data['storage']) {
         if ($traverse_recurse['depth'] + 2 == count($traverse_recurse['fields']) && ('pick' != $traverse['type'] || !in_array(pods_var('pick_object', $traverse), $simple_tableless_objects)) && $table_info['meta_field_value'] == $traverse_recurse['fields'][$traverse_recurse['depth'] + 1]) {
             $the_join = "\n                    LEFT JOIN `{$table_info['meta_table']}` AS `{$field_joined}` ON\n                        `{$field_joined}`.`{$table_info['meta_field_index']}` = '{$traverse['name']}'\n                        AND `{$field_joined}`.`{$table_info['meta_field_id']}` = `{$traverse_recurse['joined']}`.`{$traverse_recurse['joined_id']}`\n                ";
             $table_info['recurse'] = false;
         } else {
             $the_join = "\n                    LEFT JOIN `{$table_info['meta_table']}` AS `{$field_joined}` ON\n                        `{$field_joined}`.`{$table_info['meta_field_index']}` = '{$traverse['name']}'\n                        AND `{$field_joined}`.`{$table_info['meta_field_id']}` = `{$traverse_recurse['joined']}`.`{$traverse_recurse['joined_id']}`\n                ";
             $joined_id = $table_info['meta_field_id'];
             $joined_index = $table_info['meta_field_index'];
         }
     }
     $traverse_recursive = array('pod' => pods_var_raw('name', pods_var_raw('pod', $table_info)), 'fields' => $traverse_recurse['fields'], 'joined' => $field_joined, 'depth' => $traverse_recurse['depth'] + 1, 'joined_id' => $joined_id, 'joined_index' => $joined_index, 'params' => $traverse_recurse['params'], 'rel_alias' => $rel_alias, 'last_table_info' => $table_info);
     $the_join = $this->do_hook('traverse_the_join', $the_join, $traverse_recurse, $traverse_recursive);
     if (empty($the_join)) {
         return $joins;
     }
     $joins[$traverse_recurse['pod'] . '_' . $traverse_recurse['depth'] . '_' . $traverse['id']] = $the_join;
     if ($traverse_recurse['depth'] + 1 < count($traverse_recurse['fields']) && !empty($traverse_recurse['pod']) && false !== $table_info['recurse']) {
         $joins = array_merge($joins, $this->traverse_recurse($traverse_recursive));
     }
     return $joins;
 }
 /**
  * @param string $pod_name
  *
  * @return string
  */
 public function export_pod($pod_name)
 {
     $output = '';
     // Attempt to load the pod, don't throw an exception on error
     $params = array('name' => $pod_name, 'fields' => true);
     $pod = $this->api->load_pod($params, false);
     // Exit if the pod wasn't found or is table based (not supported)
     if (false === $pod || !isset($pod['storage']) || 'table' == $pod['storage']) {
         return '';
     }
     // Pull out the field list
     $fields = $pod['fields'];
     $options_ignore = array('id', 'pod_id', 'old_name', 'object_type', 'object_name', 'object_hierarchical', 'table', 'meta_table', 'pod_table', 'field_id', 'field_index', 'field_slug', 'field_type', 'field_parent', 'field_parent_select', 'meta_field_id', 'meta_field_index', 'meta_field_value', 'pod_field_id', 'pod_field_index', 'fields', 'object_fields', 'join', 'where', 'where_default', 'orderby', 'pod', 'recurse', 'table_info', 'attributes', 'group', 'grouped', 'developer_mode', 'dependency', 'depends-on', 'excludes-on');
     $empties = array('description', 'alias', 'help', 'class', 'pick_object', 'pick_val', 'sister_id', 'required', 'unique', 'admin_only', 'restrict_role', 'restrict_capability', 'hidden', 'read_only', 'object', 'label_singular');
     $field_types = PodsForm::field_types();
     $field_type_options = array();
     foreach ($field_types as $type => $field_type_data) {
         $field_type_options[$type] = PodsForm::ui_options($type);
     }
     if (isset($pod['options'])) {
         $pod = array_merge($pod, $pod['options']);
         unset($pod['options']);
     }
     foreach ($pod as $option => $option_value) {
         if (in_array($option, $options_ignore) || null === $option_value) {
             unset($pod[$option]);
         } elseif (in_array($option, $empties) && (empty($option_value) || '0' == $option_value)) {
             if ('restrict_role' == $option && isset($pod['roles_allowed'])) {
                 unset($pod['roles_allowed']);
             } elseif ('restrict_capability' == $option && isset($pod['capabilities_allowed'])) {
                 unset($pod['capabilities_allowed']);
             }
             unset($pod[$option]);
         }
     }
     if (!empty($fields)) {
         foreach ($fields as &$field) {
             if (isset($field['options'])) {
                 $field = array_merge($field, $field['options']);
                 unset($field['options']);
             }
             foreach ($field as $option => $option_value) {
                 if (in_array($option, $options_ignore) || null === $option_value) {
                     unset($field[$option]);
                 } elseif (in_array($option, $empties) && (empty($option_value) || '0' == $option_value)) {
                     if ('restrict_role' == $option && isset($field['roles_allowed'])) {
                         unset($field['roles_allowed']);
                     } elseif ('restrict_capability' == $option && isset($field['capabilities_allowed'])) {
                         unset($field['capabilities_allowed']);
                     }
                     unset($field[$option]);
                 }
             }
             foreach ($field_type_options as $type => $options) {
                 if ($type == pods_var('type', $field)) {
                     continue;
                 }
                 foreach ($options as $option_data) {
                     if (isset($option_data['group']) && is_array($option_data['group']) && !empty($option_data['group'])) {
                         if (isset($field[$option_data['name']])) {
                             unset($field[$option_data['name']]);
                         }
                         foreach ($option_data['group'] as $group_option_data) {
                             if (isset($field[$group_option_data['name']])) {
                                 unset($field[$group_option_data['name']]);
                             }
                         }
                     } elseif (isset($field[$option_data['name']])) {
                         unset($field[$option_data['name']]);
                     }
                 }
             }
         }
     }
     // Output the pods_register_type() call
     $output .= sprintf("\t\$pod = %s;\n\n", $this->var_export_format($pod, 1));
     $output .= "\tpods_register_type( \$pod[ 'type' ], \$pod[ 'name' ], \$pod );\n\n";
     // Output a pods_register_field() call for each field
     foreach ($fields as $this_field) {
         $output .= sprintf("\t\$field = %s;\n\n", preg_replace('/\\d+ => /', '', $this->var_export_format($this_field, 1)));
         $output .= "\tpods_register_field( \$pod[ 'name' ], \$field[ 'name' ], \$field );\n\n";
     }
     return $output;
 }
Example #8
0
/**
 * Include and get the PodsAPI object, for use with all calls that Pods makes for add, save, delete, and more.
 *
 * @see PodsAPI
 *
 * @param string $pod (optional) (deprecated) The Pod name
 * @param string $format (optional) (deprecated) Format used in import() and export()
 *
 * @return PodsAPI
 *
 * @since 2.0
 * @link http://pods.io/docs/pods-api/
 */
function pods_api($pod = null, $format = null)
{
    require_once PODS_DIR . 'classes/PodsAPI.php';
    return PodsAPI::init($pod, $format);
}