1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/limesurvey_ynh.git synced 2024-09-03 19:36:32 +02:00
limesurvey_ynh/sources/application/controllers/admin/tokens.php

2486 lines
119 KiB
PHP
Raw Normal View History

<?php if ( !defined('BASEPATH')) exit('No direct script access allowed');
/*
* LimeSurvey
* Copyright (C) 2007-2011 The LimeSurvey Project Team / Carsten Schmitz
* All rights reserved.
* License: GNU/GPL License v2 or later, see LICENSE.php
* LimeSurvey is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
*
*/
/**
* Tokens Controller
*
* This controller performs token actions
*
* @package LimeSurvey
* @subpackage Backend
*/
class tokens extends Survey_Common_Action
{
/**
* Show token index page, handle token database
*/
function index($iSurveyId)
{
$iSurveyId = sanitize_int($iSurveyId);
$clang = $this->getController()->lang;
$thissurvey = getSurveyInfo($iSurveyId);
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'read') && !Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'create') && !Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update')
&& !Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'export') && !Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'import')
&& !Permission::model()->hasSurveyPermission($iSurveyID, 'surveysettings', 'update')
)
{
Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page.");
$this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
}
Yii::app()->loadHelper("surveytranslator");
$aData['surveyprivate'] = $thissurvey['anonymized'];
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
self::_newtokentable($iSurveyId);
}
else
{
//Check that the tokens table has the required fields
/**
* @todo is this still needed? What versions of token tables require this??
*/
TokenDynamic::model($iSurveyId)->checkColumns();
$aData['thissurvey'] = $thissurvey;
$aData['surveyid'] = $iSurveyId;
$aData['queries'] = Token::model($iSurveyId)->summary();
$this->_renderWrappedTemplate('token', array('tokenbar', 'tokensummary'), $aData);
}
}
/**
* tokens::bounceprocessing()
*
* @return void
*/
function bounceprocessing($iSurveyId)
{
$iSurveyId = sanitize_int($iSurveyId);
$clang = $this->getController()->lang;
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
$clang->eT("No token table.");
return;
}
$thissurvey = getSurveyInfo($iSurveyId);
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update'))
{
$clang->eT("We are sorry but you don't have permissions to do this.");
return;
}
if ($thissurvey['bounceprocessing'] != 'N' || ($thissurvey['bounceprocessing'] == 'G' && getGlobalSetting('bounceaccounttype') != 'off'))
{
if (!function_exists('imap_open'))
{
$clang->eT("The imap PHP library is not installed. Please contact your system administrator.");
return;
}
$bouncetotal = 0;
$checktotal = 0;
if ($thissurvey['bounceprocessing'] == 'G')
{
$accounttype=strtoupper(getGlobalSetting('bounceaccounttype'));
$hostname = getGlobalSetting('bounceaccounthost');
$username = getGlobalSetting('bounceaccountuser');
$pass = getGlobalSetting('bounceaccountpass');
$hostencryption=strtoupper(getGlobalSetting('bounceencryption'));
}
else
{
$accounttype=strtoupper($thissurvey['bounceaccounttype']);
$hostname = $thissurvey['bounceaccounthost'];
$username = $thissurvey['bounceaccountuser'];
$pass = $thissurvey['bounceaccountpass'];
$hostencryption=strtoupper($thissurvey['bounceaccountencryption']);
}
@list($hostname, $port) = split(':', $hostname);
if (empty($port))
{
if ($accounttype == "IMAP")
{
switch ($hostencryption)
{
case "OFF":
$hostname = $hostname . ":143";
break;
case "SSL":
$hostname = $hostname . ":993";
break;
case "TLS":
$hostname = $hostname . ":993";
break;
}
}
else
{
switch ($hostencryption)
{
case "OFF":
$hostname = $hostname . ":110";
break;
case "SSL":
$hostname = $hostname . ":995";
break;
case "TLS":
$hostname = $hostname . ":995";
break;
}
}
}
else
{
$hostname = $hostname.":".$port;
}
$flags = "";
switch ($accounttype)
{
case "IMAP":
$flags.="/imap";
break;
case "POP":
$flags.="/pop3";
break;
}
switch ($hostencryption) // novalidate-cert to have personal CA , maybe option.
{
case "OFF":
$flags.="/notls"; // Really Off
break;
case "SSL":
$flags.="/ssl/novalidate-cert";
break;
case "TLS":
$flags.="/tls/novalidate-cert";
break;
}
if ($mbox = @imap_open('{' . $hostname . $flags . '}INBOX', $username, $pass))
{
imap_errors();
$count = imap_num_msg($mbox);
if ($count>0)
{
$lasthinfo = imap_headerinfo($mbox, $count);
$datelcu = strtotime($lasthinfo->date);
$datelastbounce = $datelcu;
$lastbounce = $thissurvey['bouncetime'];
while ($datelcu > $lastbounce)
{
@$header = explode("\r\n", imap_body($mbox, $count, FT_PEEK)); // Don't mark messages as read
foreach ($header as $item)
{
if (preg_match('/^X-surveyid/', $item))
{
$iSurveyIdBounce = explode(": ", $item);
}
if (preg_match('/^X-tokenid/', $item))
{
$tokenBounce = explode(": ", $item);
if ($iSurveyId == $iSurveyIdBounce[1])
{
$aData = array(
'emailstatus' => 'bounced'
);
$condn = array('token' => $tokenBounce[1]);
$record = Token::model($iSurveyId)->findByAttributes($condn);
if ($record->emailstatus != 'bounced')
{
$record->emailstatus = 'bounced';
$record->save();
$bouncetotal++;
}
$readbounce = imap_body($mbox, $count); // Put read
if (isset($thissurvey['bounceremove']) && $thissurvey['bounceremove']) // TODO Y or just true, and a imap_delete
{
$deletebounce = imap_delete($mbox, $count); // Put delete
}
}
}
}
$count--;
@$lasthinfo = imap_headerinfo($mbox, $count);
@$datelc = $lasthinfo->date;
$datelcu = strtotime($datelc);
$checktotal++;
}
}
@imap_close($mbox);
$condn = array('sid' => $iSurveyId);
$survey = Survey::model()->findByAttributes($condn);
$survey->bouncetime = $datelastbounce;
$survey->save();
if ($bouncetotal > 0)
{
printf($clang->gT("%s messages were scanned out of which %s were marked as bounce by the system."), $checktotal, $bouncetotal);
}
else
{
printf($clang->gT("%s messages were scanned, none were marked as bounce by the system."), $checktotal);
}
}
else
{
$clang->eT("Please check your settings");
}
}
else
{
$clang->eT("Bounce processing is deactivated either application-wide or for this survey in particular.");
return;
}
exit; // if bounceprocessing : javascript : no more todo
}
/**
* Browse Tokens
*/
function browse($iSurveyId, $limit = 50, $start = 0, $order = false, $searchstring = false)
{
$clang = $this->getController()->lang;
$iSurveyId = sanitize_int($iSurveyId);
/* Check permissions */
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'read'))
{
Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page.");
$this->getController()->redirect(array("/admin/tokens/sa/index/surveyid/{$iSurveyId}"));
}
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
self::_newtokentable($iSurveyId);
}
/* build JS variable to hide buttons forbidden for the current user */
$aData['showDelButton'] = Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'delete')?'true':'false';
$aData['showInviteButton'] = Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update')?'true':'false';
$aData['showBounceButton'] = Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update')?'true':'false';
$aData['showRemindButton'] = Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update')?'true':'false';
// Javascript
App()->getClientScript()->registerPackage('jqgrid');
App()->getClientScript()->registerScriptFile(Yii::app()->getConfig('adminscripts') . "tokens.js");
// CSS
App()->getClientScript()->registerCssFile(Yii::app()->getConfig('adminstyleurl') . "displayParticipants.css");
App()->getClientScript()->registerCssFile(Yii::app()->getConfig('adminstyleurl') . "jquery-ui/jquery-timepicker.css");
Yii::app()->loadHelper('surveytranslator');
Yii::import('application.libraries.Date_Time_Converter', true);
$dateformatdetails = getDateFormatData(Yii::app()->session['dateformat']);
$limit = (int) $limit;
$start = (int) $start;
$tkcount = Token::model($iSurveyId)->count();
$next = $start + $limit;
$last = $start - $limit;
$end = $tkcount - $limit;
if ($end < 0)
{
$end = 0;
}
if ($last < 0)
{
$last = 0;
}
if ($next >= $tkcount)
{
$next = $tkcount - $limit;
}
if ($end < 0)
{
$end = 0;
}
$order = Yii::app()->request->getPost('order','tid');
$order = preg_replace('/[^_ a-z0-9-]/i', '', $order);
$aData['next'] = $next;
$aData['last'] = $last;
$aData['end'] = $end;
$searchstring = Yii::app()->request->getPost('searchstring');
$aData['thissurvey'] = getSurveyInfo($iSurveyId);
$aData['searchstring'] = $searchstring;
$aData['surveyid'] = $iSurveyId;
$aData['bgc'] = "";
$aData['limit'] = $limit;
$aData['start'] = $start;
$aData['order'] = $order;
$aData['surveyprivate'] = $aData['thissurvey']['anonymized'];
$aData['dateformatdetails'] = $dateformatdetails;
$this->_renderWrappedTemplate('token', array('tokenbar', 'browse'), $aData);
}
/**
* This function sends the shared participant info to the share panel using JSON encoding
* This function is called after the share panel grid is loaded
* This function returns the json depending on the user logged in by checking it from the session
* @param it takes the session user data loginID
* @return JSON encoded string containg sharing information
*/
function getTokens_json($iSurveyId, $search = null)
{
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
$clang->eT("No token table.");// return json ? error not treated in js.
return;
}
$clang = $this->getController()->lang;
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'read'))
{
$clang->eT("We are sorry but you don't have permissions to do this.");// return json ? error not treated in js.
return;
}
$page = Yii::app()->request->getPost('page', 1);
$sidx = Yii::app()->request->getPost('sidx', 'lastname');
$sord = Yii::app()->request->getPost('sord', 'asc');
$limit = Yii::app()->request->getPost('rows', 25);
$aData = new stdClass;
$aData->page = $page;
if (!empty($search)) {
$condition = TokenDynamic::model($iSurveyId)->getSearchMultipleCondition($search);
} else {
$condition = new CDbCriteria();
}
$condition->order = $sidx. " ". $sord;
$condition->offset = ($page - 1) * $limit;
$condition->limit = $limit;
$tokens = Token::model($iSurveyId)->findAll($condition);
$condition->offset=0;
$condition->limit=0;
$aData->records = Token::model($iSurveyId)->count($condition);
if ($limit>$aData->records)
{
$limit=$aData->records;
}
if ($limit!=0)
{
$aData->total = ceil($aData->records / $limit);
}
else
{
$aData->total = 0;
}
Yii::app()->loadHelper("surveytranslator");
$format = getDateFormatData(Yii::app()->session['dateformat']);
$aSurveyInfo = Survey::model()->findByPk($iSurveyId)->getAttributes(); //Get survey settings
$attributes = getAttributeFieldNames($iSurveyId);
// Now find all responses for the visible tokens
$visibleTokens = array();
$answeredTokens = array();
if ($aSurveyInfo['anonymized'] == "N" && $aSurveyInfo['active'] == "Y") {
foreach ($tokens as $token) {
if(isset($token['token']) && $token['token'])
$visibleTokens[] = $token['token'];
}
$answers = SurveyDynamic::model($iSurveyId)->findAllByAttributes(array('token'=>$visibleTokens));
foreach($answers as $answer) {
$answeredTokens[$answer['token']] = $answer['token'];
}
}
$bReadPermission = Permission::model()->hasSurveyPermission($iSurveyId, 'responses', 'read');
$bCreatePermission = Permission::model()->hasSurveyPermission($iSurveyId, 'responses', 'create');
$bTokenUpdatePermission = Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update');
$bTokenDeletePermission = Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'delete');
$bGlobalPanelReadPermission = Permission::model()->hasGlobalPermission('participantpanel','read');
foreach ($tokens as $token)
{
$aRowToAdd = array();
if ((int) $token['validfrom']) {
$token['validfrom'] = date($format['phpdate'] . ' H:i', strtotime(trim($token['validfrom'])));
} else {
$token['validfrom'] = '';
}
if ((int) $token['validuntil']) {
$token['validuntil'] = date($format['phpdate'] . ' H:i', strtotime(trim($token['validuntil'])));
} else {
$token['validuntil'] = '';
}
$aRowToAdd['id'] = $token['tid'];
$action="";
$action .= "<div class='inputbuttons'>"; // so we can hide this when edit is clicked
// Check is we have an answer
if (in_array($token['token'], $answeredTokens) && $bReadPermission) {
// @@TODO change link
$url = $this->getController()->createUrl("admin/responses/sa/browse/surveyid/{$iSurveyId}", array('token'=>$token['token']));
$title = $clang->gT("View response details");
$action .= CHtml::link(CHtml::image(Yii::app()->getConfig('adminimageurl') . 'token_viewanswer.png', $title, array('title'=>$title)), $url, array('class'=>'imagelink'));
} else {
$action .= '<div style="width: 20px; height: 16px; float: left;"></div>';
}
// Check if the token can be taken
if ($token['token'] != "" && ($token['completed'] == "N" || $token['completed'] == "") && $bCreatePermission) {
$action .= viewHelper::getImageLink('do_16.png', "survey/index/sid/{$iSurveyId}/token/{$token['token']}/lang/{$token['language']}/newtest/Y", $clang->gT("Do survey"), '_blank');
} else {
$action .= '<div style="width: 20px; height: 16px; float: left;"></div>';
}
if($bTokenDeletePermission){
$attribs = array('onclick' => 'if (confirm("' . $clang->gT("Are you sure you want to delete this entry?") . ' (' . $token['tid'] . ')")) {$("#displaytokens").delRowData(' . $token['tid'] . ');$.post(delUrl,{tid:' . $token['tid'] . '});}');
$action .= viewHelper::getImageLink('token_delete.png', null, $clang->gT("Delete token entry"), null, 'imagelink btnDelete', $attribs);
}
if (strtolower($token['emailstatus']) == 'ok' && $token['email'] && $bTokenUpdatePermission) {
if ($token['completed'] == 'N' && $token['usesleft'] > 0) {
if ($token['sent'] == 'N') {
$action .= viewHelper::getImageLink('token_invite.png', "admin/tokens/sa/email/surveyid/{$iSurveyId}/tokenids/" . $token['tid'], $clang->gT("Send invitation email to this person (if they have not yet been sent an invitation email)"), "_blank");
} else {
$action .= viewHelper::getImageLink('token_remind.png', "admin/tokens/sa/email/action/remind/surveyid/{$iSurveyId}/tokenids/" . $token['tid'], $clang->gT("Send reminder email to this person (if they have already received the invitation email)"), "_blank");
}
} else {
$action .= '<div style="width: 20px; height: 16px; float: left;"></div>';
}
} else {
$action .= '<div style="width: 20px; height: 16px; float: left;"></div>';
}
if($bTokenUpdatePermission)
$action .= viewHelper::getImageLink('edit_16.png', null, $clang->gT("Edit token entry"), null, 'imagelink token_edit');
if(!empty($token['participant_id']) && $token['participant_id'] != "" && $bGlobalPanelReadPermission) {
$action .= viewHelper::getImageLink('cpdb_16.png', null, $clang->gT("View this person in the central participants database"), null, 'imagelink cpdb',array('onclick'=>"sendPost('".$this->getController()->createUrl('admin/participants/sa/displayParticipants')."','',['searchcondition'],['participant_id||equal||{$token['participant_id']}']);"));
} else {
$action .= '<div style="width: 20px; height: 16px; float: left;"></div>';
}
$action .= '</div>';
$aRowToAdd['cell'] = array($token['tid'], $action, $token['firstname'], $token['lastname'], $token['email'], $token['emailstatus'], $token['token'], $token['language'], $token['sent'], $token['remindersent'], $token['remindercount'], $token['completed'], $token['usesleft'], $token['validfrom'], $token['validuntil']);
foreach ($attributes as $attribute) {
$aRowToAdd['cell'][] = $token[$attribute];
}
$aData->rows[] = $aRowToAdd;
}
viewHelper::disableHtmlLogging();
header("Content-type: application/json");
echo ls_json_encode($aData);
}
function getSearch_json($iSurveyId)
{
$searchcondition = Yii::app()->request->getQuery('search');
$searchcondition = urldecode($searchcondition);
$finalcondition = array();
$condition = explode("||", $searchcondition);
return $this->getTokens_json($iSurveyId, $condition);
}
/**
* Called by jqGrid if a token is saved after editing
*
* @param mixed $iSurveyId The Survey ID
*/
function editToken($iSurveyId)
{
$clang = $this->getController()->lang;
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update') && !Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'create'))
{
$clang->eT("We are sorry but you don't have permissions to do this.");// return json ? error not treated in js.
return;
}
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
self::_newtokentable($iSurveyId);
}
$sOperation = Yii::app()->request->getPost('oper');
if (trim(Yii::app()->request->getPost('validfrom')) == '')
$from = null;
else
$from = date('Y-m-d H:i:s', strtotime(trim($_POST['validfrom'])));
if (trim(Yii::app()->request->getPost('validuntil')) == '')
$until = null;
else
$until = date('Y-m-d H:i:s', strtotime(trim($_POST['validuntil'])));
// if edit it will update the row
if ($sOperation == 'edit' && Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update'))
{
// if (Yii::app()->request->getPost('language') == '')
// {
// $sLang = Yii::app()->session['adminlang'];
// }
// else
// {
// $sLang = Yii::app()->request->getPost('language');
// }
echo $from . ',' . $until;
$aData = array(
'firstname' => Yii::app()->request->getPost('firstname'),
'lastname' => Yii::app()->request->getPost('lastname'),
'email' => Yii::app()->request->getPost('email'),
'emailstatus' => Yii::app()->request->getPost('emailstatus'),
'token' => Yii::app()->request->getPost('token'),
'language' => Yii::app()->request->getPost('language'),
'sent' => Yii::app()->request->getPost('sent'),
'remindersent' => Yii::app()->request->getPost('remindersent'),
'remindercount' => Yii::app()->request->getPost('remindercount'),
'completed' => Yii::app()->request->getPost('completed'),
'usesleft' => Yii::app()->request->getPost('usesleft'),
'validfrom' => $from,
'validuntil' => $until);
$attrfieldnames = GetParticipantAttributes($iSurveyId);
foreach ($attrfieldnames as $attr_name => $desc)
{
$value = Yii::app()->request->getPost($attr_name);
if ($desc['mandatory'] == 'Y' && trim($value) == '')
$this->getController()->error(sprintf($this->controller->lang->gT('%s cannot be left empty'), $desc['description']));
$aData[$attr_name] = Yii::app()->request->getPost($attr_name);
}
$token = Token::model($iSurveyId)->find('tid=' . Yii::app()->getRequest()->getPost('id'));
foreach ($aData as $k => $v)
$token->$k = $v;
echo $token->update();
}
// if add it will insert a new row
elseif ($sOperation == 'add' && Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'create'))
{
if (Yii::app()->request->getPost('language') == '')
$aData = array('firstname' => Yii::app()->request->getPost('firstname'),
'lastname' => Yii::app()->request->getPost('lastname'),
'email' => Yii::app()->request->getPost('email'),
'emailstatus' => Yii::app()->request->getPost('emailstatus'),
'token' => Yii::app()->request->getPost('token'),
'language' => Yii::app()->request->getPost('language'),
'sent' => Yii::app()->request->getPost('sent'),
'remindersent' => Yii::app()->request->getPost('remindersent'),
'remindercount' => Yii::app()->request->getPost('remindercount'),
'completed' => Yii::app()->request->getPost('completed'),
'usesleft' => Yii::app()->request->getPost('usesleft'),
'validfrom' => $from,
'validuntil' => $until);
$attrfieldnames = Survey::model()->findByPk($iSurveyId)->tokenAttributes;
foreach ($attrfieldnames as $attr_name => $desc)
{
$value = Yii::app()->request->getPost($attr_name);
if ($desc['mandatory'] == 'Y' && trim($value) == '')
$this->getController()->error(sprintf($clang->gT('%s cannot be left empty'), $desc['description']));
$aData[$attr_name] = Yii::app()->request->getPost($attr_name);
}
$token = Token::create($surveyId);
$token->setAttributes($aData, false);
echo $token->save();
}
elseif ($sOperation == 'del' && Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update'))
{
$_POST['tid'] = Yii::app()->request->getPost('id');
$this->delete($iSurveyId);
}
else
{
$clang->eT("We are sorry but you don't have permissions to do this.");// return json ? error not treated in js.
return;
}
}
/**
* Add new token form
*/
function addnew($iSurveyId)
{
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$iSurveyId = sanitize_int($iSurveyId);
$clang = $this->getController()->lang;
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'create'))
{
Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page.");
$this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
}
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
self::_newtokentable($iSurveyId);
}
Yii::app()->loadHelper("surveytranslator");
$dateformatdetails = getDateFormatData(Yii::app()->session['dateformat']);
if (Yii::app()->request->getPost('subaction') == 'inserttoken')
{
Yii::import('application.libraries.Date_Time_Converter');
//Fix up dates and match to database format
if (trim(Yii::app()->request->getPost('validfrom')) == '')
{
$validfrom = null;
}
else
{
$datetimeobj = new Date_Time_Converter(trim(Yii::app()->request->getPost('validfrom')), $dateformatdetails['phpdate'] . ' H:i');
$validfrom = $datetimeobj->convert('Y-m-d H:i:s');
}
if (trim(Yii::app()->request->getPost('validuntil')) == '')
{
$validuntil = null;
}
else
{
$datetimeobj = new Date_Time_Converter(trim(Yii::app()->request->getPost('validuntil')), $dateformatdetails['phpdate'] . ' H:i');
$validuntil = $datetimeobj->convert('Y-m-d H:i:s');
}
$sanitizedtoken = sanitize_token(Yii::app()->request->getPost('token'));
/* Mdekker: commented out this block as it doesn't respect tokenlength
* or existing tokens and was always handled by the tokenify action as
* the ui still suggests
if (empty($sanitizedtoken))
{
$isvalidtoken = false;
while ($isvalidtoken == false)
{
$newtoken = randomChars(15);
if (!isset($existingtokens[$newtoken]))
{
$isvalidtoken = true;
$existingtokens[$newtoken] = null;
}
}
$sanitizedtoken = $newtoken;
}
*/
$aData = array(
'firstname' => Yii::app()->request->getPost('firstname'),
'lastname' => Yii::app()->request->getPost('lastname'),
'email' => Yii::app()->request->getPost('email'),
'emailstatus' => Yii::app()->request->getPost('emailstatus'),
'token' => $sanitizedtoken,
'language' => sanitize_languagecode(Yii::app()->request->getPost('language')),
'sent' => Yii::app()->request->getPost('sent'),
'remindersent' => Yii::app()->request->getPost('remindersent'),
'completed' => Yii::app()->request->getPost('completed'),
'usesleft' => Yii::app()->request->getPost('usesleft'),
'validfrom' => $validfrom,
'validuntil' => $validuntil,
);
// add attributes
$attrfieldnames = Survey::model()->findByPk($iSurveyId)->tokenAttributes;
$aTokenFieldNames=Yii::app()->db->getSchema()->getTable("{{tokens_$iSurveyId}}",true);
$aTokenFieldNames=array_keys($aTokenFieldNames->columns);
foreach ($attrfieldnames as $attr_name => $desc)
{
if(!in_array($attr_name,$aTokenFieldNames)) continue;
$value = Yii::app()->getRequest()->getPost($attr_name);
if ($desc['mandatory'] == 'Y' && trim($value) == '')
$this->getController()->error(sprintf($clang->gT('%s cannot be left empty'), $desc['description']));
$aData[$attr_name] = Yii::app()->getRequest()->getPost($attr_name);
}
$udresult = Token::model($iSurveyId)->findAll("token <> '' and token = '$sanitizedtoken'");
if (count($udresult) == 0)
{
// AutoExecute
$token = Token::create($iSurveyId);
$token->setAttributes($aData, false);
$inresult = $token->save();
$aData['success'] = true;
}
else
{
$aData['success'] = false;
}
$aData['thissurvey'] = getSurveyInfo($iSurveyId);
$aData['surveyid'] = $iSurveyId;
$this->_renderWrappedTemplate('token', array('tokenbar', 'addtokenpost'), $aData);
}
else
{
self::_handletokenform($iSurveyId, "addnew");
}
}
/**
* Edit Tokens
*/
function edit($iSurveyId, $iTokenId)
{
$clang = $this->getController()->lang;
$iSurveyId = sanitize_int($iSurveyId);
$iTokenId = sanitize_int($iTokenId);
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update'))
{
Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page.");
$this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
}
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
self::_newtokentable($iSurveyId);
}
Yii::app()->loadHelper("surveytranslator");
$dateformatdetails = getDateFormatData(Yii::app()->session['dateformat']);
if (Yii::app()->request->getPost('subaction'))
{
Yii::import('application.libraries.Date_Time_Converter', true);
if (trim(Yii::app()->request->getPost('validfrom')) == '')
{
$_POST['validfrom'] = null;
}
else
{
$datetimeobj = new Date_Time_Converter(trim(Yii::app()->request->getPost('validfrom')), $dateformatdetails['phpdate'] . ' H:i');
$_POST['validfrom'] = $datetimeobj->convert('Y-m-d H:i:s');
}
if (trim(Yii::app()->request->getPost('validuntil')) == '')
{
$_POST['validuntil'] = null;
}
else
{
$datetimeobj = new Date_Time_Converter(trim(Yii::app()->request->getPost('validuntil')), $dateformatdetails['phpdate'] . ' H:i');
$_POST['validuntil'] = $datetimeobj->convert('Y-m-d H:i:s');
}
$aData['thissurvey'] = getSurveyInfo($iSurveyId);
$aData['surveyid'] = $iSurveyId;
$aTokenData['firstname'] = Yii::app()->request->getPost('firstname');
$aTokenData['lastname'] = Yii::app()->request->getPost('lastname');
$aTokenData['email'] = Yii::app()->request->getPost('email');
$aTokenData['emailstatus'] = Yii::app()->request->getPost('emailstatus');
$santitizedtoken = sanitize_token(Yii::app()->request->getPost('token'));
$aTokenData['token'] = $santitizedtoken;
$aTokenData['language'] = sanitize_languagecode(Yii::app()->request->getPost('language'));
$aTokenData['sent'] = Yii::app()->request->getPost('sent');
$aTokenData['completed'] = Yii::app()->request->getPost('completed');
$aTokenData['usesleft'] = Yii::app()->request->getPost('usesleft');
$aTokenData['validfrom'] = Yii::app()->request->getPost('validfrom');
$aTokenData['validuntil'] = Yii::app()->request->getPost('validuntil');
$aTokenData['remindersent'] = Yii::app()->request->getPost('remindersent');
$aTokenData['remindercount'] = intval(Yii::app()->request->getPost('remindercount'));
$udresult = Token::model($iSurveyId)->findAll("tid <> '$iTokenId' and token <> '' and token = '$santitizedtoken'");
if (count($udresult) == 0)
{
//$aTokenData = array();
$attrfieldnames = $udresult[0]->survey->tokenAttributes;
foreach ($attrfieldnames as $attr_name => $desc)
{
$value = Yii::app()->request->getPost($attr_name);
if ($desc['mandatory'] == 'Y' && trim($value) == '')
$this->getController()->error(sprintf($clang->gT('%s cannot be left empty'), $desc['description']));
$aTokenData[$attr_name] = Yii::app()->request->getPost($attr_name);
}
$token = Token::model($iSurveyId)->findByPk($iTokenId);
foreach ($aTokenData as $k => $v)
$token->$k = $v;
$token->save();
$this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array(
'title' => $clang->gT("Success"),
'message' => $clang->gT("The token entry was successfully updated.") . "<br /><br />\n"
. "\t\t<input type='button' value='" . $clang->gT("Display tokens") . "' onclick=\"window.open('" . $this->getController()->createUrl("admin/tokens/sa/browse/surveyid/$iSurveyId/") . "', '_top')\" />\n"
)), $aData);
}
else
{
$this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array(
'title' => $clang->gT("Failed"),
'message' => $clang->gT("There is already an entry with that exact token in the table. The same token cannot be used in multiple entries.") . "<br /><br />\n"
. "\t\t<input type='button' value='" . $clang->gT("Show this token entry") . "' onclick=\"window.open('" . $this->getController()->createUrl("admin/tokens/sa/edit/surveyid/$iSurveyId/tokenid/$iTokenId") . "', '_top')\" />\n"
)));
}
}
else
{
$this->_handletokenform($iSurveyId, "edit", $iTokenId);
}
}
/**
* Delete tokens
*/
function delete($iSurveyID)
{
$clang = $this->getController()->lang;
$iSurveyID = sanitize_int($iSurveyID);
$sTokenIDs = Yii::app()->request->getPost('tid');
/* Check permissions */
if (!Permission::model()->hasSurveyPermission($iSurveyID, 'tokens', 'update'))
{
Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page.");
$this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyID}"));
}
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$bTokenExists = tableExists('{{tokens_' . $iSurveyID . '}}');
if (!$bTokenExists) //If no tokens table exists
{
self::_newtokentable($iSurveyID);
}
if (Permission::model()->hasSurveyPermission($iSurveyID, 'tokens', 'delete'))
{
$aTokenIds = explode(',', $sTokenIDs); //Make the tokenids string into an array
//Delete any survey_links
SurveyLink::model()->deleteTokenLink($aTokenIds, $iSurveyID);
//Then delete the tokens
Token::model($iSurveyID)->deleteByPk($aTokenIds);
}
}
/**
* Add dummy tokens form
*/
function addDummies($iSurveyId, $subaction = '')
{
$iSurveyId = sanitize_int($iSurveyId);
$clang = $this->getController()->lang;
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'create'))
{
Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page.");
$this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
}
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
self::_newtokentable($iSurveyId);
}
$this->getController()->loadHelper("surveytranslator");
if (!empty($subaction) && $subaction == 'add')
{
$this->getController()->loadLibrary('Date_Time_Converter');
$dateformatdetails = getDateFormatData(Yii::app()->session['dateformat']);
//Fix up dates and match to database format
if (trim(Yii::app()->request->getPost('validfrom')) == '')
{
$_POST['validfrom'] = null;
}
else
{
$datetimeobj = new Date_Time_Converter(trim(Yii::app()->request->getPost('validfrom')), $dateformatdetails['phpdate'] . ' H:i');
$_POST['validfrom'] = $datetimeobj->convert('Y-m-d H:i:s');
}
if (trim(Yii::app()->request->getPost('validuntil')) == '')
{
$_POST['validuntil'] = null;
}
else
{
$datetimeobj = new Date_Time_Converter(trim(Yii::app()->request->getPost('validuntil')), $dateformatdetails['phpdate'] . ' H:i');
$_POST['validuntil'] = $datetimeobj->convert('Y-m-d H:i:s');
}
$santitizedtoken = '';
$aData = array('firstname' => Yii::app()->request->getPost('firstname'),
'lastname' => Yii::app()->request->getPost('lastname'),
'email' => Yii::app()->request->getPost('email'),
'emailstatus' => 'OK',
'token' => $santitizedtoken,
'language' => sanitize_languagecode(Yii::app()->request->getPost('language')),
'sent' => 'N',
'remindersent' => 'N',
'completed' => 'N',
'usesleft' => Yii::app()->request->getPost('usesleft'),
'validfrom' => Yii::app()->request->getPost('validfrom'),
'validuntil' => Yii::app()->request->getPost('validuntil'));
// add attributes
$attrfieldnames = getTokenFieldsAndNames($iSurveyId,true);
foreach ($attrfieldnames as $attr_name => $desc)
{
$value = Yii::app()->request->getPost($attr_name);
if ($desc['mandatory'] == 'Y' && trim($value) == '')
$this->getController()->error(sprintf($clang->gT('%s cannot be left empty'), $desc['description']));
$aData[$attr_name] = Yii::app()->request->getPost($attr_name);
}
$amount = sanitize_int(Yii::app()->request->getPost('amount'));
$tokenlength = sanitize_int(Yii::app()->request->getPost('tokenlen'));
// Fill an array with all existing tokens
$existingtokens = array();
$tokenModel = Token::model($iSurveyId);
$criteria = $tokenModel->getDbCriteria();
$criteria->select = 'token';
$criteria->distinct = true;
$command = $tokenModel->getCommandBuilder()->createFindCommand($tokenModel->getTableSchema(),$criteria);
$result = $command->query();
while ($tokenRow = $result->read()) {
$existingtokens[$tokenRow['token']] = true;
}
$result->close();
$invalidtokencount=0;
$newDummyToken=0;
while ($newDummyToken < $amount && $invalidtokencount < 50)
{
$token = Token::create($iSurveyId);
$token->setAttributes($aData, false);
$token->firstname = str_replace('{TOKEN_COUNTER}', $newDummyToken, $token->firstname);
$token->lastname = str_replace('{TOKEN_COUNTER}', $newDummyToken, $token->lastname);
$token->email = str_replace('{TOKEN_COUNTER}', $newDummyToken, $token->email);
$attempts = 0;
do {
$token->token = randomChars($tokenlength);
$attempts++;
} while (isset($existingtokens[$token->token]) && $attempts < 50);
if ($attempts == 50)
{
throw new Exception('Something is wrong with your random generator.');
}
$existingtokens[$token->token] = true;
$token->save();
$newDummyToken++;
}
$aData['thissurvey'] = getSurveyInfo($iSurveyId);
$aData['surveyid'] = $iSurveyId;
if(!$invalidtokencount)
{
$aData['success'] = false;
$message=array('title' => $clang->gT("Success"),
'message' => $clang->gT("New dummy tokens were added.") . "<br /><br />\n<input type='button' value='"
. $clang->gT("Display tokens") . "' onclick=\"window.open('" . $this->getController()->createUrl("admin/tokens/sa/browse/surveyid/$iSurveyId") . "', '_top')\" />\n"
);
}
else
{
$aData['success'] = true;
$message= array(
'title' => $clang->gT("Failed"),
'message' => "<p>".sprintf($clang->gT("Only %s new dummy tokens were added after %s trials."),$newDummyToken,$invalidtokencount)
.$clang->gT("Try with a bigger token length.")."</p>"
."\n<input type='button' value='"
. $clang->gT("Display tokens") . "' onclick=\"window.open('" . $this->getController()->createUrl("admin/tokens/sa/browse/surveyid/$iSurveyId") . "', '_top')\" />\n"
);
}
$this->_renderWrappedTemplate('token', array('tokenbar','message' => $message),$aData);
}
else
{
$tokenlength = !empty(Token::model($iSurveyId)->survey->tokenlength) ? Token::model($iSurveyId)->survey->tokenlength : 15;
$thissurvey = getSurveyInfo($iSurveyId);
$aData['thissurvey'] = $thissurvey;
$aData['surveyid'] = $iSurveyId;
$aData['tokenlength'] = $tokenlength;
$aData['dateformatdetails'] = getDateFormatData(Yii::app()->session['dateformat'],$clang->langcode);
$aData['aAttributeFields']=GetParticipantAttributes($iSurveyId);
$this->_renderWrappedTemplate('token', array('tokenbar', 'dummytokenform'), $aData);
}
}
/**
* Handle managetokenattributes action
*/
function managetokenattributes($iSurveyId)
{
$clang = $this->getController()->lang;
$iSurveyId = sanitize_int($iSurveyId);
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update') && !Permission::model()->hasSurveyPermission($iSurveyID, 'surveysettings', 'update'))
{
Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page.");
$this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
}
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
self::_newtokentable($iSurveyId);
}
Yii::app()->loadHelper("surveytranslator");
$aData['thissurvey'] = getSurveyInfo($iSurveyId);
$aData['surveyid'] = $iSurveyId;
$aData['tokenfields'] = getAttributeFieldNames($iSurveyId);
$aData['tokenfielddata'] = $aData['thissurvey']['attributedescriptions'];
// Prepare token fiel list for dropDownList
$tokenfieldlist=array();
foreach($aData['tokenfields'] as $tokenfield){
if (isset($aData['tokenfielddata'][$tokenfield]))
$descrition = $aData['tokenfielddata'][$tokenfield]['description'];
else
$descrition = "";
$descrition=sprintf($clang->gT("Attribute %s (%s)"),str_replace("attribute_","",$tokenfield),$descrition);
$tokenfieldlist[]=array("id"=>$tokenfield,"descrition"=>$descrition);
}
$aData['tokenfieldlist'] = $tokenfieldlist;
$languages = array_merge((array) Survey::model()->findByPk($iSurveyId)->language, Survey::model()->findByPk($iSurveyId)->additionalLanguages);
$captions = array();
foreach ($languages as $language)
$captions[$language] = SurveyLanguageSetting::model()->findByAttributes(array('surveyls_survey_id' => $iSurveyId, 'surveyls_language' => $language))->attributeCaptions;
$aData['languages'] = $languages;
$aData['tokencaptions'] = $captions;
$aData['nrofattributes'] = 0;
$aData['examplerow'] = TokenDynamic::model($iSurveyId)->find();
$aData['aCPDBAttributes']['']=$clang->gT('(none)');
foreach (ParticipantAttributeName::model()->getCPDBAttributes() as $aCPDBAttribute)
{
$aData['aCPDBAttributes'][$aCPDBAttribute['attribute_id']]=$aCPDBAttribute['attribute_name'];
}
$this->_renderWrappedTemplate('token', array('tokenbar', 'managetokenattributes'), $aData);
}
/**
* Update token attributes
*/
function updatetokenattributes($iSurveyId)
{
$clang = $this->getController()->lang;
$iSurveyId = sanitize_int($iSurveyId);
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update') && !Permission::model()->hasSurveyPermission($iSurveyID, 'surveysettings', 'update'))
{
Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page.");
$this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
}
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
self::_newtokentable($iSurveyId);
}
$number2add = sanitize_int(Yii::app()->request->getPost('addnumber'), 1, 100);
$tokenattributefieldnames = getAttributeFieldNames($iSurveyId);
$i = 1;
for ($b = 0; $b < $number2add; $b++)
{
while (in_array('attribute_' . $i, $tokenattributefieldnames) !== false)
{
$i++;
}
$tokenattributefieldnames[] = 'attribute_' . $i;
Yii::app()->db->createCommand(Yii::app()->db->getSchema()->addColumn("{{tokens_".intval($iSurveyId)."}}", 'attribute_' . $i, 'VARCHAR(255)'))->execute();
$fields['attribute_' . $i] = array('type' => 'VARCHAR', 'constraint' => '255');
}
Yii::app()->db->schema->getTable('{{tokens_' . $iSurveyId . '}}', true); // Refresh schema cache just in case the table existed in the past
LimeExpressionManager::SetDirtyFlag(); // so that knows that token tables have changed
Yii::app()->session['flashmessage'] = sprintf($clang->gT("%s field(s) were successfully added."), $number2add);
Yii::app()->getController()->redirect(array("/admin/tokens/sa/managetokenattributes/surveyid/$iSurveyId"));
}
/**
* Delete token attributes
*/
function deletetokenattributes($iSurveyId)
{
$clang = $this->getController()->lang;
$iSurveyId = sanitize_int($iSurveyId);
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
Yii::app()->session['flashmessage'] = $clang->gT("No token table.");
$this->getController()->redirect($this->getController()->createUrl("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
}
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update') && !Permission::model()->hasSurveyPermission($iSurveyID, 'surveysettings', 'update'))
{
Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page.");
$this->getController()->redirect($this->getController()->createUrl("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
}
$aData['thissurvey'] = getSurveyInfo($iSurveyId);
$aData['surveyid'] = $iSurveyId;
$confirm=Yii::app()->request->getPost('confirm','');
$cancel=Yii::app()->request->getPost('cancel','');
$tokenfields = getAttributeFieldNames($iSurveyId);
$sAttributeToDelete=Yii::app()->request->getPost('deleteattribute','');
tracevar($sAttributeToDelete);
if(!in_array($sAttributeToDelete,$tokenfields)) $sAttributeToDelete=false;
tracevar($sAttributeToDelete);
if ($cancel=='cancel')
{
Yii::app()->getController()->redirect(Yii::app()->getController()->createUrl("/admin/tokens/sa/managetokenattributes/surveyid/$iSurveyId"));
}
elseif ($confirm!='confirm' && $sAttributeToDelete)
{
$this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array(
'title' => sprintf($clang->gT("Delete token attribute %s"),$sAttributeToDelete),
'message' => "<p>".$clang->gT("If you remove this attribute, you will lose all information.") . "</p>\n"
. CHtml::form(array("admin/tokens/sa/deletetokenattributes/surveyid/{$iSurveyId}"), 'post',array('id'=>'attributenumber'))
. CHtml::hiddenField('deleteattribute',$sAttributeToDelete)
. CHtml::hiddenField('sid',$iSurveyId)
. CHtml::htmlButton($clang->gT('Delete attribute'),array('type'=>'submit','value'=>'confirm','name'=>'confirm'))
. CHtml::htmlButton($clang->gT('Cancel'),array('type'=>'submit','value'=>'cancel','name'=>'cancel'))
. CHtml::endForm()
)), $aData);
}
elseif($sAttributeToDelete)
{
$sTableName="{{tokens_".intval($iSurveyId)."}}";
Yii::app()->db->createCommand(Yii::app()->db->getSchema()->dropColumn($sTableName, $sAttributeToDelete))->execute();
Yii::app()->db->schema->getTable($sTableName, true); // Refresh schema cache just in case the table existed in the past
LimeExpressionManager::SetDirtyFlag();
Yii::app()->session['flashmessage'] = sprintf($clang->gT("Attribute %s was deleted."), $sAttributeToDelete);
Yii::app()->getController()->redirect(Yii::app()->getController()->createUrl("/admin/tokens/sa/managetokenattributes/surveyid/$iSurveyId"));
}
else
{
Yii::app()->session['flashmessage'] = $clang->gT("The selected attribute was invalid.");
Yii::app()->getController()->redirect(Yii::app()->getController()->createUrl("/admin/tokens/sa/managetokenattributes/surveyid/$iSurveyId"));
}
}
/**
* updatetokenattributedescriptions action
*/
function updatetokenattributedescriptions($iSurveyId)
{
$clang = $this->getController()->lang;
$iSurveyId = sanitize_int($iSurveyId);
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update') && !Permission::model()->hasSurveyPermission($iSurveyID, 'surveysettings', 'update'))
{
Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page.");
$this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
}
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
self::_newtokentable($iSurveyId);
}
// find out the existing token attribute fieldnames
$tokenattributefieldnames = getAttributeFieldNames($iSurveyId);
$languages = array_merge((array) Survey::model()->findByPk($iSurveyId)->language, Survey::model()->findByPk($iSurveyId)->additionalLanguages);
$fieldcontents = array();
$captions = array();
foreach ($tokenattributefieldnames as $fieldname)
{
$fieldcontents[$fieldname] = array(
'description' => strip_tags(Yii::app()->request->getPost('description_' . $fieldname)),
'mandatory' => Yii::app()->request->getPost('mandatory_' . $fieldname) == 'Y' ? 'Y' : 'N',
'show_register' => Yii::app()->request->getPost('show_register_' . $fieldname) == 'Y' ? 'Y' : 'N',
'cpdbmap' => Yii::app()->request->getPost('cpdbmap_' . $fieldname)
);
foreach ($languages as $language)
$captions[$language][$fieldname] = $_POST["caption_{$fieldname}_$language"];
}
Survey::model()->updateByPk($iSurveyId, array('attributedescriptions' => serialize($fieldcontents)));
foreach ($languages as $language)
{
$ls = SurveyLanguageSetting::model()->findByAttributes(array('surveyls_survey_id' => $iSurveyId, 'surveyls_language' => $language));
$ls->surveyls_attributecaptions = json_encode($captions[$language]);
$ls->save();
}
$aData['thissurvey'] = getSurveyInfo($iSurveyId);
$aData['surveyid'] = $iSurveyId;
$this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array(
'title' => $clang->gT('Token attribute descriptions were successfully updated.'),
'message' => "<br /><input type='button' value='" . $clang->gT('Back to attribute field management.') . "' onclick=\"window.open('" . $this->getController()->createUrl("/admin/tokens/sa/managetokenattributes/surveyid/$iSurveyId") . "', '_top')\" />"
)), $aData);
}
/**
* Handle email action
*/
function email($iSurveyId, $tokenids = null)
{
$clang = $this->getController()->lang;
$iSurveyId = sanitize_int($iSurveyId);
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update'))
{
Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page.");
$this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
}
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
self::_newtokentable($iSurveyId);
}
$aTokenIds=$tokenids;
if (empty($tokenids))
{
$aTokenIds = Yii::app()->request->getPost('tokenids', false);
}
if (!empty($aTokenIds))
{
$aTokenIds = explode('|', $aTokenIds);
$aTokenIds = array_filter($aTokenIds);
$aTokenIds = array_map('sanitize_int', $aTokenIds);
}
$aTokenIds=array_unique(array_filter((array) $aTokenIds));
$sSubAction = Yii::app()->request->getParam('action');
$sSubAction = !in_array($sSubAction, array('email', 'remind')) ? 'email' : $sSubAction;
$bEmail = $sSubAction == 'email';
Yii::app()->loadHelper('surveytranslator');
Yii::app()->loadHelper('/admin/htmleditor');
Yii::app()->loadHelper('replacements');
$token = Token::model($iSurveyId)->find();
$aExampleRow = isset($token) ? $token->attributes : array();
$aSurveyLangs = Survey::model()->findByPk($iSurveyId)->additionalLanguages;
$sBaseLanguage = Survey::model()->findByPk($iSurveyId)->language;
array_unshift($aSurveyLangs, $sBaseLanguage);
$aTokenFields = getTokenFieldsAndNames($iSurveyId, true);
$iAttributes = 0;
$bHtml = (getEmailFormat($iSurveyId) == 'html');
$timeadjust = Yii::app()->getConfig("timeadjust");
$aData['thissurvey'] = getSurveyInfo($iSurveyId);
foreach($aSurveyLangs as $sSurveyLanguage)
{
$aData['thissurvey'][$sSurveyLanguage] = getSurveyInfo($iSurveyId, $sSurveyLanguage);
}
$aData['surveyid'] = $iSurveyId;
$aData['sSubAction'] = $sSubAction;
$aData['bEmail'] = $bEmail;
$aData['aSurveyLangs'] = $aData['surveylangs'] = $aSurveyLangs;
$aData['baselang'] = $sBaseLanguage;
$aData['tokenfields'] = array_keys($aTokenFields);
$aData['nrofattributes'] = $iAttributes;
$aData['examplerow'] = $aExampleRow;
$aData['tokenids'] = $aTokenIds;
$aData['ishtml'] = $bHtml;
$iMaxEmails = Yii::app()->getConfig('maxemails');
if (Yii::app()->request->getPost('bypassbademails') == 'Y')
{
$SQLemailstatuscondition = "emailstatus = 'OK'";
}
else
{
$SQLemailstatuscondition = "emailstatus <> 'OptOut'";
}
if (!Yii::app()->request->getPost('ok'))
{
if (empty($aData['tokenids']))
{
$aTokens = TokenDynamic::model($iSurveyId)->findUninvitedIDs($aTokenIds, 0, $bEmail, $SQLemailstatuscondition);
foreach($aTokens as $aToken)
{
$aData['tokenids'][] = $aToken;
}
}
$this->_renderWrappedTemplate('token', array('tokenbar', $sSubAction), $aData);
}
else
{
$SQLremindercountcondition = "";
$SQLreminderdelaycondition = "";
if (!$bEmail)
{
if (Yii::app()->request->getPost('maxremindercount') &&
Yii::app()->request->getPost('maxremindercount') != '' &&
intval(Yii::app()->request->getPost('maxremindercount')) != 0)
{
$SQLremindercountcondition = "remindercount < " . intval(Yii::app()->request->getPost('maxremindercount'));
}
if (Yii::app()->request->getPost('minreminderdelay') &&
Yii::app()->request->getPost('minreminderdelay') != '' &&
intval(Yii::app()->request->getPost('minreminderdelay')) != 0)
{
// Yii::app()->request->getPost('minreminderdelay') in days (86400 seconds per day)
$compareddate = dateShift(
date("Y-m-d H:i:s", time() - 86400 * intval(Yii::app()->request->getPost('minreminderdelay'))), "Y-m-d H:i", $timeadjust);
$SQLreminderdelaycondition = " ( "
. " (remindersent = 'N' AND sent < '" . $compareddate . "') "
. " OR "
. " (remindersent < '" . $compareddate . "'))";
}
}
$ctresult = TokenDynamic::model($iSurveyId)->findUninvitedIDs($aTokenIds, 0, $bEmail, $SQLemailstatuscondition, $SQLremindercountcondition, $SQLreminderdelaycondition);
$ctcount = count($ctresult);
$emresult = TokenDynamic::model($iSurveyId)->findUninvited($aTokenIds, $iMaxEmails, $bEmail, $SQLemailstatuscondition, $SQLremindercountcondition, $SQLreminderdelaycondition);
$emcount = count($emresult);
foreach ($aSurveyLangs as $language)
{
// See #08683 : this allow use of {TOKEN:ANYTHING}, directly replaced by {ANYTHING}
$sSubject[$language]=preg_replace("/{TOKEN:([A-Z0-9_]+)}/","{"."$1"."}",Yii::app()->request->getPost('subject_' . $language));
$sMessage[$language]=preg_replace("/{TOKEN:([A-Z0-9_]+)}/","{"."$1"."}",Yii::app()->request->getPost('message_' . $language));
if ($bHtml)
$sMessage[$language] = html_entity_decode($sMessage[$language], ENT_QUOTES, Yii::app()->getConfig("emailcharset"));
}
$attributes = array_keys(getTokenFieldsAndNames($iSurveyId,true));
$tokenoutput = "";
if ($emcount > 0)
{
foreach ($emresult as $emrow)
{
$to = $fieldsarray = array();
$aEmailaddresses = explode(';', $emrow['email']);
foreach ($aEmailaddresses as $sEmailaddress)
{
$to[] = ($emrow['firstname'] . " " . $emrow['lastname'] . " <{$sEmailaddress}>");
}
$fieldsarray["{EMAIL}"] = $emrow['email'];
$fieldsarray["{FIRSTNAME}"] = $emrow['firstname'];
$fieldsarray["{LASTNAME}"] = $emrow['lastname'];
$fieldsarray["{TOKEN}"] = $emrow['token'];
$fieldsarray["{LANGUAGE}"] = $emrow['language'];
foreach ($attributes as $attributefield)
{
$fieldsarray['{' . strtoupper($attributefield) . '}'] = $emrow[$attributefield];
$fieldsarray['{TOKEN:'.strtoupper($attributefield).'}']=$emrow[$attributefield];
}
$emrow['language'] = trim($emrow['language']);
$found = array_search($emrow['language'], $aSurveyLangs);
if ($emrow['language'] == '' || $found == false)
{
$emrow['language'] = $sBaseLanguage;
}
$from = Yii::app()->request->getPost('from_' . $emrow['language']);
$fieldsarray["{OPTOUTURL}"] = $this->getController()
->createAbsoluteUrl("/optout/tokens/langcode/" . trim($emrow['language']) . "/surveyid/{$iSurveyId}/token/{$emrow['token']}");
$fieldsarray["{OPTINURL}"] = $this->getController()
->createAbsoluteUrl("/optin/tokens/langcode/" . trim($emrow['language']) . "/surveyid/{$iSurveyId}/token/{$emrow['token']}");
$fieldsarray["{SURVEYURL}"] = $this->getController()
->createAbsoluteUrl("/survey/index/sid/{$iSurveyId}/token/{$emrow['token']}/lang/" . trim($emrow['language']) . "/");
foreach(array('OPTOUT', 'OPTIN', 'SURVEY') as $key)
{
$url = $fieldsarray["{{$key}URL}"];
if ($bHtml) $fieldsarray["{{$key}URL}"] = "<a href='{$url}'>" . htmlspecialchars($url) . '</a>';
if ($key == 'SURVEY')
{
$barebone_link = $url;
}
}
$customheaders = array('1' => "X-surveyid: " . $iSurveyId,
'2' => "X-tokenid: " . $fieldsarray["{TOKEN}"]);
global $maildebug;
$modsubject = Replacefields($sSubject[$emrow['language']], $fieldsarray);
$modmessage = Replacefields($sMessage[$emrow['language']], $fieldsarray);
if (isset($barebone_link))
{
$modsubject = str_replace("@@SURVEYURL@@", $barebone_link, $modsubject);
$modmessage = str_replace("@@SURVEYURL@@", $barebone_link, $modmessage);
}
if (trim($emrow['validfrom']) != '' && convertDateTimeFormat($emrow['validfrom'], 'Y-m-d H:i:s', 'U') * 1 > date('U') * 1)
{
$tokenoutput .= $emrow['tid'] . " " . ReplaceFields($clang->gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) delayed: Token is not yet valid.") . "<br />", $fieldsarray);
}
elseif (trim($emrow['validuntil']) != '' && convertDateTimeFormat($emrow['validuntil'], 'Y-m-d H:i:s', 'U') * 1 < date('U') * 1)
{
$tokenoutput .= $emrow['tid'] . " " . ReplaceFields($clang->gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) skipped: Token is not valid anymore.") . "<br />", $fieldsarray);
}
else
{
/*
* Get attachments.
*/
if ($sSubAction == 'email')
{
$sTemplate = 'invitation';
}
elseif ($sSubAction == 'remind')
{
$sTemplate = 'reminder';
}
$aRelevantAttachments = array();
if (isset($aData['thissurvey'][$emrow['language']]['attachments']))
{
$aAttachments = unserialize($aData['thissurvey'][$emrow['language']]['attachments']);
if (!empty($aAttachments))
{
if (isset($aAttachments[$sTemplate]))
{
LimeExpressionManager::singleton()->loadTokenInformation($aData['thissurvey']['sid'], $emrow['token']);
foreach ($aAttachments[$sTemplate] as $aAttachment)
{
if (LimeExpressionManager::singleton()->ProcessRelevance($aAttachment['relevance']))
{
$aRelevantAttachments[] = $aAttachment['url'];
}
}
}
}
}
/**
* Event for email handling.
* Parameter type description:
* subject rw Body of the email
* to rw Recipient(s)
* from rw Sender(s)
* type r "invitation" or "reminder"
* send w If true limesurvey will send the email. Setting this to false will cause limesurvey to assume the mail has been sent by the plugin.
* error w If set and "send" is true, log the error as failed email attempt.
* token r Raw token data.
*/
$event = new PluginEvent('beforeTokenEmail');
$event->set('type', $sTemplate);
$event->set('subject', $modsubject);
$event->set('to', $to);
$event->set('body', $modmessage);
$event->set('from', $from);
$event->set('bounce', getBounceEmail($iSurveyId));
$event->set('token', $emrow);
App()->getPluginManager()->dispatchEvent($event);
$modsubject = $event->get('subject');
$modmessage = $event->get('body');
$to = $event->get('to');
$from = $event->get('from');
if ($event->get('send', true) == false)
{
// This is some ancient global used for error reporting instead of a return value from the actual mail function..
$maildebug = $event->get('error', $maildebug);
$success = $event->get('error') == null;
}
else
{
$success = SendEmailMessage($modmessage, $modsubject, $to, $from, Yii::app()->getConfig("sitename"), $bHtml, getBounceEmail($iSurveyId), $aRelevantAttachments, $customheaders);
}
if ($success)
{
// Put date into sent
$token = Token::model($iSurveyId)->findByPk($emrow['tid']);
if ($bEmail)
{
$tokenoutput .= $clang->gT("Invitation sent to:");
$token->sent = dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()->getConfig("timeadjust"));
}
else
{
$tokenoutput .= $clang->gT("Reminder sent to:");
$token->remindersent = dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()->getConfig("timeadjust"));
$token->remindercount++;
}
$token->save();
//Update central participant survey_links
if(!empty($emrow['participant_id']))
{
$slquery = SurveyLink::model()->find('participant_id = :pid AND survey_id = :sid AND token_id = :tid',array(':pid'=>$emrow['participant_id'],':sid'=>$iSurveyId,':tid'=>$emrow['tid']));
if (!is_null($slquery))
{
$slquery->date_invited = dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()->getConfig("timeadjust"));
$slquery->save();
}
}
$tokenoutput .= "{$emrow['tid']}: {$emrow['firstname']} {$emrow['lastname']} ({$emrow['email']})<br />\n";
if (Yii::app()->getConfig("emailsmtpdebug") == 2)
{
$tokenoutput .= $maildebug;
}
} else {
$tokenoutput .= ReplaceFields($clang->gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) failed. Error Message:") . " " . $maildebug . "<br />", $fieldsarray);
}
}
unset($fieldsarray);
}
$aViewUrls = array('tokenbar', 'emailpost');
$aData['tokenoutput']=$tokenoutput;
if ($ctcount > $emcount)
{
$i = 0;
if (isset($aTokenIds))
{
while ($i < $iMaxEmails)
{
array_shift($aTokenIds);
$i++;
}
$aData['tids'] = implode('|', $aTokenIds);
}
$aData['lefttosend'] = $ctcount - $iMaxEmails;
$aViewUrls[] = 'emailwarning';
}
else
{
$aData['tokenoutput'].='<b>All emails were sent.</b>';
}
$this->_renderWrappedTemplate('token', $aViewUrls, $aData);
}
else
{
$this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array(
'title' => $clang->gT("Warning"),
'message' => $clang->gT("There were no eligible emails to send. This will be because none satisfied the criteria of:")
. "<br/>&nbsp;<ul><li>" . $clang->gT("having a valid email address") . "</li>"
. "<li>" . $clang->gT("not having been sent an invitation already") . "</li>"
. "<li>" . $clang->gT("having already completed the survey") . "</li>"
. "<li>" . $clang->gT("having a token") . "</li></ul>"
)), $aData);
}
}
}
/**
* Export Dialog
*/
function exportdialog($iSurveyId)
{
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$clang = $this->getController()->lang;
$iSurveyId = sanitize_int($iSurveyId);
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'export'))//EXPORT FEATURE SUBMITTED BY PIETERJAN HEYSE
{
Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page.");
$this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
}
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
self::_newtokentable($iSurveyId);
}
if (Yii::app()->request->getPost('submit'))
{
Yii::app()->loadHelper("export");
tokensExport($iSurveyId);
}
else
{
$aData['resultr'] = Token::model($iSurveyId)->findAll(array('select' => 'language', 'group' => 'language'));
$aData['thissurvey'] = getSurveyInfo($iSurveyId);
$aData['surveyid'] = $iSurveyId;
$this->_renderWrappedTemplate('token', array('tokenbar', 'exportdialog'), $aData);
}
}
/**
* Performs a ldap import
*
* @access public
* @param int $iSurveyId
* @return void
*/
public function importldap($iSurveyId)
{
$iSurveyId = (int) $iSurveyId;
$clang = $this->getController()->lang;
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'import'))
{
Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page.");
$this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
}
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
self::_newtokentable($iSurveyId);
}
Yii::app()->loadConfig('ldap');
Yii::app()->loadHelper('ldap');
$tokenoutput = '';
$aData['thissurvey'] = getSurveyInfo($iSurveyId);
$aData['iSurveyId'] = $aData['surveyid'] = $iSurveyId;
$aData['ldap_queries'] = Yii::app()->getConfig('ldap_queries');
if (!Yii::app()->request->getPost('submit'))
{
$this->_renderWrappedTemplate('token', array('tokenbar', 'ldapform'), $aData);
}
else
{
$filterduplicatetoken = (Yii::app()->request->getPost('filterduplicatetoken') && Yii::app()->request->getPost('filterduplicatetoken') == 'on');
$filterblankemail = (Yii::app()->request->getPost('filterblankemail') && Yii::app()->request->getPost('filterblankemail') == 'on');
$ldap_queries = Yii::app()->getConfig('ldap_queries');
$ldap_server = Yii::app()->getConfig('ldap_server');
$duplicatelist = array();
$invalidemaillist = array();
$tokenoutput .= "\t<tr><td colspan='2' height='4'><strong>"
. $clang->gT("Uploading LDAP Query") . "</strong></td></tr>\n"
. "\t<tr><td align='center'>\n";
$ldapq = Yii::app()->request->getPost('ldapQueries'); // the ldap query id
$ldap_server_id = $ldap_queries[$ldapq]['ldapServerId'];
$ldapserver = $ldap_server[$ldap_server_id]['server'];
$ldapport = $ldap_server[$ldap_server_id]['port'];
if (isset($ldap_server[$ldap_server_id]['encoding']) &&
$ldap_server[$ldap_server_id]['encoding'] != 'utf-8' &&
$ldap_server[$ldap_server_id]['encoding'] != 'UTF-8')
{
$ldapencoding = $ldap_server[$ldap_server_id]['encoding'];
}
else
{
$ldapencoding = '';
}
// define $attrlist: list of attributes to read from users' entries
$attrparams = array('firstname_attr', 'lastname_attr',
'email_attr', 'token_attr', 'language');
$aTokenAttr = getAttributeFieldNames($iSurveyId);
foreach ($aTokenAttr as $thisattrfieldname)
{
$attridx = substr($thisattrfieldname, 10); // the 'attribute_' prefix is 10 chars long
$attrparams[] = "attr" . $attridx;
}
foreach ($attrparams as $id => $attr)
{
if (array_key_exists($attr, $ldap_queries[$ldapq]) &&
$ldap_queries[$ldapq][$attr] != '')
{
$attrlist[] = $ldap_queries[$ldapq][$attr];
}
}
// Open connection to server
$ds = ldap_getCnx($ldap_server_id);
if ($ds)
{
// bind to server
$resbind = ldap_bindCnx($ds, $ldap_server_id);
if ($resbind)
{
$ResArray = array();
$resultnum = ldap_doTokenSearch($ds, $ldapq, $ResArray, $iSurveyId);
$xz = 0; // imported token count
$xv = 0; // meet minim requirement count
$xy = 0; // check for duplicates
$duplicatecount = 0; // duplicate tokens skipped count
$invalidemailcount = 0;
if ($resultnum >= 1)
{
foreach ($ResArray as $responseGroupId => $responseGroup)
{
for ($j = 0; $j < $responseGroup['count']; $j++)
{
// first let's initialize everything to ''
$myfirstname = '';
$mylastname = '';
$myemail = '';
$mylanguage = '';
$mytoken = '';
$myattrArray = array();
// The first 3 attrs MUST exist in the ldap answer
// ==> send PHP notice msg to apache logs otherwise
$meetminirequirements = true;
if (isset($responseGroup[$j][$ldap_queries[$ldapq]['firstname_attr']]) &&
isset($responseGroup[$j][$ldap_queries[$ldapq]['lastname_attr']])
)
{
// minimum requirement for ldap
// * at least a firstanme
// * at least a lastname
// * if filterblankemail is set (default): at least an email address
$myfirstname = ldap_readattr($responseGroup[$j][$ldap_queries[$ldapq]['firstname_attr']]);
$mylastname = ldap_readattr($responseGroup[$j][$ldap_queries[$ldapq]['lastname_attr']]);
if (isset($responseGroup[$j][$ldap_queries[$ldapq]['email_attr']]))
{
$myemail = ldap_readattr($responseGroup[$j][$ldap_queries[$ldapq]['email_attr']]);
$myemail = $myemail;
++$xv;
}
elseif ($filterblankemail !== true)
{
$myemail = '';
++$xv;
}
else
{
$meetminirequirements = false;
}
}
else
{
$meetminirequirements = false;
}
// The following attrs are optionnal
if (isset($responseGroup[$j][$ldap_queries[$ldapq]['token_attr']]))
$mytoken = ldap_readattr($responseGroup[$j][$ldap_queries[$ldapq]['token_attr']]);
foreach ($aTokenAttr as $thisattrfieldname)
{
$attridx = substr($thisattrfieldname, 10); // the 'attribute_' prefix is 10 chars long
if (isset($ldap_queries[$ldapq]['attr' . $attridx]) &&
isset($responseGroup[$j][$ldap_queries[$ldapq]['attr' . $attridx]]))
$myattrArray[$attridx] = ldap_readattr($responseGroup[$j][$ldap_queries[$ldapq]['attr' . $attridx]]);
}
if (isset($responseGroup[$j][$ldap_queries[$ldapq]['language']]))
$mylanguage = ldap_readattr($responseGroup[$j][$ldap_queries[$ldapq]['language']]);
// In case Ldap Server encoding isn't UTF-8, let's translate
// the strings to UTF-8
if ($ldapencoding != '')
{
$myfirstname = @mb_convert_encoding($myfirstname, "UTF-8", $ldapencoding);
$mylastname = @mb_convert_encoding($mylastname, "UTF-8", $ldapencoding);
foreach ($aTokenAttr as $thisattrfieldname)
{
$attridx = substr($thisattrfieldname, 10); // the 'attribute_' prefix is 10 chars long
@mb_convert_encoding($myattrArray[$attridx], "UTF-8", $ldapencoding);
}
}
// Now check for duplicates or bad formatted email addresses
$dupfound = false;
$invalidemail = false;
if ($filterduplicatetoken)
{
$dupquery = "SELECT count(tid) from {{tokens_".intval($iSurveyId)."}} where email=:email and firstname=:firstname and lastname=:lastname";
$dupresult = Yii::app()->db->createCommand($dupquery)->bindParam(":email", $myemail, PDO::PARAM_STR)->bindParam(":firstname", $myfirstname, PDO::PARAM_STR)->bindParam(":lastname", $mylastname, PDO::PARAM_STR)->queryScalar();
if ($dupresult > 0)
{
$dupfound = true;
$duplicatelist[] = $myfirstname . " " . $mylastname . " (" . $myemail . ")";
$xy++;
}
}
if ($filterblankemail && $myemail == '')
{
$invalidemail = true;
$invalidemaillist[] = $myfirstname . " " . $mylastname . " ( )";
}
elseif ($myemail != '' && !validateEmailAddress($myemail))
{
$invalidemail = true;
$invalidemaillist[] = $myfirstname . " " . $mylastname . " (" . $myemail . ")";
}
if ($invalidemail)
{
++$invalidemailcount;
}
elseif ($dupfound)
{
++$duplicatecount;
}
elseif ($meetminirequirements === true)
{
// No issue, let's import
$iq = "INSERT INTO {{tokens_".intval($iSurveyId)."}} \n"
. "(firstname, lastname, email, emailstatus, token, language";
foreach ($aTokenAttr as $thisattrfieldname)
{
$attridx = substr($thisattrfieldname, 10); // the 'attribute_' prefix is 10 chars long
if (!empty($myattrArray[$attridx]))
{
$iq .= ", ".Yii::app()->db->quoteColumnName($thisattrfieldname);
}
}
$iq .=") \n"
. "VALUES (" . Yii::app()->db->quoteValue($myfirstname) . ", " . Yii::app()->db->quoteValue($mylastname) . ", " . Yii::app()->db->quoteValue($myemail) . ", 'OK', " . Yii::app()->db->quoteValue($mytoken) . ", " . Yii::app()->db->quoteValue($mylanguage) . "";
foreach ($aTokenAttr as $thisattrfieldname)
{
$attridx = substr($thisattrfieldname, 10); // the 'attribute_' prefix is 10 chars long
if (!empty($myattrArray[$attridx]))
{
$iq .= ", " . Yii::app()->db->quoteValue($myattrArray[$attridx]) . "";
}// dbquote_all encloses str with quotes
}
$iq .= ")";
$ir = Yii::app()->db->createCommand($iq)->execute();
if (!$ir)
$duplicatecount++;
$xz++;
// or die ("Couldn't insert line<br />\n$buffer<br />\n".htmlspecialchars($connect->ErrorMsg())."<pre style='text-align: left'>$iq</pre>\n");
}
} // End for each entry
} // End foreach responseGroup
} // End of if resnum >= 1
$aData['duplicatelist'] = $duplicatelist;
$aData['invalidemaillist'] = $invalidemaillist;
$aData['invalidemailcount'] = $invalidemailcount;
$aData['resultnum'] = $resultnum;
$aData['xv'] = $xv;
$aData['xy'] = $xy;
$aData['xz'] = $xz;
$this->_renderWrappedTemplate('token', array('tokenbar', 'ldappost'), $aData);
}
else
{
$aData['sError'] = $clang->gT("Can't bind to the LDAP directory");
$this->_renderWrappedTemplate('token', array('tokenbar', 'ldapform'), $aData);
}
@ldap_close($ds);
}
else
{
$aData['sError'] = $clang->gT("Can't connect to the LDAP directory");
$this->_renderWrappedTemplate('token', array('tokenbar', 'ldapform'), $aData);
}
}
}
/**
* import from csv
*/
function import($iSurveyId)
{
$clang = $this->getController()->lang;
$iSurveyId = (int) $iSurveyId;
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'import'))
{
Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page.");
$this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
}
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
self::_newtokentable($iSurveyId);
}
App()->getClientScript()->registerScriptFile(Yii::app()->getConfig('adminscripts') . 'tokensimport.js');
$aEncodings =aEncodingsArray();
if (Yii::app()->request->getPost('submit'))
{
if (Yii::app()->request->getPost('csvcharset') && Yii::app()->request->getPost('csvcharset')) //sanitize charset - if encoding is not found sanitize to 'auto'
{
$uploadcharset = Yii::app()->request->getPost('csvcharset');
if (!array_key_exists($uploadcharset, $aEncodings))
{
$uploadcharset = 'auto';
}
$filterduplicatetoken = (Yii::app()->request->getPost('filterduplicatetoken') && Yii::app()->request->getPost('filterduplicatetoken') == 'on');
$filterblankemail = (Yii::app()->request->getPost('filterblankemail') && Yii::app()->request->getPost('filterblankemail') == 'on');
}
$attrfieldnames = getAttributeFieldNames($iSurveyId);
$duplicatelist = array();
$invalidemaillist = array();
$invalidformatlist = array();
$firstline = array();
$sPath = Yii::app()->getConfig('tempdir');
$sFileTmpName = $_FILES['the_file']['tmp_name'];
$sFilePath = $sPath . '/' . randomChars(20);
if (!@move_uploaded_file($sFileTmpName, $sFilePath))
{
$aData['sError'] = $clang->gT("Upload file not found. Check your permissions and path ({$sFilePath}) for the upload directory");
$aData['aEncodings'] = $aEncodings;
$aData['iSurveyId'] = $aData['surveyid'] = $iSurveyId;
$aData['thissurvey'] = getSurveyInfo($iSurveyId);
$this->_renderWrappedTemplate('token', array('tokenbar', 'csvupload'), $aData);
}
else
{
$xz = 0;
$recordcount = 0;
$xv = 0;
// This allows to read file with MAC line endings too
@ini_set('auto_detect_line_endings', true);
// open it and trim the ednings
$tokenlistarray = file($sFilePath);
$sBaseLanguage = Survey::model()->findByPk($iSurveyId)->language;
if (!Yii::app()->request->getPost('filterduplicatefields') || (Yii::app()->request->getPost('filterduplicatefields') && count(Yii::app()->request->getPost('filterduplicatefields')) == 0))
{
$filterduplicatefields = array('firstname', 'lastname', 'email');
}
else
{
$filterduplicatefields = Yii::app()->request->getPost('filterduplicatefields');
}
$separator = returnGlobal('separator');
foreach ($tokenlistarray as $buffer)
{
$buffer = @mb_convert_encoding($buffer, "UTF-8", $uploadcharset);
if ($recordcount == 0)
{
// Parse first line (header) from CSV
$buffer = removeBOM($buffer);
// We alow all field except tid because this one is really not needed.
$allowedfieldnames = array('participant_id','firstname','lastname','email','emailstatus','token','language','blacklisted','sent','remindersent','remindercount','validfrom','validuntil','completed','usesleft');
$allowedfieldnames = array_merge($attrfieldnames, $allowedfieldnames);
// Some header don't have same column name
$aReplacedFields=array(
'invited'=>'sent'
);
switch ($separator)
{
case 'comma':
$separator = ',';
break;
case 'semicolon':
$separator = ';';
break;
default:
$comma = substr_count($buffer, ',');
$semicolon = substr_count($buffer, ';');
if ($semicolon > $comma)
$separator = ';'; else
$separator = ',';
}
$firstline = convertCSVRowToArray($buffer, $separator, '"');
$firstline = array_map('trim', $firstline);
$ignoredcolumns = array();
// Now check the first line for invalid fields
foreach ($firstline as $index => $fieldname)
{
$firstline[$index] = preg_replace("/(.*) <[^,]*>$/", "$1", $fieldname);
$fieldname = $firstline[$index];
if (!in_array($fieldname, $allowedfieldnames))
{
$ignoredcolumns[] = $fieldname;
}
if (array_key_exists($fieldname, $aReplacedFields))
{
$firstline[$index] = $aReplacedFields[$fieldname];
}
}
if (!in_array('firstname', $firstline) || !in_array('lastname', $firstline) || !in_array('email', $firstline))
{
$recordcount = count($tokenlistarray);
break;
}
}
else
{
$line = convertCSVRowToArray($buffer, $separator, '"');
if (count($firstline) != count($line))
{
$invalidformatlist[] = $recordcount;
$recordcount++;
continue;
}
$writearray = array_combine($firstline, $line);
//kick out ignored columns
foreach ($ignoredcolumns as $column)
{
unset($writearray[$column]);
}
$dupfound = false;
$invalidemail = false;
if ($filterduplicatetoken != false)
{
$dupquery = "SELECT count(tid) from {{tokens_".intval($iSurveyId)."}} where 1=1";
foreach ($filterduplicatefields as $field)
{
if (isset($writearray[$field]))
{
$dupquery.= " and ".Yii::app()->db->quoteColumnName($field)." = " . Yii::app()->db->quoteValue($writearray[$field]);
}
}
$dupresult = Yii::app()->db->createCommand($dupquery)->queryScalar();
if ($dupresult > 0)
{
$dupfound = true;
$duplicatelist[] = Yii::app()->db->quoteValue($writearray['firstname']) . " " . Yii::app()->db->quoteValue($writearray['lastname']) . " (" . Yii::app()->db->quoteValue($writearray['email']) . ")";
}
}
$writearray['email'] = trim($writearray['email']);
//treat blank emails
if ($filterblankemail && $writearray['email'] == '')
{
$invalidemail = true;
$invalidemaillist[] = $line[0] . " " . $line[1] . " ( )";
}
if ($writearray['email'] != '')
{
$aEmailAddresses = explode(';', $writearray['email']);
foreach ($aEmailAddresses as $sEmailaddress)
{
if (!validateEmailAddress($sEmailaddress))
{
$invalidemail = true;
$invalidemaillist[] = $line[0] . " " . $line[1] . " (" . $line[2] . ")";
}
}
}
if (isset($writearray['token']))
{
$writearray['token'] = sanitize_token($writearray['token']);
}
if (!$dupfound && !$invalidemail)
{
// unset all empty value
foreach ($writearray as $key=>$value)
{
if($writearray[$key]=="")
unset($writearray[$key]);
if (substr($value, 0, 1)=='"' && substr($value, -1)=='"')// Fix CSV quote
$value = substr($value, 1, -1);
}
// Some default value : to be moved to Token model rules in future release ?
// But think we have to accept invalid email etc ... then use specific scenario
$writearray['emailstatus']=isset($writearray['emailstatus'])?$writearray['emailstatus']:"OK";
$writearray['language']=isset($writearray['language'])?$writearray['language']:$sBaseLanguage;
$oToken = Token::create($iSurveyId);
foreach ($writearray as $key => $value)
{
//if(in_array($key,$oToken->attributes)) Not needed because we filter attributes before
$oToken->$key=$value;
}
$ir=$oToken->save();
if (!$ir)
{
$duplicatelist[] = $writearray['firstname'] . " " . $writearray['lastname'] . " (" . $writearray['email'] . ")";
}
else
{
$xz++;
}
}
$xv++;
}
$recordcount++;
}
$recordcount = $recordcount - 1;
unlink($sFilePath);
$aData['tokenlistarray'] = $tokenlistarray;
$aData['xz'] = $xz;
$aData['xv'] = $xv;
$aData['recordcount'] = $recordcount;
$aData['firstline'] = $firstline;
$aData['duplicatelist'] = $duplicatelist;
$aData['invalidformatlist'] = $invalidformatlist;
$aData['invalidemaillist'] = $invalidemaillist;
$aData['thissurvey'] = getSurveyInfo($iSurveyId);
$aData['iSurveyId'] = $aData['surveyid'] = $iSurveyId;
$this->_renderWrappedTemplate('token', array('tokenbar', 'csvpost'), $aData);
}
}
else
{
$aData['aEncodings'] = $aEncodings;
$aData['iSurveyId'] = $iSurveyId;
$aData['thissurvey'] = getSurveyInfo($iSurveyId);
$aData['surveyid'] = $iSurveyId;
$aTokenTableFields = getTokenFieldsAndNames($iSurveyId);
unset($aTokenTableFields['sent']);
unset($aTokenTableFields['remindersent']);
unset($aTokenTableFields['remindercount']);
unset($aTokenTableFields['usesleft']);
foreach ($aTokenTableFields as $sKey=>$sValue)
{
if ($sValue['description']!=$sKey)
{
$sValue['description'] .= ' - '.$sKey;
}
$aNewTokenTableFields[$sKey]= $sValue['description'];
}
$aData['aTokenTableFields'] = $aNewTokenTableFields;
$this->_renderWrappedTemplate('token', array('tokenbar', 'csvupload'), $aData);
}
}
/**
* Generate tokens
*/
function tokenify($iSurveyId)
{
$iSurveyId = sanitize_int($iSurveyId);
$clang = $this->getController()->lang;
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update'))
{
Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page.");
$this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
}
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
self::_newtokentable($iSurveyId);
}
$aData['thissurvey'] = getSurveyInfo($iSurveyId);
$aData['surveyid'] = $iSurveyId;
if (!Yii::app()->request->getParam('ok'))
{
$this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array(
'title' => $clang->gT("Create tokens"),
'message' => $clang->gT("Clicking 'Yes' will generate tokens for all those in this token list that have not been issued one. Continue?") . "<br /><br />\n"
. "<input type='submit' value='"
. $clang->gT("Yes") . "' onclick=\"" . convertGETtoPOST($this->getController()->createUrl("admin/tokens/sa/tokenify/surveyid/$iSurveyId", array('ok'=>'Y'))) . "\" />\n"
. "<input type='submit' value='"
. $clang->gT("No") . "' onclick=\"window.open('" . $this->getController()->createUrl("admin/tokens/sa/index/surveyid/$iSurveyId") . "', '_top')\" />\n"
. "<br />\n"
)), $aData);
}
else
{
//get token length from survey settings
$newtoken = TokenDynamic::model($iSurveyId)->createTokens($iSurveyId);
$newtokencount = $newtoken['0'];
$neededtokencount = $newtoken['1'];
if($neededtokencount>$newtokencount)
{
$aData['success'] = false;
$message = sprintf($clang->ngT('Only %s token has been created.','Only %s tokens have been created.',$newtokencount),$newtokencount)
.sprintf($clang->ngT('Need %s token.','Need %s tokens.',$neededtokencount),$neededtokencount);
}
else
{
$aData['success'] = true;
$message = sprintf($clang->ngT('%s token has been created.','%s tokens have been created.',$newtokencount),$newtokencount);
}
$this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array(
'title' => $clang->gT("Create tokens"),
'message' => $message
)), $aData);
}
}
/**
* Remove Token Database
*/
function kill($iSurveyId)
{
$iSurveyId = sanitize_int($iSurveyId);
$clang = $this->getController()->lang;
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'surveysettings', 'update') && !Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'delete'))
{
Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page.");
$this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
}
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
self::_newtokentable($iSurveyId);
}
$aData['thissurvey'] = getSurveyInfo($iSurveyId);
$aData['surveyid'] = $iSurveyId;
$date = date('YmdHis');
/* If there is not a $_POST value of 'ok', then ask if the user is sure they want to
delete the tokens table */
$oldtable = "tokens_$iSurveyId";
$newtable = "old_tokens_{$iSurveyId}_$date";
$newtableDisplay = Yii::app()->db->tablePrefix . $newtable;
if (!Yii::app()->request->getQuery('ok'))
{
$this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array(
'title' => $clang->gT("Delete Tokens Table"),
'message' => $clang->gT("If you delete this table tokens will no longer be required to access this survey.") . "<br />" . $clang->gT("A backup of this table will be made if you proceed. Your system administrator will be able to access this table.") . "<br />\n"
. sprintf('("%s")<br /><br />', $newtableDisplay)
. "<input type='submit' value='"
. $clang->gT("Delete Tokens") . "' onclick=\"window.open('" . $this->getController()->createUrl("admin/tokens/sa/kill/surveyid/{$iSurveyId}/ok/Y") . "', '_top')\" />\n"
. "<input type='submit' value='"
. $clang->gT("Cancel") . "' onclick=\"window.open('" . $this->getController()->createUrl("admin/tokens/sa/index/surveyid/{$iSurveyId}") . "', '_top')\" />\n"
)), $aData);
}
else
/* The user has confirmed they want to delete the tokens table */
{
Yii::app()->db->createCommand()->renameTable("{{{$oldtable}}}", "{{{$newtable}}}");
//Remove any survey_links to the CPDB
SurveyLink::model()->deleteLinksBySurvey($iSurveyId);
$this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array(
'title' => $clang->gT("Delete Tokens Table"),
'message' => '<br />' . $clang->gT("The tokens table has now been removed and tokens are no longer required to access this survey.") . "<br /> " . $clang->gT("A backup of this table has been made and can be accessed by your system administrator.") . "<br />\n"
. sprintf('("%s")<br /><br />', $newtableDisplay)
. "<input type='submit' value='"
. $clang->gT("Main Admin Screen") . "' onclick=\"window.open('" . Yii::app()->getController()->createUrl("admin/survey/sa/view/surveyid/".$iSurveyId) . "', '_top')\" />"
)), $aData);
LimeExpressionManager::SetDirtyFlag(); // so that knows that token tables have changed
}
}
function bouncesettings($iSurveyId)
{
$iSurveyId = sanitize_int($iSurveyId);
$clang = $this->getController()->lang;
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'tokens', 'update'))
{
Yii::app()->session['flashmessage'] = $clang->gT("You do not have sufficient rights to access this page.");
$this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
}
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
self::_newtokentable($iSurveyId);
}
$aData['thissurvey'] = $aData['settings'] = getSurveyInfo($iSurveyId);
$aData['surveyid'] = $iSurveyId;
if (!empty($_POST))
{
$fieldvalue = array(
"bounceprocessing" => Yii::app()->request->getPost('bounceprocessing'),
"bounce_email" => Yii::app()->request->getPost('bounce_email'),
);
if (Yii::app()->request->getPost('bounceprocessing') == 'L')
{
$fieldvalue['bounceaccountencryption'] = Yii::app()->request->getPost('bounceaccountencryption');
$fieldvalue['bounceaccountuser'] = Yii::app()->request->getPost('bounceaccountuser');
$fieldvalue['bounceaccountpass'] = Yii::app()->request->getPost('bounceaccountpass');
$fieldvalue['bounceaccounttype'] = Yii::app()->request->getPost('bounceaccounttype');
$fieldvalue['bounceaccounthost'] = Yii::app()->request->getPost('bounceaccounthost');
}
$survey = Survey::model()->findByAttributes(array('sid' => $iSurveyId));
foreach ($fieldvalue as $k => $v)
$survey->$k = $v;
$test=$survey->save();
$this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array(
'title' => $clang->gT("Bounce settings"),
'message' => $clang->gT("Bounce settings have been saved."),
'class' => 'successheader'
)), $aData);
}
else
{
App()->getClientScript()->registerScriptFile(Yii::app()->getConfig('adminscripts') . "tokenbounce.js");
$this->_renderWrappedTemplate('token', array('tokenbar', 'bounce'), $aData);
}
}
/**
* Handle token form for addnew/edit actions
*/
function _handletokenform($iSurveyId, $subaction, $iTokenId="")
{
// CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if (!$bTokenExists) //If no tokens table exists
{
self::_newtokentable($iSurveyId);
}
$clang = $this->getController()->lang;
Yii::app()->loadHelper("surveytranslator");
if ($subaction == "edit")
{
$aData['tokenid'] = $iTokenId;
$aData['tokendata'] = Token::model($iSurveyId)->findByPk($iTokenId);
}
$thissurvey = getSurveyInfo($iSurveyId);
$aAdditionalAttributeFields = $thissurvey['attributedescriptions'];
$aTokenFieldNames=Yii::app()->db->getSchema()->getTable("{{tokens_$iSurveyId}}",true);
$aTokenFieldNames=array_keys($aTokenFieldNames->columns);
$aData['attrfieldnames']=array();
foreach ($aAdditionalAttributeFields as $sField=>$aAttrData)
{
if (in_array($sField,$aTokenFieldNames))
{
if ($aAttrData['description']=='')
{
$aAttrData['description']=$sField;
}
$aData['attrfieldnames'][(string)$sField]=$aAttrData;
}
}
foreach ($aTokenFieldNames as $sTokenFieldName)
{
if (strpos($sTokenFieldName,'attribute_')===0 && (!isset($aData['attrfieldnames']) || !isset($aData['attrfieldnames'][$sTokenFieldName])))
{
$aData['attrfieldnames'][$sTokenFieldName]=array('description'=>$sTokenFieldName,'mandatory'=>'N');
}
}
$aData['thissurvey'] = $thissurvey;
$aData['surveyid'] = $iSurveyId;
$aData['subaction'] = $subaction;
$aData['dateformatdetails'] = getDateFormatData(Yii::app()->session['dateformat']);
$this->_renderWrappedTemplate('token', array('tokenbar', 'tokenform'), $aData);
}
/**
* Show dialogs and create a new tokens table
*/
function _newtokentable($iSurveyId)
{
$clang = $this->getController()->lang;
$aSurveyInfo = getSurveyInfo($iSurveyId);
if (!Permission::model()->hasSurveyPermission($iSurveyId, 'surveysettings', 'update') && !Permission::model()->hasSurveyPermission($iSurveyId, 'tokens','create'))
{
Yii::app()->session['flashmessage'] = $clang->gT("Tokens have not been initialised for this survey.");
$this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
}
$bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}');
if ($bTokenExists) //The token table already exist ?
{
Yii::app()->session['flashmessage'] = $clang->gT("Tokens already exist for this survey.");
$this->getController()->redirect(array("/admin/survey/sa/view/surveyid/{$iSurveyId}"));
}
// The user have rigth to create token, then don't test right after
Yii::import('application.helpers.admin.token_helper', true);
if (Yii::app()->request->getQuery('createtable') == "Y")
{
createTokenTable($iSurveyId);
LimeExpressionManager::SetDirtyFlag(); // LimeExpressionManager needs to know about the new token table
$this->_renderWrappedTemplate('token', array('message' =>array(
'title' => $clang->gT("Token control"),
'message' => $clang->gT("A token table has been created for this survey.") . " (\"" . Yii::app()->db->tablePrefix . "tokens_$iSurveyId\")<br /><br />\n"
. "<input type='submit' value='"
. $clang->gT("Continue") . "' onclick=\"window.open('" . $this->getController()->createUrl("admin/tokens/sa/index/surveyid/$iSurveyId") . "', '_top')\" />\n"
)));
}
/* Restore a previously deleted tokens table */
elseif (returnGlobal('restoretable') == "Y" && Yii::app()->request->getPost('oldtable'))
{
//Rebuild attributedescription value for the surveys table
$table = Yii::app()->db->schema->getTable(Yii::app()->request->getPost('oldtable'));
$fields=array_filter(array_keys($table->columns), 'filterForAttributes');
$fieldcontents = $aSurveyInfo['attributedescriptions'];
if (!is_array($fieldcontents)) $fieldcontents=array();
foreach ($fields as $fieldname)
{
$name=$fieldname;
if($fieldname[10]=='c') { //This belongs to a cpdb attribute
$cpdbattid=substr($fieldname,15);
$data=ParticipantAttributeName::model()->getAttributeName($cpdbattid, Yii::app()->session['adminlang']);
$name=$data['attribute_name'];
}
if (!isset($fieldcontents[$fieldname]))
{
$fieldcontents[$fieldname] = array(
'description' => $name,
'mandatory' => 'N',
'show_register' => 'N'
);
}
}
Survey::model()->updateByPk($iSurveyId, array('attributedescriptions' => serialize($fieldcontents)));
Yii::app()->db->createCommand()->renameTable(Yii::app()->request->getPost('oldtable'), Yii::app()->db->tablePrefix."tokens_".intval($iSurveyId));
Yii::app()->db->schema->getTable(Yii::app()->db->tablePrefix."tokens_".intval($iSurveyId), true); // Refresh schema cache just in case the table existed in the past
//Check that the tokens table has the required fields
TokenDynamic::model($iSurveyId)->checkColumns();
//Add any survey_links from the renamed table
SurveyLink::model()->rebuildLinksFromTokenTable($iSurveyId);
$this->_renderWrappedTemplate('token', array('message' => array(
'title' => $clang->gT("Import old tokens"),
'message' => $clang->gT("A token table has been created for this survey and the old tokens were imported.") . " (\"" . Yii::app()->db->tablePrefix . "tokens_$iSurveyId" . "\")<br /><br />\n"
. "<input type='submit' value='"
. $clang->gT("Continue") . "' onclick=\"window.open('" . $this->getController()->createUrl("admin/tokens/sa/index/surveyid/$iSurveyId") . "', '_top')\" />\n"
)));
LimeExpressionManager::SetDirtyFlag(); // so that knows that token tables have changed
}
else
{
$this->getController()->loadHelper('database');
$result = Yii::app()->db->createCommand(dbSelectTablesLike("{{old_tokens_".intval($iSurveyId)."_%}}"))->queryAll();
$tcount = count($result);
if ($tcount > 0)
{
foreach ($result as $rows)
{
$oldlist[] = reset($rows);
}
$aData['oldlist'] = $oldlist;
}
$thissurvey = getSurveyInfo($iSurveyId);
$aData['thissurvey'] = $thissurvey;
$aData['surveyid'] = $iSurveyId;
$aData['tcount'] = $tcount;
$aData['databasetype'] = Yii::app()->db->getDriverName();
$this->_renderWrappedTemplate('token', 'tokenwarning', $aData);
}
}
/**
* Renders template(s) wrapped in header and footer
*
* @param string $sAction Current action, the folder to fetch views from
* @param string|array $aViewUrls View url(s)
* @param array $aData Data to be passed on. Optional.
*/
protected function _renderWrappedTemplate($sAction = 'token', $aViewUrls = array(), $aData = array())
{
$aData['imageurl'] = Yii::app()->getConfig('adminimageurl');
$aData['display']['menu_bars'] = false;
parent::_renderWrappedTemplate($sAction, $aViewUrls, $aData);
}
}