oxerptype.php

Go to the documentation of this file.
00001 <?php
00002 
00006 class oxERPType
00007 {
00012     public static $ERROR_WRONG_SHOPID = "Wrong shop id, operation not allowed!";
00013 
00018     protected $_sTableName        = null;
00019 
00024     protected $_sFunctionSuffix   = null;
00025 
00030     protected $_aFieldList        = null;
00031 
00036     protected $_aKeyFieldList     = null;
00037 
00042     protected $_sShopObjectName   = null;
00043 
00049     protected $_blRestrictedByShopId = false;
00050 
00056     protected $_aFieldListVersions = null;
00057 
00063     public function getFunctionSuffix()
00064     {
00065         return $this->_sFunctionSuffix;
00066     }
00067 
00073     public function getShopObjectName()
00074     {
00075         return $this->_sShopObjectName;
00076     }
00077 
00083     public function getBaseTableName()
00084     {
00085         return $this->_sTableName;
00086     }
00087 
00093     public function __construct()
00094     {
00095         $this->_sFunctionSuffix = str_replace( "oxERPType_", "", get_class( $this));
00096         if (isset($this->_aFieldListVersions)) {
00097             $this->_aFieldList = $this->_aFieldListVersions[oxERPBase::getUsedDbFieldsVersion()];
00098         }
00099     }
00100 
00108     public function setFunctionSuffix( $sNew )
00109     {
00110         $this->_sFunctionSuffix = $sNew;
00111     }
00112 
00120     public function setFieldList($aFieldList)
00121     {
00122         $this->_aFieldList = $aFieldList;
00123     }
00124 
00132     public function getTableName( $iShopID = 1 )
00133     {
00134         return getViewName( $this->_sTableName, $iShopID );
00135     }
00136 
00142     private function _getMultilangualFields()
00143     {
00144         $aRet = array();
00145 
00146         $aData = oxDb::getInstance()->getTableDescription( $this->_sTableName);
00147 
00148         foreach ( $aData as $key => $oADODBField) {
00149             $iLang = substr( $oADODBField->name, strlen( $oADODBField->name) - 1, 1);
00150             if ( is_numeric( $iLang) &&  substr( $oADODBField->name, strlen( $oADODBField->name) - 2, 1) == '_') {
00151                 // multilangual field
00152                 $sMainFld = str_replace( '_'.$iLang, "", $oADODBField->name);
00153                 $aRet[$iLang][$sMainFld] = $oADODBField->name.' as '.$sMainFld;
00154             }
00155         }
00156 
00157         return $aRet;
00158     }
00159 
00169     protected function getSqlFieldName($sField, $iLanguage = 0, $iShopID = 1)
00170     {
00171         if ( $iLanguage ) {
00172             $aMultiLang = $this->_getMultilangualFields();
00173             // we need to load different fields
00174             if ( isset( $aMultiLang[$iLanguage][$sField] ) ) {
00175                 $sField = $aMultiLang[$iLanguage][$sField];
00176             }
00177         }
00178         return $sField;
00179     }
00180 
00190     public function getSQL( $sWhere, $iLanguage = 0, $iShopID = 1)
00191     {
00192         if ( !$this->_aFieldList ) {
00193             return;
00194         }
00195 
00196         $sSQL    = 'select ';
00197         $blSep = false;
00198 
00199         foreach ( $this->_aFieldList as $sField) {
00200             if ( $blSep ) {
00201                 $sSQL .= ',';
00202             }
00203 
00204             $sSQL .= $this->getSqlFieldName($sField, $iLanguage, $iShopID);
00205             $blSep = true;
00206         }
00207 
00208         if ( $this->_blRestrictedByShopId ) {
00209             $oStr = getStr();
00210             if ( $oStr->strstr( $sWhere, 'where')) {
00211                 $sWhere .= ' and ';
00212             } else {
00213                 $sWhere .= ' where ';
00214             }
00215 
00216             $sWhere .= 'oxshopid = \''.$iShopID.'\'';
00217         }
00218 
00219         $sSQL .= ' from '.$this->getTableName($iShopID).' '.$sWhere;
00220 
00221         return $sSQL;
00222     }
00223 
00232     public function getSortString($sFieldName = null, $sType = null)
00233     {
00234         $sRes = " order by ";
00235         if ($sFieldName) {
00236             $sRes .= $sFieldName;
00237         } else {
00238             $sRes .= "oxid";
00239         }
00240         if ($sType && ($sType == "ASC" || $sType == "DESC")) {
00241             $sRes .= " ". $sType;
00242         }
00243         return $sRes;
00244     }
00245 
00255     public function checkWriteAccess($sOxid)
00256     {
00257         $oObj = oxNew("oxbase");
00258         $oObj->init($this->_sTableName);
00259         if ( $oObj->load( $sOxid ) ) {
00260             $sFld = $this->_sTableName.'__oxshopid';
00261             if ( isset( $oObj->$sFld ) ) {
00262                 $sRes = $oObj->$sFld->value;
00263                 if ( $sRes && $sRes != oxConfig::getInstance()->getShopId() ) {
00264                     throw new Exception( oxERPBase::$ERROR_USER_NO_RIGHTS);
00265                 }
00266             }
00267         }
00268     }
00269 
00279     public function getObjectForDeletion( $sId)
00280     {
00281         $myConfig = oxConfig::getInstance();
00282 
00283         if ( !isset( $sId ) ) {
00284             throw new Exception( "Missing ID!");
00285         }
00286 
00287         $oObj = oxNew( $this->getShopObjectName(), "core");
00288 
00289         if ( !$oObj->exists( $sId ) ) {
00290             throw new Exception( $this->getShopObjectName(). " " . $sId. " does not exists!");
00291         }
00292 
00293         //We must load the object here, to check shopid and return it for further checks
00294         if ( !$oObj->load( $sId ) ) {
00295             //its possible that access is restricted allready
00296             throw new Exception( "No right to delete object {$sId} !");
00297         }
00298 
00299         if ( !$this->_isAllowedToEdit($oObj->getShopId() ) ) {
00300             throw new Exception( "No right to delete object {$sId} !");
00301         }
00302 
00303         return $oObj;
00304     }
00305 
00313     protected function _isAllowedToEdit($iShopId)
00314     {
00315         if ($oUsr = oxUser::getAdminUser()) {
00316             if ($oUsr->oxuser__oxrights->value == "malladmin") {
00317                 return true;
00318             } elseif ($oUsr->oxuser__oxrights->value == (int) $iShopId) {
00319                 return true;
00320             }
00321         }
00322         return false;
00323     }
00324 
00332     protected function _directSqlCheckForDeletion($sId)
00333     {
00334         $oDb =oxDb::getDb();
00335         $sSql = "select oxshopid from ".$this->_sTableName." where oxid = " .$oDb->quote( $sId );
00336         try {
00337             $iShopId = $oDb->getOne($sSql);
00338         } catch (Exception $e) {
00339             // no shopid was found
00340             return;
00341         }
00342         if ( !$this->_isAllowedToEdit( $iShopId ) ) {
00343             throw new Exception( "No right to delete object {$sId} !");
00344         }
00345     }
00346 
00354     public function checkForDeletion($sId)
00355     {
00356 
00357         if ( !isset( $sId ) ) {
00358             throw new Exception( "Missing ID!");
00359         }
00360         // malladmin can do it
00361         if ($oUsr = oxUser::getAdminUser()) {
00362             if ($oUsr->oxuser__oxrights->value == "malladmin") {
00363                 return;
00364             }
00365         }
00366         try {
00367             $this->getObjectForDeletion($sId);
00368         } catch (oxSystemComponentException $e) {
00369             if ($e->getMessage() == 'EXCEPTION_SYSTEMCOMPONENT_CLASSNOTFOUND') {
00370                 $this->_directSqlCheckForDeletion($sId);
00371             } else {
00372                 throw $e;
00373             }
00374         }
00375     }
00376 
00384     public function delete($sID)
00385     {
00386         $oDb = oxDb::getDb();
00387         $sSql = "delete from ".$this->_sTableName." where oxid = " . $oDb->quote( $sID );
00388 
00389         return $oDb->Execute($sSql);
00390     }
00391 
00400     public function deleteObject($oObj, $sID)
00401     {
00402 
00403         return $oObj->delete($sID);
00404     }
00405 
00413     public function addExportData( $aFields)
00414     {
00415         return $aFields;
00416     }
00417 
00428     public function addImportData($aFields)
00429     {
00430         return $aFields;
00431     }
00432 
00438     public function getRightFields()
00439     {
00440         $aRParams = array();
00441 
00442         foreach ( $this->_aFieldList as $sField ) {
00443             $aRParams[] = strtolower($this->_sTableName.'__'.$sField);
00444         }
00445         return $aRParams;
00446     }
00447 
00453     public function getFieldList()
00454     {
00455         return $this->_aFieldList;
00456     }
00457 
00463     public function getKeyFields()
00464     {
00465         return $this->_aKeyFieldList;
00466     }
00467 
00473     public function hasKeyFields()
00474     {
00475         if ( isset( $this->_aKeyFieldList ) && is_array( $this->_aKeyFieldList ) ) {
00476             return true;
00477         }
00478         return false;
00479     }
00480 
00490     protected function _preAssignObject($oShopObject, $aData, $blAllowCustomShopId)
00491     {
00492         if ( !isset( $aData['OXID'] ) ) {
00493             throw new Exception( "OXID missing, seems to be wrong Format!");
00494         }
00495         if ( !$oShopObject->exists( $aData['OXID'] ) ) {
00496             //$aData['OXSHOPID'] = $this->_iShopID;
00497             if ( !$blAllowCustomShopId ) {
00498                 if (isset($aData['OXSHOPID'])) {
00499                     $aData['OXSHOPID'] = oxConfig::getInstance()->getShopId();
00500                 }
00501             }
00502             if ( !array_key_exists('OXSHOPINCL', $aData ) ) {
00503                 $aData['OXSHOPINCL'] = oxUtils::getInstance()->getShopBit($aData['OXSHOPID']);
00504             }
00505             if ( !array_key_exists( 'OXSHOPEXCL', $aData ) ) {
00506                 $aData['OXSHOPEXCL'] = 0;
00507             }
00508         }
00509         if (isset($aData['OXACTIV'])) {
00510             $aData['OXACTIVE'] = $aData['OXACTIV'];
00511         }
00512         if (isset($aData['OXACTIVFROM'])) {
00513             $aData['OXACTIVEFROM'] = $aData['OXACTIVFROM'];
00514         }
00515         if (isset($aData['OXACTIVTO'])) {
00516             $aData['OXACTIVETO'] = $aData['OXACTIVTO'];
00517         }
00518         for ($i=1;$i<4;$i++) {
00519             if (isset($aData['OXACTIV_'.$i])) {
00520                 $aData['OXACTIVE_'.$i] = $aData['OXACTIV_'.$i];
00521             }
00522         }
00523         // null values support
00524         foreach ($aData as $key => $val) {
00525             if ( !strlen( (string) $val ) ) {
00526                 // oxbase whill quote it as string if db does not support null for this field
00527                 $aData[$key] = null;
00528             }
00529         }
00530         return $aData;
00531     }
00532 
00542     protected function _preSaveObject($oShopObject, $aData)
00543     {
00544         return true;
00545     }
00546 
00555     public function saveObject($aData, $blAllowCustomShopId)
00556     {
00557         $sObjectName = $this->getShopObjectName();
00558         if ( $sObjectName ) {
00559             $oShopObject = oxNew( $sObjectName, 'core');
00560             if ( $oShopObject instanceof oxI18n ) {
00561                 $oShopObject->setLanguage(0);
00562                 $oShopObject->setEnableMultilang(false);
00563             }
00564         } else {
00565             $oShopObject = oxNew( 'oxbase', 'core');
00566             $oShopObject->init($this->getBaseTableName());
00567         }
00568 
00569         $aData = $this->_preAssignObject($oShopObject, $aData, $blAllowCustomShopId);
00570 
00571 
00572         $oShopObject->load( $aData['OXID']);
00573 
00574         $oShopObject->assign( $aData );
00575 
00576         if ($blAllowCustomShopId) {
00577             $oShopObject->setIsDerived(false);
00578         }
00579 
00580         if ($this->_preSaveObject($oShopObject, $aData)) {
00581             // store
00582             if ( $oShopObject->save() ) {
00583                 return $this->_postSaveObject($oShopObject, $aData);
00584             }
00585         }
00586 
00587         return false;
00588     }
00589 
00598     protected function _postSaveObject($oShopObject, $aData)
00599     {
00600         // returning ID on success
00601         return $oShopObject->getId();
00602     }
00603 }
00604