iAreaID = $iAreaID; if( !$this -> loadCache() ) return false; } function loadCache( $bCycle = true ) { $oCache = $GLOBALS['MySQL']->getDbCacheObject(); $this -> aCache = $oCache->getData($GLOBALS['MySQL']->genDbCacheKey('sys_profile_fields')); if (null === $this -> aCache || !is_array($this->aCache)) { $oPFM = new BxDolPFMCacher(); if (!$oPFM -> createCache()) return false; if ($bCycle) //to prevent cycling return $this -> loadCache (false); // try againg else return false; } $this -> aArea = $this -> aCache[ $this -> iAreaID ]; //load blocks $this -> aBlocks = $this -> aArea; //get mutual fields $this -> _getCoupleMutualFields(); return true; } function genJsonErrors( $aErrors, $bCouple ) { $aJsonErrors = array(); $aJsonErrors[0] = $aErrors[0]; if( $bCouple ) $aJsonErrors[1] = $aErrors[1]; $oParser = new Services_JSON(); return $oParser -> encode( $aJsonErrors ); } //sets to $Errors intuitive array function processPostValues( $bCouple, &$aValues, &$aErrors, $iPage = 0, $iProfileID = 0, $iBlockOnly = 0 ) { $iHumans = $bCouple ? 2 : 1; // number of members in profile (single/couple), made for double arrays if( $this -> iAreaID == 1 ) // join $this -> aBlocks = $this -> aArea[$iPage]; foreach( $this -> aBlocks as $iBlockID => $aBlock ) { if ($iBlockOnly > 0 and $iBlockOnly != $iBlockID) continue; $aItems = $aBlock['Items']; foreach ($aItems as $iItemID => $aItem) { $sItemName = $aItem['Name']; for( $iHuman = 0; $iHuman < $iHumans; $iHuman ++ ) { if( $iHuman == 1 and in_array( $sItemName, $this -> aCoupleMutual ) ) continue; $mValue = null; switch( $aItem['Type'] ) { case 'text': case 'area': case 'pass': case 'select_one': if( isset( $_POST[$sItemName] ) and isset( $_POST[$sItemName][$iHuman] ) ) $mValue = process_pass_data( $_POST[$sItemName][$iHuman] ); break; case 'html_area': if( isset( $_POST[$sItemName] ) and isset( $_POST[$sItemName][$iHuman] ) ) $mValue = clear_xss( process_pass_data($_POST[$sItemName][$iHuman]) ); break; case 'bool': if( isset( $_POST[$sItemName] ) and isset( $_POST[$sItemName][$iHuman] ) and $_POST[$sItemName][$iHuman] == 'yes' ) $mValue = true; else $mValue = false; break; case 'num': if( isset( $_POST[$sItemName] ) and isset( $_POST[$sItemName][$iHuman] ) and trim( $_POST[$sItemName][$iHuman] ) !== '' ) $mValue = (int)trim( $_POST[$sItemName][$iHuman] ); break; case 'date': if( isset( $_POST[$sItemName] ) and isset( $_POST[$sItemName][$iHuman] ) and trim( $_POST[$sItemName][$iHuman] ) !== '' ) { list( $iYear, $iMonth, $iDay ) = explode( '-', $_POST[$sItemName][$iHuman] ); // 1985-10-28 $iDay = intval($iDay); $iMonth = intval($iMonth); $iYear = intval($iYear); $mValue = sprintf("%04d-%02d-%02d", $iYear, $iMonth, $iDay); } break; case 'select_set': $mValue = array(); if( isset( $_POST[$sItemName] ) and isset( $_POST[$sItemName][$iHuman] ) and is_array( $_POST[$sItemName][$iHuman] ) ) { foreach ($_POST[$sItemName][$iHuman] as $sValue ) { $mValue[] = process_pass_data( $sValue ); } } break; case 'range': if( isset( $_POST[$sItemName] ) and isset( $_POST[$sItemName][$iHuman] ) and is_array( $_POST[$sItemName][$iHuman] ) ) { $aRange = $_POST[$sItemName][$iHuman]; $mValue = array( null, null ); $aRange[0] = isset( $aRange[0] ) ? trim( $aRange[0] ) : ''; $aRange[1] = isset( $aRange[1] ) ? trim( $aRange[1] ) : ''; if( $aRange[0] !== '' ) $mValue[0] = (int)$aRange[0]; if( $aRange[1] !== '' ) $mValue[1] = (int)$aRange[1]; } break; case 'system': switch( $aItem['Name'] ) { case 'Couple': case 'TermsOfUse': case 'Featured': //they are boolean if( isset( $_POST[$sItemName] ) and $_POST[$sItemName] == 'yes' ) $mValue = true; else $mValue = false; break; case 'Captcha': case 'Status': // they are select_one if( isset( $_POST[$sItemName] ) ) $mValue = process_pass_data( $_POST[$sItemName] ); break; case 'ProfilePhoto': if (isset($_FILES['ProfilePhoto'])) { if ($_FILES['ProfilePhoto']['error'] == UPLOAD_ERR_OK) { $sTmpName = tempnam($GLOBALS['dir']['tmp'], 'pphot'); if (move_uploaded_file($_FILES['ProfilePhoto']['tmp_name'], $sTmpName)) $mValue = basename($sTmpName); } } elseif (isset($_POST['ProfilePhoto']) && trim($_POST['ProfilePhoto'])) { $mValue = preg_replace('/[^a-zA-Z0-9\.]/', '', $_POST['ProfilePhoto']); } break; } break; } $rRes = $this -> checkPostValue( $iBlockID, $iItemID, $mValue, $iHuman, $iProfileID ); if( $rRes !== true ) $aErrors[$iHuman][$sItemName] = $rRes; //it is returned error text //if password on edit page if( $aItem['Type'] == 'pass' and ( $this -> iAreaID == 2 or $this -> iAreaID == 3 or $this -> iAreaID == 4 ) ) { if( empty($mValue) ) $mValue = $aValues[$iHuman][$sItemName]; else $mValue = encryptUserPwd($mValue, $aValues[$iHuman]['Salt']); } $aValues[$iHuman][$sItemName] = $mValue; } } } } function checkPostValue( $iBlockID, $iItemID, $mValue, $iHuman, $iProfileID ) { // get item $aItem = $this -> aBlocks[$iBlockID]['Items'][$iItemID]; if( !$aItem ) return 'Item not found'; $aChecks = array( 'text' => array( 'Mandatory', 'Min', 'Max', 'Unique', 'Check' ), 'area' => array( 'Mandatory', 'Min', 'Max', 'Unique', 'Check' ), 'html_area' => array( 'Mandatory', 'Min', 'Max', 'Unique', 'Check' ), 'pass' => array( 'Mandatory', 'Min', 'Max', 'Check', 'PassConfirm' ), 'date' => array( 'Mandatory', 'Min', 'Max', 'Check' ), 'select_one' => array( 'Min', 'Max', 'Mandatory', 'Values', 'Check' ), 'select_set' => array( 'Min', 'Max', 'Mandatory', 'Values', 'Check' ), 'num' => array( 'Mandatory', 'Min', 'Max', 'Unique', 'Check' ), 'range' => array( 'Mandatory', 'RangeCorrect', 'Min', 'Max', 'Check' ), 'system' => array( 'System' ), 'bool' => array( 'Mandatory' ) ); $aMyChecks = $aChecks[ $aItem['Type'] ]; // if ($aItem['Type'] == 'date') return $mValue; foreach ($aMyChecks as $sCheck ) { $sFunc = 'checkPostValueFor' . $sCheck; $mRes = $this -> $sFunc( $aItem, $mValue, $iHuman, $iProfileID ); if( $mRes !== true ) { if( is_bool( $mRes ) ) // it is false... return _t( $aItem[ $sCheck . 'Msg' ], $aItem[$sCheck] ); else return $mRes; // returned as text } } return true; } function checkPostValueForPassConfirm( $aItem, $mValue, $iHuman ) { $sConfPass = process_pass_data( $_POST[ "{$aItem['Name']}_confirm" ][$iHuman] ); if( $sConfPass != $mValue ) return _t( '_Password confirmation failed' ); else return true; } function checkPostValueForRangeCorrect( $aItem, $mValue ) { if( is_null($mValue[0]) or is_null($mValue[1]) ) return true; // if not set, pass this check if( $mValue[0] > $mValue[1] ) return _t( '_First value must be bigger' ); return true; } function checkPostValueForMin( $aItem, $mValue ) { $iMin = $aItem['Min']; if( is_null($iMin) ) return true; switch( $aItem['Type'] ) { case 'text': case 'area': if( mb_strlen( $mValue ) < $iMin ) return false; break; case 'html_area' : if( mb_strlen( strip_tags($mValue) ) < $iMin ) return false; break; case 'pass': if( mb_strlen( $mValue ) > 0 and mb_strlen( $mValue ) < $iMin ) return false; break; case 'num': if( $mValue < $iMin ) return false; break; case 'date': if( $this -> getAge($mValue) < $iMin ) return false; break; case 'range': if( $mValue[0] < $iMin || $mValue[1] < $iMin ) return false; break; case 'select_set': if( count( $mValue ) < $iMin ) return false; break; } return true; } function checkPostValueForMax( $aItem, $mValue ) { $iMax = $aItem['Max']; if( is_null($iMax) ) return true; switch( $aItem['Type'] ) { case 'text': case 'area': case 'pass': if( mb_strlen( $mValue ) > $iMax ) return false; break; case 'html_area': if( mb_strlen( strip_tags($mValue) ) > $iMax ) return false; break; case 'num': if( $mValue > $iMax ) return false; break; case 'date': if( $this -> getAge($mValue) > $iMax ) return false; break; case 'range': if( $mValue[0] > $iMax || $mValue[1] > $iMax ) return false; break; case 'select_set': if( count( $mValue ) > $iMax ) return false; break; } return true; } function checkPostValueForUnique( $aItem, $mValue, $iHuman, $iProfileID ) { global $logged; if( !$aItem['Unique'] ) return true; $iProfileID = (int)$iProfileID; if( $iProfileID ) { $sAdd = "AND `ID` != $iProfileID"; } else $sAdd = ''; $mValue_db = addslashes( $mValue ); $sQuery = "SELECT COUNT(*) FROM `Profiles` WHERE `{$aItem['Name']}` = '$mValue_db' $sAdd"; if( (int)db_value( $sQuery ) ) return false; return true; } function checkPostValueForCheck( $aItem, $mValue ) { $sCheck = $aItem['Check']; if( empty($sCheck) ) return true; $sFunc = create_function( '$arg0', $sCheck ); if( !$sFunc( $mValue ) ) return false; return true; } function checkPostValueForMandatory( $aItem, $mValue ) { if( !$aItem['Mandatory'] ) return true; if( $aItem['Type'] == 'num' ) { if( is_null($mValue) ) return false; } elseif( $aItem['Type'] == 'range' ) { if( is_null($mValue[0]) or is_null($mValue[1]) ) return false; } elseif( $aItem['Type'] == 'pass' ) { if( $this -> iAreaID == 2 or $this -> iAreaID == 3 or $this -> iAreaID == 4 ) // if area is edit, non-mandatory return true; else if( empty($mValue) ) // standard check return false; } else { if( empty($mValue) ) return false; } return true; } function checkPostValueForValues( $aItem, $mValue ) { if( empty($mValue) ) //it is not selected return true; if( is_array( $aItem['Values'] ) ) $aValues = $aItem['Values']; else $aValues = $this -> getPredefinedKeysArr( $aItem['Values'] ); if( !$aValues ) return 'Cannot find list'; if( $aItem['Type'] == 'select_one' ) { if( !in_array( $mValue, $aValues ) ) return 'Value not in list. Hack attempt!'; } elseif( $aItem['Type'] == 'select_set' ) { foreach( $mValue as $sValue ) if( !in_array( $sValue, $aValues ) ) return 'Value not in list. Hack attempt!'; } return true; } function getDefaultValues() { $aItems = array(); foreach($this -> aCache[100][0]['Items'] as $aItem) if(!empty($aItem["Default"])) $aItems[$aItem["Name"]] = $aItem["Default"]; return $aItems; } function getPredefinedKeysArr( $sKey ) { global $aPreValues; if( substr( $sKey, 0, 2 ) == $this->sLinkPref ) $sKey = substr( $sKey, 2 ); return @array_keys( $aPreValues[$sKey] ); } function checkPostValueForSystem( $aItem, $mValue ) { switch( $aItem['Name'] ) { case 'Captcha': return ( $this -> checkCaptcha( $mValue ) ) ? true : _t( '_Captcha check failed' ); break; case 'Status': if( !in_array($mValue, $aItem['Values'] ) ) return 'Status hack attempt!'; break; case 'TermsOfUse': return $mValue ? true : _t( '_You must agree with terms of use' ); break; case 'ProfilePhoto': if ($aItem['Mandatory'] && is_null($mValue)) return _t( '_Please specify image file' ); if (( isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) and $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' )) return true; $sFileName = $GLOBALS['dir']['tmp'] . $mValue; if ($mValue && !file_exists($sFileName)) // hack attempt return 'No way! File not exists: ' . $sFileName; $aSize = @getimagesize($sFileName); if ($mValue && !$aSize) { @unlink($sFileName); return _t( '_Please specify image file' ); } if ($mValue && $aSize[2] != IMAGETYPE_GIF && $aSize[2] != IMAGETYPE_JPEG && $aSize[2] != IMAGETYPE_PNG) { unlink($sFileName); return _t( '_Please specify image of JPEG, GIF or PNG format' ); } return true; break; } return true; } function checkCaptcha( $mValue ) { bx_import('BxDolSession'); $oSession = BxDolSession::getInstance(); $mixedValue = $oSession->getValue('strSec'); return $mixedValue !== false && $mixedValue === md5($mValue); } function getAge( $sBirthDate ) { /* // Old style 28/10/1985 $bd = explode( '/', $sBirthDate ); foreach ($bd as $i => $v) $bd[$i] = (int)$v; if ( date('n') > $bd[1] || ( date('n') == $bd[1] && date('j') >= $bd[0] ) ) $age = date('Y') - $bd[2]; else $age = date('Y') - $bd[2] - 1; */ // New style 1985-10-28 $bd = explode( '-', $sBirthDate ); foreach ($bd as $i => $v) $bd[$i] = intval($v); if (intval(date('n')) > $bd[1] || (intval(date('n')) == $bd[1] && intval(date('j')) >= $bd[2])) $age = intval(date('Y')) - $bd[0]; else $age = intval(date('Y')) - $bd[0] - 1; return $age; } // create intuitive array of values from default text profile array (getProfileInfo) function getValuesFromProfile( $aProfile ) { $aValues = array(); foreach( $this -> aBlocks as $aBlock ) { foreach( $aBlock['Items'] as $aItem ) { $sItemName = $aItem['Name']; if( !array_key_exists( $sItemName, $aProfile )) continue; //pass this $mValue = $aProfile[$sItemName]; switch( $aItem['Type'] ) { case 'select_set': $mValue = explode( ',', $mValue ); break; case 'range': $mValue = explode( ',', $mValue ); foreach( $mValue as $iInd => $sValue ) $mValue[$iInd] = (int)$sValue; break; case 'bool': $mValue = (bool)$mValue; break; case 'num': $mValue = (int)$mValue; break; case 'date': /* $aDate = explode( '-', $mValue ); //YYYY-MM-DD $mValue = (int)$aDate[2] . '/' . (int)$aDate[1] . '/' . $aDate[0]; */ //return $mValue; break; case 'system': switch( $sItemName ) { case 'Couple': case 'ID': $mValue = (int)$mValue; break; case 'Featured': $mValue = (bool)$mValue; break; } break; } $aValues[$sItemName] = $mValue; } } $aValues['Salt'] = $aProfile['Salt']; // encryptUserPwd return $aValues; } // reverse of previous function. convert intuitive array to text array function getProfileFromValues( $aValues ) { $aProfile = array(); if( $this -> iAreaID == 1 ) { $aBlocks = array(); foreach( array_keys( $this -> aArea ) as $iPage ) $aBlocks = array_merge( $aBlocks, $this -> aArea[ $iPage ] ); } else $aBlocks = $this -> aBlocks; foreach( $aBlocks as $aBlock ) { foreach( $aBlock['Items'] as $aItem ) { $sItemName = $aItem['Name']; if( !array_key_exists( $sItemName, $aValues ) ) continue; //pass this $mValue = $aValues[$sItemName]; /* // convertation switch( $aItem['Type'] ) { case 'date': $aDate = explode( '/', $mValue ); $mValue = sprintf( '%04d-%02d-%02d', $aDate[2], $aDate[1], $aDate[0] ); break; //impl others } */ $aProfile[$sItemName] = $mValue; } } return $aProfile; } //internal function function _getCoupleMutualFields() { $aAllItems = $this -> aCache[100][0]['Items']; $this -> aCoupleMutual = array( 'NickName', 'Password', 'Email' ); foreach( $aAllItems as $aItem ) { if( $aItem['Name'] == 'Couple' ) $this -> aCoupleMutual = array_merge( $this -> aCoupleMutual, explode( "\n", $aItem['Extra'] ) ); // add specified values if( $aItem['Type'] == 'system' ) $this -> aCoupleMutual[] = $aItem['Name']; if( $aItem['Type'] == 'pass' ) $this -> aCoupleMutual[] = $aItem['Name'] . '_confirm'; } //echoDbg( $this -> aCoupleMutual ); } //external function function getCoupleMutualFields() { return $this -> aCoupleMutual; } function getViewableValue( $aItem, $sValue ) { global $site; switch( $aItem['Type'] ) { case 'text': case 'num': case 'area': return nl2br(htmlspecialchars_adv($sValue)); case 'html_area': return $sValue; case 'date': return $this -> getViewableDate( $sValue ); case 'range': return htmlspecialchars_adv( str_replace( ',', ' - ',$sValue ) ); case 'bool': return _t( $sValue ? '_Yes' : '_No' ); case 'select_one': $sValueView = $this -> getViewableSelectOne( $aItem['Values'], $sValue ); if ($aItem['Name'] == 'Country') { $sFlagName = strtolower($sValue); $sValueView = ' ' . $sValueView; } return $sValueView; case 'select_set': return $this -> getViewableSelectSet( $aItem['Values'], $sValue ); case 'system': switch( $aItem['Name'] ) { case 'Age': return age($sValue); case 'DateReg': case 'DateLastEdit': case 'DateLastLogin': return $this -> getViewableDate( $sValue ); case 'Status': return _t( "_$sValue" ); case 'ID': return $sValue; case 'Featured': return _t( $sValue ? '_Yes' : '_No' ); default: return ' '; } break; case 'pass': default: return ' '; } } function getViewableDate( $sDate ) { return $sDate; } function getViewableSelectOne( $mValues, $sValue, $sUseLKey = 'LKey' ) { global $aPreValues; if( is_string($mValues) and substr($mValues, 0, 2) == $this->sLinkPref ) { $sKey = substr($mValues, 2); if( !isset( $aPreValues[$sKey][$sUseLKey] ) ) $sUseLKey = 'LKey'; return htmlspecialchars_adv( _t( $aPreValues[$sKey][$sValue][$sUseLKey] ) ); } elseif( is_array($mValues) ) { if( in_array($sValue, $mValues) ) return htmlspecialchars_adv( _t( "_FieldValues_{$sValue}" ) ); //return htmlspecialchars_adv( _t( "_$sValue" ) ); else return ''; } else return ''; } function getViewableSelectSet( $mValues, $sValue, $sUseLKey = 'LKey' ) { global $aPreValues; if( is_string($mValues) and substr($mValues, 0, 2) == $this->sLinkPref ) { $sKey = substr($mValues, 2); if( !isset( $aPreValues[$sKey] ) ) return ' '; $aValues = explode( ',', $sValue ); $aTValues = array(); foreach( $aValues as $sValue ) $aTValues[] = _t( $aPreValues[$sKey][$sValue][$sUseLKey] ); return htmlspecialchars_adv( implode( ', ', $aTValues ) ); } elseif( is_array($mValues) ) { $aValues = array(); foreach( explode( ',', $sValue ) as $sValueOne ) $aValues[] = _t( "_FieldValues_{$sValueOne}" ); //$aValues[] = _t( "_$sValueOne" ); return htmlspecialchars_adv( implode( ', ', $aValues ) ); } else return ''; } function collectSearchRequestParams() { $aParams = array(); if( empty($_GET) and empty($_POST) ) return $aParams; foreach( $this -> aBlocks as $aBlock ) { foreach( $aBlock['Items'] as $aItem ) { $sItemName = $aItem['Name']; $mValue = null; switch( $aItem['Type'] ) { case 'text': case 'area': case 'html_area': if( isset( $_REQUEST[$sItemName] ) and $_REQUEST[$sItemName] ) $mValue = process_pass_data( $_REQUEST[$sItemName] ); break; case 'num': case 'date': case 'range': if( isset( $_REQUEST[$sItemName] ) and !empty( $_REQUEST[$sItemName] ) ) { $mValue = explode('-', $_REQUEST[$sItemName], 2); $mValue[0] = (int)$mValue[0]; $mValue[1] = (int)$mValue[1]; if( !$mValue[0] and !$mValue[1] ) $mValue = null; // if no values entered, skip them } break; case 'select_one': case 'select_set': if( isset( $_REQUEST[$sItemName] ) and !empty( $_REQUEST[$sItemName] ) ) { if (is_array( $_REQUEST[$sItemName] )) { $mValue = array(); foreach( $_REQUEST[$sItemName] as $sValue ) { $sValue = trim( process_pass_data( $sValue ) ); if( $sValue ) $mValue[] = $sValue; } } else { $mValue = trim( process_pass_data( $_REQUEST[$sItemName] ) ); } } if (!$mValue) $mValue = null; break; case 'bool': if( isset( $_REQUEST[$sItemName] ) and $_REQUEST[$sItemName] ) $mValue = true; break; case 'system': switch( $sItemName ) { case 'ID': if( isset( $_REQUEST[$sItemName] ) and (int)$_REQUEST[$sItemName] ) $mValue = (int)$_REQUEST[$sItemName]; break; case 'Couple': if( isset( $_REQUEST[$sItemName] ) and is_array( $_REQUEST[$sItemName] ) ) { if( isset( $_REQUEST[$sItemName][0] ) and isset( $_REQUEST[$sItemName][1] ) ) $mValue = '-1'; //pass elseif( isset( $_REQUEST[$sItemName][0] ) ) $mValue = 0; elseif( isset( $_REQUEST[$sItemName][1] ) ) $mValue = 1; } elseif( isset( $_REQUEST[$sItemName] ) ) { $mValue = 'yes' == $_REQUEST[$sItemName] ? 1 : 0; } break; case 'Location': break; case 'Keyword': if( isset( $_REQUEST[$sItemName] ) and trim( $_REQUEST[$sItemName] ) ) $mValue = trim( process_pass_data( $_REQUEST[$sItemName] ) ); break; } break; } if( !is_null( $mValue ) ) $aParams[ $sItemName ] = $mValue; } } return $aParams; } function getProfilesMatch( $aProf1, $aProf2 ) { if( !$this -> aArea ) return 0; $aFields1 = $this -> aBlocks[0]['Items']; $aFields2 = $this -> aCache[100][0]['Items']; $iMyPercent = 0; $iTotalPercent = 0; foreach( $aFields1 as $aField1 ) { $aField2 = $aFields2[ $aField1['MatchField'] ]; if( !$aField2 ) continue; $iTotalPercent += $aField1['MatchPercent']; $sVal1 = $aProf1[ $aField1['Name'] ]; $sVal2 = $aProf2[ $aField2['Name'] ]; if( !strlen($sVal1) or !strlen($sVal2) ) continue; $iAddPart = 0; switch( "{$aField1['Type']} {$aField1['Type']}" ) { case 'select_set select_one': $aVal1 = explode( ',', $sVal1 ); if( in_array( $sVal2, $aVal1 ) ) $iAddPart = 1; break; case 'select_one select_set': $aVal2 = explode( ',', $sVal2 ); if( in_array( $sVal1, $aVal2 ) ) $iAddPart = 1; break; case 'select_set select_set': $aVal1 = explode( ',', $sVal1 ); $aVal2 = explode( ',', $sVal2 ); $iFound = 0; foreach( $aVal1 as $sTempVal1 ) { if( in_array( $sTempVal1, $aVal2 ) ) $iFound ++; } $iAddPart = $iFound / count( $aVal1 ); break; case 'range num': $aVal1 = explode( ',', $sVal1 ); $sVal2 = (int)$sVal2; if( (int)$aVal1[0] <= $sVal2 and $sVal2 <= (int)$aVal1[0] ) $iAddPart = 1; break; case 'range date': $aVal1 = explode( ',', $sVal1 ); $aDate = explode( '-', $sVal2 ); $sVal2 = sprintf( '%d/%d/%d', $aDate[2], $aDate[1], $aDate[0] ); $sAge = $this -> getAge( $sVal2 ); if( (int)$aVal1[0] <= $sVal2 and $sVal2 <= (int)$aVal1[0] ) $iAddPart = 1; break; default: if( $sVal1 == $sVal2 ) $iAddPart = 1; } $iMyPercent += round( $aField1['MatchPercent'] * $iAddPart ); } if( $iTotalPercent != 100 && $iTotalPercent != 0 ) $iMyPercent = (int)( ( $iMyPercent / $iTotalPercent ) * 100 ); return $iMyPercent; } function getFormCode($aParams = null) { switch ($this->iAreaID) { // join case 1: $aForm = $this->getFormJoin($aParams); break; // edit case 2: case 3: case 4: $aForm = $this->getFormEdit($aParams); break; // search case 9: case 10: case 11: return $this->getFormsSearch($aParams); break; default: return false; } $oForm = new BxTemplFormView($aForm); bx_import('BxDolAlerts'); $sCustomHtmlBefore = ''; $sCustomHtmlAfter = ''; $oAlert = new BxDolAlerts('profile', 'show_profile_form', 0, 0, array('oProfileFields' => $this, 'oForm' => $oForm, 'sCustomHtmlBefore' => &$sCustomHtmlBefore, 'sCustomHtmlAfter' => &$sCustomHtmlAfter)); $oAlert->alert(); return $sCustomHtmlBefore . $oForm->getCode() . $sCustomHtmlAfter; } function getFormsSearch($aParams) { // original member profile, used for setting default search params $aDefaultParams = $aParams['default_params']; $sSearchModeName = ($this->iAreaID == 10 ? 'quick' : ($this->iAreaID == 11 ? 'adv' : 'simple')); $sResult = ''; $iFormCounter = 1; // generate blocks foreach ($this->aBlocks as $iBlockId => $aBlock) { $bAddFlags = true; // flags "online only" and "photos only" //collect inputs $aInputs = array(); // create search mode hidden input $aInputs[] = array( 'type' => 'hidden', 'name' => 'search_mode', 'value' => $sSearchModeName, ); // generate block input $aInputs[] = array( 'type' => 'block_header', 'caption' => _t($aBlock['Caption']), ); // generate inputs for items of this block foreach ($aBlock['Items'] as $iItemId => $aItem) { if ($iItemId == 1 or $iItemId == 2) $bAddFlags = false; // do not add flags when username or id available // generate input $aFormInput = array( 'name' => $aItem['Name'], 'caption' => (_t($aItem['Caption']) != $aItem['Caption']) ? _t($aItem['Caption']) : null, 'info' => (_t($aItem['Desc']) != $aItem['Desc']) ? _t($aItem['Desc']) : null, 'value' => $aDefaultParams[$aItem['Name']], ); switch ($aItem['Type']) { case 'text': case 'area': // search in area like simple keyword case 'html_area': // search in area like simple keyword $aFormInput['type'] = 'text'; break; case 'bool': $aFormInput['type'] = 'checkbox'; break; case 'select_one': case 'select_set': switch($aItem['Control']) { case 'select' : $aFormInput['type'] = 'select_box'; $aFormInput['attrs']['add_other'] = 'false'; break; case 'checkbox' : $aFormInput['type'] = $aItem['Name'] == 'LookingFor' ? 'select' : 'checkbox_set'; break; default : $aFormInput['type'] = $aItem['Name'] == 'Sex' ? 'checkbox_set' : 'select'; } $aFormInput['values'] = $this->convertValues4Input($aItem['Values'], $aItem['UseLKey']); if (is_array($aFormInput['value'])) { $aFormInput['value'] = $aFormInput['value'][0]; } break; case 'date': case 'num': case 'range': $aFormInput['type'] = 'doublerange'; /* Changed because of realisation of WebForms 2.0 */ $aFormInput['attrs'] = array( 'min' => $aItem['Min'], 'max' => $aItem['Max'], ); break; case 'system': switch ($aItem['Name']) { case 'ID': $aFormInput['type'] = 'number'; $aFormInput['attrs']['min'] = 1; break; case 'Keyword': $aFormInput['type'] = 'text'; break; case 'Location': $sLivingWithinC = _t("_living within"); $sMilesC = _t("_miles"); $sKmC = _t("_kilometers"); $sFromZipC = _t("_from zip/postal code"); $aFormInput['type'] = 'custom'; $aFormInput['content'] = <<
$sFromZipC
EOF; break; case 'Couple': if ('on' == getParam('enable_global_couple')) { $aFormInput['type'] = 'select'; $aFormInput['values'] = array( 'no' => _t('_Single'), 'yes' => _t('_Couple') ); } else { $aFormInput['type'] = 'hidden'; $aFormInput['value'] = 'no'; } break; } break; } $aInputs[] = $aFormInput; } //if ($bAddFlags /* array_search($iBlockId, array_keys($this->aBlocks)) != 0 */) { // create input for "online only" // $aInputs[] = array( // 'type' => 'checkbox', // 'name' => 'online_only', //'label' => _t('_online only'), //'checked' => $aDefaultParams['online_only'] == 'on', // ); //create input for "with photos only" // $aInputs[] = array( //'type' => 'checkbox', //'name' => 'photos_only', //'label' => _t('_With photos only'), //'checked' => $aDefaultParams['photos_only'] == 'on', //); //} // create submit button $aInputs[] = array( 'type' => 'submit', 'name' => 'submit', 'value' => _t('_Search'), 'colspan' => true, // colspan ); // create form array $aForm = array( 'form_attrs' => array( 'method' => 'get', 'action' => $GLOBALS['site']['url'] . 'search.php', 'name' => $sSearchModeName . '_search_form' . $iFormCounter, ), 'inputs' => $aInputs, ); if (isset($aParams['form_attrs']) && is_array($aParams['form_attrs'])) $aForm['form_attrs'] = array_merge ($aForm['form_attrs'], $aParams['form_attrs']); if (isset($aParams['inputs']) && is_array($aParams['inputs'])) $aForm['inputs'] = array_merge ($aForm['inputs'], $aParams['inputs']); $oForm = new BxTemplFormView($aForm); $sResult .= $oForm->getCode(); $iFormCounter++; } // block generation finished return $sResult; } /** * Generate form for join * */ function getFormJoin($aParams) { // get parameters $bCoupleEnabled = $aParams['couple_enabled']; $bCouple = $aParams['couple']; $aHiddenItems = $aParams['hiddens']; $iPage = $aParams['page']; $aValues = $aParams['values']; $aErrors = $aParams['errors']; // collect inputs $aInputs = array(); // convert array of hidden fields to inputs foreach ($aHiddenItems as $sName => $sValue) { $aInputs[] = array( 'type' => 'hidden', 'name' => $sName, 'value' => $sValue, ); } // add table headers /* $aInputs[] = array( 'type' => 'headers', 'tr_class' => 'hidable', 0 => ' ', 1 => _t( '_First Person' ), 2 => _t( '_Second Person' ), ); */ // add every block on this page foreach( $this->aArea[$iPage] as $aBlock ) { // generate block header $aInputs[] = array( 'type' => 'block_header', 'caption' => _t( $aBlock['Caption'] ), ); $aAddInputs = array(); // add every item foreach( $aBlock['Items'] as $aItem ) { $aInputParams = array( 'couple' => $bCouple, 'values' => array( 0 => isset($aValues[0][$aItem['Name']]) ? $aValues[0][$aItem['Name']] : null, 1 => isset($aValues[1][$aItem['Name']]) ? $aValues[1][$aItem['Name']] : null, ), 'errors' => array( 0 => isset($aErrors[0][$aItem['Name']]) ? $aErrors[0][$aItem['Name']] : null, 1 => isset($aErrors[1][$aItem['Name']]) ? $aErrors[1][$aItem['Name']] : null, ), ); $aInputs[] = $this->convertJoinField2Input($aItem, $aInputParams, 0); if ($bCoupleEnabled && !in_array( $aItem['Name'], $this -> aCoupleMutual )) $aAddInputs[] = $this->convertJoinField2Input($aItem, $aInputParams, 1); // duplicate password (confirmation) if ($aItem['Type'] == 'pass') { $aItem_confirm = $aItem; $aItem_confirm['Name'] .= '_confirm'; $aItem_confirm['Caption'] = '_Confirm password'; $aItem_confirm['Desc'] = '_Confirm password descr'; $aInputs[] = $this->convertJoinField2Input($aItem_confirm, $aInputParams, 0); if ($bCoupleEnabled && !in_array( $aItem['Name'], $this -> aCoupleMutual )) $aAddInputs[] = $this->convertJoinField2Input($aItem_confirm, $aInputParams, 1); } } // add second person if (!empty($aAddInputs)) { $aInputs[] = array( 'type' => 'block_header', 'caption' => _t( $aBlock['Caption'] ) . ' - ' . _t('_Second Person'), 'attrs' => array( 'class' => 'hidable', 'style' => 'display: ' . ($bCouple ? 'table-row' : 'none'), ), ); $aInputs = array_merge($aInputs, $aAddInputs); } } // add submit button $aInputs[] = array( 'type' => 'submit', 'name' => 'do_submit', 'value' => _t( '_Join now' ), 'colspan' => false, ); // generate form array $aForm = array( 'form_attrs' => array( 'name' => 'join_form', 'action' => BX_DOL_URL_ROOT . 'join.php', 'method' => 'post', 'onsubmit' => 'return validateJoinForm(this);', 'enctype' => 'multipart/form-data', ), 'table_attrs' => array( 'id' => 'join_form_table' ), 'params' => array( 'double' => $bCoupleEnabled, 'second_enabled' => $bCouple ), 'inputs' => $aInputs, ); return $aForm; } /** * Generate form for edit * */ function getFormEdit($aParams) { // get parameters $bCoupleEnabled = $aParams['couple_enabled']; $bCouple = $aParams['couple']; $aHiddenItems = $aParams['hiddens']; $iProfileID = $aParams['profile_id']; $aValues = $aParams['values']; $aErrors = $aParams['errors']; // collect inputs $aInputs = array(); // convert array of hidden fields to inputs foreach ($aHiddenItems as $sName => $sValue) { $aInputs[] = array( 'type' => 'hidden', 'name' => $sName, 'value' => $sValue, ); } // add table headers (only if couple) /* if ($bCouple) { $aInputs[] = array( 'type' => 'headers', 'tr_class' => 'hidable', 0 => ' ', 1 => _t( '_First Person' ), 2 => _t( '_Second Person' ), ); } */ // add every block on this page foreach( $this->aBlocks as $aBlock ) { // generate block header $aInputs[] = array( 'type' => 'block_header', 'caption' => _t( $aBlock['Caption'] ), ); $aAddInputs = array(); // add every item foreach( $aBlock['Items'] as $aItem ) { $aInputParams = array( 'couple' => $bCouple, 'values' => array( 0 => isset($aValues[0][$aItem['Name']]) ? $aValues[0][$aItem['Name']] : null, 1 => isset($aValues[1][$aItem['Name']]) ? $aValues[1][$aItem['Name']] : null, ), 'errors' => array( 0 => isset($aErrors[0][$aItem['Name']]) ? $aErrors[0][$aItem['Name']] : null, 1 => isset($aErrors[1][$aItem['Name']]) ? $aErrors[1][$aItem['Name']] : null, ), 'profile_id' => $iProfileID, ); $aInputs[] = $this->convertEditField2Input($aItem, $aInputParams, 0); if ($bCoupleEnabled && !in_array( $aItem['Name'], $this -> aCoupleMutual )) $aAddInputs[] = $this->convertEditField2Input($aItem, $aInputParams, 1); // duplicate password (confirmation) if ($aItem['Type'] == 'pass') { $aItem_confirm = $aItem; $aItem_confirm['Name'] .= '_confirm'; $aItem_confirm['Caption'] = '_Confirm password'; $aItem_confirm['Desc'] = '_Confirm password descr'; $aInputs[] = $this->convertEditField2Input($aItem_confirm, $aInputParams, 0); if ($bCoupleEnabled && !in_array( $aItem['Name'], $this -> aCoupleMutual )) $aAddInputs[] = $this->convertEditField2Input($aItem, $aInputParams, 1); } } // add second person if (!empty($aAddInputs)) { $aInputs[] = array( 'type' => 'block_header', 'caption' => _t( $aBlock['Caption'] ) . ' - ' . _t('_Second Person'), 'attrs' => array( 'class' => 'hidable', 'style' => 'display: ' . ($bCouple ? 'table-row' : 'none'), ), ); $aInputs = array_merge($aInputs, $aAddInputs); } } // add submit button $aInputs[] = array( 'type' => 'submit', 'name' => 'do_save', 'value' => _t( '_Save' ), 'colspan' => false, ); // generate form array $aForm = array( 'form_attrs' => array( 'name' => 'edit_form', 'action' => BX_DOL_URL_ROOT . 'pedit.php?ID=' . $iProfileID, 'method' => 'post', 'onsubmit' => 'return validateEditForm(this);', ), 'table_attrs' => array( 'id' => 'edit_form_table' ), 'params' => array( 'double' => $bCoupleEnabled, 'second_enabled' => $bCouple ), 'inputs' => $aInputs, ); return $aForm; } function convertEditField2Input($aItem, $aParams, $iPerson) { $bCouple = $aParams['couple']; $aValues = $aParams['values']; $aErrors = $aParams['errors']; $iProfileID = $aParams['profile_id']; $aInput = array(); switch ($aItem['Type']) { case 'text': $aInput['type'] = 'text'; $aInput['value'] = $aValues[$iPerson]; break; case 'area': $aInput['type'] = 'textarea'; $aInput['value'] = $aValues[$iPerson]; $aInput['attrs']['counter'] = 'true'; break; case 'html_area': $aInput['type'] = 'textarea'; $aInput['html'] = true; $aInput['value'] = $aValues[$iPerson]; $aInput['attrs']['counter'] = 'true'; break; case 'date': $aInput['type'] = 'date'; $aInput['value'] = $aValues[$iPerson]; break; case 'datetime': $aInput['type'] = 'datetime'; $aInput['value'] = $aValues[$iPerson]; break; case 'num': $aInput['type'] = 'number'; $aInput['value'] = $aValues[$iPerson]; break; case 'range': $aInput['type'] = 'doublerange'; $aInput['value'] = $aValues[$iPerson]; break; case 'pass': $aInput['type'] = 'password'; break; case 'bool': $aInput['type'] = 'checkbox'; $aInput['value'] = 'yes'; $aInput['checked'] = (bool)(int)$aValues[$iPerson]; break; case 'select_one': switch ($aItem['Control']) { case 'select': $aInput['type'] = 'select'; break; case 'radio': $aInput['type'] = 'radio_set'; break; default: return false; } $aInput['values'] = $this->convertValues4Input($aItem['Values'], $aItem['UseLKey']); $aInput['value'] = $aValues[$iPerson]; break; case 'select_set': switch ($aItem['Control']) { case 'select': $aInput['type'] = 'select_multiple'; break; case 'checkbox': $aInput['type'] = 'checkbox_set'; break; default: return false; } $aInput['values'] = $this->convertValues4Input($aItem['Values'], $aItem['UseLKey']); $aInput['value'] = $aValues[$iPerson]; break; case 'system': switch ($aItem['Name']) { case 'Featured': $aInput = array( 'type' => 'checkbox', 'value' => 'yes', 'checked' => $aValues[0] ); break; case 'Status': $aInput = array( 'type' => 'select', 'value' => $aValues[0], 'values' => array(), ); foreach ($aItem['Values'] as $sValue) { $aInput['values'][$sValue] = _t("_FieldValues_$sValue"); } break; case 'Membership': $aMemberships = getMemberships(); $aMembershipInfo = getMemberMembershipInfo($iProfileID); $aInput = array( 'type' => 'custom', 'content' => $this->getInputMembership( $aMemberships, $aMembershipInfo ), ); break; case 'ID': case 'DateReg': case 'DateLastEdit': case 'DateLastLogin': //non editable return false; break; default: return false; } break; default: return false; } $aInput['name'] = ( $aItem['Type'] == 'system' ) ? $aItem['Name'] : ( $aItem['Name'] . "[$iPerson]" ); $aInput['caption'] = _t( $aItem['Caption'] ); $aInput['required'] = $aItem['Type'] == 'pass' ? false : $aItem['Mandatory']; $aInput['info'] = ( ($sInfo = _t( $aItem['Desc'], $aItem['Min'], $aItem['Max'] )) != $aItem['Desc']) // if info is translated ? $sInfo : null; if ($aItem['Type'] == 'date') { $aInput['attrs']['min'] = $aItem['Max'] ? (date('Y') - $aItem['Max']) . '-' . date('m') . '-' . date('d') : (date('Y') - 100) . '-' . date('m') . '-' . date('d'); $aInput['attrs']['max'] = $aItem['Min'] ? (date('Y') - $aItem['Min']) . '-' . date('m') . '-' . date('d') : (date('Y') + 100) . '-' . date('m') . '-' . date('d'); } else { $aInput['attrs']['min'] = $aItem['Min']; $aInput['attrs']['max'] = $aItem['Max']; } $aInput['error'] = $aErrors[$iPerson]; if ($iPerson == 1) { $aInput['tr_attrs'] = array( 'class' => 'hidable', 'style' => 'display: ' . ($bCouple ? 'table-row' : 'none'), ); } return $aInput; } function getInputMembership ( $aMemberships, $aCurMship ) { $sCurMship = $aCurMship['Name']; if ( $aCurMship['ID'] != MEMBERSHIP_ID_STANDARD ) { if ( !isset( $aCurMship['DateExpires'] ) ) $sCurMship .= ', ' . _t( '_MEMBERSHIP_EXPIRES_NEVER' ); else { $iDaysLeft = round( ($aCurMship['DateExpires'] - time()) / (24 * 3600) ); $sCurMship .= ', '. _t( '_MEMBERSHIP_EXPIRES_IN_DAYS', $iDaysLeft ); } } $iMembershipStd = MEMBERSHIP_ID_STANDARD; $_tSetMembership = _t('_Set membership'); $_tFor = _t('_for'); $_tDays = _t('_days'); $_tStartsNow = _t('_starts immediately'); $_tCancel = _t( '_Cancel' ); //_t('_Current membership') $sCode .= << function checkStandard() { selectMembership = document.getElementById('MembershipID'); if(selectMembership.value == $iMembershipStd) { document.getElementById('MembershipDays').disabled = true; document.getElementById('MembershipImmediately').disabled = true; } else { document.getElementById('MembershipDays').disabled = false; document.getElementById('MembershipImmediately').disabled = false; } } function ShowHideMshipForm( bShow ) { if( bShow ) { $('#current_membership').hide(400); $('#set_membership' ).show(400); $('#doSetMembership' ).val( 'yes' ); } else { $('#current_membership').show(400); $('#set_membership' ).hide(400); $('#doSetMembership' ).val( '' ); } }
$sCurMship
BLAH; $sCode .= <<