mirror of
https://github.com/Combodo/iTop.git
synced 2026-04-23 02:28:44 +02:00
Compare commits
17 Commits
feature/25
...
feature/86
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
981d5c6263 | ||
|
|
4ed21dc21a | ||
|
|
1f4a2f0f56 | ||
|
|
bf7a756714 | ||
|
|
428d2c6356 | ||
|
|
8982f7e0e3 | ||
|
|
bb8a09d8e2 | ||
|
|
901f8f2a7b | ||
|
|
ba6fff801b | ||
|
|
50098bad73 | ||
|
|
65c9145b10 | ||
|
|
437296eab9 | ||
|
|
7cf6f65265 | ||
|
|
491f55c7bd | ||
|
|
7b44ec23a1 | ||
|
|
f00b8d529c | ||
|
|
af44ffd0ad |
101
.doc/README.md
101
.doc/README.md
@@ -1,101 +0,0 @@
|
|||||||
# Phpdoc dokuwiki template
|
|
||||||
This directory contains a template for rendering iTop phpdoc as dokuwiki pages.
|
|
||||||
|
|
||||||
|
|
||||||
Conventional tags that you should use:
|
|
||||||
* `@internal` : exclude from the documentation.
|
|
||||||
* `@api` : it means that a method is an api, thus it may be interacted with.
|
|
||||||
* `@see` : it points to another documented method
|
|
||||||
* `@link` : external url
|
|
||||||
* if you point to another page of the wiki, please use relative links.
|
|
||||||
* `@example` : let you provide example of code
|
|
||||||
* `@param`, `@return`, `@throws`, ...
|
|
||||||
|
|
||||||
|
|
||||||
## Special instructions
|
|
||||||
|
|
||||||
Some iTop specific tags were added :
|
|
||||||
* `@api-advanced`: it means that a method is an `@api` but mark it also as "complex" to use
|
|
||||||
* `@overwritable-hook`: used to mark a method as "designed to be extended"
|
|
||||||
* `@extension-hook`: not used for now
|
|
||||||
* `@phpdoc-tuning-exclude-inherited`: once this tag is present on a class, it's inherited methods won't be showed.
|
|
||||||
|
|
||||||
|
|
||||||
### known limitations:
|
|
||||||
#### `@see` tags must be very specific:
|
|
||||||
* always prefix class members (attributes or methods) with `ClassName::` (do not use self)
|
|
||||||
* for methods always suffix them with `()`,
|
|
||||||
* do not reference variables since they are not documented. If you have to, always prefix them with `$`
|
|
||||||
|
|
||||||
examples:
|
|
||||||
```
|
|
||||||
/**
|
|
||||||
* @see DBObject
|
|
||||||
* @see DBObject::Get()
|
|
||||||
* @see DBObject::$foo
|
|
||||||
*/
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Do not use inline tags, they do not work properly, example:
|
|
||||||
```
|
|
||||||
/**
|
|
||||||
* This is a texts with an inline tag {@see [FQSEN] [<description>]} it must never be used
|
|
||||||
*/
|
|
||||||
```
|
|
||||||
|
|
||||||
#### The `@example` tag must respect this very precise syntax
|
|
||||||
* the sentence in the first line (next to the tag) is the title, it must be enclosed by double quotes
|
|
||||||
* the following lines are the sample code.
|
|
||||||
* 💔 since we simply hack the official tag, this syntax must be respected carefully 💔
|
|
||||||
example:
|
|
||||||
```
|
|
||||||
/**
|
|
||||||
* @example "This is the title of the multiline example"
|
|
||||||
* $foo = DBObject::Get('foo');
|
|
||||||
* DBObject::Set('foo', ++$foo);
|
|
||||||
*/
|
|
||||||
```
|
|
||||||
|
|
||||||
## How content is included into the documentation
|
|
||||||
|
|
||||||
**For a class** those requirements have to be respected:
|
|
||||||
- the file containing the class must be listed in `/phpdoc/files/file[]` of `.doc/phpdoc-objects-manipulation.dist.xml`
|
|
||||||
- the class **must not** have the tag `@internal`
|
|
||||||
- the class **must** have at least one of: `@api`, `@api-advanced`, `@overwritable-hook`, `@extension-hook`
|
|
||||||
|
|
||||||
Then, **for a method** of an eligible class:
|
|
||||||
- **public** methods **must** have at least one of: `@api`, `@api-advanced`, `@overwritable-hook`, `@extension-hook`
|
|
||||||
- **protected** methods **must** have at least one of: `@overwritable-hook`, `@extension-hook`
|
|
||||||
- **private** methods are **always excluded**
|
|
||||||
|
|
||||||
**Class properties** and **constants** are never documented (this is subject to change).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## A note about the rendering engine
|
|
||||||
|
|
||||||
:notebook: as spaces are used to mark code, the templates (`.doc/phpdoc-templates/combodo-wiki/*`) have very few indentation, thus they are awful to read (sorry).
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
Note : PHP7 is required. Migrating to PHP8 requires some additional work which is questionable as an alternative way to generate a documentation is being considered.
|
|
||||||
|
|
||||||
```
|
|
||||||
cd .doc
|
|
||||||
composer require phpdocumentor/phpdocumentor:~2 --dev
|
|
||||||
```
|
|
||||||
|
|
||||||
## Generation
|
|
||||||
|
|
||||||
1. Switch to this directory : `cd /path/to/itop/.doc`
|
|
||||||
2. `composer install`
|
|
||||||
3. `./bin/build-doc-object-manipulation`
|
|
||||||
3. `./bin/build-doc-extensions`
|
|
||||||
4. Get the generated files from `/path/to/itop/data/phpdocumentor/output`
|
|
||||||
|
|
||||||
## Dokuwiki requirements
|
|
||||||
* the template uses the [wrap plugin](https://www.dokuwiki.org/plugin:wrap).
|
|
||||||
* the generated files have to be placed under an arbitrary directory of `[/path/to/dokuwiki]/data/pages`.
|
|
||||||
* the html has to be activated [config:htmlok](https://www.dokuwiki.org/config:htmlok)
|
|
||||||
* the generated files have to be in lowercase
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/sh -x
|
|
||||||
|
|
||||||
rm -rf /tmp/phpdoc-twig-cache/ && rm -rf data/phpdocumentor/output/extensions/ && rm -rf data/phpdocumentor/temp/extensions/ && ./vendor/bin/phpdoc -c ./phpdoc-extensions.dist.xml -vvv
|
|
||||||
|
|
||||||
# now wee need to lowercase every generated file because dokuwiki can't handle uppercase
|
|
||||||
cd ../data/phpdocumentor/output/extensions/ && for i in $(ls | grep [A-Z]); do mv -i $i $(echo $i | tr 'A-Z' 'a-z'); done
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#!/bin/sh -x
|
|
||||||
|
|
||||||
rm -rf /tmp/phpdoc-twig-cache/ && rm -rf ../data/phpdocumentor/output/objects-manipulation/ && rm -rf ../data/phpdocumentor/temp/objects-manipulation/ && ./vendor/bin/phpdoc -c ./phpdoc-objects-manipulation.dist.xml -vvv
|
|
||||||
|
|
||||||
|
|
||||||
# now wee need to lowercase every generated file because dokuwiki can't handle uppercase
|
|
||||||
cd ../data/phpdocumentor/output/objects-manipulation/ && for i in $( ls | grep [A-Z] ); do mv -i $i `echo $i | tr 'A-Z' 'a-z'`; done
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"require-dev": {
|
|
||||||
"phpdocumentor/phpdocumentor": "~2",
|
|
||||||
"jms/serializer": "1.7.*"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
3015
.doc/composer.lock
generated
3015
.doc/composer.lock
generated
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
Before Width: | Height: | Size: 983 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 1.4 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 3.0 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 4.8 MiB |
@@ -1,104 +0,0 @@
|
|||||||
# iTop version history
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
%%{init: { 'logLevel': 'debug', 'theme': 'base', 'themeVariables': {
|
|
||||||
'git0': 'lawngreen',
|
|
||||||
'git3': 'dodgerblue',
|
|
||||||
'git4': 'grey',
|
|
||||||
'git5': 'grey',
|
|
||||||
'git6': 'grey',
|
|
||||||
'git7': 'grey'
|
|
||||||
}, 'gitGraph': {'showBranches': true,'mainBranchName': 'develop','rotateCommitLabel': true}} }%%
|
|
||||||
gitGraph
|
|
||||||
commit id: "2016-07-06" tag: "2.3.0" type: HIGHLIGHT
|
|
||||||
branch support/2.3 order: 900
|
|
||||||
commit id: "2016-07-08" tag: "2.3.1"
|
|
||||||
commit id: "2016-12-22" tag: "2.3.3"
|
|
||||||
commit id: "2017-04-14" tag: "2.3.4"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2017-07-12" tag: "2.4.0-beta" type: REVERSE
|
|
||||||
commit id: "2017-11-16" tag: "2.4.0" type: HIGHLIGHT
|
|
||||||
branch support/2.4 order: 890
|
|
||||||
commit id: "2018-02-14" tag: "2.4.1"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2018-04-25" tag: "2.5.0-beta" type: REVERSE
|
|
||||||
checkout support/2.4
|
|
||||||
commit id: "2018-06-14" tag: "2.4.2"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2018-06-27" tag: "2.5.0" type: HIGHLIGHT
|
|
||||||
branch support/2.5 order: 880
|
|
||||||
checkout develop
|
|
||||||
commit id: "2019-01-09" tag: "2.6.0" type: HIGHLIGHT
|
|
||||||
branch support/2.6 order: 870
|
|
||||||
commit id: "2019-03-28" tag: "2.6.1"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2019-12-18" tag: "2.7.0-beta" type: REVERSE
|
|
||||||
checkout support/2.5
|
|
||||||
commit id: "2020-01-22" tag: "2.5.4"
|
|
||||||
checkout support/2.6
|
|
||||||
commit id: "2020-01-23" tag: "2.6.3"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2020-01-29" tag: "2.7.0-beta2" type: REVERSE
|
|
||||||
commit id: "2020-04-01" tag: "2.7.0-1" type: HIGHLIGHT
|
|
||||||
checkout support/2.6
|
|
||||||
commit id: "2020-04-22" tag: "2.6.4"
|
|
||||||
checkout develop
|
|
||||||
branch support/2.7 order: 860
|
|
||||||
commit id: "2020-06-26" tag: "2.7.1"
|
|
||||||
checkout support/2.7
|
|
||||||
commit id: "2020-12-09" tag: "2.7.3"
|
|
||||||
commit id: "2021-03-31" tag: "2.7.4"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2021-04-06" tag: "3.0.0-beta" type: REVERSE
|
|
||||||
checkout support/2.7
|
|
||||||
commit id: "2021-07-05" tag: "2.7.5"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2021-07-05." tag: "3.0.0-beta2" type: REVERSE
|
|
||||||
checkout support/2.7
|
|
||||||
commit id: "2021-12-17" tag: "2.7.6"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2022-01-04" tag: "3.0.0" type: HIGHLIGHT
|
|
||||||
branch support/3.0 order: 850
|
|
||||||
commit id: "2022-04-08" tag: "3.0.1"
|
|
||||||
checkout support/2.7
|
|
||||||
commit id: "2022-07-11" tag: "2.7.7"
|
|
||||||
checkout support/3.0
|
|
||||||
commit id: "2022-09-12" tag: "3.0.2-1"
|
|
||||||
checkout develop
|
|
||||||
checkout support/2.7
|
|
||||||
commit id: "2022-12-28" tag: "2.7.8"
|
|
||||||
checkout support/3.0
|
|
||||||
commit id: "2023-04-12" tag: "3.0.3"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2023-06-19" tag: "3.1.0-beta" type: REVERSE
|
|
||||||
commit id: "2023-07-26" tag: "3.1.0-1" type: HIGHLIGHT
|
|
||||||
branch support/3.1 order: 840
|
|
||||||
checkout support/3.1
|
|
||||||
commit id: "2023-08-09" tag: "3.1.0-2"
|
|
||||||
checkout support/2.7
|
|
||||||
commit id: "2023-08-10" tag: "2.7.9"
|
|
||||||
checkout support/3.1
|
|
||||||
commit id: "2023-12-20" tag: "3.1.1"
|
|
||||||
checkout develop
|
|
||||||
commit id: "2024-01-15" tag: "Start 3.2" type: HIGHLIGHT
|
|
||||||
branch support/3.2 order: 830
|
|
||||||
checkout support/2.7
|
|
||||||
commit id: "2024-01-17a" tag: "2.7.10"
|
|
||||||
checkout support/3.0
|
|
||||||
commit id: "2024-01-17b" tag: "3.0.4"
|
|
||||||
checkout support/2.7
|
|
||||||
commit id: "2024-09-28" tag: "2.7.11"
|
|
||||||
checkout support/3.1
|
|
||||||
commit id: "2024-09-27" tag: "3.1.2"
|
|
||||||
checkout support/3.2
|
|
||||||
commit id: "2024-06-25" tag: "3.2.0-beta1" type: REVERSE
|
|
||||||
commit id: "2024-08-07" tag: "3.2.0"
|
|
||||||
checkout support/2.7
|
|
||||||
commit id: "2025-02-25" tag: "2.7.12"
|
|
||||||
checkout support/3.1
|
|
||||||
commit id: "2025-02-25 " tag: "3.1.3"
|
|
||||||
checkout support/3.2
|
|
||||||
commit id: "2025-02-25 " tag: "3.2.1"
|
|
||||||
```
|
|
||||||
|
|
||||||
To learn more, check the [iTop community versions history on the official wiki](https://www.itophub.io/wiki/page?id=latest:release:start).
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
|
||||||
<phpdoc>
|
|
||||||
<title><![CDATA[iTop extensions]]></title>
|
|
||||||
|
|
||||||
<parser>
|
|
||||||
<target>../data/phpdocumentor/temp/extensions</target>
|
|
||||||
</parser>
|
|
||||||
|
|
||||||
<transformer>
|
|
||||||
<target>../data/phpdocumentor/output/extensions</target>
|
|
||||||
</transformer>
|
|
||||||
|
|
||||||
<transformations>
|
|
||||||
<template name="phpdoc-templates/combodo-wiki"/>
|
|
||||||
</transformations>
|
|
||||||
|
|
||||||
<files>
|
|
||||||
<file>../application/applicationextension.inc.php</file>
|
|
||||||
</files>
|
|
||||||
</phpdoc>
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
|
||||||
<phpdoc>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
/**
|
|
||||||
The documentation of this file can be found here : https://docs.phpdoc.org/references/configuration.html
|
|
||||||
it has to be completed by the CLI parameters documentation which is more comprehensive: https://docs.phpdoc.org/references/commands/project_run.html#usage
|
|
||||||
|
|
||||||
usage:
|
|
||||||
vendor/bin/phpdoc -c phpdoc-objects-manipulation.dist.xml
|
|
||||||
|
|
||||||
*/
|
|
||||||
-->
|
|
||||||
|
|
||||||
<title><![CDATA[iTop's objects manipulation API]]></title>
|
|
||||||
|
|
||||||
<parser>
|
|
||||||
<default-package-name>iTopORM</default-package-name>
|
|
||||||
<target>../data/phpdocumentor/temp/objects-manipulation</target>
|
|
||||||
<visibility>public,protected</visibility>
|
|
||||||
<markers>
|
|
||||||
<!--<item>TODO</item>-->
|
|
||||||
<!--<item>FIXME</item>-->
|
|
||||||
</markers>
|
|
||||||
<extensions>
|
|
||||||
<extension>php</extension>
|
|
||||||
</extensions>
|
|
||||||
</parser>
|
|
||||||
|
|
||||||
<transformer>
|
|
||||||
<target>../data/phpdocumentor/output/objects-manipulation</target>
|
|
||||||
</transformer>
|
|
||||||
|
|
||||||
<transformations>
|
|
||||||
<template name="phpdoc-templates/combodo-wiki"/>
|
|
||||||
</transformations>
|
|
||||||
|
|
||||||
<!--<logging>-->
|
|
||||||
<!--<level>warn</level>-->
|
|
||||||
<!--<paths>-->
|
|
||||||
<!--<!–<default>data/phpdocumentor/log/objects-manipulation/{DATE}.log</default>–>-->
|
|
||||||
<!--<!–<errors>data/phpdocumentor/log/objects-manipulation/{DATE}.errors.log</errors>–>-->
|
|
||||||
|
|
||||||
<!--<default>{APP_ROOT}/data/log/{DATE}.log</default>-->
|
|
||||||
<!--<errors>{APP_ROOT}/data/log/{DATE}.errors.log</errors>-->
|
|
||||||
<!--</paths>-->
|
|
||||||
<!--</logging>-->
|
|
||||||
|
|
||||||
<files>
|
|
||||||
<file>../core/dbobject.class.php</file>
|
|
||||||
<file>../core/dbobjectsearch.class.php</file>
|
|
||||||
<file>../core/metamodel.class.php</file>
|
|
||||||
<file>../core/dbobjectset.class.php</file>
|
|
||||||
<file>../core/dbsearch.class.php</file>
|
|
||||||
<file>../core/dbunionsearch.class.php</file>
|
|
||||||
</files>
|
|
||||||
|
|
||||||
</phpdoc>
|
|
||||||
@@ -1,136 +0,0 @@
|
|||||||
{% extends 'layout.txt.twig' %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<wrap button>[[start|🔙 Back]]</wrap>
|
|
||||||
|
|
||||||
{% if node.tags['internal'] is defined %}
|
|
||||||
====== {{ node.name }} ======
|
|
||||||
<WRAP alert>This class is "internal", and thus is not documented!</WRAP>
|
|
||||||
{% elseif node.tags['api'] is not defined and node.tags['api-advanced'] is not defined and node.tags['overwritable-hook'] is not defined and node.tags['extension-hook'] is not defined %}
|
|
||||||
====== {{ node.name }} ======
|
|
||||||
<WRAP alert>This class is neither "api", "api-advanced", "overwritable-hook" or "extension-hook", and thus is not documented!</WRAP>
|
|
||||||
{% else %}
|
|
||||||
|
|
||||||
====== {{ node.name }} ======
|
|
||||||
|
|
||||||
{% if node.deprecated %}<wrap danger>deprecated</wrap>{% endif %}
|
|
||||||
{% if node.abstract %}<wrap warning>abstract</wrap>{% endif %}
|
|
||||||
{% if node.final %}<wrap notice>final</wrap>{% endif %}
|
|
||||||
{% include 'includes/wrap-tags.txt.twig' with {structure:node, wrap: 'safety', wrapTags: ['api', 'api-advanced', 'overwritable-hook', 'extension-hook']} %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% if node.deprecated %}
|
|
||||||
=== **<del>Deprecated</del>**===
|
|
||||||
//{{ node.tags.deprecated[0].description }}//
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
== {{ node.summary|replace({"\n":""})|raw }} ==
|
|
||||||
<html>{{ node.description|markdown|raw }}</html>
|
|
||||||
|
|
||||||
|
|
||||||
{% include 'includes/code-examples.txt.twig' with {structure:node, title_level: '====='} %}
|
|
||||||
|
|
||||||
|
|
||||||
{% set class = node.parent %}
|
|
||||||
{% block hierarchy_element %}
|
|
||||||
|
|
||||||
{% if class and class.name is defined and class.name|trim != '' %}
|
|
||||||
==== parent ====
|
|
||||||
{% set child = class %}
|
|
||||||
{% set class = class.parent %}
|
|
||||||
{{ block('hierarchy_element') }}
|
|
||||||
[[{{ child.name }}|{{ child.name }}]]
|
|
||||||
{% endif %}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
|
|
||||||
{% for interface in node.interfaces|sort_asc %}
|
|
||||||
{% if loop.first %}
|
|
||||||
==== Implements ====
|
|
||||||
{% endif %}
|
|
||||||
{% if loop.length > 1 %} * {% endif %}{{ interface.fullyQualifiedStructuralElementName ?: interface }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
|
||||||
{% for trait in node.usedTraits|sort_asc %}
|
|
||||||
{% if loop.first %}
|
|
||||||
==== Uses traits ====
|
|
||||||
{% endif %}
|
|
||||||
{% if loop.length > 1 %} * {% endif %}{{ trait.fullyQualifiedStructuralElementName ?: trait }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
|
||||||
{% include 'includes/see-also.txt.twig' with {structure:node, title_level: '==='} %}
|
|
||||||
|
|
||||||
{% include 'includes/tags.txt.twig' with {structure:node, title_level: '=====', blacklist: ['link', 'see', 'abstract', 'example', 'method', 'property', 'property-read', 'property-write', 'package', 'subpackage', 'phpdoc-tuning-exclude-inherited', 'api', 'api-advanced', 'overwritable-hook', 'extension-hook', 'copyright', 'license', 'code-example']} %}
|
|
||||||
|
|
||||||
{% set methods = node.inheritedMethods.merge(node.methods.merge(node.magicMethods)) %}
|
|
||||||
{% include 'includes/tag-synthesys.txt.twig' with {methods:methods, tag:'api'} %}
|
|
||||||
{% include 'includes/tag-synthesys.txt.twig' with {methods:methods, tag:'api-advanced'} %}
|
|
||||||
{% include 'includes/tag-synthesys.txt.twig' with {methods:methods, tag:'overwritable-hook'} %}
|
|
||||||
{% include 'includes/tag-synthesys.txt.twig' with {methods:methods, tag:'extension-hook'} %}
|
|
||||||
|
|
||||||
|
|
||||||
{% include 'includes/code-examples.txt.twig' with {structure:node, title_level: '=====', sub_title_level: '=='} %}
|
|
||||||
|
|
||||||
<WRAP clear />
|
|
||||||
|
|
||||||
{% for method in methods|sort_asc
|
|
||||||
if method.visibility == 'public'
|
|
||||||
and (
|
|
||||||
method.tags['api'] is defined
|
|
||||||
or method.tags['api-advanced'] is defined
|
|
||||||
or method.tags['overwritable-hook'] is defined
|
|
||||||
or method.tags['extension-hook'] is defined
|
|
||||||
)
|
|
||||||
and (
|
|
||||||
node.tags['phpdoc-tuning-exclude-inherited'] is not defined
|
|
||||||
or method.parent.name == node.name
|
|
||||||
)
|
|
||||||
%}
|
|
||||||
{%- if loop.first %}
|
|
||||||
===== Public methods =====
|
|
||||||
{% endif %}
|
|
||||||
{{ block('method') }}
|
|
||||||
{% endfor %}
|
|
||||||
{% for method in methods|sort_asc if method.visibility == 'protected' and (method.tags['overwritable-hook'] is defined or method.tags['extension-hook'] is defined) %}
|
|
||||||
{%- if loop.first %}
|
|
||||||
===== Protected methods =====
|
|
||||||
{% endif %}
|
|
||||||
{{ block('method') }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% set constants = node.inheritedConstants.merge(node.constants) %}
|
|
||||||
{% if constants|length > 0 %}
|
|
||||||
===== Constants =====
|
|
||||||
{% for constant in constants|sort_asc %}
|
|
||||||
{{ block('constant') }}
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
{#{% set properties = node.inheritedProperties.merge(node.properties.merge(node.magicProperties)) %}#}
|
|
||||||
{#{% for property in properties|sort_asc if property.visibility == 'public' %}#}
|
|
||||||
{#{%- if loop.first %}#}
|
|
||||||
{#===== Public properties =====#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
{#{{ block('property') }}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
{#{% for property in properties|sort_asc if property.visibility == 'protected' %}#}
|
|
||||||
{#{%- if loop.first %}#}
|
|
||||||
{#===== Protected properties =====#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
{#{{ block('property') }}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
|
|
||||||
|
|
||||||
{%- endif %} {#{% elseif node.tags['xxx'] is not defined and ... #}
|
|
||||||
|
|
||||||
<wrap button>[[start|🔙 Back]]</wrap>
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
{% block constant %}
|
|
||||||
|
|
||||||
<WRAP group box >
|
|
||||||
<WRAP twothirds column >
|
|
||||||
==== {{ constant.name }} ====
|
|
||||||
</WRAP>{# twothirds column#}
|
|
||||||
|
|
||||||
<WRAP third column>
|
|
||||||
{% if constant.deprecated %}<wrap danger>deprecated</wrap> {% endif %}
|
|
||||||
{% if (node.parent is not null and constant.parent.fullyQualifiedStructuralElementName != node.fullyQualifiedStructuralElementName) %}<wrap notice>inherited</wrap> {% endif %}
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
|
|
||||||
== {{ constant.summary|replace({"\n":""})|raw }} ==
|
|
||||||
<html>{{ constant.description|markdown|raw }}</html>
|
|
||||||
|
|
||||||
{% if constant.deprecated %}
|
|
||||||
=== Deprecated ===
|
|
||||||
{{ constant.tags.deprecated[0].description|raw }}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% include 'includes/inherited-from.txt.twig' with {structure:constant} %}
|
|
||||||
|
|
||||||
{% include 'includes/see-also.txt.twig' with {structure:constant, title_level: '=='} %}
|
|
||||||
|
|
||||||
{% include 'includes/uses.txt.twig' with {structure:constant, title_level: '=='} %}
|
|
||||||
|
|
||||||
{% include 'includes/tags.txt.twig' with {structure:constant, title_level: '==', blacklist: ['link', 'see', 'var', 'deprecated', 'uses', 'package', 'subpackage', 'todo', 'code-example']} %}
|
|
||||||
|
|
||||||
</WRAP>{# group #}
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
{% block method %}
|
|
||||||
|
|
||||||
|
|
||||||
<WRAP group box >
|
|
||||||
<WRAP twothirds column >
|
|
||||||
==== {{ method.name }} ====
|
|
||||||
</WRAP>{# twothirds column#}
|
|
||||||
<WRAP third column >
|
|
||||||
{% include 'includes/wrap-tags.txt.twig' with {structure:method, wrap: 'safety', wrapTags: ['api', 'api-advanced', 'overwritable-hook', 'extension-hook']} %}
|
|
||||||
{% if method.deprecated %}<wrap danger>deprecated</wrap> {% endif %}
|
|
||||||
{% if (node.parent is not null and method.parent.fullyQualifiedStructuralElementName != node.fullyQualifiedStructuralElementName) %}<wrap notice>inherited</wrap> {% endif %}
|
|
||||||
{% if method.abstract %}<wrap warning>abstract</wrap> {% endif %}
|
|
||||||
{% if method.final %}<wrap notice>final</wrap> {% endif %}
|
|
||||||
<wrap notice>{{ method.visibility }}</wrap>
|
|
||||||
{% if method.static %}<wrap warning>static</wrap> {% endif %}
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
|
|
||||||
|
|
||||||
== {{ method.summary|replace({"\n":""})|raw }} ==
|
|
||||||
<html>{{ method.description|markdown|raw }}</html>
|
|
||||||
|
|
||||||
<code php>{% if method.abstract %}abstract {% endif %}{% if method.final %}final {% endif %}{{ method.visibility }} {% if method.static %}static {% endif %}{{ method.name }}({% for argument in method.arguments %}{{ argument.isVariadic ? '...' }}{{ argument.name }}{{ argument.default ? (' = '~argument.default)|raw }}{% if not loop.last %}, {% endif %}{% endfor %})</code>
|
|
||||||
|
|
||||||
<WRAP twothirds column >
|
|
||||||
|
|
||||||
|
|
||||||
=== Parameters ===
|
|
||||||
{% if method.arguments|length > 0 -%}
|
|
||||||
^ types ^ name ^ default ^ description ^
|
|
||||||
{% for argument in method.arguments -%}
|
|
||||||
| **<nowiki>{{ argument.types|join('|')|raw }}</nowiki>** | {{ argument.name }} {{ argument.isVariadic ? '<small style="color: gray">variadic</small>' }} | <nowiki>{{ argument.default|raw }}</nowiki> | {{ argument.description|trim|replace("\n", ' ')|raw }} |{{ "\r\n" }}
|
|
||||||
{%- endfor %}
|
|
||||||
{% else %}
|
|
||||||
//none//
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
{#=== Parameters ===#}
|
|
||||||
{#{% if method.arguments|length > 0 -%}#}
|
|
||||||
{#{% for argument in method.arguments -%}#}
|
|
||||||
{#== {{ argument.name }} ==#}
|
|
||||||
|
|
||||||
|
|
||||||
{#{% set varDesc %}#}
|
|
||||||
{#<span style="margin:0 10px; 0 20px; font-weight: bold;">{{ argument.types|join('|') }}</span>#}
|
|
||||||
{#{{ argument.isVariadic ? '<small style="color: gray">variadic</small>' }}#}
|
|
||||||
{#{{ argument.description|raw }}#}
|
|
||||||
{#{% endset %}#}
|
|
||||||
{#<html>{{ varDesc|markdown|raw }}</html>#}
|
|
||||||
{#{%- endfor %}#}
|
|
||||||
{#{% else %}#}
|
|
||||||
{#<wrap tip>This method has no parameter</wrap>#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
|
|
||||||
|
|
||||||
{% if method.response and method.response.types|join() != 'void' %}
|
|
||||||
=== Returns ===
|
|
||||||
<html>{{ ('**' ~ method.response.types|join('|')|trim ~ '** ' ~ method.response.description)|markdown|raw }}</html>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
</WRAP>{# twothirds column#}
|
|
||||||
|
|
||||||
<WRAP third column >
|
|
||||||
|
|
||||||
{% if method.tags.throws|length > 0 or method.tags.throw|length > 0 %}
|
|
||||||
=== Throws ===
|
|
||||||
{% for exception in method.tags.throws -%}
|
|
||||||
{% if loop.length > 1 %} * {% endif %}''{{ exception.types|join('|')|raw }}'' <nowiki>{{ exception.description|raw }}</nowiki>
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% include 'includes/inherited-from.txt.twig' with {structure:method} %}
|
|
||||||
|
|
||||||
{% include 'includes/see-also.txt.twig' with {structure:method, title_level: '==='} %}
|
|
||||||
|
|
||||||
{% include 'includes/uses.txt.twig' with {structure:method, title_level: '==='} %}
|
|
||||||
|
|
||||||
{% include 'includes/used-by.txt.twig' with {structure:method, title_level: '==='} %}
|
|
||||||
|
|
||||||
{% include 'includes/tags-with-description.txt.twig' with {structure:method, title_level: '===', WRAP: 'info', tagsWithDescription: ['api', 'api-advanced', 'overwritable-hook', 'extension-hook']} %}
|
|
||||||
|
|
||||||
{% include 'includes/tags.txt.twig' with {structure:method, title_level: '===', blacklist: ['todo', 'link', 'see', 'abstract', 'example', 'param', 'return', 'access', 'deprecated', 'throws', 'throw', 'uses', 'api', 'api-advanced', 'overwritable-hook', 'extension-hook', 'used-by', 'inheritdoc', 'code-example']} %}
|
|
||||||
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% include 'includes/code-examples.txt.twig' with {structure:method, title_level: '==='} %}
|
|
||||||
|
|
||||||
</WRAP>{# group #}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
{% block property %}
|
|
||||||
|
|
||||||
<WRAP group box>
|
|
||||||
<WRAP twothirds column >
|
|
||||||
==== ${{ property.name }} ====
|
|
||||||
</WRAP>{# twothirds column#}
|
|
||||||
|
|
||||||
<WRAP third column>
|
|
||||||
{% if property.deprecated %}<wrap danger>deprecated</wrap> {% endif %}
|
|
||||||
{% if (node.parent is not null and property.parent.fullyQualifiedStructuralElementName != node.fullyQualifiedStructuralElementName) %}<wrap notice>inherited</wrap> {% endif %}
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
== {{ property.summary|replace({"\n":""})|raw }} ==
|
|
||||||
<html>{{ property.description|markdown|raw }}</html>
|
|
||||||
{% if property.var.0.description %}<html>{{ property.var.0.description|markdown|raw }}</html>{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{#{% if property.types %}#}
|
|
||||||
{#== Type ==#}
|
|
||||||
{#{% for type in property.types %}#}
|
|
||||||
{#{% if loop.length > 1 %} * {% endif %}{{ type|raw }} : {{ type.description|raw }}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
{#{{ property.types|join('|')|raw }}#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
|
|
||||||
|
|
||||||
{% if property.deprecated %}
|
|
||||||
== Deprecated ==
|
|
||||||
{{ property.tags.deprecated[0].description }}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% include 'includes/inherited-from.txt.twig' with {structure:property} %}
|
|
||||||
|
|
||||||
{% include 'includes/see-also.txt.twig' with {structure:property, title_level: '=='} %}
|
|
||||||
|
|
||||||
{% include 'includes/uses.txt.twig' with {structure:property, title_level: ''} %}
|
|
||||||
|
|
||||||
{% include 'includes/tags.txt.twig' with {structure:property, title_level: '==', blacklist: ['link', 'see', 'access', 'var', 'deprecated', 'uses', 'todo', 'code-example']} %}
|
|
||||||
|
|
||||||
|
|
||||||
<code php>{{ property.visibility }} ${{ property.name }}{% if property.types %} : {{ property.types|join('|')|raw }}{% endif %}</code>
|
|
||||||
|
|
||||||
</WRAP>{# group #}
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{{ node.source|raw }}
|
|
||||||
@@ -1,122 +0,0 @@
|
|||||||
{% extends 'layout.txt.twig' %}
|
|
||||||
|
|
||||||
{% block javascripts %}
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
{#<section class="row-fluid">#}
|
|
||||||
{#<div class="span2 sidebar">#}
|
|
||||||
{#{% set namespace = project.namespace %}#}
|
|
||||||
{#{{ block('sidebarNamespaces') }}#}
|
|
||||||
{#</div>#}
|
|
||||||
{#</section>#}
|
|
||||||
{#<section class="row-fluid">#}
|
|
||||||
====== {{ node.path|split('/')|slice(0,-1)|join('/') }}{{ node.name }} ======
|
|
||||||
{{ node.summary }}
|
|
||||||
<html>{{ node.description|markdown|raw }}</html>
|
|
||||||
|
|
||||||
{% if node.traits|length > 0 %}
|
|
||||||
|
|
||||||
===== Traits =====
|
|
||||||
{% for trait in node.traits %}
|
|
||||||
<tr>
|
|
||||||
<td>{{ trait|raw }}</td>
|
|
||||||
<td><em>{{ trait.summary }}</em></td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
{% if node.interfaces|length > 0 %}
|
|
||||||
===== Interfaces =====
|
|
||||||
{% for interface in node.interfaces %}
|
|
||||||
<tr>
|
|
||||||
<td>{{ interface|raw }}</td>
|
|
||||||
<td><em>{{ interface.summary }}</em></td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if node.classes|length > 0 %}
|
|
||||||
===== Classes =====
|
|
||||||
{% for class in node.classes %}
|
|
||||||
{{ class|raw }}
|
|
||||||
<em>{{ class.summary }}</em>
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if node.package is not empty and node.package != '\\' %}
|
|
||||||
===== Package =====
|
|
||||||
{{ node.subpackage ? (node.package ~ '\\' ~ node.subpackage) : node.package }}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% for tagName,tags in node.tags if tagName in ['link', 'see'] %}
|
|
||||||
{% if loop.first %}
|
|
||||||
===== See also =====
|
|
||||||
{% endif %}
|
|
||||||
{% for tag in tags %}
|
|
||||||
<dd><a href="{{ tag.reference ?: tag.link }}"><div class="namespace-wrapper">{{ tag.description ?: tag.reference }}</div></a></dd>
|
|
||||||
{% endfor %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
<h2>Tags</h2>
|
|
||||||
<table class="table table-condensed">
|
|
||||||
{% for tagName,tags in node.tags if tagName not in ['link', 'see', 'package', 'subpackage'] %}
|
|
||||||
<tr>
|
|
||||||
<th>
|
|
||||||
{{ tagName }}
|
|
||||||
</th>
|
|
||||||
<td>
|
|
||||||
{% for tag in tags %}
|
|
||||||
{{ tag.description|markdown|raw }}
|
|
||||||
{% endfor %}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% else %}
|
|
||||||
<tr><td colspan="2"><em>None found</em></td></tr>
|
|
||||||
{% endfor %}
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</aside>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% if node.constants|length > 0 %}
|
|
||||||
<div class="row-fluid">
|
|
||||||
<section class="span8 content file">
|
|
||||||
<h2>Constants</h2>
|
|
||||||
</section>
|
|
||||||
<aside class="span4 detailsbar"></aside>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% for constant in node.constants %}
|
|
||||||
{{ block('constant') }}
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if node.functions|length > 0 %}
|
|
||||||
<div class="row-fluid">
|
|
||||||
<section class="span8 content file">
|
|
||||||
<h2>Functions</h2>
|
|
||||||
</section>
|
|
||||||
<aside class="span4 detailsbar"></aside>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% for method in node.functions %}
|
|
||||||
{{ block('method') }}
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<div id="source-view" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="source-view-label" aria-hidden="true">
|
|
||||||
<div class="modal-header">
|
|
||||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
|
||||||
<h3 id="source-view-label">{{ node.file.name }}</h3>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<pre data-src="{{ path('files/' ~ node.path ~ '.txt')|raw }}" class="language-php line-numbers"></pre>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
{% extends 'layout.html.twig' %}
|
|
||||||
|
|
||||||
{% block stylesheets %}
|
|
||||||
<link href="{{ path('css/jquery.iviewer.css') }}" rel="stylesheet" media="all"/>
|
|
||||||
<style>
|
|
||||||
#viewer {
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.wrapper {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block javascripts %}
|
|
||||||
<script src="{{ path('js/jquery.mousewheel.js') }}" type="text/javascript"></script>
|
|
||||||
<script src="{{ path('js/jquery.iviewer.js') }}" type="text/javascript"></script>
|
|
||||||
<script type="text/javascript">
|
|
||||||
$(window).resize(function(){
|
|
||||||
$("#viewer").height($(window).height() - 100);
|
|
||||||
});
|
|
||||||
|
|
||||||
$(document).ready(function() {
|
|
||||||
$("#viewer").iviewer({src: '{{ path('graphs/classes.svg') }}', zoom_animation: false});
|
|
||||||
$('#viewer img').on('dragstart', function(event){
|
|
||||||
event.preventDefault();
|
|
||||||
});
|
|
||||||
$(window).resize();
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="row-fluid">
|
|
||||||
<div class="span12">
|
|
||||||
<div class="wrapper">
|
|
||||||
<div id="viewer" class="viewer"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# Fixes a vulnerability in CentOS: http://stackoverflow.com/questions/20533279/prevent-php-from-parsing-non-php-files-such-as-somefile-php-txt
|
|
||||||
<FilesMatch \.php\.txt$>
|
|
||||||
RemoveHandler .php
|
|
||||||
ForceType text/plain
|
|
||||||
</FilesMatch>
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
{% if title_level is not defined %}
|
|
||||||
{%- set title_level = '==' -%}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if sub_title_level is not defined %}
|
|
||||||
{%- set sub_title_level = title_level|slice(1) -%}
|
|
||||||
{% endif %}
|
|
||||||
{% if sub_title_level == '=' %}
|
|
||||||
{%- set sub_title_level = '' -%}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{#{% for tagName,tags in structure.tags if tagName in ['code-example'] %}#}
|
|
||||||
{#{% if loop.first %}#}
|
|
||||||
{#{{title_level}} Examples {{title_level}}#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
{#{% for tag in tags %}#}
|
|
||||||
{#{%- set descToken = tag.description|split("\n", 2) -%}#}
|
|
||||||
{#{%- set title = descToken[0] -%}#}
|
|
||||||
{#{%- set code = descToken[1] -%}#}
|
|
||||||
{#{{sub_title_level}} {{ title }} {{sub_title_level}}#}
|
|
||||||
{#<code php>{{ code|raw }}</code>#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
|
|
||||||
|
|
||||||
{% for tagName,tags in structure.tags if tagName in ['example'] %}
|
|
||||||
{% if loop.first %}
|
|
||||||
{{title_level}} Examples {{title_level}}
|
|
||||||
{% endif %}
|
|
||||||
{% for tag in tags %}
|
|
||||||
{{ sub_title_level }} {{ tag.filePath|escape }}{{ sub_title_level }}
|
|
||||||
<code php>{{ tag.description|raw }}</code>
|
|
||||||
{% endfor %}
|
|
||||||
{% endfor %}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
{% if title_level is not defined %}
|
|
||||||
{% set title_level='' %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if (node.parent is null) %}
|
|
||||||
{{title_level}} File {{ structure.path }} {{title_level}}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if (node.parent is not null and structure.parent.fullyQualifiedStructuralElementName != node.fullyQualifiedStructuralElementName) %}
|
|
||||||
{{title_level}} Inherited from {{title_level}}
|
|
||||||
[[{{structure.parent}}|{{structure.parent}}]]
|
|
||||||
{% endif %}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
{% for structure in structures|sort_asc if structure.tags['internal'] is not defined and (structure.tags['api'] is defined or structure.tags['api-advanced'] is defined or structure.tags['overwritable-hook'] is defined or structure.tags['extension-hook'] is defined ) %}
|
|
||||||
{#{{ structure|raw }}#}
|
|
||||||
|
|
||||||
{% set structureName = structure|trim('\\', 'left') %}
|
|
||||||
|
|
||||||
<WRAP group box>
|
|
||||||
<WRAP twothirds column >
|
|
||||||
==== {{ structureName }} ====
|
|
||||||
</WRAP>{# twothirds column#}
|
|
||||||
|
|
||||||
<WRAP third column>
|
|
||||||
{% if structure.deprecated %}<wrap danger>deprecated</wrap>{% endif %}
|
|
||||||
{% if structure.abstract %}<wrap warning>abstract</wrap>{% endif %}
|
|
||||||
{% if structure.final %}<wrap notice>final</wrap>{% endif %}
|
|
||||||
{% if (node.parent is not null and structure.parent.fullyQualifiedStructuralElementName != node.fullyQualifiedStructuralElementName) %}<wrap notice>inherited</wrap> {% endif %}
|
|
||||||
{% include 'includes/wrap-tags.txt.twig' with {structure:structure, wrap: 'safety', wrapTags: ['api', 'api-advanced', 'overwritable-hook', 'extension-hook']} %}
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
|
|
||||||
|
|
||||||
{{ structure.summary|raw }}
|
|
||||||
[[{{structureName}}|More information]]
|
|
||||||
|
|
||||||
</WRAP>{# group #}
|
|
||||||
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
{% if title_level is not defined %}
|
|
||||||
{%- set title_level='==' -%}
|
|
||||||
{% endif %}
|
|
||||||
{% for tagName,tags in structure.tags if tagName in ['link', 'see'] %}
|
|
||||||
{% if loop.first %}
|
|
||||||
{{title_level}} See also {{title_level}}
|
|
||||||
{% endif %}
|
|
||||||
{% for tag in tags %}
|
|
||||||
{%- set linkTag = tag.reference|trim('\\', 'left') -%}
|
|
||||||
{% if not('()' in linkTag or '$' in linkTag or node.name in linkTag or '::' in linkTag ) %}
|
|
||||||
{%- set linkTag = linkTag|lower -%}
|
|
||||||
{% elseif node.name~'::' in linkTag %}
|
|
||||||
{%- set linkTag = linkTag|replace({(node.name~'::'): '#'})|lower -%}
|
|
||||||
{% elseif '::' in linkTag -%}
|
|
||||||
{%- set linkTag = linkTag|replace({'::': '#'})|lower -%}
|
|
||||||
{% else %}
|
|
||||||
{%- set linkTag = '#' ~ linkTag|lower -%}
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
{% if loop.length > 1 %} * {% endif %}{% if tag.reference is not empty -%}
|
|
||||||
[[{{linkTag}}|{{ (tag.reference)|trim('\\', 'left') }}]] {% if tag.description|trim is not empty %}: {{ tag.description|trim('\\', 'left') }} {% endif %}
|
|
||||||
{%- else -%}
|
|
||||||
{#{{ tag.description|trim('\\', 'left') }}#}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% endfor %}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
{% if tag is not defined -%}
|
|
||||||
{# Do not display @api if @api-advanced is also present #}
|
|
||||||
{%- set tag = "api" -%}
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
{% if hidden_by is not defined -%}
|
|
||||||
{# Do not display @api if @api-advanced is also present #}
|
|
||||||
{%- set hidden_by = {"api" : "api-advanced"} -%}
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% for method in methods|sort_asc
|
|
||||||
if (method.visibility == 'public')
|
|
||||||
and (
|
|
||||||
method.tags[tag] is defined
|
|
||||||
and (
|
|
||||||
hidden_by[tag] is not defined or method.tags[hidden_by[tag]] is not defined
|
|
||||||
)
|
|
||||||
)
|
|
||||||
%}
|
|
||||||
{%- if loop.first %}
|
|
||||||
{% if tag == 'api' %}
|
|
||||||
===== API synthesis =====
|
|
||||||
<WRAP>
|
|
||||||
List of the public API methods.
|
|
||||||
When manipulating {{ node.name }}, You can call those methods:
|
|
||||||
</WRAP>
|
|
||||||
{% elseif tag == 'api-advanced' %}
|
|
||||||
===== Advanced API synthesis =====
|
|
||||||
<WRAP>
|
|
||||||
List of advanced API methods
|
|
||||||
Beware they usage is recommended to advanced users only.
|
|
||||||
</WRAP>
|
|
||||||
{% elseif tag == 'overwritable-hook' %}
|
|
||||||
===== overwritable-hook synthesis =====
|
|
||||||
<WRAP >When inheriting from {{ node.name }},
|
|
||||||
you can overwrite those methods in order to add custom logic:
|
|
||||||
</WRAP>
|
|
||||||
{% elseif tag == 'extension-hook' %}
|
|
||||||
===== extension-hook synthesis =====
|
|
||||||
<WRAP >
|
|
||||||
When inheriting from {{ node.name }},
|
|
||||||
you can extend the behaviour of iTop by implementing:
|
|
||||||
</WRAP>
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
{% set sanitizedMethod = method|trim('\\', 'left')|replace({(node.name~'::'): ''}) %}
|
|
||||||
{% if '::' in sanitizedMethod -%}
|
|
||||||
{%- if node.tags['phpdoc-tuning-exclude-inherited'] is not defined %}
|
|
||||||
* [[{{sanitizedMethod|replace({'::': '#'})|lower}}|↪{{sanitizedMethod}}]] — {{ method.summary|replace({"\n":""})|raw }}
|
|
||||||
{% endif %}
|
|
||||||
{%- else %}
|
|
||||||
* [[#{{sanitizedMethod}}|{{sanitizedMethod}}]] — {{ method.summary|replace({"\n":""})|raw }}
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
{% if title_level is not defined %}
|
|
||||||
{% set title_level = '==' %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
{%- for tagName,tags in structure.tags if tagName in tagsWithDescription -%}
|
|
||||||
{%- for tag in tags -%}
|
|
||||||
{%- if tag.description is not empty -%}
|
|
||||||
{%- if WRAP is defined -%}
|
|
||||||
<WRAP {{WRAP}}>
|
|
||||||
{%- endif -%}
|
|
||||||
{{title_level}} {{ tagName }} {{title_level}}
|
|
||||||
{{ tag.description|escape }}
|
|
||||||
{%- if WRAP is defined -%}
|
|
||||||
</WRAP>
|
|
||||||
{%- endif -%}
|
|
||||||
{%- endif -%}
|
|
||||||
{%- endfor -%}
|
|
||||||
{%- endfor -%}
|
|
||||||
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
{% if title_level is not defined %}
|
|
||||||
{% set title_level='=====' %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if blacklist is not defined %}
|
|
||||||
{% set blacklist =['link', 'see', 'abstract', 'example', 'method', 'property', 'property-read', 'property-write', 'package', 'subpackage', 'api', 'api-advanced', 'todo', 'code-example'] %}
|
|
||||||
{% endif %}
|
|
||||||
{% if hidden_by is not defined -%}
|
|
||||||
{# Do not display @api if @api-advanced is also present #}
|
|
||||||
{%- set hidden_by = {"api" : "api-advanced"} -%}
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
{#^ {% for tagName,tags in structure.tags if tagName not in blacklist -%}#}
|
|
||||||
{#{{ tagName }} ^#}
|
|
||||||
{#{%- endfor %}#}
|
|
||||||
|
|
||||||
{% for tagName,tags in structure.tags if tagName not in blacklist and (hidden_by[tagName] is not defined or structure.tags[hidden_by[tagName]] is not defined) %}
|
|
||||||
{%- if loop.first %}
|
|
||||||
{{title_level}} Tags {{title_level}}
|
|
||||||
{% endif %}
|
|
||||||
^ {{ tagName }} | {% for tag in tags %}{{ tag.version ? tag.version ~ ' ' : '' }}{{ tag.description}}{% endfor %} |
|
|
||||||
{% endfor %}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
{% if title_level is not defined %}
|
|
||||||
{% set title_level='' %}
|
|
||||||
{% endif %}
|
|
||||||
{% for tagName,tags in structure.tags if tagName in ['used-by'] %}
|
|
||||||
{% if loop.first %}
|
|
||||||
{{title_level}} Used by {{title_level}}
|
|
||||||
{% endif %}
|
|
||||||
{% for tag in tags %}
|
|
||||||
{% if loop.length > 1 %} * {% endif %}{{ tag.reference ?: tag.link }} : {{ tag.description ?: tag.reference }}
|
|
||||||
{% endfor %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{#{% for tagName,tags in method.tags if tagName in ['uses'] %}#}
|
|
||||||
{#{% if loop.first %}#}
|
|
||||||
{#<dt>Uses</dt>#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
{#{% for tag in tags %}#}
|
|
||||||
{#<dd>{{ tag.reference|raw }}</dd>#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
{% if title_level is not defined %}
|
|
||||||
{% set title_level='' %}
|
|
||||||
{% endif %}
|
|
||||||
{% for tagName,tags in structure.tags if tagName in ['uses'] %}
|
|
||||||
{% if loop.first %}
|
|
||||||
{{title_level}} Uses {{title_level}}
|
|
||||||
{% endif %}
|
|
||||||
{% for tag in tags %}
|
|
||||||
{% if loop.length > 1 %} * {% endif %}{{ tag.reference ?: tag.link }} : {{ tag.description ?: tag.reference }}
|
|
||||||
{% endfor %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{#{% for tagName,tags in method.tags if tagName in ['uses'] %}#}
|
|
||||||
{#{% if loop.first %}#}
|
|
||||||
{#<dt>Uses</dt>#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
{#{% for tag in tags %}#}
|
|
||||||
{#<dd>{{ tag.reference|raw }}</dd>#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
{% if wrap is not defined -%}
|
|
||||||
{% set wrap = 'notice' %}
|
|
||||||
{%- endif -%}
|
|
||||||
{% if hidden_by is not defined -%}
|
|
||||||
{# Do not display @api if @api-advanced is also present #}
|
|
||||||
{%- set hidden_by = {"api" : "api-advanced"} -%}
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
{%- for tagName,tags in structure.tags if tagName in wrapTags and (hidden_by[tagName] is not defined or structure.tags[hidden_by[tagName]] is not defined) %}
|
|
||||||
<wrap {{wrap}}>{{tagName}}</wrap>
|
|
||||||
{% endfor %}
|
|
||||||
@@ -1,121 +0,0 @@
|
|||||||
{% extends 'layout.txt.twig' %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<wrap button>[[start|🔙 Back]]</wrap>
|
|
||||||
|
|
||||||
{% if node.tags['internal'] is defined %}
|
|
||||||
====== {{ node.name }} ======
|
|
||||||
<WRAP alert>This interface is "internal", and thus is not documented!</WRAP>
|
|
||||||
{% elseif node.tags['api'] is not defined and node.tags['api-advanced'] is not defined and node.tags['overwritable-hook'] is not defined and node.tags['extension-hook'] is not defined %}
|
|
||||||
====== {{ node.name }} ======
|
|
||||||
<WRAP alert>This interface is neither "api", "overwritable-hook" or "extension-hook", and thus is not documented!</WRAP>
|
|
||||||
{% else %}
|
|
||||||
|
|
||||||
====== {{ node.name }} ======
|
|
||||||
|
|
||||||
{% if node.deprecated %}<wrap danger>deprecated</wrap>{% endif %}
|
|
||||||
{% if node.abstract %}<wrap warning>abstract</wrap>{% endif %}
|
|
||||||
{% if node.final %}<wrap notice>final</wrap>{% endif %}
|
|
||||||
{% include 'includes/wrap-tags.txt.twig' with {structure:node, wrap: 'safety', wrapTags: ['api', 'api-advanced', 'overwritable-hook', 'extension-hook']} %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% if node.deprecated %}
|
|
||||||
=== **<del>Deprecated</del>**===
|
|
||||||
//{{ node.tags.deprecated[0].description }}//
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
== {{ node.summary|replace({"\n":""})|raw }} ==
|
|
||||||
<html>{{ node.description|markdown|raw }}</html>
|
|
||||||
|
|
||||||
|
|
||||||
{% include 'includes/code-examples.txt.twig' with {structure:node, title_level: '====='} %}
|
|
||||||
|
|
||||||
|
|
||||||
{% set class = node.parent %}
|
|
||||||
{% block hierarchy_element %}
|
|
||||||
|
|
||||||
{% if class and class.name is defined and class.name|trim != '' %}
|
|
||||||
==== parent ====
|
|
||||||
{% set child = class %}
|
|
||||||
{% set class = class.parent %}
|
|
||||||
{{ block('hierarchy_element') }}
|
|
||||||
[[{{ child.name }}|{{ child.name }}]]
|
|
||||||
{% endif %}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
|
|
||||||
{% for interface in node.interfaces|sort_asc %}
|
|
||||||
{% if loop.first %}
|
|
||||||
==== Implements ====
|
|
||||||
{% endif %}
|
|
||||||
{% if loop.length > 1 %} * {% endif %}{{ interface.fullyQualifiedStructuralElementName ?: interface }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
|
||||||
{% for trait in node.usedTraits|sort_asc %}
|
|
||||||
{% if loop.first %}
|
|
||||||
==== Uses traits ====
|
|
||||||
{% endif %}
|
|
||||||
{% if loop.length > 1 %} * {% endif %}{{ trait.fullyQualifiedStructuralElementName ?: trait }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
|
||||||
{% include 'includes/see-also.txt.twig' with {structure:node, title_level: '==='} %}
|
|
||||||
|
|
||||||
{% include 'includes/tags.txt.twig' with {structure:node, title_level: '=====', blacklist: ['link', 'see', 'abstract', 'example', 'method', 'property', 'property-read', 'property-write', 'package', 'subpackage', 'phpdoc-tuning-exclude-inherited', 'api', 'api-advanced', 'overwritable-hook', 'extension-hook', 'copyright', 'license', 'code-example']} %}
|
|
||||||
|
|
||||||
|
|
||||||
{% set methods = node.inheritedMethods.merge(node.methods) %}
|
|
||||||
{% include 'includes/tag-synthesys.txt.twig' with {methods:methods, tag:'api'} %}
|
|
||||||
{% include 'includes/tag-synthesys.txt.twig' with {methods:methods, tag:'api-advanced'} %}
|
|
||||||
{% include 'includes/tag-synthesys.txt.twig' with {methods:methods, tag:'overwritable-hook'} %}
|
|
||||||
{% include 'includes/tag-synthesys.txt.twig' with {methods:methods, tag:'extension-hook'} %}
|
|
||||||
|
|
||||||
<WRAP clear />
|
|
||||||
|
|
||||||
|
|
||||||
{% for method in methods|sort_asc if method.visibility == 'public' %}
|
|
||||||
{%- if loop.first %}
|
|
||||||
===== Public methods =====
|
|
||||||
{% endif %}
|
|
||||||
{{ block('method') }}
|
|
||||||
{% endfor %}
|
|
||||||
{% for method in methods|sort_asc if method.visibility == 'protected' %}
|
|
||||||
{%- if loop.first %}
|
|
||||||
===== Protected methods =====
|
|
||||||
{% endif %}
|
|
||||||
{{ block('method') }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{% set constants = node.inheritedConstants.merge(node.constants) %}
|
|
||||||
{% if constants|length > 0 %}
|
|
||||||
===== Constants =====
|
|
||||||
{% for constant in constants|sort_asc %}
|
|
||||||
{{ block('constant') }}
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
{#{% set properties = node.inheritedProperties.merge(node.properties) %}#}
|
|
||||||
{#{% for property in properties|sort_asc if property.visibility == 'public' %}#}
|
|
||||||
{#{%- if loop.first %}#}
|
|
||||||
{#===== Public properties =====#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
{#{{ block('property') }}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
{#{% for property in properties|sort_asc if property.visibility == 'protected' %}#}
|
|
||||||
{#{%- if loop.first %}#}
|
|
||||||
{#===== Protected properties =====#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
{#{{ block('property') }}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
|
|
||||||
|
|
||||||
{%- endif %} {#{% elseif node.tags['xxx'] is not defined and ... #}
|
|
||||||
|
|
||||||
<wrap button>[[start|🔙 Back]]</wrap>
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
{% use 'elements/constant.txt.twig' %}
|
|
||||||
{% use 'elements/property.txt.twig' %}
|
|
||||||
{% use 'elements/method.txt.twig' %}
|
|
||||||
|
|
||||||
{% block content %}{% endblock %}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
{% extends 'layout.txt.twig' %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
{% set namespace = project.namespace %}
|
|
||||||
{{ block('sidebarNamespaces') }}
|
|
||||||
|
|
||||||
{#{{ node.parent|raw }}#}
|
|
||||||
{#====== {{ node.parent.fullyQualifiedStructuralElementName }}{{ node.name }} ======#}
|
|
||||||
|
|
||||||
{% if node.children|length > 0 %}
|
|
||||||
=====Namespaces=====
|
|
||||||
{% include 'includes/namespace-structure-toc.html.twig' with {structures: node.children} %}
|
|
||||||
----
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if node.traits|length > 0 %}
|
|
||||||
===== Traits =====
|
|
||||||
{% include 'includes/namespace-structure-toc.html.twig' with {structures: node.traits} %}
|
|
||||||
----
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
{% if node.interfaces|length > 0 %}
|
|
||||||
===== Interfaces =====
|
|
||||||
{% include 'includes/namespace-structure-toc.html.twig' with {structures: node.interfaces} %}
|
|
||||||
----
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if node.classes|length > 0 %}
|
|
||||||
===== Classes =====
|
|
||||||
{% include 'includes/namespace-structure-toc.html.twig' with {structures: node.classes} %}
|
|
||||||
----
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{#{% if node.constants|length > 0 %}#}
|
|
||||||
{#===== Constants =====#}
|
|
||||||
{#{% for constant in node.constants|sort_asc %}#}
|
|
||||||
{# {{ block('constant') }}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
|
|
||||||
{#{% if node.functions|length > 0 %}#}
|
|
||||||
{#===== Functions =====#}
|
|
||||||
|
|
||||||
{#{% for method in node.functions|sort_asc %}#}
|
|
||||||
{# {{ block('method') }}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
|
|
||||||
====== Deprecated elements ======
|
|
||||||
|
|
||||||
{#{% for element in project.indexes.elements if element.deprecated %}#}
|
|
||||||
{#{% if element.file.path != previousPath %}#}
|
|
||||||
{#<li><a href="#{{ element.file.path }}"><i class="icon-file"></i> {{ element.file.path }}</a></li>#}
|
|
||||||
{#{% endif %}#}
|
|
||||||
{#{% set previousPath = element.file.path %}#}
|
|
||||||
{#{% endfor %}#}
|
|
||||||
|
|
||||||
{% for element in project.indexes.elements if element.deprecated %}
|
|
||||||
{% if element.file.path != previousPath %}
|
|
||||||
{% if previousPath %}
|
|
||||||
</WRAP>{# group #}
|
|
||||||
{% endif %}
|
|
||||||
{#<a name="{{ element.file.path }}" id="{{ element.file.path }}"></a>#}
|
|
||||||
===== {{ element.file.path }} ({{ element.tags.deprecated.count }} found)=====
|
|
||||||
|
|
||||||
<WRAP group >
|
|
||||||
<WRAP third column >
|
|
||||||
Element
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
<WRAP third column >
|
|
||||||
Line
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
<WRAP third column >
|
|
||||||
Description
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
|
|
||||||
{% endif %}
|
|
||||||
{% for tag in element.tags.deprecated %}
|
|
||||||
<WRAP group >
|
|
||||||
<WRAP third column >
|
|
||||||
{{ element.fullyQualifiedStructuralElementName }}
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
<WRAP third column >
|
|
||||||
{{ element.line }}
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
<WRAP third column >
|
|
||||||
{{ tag.description }}
|
|
||||||
</WRAP>{# third column#}
|
|
||||||
|
|
||||||
{% endfor %}
|
|
||||||
</WRAP>{# group #}
|
|
||||||
{% set previousPath = element.file.path %}
|
|
||||||
{% else %}
|
|
||||||
<WRAP info>No deprecated elements have been found in this project.</WRAP>
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<template>
|
|
||||||
<author>Bruno DA SILVA</author>
|
|
||||||
<email>contact [at] combodo.com</email>
|
|
||||||
<version>1.0.0</version>
|
|
||||||
<copyright>Combodo 2018</copyright>
|
|
||||||
<description><![CDATA[
|
|
||||||
|
|
||||||
Forked from the clean theme of https://github.com/phpDocumentor/phpDocumentor2 provided under the MIT licence.
|
|
||||||
The original work is copyright "Mike van Riel".
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
To improve performance you can add the following to your .htaccess:
|
|
||||||
|
|
||||||
<ifModule mod_deflate.c>
|
|
||||||
<filesMatch "\.(js|css|html)$">
|
|
||||||
SetOutputFilter DEFLATE
|
|
||||||
</filesMatch>
|
|
||||||
</ifModule>
|
|
||||||
]]></description>
|
|
||||||
<transformations>
|
|
||||||
<transformation writer="twig" query="namespace" source="templates/combodo-wiki/namespace.txt.twig" artifact="start.txt"/>
|
|
||||||
<transformation writer="twig" query="indexes.classes" source="templates/combodo-wiki/class.txt.twig" artifact="{{name}}.txt"/>
|
|
||||||
<transformation writer="twig" query="indexes.interfaces" source="templates/combodo-wiki/interface.txt.twig" artifact="{{name}}.txt" />
|
|
||||||
</transformations>
|
|
||||||
</template>
|
|
||||||
@@ -25,34 +25,12 @@
|
|||||||
|
|
||||||
|
|
||||||
if (count($argv) === 1) {
|
if (count($argv) === 1) {
|
||||||
echo "⚠ You must pass the base tag/sha1 as parameter\n";
|
echo '⚠ You must pass the base tag/sha1 as parameter';
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
$sBaseReference = $argv[1];
|
$sBaseReference = $argv[1];
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Replace the Github emojis codes by their UTF-8 character equivalent
|
|
||||||
*/
|
|
||||||
function ReplaceGitmojis(string $sLine)
|
|
||||||
{
|
|
||||||
static $aGitmojis = null;
|
|
||||||
|
|
||||||
if ($aGitmojis === null) {
|
|
||||||
$aRawGitmojis = json_decode(trim(file_get_contents(__DIR__.'/gitmojis.json')), true);
|
|
||||||
if ($aRawGitmojis === false) {
|
|
||||||
echo "\nFailed to parse ".__DIR__."/gitmojis.json, emoji codes will not be replaced by their unicode equivalent.\n";
|
|
||||||
} else {
|
|
||||||
foreach($aRawGitmojis["gitmojis"] as $aGitmoji) {
|
|
||||||
$aGitmojis[$aGitmoji['code']] = $aGitmoji['emoji'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (is_array($aGitmojis)) {
|
|
||||||
return str_replace(array_keys($aGitmojis), array_values($aGitmojis), $sLine);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//--- Get log
|
//--- Get log
|
||||||
$sGitLogCommand = 'git log --decorate --pretty="%h;%s" --date-order --no-merges '.$sBaseReference.'..HEAD';
|
$sGitLogCommand = 'git log --decorate --pretty="%h;%s" --date-order --no-merges '.$sBaseReference.'..HEAD';
|
||||||
$sGitLogRaw = shell_exec($sGitLogCommand);
|
$sGitLogRaw = shell_exec($sGitLogCommand);
|
||||||
@@ -95,5 +73,5 @@ echo "\n";
|
|||||||
echo "# Logs line without bug referenced\n";
|
echo "# Logs line without bug referenced\n";
|
||||||
echo "sha1;subject\n";
|
echo "sha1;subject\n";
|
||||||
foreach ($aLogLineNoBug as $sLogLine) {
|
foreach ($aLogLineNoBug as $sLogLine) {
|
||||||
echo ReplaceGitmojis($sLogLine)."\n";
|
echo "$sLogLine\n";
|
||||||
}
|
}
|
||||||
@@ -1,589 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "https://gitmoji.dev/api/gitmojis/schema",
|
|
||||||
"gitmojis": [
|
|
||||||
{
|
|
||||||
"emoji": "🎨",
|
|
||||||
"entity": "🎨",
|
|
||||||
"code": ":art:",
|
|
||||||
"description": "Improve structure / format of the code.",
|
|
||||||
"name": "art",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "⚡️",
|
|
||||||
"entity": "⚡",
|
|
||||||
"code": ":zap:",
|
|
||||||
"description": "Improve performance.",
|
|
||||||
"name": "zap",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🔥",
|
|
||||||
"entity": "🔥",
|
|
||||||
"code": ":fire:",
|
|
||||||
"description": "Remove code or files.",
|
|
||||||
"name": "fire",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🐛",
|
|
||||||
"entity": "🐛",
|
|
||||||
"code": ":bug:",
|
|
||||||
"description": "Fix a bug.",
|
|
||||||
"name": "bug",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🚑️",
|
|
||||||
"entity": "🚑",
|
|
||||||
"code": ":ambulance:",
|
|
||||||
"description": "Critical hotfix.",
|
|
||||||
"name": "ambulance",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "✨",
|
|
||||||
"entity": "✨",
|
|
||||||
"code": ":sparkles:",
|
|
||||||
"description": "Introduce new features.",
|
|
||||||
"name": "sparkles",
|
|
||||||
"semver": "minor"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "📝",
|
|
||||||
"entity": "📝",
|
|
||||||
"code": ":memo:",
|
|
||||||
"description": "Add or update documentation.",
|
|
||||||
"name": "memo",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🚀",
|
|
||||||
"entity": "🚀",
|
|
||||||
"code": ":rocket:",
|
|
||||||
"description": "Deploy stuff.",
|
|
||||||
"name": "rocket",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "💄",
|
|
||||||
"entity": "&#ff99cc;",
|
|
||||||
"code": ":lipstick:",
|
|
||||||
"description": "Add or update the UI and style files.",
|
|
||||||
"name": "lipstick",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🎉",
|
|
||||||
"entity": "🎉",
|
|
||||||
"code": ":tada:",
|
|
||||||
"description": "Begin a project.",
|
|
||||||
"name": "tada",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "✅",
|
|
||||||
"entity": "✅",
|
|
||||||
"code": ":white_check_mark:",
|
|
||||||
"description": "Add, update, or pass tests.",
|
|
||||||
"name": "white-check-mark",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🔒️",
|
|
||||||
"entity": "🔒",
|
|
||||||
"code": ":lock:",
|
|
||||||
"description": "Fix security or privacy issues.",
|
|
||||||
"name": "lock",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🔐",
|
|
||||||
"entity": "🔐",
|
|
||||||
"code": ":closed_lock_with_key:",
|
|
||||||
"description": "Add or update secrets.",
|
|
||||||
"name": "closed-lock-with-key",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🔖",
|
|
||||||
"entity": "🔖",
|
|
||||||
"code": ":bookmark:",
|
|
||||||
"description": "Release / Version tags.",
|
|
||||||
"name": "bookmark",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🚨",
|
|
||||||
"entity": "🚨",
|
|
||||||
"code": ":rotating_light:",
|
|
||||||
"description": "Fix compiler / linter warnings.",
|
|
||||||
"name": "rotating-light",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🚧",
|
|
||||||
"entity": "🚧",
|
|
||||||
"code": ":construction:",
|
|
||||||
"description": "Work in progress.",
|
|
||||||
"name": "construction",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "💚",
|
|
||||||
"entity": "💚",
|
|
||||||
"code": ":green_heart:",
|
|
||||||
"description": "Fix CI Build.",
|
|
||||||
"name": "green-heart",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "⬇️",
|
|
||||||
"entity": "⬇️",
|
|
||||||
"code": ":arrow_down:",
|
|
||||||
"description": "Downgrade dependencies.",
|
|
||||||
"name": "arrow-down",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "⬆️",
|
|
||||||
"entity": "⬆️",
|
|
||||||
"code": ":arrow_up:",
|
|
||||||
"description": "Upgrade dependencies.",
|
|
||||||
"name": "arrow-up",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "📌",
|
|
||||||
"entity": "📌",
|
|
||||||
"code": ":pushpin:",
|
|
||||||
"description": "Pin dependencies to specific versions.",
|
|
||||||
"name": "pushpin",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "👷",
|
|
||||||
"entity": "👷",
|
|
||||||
"code": ":construction_worker:",
|
|
||||||
"description": "Add or update CI build system.",
|
|
||||||
"name": "construction-worker",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "📈",
|
|
||||||
"entity": "📈",
|
|
||||||
"code": ":chart_with_upwards_trend:",
|
|
||||||
"description": "Add or update analytics or track code.",
|
|
||||||
"name": "chart-with-upwards-trend",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "♻️",
|
|
||||||
"entity": "♻",
|
|
||||||
"code": ":recycle:",
|
|
||||||
"description": "Refactor code.",
|
|
||||||
"name": "recycle",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "➕",
|
|
||||||
"entity": "➕",
|
|
||||||
"code": ":heavy_plus_sign:",
|
|
||||||
"description": "Add a dependency.",
|
|
||||||
"name": "heavy-plus-sign",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "➖",
|
|
||||||
"entity": "➖",
|
|
||||||
"code": ":heavy_minus_sign:",
|
|
||||||
"description": "Remove a dependency.",
|
|
||||||
"name": "heavy-minus-sign",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🔧",
|
|
||||||
"entity": "🔧",
|
|
||||||
"code": ":wrench:",
|
|
||||||
"description": "Add or update configuration files.",
|
|
||||||
"name": "wrench",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🔨",
|
|
||||||
"entity": "🔨",
|
|
||||||
"code": ":hammer:",
|
|
||||||
"description": "Add or update development scripts.",
|
|
||||||
"name": "hammer",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🌐",
|
|
||||||
"entity": "🌐",
|
|
||||||
"code": ":globe_with_meridians:",
|
|
||||||
"description": "Internationalization and localization.",
|
|
||||||
"name": "globe-with-meridians",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "✏️",
|
|
||||||
"entity": "",
|
|
||||||
"code": ":pencil2:",
|
|
||||||
"description": "Fix typos.",
|
|
||||||
"name": "pencil2",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "💩",
|
|
||||||
"entity": "",
|
|
||||||
"code": ":poop:",
|
|
||||||
"description": "Write bad code that needs to be improved.",
|
|
||||||
"name": "poop",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "⏪️",
|
|
||||||
"entity": "⏪",
|
|
||||||
"code": ":rewind:",
|
|
||||||
"description": "Revert changes.",
|
|
||||||
"name": "rewind",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🔀",
|
|
||||||
"entity": "🔀",
|
|
||||||
"code": ":twisted_rightwards_arrows:",
|
|
||||||
"description": "Merge branches.",
|
|
||||||
"name": "twisted-rightwards-arrows",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "📦️",
|
|
||||||
"entity": "F4E6;",
|
|
||||||
"code": ":package:",
|
|
||||||
"description": "Add or update compiled files or packages.",
|
|
||||||
"name": "package",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "👽️",
|
|
||||||
"entity": "F47D;",
|
|
||||||
"code": ":alien:",
|
|
||||||
"description": "Update code due to external API changes.",
|
|
||||||
"name": "alien",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🚚",
|
|
||||||
"entity": "F69A;",
|
|
||||||
"code": ":truck:",
|
|
||||||
"description": "Move or rename resources (e.g.: files, paths, routes).",
|
|
||||||
"name": "truck",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "📄",
|
|
||||||
"entity": "F4C4;",
|
|
||||||
"code": ":page_facing_up:",
|
|
||||||
"description": "Add or update license.",
|
|
||||||
"name": "page-facing-up",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "💥",
|
|
||||||
"entity": "💥",
|
|
||||||
"code": ":boom:",
|
|
||||||
"description": "Introduce breaking changes.",
|
|
||||||
"name": "boom",
|
|
||||||
"semver": "major"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🍱",
|
|
||||||
"entity": "F371",
|
|
||||||
"code": ":bento:",
|
|
||||||
"description": "Add or update assets.",
|
|
||||||
"name": "bento",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "♿️",
|
|
||||||
"entity": "♿",
|
|
||||||
"code": ":wheelchair:",
|
|
||||||
"description": "Improve accessibility.",
|
|
||||||
"name": "wheelchair",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "💡",
|
|
||||||
"entity": "💡",
|
|
||||||
"code": ":bulb:",
|
|
||||||
"description": "Add or update comments in source code.",
|
|
||||||
"name": "bulb",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🍻",
|
|
||||||
"entity": "🍻",
|
|
||||||
"code": ":beers:",
|
|
||||||
"description": "Write code drunkenly.",
|
|
||||||
"name": "beers",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "💬",
|
|
||||||
"entity": "💬",
|
|
||||||
"code": ":speech_balloon:",
|
|
||||||
"description": "Add or update text and literals.",
|
|
||||||
"name": "speech-balloon",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🗃️",
|
|
||||||
"entity": "🗃",
|
|
||||||
"code": ":card_file_box:",
|
|
||||||
"description": "Perform database related changes.",
|
|
||||||
"name": "card-file-box",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🔊",
|
|
||||||
"entity": "🔊",
|
|
||||||
"code": ":loud_sound:",
|
|
||||||
"description": "Add or update logs.",
|
|
||||||
"name": "loud-sound",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🔇",
|
|
||||||
"entity": "🔇",
|
|
||||||
"code": ":mute:",
|
|
||||||
"description": "Remove logs.",
|
|
||||||
"name": "mute",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "👥",
|
|
||||||
"entity": "👥",
|
|
||||||
"code": ":busts_in_silhouette:",
|
|
||||||
"description": "Add or update contributor(s).",
|
|
||||||
"name": "busts-in-silhouette",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🚸",
|
|
||||||
"entity": "🚸",
|
|
||||||
"code": ":children_crossing:",
|
|
||||||
"description": "Improve user experience / usability.",
|
|
||||||
"name": "children-crossing",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🏗️",
|
|
||||||
"entity": "f3d7;",
|
|
||||||
"code": ":building_construction:",
|
|
||||||
"description": "Make architectural changes.",
|
|
||||||
"name": "building-construction",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "📱",
|
|
||||||
"entity": "📱",
|
|
||||||
"code": ":iphone:",
|
|
||||||
"description": "Work on responsive design.",
|
|
||||||
"name": "iphone",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🤡",
|
|
||||||
"entity": "🤡",
|
|
||||||
"code": ":clown_face:",
|
|
||||||
"description": "Mock things.",
|
|
||||||
"name": "clown-face",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🥚",
|
|
||||||
"entity": "🥚",
|
|
||||||
"code": ":egg:",
|
|
||||||
"description": "Add or update an easter egg.",
|
|
||||||
"name": "egg",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🙈",
|
|
||||||
"entity": "bdfe7;",
|
|
||||||
"code": ":see_no_evil:",
|
|
||||||
"description": "Add or update a .gitignore file.",
|
|
||||||
"name": "see-no-evil",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "📸",
|
|
||||||
"entity": "📸",
|
|
||||||
"code": ":camera_flash:",
|
|
||||||
"description": "Add or update snapshots.",
|
|
||||||
"name": "camera-flash",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "⚗️",
|
|
||||||
"entity": "⚗",
|
|
||||||
"code": ":alembic:",
|
|
||||||
"description": "Perform experiments.",
|
|
||||||
"name": "alembic",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🔍️",
|
|
||||||
"entity": "🔍",
|
|
||||||
"code": ":mag:",
|
|
||||||
"description": "Improve SEO.",
|
|
||||||
"name": "mag",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🏷️",
|
|
||||||
"entity": "🏷",
|
|
||||||
"code": ":label:",
|
|
||||||
"description": "Add or update types.",
|
|
||||||
"name": "label",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🌱",
|
|
||||||
"entity": "🌱",
|
|
||||||
"code": ":seedling:",
|
|
||||||
"description": "Add or update seed files.",
|
|
||||||
"name": "seedling",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🚩",
|
|
||||||
"entity": "🚩",
|
|
||||||
"code": ":triangular_flag_on_post:",
|
|
||||||
"description": "Add, update, or remove feature flags.",
|
|
||||||
"name": "triangular-flag-on-post",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🥅",
|
|
||||||
"entity": "🥅",
|
|
||||||
"code": ":goal_net:",
|
|
||||||
"description": "Catch errors.",
|
|
||||||
"name": "goal-net",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "💫",
|
|
||||||
"entity": "💫",
|
|
||||||
"code": ":dizzy:",
|
|
||||||
"description": "Add or update animations and transitions.",
|
|
||||||
"name": "dizzy",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🗑️",
|
|
||||||
"entity": "🗑",
|
|
||||||
"code": ":wastebasket:",
|
|
||||||
"description": "Deprecate code that needs to be cleaned up.",
|
|
||||||
"name": "wastebasket",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🛂",
|
|
||||||
"entity": "🛂",
|
|
||||||
"code": ":passport_control:",
|
|
||||||
"description": "Work on code related to authorization, roles and permissions.",
|
|
||||||
"name": "passport-control",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🩹",
|
|
||||||
"entity": "🩹",
|
|
||||||
"code": ":adhesive_bandage:",
|
|
||||||
"description": "Simple fix for a non-critical issue.",
|
|
||||||
"name": "adhesive-bandage",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🧐",
|
|
||||||
"entity": "🧐",
|
|
||||||
"code": ":monocle_face:",
|
|
||||||
"description": "Data exploration/inspection.",
|
|
||||||
"name": "monocle-face",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "⚰️",
|
|
||||||
"entity": "⚰",
|
|
||||||
"code": ":coffin:",
|
|
||||||
"description": "Remove dead code.",
|
|
||||||
"name": "coffin",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🧪",
|
|
||||||
"entity": "🧪",
|
|
||||||
"code": ":test_tube:",
|
|
||||||
"description": "Add a failing test.",
|
|
||||||
"name": "test-tube",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "👔",
|
|
||||||
"entity": "👔",
|
|
||||||
"code": ":necktie:",
|
|
||||||
"description": "Add or update business logic.",
|
|
||||||
"name": "necktie",
|
|
||||||
"semver": "patch"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🩺",
|
|
||||||
"entity": "🩺",
|
|
||||||
"code": ":stethoscope:",
|
|
||||||
"description": "Add or update healthcheck.",
|
|
||||||
"name": "stethoscope",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🧱",
|
|
||||||
"entity": "🧱",
|
|
||||||
"code": ":bricks:",
|
|
||||||
"description": "Infrastructure related changes.",
|
|
||||||
"name": "bricks",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🧑💻",
|
|
||||||
"entity": "🧑‍💻",
|
|
||||||
"code": ":technologist:",
|
|
||||||
"description": "Improve developer experience.",
|
|
||||||
"name": "technologist",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "💸",
|
|
||||||
"entity": "💸",
|
|
||||||
"code": ":money_with_wings:",
|
|
||||||
"description": "Add sponsorships or money related infrastructure.",
|
|
||||||
"name": "money-with-wings",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🧵",
|
|
||||||
"entity": "🧵",
|
|
||||||
"code": ":thread:",
|
|
||||||
"description": "Add or update code related to multithreading or concurrency.",
|
|
||||||
"name": "thread",
|
|
||||||
"semver": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"emoji": "🦺",
|
|
||||||
"entity": "🦺",
|
|
||||||
"code": ":safety_vest:",
|
|
||||||
"description": "Add or update code related to validation.",
|
|
||||||
"name": "safety-vest",
|
|
||||||
"semver": null
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
21
README.md
21
README.md
@@ -1,4 +1,4 @@
|
|||||||
<p align="center"><a href="https://combodo.com" target="_blank">
|
<p align="center"><a href="https://www.combodo.com/itop-193" target="_blank">
|
||||||
<picture>
|
<picture>
|
||||||
<source media="(prefers-color-scheme: dark)" srcset="/images/logos/logo-itop-baseline-light.svg">
|
<source media="(prefers-color-scheme: dark)" srcset="/images/logos/logo-itop-baseline-light.svg">
|
||||||
<source media="(prefers-color-scheme: light)" srcset="/images/logos/logo-itop-baseline-dark.svg">
|
<source media="(prefers-color-scheme: light)" srcset="/images/logos/logo-itop-baseline-dark.svg">
|
||||||
@@ -80,9 +80,7 @@ We would like to give a special thank you 🤗 to the people from the community
|
|||||||
|
|
||||||
### Names
|
### Names
|
||||||
|
|
||||||
- Al Hallak, Amr (a.k.a [@v4yne1](https://github.com/v4yne1))
|
|
||||||
- Alves, David
|
- Alves, David
|
||||||
- Audon, Florian
|
|
||||||
- Beck, Pedro
|
- Beck, Pedro
|
||||||
- Beer, Christian (a.k.a [@ChristianBeer](https://www.github.com/ChristianBeer))
|
- Beer, Christian (a.k.a [@ChristianBeer](https://www.github.com/ChristianBeer))
|
||||||
- Bilger, Jean-François
|
- Bilger, Jean-François
|
||||||
@@ -94,26 +92,19 @@ We would like to give a special thank you 🤗 to the people from the community
|
|||||||
- Colantoni, Maria Laura
|
- Colantoni, Maria Laura
|
||||||
- Couronné, Guy
|
- Couronné, Guy
|
||||||
- Dejin, Bie (a.k.a [@bdejin](https://github.com/bdejin))
|
- Dejin, Bie (a.k.a [@bdejin](https://github.com/bdejin))
|
||||||
- Delicado, Elodie
|
|
||||||
- Dvořák, Lukáš
|
- Dvořák, Lukáš
|
||||||
- Goethals, Stefan
|
- Goethals, Stefan
|
||||||
- Giuva, Vincenzo Katriel (a.k.a [@DarkNight97boss](https://github.com/DarkNight97boss))
|
|
||||||
- Gumble, David
|
- Gumble, David
|
||||||
- Heloir, Arthur
|
|
||||||
- Janssens, Jelle (a.k.a [@janssensjelle](https://github.com/janssensjelle))
|
|
||||||
- Ji, Leeb (冀利斌) (a.k.a [@chileeb](https://github.com/chileeb))
|
- Ji, Leeb (冀利斌) (a.k.a [@chileeb](https://github.com/chileeb))
|
||||||
- Kaltefleiter, Lars (a.k.a [@larhip](https://www.github.com/larhip))
|
- Kaltefleiter, Lars (a.k.a [@larhip](https://www.github.com/larhip))
|
||||||
- Khamit, Shamil
|
- Khamit, Shamil
|
||||||
- Kincel, Martin
|
- Kincel, Martin
|
||||||
- Konečný, Kamil
|
- Konečný, Kamil
|
||||||
- Kunin, Vladimir
|
- Kunin, Vladimir
|
||||||
- Lassiter, Denis (a.k.a [@delassiter](https://github.com/delassiter))
|
- Lassiter, Dennis
|
||||||
- Lazcano, Federico
|
- Lazcano, Federico
|
||||||
- Lucas, Jonathan
|
- Lucas, Jonathan
|
||||||
- Malik, Remie
|
- Malik, Remie
|
||||||
- Mantel, Ina
|
|
||||||
- Martin, Pierre (a.k.a [@Worty](https://github.com/worty-syn))
|
|
||||||
- Melchiorre, Romain
|
|
||||||
- Mindêllo de Andrade, Lucas (a.k.a [@rokam](https://www.github.com/rokam))
|
- Mindêllo de Andrade, Lucas (a.k.a [@rokam](https://www.github.com/rokam))
|
||||||
- Mozart de Oliveira, Eduardo (a.k.a [@eduardomozart](https://github.com/eduardomozart))
|
- Mozart de Oliveira, Eduardo (a.k.a [@eduardomozart](https://github.com/eduardomozart))
|
||||||
- Raenker, Martin
|
- Raenker, Martin
|
||||||
@@ -125,12 +116,10 @@ We would like to give a special thank you 🤗 to the people from the community
|
|||||||
- Seki, Shoji
|
- Seki, Shoji
|
||||||
- Shilov, Vladimir
|
- Shilov, Vladimir
|
||||||
- Stetina, Pavel (a.k.a [@Stetinac](https://github.com/Stetinac))
|
- Stetina, Pavel (a.k.a [@Stetinac](https://github.com/Stetinac))
|
||||||
- Stukalov, Ilya (a.k.a [@ilya](https://www.github.com/ilya-stukalov))
|
- Stukalov, Ilya (a.k.a [@ilya](https://www.github.com/ilya)-stukalov)
|
||||||
- Tarjányi, Csaba (a.k.a [@tacsaby](https://github.com/tacsaby))
|
- Tarjányi, Csaba (a.k.a [@tacsaby](https://github.com/tacsaby))
|
||||||
- Toraya, Chairat (a.k.a [@Kyokito1412](https://github.com/Kyokito1412))
|
|
||||||
- Tulio, Marco
|
- Tulio, Marco
|
||||||
- Turrubiates, Miguel
|
- Turrubiates, Miguel
|
||||||
- Višnjić, Aldin (a.k.a[@viliald](https://github.com/viliald))
|
|
||||||
- Vlk, Karel (a.k.a [@vlk-charles](https://www.github.com/vlk-charles))
|
- Vlk, Karel (a.k.a [@vlk-charles](https://www.github.com/vlk-charles))
|
||||||
|
|
||||||
### Aliases
|
### Aliases
|
||||||
@@ -152,6 +141,4 @@ We would like to give a special thank you 🤗 to the people from the community
|
|||||||
- [ITOMIG](https://www.itomig.de/)
|
- [ITOMIG](https://www.itomig.de/)
|
||||||
- [Pimkie](https://www.pimkie.com/)
|
- [Pimkie](https://www.pimkie.com/)
|
||||||
- [Super-Visions](https://www.super-visions.com/)
|
- [Super-Visions](https://www.super-visions.com/)
|
||||||
- [Defence Tech Cyber Security - Malware Lab](https://github.com/DefenceTechSecurity)
|
|
||||||
- Orange Cyberdefense
|
|
||||||
- MipihSIB
|
|
||||||
|
|||||||
362
addons/userrights/userrightsmatrix.class.inc.php
Normal file
362
addons/userrights/userrightsmatrix.class.inc.php
Normal file
@@ -0,0 +1,362 @@
|
|||||||
|
<?php
|
||||||
|
// Copyright (C) 2010-2024 Combodo SAS
|
||||||
|
//
|
||||||
|
// This file is part of iTop.
|
||||||
|
//
|
||||||
|
// iTop is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// iTop is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UserRightsMatrix (User management Module)
|
||||||
|
*
|
||||||
|
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||||
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
class UserRightsMatrixClassGrant extends DBObject
|
||||||
|
{
|
||||||
|
public static function Init()
|
||||||
|
{
|
||||||
|
$aParams = array
|
||||||
|
(
|
||||||
|
"category" => "addon/userrights",
|
||||||
|
"key_type" => "autoincrement",
|
||||||
|
"name_attcode" => "",
|
||||||
|
"state_attcode" => "",
|
||||||
|
"reconc_keys" => array(),
|
||||||
|
"db_table" => "priv_ur_matrixclasses",
|
||||||
|
"db_key_field" => "id",
|
||||||
|
"db_finalclass_field" => "",
|
||||||
|
);
|
||||||
|
MetaModel::Init_Params($aParams);
|
||||||
|
//MetaModel::Init_InheritAttributes();
|
||||||
|
MetaModel::Init_AddAttribute(new AttributeExternalKey("userid", array("targetclass"=>"User", "jointype"=> "", "allowed_values"=>null, "sql"=>"userid", "is_null_allowed"=>false, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
|
||||||
|
MetaModel::Init_AddAttribute(new AttributeExternalField("login", array("allowed_values"=>null, "extkey_attcode"=> 'userid', "target_attcode"=>"login")));
|
||||||
|
MetaModel::Init_AddAttribute(new AttributeString("class", array("allowed_values"=>null, "sql"=>"class", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||||
|
|
||||||
|
MetaModel::Init_AddAttribute(new AttributeString("action", array("allowed_values"=>null, "sql"=>"action", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||||
|
MetaModel::Init_AddAttribute(new AttributeEnum("permission", array("allowed_values"=>new ValueSetEnum('yes,no'), "sql"=>"permission", "default_value"=>"yes", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class UserRightsMatrixClassStimulusGrant extends DBObject
|
||||||
|
{
|
||||||
|
public static function Init()
|
||||||
|
{
|
||||||
|
$aParams = array
|
||||||
|
(
|
||||||
|
"category" => "addon/userrights",
|
||||||
|
"key_type" => "autoincrement",
|
||||||
|
"name_attcode" => "",
|
||||||
|
"state_attcode" => "",
|
||||||
|
"reconc_keys" => array(),
|
||||||
|
"db_table" => "priv_ur_matrixclassesstimulus",
|
||||||
|
"db_key_field" => "id",
|
||||||
|
"db_finalclass_field" => "",
|
||||||
|
);
|
||||||
|
MetaModel::Init_Params($aParams);
|
||||||
|
//MetaModel::Init_InheritAttributes();
|
||||||
|
MetaModel::Init_AddAttribute(new AttributeExternalKey("userid", array("targetclass"=>"User", "jointype"=> "", "allowed_values"=>null, "sql"=>"userid", "is_null_allowed"=>false, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
|
||||||
|
MetaModel::Init_AddAttribute(new AttributeExternalField("login", array("allowed_values"=>null, "extkey_attcode"=> 'userid', "target_attcode"=>"login")));
|
||||||
|
MetaModel::Init_AddAttribute(new AttributeString("class", array("allowed_values"=>null, "sql"=>"class", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||||
|
|
||||||
|
MetaModel::Init_AddAttribute(new AttributeString("stimulus", array("allowed_values"=>null, "sql"=>"action", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||||
|
MetaModel::Init_AddAttribute(new AttributeEnum("permission", array("allowed_values"=>new ValueSetEnum('yes,no'), "sql"=>"permission", "default_value"=>"yes", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class UserRightsMatrixAttributeGrant extends DBObject
|
||||||
|
{
|
||||||
|
public static function Init()
|
||||||
|
{
|
||||||
|
$aParams = array
|
||||||
|
(
|
||||||
|
"category" => "addon/userrights",
|
||||||
|
"key_type" => "autoincrement",
|
||||||
|
"name_attcode" => "",
|
||||||
|
"state_attcode" => "",
|
||||||
|
"reconc_keys" => array(),
|
||||||
|
"db_table" => "priv_ur_matrixattributes",
|
||||||
|
"db_key_field" => "id",
|
||||||
|
"db_finalclass_field" => "",
|
||||||
|
);
|
||||||
|
MetaModel::Init_Params($aParams);
|
||||||
|
//MetaModel::Init_InheritAttributes();
|
||||||
|
MetaModel::Init_AddAttribute(new AttributeExternalKey("userid", array("targetclass"=>"User", "jointype"=> "", "allowed_values"=>null, "sql"=>"userid", "is_null_allowed"=>false, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
|
||||||
|
MetaModel::Init_AddAttribute(new AttributeExternalField("login", array("allowed_values"=>null, "extkey_attcode"=> 'userid', "target_attcode"=>"login")));
|
||||||
|
MetaModel::Init_AddAttribute(new AttributeString("class", array("allowed_values"=>null, "sql"=>"class", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||||
|
MetaModel::Init_AddAttribute(new AttributeString("attcode", array("allowed_values"=>null, "sql"=>"attcode", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
|
||||||
|
|
||||||
|
MetaModel::Init_AddAttribute(new AttributeString("action", array("allowed_values"=>null, "sql"=>"action", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||||
|
MetaModel::Init_AddAttribute(new AttributeEnum("permission", array("allowed_values"=>new ValueSetEnum('yes,no'), "sql"=>"permission", "default_value"=>"yes", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class UserRightsMatrix extends UserRightsAddOnAPI
|
||||||
|
{
|
||||||
|
static public $m_aActionCodes = array(
|
||||||
|
UR_ACTION_READ => 'read',
|
||||||
|
UR_ACTION_MODIFY => 'modify',
|
||||||
|
UR_ACTION_DELETE => 'delete',
|
||||||
|
UR_ACTION_BULK_READ => 'bulk read',
|
||||||
|
UR_ACTION_BULK_MODIFY => 'bulk modify',
|
||||||
|
UR_ACTION_BULK_DELETE => 'bulk delete',
|
||||||
|
);
|
||||||
|
|
||||||
|
// Installation: create the very first user
|
||||||
|
public function CreateAdministrator($sAdminUser, $sAdminPwd, $sLanguage = 'EN US')
|
||||||
|
{
|
||||||
|
// Maybe we should check that no other user with userid == 0 exists
|
||||||
|
$oUser = new UserLocal();
|
||||||
|
$oUser->Set('login', $sAdminUser);
|
||||||
|
$oUser->Set('password', $sAdminPwd);
|
||||||
|
$oUser->Set('contactid', 1); // one is for root !
|
||||||
|
$oUser->Set('language', $sLanguage); // Language was chosen during the installation
|
||||||
|
|
||||||
|
// Now record the admin user object
|
||||||
|
$iUserId = $oUser->DBInsertNoReload();
|
||||||
|
$this->SetupUser($iUserId, true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function IsAdministrator($oUser)
|
||||||
|
{
|
||||||
|
return ($oUser->GetKey() == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function IsPortalUser($oUser)
|
||||||
|
{
|
||||||
|
return ($oUser->GetKey() == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated - create a new module !
|
||||||
|
public function Setup()
|
||||||
|
{
|
||||||
|
// Users must be added manually
|
||||||
|
// This procedure will then update the matrix when a new user is found or a new class/attribute appears
|
||||||
|
$oUserSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT User"));
|
||||||
|
while ($oUser = $oUserSet->Fetch())
|
||||||
|
{
|
||||||
|
$this->SetupUser($oUser->GetKey());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function SetupUser($iUserId, $bNewUser = false)
|
||||||
|
{
|
||||||
|
foreach(array('bizmodel', 'application', 'gui', 'core/cmdb') as $sCategory)
|
||||||
|
{
|
||||||
|
foreach (MetaModel::GetClasses($sCategory) as $sClass)
|
||||||
|
{
|
||||||
|
foreach (self::$m_aActionCodes as $iActionCode => $sAction)
|
||||||
|
{
|
||||||
|
if ($bNewUser)
|
||||||
|
{
|
||||||
|
$bAddCell = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT UserRightsMatrixClassGrant WHERE class = '$sClass' AND action = '$sAction' AND userid = $iUserId"));
|
||||||
|
$bAddCell = ($oSet->Count() < 1);
|
||||||
|
}
|
||||||
|
if ($bAddCell)
|
||||||
|
{
|
||||||
|
// Create a new entry
|
||||||
|
$oMyClassGrant = MetaModel::NewObject("UserRightsMatrixClassGrant");
|
||||||
|
$oMyClassGrant->Set("userid", $iUserId);
|
||||||
|
$oMyClassGrant->Set("class", $sClass);
|
||||||
|
$oMyClassGrant->Set("action", $sAction);
|
||||||
|
$oMyClassGrant->Set("permission", "yes");
|
||||||
|
$iId = $oMyClassGrant->DBInsertNoReload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (MetaModel::EnumStimuli($sClass) as $sStimulusCode => $oStimulus)
|
||||||
|
{
|
||||||
|
if ($bNewUser)
|
||||||
|
{
|
||||||
|
$bAddCell = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT UserRightsMatrixClassStimulusGrant WHERE class = '$sClass' AND stimulus = '$sStimulusCode' AND userid = $iUserId"));
|
||||||
|
$bAddCell = ($oSet->Count() < 1);
|
||||||
|
}
|
||||||
|
if ($bAddCell)
|
||||||
|
{
|
||||||
|
// Create a new entry
|
||||||
|
$oMyClassGrant = MetaModel::NewObject("UserRightsMatrixClassStimulusGrant");
|
||||||
|
$oMyClassGrant->Set("userid", $iUserId);
|
||||||
|
$oMyClassGrant->Set("class", $sClass);
|
||||||
|
$oMyClassGrant->Set("stimulus", $sStimulusCode);
|
||||||
|
$oMyClassGrant->Set("permission", "yes");
|
||||||
|
$iId = $oMyClassGrant->DBInsertNoReload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (MetaModel::GetAttributesList($sClass) as $sAttCode)
|
||||||
|
{
|
||||||
|
if ($bNewUser)
|
||||||
|
{
|
||||||
|
$bAddCell = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT UserRightsMatrixAttributeGrant WHERE class = '$sClass' AND attcode = '$sAttCode' AND userid = $iUserId"));
|
||||||
|
$bAddCell = ($oSet->Count() < 1);
|
||||||
|
}
|
||||||
|
if ($bAddCell)
|
||||||
|
{
|
||||||
|
foreach (array('read', 'modify') as $sAction)
|
||||||
|
{
|
||||||
|
// Create a new entry
|
||||||
|
$oMyAttGrant = MetaModel::NewObject("UserRightsMatrixAttributeGrant");
|
||||||
|
$oMyAttGrant->Set("userid", $iUserId);
|
||||||
|
$oMyAttGrant->Set("class", $sClass);
|
||||||
|
$oMyAttGrant->Set("attcode", $sAttCode);
|
||||||
|
$oMyAttGrant->Set("action", $sAction);
|
||||||
|
$oMyAttGrant->Set("permission", "yes");
|
||||||
|
$iId = $oMyAttGrant->DBInsertNoReload();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
// Create the "My Bookmarks" menu item (parent_id = 0, rank = 6)
|
||||||
|
if ($bNewUser)
|
||||||
|
{
|
||||||
|
$bAddMenu = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT menuNode WHERE type = 'user' AND parent_id = 0 AND user_id = $iUserId"));
|
||||||
|
$bAddMenu = ($oSet->Count() < 1);
|
||||||
|
}
|
||||||
|
if ($bAddMenu)
|
||||||
|
{
|
||||||
|
$oMenu = MetaModel::NewObject('menuNode');
|
||||||
|
$oMenu->Set('type', 'user');
|
||||||
|
$oMenu->Set('parent_id', 0); // It's a toplevel entry
|
||||||
|
$oMenu->Set('rank', 6); // Located just above the Admin Tools section (=7)
|
||||||
|
$oMenu->Set('name', 'My Bookmarks');
|
||||||
|
$oMenu->Set('label', 'My Favorite Items');
|
||||||
|
$oMenu->Set('hyperlink', 'UI.php');
|
||||||
|
$oMenu->Set('template', '<p></p><p></p><p style="text-align:center; font-family:Georgia, Times, serif; font-size:32px;">My bookmarks</p><p style="text-align:center; font-family:Georgia, Times, serif; font-size:14px;"><i>This section contains my most favorite search results</i></p>');
|
||||||
|
$oMenu->Set('user_id', $iUserId);
|
||||||
|
$oMenu->DBInsert();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function Init()
|
||||||
|
{
|
||||||
|
// Could be loaded in a shared memory (?)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function GetSelectFilter($oUser, $sClass, $aSettings = array())
|
||||||
|
{
|
||||||
|
$oNullFilter = new DBObjectSearch($sClass);
|
||||||
|
return $oNullFilter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function IsActionAllowed($oUser, $sClass, $iActionCode, $oInstanceSet = null)
|
||||||
|
{
|
||||||
|
if (!array_key_exists($iActionCode, self::$m_aActionCodes))
|
||||||
|
{
|
||||||
|
return UR_ALLOWED_NO;
|
||||||
|
}
|
||||||
|
$sAction = self::$m_aActionCodes[$iActionCode];
|
||||||
|
|
||||||
|
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT UserRightsMatrixClassGrant WHERE class = '$sClass' AND action = '$sAction' AND userid = '{$oUser->GetKey()}'"));
|
||||||
|
if ($oSet->Count() < 1)
|
||||||
|
{
|
||||||
|
return UR_ALLOWED_NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
$oGrantRecord = $oSet->Fetch();
|
||||||
|
switch ($oGrantRecord->Get('permission'))
|
||||||
|
{
|
||||||
|
case 'yes':
|
||||||
|
$iRetCode = UR_ALLOWED_YES;
|
||||||
|
break;
|
||||||
|
case 'no':
|
||||||
|
default:
|
||||||
|
$iRetCode = UR_ALLOWED_NO;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return $iRetCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function IsActionAllowedOnAttribute($oUser, $sClass, $sAttCode, $iActionCode, $oInstanceSet = null)
|
||||||
|
{
|
||||||
|
if (!array_key_exists($iActionCode, self::$m_aActionCodes))
|
||||||
|
{
|
||||||
|
return UR_ALLOWED_NO;
|
||||||
|
}
|
||||||
|
$sAction = self::$m_aActionCodes[$iActionCode];
|
||||||
|
|
||||||
|
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT UserRightsMatrixAttributeGrant WHERE class = '$sClass' AND attcode = '$sAttCode' AND action = '$sAction' AND userid = '{$oUser->GetKey()}'"));
|
||||||
|
if ($oSet->Count() < 1)
|
||||||
|
{
|
||||||
|
return UR_ALLOWED_NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
$oGrantRecord = $oSet->Fetch();
|
||||||
|
switch ($oGrantRecord->Get('permission'))
|
||||||
|
{
|
||||||
|
case 'yes':
|
||||||
|
$iRetCode = UR_ALLOWED_YES;
|
||||||
|
break;
|
||||||
|
case 'no':
|
||||||
|
default:
|
||||||
|
$iRetCode = UR_ALLOWED_NO;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return $iRetCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function IsStimulusAllowed($oUser, $sClass, $sStimulusCode, $oInstanceSet = null)
|
||||||
|
{
|
||||||
|
$oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT UserRightsMatrixClassStimulusGrant WHERE class = '$sClass' AND stimulus = '$sStimulusCode' AND userid = '{$oUser->GetKey()}'"));
|
||||||
|
if ($oSet->Count() < 1)
|
||||||
|
{
|
||||||
|
return UR_ALLOWED_NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
$oGrantRecord = $oSet->Fetch();
|
||||||
|
switch ($oGrantRecord->Get('permission'))
|
||||||
|
{
|
||||||
|
case 'yes':
|
||||||
|
$iRetCode = UR_ALLOWED_YES;
|
||||||
|
break;
|
||||||
|
case 'no':
|
||||||
|
default:
|
||||||
|
$iRetCode = UR_ALLOWED_NO;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return $iRetCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function FlushPrivileges()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UserRights::SelectModule('UserRightsMatrix');
|
||||||
|
|
||||||
|
?>
|
||||||
78
addons/userrights/userrightsnull.class.inc.php
Normal file
78
addons/userrights/userrightsnull.class.inc.php
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
<?php
|
||||||
|
// Copyright (C) 2010-2024 Combodo SAS
|
||||||
|
//
|
||||||
|
// This file is part of iTop.
|
||||||
|
//
|
||||||
|
// iTop is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// iTop is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UserRightsNull
|
||||||
|
* User management Module - say Yeah! to everything
|
||||||
|
*
|
||||||
|
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||||
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
class UserRightsNull extends UserRightsAddOnAPI
|
||||||
|
{
|
||||||
|
// Installation: create the very first user
|
||||||
|
public function CreateAdministrator($sAdminUser, $sAdminPwd, $sLanguage = 'EN US')
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function IsAdministrator($oUser)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function IsPortalUser($oUser)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function Init()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function GetSelectFilter($oUser, $sClass, $aSettings = array())
|
||||||
|
{
|
||||||
|
$oNullFilter = new DBObjectSearch($sClass);
|
||||||
|
return $oNullFilter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function IsActionAllowed($oUser, $sClass, $iActionCode, $oInstanceSet = null)
|
||||||
|
{
|
||||||
|
return UR_ALLOWED_YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function IsStimulusAllowed($oUser, $sClass, $sStimulusCode, $oInstanceSet = null)
|
||||||
|
{
|
||||||
|
return UR_ALLOWED_YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function IsActionAllowedOnAttribute($oUser, $sClass, $sAttCode, $iActionCode, $oInstanceSet = null)
|
||||||
|
{
|
||||||
|
return UR_ALLOWED_YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function FlushPrivileges()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UserRights::SelectModule('UserRightsNull');
|
||||||
|
|
||||||
|
?>
|
||||||
1059
addons/userrights/userrightsprofile.db.class.inc.php
Normal file
1059
addons/userrights/userrightsprofile.db.class.inc.php
Normal file
File diff suppressed because it is too large
Load Diff
1217
addons/userrights/userrightsprojection.class.inc.php
Normal file
1217
addons/userrights/userrightsprojection.class.inc.php
Normal file
File diff suppressed because it is too large
Load Diff
25
application/ajaxwebpage.class.inc.php
Normal file
25
application/ajaxwebpage.class.inc.php
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/AjaxPage.php, now loadable using autoloader
|
||||||
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||||
|
*/
|
||||||
|
|
||||||
|
// cannot notify depreciation for now as this is still load in autoloader
|
||||||
|
//DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/AjaxPage.php, now loadable using autoloader');
|
||||||
|
use Combodo\iTop\Application\WebPage\AjaxPage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class ajax_page
|
||||||
|
*
|
||||||
|
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to AjaxPage
|
||||||
|
*/
|
||||||
|
class ajax_page extends AjaxPage
|
||||||
|
{
|
||||||
|
function __construct($s_title)
|
||||||
|
{
|
||||||
|
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('ajax_page is deprecated. Please use AjaxPage instead');
|
||||||
|
parent::__construct($s_title);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,58 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extend this class instead of iApplicationObjectExtension if you don't need to overload all methods
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @deprecated 3.1.0 N°4756 use the new event service instead, see {@see DBObject::FireEvent()} method
|
|
||||||
* @package ORMExtensibilityAPI
|
|
||||||
* @since 2.7.0
|
|
||||||
*/
|
|
||||||
abstract class AbstractApplicationObjectExtension implements iApplicationObjectExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function OnIsModified($oObject)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function OnCheckToWrite($oObject)
|
|
||||||
{
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function OnCheckToDelete($oObject)
|
|
||||||
{
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function OnDBUpdate($oObject, $oChange = null)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function OnDBInsert($oObject, $oChange = null)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function OnDBDelete($oObject, $oChange = null)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extend this class instead of implementing iApplicationUIExtension if you don't need to overload
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package UIExtensibilityAPI
|
|
||||||
* @since 2.7.0
|
|
||||||
*/
|
|
||||||
abstract class AbstractApplicationUIExtension implements iApplicationUIExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function OnDisplayProperties($oObject, \Combodo\iTop\Application\WebPage\WebPage $oPage, $bEditMode = false)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function OnDisplayRelations($oObject, \Combodo\iTop\Application\WebPage\WebPage $oPage, $bEditMode = false)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function OnFormSubmit($oObject, $sFormPrefix = '')
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function OnFormCancel($sTempId)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function EnumUsedAttributes($oObject)
|
|
||||||
{
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function GetIcon($oObject)
|
|
||||||
{
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function GetHilightClass($oObject)
|
|
||||||
{
|
|
||||||
return HILIGHT_CLASS_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function EnumAllowedActions(DBObjectSet $oSet)
|
|
||||||
{
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extend this class instead of iPageUIBlockExtension if you don't need to overload all methods
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package UIBlockExtensibilityAPI
|
|
||||||
* @since 3.0.0
|
|
||||||
*/
|
|
||||||
abstract class AbstractPageUIBlockExtension implements iPageUIBlockExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function GetBannerBlock()
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function GetHeaderBlock()
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function GetFooterBlock()
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extend this class instead of implementing iPreferencesExtension if you don't need to overload all methods
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package PreferencesExtensibilityAPI
|
|
||||||
* @since 2.7.0
|
|
||||||
*/
|
|
||||||
abstract class AbstractPreferencesExtension implements iPreferencesExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function DisplayPreferences(\Combodo\iTop\Application\WebPage\WebPage $oPage)
|
|
||||||
{
|
|
||||||
// Do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function ApplyPreferences(\Combodo\iTop\Application\WebPage\WebPage $oPage, $sOperation)
|
|
||||||
{
|
|
||||||
// Do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inherit from this class to provide messages to be displayed in the "Welcome Popup"
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @since 3.2.0
|
|
||||||
*/
|
|
||||||
abstract class AbstractWelcomePopupExtension implements iWelcomePopupExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function GetIconRelPath(): string
|
|
||||||
{
|
|
||||||
return \Combodo\iTop\Application\Branding::$aLogoPaths[\Combodo\iTop\Application\Branding::ENUM_LOGO_TYPE_MAIN_LOGO_COMPACT]['default'];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function GetMessages(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function AcknowledgeMessage(string $sMessageId): void
|
|
||||||
{
|
|
||||||
// No need to process the acknowledgment notice by default
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,150 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Base class for the various types of custom menus
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package UIExtensibilityAPI
|
|
||||||
* @since 2.0
|
|
||||||
*/
|
|
||||||
abstract class ApplicationPopupMenuItem
|
|
||||||
{
|
|
||||||
/** @ignore */
|
|
||||||
protected $sUID;
|
|
||||||
/** @ignore */
|
|
||||||
protected $sLabel;
|
|
||||||
/** @ignore */
|
|
||||||
protected $sTooltip;
|
|
||||||
/** @ignore */
|
|
||||||
protected $sIconClass;
|
|
||||||
/** @ignore */
|
|
||||||
protected $aCssClasses;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* @param string $sUID The unique identifier of this menu in iTop... make sure you pass something unique enough
|
|
||||||
* @param string $sLabel The display label of the menu (must be localized)
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function __construct($sUID, $sLabel)
|
|
||||||
{
|
|
||||||
$this->sUID = $sUID;
|
|
||||||
$this->sLabel = $sLabel;
|
|
||||||
$this->sTooltip = '';
|
|
||||||
$this->sIconClass = '';
|
|
||||||
$this->aCssClasses = array();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the UID
|
|
||||||
*
|
|
||||||
* @return string The unique identifier
|
|
||||||
* @ignore
|
|
||||||
*/
|
|
||||||
public function GetUID()
|
|
||||||
{
|
|
||||||
return $this->sUID;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the label
|
|
||||||
*
|
|
||||||
* @return string The label
|
|
||||||
* @ignore
|
|
||||||
*/
|
|
||||||
public function GetLabel()
|
|
||||||
{
|
|
||||||
return $this->sLabel;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the CSS classes
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
* @ignore
|
|
||||||
*/
|
|
||||||
public function GetCssClasses()
|
|
||||||
{
|
|
||||||
return $this->aCssClasses;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param $aCssClasses
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function SetCssClasses($aCssClasses)
|
|
||||||
{
|
|
||||||
$this->aCssClasses = $aCssClasses;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds a CSS class to the CSS classes that will be put on the menu item
|
|
||||||
*
|
|
||||||
* @param $sCssClass
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function AddCssClass($sCssClass)
|
|
||||||
{
|
|
||||||
$this->aCssClasses[] = $sCssClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param $sTooltip
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @since 3.0.0
|
|
||||||
*/
|
|
||||||
public function SetTooltip($sTooltip)
|
|
||||||
{
|
|
||||||
$this->sTooltip = $sTooltip;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @since 3.0.0
|
|
||||||
*/
|
|
||||||
public function GetTooltip()
|
|
||||||
{
|
|
||||||
return $this->sTooltip;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param $sIconClass
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @since 3.0.0
|
|
||||||
*/
|
|
||||||
public function SetIconClass($sIconClass)
|
|
||||||
{
|
|
||||||
$this->sIconClass = $sIconClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @since 3.0.0
|
|
||||||
*/
|
|
||||||
public function GetIconClass()
|
|
||||||
{
|
|
||||||
return $this->sIconClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the components to create a popup menu item in HTML
|
|
||||||
*
|
|
||||||
* @return array A hash array: array('label' => , 'url' => , 'target' => , 'onclick' => )
|
|
||||||
* @ignore
|
|
||||||
*/
|
|
||||||
abstract public function GetMenuItem();
|
|
||||||
|
|
||||||
/** @ignore */
|
|
||||||
public function GetLinkedScripts()
|
|
||||||
{
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class for adding an item as a button that runs some JS code
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package UIExtensibilityAPI
|
|
||||||
* @since 2.0
|
|
||||||
*/
|
|
||||||
class JSButtonItem extends JSPopupMenuItem
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class for adding an item into a popup menu that triggers some Javascript code
|
|
||||||
*
|
|
||||||
* Note: This works only in the backoffice, {@see \JSButtonItem} for the end-user portal
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package UIExtensibilityAPI
|
|
||||||
* @since 2.0
|
|
||||||
*/
|
|
||||||
class JSPopupMenuItem extends ApplicationPopupMenuItem
|
|
||||||
{
|
|
||||||
/** @ignore */
|
|
||||||
protected $sJsCode;
|
|
||||||
/** @ignore */
|
|
||||||
protected $sUrl;
|
|
||||||
/** @ignore */
|
|
||||||
protected $aIncludeJSFiles;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class for adding an item that triggers some Javascript code
|
|
||||||
*
|
|
||||||
* @param string $sUID The unique identifier of this menu in iTop... make sure you pass something unique enough
|
|
||||||
* @param string $sLabel The display label of the menu (must be localized)
|
|
||||||
* @param string $sJSCode In case the menu consists in executing some havascript code inside the page, pass it here. If supplied $sURL
|
|
||||||
* ans $sTarget will be ignored
|
|
||||||
* @param array $aIncludeJSFiles An array of file URLs to be included (once) to provide some JS libraries for the page.
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function __construct($sUID, $sLabel, $sJSCode, $aIncludeJSFiles = array())
|
|
||||||
{
|
|
||||||
parent::__construct($sUID, $sLabel);
|
|
||||||
$this->sJsCode = $sJSCode;
|
|
||||||
$this->sUrl = '#';
|
|
||||||
$this->aIncludeJSFiles = $aIncludeJSFiles;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @ignore */
|
|
||||||
public function GetMenuItem()
|
|
||||||
{
|
|
||||||
// Note: the semicolumn is a must here!
|
|
||||||
return array(
|
|
||||||
'label' => $this->GetLabel(),
|
|
||||||
'onclick' => $this->GetJsCode() . '; return false;',
|
|
||||||
'url' => $this->GetUrl(),
|
|
||||||
'css_classes' => $this->GetCssClasses(),
|
|
||||||
'icon_class' => $this->sIconClass,
|
|
||||||
'tooltip' => $this->sTooltip
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @ignore */
|
|
||||||
public function GetLinkedScripts()
|
|
||||||
{
|
|
||||||
return $this->aIncludeJSFiles;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @ignore */
|
|
||||||
public function GetJsCode()
|
|
||||||
{
|
|
||||||
return $this->sJsCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @ignore */
|
|
||||||
public function GetUrl()
|
|
||||||
{
|
|
||||||
return $this->sUrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class for adding a separator (horizontal line, not selectable) the output
|
|
||||||
* will automatically reduce several consecutive separators to just one
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package UIExtensibilityAPI
|
|
||||||
* @since 2.0
|
|
||||||
*/
|
|
||||||
class SeparatorPopupMenuItem extends ApplicationPopupMenuItem
|
|
||||||
{
|
|
||||||
static $idx = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
parent::__construct('_separator_' . (self::$idx++), '');
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @ignore */
|
|
||||||
public function GetMenuItem()
|
|
||||||
{
|
|
||||||
return array('label' => '<hr class="menu-separator">', 'url' => '', 'css_classes' => $this->aCssClasses);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class for adding an item as a button that browses to the given URL
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package UIExtensibilityAPI
|
|
||||||
* @since 2.0
|
|
||||||
*/
|
|
||||||
class URLButtonItem extends URLPopupMenuItem
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class for adding an item into a popup menu that browses to the given URL
|
|
||||||
*
|
|
||||||
* Note: This works only in the backoffice, {@see \URLButtonItem} for the end-user portal
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package UIExtensibilityAPI
|
|
||||||
* @since 2.0
|
|
||||||
*/
|
|
||||||
class URLPopupMenuItem extends ApplicationPopupMenuItem
|
|
||||||
{
|
|
||||||
/** @ignore */
|
|
||||||
protected $sUrl;
|
|
||||||
/** @ignore */
|
|
||||||
protected $sTarget;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* @param string $sUID The unique identifier of this menu in iTop... make sure you pass something unique enough
|
|
||||||
* @param string $sLabel The display label of the menu (must be localized)
|
|
||||||
* @param string $sUrl If the menu is an hyperlink, provide the absolute hyperlink here
|
|
||||||
* @param string $sTarget In case the menu is an hyperlink and a specific target is needed (_blank for example), pass it here
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function __construct($sUID, $sLabel, $sUrl, $sTarget = '_top')
|
|
||||||
{
|
|
||||||
parent::__construct($sUID, $sLabel);
|
|
||||||
$this->sUrl = $sUrl;
|
|
||||||
$this->sTarget = $sTarget;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @ignore */
|
|
||||||
public function GetMenuItem()
|
|
||||||
{
|
|
||||||
return array('label' => $this->GetLabel(),
|
|
||||||
'url' => $this->GetUrl(),
|
|
||||||
'target' => $this->GetTarget(),
|
|
||||||
'css_classes' => $this->aCssClasses,
|
|
||||||
'icon_class' => $this->sIconClass,
|
|
||||||
'tooltip' => $this->sTooltip
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @ignore */
|
|
||||||
public function GetUrl()
|
|
||||||
{
|
|
||||||
return $this->sUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @ignore */
|
|
||||||
public function GetTarget()
|
|
||||||
{
|
|
||||||
return $this->sTarget;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,111 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement this interface to perform specific operations when objects are manipulated
|
|
||||||
*
|
|
||||||
* Note that those methods will be called when objects are manipulated, either in a programmatic way
|
|
||||||
* or through the GUI.
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @deprecated 3.1.0 N°4756 use the new event service instead, see {@see DBObject::FireEvent()} method. More details on each method PHPDoc.
|
|
||||||
* @package ORMExtensibilityAPI
|
|
||||||
*/
|
|
||||||
interface iApplicationObjectExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Invoked to determine whether an object has been modified in memory
|
|
||||||
*
|
|
||||||
* The GUI calls this verb to determine the message that will be displayed to the end-user.
|
|
||||||
* Anyhow, this API can be called in other contexts such as the CSV import tool.
|
|
||||||
*
|
|
||||||
* If the extension returns false, then the framework will perform the usual evaluation.
|
|
||||||
* Otherwise, the answer is definitively "yes, the object has changed".
|
|
||||||
*
|
|
||||||
* @param /cmdbAbstractObject $oObject The target object
|
|
||||||
*
|
|
||||||
* @return boolean True if something has changed for the target object
|
|
||||||
* @api
|
|
||||||
* @deprecated 3.1.0 N°4756 No alternative available, this API was unstable and is abandoned
|
|
||||||
*/
|
|
||||||
public function OnIsModified($oObject);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invoked to determine whether an object can be written to the database
|
|
||||||
*
|
|
||||||
* The GUI calls this verb and reports any issue.
|
|
||||||
* Anyhow, this API can be called in other contexts such as the CSV import tool.
|
|
||||||
*
|
|
||||||
* @param \cmdbAbstractObject $oObject The target object
|
|
||||||
*
|
|
||||||
* @return string[] A list of errors message. An error message is made of one line and it can be displayed to the end-user.
|
|
||||||
* @api
|
|
||||||
* @deprecated 3.1.0 N°4756 Use EVENT_DB_CHECK_TO_WRITE event instead
|
|
||||||
*/
|
|
||||||
public function OnCheckToWrite($oObject);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invoked to determine wether an object can be deleted from the database
|
|
||||||
*
|
|
||||||
* The GUI calls this verb and stops the deletion process if any issue is reported.
|
|
||||||
*
|
|
||||||
* Please not that it is not possible to cascade deletion by this mean: only stopper issues can be handled.
|
|
||||||
*
|
|
||||||
* @param \cmdbAbstractObject $oObject The target object
|
|
||||||
*
|
|
||||||
* @return string[] A list of errors message. An error message is made of one line and it can be displayed to the end-user.
|
|
||||||
* @api
|
|
||||||
* @deprecated 3.1.0 N°4756 Use EVENT_DB_CHECK_TO_DELETE event instead
|
|
||||||
*/
|
|
||||||
public function OnCheckToDelete($oObject);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invoked when an object is updated into the database. The method is called right <b>after</b> the object has been written to the
|
|
||||||
* database.
|
|
||||||
*
|
|
||||||
* Useful methods you can call on $oObject :
|
|
||||||
*
|
|
||||||
* * {@see DBObject::ListPreviousValuesForUpdatedAttributes()} : list of changed attributes and their values before the change
|
|
||||||
* * {@see DBObject::Get()} : for a given attribute the new value that was persisted
|
|
||||||
*
|
|
||||||
* @param \cmdbAbstractObject $oObject The target object
|
|
||||||
* @param CMDBChange|null $oChange A change context. Since 2.0 it is fine to ignore it, as the framework does maintain this information
|
|
||||||
* once for all the changes made within the current page
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*
|
|
||||||
* @deprecated 3.1.0 N°4756 Use EVENT_DB_AFTER_WRITE event instead
|
|
||||||
* @api
|
|
||||||
* @since 2.7.0 N°2293 can access object changes by calling {@see DBObject::ListPreviousValuesForUpdatedAttributes()} on $oObject
|
|
||||||
*/
|
|
||||||
public function OnDBUpdate($oObject, $oChange = null);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invoked when an object is created into the database
|
|
||||||
*
|
|
||||||
* The method is called right <b>after</b> the object has been written to the database.
|
|
||||||
*
|
|
||||||
* @param \cmdbAbstractObject $oObject The target object
|
|
||||||
* @param CMDBChange|null $oChange A change context. Since 2.0 it is fine to ignore it, as the framework does maintain this information
|
|
||||||
* once for all the changes made within the current page
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
* @deprecated 3.1.0 N°4756 Use EVENT_DB_AFTER_WRITE event instead
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function OnDBInsert($oObject, $oChange = null);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invoked when an object is deleted from the database
|
|
||||||
*
|
|
||||||
* The method is called right <b>before</b> the object will be deleted from the database.
|
|
||||||
*
|
|
||||||
* @param \cmdbAbstractObject $oObject The target object
|
|
||||||
* @param CMDBChange|null $oChange A change context. Since 2.0 it is fine to ignore it, as the framework does maintain this information
|
|
||||||
* once for all the changes made within the current page
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
* @deprecated 3.1.0 N°4756 Use EVENT_DB_AFTER_DELETE event instead
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function OnDBDelete($oObject, $oChange = null);
|
|
||||||
}
|
|
||||||
@@ -1,173 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement this interface to change the behavior of the GUI for some objects.
|
|
||||||
*
|
|
||||||
* All methods are invoked by iTop for a given object. There are basically two usages:
|
|
||||||
*
|
|
||||||
* 1) To tweak the form of an object, you will have to implement a specific behavior within:
|
|
||||||
*
|
|
||||||
* * OnDisplayProperties (bEditMode = true)
|
|
||||||
* * OnFormSubmit
|
|
||||||
* * OnFormCancel
|
|
||||||
*
|
|
||||||
* 2) To tune the display of the object details, you can use:
|
|
||||||
*
|
|
||||||
* * OnDisplayProperties
|
|
||||||
* * OnDisplayRelations
|
|
||||||
* * GetIcon
|
|
||||||
* * GetHilightClass
|
|
||||||
*
|
|
||||||
* Please note that some of the APIs can be called several times for a single page displayed.
|
|
||||||
* Therefore it is not recommended to perform too many operations, such as querying the database.
|
|
||||||
* A recommended pattern is to cache data by the mean of static members.
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package UIExtensibilityAPI
|
|
||||||
*/
|
|
||||||
interface iApplicationUIExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Invoked when an object is being displayed (wiew or edit)
|
|
||||||
*
|
|
||||||
* The method is called right after the main tab has been displayed.
|
|
||||||
* You can add output to the page, either to change the display, or to add a form input
|
|
||||||
*
|
|
||||||
* Example:
|
|
||||||
* <code>
|
|
||||||
* if ($bEditMode)
|
|
||||||
* {
|
|
||||||
* $oPage->p('Age of the captain: <input type="text" name="captain_age"/>');
|
|
||||||
* }
|
|
||||||
* else
|
|
||||||
* {
|
|
||||||
* $oPage->p('Age of the captain: '.$iCaptainAge);
|
|
||||||
* }
|
|
||||||
* </code>
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
*
|
|
||||||
*@param \Combodo\iTop\Application\WebPage\WebPage $oPage The output context
|
|
||||||
* @param boolean $bEditMode True if the edition form is being displayed
|
|
||||||
*
|
|
||||||
* @param DBObject $oObject The object being displayed
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function OnDisplayProperties($oObject, \Combodo\iTop\Application\WebPage\WebPage $oPage, $bEditMode = false);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invoked when an object is being displayed (wiew or edit)
|
|
||||||
*
|
|
||||||
* The method is called rigth after all the tabs have been displayed
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
*
|
|
||||||
*@param \Combodo\iTop\Application\WebPage\WebPage $oPage The output context
|
|
||||||
* @param boolean $bEditMode True if the edition form is being displayed
|
|
||||||
*
|
|
||||||
* @param DBObject $oObject The object being displayed
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function OnDisplayRelations($oObject, \Combodo\iTop\Application\WebPage\WebPage $oPage, $bEditMode = false);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invoked when the end-user clicks on Modify from the object edition form
|
|
||||||
*
|
|
||||||
* The method is called after the changes from the standard form have been
|
|
||||||
* taken into account, and before saving the changes into the database.
|
|
||||||
*
|
|
||||||
* @param DBObject $oObject The object being edited
|
|
||||||
* @param string $sFormPrefix Prefix given to the HTML form inputs
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function OnFormSubmit($oObject, $sFormPrefix = '');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invoked when the end-user clicks on Cancel from the object edition form
|
|
||||||
*
|
|
||||||
* Implement here any cleanup. This is necessary when you have injected some
|
|
||||||
* javascript into the edition form, and if that code requires to store temporary data
|
|
||||||
* (this is the case when a file must be uploaded).
|
|
||||||
*
|
|
||||||
* @param string $sTempId Unique temporary identifier made of session_id and transaction_id. It identifies the object in a unique way.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function OnFormCancel($sTempId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Not yet called by the framework!
|
|
||||||
*
|
|
||||||
* Sorry, the verb has been reserved. You must implement it, but it is not called as of now.
|
|
||||||
*
|
|
||||||
* @param DBObject $oObject The object being displayed
|
|
||||||
*
|
|
||||||
* @return string[] desc
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function EnumUsedAttributes($oObject); // Not yet implemented
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Not yet called by the framework!
|
|
||||||
*
|
|
||||||
* Sorry, the verb has been reserved. You must implement it, but it is not called as of now.
|
|
||||||
*
|
|
||||||
* @param DBObject $oObject The object being displayed
|
|
||||||
*
|
|
||||||
* @return string Path of the icon, relative to the modules directory.
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetIcon($oObject); // Not yet implemented
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invoked when the object is displayed alone or within a list
|
|
||||||
*
|
|
||||||
* Returns a value influencing the appearance of the object depending on its
|
|
||||||
* state.
|
|
||||||
*
|
|
||||||
* Possible values are:
|
|
||||||
*
|
|
||||||
* * HILIGHT_CLASS_CRITICAL
|
|
||||||
* * HILIGHT_CLASS_WARNING
|
|
||||||
* * HILIGHT_CLASS_OK
|
|
||||||
* * HILIGHT_CLASS_NONE
|
|
||||||
*
|
|
||||||
* @param DBObject $oObject The object being displayed
|
|
||||||
*
|
|
||||||
* @return integer The value representing the mood of the object
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetHilightClass($oObject);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when building the Actions menu for a single object or a list of objects
|
|
||||||
*
|
|
||||||
* Use this to add items to the Actions menu. You will have to specify a label and an URL.
|
|
||||||
*
|
|
||||||
* Example:
|
|
||||||
* <code>
|
|
||||||
* $oObject = $oSet->fetch();
|
|
||||||
* if ($oObject instanceof Sheep)
|
|
||||||
* {
|
|
||||||
* return array('View in my app' => 'http://myserver/view_sheeps?id='.$oObject->Get('name'));
|
|
||||||
* }
|
|
||||||
* else
|
|
||||||
* {
|
|
||||||
* return array();
|
|
||||||
* }
|
|
||||||
* </code>
|
|
||||||
*
|
|
||||||
* See also iPopupMenuExtension for greater flexibility
|
|
||||||
*
|
|
||||||
* @param DBObjectSet $oSet A set of persistent objects (DBObject)
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function EnumAllowedActions(DBObjectSet $oSet);
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement this interface to add Dict entries
|
|
||||||
*
|
|
||||||
* @see \iTopWebPage::$a_dict_entries
|
|
||||||
* @api
|
|
||||||
* @package BackofficeUIExtensibilityAPI
|
|
||||||
* @since 3.0.0
|
|
||||||
*/
|
|
||||||
interface iBackofficeDictEntriesExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @return array
|
|
||||||
* @see \iTopWebPage::a_dict_entries
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetDictEntries(): array;
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement this interface to add Dict entries prefixes
|
|
||||||
*
|
|
||||||
* @see \iTopWebPage::$a_dict_entries_prefixes
|
|
||||||
* @api
|
|
||||||
* @package BackofficeUIExtensibilityAPI
|
|
||||||
* @since 3.0.0
|
|
||||||
*/
|
|
||||||
interface iBackofficeDictEntriesPrefixesExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @return array
|
|
||||||
* @see \iTopWebPage::a_dict_entries_prefixes
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetDictEntriesPrefixes(): array;
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement this interface to add inline script (JS) to the backoffice pages' head.
|
|
||||||
* Will be executed first, BEFORE the DOM interpretation.
|
|
||||||
*
|
|
||||||
* @see \iTopWebPage::$a_early_scripts
|
|
||||||
* @api
|
|
||||||
* @package BackofficeUIExtensibilityAPI
|
|
||||||
* @since 3.0.0
|
|
||||||
*/
|
|
||||||
interface iBackofficeEarlyScriptExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
* @see \iTopWebPage::$a_early_scripts
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetEarlyScript(): string;
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement this interface to add inline script (JS) to the backoffice pages that will be executed right when the DOM is ready.
|
|
||||||
*
|
|
||||||
* @see \iTopWebPage::$a_init_scripts
|
|
||||||
* @api
|
|
||||||
* @package BackofficeUIExtensibilityAPI
|
|
||||||
* @since 3.0.0
|
|
||||||
*/
|
|
||||||
interface iBackofficeInitScriptExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
* @see \iTopWebPage::$a_init_scripts
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetInitScript(): string;
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement this interface to add script (JS) files to the backoffice pages
|
|
||||||
*
|
|
||||||
* @see \iTopWebPage::$a_linked_scripts
|
|
||||||
* @api
|
|
||||||
* @package BackofficeUIExtensibilityAPI
|
|
||||||
* @since 3.0.0
|
|
||||||
*/
|
|
||||||
interface iBackofficeLinkedScriptsExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Each script will be included using this property
|
|
||||||
* @return array An array of absolute URLs to the files to include
|
|
||||||
* @see \iTopWebPage::$a_linked_scripts
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetLinkedScriptsAbsUrls(): array;
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement this interface to add stylesheets (CSS) to the backoffice pages
|
|
||||||
*
|
|
||||||
* @see \iTopWebPage::$a_linked_stylesheets
|
|
||||||
* @api
|
|
||||||
* @package BackofficeUIExtensibilityAPI
|
|
||||||
* @since 3.0.0
|
|
||||||
*/
|
|
||||||
interface iBackofficeLinkedStylesheetsExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @return array An array of absolute URLs to the files to include
|
|
||||||
* @see \iTopWebPage::$a_linked_stylesheets
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetLinkedStylesheetsAbsUrls(): array;
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement this interface to add inline script (JS) to the backoffice pages that will be executed slightly AFTER the DOM is ready (just after the init. scripts).
|
|
||||||
*
|
|
||||||
* @see \iTopWebPage::$a_ready_scripts
|
|
||||||
* @api
|
|
||||||
* @package BackofficeUIExtensibilityAPI
|
|
||||||
* @since 3.0.0
|
|
||||||
*/
|
|
||||||
interface iBackofficeReadyScriptExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
* @see \iTopWebPage::$a_ready_scripts
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetReadyScript(): string;
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement this interface to add sass file (SCSS) to the backoffice pages.
|
|
||||||
* example: return "css/setup.scss"
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package BackofficeUIExtensibilityAPI
|
|
||||||
* @since 3.3.0
|
|
||||||
*/
|
|
||||||
interface iBackofficeSassExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
* @see \iTopWebPage::$a_styles
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetSass(): string;
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement this interface to add inline script (JS) to the backoffice pages that will be executed immediately, without waiting for the DOM to be ready.
|
|
||||||
*
|
|
||||||
* @see \iTopWebPage::$a_scripts
|
|
||||||
* @api
|
|
||||||
* @package BackofficeUIExtensibilityAPI
|
|
||||||
* @since 3.0.0
|
|
||||||
*/
|
|
||||||
interface iBackofficeScriptExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
* @see \iTopWebPage::$a_scripts
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetScript(): string;
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement this interface to add inline style (CSS) to the backoffice pages' head.
|
|
||||||
*
|
|
||||||
* @see \iTopWebPage::$a_styles
|
|
||||||
* @api
|
|
||||||
* @package BackofficeUIExtensibilityAPI
|
|
||||||
* @since 3.0.0
|
|
||||||
*/
|
|
||||||
interface iBackofficeStyleExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
* @see \iTopWebPage::$a_styles
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetStyle(): string;
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement this interface to register a new field renderer mapping to either:
|
|
||||||
* - Add the rendering of a new attribute type
|
|
||||||
* - Overload the default rendering of an attribute type
|
|
||||||
*
|
|
||||||
* @since 3.1.0 N°6041
|
|
||||||
*
|
|
||||||
* @experimental Form / Field / Renderer should be used in more places in next iTop releases, which may introduce major API changes
|
|
||||||
*/
|
|
||||||
interface iFieldRendererMappingsExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @return array {
|
|
||||||
* array: {
|
|
||||||
* field: string,
|
|
||||||
* form_renderer: string,
|
|
||||||
* field_renderer: string
|
|
||||||
* }
|
|
||||||
* } List of field renderer mapping: FQCN field class, FQCN Form Renderer class, FQCN Field Renderer class
|
|
||||||
*
|
|
||||||
* Example:
|
|
||||||
*
|
|
||||||
* ```php
|
|
||||||
* [
|
|
||||||
* ['field' => 'FQCN\FieldA', 'form_renderer' => 'Combodo\iTop\Renderer\Console\ConsoleFormRenderer', 'field_renderer' => 'FQCN\FieldRendererA'],
|
|
||||||
* ['field' => 'FQCN\FieldB', 'form_renderer' => 'Combodo\iTop\Renderer\Console\ConsoleFormRenderer', 'field_renderer' => 'FQCN\FieldRendererB'],
|
|
||||||
* ['field' => 'FQCN\FieldA', 'form_renderer' => 'Combodo\iTop\Renderer\Bootstrap\BsFormRenderer', 'field_renderer' => 'FQCN\FieldRendererA'],
|
|
||||||
* ['field' => 'FQCN\FieldB', 'form_renderer' => 'Combodo\iTop\Renderer\Bootstrap\BsFormRenderer', 'field_renderer' => 'FQCN\FieldRendererB'],
|
|
||||||
* ]
|
|
||||||
* ```
|
|
||||||
*/
|
|
||||||
public static function RegisterSupportedFields(): array;
|
|
||||||
}
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement this interface to add content to any iTopWebPage
|
|
||||||
*
|
|
||||||
* There are 3 places where content can be added:
|
|
||||||
*
|
|
||||||
* * The north pane: (normaly empty/hidden) at the top of the page, spanning the whole
|
|
||||||
* width of the page
|
|
||||||
* * The south pane: (normaly empty/hidden) at the bottom of the page, spanning the whole
|
|
||||||
* width of the page
|
|
||||||
* * The admin banner (two tones gray background) at the left of the global search.
|
|
||||||
* Limited space, use it for short messages
|
|
||||||
*
|
|
||||||
* Each of the methods of this interface is supposed to return the HTML to be inserted at
|
|
||||||
* the specified place and can use the passed iTopWebPage object to add javascript or CSS definitions
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package BackofficeUIExtensibilityAPI
|
|
||||||
* @since 3.0.0
|
|
||||||
*/
|
|
||||||
interface iPageUIBlockExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Add content to the "admin banner"
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @return \Combodo\iTop\Application\UI\Base\iUIBlock|null The Block to add into the page
|
|
||||||
*/
|
|
||||||
public function GetBannerBlock();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add content to the header of the page
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @return \Combodo\iTop\Application\UI\Base\iUIBlock|null The Block to add into the page
|
|
||||||
*/
|
|
||||||
public function GetHeaderBlock();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add content to the footer of the page
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @return \Combodo\iTop\Application\UI\Base\iUIBlock|null The Block to add into the page
|
|
||||||
*/
|
|
||||||
public function GetFooterBlock();
|
|
||||||
}
|
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* New extension to add menu items in the "popup" menus inside iTop. Provides a greater flexibility than
|
|
||||||
* iApplicationUIExtension::EnumAllowedActions.
|
|
||||||
*
|
|
||||||
* To add some menus into iTop, declare a class that implements this interface, it will be called automatically
|
|
||||||
* by the application, as long as the class definition is included somewhere in the code
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package UIExtensibilityAPI
|
|
||||||
* @since 2.0
|
|
||||||
*/
|
|
||||||
interface iPopupMenuExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Insert an item into the Actions menu of a list
|
|
||||||
*
|
|
||||||
* $param is a DBObjectSet containing the list of objects
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const MENU_OBJLIST_ACTIONS = 1;
|
|
||||||
/**
|
|
||||||
* Insert an item into the Toolkit menu of a list
|
|
||||||
*
|
|
||||||
* $param is a DBObjectSet containing the list of objects
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const MENU_OBJLIST_TOOLKIT = 2;
|
|
||||||
/**
|
|
||||||
* Insert an item into the Actions menu on an object details page
|
|
||||||
*
|
|
||||||
* $param is a DBObject instance: the object currently displayed
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const MENU_OBJDETAILS_ACTIONS = 3;
|
|
||||||
/**
|
|
||||||
* Insert an item into the Dashboard menu
|
|
||||||
*
|
|
||||||
* The dashboad menu is shown on the top right corner when a dashboard
|
|
||||||
* is being displayed.
|
|
||||||
*
|
|
||||||
* $param is a Dashboard instance: the dashboard currently displayed
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const MENU_DASHBOARD_ACTIONS = 4;
|
|
||||||
/**
|
|
||||||
* Insert an item into the User menu (upper right corner)
|
|
||||||
*
|
|
||||||
* $param is null
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const MENU_USER_ACTIONS = 5;
|
|
||||||
/**
|
|
||||||
* Insert an item into the Action menu on an object item in an objects list in the portal
|
|
||||||
*
|
|
||||||
* $param is an array('portal_id' => $sPortalId, 'object' => $oObject) containing the portal id and a DBObject instance (the object on
|
|
||||||
* the current line)
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const PORTAL_OBJLISTITEM_ACTIONS = 7;
|
|
||||||
/**
|
|
||||||
* Insert an item into the Action menu on an object details page in the portal
|
|
||||||
*
|
|
||||||
* $param is an array('portal_id' => $sPortalId, 'object' => $oObject) containing the portal id and a DBObject instance (the object
|
|
||||||
* currently displayed)
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const PORTAL_OBJDETAILS_ACTIONS = 8;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Insert an item into the Actions menu of a list in the portal
|
|
||||||
* Note: This is not implemented yet !
|
|
||||||
*
|
|
||||||
* $param is an array('portal_id' => $sPortalId, 'object_set' => $oSet) containing DBObjectSet containing the list of objects
|
|
||||||
*
|
|
||||||
* @todo
|
|
||||||
*/
|
|
||||||
const PORTAL_OBJLIST_ACTIONS = 6;
|
|
||||||
/**
|
|
||||||
* Insert an item into the user menu of the portal
|
|
||||||
* Note: This is not implemented yet !
|
|
||||||
*
|
|
||||||
* $param is the portal id
|
|
||||||
*
|
|
||||||
* @todo
|
|
||||||
*/
|
|
||||||
const PORTAL_USER_ACTIONS = 9;
|
|
||||||
/**
|
|
||||||
* Insert an item into the navigation menu of the portal
|
|
||||||
* Note: This is not implemented yet !
|
|
||||||
*
|
|
||||||
* $param is the portal id
|
|
||||||
*
|
|
||||||
* @todo
|
|
||||||
*/
|
|
||||||
const PORTAL_MENU_ACTIONS = 10;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the list of items to be added to a menu.
|
|
||||||
*
|
|
||||||
* This method is called by the framework for each menu.
|
|
||||||
* The items will be inserted in the menu in the order of the returned array.
|
|
||||||
*
|
|
||||||
* @param int $iMenuId The identifier of the type of menu, as listed by the constants MENU_xxx
|
|
||||||
* @param mixed $param Depends on $iMenuId, see the constants defined above
|
|
||||||
*
|
|
||||||
* @return object[] An array of ApplicationPopupMenuItem or an empty array if no action is to be added to the menu
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public static function EnumItems($iMenuId, $param);
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @api
|
|
||||||
* @package PreferencesExtensibilityAPI
|
|
||||||
* @since 2.7.0
|
|
||||||
*/
|
|
||||||
interface iPreferencesExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @api
|
|
||||||
*
|
|
||||||
* @param \Combodo\iTop\Application\WebPage\WebPage $oPage
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public function DisplayPreferences(\Combodo\iTop\Application\WebPage\WebPage $oPage);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @api
|
|
||||||
*
|
|
||||||
* @param string $sOperation
|
|
||||||
*
|
|
||||||
* @param \Combodo\iTop\Application\WebPage\WebPage $oPage
|
|
||||||
*
|
|
||||||
* @return bool true if the operation has been used
|
|
||||||
*/
|
|
||||||
public function ApplyPreferences(\Combodo\iTop\Application\WebPage\WebPage $oPage, $sOperation);
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interface to provide messages to be displayed in the "Welcome Popup"
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @since 3.2.0
|
|
||||||
*/
|
|
||||||
interface iWelcomePopupExtension
|
|
||||||
{
|
|
||||||
// Importance for ordering messages
|
|
||||||
// Just two levels since less important messages have nothing to do in the welcome popup
|
|
||||||
public const ENUM_IMPORTANCE_CRITICAL = 0;
|
|
||||||
public const ENUM_IMPORTANCE_HIGH = 1;
|
|
||||||
public const DEFAULT_IMPORTANCE = self::ENUM_IMPORTANCE_HIGH;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Overload this method if you need to display an icon representing the provider (eg. your own company logo, module icon, ...)
|
|
||||||
*
|
|
||||||
* @return string Relative path (from app. root) of the icon representing the provider
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetIconRelPath(): string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return \Combodo\iTop\Application\WelcomePopup\Message[]
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetMessages(): array;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Overload this method if the provider needs to do some additional processing after the message ($sMessageId) has been acknowledged by the current user
|
|
||||||
*
|
|
||||||
* @param string $sMessageId
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function AcknowledgeMessage(string $sMessageId): void;
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement this interface to add files to the backup
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @since 3.2.0
|
|
||||||
*/
|
|
||||||
interface iBackupExtraFilesExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @return string[] Array of relative paths (from app root) for files and directories to be included in the backup
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetExtraFilesRelPaths(): array;
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* KPI logging extensibility point
|
|
||||||
*
|
|
||||||
* KPI Logger extension
|
|
||||||
*/
|
|
||||||
interface iKPILoggerExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Init the statistics collected
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function InitStats();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a new KPI to the stats
|
|
||||||
*
|
|
||||||
* @param \Combodo\iTop\Core\Kpi\KpiLogData $oKpiLogData
|
|
||||||
*
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function LogOperation($oKpiLogData);
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helpers for modules extensibility, with discover performed by the MetaModel.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package Extensibility
|
|
||||||
*/
|
|
||||||
interface iModuleExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function __construct();
|
|
||||||
}
|
|
||||||
@@ -1,159 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Login finite state machine
|
|
||||||
*
|
|
||||||
* Execute the action corresponding to the current login state.
|
|
||||||
*
|
|
||||||
* * If a page is displayed, the action must exit at this point
|
|
||||||
* * if LoginWebPage::LOGIN_FSM_RETURN_ERROR is returned $iErrorCode must be set
|
|
||||||
* * if LoginWebPage::LOGIN_FSM_RETURN_OK is returned then the login is OK and terminated
|
|
||||||
* * if LoginWebPage::LOGIN_FSM_CONTINUE is returned then the FSM will proceed to next plugin or to next state
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package LoginExtensibilityAPI
|
|
||||||
* @since 2.7.0
|
|
||||||
*/
|
|
||||||
abstract class AbstractLoginFSMExtension implements iLoginFSMExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
abstract public function ListSupportedLoginModes();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function LoginAction($sLoginState, &$iErrorCode)
|
|
||||||
{
|
|
||||||
switch ($sLoginState) {
|
|
||||||
case LoginWebPage::LOGIN_STATE_START:
|
|
||||||
return $this->OnStart($iErrorCode);
|
|
||||||
|
|
||||||
case LoginWebPage::LOGIN_STATE_MODE_DETECTION:
|
|
||||||
return $this->OnModeDetection($iErrorCode);
|
|
||||||
|
|
||||||
case LoginWebPage::LOGIN_STATE_READ_CREDENTIALS:
|
|
||||||
return $this->OnReadCredentials($iErrorCode);
|
|
||||||
|
|
||||||
case LoginWebPage::LOGIN_STATE_CHECK_CREDENTIALS:
|
|
||||||
return $this->OnCheckCredentials($iErrorCode);
|
|
||||||
|
|
||||||
case LoginWebPage::LOGIN_STATE_CREDENTIALS_OK:
|
|
||||||
return $this->OnCredentialsOK($iErrorCode);
|
|
||||||
|
|
||||||
case LoginWebPage::LOGIN_STATE_USER_OK:
|
|
||||||
return $this->OnUsersOK($iErrorCode);
|
|
||||||
|
|
||||||
case LoginWebPage::LOGIN_STATE_CONNECTED:
|
|
||||||
return $this->OnConnected($iErrorCode);
|
|
||||||
|
|
||||||
case LoginWebPage::LOGIN_STATE_ERROR:
|
|
||||||
return $this->OnError($iErrorCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialization
|
|
||||||
*
|
|
||||||
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
|
||||||
*
|
|
||||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
protected function OnStart(&$iErrorCode)
|
|
||||||
{
|
|
||||||
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Detect login mode explicitly without respecting configured order (legacy mode)
|
|
||||||
* In most case do nothing here
|
|
||||||
*
|
|
||||||
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
|
||||||
*
|
|
||||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
protected function OnModeDetection(&$iErrorCode)
|
|
||||||
{
|
|
||||||
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Obtain the credentials either if login mode is empty or set to yours.
|
|
||||||
* This step can be called multiple times by the FSM:
|
|
||||||
* for example:
|
|
||||||
* 1 - display login form
|
|
||||||
* 2 - read the values posted by the user (store that in session)
|
|
||||||
*
|
|
||||||
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
|
||||||
*
|
|
||||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
protected function OnReadCredentials(&$iErrorCode)
|
|
||||||
{
|
|
||||||
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Control the validity of the data from the session
|
|
||||||
* Automatic user provisioning can be done here
|
|
||||||
*
|
|
||||||
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
|
||||||
*
|
|
||||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
protected function OnCheckCredentials(&$iErrorCode)
|
|
||||||
{
|
|
||||||
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
|
||||||
*
|
|
||||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
protected function OnCredentialsOK(&$iErrorCode)
|
|
||||||
{
|
|
||||||
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
|
||||||
*
|
|
||||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
protected function OnUsersOK(&$iErrorCode)
|
|
||||||
{
|
|
||||||
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
|
||||||
*
|
|
||||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
protected function OnConnected(&$iErrorCode)
|
|
||||||
{
|
|
||||||
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
|
||||||
*
|
|
||||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
protected function OnError(&$iErrorCode)
|
|
||||||
{
|
|
||||||
return LoginWebPage::LOGIN_FSM_CONTINUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @api
|
|
||||||
* @package LoginExtensibilityAPI
|
|
||||||
* @since 2.7.0
|
|
||||||
*/
|
|
||||||
interface iLoginExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Return the list of supported login modes for this plugin
|
|
||||||
*
|
|
||||||
* @return array of supported login modes
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function ListSupportedLoginModes();
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @api
|
|
||||||
* @package LoginExtensibilityAPI
|
|
||||||
* @since 2.7.0
|
|
||||||
*/
|
|
||||||
interface iLoginFSMExtension extends iLoginExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Execute action for this login state
|
|
||||||
* If a page is displayed, the action must exit at this point
|
|
||||||
* if LoginWebPage::LOGIN_FSM_RETURN_ERROR is returned $iErrorCode must be set
|
|
||||||
* if LoginWebPage::LOGIN_FSM_RETURN_OK is returned then the login is OK and terminated
|
|
||||||
* if LoginWebPage::LOGIN_FSM_CONTINUE is returned then the FSM will proceed to next plugin or state
|
|
||||||
*
|
|
||||||
* @param string $sLoginState (see LoginWebPage::LOGIN_STATE_...)
|
|
||||||
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
|
|
||||||
*
|
|
||||||
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function LoginAction($sLoginState, &$iErrorCode);
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Login page extensibility
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package UIExtensibilityAPI
|
|
||||||
* @since 2.7.0
|
|
||||||
*/
|
|
||||||
interface iLoginUIExtension extends iLoginExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @return LoginTwigContext
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetTwigContext();
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @api
|
|
||||||
* @package LoginExtensibilityAPI
|
|
||||||
* @since 2.7.0
|
|
||||||
*/
|
|
||||||
interface iLogoutExtension extends iLoginExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Execute all actions to log out properly
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function LogoutAction();
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extend this class instead of iPortalUIExtension if you don't need to overload all methods
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package PortalExtensibilityAPI
|
|
||||||
* @since 2.4.0
|
|
||||||
*/
|
|
||||||
abstract class AbstractPortalUIExtension implements iPortalUIExtension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function GetCSSFiles(\Symfony\Component\DependencyInjection\Container $oContainer)
|
|
||||||
{
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function GetCSSInline(\Symfony\Component\DependencyInjection\Container $oContainer)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function GetJSFiles(\Symfony\Component\DependencyInjection\Container $oContainer)
|
|
||||||
{
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function GetJSInline(\Symfony\Component\DependencyInjection\Container $oContainer)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function GetBodyHTML(\Symfony\Component\DependencyInjection\Container $oContainer)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function GetMainContentHTML(\Symfony\Component\DependencyInjection\Container $oContainer)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritDoc
|
|
||||||
*/
|
|
||||||
public function GetNavigationMenuHTML(\Symfony\Component\DependencyInjection\Container $oContainer)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement this interface to add content to any enhanced portal page
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package PortalExtensibilityAPI
|
|
||||||
*
|
|
||||||
* @since 2.4.0 interface creation
|
|
||||||
* @since 2.7.0 change method signatures due to Silex to Symfony migration
|
|
||||||
*/
|
|
||||||
interface iPortalUIExtension
|
|
||||||
{
|
|
||||||
const ENUM_PORTAL_EXT_UI_BODY = 'Body';
|
|
||||||
const ENUM_PORTAL_EXT_UI_NAVIGATION_MENU = 'NavigationMenu';
|
|
||||||
const ENUM_PORTAL_EXT_UI_MAIN_CONTENT = 'MainContent';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an array of CSS file urls
|
|
||||||
*
|
|
||||||
* @param \Symfony\Component\DependencyInjection\Container $oContainer
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetCSSFiles(\Symfony\Component\DependencyInjection\Container $oContainer);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns inline (raw) CSS
|
|
||||||
*
|
|
||||||
* @param \Symfony\Component\DependencyInjection\Container $oContainer
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetCSSInline(\Symfony\Component\DependencyInjection\Container $oContainer);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an array of JS file urls
|
|
||||||
*
|
|
||||||
* @param \Symfony\Component\DependencyInjection\Container $oContainer
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetJSFiles(\Symfony\Component\DependencyInjection\Container $oContainer);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns raw JS code
|
|
||||||
*
|
|
||||||
* @param \Symfony\Component\DependencyInjection\Container $oContainer
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetJSInline(\Symfony\Component\DependencyInjection\Container $oContainer);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns raw HTML code to put at the end of the <body> tag
|
|
||||||
*
|
|
||||||
* @param \Symfony\Component\DependencyInjection\Container $oContainer
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetBodyHTML(\Symfony\Component\DependencyInjection\Container $oContainer);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns raw HTML code to put at the end of the #main-wrapper element
|
|
||||||
*
|
|
||||||
* @param \Symfony\Component\DependencyInjection\Container $oContainer
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetMainContentHTML(\Symfony\Component\DependencyInjection\Container $oContainer);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns raw HTML code to put at the end of the #topbar and #sidebar elements
|
|
||||||
*
|
|
||||||
* @param \Symfony\Component\DependencyInjection\Container $oContainer
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function GetNavigationMenuHTML(\Symfony\Component\DependencyInjection\Container $oContainer);
|
|
||||||
}
|
|
||||||
@@ -1,102 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Minimal REST response structure. Derive this structure to add response data and error codes.
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package RESTAPI
|
|
||||||
* @since 2.0.1
|
|
||||||
*/
|
|
||||||
class RestResult
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Result: no issue has been encountered
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const OK = 0;
|
|
||||||
/**
|
|
||||||
* Result: missing/wrong credentials or the user does not have enough rights to perform the requested operation
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const UNAUTHORIZED = 1;
|
|
||||||
/**
|
|
||||||
* Result: the parameter 'version' is missing
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const MISSING_VERSION = 2;
|
|
||||||
/**
|
|
||||||
* Result: the parameter 'json_data' is missing
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const MISSING_JSON = 3;
|
|
||||||
/**
|
|
||||||
* Result: the input structure is not a valid JSON string
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const INVALID_JSON = 4;
|
|
||||||
/**
|
|
||||||
* Result: the parameter 'auth_user' is missing, authentication aborted
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const MISSING_AUTH_USER = 5;
|
|
||||||
/**
|
|
||||||
* Result: the parameter 'auth_pwd' is missing, authentication aborted
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const MISSING_AUTH_PWD = 6;
|
|
||||||
/**
|
|
||||||
* Result: no operation is available for the specified version
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const UNSUPPORTED_VERSION = 10;
|
|
||||||
/**
|
|
||||||
* Result: the requested operation is not valid for the specified version
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const UNKNOWN_OPERATION = 11;
|
|
||||||
/**
|
|
||||||
* Result: the requested operation cannot be performed because it can cause data (integrity) loss
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const UNSAFE = 12;
|
|
||||||
/**
|
|
||||||
* Result: the request page number is not valid. It must be an integer greater than 0
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const INVALID_PAGE = 13;
|
|
||||||
/**
|
|
||||||
* Result: the operation could not be performed, see the message for troubleshooting
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
const INTERNAL_ERROR = 100;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Default constructor - ok!
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
$this->code = RestResult::OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Result code
|
|
||||||
* @var int
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public $code;
|
|
||||||
/**
|
|
||||||
* Result message
|
|
||||||
* @var string
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public $message;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sanitize the content of this result to hide sensitive information
|
|
||||||
*/
|
|
||||||
public function SanitizeContent()
|
|
||||||
{
|
|
||||||
// The default implementation does nothing
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,368 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helpers for implementing REST services
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package RESTAPI
|
|
||||||
*/
|
|
||||||
class RestUtils
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Registering tracking information. Any further object modification be associated with the given comment, when the modification gets
|
|
||||||
* recorded into the DB
|
|
||||||
*
|
|
||||||
* @param StdClass $oData Structured input data. Must contain 'comment'.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
* @throws Exception
|
|
||||||
* @api
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public static function InitTrackingComment($oData)
|
|
||||||
{
|
|
||||||
$sComment = self::GetMandatoryParam($oData, 'comment');
|
|
||||||
CMDBObject::SetTrackInfo($sComment);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read a mandatory parameter from from a Rest/Json structure.
|
|
||||||
*
|
|
||||||
* @param string $sParamName Name of the parameter to fetch from the input data
|
|
||||||
* @param StdClass $oData Structured input data. Must contain the entry defined by sParamName.
|
|
||||||
*
|
|
||||||
* @return mixed parameter value if present
|
|
||||||
* @throws Exception If the parameter is missing
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public static function GetMandatoryParam($oData, $sParamName)
|
|
||||||
{
|
|
||||||
if (isset($oData->$sParamName)) {
|
|
||||||
return $oData->$sParamName;
|
|
||||||
} else {
|
|
||||||
throw new Exception("Missing parameter '$sParamName'");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read an optional parameter from a Rest/Json structure.
|
|
||||||
*
|
|
||||||
* @param string $sParamName Name of the parameter to fetch from the input data
|
|
||||||
* @param mixed $default Default value if the parameter is not found in the input data
|
|
||||||
*
|
|
||||||
* @param StdClass $oData Structured input data.
|
|
||||||
*
|
|
||||||
* @return mixed
|
|
||||||
* @throws Exception
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public static function GetOptionalParam($oData, $sParamName, $default)
|
|
||||||
{
|
|
||||||
if (isset($oData->$sParamName)) {
|
|
||||||
return $oData->$sParamName;
|
|
||||||
} else {
|
|
||||||
return $default;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read a class from a Rest/Json structure.
|
|
||||||
*
|
|
||||||
* @param string $sParamName Name of the parameter to fetch from the input data
|
|
||||||
* @param StdClass $oData Structured input data. Must contain the entry defined by sParamName.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
* @throws Exception If the parameter is missing or the class is unknown
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public static function GetClass($oData, $sParamName)
|
|
||||||
{
|
|
||||||
$sClass = self::GetMandatoryParam($oData, $sParamName);
|
|
||||||
if (!MetaModel::IsValidClass($sClass)) {
|
|
||||||
throw new Exception("$sParamName: '$sClass' is not a valid class'");
|
|
||||||
}
|
|
||||||
|
|
||||||
return $sClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read a list of attribute codes from a Rest/Json structure.
|
|
||||||
*
|
|
||||||
* @param StdClass $oData Structured input data.
|
|
||||||
* @param string $sParamName Name of the parameter to fetch from the input data
|
|
||||||
*
|
|
||||||
* @param string $sClass Name of the class
|
|
||||||
*
|
|
||||||
* @return array of class => list of attributes (see RestResultWithObjects::AddObject that uses it)
|
|
||||||
* @throws Exception
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public static function GetFieldList($sClass, $oData, $sParamName)
|
|
||||||
{
|
|
||||||
$sFields = self::GetOptionalParam($oData, $sParamName, '*');
|
|
||||||
$aShowFields = array();
|
|
||||||
if ($sFields == '*') {
|
|
||||||
foreach (MetaModel::ListAttributeDefs($sClass) as $sAttCode => $oAttDef) {
|
|
||||||
$aShowFields[$sClass][] = $sAttCode;
|
|
||||||
}
|
|
||||||
} elseif ($sFields == '*+') {
|
|
||||||
foreach (MetaModel::EnumChildClasses($sClass, ENUM_CHILD_CLASSES_ALL) as $sRefClass) {
|
|
||||||
foreach (MetaModel::ListAttributeDefs($sRefClass) as $sAttCode => $oAttDef) {
|
|
||||||
$aShowFields[$sRefClass][] = $sAttCode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
foreach (explode(',', $sFields) as $sAttCode) {
|
|
||||||
$sAttCode = trim($sAttCode);
|
|
||||||
if (($sAttCode != 'id') && (!MetaModel::IsValidAttCode($sClass, $sAttCode))) {
|
|
||||||
throw new Exception("$sParamName: invalid attribute code '$sAttCode'");
|
|
||||||
}
|
|
||||||
$aShowFields[$sClass][] = $sAttCode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $aShowFields;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read and interpret object search criteria from a Rest/Json structure
|
|
||||||
*
|
|
||||||
* @param string $sClass Name of the class
|
|
||||||
* @param StdClass $oCriteria Hash of attribute code => value (can be a substructure or a scalar, depending on the nature of the
|
|
||||||
* attriute)
|
|
||||||
*
|
|
||||||
* @return object The object found
|
|
||||||
* @throws Exception If the input structure is not valid or it could not find exactly one object
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
protected static function FindObjectFromCriteria($sClass, $oCriteria)
|
|
||||||
{
|
|
||||||
$aCriteriaReport = array();
|
|
||||||
if (isset($oCriteria->finalclass)) {
|
|
||||||
if (!MetaModel::IsValidClass($oCriteria->finalclass)) {
|
|
||||||
throw new Exception("finalclass: Unknown class '" . $oCriteria->finalclass . "'");
|
|
||||||
}
|
|
||||||
if (!MetaModel::IsParentClass($sClass, $oCriteria->finalclass)) {
|
|
||||||
throw new Exception("finalclass: '" . $oCriteria->finalclass . "' is not a child class of '$sClass'");
|
|
||||||
}
|
|
||||||
$sClass = $oCriteria->finalclass;
|
|
||||||
}
|
|
||||||
$oSearch = new DBObjectSearch($sClass);
|
|
||||||
foreach ($oCriteria as $sAttCode => $value) {
|
|
||||||
$realValue = static::MakeValue($sClass, $sAttCode, $value);
|
|
||||||
$oSearch->AddCondition($sAttCode, $realValue, '=');
|
|
||||||
if (is_object($value) || is_array($value)) {
|
|
||||||
$value = json_encode($value);
|
|
||||||
}
|
|
||||||
$aCriteriaReport[] = "$sAttCode: $value ($realValue)";
|
|
||||||
}
|
|
||||||
$oSet = new DBObjectSet($oSearch);
|
|
||||||
$iCount = $oSet->Count();
|
|
||||||
if ($iCount == 0) {
|
|
||||||
throw new Exception("No item found with criteria: " . implode(', ', $aCriteriaReport));
|
|
||||||
} elseif ($iCount > 1) {
|
|
||||||
throw new Exception("Several items found ($iCount) with criteria: " . implode(', ', $aCriteriaReport));
|
|
||||||
}
|
|
||||||
$res = $oSet->Fetch();
|
|
||||||
|
|
||||||
return $res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Find an object from a polymorph search specification (Rest/Json)
|
|
||||||
*
|
|
||||||
* @param mixed $key Either search criteria (substructure), or an object or an OQL string.
|
|
||||||
* @param bool $bAllowNullValue Allow the cases such as key = 0 or key = {null} and return null then
|
|
||||||
* @param string $sClass Name of the class
|
|
||||||
*
|
|
||||||
* @return DBObject The object found
|
|
||||||
* @throws Exception If the input structure is not valid or it could not find exactly one object
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @see DBObject::CheckChangedExtKeysValues() generic method to check that we can access the linked object isn't used in that use case because values can be literal, OQL, friendlyname
|
|
||||||
*/
|
|
||||||
public static function FindObjectFromKey($sClass, $key, $bAllowNullValue = false)
|
|
||||||
{
|
|
||||||
if (is_object($key)) {
|
|
||||||
$res = static::FindObjectFromCriteria($sClass, $key);
|
|
||||||
} elseif (is_numeric($key)) {
|
|
||||||
if ($bAllowNullValue && ($key == 0)) {
|
|
||||||
$res = null;
|
|
||||||
} else {
|
|
||||||
$res = MetaModel::GetObject($sClass, $key, false);
|
|
||||||
if (is_null($res)) {
|
|
||||||
throw new Exception("Invalid object $sClass::$key");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} elseif (is_string($key)) {
|
|
||||||
// OQL
|
|
||||||
$oSearch = DBObjectSearch::FromOQL($key);
|
|
||||||
$oSet = new DBObjectSet($oSearch);
|
|
||||||
$iCount = $oSet->Count();
|
|
||||||
if ($iCount == 0) {
|
|
||||||
throw new Exception("No item found for query: $key");
|
|
||||||
} elseif ($iCount > 1) {
|
|
||||||
throw new Exception("Several items found ($iCount) for query: $key");
|
|
||||||
}
|
|
||||||
$res = $oSet->Fetch();
|
|
||||||
} else {
|
|
||||||
throw new Exception("Wrong format for key");
|
|
||||||
}
|
|
||||||
|
|
||||||
return $res;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Search objects from a polymorph search specification (Rest/Json)
|
|
||||||
*
|
|
||||||
* @param string $sClass Name of the class
|
|
||||||
* @param mixed $key Either search criteria (substructure), or an object or an OQL string.
|
|
||||||
* @param int $iLimit The limit of results to return
|
|
||||||
* @param int $iOffset The offset of results to return
|
|
||||||
*
|
|
||||||
* @return DBObjectSet The search result set
|
|
||||||
* @throws Exception If the input structure is not valid
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public static function GetObjectSetFromKey($sClass, $key, $iLimit = 0, $iOffset = 0)
|
|
||||||
{
|
|
||||||
if (is_object($key)) {
|
|
||||||
if (isset($key->finalclass)) {
|
|
||||||
$sClass = $key->finalclass;
|
|
||||||
if (!MetaModel::IsValidClass($sClass)) {
|
|
||||||
throw new Exception("finalclass: Unknown class '$sClass'");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$oSearch = new DBObjectSearch($sClass);
|
|
||||||
foreach ($key as $sAttCode => $value) {
|
|
||||||
$realValue = static::MakeValue($sClass, $sAttCode, $value);
|
|
||||||
$oSearch->AddCondition($sAttCode, $realValue, '=');
|
|
||||||
}
|
|
||||||
} elseif (is_numeric($key)) {
|
|
||||||
$oSearch = new DBObjectSearch($sClass);
|
|
||||||
$oSearch->AddCondition('id', $key);
|
|
||||||
} elseif (is_string($key)) {
|
|
||||||
// OQL
|
|
||||||
try {
|
|
||||||
$oSearch = DBObjectSearch::FromOQL($key);
|
|
||||||
} catch (Exception $e) {
|
|
||||||
throw new CoreOqlException('Query failed to execute', [
|
|
||||||
'query' => $key,
|
|
||||||
'exception_class' => get_class($e),
|
|
||||||
'exception_message' => $e->getMessage(),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new Exception("Wrong format for key");
|
|
||||||
}
|
|
||||||
$oObjectSet = new DBObjectSet($oSearch, array(), array(), null, $iLimit, $iOffset);
|
|
||||||
|
|
||||||
return $oObjectSet;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interpret the Rest/Json value and get a valid attribute value
|
|
||||||
*
|
|
||||||
* @param string $sAttCode Attribute code
|
|
||||||
* @param mixed $value Depending on the type of attribute (a scalar, or search criteria, or list of related objects...)
|
|
||||||
* @param string $sClass Name of the class
|
|
||||||
*
|
|
||||||
* @return mixed The value that can be used with DBObject::Set()
|
|
||||||
* @throws Exception If the specification of the value is not valid.
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public static function MakeValue($sClass, $sAttCode, $value)
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
if (!MetaModel::IsValidAttCode($sClass, $sAttCode)) {
|
|
||||||
throw new Exception("Unknown attribute");
|
|
||||||
}
|
|
||||||
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
|
|
||||||
if ($oAttDef instanceof AttributeExternalKey) {
|
|
||||||
$oExtKeyObject = static::FindObjectFromKey($oAttDef->GetTargetClass(), $value, true /* allow null */);
|
|
||||||
$value = ($oExtKeyObject != null) ? $oExtKeyObject->GetKey() : 0;
|
|
||||||
} elseif ($oAttDef instanceof AttributeLinkedSet) {
|
|
||||||
if (!is_array($value)) {
|
|
||||||
throw new Exception("A link set must be defined by an array of objects");
|
|
||||||
}
|
|
||||||
$sLnkClass = $oAttDef->GetLinkedClass();
|
|
||||||
$aLinks = array();
|
|
||||||
foreach ($value as $oValues) {
|
|
||||||
$oLnk = static::MakeObjectFromFields($sLnkClass, $oValues);
|
|
||||||
// Fix for N°1939
|
|
||||||
if (($oAttDef instanceof AttributeLinkedSetIndirect) && ($oLnk->Get($oAttDef->GetExtKeyToRemote()) == 0)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$aLinks[] = $oLnk;
|
|
||||||
}
|
|
||||||
$value = DBObjectSet::FromArray($sLnkClass, $aLinks);
|
|
||||||
} elseif ($oAttDef instanceof AttributeTagSet) {
|
|
||||||
if (!is_array($value)) {
|
|
||||||
throw new Exception("A tag set must be defined by an array of tag codes");
|
|
||||||
}
|
|
||||||
$value = $oAttDef->FromJSONToValue($value);
|
|
||||||
} else {
|
|
||||||
$value = $oAttDef->FromJSONToValue($value);
|
|
||||||
}
|
|
||||||
} catch (Exception $e) {
|
|
||||||
throw new Exception("$sAttCode: " . $e->getMessage(), $e->getCode());
|
|
||||||
}
|
|
||||||
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interpret a Rest/Json structure that defines attribute values, and build an object
|
|
||||||
*
|
|
||||||
* @param array $aFields A hash of attribute code => value specification.
|
|
||||||
* @param string $sClass Name of the class
|
|
||||||
*
|
|
||||||
* @return DBObject The newly created object
|
|
||||||
* @throws Exception If the specification of the values is not valid
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public static function MakeObjectFromFields($sClass, $aFields)
|
|
||||||
{
|
|
||||||
$oObject = MetaModel::NewObject($sClass);
|
|
||||||
foreach ($aFields as $sAttCode => $value) {
|
|
||||||
$realValue = static::MakeValue($sClass, $sAttCode, $value);
|
|
||||||
try {
|
|
||||||
$oObject->Set($sAttCode, $realValue);
|
|
||||||
} catch (Exception $e) {
|
|
||||||
throw new Exception("$sAttCode: " . $e->getMessage(), $e->getCode());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $oObject;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interpret a Rest/Json structure that defines attribute values, and update the given object
|
|
||||||
*
|
|
||||||
* @param array $aFields A hash of attribute code => value specification.
|
|
||||||
* @param DBObject $oObject The object being modified
|
|
||||||
*
|
|
||||||
* @return DBObject The object modified
|
|
||||||
* @throws Exception If the specification of the values is not valid
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public static function UpdateObjectFromFields($oObject, $aFields)
|
|
||||||
{
|
|
||||||
$sClass = get_class($oObject);
|
|
||||||
foreach ($aFields as $sAttCode => $value) {
|
|
||||||
$realValue = static::MakeValue($sClass, $sAttCode, $value);
|
|
||||||
try {
|
|
||||||
$oObject->Set($sAttCode, $realValue);
|
|
||||||
} catch (Exception $e) {
|
|
||||||
throw new Exception("$sAttCode: " . $e->getMessage(), $e->getCode());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $oObject;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A REST service provider implementing this interface will have its input JSON data sanitized for logging purposes
|
|
||||||
*
|
|
||||||
* @see \iRestServiceProvider
|
|
||||||
* @since 2.7.13, 3.2.1-1
|
|
||||||
*/
|
|
||||||
interface iRestInputSanitizer
|
|
||||||
{
|
|
||||||
public function SanitizeJsonInput(string $sJsonInput): string;
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implement this interface to add new operations to the REST/JSON web service
|
|
||||||
*
|
|
||||||
* @api
|
|
||||||
* @package RESTExtensibilityAPI
|
|
||||||
* @since 2.0.1
|
|
||||||
*/
|
|
||||||
interface iRestServiceProvider
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Enumerate services delivered by this class
|
|
||||||
*
|
|
||||||
* @param string $sVersion The version (e.g. 1.0) supported by the services
|
|
||||||
*
|
|
||||||
* @return array An array of hash 'verb' => verb, 'description' => description
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function ListOperations($sVersion);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enumerate services delivered by this class
|
|
||||||
*
|
|
||||||
* @param string $sVersion The version (e.g. 1.0) supported by the services
|
|
||||||
* @param string $sVerb
|
|
||||||
* @param array $aParams
|
|
||||||
*
|
|
||||||
* @return RestResult The standardized result structure (at least a message)
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
public function ExecOperation($sVersion, $sVerb, $aParams);
|
|
||||||
}
|
|
||||||
8
application/capturewebpage.class.inc.php
Normal file
8
application/capturewebpage.class.inc.php
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/CaptureWebPage.php, now loadable using autoloader
|
||||||
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||||
|
*/
|
||||||
|
|
||||||
|
DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/CaptureWebPage.php, now loadable using autoloader');
|
||||||
8
application/clipage.class.inc.php
Normal file
8
application/clipage.class.inc.php
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/CLIPage.php, now loadable using autoloader
|
||||||
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||||
|
*/
|
||||||
|
|
||||||
|
DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/CLIPage.php, now loadable using autoloader');
|
||||||
@@ -698,10 +698,10 @@ HTML
|
|||||||
$sLinkedClass = $oAttDef->GetLinkedClass();
|
$sLinkedClass = $oAttDef->GetLinkedClass();
|
||||||
|
|
||||||
// Filter out links pointing to obsolete objects (if relevant)
|
// Filter out links pointing to obsolete objects (if relevant)
|
||||||
$oOrmLinkSet = $this->Get($sAttCode);
|
$oOrmLinkSet = $this->Get($sAttCode);
|
||||||
$oLinkSet = $oOrmLinkSet->ToDBObjectSet(utils::ShowObsoleteData());
|
$oLinkSet = $oOrmLinkSet->ToDBObjectSet(utils::ShowObsoleteData());
|
||||||
$iCount = $oLinkSet->Count();
|
|
||||||
|
|
||||||
|
$iCount = $oLinkSet->Count();
|
||||||
if ($this->IsNew()) {
|
if ($this->IsNew()) {
|
||||||
$iFlags = $this->GetInitialStateAttributeFlags($sAttCode);
|
$iFlags = $this->GetInitialStateAttributeFlags($sAttCode);
|
||||||
} else {
|
} else {
|
||||||
@@ -766,9 +766,9 @@ HTML
|
|||||||
$oPage->add($sHTMLValue);
|
$oPage->add($sHTMLValue);
|
||||||
} else {
|
} else {
|
||||||
if ($oAttDef->IsIndirect()) {
|
if ($oAttDef->IsIndirect()) {
|
||||||
$oBlockLinkSetViewTable = new BlockIndirectLinkSetViewTable($oPage, $this, $sClass, $sAttCode, $oAttDef, $bReadOnly, $iCount);
|
$oBlockLinkSetViewTable = new BlockIndirectLinkSetViewTable($oPage, $this, $sClass, $sAttCode, $oAttDef, $bReadOnly);
|
||||||
} else {
|
} else {
|
||||||
$oBlockLinkSetViewTable = new BlockDirectLinkSetViewTable($oPage, $this, $sClass, $sAttCode, $oAttDef, $bReadOnly, $iCount);
|
$oBlockLinkSetViewTable = new BlockDirectLinkSetViewTable($oPage, $this, $sClass, $sAttCode, $oAttDef, $bReadOnly);
|
||||||
}
|
}
|
||||||
$oPage->AddUiBlock($oBlockLinkSetViewTable);
|
$oPage->AddUiBlock($oBlockLinkSetViewTable);
|
||||||
}
|
}
|
||||||
@@ -805,16 +805,16 @@ HTML
|
|||||||
if (!$this->IsNew()) {
|
if (!$this->IsNew()) {
|
||||||
// Look for any trigger that considers this object as "In Scope"
|
// Look for any trigger that considers this object as "In Scope"
|
||||||
// If any trigger has been found then display a tab with notifications
|
// If any trigger has been found then display a tab with notifications
|
||||||
// If all triggers on an object have been deleted, we consider that we no longer need the event notification information
|
//
|
||||||
$aTriggers = $this->GetRelatedTriggersIDs();
|
$aTriggers = $this->GetRelatedTriggersIDs();
|
||||||
if (count($aTriggers) > 0) {
|
if (count($aTriggers) > 0) {
|
||||||
$iId = $this->GetKey();
|
$iId = $this->GetKey();
|
||||||
$aParams = array('class' => get_class($this), 'id' => $iId);
|
$aParams = array('triggers' => $aTriggers, 'id' => $iId);
|
||||||
$aNotifSearches = array();
|
$aNotifSearches = array();
|
||||||
$iNotifsCount = 0;
|
$iNotifsCount = 0;
|
||||||
$aNotificationClasses = MetaModel::EnumChildClasses('EventNotification');
|
$aNotificationClasses = MetaModel::EnumChildClasses('EventNotification');
|
||||||
foreach ($aNotificationClasses as $sNotifClass) {
|
foreach ($aNotificationClasses as $sNotifClass) {
|
||||||
$aNotifSearches[$sNotifClass] = DBObjectSearch::FromOQL("SELECT $sNotifClass AS Ev WHERE Ev.object_id = :id AND Ev.object_class = :class");
|
$aNotifSearches[$sNotifClass] = DBObjectSearch::FromOQL("SELECT $sNotifClass AS Ev JOIN Trigger AS T ON Ev.trigger_id = T.id WHERE T.id IN (:triggers) AND Ev.object_id = :id");
|
||||||
$aNotifSearches[$sNotifClass]->SetInternalParams($aParams);
|
$aNotifSearches[$sNotifClass]->SetInternalParams($aParams);
|
||||||
$oNotifSet = new DBObjectSet($aNotifSearches[$sNotifClass], array());
|
$oNotifSet = new DBObjectSet($aNotifSearches[$sNotifClass], array());
|
||||||
$iNotifsCount += $oNotifSet->Count();
|
$iNotifsCount += $oNotifSet->Count();
|
||||||
@@ -2931,11 +2931,11 @@ JS
|
|||||||
$sStatesSelection .= '</select>';
|
$sStatesSelection .= '</select>';
|
||||||
$sStatesSelection .= '<input type="hidden" id="obj_state_orig" name="obj_state_orig" value="'.$this->GetState().'"/>';
|
$sStatesSelection .= '<input type="hidden" id="obj_state_orig" name="obj_state_orig" value="'.$this->GetState().'"/>';
|
||||||
$oPage->add_ready_script(<<<JS
|
$oPage->add_ready_script(<<<JS
|
||||||
$('.state_select_{$this->m_iFormId}').on('change', function() {
|
$('.state_select_{$this->m_iFormId}').change( function() {
|
||||||
if ($('#obj_state_orig').val() != $(this).val()) {
|
if ($('#obj_state_orig').val() != $(this).val()) {
|
||||||
$('.state_select_{$this->m_iFormId}').val($(this).val());
|
$('.state_select_{$this->m_iFormId}').val($(this).val());
|
||||||
$('#form_{$this->m_iFormId}').data('force_submit', true);
|
$('#form_{$this->m_iFormId}').data('force_submit', true);
|
||||||
$('#form_{$this->m_iFormId}').trigger('submit');
|
$('#form_{$this->m_iFormId}').submit();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
JS
|
JS
|
||||||
@@ -3925,7 +3925,7 @@ HTML;
|
|||||||
public static function GetShortcutActions($sFinalClass)
|
public static function GetShortcutActions($sFinalClass)
|
||||||
{
|
{
|
||||||
$sShortcutActions = MetaModel::GetConfig()->Get('shortcut_actions');
|
$sShortcutActions = MetaModel::GetConfig()->Get('shortcut_actions');
|
||||||
$aShortcutActions = array_map('trim', explode(',', $sShortcutActions));
|
$aShortcutActions = explode(',', $sShortcutActions);
|
||||||
|
|
||||||
return $aShortcutActions;
|
return $aShortcutActions;
|
||||||
}
|
}
|
||||||
@@ -4313,15 +4313,24 @@ HTML;
|
|||||||
|
|
||||||
case 'Image':
|
case 'Image':
|
||||||
$value = null;
|
$value = null;
|
||||||
$aDimensions = null;
|
|
||||||
$oImage = utils::ReadPostedDocument("attr_{$sFormPrefix}{$sAttCode}", 'fcontents');
|
$oImage = utils::ReadPostedDocument("attr_{$sFormPrefix}{$sAttCode}", 'fcontents');
|
||||||
$oImage = $oImage->ResizeImageToFit(
|
if (!is_null($oImage->GetData()))
|
||||||
$oAttDef->Get('storage_max_width'),
|
{
|
||||||
$oAttDef->Get('storage_max_height'),
|
$aSize = utils::GetImageSize($oImage->GetData());
|
||||||
$aDimensions
|
if (is_array($aSize) && $aSize[0] > 0 && $aSize[1] > 0)
|
||||||
);
|
{
|
||||||
if (is_null($aDimensions)) {
|
$oImage = utils::ResizeImageToFit(
|
||||||
IssueLog::Warning($sClass . ':' . $this->GetKey() . '/' . $sAttCode . ': Image could not be resized. Mimetype: ' . $oImage->GetMimeType() . ', filename: ' . $oImage->GetFileName());
|
$oImage,
|
||||||
|
$aSize[0],
|
||||||
|
$aSize[1],
|
||||||
|
$oAttDef->Get('storage_max_width'),
|
||||||
|
$oAttDef->Get('storage_max_height')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IssueLog::Warning($sClass . ':' . $this->GetKey() . '/' . $sAttCode . ': Image could not be resized. Mimetype: ' . $oImage->GetMimeType() . ', filename: ' . $oImage->GetFileName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$aOtherData = utils::ReadPostedParam("attr_{$sFormPrefix}{$sAttCode}", null, 'raw_data');
|
$aOtherData = utils::ReadPostedParam("attr_{$sFormPrefix}{$sAttCode}", null, 'raw_data');
|
||||||
if (is_array($aOtherData))
|
if (is_array($aOtherData))
|
||||||
@@ -4566,6 +4575,28 @@ HTML;
|
|||||||
InlineImage::FinalizeInlineImages($this);
|
InlineImage::FinalizeInlineImages($this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated 3.1.1 3.2.0 N°6966 We will have only one DBClone method in the future
|
||||||
|
*/
|
||||||
|
protected function DBCloneTracked_Internal($newKey = null)
|
||||||
|
{
|
||||||
|
/** @var cmdbAbstractObject $oNewObj */
|
||||||
|
$oNewObj = MetaModel::GetObject(get_class($this), parent::DBCloneTracked_Internal($newKey));
|
||||||
|
|
||||||
|
// Invoke extensions after insertion (the object must exist, have an id, etc.)
|
||||||
|
/** @var \iApplicationObjectExtension $oExtensionInstance */
|
||||||
|
foreach(MetaModel::EnumPlugins('iApplicationObjectExtension') as $oExtensionInstance)
|
||||||
|
{
|
||||||
|
$sExtensionClass = get_class($oExtensionInstance);
|
||||||
|
$this->LogCRUDDebug(__METHOD__, "Calling $sExtensionClass::OnDBInsert()");
|
||||||
|
$oKPI = new ExecutionKPI();
|
||||||
|
$oExtensionInstance->OnDBInsert($oNewObj, self::GetCurrentChange());
|
||||||
|
$oKPI->ComputeStatsForExtension($oExtensionInstance, 'OnDBInsert');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $oNewObj;
|
||||||
|
}
|
||||||
|
|
||||||
public function DBUpdate()
|
public function DBUpdate()
|
||||||
{
|
{
|
||||||
$this->LogCRUDEnter(__METHOD__);
|
$this->LogCRUDEnter(__METHOD__);
|
||||||
@@ -4659,6 +4690,25 @@ HTML;
|
|||||||
parent::PostDeleteActions();
|
parent::PostDeleteActions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated 3.1.1 3.2.0 N°6967 We will have only one DBDelete method in the future
|
||||||
|
*/
|
||||||
|
protected function DBDeleteTracked_Internal(&$oDeletionPlan = null)
|
||||||
|
{
|
||||||
|
// Invoke extensions before the deletion (the deletion will do some cleanup and we might loose some information
|
||||||
|
/** @var \iApplicationObjectExtension $oExtensionInstance */
|
||||||
|
foreach(MetaModel::EnumPlugins('iApplicationObjectExtension') as $oExtensionInstance)
|
||||||
|
{
|
||||||
|
$sExtensionClass = get_class($oExtensionInstance);
|
||||||
|
$this->LogCRUDDebug(__METHOD__, "Calling $sExtensionClass::OnDBDelete()");
|
||||||
|
$oKPI = new ExecutionKPI();
|
||||||
|
$oExtensionInstance->OnDBDelete($this, self::GetCurrentChange());
|
||||||
|
$oKPI->ComputeStatsForExtension($oExtensionInstance, 'OnDBDelete');
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::DBDeleteTracked_Internal($oDeletionPlan);
|
||||||
|
}
|
||||||
|
|
||||||
public function IsModified()
|
public function IsModified()
|
||||||
{
|
{
|
||||||
if (parent::IsModified())
|
if (parent::IsModified())
|
||||||
@@ -4810,6 +4860,110 @@ HTML;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Special display where the case log uses the whole "screen" at the bottom of the "Properties" tab
|
||||||
|
*
|
||||||
|
* @param WebPage $oPage
|
||||||
|
* @param string $sAttCode
|
||||||
|
* @param string $sComment
|
||||||
|
* @param string $sPrefix
|
||||||
|
* @param bool $bEditMode
|
||||||
|
*
|
||||||
|
* @throws \ArchivedObjectException
|
||||||
|
* @throws \CoreException
|
||||||
|
* @throws \CoreUnexpectedValue
|
||||||
|
* @throws \DictExceptionMissingString
|
||||||
|
* @throws \MySQLException
|
||||||
|
* @throws \OQLException
|
||||||
|
* @throws \Exception
|
||||||
|
* @deprecated 3.0.0, will be removed in 3.1.0
|
||||||
|
*/
|
||||||
|
public function DisplayCaseLog(WebPage $oPage, $sAttCode, $sComment = '', $sPrefix = '', $bEditMode = false)
|
||||||
|
{
|
||||||
|
DeprecatedCallsLog::NotifyDeprecatedPhpMethod();
|
||||||
|
$oPage->SetCurrentTab('UI:PropertiesTab');
|
||||||
|
$sClass = get_class($this);
|
||||||
|
|
||||||
|
if ($this->IsNew()) {
|
||||||
|
$iFlags = $this->GetInitialStateAttributeFlags($sAttCode);
|
||||||
|
} else {
|
||||||
|
$iFlags = $this->GetAttributeFlags($sAttCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($iFlags & OPT_ATT_HIDDEN) {
|
||||||
|
// The case log is hidden do nothing
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$oAttDef = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
|
||||||
|
$sAttDefClass = get_class($oAttDef);
|
||||||
|
$sAttLabel = $oAttDef->GetLabel();
|
||||||
|
$sAttMetaDataLabel = utils::HtmlEntities($sAttLabel);
|
||||||
|
$sAttMetaDataFlagHidden = (($iFlags & OPT_ATT_HIDDEN) === OPT_ATT_HIDDEN) ? 'true' : 'false';
|
||||||
|
$sAttMetaDataFlagReadOnly = (($iFlags & OPT_ATT_READONLY) === OPT_ATT_READONLY) ? 'true' : 'false';
|
||||||
|
$sAttMetaDataFlagMandatory = (($iFlags & OPT_ATT_MANDATORY) === OPT_ATT_MANDATORY) ? 'true' : 'false';
|
||||||
|
$sAttMetaDataFlagMustChange = (($iFlags & OPT_ATT_MUSTCHANGE) === OPT_ATT_MUSTCHANGE) ? 'true' : 'false';
|
||||||
|
$sAttMetaDataFlagMustPrompt = (($iFlags & OPT_ATT_MUSTPROMPT) === OPT_ATT_MUSTPROMPT) ? 'true' : 'false';
|
||||||
|
$sAttMetaDataFlagSlave = (($iFlags & OPT_ATT_SLAVE) === OPT_ATT_SLAVE) ? 'true' : 'false';
|
||||||
|
|
||||||
|
$sInputId = $this->m_iFormId.'_'.$sAttCode;
|
||||||
|
|
||||||
|
if ((!$bEditMode) || ($iFlags & (OPT_ATT_READONLY | OPT_ATT_SLAVE)))
|
||||||
|
{
|
||||||
|
// Check if the attribute is not read-only because of a synchro...
|
||||||
|
if ($iFlags & OPT_ATT_SLAVE)
|
||||||
|
{
|
||||||
|
$aReasons = array();
|
||||||
|
$sTip = '';
|
||||||
|
foreach($aReasons as $aRow) {
|
||||||
|
$sDescription = utils::EscapeHtml($aRow['description']);
|
||||||
|
$sDescription = str_replace(array("\r\n", "\n"), "<br/>", $sDescription);
|
||||||
|
$sTip .= "<div class=\"synchro-source\">";
|
||||||
|
$sTip .= "<div class=\"synchro-source-title\">Synchronized with {$aRow['name']}</div>";
|
||||||
|
$sTip .= "<div class=\"synchro-source-description\">$sDescription</div>";
|
||||||
|
}
|
||||||
|
$sTip = addslashes($sTip);
|
||||||
|
$oPage->add_ready_script("$('#synchro_$sInputId').qtip( { content: '$sTip', show: 'mouseover', hide: 'mouseout', style: { name: 'dark', tip: 'leftTop' }, position: { corner: { target: 'rightMiddle', tooltip: 'leftTop' }} } );");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attribute is read-only
|
||||||
|
$sHTMLValue = $this->GetAsHTML($sAttCode);
|
||||||
|
$sHTMLValue .= '<input type="hidden" id="'.$sInputId.'" name="attr_'.$sPrefix.$sAttCode.'" value="'.utils::EscapeHtml($this->GetEditValue($sAttCode)).'"/>';
|
||||||
|
$aFieldsMap[$sAttCode] = $sInputId;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sValue = $this->Get($sAttCode);
|
||||||
|
$sDisplayValue = $this->GetEditValue($sAttCode);
|
||||||
|
$aArgs = array('this' => $this, 'formPrefix' => $sPrefix);
|
||||||
|
|
||||||
|
$sCommentAsHtml = ($sComment != '') ? '<span>'.$sComment.'</span><br/>' : '';
|
||||||
|
$sFieldAsHtml = self::GetFormElementForField($oPage, $sClass, $sAttCode, $oAttDef, $sValue, $sDisplayValue, $sInputId, '', $iFlags, $aArgs);
|
||||||
|
$sHTMLValue = <<<HTML
|
||||||
|
<div class="field_data">
|
||||||
|
<div class="field_value">
|
||||||
|
$sCommentAsHtml
|
||||||
|
$sFieldAsHtml
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
HTML;
|
||||||
|
|
||||||
|
$aFieldsMap[$sAttCode] = $sInputId;
|
||||||
|
}
|
||||||
|
|
||||||
|
$oPage->add(<<<HTML
|
||||||
|
<fieldset>
|
||||||
|
<legend>{$sAttLabel}</legend>
|
||||||
|
<div class="field_container field_large" data-attribute-code="{$sAttCode}" data-attribute-type="{$sAttDefClass}" data-attribute-label="{$sAttMetaDataLabel}"
|
||||||
|
data-attribute-flag-hidden="{$sAttMetaDataFlagHidden}" data-attribute-flag-read-only="{$sAttMetaDataFlagReadOnly}" data-attribute-flag-mandatory="{$sAttMetaDataFlagMandatory}"
|
||||||
|
data-attribute-flag-must-change="{$sAttMetaDataFlagMustChange}" data-attribute-flag-must-prompt="{$sAttMetaDataFlagMustPrompt}" data-attribute-flag-slave="{$sAttMetaDataFlagSlave}">
|
||||||
|
{$sHTMLValue}
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
HTML
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Special display where the case log uses the whole "screen" at the bottom of the "Properties" tab
|
* Special display where the case log uses the whole "screen" at the bottom of the "Properties" tab
|
||||||
*
|
*
|
||||||
@@ -5053,7 +5207,7 @@ HTML;
|
|||||||
$aKeys = array_keys($aValues[$sAttCode]);
|
$aKeys = array_keys($aValues[$sAttCode]);
|
||||||
$currValue = $aKeys[0]; // The only value is the first key
|
$currValue = $aKeys[0]; // The only value is the first key
|
||||||
if ($oAttDef->GetEditClass() == 'LinkedSet') {
|
if ($oAttDef->GetEditClass() == 'LinkedSet') {
|
||||||
$oOrmLinkSet = $oDummyObj->Get($sAttCode);
|
$oOrmLinkSet = $oDummyObj->Get($sAttCode);
|
||||||
LinkSetDataTransformer::StringToOrmLinkSet($aValues[$sAttCode][$currValue]['edit_value'], $oOrmLinkSet);
|
LinkSetDataTransformer::StringToOrmLinkSet($aValues[$sAttCode][$currValue]['edit_value'], $oOrmLinkSet);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -5107,7 +5261,7 @@ HTML;
|
|||||||
}
|
}
|
||||||
$oDummyObj->Set($sAttCode, $oTagSet);
|
$oDummyObj->Set($sAttCode, $oTagSet);
|
||||||
} else if ($oAttDef->GetEditClass() == 'LinkedSet') {
|
} else if ($oAttDef->GetEditClass() == 'LinkedSet') {
|
||||||
$oOrmLinkSet = $oDummyObj->Get($sAttCode);
|
$oOrmLinkSet = $oDummyObj->Get($sAttCode);
|
||||||
foreach ($aMultiValues as $key => $sValue) {
|
foreach ($aMultiValues as $key => $sValue) {
|
||||||
LinkSetDataTransformer::StringToOrmLinkSet($sValue['edit_value'], $oOrmLinkSet);
|
LinkSetDataTransformer::StringToOrmLinkSet($sValue['edit_value'], $oOrmLinkSet);
|
||||||
}
|
}
|
||||||
|
|||||||
8
application/csvpage.class.inc.php
Normal file
8
application/csvpage.class.inc.php
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/CSVPage.php, now loadable using autoloader
|
||||||
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||||
|
*/
|
||||||
|
|
||||||
|
DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/CSVPage.php, now loadable using autoloader');
|
||||||
@@ -296,21 +296,21 @@ abstract class Dashboard
|
|||||||
public function FromParams($aParams)
|
public function FromParams($aParams)
|
||||||
{
|
{
|
||||||
$this->sLayoutClass = $aParams['layout_class'];
|
$this->sLayoutClass = $aParams['layout_class'];
|
||||||
if (!is_subclass_of($this->sLayoutClass,DashboardLayout::class)) {
|
|
||||||
throw new InvalidParameterException('Invalid parameter layout_class "'.$aParams['layout_class'].'"');
|
|
||||||
}
|
|
||||||
$this->sTitle = $aParams['title'];
|
$this->sTitle = $aParams['title'];
|
||||||
$this->bAutoReload = $aParams['auto_reload'] == 'true';
|
$this->bAutoReload = $aParams['auto_reload'] == 'true';
|
||||||
$this->iAutoReloadSec = max(MetaModel::GetConfig()->Get('min_reload_interval'), (int) $aParams['auto_reload_sec']);
|
$this->iAutoReloadSec = max(MetaModel::GetConfig()->Get('min_reload_interval'), (int) $aParams['auto_reload_sec']);
|
||||||
|
|
||||||
foreach($aParams['cells'] as $aCell) {
|
foreach($aParams['cells'] as $aCell)
|
||||||
|
{
|
||||||
$aCellDashlets = array();
|
$aCellDashlets = array();
|
||||||
foreach($aCell as $aDashletParams) {
|
foreach($aCell as $aDashletParams)
|
||||||
|
{
|
||||||
$sDashletClass = $aDashletParams['dashlet_class'];
|
$sDashletClass = $aDashletParams['dashlet_class'];
|
||||||
$sId = $aDashletParams['dashlet_id'];
|
$sId = $aDashletParams['dashlet_id'];
|
||||||
/** @var \Dashlet $oNewDashlet */
|
/** @var \Dashlet $oNewDashlet */
|
||||||
$oNewDashlet = new $sDashletClass($this->oMetaModel, $sId);
|
$oNewDashlet = new $sDashletClass($this->oMetaModel, $sId);
|
||||||
if (isset($aDashletParams['dashlet_type'])) {
|
if (isset($aDashletParams['dashlet_type']))
|
||||||
|
{
|
||||||
$oNewDashlet->SetDashletType($aDashletParams['dashlet_type']);
|
$oNewDashlet->SetDashletType($aDashletParams['dashlet_type']);
|
||||||
}
|
}
|
||||||
$oForm = $oNewDashlet->GetForm();
|
$oForm = $oNewDashlet->GetForm();
|
||||||
|
|||||||
@@ -1967,10 +1967,7 @@ class DashletHeaderStatic extends Dashlet
|
|||||||
$sIcon = $this->aProperties['icon'];
|
$sIcon = $this->aProperties['icon'];
|
||||||
|
|
||||||
$oIconSelect = $this->oModelReflection->GetIconSelectionField('icon');
|
$oIconSelect = $this->oModelReflection->GetIconSelectionField('icon');
|
||||||
$sIconPath = '';
|
$sIconPath = utils::HtmlEntities($oIconSelect->MakeFileUrl($sIcon));
|
||||||
if (Utils::IsNotNullOrEmptyString($sIcon)) {
|
|
||||||
$sIconPath = utils::HtmlEntities($oIconSelect->MakeFileUrl($sIcon));
|
|
||||||
}
|
|
||||||
|
|
||||||
return DashletFactory::MakeForDashletHeaderStatic($this->oModelReflection->DictString($sTitle), $sIconPath);
|
return DashletFactory::MakeForDashletHeaderStatic($this->oModelReflection->DictString($sTitle), $sIconPath);
|
||||||
}
|
}
|
||||||
@@ -1984,7 +1981,6 @@ class DashletHeaderStatic extends Dashlet
|
|||||||
$oForm->AddField($oField);
|
$oForm->AddField($oField);
|
||||||
|
|
||||||
$oField = $this->oModelReflection->GetIconSelectionField('icon', Dict::S('UI:DashletHeaderStatic:Prop-Icon'), $this->aProperties['icon']);
|
$oField = $this->oModelReflection->GetIconSelectionField('icon', Dict::S('UI:DashletHeaderStatic:Prop-Icon'), $this->aProperties['icon']);
|
||||||
$oField->AddAllowedValue(['value' => '', 'label' => Dict::S('UI:DashletIcon:None'), 'icon' => '']);
|
|
||||||
$oForm->AddField($oField);
|
$oForm->AddField($oField);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2097,10 +2093,7 @@ class DashletHeaderDynamic extends Dashlet
|
|||||||
$sGroupBy = $this->aProperties['group_by'];
|
$sGroupBy = $this->aProperties['group_by'];
|
||||||
|
|
||||||
$oIconSelect = $this->oModelReflection->GetIconSelectionField('icon');
|
$oIconSelect = $this->oModelReflection->GetIconSelectionField('icon');
|
||||||
$sIconPath = '';
|
$sIconPath = $oIconSelect->MakeFileUrl($sIcon);
|
||||||
if (Utils::IsNotNullOrEmptyString($sIcon)) {
|
|
||||||
$sIconPath = $oIconSelect->MakeFileUrl($sIcon);
|
|
||||||
}
|
|
||||||
|
|
||||||
$aValues = $this->GetValues();
|
$aValues = $this->GetValues();
|
||||||
if (count($aValues) > 0) {
|
if (count($aValues) > 0) {
|
||||||
@@ -2230,7 +2223,6 @@ class DashletHeaderDynamic extends Dashlet
|
|||||||
$oForm->AddField($oField);
|
$oForm->AddField($oField);
|
||||||
|
|
||||||
$oField = $this->oModelReflection->GetIconSelectionField('icon', Dict::S('UI:DashletHeaderDynamic:Prop-Icon'), $this->aProperties['icon']);
|
$oField = $this->oModelReflection->GetIconSelectionField('icon', Dict::S('UI:DashletHeaderDynamic:Prop-Icon'), $this->aProperties['icon']);
|
||||||
$oField->AddAllowedValue(['value' => '', 'label' => Dict::S('UI:DashletIcon:None'), 'icon' => '']);
|
|
||||||
$oForm->AddField($oField);
|
$oForm->AddField($oField);
|
||||||
|
|
||||||
$oField = new DesignerTextField('subtitle', Dict::S('UI:DashletHeaderDynamic:Prop-Subtitle'), $this->aProperties['subtitle']);
|
$oField = new DesignerTextField('subtitle', Dict::S('UI:DashletHeaderDynamic:Prop-Subtitle'), $this->aProperties['subtitle']);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3">
|
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.2">
|
||||||
<classes>
|
<classes>
|
||||||
<class id="AbstractResource" _delta="define">
|
<class id="AbstractResource" _delta="define">
|
||||||
<parent>cmdbAbstractObject</parent>
|
<parent>cmdbAbstractObject</parent>
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
<properties>
|
<properties>
|
||||||
<comment>/** Acknowledge welcome popup messages */</comment>
|
<comment>/** Acknowledge welcome popup messages */</comment>
|
||||||
<abstract>false</abstract>
|
<abstract>false</abstract>
|
||||||
<category/>
|
<category></category>
|
||||||
<key_type>autoincrement</key_type>
|
<key_type>autoincrement</key_type>
|
||||||
<db_table>priv_welcome_popup_acknowledge</db_table>
|
<db_table>priv_welcome_popup_acknowledge</db_table>
|
||||||
</properties>
|
</properties>
|
||||||
@@ -111,6 +111,7 @@
|
|||||||
<menu id="UserManagement" xsi:type="TemplateMenuNode" _delta="define">
|
<menu id="UserManagement" xsi:type="TemplateMenuNode" _delta="define">
|
||||||
<rank>10</rank>
|
<rank>10</rank>
|
||||||
<parent>AdminTools</parent>
|
<parent>AdminTools</parent>
|
||||||
|
<template_file/>
|
||||||
</menu>
|
</menu>
|
||||||
<menu id="UserAccountsMenu" xsi:type="OQLMenuNode" _delta="define">
|
<menu id="UserAccountsMenu" xsi:type="OQLMenuNode" _delta="define">
|
||||||
<rank>11</rank>
|
<rank>11</rank>
|
||||||
@@ -140,6 +141,7 @@
|
|||||||
<menu id="Queries" xsi:type="TemplateMenuNode" _delta="define">
|
<menu id="Queries" xsi:type="TemplateMenuNode" _delta="define">
|
||||||
<rank>30</rank>
|
<rank>30</rank>
|
||||||
<parent>AdminTools</parent>
|
<parent>AdminTools</parent>
|
||||||
|
<template_file/>
|
||||||
</menu>
|
</menu>
|
||||||
<menu id="RunQueriesMenu" xsi:type="WebPageMenuNode" _delta="define">
|
<menu id="RunQueriesMenu" xsi:type="WebPageMenuNode" _delta="define">
|
||||||
<rank>31</rank>
|
<rank>31</rank>
|
||||||
@@ -186,6 +188,7 @@
|
|||||||
<menu id="Integrations" xsi:type="TemplateMenuNode" _delta="define">
|
<menu id="Integrations" xsi:type="TemplateMenuNode" _delta="define">
|
||||||
<rank>50</rank>
|
<rank>50</rank>
|
||||||
<parent>ConfigurationTools</parent>
|
<parent>ConfigurationTools</parent>
|
||||||
|
<template_file/>
|
||||||
</menu>
|
</menu>
|
||||||
<menu id="DataSources" xsi:type="OQLMenuNode" _delta="define">
|
<menu id="DataSources" xsi:type="OQLMenuNode" _delta="define">
|
||||||
<rank>20</rank>
|
<rank>20</rank>
|
||||||
|
|||||||
880
application/datatable.class.inc.php
Normal file
880
application/datatable.class.inc.php
Normal file
@@ -0,0 +1,880 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableSettings;
|
||||||
|
use Combodo\iTop\Application\WebPage\WebPage;
|
||||||
|
use Combodo\iTop\Renderer\Console\ConsoleBlockRenderer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copyright (C) 2013-2024 Combodo SAS
|
||||||
|
*
|
||||||
|
* This file is part of iTop.
|
||||||
|
*
|
||||||
|
* iTop is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* iTop is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
*
|
||||||
|
* @deprecated 3.0.0 use Combodo\iTop\Application\UI\Base\Component\DataTable\Datatable
|
||||||
|
*/
|
||||||
|
|
||||||
|
class DataTable
|
||||||
|
{
|
||||||
|
protected $iListId; // Unique ID inside the web page
|
||||||
|
/** @var string */
|
||||||
|
private $sDatatableContainerId;
|
||||||
|
protected $sTableId; // identifier for saving the settings (combined with the class aliases)
|
||||||
|
protected $oSet; // The set of objects to display
|
||||||
|
protected $aClassAliases; // The aliases (alias => class) inside the set
|
||||||
|
protected $iNbObjects; // Total number of objects in the set
|
||||||
|
protected $bUseCustomSettings; // Whether or not the current display uses custom settings
|
||||||
|
protected $oDefaultSettings; // the default settings for displaying such a list
|
||||||
|
protected $bShowObsoleteData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $iListId Unique ID for this div/table in the page
|
||||||
|
* @param DBObjectSet $oSet The set of data to display
|
||||||
|
* @param array$aClassAliases The list of classes/aliases to be displayed in this set $sAlias => $sClassName
|
||||||
|
* @param string $sTableId A string (or null) identifying this table in order to persist its settings
|
||||||
|
*
|
||||||
|
* @throws \CoreException
|
||||||
|
* @throws \MissingQueryArgument
|
||||||
|
* @throws \MySQLException
|
||||||
|
* @throws \MySQLHasGoneAwayException
|
||||||
|
*/
|
||||||
|
public function __construct($iListId, $oSet, $aClassAliases, $sTableId = null)
|
||||||
|
{
|
||||||
|
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('use Combodo\iTop\Application\UI\Base\Component\DataTable\Datatable');
|
||||||
|
$this->iListId = utils::GetSafeId($iListId); // Make a "safe" ID for jQuery
|
||||||
|
$this->sDatatableContainerId = 'datatable_'.utils::GetSafeId($iListId);
|
||||||
|
$this->oSet = $oSet;
|
||||||
|
$this->aClassAliases = $aClassAliases;
|
||||||
|
$this->sTableId = $sTableId;
|
||||||
|
$this->iNbObjects = $oSet->Count();
|
||||||
|
$this->bUseCustomSettings = false;
|
||||||
|
$this->oDefaultSettings = null;
|
||||||
|
$this->bShowObsoleteData = $oSet->GetShowObsoleteData();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param WebPage $oPage
|
||||||
|
* @param DataTableSettings $oSettings
|
||||||
|
* @param $bActionsMenu
|
||||||
|
* @param $sSelectMode
|
||||||
|
* @param $bViewLink
|
||||||
|
* @param $aExtraParams
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @throws \CoreException
|
||||||
|
* @throws \MySQLException
|
||||||
|
*/
|
||||||
|
public function Display(WebPage $oPage, DataTableSettings $oSettings, $bActionsMenu, $sSelectMode, $bViewLink, $aExtraParams)
|
||||||
|
{
|
||||||
|
$this->oDefaultSettings = $oSettings;
|
||||||
|
|
||||||
|
// Identified tables can have their own specific settings
|
||||||
|
$oCustomSettings = DataTableSettings::GetTableSettings($this->aClassAliases, $this->sTableId);
|
||||||
|
|
||||||
|
if ($oCustomSettings != null)
|
||||||
|
{
|
||||||
|
// Custom settings overload the default ones
|
||||||
|
$this->bUseCustomSettings = true;
|
||||||
|
if ($this->oDefaultSettings->iDefaultPageSize == 0)
|
||||||
|
{
|
||||||
|
$oCustomSettings->iDefaultPageSize = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$oCustomSettings = $oSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($oCustomSettings->iDefaultPageSize > 0)
|
||||||
|
{
|
||||||
|
$this->oSet->SetLimit($oCustomSettings->iDefaultPageSize);
|
||||||
|
}
|
||||||
|
$this->oSet->SetOrderBy($oCustomSettings->GetSortOrder());
|
||||||
|
|
||||||
|
// Load only the requested columns
|
||||||
|
$aColumnsToLoad = array();
|
||||||
|
foreach($oCustomSettings->aColumns as $sAlias => $aColumnsInfo)
|
||||||
|
{
|
||||||
|
foreach($aColumnsInfo as $sAttCode => $aData)
|
||||||
|
{
|
||||||
|
if ($sAttCode != '_key_')
|
||||||
|
{
|
||||||
|
if ($aData['checked'])
|
||||||
|
{
|
||||||
|
$aColumnsToLoad[$sAlias][] = $sAttCode;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// See if this column is a must to load
|
||||||
|
$sClass = $this->aClassAliases[$sAlias];
|
||||||
|
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
|
||||||
|
if ($oAttDef->AlwaysLoadInTables()) {
|
||||||
|
$aColumnsToLoad[$sAlias][] = $sAttCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->oSet->OptimizeColumnLoad($aColumnsToLoad);
|
||||||
|
|
||||||
|
|
||||||
|
$bToolkitMenu = true;
|
||||||
|
if (isset($aExtraParams['toolkit_menu']))
|
||||||
|
{
|
||||||
|
$bToolkitMenu = (bool) $aExtraParams['toolkit_menu'];
|
||||||
|
}
|
||||||
|
if (UserRights::IsPortalUser())
|
||||||
|
{
|
||||||
|
// Portal users have a limited access to data, for now they can only see what's configured for them
|
||||||
|
$bToolkitMenu = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->GetAsHTML($oPage, $oCustomSettings->iDefaultPageSize, $oCustomSettings->iDefaultPageSize, 0, $oCustomSettings->aColumns, $bActionsMenu, $bToolkitMenu, $sSelectMode, $bViewLink, $aExtraParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param WebPage $oPage
|
||||||
|
* @param $iPageSize
|
||||||
|
* @param $iDefaultPageSize
|
||||||
|
* @param $iPageIndex
|
||||||
|
* @param $aColumns
|
||||||
|
* @param $bActionsMenu
|
||||||
|
* @param $bToolkitMenu
|
||||||
|
* @param $sSelectMode
|
||||||
|
* @param $bViewLink
|
||||||
|
* @param $aExtraParams
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @throws \ArchivedObjectException
|
||||||
|
* @throws \CoreException
|
||||||
|
*/
|
||||||
|
public function GetAsHTML(WebPage $oPage, $iPageSize, $iDefaultPageSize, $iPageIndex, $aColumns, $bActionsMenu, $bToolkitMenu, $sSelectMode, $bViewLink, $aExtraParams)
|
||||||
|
{
|
||||||
|
$sObjectsCount = $this->GetObjectCount($oPage, $sSelectMode);
|
||||||
|
$sPager = $this->GetPager($oPage, $iPageSize, $iDefaultPageSize, $iPageIndex);
|
||||||
|
$sActionsMenu = '';
|
||||||
|
$sToolkitMenu = '';
|
||||||
|
if ($bActionsMenu) {
|
||||||
|
$sActionsMenu = $this->GetActionsMenu($oPage, $aExtraParams);
|
||||||
|
}
|
||||||
|
// if ($bToolkitMenu)
|
||||||
|
// {
|
||||||
|
// $sToolkitMenu = $this->GetToolkitMenu($oPage, $aExtraParams);
|
||||||
|
// }
|
||||||
|
|
||||||
|
$sDataTable = $this->GetHTMLTable($oPage, $aColumns, $sSelectMode, $iPageSize, $bViewLink, $aExtraParams);
|
||||||
|
$sConfigDlg = $this->GetTableConfigDlg($oPage, $aColumns, $bViewLink, $iDefaultPageSize);
|
||||||
|
|
||||||
|
$sHtml = "<table id=\"{$this->sDatatableContainerId}\" class=\"datatable\">";
|
||||||
|
$sHtml .= "<tr><td>";
|
||||||
|
$sHtml .= "<table style=\"width:100%;\">";
|
||||||
|
$sHtml .= "<tr><td class=\"pagination_container\">$sObjectsCount</td><td class=\"menucontainer\">$sToolkitMenu $sActionsMenu</td></tr>";
|
||||||
|
$sHtml .= "<tr>$sPager</tr>";
|
||||||
|
$sHtml .= "</table>";
|
||||||
|
$sHtml .= "</td></tr>";
|
||||||
|
$sHtml .= "<tr><td class=\"datacontents\">$sDataTable</td></tr>";
|
||||||
|
$sHtml .= "</table>\n";
|
||||||
|
$oPage->add_at_the_end($sConfigDlg);
|
||||||
|
|
||||||
|
$aExtraParams['show_obsolete_data'] = $this->bShowObsoleteData;
|
||||||
|
|
||||||
|
$aOptions = array(
|
||||||
|
'sPersistentId' => '',
|
||||||
|
'sFilter' => $this->oSet->GetFilter()->serialize(),
|
||||||
|
'oColumns' => $aColumns,
|
||||||
|
'sSelectMode' => $sSelectMode,
|
||||||
|
'sViewLink' => ($bViewLink ? 'true' : 'false'),
|
||||||
|
'iNbObjects' => $this->iNbObjects,
|
||||||
|
'iDefaultPageSize' => $iDefaultPageSize,
|
||||||
|
'iPageSize' => $iPageSize,
|
||||||
|
'iPageIndex' => $iPageIndex,
|
||||||
|
'oClassAliases' => $this->aClassAliases,
|
||||||
|
'sTableId' => $this->sTableId,
|
||||||
|
'oExtraParams' => $aExtraParams,
|
||||||
|
'sRenderUrl' => utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php',
|
||||||
|
'oRenderParameters' => array('str' => ''), // Forces JSON to encode this as a object...
|
||||||
|
'oDefaultSettings' => array('str' => ''), // Forces JSON to encode this as a object...
|
||||||
|
'oLabels' => array('moveup' => Dict::S('UI:Button:MoveUp'), 'movedown' => Dict::S('UI:Button:MoveDown')),
|
||||||
|
);
|
||||||
|
if($this->oDefaultSettings != null)
|
||||||
|
{
|
||||||
|
$aOptions['oDefaultSettings'] = $this->GetAsHash($this->oDefaultSettings);
|
||||||
|
}
|
||||||
|
$sJSOptions = json_encode($aOptions);
|
||||||
|
$oPage->add_ready_script("$('#{$this->sDatatableContainerId}').datatable($sJSOptions);");
|
||||||
|
|
||||||
|
return $sHtml;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When refreshing the body of a paginated table, get the rows of the table (inside the TBODY)
|
||||||
|
* return string The HTML rows to insert inside the <tbody> node
|
||||||
|
*/
|
||||||
|
public function GetAsHTMLTableRows(WebPage $oPage, $iPageSize, $aColumns, $sSelectMode, $bViewLink, $aExtraParams)
|
||||||
|
{
|
||||||
|
if ($iPageSize < 1)
|
||||||
|
{
|
||||||
|
$iPageSize = -1; // convention: no pagination
|
||||||
|
}
|
||||||
|
$aAttribs = $this->GetHTMLTableConfig($aColumns, $sSelectMode, $bViewLink);
|
||||||
|
$aValues = $this->GetHTMLTableValues($aColumns, $sSelectMode, $iPageSize, $bViewLink, $aExtraParams);
|
||||||
|
|
||||||
|
$sHtml = '';
|
||||||
|
foreach($aValues as $aRow)
|
||||||
|
{
|
||||||
|
$sHtml .= $oPage->GetTableRow($aRow, $aAttribs);
|
||||||
|
}
|
||||||
|
return $sHtml;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param WebPage $oPage
|
||||||
|
* @param $sSelectMode
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function GetObjectCount(WebPage $oPage, $sSelectMode)
|
||||||
|
{
|
||||||
|
if (($sSelectMode == 'single') || ($sSelectMode == 'multiple'))
|
||||||
|
{
|
||||||
|
$sHtml = '<div class="pagination_objcount">'.Dict::Format('UI:Pagination:HeaderSelection', '<span id="total">'.$this->iNbObjects.'</span>', '<span class="selectedCount">0</span>').'</div>';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sHtml = '<div class="pagination_objcount">'.Dict::Format('UI:Pagination:HeaderNoSelection', '<span id="total">'.$this->iNbObjects.'</span>').'</div>';
|
||||||
|
}
|
||||||
|
return $sHtml;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param WebPage $oPage
|
||||||
|
* @param $iPageSize
|
||||||
|
* @param $iDefaultPageSize
|
||||||
|
* @param $iPageIndex
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function GetPager(WebPage $oPage, $iPageSize, $iDefaultPageSize, $iPageIndex)
|
||||||
|
{
|
||||||
|
$sHtml = '';
|
||||||
|
if ($iPageSize < 1) // Display all
|
||||||
|
{
|
||||||
|
$sPagerStyle = 'style="display:none"'; // no limit: display the full table, so hide the "pager" UI
|
||||||
|
// WARNING: mPDF does not take the "display" style into account
|
||||||
|
// when applied to a <td> or a <table> tag, so make sure you apply this to a div
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sPagerStyle = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$sCombo = '<select class="pagesize">';
|
||||||
|
if($iPageSize < 1)
|
||||||
|
{
|
||||||
|
$sCombo .= "<option selected=\"selected\" value=\"-1\">".Dict::S('UI:Pagination:All')."</option>";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for($iPage = 1; $iPage < 5; $iPage++)
|
||||||
|
{
|
||||||
|
$iNbItems = $iPage * $iDefaultPageSize;
|
||||||
|
$sSelected = ($iNbItems == $iPageSize) ? 'selected="selected"' : '';
|
||||||
|
$sCombo .= "<option $sSelected value=\"$iNbItems\">$iNbItems</option>";
|
||||||
|
}
|
||||||
|
$sCombo .= "<option value=\"-1\">".Dict::S('UI:Pagination:All')."</option>";
|
||||||
|
}
|
||||||
|
|
||||||
|
$sCombo .= '</select>';
|
||||||
|
|
||||||
|
$sPages = Dict::S('UI:Pagination:PagesLabel');
|
||||||
|
$sPageSizeCombo = Dict::Format('UI:Pagination:PageSize', $sCombo);
|
||||||
|
|
||||||
|
$iNbPages = ($iPageSize < 1) ? 1 : ceil($this->iNbObjects / $iPageSize);
|
||||||
|
if ($iNbPages == 1)
|
||||||
|
{
|
||||||
|
// No need to display the pager
|
||||||
|
$sPagerStyle = 'style="display:none"';
|
||||||
|
}
|
||||||
|
$aPagesToDisplay = array();
|
||||||
|
for($idx = 0; $idx <= min(4, $iNbPages-1); $idx++)
|
||||||
|
{
|
||||||
|
if ($idx == 0)
|
||||||
|
{
|
||||||
|
$aPagesToDisplay[$idx] = '<span page="0" class="curr_page">1</span>';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$aPagesToDisplay[$idx] = "<span id=\"gotopage_$idx\" class=\"gotopage\" page=\"$idx\">".(1+$idx)."</span>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$iLastPageIdx = $iNbPages - 1;
|
||||||
|
if (!isset($aPagesToDisplay[$iLastPageIdx]))
|
||||||
|
{
|
||||||
|
unset($aPagesToDisplay[$idx - 1]); // remove the last page added to make room for the very last page
|
||||||
|
$aPagesToDisplay[$iLastPageIdx] = "<span id=\"gotopage_$iLastPageIdx\" class=\"gotopage\" page=\"$iLastPageIdx\">... $iNbPages</span>";
|
||||||
|
}
|
||||||
|
$sPagesLinks = implode('', $aPagesToDisplay);
|
||||||
|
$sPagesList = '['.implode(',', array_keys($aPagesToDisplay)).']';
|
||||||
|
|
||||||
|
$sAppRootUrl = utils::GetAbsoluteUrlAppRoot();
|
||||||
|
$sSelectionMode = ($iNbPages == 1) ? '' : 'positive';
|
||||||
|
$sHtml =
|
||||||
|
<<<EOF
|
||||||
|
<td colspan="2">
|
||||||
|
<div $sPagerStyle>
|
||||||
|
<table id="pager{$this->iListId}" class="pager"><tr>
|
||||||
|
<td>$sPages</td>
|
||||||
|
<td><img src="{$sAppRootUrl}images/first.png" class="first"/>AAAA</td>
|
||||||
|
<td><img src="{$sAppRootUrl}images/prev.png" class="prev"/></td>
|
||||||
|
<td><span id="index">$sPagesLinks</span></td>
|
||||||
|
<td><img src="{$sAppRootUrl}images/next.png" class="next"/></td>
|
||||||
|
<td><img src="{$sAppRootUrl}images/last.png" class="last"/></td>
|
||||||
|
<td>$sPageSizeCombo</td>
|
||||||
|
<td><span id="loading"> </span><input type="hidden" name="selectionMode" value="$sSelectionMode"></input>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
EOF;
|
||||||
|
return $sHtml;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param WebPage $oPage
|
||||||
|
* @param $aExtraParams
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @throws \ApplicationException
|
||||||
|
* @throws \ArchivedObjectException
|
||||||
|
* @throws \CoreException
|
||||||
|
* @throws \CoreUnexpectedValue
|
||||||
|
* @throws \DictExceptionMissingString
|
||||||
|
* @throws \MissingQueryArgument
|
||||||
|
* @throws \MySQLException
|
||||||
|
* @throws \MySQLHasGoneAwayException
|
||||||
|
* @throws \OQLException
|
||||||
|
* @throws \ReflectionException
|
||||||
|
* @throws \Twig\Error\LoaderError
|
||||||
|
* @throws \Twig\Error\RuntimeError
|
||||||
|
* @throws \Twig\Error\SyntaxError
|
||||||
|
*/
|
||||||
|
protected function GetActionsMenu(WebPage $oPage, $aExtraParams)
|
||||||
|
{
|
||||||
|
$oMenuBlock = new MenuBlock($this->oSet->GetFilter(), 'list');
|
||||||
|
$oBlock = $oMenuBlock->GetRenderContent($oPage, $aExtraParams, $this->iListId);
|
||||||
|
|
||||||
|
return ConsoleBlockRenderer::RenderBlockTemplateInPage($oPage, $oBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param WebPage $oPage
|
||||||
|
* @param $aExtraParams
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @throws \Exception
|
||||||
|
*/
|
||||||
|
protected function GetToolkitMenu(WebPage $oPage, $aExtraParams)
|
||||||
|
{
|
||||||
|
if (!$oPage->IsPrintableVersion())
|
||||||
|
{
|
||||||
|
$sMenuTitle = Dict::S('UI:ConfigureThisList');
|
||||||
|
$sHtml = '<div class="itop_popup toolkit_menu" id="tk_'.$this->iListId.'"><ul><li aria-label="'.Dict::S('UI:Menu:Toolkit').'"><i class="fas fa-tools"></i><i class="fas fa-caret-down"></i><ul>';
|
||||||
|
|
||||||
|
$oMenuItem1 = new JSPopupMenuItem('iTop::ConfigureList', $sMenuTitle, "$('#datatable_dlg_".$this->iListId."').dialog('open');");
|
||||||
|
$aActions = array(
|
||||||
|
$oMenuItem1->GetUID() => $oMenuItem1->GetMenuItem(),
|
||||||
|
);
|
||||||
|
$this->oSet->Rewind();
|
||||||
|
utils::GetPopupMenuItems($oPage, iPopupMenuExtension::MENU_OBJLIST_TOOLKIT, $this->oSet, $aActions, $this->sTableId, $this->iListId);
|
||||||
|
$this->oSet->Rewind();
|
||||||
|
$sHtml .= $oPage->RenderPopupMenuItems($aActions);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sHtml = '';
|
||||||
|
}
|
||||||
|
return $sHtml;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param WebPage $oPage
|
||||||
|
* @param $aColumns
|
||||||
|
* @param $bViewLink
|
||||||
|
* @param $iDefaultPageSize
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function GetTableConfigDlg(WebPage $oPage, $aColumns, $bViewLink, $iDefaultPageSize)
|
||||||
|
{
|
||||||
|
$sHtml = "<div id=\"datatable_dlg_{$this->iListId}\" style=\"display: none;\">";
|
||||||
|
$sHtml .= "<form onsubmit=\"return false\">";
|
||||||
|
$sChecked = ($this->bUseCustomSettings) ? '' : 'checked';
|
||||||
|
$sHtml .= "<p><input id=\"dtbl_dlg_settings_{$this->iListId}\" type=\"radio\" name=\"settings\" $sChecked value=\"defaults\"><label for=\"dtbl_dlg_settings_{$this->iListId}\"> ".Dict::S('UI:UseDefaultSettings').'</label></p>';
|
||||||
|
$sHtml .= "<fieldset>";
|
||||||
|
$sChecked = ($this->bUseCustomSettings) ? 'checked': '';
|
||||||
|
$sHtml .= "<legend class=\"transparent\"><input id=\"dtbl_dlg_specific_{$this->iListId}\" type=\"radio\" class=\"specific_settings\" name=\"settings\" $sChecked value=\"specific\"><label for=\"dtbl_dlg_specific_{$this->iListId}\"> ".Dict::S('UI:UseSpecificSettings')."</label></legend>";
|
||||||
|
$sHtml .= Dict::S('UI:ColumnsAndSortOrder').'<br/><ul class="sortable_field_list" id="sfl_'.$this->iListId.'"></ul>';
|
||||||
|
|
||||||
|
$sHtml .= '<p>'.Dict::Format('UI:Display_X_ItemsPerPage', '<input type="text" size="4" name="page_size" value="'.$iDefaultPageSize.'">').'</p>';
|
||||||
|
$sHtml .= "</fieldset>";
|
||||||
|
$sHtml .= "<fieldset>";
|
||||||
|
$sSaveChecked = ($this->sTableId != null) ? 'checked' : '';
|
||||||
|
$sCustomDisabled = ($this->sTableId == null) ? 'disabled="disabled" stay-disabled="true" ' : '';
|
||||||
|
$sCustomChecked = ($this->sTableId != null) ? 'checked' : '';
|
||||||
|
$sGenericChecked = ($this->sTableId == null) ? 'checked' : '';
|
||||||
|
$sHtml .= "<legend class=\"transparent\"><input id=\"dtbl_dlg_save_{$this->iListId}\" type=\"checkbox\" $sSaveChecked name=\"save_settings\"><label for=\"dtbl_dlg_save_{$this->iListId}\"> ".Dict::S('UI:UseSavetheSettings')."</label></legend>";
|
||||||
|
$sHtml .= "<p><input id=\"dtbl_dlg_this_list_{$this->iListId}\" type=\"radio\" name=\"scope\" $sCustomChecked $sCustomDisabled value=\"this_list\"><label for=\"dtbl_dlg_this_list_{$this->iListId}\"> ".Dict::S('UI:OnlyForThisList').'</label> ';
|
||||||
|
$sHtml .= "<input id=\"dtbl_dlg_all_{$this->iListId}\" type=\"radio\" name=\"scope\" $sGenericChecked value=\"defaults\"><label for=\"dtbl_dlg_all_{$this->iListId}\"> ".Dict::S('UI:ForAllLists').'</label></p>';
|
||||||
|
$sHtml .= "</fieldset>";
|
||||||
|
$sHtml .= '<table style="width:100%"><tr><td style="text-align:center;">';
|
||||||
|
$sHtml .= '<button type="button" onclick="$(\'#'.$this->sDatatableContainerId.'\').datatable(\'onDlgCancel\'); $(\'#datatable_dlg_'.$this->iListId.'\').dialog(\'close\')">'.Dict::S('UI:Button:Cancel').'</button>';
|
||||||
|
$sHtml .= '</td><td style="text-align:center;">';
|
||||||
|
$sHtml .= '<button type="submit" onclick="$(\'#'.$this->sDatatableContainerId.'\').datatable(\'onDlgOk\');$(\'#datatable_dlg_'.$this->iListId.'\').dialog(\'close\');">'.Dict::S('UI:Button:Ok').'</button>';
|
||||||
|
$sHtml .= '</td></tr></table>';
|
||||||
|
$sHtml .= "</form>";
|
||||||
|
$sHtml .= "</div>";
|
||||||
|
|
||||||
|
$sDlgTitle = addslashes(Dict::S('UI:ListConfigurationTitle'));
|
||||||
|
$oPage->add_ready_script("$('#datatable_dlg_{$this->iListId}').dialog({autoOpen: false, title: '$sDlgTitle', width: 500, close: function() { $('#{$this->sDatatableContainerId}').datatable('onDlgCancel'); } });");
|
||||||
|
|
||||||
|
return $sHtml;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $oSetting
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function GetAsHash($oSetting)
|
||||||
|
{
|
||||||
|
$aSettings = array('iDefaultPageSize' => $oSetting->iDefaultPageSize, 'oColumns' => $oSetting->aColumns);
|
||||||
|
return $aSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $aColumns
|
||||||
|
* @param string $sSelectMode
|
||||||
|
* @param bool $bViewLink
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
* @throws \CoreException
|
||||||
|
* @throws \DictExceptionMissingString
|
||||||
|
* @throws \Exception
|
||||||
|
*/
|
||||||
|
protected function GetHTMLTableConfig($aColumns, $sSelectMode, $bViewLink)
|
||||||
|
{
|
||||||
|
$aAttribs = array();
|
||||||
|
if ($sSelectMode == 'multiple')
|
||||||
|
{
|
||||||
|
$aAttribs['form::select'] = array(
|
||||||
|
'label' => "<input type=\"checkbox\" onClick=\"CheckAll('.selectList{$this->iListId}:not(:disabled)', this.checked);\" class=\"checkAll\"></input>",
|
||||||
|
'description' => Dict::S('UI:SelectAllToggle+'),
|
||||||
|
'metadata' => array(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else if ($sSelectMode == 'single')
|
||||||
|
{
|
||||||
|
$aAttribs['form::select'] = array('label' => '', 'description' => '', 'metadata' => array());
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach($this->aClassAliases as $sAlias => $sClassName)
|
||||||
|
{
|
||||||
|
foreach($aColumns[$sAlias] as $sAttCode => $aData)
|
||||||
|
{
|
||||||
|
if ($aData['checked'])
|
||||||
|
{
|
||||||
|
if ($sAttCode == '_key_')
|
||||||
|
{
|
||||||
|
$sAttLabel = MetaModel::GetName($sClassName);
|
||||||
|
|
||||||
|
$aAttribs['key_'.$sAlias] = array(
|
||||||
|
'label' => $sAttLabel,
|
||||||
|
'description' => '',
|
||||||
|
'metadata' => array(
|
||||||
|
'object_class' => $sClassName,
|
||||||
|
'attribute_label' => $sAttLabel,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$oAttDef = MetaModel::GetAttributeDef($sClassName, $sAttCode);
|
||||||
|
$sAttDefClass = get_class($oAttDef);
|
||||||
|
$sAttLabel = MetaModel::GetLabel($sClassName, $sAttCode);
|
||||||
|
|
||||||
|
$aAttribs[$sAttCode.'_'.$sAlias] = array(
|
||||||
|
'label' => $sAttLabel,
|
||||||
|
'description' => $oAttDef->GetOrderByHint(),
|
||||||
|
'metadata' => array(
|
||||||
|
'object_class' => $sClassName,
|
||||||
|
'attribute_code' => $sAttCode,
|
||||||
|
'attribute_type' => $sAttDefClass,
|
||||||
|
'attribute_label' => $sAttLabel,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $aAttribs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $aColumns
|
||||||
|
* @param $sSelectMode
|
||||||
|
* @param $iPageSize
|
||||||
|
* @param $bViewLink
|
||||||
|
* @param $aExtraParams
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
* @throws \CoreException
|
||||||
|
* @throws \CoreUnexpectedValue
|
||||||
|
* @throws \MissingQueryArgument
|
||||||
|
* @throws \MySQLException
|
||||||
|
* @throws \MySQLHasGoneAwayException
|
||||||
|
* @throws \Exception
|
||||||
|
*/
|
||||||
|
protected function GetHTMLTableValues($aColumns, $sSelectMode, $iPageSize, $bViewLink, $aExtraParams)
|
||||||
|
{
|
||||||
|
$bLocalize = true;
|
||||||
|
if (isset($aExtraParams['localize_values']))
|
||||||
|
{
|
||||||
|
$bLocalize = (bool) $aExtraParams['localize_values'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$aValues = array();
|
||||||
|
$aAttDefsCache = array();
|
||||||
|
$this->oSet->Seek(0);
|
||||||
|
$iMaxObjects = $iPageSize;
|
||||||
|
while (($aObjects = $this->oSet->FetchAssoc()) && ($iMaxObjects != 0))
|
||||||
|
{
|
||||||
|
$bFirstObject = true;
|
||||||
|
$aRow = array();
|
||||||
|
foreach($this->aClassAliases as $sAlias => $sClassName)
|
||||||
|
{
|
||||||
|
if (is_object($aObjects[$sAlias]))
|
||||||
|
{
|
||||||
|
$sHilightClass = MetaModel::GetHilightClass($sClassName, $aObjects[$sAlias]);
|
||||||
|
if ($sHilightClass != '')
|
||||||
|
{
|
||||||
|
$aRow['@class'] = $sHilightClass;
|
||||||
|
}
|
||||||
|
if ((($sSelectMode == 'single') || ($sSelectMode == 'multiple')) && $bFirstObject)
|
||||||
|
{
|
||||||
|
if (array_key_exists('selection_enabled', $aExtraParams) && isset($aExtraParams['selection_enabled'][$aObjects[$sAlias]->GetKey()]))
|
||||||
|
{
|
||||||
|
$sDisabled = ($aExtraParams['selection_enabled'][$aObjects[$sAlias]->GetKey()]) ? '' : ' disabled="disabled"';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sDisabled = '';
|
||||||
|
}
|
||||||
|
if ($sSelectMode == 'single')
|
||||||
|
{
|
||||||
|
$aRow['form::select'] = "<input type=\"radio\" $sDisabled class=\"selectList{$this->iListId}\" name=\"selectObject\" value=\"".$aObjects[$sAlias]->GetKey()."\"></input>";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$aRow['form::select'] = "<input type=\"checkbox\" $sDisabled class=\"selectList{$this->iListId}\" name=\"selectObject[]\" value=\"".$aObjects[$sAlias]->GetKey()."\"></input>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach($aColumns[$sAlias] as $sAttCode => $aData)
|
||||||
|
{
|
||||||
|
if ($aData['checked'])
|
||||||
|
{
|
||||||
|
if ($sAttCode == '_key_')
|
||||||
|
{
|
||||||
|
$aRow['key_'.$sAlias] = array(
|
||||||
|
'value_raw' => $aObjects[$sAlias]->GetKey(),
|
||||||
|
'value_html' => $aObjects[$sAlias]->GetHyperLink(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Prepare att. def. classes cache to avoid retrieving AttDef for each row
|
||||||
|
if(!isset($aAttDefsCache[$sClassName][$sAttCode]))
|
||||||
|
{
|
||||||
|
$aAttDefClassesCache[$sClassName][$sAttCode] = get_class(MetaModel::GetAttributeDef($sClassName, $sAttCode));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only retrieve raw (stored) value for simple fields
|
||||||
|
$bExcludeRawValue = false;
|
||||||
|
foreach (cmdbAbstractObject::GetAttDefClassesToExcludeFromMarkupMetadataRawValue() as $sAttDefClassToExclude)
|
||||||
|
{
|
||||||
|
if (is_a($aAttDefClassesCache[$sClassName][$sAttCode], $sAttDefClassToExclude, true))
|
||||||
|
{
|
||||||
|
$bExcludeRawValue = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($bExcludeRawValue)
|
||||||
|
{
|
||||||
|
$aRow[$sAttCode.'_'.$sAlias] = $aObjects[$sAlias]->GetAsHTML($sAttCode, $bLocalize);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$aRow[$sAttCode.'_'.$sAlias] = array(
|
||||||
|
'value_raw' => $aObjects[$sAlias]->Get($sAttCode),
|
||||||
|
'value_html' => $aObjects[$sAlias]->GetAsHTML($sAttCode, $bLocalize),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach($aColumns[$sAlias] as $sAttCode => $aData)
|
||||||
|
{
|
||||||
|
if ($aData['checked'])
|
||||||
|
{
|
||||||
|
if ($sAttCode == '_key_')
|
||||||
|
{
|
||||||
|
$aRow['key_'.$sAlias] = '';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$aRow[$sAttCode.'_'.$sAlias] = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$bFirstObject = false;
|
||||||
|
}
|
||||||
|
$aValues[] = $aRow;
|
||||||
|
$iMaxObjects--;
|
||||||
|
}
|
||||||
|
return $aValues;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param WebPage $oPage
|
||||||
|
* @param $aColumns
|
||||||
|
* @param $sSelectMode
|
||||||
|
* @param $iPageSize
|
||||||
|
* @param $bViewLink
|
||||||
|
* @param $aExtraParams
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @throws \ArchivedObjectException
|
||||||
|
* @throws \CoreException
|
||||||
|
* @throws \CoreUnexpectedValue
|
||||||
|
* @throws \DictExceptionMissingString
|
||||||
|
* @throws \MissingQueryArgument
|
||||||
|
* @throws \MySQLException
|
||||||
|
* @throws \MySQLHasGoneAwayException
|
||||||
|
* @throws \Exception
|
||||||
|
*/
|
||||||
|
public function GetHTMLTable(WebPage $oPage, $aColumns, $sSelectMode, $iPageSize, $bViewLink, $aExtraParams)
|
||||||
|
{
|
||||||
|
$iNbPages = ($iPageSize < 1) ? 1 : ceil($this->iNbObjects / $iPageSize);
|
||||||
|
if ($iPageSize < 1)
|
||||||
|
{
|
||||||
|
$iPageSize = -1; // convention: no pagination
|
||||||
|
}
|
||||||
|
$aAttribs = $this->GetHTMLTableConfig($aColumns, $sSelectMode, $bViewLink);
|
||||||
|
|
||||||
|
$aValues = $this->GetHTMLTableValues($aColumns, $sSelectMode, $iPageSize, $bViewLink, $aExtraParams);
|
||||||
|
|
||||||
|
$sHtml = '<table class="listContainer object-list">';
|
||||||
|
|
||||||
|
foreach($this->oSet->GetFilter()->GetInternalParams() as $sName => $sValue)
|
||||||
|
{
|
||||||
|
$aExtraParams['query_params'][$sName] = $sValue;
|
||||||
|
}
|
||||||
|
$aExtraParams['show_obsolete_data'] = $this->bShowObsoleteData;
|
||||||
|
|
||||||
|
$sHtml .= "<tr><td>";
|
||||||
|
$sHtml .= $oPage->GetTable($aAttribs, $aValues);
|
||||||
|
$sHtml .= '</td></tr>';
|
||||||
|
$sHtml .= '</table>';
|
||||||
|
$iCount = $this->iNbObjects;
|
||||||
|
|
||||||
|
$aArgs = $this->oSet->GetArgs();
|
||||||
|
$sExtraParams = addslashes(str_replace('"', "'", json_encode(array_merge($aExtraParams, $aArgs)))); // JSON encode, change the style of the quotes and escape them
|
||||||
|
$sSelectModeJS = '';
|
||||||
|
$sHeaders = '';
|
||||||
|
if (($sSelectMode == 'single') || ($sSelectMode == 'multiple'))
|
||||||
|
{
|
||||||
|
$sSelectModeJS = $sSelectMode;
|
||||||
|
$sHeaders = 'headers: { 0: {sorter: false}},';
|
||||||
|
}
|
||||||
|
$sDisplayKey = ($bViewLink) ? 'true' : 'false';
|
||||||
|
// Protect against duplicate elements in the Zlist
|
||||||
|
$aUniqueOrderedList = array();
|
||||||
|
foreach($this->aClassAliases as $sAlias => $sClassName)
|
||||||
|
{
|
||||||
|
foreach($aColumns[$sAlias] as $sAttCode => $aData)
|
||||||
|
{
|
||||||
|
if ($aData['checked'])
|
||||||
|
{
|
||||||
|
$aUniqueOrderedList[$sAttCode] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$aUniqueOrderedList = array_keys($aUniqueOrderedList);
|
||||||
|
$sJSColumns = json_encode($aColumns);
|
||||||
|
$sJSClassAliases = json_encode($this->aClassAliases);
|
||||||
|
$sCssCount = isset($aExtraParams['cssCount']) ? ", cssCount: '{$aExtraParams['cssCount']}'" : '';
|
||||||
|
$this->oSet->ApplyParameters();
|
||||||
|
// Display the actual sort order of the table
|
||||||
|
$aRealSortOrder = $this->oSet->GetRealSortOrder();
|
||||||
|
$aDefaultSort = array();
|
||||||
|
$iColOffset = 0;
|
||||||
|
if (($sSelectMode == 'single') || ($sSelectMode == 'multiple'))
|
||||||
|
{
|
||||||
|
$iColOffset += 1;
|
||||||
|
}
|
||||||
|
if ($bViewLink)
|
||||||
|
{
|
||||||
|
// $iColOffset += 1;
|
||||||
|
}
|
||||||
|
foreach($aRealSortOrder as $sColCode => $bAscending)
|
||||||
|
{
|
||||||
|
$iPos = array_search($sColCode, $aUniqueOrderedList);
|
||||||
|
if ($iPos !== false)
|
||||||
|
{
|
||||||
|
$aDefaultSort[] = "[".($iColOffset+$iPos).",".($bAscending ? '0' : '1')."]";
|
||||||
|
}
|
||||||
|
else if (($iPos = array_search(preg_replace('/_friendlyname$/', '', $sColCode), $aUniqueOrderedList)) !== false)
|
||||||
|
{
|
||||||
|
// if sorted on the friendly name of an external key, then consider it sorted on the column that shows the links
|
||||||
|
$aDefaultSort[] = "[".($iColOffset+$iPos).",".($bAscending ? '0' : '1')."]";
|
||||||
|
}
|
||||||
|
else if($sColCode == 'friendlyname' && $bViewLink)
|
||||||
|
{
|
||||||
|
$aDefaultSort[] = "[".($iColOffset).",".($bAscending ? '0' : '1')."]";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$sFakeSortList = '';
|
||||||
|
if (count($aDefaultSort) > 0)
|
||||||
|
{
|
||||||
|
$sFakeSortList = '['.implode(',', $aDefaultSort).']';
|
||||||
|
}
|
||||||
|
$sOQL = addslashes($this->oSet->GetFilter()->serialize());
|
||||||
|
$oPage->add_ready_script(
|
||||||
|
<<<JS
|
||||||
|
var oTable = $('#{$this->sDatatableContainerId} table.listResults');
|
||||||
|
oTable.tableHover();
|
||||||
|
oTable
|
||||||
|
.tablesorter({ $sHeaders widgets: ['myZebra', 'truncatedList']})
|
||||||
|
.tablesorterPager({
|
||||||
|
container: $('#pager{$this->iListId}'),
|
||||||
|
totalRows:$iCount,
|
||||||
|
size: $iPageSize,
|
||||||
|
filter: '$sOQL',
|
||||||
|
extra_params: '$sExtraParams',
|
||||||
|
select_mode: '$sSelectModeJS',
|
||||||
|
displayKey: $sDisplayKey,
|
||||||
|
table_id: '{$this->sDatatableContainerId}',
|
||||||
|
columns: $sJSColumns,
|
||||||
|
class_aliases: $sJSClassAliases $sCssCount
|
||||||
|
});
|
||||||
|
JS
|
||||||
|
);
|
||||||
|
if ($sFakeSortList != '')
|
||||||
|
{
|
||||||
|
$oPage->add_ready_script("oTable.trigger(\"fakesorton\", [$sFakeSortList]);");
|
||||||
|
}
|
||||||
|
return $sHtml;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param WebPage $oPage
|
||||||
|
* @param $iDefaultPageSize
|
||||||
|
* @param $iStart
|
||||||
|
*/
|
||||||
|
public function UpdatePager(WebPage $oPage, $iDefaultPageSize, $iStart)
|
||||||
|
{
|
||||||
|
$iPageSize = $iDefaultPageSize;
|
||||||
|
$iPageIndex = 0;
|
||||||
|
$sHtml = $this->GetPager($oPage, $iPageSize, $iDefaultPageSize, $iPageIndex);
|
||||||
|
$oPage->add_ready_script("$('#pager{$this->iListId}').html('".json_encode($sHtml)."');");
|
||||||
|
if ($iDefaultPageSize < 1)
|
||||||
|
{
|
||||||
|
$oPage->add_ready_script("$('#pager{$this->iListId}').parent().hide()");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$oPage->add_ready_script("$('#pager{$this->iListId}').parent().show()");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simplified version of the data table with less "decoration" (and no paging)
|
||||||
|
* which is optimized for printing
|
||||||
|
*/
|
||||||
|
class PrintableDataTable extends DataTable
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param WebPage $oPage
|
||||||
|
* @param $iPageSize
|
||||||
|
* @param $iDefaultPageSize
|
||||||
|
* @param $iPageIndex
|
||||||
|
* @param $aColumns
|
||||||
|
* @param $bActionsMenu
|
||||||
|
* @param $bToolkitMenu
|
||||||
|
* @param $sSelectMode
|
||||||
|
* @param $bViewLink
|
||||||
|
* @param $aExtraParams
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @throws \ArchivedObjectException
|
||||||
|
* @throws \CoreException
|
||||||
|
* @throws \CoreUnexpectedValue
|
||||||
|
* @throws \DictExceptionMissingString
|
||||||
|
* @throws \MissingQueryArgument
|
||||||
|
* @throws \MySQLException
|
||||||
|
* @throws \MySQLHasGoneAwayException
|
||||||
|
*/
|
||||||
|
public function GetAsHTML(WebPage $oPage, $iPageSize, $iDefaultPageSize, $iPageIndex, $aColumns, $bActionsMenu, $bToolkitMenu, $sSelectMode, $bViewLink, $aExtraParams)
|
||||||
|
{
|
||||||
|
return $this->GetHTMLTable($oPage, $aColumns, $sSelectMode, -1, $bViewLink, $aExtraParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param WebPage $oPage
|
||||||
|
* @param $aColumns
|
||||||
|
* @param $sSelectMode
|
||||||
|
* @param $iPageSize
|
||||||
|
* @param $bViewLink
|
||||||
|
* @param $aExtraParams
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
* @throws \CoreException
|
||||||
|
* @throws \CoreUnexpectedValue
|
||||||
|
* @throws \DictExceptionMissingString
|
||||||
|
* @throws \MissingQueryArgument
|
||||||
|
* @throws \MySQLException
|
||||||
|
* @throws \MySQLHasGoneAwayException
|
||||||
|
*/
|
||||||
|
public function GetHTMLTable(WebPage $oPage, $aColumns, $sSelectMode, $iPageSize, $bViewLink, $aExtraParams)
|
||||||
|
{
|
||||||
|
$iNbPages = ($iPageSize < 1) ? 1 : ceil($this->iNbObjects / $iPageSize);
|
||||||
|
if ($iPageSize < 1)
|
||||||
|
{
|
||||||
|
$iPageSize = -1; // convention: no pagination
|
||||||
|
}
|
||||||
|
$aAttribs = $this->GetHTMLTableConfig($aColumns, $sSelectMode, $bViewLink);
|
||||||
|
|
||||||
|
$aValues = $this->GetHTMLTableValues($aColumns, $sSelectMode, $iPageSize, $bViewLink, $aExtraParams);
|
||||||
|
|
||||||
|
$sHtml = $oPage->GetTable($aAttribs, $aValues);
|
||||||
|
|
||||||
|
return $sHtml;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -263,8 +263,6 @@ class DisplayBlock
|
|||||||
/** param for export.php */
|
/** param for export.php */
|
||||||
'refresh_action',
|
'refresh_action',
|
||||||
/**to add refresh button in datatable*/
|
/**to add refresh button in datatable*/
|
||||||
'object_count',
|
|
||||||
/** int number of objects in list */
|
|
||||||
], DataTableUIBlockFactory::GetAllowedParams()),
|
], DataTableUIBlockFactory::GetAllowedParams()),
|
||||||
static::ENUM_STYLE_LIST_SEARCH => array_merge([
|
static::ENUM_STYLE_LIST_SEARCH => array_merge([
|
||||||
'update_history',
|
'update_history',
|
||||||
@@ -1865,11 +1863,7 @@ class MenuBlock extends DisplayBlock
|
|||||||
$aSelectedClasses = $this->GetFilter()->GetSelectedClasses();
|
$aSelectedClasses = $this->GetFilter()->GetSelectedClasses();
|
||||||
$bIsForLinkset = isset($aExtraParams['target_attr']);
|
$bIsForLinkset = isset($aExtraParams['target_attr']);
|
||||||
$oSet = new CMDBObjectSet($this->GetFilter());
|
$oSet = new CMDBObjectSet($this->GetFilter());
|
||||||
if(isset($aExtraParams['object_count'])){
|
$iSetCount = $oSet->Count();
|
||||||
$iSetCount = $aExtraParams['object_count'];
|
|
||||||
} else {
|
|
||||||
$iSetCount = $oSet->Count();
|
|
||||||
}
|
|
||||||
/** @var string $sRefreshAction JS snippet to run when clicking on the refresh button of the menu */
|
/** @var string $sRefreshAction JS snippet to run when clicking on the refresh button of the menu */
|
||||||
$sRefreshAction = $aExtraParams['refresh_action'] ?? '';
|
$sRefreshAction = $aExtraParams['refresh_action'] ?? '';
|
||||||
$bIsCreationInModal = isset($aExtraParams['creation_in_modal']) && $aExtraParams['creation_in_modal'] === true;
|
$bIsCreationInModal = isset($aExtraParams['creation_in_modal']) && $aExtraParams['creation_in_modal'] === true;
|
||||||
@@ -2224,11 +2218,6 @@ class MenuBlock extends DisplayBlock
|
|||||||
$aFavoriteRegularActions[$key] = $aRegularActions[$key];
|
$aFavoriteRegularActions[$key] = $aRegularActions[$key];
|
||||||
unset($aRegularActions[$key]);
|
unset($aRegularActions[$key]);
|
||||||
}
|
}
|
||||||
// Toolkit actions
|
|
||||||
if (isset($aToolkitActions[$key])) {
|
|
||||||
$aFavoriteRegularActions[$key] = $aToolkitActions[$key];
|
|
||||||
unset($aToolkitActions[$key]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transitions
|
// Transitions
|
||||||
if (isset($aTransitionActions[$key])) {
|
if (isset($aTransitionActions[$key])) {
|
||||||
@@ -2318,27 +2307,7 @@ class MenuBlock extends DisplayBlock
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'UI:Menu:EMail':
|
case 'UI:Menu:EMail':
|
||||||
$sIconClass = 'far fa-envelope fa-lg';
|
$sIconClass = 'fas fa-share-alt';
|
||||||
$sLabel = '';
|
|
||||||
break;
|
|
||||||
case 'UI:Menu:OpenOQL':
|
|
||||||
$sIconClass = 'fas fa-play fa-sm';
|
|
||||||
$sLabel = '';
|
|
||||||
break;
|
|
||||||
case 'UI:Menu:ExportXLSX':
|
|
||||||
$sIconClass = 'far fa-file-excel fa-lg';
|
|
||||||
$sLabel = '';
|
|
||||||
break;
|
|
||||||
case 'UI:Menu:CSVExport':
|
|
||||||
$sIconClass = 'fas fa-file-csv fa-lg';
|
|
||||||
$sLabel = '';
|
|
||||||
break;
|
|
||||||
case 'UI:Menu:PrintableVersion':
|
|
||||||
$sIconClass = 'fas fa-print';
|
|
||||||
$sLabel = '';
|
|
||||||
break;
|
|
||||||
case 'UI:Menu:ExportPDF':
|
|
||||||
$sIconClass = 'fas fa-file-pdf fa-lg';
|
|
||||||
$sLabel = '';
|
$sLabel = '';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -2350,12 +2319,7 @@ class MenuBlock extends DisplayBlock
|
|||||||
}
|
}
|
||||||
|
|
||||||
$sTarget = isset($aAction['target']) ? $aAction['target'] : '';
|
$sTarget = isset($aAction['target']) ? $aAction['target'] : '';
|
||||||
if (!empty($aAction['onclick'])) {
|
$oActionButton = ButtonUIBlockFactory::MakeLinkNeutral($sUrl, $sLabel, $sIconClass, $sTarget, utils::Sanitize($sActionId, '', utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER));
|
||||||
$oActionButton = ButtonUIBlockFactory::MakeIconAction($sIconClass, $aAction['label'], $aAction['label'], $sLabel,false); //utils::Sanitize($sActionId.md5($aAction['onclick']), '', utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER))
|
|
||||||
$oActionButton->SetOnClickJsCode($aAction['onclick']);
|
|
||||||
} else {
|
|
||||||
$oActionButton = ButtonUIBlockFactory::MakeLinkNeutral($sUrl, $sLabel, $sIconClass, $sTarget, utils::Sanitize($sActionId, '', utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER));
|
|
||||||
}
|
|
||||||
// ResourceId should not be sanitized
|
// ResourceId should not be sanitized
|
||||||
$oActionButton->AddDataAttribute('resource-id', $sActionId);
|
$oActionButton->AddDataAttribute('resource-id', $sActionId);
|
||||||
$oActionButton->AddCSSClasses(['ibo-action-button', 'ibo-regular-action-button']);
|
$oActionButton->AddCSSClasses(['ibo-action-button', 'ibo-regular-action-button']);
|
||||||
|
|||||||
8
application/errorpage.class.inc.php
Normal file
8
application/errorpage.class.inc.php
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/ErrorPage.php, now loadable using autoloader
|
||||||
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
* @copyright Copyright (C) 2010-2024 Combodo SAS
|
||||||
|
*/
|
||||||
|
|
||||||
|
DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/ErrorPage.php, now loadable using autoloader');
|
||||||
@@ -303,7 +303,7 @@ class ExcelExporter
|
|||||||
{
|
{
|
||||||
if ($this->sOutputFilePath == null)
|
if ($this->sOutputFilePath == null)
|
||||||
{
|
{
|
||||||
return utils::GetDataPath().'bulk_export/'.$this->sToken.'.xlsx';
|
return APPROOT.'data/bulk_export/'.$this->sToken.'.xlsx';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -313,14 +313,14 @@ class ExcelExporter
|
|||||||
|
|
||||||
public static function GetExcelFileFromToken($sToken)
|
public static function GetExcelFileFromToken($sToken)
|
||||||
{
|
{
|
||||||
return @file_get_contents(utils::GetDataPath().'bulk_export/'.$sToken.'.xlsx');
|
return @file_get_contents(APPROOT.'data/bulk_export/'.$sToken.'.xlsx');
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function CleanupFromToken($sToken)
|
public static function CleanupFromToken($sToken)
|
||||||
{
|
{
|
||||||
@unlink(utils::GetDataPath().'bulk_export/'.$sToken.'.status');
|
@unlink(APPROOT.'data/bulk_export/'.$sToken.'.status');
|
||||||
@unlink(utils::GetDataPath().'bulk_export/'.$sToken.'.data');
|
@unlink(APPROOT.'data/bulk_export/'.$sToken.'.data');
|
||||||
@unlink(utils::GetDataPath().'bulk_export/'.$sToken.'.xlsx');
|
@unlink(APPROOT.'data/bulk_export/'.$sToken.'.xlsx');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function Cleanup()
|
public function Cleanup()
|
||||||
@@ -334,7 +334,7 @@ class ExcelExporter
|
|||||||
*/
|
*/
|
||||||
public static function CleanupOldFiles()
|
public static function CleanupOldFiles()
|
||||||
{
|
{
|
||||||
$aFiles = glob(utils::GetDataPath().'bulk_export/*.*');
|
$aFiles = glob(APPROOT.'data/bulk_export/*.*');
|
||||||
$iDelay = MetaModel::GetConfig()->Get('xlsx_exporter_cleanup_old_files_delay');
|
$iDelay = MetaModel::GetConfig()->Get('xlsx_exporter_cleanup_old_files_delay');
|
||||||
|
|
||||||
if($iDelay > 0)
|
if($iDelay > 0)
|
||||||
@@ -416,14 +416,14 @@ class ExcelExporter
|
|||||||
|
|
||||||
protected function CheckDataDir()
|
protected function CheckDataDir()
|
||||||
{
|
{
|
||||||
if(!is_dir(utils::GetDataPath()."bulk_export"))
|
if(!is_dir(APPROOT."data/bulk_export"))
|
||||||
{
|
{
|
||||||
@mkdir(utils::GetDataPath()."bulk_export", 0777, true /* recursive */);
|
@mkdir(APPROOT."data/bulk_export", 0777, true /* recursive */);
|
||||||
clearstatcache();
|
clearstatcache();
|
||||||
}
|
}
|
||||||
if (!is_writable(utils::GetDataPath()."bulk_export"))
|
if (!is_writable(APPROOT."data/bulk_export"))
|
||||||
{
|
{
|
||||||
throw new Exception('Data directory "'.utils::GetDataPath().'bulk_export" could not be written.');
|
throw new Exception('Data directory "'.APPROOT.'data/bulk_export" could not be written.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -433,12 +433,12 @@ class ExcelExporter
|
|||||||
{
|
{
|
||||||
$sToken = $this->sToken;
|
$sToken = $this->sToken;
|
||||||
}
|
}
|
||||||
return utils::GetDataPath()."bulk_export/$sToken.status";
|
return APPROOT."data/bulk_export/$sToken.status";
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function GetDataFile()
|
protected function GetDataFile()
|
||||||
{
|
{
|
||||||
return utils::GetDataPath().'bulk_export/'.$this->sToken.'.data';
|
return APPROOT.'data/bulk_export/'.$this->sToken.'.data';
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function GetNewToken()
|
protected function GetNewToken()
|
||||||
|
|||||||
@@ -363,7 +363,7 @@ $('#$sDialogId').dialog({
|
|||||||
buttons: [
|
buttons: [
|
||||||
{ text: "$sOkButtonLabel", click: function() {
|
{ text: "$sOkButtonLabel", click: function() {
|
||||||
var oForm = $(this).closest('.ui-dialog').find('form');
|
var oForm = $(this).closest('.ui-dialog').find('form');
|
||||||
oForm.trigger('submit');
|
oForm.submit();
|
||||||
if (AnimateDlgButtons)
|
if (AnimateDlgButtons)
|
||||||
{
|
{
|
||||||
sFormId = oForm.attr('id');
|
sFormId = oForm.attr('id');
|
||||||
@@ -1501,11 +1501,6 @@ class DesignerIconSelectionField extends DesignerFormField
|
|||||||
$this->aAllowedValues = $aAllowedValues;
|
$this->aAllowedValues = $aAllowedValues;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function AddAllowedValue($aValue)
|
|
||||||
{
|
|
||||||
// Add a null value to the list of allowed values
|
|
||||||
$this->aAllowedValues = array_merge([$aValue], $this->aAllowedValues);
|
|
||||||
}
|
|
||||||
public function EnableUpload($sIconUploadUrl)
|
public function EnableUpload($sIconUploadUrl)
|
||||||
{
|
{
|
||||||
$this->sUploadUrl = $sIconUploadUrl;
|
$this->sUploadUrl = $sIconUploadUrl;
|
||||||
|
|||||||
@@ -36,30 +36,29 @@ class InputOutputTask extends cmdbAbstractObject
|
|||||||
{
|
{
|
||||||
$aParams = array
|
$aParams = array
|
||||||
(
|
(
|
||||||
"category" => "application",
|
"category" => "application",
|
||||||
"key_type" => "autoincrement",
|
"key_type" => "autoincrement",
|
||||||
"name_attcode" => "name",
|
"name_attcode" => "name",
|
||||||
"state_attcode" => "",
|
"state_attcode" => "",
|
||||||
"reconc_keys" => array(),
|
"reconc_keys" => array(),
|
||||||
"db_table" => "priv_iotask",
|
"db_table" => "priv_iotask",
|
||||||
"db_key_field" => "id",
|
"db_key_field" => "id",
|
||||||
"db_finalclass_field" => "",
|
"db_finalclass_field" => "",
|
||||||
);
|
);
|
||||||
MetaModel::Init_Params($aParams);
|
MetaModel::Init_Params($aParams);
|
||||||
MetaModel::Init_AddAttribute(new AttributeString("name", array("allowed_values" => null, "sql" => "name", "default_value" => "", "is_null_allowed" => false, "depends_on" => array())));
|
MetaModel::Init_AddAttribute(new AttributeString("name", array("allowed_values"=>null, "sql"=>"name", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||||
MetaModel::Init_AddAttribute(new AttributeString("description", array("allowed_values" => null, "sql" => "description", "default_value" => "", "is_null_allowed" => true, "depends_on" => array())));
|
MetaModel::Init_AddAttribute(new AttributeString("description", array("allowed_values"=>null, "sql"=>"description", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
|
||||||
MetaModel::Init_AddAttribute(new AttributeEnum("category", array("allowed_values" => new ValueSetEnum('Input, Ouput'), "sql" => "category", "default_value" => "Input", "is_null_allowed" => false, "depends_on" => array())));
|
MetaModel::Init_AddAttribute(new AttributeEnum("category", array("allowed_values"=>new ValueSetEnum('Input, Ouput'), "sql"=>"category", "default_value"=>"Input", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||||
MetaModel::Init_AddAttribute(new AttributeEnum("source_type", array("allowed_values" => new ValueSetEnum('File, Database, Web Service'), "sql" => "source_type", "default_value" => "File", "is_null_allowed" => false, "depends_on" => array())));
|
MetaModel::Init_AddAttribute(new AttributeEnum("source_type", array("allowed_values"=>new ValueSetEnum('File, Database, Web Service'), "sql"=>"source_type", "default_value"=>"File", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||||
MetaModel::Init_AddAttribute(new AttributeEnum("source_subtype",
|
MetaModel::Init_AddAttribute(new AttributeEnum("source_subtype", array("allowed_values"=>new ValueSetEnum('Oracle, MySQL, Postgress, MSSQL, SOAP, HTTP-Get, HTTP-Post, XML/RPC, CSV, XML, Excel'), "sql"=>"source_subtype", "default_value"=>"CSV", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||||
array("allowed_values" => new ValueSetEnum('Oracle, MySQL, Postgress, MSSQL, SOAP, HTTP-Get, HTTP-Post, XML/RPC, CSV, XML, Excel'), "sql" => "source_subtype", "default_value" => "CSV", "is_null_allowed" => false, "depends_on" => array())));
|
MetaModel::Init_AddAttribute(new AttributeString("source_path", array("allowed_values"=>null, "sql"=>"source_path", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
|
||||||
MetaModel::Init_AddAttribute(new AttributeString("source_path", array("allowed_values" => null, "sql" => "source_path", "default_value" => "", "is_null_allowed" => false, "depends_on" => array())));
|
MetaModel::Init_AddAttribute(new AttributeClass("objects_class", array("class_category"=>"", "more_values"=>"", "sql"=>"objects_class", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
|
||||||
MetaModel::Init_AddAttribute(new AttributeClass("objects_class", array("class_category" => "", "more_values" => "", "sql" => "objects_class", "default_value" => null, "is_null_allowed" => true, "depends_on" => array(), "class_exclusion_list" => null)));
|
MetaModel::Init_AddAttribute(new AttributeEnum("test_mode", array("allowed_values"=>new ValueSetEnum('Yes,No'), "sql"=>"test_mode", "default_value"=>'No', "is_null_allowed"=>false, "depends_on"=>array())));
|
||||||
MetaModel::Init_AddAttribute(new AttributeEnum("test_mode", array("allowed_values" => new ValueSetEnum('Yes,No'), "sql" => "test_mode", "default_value" => 'No', "is_null_allowed" => false, "depends_on" => array())));
|
MetaModel::Init_AddAttribute(new AttributeEnum("verbose_mode", array("allowed_values"=>new ValueSetEnum('Yes,No'), "sql"=>"verbose_mode", "default_value" => 'No', "is_null_allowed"=>false, "depends_on"=>array())));
|
||||||
MetaModel::Init_AddAttribute(new AttributeEnum("verbose_mode", array("allowed_values" => new ValueSetEnum('Yes,No'), "sql" => "verbose_mode", "default_value" => 'No', "is_null_allowed" => false, "depends_on" => array())));
|
MetaModel::Init_AddAttribute(new AttributeEnum("options", array("allowed_values"=>new ValueSetEnum('Full, Update Only, Creation Only'), "sql"=>"options", "default_value"=> 'Full', "is_null_allowed"=>true, "depends_on"=>array())));
|
||||||
MetaModel::Init_AddAttribute(new AttributeEnum("options", array("allowed_values" => new ValueSetEnum('Full, Update Only, Creation Only'), "sql" => "options", "default_value" => 'Full', "is_null_allowed" => true, "depends_on" => array())));
|
|
||||||
|
|
||||||
// Display lists
|
// Display lists
|
||||||
MetaModel::Init_SetZListItems('details', array('name', 'description', 'category', 'objects_class', 'source_type', 'source_subtype', 'source_path', 'options', 'test_mode', 'verbose_mode')); // Attributes to be displayed for the complete details
|
MetaModel::Init_SetZListItems('details', array('name', 'description', 'category', 'objects_class', 'source_type', 'source_subtype', 'source_path' , 'options', 'test_mode', 'verbose_mode')); // Attributes to be displayed for the complete details
|
||||||
MetaModel::Init_SetZListItems('list', array('description', 'category', 'objects_class', 'source_type', 'source_subtype', 'options')); // Attributes to be displayed for a list
|
MetaModel::Init_SetZListItems('list', array('description', 'category', 'objects_class', 'source_type', 'source_subtype', 'options')); // Attributes to be displayed for a list
|
||||||
// Search criteria
|
// Search criteria
|
||||||
MetaModel::Init_SetZListItems('standard_search', array('name', 'category', 'objects_class', 'source_type', 'source_subtype')); // Criteria of the std search form
|
MetaModel::Init_SetZListItems('standard_search', array('name', 'category', 'objects_class', 'source_type', 'source_subtype')); // Criteria of the std search form
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user