123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416 |
- <?php
- class FieldValidationException extends FieldException {
- var $errors;
-
- function __construct($errors) {
- $this->errors = $errors;
- parent::__construct(t('Field validation errors'));
- }
- }
- define('FIELD_STORAGE_UPDATE', 'update');
- define('FIELD_STORAGE_INSERT', 'insert');
- function _field_invoke($op, $entity_type, $entity, &$a = NULL, &$b = NULL, $options = array()) {
-
- $default_options = array(
- 'default' => FALSE,
- 'deleted' => FALSE,
- 'language' => NULL,
- );
- $options += $default_options;
-
- list(, , $bundle) = entity_extract_ids($entity_type, $entity);
- $instances = _field_invoke_get_instances($entity_type, $bundle, $options);
-
- $return = array();
- foreach ($instances as $instance) {
-
-
- $field = field_info_field_by_id($instance['field_id']);
- $field_name = $field['field_name'];
- $function = $options['default'] ? 'field_default_' . $op : $field['module'] . '_field_' . $op;
- if (function_exists($function)) {
-
- $available_languages = field_available_languages($entity_type, $field);
- $languages = _field_language_suggestion($available_languages, $options['language'], $field_name);
- foreach ($languages as $langcode) {
- $items = isset($entity->{$field_name}[$langcode]) ? $entity->{$field_name}[$langcode] : array();
- $result = $function($entity_type, $entity, $field, $instance, $langcode, $items, $a, $b);
- if (isset($result)) {
-
-
- if (is_array($result)) {
- $return = array_merge($return, $result);
- }
- else {
- $return[] = $result;
- }
- }
-
-
- if ($items !== array() || isset($entity->{$field_name}[$langcode])) {
- $entity->{$field_name}[$langcode] = $items;
- }
- }
- }
- }
- return $return;
- }
- function _field_invoke_multiple($op, $entity_type, $entities, &$a = NULL, &$b = NULL, $options = array()) {
-
- $default_options = array(
- 'default' => FALSE,
- 'deleted' => FALSE,
- 'language' => NULL,
- );
- $options += $default_options;
- $fields = array();
- $grouped_instances = array();
- $grouped_entities = array();
- $grouped_items = array();
- $return = array();
-
-
-
-
-
-
-
-
- foreach ($entities as $entity) {
-
- list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
- $instances = _field_invoke_get_instances($entity_type, $bundle, $options);
- foreach ($instances as $instance) {
- $field_id = $instance['field_id'];
- $field_name = $instance['field_name'];
- $field = field_info_field_by_id($field_id);
- $function = $options['default'] ? 'field_default_' . $op : $field['module'] . '_field_' . $op;
- if (function_exists($function)) {
-
- if (!isset($fields[$field_id])) {
- $fields[$field_id] = $field;
- }
-
-
-
-
- $available_languages = field_available_languages($entity_type, $field);
- $language = is_array($options['language']) && !empty($options['language'][$id]) ? $options['language'][$id] : $options['language'];
- $languages = _field_language_suggestion($available_languages, $language, $field_name);
- foreach ($languages as $langcode) {
- $grouped_items[$field_id][$langcode][$id] = isset($entity->{$field_name}[$langcode]) ? $entity->{$field_name}[$langcode] : array();
-
-
- $grouped_instances[$field_id][$langcode][$id] = $instance;
- $grouped_entities[$field_id][$langcode][$id] = $entities[$id];
- }
- }
- }
-
- $return[$id] = array();
- }
-
- foreach ($fields as $field_id => $field) {
- $field_name = $field['field_name'];
- $function = $options['default'] ? 'field_default_' . $op : $field['module'] . '_field_' . $op;
-
- foreach ($grouped_items[$field_id] as $langcode => &$items) {
- $entities = $grouped_entities[$field_id][$langcode];
- $instances = $grouped_instances[$field_id][$langcode];
- $results = $function($entity_type, $entities, $field, $instances, $langcode, $items, $a, $b);
- if (isset($results)) {
-
-
-
- foreach ($results as $id => $result) {
- if (is_array($result)) {
- $return[$id] = array_merge($return[$id], $result);
- }
- else {
- $return[$id][] = $result;
- }
- }
- }
- }
-
-
- foreach ($grouped_entities[$field_id] as $langcode => $entities) {
- foreach ($entities as $id => $entity) {
- if ($grouped_items[$field_id][$langcode][$id] !== array() || isset($entity->{$field_name}[$langcode])) {
- $entity->{$field_name}[$langcode] = $grouped_items[$field_id][$langcode][$id];
- }
- }
- }
- }
- return $return;
- }
- function _field_invoke_default($op, $entity_type, $entity, &$a = NULL, &$b = NULL, $options = array()) {
- $options['default'] = TRUE;
- return _field_invoke($op, $entity_type, $entity, $a, $b, $options);
- }
- function _field_invoke_multiple_default($op, $entity_type, $entities, &$a = NULL, &$b = NULL, $options = array()) {
- $options['default'] = TRUE;
- return _field_invoke_multiple($op, $entity_type, $entities, $a, $b, $options);
- }
- function _field_invoke_get_instances($entity_type, $bundle, $options) {
- if ($options['deleted']) {
-
-
- $params = array('entity_type' => $entity_type, 'bundle' => $bundle);
- if (isset($options['field_id'])) {
-
-
-
- $params['field_id'] = $options['field_id'];
- }
- $instances = field_read_instances($params, array('include_deleted' => TRUE));
- }
- elseif (isset($options['field_name'])) {
-
-
- $instances = array(field_info_instance($entity_type, $options['field_name'], $bundle));
- }
- else {
- $instances = field_info_instances($entity_type, $bundle);
- if (isset($options['field_id'])) {
-
-
- foreach ($instances as $instance) {
- if ($instance['field_id'] == $options['field_id']) {
- $instances = array($instance);
- break;
- }
- }
- }
- }
- return $instances;
- }
- function field_attach_form($entity_type, $entity, &$form, &$form_state, $langcode = NULL, $options = array()) {
-
-
- $options = is_array($options) ? $options : array();
-
- $form += array('#parents' => array());
-
- $options['language'] = field_valid_language($langcode);
- $form += (array) _field_invoke_default('form', $entity_type, $entity, $form, $form_state, $options);
-
- list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
- $form['#pre_render'][] = '_field_extra_fields_pre_render';
- $form['#entity_type'] = $entity_type;
- $form['#bundle'] = $bundle;
-
-
- foreach (module_implements('field_attach_form') as $module) {
- $function = $module . '_field_attach_form';
- $function($entity_type, $entity, $form, $form_state, $langcode);
- }
- }
- function field_attach_load($entity_type, $entities, $age = FIELD_LOAD_CURRENT, $options = array()) {
- $load_current = $age == FIELD_LOAD_CURRENT;
-
- $default_options = array(
- 'deleted' => FALSE,
- );
- $options += $default_options;
- $info = entity_get_info($entity_type);
-
-
- $cache_read = $load_current && $info['field cache'] && empty($options['deleted']);
-
- $cache_write = $cache_read && !isset($options['field_id']);
- if (empty($entities)) {
- return;
- }
-
-
- $queried_entities = $entities;
-
- if ($cache_read) {
-
- $cids = array();
- foreach ($entities as $id => $entity) {
- $cids[] = "field:$entity_type:$id";
- }
- $cache = cache_get_multiple($cids, 'cache_field');
-
-
- foreach ($entities as $id => $entity) {
- $cid = "field:$entity_type:$id";
- if (isset($cache[$cid])) {
- unset($queried_entities[$id]);
- foreach ($cache[$cid]->data as $field_name => $values) {
- $entity->$field_name = $values;
- }
- }
- }
- }
-
- if ($queried_entities) {
-
-
-
-
-
-
-
- $skip_fields = array();
- foreach (module_implements('field_storage_pre_load') as $module) {
- $function = $module . '_field_storage_pre_load';
- $function($entity_type, $queried_entities, $age, $skip_fields, $options);
- }
- $instances = array();
-
- $storages = array();
- foreach ($queried_entities as $entity) {
- list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
- $instances = _field_invoke_get_instances($entity_type, $bundle, $options);
- foreach ($instances as $instance) {
- $field_name = $instance['field_name'];
- $field_id = $instance['field_id'];
-
- if (!isset($queried_entities[$id]->{$field_name})) {
- $queried_entities[$id]->{$field_name} = array();
- }
-
- if (!isset($skip_fields[$field_id])) {
- $field = field_info_field_by_id($field_id);
- $storages[$field['storage']['type']][$field_id][] = $load_current ? $id : $vid;
- }
- }
- }
-
- foreach ($storages as $storage => $fields) {
- $storage_info = field_info_storage_types($storage);
- module_invoke($storage_info['module'], 'field_storage_load', $entity_type, $queried_entities, $age, $fields, $options);
- }
-
- $null = NULL;
- _field_invoke_multiple('load', $entity_type, $queried_entities, $age, $null, $options);
-
-
- module_invoke_all('field_attach_load', $entity_type, $queried_entities, $age, $options);
-
- if ($cache_write) {
- foreach ($queried_entities as $id => $entity) {
- $data = array();
- list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
- $instances = field_info_instances($entity_type, $bundle);
- foreach ($instances as $instance) {
- $data[$instance['field_name']] = $queried_entities[$id]->{$instance['field_name']};
- }
- $cid = "field:$entity_type:$id";
- cache_set($cid, $data, 'cache_field');
- }
- }
- }
- }
- function field_attach_load_revision($entity_type, $entities, $options = array()) {
- return field_attach_load($entity_type, $entities, FIELD_LOAD_REVISION, $options);
- }
- function field_attach_validate($entity_type, $entity, $options = array()) {
-
-
- $options = is_array($options) ? $options : array();
- $errors = array();
-
- $null = NULL;
- _field_invoke_default('validate', $entity_type, $entity, $errors, $null, $options);
-
- _field_invoke('validate', $entity_type, $entity, $errors, $null, $options);
-
-
- foreach (module_implements('field_attach_validate') as $module) {
- $function = $module . '_field_attach_validate';
- $function($entity_type, $entity, $errors);
- }
- if ($errors) {
- throw new FieldValidationException($errors);
- }
- }
- function field_attach_form_validate($entity_type, $entity, $form, &$form_state, $options = array()) {
-
-
- $options = is_array($options) ? $options : array();
-
- _field_invoke_default('extract_form_values', $entity_type, $entity, $form, $form_state);
-
- try {
- field_attach_validate($entity_type, $entity, $options);
- }
- catch (FieldValidationException $e) {
-
-
- foreach ($e->errors as $field_name => $field_errors) {
- foreach ($field_errors as $langcode => $errors) {
- $field_state = field_form_get_state($form['#parents'], $field_name, $langcode, $form_state);
- $field_state['errors'] = $errors;
- field_form_set_state($form['#parents'], $field_name, $langcode, $form_state, $field_state);
- }
- }
- _field_invoke_default('form_errors', $entity_type, $entity, $form, $form_state, $options);
- }
- }
- function field_attach_submit($entity_type, $entity, $form, &$form_state, $options = array()) {
-
-
- $options = is_array($options) ? $options : array();
-
- _field_invoke_default('extract_form_values', $entity_type, $entity, $form, $form_state, $options);
- _field_invoke_default('submit', $entity_type, $entity, $form, $form_state, $options);
-
-
- foreach (module_implements('field_attach_submit') as $module) {
- $function = $module . '_field_attach_submit';
- $function($entity_type, $entity, $form, $form_state);
- }
- }
- function field_attach_presave($entity_type, $entity) {
- _field_invoke('presave', $entity_type, $entity);
-
- module_invoke_all('field_attach_presave', $entity_type, $entity);
- }
- function field_attach_insert($entity_type, $entity) {
- _field_invoke_default('insert', $entity_type, $entity);
- _field_invoke('insert', $entity_type, $entity);
- list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
-
-
- $skip_fields = array();
- foreach (module_implements('field_storage_pre_insert') as $module) {
- $function = $module . '_field_storage_pre_insert';
- $function($entity_type, $entity, $skip_fields);
- }
-
- $storages = array();
- foreach (field_info_instances($entity_type, $bundle) as $instance) {
- $field = field_info_field_by_id($instance['field_id']);
- $field_id = $field['id'];
- $field_name = $field['field_name'];
- if (!empty($entity->$field_name)) {
-
- if (!isset($skip_fields[$field_id])) {
- $storages[$field['storage']['type']][$field_id] = $field_id;
- }
- }
- }
-
- foreach ($storages as $storage => $fields) {
- $storage_info = field_info_storage_types($storage);
- module_invoke($storage_info['module'], 'field_storage_write', $entity_type, $entity, FIELD_STORAGE_INSERT, $fields);
- }
-
- module_invoke_all('field_attach_insert', $entity_type, $entity);
- $entity_info = entity_get_info($entity_type);
- }
- function field_attach_update($entity_type, $entity) {
- _field_invoke('update', $entity_type, $entity);
- list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
-
-
- $skip_fields = array();
- foreach (module_implements('field_storage_pre_update') as $module) {
- $function = $module . '_field_storage_pre_update';
- $function($entity_type, $entity, $skip_fields);
- }
-
- $storages = array();
- foreach (field_info_instances($entity_type, $bundle) as $instance) {
- $field = field_info_field_by_id($instance['field_id']);
- $field_id = $field['id'];
- $field_name = $field['field_name'];
-
-
-
-
- if (isset($entity->$field_name) || property_exists($entity, $field_name)) {
-
- if (!isset($skip_fields[$field_id])) {
- $storages[$field['storage']['type']][$field_id] = $field_id;
- }
- }
- }
-
- foreach ($storages as $storage => $fields) {
- $storage_info = field_info_storage_types($storage);
- module_invoke($storage_info['module'], 'field_storage_write', $entity_type, $entity, FIELD_STORAGE_UPDATE, $fields);
- }
-
- module_invoke_all('field_attach_update', $entity_type, $entity);
- $entity_info = entity_get_info($entity_type);
- if ($entity_info['field cache']) {
- cache_clear_all("field:$entity_type:$id", 'cache_field');
- }
- }
- function field_attach_delete($entity_type, $entity) {
- _field_invoke('delete', $entity_type, $entity);
- list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
-
- $storages = array();
- foreach (field_info_instances($entity_type, $bundle) as $instance) {
- $field = field_info_field_by_id($instance['field_id']);
- $field_id = $field['id'];
- $storages[$field['storage']['type']][$field_id] = $field_id;
- }
-
- foreach ($storages as $storage => $fields) {
- $storage_info = field_info_storage_types($storage);
- module_invoke($storage_info['module'], 'field_storage_delete', $entity_type, $entity, $fields);
- }
-
- module_invoke_all('field_attach_delete', $entity_type, $entity);
- $entity_info = entity_get_info($entity_type);
- if ($entity_info['field cache']) {
- cache_clear_all("field:$entity_type:$id", 'cache_field');
- }
- }
- function field_attach_delete_revision($entity_type, $entity) {
- _field_invoke('delete_revision', $entity_type, $entity);
- list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
-
- $storages = array();
- foreach (field_info_instances($entity_type, $bundle) as $instance) {
- $field = field_info_field_by_id($instance['field_id']);
- $field_id = $field['id'];
- $storages[$field['storage']['type']][$field_id] = $field_id;
- }
-
- foreach ($storages as $storage => $fields) {
- $storage_info = field_info_storage_types($storage);
- module_invoke($storage_info['module'], 'field_storage_delete_revision', $entity_type, $entity, $fields);
- }
-
- module_invoke_all('field_attach_delete_revision', $entity_type, $entity);
- }
- function field_attach_prepare_view($entity_type, $entities, $view_mode, $langcode = NULL, $options = array()) {
-
-
- $options = is_array($options) ? $options : array();
- $options['language'] = array();
-
-
-
- $prepare = array();
- foreach ($entities as $id => $entity) {
- if (empty($entity->_field_view_prepared)) {
-
- $prepare[$id] = $entity;
-
-
- $options['language'][$id] = field_language($entity_type, $entity, NULL, $langcode);
-
- $entity->_field_view_prepared = TRUE;
- }
- }
- $null = NULL;
-
- _field_invoke_multiple('prepare_view', $entity_type, $prepare, $null, $null, $options);
-
-
-
- _field_invoke_multiple_default('prepare_view', $entity_type, $prepare, $view_mode, $null, $options);
- }
- function field_attach_view($entity_type, $entity, $view_mode, $langcode = NULL, $options = array()) {
-
-
- $options = is_array($options) ? $options : array();
-
-
- $display_language = field_language($entity_type, $entity, NULL, $langcode);
- $options['language'] = $display_language;
-
- $null = NULL;
- $output = _field_invoke_default('view', $entity_type, $entity, $view_mode, $null, $options);
-
- list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
- $output['#pre_render'][] = '_field_extra_fields_pre_render';
- $output['#entity_type'] = $entity_type;
- $output['#bundle'] = $bundle;
-
- $context = array(
- 'entity_type' => $entity_type,
- 'entity' => $entity,
- 'view_mode' => $view_mode,
- 'display' => $view_mode,
- 'language' => $langcode,
- );
- drupal_alter('field_attach_view', $output, $context);
-
-
-
- unset($entity->_field_view_prepared);
- return $output;
- }
- function field_attach_preprocess($entity_type, $entity, $element, &$variables) {
- list(, , $bundle) = entity_extract_ids($entity_type, $entity);
- foreach (field_info_instances($entity_type, $bundle) as $instance) {
- $field_name = $instance['field_name'];
- if (isset($element[$field_name]['#language'])) {
- $langcode = $element[$field_name]['#language'];
- $variables[$field_name] = isset($entity->{$field_name}[$langcode]) ? $entity->{$field_name}[$langcode] : NULL;
- }
- }
-
- $context = array(
- 'entity_type' => $entity_type,
- 'entity' => $entity,
- 'element' => $element,
- );
- drupal_alter('field_attach_preprocess', $variables, $context);
- }
- function field_attach_prepare_translation($entity_type, $entity, $langcode, $source_entity, $source_langcode) {
- $options = array('language' => $langcode);
-
- _field_invoke_default('prepare_translation', $entity_type, $entity, $source_entity, $source_langcode, $options);
-
- _field_invoke('prepare_translation', $entity_type, $entity, $source_entity, $source_langcode, $options);
-
- $context = array(
- 'entity_type' => $entity_type,
- 'langcode' => $langcode,
- 'source_entity' => $source_entity,
- 'source_langcode' => $source_langcode,
- );
- drupal_alter('field_attach_prepare_translation', $entity, $context);
- }
- function field_attach_create_bundle($entity_type, $bundle) {
-
- field_cache_clear();
-
- module_invoke_all('field_attach_create_bundle', $entity_type, $bundle);
- }
- function field_attach_rename_bundle($entity_type, $bundle_old, $bundle_new) {
- db_update('field_config_instance')
- ->fields(array('bundle' => $bundle_new))
- ->condition('entity_type', $entity_type)
- ->condition('bundle', $bundle_old)
- ->execute();
-
- field_cache_clear();
-
- $settings = variable_get('field_bundle_settings_' . $entity_type . '__' . $bundle_old, array());
- variable_set('field_bundle_settings_' . $entity_type . '__' . $bundle_new, $settings);
- variable_del('field_bundle_settings_' . $entity_type . '__' . $bundle_old);
-
- module_invoke_all('field_attach_rename_bundle', $entity_type, $bundle_old, $bundle_new);
- }
- function field_attach_delete_bundle($entity_type, $bundle) {
-
-
-
- $instances = field_read_instances(array('entity_type' => $entity_type, 'bundle' => $bundle), array('include_inactive' => 1));
- foreach ($instances as $instance) {
- field_delete_instance($instance);
- }
-
- field_cache_clear();
-
- variable_del('field_bundle_settings_' . $entity_type . '__' . $bundle);
-
- module_invoke_all('field_attach_delete_bundle', $entity_type, $bundle, $instances);
- }
|