. * * ------------------------------------------------------------------------ * * This file is used to manage the deploy packages. * * ------------------------------------------------------------------------ * * @package FusionInventory * @author Walid Nouh * @copyright Copyright (c) 2010-2016 FusionInventory team * @license AGPL License 3.0 or (at your option) any later version * http://www.gnu.org/licenses/agpl-3.0-standalone.html * @link http://www.fusioninventory.org/ * @link https://github.com/fusioninventory/fusioninventory-for-glpi * */ if (!defined('GLPI_ROOT')) { die("Sorry. You can't access directly to this file"); } /** * Abstract class to manage display, add, update, remove and move of items * in a package * @since 9.2 */ class PluginFusioninventoryDeployPackageItem extends CommonDBTM { //Display modes const CREATE = 'create'; const EDIT = 'edit'; const INIT = 'init'; public $shortname = ''; //The section name in the JSON representation public $json_name = ''; /** * Get an event label by it's identifier * @since 9.2 * @return array */ function getLabelForAType($type) { $types = $this->getTypes(); if (isset($types[$type])) { return $type[$type]; } else { return false; } } /** * Get the types already in used, so they cannot be selected anymore * @since 9.2 * @param $package the package to check * @return the types already in used */ function getTypesAlreadyInUse(PluginFusioninventoryDeployPackage $package) { return []; } /** * Display the dropdown to select type of element * * @global array $CFG_GLPI * @param object $package the package * @param array $config order item configuration * @param string $rand unique element id used to identify/update an element * @param string $mode mode in use (create, edit...) */ function displayDropdownType(PluginFusioninventoryDeployPackage $package, $config, $rand, $mode) { global $CFG_GLPI; //In case of a file item, there's no type, so don't display dropdown //in edition mode if (!isset($config['type']) && $mode == self::EDIT) { return true; } /* * Display dropdown html */ echo ""; echo ""; echo ""; echo ""; echo "
"._n("Type", "Types", 1).""; $type_field = $this->shortname."type"; if ($mode === self::CREATE) { $types = $this->getTypes(); array_unshift($types, Dropdown::EMPTY_VALUE); Dropdown::showFromArray($type_field, $types, ['rand' => $rand, 'used' => $this->getTypesAlreadyInUse($package) ]); $params = [ 'value' => '__VALUE__', 'rand' => $rand, 'myname' => 'method', 'type' => $this->shortname, 'class' => get_class($this), 'mode' => $mode ]; Ajax::updateItemOnEvent( "dropdown_".$type_field.$rand, "show_".$this->shortname."_value$rand", Plugin::getWebDir('fusioninventory'). "/ajax/deploy_displaytypevalue.php", $params, ["change", "load"] ); } else { echo Html::hidden($type_field, ['value' => $config['type']]); echo $this->getLabelForAType($config['type']); } echo "
"; } /** * Create a configuration request data * * @since 9.2 */ public function getItemConfig(PluginFusioninventoryDeployPackage $package, $request_data) { $config = []; $element = $package->getSubElement($this->json_name, $request_data['index']); if (is_array($element) && count($element)) { $config = [ 'type' => $element['type'], 'data' => $element]; } return $config; } /** * Display form * * @param object $package PluginFusioninventoryDeployPackage instance * @param array $request_data * @param string $rand unique element id used to identify/update an element * @param string $mode possible values: init|edit|create */ function displayForm(PluginFusioninventoryDeployPackage $package, $request_data, $rand, $mode) { /* * Get element config in 'edit' mode */ $config = null; if ($mode === self::EDIT && isset($request_data['index'])) { /* * Add an hidden input about element's index to be updated */ echo Html::hidden('index', ['value' => $request_data['index']]); $config = $this->getItemConfig($package, $request_data); } /* * Display start of div form */ if (in_array($mode, [self::INIT], true)) { echo ""; } } /** * Get an HTML mandatory mark (a red star) * @since 9.2 * @return the html code for a red star */ function getMandatoryMark() { return " *"; } /** * Common method to add an item to the package JSON definition * * @since 9.2 * @param id the package ID * @param item the item to add to the package definition */ function addToPackage($id, $item, $order) { //get current json package defintion $data = json_decode($this->getJson($id), true); //add new entry $data['jobs'][$order][] = $item; //Update package $this->updateOrderJson($id, $data); } /** * Get the json * * @param integer $packages_id id of the order * @return boolean|string the string is in json format */ function getJson($packages_id) { $pfDeployPackage = new PluginFusioninventoryDeployPackage(); $pfDeployPackage->getFromDB($packages_id); if (!empty($pfDeployPackage->fields['json'])) { return $pfDeployPackage->fields['json']; } else { return false; } } function prepareDataToSave($params, $entry) { //get current order json $data = json_decode($this->getJson($params['id']), true); //unset index unset($data['jobs'][$this->json_name][$params['index']]); //add new data at index position //(array_splice for insertion, ex : http://stackoverflow.com/a/3797526) array_splice($data['jobs'][$this->json_name], $params['index'], 0, [$entry]); return $data; } /** * Update the order json * * @param integer $packages_id * @param array $data * @return integer error number */ function updateOrderJson($packages_id, $data) { $pfDeployPackage = new PluginFusioninventoryDeployPackage(); $options = JSON_UNESCAPED_SLASHES; $json = json_encode($data, $options); $json_error_consts = [ JSON_ERROR_NONE => "JSON_ERROR_NONE", JSON_ERROR_DEPTH => "JSON_ERROR_DEPTH", JSON_ERROR_STATE_MISMATCH => "JSON_ERROR_STATE_MISMATCH", JSON_ERROR_CTRL_CHAR => "JSON_ERROR_CTRL_CHAR", JSON_ERROR_SYNTAX => "JSON_ERROR_SYNTAX", JSON_ERROR_UTF8 => "JSON_ERROR_UTF8" ]; $error_json = json_last_error(); $error_json_message = json_last_error_msg(); $error = 0; if ($error_json != JSON_ERROR_NONE) { $error_msg = $json_error_consts[$error_json]; Session::addMessageAfterRedirect( __("The modified JSON contained a syntax error :", "fusioninventory") . "
" . $error_msg . "
". $error_json_message, false, ERROR, false ); $error = 1; } else { $error = $pfDeployPackage->update(['id' => $packages_id, 'json' => Toolbox::addslashes_deep($json)]); } return $error; } /** * Remove an item * * @param array $params * @return boolean */ function remove_item($params) { if (!isset($params[$this->shortname.'_entries'])) { return false; } //get current order json $data = json_decode($this->getJson($params['packages_id']), true); //remove selected checks foreach ($params[$this->shortname.'_entries'] as $index => $checked) { if ($checked >= "1" || $checked == "on") { unset($data['jobs'][$this->shortname][$index]); } } //Ensure actions list is an array and not a dictionnary //Note: This happens when removing an array element from the begining $data['jobs'][$this->shortname] = array_values($data['jobs'][$this->shortname]); //update order $this->updateOrderJson($params['packages_id'], $data); } /** * Move an item * * @param array $params */ function move_item($params) { //get current order json $data = json_decode($this->getJson($params['id']), true); //get data on old index $moved_check = $data['jobs'][$this->json_name][$params['old_index']]; //remove this old index in json unset($data['jobs'][$this->json_name][$params['old_index']]); //insert it in new index (array_splice for insertion, ex : http://stackoverflow.com/a/3797526) array_splice($data['jobs'][$this->json_name], $params['new_index'], 0, [$moved_check]); //update order $this->updateOrderJson($params['id'], $data); } /** * Get the size of file * * @param integer $filesize * @return string */ function processFilesize($filesize) { if (is_numeric($filesize)) { if ($filesize >= (1024 * 1024 * 1024)) { $filesize = round($filesize / (1024 * 1024 * 1024), 1)."GiB"; } else if ($filesize >= 1024 * 1024) { $filesize = round($filesize / (1024 * 1024), 1)."MiB"; } else if ($filesize >= 1024) { $filesize = round($filesize / 1024, 1)."KB"; } else { $filesize = $filesize."B"; } return $filesize; } else { return NOT_AVAILABLE; } } /** * Display a add or save button * @since 9.2 * * @param pfDeployPackage the package in use * @param mode the mode (edit or create) */ function addOrSaveButton(PluginFusioninventoryDeployPackage $pfDeployPackage, $mode) { echo ""; echo ""; echo ""; echo ""; if ($pfDeployPackage->can($pfDeployPackage->getID(), UPDATE)) { if ($mode === self::EDIT) { echo ""; } else { echo ""; } } echo ""; echo ""; } public function getItemValues($packages_id) { $data = json_decode($this->getJson($packages_id), true); if ($data) { return $data['jobs'][$this->json_name]; } else { return []; } } function displayAjaxValues($config, $request_data, $rand, $mode) { return true; } function getTypes() { return []; } }