loadHelper('database'); $fields = array( 'tid' => 'pk', 'participant_id' => 'varchar(50)', 'firstname' => 'varchar(40)', 'lastname' => 'varchar(40)', 'email' => 'text', 'emailstatus' => 'text', 'token' => 'varchar(35)', 'language' => 'varchar(25)', 'blacklisted' => 'varchar(17)', 'sent' => "varchar(17) DEFAULT 'N'", 'remindersent' => "varchar(17) DEFAULT 'N'", 'remindercount' => 'integer DEFAULT 0', 'completed' => "varchar(17) DEFAULT 'N'", 'usesleft' => 'integer DEFAULT 1', 'validfrom' => 'datetime', 'validuntil' => 'datetime', 'mpid' => 'integer' ); foreach ($aAttributeFields as $sAttributeField) { $fields[$sAttributeField]='string'; } try{ $sTableName="{{tokens_".intval($iSurveyID)."}}"; createTable($sTableName, $fields); try{ Yii::app()->db->createCommand()->createIndex("idx_token_token_{$iSurveyID}_".rand(1,50000),"{{tokens_".intval($iSurveyID)."}}",'token'); } catch(Exception $e) {} // create fields for the custom token attributes associated with this survey $tokenattributefieldnames = Survey::model()->findByPk($iSurveyID)->tokenAttributes; foreach($tokenattributefieldnames as $attrname=>$attrdetails) { if (isset($fields[$attrname])) continue; // Field was already created Yii::app()->db->createCommand(Yii::app()->db->getSchema()->addColumn("{{tokens_".intval($iSurveyID)."}}", $attrname, 'VARCHAR(255)'))->execute(); } Yii::app()->db->schema->getTable($sTableName, true); // Refresh schema cache just in case the table existed in the past return true; } catch(Exception $e) { return false; } } /** * Sends email to tokens - invitation and reminders * * @param mixed $iSurveyID * @param array $aResultTokens * @param string $sType type of notification invite|remind * @return array of results */ function emailTokens($iSurveyID,$aResultTokens,$sType) { Yii::app()->loadHelper('common'); $oSurvey = Survey::model()->findByPk($iSurveyID); if (getEmailFormat($iSurveyID) == 'html') $bHtml = true; else $bHtml = false; $attributes = array_keys(getTokenFieldsAndNames($iSurveyID)); $oSurveyLocale=SurveyLanguageSetting::model()->findAllByAttributes(array('surveyls_survey_id' => $iSurveyID)); $oTokens = Token::model($iSurveyID); $aSurveyLangs = $oSurvey->additionalLanguages; array_unshift($aSurveyLangs, $oSurvey->language); //Convert result to associative array to minimize SurveyLocale access attempts foreach($oSurveyLocale as $rows) { $oTempObject=array(); foreach($rows as $k=>$v) { $oTempObject[$k] = $v; } $aSurveyLocaleData[$rows['surveyls_language']]=$oTempObject; } foreach ($aResultTokens as $aTokenRow) { //Select language $aTokenRow['language'] = trim($aTokenRow['language']); $found = array_search($aTokenRow['language'], $aSurveyLangs); if ($aTokenRow['language'] == '' || $found == false) { $aTokenRow['language'] = $oSurvey['language']; } $sTokenLanguage = $aTokenRow['language']; //Build recipient $to = array(); $aEmailaddresses = explode(';', $aTokenRow['email']); foreach ($aEmailaddresses as $sEmailaddress) { $to[] = ($aTokenRow['firstname'] . " " . $aTokenRow['lastname'] . " <{$sEmailaddress}>"); } //Populate attributes $fieldsarray["{SURVEYNAME}"] = $aSurveyLocaleData[$sTokenLanguage]['surveyls_title']; if ($fieldsarray["{SURVEYNAME}"] == '') $fieldsarray["{SURVEYNAME}"] = $aSurveyLocaleData[$oSurvey['language']]['surveyls_title']; $fieldsarray["{SURVEYDESCRIPTION}"] = $aSurveyLocaleData[$sTokenLanguage]['surveyls_description']; if ($fieldsarray["{SURVEYDESCRIPTION}"] == '') $fieldsarray["{SURVEYDESCRIPTION}"] = $aSurveyLocaleData[$oSurvey['language']]['surveyls_description']; $fieldsarray["{ADMINNAME}"] = $oSurvey['admin']; $fieldsarray["{ADMINEMAIL}"] = $oSurvey['adminemail']; $from = $fieldsarray["{ADMINEMAIL}"]; if($from == '') $from = Yii::app()->getConfig('siteadminemail'); foreach ($attributes as $attributefield) { $fieldsarray['{' . strtoupper($attributefield) . '}'] = $aTokenRow[$attributefield]; $fieldsarray['{TOKEN:'.strtoupper($attributefield).'}']=$aTokenRow[$attributefield]; } //create urls $fieldsarray["{OPTOUTURL}"] = Yii::app()->getController()->createAbsoluteUrl("/optout/tokens/langcode/" . trim($aTokenRow['language']) . "/surveyid/{$iSurveyID}/token/{$aTokenRow['token']}"); $fieldsarray["{OPTINURL}"] = Yii::app()->getController()->createAbsoluteUrl("/optin/tokens/langcode/" . trim($aTokenRow['language']) . "/surveyid/{$iSurveyID}/token/{$aTokenRow['token']}"); $fieldsarray["{SURVEYURL}"] = Yii::app()->getController()->createAbsoluteUrl("/survey/index/sid/{$iSurveyID}/token/{$aTokenRow['token']}/lang/" . trim($aTokenRow['language']) . "/"); if($bHtml) { foreach(array('OPTOUT', 'OPTIN', 'SURVEY') as $key) { $url = $fieldsarray["{{$key}URL}"]; $fieldsarray["{{$key}URL}"] = "" . htmlspecialchars($url) . ''; if ($key == 'SURVEY') { $barebone_link = $url; } } } //mail headers $customheaders = array('1' => "X-surveyid: " . $iSurveyID,'2' => "X-tokenid: " . $fieldsarray["{TOKEN}"]); global $maildebug; //choose appriopriate email message if($sType == 'invite') { $sSubject = $aSurveyLocaleData[$sTokenLanguage]['surveyls_email_invite_subj']; $sMessage = $aSurveyLocaleData[$sTokenLanguage]['surveyls_email_invite']; } else { $sSubject = $aSurveyLocaleData[$sTokenLanguage]['surveyls_email_remind_subj']; $sMessage = $aSurveyLocaleData[$sTokenLanguage]['surveyls_email_remind']; } $modsubject = Replacefields($sSubject, $fieldsarray); $modmessage = Replacefields($sMessage, $fieldsarray); if (isset($barebone_link)) { $modsubject = str_replace("@@SURVEYURL@@", $barebone_link, $modsubject); $modmessage = str_replace("@@SURVEYURL@@", $barebone_link, $modmessage); } if (isset($aTokenRow['validfrom']) && trim($aTokenRow['validfrom']) != '' && convertDateTimeFormat($aTokenRow['validfrom'], 'Y-m-d H:i:s', 'U') * 1 > date('U') * 1) { $aResult[$aTokenRow['tid']] = array('name'=>$fieldsarray["{FIRSTNAME}"]." ".$fieldsarray["{LASTNAME}"], 'email'=>$fieldsarray["{EMAIL}"], 'status'=>'fail', 'error'=>'Token not valid yet'); } elseif (isset($aTokenRow['validuntil']) && trim($aTokenRow['validuntil']) != '' && convertDateTimeFormat($aTokenRow['validuntil'], 'Y-m-d H:i:s', 'U') * 1 < date('U') * 1) { $aResult[$aTokenRow['tid']] = array('name'=>$fieldsarray["{FIRSTNAME}"]." ".$fieldsarray["{LASTNAME}"], 'email'=>$fieldsarray["{EMAIL}"], 'status'=>'fail', 'error'=>'Token not valid anymore'); } else { if (SendEmailMessage($modmessage, $modsubject, $to, $from, Yii::app()->getConfig("sitename"), $bHtml, getBounceEmail($iSurveyID), null, $customheaders)) { $aResult[$aTokenRow['tid']] = array('name'=>$fieldsarray["{FIRSTNAME}"]." ".$fieldsarray["{LASTNAME}"], 'email'=>$fieldsarray["{EMAIL}"], 'status'=>'OK'); if($sType == 'invite') $oTokens->updateByPk($aTokenRow['tid'], array('sent' => dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()->getConfig("timeadjust")))); if($sType == 'remind') { $iRCount = $oTokens->findByPk($aTokenRow['tid'])->remindercount +1; $oTokens->updateByPk($aTokenRow['tid'], array('remindersent' => dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()->getConfig("timeadjust")))); $oTokens->updateByPk($aTokenRow['tid'],array('remindercount' => $iRCount)); } } else { $aResult[$aTokenRow['tid']] = array('name'=>$fieldsarray["{FIRSTNAME}"]." ".$fieldsarray["{LASTNAME}"], 'email'=>$fieldsarray["{EMAIL}"], 'status'=>'fail', 'error'=>$maildebug); } } unset($fieldsarray); } return $aResult; }