| 
					
				 | 
			
			
				@@ -7,7 +7,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @copyright 2008 Ouest Systemes Informatiques (OSInet) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @author Frederic G. MARAND 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @version $Id: qbf.module,v 1.4 2008-08-26 16:24:07 marand Exp $ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @version $Id: qbf.module,v 1.5 2008-08-27 10:45:50 marand Exp $ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @license CeCILL 2.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @package QBF 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -19,24 +19,16 @@ define('QBF_LEVEL_REQUIRED',         3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 define('QBF_PATH_QUERY',             'qbf/query'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+define('QBF_PERM_QUERY',             'use qbf search functions'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function _qbf_view($usNodeType = NULL) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $nodeType = filter_xss($usNodeType, array()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $arNodeTypes = node_get_types(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  //dsm($arNodeTypes); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $arFuncs1 = get_defined_functions(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $arFuncs1 = $arFuncs1['user']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $node = new stdClass(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $node->type = 'poll'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $arFuncs1 = node_forms(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  //dsm($arFuncs1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $form = node_form($node, array('qbe-key' => 'qbe-value')); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  //dsm($form); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return 'foo'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Experiment in creating a new "hook_qbf_rewrite_form()". 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @todo check whether this is redundant with hook_form_alter() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param array $form 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @return array 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function qbf_rewrite_form($form) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $hookName = 'qbf_rewrite_form'; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -50,7 +42,7 @@ function qbf_rewrite_form($form) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Transform a form array for QBF 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Transform a form array for QBF. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * This function obtains the form array using Forms API, and transforms it by 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * modifying widgets to other types where needed. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -97,7 +89,7 @@ function qbf_transform_form($form_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Transform a form element for QBF 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Transform a form element for QBF. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * QBF-specific properties are: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * - #qbf : array of properties 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -157,7 +149,7 @@ function _qbf_transform_element($key, array $element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $destType = array_key_exists($sourceType, $arDefaultTypeTransformations) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ? $arDefaultTypeTransformations[$sourceType] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     : $sourceType; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // .. Apply type override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // .. Apply form-defined type override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (isset($element['#qbf']['#type'])) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $destType = $element['#qbf']['#type']; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -180,7 +172,8 @@ function _qbf_transform_element($key, array $element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       foreach (element_properties($element) as $propertyName) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // Apply killer properties first to avoid useless work 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (array_key_exists($propertyName, $arKillerProperties) && ($element[$propertyName] = $arKillerProperties[$propertyName])) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (array_key_exists($propertyName, $arKillerProperties) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          && ($element[$propertyName] = $arKillerProperties[$propertyName])) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $ret = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           break; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -196,7 +189,7 @@ function _qbf_transform_element($key, array $element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $ret[$propertyName] = $element[$propertyName]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // And apply form-defined overrides 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // And apply form-defined property overrides 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if ($propertyName == '#qbf') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           foreach ($element[$propertyName] as $overrideName => $overrideValue) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -206,6 +199,7 @@ function _qbf_transform_element($key, array $element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // Recursively transform children 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       foreach (element_children($element) as $childName) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         $child = _qbf_transform_element($childName, $element[$childName]); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -225,14 +219,23 @@ function _qbf_transform_element($key, array $element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return $ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Implement hook_perm(). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @return array 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function qbf_perm() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $ret = array('use qbf search functions'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $ret = array 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    QBF_PERM_QUERY, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return $ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Implement hook_forms 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Implement hook_forms(). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @todo dynamically build the list of forms 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -248,22 +251,53 @@ function qbf_forms() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return $forms; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Insert the query results at the bottom of the query form. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param array $form 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param array $form_values 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @return array 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function qbf_after_build($form, $form_values) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $arQuery = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  dsm($form_values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  foreach (element_children($form) as $childName) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if ($form[$childName]['#qbf']['#level'] > QBF_LEVEL_REMOVE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $arQuery[] = $childName . '=' . $form[$childName]['#value']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $query = implode(', ', $arQuery); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $arQuery = _qbf_extract_query($form, $form_values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $form['food'] = array 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     '#type'    => 'markup', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    '#value'   => "<p>Requête sur $query</p>", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '#value'   => "<p>" . dvr($arQuery, true) . "</p>", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return $form; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Recursively build a query array from the form and its values 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * In the current version, element names are supposed to be unique, even at 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * different levels in the tree. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param array $form 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param array $form_values 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function _qbf_extract_query($form, $form_values) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $name = $form['#parents'][0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Elements which are removed or display-only have no place in the query 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (array_key_exists('#qbf', $form) && array_key_exists('#level', $form['#qbf']) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    && $form['#qbf']['#level'] >= QBF_LEVEL_OPTIONAL) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $ret = array($name => $form_values[$name]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $ret = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // QBF level is not inherited, so this loop is outside the "if" above 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  foreach (element_children($form) as $childName) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  	$ret += _qbf_extract_query($form[$childName], $form_values); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return $ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 |