diff --git a/tode.module b/tode.module index 38d50aaa..90db853e 100644 --- a/tode.module +++ b/tode.module @@ -55,7 +55,6 @@ function tode_init() { /** * Implementation of hook_field_widget_info(). */ -# BUG PLUS function tode_field_widget_info() { return array( @@ -79,10 +78,9 @@ function tode_field_widget_info() { /** * Implementation of hook_widget_settings */ -#hook_field_widget_settings_form($field, $instance) function tode_field_widget_settings_form($field, $instance){ - dsm($instance, 'tode_field_widget_settings_form : $instance'); - dsm($field, 'field'); + // dsm($instance, 'tode_field_widget_settings_form : $instance'); + // dsm($field, 'field'); $widget = $instance['widget']; $settings = $widget['settings']; @@ -102,11 +100,11 @@ function tode_field_widget_settings_form($field, $instance){ /* TODO complete the all flow of this */ - // $form['show_term_form'] = array( - // '#type' => 'checkbox', - // '#title' => t('Show taxonomy term edit form ?'), - // '#default_value' => $settings['show_term_form'], - // ); + $form['show_term_form'] = array( + '#type' => 'checkbox', + '#title' => t('Show taxonomy term edit form ?'), + '#default_value' => $settings['show_term_form'], + ); $form['choose_term_parent'] = array( '#type' => 'checkbox', @@ -146,7 +144,7 @@ function _tode_widget_settings_maxlength_validate($element, &$form_state) { */ #hook_element_info() WHY ?? /* -function tode_element_info() { +function tode_element_info(){ return array( 'tode' => array( '#input' => TRUE, @@ -162,7 +160,7 @@ function tode_element_info() { * Implementation of hook_field_widget_form(). */ function tode_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) { - // dsm('tode_field_widget_form'); + // dsm('- - - - tode_field_widget_form'); // dsm($form, '&$form'); // dsm($form_state, '&$form_state'); // dsm($items, 'items'); @@ -170,22 +168,30 @@ function tode_field_widget_form(&$form, &$form_state, $field, $instance, $langco // dsm($field, '$field'); // dsm($instance, '$instance'); + + $node = $form_state['node']; + // dsm($node, '$node'); + if(isset($items[$delta])){ $term = taxonomy_term_load($items[$delta]['tid']); + // $term = i18n_taxonomy_term_get_translation($term, $node->language); // marche pas avec localized term // dsm($term, '$term'); $term_parents = taxonomy_get_parents($term->tid); - dsm($term_parents, '$term_parents'); + // dsm($term_parents, '$term_parents'); $term_parent = array_pop($term_parents); } + # no need of $node->translation_source because with node translation (not entity fields translation) tid remains + # just have to translate term name on submit + // if( !isset($node->id) && isset($node->translation_source) ){ + // } + $form['tode_tid'] = array('#type' => 'hidden', '#value' => isset($term) ? $term->tid : 0,'#delta' => $element['#delta'],); - - - // add parent form autocomplete if activated - if($instance['widget']['settings']['choose_term_parent']){ - + + # parent + if( $instance['widget']['settings']['choose_term_parent'] ){ + // add parent form autocomplete if activated $vocabularies = array(); - foreach ($field['settings']['allowed_values'] as $tree) if ($vocabulary = taxonomy_vocabulary_machine_name_load($tree['vocabulary'])) $vocabularies[$vocabulary->vid] = $vocabulary; @@ -202,27 +208,33 @@ function tode_field_widget_form(&$form, &$form_state, $field, $instance, $langco '#autocomplete_path' => 'taxonomy/autocomplete' . '/' . $field['field_name'], '#size' => 60, '#maxlength' => 1024, - '#element_validate' => array('tode_autocomplete_validate'), + '#element_validate' => array('tode_parent_autocomplete_validate'), ); + }else{ + // if parent selection not enabled set the current parent as hidden input + $form['tode_parent_term'] = array( + '#type' => 'hidden', + '#value' => isset($term_parent) ? $term_parent->name : '', + '#delta' => $element['#delta'], + ); } // set element form item $element += array( '#type' => 'textfield', - '#default_value' => isset($term) ? $term->name : '', + '#default_value' => isset($term) ? i18n_taxonomy_term_name($term, $node->language) : '', '#size' => $instance['widget']['settings']['size'], '#maxlength' => $instance['widget']['settings']['maxlength'], '#element_validate' => array('tode_validate'), ); - # add the term edit form - // if($term_tid) - // _tode_add_term_form($element, $term, $instance['widget']['settings']['show_term_form']); + if(isset($term)) + _tode_add_term_form($form, $term, $instance, $element['#delta']); - // dsm($element, '$element'); + // dsm($form, 'end tode_field_widget_form :: $form'); return $element; } @@ -233,72 +245,47 @@ function tode_field_widget_form(&$form, &$form_state, $field, $instance, $langco * show the complete taxonomy term form if feature is enabled * */ -# note available yet with 7.x -function _tode_add_term_form(&$element, $term, $show){ +function _tode_add_term_form(&$form, $term, $instance, $delta){ + // dsm('- - - - _tode_add_term_form'); module_load_include('inc', 'taxonomy', 'taxonomy.admin'); $term_form = _tode_term_form($term); - dsm($term_form, 'term_form'); + // dsm($term_form, 'term_form'); if($term_form){ - // - // $term_form['identification']['#prefix'] = '
'; - // $term_form['identification']['#suffix'] = '
'; - // $term_form['advanced']['synonyms']['#prefix'] = '
'; - // $term_form['advanced']['synonyms']['#suffix'] = '
'; - // $term_form['advanced']['weight']['#prefix'] = '
'; - // $term_form['advanced']['weight']['#suffix'] = '
'; - // $term_form['advanced']['parent']['#prefix'] = '
'; - // $term_form['advanced']['parent']['#suffix'] = '
'; - // $term_form['advanced']['relations']['#prefix'] = '
'; - // $term_form['advanced']['relations']['#suffix'] = '
'; - // - // # change appearence of adavnced fiedset to show both fiedlset inline - // $term_form['advanced']['#collapsible'] = FALSE; - // $term_form['fields']['#collapsible'] = FALSE; - // - // _tode_trim_options($term_form, 'advanced'); - // $term_form['advanced']['#attributes'] = array('class'=>'tcu-advanced-options'); - // $term_form['fields']['#attributes'] = array('class'=>'tcu-term-fields'); - // - // foreach($term_form['fields'] as $field_name => $field){ - // if($field['#type'] == 'textfield') - // $field['#size'] = 30; - // - // $term_form['fields'][$field_name] = $field; - // } - // - // unset($term_form['submit']); - // unset($term_form['delete']); - // - // #unset vid info 'cause is in conflict with the node's vid field - // // unset($term_form['vid']); - $element['term_form'] = array( + unset($term_form['actions']); + unset($term_form['#action']); + unset($term_form['#method']); + + #unset vid info 'cause is in conflict with the node's vid field + unset($term_form['vid']); + + $term_form = _tode_clean_form($term_form); + + $prefix = 'tode_termform_'.$instance['field_name']; + $term_form = _tode_prefix_form($term_form, $prefix.'_'); + + $visible = $instance['widget']['settings']['show_term_form']; + + $form[$prefix] = array( '#type' => 'fieldset', '#title' => t('Term edit'), '#tree' => TRUE, '#collapsible' => TRUE, '#collapsed' => FALSE, '#weight'=>1, - '#group'=>'additional_settings', + // '#group'=>'additional_settings', + '#prefix' => $visible ? null : '
', + '#suffix' => $visible ? null : '
', ); - - // if(!$show){ - // $element['term_form']['#prefix'] = '
'; - // $element['term_form']['#suffix'] = '
'; - // } + + $form[$prefix] += $term_form; - $term_form = _tode_prefix_form($term_form, 'tode_termform_'.$element['#field_name'].'_'); - $element['term_form'] += $term_form; - $element['tode_termform'] = array('#type' => 'hidden', '#value' => 'true','#delta' => $element['#delta'],); + // $form['tode_termform'] = array('#type' => 'hidden', '#value' => 'true','#delta' => $delta,); - // $element['#prefix'] = '
'; - // $element['#suffix'] = '
'; - - dsm($element, 'element'); } } @@ -307,12 +294,12 @@ function _tode_add_term_form(&$element, $term, $show){ /** * Form element validate handler for tode parent term autocomplete element. */ -function tode_autocomplete_validate($element, &$form_state) { - // dsm('tode_autocomplete_validate'); +function tode_parent_autocomplete_validate($element, &$form_state) { + // dsm('- - - - tode_autocomplete_validate'); // dsm($element, '$element'); // dsm($form_state, '$form_state'); - $value = null; + $value = array(); if ($typed_term = $element['#value']) { // Translate term names into actual terms. // See if the term exists in the chosen vocabulary and return the tid; @@ -326,6 +313,7 @@ function tode_autocomplete_validate($element, &$form_state) { } } // + // dsm('form_set_value'); form_set_value($element, $value, $form_state); } @@ -335,10 +323,12 @@ function tode_autocomplete_validate($element, &$form_state) { * parses input and sets the values as needed (tid) for storing the data */ function tode_validate($element, &$form_state){ - // dsm('tode_validate'); + // dsm('- - - - tode_validate'); // dsm($form_state, 'form_state'); // dsm($element, 'element'); - + + $node = $form_state['node']; + /* TODO term translation (entity translate + node title question) */ @@ -355,32 +345,33 @@ function tode_validate($element, &$form_state){ } } + // get the parent term tid or 0 (no parents) + $parent_tid = isset($form_state['values']['tode_parent_term']['tid']) ? $form_state['values']['tode_parent_term']['tid'] : 0; + // See if the term already exists and load the term // otherwise, create a new 'autocreate' term for insert. if($tid = $form_state['values']['tode_tid']){ $term = taxonomy_term_load($tid); + + $term->name = $typed_term; + $term->parent = $parent_tid; + }else{ $vocabulary = reset($vocabularies); - $term = array( - 'tid' => 'autocreate', + $term = (object)array( + // 'tid' => 'autocreate', // autocreate not nbeeded with direct taxonomy_term_save 'vid' => $vocabulary->vid, 'name' => $typed_term, 'vocabulary_machine_name' => $vocabulary->machine_name, + 'parent' => $parent_tid, ); - } - - // save the parent term if provided - if($parent_term = $form_state['values']['tode_parent_term']){ - dsm($parent_term, 'tode_parent_term'); - $term->parent = $parent_term['tid']; - taxonomy_term_save($term); + taxonomy_term_save($term); // save here the new term to directly get the tid on hook_node_validate } // dsm($term, '$term'); - $value = (array)$term; - } + // dsm($value, '$value'); form_set_value($element, $value, $form_state); } @@ -399,62 +390,87 @@ function tode_field_widget_error($element, $error, $form, &$form_state) { * use to save the all term form (steel have to be debuged) * */ -function __tode_node_validate($node, $form){ - - module_load_include('inc', 'taxonomy', 'taxonomy.admin'); - - dsm('tode_node_validate'); - dsm($node, '&node'); - dsm($form, '&form'); +function tode_node_validate($node, $form, &$form_state){ + // dsm('- - - tode_node_validate'); + // dsm($node, '$node'); + // dsm($form, '$form'); + // dsm($form_state, '$form_state'); + module_load_include('inc', 'taxonomy', 'taxonomy.admin'); + // module_load_include('inc', 'i18n_string', 'i18n_string.pages'); + // $tode_fields = _tode_get_tode_fields_def($node); - dsm($tode_fields, '$tode_fields'); + // dsm($tode_fields, '$tode_fields'); - # OK - /* if(!count($tode_fields)) return; - + + $language = $node->language; + + $default_language = language_default('language'); + // dsm($default_language, '$default_language'); + foreach ($tode_fields as $field_name => $field) { - $values = array(); - $prefix = 'tode_termform_'.$field_name.'_'; - foreach ($node as $key => $value) { - if(strpos($key, $prefix) !== FALSE) - $values[$key] = $value; + + // retreive the prefixed termfom values (hidden or visible) + $prefix = 'tode_termform_'.$field_name; + + // if we do not have the term form (node creation) + if( !isset($form_state['values'][$prefix]) ){ + $tode_field_term_value = $form_state['values'][$field_name]['und'][0]; // on node creation field language is always to und (sure ?) + + // test the language, if not default language create the term name translation + if( $form_state['values']['language'] != 'und' || $form_state['values']['language'] != $default_language){ + $context= array('term',$tode_field_term_value['tid'],'name'); + i18n_string_textgroup('taxonomy')->update_translation($context, $language, $tode_field_term_value['name']); + } + + continue; + }else{ + // retreive the initial tode_field language + $init_language = $form[$field_name]['#language']; + + // retreive the value of term field, to get the typed term name + $tode_field_term_value = $form_state['values'][$field_name][$init_language][0]; + // dsm($tode_field_term_value, '$tode_field_term_value'); + + $values = _tode_prefix_form($form_state['values'][$prefix], $prefix.'_', FALSE); + // dsm($values, 'values'); + + if($language == 'und' || $language == $default_language || !module_exists('i18n_taxonomy')){ + + // define the form_state for term_form submit + $new_term_form_state = array( + 'build_info'=>array( + 'args'=>array(0=>(object)$tode_field_term_value), + ), + "values"=>array( + 'name'=> $tode_field_term_value['name'], // replace the original (hidden) term name value by the typed in the the entity field + 'op'=> t('Save'), + ) + ); + // add new values to form_state + $new_term_form_state['values'] += $values; + + // dsm($new_term_form_state, 'form_state'); + drupal_form_submit('taxonomy_form_term', $new_term_form_state); + }else{ + + $context= array('term',$values['tid'],'name'); + + i18n_string_textgroup('taxonomy')->update_translation($context, $language, $tode_field_term_value['name']); + } } - // dsm($values, 'values'); - $values = _tode_prefix_form($values, $prefix, FALSE); - // dsm($values, 'values'); - - $array_term = (array)taxonomy_get_term($values['tid']); - - foreach ($values as $key => $value) { - if(is_array($value)) - $values += $value; - } - - $array_term = (array)taxonomy_get_term($values['tid']); - - // dsm($values, 'values'); - - $form_state = array(); - $form_state['values'] = $values; - $form_state['values']['op'] = t('Save'); - - // dsm($form_state, 'form_state'); - - drupal_execute('taxonomy_form_term', $form_state, taxonomy_vocabulary_load($array_term['vid']), $array_term); } - */ } /** * theme_tode * */ -// function theme_tode($element) { +// function theme_tode($element) {1 // dsm('theme_tode'); // dsm($element, '$element'); // return $element['#children']; @@ -469,67 +485,105 @@ function __tode_node_validate($node, $form){ */ function tode_form_alter(&$form, $form_state, $form_id){ + /* + TODO block the deletion if tode term has children !! cause will delete them to … + */ + if (stripos($form_id, 'node_delete_confirm') !== false){ // dsm($form_id, 'tode form_alter form_id'); - /* - TODO test deletion - */ _tode_node_delete_form_alter($form, $form_state); // dsm($form); + }else if(stripos($form_id, 'node_admin_content') !== false){ + if(isset($form['operation']) && $form['operation']['#value'] == 'delete'){ + // dsm($form, 'node_admin_content form'); + // dsm($form_state, 'form_state'); + _tode_nodes_delete_form_alter($form, $form_state); + + } } } -function _tode_node_delete_form_alter(&$form){ +function _tode_node_delete_form_alter(&$form, $form_state){ // dsm($form, '_tode_node_delete_form_alter : form'); - #get the node - $node = $form['#parameters'][2]; - // dsm($node); - - # why that tnid ??? - // if($node->tnid != 0) - // return; + // get the node + $node = $form['#node']; + // dsm($node, '$node'); #get the fields defenition of node type - $tode_fields = _tode_get_tode_fields_def($node->type); - //dsm($tode_fields); + $tode_fields = _tode_get_tode_fields_def($node); + // dsm($tode_fields); if(count($tode_fields) == 0) return; #get the terms value - $terms = array(); - $tids = array(); - foreach ($tode_fields as $field_name => $field) { - foreach ($node->$field_name as $term) { - $term = taxonomy_get_term($term['value']); - $terms[] = $term->name; - $tids[] = $term->tid; - } + $terms = array('names'=>array(), 'tids'=>array()); + foreach ($tode_fields as $field_name => $field) + _tode_populate_terms_node_delete($terms, $node->$field_name); + + _tode_node_delete_prepare_form($form, $terms); +} + +function _tode_nodes_delete_form_alter(&$form, $form_state){ + // dsm($form, '_tode_nodes_delete_form_alter : form'); + $nodes = array(); + foreach ($form_state['values']['nodes'] as $nid => $actif) + if($actif) + $nodes[] = node_load($nid); + + #get the terms value + $terms = array('names'=>array(), 'tids'=>array()); + foreach ($nodes as $node) { + #get the fields definition of node type + $tode_fields = _tode_get_tode_fields_def($node); + //dsm($tode_fields); + + if(count($tode_fields) == 0) + continue; + + foreach ($tode_fields as $field_name => $field) + _tode_populate_terms_node_delete($terms, $node->$field_name); + } + _tode_node_delete_prepare_form($form, $terms); +} + +function _tode_populate_terms_node_delete(&$terms, $tode_field){ + foreach ($tode_field as $language) { + foreach ($language as $term) { + $term = taxonomy_term_load($term['tid']); + if(!in_array($term->tid, $terms['tids'])){ + $terms['names'][] = $term->name; + $terms['tids'][] = $term->tid; + } + } + } +} + +function _tode_node_delete_prepare_form(&$form, $terms){ if(count($terms)){ /* TODO add here a checkbox to select terms to delete */ #add some warning in form description - $form['description']['#value'] .= '
'.t('this will also delete taxonomy terms : %terms', array('%terms'=>implode(', ', $terms))); + $form['description']['#markup'] .= '
'.t('this will also delete taxonomy terms : %terms', array('%terms'=>implode(', ', $terms['names']))); - $form['tode_delete'] = array( '#type' => 'hidden', '#value' => serialize($tids),); + $form['tode_delete'] = array( '#type' => 'hidden', '#value' => serialize($terms['tids']),); - $form['tode_terms'] = array('#type' => 'hidden', '#value' => serialize($terms),); + $form['tode_terms'] = array('#type' => 'hidden', '#value' => serialize($terms['names']),); $form['#submit'][] = 'tode_delete_submit'; } - - + } function tode_delete_submit($form, &$form_state){ $tids = unserialize($form['tode_delete']['#value']); foreach ($tids as $tid) - taxonomy_del_term($tid); + taxonomy_term_delete($tid); $terms = unserialize($form['tode_terms']['#value']); drupal_set_message(t('Following Taxonomy terms have been deleted : %terms', array('%terms' => implode(', ', $terms) )), 'status'); @@ -544,12 +598,13 @@ function tode_delete_submit($form, &$form_state){ // return $prefix.$k; // } -function _tode_clean_form($form){ +function _tode_clean_form($form, $level = 0){ foreach ($form as $key => $value) { - if(strpos($key,'#') !== false){ - unset($form[$key]); + if(strpos($key,'#') !== false || $key == 'form_build_id' || $key == 'form_id' || $key == 'form_token'){ + if( $level == 0 || $key == "#element_validate") + unset($form[$key]); }elseif(is_array($value)){ - $form[$key] = _tode_clean_form($value); + $form[$key] = _tode_clean_form($value, $level+1); } } return $form; @@ -560,7 +615,7 @@ function _tode_prefix_form($form, $prefix = '', $add = TRUE){ foreach ($form as $key => $value) { if(strpos($key,'#') === false){ - if($value['#type'] == 'fieldset' || (!$add && is_array($value))) + if((isset($value['#type']) && $value['#type'] == 'fieldset') || (!$add && is_array($value))) $value = _tode_prefix_form($value, $prefix, $add); if($add){ @@ -582,11 +637,18 @@ function _tode_prefix_form($form, $prefix = '', $add = TRUE){ * */ function _tode_term_form($term){ - - if ($array_term = (array)$term) { + // dsm('_tode_term_form'); + if ($term) { - $form_state = array(); - $term_form = drupal_retrieve_form('taxonomy_form_term', $form_state, taxonomy_vocabulary_load($array_term['vid']), $array_term); + $form_state = array( + 'build_info'=>array( + 'args'=>array(0=>$term) + ), + 'method'=>'post', + ); + + // function taxonomy_form_term($form, &$form_state, $edit = array(), $vocabulary = NULL) { + $term_form = drupal_retrieve_form('taxonomy_form_term', $form_state); drupal_prepare_form('taxonomy_form_term', $term_form, $form_state); return $term_form; @@ -624,11 +686,11 @@ function _tode_trim_options(&$form, $item){ * OK OK OK */ function _tode_get_tode_fields_def($node){ - dsm($node, '_tode_get_fields_def'); + // dsm($node, '_tode_get_fields_def'); #get the fields defenition of node type $type_fields = field_info_instances('node'); - dsm($type_fields, 'type_fields definition'); + // dsm($type_fields, 'type_fields definition'); #get the tode node fields $tode_fields = array();