Using iTop

Creating your iTop

iTop Customization

"How to" examples

User Interface

Automation & Ticket management

Portal Customization

:: Version 3.2.0 ::

Check To Write Event

Prerequisite: You must be familiar with the Syntax used in Tutorials and have already created an extension.

Impose data integrity rules
PHP, Constrain
min version:

In the below example we will use a method to detect an incoherence and prevent such object to be saved in database.

  • This method in the Console or Portal, reports errors after submission.
  • And prevents creation and update of incoherent objects done by DataSynchro, REST/JSON and CSV import.
This tutorial is an extract of the iTop 3.1.0 standard code


We will subscribe to an event and write a callback method XxxxxXxxx() on the object class:

  • This method is invoked just before writing to database.
  • The method add error message(s) if it encounters data incoherence.
  • Errors messages are recorded with $this->AddCheckIssue(),
  • Warnings messages are recorded with $this->AddCheckWarning(),,
  • When returning from this method, if there is at least one error the object is not written to database (creation or update)
  • Error and warning messages are
    • displayed to the user in interactive mode only: Console, Portal, CSV import
    • logged in itop/log/error.log depending on level of tracking for DataSynchro, REST/JSON, CLI


Let's imagine that we want to check when modifying the organization of a Person, that if that Person has associated User(s), those User(s) would not be broken by this Organization modification

Subscribing to an event

    <class id="Person" _delta="define">
        <event_listener id="CheckUsersUpdate">

Check the supported events for a given class by looking in iTop Datamodel to the Events tab.

Checking the conditions

public function CheckUsersOnUpdate(Combodo\iTop\Service\Events\EventData $oEventData)
    // This method can block the Person modification, by adding a Check Issue
    $aChanges = $this->ListChanges();
    // The organization's person was changed
    if (array_key_exists('org_id', $aChanges))
        // Current User may not be allowed to see User class, so we can't use $this->Get('user_list')
        $oSearch = new DBObjectSearch('User');
        $oSearch->AddCondition('contactid', $this->GetKey(), '=');
        $oUserSet = new DBObjectSet($oSearch);
        // The person has associated Users
        if ($oUserSet->Count() > 0) {
            $oAddon = UserRights::GetModuleInstance();
            // For each of the associated User
            while($oUser = $oUserSet->Fetch())
            {   // Get its Allowed organization and its Profiles
                $aOrgs = $oAddon->GetUserOrgs($oUser,'Organization'); // using $oUser->Get('allowed_org_list') does not cascade the organizations!
                $oSet = $oUser->Get('profile_list');
                $aProfiles = $oSet->GetColumnAsArray('profile'); // Get the Profiles names in an array
                // User has Allowed organizations and is not allowed on the new Organization and has 'Portal user' Profile and is enabled
                if ((count($aOrgs) > 0) && !in_array($this->Get('org_id'), $aOrgs) &&  in_array('Portal user',$aProfiles) && ($oUser->Get('status') === 'enabled'))
                {   // Let's block the Person modification,
                    // replace by $this->AddCheckWarning(...) if you don't want to block the modification
                    $this->AddCheckIssue(Dict::Format('Class:Person/Error:ChangingOrgDenied', $this->Get('org_id_friendlyname')));
3_2_0/customization/event_db_check_to_write.txt ยท Last modified: 2024/06/20 17:28 (external edit)
Back to top
Contact us