This commit is contained in:
Stanislas
2025-07-16 10:58:25 +02:00
parent d16f837062
commit 2e0217ead0
8 changed files with 246 additions and 84 deletions

View File

@@ -5,8 +5,11 @@
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.75",
"friendsoftwig/twigcs": "^6.1",
"glpi-project/phpstan-glpi": "^1.0",
"glpi-project/tools": "^0.7.5",
"php-parallel-lint/php-parallel-lint": "^1.4"
"php-parallel-lint/php-parallel-lint": "^1.4",
"phpstan/phpstan": "^2.1",
"phpstan/phpstan-deprecation-rules": "^2.0"
},
"config": {
"optimize-autoloader": true,

155
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "981190cd221bfc071af80a355f4b0b57",
"content-hash": "0b8145569965029789c21a725b504a22",
"packages": [],
"packages-dev": [
{
@@ -565,6 +565,54 @@
},
"time": "2024-11-27T21:59:24+00:00"
},
{
"name": "glpi-project/phpstan-glpi",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/glpi-project/phpstan-glpi.git",
"reference": "432f7a10d221f60abdbd4ab4676dbd846a485df1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/glpi-project/phpstan-glpi/zipball/432f7a10d221f60abdbd4ab4676dbd846a485df1",
"reference": "432f7a10d221f60abdbd4ab4676dbd846a485df1",
"shasum": ""
},
"require": {
"php": ">=7.4",
"phpstan/phpstan": "^2.1"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.75",
"php-parallel-lint/php-parallel-lint": "^1.4",
"phpstan/phpstan-phpunit": "^2.0",
"phpunit/phpunit": "^9.6"
},
"type": "phpstan-extension",
"extra": {
"phpstan": {
"includes": [
"rules.neon"
]
}
},
"autoload": {
"psr-4": {
"PHPStanGlpi\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "PHPStan rules for GLPI.",
"support": {
"issues": "https://github.com/glpi-project/phpstan-glpi/issues",
"source": "https://github.com/glpi-project/phpstan-glpi/tree/1.0.0"
},
"time": "2025-06-24T11:45:31+00:00"
},
{
"name": "glpi-project/tools",
"version": "0.7.5",
@@ -682,6 +730,111 @@
},
"time": "2024-03-27T12:14:49+00:00"
},
{
"name": "phpstan/phpstan",
"version": "2.1.17",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
"reference": "89b5ef665716fa2a52ecd2633f21007a6a349053"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/89b5ef665716fa2a52ecd2633f21007a6a349053",
"reference": "89b5ef665716fa2a52ecd2633f21007a6a349053",
"shasum": ""
},
"require": {
"php": "^7.4|^8.0"
},
"conflict": {
"phpstan/phpstan-shim": "*"
},
"bin": [
"phpstan",
"phpstan.phar"
],
"type": "library",
"autoload": {
"files": [
"bootstrap.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "PHPStan - PHP Static Analysis Tool",
"keywords": [
"dev",
"static analysis"
],
"support": {
"docs": "https://phpstan.org/user-guide/getting-started",
"forum": "https://github.com/phpstan/phpstan/discussions",
"issues": "https://github.com/phpstan/phpstan/issues",
"security": "https://github.com/phpstan/phpstan/security/policy",
"source": "https://github.com/phpstan/phpstan-src"
},
"funding": [
{
"url": "https://github.com/ondrejmirtes",
"type": "github"
},
{
"url": "https://github.com/phpstan",
"type": "github"
}
],
"time": "2025-05-21T20:55:28+00:00"
},
{
"name": "phpstan/phpstan-deprecation-rules",
"version": "2.0.3",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan-deprecation-rules.git",
"reference": "468e02c9176891cc901143da118f09dc9505fc2f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/468e02c9176891cc901143da118f09dc9505fc2f",
"reference": "468e02c9176891cc901143da118f09dc9505fc2f",
"shasum": ""
},
"require": {
"php": "^7.4 || ^8.0",
"phpstan/phpstan": "^2.1.15"
},
"require-dev": {
"php-parallel-lint/php-parallel-lint": "^1.2",
"phpstan/phpstan-phpunit": "^2.0",
"phpunit/phpunit": "^9.6"
},
"type": "phpstan-extension",
"extra": {
"phpstan": {
"includes": [
"rules.neon"
]
}
},
"autoload": {
"psr-4": {
"PHPStan\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.",
"support": {
"issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues",
"source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.3"
},
"time": "2025-05-14T10:56:57+00:00"
},
{
"name": "psr/container",
"version": "2.0.2",

View File

@@ -47,11 +47,6 @@ if (isset($_SESSION['glpipopup']['name'])) {
Html::popHeader(__('Test rules engine'), $_SERVER['PHP_SELF']);
include '../../../front/rulesengine.test.php';
break;
case 'show_cache':
Html::popHeader(__('Cache information'), $_SERVER['PHP_SELF']);
include '../../../front/rule.cache.php';
break;
}
echo "<div class='center'><br><a href='javascript:window.close()'>" . __('Back') . '</a>';
echo '</div>';

View File

@@ -350,7 +350,7 @@ function plugin_example_searchOptionsValues($options = [])
switch ($table . '.' . $field) {
case 'glpi_plugin_example_examples.serial':
echo __('Not really specific - Use your own dropdown - Just for example', 'example');
GlpiDropdown::show(
Dropdown::show(
getItemTypeForTable($options['searchoption']['table']),
['value' => $options['value'],
'name' => $options['name'],
@@ -729,6 +729,7 @@ function plugin_example_Status($param)
// Do checks (no check for example)
$ok = true;
echo 'example plugin: example';
if ($ok) {
echo '_OK';
} else {

18
phpstan.neon Normal file
View File

@@ -0,0 +1,18 @@
parameters:
parallel:
maximumNumberOfProcesses: 2
level: 5
paths:
- front
- src
- hook.php
- setup.php
- report.php
scanDirectories:
- ../../inc
- ../../src
- ../../front
bootstrapFiles:
- ../../stubs/glpi_constants.php
- ../../vendor/autoload.php

View File

@@ -250,9 +250,6 @@ function plugin_init_example()
$PLUGIN_HOOKS['status']['example'] = 'plugin_example_Status';
// CSRF compliance : All actions must be done via POST and forms closed by Html::closeForm();
$PLUGIN_HOOKS[Hooks::CSRF_COMPLIANT]['example'] = true;
$PLUGIN_HOOKS[Hooks::DISPLAY_CENTRAL]['example'] = 'plugin_example_display_central';
$PLUGIN_HOOKS[Hooks::DISPLAY_LOGIN]['example'] = 'plugin_example_display_login';
$PLUGIN_HOOKS[Hooks::INFOCOM]['example'] = 'plugin_example_infocom_hook';
@@ -267,11 +264,8 @@ function plugin_init_example()
$PLUGIN_HOOKS[Hooks::PRE_ITEM_FORM]['example'] = [ItemForm::class, 'preItemForm'];
$PLUGIN_HOOKS[Hooks::POST_ITEM_FORM]['example'] = [ItemForm::class, 'postItemForm'];
//TODO: remove check when GLPI 11.0.0 is released
if (version_compare(GLPI_VERSION, '11.0.0', 'ge')) {
$PLUGIN_HOOKS[Hooks::PRE_ITIL_INFO_SECTION]['example'] = [ItemForm::class, 'preSection'];
$PLUGIN_HOOKS[Hooks::POST_ITIL_INFO_SECTION]['example'] = [ItemForm::class, 'postSection'];
}
$PLUGIN_HOOKS[Hooks::PRE_ITIL_INFO_SECTION]['example'] = [ItemForm::class, 'preSection'];
$PLUGIN_HOOKS[Hooks::POST_ITIL_INFO_SECTION]['example'] = [ItemForm::class, 'postSection'];
// Add new actions to timeline
$PLUGIN_HOOKS[Hooks::TIMELINE_ACTIONS]['example'] = [
@@ -297,11 +291,8 @@ function plugin_init_example()
ComputerModelFilter::class,
];
//TODO: remove check when GLPI 11.0.0 is released
if (version_compare(GLPI_VERSION, '11.0.0', 'ge')) {
// Icon in the impact analysis
$PLUGIN_HOOKS[Hooks::SET_ITEM_IMPACT_ICON]['example'] = 'plugin_example_set_impact_icon';
}
// Icon in the impact analysis
$PLUGIN_HOOKS[Hooks::SET_ITEM_IMPACT_ICON]['example'] = 'plugin_example_set_impact_icon';
}

View File

@@ -96,5 +96,6 @@ class Config extends CommonDBTM
$config = new self();
$config->showFormExample();
}
return true;
}
}

View File

@@ -35,14 +35,20 @@
namespace GlpiPlugin\Example;
use Central;
use CommonDBTM;
use CommonGLPI;
use Computer;
use DBmysql;
use Html;
use Item_Disk;
use Log;
use MassiveAction;
use Notification;
use Phone;
use Preference;
use Session;
use Supplier;
// Class of the defined type
class Example extends CommonDBTM
@@ -168,7 +174,7 @@ class Example extends CommonDBTM
*
* @param $task Object of CronTask class for log / stat
*
* @return interger
* @return int
* >0 : done
* <0 : to be run again (not finished)
* 0 : nothing to do
@@ -212,33 +218,34 @@ class Example extends CommonDBTM
public function getTabNameForItem(CommonGLPI $item, $withtemplate = 0)
{
if (!$withtemplate) {
switch ($item->getType()) {
case 'Profile':
if ($item->getField('central')) {
return __('Example', 'example');
}
break;
case 'Phone':
if ($_SESSION['glpishow_count_on_tabs']) {
return self::createTabEntry(
__('Example', 'example'),
countElementsInTable($this->getTable()),
);
}
if ($item instanceof Profile) {
if ($item->getField('central')) {
return __('Example', 'example');
}
case 'ComputerDisk':
case 'Supplier':
return [1 => __('Test Plugin', 'example'),
2 => __('Test Plugin 2', 'example')];
} elseif ($item instanceof Phone) {
if ($_SESSION['glpishow_count_on_tabs']) {
return self::createTabEntry(
__('Example', 'example'),
countElementsInTable($this->getTable()),
);
}
case 'Computer':
case 'Central':
case 'Preference':
case 'Notification':
return [1 => __('Test Plugin', 'example')];
return __('Example', 'example');
} elseif ($item instanceof Item_Disk || $item instanceof Supplier) {
return [
1 => __('Test Plugin', 'example'),
2 => __('Test Plugin 2', 'example'),
];
} elseif ($item instanceof Computer
|| $item instanceof Central
|| $item instanceof Preference
|| $item instanceof Notification) {
return [
1 => __('Test Plugin', 'example'),
];
}
}
@@ -247,53 +254,46 @@ class Example extends CommonDBTM
public static function displayTabContentForItem(CommonGLPI $item, $tabnum = 1, $withtemplate = 0)
{
switch ($item->getType()) {
case 'Phone':
echo __('Plugin Example on Phone', 'example');
break;
if ($item instanceof Phone) {
echo __('Plugin Example on Phone', 'example');
case 'Central':
echo __('Plugin central action', 'example');
break;
} elseif ($item instanceof Central) {
echo __('Plugin central action', 'example');
case 'Preference':
// Complete form display
$data = plugin_version_example();
} elseif ($item instanceof Preference) {
// Complete form display
$data = plugin_version_example();
echo "<form action='Where to post form'>";
echo "<table class='tab_cadre_fixe'>";
echo "<tr><th colspan='3'>" . $data['name'] . ' - ' . $data['version'];
echo '</th></tr>';
echo "<form action='Where to post form'>";
echo "<table class='tab_cadre_fixe'>";
echo "<tr><th colspan='3'>" . $data['name'] . ' - ' . $data['version'];
echo '</th></tr>';
echo "<tr class='tab_bg_1'><td>Name of the pref</td>";
echo '<td>Input to set the pref</td>';
echo "<tr class='tab_bg_1'><td>Name of the pref</td>";
echo '<td>Input to set the pref</td>';
echo "<td><input class='submit' type='submit' name='submit' value='submit'></td>";
echo '</tr>';
echo "<td><input class='submit' type='submit' name='submit' value='submit'></td>";
echo '</tr>';
echo '</table>';
echo '</form>';
break;
echo '</table>';
echo '</form>';
case 'Notification':
echo __('Plugin mailing action', 'example');
break;
} elseif ($item instanceof Notification) {
echo __('Plugin mailing action', 'example');
case 'ComputerDisk':
case 'Supplier':
if ($tabnum == 1) {
echo __('First tab of Plugin example', 'example');
} else {
echo __('Second tab of Plugin example', 'example');
}
break;
} elseif ($item instanceof Item_Disk || $item instanceof Supplier) {
if ($tabnum == 1) {
echo __('First tab of Plugin example', 'example');
} else {
echo __('Second tab of Plugin example', 'example');
}
default:
//TRANS: %1$s is a class name, %2$d is an item ID
printf(__('Plugin example CLASS=%1$s id=%2$d', 'example'), $item->getType(), $item->getField('id'));
break;
} else {
//TRANS: %1$s is a class name, %2$d is an item ID
printf(__('Plugin example CLASS=%1$s', 'example'), get_class($item));
}
return true;
}
@@ -338,7 +338,7 @@ class Example extends CommonDBTM
* @param $type position of the item in the time block (in, through, begin or end)
* @param $complete complete display (more details)
*
* @return Nothing (display function)
* @return void (display function)
**/
public static function displayPlanningItem(array $val, $who, $type = '', $complete = 0)
{
@@ -491,7 +491,7 @@ class Example extends CommonDBTM
public static function generateLinkContents($link, CommonDBTM $item, bool $safe_url = true)
{
if (strstr($link, '[EXAMPLE_ID]')) {
$link = str_replace('[EXAMPLE_ID]', $item->getID(), $link);
$link = str_replace('[EXAMPLE_ID]', (string) $item->getID(), $link);
return [$link];
}