欧卡2中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

需要三步,才能开始

只需两步,慢速开始

欧卡2入门方向盘选莱仕达V9莱仕达折叠便携游戏方向盘支架欢迎地图Mod入驻
查看: 7341|回复: 1
收起左侧

[开源] itop

[复制链接]
知行 发表于 2016-5-24 01:05 | 显示全部楼层 |阅读模式
        public function UpdateObjectFromArray($aValues)
        {
                foreach($aValues as $sAttCode => $value)
                {
                        $oAttDef = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
                        if ($oAttDef->IsLinkSet() && $oAttDef->IsIndirect())
                        {
                                $aLinks = $value;
                                $sLinkedClass = $oAttDef->GetLinkedClass();
                                $sExtKeyToRemote = $oAttDef->GetExtKeyToRemote();
                                $sExtKeyToMe = $oAttDef->GetExtKeyToMe();
                                $oLinkedSet = DBObjectSet::FromScratch($sLinkedClass);
                                if (is_array($aLinks))
                                {
                                        foreach($aLinks as $id => $aData)
                                        {
                                                if (is_numeric($id))
                                                {
                                                        if ($id < 0)
                                                        {
                                                                // New link to be created, the opposite of the id (-$id) is the ID of the remote object
                                                                $oLink = MetaModel::NewObject($sLinkedClass);
                                                                $oLink->Set($sExtKeyToRemote, -$id);
                                                                $oLink->Set($sExtKeyToMe, $this->GetKey());
                                                        }
                                                        else
                                                        {
                                                                // Existing link, potentially to be updated...
                                                                $oLink = MetaModel::GetObject($sLinkedClass, $id);
                                                        }
                                                        // Now populate the attributes
                                                        foreach($aData as $sName => $value)
                                                        {
                                                                if (MetaModel::IsValidAttCode($sLinkedClass, $sName))
                                                                {
                                                                        $oLinkAttDef = MetaModel::GetAttributeDef($sLinkedClass, $sName);
                                                                        if ($oLinkAttDef->IsWritable())
                                                                        {
                                                                                $oLink->Set($sName, $value);
                                                                        }
                                                                }
                                                        }
                                                        $oLinkedSet->AddObject($oLink);
                                                }
                                        }
                                }
                                $this->Set($sAttCode, $oLinkedSet);
                        }
                        elseif ($oAttDef->GetEditClass() == 'Document')
                        {
                                // There should be an uploaded file with the named attr_<attCode>
                                $oDocument = $value['fcontents'];
                                if (!$oDocument->IsEmpty())
                                {
                                        // A new file has been uploaded
                                        $this->Set($sAttCode, $oDocument);
                                }
                        }
                        elseif ($oAttDef->GetEditClass() == 'One Way Password')
                        {
                                // Check if the password was typed/changed
                                $aPwdData = $value;
                                if (!is_null($aPwdData) && $aPwdData['changed'])
                                {
                                        // The password has been changed or set
                                        $this->Set($sAttCode, $aPwdData['value']);
                                }
                        }
                        elseif ($oAttDef->GetEditClass() == 'Duration')
                        {
                                $aDurationData = $value;
                                if (!is_array($aDurationData)) continue;

                                $iValue = (((24*$aDurationData['d'])+$aDurationData['h'])*60 +$aDurationData['m'])*60 + $aDurationData['s'];
                                $this->Set($sAttCode, $iValue);
                                $previousValue = $this->Get($sAttCode);
                                if ($previousValue !== $iValue)
                                {
                                        $this->Set($sAttCode, $iValue);
                                }
                        }
                        else if (($oAttDef->GetEditClass() == 'LinkedSet') && !$oAttDef->IsIndirect() &&
                                  (($oAttDef->GetEditMode() == LINKSET_EDITMODE_INPLACE) || ($oAttDef->GetEditMode() == LINKSET_EDITMODE_ADDREMOVE)))
                        {
                                $oLinkset = $this->Get($sAttCode);
                                $sLinkedClass = $oLinkset->GetClass();
                                $aObjSet = array();
                                $oLinkset->Rewind();
                                $bModified = false;
                                while($oLink = $oLinkset->Fetch())
                                {
                                        if (in_array($oLink->GetKey(), $value['to_be_deleted']))
                                        {
                                                // The link is to be deleted, don't copy it in the array
                                                $bModified = true;
                                        }
                                        else
                                        {
                                                if (!array_key_exists('to_be_removed', $value) || !in_array($oLink->GetKey(), $value['to_be_removed']))
                                                {
                                                        $aObjSet[] = $oLink;
                                                }
                                        }
                                }

                                if (array_key_exists('to_be_created', $value) && (count($value['to_be_created']) > 0))
                                {
                                        // Now handle the links to be created
                                        foreach($value['to_be_created'] as $aData)
                                        {
                                                $sSubClass = $aData['class'];
                                                if ( ($sLinkedClass == $sSubClass) || (is_subclass_of($sSubClass, $sLinkedClass)) )
                                                {
                                                        $aObjData = $aData['data'];
                                                        
                                                        $oLink = new $sSubClass;
                                                        $oLink->UpdateObjectFromArray($aObjData);
                                                        $aObjSet[] = $oLink;
                                                        $bModified = true;
                                                }
                                        }
                                }
                                if (array_key_exists('to_be_added', $value) && (count($value['to_be_added']) > 0))
                                {
                                        // Now handle the links to be added by making the remote object point to self
                                        foreach($value['to_be_added'] as $iObjKey)
                                        {
                                                $oLink = MetaModel::GetObject($sLinkedClass, $iObjKey, false);
                                                if ($oLink)
                                                {
                                                        $aObjSet[] = $oLink;
                                                        $bModified = true;
                                                }
                                        }
                                }
                                if (array_key_exists('to_be_removed', $value) && (count($value['to_be_removed']) > 0))
                                {
                                        // Now handle the links to be removed by making the remote object point to nothing
                                        // Keep them in the set (modified), DBWriteLinks will handle them
                                        foreach($value['to_be_removed'] as $iObjKey)
                                        {
                                                $oLink = MetaModel::GetObject($sLinkedClass, $iObjKey, false);
                                                if ($oLink)
                                                {
                                                        $sExtKeyToMe = $oAttDef->GetExtKeyToMe();
                                                        $oLink->Set($sExtKeyToMe, null);
                                                        $aObjSet[] = $oLink;
                                                        $bModified = true;
                                                }
                                        }
                                }
                                if ($bModified)
                                {
                                        $oNewSet = DBObjectSet::FromArray($oLinkset->GetClass(), $aObjSet);
                                        $this->Set($sAttCode, $oNewSet);
                                }                
                        }
                        else
                        {
                                if (!is_null($value))
                                {
                                        $aAttributes[$sAttCode] = trim($value);
                                        $previousValue = $this->Get($sAttCode);
                                        if ($previousValue !== $aAttributes[$sAttCode])
                                        {
                                                $this->Set($sAttCode, $aAttributes[$sAttCode]);
                                        }
                                }
                        }
                }
        }
oppo 发表于 2016-5-24 15:25 | 显示全部楼层
MetaModel::GetNameSpec(get_class($this));
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系我们|手机版|欧卡2中国 ( 湘ICP备11020288号-1 )

GMT+8, 2024-12-28 09:57 , Processed in 0.034854 second(s), 9 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表