Parcourir la source

- QBF queries now have a type, to enable multiple uses of QBF by various apps
- no longer erase homonym saved queries by another user
- per-button submit handler for Save instead of form-level
- hook_qbf_register() now enables apps to declare the types of saved queries they support
- _qbf_save() now correctly saved everything except the query itself (!)
- qbf_transform_form() replaced by qbf_form() as the actual form generator
- qbf form elements now in a separate fieldset

Frederic G. Marand il y a 15 ans
Parent
commit
5e31659d66
1 fichiers modifiés avec 176 ajouts et 39 suppressions
  1. 176 39
      qbf.module

+ 176 - 39
qbf.module

@@ -12,7 +12,7 @@
  * @package QBF
  */
 
-// $Id: qbf.module,v 1.9.4.3 2009-03-17 18:48:53 marand Exp $
+// $Id: qbf.module,v 1.9.4.4 2009-03-19 17:30:24 marand Exp $
 
 /**
  * Saved error reporting level.
@@ -88,11 +88,15 @@ define('QBF_VAR_NOTIFY_DELETE',      'qbf_notify_delete');
  */
 define('QBF_DEF_NOTIFY_DELETE',      FALSE);
 
+/**
+ * A class wrapper for saved QBF queries
+ */
 class Qbf_Query
   {
   public $qid;
   public $uid;
   public $name;
+  public $type;
   public $query;
   public $created;
   public $updated;
@@ -104,11 +108,12 @@ class Qbf_Query
    * @param array $ar_values
    * @return void
    */
-  public function __construct($name, $ar_values)
+  public function __construct($type, $name, $ar_values)
     {
     global $user;
     $this->qid = 0; // will be autoset by the DB serial
     $this->uid = $user->uid;
+    $this->type = $type;
     $this->name = $name;
     $this->query = serialize($ar_values);
     $this->created = $this->updated = time();
@@ -124,12 +129,12 @@ class Qbf_Query
     // Avoid duplicates
     if (!empty($this->name))
       {
-      $sq = "DELETE FROM {%s} WHERE name = '%s'";
-      db_query($sq, QBF_TABLE_NAME, $name);
+      $sq = "DELETE FROM {%s} WHERE name = '%s' AND uid = '%d' ";
+      db_query($sq, QBF_TABLE_NAME, $this->name, $this->uid);
+      // $n = db_affected_rows(); // Know how many homonym queries we deleted
       }
 
     $ret = drupal_write_record(QBF_TABLE_NAME, $this); // no update param: we just deleted the previous version
-    dsm($this);
     if ($ret) // has to be SAVED_NEW, by construction
       {
       $ret = $this->qid; // from serial
@@ -415,26 +420,49 @@ function qbf_admin_settings()
   return system_settings_form($form);
   }
 
+/**
+ * Submit handler for qbf_form, Save search button.
+ *
+ * @param array $form
+ * @param array $form_state
+ * @return integer
+ *   The id of the saved query.
+ */
+function qbf_form_save_submit($form, &$form_state)
+  {
+  $qid = _qbf_save($form_state['values']['form_id'], $form_state);
+  drupal_set_message(t('Your query was saved as "@name".',
+    array('@name' => $form_state['values']['qbf_save_name'])));
+  global $user;
+  $form_state['redirect'] = "user/$user->uid/qbf";
+  return $qid;
+  }
+
 /**
  * Implement hook_forms().
  *
+ * @link http://drupal.org/node/144132#hook-forms @endlink
+ *
  * @ingroup forms
  * @ingroup hooks
+ * @param string $form_id
+ * @param array $args
  * @return array
  */
-function qbf_forms()
+function qbf_forms($qbf_form_id, $args)
   {
   $hook_name = 'qbf_register';
+  // dsm(array("QBF_forms $form_id" => $args));
 
   // More efficient than using module_invoke_all: we avoid array-merging + re-looping
   foreach (module_implements($hook_name) as $module)
     {
-    foreach (module_invoke($module, $hook_name) as $form_name)
+    foreach (module_invoke($module, $hook_name) as $form_id => $search_title)
       {
-      $forms["qbf_$form_name"] = array
+      $forms["qbf_$form_id"] = array
         (
-        'callback'           => 'qbf_transform_form',
-        'callback arguments' => array($form_name),
+        'callback'           => 'qbf_form',
+        'callback arguments' => array($form_id, $qbf_form_id, $search_title, $args),
         );
       }
     }
@@ -480,6 +508,14 @@ function qbf_menu()
   {
   $items = array();
 
+  $items[QBF_PATH_MAIN . '/demo'] = array
+    (
+    'title'            => 'QBF Demo',
+    'access arguments' => array(QBF_PERM_QUERY),
+    'page callback'    => 'qbf_show',
+    'type'             => MENU_NORMAL_ITEM,
+    );
+
   $items[QBF_PATH_SETTINGS] = array
     (
     'title'            => 'Query-By-Form',
@@ -621,6 +657,7 @@ function qbf_query_mapper($ar_query_map = array(), $ar_defaults = array())
 
 error_reporting($_qbf_er);
 
+function qbf___________________________________________________(){}
 // ======== D6 LIMIT ==================================================================================================
 
 /* TODO Node previews and adding form fields to the node form.
@@ -641,44 +678,51 @@ error_reporting($_qbf_er);
  * Any additional parameter passed to the function is transmitted to the form
  * generating function.
  *
+ * $form_state is generally not used, but is passed in to match the usual FAPI
+ * signatures in Drupal 6.
+ *
  * @ingroup forms
  * @param string $form_id
+ * @param array $form_state
  * @return array
  */
-function qbf_transform_form($form_id) {
-// @todo GW:  function qbf_transform_form(&$form_state, $form_id) {
-
-  $ar_args = func_get_args();
-//dsm(array('qtf' => $ar_args));
+function qbf_transform_form($form_state, $form_id)
+  {
   // Fetch the basic form and rename it, passing it the caller's arguments
-  $form = call_user_func_array('drupal_retrieve_form', $ar_args);
+   $form = drupal_retrieve_form($form_id, $form_state, NULL, $form_state);
+  $node = new stdClass();
+  $form = $form_id($node, $form_state);
   $new_form_id = "qbf_$form_id";
 
   // Only keep the children of the form and QBF properties on the form itself
   $elements = array();
   $new_form = array();
   $new_form['#qbf_source_form_id'] = $form_id;
-  if (in_array('#qbf', element_properties($form))) {
+  if (in_array('#qbf', element_properties($form)))
+    {
     $new_form += $form['#qbf'];
-  }
+    }
 
-  foreach (element_children($form) as $key) {
+  foreach (element_children($form) as $key)
+    {
     // dsm("Transforming $key, type " . $form[$key]['#type']);
     $new_element = _qbf_transform_element($key, $form[$key]);
-    if (!is_null($new_element)) {
+    if (!is_null($new_element))
+      {
       $new_form[$key] = $new_element;
+      }
     }
-  }
 
   $new_form['#id'] = $new_form_id;
-  $new_form['#multistep'] = TRUE;
+  // @todo #multistep -> #rebuild au submit
+  // $new_form['#multistep'] = TRUE;
   // Do not set #redirect, even to FALSE (submit handlers)
   // $new_form['#redirect']  = FALSE;
   $new_form['#after_build'][] = 'qbf_after_build';
-  $new_form['#submit'] = array('qbf_submit' => array());
-// dsm($new_form);
+  $new_form['#submit'] = array('qbf_submit');
+  // dsm($new_form);
   return $new_form;
-}
+  }
 
 /**
  * Insert the query results at the bottom of the query form.
@@ -764,15 +808,6 @@ function qbf_submit($form, &$form_state) {
       $ret = FALSE;
       break;
 
-    case t('Save query'):
-      _qbf_save($form_id, $form_values);
-//@TODO GW _qbf_save($form_state['values']['form_id'], $form_state['values']);
-      drupal_set_message(t('Your query was saved as "@name".',
-        array('@name' => $form_values['save-name'])));
-//@TODO GW _qbf_save($form_state['values']['form_id'], $form_state['values']);
-        global $user;
-      $ret = "user/$user->uid/edit/job";;
-      break;
   }
   //dsm(array('QS' => $form_values));
   return $ret;
@@ -804,11 +839,14 @@ function _qbf_save($form_id, $form_state)
     {
     // @FIXME check whether form_state is now needed. It wasn't in QBF for D5
     $form = drupal_retrieve_form($form_id, $form_state);
-    dsm($form, "retrieve");
+    // dsm($form, "retrieve");
     drupal_prepare_form($form_id, $form, $form_state);
-    dsm($form, "prepare");
-    $name = $form_state['post']['save-name'];
-    $form_values = _qbf_extract_query($form, $form_state['post']);
+    // dsm($form, "prepare");
+    $name = $form_state['values']['qbf_save_name'];
+    $type = $form_state['values']['qbf_save_type'];
+    dsm($form_state);
+    $form_values = _qbf_extract_query($form, $form_state['values']);
+    dsm($form_values);
     $ar_values = array();
     foreach ($form_values as $key => $value)
       {
@@ -819,9 +857,108 @@ function _qbf_save($form_id, $form_state)
       $ar_values[$key] = $value;
       }
 
-    $query = new Qbf_Query($name, $ar_values);
+    $query = new Qbf_Query($type, $name, $ar_values);
     $ret = $query->save();
     }
 
   return $ret;
   }
+
+/**
+ * The QBF form builder.
+ *
+ * @param array $form_state
+ * @param string $form_id
+ *   The original form to transform
+ * @param string $qbf_form_id
+ *   The QBF form itself
+ * @param strign $save_type
+ *   Name of search type, to use when saving.
+ */
+function qbf_form($form_state, $form_id, $qbf_form_id, $save_type)
+  {
+  // dsm(array("QBF_Form" => "Base = [$form_id], QBF ID = [$qbf_form_id]", 'save_type' => $save_type));
+
+  $form = array();
+//  $form['#validate'][] = 'qbf_form_validate';
+//  $form['#submit'][]   = 'qbf_form_submit';
+
+  $form['qbf'] = array
+    (
+    '#type'   => 'fieldset',
+    '#title'  => t('Query'),
+    );
+
+  $form['qbf']['qbf_save_type'] = array
+    (
+    '#type'          => 'hidden',
+    '#value'         => $save_type,
+    );
+
+  $form['qbf']['qbf_save_name'] = array
+    (
+    '#title'         => t('Name of query in your save list'),
+    '#type'          => 'textfield',
+    '#required'      => TRUE,
+    '#default_value' => substr($form_id, 0, -5) . ' ' . format_date(time(), 'large'),
+    );
+  $form['qbf']['qbf_save'] = array
+    (
+    '#submit'   => array('qbf_form_save_submit'),
+    '#validate' => array('qbf_form_save_validate'),
+    '#type'     => 'submit',
+    '#value'    => t('Save query'),
+    '#weight'   => 5,
+    );
+
+  $form['qbf']['qbf_perform'] = array
+    (
+    '#submit' => array('qbf_form_perform_submit'),
+    '#validate' => array('qbf_form_perform_validate'),
+    '#type'   => 'submit',
+    '#value'  => t('Perform query'),
+    '#weight' => 4,
+    );
+
+  return $form;
+  }
+
+/**
+ * Submit handler for qbf_form, Perform search button.
+ *
+ * @param array $form
+ * @param array $form_state
+ */
+function qbf_form_perform_submit($form, &$form_state)
+  {
+  dsm('PERF SUB');
+  dsm($form);
+  dsm($form_state);
+  }
+
+/**
+ * Validate handler for qbf_form, Perform search button.
+ *
+ * @param array $form
+ * @param array $form_state
+ */
+function qbf_form_perform_validate($form, &$form_state)
+  {
+  dsm('PERF VAL');
+  dsm($form);
+  dsm($form_state);
+  }
+
+function qbf_form_submit($form, &$form_state)
+  {
+  dsm('FORM SUB');
+  dsm($form);
+  dsm($form_state);
+  }
+
+function qbf_form_validate($form, &$form_state)
+  {
+  dsm('FORM VAL');
+  dsm($form);
+  dsm($form_state);
+  }