| 63 |
$instances = field_info_instances($bundle); |
$instances = field_info_instances($bundle); |
| 64 |
foreach ($instances as $instance) { |
foreach ($instances as $instance) { |
| 65 |
$field = field_info_field($instance['field_name']); |
$field = field_info_field($instance['field_name']); |
| 66 |
$columns = (array) module_invoke($field['module'], 'field_columns', $field); |
$schema = (array) module_invoke($field['module'], 'field_schema', $field); |
| 67 |
if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED) { |
if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED) { |
| 68 |
for ($i = 0; $i < $field['cardinality']; ++$i) { |
for ($i = 0; $i < $field['cardinality']; ++$i) { |
| 69 |
foreach ($columns as $name => $spec) { |
foreach ($schema['columns'] as $name => $spec) { |
| 70 |
$column_name = $field['field_name'] .'_'. $name .'_'. $i; |
$column_name = $field['field_name'] .'_'. $name .'_'. $i; |
| 71 |
$current['fields'][$column_name] = $spec; |
$current['fields'][$column_name] = $spec; |
| 72 |
} |
} |
| 118 |
foreach ($instances as $instance) { |
foreach ($instances as $instance) { |
| 119 |
$field = field_info_field($instance['field_name']); |
$field = field_info_field($instance['field_name']); |
| 120 |
if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED) { |
if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED) { |
| 121 |
$columns = (array) module_invoke($field['module'], 'field_columns', $field); |
$schema = (array) module_invoke($field['module'], 'field_schema', $field); |
| 122 |
for ($delta = 0; $delta < $field['cardinality']; ++$delta) { |
for ($delta = 0; $delta < $field['cardinality']; ++$delta) { |
| 123 |
foreach ($columns as $name => $spec) { |
foreach ($schema['columns'] as $name => $spec) { |
| 124 |
$column_name = _field_sql_storage_columnname($field['field_name'], $name) .'_'. $delta; |
$column_name = _field_sql_storage_columnname($field['field_name'], $name) .'_'. $delta; |
| 125 |
$map[$bundle][$column_name] = array($field['field_name'], $name, $delta); |
$map[$bundle][$column_name] = array($field['field_name'], $name, $delta); |
| 126 |
} |
} |
| 149 |
$instances = field_info_instances($bundle); |
$instances = field_info_instances($bundle); |
| 150 |
foreach ($instances as $instance) { |
foreach ($instances as $instance) { |
| 151 |
$field = field_info_field($instance['field_name']); |
$field = field_info_field($instance['field_name']); |
| 152 |
$field_table = _field_sql_storage_tablename($field['field_name']); |
$field_table = _field_sql_storage_tablename($field); |
| 153 |
if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED) { |
if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED) { |
| 154 |
$query = db_select($field_table, 't', array('fetch' => PDO::FETCH_ASSOC))->fields('t'); |
$query = db_select($field_table, 't', array('fetch' => PDO::FETCH_ASSOC))->fields('t'); |
| 155 |
$results = $query->condition('bundle', $bundle)->execute(); |
$results = $query->condition('bundle', $bundle)->execute(); |
| 186 |
* FIELD_LOAD_CURRENT to load the most recent revision for all |
* FIELD_LOAD_CURRENT to load the most recent revision for all |
| 187 |
* fields, or FIELD_LOAD_REVISION to load the version indicated by |
* fields, or FIELD_LOAD_REVISION to load the version indicated by |
| 188 |
* each object. |
* each object. |
|
* @param $additions |
|
|
* An array of field data for the objects being loaded, keyed by |
|
|
* entity id, field name, and item delta number. |
|
| 189 |
* @param &$skip_fields |
* @param &$skip_fields |
| 190 |
* An array of whose keys are field names we should skip because |
* An array of whose keys are field names we should skip because |
| 191 |
* their data has already been loaded by another module. |
* their data has already been loaded by another module. |
| 193 |
* Loaded field values are added to $additions and loaded field |
* Loaded field values are added to $additions and loaded field |
| 194 |
* names are set set as keys in $skip_fields. |
* names are set set as keys in $skip_fields. |
| 195 |
*/ |
*/ |
| 196 |
function pbs_field_attach_pre_load($obj_type, $objects, $age, &$additions, &$skip_fields) { |
function pbs_field_attach_pre_load($obj_type, $objects, $age, &$skip_fields) { |
| 197 |
$etid = _field_sql_storage_etid($obj_type); |
$etid = _field_sql_storage_etid($obj_type); |
| 198 |
$load_current = $age == FIELD_LOAD_CURRENT; |
$load_current = $age == FIELD_LOAD_CURRENT; |
| 199 |
|
|
| 235 |
list($field_name, $item_name, $delta) = $tuple; |
list($field_name, $item_name, $delta) = $tuple; |
| 236 |
if (!isset($skip_fields[$field_name])) { |
if (!isset($skip_fields[$field_name])) { |
| 237 |
if (!is_null($row->{$column_name})) { |
if (!is_null($row->{$column_name})) { |
| 238 |
$additions[$row->entity_id][$field_name][$delta][$item_name] = $row->{$column_name}; |
// We must explicitly include $delta in the assignment |
| 239 |
|
// below. Consider a field 'foo' with two columns, e.g. value |
| 240 |
|
// and format. Without using $delta, the row containing |
| 241 |
|
// foo_value_0 and foo_format_0 would end up stored as |
| 242 |
|
// $obj->foo[0]['value'] and $obj->foo[1/*BZZZ!*/]['format']. |
| 243 |
|
$objects[$row->entity_id]->{$field_name}[$delta][$item_name] = $row->{$column_name}; |
| 244 |
|
} |
| 245 |
|
else if (!isset($objects[$row->entity_id]->{$field_name})) { |
| 246 |
|
$objects[$row->entity_id]->{$field_name} = array(); |
| 247 |
} |
} |
| 248 |
$new_skips[$field_name] = 1; |
$new_skips[$field_name] = 1; |
| 249 |
} |
} |
| 250 |
} |
} |
| 251 |
|
|
| 252 |
// If $row->entity_id has no non-NULL values, $additions will |
// field_attach_load() is specified to return data items indexed |
| 253 |
// have entry for it. |
// from delta 0, regardless of how they were provided on save. |
| 254 |
if (isset($additions[$row->entity_id])) { |
// TODO: Wouldn't it be more efficient to do this on save |
| 255 |
foreach ($additions[$row->entity_id] as $field_name => &$items) { |
// instead of load? |
| 256 |
$items = array_merge($items); |
foreach ($bundle_fields[$bundle] as $column_name => $tuple) { |
| 257 |
|
list($field_name, $item_name, $delta) = $tuple; |
| 258 |
|
if (!isset($skip_fields[$field_name])) { |
| 259 |
|
$objects[$row->entity_id]->{$field_name} = array_merge($objects[$row->entity_id]->{$field_name}); |
| 260 |
} |
} |
| 261 |
} |
} |
| 262 |
} |
} |
| 375 |
if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED) { |
if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED) { |
| 376 |
$bundle_table = pbs_tablename($instance['bundle']); |
$bundle_table = pbs_tablename($instance['bundle']); |
| 377 |
$revision_table = pbs_revision_tablename($instance['bundle']); |
$revision_table = pbs_revision_tablename($instance['bundle']); |
| 378 |
$columns = (array) module_invoke($field['module'], 'field_columns', $field); |
$schema = (array) module_invoke($field['module'], 'field_schema', $field); |
| 379 |
for ($i = 0; $i < $field['cardinality']; ++$i) { |
for ($i = 0; $i < $field['cardinality']; ++$i) { |
| 380 |
foreach ($columns as $name => $spec) { |
foreach ($schema['columns'] as $name => $spec) { |
| 381 |
db_add_field($ret, $bundle_table, $field['field_name'] .'_'. $name .'_'. $i, $spec); |
db_add_field($ret, $bundle_table, $field['field_name'] .'_'. $name .'_'. $i, $spec); |
| 382 |
db_add_field($ret, $revision_table, $field['field_name'] .'_'. $name .'_'. $i, $spec); |
db_add_field($ret, $revision_table, $field['field_name'] .'_'. $name .'_'. $i, $spec); |
| 383 |
} |
} |