diff mee.module @ 14:50a57b1517cb

Fully working MEE, with Ressource Manager & all
author Franck Deroche <franck@defr.org>
date Fri, 18 Sep 2009 15:18:53 +0200
parents 842d89897cb4
children a3d780c2979a
line wrap: on
line diff
--- a/mee.module	Mon Jun 08 18:33:19 2009 +0200
+++ b/mee.module	Fri Sep 18 15:18:53 2009 +0200
@@ -24,11 +24,13 @@
   );
 
   $scald_config = variable_get('scald_config', 0);
-  foreach ($scald_config->contexts as $context => $details) {
-    $theme['mee_formatter_'. $context] = array(
-      'arguments' => array('element' => NULL),
-      'function' => 'theme_mee_context_formatter',
-    );
+  if(!empty($scald_config->contexts)) {
+    foreach ($scald_config->contexts as $context => $details) {
+      $theme['mee_formatter_'. $context] = array(
+        'arguments' => array('element' => NULL),
+        'function' => 'theme_mee_context_formatter',
+      );
+    }
   }
   return $theme;
 }
@@ -109,19 +111,25 @@
   switch ($op) {
     case 'presave':
       foreach ($items as $delta => &$item) {
-        if (!empty($item['mee']['value'])) {
-          $item['mee']['value'] = scald_rendered_to_sas($item['mee']['value']);
+        // Put everything in the ['mee'] namespace back into the array.
+        // This let CCK store the value and short fields natively.
+        if (is_array($item['mee'])) {
+          foreach ($item['mee'] as $k => $v) {
+            $items[$delta][$k] = $v;
+          }
+        }
+        if (!empty($item['value']) && variable_get('mee_store_sas', FALSE)) {
+          $item['value'] = scald_rendered_to_sas($item['value']);
         }
       }
       break; // end 'submit'
 
     case 'insert':
       foreach ($items as $delta => $item) {
-        // Let CCK store the value and short fields
-        $items[$delta]['value'] = $item['mee']['value'];
-        $items[$delta]['short'] = $item['mee']['short'];
         // Process the value and generate an atom
-        $scald_included = scald_included($item['mee']['value']);
+        $sas = scald_rendered_to_sas($item['value']);
+        $scald_included = scald_included($sas);
+        $sids = array_unique($scald_included);
 
         $temp_atom                = new stdClass;
         $temp_atom->type          = 'composite';
@@ -131,25 +139,49 @@
         $temp_atom->title         = $node->title . ' - ' . $field['widget']['label'] . ' (#' . $delta . ')';
         $temp_atom->authors       = array(scald_uid_to_aid($node->uid));
         $temp_atom->relationships = empty($scald_included) ? array() : array('includes' => $scald_included);
-
+        
         $sid = scald_register_atom($temp_atom);
-        // Short content
-        $short = $item['mee']['short'];
-        // TODO: Store the short content value
+        
         // Ressource manager associations
-        foreach ($item['mee']['ressource_manager'] as $sid => $ressource) {
-          // TODO: Store the assocation
+        if (empty($item['ressource_manager'])) {
+          _mee_load_ressources($node, $field, $item);
+        }
+        $separator = $item['ressource_manager'][0]['weight'];
+        foreach ($sids as $sid) {
+          $ressource = $item['ressource_manager'][$sid];
+          $weight = $ressource['weight'] - $separator;
+          $required = $ressource['required'];
+          $query = "INSERT into {mee_ressources} (content_nid, atom_sid, field, weight, required) VALUES (%d, %d, '%s', %d, %d)";
+          db_query($query, $node->nid, $sid, $field['field_name'], $weight, $required);
         }
       }
       break; // end 'insert'
 
     case 'update':
       foreach ($items as $delta => $item) {
-        // Let CCK store the value and short fields
-        $items[$delta]['value'] = $item['mee']['value'];
-        $items[$delta]['short'] = $item['mee']['short'];
         // Process the value
-        $scald_included = scald_included($item['mee']['value']);
+        $sas = scald_rendered_to_sas($item['value']);
+        $scald_included = scald_included($sas);
+        $sids = array_unique($scald_included);
+
+        // Update ressources weight
+        // In fact, we'll delete all the associations and recreate afterwards
+        // the needed one, to be sure that new ressources are correctly
+        // registered, and that no longer used one are removed.
+        if (!is_array($item['ressource_manager'])) {
+          _mee_load_ressources($node, $field, $item);
+        }
+        db_query("DELETE FROM {mee_ressources} WHERE content_nid=%d AND field='%s'", $node->nid, $field['field_name']);
+        // We'll normalize the weight, putting our separator at 0.
+        $separator = $item['ressource_manager'][0]['weight'];
+        foreach ($sids as $sid) {
+          $ressource = $item['ressource_manager'][$sid];
+          $required = $ressource['required'];
+          $weight = $ressource['weight'] - $separator;
+          // insert in the table
+          $query = "INSERT into {mee_ressources} (content_nid, atom_sid, field, weight, required) VALUES (%d, %d, '%s', %d, %d)";
+          db_query($query, $node->nid, $sid, $field['field_name'], $weight, $required);
+        }
 
         // @@@TODO: Handle failure of fetch
         $atom = scald_fetch(scald_search(array('base_id' => $node->nid . ':' . $delta), FALSE, TRUE));
@@ -166,16 +198,20 @@
       foreach ($items as $delta => $item) {
         scald_unregister_atom(scald_search(array('base_id' => $node->nid . ':' . $delta), FALSE, TRUE));
       }
+      
+      // Delete all ressources associations for this field
+      $query = "DELETE FROM {mee_ressources} WHERE content_nid = %d AND field = '%s'";
+      db_query($query, $node->nid, $field['field_name']);
       break; // end 'delete'
 
     case 'sanitize':
       foreach ($items as $delta => $item) {
         if (!empty($field['mee_processing'])) {
           $check = is_null($node) || (isset($node->build_mode) && $node->build_mode == NODE_BUILD_PREVIEW);
-          $text = isset($item['mee']['value']) ? check_markup($item['mee']['value'], $item['format'], $check) : '';
+          $text = isset($item['value']) ? check_markup($item['value'], $item['format'], $check) : '';
         }
         else {
-          $text = check_plain($item['mee']['value']);
+          $text = check_plain($item['value']);
         }
         $items[$delta]['safe'] = $text;
       }
@@ -187,7 +223,7 @@
  * Implementation of hook_content_is_empty().
  */
 function mee_content_is_empty($item, $field) {
-  if (empty($item['mee']['value']) && (string)$item['mee']['value'] !== '0') {
+  if (empty($item['value']) && (string)$item['value'] !== '0') {
     return TRUE;
   }
   return FALSE;
@@ -220,6 +256,30 @@
 }
 
 function theme_mee_formatter_default($element) {
+  // What's stored is exactly what the user entered, and not the SAS 
+  // representation. In general, that's that we want to output, *but*
+  // we should also check that the atom is still available... And replace
+  // it if it isn't.
+  if (!variable_get('mee_store_sas', FALSE)) {
+    $sas = scald_rendered_to_sas($element['#item']['value']);
+    $included = scald_included($sas);
+    $altered = FALSE;
+    foreach($included as $sid) {
+      $atom = scald_fetch($sid);
+      if (!scald_action_permitted($atom, 'view')) {
+        $altered = TRUE;
+        $replace = scald_scald_render($atom, 'no-access');
+        $element['#item']['value'] = preg_replace(
+          "/<!--(\s*)scald=$sid(.*)END scald=$sid(\s*)-->/sU",
+          scald_scald_render($atom, 'no-access'),
+          $element['#item']['value']
+        );
+      }
+    }
+    if ($altered) {
+      $element['#item']['safe'] = check_markup($element['#item']['value']);
+    }
+  }
   return scald_sas_to_rendered($element['#item']['safe']);
 }
 
@@ -359,7 +419,6 @@
 function mee_textarea_process($element, $edit, $form_state, $form) {
   drupal_add_css(drupal_get_path('module', 'mee') .'/css/mee.css');
   drupal_add_js(drupal_get_path('module', 'mee')  .'/mee.js');
-
   $element['mee'] = array(
     '#type' => 'markup',
     '#prefix' => '<div class="mee-wrap-editor-library">',
@@ -369,22 +428,68 @@
   $field = $form['#field_info'][$element['#field_name']];
   $field_key   = $element['#columns'][0];
   $element['mee']['ressource_manager'] = array(
-    '#type' => 'markup',
+    '#type'   => 'markup',
     '#weight' => 0.5,
-    '#theme' => 'mee_ressource_manager'
+    '#theme'   => 'mee_ressource_manager'
   );
+
+
+  if (!isset($element['#value']['mee']['ressource_manager'])) {
+    $element['#value']['mee']['ressource_manager'] = array();
+    // Restore/Generate the associated ressources in a proper order
+    $query = "SELECT * FROM {mee_ressources} WHERE content_nid=%d AND field='%s' ORDER BY weight ASC";
+    $result = db_query($query, $form['nid']['#value'], $element['#field_name']);
+    while ($item = db_fetch_object($result)) {  
+      $element['#value']['mee']['ressource_manager'][$item->atom_sid] = (array)$item;
+    }
+    $element['#value']['mee']['ressource_manager'][0] = array('weight' => 0);
+  }
+  
+  foreach($element['#value']['mee']['ressource_manager'] as $sid => $item) {
+    $atom = scald_fetch($sid);  
+    $title = $atom->title;
+      
+    $element['mee']['ressource_manager'][$sid] = array(
+      'title' => array(
+        '#type'  => 'markup',
+        '#value' => $title,
+      ),
+      'required' => array(
+        '#type' => 'select',
+        '#options' => array(t('Optional'), t('Required')),
+        '#default_value' => $item['required']
+      ),
+      'weight' => array(
+        '#type'   => 'weight',
+        '#default_value'  => $item['weight'],
+      ),
+      '#weight' => $item['weight']
+    );
+  }
+  
+  // And now we add the separator
   $element['mee']['ressource_manager'][0] = array(
     'title' => array(
       '#type'  => 'markup',
-      '#value' => 'Lorem ipsum'
+      '#value' => t('< Primaire / Secondaire >'),
+    ),
+    'required' => array(
+      '#type'  => 'markup',
+      '#value' => '-'
     ),
     'weight' => array(
-      '#type'  => 'weight',
-    )
+      '#type'   => 'weight',
+      '#prefix' => '<div class="mee-rm-separator">',
+      '#suffix' => '</div>'
+    ),
+    '#weight' => $element['#value']['mee']['ressource_manager'][0]['weight']
   );
+  if ($element['#value'][$field_key]) {
+    $element['#value']['mee'][$field_key] = $element['#value'][$field_key];
+  }
   $element['mee'][$field_key] = array(
     '#type' => 'textarea',
-    '#default_value' => isset($element['#value'][$field_key]) ? $element['#value'][$field_key] : NULL,
+    '#default_value' => isset($element['#value']['mee'][$field_key]) ? $element['#value']['mee'][$field_key] : NULL,
     '#rows' => !empty($field['widget']['rows']) ? $field['widget']['rows'] : 10,
     '#weight' => 0,
     // The following values were set by the content module and need
@@ -449,13 +554,14 @@
   $id = 'mee-ressource-manager-'. $count;
   drupal_add_tabledrag($id, 'order', 'sibling', 'mee-rm-weight');
   $count++;
-  $header = array('', t('Title'), t('Weight'));
+  $header = array('', t('Title'), t('Required'), t('Weight'));
   $rows = array();
   foreach(element_children($form) as $key) {
     $form[$key]['weight']['#attributes']['class'] = 'mee-rm-weight';
 
     $row = array('');
     $row[] = drupal_render($form[$key]['title']);
+    $row[] = drupal_render($form[$key]['required']);
     $row[] = drupal_render($form[$key]['weight']);
     $rows[] = array('data' => $row, 'class' => 'draggable');
   }
@@ -469,8 +575,22 @@
   return $output;
 }
 
-
-
+function _mee_load_ressources($node, $field, &$item) {
+    $results = db_query("
+      SELECT atom_sid, weight 
+      FROM {mee_ressources} 
+      WHERE content_nid=%d AND field='%s'",
+      array(
+        ':nid'   => $node->nid,
+        ':field' => $field['field_name']
+      )
+    );
+    $item['ressource_manager'] = array();
+    while($r = db_fetch_object($results)) {
+      $item['ressource_manager'][$r->atom_sid] = array('weight' => $r->weight);
+    }
+    $item['ressource_manager'][0] = array('weight' => 0);
+}
 
 
 /*******************************************************************************