0

在 iTop 中,如何将呼叫者的 IP 地址保存在工单中(用户请求和事件)

我试图在我的扩展模块中修改datamodel.itop-tickets.xml 。我成功添加了一个名为“ip”的字段,但在<methods>部分中我无法使用$_SERVER['REMOTE_ADDR'].

<methods>
            <method id="DBInsertNoReload"  _delta="redefine">
                <static>false</static>
                <access>public</access>
                <type>Overload-DBObject</type>
                <code><![CDATA[
public function DBInsertNoReload()
{
      $oMutex = new iTopMutex('ticket_insert');
      $oMutex->Lock();
      $iNextId = MetaModel::GetNextKey(get_class($this));
      $sRef = $this->MakeTicketRef($iNextId);
      $this->Set('ref', $sRef);
      $iKey = parent::DBInsertNoReload();
      $oMutex->Unlock();
      return $iKey;

      $this->Set('ip', $_SERVER['REMOTE_ADDR'] );
}
    ]]></code>
            </method>               
        </methods>
4

2 回答 2

1

还有另一种选择,在 itop 自定义扩展中,您可以包含另一个数据模型。(您可以使用 XML 或 PHP 数据模型)。因此,您必须创建一个新的 php 文件并在其中编写您想要的类来扩展数据模型。您必须使用以下方式扩展它们:https ://www.combodo.com/documentation/api-ref-extensions/packages/Extensibility.html

如果您使用接口“iApplicationObjectExtension”,您可以使用 OnDBInsert 方法设置对象中的其他字段/

例如

Class YourClassName implements iApplicationObjectExtension {

    public function OnIsModified($oObject){}

    public function OnCheckToWrite($oObject){}

    public function OnCheckToDelete($oObject){}

    public function OnDBUpdate($oObject, $oChange = null){}

    public function OnDBDelete($oObject, $oChange = null){}

    public function OnDBInsert($oObject, $oChange = null) {
        if ($oObject instanceof UserRequest) {
            // Do what you want with $oObject

            $oObject->DBUpdate(); // Update object
        }
    }
}
于 2018-05-23T17:28:12.493 回答
0

经过多次尝试,我终于找到了解决方案:) 我们必须重新定义LifeCycleAction类型的方法,因此我刚刚在InciudentUserRequest类中重新定义了 ComputeImpactedItems方法。

为了清楚起见,我在这里展示其中一个:

<class id="Incident">
        <methods>
                <method id="ComputeImpactedItems"  _delta="redefine">
                        <static>false</static>
                        <access>public</access>
                        <type>LifecycleAction</type>
                        <code><![CDATA[ public function ComputeImpactedItems()
                            {
                                // This method is kept for backward compatibility
                                // in case a delta redefines it, but you may call
                                // UpdateImpactedItems directly
                                $this->UpdateImpactedItems();

                                // This line is added by this exstension for saving caller's ip
                                $this->Set('ip', $_SERVER['REMOTE_ADDR']);
                            }]]></code>
                </method>
        </methods>
    </class>
于 2017-08-16T05:33:56.397 回答