function init() { global $locate; $objResponse = new xajaxResponse(); $peers = array(); if ($_SESSION['curuser']['usertype'] == 'admin') { // set all group first $group = astercrm::getAll('astercrm_accountgroup'); $objResponse->addScript("addOption('groupid',0,'" . $locate->Translate("All") . "');"); while ($group->fetchInto($row)) { $objResponse->addScript("addOption('groupid','" . $row['id'] . "','" . $row['groupname'] . "');"); } } else { // set one group $objResponse->addScript("addOption('groupid','" . $_SESSION['curuser']['groupid'] . "','" . "" . "');"); // set all account $account = astercrm::getGroupMemberListByID($_SESSION['curuser']['groupid']); $objResponse->addScript("addOption('accountid','" . "0" . "','" . "All" . "');"); while ($account->fetchInto($row)) { $objResponse->addScript("addOption('accountid','" . $row['id'] . "','" . $row['username'] . "');"); } } $objResponse->addAssign("divNav", "innerHTML", common::generateManageNav($skin, $_SESSION['curuser']['country'], $_SESSION['curuser']['language'])); $objResponse->addAssign("divCopyright", "innerHTML", common::generateCopyright($skin)); return $objResponse; }
/** * update account record * @param f array account record * @return objResponse object xajax response object */ function update($f) { global $locate, $db; $objResponse = new xajaxResponse(); $f['extension'] = strtolower($f['extension']); $f['agent'] = strtolower($f['agent']); $f['channel'] = strtolower($f['channel']); if (trim($f['username']) == '' || trim($f['password']) == '' || trim($f['extension']) == '' || trim($f['usertype']) == '' || trim($f['firstname']) == '' || trim($f['lastname']) == '') { $objResponse->addAlert($locate->Translate("obligatory_fields")); return $objResponse->getXML(); } if (trim($f['usertype']) != 'admin' && trim($f['groupid']) == '') { $objResponse->addAlert($locate->Translate("please add group first")); return $objResponse->getXML(); } $username = $f['username']; $userid = astercrm::checkValues("astercrm_account", "username", $username); if ($userid != '' && $userid != $f['id']) { $objResponse->addAlert($locate->Translate("username_repeat")); return $objResponse->getXML(); } if ($f['extensions'] == $locate->translate('extensions_input_tip')) { $f['extensions'] = ''; } if ($f['extensions'] != "") { $f['extensions'] = astercrm::dbcToSbc($f['extensions']); $myExtensions = split(",", $f['extensions']); if ($f['extensType'] != "username") { foreach ($myExtensions as $exten) { $sqlStr .= "OR extension = '{$exten}'"; } $sqlStr = ltrim($sqlStr, "OR"); $query = "SELECT username From astercrm_account WHERE {$sqlStr}"; astercrm::events($query); $res =& $db->query($query); $myExtensions = array(); while ($res->fetchInto($row)) { $myExtensions[] = $row['username']; $newextensions .= "," . $row['username']; } $f['extensions'] = ltrim($newextensions, ','); } // check the assign username if belong to this group if ($_SESSION['curuser']['usertype'] != 'admin') { $myusernames = $myExtensions; $newextensions = ""; $groupList = astercrm::getGroupMemberListByID($_SESSION['curuser']['groupid']); while ($groupList->fetchInto($groupRow)) { $memberNames[] = $groupRow['username']; } foreach ($myusernames as $myusername) { if (in_array($myusername, $memberNames)) { $newextensions .= ",{$myusername}"; } } $f['extensions'] = ltrim($newextensions, ','); } } if ($f['usertype'] == 'admin') { $f['groupid'] = 0; } // check over $respOk = Customer::updateAccountRecord($f); if ($respOk) { $html = createGrid(0, ROWSXPAGE); $objResponse->addAssign("grid", "innerHTML", $html); $objResponse->addAssign("msgZone", "innerHTML", $locate->Translate("update_rec")); $objResponse->addAssign("formDiv", "style.visibility", "hidden"); } else { $objResponse->addAssign("msgZone", "innerHTML", $locate->Translate("rec_cannot_update")); } return $objResponse->getXML(); }
function &readReportAgent($groupid, $accountid, $sdate, $edate) { global $db; $return_arr = array(); if ($_SESSION['curuser']['usertype'] == "admin") { if (($groupid == '' || $groupid == 0) && ($accountid == '' || $accountid == 0)) { $query = "SELECT COUNT(*) as recordNum, mycdr.astercrm_groupid,groupname FROM mycdr LEFT JOIN astercrm_accountgroup ON mycdr.astercrm_groupid = astercrm_accountgroup.id WHERE calldate >= '{$sdate}' AND calldate <= '{$edate}' AND mycdr.astercrm_groupid > 0 "; $query_a = "SELECT COUNT(*) as arecordNum, SUM(billsec) as seconds ,mycdr.astercrm_groupid FROM mycdr WHERE calldate >= '{$sdate}' AND calldate <= '{$edate}' AND mycdr.astercrm_groupid > 0 AND billsec > 0"; $query .= " GROUP BY mycdr.astercrm_groupid "; $query_a .= " GROUP BY mycdr.astercrm_groupid "; $all_res =& $db->query($query); $return_arr['type'] = 'grouplist'; while ($all_res->fetchinto($row)) { $return_arr[$row['astercrm_groupid']]['recordNum'] = $row['recordNum']; $return_arr[$row['astercrm_groupid']]['groupname'] = $row['groupname']; $return_arr[$row['astercrm_groupid']]['arecordNum'] = 0; $return_arr[$row['astercrm_groupid']]['seconds'] = 0; } $answer_res =& $db->query($query_a); while ($answer_res->fetchinto($arow)) { $return_arr[$arow['astercrm_groupid']]['arecordNum'] = $arow['arecordNum']; $return_arr[$arow['astercrm_groupid']]['seconds'] = $arow['seconds']; } return $return_arr; } } if (($groupid == '' || $groupid == 0) && ($accountid == '' || $accountid == 0) && $_SESSION['curuser']['usertype'] != "admin") { $groupid = $_SESSION['curuser']['groupid']; } if (is_numeric($accountid) && $accountid > 0) { $return_arr['type'] = 'agentlist'; $query = "SELECT COUNT(*) as recordNum FROM mycdr WHERE calldate >= '{$sdate}' AND calldate <= '{$edate}' "; $query_a = "SELECT COUNT(*) as arecordNum, SUM(billsec) as seconds FROM mycdr WHERE calldate >= '{$sdate}' AND calldate <= '{$edate}' AND billsec > 0"; $query .= " AND mycdr.astercrm_groupid = " . $groupid . " "; $query_a .= " AND mycdr.astercrm_groupid = " . $groupid . " "; $query .= " AND accountid=" . $accountid; $query_a .= " AND accountid=" . $accountid; $all_count =& $db->getone($query); $answer_row =& $db->getRow($query_a); $account = astercrm::getRecordById($accountid, 'astercrm_account'); $return_arr[$accountid]['recordNum'] = $all_count; $return_arr[$accountid]['username'] = $account['extension']; $return_arr[$accountid]['name'] = $account['username']; $return_arr[$accountid]['arecordNum'] = $answer_row['arecordNum']; $return_arr[$accountid]['seconds'] = $answer_row['seconds']; } else { if (is_numeric($groupid)) { if ($groupid > 0) { $return_arr['type'] = 'agentlist'; $member = astercrm::getGroupMemberListByID($groupid); while ($member->fetchinto($row)) { $extens = ''; $channels = ''; $agents = ''; $query = "SELECT COUNT(*) as recordNum FROM mycdr WHERE calldate >= '{$sdate}' AND calldate <= '{$edate}' "; $query_a = "SELECT COUNT(*) as arecordNum, SUM(billsec) as seconds FROM mycdr WHERE calldate >= '{$sdate}' AND calldate <= '{$edate}' AND billsec > 0"; $query .= " AND mycdr.astercrm_groupid = " . $groupid . " "; $query_a .= " AND mycdr.astercrm_groupid = " . $groupid . " "; $query .= " AND accountid=" . $row['id']; $query_a .= " AND accountid=" . $row['id']; $all_count =& $db->getone($query); $answer_row =& $db->getRow($query_a); $return_arr[$row['id']]['recordNum'] = $all_count; $return_arr[$row['id']]['username'] = $row['extension']; $return_arr[$row['id']]['name'] = $row['username']; $return_arr[$row['id']]['arecordNum'] = $answer_row['arecordNum']; $return_arr[$row['id']]['seconds'] = $answer_row['seconds']; } } } } return $return_arr; }
/** * function to insert data to database from excel * * @param $aFormValues (array) insert form excel if import datas to diallist $aFormValues['chkAdd'] if assign extnesion to phone numbers $aFormValues['chkAssign'] assign which extensions to phone numbers $aFormValues['assign'] import which field $aFormValues['dialListField'] * @return $objResponse * */ function submitForm($aFormValues) { global $locate, $db, $config; $objResponse = new xajaxResponse(); $order = $aFormValues['order']; //得到的排序数字,数组形式,要添加到数据库的列 $fileName = $aFormValues['hidFileName']; $tableName = $aFormValues['hidTableName']; $flag = 0; foreach ($order as $value) { //判断是否有要导入的数据 if (trim($value) != '') { $flag = 1; break; } } if ($flag != 1) { //判断是否要添加分区 if (trim($aFormValues['dialListField']) == '' && trim($aFormValues['assign']) == '') { $flag = 0; } else { $flag = 1; } } //如果没有任何选择, 就退出 if ($flag != 1) { $objResponse->addScript('init();'); return $objResponse; } //对提交的数据进行校验 $orderNum = count($order); if ($orderNum > 0) { $arrRepeat = array_count_values($order); foreach ($arrRepeat as $key => $value) { if ($key != '' && $value > 1) { //数据重复 $objResponse->addAlert($locate->Translate('field_cant_repeat')); $objResponse->addScript('init();'); return $objResponse; } } } for ($j = 0; $j < $orderNum; $j++) { if (trim($order[$j]) != '') { if (trim($order[$j]) > $aFormValues['hidMaxTableColumnNum']) { //最大值校验 $objResponse->addAlert($locate->Translate('field_overflow')); $objResponse->addScript('init();'); return $objResponse; } if (!ereg("[0-9]+", trim($order[$j]))) { //是否为数字 $objResponse->addAlert($locate->Translate('field_must_digits')); $objResponse->addScript('init();'); return $objResponse; } } } $tableStructure_source = astercrm::getTableStructure($tableName); $tableStructure = array(); foreach ($tableStructure_source as $row) { $type_arr = explode(' ', $row['flags']); if (!in_array('auto_increment', $type_arr)) { if ($row['name'] == "creby" || $row['name'] == "cretime" || $row['name'] == "groupid" || $row['name'] == "campaignid") { } else { $tableStructure[] = $row; } } } //print_r($tableStructure);exit; $filePath = $config['system']['upload_file_path'] . $fileName; //数据文件存放路径 $affectRows = 0; //计数据库影响结果变量 $x = 0; //计数变量 $date = date('Y-m-d H:i:s'); //当前时间 $groupid = $aFormValues['groupid']; $campaignid = $aFormValues['campaignid']; if ($tableName == 'diallist') { $aFormValues['chkAdd'] = '1'; foreach ($order as $key => $value) { if ($value == '0') { $aFormValues['dialListField'] = $key; break; } } //echo $aFormValues['dialListField'];exit; if (!is_numeric($aFormValues['dialListField'])) { $objResponse->addAlert($locate->Translate('must select a cloumn for dialnumer')); return $objResponse; } } if ($aFormValues['chkAdd'] != '' && $aFormValues['chkAdd'] == '1') { //是否添加到拨号列表 $dialListField = trim($aFormValues['dialListField']); //数字,得到将哪列添加到拨号列表 $dialListTime = trim($aFormValues['dialListTime']); //数字,下拉列表选择将哪列做为dialtime添加到拨号列表 $dialTimeInput = trim($aFormValues['dialtime']); //手动指定唯一的拨号时间组拨号列表 if ($aFormValues['chkAssign'] != '' && $aFormValues['chkAssign'] == '1') { //是否添加分区assign $tmpStr = trim($aFormValues['assign']); //分区,以','号分隔的字符串 if ($tmpStr != '') { $arryAssign = explode(',', $tmpStr); //判断这些分机是否在该组管理范围内 if ($_SESSION['curuser']['usertype'] != 'admin') { foreach ($arryAssign as $key => $myAssign) { if (!in_array(trim($myAssign), $_SESSION['curuser']['memberExtens'])) { //该组不包含该分机 unset($arryAssign[$key]); } } } //exit; $assignNum = count($arryAssign); //得到手动添加分区个数 //print_r($arryAssign); //print $assignNum; } else { if ($_SESSION['curuser']['usertype'] == 'admin') { $res = astercrm::getGroupMemberListByID($groupid); while ($row = $res->fetchRow()) { $arryAssign[] = $row['extension']; //$array_extension数组,存放extension数据 } $assignNum = count($arryAssign); //extension数据的个数 } else { $arryAssign = $_SESSION['curuser']['memberExtens']; $assignNum = count($arryAssign); //extension数据的个数 } } } else { $arryAssign[] = ''; $assignNum = 0; } } $x = 0; $affectRows = importResource($filePath, $order, $tableName, $tableStructure, $dialListField, $dialListTime, $date, $groupid, $dialTimeInput, $assignNum, $arryAssign, $campaignid); $tableAffectRows = $affectRows['table']; $diallistAffectRows = $affectRows['diallist']; if ($tableAffectRows < 0) { $tableAffectRows = 0; } if ($diallistAffectRows < 0) { $diallistAffectRows = 0; } $resultMsg = $tableName . ' : ' . $tableAffectRows . ' ' . $locate->Translate('records_inserted') . "<br>"; $resultMsg .= 'diallist : ' . $diallistAffectRows . ' ' . $locate->Translate('records_inserted'); //delete upload file //@ unlink($filePath); $objResponse->addAlert($locate->Translate('success')); $objResponse->addScript("document.getElementById('btnImportData').disabled = false;"); $objResponse->addAssign("divResultMsg", "innerHTML", $resultMsg); $objResponse->addScript("init();"); return $objResponse; }
/** * function to verify user data * * @param $aFormValues (array) login form data $aFormValues['username'] $aFormValues['password'] $aFormValues['locate'] * @return $objResponse * @session $_SESSION['curuser']['username'] $_SESSION['curuser']['extension'] $_SESSION['curuser']['extensions'] $_SESSION['curuser']['country'] $_SESSION['curuser']['language'] $_SESSION['curuser']['channel'] $_SESSION['curuser']['accountcode'] */ function processAccountData($aFormValues) { global $db, $locate, $config; $objResponse = new xajaxResponse(); $bError = false; $loginError = false; list($_SESSION['curuser']['country'], $_SESSION['curuser']['language']) = split("_", $aFormValues['locate']); $locate = new Localization($_SESSION['curuser']['country'], $_SESSION['curuser']['language'], 'login'); /* check whether the pear had been installed */ $pear_exists_result = class_exists('PEAR'); if (empty($pear_exists_result)) { $objResponse->addAlert($locate->Translate("Please install php pear")); return $objResponse; } if (!$bError) { //$query = "SELECT * FROM account WHERE username='******'username'] . "'"; //$res = $db->query($query); $row = astercrm::getRecordByField("username", $aFormValues['username'], "astercrm_account"); if ($row['id'] != '') { if ($row['password'] == $aFormValues['password']) { $identity = astercrm::calculateAgentOntime('login', trim($aFormValues['username'])); if ($identity) { $update = astercrm::updateAgentOnlineTime('login', date('Y-m-d H:i:s'), $row['id']); } if ($aFormValues['rememberme'] == "forever") { // set cookies for three years setcookie("username", $aFormValues['username'], time() + 94608000); setcookie("password", $aFormValues['password'], time() + 94608000); setcookie("language", $aFormValues['locate'], time() + 94608000); } else { // destroy cookies setcookie("username", "", time() - 3600); setcookie("password", "", time() - 3600); setcookie("language", "", time() - 3600); $username = ''; $password = ''; $language = 'en_US'; $checked = false; } $_SESSION = array(); $_SESSION['curuser']['username'] = trim($aFormValues['username']); $_SESSION['curuser']['extension'] = $row['extension']; $_SESSION['curuser']['usertype'] = $row['usertype']; $_SESSION['curuser']['usertype_id'] = $row['usertype_id']; $_SESSION['curuser']['accountid'] = $row['id']; $_SESSION['curuser']['accountcode'] = $row['accountcode']; $_SESSION['curuser']['agent'] = $row['agent']; $_SESSION['curuser']['callerid'] = trim($row['callerid']); $_SESSION['curuser']['update_online_interval'] = date("Y-m-d H:i:s"); // added by solo 2007-10-90 $_SESSION['curuser']['channel'] = $row['channel']; $_SESSION['curuser']['extensions'] = array(); $_SESSION['curuser']['groupid'] = $row['groupid']; $privilege = array(); if ($row['usertype_id'] > 0) { $privileges = $db->getAll("SELECT * FROM user_privileges WHERE user_type_id='" . $row['usertype_id'] . "'"); foreach ($privileges as $p) { $privilege[$p['page']][$p['action']] = 1; } } $_SESSION['curuser']['privileges'] = $privilege; if ($row['extensions'] != '') { $_SESSION['curuser']['extensions'] = split(',', $row['extensions']); } //check extensions if exists in account table foreach ($_SESSION['curuser']['extensions'] as $key => $value) { $exten_row = astercrm::getRecordByField("username", $value, "astercrm_account"); if ($exten_row['id'] == '') { unset($_SESSION['curuser']['extensions'][$key]); } } // if it's a group admin, then add all group extension to it if ($row['usertype'] == 'groupadmin' || is_array($_SESSION['curuser']['privileges']['systemstatus']) || is_array($_SESSION['curuser']['privileges']['import'])) { $_SESSION['curuser']['memberExtens'] = array(); $_SESSION['curuser']['memberNames'] = array(); $_SESSION['curuser']['memberAgents'] = array(); $groupList = astercrm::getGroupMemberListByID($row['groupid']); while ($groupList->fetchInto($groupRow)) { $_SESSION['curuser']['memberExtens'][] = $groupRow['extension']; $_SESSION['curuser']['memberNames'][] = $groupRow['username']; if ($groupRow['agent'] != '') { $_SESSION['curuser']['memberAgents'][] = $groupRow['agent']; } } } list($_SESSION['curuser']['country'], $_SESSION['curuser']['language']) = split("_", $aFormValues['locate']); // get group information $_SESSION['curuser']['group'] = astercrm::getRecordByField("groupid", $row['groupid'], "astercrm_accountgroup"); if ($row['dialinterval'] != 0) { $_SESSION['curuser']['dialinterval'] = $row['dialinterval']; } else { $row_group = astercrm::getRecordByField("groupid", $row['groupid'], "astercrm_accountgroup"); $_SESSION['curuser']['dialinterval'] = $_SESSION['curuser']['group']['agentinterval']; } if ($_SESSION['curuser']['groupid'] > 0) { $sql = "SELECT id,campaignname,queuename,queue_context,use_ext_chan FROM campaign WHERE queuename != '' AND groupid='" . $_SESSION['curuser']['groupid'] . "' AND enable= 1 ORDER BY queuename ASC"; $result =& $db->query($sql); $dataArray = array(); while ($row = $result->fetchRow()) { $dataArray[$row['id']] = $row; } $_SESSION['curuser']['campaign_queue'] = $dataArray; } /* if you dont want check manager status and show device status when user login please uncomment these three line */ //$objResponse->addAlert($locate->Translate("Login success")); // if($_SESSION['curuser']['agent'] != ''){ // $msg = $locate->Translate("choose user mode"); // $objResponse->addScript("selectmode('".$msg."')"); // return $objResponse; // } //$_SESSION['error_report'] = $config['error_report']['error_report_level']; //$objResponse->addScript('window.location.href="portal.php";'); //return $objResponse; //check AMI connection $myAsterisk = new Asterisk(); $myAsterisk->config['asmanager'] = $config['asterisk']; $res = $myAsterisk->connect(); //$html .= $locate->Translate("server_connection_test"); if ($res) { //$html .= '<font color=green>'.$locate->Translate("pass").'</font><br>'; //$html .= '<b>'.$_SESSION['curuser']['extension'].' '.$locate->Translate("device_status").'</b><br>'; //$html .= asterisk::getPeerIP($_SESSION['curuser']['extension']).'<br>'; //$html .= asterisk::getPeerStatus($_SESSION['curuser']['extension']).'<br>'; $v = $myAsterisk->Command("core show version"); $v = explode(' ', $v['data']); $version = $v['2']; $_SESSION['asterisk']['version'] = $version; $version_arr = split('\\.', $version); if ($version_arr['1'] > 4) { $_SESSION['asterisk']['paramdelimiter'] = ','; } else { $_SESSION['asterisk']['paramdelimiter'] = '|'; } } else { $_SESSION['asterisk']['paramdelimiter'] = '|'; //$html .= '<font color=red>'.$locate->Translate("no_pass").'</font>'; } $_SESSION['error_report'] = $config['error_report']['error_report_level']; //clear socket_url session to $_SESSION['socket_url_flag'] = 'yes'; $objResponse->addScript('window.location.href="portal.php";'); return $objResponse; $html .= '<input type="button" value="' . $locate->Translate("continue") . '" id="btnContinue" name="btnContinue" onclick="window.location.href=\'portal.php\';">'; $objResponse->addAssign("formDiv", "innerHTML", $html); $objResponse->addClear("titleDiv", "innerHTML"); $objResponse->addScript("xajax.\$('btnContinue').focus();"); } else { $loginError = true; } } else { $loginError = true; } if (!$loginError) { return $objResponse; } else { $objResponse->addAlert($locate->Translate("login_failed")); $objResponse->addAssign("loginButton", "value", $locate->Translate("Submit")); $objResponse->addAssign("loginButton", "disabled", false); return $objResponse; } } else { $objResponse->addAssign("loginButton", "value", $locate->Translate("Submit")); $objResponse->addAssign("loginButton", "disabled", false); } return $objResponse; }
/** * Imprime la forma para editar un nuevo registro sobre el DIV identificado por "formDiv". * * @param $id (int) Identificador del registro a ser editado. * @return $html (string) Devuelve una cadena de caracteres que contiene la forma con los datos * a extraidos de la base de datos para ser editados */ function showAccountgroupDetail($id) { global $locate, $db; $account =& Customer::getRecordByID($id, 'astercrm_accountgroup'); $contactList =& astercrm::getGroupMemberListByID($account['groupid']); $html = ' <table border="1" width="100%" class="adminlist"> <tr> <td nowrap align="left" width="45%">' . $locate->Translate("groupname") . '</td> <td align="left" width="55%">' . $account['groupname'] . '</td> </tr> <tr> <td nowrap align="left">' . $locate->Translate("incontext") . '</td> <td align="left">' . $account['incontext'] . '</td> </tr> <tr> <td nowrap align="left">' . $locate->Translate("outcontext") . '</td> <td align="left">' . $account['outcontext'] . '</td> </tr> <tr> <td nowrap align="left">' . $locate->Translate("groupid") . '</td> <td align="left">' . $account['groupid'] . '</td> </tr> <tr> <td nowrap align="left">' . $locate->Translate("force monitor") . '</td> <td align="left">' . $account['monitorforce'] . '</td> </tr> <tr> <td nowrap align="left">' . $locate->Translate("first ring") . '</td> <td align="left">' . $locate->Translate($account['firstring']) . '</td> </tr> <tr> <td nowrap align="left">' . $locate->Translate("allowloginqueue") . '</td> <td align="left">' . $locate->Translate($account['allowloginqueue']) . '</td> </tr> <tr> <td nowrap align="left">' . $locate->Translate("agent interval") . '</td> <td align="left">' . $account['agentinterval'] . '</td> </tr> <tr> <td nowrap align="left">' . $locate->Translate("clear popup") . '(s)</td> <td align="left">' . $account['clear_popup'] . '</td> </tr>'; /*<tr> <td nowrap align="left">'.$locate->Translate("pdcontext").'</td> <td align="left">'.$account['pdcontext'].'</td> </tr> <tr> <td nowrap align="left">'.$locate->Translate("pdextensions").'</td> <td align="left">'.$account['pdextension'].'</td> </tr>';*/ $html .= '<tr> <td> <a href=? onclick="if (xajax.$(\'allMember\').value==\'off\'){xajax.$(\'memberList\').style.display=\'block\';xajax.$(\'allMember\').value=\'on\'}else{xajax.$(\'memberList\').style.display=\'none\';xajax.$(\'allMember\').value=\'off\'} return false;">' . $locate->Translate("display_all_member") . '</a> <input type="hidden" id="allMember" name="allMember" value="off"> </td> </tr> </table> <table border="0" id="memberList" name="memberList" style="display:none" class="memberlist"> <tr><td colspan="4" width="100%" height="1px" ></td></tr> '; while ($contactList->fetchInto($row)) { $html .= '<tr>'; $html .= ' <td align="left"> ' . $row['username'] . ' </td> '; for ($i = 1; $i < 4; $i++) { if (!$contactList->fetchInto($row)) { $html .= '<td> </td>'; } else { $html .= ' <td align="left"> ' . $row['username'] . ' </td> '; } } $html .= '</tr>'; } $html .= ' </table>'; return $html; }