Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
16 changes: 16 additions & 0 deletions inc/commoninjectionlib.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
* @link https://github.com/pluginsGLPI/datainjection
* -------------------------------------------------------------------------
*/
use Glpi\Asset\Asset;
use Glpi\Exception\Http\HttpException;
use Glpi\Features\AssignableItem;

Expand Down Expand Up @@ -334,6 +335,9 @@
public static function getItemtypeByInjectionClass($injectionClass)
{

if (is_a($injectionClass, Asset::class, true)) {
return Toolbox::ucfirst(getItemTypeForTable($injectionClass->getVirtualTable()));

Check failure on line 339 in inc/commoninjectionlib.class.php

View workflow job for this annotation

GitHub Actions / GLPI 11.0.x - php:8.5 - mariadb:11.8 / Continuous integration

Call to an undefined method Glpi\Asset\Asset::getVirtualTable().

Check failure on line 339 in inc/commoninjectionlib.class.php

View workflow job for this annotation

GitHub Actions / GLPI 11.0.x - php:8.2 - mariadb:10.6 / Continuous integration

Call to an undefined method Glpi\Asset\Asset::getVirtualTable().
}
return Toolbox::ucfirst(getItemTypeForTable($injectionClass->getTable()));
}

Expand All @@ -355,6 +359,11 @@
$injectionClass = ucfirst($itemtype) . 'Injection';
}

if (!class_exists($injectionClass)) {
plugin_datainjection_creationInjectableAssets();
}


if (!is_a($injectionClass, PluginDatainjectionInjectionInterface::class, true)) {
throw new HttpException(500, 'Class ' . $injectionClass . ' is not a valid class');
}
Expand Down Expand Up @@ -1994,6 +2003,13 @@
}
}

if (is_a($injectionClass, Asset::class, true)) {
if (method_exists($injectionClass, 'getAssetDefinitionID')) {
$assets_assetdefinitions_id = $injectionClass->getAssetDefinitionID();
$where .= " AND `assets_assetdefinitions_id` = '" . $assets_assetdefinitions_id . "'";
}
}

//Add additional parameters specific to this itemtype (or function checkPresent exists)
if (method_exists($injectionClass, 'checkPresent')) {
$where .= $injectionClass->checkPresent($this->values, $options);
Expand Down
6 changes: 5 additions & 1 deletion inc/injectiontype.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,10 @@
$name = $plugin->getName() . ': ';
}
$name .= call_user_func([$type, 'getTypeName']);

if ($typename == "GlpiPlugin\Datainjection\Glpi\Asset\AssetInjection") {
$typename = $instance->getVirtualType();

Check failure on line 83 in inc/injectiontype.class.php

View workflow job for this annotation

GitHub Actions / GLPI 11.0.x - php:8.5 - mariadb:11.8 / Continuous integration

Call to an undefined method CommonDBTM::getVirtualType().

Check failure on line 83 in inc/injectiontype.class.php

View workflow job for this annotation

GitHub Actions / GLPI 11.0.x - php:8.2 - mariadb:10.6 / Continuous integration

Call to an undefined method CommonDBTM::getVirtualType().
}
$values[$typename] = $name;
}
}
Expand Down Expand Up @@ -388,7 +392,7 @@
foreach ($options as $option) {
if (
isset($option['table'])
&& ($option['table'] == getItemTypeForTable($data['itemtype']))
&& ($option['table'] == $injectionClass->getTable())

Check failure on line 395 in inc/injectiontype.class.php

View workflow job for this annotation

GitHub Actions / GLPI 11.0.x - php:8.5 - mariadb:11.8 / Continuous integration

Call to an undefined method PluginDatainjectionInjectionInterface::getTable().

Check failure on line 395 in inc/injectiontype.class.php

View workflow job for this annotation

GitHub Actions / GLPI 11.0.x - php:8.2 - mariadb:10.6 / Continuous integration

Call to an undefined method PluginDatainjectionInjectionInterface::getTable().
&& ($option['linkfield'] == $data['value'])
&& ($option['displaytype'] != 'multiline_text')
&& ($mapping_or_info['value'] != $data['value'])
Expand Down
109 changes: 108 additions & 1 deletion 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 @@
/** @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());

Check failure on line 60 in setup.php

View workflow job for this annotation

GitHub Actions / GLPI 11.0.x - php:8.5 - mariadb:11.8 / Continuous integration

Parameter #1 $capacity of method Glpi\Asset\AssetDefinitionManager::registerCapacity() expects Glpi\Asset\Capacity\CapacityInterface, GlpiPlugin\Datainjection\Glpi\Asset\Capacity\IsInjectableCapacity given.

Check failure on line 60 in setup.php

View workflow job for this annotation

GitHub Actions / GLPI 11.0.x - php:8.5 - mariadb:11.8 / Continuous integration

Instantiated class GlpiPlugin\Datainjection\Glpi\Asset\Capacity\IsInjectableCapacity not found.

Check failure on line 60 in setup.php

View workflow job for this annotation

GitHub Actions / GLPI 11.0.x - php:8.2 - mariadb:10.6 / Continuous integration

Parameter #1 $capacity of method Glpi\Asset\AssetDefinitionManager::registerCapacity() expects Glpi\Asset\Capacity\CapacityInterface, GlpiPlugin\Datainjection\Glpi\Asset\Capacity\IsInjectableCapacity given.

Check failure on line 60 in setup.php

View workflow job for this annotation

GitHub Actions / GLPI 11.0.x - php:8.2 - mariadb:10.6 / Continuous integration

Instantiated class GlpiPlugin\Datainjection\Glpi\Asset\Capacity\IsInjectableCapacity not found.

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

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

$INJECTABLE_TYPES = [];

// plugin_datainjection_creationInjectableAssets();
}
}

Expand Down Expand Up @@ -116,7 +128,7 @@
{
/** @var array $INJECTABLE_TYPES */
/** @var array $PLUGIN_HOOKS */
global $INJECTABLE_TYPES,$PLUGIN_HOOKS;
global $INJECTABLE_TYPES,$CFG_GLPI;

Check failure on line 131 in setup.php

View workflow job for this annotation

GitHub Actions / GLPI 11.0.x - php:8.5 - mariadb:11.8 / Continuous integration

Variable $PLUGIN_HOOKS in PHPDoc tag `@var` does not match any global variable: $INJECTABLE_TYPES, $CFG_GLPI

Check failure on line 131 in setup.php

View workflow job for this annotation

GitHub Actions / GLPI 11.0.x - php:8.2 - mariadb:10.6 / Continuous integration

Variable $PLUGIN_HOOKS in PHPDoc tag `@var` does not match any global variable: $INJECTABLE_TYPES, $CFG_GLPI

if (count($INJECTABLE_TYPES)) {
// already populated
Expand Down Expand Up @@ -220,6 +232,101 @@
];
//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) {
// 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);

}


Expand Down
Loading
Loading