12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232 |
- <?php
- class FieldException extends Exception {}
- require_once DRUPAL_ROOT . '/modules/field/field.crud.inc';
- require_once DRUPAL_ROOT . '/modules/field/field.default.inc';
- require_once DRUPAL_ROOT . '/modules/field/field.info.inc';
- require_once DRUPAL_ROOT . '/modules/field/field.multilingual.inc';
- require_once DRUPAL_ROOT . '/modules/field/field.attach.inc';
- require_once DRUPAL_ROOT . '/modules/field/field.form.inc';
- define('FIELD_CARDINALITY_UNLIMITED', -1);
- define('FIELD_BEHAVIOR_NONE', 0x0001);
- define('FIELD_BEHAVIOR_DEFAULT', 0x0002);
- define('FIELD_BEHAVIOR_CUSTOM', 0x0004);
- define('FIELD_LOAD_CURRENT', 'FIELD_LOAD_CURRENT');
- define('FIELD_LOAD_REVISION', 'FIELD_LOAD_REVISION');
- class FieldUpdateForbiddenException extends FieldException {}
- function field_help($path, $arg) {
- switch ($path) {
- case 'admin/help#field':
- $output = '';
- $output .= '<h3>' . t('About') . '</h3>';
- $output .= '<p>' . t('The Field module allows custom data fields to be defined for <em>entity</em> types (entities include content items, comments, user accounts, and taxonomy terms). The Field module takes care of storing, loading, editing, and rendering field data. Most users will not interact with the Field module directly, but will instead use the <a href="@field-ui-help">Field UI module</a> user interface. Module developers can use the Field API to make new entity types "fieldable" and thus allow fields to be attached to them. For more information, see the online handbook entry for <a href="@field">Field module</a>.', array('@field-ui-help' => url('admin/help/field_ui'), '@field' => 'http://drupal.org/documentation/modules/field')) . '</p>';
- $output .= '<h3>' . t('Uses') . '</h3>';
- $output .= '<dl>';
- $output .= '<dt>' . t('Enabling field types') . '</dt>';
- $output .= '<dd>' . t('The Field module provides the infrastructure for fields and field attachment; the field types and input widgets themselves are provided by additional modules. Some of the modules are required; the optional modules can be enabled from the <a href="@modules">Modules administration page</a>. Drupal core includes the following field type modules: Number (required), Text (required), List (required), Taxonomy (optional), Image (optional), and File (optional); the required Options module provides input widgets for other field modules. Additional fields and widgets may be provided by contributed modules, which you can find in the <a href="@contrib">contributed module section of Drupal.org</a>. Currently enabled field and input widget modules:', array('@modules' => url('admin/modules'), '@contrib' => 'http://drupal.org/project/modules', '@options' => url('admin/help/options')));
-
-
- $items = array();
- $info = system_get_info('module');
- $modules = array_merge(module_implements('field_info'), module_implements('field_widget_info'));
- $modules = array_unique($modules);
- sort($modules);
- foreach ($modules as $module) {
- $display = $info[$module]['name'];
- if (module_hook($module, 'help')) {
- $items['items'][] = l($display, 'admin/help/' . $module);
- }
- else {
- $items['items'][] = $display;
- }
- }
- $output .= theme('item_list', $items) . '</dd>';
- $output .= '<dt>' . t('Managing field data storage') . '</dt>';
- $output .= '<dd>' . t('Developers of field modules can either use the default <a href="@sql-store">Field SQL storage module</a> to store data for their fields, or a contributed or custom module developed using the <a href="@storage-api">field storage API</a>.', array('@storage-api' => 'http://api.drupal.org/api/group/field_storage/7', '@sql-store' => url('admin/help/field_sql_storage'))) . '</dd>';
- $output .= '</dl>';
- return $output;
- }
- }
- function field_permission() {
- return array(
- 'administer fields' => array(
- 'title' => t('Administer fields'),
- 'description' => t('Additional permissions are required based on what the fields are attached to (for example, <a href="@url">administer content types</a> to manage fields attached to content).', array(
- '@url' => '#module-node',
- )),
- 'restrict access' => TRUE,
- ),
- );
- }
- function field_theme() {
- return array(
- 'field' => array(
- 'render element' => 'element',
- ),
- 'field_multiple_value_form' => array(
- 'render element' => 'element',
- ),
- );
- }
- function field_cron() {
-
- field_sync_field_status();
-
- $limit = variable_get('field_purge_batch_size', 10);
- field_purge_batch($limit);
- }
- function field_system_info_alter(&$info, $file, $type) {
- if ($type == 'module' && module_hook($file->name, 'field_info')) {
- $fields = field_read_fields(array('module' => $file->name), array('include_deleted' => TRUE));
- if ($fields) {
- $info['required'] = TRUE;
-
-
- $non_deleted = FALSE;
- foreach ($fields as $field) {
- if (empty($field['deleted'])) {
- $non_deleted = TRUE;
- break;
- }
- }
- if ($non_deleted) {
- if (module_exists('field_ui')) {
- $explanation = t('Field type(s) in use - see <a href="@fields-page">Field list</a>', array('@fields-page' => url('admin/reports/fields')));
- }
- else {
- $explanation = t('Fields type(s) in use');
- }
- }
- else {
- $explanation = t('Fields pending deletion');
- }
- $info['explanation'] = $explanation;
- }
- }
- }
- function field_flush_caches() {
-
- field_sync_field_status();
-
- return array('cache_field');
- }
- function field_modules_enabled($modules) {
-
- field_sync_field_status();
- }
- function field_modules_disabled($modules) {
-
- field_sync_field_status();
- }
- function field_sync_field_status() {
-
-
- $modules = module_list();
- foreach ($modules as $module_name) {
- field_associate_fields($module_name);
- }
- db_update('field_config')
- ->fields(array('active' => 0))
- ->condition('module', $modules, 'NOT IN')
- ->execute();
- db_update('field_config')
- ->fields(array('storage_active' => 0))
- ->condition('storage_module', $modules, 'NOT IN')
- ->execute();
- }
- function field_associate_fields($module) {
-
- $field_types = (array) module_invoke($module, 'field_info');
- if ($field_types) {
- db_update('field_config')
- ->fields(array('module' => $module, 'active' => 1))
- ->condition('type', array_keys($field_types))
- ->execute();
- }
-
- $storage_types = (array) module_invoke($module, 'field_storage_info');
- if ($storage_types) {
- db_update('field_config')
- ->fields(array('storage_module' => $module, 'storage_active' => 1))
- ->condition('storage_type', array_keys($storage_types))
- ->execute();
- }
- }
- function field_get_default_value($entity_type, $entity, $field, $instance, $langcode = NULL) {
- $items = array();
- if (!empty($instance['default_value_function'])) {
- $function = $instance['default_value_function'];
- if (function_exists($function)) {
- $items = $function($entity_type, $entity, $field, $instance, $langcode);
- }
- }
- elseif (!empty($instance['default_value'])) {
- $items = $instance['default_value'];
- }
- return $items;
- }
- function _field_filter_items($field, $items) {
- $function = $field['module'] . '_field_is_empty';
- foreach ((array) $items as $delta => $item) {
-
- if ($function($item, $field)) {
- unset($items[$delta]);
- }
- }
- return array_values($items);
- }
- function _field_sort_items($field, $items) {
- if (($field['cardinality'] > 1 || $field['cardinality'] == FIELD_CARDINALITY_UNLIMITED) && isset($items[0]['_weight'])) {
- usort($items, '_field_sort_items_helper');
- foreach ($items as $delta => $item) {
- if (is_array($items[$delta])) {
- unset($items[$delta]['_weight']);
- }
- }
- }
- return $items;
- }
- function _field_sort_items_helper($a, $b) {
- $a_weight = (is_array($a) ? $a['_weight'] : 0);
- $b_weight = (is_array($b) ? $b['_weight'] : 0);
- return $a_weight - $b_weight;
- }
- function _field_sort_items_value_helper($a, $b) {
- $a_weight = (is_array($a) && isset($a['_weight']['#value']) ? $a['_weight']['#value'] : 0);
- $b_weight = (is_array($b) && isset($b['_weight']['#value']) ? $b['_weight']['#value'] : 0);
- return $a_weight - $b_weight;
- }
- function field_bundle_settings($entity_type, $bundle, $settings = NULL) {
- if (isset($settings)) {
- variable_set('field_bundle_settings_' . $entity_type . '__' . $bundle, $settings);
- field_info_cache_clear();
- }
- else {
- $settings = variable_get('field_bundle_settings_' . $entity_type . '__' . $bundle, array());
- $settings += array(
- 'view_modes' => array(),
- 'extra_fields' => array(),
- );
- $settings['extra_fields'] += array(
- 'form' => array(),
- 'display' => array(),
- );
- return $settings;
- }
- }
- function field_view_mode_settings($entity_type, $bundle) {
- $cache = &drupal_static(__FUNCTION__, array());
- if (!isset($cache[$entity_type][$bundle])) {
- $bundle_settings = field_bundle_settings($entity_type, $bundle);
- $settings = $bundle_settings['view_modes'];
-
-
-
- $entity_info = entity_get_info($entity_type);
- foreach ($entity_info['view modes'] as $view_mode => $view_mode_info) {
- if (!isset($settings[$view_mode]['custom_settings']) && $view_mode_info['custom settings']) {
- $settings[$view_mode]['custom_settings'] = TRUE;
- }
- }
- $cache[$entity_type][$bundle] = $settings;
- }
- return $cache[$entity_type][$bundle];
- }
- function field_get_display($instance, $view_mode, $entity) {
-
-
- $view_mode_settings = field_view_mode_settings($instance['entity_type'], $instance['bundle']);
- $actual_mode = (!empty($view_mode_settings[$view_mode]['custom_settings']) ? $view_mode : 'default');
- $display = $instance['display'][$actual_mode];
-
- $context = array(
- 'entity_type' => $instance['entity_type'],
- 'field' => field_info_field($instance['field_name']),
- 'instance' => $instance,
- 'entity' => $entity,
- 'view_mode' => $view_mode,
- );
- drupal_alter(array('field_display', 'field_display_' . $instance['entity_type']), $display, $context);
- return $display;
- }
- function field_extra_fields_get_display($entity_type, $bundle, $view_mode) {
-
-
- $view_mode_settings = field_view_mode_settings($entity_type, $bundle);
- $actual_mode = (!empty($view_mode_settings[$view_mode]['custom_settings'])) ? $view_mode : 'default';
- $extra_fields = field_info_extra_fields($entity_type, $bundle, 'display');
- $displays = array();
- foreach ($extra_fields as $name => $value) {
- $displays[$name] = $extra_fields[$name]['display'][$actual_mode];
- }
-
- $context = array(
- 'entity_type' => $entity_type,
- 'bundle' => $bundle,
- 'view_mode' => $view_mode,
- );
- drupal_alter('field_extra_fields_display', $displays, $context);
- return $displays;
- }
- function _field_extra_fields_pre_render($elements) {
- $entity_type = $elements['#entity_type'];
- $bundle = $elements['#bundle'];
- if (isset($elements['#type']) && $elements['#type'] == 'form') {
- $extra_fields = field_info_extra_fields($entity_type, $bundle, 'form');
- foreach ($extra_fields as $name => $settings) {
- if (isset($elements[$name])) {
- $elements[$name]['#weight'] = $settings['weight'];
- }
- }
- }
- elseif (isset($elements['#view_mode'])) {
- $view_mode = $elements['#view_mode'];
- $extra_fields = field_extra_fields_get_display($entity_type, $bundle, $view_mode);
- foreach ($extra_fields as $name => $settings) {
- if (isset($elements[$name])) {
- $elements[$name]['#weight'] = $settings['weight'];
-
- $elements[$name]['#access'] = isset($elements[$name]['#access']) ? ($elements[$name]['#access'] && $settings['visible']) : $settings['visible'];
- }
- }
- }
- return $elements;
- }
- function field_cache_clear() {
- cache_clear_all('*', 'cache_field', TRUE);
- field_info_cache_clear();
- }
- function field_filter_xss($string) {
- return filter_xss($string, _field_filter_xss_allowed_tags());
- }
- function _field_filter_xss_allowed_tags() {
- return array('a', 'b', 'big', 'code', 'del', 'em', 'i', 'ins', 'pre', 'q', 'small', 'span', 'strong', 'sub', 'sup', 'tt', 'ol', 'ul', 'li', 'p', 'br', 'img');
- }
- function _field_filter_xss_display_allowed_tags() {
- return '<' . implode('> <', _field_filter_xss_allowed_tags()) . '>';
- }
- function field_view_value($entity_type, $entity, $field_name, $item, $display = array(), $langcode = NULL) {
- $output = array();
- if ($field = field_info_field($field_name)) {
-
- $langcode = field_language($entity_type, $entity, $field_name, $langcode);
-
-
- $clone = clone $entity;
- $clone->{$field_name}[$langcode] = array($item);
- $elements = field_view_field($entity_type, $clone, $field_name, $display, $langcode);
-
- $output = isset($elements[0]) ? $elements[0] : array();
- if (isset($elements['#access'])) {
- $output['#access'] = $elements['#access'];
- }
- }
- return $output;
- }
- function field_view_field($entity_type, $entity, $field_name, $display = array(), $langcode = NULL) {
- $output = array();
- if ($field = field_info_field($field_name)) {
- if (is_array($display)) {
-
- $cache = _field_info_field_cache();
- $display = $cache->prepareInstanceDisplay($display, $field["type"]);
- }
-
-
-
-
- $display_language = field_language($entity_type, $entity, $field_name, $langcode);
- $options = array('field_name' => $field_name, 'language' => $display_language);
- $null = NULL;
-
- if (empty($entity->_field_view_prepared)) {
- list($id) = entity_extract_ids($entity_type, $entity);
-
- _field_invoke_multiple('prepare_view', $entity_type, array($id => $entity), $display, $null, $options);
-
- _field_invoke_multiple_default('prepare_view', $entity_type, array($id => $entity), $display, $null, $options);
- }
-
- $result = _field_invoke_default('view', $entity_type, $entity, $display, $null, $options);
-
-
- $context = array(
- 'entity_type' => $entity_type,
- 'entity' => $entity,
- 'view_mode' => '_custom',
- 'display' => $display,
- 'language' => $langcode,
- );
- drupal_alter('field_attach_view', $result, $context);
- if (isset($result[$field_name])) {
- $output = $result[$field_name];
- }
- }
- return $output;
- }
- function field_get_items($entity_type, $entity, $field_name, $langcode = NULL) {
- $langcode = field_language($entity_type, $entity, $field_name, $langcode);
- return isset($entity->{$field_name}[$langcode]) ? $entity->{$field_name}[$langcode] : FALSE;
- }
- function field_has_data($field) {
- $query = new EntityFieldQuery();
- $query = $query->fieldCondition($field)
- ->range(0, 1)
- ->count()
-
-
-
- ->addTag('DANGEROUS_ACCESS_CHECK_OPT_OUT');
- return (bool) $query
- ->execute() || (bool) $query
- ->age(FIELD_LOAD_REVISION)
- ->execute();
- }
- function field_access($op, $field, $entity_type, $entity = NULL, $account = NULL) {
- global $user;
- if (!isset($account)) {
- $account = $user;
- }
- foreach (module_implements('field_access') as $module) {
- $function = $module . '_field_access';
- $access = $function($op, $field, $entity_type, $entity, $account);
- if ($access === FALSE) {
- return FALSE;
- }
- }
- return TRUE;
- }
- function field_extract_bundle($entity_type, $bundle) {
- if (is_string($bundle)) {
- return $bundle;
- }
- $info = entity_get_info($entity_type);
- if (is_object($bundle) && isset($info['bundle keys']['bundle']) && isset($bundle->{$info['bundle keys']['bundle']})) {
- return $bundle->{$info['bundle keys']['bundle']};
- }
- }
- function template_preprocess_field(&$variables, $hook) {
- $element = $variables['element'];
-
-
-
-
-
-
- $variables['label_hidden'] = ($element['#label_display'] == 'hidden');
- $variables['label'] = $variables['label_hidden'] ? NULL : check_plain($element['#title']);
-
-
-
-
-
- $variables['items'] = array();
- foreach ($element['#items'] as $delta => $item) {
- if (!empty($element[$delta])) {
- $variables['items'][$delta] = $element[$delta];
- }
- }
-
-
-
- $variables['field_name_css'] = strtr($element['#field_name'], '_', '-');
- $variables['field_type_css'] = strtr($element['#field_type'], '_', '-');
- $variables['classes_array'] = array(
- 'field',
- 'field-name-' . $variables['field_name_css'],
- 'field-type-' . $variables['field_type_css'],
- 'field-label-' . $element['#label_display'],
- );
-
-
- if ($element['#label_display'] == 'inline') {
- $variables['classes_array'][] = 'clearfix';
- }
-
- $variables['theme_hook_suggestions'] = array(
- 'field__' . $element['#field_type'],
- 'field__' . $element['#field_name'],
- 'field__' . $element['#bundle'],
- 'field__' . $element['#field_name'] . '__' . $element['#bundle'],
- );
- }
- function template_process_field(&$variables, $hook) {
-
-
-
-
-
- $variables['classes'] = implode(' ', $variables['classes_array']);
- $variables['attributes'] = empty($variables['attributes_array']) ? '' : drupal_attributes($variables['attributes_array']);
- $variables['title_attributes'] = empty($variables['title_attributes_array']) ? '' : drupal_attributes($variables['title_attributes_array']);
- $variables['content_attributes'] = empty($variables['content_attributes_array']) ? '' : drupal_attributes($variables['content_attributes_array']);
- foreach ($variables['items'] as $delta => $item) {
- $variables['item_attributes'][$delta] = empty($variables['item_attributes_array'][$delta]) ? '' : drupal_attributes($variables['item_attributes_array'][$delta]);
- }
- }
- function theme_field($variables) {
- $output = '';
-
- if (!$variables['label_hidden']) {
- $output .= '<div class="field-label"' . $variables['title_attributes'] . '>' . $variables['label'] . ': </div>';
- }
-
- $output .= '<div class="field-items"' . $variables['content_attributes'] . '>';
- foreach ($variables['items'] as $delta => $item) {
- $classes = 'field-item ' . ($delta % 2 ? 'odd' : 'even');
- $output .= '<div class="' . $classes . '"' . $variables['item_attributes'][$delta] . '>' . drupal_render($item) . '</div>';
- }
- $output .= '</div>';
-
- $output = '<div class="' . $variables['classes'] . '"' . $variables['attributes'] . '>' . $output . '</div>';
- return $output;
- }
- function _element_validate_integer($element, &$form_state) {
- element_validate_integer($element, $form_state);
- }
- function _element_validate_integer_positive($element, &$form_state) {
- element_validate_integer_positive($element, $form_state);
- }
- function _element_validate_number($element, &$form_state) {
- element_validate_number($element, $form_state);
- }
|