Bonjour,

Je suis en train de travailler sur les Item_Devices. Je pensais ajouter des actions massives, notamment pour "détacher" un Item_Device* d'un Item ; certains gestionnaires de parc "dépouillent" les ordinateurs avant de jeter les carcasses afin d'avoir du spare d'occasion ...

J'ai essayé d'adapter le système des MassiveActions. Vous trouverez le patch en question (0.85), ci-joint. Je n'en suis pas complètement satisfait car il passe par un tableau de tableau dans le champs "item" utilisé par la structure des MassiveActions. Cela signifie que l'on ne peut plus utiliser les actions standards : je suis obligé de créer l'action 'purge_device' au lieu d'utiliser l'action standard 'purge'.
Y a-t-il une meilleure solution ?

Damien
Index: inc/item_devices.class.php
===================================================================
--- inc/item_devices.class.php	(revision 21116)
+++ inc/item_devices.class.php	(working copy)
@@ -59,6 +59,72 @@
    static public $log_history_1_unlock  = Log::HISTORY_UNLOCK_DEVICE;
 
 
+   function getForbiddenStandardMassiveAction() {
+
+      $forbidden   = parent::getForbiddenStandardMassiveAction();
+      $forbidden[] = 'update';
+      return $forbidden;
+   }
+
+
+   function doSpecificMassiveActions($input=array()) {
+
+      $res = array('ok'      => 0,
+                   'ko'      => 0,
+                   'noright' => 0);
+
+      switch ($input['action']) {
+         case 'unaffect' :
+         case 'purge_device' :
+            foreach ($input["item"] as $itemtype => $items) {
+               $itemtype = 'Item_'.$itemtype;
+               $link = new $itemtype();
+               foreach ($items as $key => $val) {
+                  if ($val == 1) {
+                     if ($input['action'] == 'unaffect') {
+                        if ($item_device->can($key,'w')) {
+                           if ($item_device->affectItem_Device($key, 0, '')) {
+                              $res['ok']++;
+                           } else {
+                              $res['ko']++;
+                              $res['messages'][] = $this->getErrorMessage(ERROR_ON_ACTION);
+                           }
+                        } else {
+                           $res['noright']++;
+                           $res['messages'][] = $this->getErrorMessage(ERROR_RIGHT);
+                        }
+                     } else {
+                        if ($link->can($key,'d')) {
+                           $force = 1;
+                           // Only mark deletion for
+                           if ($link->maybeDeleted()
+                               && $link->useDeletedToLockIfDynamic()
+                               && $link->isDynamic()) {
+                              $force = 0;
+                           }
+                           if ($link->delete(array("id" => $key), $force)) {
+                              $res['ok']++;
+                           } else {
+                              $res['ko']++;
+                              $res['messages'][] = $link->getErrorMessage(ERROR_ON_ACTION);
+                           }
+                        } else {
+                           $res['noright']++;
+                           $res['messages'][] = $link->getErrorMessage(ERROR_RIGHT);
+                        }
+                     }
+                  }
+               }
+            }
+            break;
+
+         default :
+            return parent::doSpecificMassiveActions($input);
+      }
+      return $res;
+   }
+
+
    /**
     * Get the specificities of the given device. For instance, the
     * serial number, the size of the memory, the frequency of the CPUs ...
@@ -257,8 +323,14 @@
       }
 
       if ($canedit) {
-         $content       = "<input type='submit' class='submit' name='purge' value='".
-                            _sx('button', 'Delete permanently')."'>";
+         $massiveactionparams = array('container'        => 'form_device_action'.$rand,
+                                      'fixed'            => false,
+                                      'display_arrow'    => false,
+                                      'specific_actions' => array('purge_device' => _x('button',
+                                                                                        'Delete permanently'),
+                                                                  'unaffect' => __('Dissociate')));
+         $content = array(array('function'   => 'Html::showMassiveActions',
+                                'parameters' => array(__CLASS__, $massiveactionparams)));
          $delete_column = $table->addHeader('delete one', $content);
          $delete_column->setHTMLClass('center');
       }
@@ -478,8 +550,12 @@
          }
 
          if ($options['canedit']) {
-            $cell_value   = "<input type='checkbox' name='remove_" . $peer_type . "_" .
-                              $link['id'] . "' value='1'>";
+            $sel = "";
+            if (isset($_SESSION['glpimassiveactionselected'][$peer_type][$link['id']])) {
+               $sel = "checked";
+            }
+            $cell_value   = "<input type='checkbox' name='item[" . $peer_type . "][" .
+                            $link['id'] . "]' value='1' id='massaction_item_".mt_rand()."' $sel>";
             $current_row->addCell($delete_one, $cell_value, $previous_cell);
          }
       }
@@ -657,6 +733,15 @@
    }
 
 
+   static function affectItem_Device($item_devices_id, $items_id, $itemtype) {
+
+      $link = new static();
+      return $link->update(array('id'       => $item_devices_id,
+                                 'items_id' => $items_id,
+                                 'itemtype' => $itemtype));
+   }
+
+
    /**
     * @param $itemtype
     * @param $items_id
Index: inc/html.class.php
===================================================================
--- inc/html.class.php	(revision 21115)
+++ inc/html.class.php	(working copy)
@@ -2395,6 +2395,7 @@
       $p['confirm']           = '';
       $p['rand']              = '';
       $p['container']         = '';
+      $p['display_arrow']     = true;
 
       foreach ($options as $key => $val) {
          if (isset($p[$key])) {
@@ -2462,8 +2463,10 @@
                                           'height'      => $p['height'],));
          }
          echo "<table class='tab_glpi' width='$width'><tr>";
-         echo "<td width='30px'><img src='".$CFG_GLPI["root_doc"]."/pics/arrow-left".
-                ($p['ontop']?'-top':'').".png' alt=''></td>";
+         if ($p['display_arrow']) {
+            echo "<td width='30px'><img src='".$CFG_GLPI["root_doc"]."/pics/arrow-left".
+                   ($p['ontop']?'-top':'').".png' alt=''></td>";
+         }
          echo "<td width='100%' class='left'>";
          echo "<a class='vsubmit' ";
          if (is_array($p['confirm'] || strlen($p['confirm']))) {
_______________________________________________
Glpi-dev mailing list
Glpi-dev@gna.org
https://mail.gna.org/listinfo/glpi-dev

Reply via email to