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
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.
}
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();
}
}

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) {
// 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