Skip to content
Open
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/).

## [UNRELEASED]

### Added

- Permit to Inject GlpiAsset

### Fixed

- Fix : confirm dialog js escaping
Expand Down
25 changes: 22 additions & 3 deletions inc/commoninjectionlib.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,12 @@
* @link https://github.com/pluginsGLPI/datainjection
* -------------------------------------------------------------------------
*/

use Glpi\Asset\Asset;
use Glpi\DBAL\QueryExpression;
use Glpi\DBAL\QuerySubQuery;
use Glpi\Exception\Http\HttpException;
use Glpi\Features\AssignableItem;
use GlpiPlugin\Datainjection\Glpi\Asset\AssetInjection;

use function Safe\preg_match;
use function Safe\preg_replace;
Expand Down Expand Up @@ -337,6 +338,9 @@ public static function getItemtypeByInjection($injectionClassName)
public static function getItemtypeByInjectionClass($injectionClass)
{

if ($injectionClass instanceof AssetInjection) {
return Toolbox::ucfirst(getItemTypeForTable($injectionClass->getVirtualTable()));
Comment thread
tsmr marked this conversation as resolved.
Outdated
}
return Toolbox::ucfirst(getItemTypeForTable($injectionClass->getTable()));
}

Expand All @@ -346,7 +350,10 @@ public static function getItemtypeByInjectionClass($injectionClass)
*
* @param string $itemtype the itemtype
*
* @return PluginDatainjectionInjectionInterface the injection class instance
* Every injection class both implements the interface and extends CommonDBTM,
* so the returned instance exposes the CommonDBTM API (getTable(), ...) too.
*
* @return PluginDatainjectionInjectionInterface&CommonDBTM the injection class instance
*/
public static function getInjectionClassInstance($itemtype)
{
Expand All @@ -358,7 +365,15 @@ public static function getInjectionClassInstance($itemtype)
$injectionClass = ucfirst($itemtype) . 'Injection';
}

if (!is_a($injectionClass, PluginDatainjectionInjectionInterface::class, true)) {
if (!class_exists($injectionClass)) {
plugin_datainjection_creationInjectableAssets();
}


if (
!is_a($injectionClass, PluginDatainjectionInjectionInterface::class, true)
|| !is_a($injectionClass, CommonDBTM::class, true)
) {
throw new HttpException(500, 'Class ' . $injectionClass . ' is not a valid class');
}
return new $injectionClass();
Expand Down Expand Up @@ -1999,6 +2014,10 @@ private function dataAlreadyInDB($injectionClass, $itemtype)
}
}

if ($injectionClass instanceof Asset && method_exists($injectionClass, 'getAssetDefinitionID')) {
$where['assets_assetdefinitions_id'] = $injectionClass->getAssetDefinitionID();
}

//Add additional parameters specific to this itemtype (or function checkPresent exists)
if (method_exists($injectionClass, 'checkPresent')) {
$extra = $injectionClass->checkPresent($this->values, $options);
Expand Down
7 changes: 6 additions & 1 deletion inc/injectiontype.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
* -------------------------------------------------------------------------
*/
use Glpi\Exception\Http\HttpException;
use GlpiPlugin\Datainjection\Glpi\Asset\AssetInjection;

use function Safe\json_decode;
use function Safe\json_encode;
Expand Down Expand Up @@ -78,6 +79,10 @@ public static function getItemtypes($only_primary = false)
$name = $plugin->getName() . ': ';
}
$name .= call_user_func([$type, 'getTypeName']);

if ($instance instanceof AssetInjection) {
$typename = $instance->getVirtualType();
}
$values[$typename] = $name;
}
}
Expand Down Expand Up @@ -388,7 +393,7 @@ public static function getUsedMappingsOrInfos($options = [])
foreach ($options as $option) {
if (
isset($option['table'])
&& ($option['table'] == getItemTypeForTable($data['itemtype']))
&& ($option['table'] == $injectionClass->getTable())
&& ($option['linkfield'] == $data['value'])
&& ($option['displaytype'] != 'multiline_text')
&& ($mapping_or_info['value'] != $data['value'])
Expand Down
1 change: 1 addition & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ parameters:
- ajax
- front
- inc
- src
- hook.php
- setup.php
scanDirectories:
Expand Down
111 changes: 109 additions & 2 deletions setup.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@
* -------------------------------------------------------------------------
*/

use Glpi\Asset\AssetDefinition;
use Glpi\Asset\AssetDefinitionManager;
use GlpiPlugin\Datainjection\Glpi\Asset\Capacity\IsInjectableCapacity;

use function Safe\define;
use function Safe\mkdir;

Expand All @@ -49,6 +53,12 @@ function plugin_init_datainjection()
/** @var array $INJECTABLE_TYPES */
global $PLUGIN_HOOKS, $CFG_GLPI, $INJECTABLE_TYPES;

if (!isset($CFG_GLPI['injectable_types'])) {
$CFG_GLPI['injectable_types'] = [];
}
$asset_definition_manager = AssetDefinitionManager::getInstance();
$asset_definition_manager->registerCapacity(new IsInjectableCapacity());

$PLUGIN_HOOKS['csrf_compliant']['datainjection'] = true;
$PLUGIN_HOOKS['migratetypes']['datainjection'] = 'plugin_datainjection_migratetypes_datainjection';

Expand Down Expand Up @@ -84,6 +94,8 @@ function plugin_init_datainjection()
$PLUGIN_HOOKS['add_javascript']['datainjection'] = 'js/datainjection.js';

$INJECTABLE_TYPES = [];

// plugin_datainjection_creationInjectableAssets();
Comment thread
tsmr marked this conversation as resolved.
Outdated
}
}

Expand Down Expand Up @@ -115,8 +127,8 @@ function plugin_version_datainjection()
function getTypesToInject(): void
{
/** @var array $INJECTABLE_TYPES */
/** @var array $PLUGIN_HOOKS */
global $INJECTABLE_TYPES,$PLUGIN_HOOKS;
/** @var array $CFG_GLPI */
global $INJECTABLE_TYPES,$CFG_GLPI;

if (count($INJECTABLE_TYPES)) {
// already populated
Expand Down Expand Up @@ -220,6 +232,101 @@ function getTypesToInject(): void
];
//Add plugins
Plugin::doHook('plugin_datainjection_populate');

// Register injectable assets dynamically
plugin_datainjection_registerInjectableAssets();

plugin_datainjection_creationInjectableAssets();
}


/**
* Register injection classes for each injectable asset definition
*/
function plugin_datainjection_registerInjectableAssets(): void
{
/** @var array $INJECTABLE_TYPES */
/** @var array $CFG_GLPI */
global $INJECTABLE_TYPES, $CFG_GLPI;

if (!isset($CFG_GLPI['injectable_types']) || empty($CFG_GLPI['injectable_types'])) {
return;
}

// For each injectable asset definition, create and register a distinct class
foreach ($CFG_GLPI['injectable_types'] as $definition_id => $itemtype) {
// Get the asset definition to extract the system name

$definition = AssetDefinition::getById($definition_id);
if ($definition->getAssetClassName() === $itemtype) {
Comment thread
tsmr marked this conversation as resolved.
// Use the system name to create a nice class name
$system_name = ucfirst($definition->fields['system_name']);//strtolower()
$injection_class = 'PluginDatainjection' . $system_name . 'AssetInjection';

// Only create if not already registered
if (!isset($INJECTABLE_TYPES[$injection_class])) {
$INJECTABLE_TYPES[$injection_class] = 'datainjection';
}
}
}
}

/**
* Register injection classes for each injectable asset definition
*/
function plugin_datainjection_creationInjectableAssets(): void
{
/** @var array $CFG_GLPI */
global $CFG_GLPI;

if (!isset($CFG_GLPI['injectable_types']) || empty($CFG_GLPI['injectable_types'])) {
return;
}


// For each injectable asset definition, create and register a distinct class
foreach ($CFG_GLPI['injectable_types'] as $definition_id => $itemtype) {
$definition = AssetDefinition::getById($definition_id);
// Get the asset definition to extract the system name
if ($definition->getAssetClassName() === $itemtype) {
// Use the system name to create a nice class name
$system_name = ucfirst($definition->fields['system_name']);//strtolower()
$injection_class = 'PluginDatainjection' . $system_name . 'AssetInjection';

plugin_datainjection_createAssetInjectionClass($injection_class, $definition_id);
}
}
}

/**
* Dynamically create an asset injection class
*/
function plugin_datainjection_createAssetInjectionClass(string $class_name, int $definition_id): void
{

// Check if class already exists
if (class_exists($class_name)) {
return;
}

// Create the class dynamically (not final, so it can be extended)
$code = <<<PHP

use GlpiPlugin\\Datainjection\\Glpi\\Asset\\AssetInjection;

final class $class_name extends AssetInjection implements PluginDatainjectionInjectionInterface
{
protected static int \$fixed_asset_definition_id = $definition_id;

public static function getAssetDefinitionID(): int
{
return self::\$fixed_asset_definition_id;
}
}
PHP;

eval($code);
Comment thread
tsmr marked this conversation as resolved.

}


Expand Down
Loading