Kaynağa Gözat

RC

Signed-off-by: bachy <git@g-u-i.net>
bachy 13 yıl önce
ebeveyn
işleme
66ff837039
1 değiştirilmiş dosya ile 225 ekleme ve 163 silme
  1. 225 163
      tode.module

+ 225 - 163
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'] = '<div style="display:none;">';
-		// $term_form['identification']['#suffix'] = '</div>';
-		// $term_form['advanced']['synonyms']['#prefix'] = '<div style="display:none;">';
-		// $term_form['advanced']['synonyms']['#suffix'] = '</div>';
-		// $term_form['advanced']['weight']['#prefix'] = '<div style="display:none;">';
-		// $term_form['advanced']['weight']['#suffix'] = '</div>';
-		// $term_form['advanced']['parent']['#prefix'] = '<div style="display:none;">';
-		// $term_form['advanced']['parent']['#suffix'] = '</div>';
-		// $term_form['advanced']['relations']['#prefix'] = '<div style="display:none;">';
-		// $term_form['advanced']['relations']['#suffix'] = '</div>';
-		// 
-		// # 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 : '<div style="display:none;">',
+			'#suffix' => $visible ? null : '</div>',
 		);
-		
-		// if(!$show){
-		// 	$element['term_form']['#prefix'] = '<div style="display:none;">';
-		// 	$element['term_form']['#suffix'] = '</div>';
-		// }
+				  
+		$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'] = '<div class="tode-term-edit-form-box">';
-		// $element['#suffix'] = '</div>';
-
-		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;
-		}
-		// dsm($values, 'values');
-		$values = _tode_prefix_form($values, $prefix, FALSE);
-		// dsm($values, 'values');
-		
-		$array_term = (array)taxonomy_get_term($values['tid']);
+
+		// retreive the prefixed termfom values (hidden or visible)
+		$prefix = 'tode_termform_'.$field_name;
 		
-		foreach ($values as $key => $value) {
-			if(is_array($value))
-				$values += $value;
-		}
+		// 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');
 		
-		$array_term = (array)taxonomy_get_term($values['tid']);
+			$values = _tode_prefix_form($form_state['values'][$prefix], $prefix.'_', FALSE);
+			// dsm($values, 'values');
 		
-		// dsm($values, 'values');
+			if($language == 'und' || $language == $default_language || !module_exists('i18n_taxonomy')){
 		
-		$form_state = array();
-		$form_state['values']	= $values;
-		$form_state['values']['op'] = t('Save');
+				// 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($form_state, 'form_state');
-			  
-		drupal_execute('taxonomy_form_term', $form_state, taxonomy_vocabulary_load($array_term['vid']), $array_term);
+				// 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']);
+			}
+		}
 		
 	}
-	*/
 }
 
 /**
  * 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'] .= '<br />'.t('this will also delete taxonomy terms : %terms', array('%terms'=>implode(', ', $terms)));
+		$form['description']['#markup'] .= '<br />'.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();