Migrate an Extension to 3.1
XML datamodel
Breaking changes
Added <constants /> node in itop-structure
Since iTop 3.1.0, the <constants />
node is
now defined in the itop-structure module. If you added / redefined
constants, move the _delta
flag from the
<constants />
node to the <constant
/>
child nodes.
Bad example, defining a whole collection node instead of its child nodes.
- /itop_design
-
<constants _delta="define"> <constant id="foo">FOO</constant> <constant id="bar">BAR</constant> </constants>
Good example, _delta
flag is on the child
nodes.
- /itop_design
-
<constants> <constant id="foo" _delta="define">FOO</constant> <constant id="bar" _delta="define">BAR</constant> </constants>
Covered by migration audit N°137
Added "chat" / "in_person" values for "origin" in tickets
Attribute origin
of classes
UserRequest
and Incident
now have both
chat
and in_person
values in the standard
datamodel. If you added them, you should ensure that you use the
define_if_not_exists
flag to avoid conflicts during
compilation while keeping your module compatible with older
versions of iTop.
Bad example, defining the values with define
flag.
- /itop_design/classes
-
<class id="UserRequest"> <fields> <field id="origin"> <values> <value id="chat" _delta="define"> [...] </value> <value id="in_person" _delta="define"> [...] </value> </values> </field> </fields> </class>
Good example, use of define_if_not_exists
to ensure
backward compatibility
- /itop_design/classes
-
<class id="UserRequest"> <fields> <field id="origin"> <values> <value id="chat" _delta="define_if_not_exists"> [...] </value> <value id="in_person" _delta="define_if_not_exists"> [...] </value> </values> </field> </fields> </class>
Covered by migration audit N°134
Added complementary name on some classes out of the box
While the complementary name feature was introduced in iTop 3.0, it wasn't used out of the box in the standard datamodel. iTop 3.1.0 now uses it on all relevant classes (70+ classes including Person, Ticket, FunctionalCI, …) to enable it on both external key selection widgets and the new summary cards feature.
If you already defined a complementary name in your module, adapt your XML to avoid conflicts.
Covered by migration audit N°156
Added dependencies on various attributes out of the box
Dependencies have been added on the following attributes. If you already added some, adjust your XML to avoid conflcts.
-
Problem→priority
-
lnkContactToContract→contact_id
-
lnkContractToDocument→document_id
-
lnkCustomerContractToService→document_id
-
lnkCustomerContractToService→service_id
Other nodes added to the standard datamodel
The following nodes have been added to the standard datamodel, if you already added some of these, adjust your XML to avoid conflicts.
-
/itop_design/classes/class[@id='Contract']/presentation/default_search/items/item[@id=“status”]
-
/itop_design/classes/class[@id='FiberChannelInterface']/presentation/details/items/item[@id='speed']
-
/itop_design/classes/class[@id='lnkContactToContract']/fields/field[@id='provider_id' or @id='customer_id']
-
/itop_design/classes/class[@id='lnkContactToContract']/fields/field[@id='contact_id']/filter
-
/itop_design/classes/class[@id='lnkContractToDocument']/fields/field[@id='provider_id' or @id='customer_id']
-
/itop_design/classes/class[@id='lnkContractToDocument']/fields/field[@id='document_id']/filter
-
/itop_design/classes/class[@id='lnkCustomerContractToService']/fields/field[@id='service_id']/filter
-
/itop_design/classes/class[@id='lnkCustomerContractToService']/fields/field[@id='provider_id' or @id='customer_id']
-
/itop_design/classes/class[@id='lnkProviderContractToService']/fields/field[@id='service_id']/filter
-
/itop_design/classes/class[@id='lnkProviderContractToService']/fields/field[@id='provider_id' or @id='customer_id']
-
/itop_design/classes/class[@id='LogicalVolume']/presentation/details/items/item[@id='description' or @id='org_id']
-
/itop_design/classes/class[@id='LogicalVolume']/presentation/search/items/item[@id='location_id']
-
/itop_design/classes/class[@id='LogicalVolume']/presentation/list/items/item[@id='location_id' or @id = 'org_id']
-
/itop_design/classes/class[@id='NASFileSystem']/presentation/details/items/item[@id='description' or @id='org_id']
-
/itop_design/classes/class[@id='PhysicalInterface']/presentation/details/items/item[@id='speed' or @id='vlans_list']
-
/itop_design/classes/class[@id='ProviderContract']/fields/field[@id=“services_list”]
-
/itop_design/classes/class[@id='SLA']/presentation/default_search
-
/itop_design/classes/class[@id='SLT']/fields/field[@id='slas_list']
-
/itop_design/classes/class[@id='SLT']/presentation/default_search
Other nodes removed from the standard datamodel
The following nodes have been removed from the standard datamodel, if you have any XML alteration on these nodes, adjust your XML to avoid crashes during compilation.
-
/itop_design/classes/class[@id=“SLA”]/methods/method[@id=“DoCheckToWrite”]
Covered by migration audit N°149
Removed file
No XML file removed.
Removed dictionary entries
Entry code | Replaced by | Covered by migration audit |
---|---|---|
Menu:Notification:Title | None | N°166 |
Deprecations
Other nodes deprecated in the standard datamodel
The following nodes have been deprecated in the standard datamodel and will be removed in a future version. If you have any XML alteration on these nodes, adjust your XML to avoid crashes during compilation in the future.
-
/itop_design/branding/themes/theme/*[name()='imports' or name()='stylesheets']/*[contains(., 'css-variables.scss')]
-
/itop_design/branding/themes/theme/*[name()='imports' or name()='stylesheets']/*[contains(., 'light-grey.scss')]
Covered by migration audit N°129
PHP APIs
Breaking changes
Symfony lib. updated to v5.4
Symfony library has been upgraded from v3.4 (previous LTS) to v5.4 (current LTS); this requires some changes in any module using the Symfony APIs (end-users portal, Twig base); here is what you need to check / migrate.
What changed | Why was it removed | What to search for | What to do if found | Covered by migration audit |
---|---|---|---|---|
Portal: Access to user's allowed portals | Global app variables are not a good pratice |
app['combodo.current_user.allowed_portals'] |
Replace with allowed_portals |
N°147 |
Portal: Access to SF services container within a controller | Direct access to the container is deprecated | $this→GetContainer( or
$this→SetContainer( |
Use service injection instead (see portal controllers for examples) | N°130 |
Portal: Access to SF services within a controller | Direct access to the services is deprecated | $this→get('router or any
$this→get(<SERVICE_CODE> |
Use service injection instead (see portal controllers for examples) | N°122 |
ItopExtensionsExtraRoutes::AddControllersClasses()
API.if (version_compare(ITOP_DESIGN_LATEST_VERSION, 3.1, '>=')) { /** @noinspection PhpUnhandledExceptionInspection */ ItopExtensionsExtraRoutes::AddControllersClasses( array( 'Combodo\iTop\Portal\Controller\CommunicationBrickController' ) ); }
Usage of \iApplicationObjectExtension::OnDBUpdate()
This API
is no longer called when no attribute of the object has been
modified. If you were using this
\iApplicationObjectExtension::OnDBUpdate()
API to
either:
-
Process extra inputs of a custom tab in the object details
-
Do some side processing when an object form is submitted
You should rather use the
\iApplicationUIExtension::OnFormSubmit()
API which is deigned for
this, as the previous behavior unsupported.
Usage of "zlist" parameter in \DisplayBlock
When using a \DisplayBlock
, the zlist
extra parameter no longer accepts false
as a value. It
must be a valid zlist or the default one 'list
'.
- iTop 3.0 and older, zlist set to false
-
$aExtraParams = [ 'foo' => 'bar', 'zlist' => false, ]; $oBlock = new DisplayBlock($sOQL, 'list', false); $oBlock->Display($oPage, 'some objects list', $aExtraParam);
- iTop 3.1 and newer, zlist set to a valid zlist
-
// If zlist can be specified $aExtraParams = [ 'foo' => 'bar', 'zlist' => 'list', ]; $oBlock = new DisplayBlock($sOQL, 'list', false); $oBlock->Display($oPage, 'some objects list', $aExtraParam);
- iTop 3.1 while keep compatibility with iTop 3.0 and older
-
// If zlist cannot be specified and we need to keep BC with iTop 2.7 and older $aExtraParams = [ 'foo' => 'bar', 'zlist' => version_compare(ITOP_DESIGN_LATEST_VERSION, 3.1, '<') ? false : 'list', ]; $oBlock = new DisplayBlock($sOQL, 'list', false); $oBlock->Display($oPage, 'some objects list', $aExtraParam);
Covered by migration audit N°172
Usage of \DBObjectSet::Seek()
In order to be fully compatible with PHP 8.1+, the
\DBObjectSet::Seek()
method doesn't return an object
anymore. If you retrieved an object directly from it you must now
use \DBObjectSet::Fetch()
after to retrieve it.
- Bad usage, retrieve object directly from method
-
$oObj = $oSet->Seek(0);
- Good usage, retrieve object from Fetch() method after seeking to desired position
-
$oSet->Seek(0); $oObj = $oSet->Fetch();
Covered by migration audit N°120
Usage of \DBObject key to determine if an object is new
In some cases, \DBObject::GetKey()
and
\DBObject::m_iKey
returned null
. This is
no longer the case, so if you used it to determine whether an
object is new or not it will no longer work. Use
\DBObject::IsNew()
instead.
- Bad usages
-
empty($this->GetKey()) $this->GetKey() == null $this->GetKey() === null empty($this->m_iKey) $this->m_iKey == null $this->m_iKey === null
- Good usage
-
empty($this->IsNew())
Covered by migration audit N°149
Case change in /sources folder
The directories under /sources
were named with case
inconsistencies, this was fixed in 3.1.0. The corresponding files
should be loaded using the autoloader, but if you called one of
them directly you should update your path.
X-Content-Type-Options HTTP header and CORB protection
Since iTop 2.7.10 / 3.0.4 / 3.1.2 / 3.2.0, the X-Content-Type-Options HTTP header is sent
with the nosniff
value. This could trigger CORB
protection for certain resources, preventing them from loading (see
https://chromium.googlesource.com/chromium/src/+/master/services/network/cross_origin_read_blocking_explainer.md#determining-whether-a-response-is-corb_protected).
To mitigate the issue, sending this HTTP header is disabled in
AjaxPage
, JsonPage
and
XMLPage
.
WebPage
implementation !application/javascript
MIME type to send your JSONP
content, as application/jsonp
will trigger CORB
protection.Note a
JsonPPage
was introduced in iTop 3.1.0Removed APIs
As announced in the previous migration notes, the following APIs have been removed. Refer to the previous migration notes to know what replaced them.
Domain | Type | Name | Covered by migration audit |
---|---|---|---|
History | PHP class | HistoryBlock | None yet |
History | PHP method | cmdbAbstractObject::DisplayBareHistory() | None yet |
History | PHP endpoint | ajax.render.php operation “history” | None yet |
History | PHP endpoint | ajax.render.php operation “history_from_filter” | None yet |
OQL | PHP file | core/legacy/querybuilderexpressionslegacy.class.inc.php | N°118 |
OQL | PHP file | core/legacy/querybuildercontextlegacy.class.inc.php | N°118 |
OQL | PHP file | core/legacy/querybuildersearchlegacy.class.php | N°118 |
Deprecations
What changed | Why was it deprecated | What to search for | What to do if found | Covered by migration audit |
---|---|---|---|---|
\Combodo\iTop\Form\Validator\Validator class | N°6414 - Field and validator refactoring | new Validator( |
Replace with new
CustomRegexpValidator( |
None yet |
SelectObjectField::VerifyCurrentValue | N°6414 - Field and validator refactoring | →VerifyCurrentValue( |
Replace with
→ResetCurrentValueIfNotAmongAllowedValues( |
None yet |
\CMDBObject::DBCloneTracked | N°5232 - Deprecate \CMDBObject::DBCloneTracked | →DBCloneTracked($oChange,
$iNewKey |
Replace with →DBClone($iNewKey |
N°125 |
Refactored TWIG extensions classes | N°4034 - Deprecate duplicated TWIG extensions class | Combodo\iTop\TwigExtension application/twigextension.class.inc.php TwigExtension::RegisterTwigExtensions( |
Combodo\iTop\Application\TwigBase\Twig\Extension sources/Application/TwigBase/Twig/Extension.php Extension::RegisterTwigExtensions( |
N°116 |
\DataTableUIBlockFactory::MakeForRenderingObject() | N°6261 - Deprecate \DataTableUIBlockFactory::MakeForRenderingObject() method |
DataTableUIBlockFactory::MakeForRenderingObject() |
Replace with
DataTableUIBlockFactory::MakeForRendering() |
N°157 |
\WizardHelper::ParseJsonSet() | N°2363 - Deprecate Old linkedset update pattern |
WizardHelper::ParseJsonSet($oNewLink) |
No replacement yet | N°114 |
\CMDBObject::DBCloneTracked_Internal \cmdbAbstractObject::DBCloneTracked_Internal |
N°6966 - Deprecate cmdbAbstractObject::DBCloneTracked_Internal | Methods names for calls and overrides | Replace with DBClone | N°182 |
\CMDBObject::DBDeleteTracked_Internal \cmdbAbstractObject::DBDeleteTracked_Internal |
N°6967 - Deprecated \cmdbAbstractObject::DBDeleteTracked_Internal | Methods names for calls and overrides | Replace with DBDelete | N°183 |
Excel export operations
Old Excel export operations (xlsx_xxx
) are used in
the application for several versions now. They are now deprecated
and will be removed in the next version. Instead you can adapt you
code to use the standard export_xxx
operations.
Complete list of deprecated operations:
-
xlsx_export_dialog
-
xlsx_start
-
xlsx_run
-
xlsx_download
-
xlsx_abort
Covered by migration audit N°83
SimpleCrypt default engine change
Developers using AttributeEncryptedString in their customizations are NOT concerned.
Currently the default engine for the \SimpleCrypt
helper class is Mcrypt
. As this library has been
deprecated since PHP 7.1 and was removed since PHP 7.2, we will
changed the default engine to Sodium
to guarantee
maximum security.
To keep your code and existing encrypted strings working, you'll
need to adapt your code to specify Mcrypt
as the
engine.
What changed | Why was it removed | What to search for | What to do if found |
---|---|---|---|
Default encryption engine | Mcrypt removed since PHP 7.2 | new SimpleCrypt() |
Replace with new
SimpleCrypt('Mcrypt') |
Other
Field and validator refactoring
Both the user portal and the request template extension are using generic Form / Field / Validator objects. We refactored those objects so that validation is now only done using validators and no more with Field::Validate method overrides, though this latest method has become final.
JS APIs
Breaking changes
Removed APIs
As announced in the previous migration notes, the following APIs have been removed. Refer to the previous migration notes to know what replaced them.
Domain | Type | Name |
---|---|---|
History | JS method | DisplayHistory() |
Removed files
What changed | Why was it removed | What to search for | What to do if found | Covered by migration audit |
---|---|---|---|---|
Backoffice links handlers moved / renamed | Refactored into new handlers | js/linkswidget.js js/linksdirectwidget.js |
Replace with
js/links/links_widget.js Replace with js/links/links_direct_widget.js |
N°146 |
Deprecations
Deprecated APIs
What changed | Why was it deprecated | What to search for | What to do if found | Covered by migration audit |
---|---|---|---|---|
Portal leave handler | Added global leave handler for both the backoffice and portal | js/portal_leave_handler.js .portal_leave_handler( register_blocker.portal.itop |
Use js/leave_handler.js insteadUse .leave_handler( insteadUse register_blocker.itop instead |
N°160 |
jQuery HotKeys plugin
The jQuery Hotkeys plugin (js/jquery.hotkeys.js) was deprecated and will be removed a future version. You must replace your consumer code. As a reference, you can see c3816c9d which was the replacement of the only call in iTop core (run_query screen)
CSS APIs
Breaking changes
Removed APIs
No deprecated APIs.
Removed files
No removed files.
Deprecations
Deprecated APIs
No deprecated APIs.
Deprecated files
iTop 2.7 backoffice theme
The following files were part of iTop 2.7 backoffice theme and are no longer used since iTop 3.0, they are therefore deprecated and will be removed in a future version. If you were customizing the backoffice theme or using it your own stylesheet, refer to this page on how to migrate themes.
-
css/css-variables.scss
-
css/light-grey.scss
Covered by migration audit N°128