diff --git a/field_conditional_state.admin.inc b/field_conditional_state.admin.inc index 317fdd8..5ceedc2 100644 --- a/field_conditional_state.admin.inc +++ b/field_conditional_state.admin.inc @@ -116,13 +116,17 @@ function field_conditional_state_settings_form($form, &$form_state, $instance) { '#type' => 'hidden', '#value' => $bundle, ); + $form['type'] = array( + '#type' => 'hidden', + '#value' => $entity_type, + ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Add condition'), '#name' => 'add_condition', ); - $field_conditional_states = field_conditional_state_get_field_conditions($instance['field_name'], $bundle); + $field_conditional_states = field_conditional_state_get_field_conditions($instance['field_name'], $bundle, $entity_type); if (isset($field_conditional_states)) { foreach ($field_conditional_states as $condition_id => $condition_settings) { $trigger_values = array(); @@ -177,13 +181,15 @@ function field_conditional_state_settings_form_validate($form, &$form_state) { $control_field = $form_state['values']['add_field_state']['control_field']; $state_type = $form_state['values']['add_field_state']['state_type']; $bundle = $form_state['values']['bundle']; + $type = $form_state['values']['type']; $query_args = array( - ':field_name' => $target_field, - ':control_field' => $control_field, - ':state' => $state_type, - ':bundle' => $bundle, + ':field_name' => $target_field, + ':control_field' => $control_field, + ':state' => $state_type, + ':bundle' => $bundle, + ':type' => $type ); - $result = db_query("SELECT count(*) AS count FROM {field_conditional_state} WHERE field_name = :field_name AND control_field = :control_field AND state = :state AND bundle = :bundle", $query_args)->fetchObject(); + $result = db_query("SELECT count(*) AS count FROM {field_conditional_state} WHERE field_name = :field_name AND control_field = :control_field AND state = :state AND bundle = :bundle AND type = :type", $query_args)->fetchObject(); if ($result->count > 0) { form_set_error("add_field_state][state_type", t("You already have this state type between these two fields.")); } @@ -207,6 +213,7 @@ function field_conditional_state_settings_form_submit($form, &$form_state) { else { $target_field = $form_state['values']['trigger_field']; $bundle = $form_state['values']['bundle']; + $type = $form_state['values']['type']; $values = $form_state['values']['add_field_state']; $state_type = $values['state_type']; $control_field = $values['control_field']; @@ -221,6 +228,7 @@ function field_conditional_state_settings_form_submit($form, &$form_state) { 'control_field' => $control_field, 'state' => $state_type, 'bundle' => $bundle, + 'type' => $type, 'trigger_values' => $control_values, 'condition_type' => $condition_type, )) diff --git a/field_conditional_state.install b/field_conditional_state.install index a135176..2912419 100644 --- a/field_conditional_state.install +++ b/field_conditional_state.install @@ -48,6 +48,12 @@ function field_conditional_state_schema() { 'not null' => TRUE, 'description' => 'The bundle type.', ), + 'type' => array( + 'type' => 'varchar', + 'length' => '32', + 'not null' => FALSE, + 'description' => 'The entity type.', + ), 'trigger_values' => array( 'type' => 'text', 'not null' => TRUE, @@ -77,3 +83,11 @@ function field_conditional_state_update_7100() { ); db_change_field('field_conditional_state', 'trigger_values', 'trigger_values', $spec); } +/** +* Updated schema to add entity type field to table +*/ +function field_conditional_state_update_7101(&$sandbox) { + $field_exists = db_field_exists('field_conditional_state', 'type'); + if (!$field_exists) + db_add_field('field_conditional_state', 'type', array('type' => 'varchar', 'length' => '32', 'not null' => FALSE, 'description' => 'The entity type.',)); +} diff --git a/field_conditional_state.module b/field_conditional_state.module index 2b52090..c862a5b 100644 --- a/field_conditional_state.module +++ b/field_conditional_state.module @@ -1,9 +1,19 @@ array( + 'name' => t('Field conditional state'), + 'default_hook' => 'field_conditional_state_default_fields', + 'default_file' => FEATURES_DEFAULTS_INCLUDED, + 'feature_source' => TRUE, + 'file' => drupal_get_path('module', 'field_conditional_state') . '/includes/field_conditional_state.features.inc', + ), + ); +} /** * Implements hook_menu(). @@ -78,21 +88,25 @@ function field_conditional_state_theme($existing, $type, $theme, $path) { */ function field_conditional_state_field_delete_instance($instance) { $bundle = $instance['bundle']; + $type = $instance['entity_type']; $instance_name = $instance['field_name']; $query_args = array( ':bundle' => $bundle, ':field_name' => $instance_name, ':control_field' => $instance_name, + ':type' => $type, ); - $result = db_query("SELECT count(*) AS count FROM {field_conditional_state} WHERE bundle = :bundle AND (field_name = :field_name OR control_field = :control_field)", $query_args)->fetchObject(); + $result = db_query("SELECT count(*) AS count FROM {field_conditional_state} WHERE type = :type AND bundle = :bundle AND (field_name = :field_name OR control_field = :control_field)", $query_args)->fetchObject(); // Delete conditions for deleted instance. if ($result->count > 0) { $delete_trigger_instance = db_delete('field_conditional_state') ->condition('field_name', $instance_name) + ->condition('type', $type) ->condition('bundle', $bundle) ->execute(); $delete_control_instance = db_delete('field_conditional_state') ->condition('control_field', $instance_name) + ->condition('type', $type) ->condition('bundle', $bundle) ->execute(); } @@ -102,12 +116,13 @@ function field_conditional_state_field_delete_instance($instance) { * Implements hook_field_attach_delete_bundle(). */ function field_conditional_state_field_attach_delete_bundle($entity_type, $bundle, $instances) { - $query_args = array(':bundle' => $bundle); - $result = db_query("SELECT count(*) AS count FROM {field_conditional_state} WHERE bundle = :bundle", $query_args)->fetchObject(); + $query_args = array(':bundle' => $bundle, ':type' => $entity_type); + $result = db_query("SELECT count(*) AS count FROM {field_conditional_state} WHERE bundle = :bundle AND type = :type", $query_args)->fetchObject(); // Delete conditions for deleted bundle. if ($result->count > 0) { $delete_trigger_field = db_delete('field_conditional_state') ->condition('bundle', $bundle, '=') + ->condition('type', $entity_type, '=') ->execute(); } } @@ -149,7 +164,7 @@ function field_conditional_state_entity_view($entity, $type, $view_mode, $langco if(!empty($entity->content)) { foreach ($entity->content as $field_name => $field_content) { if (is_array($field_content) && isset($field_content['#bundle'])) { - $field_conditions = field_conditional_state_get_field_conditions($field_name, $field_content['#bundle']); + $field_conditions = field_conditional_state_get_field_conditions($field_name, $field_content['#bundle'], $field_content['#entity_type']); $data = array($type, $view_mode, $langcode); drupal_alter('field_conditional_state_entity_view', $field_conditions, $entity, $data); if ($field_conditions) { @@ -176,7 +191,7 @@ function field_conditional_state_entity_view($entity, $type, $view_mode, $langco * Field Group module. */ function field_conditional_state_module_implements_alter(&$implementations, $hook) { - if ($hook == 'form_alter' && array_key_exists('field_conditional_state', $implementations)) { + if (($hook == 'form_alter' || $hook == 'element_info_alter' || $hook = 'features_api') && array_key_exists('field_conditional_state', $implementations)) { $group = $implementations['field_conditional_state']; unset($implementations['field_conditional_state']); $implementations['field_conditional_state'] = $group; @@ -248,7 +263,7 @@ function field_conditional_state_element_process($element, &$form_state, $form) * so if there are multiple instances of one field (field collections) they can be handled separately */ static $processed_fields = array(); - if (isset($element['#field_name']) && isset($element['#bundle']) && $form['#form_id'] != 'field_ui_field_edit_form') { + if (isset($element['#field_name']) && isset($element['#bundle']) && isset($element['#entity_type']) && $form['#form_id'] != 'field_ui_field_edit_form') { $indexed_field_name = $element['#field_name']; if(!isset($processed_fields[$indexed_field_name]) || count($processed_fields[$indexed_field_name]) == 0) @@ -263,14 +278,14 @@ function field_conditional_state_element_process($element, &$form_state, $form) $path = drupal_get_path('module', 'field_conditional_state'); $element['#attached']['js'][] = "$path/js/conditional_state.js"; $element['#attached']['js'][] = "$path/js/required_conditional_state.js"; - $control_field = field_conditional_state_is_control_field($element['#field_name'], $element['#bundle']); + $control_field = field_conditional_state_is_control_field($element['#field_name'], $element['#bundle'], $element['#entity_type']); // Check if element is control element. if ($control_field) { $element['#prefix'] = '
'; $element['#suffix'] = '
'; } // Get element conditions. - $element_conditions = field_conditional_state_get_field_conditions($element['#field_name'], $element['#bundle'], $element_field_name_index); + $element_conditions = field_conditional_state_get_field_conditions($element['#field_name'], $element['#bundle'], $element['#entity_type'], $element_field_name_index); if ($element_conditions) { $element_states = field_conditional_state_set_field_state($element_conditions); @@ -283,6 +298,7 @@ function field_conditional_state_element_process($element, &$form_state, $form) $function = $conditional_states[$state]['state_handler']; $form_element[$element['#field_name']] = $function($state, $condition, $form_element[$element['#field_name']], $element); $form_element[$element['#field_name']]['#bundle'] = $element['#bundle']; + $form_element[$element['#field_name']]['#entity_type'] = $element['#entity_type']; } } @@ -554,9 +570,9 @@ function field_conditional_state_get_bundle_types() { * @return bool * Returns true or false if the requested field is a control field. */ -function field_conditional_state_is_control_field($field_name, $bundle) { - $placeholders = array(':field_name' => $field_name, ':bundle' => $bundle); - $sql = db_query("SELECT COUNT(id) as count FROM {field_conditional_state} WHERE control_field = :field_name AND bundle = :bundle", $placeholders)->fetchObject(); +function field_conditional_state_is_control_field($field_name, $bundle, $type) { + $placeholders = array(':field_name' => $field_name, ':bundle' => $bundle, ':type' => $type); + $sql = db_query("SELECT COUNT(id) as count FROM {field_conditional_state} WHERE control_field = :field_name AND bundle = :bundle AND type = :type", $placeholders)->fetchObject(); if (isset($sql->count) && $sql->count > 0) { return TRUE; } @@ -575,9 +591,9 @@ function field_conditional_state_is_control_field($field_name, $bundle) { * @return array * An array of conditions. */ -function field_conditional_state_get_field_conditions($field_name, $bundle, $control_field_index = null) { +function field_conditional_state_get_field_conditions($field_name, $bundle, $type, $control_field_index = null) { $conditions = array(); - $result = db_query("SELECT * FROM {field_conditional_state} WHERE field_name = :field_name AND bundle = :bundle", array(':field_name' => $field_name, ':bundle' => $bundle)); + $result = db_query("SELECT * FROM {field_conditional_state} WHERE field_name = :field_name AND bundle = :bundle AND type = :type", array(':field_name' => $field_name, ':bundle' => $bundle, ':type' => $type)); foreach ($result as $res) { $conditions["condition_$res->id"] = array( 'id' => $res->id, diff --git a/includes/field_conditional_state.features.inc b/includes/field_conditional_state.features.inc new file mode 100644 index 0000000..99d7cee --- /dev/null +++ b/includes/field_conditional_state.features.inc @@ -0,0 +1,173 @@ +id"] = array( + 'id' => $res->id, + 'control_field' => $res->control_field, + 'field_name' => $res->field_name, + 'state' => $res->state, + 'trigger_values' => unserialize($res->trigger_values), + 'condition_type' => $res->condition_type, + 'bundle' => $res->bundle, + 'type' => $res->type, + ); + } + return $conditions; +} + +/** + * Implements hook_features_export(). + */ +function field_conditional_state_features_export($data, &$export, $module_name = '') { + $export['dependencies']['field_conditional_state'] = 'field_conditional_state'; + + foreach ($data as $entity) { + $export['features']['field_conditional_state'][$entity] = $entity; + } +} + +/** + * Implements hook_features_export_render(). + */ +function field_conditional_state_features_export_render($module_name, $data, $export = NULL) { + $dependencies = field_conditional_state_load_conditions(); + if (empty($dependencies)) { + return array(); + } + + $code = array(); + foreach ($data as $option) { + $tokens = explode(':', $option); + + if (count($tokens) < 5) + continue; + + $field_name = $tokens[0]; + $control_field = $tokens[1]; + $state = $tokens[2]; + $bundle = $tokens[3]; + $type = $tokens[4]; + + $info = field_conditional_state_get_field_conditions($field_name, $bundle, $type); + + if (!empty($info)) { + foreach ($info as $field_conditions) { + //$key = $type."-".$bundle."-".$field_name."-".$type."-".$control_field; + $code[] = ''; + $code[] = ' $items[] = array('; + $code[] = " 'type' => '" . $type . "',"; + $code[] = " 'bundle' => '" . $bundle . "',"; + $code[] = " 'field_name' => '" . $field_name . "',"; + $code[] = " 'control_field' => '" . $control_field . "',"; + $code[] = " 'state' => '" . $state . "',"; + $code[] = " 'condition_type' => '" . $field_conditions['condition_type'] . "',"; + $code[] = " 'trigger_values' => " . features_var_export($field_conditions['trigger_values'], ' ') . ","; + $code[] = ' );'; + } + } + } + if (empty($code)) { + return array(); + } + + array_unshift($code, ' $items = array();'); + $code[] = ''; + $code[] = ' return $items;'; + $output = implode("\n", $code); + + return array('field_conditional_state_default_fields' => $output); +} + +/** + * Implements hook_features_rebuild(). + */ +function field_conditional_state_features_rebuild($module) { + $defaults = module_invoke($module, 'field_conditional_state_default_fields'); + + if (!empty($defaults)) { + + foreach ($defaults as $condition) { + + //insert if not exists + $existing_conditions = field_conditional_state_get_field_conditions($condition['field_name'], $condition['bundle'], $condition['type']); + + //check if this condition already exists, that means the control field and the state must be equal for the fieldname, bundle and type + $exists = false; + foreach ($existing_conditions as $existing_condition) { + if ($existing_condition['control_field'] == $condition['control_field'] && $existing_condition['state'] == $condition['state']) { + $exists = true; + } + } + + if (!$exists) { + db_insert('field_conditional_state')->fields(array( + 'field_name' => $condition['field_name'], + 'control_field' => $condition['control_field'], + 'state' => $condition['state'], + 'bundle' => $condition['bundle'], + 'type' => $condition['type'], + 'trigger_values' => serialize($condition['trigger_values']), + 'condition_type' => $condition['condition_type'], + )) + ->execute(); + } + } + } +} + + +/** + * Implements hook_features_revert(). + */ +function field_conditional_state_features_revert($module) { + return field_conditional_state_features_rebuild($module); +}