Commit 17302f41 by Tobin

Merge branch 'revert-5d8a4611' into 'production'

Revert "Merge branch 'master' into 'production'" See merge request !2
parents 5d8a4611 ffe00134
......@@ -83,7 +83,7 @@ $autoload['drivers'] = array();
|
| $autoload['helper'] = array('url', 'file');
*/
$autoload['helper'] = array('url','generals_helper','file','excel_reader_helper');
$autoload['helper'] = array('url','generals_helper','file');
/*
| -------------------------------------------------------------------
......
......@@ -75,10 +75,6 @@ $query_builder = TRUE;
$db['default'] = array(
'dsn' => '',
// 'hostname' => 'localhost',
// 'username' => 'techlabz_frank',
// 'password' => 'Golden_123',
// 'database' => 'techlabz_nemt_backend',
'hostname' => '192.168.140.123',
'username' => 'root',
'password' => 'Golden_123',
......
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Customer extends CI_Controller {
public function __construct() {
parent::__construct();
date_default_timezone_set("Asia/Kolkata");
$this->load->model('Customer_model');
if(!$this->session->userdata('logged_in')) {
redirect(base_url('Login'));
}
if($this->session->userdata['user_type'] != 1){
redirect(base_url());
}
}
public function addCustomerUser(){
$template['page'] = 'Customer/add-customer-user';
$template['page_title'] = "Add New Customer";
$template['page_desc'] = "Create New Customer Users";
$template['menu'] = "Customer Management";
$template['sub_menu'] = "Add Customer";
$this->load->view('template',$template);
}
public function listCustomerUsers(){
$template['page'] = 'Customer/list-customer-users';
$template['page_title'] = "View All Customer Users";
$template['page_desc'] = "View and Manageme All Customer Users";
$template['menu'] = "Customer Management";
$template['sub_menu'] = "View Customer";
$template['customerData'] = $this->Customer_model->getCustomer();
$this->load->view('template',$template);
}
public function createCustomer(){
$err = 0;
$errMsg = '';
$flashMsg = array('message'=>'Something went wrong, please try again..!','class'=>'error');
if(!isset($_POST) || empty($_POST)){
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Customer/addCustomerUser'));
}
if($err == 0 && (!isset($_POST['first_name']) || empty($_POST['first_name']))){
$err = 1;
$errMsg = 'Provide a First Name';
}
else if($err == 0 && (!isset($_POST['last_name']) || empty($_POST['last_name']))){
$err = 1;
$errMsg = 'Provide a Last Name';
}
else if($err == 0 && (!isset($_POST['phone']) || empty($_POST['phone']))){
$err = 1;
$errMsg = 'Provide a Phone Number';
}
else if($err == 0 && (!isset($_POST['email']) || empty($_POST['email']))){
$err = 1;
$errMsg = 'Provide an Email ID';
}
else if($err == 0 && (!isset($_POST['date_of_birth']) || empty($_POST['date_of_birth']))){
$err = 1;
$errMsg = 'Provide Date Of Birth';
}
else if($err == 0 && (!isset($_POST['address']) || empty($_POST['address']))){
$err = 1;
$errMsg = 'Provide an Address';
}
else if($err == 0 && (!isset($_FILES['profile_image']) || empty($_FILES['profile_image']))){
$err = 1;
$errMsg = 'Provide Profile Picture';
}
$_POST['age'] = '';
$_POST['profile_image'] = '';
if($err == 0){
$config = set_upload_service("assets/uploads/services");
$this->load->library('upload');
$config['file_name'] = time()."_".$_FILES['profile_image']['name'];
$this->upload->initialize($config);
if(!$this->upload->do_upload('profile_image')){
$err = 1;
$errMsg = $this->upload->display_errors();
}else{
$upload_data = $this->upload->data();
$_POST['profile_image'] = $config['upload_path']."/".$upload_data['file_name'];
}
$_POST['age'] = $this->calculateAge($_POST['date_of_birth']);
if($_POST['age'] < 0){
$err = 1;
$errMsg = 'Provide a valid date of birth';
}
}
if($err == 1){
$flashMsg['message'] = $errMsg;
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Customer/addCustomerUser'));
}
$status = $this->Customer_model->createCustomer($_POST);
if($status == 1){
$flashMsg['class'] = 'success';
$flashMsg['message'] = 'User Created';
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Customer/listCustomerUsers'));
}else if($status == 2){
$flashMsg['message'] = 'Email ID already in use.';
}else if($status == 3){
$flashMsg['message'] = 'Phone Number already in use.';
}
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Customer/addCustomerUser'));
}
public function calculateAge($birthDate = ''){
if(empty($birthDate))
return;
$birthDate = explode("/", $birthDate);
$age = (date("md", date("U", mktime(0, 0, 0, $birthDate[0], $birthDate[1], $birthDate[2]))) > date("md")
? ((date("Y") - $birthDate[2]) - 1)
: (date("Y") - $birthDate[2]));
return $age;
}
public function getCustomerData(){
$return_arr = array('status'=>'0');
if(!isset($_POST) || empty($_POST) || !isset($_POST['customer_id']) || empty($_POST['customer_id'])){
echo json_encode($return_arr);exit;
}
$customer_id = decode_param($_POST['customer_id']);
$customer_data = $this->Customer_model->getCustomer(array('customer_id'=>$customer_id));
if(!empty($customer_data)){
$return_arr['status'] = 1;
$return_arr['customer_data'] = $customer_data;
}
echo json_encode($return_arr);exit;
}
function changeStatus($customer_id = '',$status = '1'){
$flashMsg = array('message'=>'Something went wrong, please try again..!','class'=>'error');
if(empty($customer_id)){
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Customer/listCustomerUsers'));
}
$customer_id = decode_param($customer_id);
$status = $this->Customer_model->changeStatus($customer_id,$status);
if(!$status){
$this->session->set_flashdata('message',$flashMsg);
}
redirect(base_url('Customer/listCustomerUsers'));
}
function editCustomer($customer_id = ''){
$flashMsg = array('message'=>'Something went wrong, please try again..!','class'=>'error');
if(empty($customer_id)){
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Customer/listCustomerUsers'));
}
$template['page'] = 'Customer/add-customer-user';
$template['menu'] = "Customer Management";
$template['sub_menu'] = "Edit Customer";
$template['page_desc'] = "Edit Customer Details";
$template['page_title'] = "Edit Customer";
$template['customer_id'] = $customer_id;
$customer_id = decode_param($customer_id);
$template['customer_data'] = $this->Customer_model->getCustomer(array('customer_id'=>$customer_id));
$this->load->view('template',$template);
}
function updateCustomer($customer_id = ''){
$flashMsg = array('message'=>'Something went wrong, please try again..!','class'=>'error');
if(empty($customer_id)){
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Customer/listCustomerUsers'));
}
$customerIdDec = decode_param($customer_id);
$err = 0;
$errMsg = '';
if(!isset($_POST) || empty($_POST)){
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Customer/addCustomerUser'));
}
if($err == 0 && (!isset($_POST['first_name']) || empty($_POST['first_name']))){
$err = 1;
$errMsg = 'Provide a First Name';
}
else if($err == 0 && (!isset($_POST['last_name']) || empty($_POST['last_name']))){
$err = 1;
$errMsg = 'Provide a Last Name';
}
else if($err == 0 && (!isset($_POST['phone']) || empty($_POST['phone']))){
$err = 1;
$errMsg = 'Provide a Phone Number';
}
else if($err == 0 && (!isset($_POST['email']) || empty($_POST['email']))){
$err = 1;
$errMsg = 'Provide an Email ID';
}
else if($err == 0 && (!isset($_POST['date_of_birth']) || empty($_POST['date_of_birth']))){
$err = 1;
$errMsg = 'Provide Date Of Birth';
}
else if($err == 0 && (!isset($_POST['address']) || empty($_POST['address']))){
$err = 1;
$errMsg = 'Provide an Address';
}
if($err == 0){
$_POST['age'] = $this->calculateAge($_POST['date_of_birth']);
if($_POST['age'] < 0){
$err = 1;
$errMsg = 'Provide a valid date of birth';
}
}
if($err == 1){
$flashMsg['message'] = $errMsg;
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Customer/editCustomer/'.$customer_id));
}
$config = set_upload_service("assets/uploads/services");
$this->load->library('upload');
$config['file_name'] = time()."_".$_FILES['profile_image']['name'];
$this->upload->initialize($config);
if($this->upload->do_upload('profile_image')){
$upload_data = $this->upload->data();
$_POST['profile_image'] = $config['upload_path']."/".$upload_data['file_name'];
}
$status = $this->Customer_model->updateCustomer($customerIdDec,$_POST);
if($status == 1){
$flashMsg['class'] = 'success';
$flashMsg['message'] = 'User Details Updated';
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Customer/listCustomerUsers'));
}else if($status == 2){
$flashMsg['message'] = 'Email ID already in use.';
}else if($status == 3){
$flashMsg['message'] = 'Phone Number already in use.';
}
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Customer/editCustomer/'.$customer_id));
}
}
?>
\ No newline at end of file
......@@ -254,18 +254,5 @@ class Driver extends CI_Controller {
redirect(base_url('Driver/edit/'.encode_param($driver_id)));
}
function getDriverData(){
$return_arr = array('status'=>'0');
if(!isset($_POST) || empty($_POST) || !isset($_POST['driver_id']) || empty($_POST['driver_id'])){
echo json_encode($return_arr);exit;
}
$driver_id = decode_param($_POST['driver_id']);
$driver_data = $this->Driver_model->getDriver($driver_id);
if(!empty($driver_data)){
$return_arr['status'] = 1;
$return_arr['driver_data'] = $driver_data;
}
echo json_encode($return_arr);exit;
}
}
?>
\ No newline at end of file
......@@ -105,12 +105,7 @@ class Report extends CI_Controller {
if(empty($dataRow) || empty($fileName)){
return;
}
if($this->session->userdata['user_type'] != 1){
$company_id = $this->session->userdata['id'];
$this->db->query("UPDATE `company_payment_details`
SET `report_count`=report_count+1
WHERE `company_id`=".$company_id);
}
$this->db->query("UPDATE `company_payment_details` SET `report_count`=report_count+1 WHERE `company_id`=10");
//Download CSV\\
$temp_memory = fopen('php://memory', 'w');
foreach ($dataRow as $line) {
......
......@@ -7,7 +7,6 @@ class Ride extends CI_Controller {
parent::__construct();
date_default_timezone_set("Asia/Kolkata");
$this->load->model('Ride_model');
$this->load->model('Customer_model');
if(!$this->session->userdata('logged_in')) {
redirect(base_url('Login'));
......@@ -39,393 +38,80 @@ class Ride extends CI_Controller {
$this->load->view('template',$template);
}
function excelMapping(){
function import(){
$flashMsg = array('message'=>'Something went wrong, please try again..!','class'=>'error');
if(!isset($_FILES) || empty($_FILES) || !isset($_FILES['import_file']) || empty($_FILES['import_file']) ||
!isset($_POST) || empty($_POST) || !isset($_POST['broker_id']) || empty($_POST['broker_id']) ||
!isset($_POST['company_id']) || empty($_POST['company_id'])){
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Ride/import_ride'));
}
$fileType = '';
$importedFile = '';
$this->load->library('upload');
$config = set_upload_all_files("assets/uploads/upload_files");
$config['file_name'] = 'importFile'.date('dmyhis').$_FILES['import_file']['name'];
$this->upload->initialize($config);
$fileData = explode('.',$_FILES['import_file']['name']);
if($this->upload->do_upload('import_file') && !empty($fileData) &&
isset($fileData[1]) && !empty($fileData[1])){
$fileType = strtolower($fileData[1]);
$upload_data = $this->upload->data();
$importedFile = $config['upload_path']."/".$upload_data['file_name'];
} else {
$flashMsg['message'] = $this->upload->display_errors();
if(!isset($_FILES) || empty($_FILES) || !isset($_FILES['csv_file']) || empty($_FILES['csv_file']) || !isset($_POST) || empty($_POST) || !isset($_POST['broker_id']) || empty($_POST['broker_id'])|| !isset($_POST['company_id']) || empty($_POST['company_id'])){
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Ride/import_ride'));
}
$importData = '';
switch($fileType){
case 'csv':
$importData = $this->getImportDataCSV($importedFile,0);
break;
case 'xls':
case 'xlsx':
$importData = $this->getImportDataExcel($importedFile,0);
break;
}
if(empty($importData) || !isset($importData['status']) || $importData['status'] == 3 ||
$importData['status'] == 4 || ($importData['status'] == 1 && empty($importData['headerArr']))){
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Ride/import_ride'));
}
if ($importData['status'] == 2){
$flashMsg['message'] = "Please Choose a vaild file..!";
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Ride/import_ride'));
}
$template['fileType'] = $fileType;
$template['headerArr'] = $importData['headerArr'];
$template['broker_id'] = $_POST['broker_id'];
$template['company_id'] = $_POST['company_id'];
$template['import_file'] = $importedFile;
$template['page'] = 'Ride/excel_mapping';
$template['menu'] = "Excel Import Manager";
$template['sub_menu'] = "Excel Field Mapping";
$template['page_title'] = "Ride Management";
$template['page_desc'] = "Excel Field Mapping";
$this->load->view('template',$template);
}
function getImportDataCSV($importedFile = '', $headerRetFlag = 0, $headerOrder = array(), $data = array()){
$header = 0;
$insertArr = array();
$headerArr = array();
$insertData = array();
$customerPh = array();
$retData = array('status'=>0);
if($headerRetFlag == 1 && (!isset($data['broker_id']) || !isset($data['company_id']) ||
empty($data['broker_id']) || empty($data['company_id']))){
$retData['status'] = 0;
return $retData;
}
if (empty($importedFile) || !file_exists($importedFile) ||
($handle=fopen($importedFile, "r")) === FALSE) {
$retData['status'] = 2;
return $retData;
}
if($headerRetFlag == 1 && empty($headerOrder)){
$retData['status'] = 4;
return $retData;
}
$medicalIds = array();
$custInsrData = array();
if (($handle = fopen($_FILES['csv_file']['tmp_name'], "r")) !== FALSE) {
while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) {
$colCnt = 0;
$rowArr = array();
$customerId = '';
foreach($row as $col){
if($header == 0){
$col = str_replace(' ','_',$col);
$col = preg_replace('/[^A-Za-z0-9\_\/]/', '', $col);
$headerArr[] = $col;
}else{
if(isset($headerOrder[$colCnt]) && isset($headerArr[$headerOrder[$colCnt]])){
if($headerArr[$headerOrder[$colCnt]] == 'Appointment_Date'){
$col = date('d-m-Y',strtotime($col));
}
if($headerArr[$headerOrder[$colCnt]] == 'Appointment_Time'){
$last = substr($col,-2);
$col = str_replace($last,":".$last,$col);
$col = (!empty($col))?date('G:i',strtotime($col)):'';
}
$rowArr[$headerArr[$headerOrder[$colCnt]]] = $col;
} else {
if($headerArr[$colCnt] == 'Appointment_Date'){
$col = date('d-m-Y',strtotime($col));
}
if($headerArr[$colCnt] == 'Appointment_Time'){
$last = substr($col,-2);
$last = substr($col, -2);
$col = str_replace($last,":".$last,$col);
$col = (!empty($col))?date('G:i',strtotime($col)):'';
}
$rowArr[$headerArr[$colCnt]] = $col;
}
$colCnt++;
}
}
if(!empty($headerArr) && $headerRetFlag == 0){
$retData['status'] = 1;
$retData['headerArr'] = $headerArr;
return $retData;
}
if($header != 0){
if(!isset($headerOrder['0']) || !isset($headerOrder['1']) || !isset($headerOrder['2']) ||
!isset($headerOrder['4']) || !isset($headerOrder['5']) || !isset($headerOrder['7']) ||
!isset($headerOrder['8']) || !isset($headerOrder['10']) || !isset($headerOrder['11']) ||
!isset($headerOrder['12']) || !isset($headerOrder['13']) || !isset($headerOrder['14']) ||
!isset($headerOrder['22']) || !isset($headerOrder['23']) || !isset($headerOrder['28'])){
continue;
}
if(!in_array($row[$headerOrder['5']],$customerPh)){
$customerData = $this->Customer_model->getCustomer(array('phone' => $row[$headerOrder['5']]));
if(empty($customerData)){
$custData = array(
'age'=>$row[$headerOrder['4']],'phone'=>$row[$headerOrder['5']],
'last_name'=>$row[$headerOrder['1']],'first_name'=>$row[$headerOrder['2']],
'status'=>'0'
);
$customerId = $this->Customer_model->createCustomer($custData);
if(empty($customerId)){
continue;
}
} else {
$customerId = $customerData->customer_id;
}
$customerPh[$customerId] = $row[$headerOrder['5']];
} else {
$customerId = array_search($row[$headerOrder['5']],$customerPh);
}
$time = '12:00';
if(!empty($row[$headerOrder['10']])){
$last = substr($row[$headerOrder['10']], -2);
$time = str_replace($last,":".$last,$row[$headerOrder['10']]);
if(!empty($row[10])){
$last = substr($row[10], -2);
$time = str_replace($last,":".$last,$row[10]);
$time = (!empty($time))?date('G:i',strtotime($time)):'12:00';
}
$date_time = (!empty($row[8]))?date('d-m-Y',strtotime($row[$headerOrder['8']])).' '.$time:'';
$tripBidStatus = (isset($headerOrder['37']) && isset($row[$headerOrder['37']]))?
$row[$headerOrder['37']]:'';
$insertData = array(
'broker_id' => $data['broker_id'],
'company_id' => $data['company_id'],
'customer_id' => $customerId,
'age' => $row[$headerOrder['4']],
'phone' => $row[$headerOrder['5']],
'trip_no' => $row[$headerOrder['7']],
'trip_cost' => $row[$headerOrder['22']],
'trip_type' => $row[$headerOrder['14']],
'medical_no' => $row[$headerOrder['0']],
'reason_code' => $row[$headerOrder['11']],
'trip_status' => $row[$headerOrder['12']],
'vehicle_type' => $row[$headerOrder['13']],
'patient_name' => $row[$headerOrder['2']].' '.$row[$headerOrder['1']],
'drop_location' => $row[$headerOrder['28']],
'pickup_location' => $row[$headerOrder['23']],
'trip_bid_status' => $tripBidStatus,
'data' => json_encode($rowArr)
);
$insertData['appointment_time'] = strtotime($date_time);
$insertArr[] = $insertData;
}
$header = 1;
}
fclose($handle);
if(empty($insertArr)){
$retData['status'] = 3;
} else {
$retData['status'] = 1;
$retData['insertData'] = $insertArr;
}
return $retData;
}
function getImportDataExcel($importedFile = '', $headerRetFlag = 0, $headerOrder = array(), $data = array()){
$header = 0;
$insertArr = array();
$headerArr = array();
$insertData = array();
$customerPh = array();
$custData = array();
$retData = array('status'=>0);
if($headerRetFlag == 1 && (!isset($data['broker_id']) || !isset($data['company_id']) ||
empty($data['broker_id']) || empty($data['company_id']))){
$retData['status'] = 0;
return $retData;
}
if (empty($importedFile) || !file_exists($importedFile)){
$retData['status'] = 2;
return $retData;
}
$reader = new SpreadsheetReader($importedFile);
if (empty($reader) || count($reader->sheets()) < 1){
$retData['status'] = 3;
return $retData;
}
if($headerRetFlag == 1 && empty($headerOrder)){
$retData['status'] = 4;
return $retData;
}
$date_time = (!empty($row[8]))?date('d-m-Y',strtotime($row[8])).' '.$time:'';
for($i=0; $i < count($reader->sheets()); $i++){
$reader->ChangeSheet($i);
foreach ($reader as $row){
$colCnt = 0;
$rowArr = array();
$customerId = '';
foreach($row as $col){
if($header == 0){
$col = str_replace(' ','_',$col);
$col = preg_replace('/[^A-Za-z0-9\_\/]/', '', $col);
$headerArr[] = $col;
}else{
if(isset($headerOrder[$colCnt]) && isset($headerArr[$headerOrder[$colCnt]])){
if($headerArr[$headerOrder[$colCnt]] == 'Appointment_Date'){
$col = date('d-m-Y',strtotime($col));
}
if($headerArr[$headerOrder[$colCnt]] == 'Appointment_Time'){
$last = substr($col,-2);
$col = str_replace($last,":".$last,$col);
$col = (!empty($col))?date('G:i',strtotime($col)):'';
}
$rowArr[$headerArr[$headerOrder[$colCnt]]] = $col;
} else {
if($headerArr[$colCnt] == 'Appointment_Date'){
$col = date('d-m-Y',strtotime($col));
}
if($headerArr[$colCnt] == 'Appointment_Time'){
$last = substr($col,-2);
$col = str_replace($last,":".$last,$col);
$col = (!empty($col))?date('G:i',strtotime($col)):'';
}
$rowArr[$headerArr[$colCnt]] = $col;
}
$colCnt++;
}
}
if(!empty($headerArr) && $headerRetFlag == 0){
$retData['status'] = 1;
$retData['headerArr'] = $headerArr;
return $retData;
}
if($header != 0){
if(!isset($headerOrder['0']) || !isset($headerOrder['1']) || !isset($headerOrder['2']) ||
!isset($headerOrder['4']) || !isset($headerOrder['5']) || !isset($headerOrder['7']) ||
!isset($headerOrder['8']) || !isset($headerOrder['10']) || !isset($headerOrder['11']) ||
!isset($headerOrder['12']) || !isset($headerOrder['13']) || !isset($headerOrder['14']) ||
!isset($headerOrder['22']) || !isset($headerOrder['23']) || !isset($headerOrder['28'])){
continue;
}
if(!in_array($row[$headerOrder['5']],$customerPh)){
$customerData=$this->Customer_model->getCustomer(array('phone'=>$row[$headerOrder['5']]));
if(empty($customerData)){
$custData = array('age'=>$row[$headerOrder['4']],
'phone'=>$row[$headerOrder['5']],
'last_name'=>$row[$headerOrder['1']],
'first_name'=>$row[$headerOrder['2']],
'status'=>'0');
$customerId = $this->Customer_model->createCustomer($custData);
if(empty($customerId)){
continue;
}
} else {
$customerId = $customerData->customer_id;
}
$customerPh[$customerId] = $row[$headerOrder['5']];
} else {
$customerId = array_search($row[$headerOrder['5']],$customerPh);
}
$time = '12:00';
if(!empty($row[$headerOrder['10']])){
$last = substr($row[$headerOrder['10']], -2);
$time = str_replace($last,":".$last,$row[$headerOrder['10']]);
$time = (!empty($time))?date('G:i',strtotime($time)):'12:00';
}
$date_time = (!empty($row[8]))?date('d-m-Y',strtotime($row[$headerOrder['8']])).' '.$time:'';
$tripBidStatus = (isset($headerOrder['37']) && isset($row[$headerOrder['37']]))?
$row[$headerOrder['37']]:'';
$insertData = array(
'broker_id' => $data['broker_id'],
'company_id' => $data['company_id'],
'customer_id' => $customerId,
'age' => $row[$headerOrder['4']],
'phone' => $row[$headerOrder['5']],
'trip_no' => $row[$headerOrder['7']],
'trip_cost' => $row[$headerOrder['22']],
'trip_type' => $row[$headerOrder['14']],
'medical_no' => $row[$headerOrder['0']],
'reason_code' => $row[$headerOrder['11']],
'trip_status' => $row[$headerOrder['12']],
'vehicle_type' => $row[$headerOrder['13']],
'patient_name' => $row[$headerOrder['2']].' '.$row[$headerOrder['1']],
'drop_location' => $row[$headerOrder['28']],
'pickup_location' => $row[$headerOrder['23']],
'trip_bid_status' => $tripBidStatus,
'data' => json_encode($rowArr)
);
$insertData = array('company_id'=>$_POST['company_id'],'broker_id'=>$_POST['broker_id'],'medical_no'=>$row[0],'patient_name'=>$row[2].' '.$row[1],
'age'=>$row[4],'phone'=>$row[5],'trip_no'=>$row[7],'reason_code'=>$row[11],'trip_cost'=>$row[22],'pickup_location'=>$row[23],'drop_location'=>$row[28],
'trip_bid_status'=>$row[37],'trip_status'=>$row[12],'vehicle_type'=>$row[13],'trip_type'=>$row[14],
'data'=>json_encode($rowArr));
$insertData['appointment_time'] = strtotime($date_time);
$insertArr[] = $insertData;
}
$header = 1;
}
}
if(empty($insertArr)){
$retData['status'] = 3;
} else {
$retData['status'] = 1;
$retData['insertData'] = $insertArr;
}
return $retData;
$custData = $this->db->query("SELECT medical_id FROM customers WHERE medical_id='".$row[0]."' AND status <> '2'");
if(1 > $custData->num_rows() && !in_array($row[0],$medicalIds)){
$medicalIds[] = $row[0];
$custInsrData[] = array('medical_id'=>$row[0],'first_name'=>$row[2],
'last_name'=>$row[1],'date_of_birth'=>$row[3],
'age'=>$row[4],'phone'=>$row[5],'alt_phone'=>$row[6]);
}
function import(){
$flashMsg = array('message'=>'Something went wrong, please try again..!','class'=>'error');
if(!isset($_POST) || empty($_POST) ||
!isset($_POST['broker_id']) || empty($_POST['broker_id']) ||
!isset($_POST['file_type']) || empty($_POST['file_type']) ||
!isset($_POST['company_id']) || empty($_POST['company_id']) ||
!isset($_POST['import_file']) || empty($_POST['import_file']) ||
!isset($_POST['header_order']) || empty($_POST['header_order'])){
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Ride/import_ride'));
}
$data = array('broker_id'=>$_POST['broker_id'],'company_id'=>$_POST['company_id']);
switch($_POST['file_type']){
case 'csv':
$respStatus = $this->getImportDataCSV($_POST['import_file'],1,$_POST['header_order'],$data);
break;
case 'xls':
case 'xlsx':
$respStatus = $this->getImportDataExcel($_POST['import_file'],1,$_POST['header_order'],$data);
break;
$header = 1;
}
fclose($handle);
if(!empty($respStatus) && isset($respStatus['status']) && $respStatus['status'] != ''){
if($respStatus['status'] == 1){
$status = $this->Ride_model->uploadRides($respStatus['insertData']);
$status = $this->Ride_model->uploadRides($insertArr,$custInsrData);
if($status){
$flashMsg['class'] = "success";
$flashMsg['message'] = "Upload Scuccessfull";
$this->session->set_flashdata('message',$flashMsg);
unlink($_POST['import_file']);
} else {
$respStatus['status'] = '3';
}
unset($respStatus['insertData']);
redirect(base_url('Ride/view_rides'));
}
} else {
$respStatus['status'] = '0';
}else{
$flashMsg['message'] = "Please Choose a valid File";
}
echo json_encode($respStatus);exit;
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Ride/import_ride'));
}
function create_ride(){
......@@ -503,15 +189,6 @@ class Ride extends CI_Controller {
$data['Wheelchair_Flag'] = (isset($_POST['wheelchair_flag']))?1:0;
$data['Crutches_/_Walker_/_Cane_Flag'] = (isset($_POST['c_w_c_flag']))?1:0;
$data['Members_Date_of_Birth'] = $data['Members_Phone_Number'] = $data['Members_Alt_Phone'] =
$data['Trip_Number'] = $data['Pickup_Zip_Code'] = $data['Trip_Status'] = $data['Pickup_City'] =
$data['Number_of_Car_Seats_Required'] = $data['Number_of_Additional_Passengers'] = $data['Copay'] =
$data['Additional_Passengers_With_Appointments'] = $data['Trip_Mileage'] = $data['Delivery_City'] =
$data['Pickup_State'] = $data['Delivery_Zip_Code'] = $data['Delivery_Name'] = $data['Trip_Status_Date'] =
$data['Delivery_State'] = $data['Appointment_Day_of_Week'] = $data['Delivery_Phone_Number'] =
$data['Special_Needs'] = $data['Inst_\/_Directions'] = $data['Return_Time'] = $data['Trip_Bid_Status'] =
$data['Date_Trip_Bid_Status_Was_Changed'] = $data['Confirmation_Number'] = '';
$_POST['patient_name'] = $_POST['first_name'].' '.$_POST['last_name'];
$date_time = (!empty($_POST['appointment_date']))?$_POST['appointment_date']:'';
$date_time .= (!empty($_POST['appointment_time']))?' '.$_POST['appointment_time']:'';
......@@ -537,19 +214,16 @@ class Ride extends CI_Controller {
}
function view_rides(){
$this->load->model('Broker_model');
$template['page'] = 'Ride/view_rides';
$template['menu'] = "Ride Management";
$template['sub_menu'] = "View Rides";
$template['page_desc'] = "View Rides Details";
$template['broker_id'] = (isset($_POST['broker_id']))?$_POST['broker_id']:'';
$template['page_title'] = "View Rides";
$company_id = ($this->session->userdata['user_type'] != 1)?$this->session->userdata['id']:'';
$template['ride_data'] = $this->Ride_model->getRideData('',$company_id,$template['broker_id']);
$template['broker_data'] = $this->Broker_model->getBroker();
$template['ride_data'] = $this->Ride_model->getRideData('',$company_id);
$this->load->view('template',$template);
}
......@@ -611,7 +285,7 @@ class Ride extends CI_Controller {
$locData = file_get_contents("https://maps.google.com/maps/api/geocode/json?address=".
urlencode($ride_data->pickup_location).
"&sensor=false&key=".$this->session->userdata['settings']['google_api_key']);
"&sensor=false&region=$region&key=AIzaSyC9JX3BZZfx2S6GQieC_PqjuJdUbZ7_wyM");
$loc_data = json_decode($locData);
if(empty($loc_data)){
......@@ -671,123 +345,5 @@ class Ride extends CI_Controller {
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Ride/assign_driver/'.encode_param($ride_id)));
}
function changeSchuduleStatus(){
ini_set("memory_limit", "-1");
set_time_limit(0);
if(!isset($_POST) || empty($_POST) || !isset($_POST['transport_id']) || empty($_POST['transport_id']) ||
!isset($_POST['is_scheduled']) || $_POST['is_scheduled'] == ''){
echo json_encode($result);exit;
}
$ride_ids = $_POST['transport_id'];
$is_scheduled = ($_POST['is_scheduled'] == 1)?0:1;
$succArr = array();
if(is_array($ride_ids)){
foreach ($ride_ids AS $ride_id) {
$result = $this->changeScheduler($ride_id,$is_scheduled);
if($result['status'] == 1){
$succArr[] = $ride_id;
}
$result['succArr'] = $succArr;
}
} else {
$result = $this->changeScheduler($ride_ids,$is_scheduled);
if($result['status'] == 1){
$result['succArr'] = array($ride_ids);
}
}
echo json_encode($result);exit;
}
function changeScheduler($ride_id,$is_scheduled = '0'){
$result = array('status'=>'0');
if(empty($ride_id)){
return $result;
}
$status = $this->Ride_model->changeSchuduleStatus($ride_id,$is_scheduled);
if($status){
$result['status'] = 1;
if($is_scheduled == 1){
$ride_data = $this->Ride_model->getRideData($ride_id);
if(empty($ride_data)){
$result['status'] = 0;
$status = $this->Ride_model->changeSchuduleStatus($ride_id,0);
} else {
$pickup_location = $ride_data->pickup_location;
$appointment_time = $ride_data->appointment_time;
if(empty($pickup_location) || empty($appointment_time)){
$result['status'] = 0;
$status = $this->Ride_model->changeSchuduleStatus($ride_id,0);
}
$pickupLocData = $this->getLatLngFromLocation($pickup_location);
if(empty($pickupLocData)){
$result['status'] = 0;
$status = $this->Ride_model->changeSchuduleStatus($ride_id,0);
} else {
$status = $this->Ride_model->autoAssignDriver($ride_id,$appointment_time,
array('lat'=>$pickupLocData['lat'],'lng'=>$pickupLocData['lng']));
if(!$status){
$result['status'] = 0;
$status = $this->Ride_model->changeSchuduleStatus($ride_id,0);
}
}
}
}
}
return $result;
}
function getLatLngFromLocation($location = ''){
if(empty($location))
return 0;
$locData = file_get_contents("https://maps.google.com/maps/api/geocode/json?address=".
urlencode($location).
"&sensor=false&key=".$this->session->userdata['settings']['google_api_key']);
if(empty($locData))
return 0;
$loc_data = json_decode($locData);
if(empty($loc_data) || !isset($loc_data->status) || $loc_data->status != 'OK')
return 0;
$locArr['lat'] = $loc_data->{'results'}[0]->{'geometry'}->{'location'}->{'lat'};
$locArr['lng'] = $loc_data->{'results'}[0]->{'geometry'}->{'location'}->{'lng'};
if(empty($locArr['lat']) || empty($locArr['lng']))
return 0;
return $locArr;
}
function scheduled_rides(){
if($this->session->userdata['user_type'] == 1){
redirect(base_url());
}
$this->load->model('Broker_model');
$template['page'] = 'Ride/scheduled_rides';
$template['page_title'] = "Scheduled Rides";
$template['page_desc'] = "View Scheduled Ride";
$template['menu'] = "Ride Management";
$template['sub_menu'] = "View Scheduled Rides";
$condArr = array();
if(isset($_POST) && isset($_POST['search_date']) && !empty($_POST['search_date'])){
$srtDateTime = strtotime($_POST['search_date']);
$endDateTime = strtotime($_POST['search_date'].' 23:59');
$condArr[] = " AND (TD.appointment_time>'$srtDateTime' AND TD.appointment_time<'$endDateTime') ";
}
$company_id = ($this->session->userdata['user_type'] != 1)?$this->session->userdata['id']:'';
$template['ride_data'] = $this->Ride_model->getRideData('',$company_id,'',1,$condArr);
$this->load->view('template',$template);
}
}
?>
\ No newline at end of file
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Settings extends CI_Controller {
public function __construct() {
parent::__construct();
date_default_timezone_set("Asia/Kolkata");
$this->load->model('Settings_model');
$this->load->model('Dashboard_model');
if(!$this->session->userdata('logged_in')) {
redirect(base_url('Login'));
}
if($this->session->userdata['user_type'] != 1){
$flashMsg = array('message'=>'Access Denied You don\'t have permission to access this Page',
'class'=>'error');
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url());
}
}
public function index() {
$template['page'] = 'Settings/viewSettings';
$template['menu'] = "Site Settings";
$template['sub_menu'] = "Change Settings";
$template['page_desc'] = "Edit or View Settings";
$template['page_title'] = "Settings";
$template['data'] = $this->Settings_model->settings_viewing();
$this->load->view('template',$template);
}
public function change_settings(){
$flashMsg = array('message'=>'Something went wrong, please try again..!','class'=>'error');
if(!isset($_POST) || empty($_POST)){
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Settings'));
}
if(isset($_FILES['site_logo']) && !empty($_FILES['site_logo'])){
$config = set_upload_service("assets/uploads/services");
$this->load->library('upload');
$config['file_name'] = time()."_".$_FILES['site_logo']['name'];
$this->upload->initialize($config);
if($this->upload->do_upload('site_logo')){
$upload_data = $this->upload->data();
$_POST['site_logo'] = $config['upload_path']."/".$upload_data['file_name'];
}
}
if(isset($_FILES['fav_icon']) && !empty($_FILES['fav_icon'])){
$config = set_upload_service("assets/uploads/services");
$this->load->library('upload');
$config['file_name'] = time()."_".$_FILES['fav_icon']['name'];
$this->upload->initialize($config);
if($this->upload->do_upload('fav_icon')){
$upload_data = $this->upload->data();
$_POST['fav_icon'] = $config['upload_path']."/".$upload_data['file_name'];
}
}
$status = $this->Settings_model->update_settings($_POST);
if($status){
$flashMsg['class'] = 'success';
$flashMsg['message'] = 'Settings Successfully Updated..!';
$settings = $this->Settings_model->settings_viewing();
if(!empty($settings)){
$this->session->set_userdata('settings', $settings);
}
}
$this->session->set_flashdata('message',$flashMsg);
redirect(base_url('Settings'));
}
}
?>
\ No newline at end of file
<?php
/**
* Main class for spreadsheet reading
*
* @version 0.5.10
* @author Martins Pilsetnieks
*/
class SpreadsheetReader implements SeekableIterator, Countable
{
const TYPE_XLSX = 'XLSX';
const TYPE_XLS = 'XLS';
const TYPE_CSV = 'CSV';
const TYPE_ODS = 'ODS';
private $Options = array(
'Delimiter' => '',
'Enclosure' => '"'
);
/**
* @var int Current row in the file
*/
private $Index = 0;
/**
* @var SpreadsheetReader_* Handle for the reader object
*/
private $Handle = array();
/**
* @var TYPE_* Type of the contained spreadsheet
*/
private $Type = false;
/**
* @param string Path to file
* @param string Original filename (in case of an uploaded file), used to determine file type, optional
* @param string MIME type from an upload, used to determine file type, optional
*/
public function __construct($Filepath, $OriginalFilename = false, $MimeType = false)
{
if (!is_readable($Filepath))
{
throw new Exception('SpreadsheetReader: File ('.$Filepath.') not readable');
}
// To avoid timezone warnings and exceptions for formatting dates retrieved from files
$DefaultTZ = @date_default_timezone_get();
if ($DefaultTZ)
{
date_default_timezone_set($DefaultTZ);
}
// Checking the other parameters for correctness
// This should be a check for string but we're lenient
if (!empty($OriginalFilename) && !is_scalar($OriginalFilename))
{
throw new Exception('SpreadsheetReader: Original file (2nd parameter) path is not a string or a scalar value.');
}
if (!empty($MimeType) && !is_scalar($MimeType))
{
throw new Exception('SpreadsheetReader: Mime type (3nd parameter) path is not a string or a scalar value.');
}
// 1. Determine type
if (!$OriginalFilename)
{
$OriginalFilename = $Filepath;
}
$Extension = strtolower(pathinfo($OriginalFilename, PATHINFO_EXTENSION));
switch ($MimeType)
{
case 'text/csv':
case 'text/comma-separated-values':
case 'text/plain':
$this -> Type = self::TYPE_CSV;
break;
case 'application/vnd.ms-excel':
case 'application/msexcel':
case 'application/x-msexcel':
case 'application/x-ms-excel':
case 'application/vnd.ms-excel':
case 'application/x-excel':
case 'application/x-dos_ms_excel':
case 'application/xls':
case 'application/xlt':
case 'application/x-xls':
// Excel does weird stuff
if (in_array($Extension, array('csv', 'tsv', 'txt')))
{
$this -> Type = self::TYPE_CSV;
}
else
{
$this -> Type = self::TYPE_XLS;
}
break;
case 'application/vnd.oasis.opendocument.spreadsheet':
case 'application/vnd.oasis.opendocument.spreadsheet-template':
$this -> Type = self::TYPE_ODS;
break;
case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
case 'application/vnd.openxmlformats-officedocument.spreadsheetml.template':
case 'application/xlsx':
case 'application/xltx':
$this -> Type = self::TYPE_XLSX;
break;
case 'application/xml':
// Excel 2004 xml format uses this
break;
}
if (!$this -> Type)
{
switch ($Extension)
{
case 'xlsx':
case 'xltx': // XLSX template
case 'xlsm': // Macro-enabled XLSX
case 'xltm': // Macro-enabled XLSX template
$this -> Type = self::TYPE_XLSX;
break;
case 'xls':
case 'xlt':
$this -> Type = self::TYPE_XLS;
break;
case 'ods':
case 'odt':
$this -> Type = self::TYPE_ODS;
break;
default:
$this -> Type = self::TYPE_CSV;
break;
}
}
// Pre-checking XLS files, in case they are renamed CSV or XLSX files
if ($this -> Type == self::TYPE_XLS)
{
self::Load(self::TYPE_XLS);
$this -> Handle = new SpreadsheetReader_XLS($Filepath);
if ($this -> Handle -> Error)
{
$this -> Handle -> __destruct();
if (is_resource($ZipHandle = zip_open($Filepath)))
{
$this -> Type = self::TYPE_XLSX;
zip_close($ZipHandle);
}
else
{
$this -> Type = self::TYPE_CSV;
}
}
}
// 2. Create handle
switch ($this -> Type)
{
case self::TYPE_XLSX:
self::Load(self::TYPE_XLSX);
$this -> Handle = new SpreadsheetReader_XLSX($Filepath);
break;
case self::TYPE_CSV:
self::Load(self::TYPE_CSV);
$this -> Handle = new SpreadsheetReader_CSV($Filepath, $this -> Options);
break;
case self::TYPE_XLS:
// Everything already happens above
break;
case self::TYPE_ODS:
self::Load(self::TYPE_ODS);
$this -> Handle = new SpreadsheetReader_ODS($Filepath, $this -> Options);
break;
}
}
/**
* Gets information about separate sheets in the given file
*
* @return array Associative array where key is sheet index and value is sheet name
*/
public function Sheets()
{
return $this -> Handle -> Sheets();
}
/**
* Changes the current sheet to another from the file.
* Note that changing the sheet will rewind the file to the beginning, even if
* the current sheet index is provided.
*
* @param int Sheet index
*
* @return bool True if sheet could be changed to the specified one,
* false if not (for example, if incorrect index was provided.
*/
public function ChangeSheet($Index)
{
return $this -> Handle -> ChangeSheet($Index);
}
/**
* Autoloads the required class for the particular spreadsheet type
*
* @param TYPE_* Spreadsheet type, one of TYPE_* constants of this class
*/
private static function Load($Type)
{
if (!in_array($Type, array(self::TYPE_XLSX, self::TYPE_XLS, self::TYPE_CSV, self::TYPE_ODS)))
{
throw new Exception('SpreadsheetReader: Invalid type ('.$Type.')');
}
// 2nd parameter is to prevent autoloading for the class.
// If autoload works, the require line is unnecessary, if it doesn't, it ends badly.
if (!class_exists('SpreadsheetReader_'.$Type, false))
{
require(dirname(__FILE__).DIRECTORY_SEPARATOR.'SpreadsheetReader_'.$Type.'.php');
}
}
// !Iterator interface methods
/**
* Rewind the Iterator to the first element.
* Similar to the reset() function for arrays in PHP
*/
public function rewind()
{
$this -> Index = 0;
if ($this -> Handle)
{
$this -> Handle -> rewind();
}
}
/**
* Return the current element.
* Similar to the current() function for arrays in PHP
*
* @return mixed current element from the collection
*/
public function current()
{
if ($this -> Handle)
{
return $this -> Handle -> current();
}
return null;
}
/**
* Move forward to next element.
* Similar to the next() function for arrays in PHP
*/
public function next()
{
if ($this -> Handle)
{
$this -> Index++;
return $this -> Handle -> next();
}
return null;
}
/**
* Return the identifying key of the current element.
* Similar to the key() function for arrays in PHP
*
* @return mixed either an integer or a string
*/
public function key()
{
if ($this -> Handle)
{
return $this -> Handle -> key();
}
return null;
}
/**
* Check if there is a current element after calls to rewind() or next().
* Used to check if we've iterated to the end of the collection
*
* @return boolean FALSE if there's nothing more to iterate over
*/
public function valid()
{
if ($this -> Handle)
{
return $this -> Handle -> valid();
}
return false;
}
// !Countable interface method
public function count()
{
if ($this -> Handle)
{
return $this -> Handle -> count();
}
return 0;
}
/**
* Method for SeekableIterator interface. Takes a posiiton and traverses the file to that position
* The value can be retrieved with a `current()` call afterwards.
*
* @param int Position in file
*/
public function seek($Position)
{
if (!$this -> Handle)
{
throw new OutOfBoundsException('SpreadsheetReader: No file opened');
}
$CurrentIndex = $this -> Handle -> key();
if ($CurrentIndex != $Position)
{
if ($Position < $CurrentIndex || is_null($CurrentIndex) || $Position == 0)
{
$this -> rewind();
}
while ($this -> Handle -> valid() && ($Position > $this -> Handle -> key()))
{
$this -> Handle -> next();
}
if (!$this -> Handle -> valid())
{
throw new OutOfBoundsException('SpreadsheetError: Position '.$Position.' not found');
}
}
return null;
}
}
?>
<?php
/**
* Class for parsing CSV files
*
* @author Martins Pilsetnieks
*/
class SpreadsheetReader_CSV implements Iterator, Countable
{
/**
* @var array Options array, pre-populated with the default values.
*/
private $Options = array(
'Delimiter' => ';',
'Enclosure' => '"'
);
private $Encoding = 'UTF-8';
private $BOMLength = 0;
/**
* @var resource File handle
*/
private $Handle = false;
private $Filepath = '';
private $Index = 0;
private $CurrentRow = null;
/**
* @param string Path to file
* @param array Options:
* Enclosure => string CSV enclosure
* Separator => string CSV separator
*/
public function __construct($Filepath, array $Options = null)
{
$this -> Filepath = $Filepath;
if (!is_readable($Filepath))
{
throw new Exception('SpreadsheetReader_CSV: File not readable ('.$Filepath.')');
}
// For safety's sake
@ini_set('auto_detect_line_endings', true);
$this -> Options = array_merge($this -> Options, $Options);
$this -> Handle = fopen($Filepath, 'r');
// Checking the file for byte-order mark to determine encoding
$BOM16 = bin2hex(fread($this -> Handle, 2));
if ($BOM16 == 'fffe')
{
$this -> Encoding = 'UTF-16LE';
//$this -> Encoding = 'UTF-16';
$this -> BOMLength = 2;
}
elseif ($BOM16 == 'feff')
{
$this -> Encoding = 'UTF-16BE';
//$this -> Encoding = 'UTF-16';
$this -> BOMLength = 2;
}
if (!$this -> BOMLength)
{
fseek($this -> Handle, 0);
$BOM32 = bin2hex(fread($this -> Handle, 4));
if ($BOM32 == '0000feff')
{
//$this -> Encoding = 'UTF-32BE';
$this -> Encoding = 'UTF-32';
$this -> BOMLength = 4;
}
elseif ($BOM32 == 'fffe0000')
{
//$this -> Encoding = 'UTF-32LE';
$this -> Encoding = 'UTF-32';
$this -> BOMLength = 4;
}
}
fseek($this -> Handle, 0);
$BOM8 = bin2hex(fread($this -> Handle, 3));
if ($BOM8 == 'efbbbf')
{
$this -> Encoding = 'UTF-8';
$this -> BOMLength = 3;
}
// Seeking the place right after BOM as the start of the real content
if ($this -> BOMLength)
{
fseek($this -> Handle, $this -> BOMLength);
}
// Checking for the delimiter if it should be determined automatically
if (!$this -> Options['Delimiter'])
{
// fgetcsv needs single-byte separators
$Semicolon = ';';
$Tab = "\t";
$Comma = ',';
// Reading the first row and checking if a specific separator character
// has more columns than others (it means that most likely that is the delimiter).
$SemicolonCount = count(fgetcsv($this -> Handle, null, $Semicolon));
fseek($this -> Handle, $this -> BOMLength);
$TabCount = count(fgetcsv($this -> Handle, null, $Tab));
fseek($this -> Handle, $this -> BOMLength);
$CommaCount = count(fgetcsv($this -> Handle, null, $Comma));
fseek($this -> Handle, $this -> BOMLength);
$Delimiter = $Semicolon;
if ($TabCount > $SemicolonCount || $CommaCount > $SemicolonCount)
{
$Delimiter = $CommaCount > $TabCount ? $Comma : $Tab;
}
$this -> Options['Delimiter'] = $Delimiter;
}
}
/**
* Returns information about sheets in the file.
* Because CSV doesn't have any, it's just a single entry.
*
* @return array Sheet data
*/
public function Sheets()
{
return array(0 => basename($this -> Filepath));
}
/**
* Changes sheet to another. Because CSV doesn't have any sheets
* it just rewinds the file so the behaviour is compatible with other
* sheet readers. (If an invalid index is given, it doesn't do anything.)
*
* @param bool Status
*/
public function ChangeSheet($Index)
{
if ($Index == 0)
{
$this -> rewind();
return true;
}
return false;
}
// !Iterator interface methods
/**
* Rewind the Iterator to the first element.
* Similar to the reset() function for arrays in PHP
*/
public function rewind()
{
fseek($this -> Handle, $this -> BOMLength);
$this -> CurrentRow = null;
$this -> Index = 0;
}
/**
* Return the current element.
* Similar to the current() function for arrays in PHP
*
* @return mixed current element from the collection
*/
public function current()
{
if ($this -> Index == 0 && is_null($this -> CurrentRow))
{
$this -> next();
$this -> Index--;
}
return $this -> CurrentRow;
}
/**
* Move forward to next element.
* Similar to the next() function for arrays in PHP
*/
public function next()
{
$this -> CurrentRow = array();
// Finding the place the next line starts for UTF-16 encoded files
// Line breaks could be 0x0D 0x00 0x0A 0x00 and PHP could split lines on the
// first or the second linebreak leaving unnecessary \0 characters that mess up
// the output.
if ($this -> Encoding == 'UTF-16LE' || $this -> Encoding == 'UTF-16BE')
{
while (!feof($this -> Handle))
{
// While bytes are insignificant whitespace, do nothing
$Char = ord(fgetc($this -> Handle));
if (!$Char || $Char == 10 || $Char == 13)
{
continue;
}
else
{
// When significant bytes are found, step back to the last place before them
if ($this -> Encoding == 'UTF-16LE')
{
fseek($this -> Handle, ftell($this -> Handle) - 1);
}
else
{
fseek($this -> Handle, ftell($this -> Handle) - 2);
}
break;
}
}
}
$this -> Index++;
$this -> CurrentRow = fgetcsv($this -> Handle, null, $this -> Options['Delimiter'], $this -> Options['Enclosure']);
if ($this -> CurrentRow)
{
// Converting multi-byte unicode strings
// and trimming enclosure symbols off of them because those aren't recognized
// in the relevan encodings.
if ($this -> Encoding != 'ASCII' && $this -> Encoding != 'UTF-8')
{
$Encoding = $this -> Encoding;
foreach ($this -> CurrentRow as $Key => $Value)
{
$this -> CurrentRow[$Key] = trim(trim(
mb_convert_encoding($Value, 'UTF-8', $this -> Encoding),
$this -> Options['Enclosure']
));
}
}
}
return $this -> CurrentRow;
}
/**
* Return the identifying key of the current element.
* Similar to the key() function for arrays in PHP
*
* @return mixed either an integer or a string
*/
public function key()
{
return $this -> Index;
}
/**
* Check if there is a current element after calls to rewind() or next().
* Used to check if we've iterated to the end of the collection
*
* @return boolean FALSE if there's nothing more to iterate over
*/
public function valid()
{
return ($this -> CurrentRow || !feof($this -> Handle));
}
// !Countable interface method
/**
* Ostensibly should return the count of the contained items but this just returns the number
* of rows read so far. It's not really correct but at least coherent.
*/
public function count()
{
return $this -> Index + 1;
}
}
?>
\ No newline at end of file
<?php
/**
* Class for parsing ODS files
*
* @author Martins Pilsetnieks
*/
class SpreadsheetReader_ODS implements Iterator, Countable
{
private $Options = array(
'TempDir' => '',
'ReturnDateTimeObjects' => false
);
/**
* @var string Path to temporary content file
*/
private $ContentPath = '';
/**
* @var XMLReader XML reader object
*/
private $Content = false;
/**
* @var array Data about separate sheets in the file
*/
private $Sheets = false;
private $CurrentRow = null;
/**
* @var int Number of the sheet we're currently reading
*/
private $CurrentSheet = 0;
private $Index = 0;
private $TableOpen = false;
private $RowOpen = false;
/**
* @param string Path to file
* @param array Options:
* TempDir => string Temporary directory path
* ReturnDateTimeObjects => bool True => dates and times will be returned as PHP DateTime objects, false => as strings
*/
public function __construct($Filepath, array $Options = null)
{
if (!is_readable($Filepath))
{
throw new Exception('SpreadsheetReader_ODS: File not readable ('.$Filepath.')');
}
$this -> TempDir = isset($Options['TempDir']) && is_writable($Options['TempDir']) ?
$Options['TempDir'] :
sys_get_temp_dir();
$this -> TempDir = rtrim($this -> TempDir, DIRECTORY_SEPARATOR);
$this -> TempDir = $this -> TempDir.DIRECTORY_SEPARATOR.uniqid().DIRECTORY_SEPARATOR;
$Zip = new ZipArchive;
$Status = $Zip -> open($Filepath);
if ($Status !== true)
{
throw new Exception('SpreadsheetReader_ODS: File not readable ('.$Filepath.') (Error '.$Status.')');
}
if ($Zip -> locateName('content.xml') !== false)
{
$Zip -> extractTo($this -> TempDir, 'content.xml');
$this -> ContentPath = $this -> TempDir.'content.xml';
}
$Zip -> close();
if ($this -> ContentPath && is_readable($this -> ContentPath))
{
$this -> Content = new XMLReader;
$this -> Content -> open($this -> ContentPath);
$this -> Valid = true;
}
}
/**
* Destructor, destroys all that remains (closes and deletes temp files)
*/
public function __destruct()
{
if ($this -> Content && $this -> Content instanceof XMLReader)
{
$this -> Content -> close();
unset($this -> Content);
}
if (file_exists($this -> ContentPath))
{
@unlink($this -> ContentPath);
unset($this -> ContentPath);
}
}
/**
* Retrieves an array with information about sheets in the current file
*
* @return array List of sheets (key is sheet index, value is name)
*/
public function Sheets()
{
if ($this -> Sheets === false)
{
$this -> Sheets = array();
if ($this -> Valid)
{
$this -> SheetReader = new XMLReader;
$this -> SheetReader -> open($this -> ContentPath);
while ($this -> SheetReader -> read())
{
if ($this -> SheetReader -> name == 'table:table')
{
$this -> Sheets[] = $this -> SheetReader -> getAttribute('table:name');
$this -> SheetReader -> next();
}
}
$this -> SheetReader -> close();
}
}
return $this -> Sheets;
}
/**
* Changes the current sheet in the file to another
*
* @param int Sheet index
*
* @return bool True if sheet was successfully changed, false otherwise.
*/
public function ChangeSheet($Index)
{
$Index = (int)$Index;
$Sheets = $this -> Sheets();
if (isset($Sheets[$Index]))
{
$this -> CurrentSheet = $Index;
$this -> rewind();
return true;
}
return false;
}
// !Iterator interface methods
/**
* Rewind the Iterator to the first element.
* Similar to the reset() function for arrays in PHP
*/
public function rewind()
{
if ($this -> Index > 0)
{
// If the worksheet was already iterated, XML file is reopened.
// Otherwise it should be at the beginning anyway
$this -> Content -> close();
$this -> Content -> open($this -> ContentPath);
$this -> Valid = true;
$this -> TableOpen = false;
$this -> RowOpen = false;
$this -> CurrentRow = null;
}
$this -> Index = 0;
}
/**
* Return the current element.
* Similar to the current() function for arrays in PHP
*
* @return mixed current element from the collection
*/
public function current()
{
if ($this -> Index == 0 && is_null($this -> CurrentRow))
{
$this -> next();
$this -> Index--;
}
return $this -> CurrentRow;
}
/**
* Move forward to next element.
* Similar to the next() function for arrays in PHP
*/
public function next()
{
$this -> Index++;
$this -> CurrentRow = array();
if (!$this -> TableOpen)
{
$TableCounter = 0;
$SkipRead = false;
while ($this -> Valid = ($SkipRead || $this -> Content -> read()))
{
if ($SkipRead)
{
$SkipRead = false;
}
if ($this -> Content -> name == 'table:table' && $this -> Content -> nodeType != XMLReader::END_ELEMENT)
{
if ($TableCounter == $this -> CurrentSheet)
{
$this -> TableOpen = true;
break;
}
$TableCounter++;
$this -> Content -> next();
$SkipRead = true;
}
}
}
if ($this -> TableOpen && !$this -> RowOpen)
{
while ($this -> Valid = $this -> Content -> read())
{
switch ($this -> Content -> name)
{
case 'table:table':
$this -> TableOpen = false;
$this -> Content -> next('office:document-content');
$this -> Valid = false;
break 2;
case 'table:table-row':
if ($this -> Content -> nodeType != XMLReader::END_ELEMENT)
{
$this -> RowOpen = true;
break 2;
}
break;
}
}
}
if ($this -> RowOpen)
{
$LastCellContent = '';
while ($this -> Valid = $this -> Content -> read())
{
switch ($this -> Content -> name)
{
case 'table:table-cell':
if ($this -> Content -> nodeType == XMLReader::END_ELEMENT || $this -> Content -> isEmptyElement)
{
if ($this -> Content -> nodeType == XMLReader::END_ELEMENT)
{
$CellValue = $LastCellContent;
}
elseif ($this -> Content -> isEmptyElement)
{
$LastCellContent = '';
$CellValue = $LastCellContent;
}
$this -> CurrentRow[] = $LastCellContent;
if ($this -> Content -> getAttribute('table:number-columns-repeated') !== null)
{
$RepeatedColumnCount = $this -> Content -> getAttribute('table:number-columns-repeated');
// Checking if larger than one because the value is already added to the row once before
if ($RepeatedColumnCount > 1)
{
$this -> CurrentRow = array_pad($this -> CurrentRow, count($this -> CurrentRow) + $RepeatedColumnCount - 1, $LastCellContent);
}
}
}
else
{
$LastCellContent = '';
}
case 'text:p':
if ($this -> Content -> nodeType != XMLReader::END_ELEMENT)
{
$LastCellContent = $this -> Content -> readString();
}
break;
case 'table:table-row':
$this -> RowOpen = false;
break 2;
}
}
}
return $this -> CurrentRow;
}
/**
* Return the identifying key of the current element.
* Similar to the key() function for arrays in PHP
*
* @return mixed either an integer or a string
*/
public function key()
{
return $this -> Index;
}
/**
* Check if there is a current element after calls to rewind() or next().
* Used to check if we've iterated to the end of the collection
*
* @return boolean FALSE if there's nothing more to iterate over
*/
public function valid()
{
return $this -> Valid;
}
// !Countable interface method
/**
* Ostensibly should return the count of the contained items but this just returns the number
* of rows read so far. It's not really correct but at least coherent.
*/
public function count()
{
return $this -> Index + 1;
}
}
?>
\ No newline at end of file
<?php
/**
* Class for parsing XLS files
*
* @author Martins Pilsetnieks
*/
class SpreadsheetReader_XLS implements Iterator, Countable
{
/**
* @var array Options array, pre-populated with the default values.
*/
private $Options = array(
);
/**
* @var resource File handle
*/
private $Handle = false;
private $Index = 0;
private $Error = false;
/**
* @var array Sheet information
*/
private $Sheets = false;
private $SheetIndexes = array();
/**
* @var int Current sheet index
*/
private $CurrentSheet = 0;
/**
* @var array Content of the current row
*/
private $CurrentRow = array();
/**
* @var int Column count in the sheet
*/
private $ColumnCount = 0;
/**
* @var int Row count in the sheet
*/
private $RowCount = 0;
/**
* @var array Template to use for empty rows. Retrieved rows are merged
* with this so that empty cells are added, too
*/
private $EmptyRow = array();
/**
* @param string Path to file
* @param array Options
*/
public function __construct($Filepath, array $Options = null)
{
if (!is_readable($Filepath))
{
throw new Exception('SpreadsheetReader_XLS: File not readable ('.$Filepath.')');
}
if (!class_exists('Spreadsheet_Excel_Reader'))
{
throw new Exception('SpreadsheetReader_XLS: Spreadsheet_Excel_Reader class not available');
}
$this -> Handle = new Spreadsheet_Excel_Reader($Filepath, false, 'UTF-8');
if (function_exists('mb_convert_encoding'))
{
$this -> Handle -> setUTFEncoder('mb');
}
if (empty($this -> Handle -> sheets))
{
$this -> Error = true;
return null;
}
$this -> ChangeSheet(0);
}
public function __destruct()
{
unset($this -> Handle);
}
/**
* Retrieves an array with information about sheets in the current file
*
* @return array List of sheets (key is sheet index, value is name)
*/
public function Sheets()
{
if ($this -> Sheets === false)
{
$this -> Sheets = array();
$this -> SheetIndexes = array_keys($this -> Handle -> sheets);
foreach ($this -> SheetIndexes as $SheetIndex)
{
$this -> Sheets[] = $this -> Handle -> boundsheets[$SheetIndex]['name'];
}
}
return $this -> Sheets;
}
/**
* Changes the current sheet in the file to another
*
* @param int Sheet index
*
* @return bool True if sheet was successfully changed, false otherwise.
*/
public function ChangeSheet($Index)
{
$Index = (int)$Index;
$Sheets = $this -> Sheets();
if (isset($this -> Sheets[$Index]))
{
$this -> rewind();
$this -> CurrentSheet = $this -> SheetIndexes[$Index];
$this -> ColumnCount = $this -> Handle -> sheets[$this -> CurrentSheet]['numCols'];
$this -> RowCount = $this -> Handle -> sheets[$this -> CurrentSheet]['numRows'];
// For the case when Spreadsheet_Excel_Reader doesn't have the row count set correctly.
if (!$this -> RowCount && count($this -> Handle -> sheets[$this -> CurrentSheet]['cells']))
{
end($this -> Handle -> sheets[$this -> CurrentSheet]['cells']);
$this -> RowCount = (int)key($this -> Handle -> sheets[$this -> CurrentSheet]['cells']);
}
if ($this -> ColumnCount)
{
$this -> EmptyRow = array_fill(1, $this -> ColumnCount, '');
}
else
{
$this -> EmptyRow = array();
}
}
return false;
}
public function __get($Name)
{
switch ($Name)
{
case 'Error':
return $this -> Error;
break;
}
return null;
}
// !Iterator interface methods
/**
* Rewind the Iterator to the first element.
* Similar to the reset() function for arrays in PHP
*/
public function rewind()
{
$this -> Index = 0;
}
/**
* Return the current element.
* Similar to the current() function for arrays in PHP
*
* @return mixed current element from the collection
*/
public function current()
{
if ($this -> Index == 0)
{
$this -> next();
}
return $this -> CurrentRow;
}
/**
* Move forward to next element.
* Similar to the next() function for arrays in PHP
*/
public function next()
{
// Internal counter is advanced here instead of the if statement
// because apparently it's fully possible that an empty row will not be
// present at all
$this -> Index++;
if ($this -> Error)
{
return array();
}
elseif (isset($this -> Handle -> sheets[$this -> CurrentSheet]['cells'][$this -> Index]))
{
$this -> CurrentRow = $this -> Handle -> sheets[$this -> CurrentSheet]['cells'][$this -> Index];
if (!$this -> CurrentRow)
{
return array();
}
$this -> CurrentRow = $this -> CurrentRow + $this -> EmptyRow;
ksort($this -> CurrentRow);
$this -> CurrentRow = array_values($this -> CurrentRow);
return $this -> CurrentRow;
}
else
{
$this -> CurrentRow = $this -> EmptyRow;
return $this -> CurrentRow;
}
}
/**
* Return the identifying key of the current element.
* Similar to the key() function for arrays in PHP
*
* @return mixed either an integer or a string
*/
public function key()
{
return $this -> Index;
}
/**
* Check if there is a current element after calls to rewind() or next().
* Used to check if we've iterated to the end of the collection
*
* @return boolean FALSE if there's nothing more to iterate over
*/
public function valid()
{
if ($this -> Error)
{
return false;
}
return ($this -> Index <= $this -> RowCount);
}
// !Countable interface method
/**
* Ostensibly should return the count of the contained items but this just returns the number
* of rows read so far. It's not really correct but at least coherent.
*/
public function count()
{
if ($this -> Error)
{
return 0;
}
return $this -> RowCount;
}
}
?>
\ No newline at end of file
<?php
/**
* Class for parsing XLSX files specifically
*
* @author Martins Pilsetnieks
*/
class SpreadsheetReader_XLSX implements Iterator, Countable
{
const CELL_TYPE_BOOL = 'b';
const CELL_TYPE_NUMBER = 'n';
const CELL_TYPE_ERROR = 'e';
const CELL_TYPE_SHARED_STR = 's';
const CELL_TYPE_STR = 'str';
const CELL_TYPE_INLINE_STR = 'inlineStr';
/**
* Number of shared strings that can be reasonably cached, i.e., that aren't read from file but stored in memory.
* If the total number of shared strings is higher than this, caching is not used.
* If this value is null, shared strings are cached regardless of amount.
* With large shared string caches there are huge performance gains, however a lot of memory could be used which
* can be a problem, especially on shared hosting.
*/
const SHARED_STRING_CACHE_LIMIT = 50000;
private $Options = array(
'TempDir' => '',
'ReturnDateTimeObjects' => false
);
private static $RuntimeInfo = array(
'GMPSupported' => false
);
private $Valid = false;
/**
* @var SpreadsheetReader_* Handle for the reader object
*/
private $Handle = false;
// Worksheet file
/**
* @var string Path to the worksheet XML file
*/
private $WorksheetPath = false;
/**
* @var XMLReader XML reader object for the worksheet XML file
*/
private $Worksheet = false;
// Shared strings file
/**
* @var string Path to shared strings XML file
*/
private $SharedStringsPath = false;
/**
* @var XMLReader XML reader object for the shared strings XML file
*/
private $SharedStrings = false;
/**
* @var array Shared strings cache, if the number of shared strings is low enough
*/
private $SharedStringCache = array();
// Workbook data
/**
* @var SimpleXMLElement XML object for the workbook XML file
*/
private $WorkbookXML = false;
// Style data
/**
* @var SimpleXMLElement XML object for the styles XML file
*/
private $StylesXML = false;
/**
* @var array Container for cell value style data
*/
private $Styles = array();
private $TempDir = '';
private $TempFiles = array();
private $CurrentRow = false;
// Runtime parsing data
/**
* @var int Current row in the file
*/
private $Index = 0;
/**
* @var array Data about separate sheets in the file
*/
private $Sheets = false;
private $SharedStringCount = 0;
private $SharedStringIndex = 0;
private $LastSharedStringValue = null;
private $RowOpen = false;
private $SSOpen = false;
private $SSForwarded = false;
private static $BuiltinFormats = array(
0 => '',
1 => '0',
2 => '0.00',
3 => '#,##0',
4 => '#,##0.00',
9 => '0%',
10 => '0.00%',
11 => '0.00E+00',
12 => '# ?/?',
13 => '# ??/??',
14 => 'mm-dd-yy',
15 => 'd-mmm-yy',
16 => 'd-mmm',
17 => 'mmm-yy',
18 => 'h:mm AM/PM',
19 => 'h:mm:ss AM/PM',
20 => 'h:mm',
21 => 'h:mm:ss',
22 => 'm/d/yy h:mm',
37 => '#,##0 ;(#,##0)',
38 => '#,##0 ;[Red](#,##0)',
39 => '#,##0.00;(#,##0.00)',
40 => '#,##0.00;[Red](#,##0.00)',
45 => 'mm:ss',
46 => '[h]:mm:ss',
47 => 'mmss.0',
48 => '##0.0E+0',
49 => '@',
// CHT & CHS
27 => '[$-404]e/m/d',
30 => 'm/d/yy',
36 => '[$-404]e/m/d',
50 => '[$-404]e/m/d',
57 => '[$-404]e/m/d',
// THA
59 => 't0',
60 => 't0.00',
61 =>'t#,##0',
62 => 't#,##0.00',
67 => 't0%',
68 => 't0.00%',
69 => 't# ?/?',
70 => 't# ??/??'
);
private $Formats = array();
private static $DateReplacements = array(
'All' => array(
'\\' => '',
'am/pm' => 'A',
'yyyy' => 'Y',
'yy' => 'y',
'mmmmm' => 'M',
'mmmm' => 'F',
'mmm' => 'M',
':mm' => ':i',
'mm' => 'm',
'm' => 'n',
'dddd' => 'l',
'ddd' => 'D',
'dd' => 'd',
'd' => 'j',
'ss' => 's',
'.s' => ''
),
'24H' => array(
'hh' => 'H',
'h' => 'G'
),
'12H' => array(
'hh' => 'h',
'h' => 'G'
)
);
private static $BaseDate = false;
private static $DecimalSeparator = '.';
private static $ThousandSeparator = '';
private static $CurrencyCode = '';
/**
* @var array Cache for already processed format strings
*/
private $ParsedFormatCache = array();
/**
* @param string Path to file
* @param array Options:
* TempDir => string Temporary directory path
* ReturnDateTimeObjects => bool True => dates and times will be returned as PHP DateTime objects, false => as strings
*/
public function __construct($Filepath, array $Options = null)
{
if (!is_readable($Filepath))
{
throw new Exception('SpreadsheetReader_XLSX: File not readable ('.$Filepath.')');
}
$this -> TempDir = isset($Options['TempDir']) && is_writable($Options['TempDir']) ?
$Options['TempDir'] :
sys_get_temp_dir();
$this -> TempDir = rtrim($this -> TempDir, DIRECTORY_SEPARATOR);
$this -> TempDir = $this -> TempDir.DIRECTORY_SEPARATOR.uniqid().DIRECTORY_SEPARATOR;
$Zip = new ZipArchive;
$Status = $Zip -> open($Filepath);
if ($Status !== true)
{
throw new Exception('SpreadsheetReader_XLSX: File not readable ('.$Filepath.') (Error '.$Status.')');
}
// Getting the general workbook information
if ($Zip -> locateName('xl/workbook.xml') !== false)
{
$this -> WorkbookXML = new SimpleXMLElement($Zip -> getFromName('xl/workbook.xml'));
}
// Extracting the XMLs from the XLSX zip file
if ($Zip -> locateName('xl/sharedStrings.xml') !== false)
{
$this -> SharedStringsPath = $this -> TempDir.'xl'.DIRECTORY_SEPARATOR.'sharedStrings.xml';
$Zip -> extractTo($this -> TempDir, 'xl/sharedStrings.xml');
$this -> TempFiles[] = $this -> TempDir.'xl'.DIRECTORY_SEPARATOR.'sharedStrings.xml';
if (is_readable($this -> SharedStringsPath))
{
$this -> SharedStrings = new XMLReader;
$this -> SharedStrings -> open($this -> SharedStringsPath);
$this -> PrepareSharedStringCache();
}
}
$Sheets = $this -> Sheets();
foreach ($this -> Sheets as $Index => $Name)
{
if ($Zip -> locateName('xl/worksheets/sheet'.$Index.'.xml') !== false)
{
$Zip -> extractTo($this -> TempDir, 'xl/worksheets/sheet'.$Index.'.xml');
$this -> TempFiles[] = $this -> TempDir.'xl'.DIRECTORY_SEPARATOR.'worksheets'.DIRECTORY_SEPARATOR.'sheet'.$Index.'.xml';
}
}
$this -> ChangeSheet(0);
// If worksheet is present and is OK, parse the styles already
if ($Zip -> locateName('xl/styles.xml') !== false)
{
$this -> StylesXML = new SimpleXMLElement($Zip -> getFromName('xl/styles.xml'));
if ($this -> StylesXML && $this -> StylesXML -> cellXfs && $this -> StylesXML -> cellXfs -> xf)
{
foreach ($this -> StylesXML -> cellXfs -> xf as $Index => $XF)
{
// Format #0 is a special case - it is the "General" format that is applied regardless of applyNumberFormat
if ($XF -> attributes() -> applyNumberFormat || (0 == (int)$XF -> attributes() -> numFmtId))
{
$FormatId = (int)$XF -> attributes() -> numFmtId;
// If format ID >= 164, it is a custom format and should be read from styleSheet\numFmts
$this -> Styles[] = $FormatId;
}
else
{
// 0 for "General" format
$this -> Styles[] = 0;
}
}
}
if ($this -> StylesXML -> numFmts && $this -> StylesXML -> numFmts -> numFmt)
{
foreach ($this -> StylesXML -> numFmts -> numFmt as $Index => $NumFmt)
{
$this -> Formats[(int)$NumFmt -> attributes() -> numFmtId] = (string)$NumFmt -> attributes() -> formatCode;
}
}
unset($this -> StylesXML);
}
$Zip -> close();
// Setting base date
if (!self::$BaseDate)
{
self::$BaseDate = new DateTime;
self::$BaseDate -> setTimezone(new DateTimeZone('UTC'));
self::$BaseDate -> setDate(1900, 1, 0);
self::$BaseDate -> setTime(0, 0, 0);
}
// Decimal and thousand separators
if (!self::$DecimalSeparator && !self::$ThousandSeparator && !self::$CurrencyCode)
{
$Locale = localeconv();
self::$DecimalSeparator = $Locale['decimal_point'];
self::$ThousandSeparator = $Locale['thousands_sep'];
self::$CurrencyCode = $Locale['int_curr_symbol'];
}
if (function_exists('gmp_gcd'))
{
self::$RuntimeInfo['GMPSupported'] = true;
}
}
/**
* Destructor, destroys all that remains (closes and deletes temp files)
*/
public function __destruct()
{
foreach ($this -> TempFiles as $TempFile)
{
@unlink($TempFile);
}
// Better safe than sorry - shouldn't try deleting '.' or '/', or '..'.
if (strlen($this -> TempDir) > 2)
{
@rmdir($this -> TempDir.'xl'.DIRECTORY_SEPARATOR.'worksheets');
@rmdir($this -> TempDir.'xl');
@rmdir($this -> TempDir);
}
if ($this -> Worksheet && $this -> Worksheet instanceof XMLReader)
{
$this -> Worksheet -> close();
unset($this -> Worksheet);
}
unset($this -> WorksheetPath);
if ($this -> SharedStrings && $this -> SharedStrings instanceof XMLReader)
{
$this -> SharedStrings -> close();
unset($this -> SharedStrings);
}
unset($this -> SharedStringsPath);
if (isset($this -> StylesXML))
{
unset($this -> StylesXML);
}
if ($this -> WorkbookXML)
{
unset($this -> WorkbookXML);
}
}
/**
* Retrieves an array with information about sheets in the current file
*
* @return array List of sheets (key is sheet index, value is name)
*/
public function Sheets()
{
if ($this -> Sheets === false)
{
$this -> Sheets = array();
foreach ($this -> WorkbookXML -> sheets -> sheet as $Index => $Sheet)
{
$Attributes = $Sheet -> attributes('r', true);
foreach ($Attributes as $Name => $Value)
{
if ($Name == 'id')
{
$SheetID = (int)str_replace('rId', '', (string)$Value);
break;
}
}
$this -> Sheets[$SheetID] = (string)$Sheet['name'];
}
ksort($this -> Sheets);
}
return array_values($this -> Sheets);
}
/**
* Changes the current sheet in the file to another
*
* @param int Sheet index
*
* @return bool True if sheet was successfully changed, false otherwise.
*/
public function ChangeSheet($Index)
{
$RealSheetIndex = false;
$Sheets = $this -> Sheets();
if (isset($Sheets[$Index]))
{
$SheetIndexes = array_keys($this -> Sheets);
$RealSheetIndex = $SheetIndexes[$Index];
}
$TempWorksheetPath = $this -> TempDir.'xl/worksheets/sheet'.$RealSheetIndex.'.xml';
if ($RealSheetIndex !== false && is_readable($TempWorksheetPath))
{
$this -> WorksheetPath = $TempWorksheetPath;
$this -> rewind();
return true;
}
return false;
}
/**
* Creating shared string cache if the number of shared strings is acceptably low (or there is no limit on the amount
*/
private function PrepareSharedStringCache()
{
while ($this -> SharedStrings -> read())
{
if ($this -> SharedStrings -> name == 'sst')
{
$this -> SharedStringCount = $this -> SharedStrings -> getAttribute('count');
break;
}
}
if (!$this -> SharedStringCount || (self::SHARED_STRING_CACHE_LIMIT < $this -> SharedStringCount && self::SHARED_STRING_CACHE_LIMIT !== null))
{
return false;
}
$CacheIndex = 0;
$CacheValue = '';
while ($this -> SharedStrings -> read())
{
switch ($this -> SharedStrings -> name)
{
case 'si':
if ($this -> SharedStrings -> nodeType == XMLReader::END_ELEMENT)
{
$this -> SharedStringCache[$CacheIndex] = $CacheValue;
$CacheIndex++;
$CacheValue = '';
}
break;
case 't':
if ($this -> SharedStrings -> nodeType == XMLReader::END_ELEMENT)
{
continue;
}
$CacheValue .= $this -> SharedStrings -> readString();
break;
}
}
$this -> SharedStrings -> close();
return true;
}
/**
* Retrieves a shared string value by its index
*
* @param int Shared string index
*
* @return string Value
*/
private function GetSharedString($Index)
{
if ((self::SHARED_STRING_CACHE_LIMIT === null || self::SHARED_STRING_CACHE_LIMIT > 0) && !empty($this -> SharedStringCache))
{
if (isset($this -> SharedStringCache[$Index]))
{
return $this -> SharedStringCache[$Index];
}
else
{
return '';
}
}
// If the desired index is before the current, rewind the XML
if ($this -> SharedStringIndex > $Index)
{
$this -> SSOpen = false;
$this -> SharedStrings -> close();
$this -> SharedStrings -> open($this -> SharedStringsPath);
$this -> SharedStringIndex = 0;
$this -> LastSharedStringValue = null;
$this -> SSForwarded = false;
}
// Finding the unique string count (if not already read)
if ($this -> SharedStringIndex == 0 && !$this -> SharedStringCount)
{
while ($this -> SharedStrings -> read())
{
if ($this -> SharedStrings -> name == 'sst')
{
$this -> SharedStringCount = $this -> SharedStrings -> getAttribute('uniqueCount');
break;
}
}
}
// If index of the desired string is larger than possible, don't even bother.
if ($this -> SharedStringCount && ($Index >= $this -> SharedStringCount))
{
return '';
}
// If an index with the same value as the last already fetched is requested
// (any further traversing the tree would get us further away from the node)
if (($Index == $this -> SharedStringIndex) && ($this -> LastSharedStringValue !== null))
{
return $this -> LastSharedStringValue;
}
// Find the correct <si> node with the desired index
while ($this -> SharedStringIndex <= $Index)
{
// SSForwarded is set further to avoid double reading in case nodes are skipped.
if ($this -> SSForwarded)
{
$this -> SSForwarded = false;
}
else
{
$ReadStatus = $this -> SharedStrings -> read();
if (!$ReadStatus)
{
break;
}
}
if ($this -> SharedStrings -> name == 'si')
{
if ($this -> SharedStrings -> nodeType == XMLReader::END_ELEMENT)
{
$this -> SSOpen = false;
$this -> SharedStringIndex++;
}
else
{
$this -> SSOpen = true;
if ($this -> SharedStringIndex < $Index)
{
$this -> SSOpen = false;
$this -> SharedStrings -> next('si');
$this -> SSForwarded = true;
$this -> SharedStringIndex++;
continue;
}
else
{
break;
}
}
}
}
$Value = '';
// Extract the value from the shared string
if ($this -> SSOpen && ($this -> SharedStringIndex == $Index))
{
while ($this -> SharedStrings -> read())
{
switch ($this -> SharedStrings -> name)
{
case 't':
if ($this -> SharedStrings -> nodeType == XMLReader::END_ELEMENT)
{
continue;
}
$Value .= $this -> SharedStrings -> readString();
break;
case 'si':
if ($this -> SharedStrings -> nodeType == XMLReader::END_ELEMENT)
{
$this -> SSOpen = false;
$this -> SSForwarded = true;
break 2;
}
break;
}
}
}
if ($Value)
{
$this -> LastSharedStringValue = $Value;
}
return $Value;
}
/**
* Formats the value according to the index
*
* @param string Cell value
* @param int Format index
*
* @return string Formatted cell value
*/
private function FormatValue($Value, $Index)
{
if (!is_numeric($Value))
{
return $Value;
}
if (isset($this -> Styles[$Index]) && ($this -> Styles[$Index] !== false))
{
$Index = $this -> Styles[$Index];
}
else
{
return $Value;
}
// A special case for the "General" format
if ($Index == 0)
{
return $this -> GeneralFormat($Value);
}
$Format = array();
if (isset($this -> ParsedFormatCache[$Index]))
{
$Format = $this -> ParsedFormatCache[$Index];
}
if (!$Format)
{
$Format = array(
'Code' => false,
'Type' => false,
'Scale' => 1,
'Thousands' => false,
'Currency' => false
);
if (isset(self::$BuiltinFormats[$Index]))
{
$Format['Code'] = self::$BuiltinFormats[$Index];
}
elseif (isset($this -> Formats[$Index]))
{
$Format['Code'] = $this -> Formats[$Index];
}
// Format code found, now parsing the format
if ($Format['Code'])
{
$Sections = explode(';', $Format['Code']);
$Format['Code'] = $Sections[0];
switch (count($Sections))
{
case 2:
if ($Value < 0)
{
$Format['Code'] = $Sections[1];
}
break;
case 3:
case 4:
if ($Value < 0)
{
$Format['Code'] = $Sections[1];
}
elseif ($Value == 0)
{
$Format['Code'] = $Sections[2];
}
break;
}
}
// Stripping colors
$Format['Code'] = trim(preg_replace('{^\[[[:alpha:]]+\]}i', '', $Format['Code']));
// Percentages
if (substr($Format['Code'], -1) == '%')
{
$Format['Type'] = 'Percentage';
}
elseif (preg_match('{^(\[\$[[:alpha:]]*-[0-9A-F]*\])*[hmsdy]}i', $Format['Code']))
{
$Format['Type'] = 'DateTime';
$Format['Code'] = trim(preg_replace('{^(\[\$[[:alpha:]]*-[0-9A-F]*\])}i', '', $Format['Code']));
$Format['Code'] = strtolower($Format['Code']);
$Format['Code'] = strtr($Format['Code'], self::$DateReplacements['All']);
if (strpos($Format['Code'], 'A') === false)
{
$Format['Code'] = strtr($Format['Code'], self::$DateReplacements['24H']);
}
else
{
$Format['Code'] = strtr($Format['Code'], self::$DateReplacements['12H']);
}
}
elseif ($Format['Code'] == '[$EUR ]#,##0.00_-')
{
$Format['Type'] = 'Euro';
}
else
{
// Removing skipped characters
$Format['Code'] = preg_replace('{_.}', '', $Format['Code']);
// Removing unnecessary escaping
$Format['Code'] = preg_replace("{\\\\}", '', $Format['Code']);
// Removing string quotes
$Format['Code'] = str_replace(array('"', '*'), '', $Format['Code']);
// Removing thousands separator
if (strpos($Format['Code'], '0,0') !== false || strpos($Format['Code'], '#,#') !== false)
{
$Format['Thousands'] = true;
}
$Format['Code'] = str_replace(array('0,0', '#,#'), array('00', '##'), $Format['Code']);
// Scaling (Commas indicate the power)
$Scale = 1;
$Matches = array();
if (preg_match('{(0|#)(,+)}', $Format['Code'], $Matches))
{
$Scale = pow(1000, strlen($Matches[2]));
// Removing the commas
$Format['Code'] = preg_replace(array('{0,+}', '{#,+}'), array('0', '#'), $Format['Code']);
}
$Format['Scale'] = $Scale;
if (preg_match('{#?.*\?\/\?}', $Format['Code']))
{
$Format['Type'] = 'Fraction';
}
else
{
$Format['Code'] = str_replace('#', '', $Format['Code']);
$Matches = array();
if (preg_match('{(0+)(\.?)(0*)}', preg_replace('{\[[^\]]+\]}', '', $Format['Code']), $Matches))
{
$Integer = $Matches[1];
$DecimalPoint = $Matches[2];
$Decimals = $Matches[3];
$Format['MinWidth'] = strlen($Integer) + strlen($DecimalPoint) + strlen($Decimals);
$Format['Decimals'] = $Decimals;
$Format['Precision'] = strlen($Format['Decimals']);
$Format['Pattern'] = '%0'.$Format['MinWidth'].'.'.$Format['Precision'].'f';
}
}
$Matches = array();
if (preg_match('{\[\$(.*)\]}u', $Format['Code'], $Matches))
{
$CurrFormat = $Matches[0];
$CurrCode = $Matches[1];
$CurrCode = explode('-', $CurrCode);
if ($CurrCode)
{
$CurrCode = $CurrCode[0];
}
if (!$CurrCode)
{
$CurrCode = self::$CurrencyCode;
}
$Format['Currency'] = $CurrCode;
}
$Format['Code'] = trim($Format['Code']);
}
$this -> ParsedFormatCache[$Index] = $Format;
}
// Applying format to value
if ($Format)
{
if ($Format['Code'] == '@')
{
return (string)$Value;
}
// Percentages
elseif ($Format['Type'] == 'Percentage')
{
if ($Format['Code'] === '0%')
{
$Value = round(100 * $Value, 0).'%';
}
else
{
$Value = sprintf('%.2f%%', round(100 * $Value, 2));
}
}
// Dates and times
elseif ($Format['Type'] == 'DateTime')
{
$Days = (int)$Value;
// Correcting for Feb 29, 1900
if ($Days > 60)
{
$Days--;
}
// At this point time is a fraction of a day
$Time = ($Value - (int)$Value);
$Seconds = 0;
if ($Time)
{
// Here time is converted to seconds
// Some loss of precision will occur
$Seconds = (int)($Time * 86400);
}
$Value = clone self::$BaseDate;
$Value -> add(new DateInterval('P'.$Days.'D'.($Seconds ? 'T'.$Seconds.'S' : '')));
if (!$this -> Options['ReturnDateTimeObjects'])
{
$Value = $Value -> format($Format['Code']);
}
else
{
// A DateTime object is returned
}
}
elseif ($Format['Type'] == 'Euro')
{
$Value = 'EUR '.sprintf('%1.2f', $Value);
}
else
{
// Fractional numbers
if ($Format['Type'] == 'Fraction' && ($Value != (int)$Value))
{
$Integer = floor(abs($Value));
$Decimal = fmod(abs($Value), 1);
// Removing the integer part and decimal point
$Decimal *= pow(10, strlen($Decimal) - 2);
$DecimalDivisor = pow(10, strlen($Decimal));
if (self::$RuntimeInfo['GMPSupported'])
{
$GCD = gmp_strval(gmp_gcd($Decimal, $DecimalDivisor));
}
else
{
$GCD = self::GCD($Decimal, $DecimalDivisor);
}
$AdjDecimal = $DecimalPart/$GCD;
$AdjDecimalDivisor = $DecimalDivisor/$GCD;
if (
strpos($Format['Code'], '0') !== false ||
strpos($Format['Code'], '#') !== false ||
substr($Format['Code'], 0, 3) == '? ?'
)
{
// The integer part is shown separately apart from the fraction
$Value = ($Value < 0 ? '-' : '').
$Integer ? $Integer.' ' : ''.
$AdjDecimal.'/'.
$AdjDecimalDivisor;
}
else
{
// The fraction includes the integer part
$AdjDecimal += $Integer * $AdjDecimalDivisor;
$Value = ($Value < 0 ? '-' : '').
$AdjDecimal.'/'.
$AdjDecimalDivisor;
}
}
else
{
// Scaling
$Value = $Value / $Format['Scale'];
if (!empty($Format['MinWidth']) && $Format['Decimals'])
{
if ($Format['Thousands'])
{
$Value = number_format($Value, $Format['Precision'],
self::$DecimalSeparator, self::$ThousandSeparator);
}
else
{
$Value = sprintf($Format['Pattern'], $Value);
}
$Value = preg_replace('{(0+)(\.?)(0*)}', $Value, $Format['Code']);
}
}
// Currency/Accounting
if ($Format['Currency'])
{
$Value = preg_replace('', $Format['Currency'], $Value);
}
}
}
return $Value;
}
/**
* Attempts to approximate Excel's "general" format.
*
* @param mixed Value
*
* @return mixed Result
*/
public function GeneralFormat($Value)
{
// Numeric format
if (is_numeric($Value))
{
$Value = (float)$Value;
}
return $Value;
}
// !Iterator interface methods
/**
* Rewind the Iterator to the first element.
* Similar to the reset() function for arrays in PHP
*/
public function rewind()
{
// Removed the check whether $this -> Index == 0 otherwise ChangeSheet doesn't work properly
// If the worksheet was already iterated, XML file is reopened.
// Otherwise it should be at the beginning anyway
if ($this -> Worksheet instanceof XMLReader)
{
$this -> Worksheet -> close();
}
else
{
$this -> Worksheet = new XMLReader;
}
$this -> Worksheet -> open($this -> WorksheetPath);
$this -> Valid = true;
$this -> RowOpen = false;
$this -> CurrentRow = false;
$this -> Index = 0;
}
/**
* Return the current element.
* Similar to the current() function for arrays in PHP
*
* @return mixed current element from the collection
*/
public function current()
{
if ($this -> Index == 0 && $this -> CurrentRow === false)
{
$this -> next();
$this -> Index--;
}
return $this -> CurrentRow;
}
/**
* Move forward to next element.
* Similar to the next() function for arrays in PHP
*/
public function next()
{
$this -> Index++;
$this -> CurrentRow = array();
if (!$this -> RowOpen)
{
while ($this -> Valid = $this -> Worksheet -> read())
{
if ($this -> Worksheet -> name == 'row')
{
// Getting the row spanning area (stored as e.g., 1:12)
// so that the last cells will be present, even if empty
$RowSpans = $this -> Worksheet -> getAttribute('spans');
if ($RowSpans)
{
$RowSpans = explode(':', $RowSpans);
$CurrentRowColumnCount = $RowSpans[1];
}
else
{
$CurrentRowColumnCount = 0;
}
if ($CurrentRowColumnCount > 0)
{
$this -> CurrentRow = array_fill(0, $CurrentRowColumnCount, '');
}
$this -> RowOpen = true;
break;
}
}
}
// Reading the necessary row, if found
if ($this -> RowOpen)
{
// These two are needed to control for empty cells
$MaxIndex = 0;
$CellCount = 0;
$CellHasSharedString = false;
while ($this -> Valid = $this -> Worksheet -> read())
{
switch ($this -> Worksheet -> name)
{
// End of row
case 'row':
if ($this -> Worksheet -> nodeType == XMLReader::END_ELEMENT)
{
$this -> RowOpen = false;
break 2;
}
break;
// Cell
case 'c':
// If it is a closing tag, skip it
if ($this -> Worksheet -> nodeType == XMLReader::END_ELEMENT)
{
continue;
}
$StyleId = (int)$this -> Worksheet -> getAttribute('s');
// Get the index of the cell
$Index = $this -> Worksheet -> getAttribute('r');
$Letter = preg_replace('{[^[:alpha:]]}S', '', $Index);
$Index = self::IndexFromColumnLetter($Letter);
// Determine cell type
if ($this -> Worksheet -> getAttribute('t') == self::CELL_TYPE_SHARED_STR)
{
$CellHasSharedString = true;
}
else
{
$CellHasSharedString = false;
}
$this -> CurrentRow[$Index] = '';
$CellCount++;
if ($Index > $MaxIndex)
{
$MaxIndex = $Index;
}
break;
// Cell value
case 'v':
case 'is':
if ($this -> Worksheet -> nodeType == XMLReader::END_ELEMENT)
{
continue;
}
$Value = $this -> Worksheet -> readString();
if ($CellHasSharedString)
{
$Value = $this -> GetSharedString($Value);
}
// Format value if necessary
if ($Value !== '' && $StyleId && isset($this -> Styles[$StyleId]))
{
$Value = $this -> FormatValue($Value, $StyleId);
}
elseif ($Value)
{
$Value = $this -> GeneralFormat($Value);
}
$this -> CurrentRow[$Index] = $Value;
break;
}
}
// Adding empty cells, if necessary
// Only empty cells inbetween and on the left side are added
if ($MaxIndex + 1 > $CellCount)
{
$this -> CurrentRow = $this -> CurrentRow + array_fill(0, $MaxIndex + 1, '');
ksort($this -> CurrentRow);
}
}
return $this -> CurrentRow;
}
/**
* Return the identifying key of the current element.
* Similar to the key() function for arrays in PHP
*
* @return mixed either an integer or a string
*/
public function key()
{
return $this -> Index;
}
/**
* Check if there is a current element after calls to rewind() or next().
* Used to check if we've iterated to the end of the collection
*
* @return boolean FALSE if there's nothing more to iterate over
*/
public function valid()
{
return $this -> Valid;
}
// !Countable interface method
/**
* Ostensibly should return the count of the contained items but this just returns the number
* of rows read so far. It's not really correct but at least coherent.
*/
public function count()
{
return $this -> Index + 1;
}
/**
* Takes the column letter and converts it to a numerical index (0-based)
*
* @param string Letter(s) to convert
*
* @return mixed Numeric index (0-based) or boolean false if it cannot be calculated
*/
public static function IndexFromColumnLetter($Letter)
{
$Powers = array();
$Letter = strtoupper($Letter);
$Result = 0;
for ($i = strlen($Letter) - 1, $j = 0; $i >= 0; $i--, $j++)
{
$Ord = ord($Letter[$i]) - 64;
if ($Ord > 26)
{
// Something is very, very wrong
return false;
}
$Result += $Ord * pow(26, $j);
}
return $Result - 1;
}
/**
* Helper function for greatest common divisor calculation in case GMP extension is
* not enabled
*
* @param int Number #1
* @param int Number #2
*
* @param int Greatest common divisor
*/
public static function GCD($A, $B)
{
$A = abs($A);
$B = abs($B);
if ($A + $B == 0)
{
return 0;
}
else
{
$C = 1;
while ($A > 0)
{
$C = $A;
$A = $B % $A;
$B = $C;
}
return $C;
}
}
}
?>
<?php
/**
* A class for reading Microsoft Excel (97/2003) Spreadsheets.
*
* Version 2.21
*
* Enhanced and maintained by Matt Kruse < http://mattkruse.com >
* Maintained at http://code.google.com/p/php-excel-reader/
*
* Format parsing and MUCH more contributed by:
* Matt Roxburgh < http://www.roxburgh.me.uk >
*
* DOCUMENTATION
* =============
* http://code.google.com/p/php-excel-reader/wiki/Documentation
*
* CHANGE LOG
* ==========
* http://code.google.com/p/php-excel-reader/wiki/ChangeHistory
*
* DISCUSSION/SUPPORT
* ==================
* http://groups.google.com/group/php-excel-reader-discuss/topics
*
* --------------------------------------------------------------------------
*
* Originally developed by Vadim Tkachenko under the name PHPExcelReader.
* (http://sourceforge.net/projects/phpexcelreader)
* Based on the Java version by Andy Khan (http://www.andykhan.com). Now
* maintained by David Sanders. Reads only Biff 7 and Biff 8 formats.
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to [email protected] so we can mail you a copy immediately.
*
* @category Spreadsheet
* @package Spreadsheet_Excel_Reader
* @author Vadim Tkachenko <[email protected]>
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: reader.php 19 2007-03-13 12:42:41Z shangxiao $
* @link http://pear.php.net/package/Spreadsheet_Excel_Reader
* @see OLE, Spreadsheet_Excel_Writer
* --------------------------------------------------------------------------
*/
define('NUM_BIG_BLOCK_DEPOT_BLOCKS_POS', 0x2c);
define('SMALL_BLOCK_DEPOT_BLOCK_POS', 0x3c);
define('ROOT_START_BLOCK_POS', 0x30);
define('BIG_BLOCK_SIZE', 0x200);
define('SMALL_BLOCK_SIZE', 0x40);
define('EXTENSION_BLOCK_POS', 0x44);
define('NUM_EXTENSION_BLOCK_POS', 0x48);
define('PROPERTY_STORAGE_BLOCK_SIZE', 0x80);
define('BIG_BLOCK_DEPOT_BLOCKS_POS', 0x4c);
define('SMALL_BLOCK_THRESHOLD', 0x1000);
// property storage offsets
define('SIZE_OF_NAME_POS', 0x40);
define('TYPE_POS', 0x42);
define('START_BLOCK_POS', 0x74);
define('SIZE_POS', 0x78);
define('IDENTIFIER_OLE', pack("CCCCCCCC",0xd0,0xcf,0x11,0xe0,0xa1,0xb1,0x1a,0xe1));
function GetInt4d($data, $pos) {
$value = ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | (ord($data[$pos+3]) << 24);
if ($value>=4294967294) {
$value=-2;
}
return $value;
}
// http://uk.php.net/manual/en/function.getdate.php
function gmgetdate($ts = null){
$k = array('seconds','minutes','hours','mday','wday','mon','year','yday','weekday','month',0);
return(array_comb($k,explode(":",gmdate('s:i:G:j:w:n:Y:z:l:F:U',is_null($ts)?time():$ts))));
}
// Added for PHP4 compatibility
function array_comb($array1, $array2) {
$out = array();
foreach ($array1 as $key => $value) {
$out[$value] = $array2[$key];
}
return $out;
}
function v($data,$pos) {
return ord($data[$pos]) | ord($data[$pos+1])<<8;
}
class OLERead {
var $data = '';
function OLERead(){ }
function read($sFileName){
// check if file exist and is readable (Darko Miljanovic)
if(!is_readable($sFileName)) {
$this->error = 1;
return false;
}
$this->data = @file_get_contents($sFileName);
if (!$this->data) {
$this->error = 1;
return false;
}
if (substr($this->data, 0, 8) != IDENTIFIER_OLE) {
$this->error = 1;
return false;
}
$this->numBigBlockDepotBlocks = GetInt4d($this->data, NUM_BIG_BLOCK_DEPOT_BLOCKS_POS);
$this->sbdStartBlock = GetInt4d($this->data, SMALL_BLOCK_DEPOT_BLOCK_POS);
$this->rootStartBlock = GetInt4d($this->data, ROOT_START_BLOCK_POS);
$this->extensionBlock = GetInt4d($this->data, EXTENSION_BLOCK_POS);
$this->numExtensionBlocks = GetInt4d($this->data, NUM_EXTENSION_BLOCK_POS);
$bigBlockDepotBlocks = array();
$pos = BIG_BLOCK_DEPOT_BLOCKS_POS;
$bbdBlocks = $this->numBigBlockDepotBlocks;
if ($this->numExtensionBlocks != 0) {
$bbdBlocks = (BIG_BLOCK_SIZE - BIG_BLOCK_DEPOT_BLOCKS_POS)/4;
}
for ($i = 0; $i < $bbdBlocks; $i++) {
$bigBlockDepotBlocks[$i] = GetInt4d($this->data, $pos);
$pos += 4;
}
for ($j = 0; $j < $this->numExtensionBlocks; $j++) {
$pos = ($this->extensionBlock + 1) * BIG_BLOCK_SIZE;
$blocksToRead = min($this->numBigBlockDepotBlocks - $bbdBlocks, BIG_BLOCK_SIZE / 4 - 1);
for ($i = $bbdBlocks; $i < $bbdBlocks + $blocksToRead; $i++) {
$bigBlockDepotBlocks[$i] = GetInt4d($this->data, $pos);
$pos += 4;
}
$bbdBlocks += $blocksToRead;
if ($bbdBlocks < $this->numBigBlockDepotBlocks) {
$this->extensionBlock = GetInt4d($this->data, $pos);
}
}
// readBigBlockDepot
$pos = 0;
$index = 0;
$this->bigBlockChain = array();
for ($i = 0; $i < $this->numBigBlockDepotBlocks; $i++) {
$pos = ($bigBlockDepotBlocks[$i] + 1) * BIG_BLOCK_SIZE;
//echo "pos = $pos";
for ($j = 0 ; $j < BIG_BLOCK_SIZE / 4; $j++) {
$this->bigBlockChain[$index] = GetInt4d($this->data, $pos);
$pos += 4 ;
$index++;
}
}
// readSmallBlockDepot();
$pos = 0;
$index = 0;
$sbdBlock = $this->sbdStartBlock;
$this->smallBlockChain = array();
while ($sbdBlock != -2) {
$pos = ($sbdBlock + 1) * BIG_BLOCK_SIZE;
for ($j = 0; $j < BIG_BLOCK_SIZE / 4; $j++) {
$this->smallBlockChain[$index] = GetInt4d($this->data, $pos);
$pos += 4;
$index++;
}
$sbdBlock = $this->bigBlockChain[$sbdBlock];
}
// readData(rootStartBlock)
$block = $this->rootStartBlock;
$pos = 0;
$this->entry = $this->__readData($block);
$this->__readPropertySets();
}
function __readData($bl) {
$block = $bl;
$pos = 0;
$data = '';
while ($block != -2) {
$pos = ($block + 1) * BIG_BLOCK_SIZE;
$data = $data.substr($this->data, $pos, BIG_BLOCK_SIZE);
$block = $this->bigBlockChain[$block];
}
return $data;
}
function __readPropertySets(){
$offset = 0;
while ($offset < strlen($this->entry)) {
$d = substr($this->entry, $offset, PROPERTY_STORAGE_BLOCK_SIZE);
$nameSize = ord($d[SIZE_OF_NAME_POS]) | (ord($d[SIZE_OF_NAME_POS+1]) << 8);
$type = ord($d[TYPE_POS]);
$startBlock = GetInt4d($d, START_BLOCK_POS);
$size = GetInt4d($d, SIZE_POS);
$name = '';
for ($i = 0; $i < $nameSize ; $i++) {
$name .= $d[$i];
}
$name = str_replace("\x00", "", $name);
$this->props[] = array (
'name' => $name,
'type' => $type,
'startBlock' => $startBlock,
'size' => $size);
if ((strtolower($name) == "workbook") || ( strtolower($name) == "book")) {
$this->wrkbook = count($this->props) - 1;
}
if ($name == "Root Entry") {
$this->rootentry = count($this->props) - 1;
}
$offset += PROPERTY_STORAGE_BLOCK_SIZE;
}
}
function getWorkBook(){
if ($this->props[$this->wrkbook]['size'] < SMALL_BLOCK_THRESHOLD){
$rootdata = $this->__readData($this->props[$this->rootentry]['startBlock']);
$streamData = '';
$block = $this->props[$this->wrkbook]['startBlock'];
$pos = 0;
while ($block != -2) {
$pos = $block * SMALL_BLOCK_SIZE;
$streamData .= substr($rootdata, $pos, SMALL_BLOCK_SIZE);
$block = $this->smallBlockChain[$block];
}
return $streamData;
}else{
$numBlocks = $this->props[$this->wrkbook]['size'] / BIG_BLOCK_SIZE;
if ($this->props[$this->wrkbook]['size'] % BIG_BLOCK_SIZE != 0) {
$numBlocks++;
}
if ($numBlocks == 0) return '';
$streamData = '';
$block = $this->props[$this->wrkbook]['startBlock'];
$pos = 0;
while ($block != -2) {
$pos = ($block + 1) * BIG_BLOCK_SIZE;
$streamData .= substr($this->data, $pos, BIG_BLOCK_SIZE);
$block = $this->bigBlockChain[$block];
}
return $streamData;
}
}
}
define('SPREADSHEET_EXCEL_READER_BIFF8', 0x600);
define('SPREADSHEET_EXCEL_READER_BIFF7', 0x500);
define('SPREADSHEET_EXCEL_READER_WORKBOOKGLOBALS', 0x5);
define('SPREADSHEET_EXCEL_READER_WORKSHEET', 0x10);
define('SPREADSHEET_EXCEL_READER_TYPE_BOF', 0x809);
define('SPREADSHEET_EXCEL_READER_TYPE_EOF', 0x0a);
define('SPREADSHEET_EXCEL_READER_TYPE_BOUNDSHEET', 0x85);
define('SPREADSHEET_EXCEL_READER_TYPE_DIMENSION', 0x200);
define('SPREADSHEET_EXCEL_READER_TYPE_ROW', 0x208);
define('SPREADSHEET_EXCEL_READER_TYPE_DBCELL', 0xd7);
define('SPREADSHEET_EXCEL_READER_TYPE_FILEPASS', 0x2f);
define('SPREADSHEET_EXCEL_READER_TYPE_NOTE', 0x1c);
define('SPREADSHEET_EXCEL_READER_TYPE_TXO', 0x1b6);
define('SPREADSHEET_EXCEL_READER_TYPE_RK', 0x7e);
define('SPREADSHEET_EXCEL_READER_TYPE_RK2', 0x27e);
define('SPREADSHEET_EXCEL_READER_TYPE_MULRK', 0xbd);
define('SPREADSHEET_EXCEL_READER_TYPE_MULBLANK', 0xbe);
define('SPREADSHEET_EXCEL_READER_TYPE_INDEX', 0x20b);
define('SPREADSHEET_EXCEL_READER_TYPE_SST', 0xfc);
define('SPREADSHEET_EXCEL_READER_TYPE_EXTSST', 0xff);
define('SPREADSHEET_EXCEL_READER_TYPE_CONTINUE', 0x3c);
define('SPREADSHEET_EXCEL_READER_TYPE_LABEL', 0x204);
define('SPREADSHEET_EXCEL_READER_TYPE_LABELSST', 0xfd);
define('SPREADSHEET_EXCEL_READER_TYPE_NUMBER', 0x203);
define('SPREADSHEET_EXCEL_READER_TYPE_NAME', 0x18);
define('SPREADSHEET_EXCEL_READER_TYPE_ARRAY', 0x221);
define('SPREADSHEET_EXCEL_READER_TYPE_STRING', 0x207);
define('SPREADSHEET_EXCEL_READER_TYPE_FORMULA', 0x406);
define('SPREADSHEET_EXCEL_READER_TYPE_FORMULA2', 0x6);
define('SPREADSHEET_EXCEL_READER_TYPE_FORMAT', 0x41e);
define('SPREADSHEET_EXCEL_READER_TYPE_XF', 0xe0);
define('SPREADSHEET_EXCEL_READER_TYPE_BOOLERR', 0x205);
define('SPREADSHEET_EXCEL_READER_TYPE_FONT', 0x0031);
define('SPREADSHEET_EXCEL_READER_TYPE_PALETTE', 0x0092);
define('SPREADSHEET_EXCEL_READER_TYPE_UNKNOWN', 0xffff);
define('SPREADSHEET_EXCEL_READER_TYPE_NINETEENFOUR', 0x22);
define('SPREADSHEET_EXCEL_READER_TYPE_MERGEDCELLS', 0xE5);
define('SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS' , 25569);
define('SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS1904', 24107);
define('SPREADSHEET_EXCEL_READER_MSINADAY', 86400);
define('SPREADSHEET_EXCEL_READER_TYPE_HYPER', 0x01b8);
define('SPREADSHEET_EXCEL_READER_TYPE_COLINFO', 0x7d);
define('SPREADSHEET_EXCEL_READER_TYPE_DEFCOLWIDTH', 0x55);
define('SPREADSHEET_EXCEL_READER_TYPE_STANDARDWIDTH', 0x99);
define('SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT', "%s");
/*
* Main Class
*/
class Spreadsheet_Excel_Reader {
// MK: Added to make data retrieval easier
var $colnames = array();
var $colindexes = array();
var $standardColWidth = 0;
var $defaultColWidth = 0;
function myHex($d) {
if ($d < 16) return "0" . dechex($d);
return dechex($d);
}
function dumpHexData($data, $pos, $length) {
$info = "";
for ($i = 0; $i <= $length; $i++) {
$info .= ($i==0?"":" ") . $this->myHex(ord($data[$pos + $i])) . (ord($data[$pos + $i])>31? "[" . $data[$pos + $i] . "]":'');
}
return $info;
}
function getCol($col) {
if (is_string($col)) {
$col = strtolower($col);
if (array_key_exists($col,$this->colnames)) {
$col = $this->colnames[$col];
}
}
return $col;
}
// PUBLIC API FUNCTIONS
// --------------------
function val($row,$col,$sheet=0) {
$col = $this->getCol($col);
if (array_key_exists($row,$this->sheets[$sheet]['cells']) && array_key_exists($col,$this->sheets[$sheet]['cells'][$row])) {
return $this->sheets[$sheet]['cells'][$row][$col];
}
return "";
}
function value($row,$col,$sheet=0) {
return $this->val($row,$col,$sheet);
}
function info($row,$col,$type='',$sheet=0) {
$col = $this->getCol($col);
if (array_key_exists('cellsInfo',$this->sheets[$sheet])
&& array_key_exists($row,$this->sheets[$sheet]['cellsInfo'])
&& array_key_exists($col,$this->sheets[$sheet]['cellsInfo'][$row])
&& array_key_exists($type,$this->sheets[$sheet]['cellsInfo'][$row][$col])) {
return $this->sheets[$sheet]['cellsInfo'][$row][$col][$type];
}
return "";
}
function type($row,$col,$sheet=0) {
return $this->info($row,$col,'type',$sheet);
}
function raw($row,$col,$sheet=0) {
return $this->info($row,$col,'raw',$sheet);
}
function rowspan($row,$col,$sheet=0) {
$val = $this->info($row,$col,'rowspan',$sheet);
if ($val=="") { return 1; }
return $val;
}
function colspan($row,$col,$sheet=0) {
$val = $this->info($row,$col,'colspan',$sheet);
if ($val=="") { return 1; }
return $val;
}
function hyperlink($row,$col,$sheet=0) {
$link = $this->sheets[$sheet]['cellsInfo'][$row][$col]['hyperlink'];
if ($link) {
return $link['link'];
}
return '';
}
function rowcount($sheet=0) {
return $this->sheets[$sheet]['numRows'];
}
function colcount($sheet=0) {
return $this->sheets[$sheet]['numCols'];
}
function colwidth($col,$sheet=0) {
// Col width is actually the width of the number 0. So we have to estimate and come close
return $this->colInfo[$sheet][$col]['width']/9142*200;
}
function colhidden($col,$sheet=0) {
return !!$this->colInfo[$sheet][$col]['hidden'];
}
function rowheight($row,$sheet=0) {
return $this->rowInfo[$sheet][$row]['height'];
}
function rowhidden($row,$sheet=0) {
return !!$this->rowInfo[$sheet][$row]['hidden'];
}
// GET THE CSS FOR FORMATTING
// ==========================
function style($row,$col,$sheet=0,$properties='') {
$css = "";
$font=$this->font($row,$col,$sheet);
if ($font!="") {
$css .= "font-family:$font;";
}
$align=$this->align($row,$col,$sheet);
if ($align!="") {
$css .= "text-align:$align;";
}
$height=$this->height($row,$col,$sheet);
if ($height!="") {
$css .= "font-size:$height"."px;";
}
$bgcolor=$this->bgColor($row,$col,$sheet);
if ($bgcolor!="") {
$bgcolor = $this->colors[$bgcolor];
$css .= "background-color:$bgcolor;";
}
$color=$this->color($row,$col,$sheet);
if ($color!="") {
$css .= "color:$color;";
}
$bold=$this->bold($row,$col,$sheet);
if ($bold) {
$css .= "font-weight:bold;";
}
$italic=$this->italic($row,$col,$sheet);
if ($italic) {
$css .= "font-style:italic;";
}
$underline=$this->underline($row,$col,$sheet);
if ($underline) {
$css .= "text-decoration:underline;";
}
// Borders
$bLeft = $this->borderLeft($row,$col,$sheet);
$bRight = $this->borderRight($row,$col,$sheet);
$bTop = $this->borderTop($row,$col,$sheet);
$bBottom = $this->borderBottom($row,$col,$sheet);
$bLeftCol = $this->borderLeftColor($row,$col,$sheet);
$bRightCol = $this->borderRightColor($row,$col,$sheet);
$bTopCol = $this->borderTopColor($row,$col,$sheet);
$bBottomCol = $this->borderBottomColor($row,$col,$sheet);
// Try to output the minimal required style
if ($bLeft!="" && $bLeft==$bRight && $bRight==$bTop && $bTop==$bBottom) {
$css .= "border:" . $this->lineStylesCss[$bLeft] .";";
}
else {
if ($bLeft!="") { $css .= "border-left:" . $this->lineStylesCss[$bLeft] .";"; }
if ($bRight!="") { $css .= "border-right:" . $this->lineStylesCss[$bRight] .";"; }
if ($bTop!="") { $css .= "border-top:" . $this->lineStylesCss[$bTop] .";"; }
if ($bBottom!="") { $css .= "border-bottom:" . $this->lineStylesCss[$bBottom] .";"; }
}
// Only output border colors if there is an actual border specified
if ($bLeft!="" && $bLeftCol!="") { $css .= "border-left-color:" . $bLeftCol .";"; }
if ($bRight!="" && $bRightCol!="") { $css .= "border-right-color:" . $bRightCol .";"; }
if ($bTop!="" && $bTopCol!="") { $css .= "border-top-color:" . $bTopCol . ";"; }
if ($bBottom!="" && $bBottomCol!="") { $css .= "border-bottom-color:" . $bBottomCol .";"; }
return $css;
}
// FORMAT PROPERTIES
// =================
function format($row,$col,$sheet=0) {
return $this->info($row,$col,'format',$sheet);
}
function formatIndex($row,$col,$sheet=0) {
return $this->info($row,$col,'formatIndex',$sheet);
}
function formatColor($row,$col,$sheet=0) {
return $this->info($row,$col,'formatColor',$sheet);
}
// CELL (XF) PROPERTIES
// ====================
function xfRecord($row,$col,$sheet=0) {
$xfIndex = $this->info($row,$col,'xfIndex',$sheet);
if ($xfIndex!="") {
return $this->xfRecords[$xfIndex];
}
return null;
}
function xfProperty($row,$col,$sheet,$prop) {
$xfRecord = $this->xfRecord($row,$col,$sheet);
if ($xfRecord!=null) {
return $xfRecord[$prop];
}
return "";
}
function align($row,$col,$sheet=0) {
return $this->xfProperty($row,$col,$sheet,'align');
}
function bgColor($row,$col,$sheet=0) {
return $this->xfProperty($row,$col,$sheet,'bgColor');
}
function borderLeft($row,$col,$sheet=0) {
return $this->xfProperty($row,$col,$sheet,'borderLeft');
}
function borderRight($row,$col,$sheet=0) {
return $this->xfProperty($row,$col,$sheet,'borderRight');
}
function borderTop($row,$col,$sheet=0) {
return $this->xfProperty($row,$col,$sheet,'borderTop');
}
function borderBottom($row,$col,$sheet=0) {
return $this->xfProperty($row,$col,$sheet,'borderBottom');
}
function borderLeftColor($row,$col,$sheet=0) {
return $this->colors[$this->xfProperty($row,$col,$sheet,'borderLeftColor')];
}
function borderRightColor($row,$col,$sheet=0) {
return $this->colors[$this->xfProperty($row,$col,$sheet,'borderRightColor')];
}
function borderTopColor($row,$col,$sheet=0) {
return $this->colors[$this->xfProperty($row,$col,$sheet,'borderTopColor')];
}
function borderBottomColor($row,$col,$sheet=0) {
return $this->colors[$this->xfProperty($row,$col,$sheet,'borderBottomColor')];
}
// FONT PROPERTIES
// ===============
function fontRecord($row,$col,$sheet=0) {
$xfRecord = $this->xfRecord($row,$col,$sheet);
if ($xfRecord!=null) {
$font = $xfRecord['fontIndex'];
if ($font!=null) {
return $this->fontRecords[$font];
}
}
return null;
}
function fontProperty($row,$col,$sheet=0,$prop) {
$font = $this->fontRecord($row,$col,$sheet);
if ($font!=null) {
return $font[$prop];
}
return false;
}
function fontIndex($row,$col,$sheet=0) {
return $this->xfProperty($row,$col,$sheet,'fontIndex');
}
function color($row,$col,$sheet=0) {
$formatColor = $this->formatColor($row,$col,$sheet);
if ($formatColor!="") {
return $formatColor;
}
$ci = $this->fontProperty($row,$col,$sheet,'color');
return $this->rawColor($ci);
}
function rawColor($ci) {
if (($ci <> 0x7FFF) && ($ci <> '')) {
return $this->colors[$ci];
}
return "";
}
function bold($row,$col,$sheet=0) {
return $this->fontProperty($row,$col,$sheet,'bold');
}
function italic($row,$col,$sheet=0) {
return $this->fontProperty($row,$col,$sheet,'italic');
}
function underline($row,$col,$sheet=0) {
return $this->fontProperty($row,$col,$sheet,'under');
}
function height($row,$col,$sheet=0) {
return $this->fontProperty($row,$col,$sheet,'height');
}
function font($row,$col,$sheet=0) {
return $this->fontProperty($row,$col,$sheet,'font');
}
// DUMP AN HTML TABLE OF THE ENTIRE XLS DATA
// =========================================
function dump($row_numbers=false,$col_letters=false,$sheet=0,$table_class='excel') {
$out = "<table class=\"$table_class\" cellspacing=0>";
if ($col_letters) {
$out .= "<thead>\n\t<tr>";
if ($row_numbers) {
$out .= "\n\t\t<th>&nbsp</th>";
}
for($i=1;$i<=$this->colcount($sheet);$i++) {
$style = "width:" . ($this->colwidth($i,$sheet)*1) . "px;";
if ($this->colhidden($i,$sheet)) {
$style .= "display:none;";
}
$out .= "\n\t\t<th style=\"$style\">" . strtoupper($this->colindexes[$i]) . "</th>";
}
$out .= "</tr></thead>\n";
}
$out .= "<tbody>\n";
for($row=1;$row<=$this->rowcount($sheet);$row++) {
$rowheight = $this->rowheight($row,$sheet);
$style = "height:" . ($rowheight*(4/3)) . "px;";
if ($this->rowhidden($row,$sheet)) {
$style .= "display:none;";
}
$out .= "\n\t<tr style=\"$style\">";
if ($row_numbers) {
$out .= "\n\t\t<th>$row</th>";
}
for($col=1;$col<=$this->colcount($sheet);$col++) {
// Account for Rowspans/Colspans
$rowspan = $this->rowspan($row,$col,$sheet);
$colspan = $this->colspan($row,$col,$sheet);
for($i=0;$i<$rowspan;$i++) {
for($j=0;$j<$colspan;$j++) {
if ($i>0 || $j>0) {
$this->sheets[$sheet]['cellsInfo'][$row+$i][$col+$j]['dontprint']=1;
}
}
}
if(!$this->sheets[$sheet]['cellsInfo'][$row][$col]['dontprint']) {
$style = $this->style($row,$col,$sheet);
if ($this->colhidden($col,$sheet)) {
$style .= "display:none;";
}
$out .= "\n\t\t<td style=\"$style\"" . ($colspan > 1?" colspan=$colspan":"") . ($rowspan > 1?" rowspan=$rowspan":"") . ">";
$val = $this->val($row,$col,$sheet);
if ($val=='') { $val="&nbsp;"; }
else {
$val = htmlentities($val);
$link = $this->hyperlink($row,$col,$sheet);
if ($link!='') {
$val = "<a href=\"$link\">$val</a>";
}
}
$out .= "<nobr>".nl2br($val)."</nobr>";
$out .= "</td>";
}
}
$out .= "</tr>\n";
}
$out .= "</tbody></table>";
return $out;
}
// --------------
// END PUBLIC API
var $boundsheets = array();
var $formatRecords = array();
var $fontRecords = array();
var $xfRecords = array();
var $colInfo = array();
var $rowInfo = array();
var $sst = array();
var $sheets = array();
var $data;
var $_ole;
var $_defaultEncoding = "UTF-8";
var $_defaultFormat = SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT;
var $_columnsFormat = array();
var $_rowoffset = 1;
var $_coloffset = 1;
/**
* List of default date formats used by Excel
*/
var $dateFormats = array (
0xe => "m/d/Y",
0xf => "M-d-Y",
0x10 => "d-M",
0x11 => "M-Y",
0x12 => "h:i a",
0x13 => "h:i:s a",
0x14 => "H:i",
0x15 => "H:i:s",
0x16 => "d/m/Y H:i",
0x2d => "i:s",
0x2e => "H:i:s",
0x2f => "i:s.S"
);
/**
* Default number formats used by Excel
*/
var $numberFormats = array(
0x1 => "0",
0x2 => "0.00",
0x3 => "#,##0",
0x4 => "#,##0.00",
0x5 => "\$#,##0;(\$#,##0)",
0x6 => "\$#,##0;[Red](\$#,##0)",
0x7 => "\$#,##0.00;(\$#,##0.00)",
0x8 => "\$#,##0.00;[Red](\$#,##0.00)",
0x9 => "0%",
0xa => "0.00%",
0xb => "0.00E+00",
0x25 => "#,##0;(#,##0)",
0x26 => "#,##0;[Red](#,##0)",
0x27 => "#,##0.00;(#,##0.00)",
0x28 => "#,##0.00;[Red](#,##0.00)",
0x29 => "#,##0;(#,##0)", // Not exactly
0x2a => "\$#,##0;(\$#,##0)", // Not exactly
0x2b => "#,##0.00;(#,##0.00)", // Not exactly
0x2c => "\$#,##0.00;(\$#,##0.00)", // Not exactly
0x30 => "##0.0E+0"
);
var $colors = Array(
0x00 => "#000000",
0x01 => "#FFFFFF",
0x02 => "#FF0000",
0x03 => "#00FF00",
0x04 => "#0000FF",
0x05 => "#FFFF00",
0x06 => "#FF00FF",
0x07 => "#00FFFF",
0x08 => "#000000",
0x09 => "#FFFFFF",
0x0A => "#FF0000",
0x0B => "#00FF00",
0x0C => "#0000FF",
0x0D => "#FFFF00",
0x0E => "#FF00FF",
0x0F => "#00FFFF",
0x10 => "#800000",
0x11 => "#008000",
0x12 => "#000080",
0x13 => "#808000",
0x14 => "#800080",
0x15 => "#008080",
0x16 => "#C0C0C0",
0x17 => "#808080",
0x18 => "#9999FF",
0x19 => "#993366",
0x1A => "#FFFFCC",
0x1B => "#CCFFFF",
0x1C => "#660066",
0x1D => "#FF8080",
0x1E => "#0066CC",
0x1F => "#CCCCFF",
0x20 => "#000080",
0x21 => "#FF00FF",
0x22 => "#FFFF00",
0x23 => "#00FFFF",
0x24 => "#800080",
0x25 => "#800000",
0x26 => "#008080",
0x27 => "#0000FF",
0x28 => "#00CCFF",
0x29 => "#CCFFFF",
0x2A => "#CCFFCC",
0x2B => "#FFFF99",
0x2C => "#99CCFF",
0x2D => "#FF99CC",
0x2E => "#CC99FF",
0x2F => "#FFCC99",
0x30 => "#3366FF",
0x31 => "#33CCCC",
0x32 => "#99CC00",
0x33 => "#FFCC00",
0x34 => "#FF9900",
0x35 => "#FF6600",
0x36 => "#666699",
0x37 => "#969696",
0x38 => "#003366",
0x39 => "#339966",
0x3A => "#003300",
0x3B => "#333300",
0x3C => "#993300",
0x3D => "#993366",
0x3E => "#333399",
0x3F => "#333333",
0x40 => "#000000",
0x41 => "#FFFFFF",
0x43 => "#000000",
0x4D => "#000000",
0x4E => "#FFFFFF",
0x4F => "#000000",
0x50 => "#FFFFFF",
0x51 => "#000000",
0x7FFF => "#000000"
);
var $lineStyles = array(
0x00 => "",
0x01 => "Thin",
0x02 => "Medium",
0x03 => "Dashed",
0x04 => "Dotted",
0x05 => "Thick",
0x06 => "Double",
0x07 => "Hair",
0x08 => "Medium dashed",
0x09 => "Thin dash-dotted",
0x0A => "Medium dash-dotted",
0x0B => "Thin dash-dot-dotted",
0x0C => "Medium dash-dot-dotted",
0x0D => "Slanted medium dash-dotted"
);
var $lineStylesCss = array(
"Thin" => "1px solid",
"Medium" => "2px solid",
"Dashed" => "1px dashed",
"Dotted" => "1px dotted",
"Thick" => "3px solid",
"Double" => "double",
"Hair" => "1px solid",
"Medium dashed" => "2px dashed",
"Thin dash-dotted" => "1px dashed",
"Medium dash-dotted" => "2px dashed",
"Thin dash-dot-dotted" => "1px dashed",
"Medium dash-dot-dotted" => "2px dashed",
"Slanted medium dash-dotte" => "2px dashed"
);
function read16bitstring($data, $start) {
$len = 0;
while (ord($data[$start + $len]) + ord($data[$start + $len + 1]) > 0) $len++;
return substr($data, $start, $len);
}
// ADDED by Matt Kruse for better formatting
function _format_value($format,$num,$f) {
// 49==TEXT format
// http://code.google.com/p/php-excel-reader/issues/detail?id=7
if ( (!$f && $format=="%s") || ($f==49) || ($format=="GENERAL") ) {
return array('string'=>$num, 'formatColor'=>null);
}
// Custom pattern can be POSITIVE;NEGATIVE;ZERO
// The "text" option as 4th parameter is not handled
$parts = explode(";",$format);
$pattern = $parts[0];
// Negative pattern
if (count($parts)>2 && $num==0) {
$pattern = $parts[2];
}
// Zero pattern
if (count($parts)>1 && $num<0) {
$pattern = $parts[1];
$num = abs($num);
}
$color = "";
$matches = array();
$color_regex = "/^\[(BLACK|BLUE|CYAN|GREEN|MAGENTA|RED|WHITE|YELLOW)\]/i";
if (preg_match($color_regex,$pattern,$matches)) {
$color = strtolower($matches[1]);
$pattern = preg_replace($color_regex,"",$pattern);
}
// In Excel formats, "_" is used to add spacing, which we can't do in HTML
$pattern = preg_replace("/_./","",$pattern);
// Some non-number characters are escaped with \, which we don't need
$pattern = preg_replace("/\\\/","",$pattern);
// Some non-number strings are quoted, so we'll get rid of the quotes
$pattern = preg_replace("/\"/","",$pattern);
// TEMPORARY - Convert # to 0
$pattern = preg_replace("/\#/","0",$pattern);
// Find out if we need comma formatting
$has_commas = preg_match("/,/",$pattern);
if ($has_commas) {
$pattern = preg_replace("/,/","",$pattern);
}
// Handle Percentages
if (preg_match("/\d(\%)([^\%]|$)/",$pattern,$matches)) {
$num = $num * 100;
$pattern = preg_replace("/(\d)(\%)([^\%]|$)/","$1%$3",$pattern);
}
// Handle the number itself
$number_regex = "/(\d+)(\.?)(\d*)/";
if (preg_match($number_regex,$pattern,$matches)) {
$left = $matches[1];
$dec = $matches[2];
$right = $matches[3];
if ($has_commas) {
$formatted = number_format($num,strlen($right));
}
else {
$sprintf_pattern = "%1.".strlen($right)."f";
$formatted = sprintf($sprintf_pattern, $num);
}
$pattern = preg_replace($number_regex, $formatted, $pattern);
}
return array(
'string'=>$pattern,
'formatColor'=>$color
);
}
/**
* Constructor
*
* Some basic initialisation
*/
function Spreadsheet_Excel_Reader($file='',$store_extended_info=true,$outputEncoding='') {
$this->_ole = new OLERead();
$this->setUTFEncoder('iconv');
if ($outputEncoding != '') {
$this->setOutputEncoding($outputEncoding);
}
for ($i=1; $i<245; $i++) {
$name = strtolower(( (($i-1)/26>=1)?chr(($i-1)/26+64):'') . chr(($i-1)%26+65));
$this->colnames[$name] = $i;
$this->colindexes[$i] = $name;
}
$this->store_extended_info = $store_extended_info;
if ($file!="") {
$this->read($file);
}
}
/**
* Set the encoding method
*/
function setOutputEncoding($encoding) {
$this->_defaultEncoding = $encoding;
}
/**
* $encoder = 'iconv' or 'mb'
* set iconv if you would like use 'iconv' for encode UTF-16LE to your encoding
* set mb if you would like use 'mb_convert_encoding' for encode UTF-16LE to your encoding
*/
function setUTFEncoder($encoder = 'iconv') {
$this->_encoderFunction = '';
if ($encoder == 'iconv') {
$this->_encoderFunction = function_exists('iconv') ? 'iconv' : '';
} elseif ($encoder == 'mb') {
$this->_encoderFunction = function_exists('mb_convert_encoding') ? 'mb_convert_encoding' : '';
}
}
function setRowColOffset($iOffset) {
$this->_rowoffset = $iOffset;
$this->_coloffset = $iOffset;
}
/**
* Set the default number format
*/
function setDefaultFormat($sFormat) {
$this->_defaultFormat = $sFormat;
}
/**
* Force a column to use a certain format
*/
function setColumnFormat($column, $sFormat) {
$this->_columnsFormat[$column] = $sFormat;
}
/**
* Read the spreadsheet file using OLE, then parse
*/
function read($sFileName) {
$res = $this->_ole->read($sFileName);
// oops, something goes wrong (Darko Miljanovic)
if($res === false) {
// check error code
if($this->_ole->error == 1) {
// bad file
die('The filename ' . $sFileName . ' is not readable');
}
// check other error codes here (eg bad fileformat, etc...)
}
$this->data = $this->_ole->getWorkBook();
$this->_parse();
}
/**
* Parse a workbook
*
* @access private
* @return bool
*/
function _parse() {
$pos = 0;
$data = $this->data;
$code = v($data,$pos);
$length = v($data,$pos+2);
$version = v($data,$pos+4);
$substreamType = v($data,$pos+6);
$this->version = $version;
if (($version != SPREADSHEET_EXCEL_READER_BIFF8) &&
($version != SPREADSHEET_EXCEL_READER_BIFF7)) {
return false;
}
if ($substreamType != SPREADSHEET_EXCEL_READER_WORKBOOKGLOBALS){
return false;
}
$pos += $length + 4;
$code = v($data,$pos);
$length = v($data,$pos+2);
while ($code != SPREADSHEET_EXCEL_READER_TYPE_EOF) {
switch ($code) {
case SPREADSHEET_EXCEL_READER_TYPE_SST:
$spos = $pos + 4;
$limitpos = $spos + $length;
$uniqueStrings = $this->_GetInt4d($data, $spos+4);
$spos += 8;
for ($i = 0; $i < $uniqueStrings; $i++) {
// Read in the number of characters
if ($spos == $limitpos) {
$opcode = v($data,$spos);
$conlength = v($data,$spos+2);
if ($opcode != 0x3c) {
return -1;
}
$spos += 4;
$limitpos = $spos + $conlength;
}
$numChars = ord($data[$spos]) | (ord($data[$spos+1]) << 8);
$spos += 2;
$optionFlags = ord($data[$spos]);
$spos++;
$asciiEncoding = (($optionFlags & 0x01) == 0) ;
$extendedString = ( ($optionFlags & 0x04) != 0);
// See if string contains formatting information
$richString = ( ($optionFlags & 0x08) != 0);
if ($richString) {
// Read in the crun
$formattingRuns = v($data,$spos);
$spos += 2;
}
if ($extendedString) {
// Read in cchExtRst
$extendedRunLength = $this->_GetInt4d($data, $spos);
$spos += 4;
}
$len = ($asciiEncoding)? $numChars : $numChars*2;
if ($spos + $len < $limitpos) {
$retstr = substr($data, $spos, $len);
$spos += $len;
}
else{
// found countinue
$retstr = substr($data, $spos, $limitpos - $spos);
$bytesRead = $limitpos - $spos;
$charsLeft = $numChars - (($asciiEncoding) ? $bytesRead : ($bytesRead / 2));
$spos = $limitpos;
while ($charsLeft > 0){
$opcode = v($data,$spos);
$conlength = v($data,$spos+2);
if ($opcode != 0x3c) {
return -1;
}
$spos += 4;
$limitpos = $spos + $conlength;
$option = ord($data[$spos]);
$spos += 1;
if ($asciiEncoding && ($option == 0)) {
$len = min($charsLeft, $limitpos - $spos); // min($charsLeft, $conlength);
$retstr .= substr($data, $spos, $len);
$charsLeft -= $len;
$asciiEncoding = true;
}
elseif (!$asciiEncoding && ($option != 0)) {
$len = min($charsLeft * 2, $limitpos - $spos); // min($charsLeft, $conlength);
$retstr .= substr($data, $spos, $len);
$charsLeft -= $len/2;
$asciiEncoding = false;
}
elseif (!$asciiEncoding && ($option == 0)) {
// Bummer - the string starts off as Unicode, but after the
// continuation it is in straightforward ASCII encoding
$len = min($charsLeft, $limitpos - $spos); // min($charsLeft, $conlength);
for ($j = 0; $j < $len; $j++) {
$retstr .= $data[$spos + $j].chr(0);
}
$charsLeft -= $len;
$asciiEncoding = false;
}
else{
$newstr = '';
for ($j = 0; $j < strlen($retstr); $j++) {
$newstr = $retstr[$j].chr(0);
}
$retstr = $newstr;
$len = min($charsLeft * 2, $limitpos - $spos); // min($charsLeft, $conlength);
$retstr .= substr($data, $spos, $len);
$charsLeft -= $len/2;
$asciiEncoding = false;
}
$spos += $len;
}
}
$retstr = ($asciiEncoding) ? $retstr : $this->_encodeUTF16($retstr);
if ($richString){
$spos += 4 * $formattingRuns;
}
// For extended strings, skip over the extended string data
if ($extendedString) {
$spos += $extendedRunLength;
}
$this->sst[]=$retstr;
}
break;
case SPREADSHEET_EXCEL_READER_TYPE_FILEPASS:
return false;
break;
case SPREADSHEET_EXCEL_READER_TYPE_NAME:
break;
case SPREADSHEET_EXCEL_READER_TYPE_FORMAT:
$indexCode = v($data,$pos+4);
if ($version == SPREADSHEET_EXCEL_READER_BIFF8) {
$numchars = v($data,$pos+6);
if (ord($data[$pos+8]) == 0){
$formatString = substr($data, $pos+9, $numchars);
} else {
$formatString = substr($data, $pos+9, $numchars*2);
}
} else {
$numchars = ord($data[$pos+6]);
$formatString = substr($data, $pos+7, $numchars*2);
}
$this->formatRecords[$indexCode] = $formatString;
break;
case SPREADSHEET_EXCEL_READER_TYPE_FONT:
$height = v($data,$pos+4);
$option = v($data,$pos+6);
$color = v($data,$pos+8);
$weight = v($data,$pos+10);
$under = ord($data[$pos+14]);
$font = "";
// Font name
$numchars = ord($data[$pos+18]);
if ((ord($data[$pos+19]) & 1) == 0){
$font = substr($data, $pos+20, $numchars);
} else {
$font = substr($data, $pos+20, $numchars*2);
$font = $this->_encodeUTF16($font);
}
$this->fontRecords[] = array(
'height' => $height / 20,
'italic' => !!($option & 2),
'color' => $color,
'under' => !($under==0),
'bold' => ($weight==700),
'font' => $font,
'raw' => $this->dumpHexData($data, $pos+3, $length)
);
break;
case SPREADSHEET_EXCEL_READER_TYPE_PALETTE:
$colors = ord($data[$pos+4]) | ord($data[$pos+5]) << 8;
for ($coli = 0; $coli < $colors; $coli++) {
$colOff = $pos + 2 + ($coli * 4);
$colr = ord($data[$colOff]);
$colg = ord($data[$colOff+1]);
$colb = ord($data[$colOff+2]);
$this->colors[0x07 + $coli] = '#' . $this->myhex($colr) . $this->myhex($colg) . $this->myhex($colb);
}
break;
case SPREADSHEET_EXCEL_READER_TYPE_XF:
$fontIndexCode = (ord($data[$pos+4]) | ord($data[$pos+5]) << 8) - 1;
$fontIndexCode = max(0,$fontIndexCode);
$indexCode = ord($data[$pos+6]) | ord($data[$pos+7]) << 8;
$alignbit = ord($data[$pos+10]) & 3;
$bgi = (ord($data[$pos+22]) | ord($data[$pos+23]) << 8) & 0x3FFF;
$bgcolor = ($bgi & 0x7F);
// $bgcolor = ($bgi & 0x3f80) >> 7;
$align = "";
if ($alignbit==3) { $align="right"; }
if ($alignbit==2) { $align="center"; }
$fillPattern = (ord($data[$pos+21]) & 0xFC) >> 2;
if ($fillPattern == 0) {
$bgcolor = "";
}
$xf = array();
$xf['formatIndex'] = $indexCode;
$xf['align'] = $align;
$xf['fontIndex'] = $fontIndexCode;
$xf['bgColor'] = $bgcolor;
$xf['fillPattern'] = $fillPattern;
$border = ord($data[$pos+14]) | (ord($data[$pos+15]) << 8) | (ord($data[$pos+16]) << 16) | (ord($data[$pos+17]) << 24);
$xf['borderLeft'] = $this->lineStyles[($border & 0xF)];
$xf['borderRight'] = $this->lineStyles[($border & 0xF0) >> 4];
$xf['borderTop'] = $this->lineStyles[($border & 0xF00) >> 8];
$xf['borderBottom'] = $this->lineStyles[($border & 0xF000) >> 12];
$xf['borderLeftColor'] = ($border & 0x7F0000) >> 16;
$xf['borderRightColor'] = ($border & 0x3F800000) >> 23;
$border = (ord($data[$pos+18]) | ord($data[$pos+19]) << 8);
$xf['borderTopColor'] = ($border & 0x7F);
$xf['borderBottomColor'] = ($border & 0x3F80) >> 7;
if (array_key_exists($indexCode, $this->dateFormats)) {
$xf['type'] = 'date';
$xf['format'] = $this->dateFormats[$indexCode];
if ($align=='') { $xf['align'] = 'right'; }
}elseif (array_key_exists($indexCode, $this->numberFormats)) {
$xf['type'] = 'number';
$xf['format'] = $this->numberFormats[$indexCode];
if ($align=='') { $xf['align'] = 'right'; }
}else{
$isdate = FALSE;
$formatstr = '';
if ($indexCode > 0){
if (isset($this->formatRecords[$indexCode]))
$formatstr = $this->formatRecords[$indexCode];
if ($formatstr!="") {
$tmp = preg_replace("/\;.*/","",$formatstr);
$tmp = preg_replace("/^\[[^\]]*\]/","",$tmp);
if (preg_match("/[^hmsday\/\-:\s\\\,AMP]/i", $tmp) == 0) { // found day and time format
$isdate = TRUE;
$formatstr = $tmp;
$formatstr = str_replace(array('AM/PM','mmmm','mmm'), array('a','F','M'), $formatstr);
// m/mm are used for both minutes and months - oh SNAP!
// This mess tries to fix for that.
// 'm' == minutes only if following h/hh or preceding s/ss
$formatstr = preg_replace("/(h:?)mm?/","$1i", $formatstr);
$formatstr = preg_replace("/mm?(:?s)/","i$1", $formatstr);
// A single 'm' = n in PHP
$formatstr = preg_replace("/(^|[^m])m([^m]|$)/", '$1n$2', $formatstr);
$formatstr = preg_replace("/(^|[^m])m([^m]|$)/", '$1n$2', $formatstr);
// else it's months
$formatstr = str_replace('mm', 'm', $formatstr);
// Convert single 'd' to 'j'
$formatstr = preg_replace("/(^|[^d])d([^d]|$)/", '$1j$2', $formatstr);
$formatstr = str_replace(array('dddd','ddd','dd','yyyy','yy','hh','h'), array('l','D','d','Y','y','H','g'), $formatstr);
$formatstr = preg_replace("/ss?/", 's', $formatstr);
}
}
}
if ($isdate){
$xf['type'] = 'date';
$xf['format'] = $formatstr;
if ($align=='') { $xf['align'] = 'right'; }
}else{
// If the format string has a 0 or # in it, we'll assume it's a number
if (preg_match("/[0#]/", $formatstr)) {
$xf['type'] = 'number';
if ($align=='') { $xf['align']='right'; }
}
else {
$xf['type'] = 'other';
}
$xf['format'] = $formatstr;
$xf['code'] = $indexCode;
}
}
$this->xfRecords[] = $xf;
break;
case SPREADSHEET_EXCEL_READER_TYPE_NINETEENFOUR:
$this->nineteenFour = (ord($data[$pos+4]) == 1);
break;
case SPREADSHEET_EXCEL_READER_TYPE_BOUNDSHEET:
$rec_offset = $this->_GetInt4d($data, $pos+4);
$rec_typeFlag = ord($data[$pos+8]);
$rec_visibilityFlag = ord($data[$pos+9]);
$rec_length = ord($data[$pos+10]);
if ($version == SPREADSHEET_EXCEL_READER_BIFF8){
$chartype = ord($data[$pos+11]);
if ($chartype == 0){
$rec_name = substr($data, $pos+12, $rec_length);
} else {
$rec_name = $this->_encodeUTF16(substr($data, $pos+12, $rec_length*2));
}
}elseif ($version == SPREADSHEET_EXCEL_READER_BIFF7){
$rec_name = substr($data, $pos+11, $rec_length);
}
$this->boundsheets[] = array('name'=>$rec_name,'offset'=>$rec_offset);
break;
}
$pos += $length + 4;
$code = ord($data[$pos]) | ord($data[$pos+1])<<8;
$length = ord($data[$pos+2]) | ord($data[$pos+3])<<8;
}
foreach ($this->boundsheets as $key=>$val){
$this->sn = $key;
$this->_parsesheet($val['offset']);
}
return true;
}
/**
* Parse a worksheet
*/
function _parsesheet($spos) {
$cont = true;
$data = $this->data;
// read BOF
$code = ord($data[$spos]) | ord($data[$spos+1])<<8;
$length = ord($data[$spos+2]) | ord($data[$spos+3])<<8;
$version = ord($data[$spos + 4]) | ord($data[$spos + 5])<<8;
$substreamType = ord($data[$spos + 6]) | ord($data[$spos + 7])<<8;
if (($version != SPREADSHEET_EXCEL_READER_BIFF8) && ($version != SPREADSHEET_EXCEL_READER_BIFF7)) {
return -1;
}
if ($substreamType != SPREADSHEET_EXCEL_READER_WORKSHEET){
return -2;
}
$spos += $length + 4;
while($cont) {
$lowcode = ord($data[$spos]);
if ($lowcode == SPREADSHEET_EXCEL_READER_TYPE_EOF) break;
$code = $lowcode | ord($data[$spos+1])<<8;
$length = ord($data[$spos+2]) | ord($data[$spos+3])<<8;
$spos += 4;
$this->sheets[$this->sn]['maxrow'] = $this->_rowoffset - 1;
$this->sheets[$this->sn]['maxcol'] = $this->_coloffset - 1;
unset($this->rectype);
switch ($code) {
case SPREADSHEET_EXCEL_READER_TYPE_DIMENSION:
if (!isset($this->numRows)) {
if (($length == 10) || ($version == SPREADSHEET_EXCEL_READER_BIFF7)){
$this->sheets[$this->sn]['numRows'] = ord($data[$spos+2]) | ord($data[$spos+3]) << 8;
$this->sheets[$this->sn]['numCols'] = ord($data[$spos+6]) | ord($data[$spos+7]) << 8;
} else {
$this->sheets[$this->sn]['numRows'] = ord($data[$spos+4]) | ord($data[$spos+5]) << 8;
$this->sheets[$this->sn]['numCols'] = ord($data[$spos+10]) | ord($data[$spos+11]) << 8;
}
}
break;
case SPREADSHEET_EXCEL_READER_TYPE_MERGEDCELLS:
$cellRanges = ord($data[$spos]) | ord($data[$spos+1])<<8;
for ($i = 0; $i < $cellRanges; $i++) {
$fr = ord($data[$spos + 8*$i + 2]) | ord($data[$spos + 8*$i + 3])<<8;
$lr = ord($data[$spos + 8*$i + 4]) | ord($data[$spos + 8*$i + 5])<<8;
$fc = ord($data[$spos + 8*$i + 6]) | ord($data[$spos + 8*$i + 7])<<8;
$lc = ord($data[$spos + 8*$i + 8]) | ord($data[$spos + 8*$i + 9])<<8;
if ($lr - $fr > 0) {
$this->sheets[$this->sn]['cellsInfo'][$fr+1][$fc+1]['rowspan'] = $lr - $fr + 1;
}
if ($lc - $fc > 0) {
$this->sheets[$this->sn]['cellsInfo'][$fr+1][$fc+1]['colspan'] = $lc - $fc + 1;
}
}
break;
case SPREADSHEET_EXCEL_READER_TYPE_RK:
case SPREADSHEET_EXCEL_READER_TYPE_RK2:
$row = ord($data[$spos]) | ord($data[$spos+1])<<8;
$column = ord($data[$spos+2]) | ord($data[$spos+3])<<8;
$rknum = $this->_GetInt4d($data, $spos + 6);
$numValue = $this->_GetIEEE754($rknum);
$info = $this->_getCellDetails($spos,$numValue,$column);
$this->addcell($row, $column, $info['string'],$info);
break;
case SPREADSHEET_EXCEL_READER_TYPE_LABELSST:
$row = ord($data[$spos]) | ord($data[$spos+1])<<8;
$column = ord($data[$spos+2]) | ord($data[$spos+3])<<8;
$xfindex = ord($data[$spos+4]) | ord($data[$spos+5])<<8;
$index = $this->_GetInt4d($data, $spos + 6);
$this->addcell($row, $column, $this->sst[$index], array('xfIndex'=>$xfindex) );
break;
case SPREADSHEET_EXCEL_READER_TYPE_MULRK:
$row = ord($data[$spos]) | ord($data[$spos+1])<<8;
$colFirst = ord($data[$spos+2]) | ord($data[$spos+3])<<8;
$colLast = ord($data[$spos + $length - 2]) | ord($data[$spos + $length - 1])<<8;
$columns = $colLast - $colFirst + 1;
$tmppos = $spos+4;
for ($i = 0; $i < $columns; $i++) {
$numValue = $this->_GetIEEE754($this->_GetInt4d($data, $tmppos + 2));
$info = $this->_getCellDetails($tmppos-4,$numValue,$colFirst + $i + 1);
$tmppos += 6;
$this->addcell($row, $colFirst + $i, $info['string'], $info);
}
break;
case SPREADSHEET_EXCEL_READER_TYPE_NUMBER:
$row = ord($data[$spos]) | ord($data[$spos+1])<<8;
$column = ord($data[$spos+2]) | ord($data[$spos+3])<<8;
$tmp = unpack("ddouble", substr($data, $spos + 6, 8)); // It machine machine dependent
if ($this->isDate($spos)) {
$numValue = $tmp['double'];
}
else {
$numValue = $this->createNumber($spos);
}
$info = $this->_getCellDetails($spos,$numValue,$column);
$this->addcell($row, $column, $info['string'], $info);
break;
case SPREADSHEET_EXCEL_READER_TYPE_FORMULA:
case SPREADSHEET_EXCEL_READER_TYPE_FORMULA2:
$row = ord($data[$spos]) | ord($data[$spos+1])<<8;
$column = ord($data[$spos+2]) | ord($data[$spos+3])<<8;
if ((ord($data[$spos+6])==0) && (ord($data[$spos+12])==255) && (ord($data[$spos+13])==255)) {
//String formula. Result follows in a STRING record
// This row/col are stored to be referenced in that record
// http://code.google.com/p/php-excel-reader/issues/detail?id=4
$previousRow = $row;
$previousCol = $column;
} elseif ((ord($data[$spos+6])==1) && (ord($data[$spos+12])==255) && (ord($data[$spos+13])==255)) {
//Boolean formula. Result is in +2; 0=false,1=true
// http://code.google.com/p/php-excel-reader/issues/detail?id=4
if (ord($this->data[$spos+8])==1) {
$this->addcell($row, $column, "TRUE");
} else {
$this->addcell($row, $column, "FALSE");
}
} elseif ((ord($data[$spos+6])==2) && (ord($data[$spos+12])==255) && (ord($data[$spos+13])==255)) {
//Error formula. Error code is in +2;
} elseif ((ord($data[$spos+6])==3) && (ord($data[$spos+12])==255) && (ord($data[$spos+13])==255)) {
//Formula result is a null string.
$this->addcell($row, $column, '');
} else {
// result is a number, so first 14 bytes are just like a _NUMBER record
$tmp = unpack("ddouble", substr($data, $spos + 6, 8)); // It machine machine dependent
if ($this->isDate($spos)) {
$numValue = $tmp['double'];
}
else {
$numValue = $this->createNumber($spos);
}
$info = $this->_getCellDetails($spos,$numValue,$column);
$this->addcell($row, $column, $info['string'], $info);
}
break;
case SPREADSHEET_EXCEL_READER_TYPE_BOOLERR:
$row = ord($data[$spos]) | ord($data[$spos+1])<<8;
$column = ord($data[$spos+2]) | ord($data[$spos+3])<<8;
$string = ord($data[$spos+6]);
$this->addcell($row, $column, $string);
break;
case SPREADSHEET_EXCEL_READER_TYPE_STRING:
// http://code.google.com/p/php-excel-reader/issues/detail?id=4
if ($version == SPREADSHEET_EXCEL_READER_BIFF8){
// Unicode 16 string, like an SST record
$xpos = $spos;
$numChars =ord($data[$xpos]) | (ord($data[$xpos+1]) << 8);
$xpos += 2;
$optionFlags =ord($data[$xpos]);
$xpos++;
$asciiEncoding = (($optionFlags &0x01) == 0) ;
$extendedString = (($optionFlags & 0x04) != 0);
// See if string contains formatting information
$richString = (($optionFlags & 0x08) != 0);
if ($richString) {
// Read in the crun
$formattingRuns =ord($data[$xpos]) | (ord($data[$xpos+1]) << 8);
$xpos += 2;
}
if ($extendedString) {
// Read in cchExtRst
$extendedRunLength =$this->_GetInt4d($this->data, $xpos);
$xpos += 4;
}
$len = ($asciiEncoding)?$numChars : $numChars*2;
$retstr =substr($data, $xpos, $len);
$xpos += $len;
$retstr = ($asciiEncoding)? $retstr : $this->_encodeUTF16($retstr);
}
elseif ($version == SPREADSHEET_EXCEL_READER_BIFF7){
// Simple byte string
$xpos = $spos;
$numChars =ord($data[$xpos]) | (ord($data[$xpos+1]) << 8);
$xpos += 2;
$retstr =substr($data, $xpos, $numChars);
}
$this->addcell($previousRow, $previousCol, $retstr);
break;
case SPREADSHEET_EXCEL_READER_TYPE_ROW:
$row = ord($data[$spos]) | ord($data[$spos+1])<<8;
$rowInfo = ord($data[$spos + 6]) | ((ord($data[$spos+7]) << 8) & 0x7FFF);
if (($rowInfo & 0x8000) > 0) {
$rowHeight = -1;
} else {
$rowHeight = $rowInfo & 0x7FFF;
}
$rowHidden = (ord($data[$spos + 12]) & 0x20) >> 5;
$this->rowInfo[$this->sn][$row+1] = Array('height' => $rowHeight / 20, 'hidden'=>$rowHidden );
break;
case SPREADSHEET_EXCEL_READER_TYPE_DBCELL:
break;
case SPREADSHEET_EXCEL_READER_TYPE_MULBLANK:
$row = ord($data[$spos]) | ord($data[$spos+1])<<8;
$column = ord($data[$spos+2]) | ord($data[$spos+3])<<8;
$cols = ($length / 2) - 3;
for ($c = 0; $c < $cols; $c++) {
$xfindex = ord($data[$spos + 4 + ($c * 2)]) | ord($data[$spos + 5 + ($c * 2)])<<8;
$this->addcell($row, $column + $c, "", array('xfIndex'=>$xfindex));
}
break;
case SPREADSHEET_EXCEL_READER_TYPE_LABEL:
$row = ord($data[$spos]) | ord($data[$spos+1])<<8;
$column = ord($data[$spos+2]) | ord($data[$spos+3])<<8;
$this->addcell($row, $column, substr($data, $spos + 8, ord($data[$spos + 6]) | ord($data[$spos + 7])<<8));
break;
case SPREADSHEET_EXCEL_READER_TYPE_EOF:
$cont = false;
break;
case SPREADSHEET_EXCEL_READER_TYPE_HYPER:
// Only handle hyperlinks to a URL
$row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8;
$row2 = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8;
$column = ord($this->data[$spos+4]) | ord($this->data[$spos+5])<<8;
$column2 = ord($this->data[$spos+6]) | ord($this->data[$spos+7])<<8;
$linkdata = Array();
$flags = ord($this->data[$spos + 28]);
$udesc = "";
$ulink = "";
$uloc = 32;
$linkdata['flags'] = $flags;
if (($flags & 1) > 0 ) { // is a type we understand
// is there a description ?
if (($flags & 0x14) == 0x14 ) { // has a description
$uloc += 4;
$descLen = ord($this->data[$spos + 32]) | ord($this->data[$spos + 33]) << 8;
$udesc = substr($this->data, $spos + $uloc, $descLen * 2);
$uloc += 2 * $descLen;
}
$ulink = $this->read16bitstring($this->data, $spos + $uloc + 20);
if ($udesc == "") {
$udesc = $ulink;
}
}
$linkdata['desc'] = $udesc;
$linkdata['link'] = $this->_encodeUTF16($ulink);
for ($r=$row; $r<=$row2; $r++) {
for ($c=$column; $c<=$column2; $c++) {
$this->sheets[$this->sn]['cellsInfo'][$r+1][$c+1]['hyperlink'] = $linkdata;
}
}
break;
case SPREADSHEET_EXCEL_READER_TYPE_DEFCOLWIDTH:
$this->defaultColWidth = ord($data[$spos+4]) | ord($data[$spos+5]) << 8;
break;
case SPREADSHEET_EXCEL_READER_TYPE_STANDARDWIDTH:
$this->standardColWidth = ord($data[$spos+4]) | ord($data[$spos+5]) << 8;
break;
case SPREADSHEET_EXCEL_READER_TYPE_COLINFO:
$colfrom = ord($data[$spos+0]) | ord($data[$spos+1]) << 8;
$colto = ord($data[$spos+2]) | ord($data[$spos+3]) << 8;
$cw = ord($data[$spos+4]) | ord($data[$spos+5]) << 8;
$cxf = ord($data[$spos+6]) | ord($data[$spos+7]) << 8;
$co = ord($data[$spos+8]);
for ($coli = $colfrom; $coli <= $colto; $coli++) {
$this->colInfo[$this->sn][$coli+1] = Array('width' => $cw, 'xf' => $cxf, 'hidden' => ($co & 0x01), 'collapsed' => ($co & 0x1000) >> 12);
}
break;
default:
break;
}
$spos += $length;
}
if (!isset($this->sheets[$this->sn]['numRows']))
$this->sheets[$this->sn]['numRows'] = $this->sheets[$this->sn]['maxrow'];
if (!isset($this->sheets[$this->sn]['numCols']))
$this->sheets[$this->sn]['numCols'] = $this->sheets[$this->sn]['maxcol'];
}
function isDate($spos) {
$xfindex = ord($this->data[$spos+4]) | ord($this->data[$spos+5]) << 8;
return ($this->xfRecords[$xfindex]['type'] == 'date');
}
// Get the details for a particular cell
function _getCellDetails($spos,$numValue,$column) {
$xfindex = ord($this->data[$spos+4]) | ord($this->data[$spos+5]) << 8;
$xfrecord = $this->xfRecords[$xfindex];
$type = $xfrecord['type'];
$format = $xfrecord['format'];
$formatIndex = $xfrecord['formatIndex'];
$fontIndex = $xfrecord['fontIndex'];
$formatColor = "";
$rectype = '';
$string = '';
$raw = '';
if (isset($this->_columnsFormat[$column + 1])){
$format = $this->_columnsFormat[$column + 1];
}
if ($type == 'date') {
// See http://groups.google.com/group/php-excel-reader-discuss/browse_frm/thread/9c3f9790d12d8e10/f2045c2369ac79de
$rectype = 'date';
// Convert numeric value into a date
$utcDays = floor($numValue - ($this->nineteenFour ? SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS1904 : SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS));
$utcValue = ($utcDays) * SPREADSHEET_EXCEL_READER_MSINADAY;
$dateinfo = gmgetdate($utcValue);
$raw = $numValue;
$fractionalDay = $numValue - floor($numValue) + .0000001; // The .0000001 is to fix for php/excel fractional diffs
$totalseconds = floor(SPREADSHEET_EXCEL_READER_MSINADAY * $fractionalDay);
$secs = $totalseconds % 60;
$totalseconds -= $secs;
$hours = floor($totalseconds / (60 * 60));
$mins = floor($totalseconds / 60) % 60;
$string = date ($format, mktime($hours, $mins, $secs, $dateinfo["mon"], $dateinfo["mday"], $dateinfo["year"]));
} else if ($type == 'number') {
$rectype = 'number';
$formatted = $this->_format_value($format, $numValue, $formatIndex);
$string = $formatted['string'];
$formatColor = $formatted['formatColor'];
$raw = $numValue;
} else{
if ($format=="") {
$format = $this->_defaultFormat;
}
$rectype = 'unknown';
$formatted = $this->_format_value($format, $numValue, $formatIndex);
$string = $formatted['string'];
$formatColor = $formatted['formatColor'];
$raw = $numValue;
}
return array(
'string'=>$string,
'raw'=>$raw,
'rectype'=>$rectype,
'format'=>$format,
'formatIndex'=>$formatIndex,
'fontIndex'=>$fontIndex,
'formatColor'=>$formatColor,
'xfIndex'=>$xfindex
);
}
function createNumber($spos) {
$rknumhigh = $this->_GetInt4d($this->data, $spos + 10);
$rknumlow = $this->_GetInt4d($this->data, $spos + 6);
$sign = ($rknumhigh & 0x80000000) >> 31;
$exp = ($rknumhigh & 0x7ff00000) >> 20;
$mantissa = (0x100000 | ($rknumhigh & 0x000fffff));
$mantissalow1 = ($rknumlow & 0x80000000) >> 31;
$mantissalow2 = ($rknumlow & 0x7fffffff);
$value = $mantissa / pow( 2 , (20- ($exp - 1023)));
if ($mantissalow1 != 0) $value += 1 / pow (2 , (21 - ($exp - 1023)));
$value += $mantissalow2 / pow (2 , (52 - ($exp - 1023)));
if ($sign) {$value = -1 * $value;}
return $value;
}
function addcell($row, $col, $string, $info=null) {
$this->sheets[$this->sn]['maxrow'] = max($this->sheets[$this->sn]['maxrow'], $row + $this->_rowoffset);
$this->sheets[$this->sn]['maxcol'] = max($this->sheets[$this->sn]['maxcol'], $col + $this->_coloffset);
$this->sheets[$this->sn]['cells'][$row + $this->_rowoffset][$col + $this->_coloffset] = $string;
if ($this->store_extended_info && $info) {
foreach ($info as $key=>$val) {
$this->sheets[$this->sn]['cellsInfo'][$row + $this->_rowoffset][$col + $this->_coloffset][$key] = $val;
}
}
}
function _GetIEEE754($rknum) {
if (($rknum & 0x02) != 0) {
$value = $rknum >> 2;
} else {
//mmp
// I got my info on IEEE754 encoding from
// http://research.microsoft.com/~hollasch/cgindex/coding/ieeefloat.html
// The RK format calls for using only the most significant 30 bits of the
// 64 bit floating point value. The other 34 bits are assumed to be 0
// So, we use the upper 30 bits of $rknum as follows...
$sign = ($rknum & 0x80000000) >> 31;
$exp = ($rknum & 0x7ff00000) >> 20;
$mantissa = (0x100000 | ($rknum & 0x000ffffc));
$value = $mantissa / pow( 2 , (20- ($exp - 1023)));
if ($sign) {
$value = -1 * $value;
}
//end of changes by mmp
}
if (($rknum & 0x01) != 0) {
$value /= 100;
}
return $value;
}
function _encodeUTF16($string) {
$result = $string;
if ($this->_defaultEncoding){
switch ($this->_encoderFunction){
case 'iconv' : $result = iconv('UTF-16LE', $this->_defaultEncoding, $string);
break;
case 'mb_convert_encoding' : $result = mb_convert_encoding($string, $this->_defaultEncoding, 'UTF-16LE' );
break;
}
}
return $result;
}
function _GetInt4d($data, $pos) {
$value = ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | (ord($data[$pos+3]) << 24);
if ($value>=4294967294) {
$value=-2;
}
return $value;
}
}
?>
\ No newline at end of file
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
include('excelReaderLibrary/SpreadsheetReader.php');
include('excelReaderLibrary/php-excel-reader/excel_reader.php');
?>
\ No newline at end of file
......@@ -40,16 +40,6 @@ function set_upload_editservice($path){
}
function set_upload_all_files($path){
$config = array();
$config['upload_path'] = $path;
$config['allowed_types'] = '*';
$config['overwrite'] = FALSE;
return $config;
}
function remove_html(&$item, $key)
{
$item = strip_tags($item);
......
<?php
class Customer_model extends CI_Model {
public function _consruct(){
parent::_construct();
}
function getCustomer($customer_data = array()){
$cond = (isset($customer_data['phone']) && !empty($customer_data['phone']))?
" AND phone LIKE '%".trim($customer_data['phone'])."'":"";
$cond .= (!empty($customer_data['customer_id']))?
" AND customer_id = '".trim($customer_data['customer_id'])."'":"";
$result = $this->db->query("SELECT * FROM customers WHERE status IN (0,1) $cond");
if(empty($result)){
return;
}
return (empty($customer_data))?$result->result():$result->row();
}
function createCustomer($customer_data = array()){
if(empty($customer_data))
return 0;
if(isset($customer_data['email']) && !empty($customer_data['email'])){
$emailChk = $this->db->get_where('customers',array('email'=>$customer_data['email'],'status !='=>'2'));
if(!empty($emailChk) && $emailChk->num_rows() > 0){
return 2;
}
}
if(isset($customer_data['phone']) && !empty($customer_data['phone'])){
$phoneChk = $this->db->get_where('customers',array('phone'=>$customer_data['phone'],'status !='=>'2'));
if(!empty($phoneChk) && $phoneChk->num_rows() > 0){
return 3;
}
}
$status = $this->db->insert('customers',$customer_data);
return ($status)?1:0;;
}
function updateCustomer($customer_id = '', $customer_data = array()){
if(empty($customer_id) || empty($customer_data))
return 0;
$emailChk = $this->db->get_where('customers',array('email'=>$customer_data['email'],
'customer_id !='=>$customer_id,
'status !='=>'2'));
if(!empty($emailChk) && $emailChk->num_rows() > 0){
return 2;
}
$phoneChk = $this->db->get_where('customers',array('phone'=>$customer_data['phone'],
'customer_id !='=>$customer_id,
'status !='=>'2'));
if(!empty($phoneChk) && $phoneChk->num_rows() > 0){
return 3;
}
$status = $this->db->update('customers',$customer_data,array('customer_id'=>$customer_id));
return ($status)?1:0;;
}
function changeStatus($customer_id = '', $status = '0'){
if(empty($customer_id)){
return 0;
}
$status = $this->db->update('customers',array('status'=>$status), array('customer_id'=>$customer_id));
return $status;
}
}
?>
\ No newline at end of file
......@@ -22,7 +22,6 @@ class Driver_model extends CI_Model {
}
function getDriver($driver_id = ''){
$cond = '';
$user_id = $this->session->userdata('id');
if($this->session->userdata('user_type') != 1){
$cond = " AND CMP.company_id = '$user_id'";
......
......@@ -42,24 +42,12 @@ class Ride_model extends CI_Model {
return ($status)?1:0;
}
function getRideData($ride_id = '',$company_id = '',$broker_id = '',$scheduled = '',$condArr = array()){
function getRideData($ride_id = '',$company_id = ''){
$cond = (!empty($ride_id))?" AND TD.transport_id = '$ride_id'":"";
$cond .= ($broker_id != '')?" AND TD.broker_id = '$broker_id'":"";
$cond .= (!empty($company_id))?" AND TD.company_id = '$company_id'":"";
if($scheduled != ''){
$cond .= " AND TD.is_scheduled = '$scheduled'";
}
if(!empty($condArr)){
$cond .= implode(' ', $condArr);
}
$sql = "SELECT TD.*,CONCAT(DV.first_name,' ',DV.last_name) AS assigned_driver_name,BK.broker_name,
AR.reason,VH.vehicle_id,VH.vehicle_type,TT.trip_type,TS.trip_status
$sql = "SELECT TD.*,BK.broker_name,AR.reason,VH.vehicle_id,VH.vehicle_type,TT.trip_type,TS.trip_status
FROM transport_details AS TD
LEFT JOIN brokers AS BK ON (TD.broker_id = BK.broker_id)
LEFT JOIN drivers AS DV ON (DV.driver_id = TD.assigned_driver)
LEFT JOIN vehicles AS VH ON (VH.vehicle_id = TD.vehicle_type)
LEFT JOIN trip_type AS TT ON (TT.trip_id = TD.trip_type)
LEFT JOIN trip_status AS TS ON (TS.trip_status_id = TD.trip_status)
......@@ -121,84 +109,5 @@ class Ride_model extends CI_Model {
return ($status)?1:0;
}
function changeSchuduleStatus($ride_id = '',$is_scheduled = '0'){
if(empty($ride_id)){
return;
}
$status = $this->db->update('transport_details',
array('is_scheduled'=>$is_scheduled),
array('transport_id'=>$ride_id));
if($is_scheduled == 0){
$this->deleteAssignedRider($ride_id);
}
return $status;
}
function deleteAssignedRider($ride_id = ''){
if(empty($ride_id)){
return;
}
$this->db->delete('ride_status',array('ride_id'=>$ride_id));
}
function autoAssignDriver($ride_id = '',$appointment_time = '', $pickupLoc = array()){
if(empty($ride_id) || empty($appointment_time) || empty($pickupLoc) || !isset($pickupLoc['lat']) || $pickupLoc['lat'] == '' || !isset($pickupLoc['lng']) || $pickupLoc['lng'] == ''){
return;
}
$time = date("G:i",$appointment_time);
$date = date("d-m-y",$appointment_time);
$endTime = date("G:i",strtotime($time) + 60 * 60);
$startTime = date("G:i",strtotime($time) - 60 * 60);
$endDateTime = strtotime($date.' '.$endTime);
$startDateTime = strtotime($date.' '.$startTime);
$sql = "SELECT GROUP_CONCAT(TD.assigned_driver) AS assigned_drivers
FROM transport_details AS TD
WHERE TD.driver_assign_status='0' AND TD.assigned_driver<>'0' AND TD.is_scheduled='1' AND
TD.appointment_time>$startDateTime AND TD.appointment_time<$endDateTime AND
TD.status IN (4,5,8)";
$prvDrivers = $this->db->query($sql);
if(empty($prvDrivers)){
return 0;
}
$driverCond = '';
if($prvDrivers->num_rows() > 0){
$prvDrivers = $prvDrivers->row_array();
$driverCond = (isset($prvDrivers['assigned_drivers']) && !empty($prvDrivers['assigned_drivers']))?
'AND DRV.driver_id NOT IN ('.$prvDrivers['assigned_drivers'].')':'';
}
$sql = "SELECT DRV.driver_id,3956*2*ASIN(SQRT(POWER(SIN((".$pickupLoc['lat']."-DRV.lat_driver)*
pi()/180/2),2)+COS(".$pickupLoc['lat']."*pi()/180)*COS(DRV.lat_driver*pi()/180)*
POWER(SIN((".$pickupLoc['lng']."-DRV.lng_driver)*pi()/180/2),2))) AS distance
FROM drivers AS DRV
WHERE DRV.status = 1 ".$driverCond."
HAVING distance < 25
ORDER BY distance
LIMIT 0,1";
$driverData = $this->db->query($sql);
if(empty($driverData)){
return 0;
}
if($driverData->num_rows() > 0){
$nearByDriver = $driverData->row_array();
$nearByDriver = $nearByDriver['driver_id'];
$status = $this->db->update('transport_details',
array('driver_assign_status'=>'0','assigned_driver'=>$nearByDriver,'status'=>'3'),
array('transport_id'=>$ride_id));
} else {
$status = $this->db->update('transport_details',
array('driver_assign_status'=>'1','status'=>'3'),
array('transport_id'=>$ride_id));
}
return $status;
}
}
?>
\ No newline at end of file
......@@ -28,7 +28,7 @@ class User_model extends CI_Model {
if(empty($user_id) || empty($user_type) || empty($user_data)){
return 0;
}
$emailChk = $this->db->get_where('admin_users',array('username'=>$user_data['email_id'],'id !='=>$user_id,'status !='=>'2'));
$emailChk = $this->db->get_where('admin_users',array('username'=>$user_data['email_id'],'id !'=>$user_id,'status !='=>'2'));
if(!empty($emailChk) && $emailChk->num_rows() > 0){
return 2;
}
......
<div class="content-wrapper">
<section class="content-header">
<h1>
<?= $page_title ?>
<small><?= $page_desc ?></small>
</h1>
<ol class="breadcrumb">
<li><a href="<?= base_url() ?>"><i class="fa fa-star-o" aria-hidden="true"></i>Home</a></li>
<li><?= $menu ?></li>
<li class="active"><?= $sub_menu ?></li>
</ol>
</section>
<section class="content">
<div class="row">
<div class="col-md-12">
<?php
$redirectUrl = (isset($customer_id) && !empty($customer_id))
?'Customer/updateCustomer/'.$customer_id
:'Customer/createCustomer';
if($this->session->flashdata('message')) {
$flashdata = $this->session->flashdata('message'); ?>
<div class="alert alert-<?= $flashdata['class'] ?>">
<button class="close" data-dismiss="alert" type="button">×</button>
<?= $flashdata['message'] ?>
</div>
<?php } ?>
</div>
<div class="col-md-12">
<div class="box box-warning">
<div class="box-header with-border">
<h3 class="box-title">Customer Personal Details</h3>
</div>
<form role="form" action="<?=base_url($redirectUrl)?>" method="post" class="validate" data-parsley-validate="" enctype="multipart/form-data">
<div class="box-body">
<div class="col-md-12">
<div class="col-md-6">
<div class="form-group has-feedback">
<label>First Name</label>
<input type="text" class="form-control required" data-parsley-trigger="change"
data-parsley-minlength="2" data-parsley-pattern="^[a-zA-Z\ . ! @ # $ % ^ & * () + = , \/]+$"
required="" name="first_name" placeholder="Enter Customer First Name"
value="<?= (isset($customer_data) && isset($customer_data->first_name))?$customer_data->first_name:'' ?>">
<span class="glyphicon form-control-feedback"></span>
</div>
</div>
<div class="col-md-6">
<div class="form-group has-feedback">
<label>Last Name</label>
<input type="text" class="form-control required" data-parsley-trigger="change"
data-parsley-minlength="2" data-parsley-pattern="^[a-zA-Z\ . ! @ # $ % ^ & * () + = , \/]+$" required="" name="last_name" placeholder="Enter Customer Last Name"
value="<?= (isset($customer_data) && isset($customer_data->last_name))?$customer_data->last_name:'' ?>">
<span class="glyphicon form-control-feedback"></span>
</div>
</div>
</div>
<div class="col-md-12">
<div class="col-md-6">
<div class="form-group has-feedback">
<label>Email</label>
<input type="email" class="form-control required" data-parsley-trigger="change"
data-parsley-minlength="2" required="" name="email" placeholder="Enter Customer Email"
value="<?= (isset($customer_data) && isset($customer_data->email))?$customer_data->email:'' ?>">
<span class="glyphicon form-control-feedback"></span>
</div>
</div>
<div class="col-md-6">
<div class="form-group has-feedback">
<label>Phone</label>
<input type="number" class="form-control required" data-parsley-trigger="change"
data-parsley-minlength="2" required="" name="phone" placeholder="Enter Customer Phone"
value="<?= (isset($customer_data) && isset($customer_data->phone))?$customer_data->phone:'' ?>">
<span class="glyphicon form-control-feedback"></span>
</div>
</div>
</div>
<div class="col-md-12">
<div class="col-md-6">
<div class="form-group has-feedback">
<label>Date Of Birth</label>
<div class="input-group date" data-provide="datepicker">
<input id="datepicker" type="text" class="form-control required" data-parsley-trigger="change" data-parsley-minlength="2" required="" name="date_of_birth" placeholder="Pick Date Of Birth" autocomplete="off" value="<?= (isset($customer_data) && isset($customer_data->date_of_birth))?$customer_data->date_of_birth:'' ?>">
<div class="input-group-addon">
<i class="fa fa-calendar"></i>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="form-group has-feedback">
<label>Alternate Phone</label>
<input type="number" class="form-control" data-parsley-trigger="change"
data-parsley-minlength="2" name="alt_phone" placeholder="Enter Alternate Phone"
value="<?= (isset($customer_data) && isset($customer_data->alt_phone))?$customer_data->alt_phone:'' ?>">
<span class="glyphicon form-control-feedback"></span>
</div>
</div>
</div>
<div class="col-md-12">
<div class="col-md-6">
<div class="form-group has-feedback">
<label>Address</label>
<textarea class="form-control required" data-parsley-trigger="change"
data-parsley-minlength="2" required="" name="address" placeholder="Enter Customer Address"><?= (isset($customer_data) && isset($customer_data->address))?trim($customer_data->address):'' ?></textarea>
<span class="glyphicon form-control-feedback"></span>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="exampleInputEmail1">Profile Picture</label>
<div class="col-md-12">
<div class="col-md-3">
<img id="profile_image" src="<?= (isset($customer_data) && isset($customer_data->profile_image))?base_url($customer_data->profile_image):'' ?>" onerror="this.src='<?=base_url("assets/images/user_avatar.jpg")?>'" height="75" width="75" />
</div>
<div class="col-md-9" style="padding-top: 25px;">
<input name="profile_image" type="file" accept="image/*"
class="<?= (isset($customer_id) && !empty($customer_id))?'':'required' ?>"
onchange="setImg(this,'profile_image')" />
</div>
</div>
</div>
</div>
</div>
<div style="border-bottom: 1px solid #f4f4f4;border-bottom-width: 1px;border-bottom-style: solid;
border-bottom-color: rgb(244, 244, 244);">
<h3 class="box-title" style="font-size: 18px !important;">
Customer Medical Details
</h3>
</div><br>
<div class="col-md-12">
<div class="col-md-6">
<div class="form-group has-feedback">
<label>SSN</label>
<input type="text" class="form-control" data-parsley-trigger="change"
data-parsley-minlength="2" name="ssn" placeholder="Provide SSN"
value="<?= (isset($customer_data) && isset($customer_data->ssn))?$customer_data->ssn:'' ?>">
<span class="glyphicon form-control-feedback"></span>
</div>
</div>
<div class="col-md-6">
<div class="form-group has-feedback">
<label>GRP</label>
<input type="text" class="form-control" data-parsley-trigger="change"
data-parsley-minlength="2" name="grp" placeholder="Provide GRP"
value="<?= (isset($customer_data) && isset($customer_data->grp))?$customer_data->grp:'' ?>">
<span class="glyphicon form-control-feedback"></span>
</div>
</div>
</div>
<div class="col-md-12">
<div class="col-md-6">
<div class="form-group has-feedback">
<label>Issuer</label>
<input class="form-control" data-parsley-trigger="change" data-parsley-minlength="2"
type="text" name="issuer" placeholder="Provide Issuer"
value="<?= (isset($customer_data) && isset($customer_data->issuer))?$customer_data->issuer:'' ?>">
<span class="glyphicon form-control-feedback"></span>
</div>
</div>
<div class="col-md-6">
<div class="form-group has-feedback">
<label>Insurance Provider</label>
<input class="form-control" data-parsley-trigger="change" data-parsley-minlength="2"
type="text" name="insurance_provider" placeholder="Provide Insurance Provider"
value="<?= (isset($customer_data) && isset($customer_data->insurance_provider))?$customer_data->insurance_provider:'' ?>">
<span class="glyphicon form-control-feedback"></span>
</div>
</div>
</div>
<div class="col-md-12">
<div class="col-md-6">
<div class="form-group has-feedback">
<label>Member ID</label>
<input class="form-control" data-parsley-trigger="change" data-parsley-minlength="2"
type="text" name="member_id" placeholder="Provide Member ID"
value="<?= (isset($customer_data) && isset($customer_data->member_id))?$customer_data->member_id:'' ?>">
<span class="glyphicon form-control-feedback"></span>
</div>
</div>
<div class="col-md-6">
<div class="form-group has-feedback">
<label>Group Number</label>
<input class="form-control" data-parsley-trigger="change" data-parsley-minlength="2"
type="text" name="group_number" placeholder="Provide Group Number"
value="<?= (isset($customer_data) && isset($customer_data->group_number))?$customer_data->group_number:'' ?>">
<span class="glyphicon form-control-feedback"></span>
</div>
</div>
</div>
<div class="col-md-12">
<div class="box-footer">
<div style="text-align: center;">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
</div>
<!-- <div class="form-group has-feedback">
<label>Last Name</label>
<input type="text" class="form-control required" data-parsley-trigger="change"
data-parsley-minlength="2" data-parsley-pattern="^[a-zA-Z\ . ! @ # $ % ^ & * () + = , \/]+$" required="" name="last_name" placeholder="Enter Driver Name">
<span class="glyphicon form-control-feedback"></span>
</div>
<div class="form-group">
<label>Phone</label>
<input type="number" class="form-control required" data-parsley-trigger="change"
data-parsley-minlength="2" required="" name="phone" placeholder="Enter Phone Number">
<span class="glyphicon form-control-feedback"></span>
</div>
<div class="form-group has-feedback">
<label>Email</label>
<input type="email" class="form-control required" data-parsley-trigger="change"
data-parsley-minlength="2" required="" name="email_id" placeholder="Enter email ID">
<span class="glyphicon form-control-feedback"></span>
</div>
<div class="form-group has-feedback">
<label>Password</label>
<input type="password" class="form-control required" data-parsley-trigger="change"
data-parsley-minlength="2" required="" name="password" placeholder="Enter Pasword">
<span class="glyphicon form-control-feedback"></span>
</div>
<div class="col-md-12">
<div class="box-footer">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</div> -->
<!-- <div class="col-md-6">
<div class="form-group">
<label>Profile Picture</label>
<div class="col-md-12">
<div class="col-md-3">
<img id="profile_image" src="" onerror="this.src='<?=base_url("assets/images/user_avatar.jpg")?>'" height="75" width="75" />
</div>
<div class="col-md-9" style="padding-top: 25px;">
<input name="profile_image" type="file" accept="image/*" class="required" onchange="setImg(this,'profile_image')" />
</div>
</div>
</div>
<div class="form-group">
<label style="padding-top:10px;">Licence</label>
<div class="col-md-12">
<div class="col-md-3">
<img id="licence_img" src="" onerror="this.src='<?=base_url("assets/images/no_image.png")?>'" height="75" width="75" />
</div>
<div class="col-md-9" style="padding-top: 25px;">
<input name="licence" type="file" accept="image/*" class="required" onchange="setImg(this,'licence_img')" />
</div>
</div>
</div>
<?php if($this->session->userdata['user_type'] == 1){ ?>
<div class="form-group">
<label style="padding-top:12px;">Company</label>
<select name="company_id" class="form-control required" data-parsley-trigger="change" required>
<option selected disabled>Select Company</option>
<?php
if(!empty($companies)){
foreach ($companies as $company) {
echo '<option value="'.$company->company_id.'">'.$company->company_name.'</option>';
}
}
?>
</select>
</div>
<?php }else{ ?>
<input type="hidden" name="company_id" value="<?= $this->session->userdata['id'] ?>">
<?php } ?>
<div class="form-group">
<label>Select Vehicle</label>
<select name="vehicle_id" class="form-control required" data-parsley-trigger="change" required>
<option selected disabled>Select Vehicle Type</option>
<?php
if(!empty($vehicles)){
foreach ($vehicles as $vehicle) {
echo '<option value="'.$vehicle->vehicle_id.'">'.$vehicle->vehicle_type.'</option>';
}
}
?>
</select>
</div>
</div> -->
\ No newline at end of file
<div class="content-wrapper" >
<section class="content-header">
<h1>
<?= $page_title ?>
<small><?= $page_desc ?></small>
</h1>
<ol class="breadcrumb">
<li><a href="<?= base_url() ?>"><i class="fa fa-star-o" aria-hidden="true"></i>Home</a></li>
<li><?= $menu ?></li>
<li class="active"><?= $sub_menu ?></li>
</ol>
</section>
<section class="content">
<div class="row">
<div class="col-md-12">
<?php if($this->session->flashdata('message')) {
$flashdata = $this->session->flashdata('message'); ?>
<div class="alert alert-<?= $flashdata['class'] ?>">
<button class="close" data-dismiss="alert" type="button">×</button>
<?= $flashdata['message'] ?>
</div>
<?php } ?>
</div>
<div class="col-xs-12">
<div class="box box-warning">
<div class="box-body">
<table id="driverTable" class="table table-bordered table-striped datatable ">
<thead>
<tr>
<th class="hidden">ID</th>
<th width="150px;">Name</th>
<th width="100px;">Phone</th>
<th width="150px;">Email ID</th>
<th width="50px;">Age</th>
<th width="150px;">Date Of Birth</th>
<th width="50px;">Status</th>
<th width="500px;">Action</th>
</tr>
</thead>
<tbody>
<?php
if(!empty($customerData)){
foreach($customerData as $customer) {
?>
<tr>
<th class="hidden"><?= $customer->customer_id ?></th>
<td class="center"><?= $customer->first_name.' '.$customer->last_name ?></th>
<td class="center"><?= $customer->phone ?></th>
<td class="center"><?= $customer->email ?></th>
<td class="center"><?= $customer->age ?></th>
<td class="center"><?= $customer->date_of_birth ?></th>
<td class="center"><?= ($customer->status == '1')?'Active':'Inactive'?></td>
<td class="center">
<a class="btn btn-sm btn-primary" id="viewCustomer" customer_id="<?= encode_param($customer->customer_id) ?>">
<i class="fa fa-fw fa-edit"></i>View
</a>
<a class="btn btn-sm btn-danger"
href="<?= base_url('Customer/editCustomer/'.encode_param($customer->customer_id)) ?>">
<i class="fa fa-fw fa-trash"></i>Edit
</a>
<a class="btn btn-sm btn-danger"
href="<?= base_url("Customer/changeStatus/".encode_param($customer->customer_id))."/2" ?>"
onClick="return doconfirm()">
<i class="fa fa-fw fa-trash"></i>Delete
</a>
<?php if($customer->status == 1){ ?>
<a class="btn btn-sm btn-success" style="background-color:#ac2925" href="<?= base_url("Customer/changeStatus/".encode_param($customer->customer_id))."/0" ?>">
<i class="fa fa-cog"></i> De-activate
</a>
<?php } else { ?>
<a class="btn btn-sm btn-success" href="<?= base_url("Customer/changeStatus/".encode_param($customer->customer_id))."/1" ?>">
<i class="fa fa-cog"></i> Activate
</a>
<?php } ?>
</td>
</tr>
<?php
}
}?>
</tbody>
</table>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery('[id="viewCustomer"]').on('click',function() {
markCalBak(jQuery(this).attr('customer_id'));
});
function markCalBak(customer_id){
if(customer_id=='' || customer_id==undefined || customer_id=='undefined' || customer_id==null || customer_id=='null'){
return true;
}
modalTrigger('Ride Details','');
addModalLoader();
jQuery.ajax({
url : base_url+"Customer/getCustomerData",
type : 'POST',
data : {'customer_id':customer_id},
success: function(resp){
if(resp == '' || resp == undefined || resp == 'undefined' || resp == null || resp == 'null'){
remModalLoader();
jQuery('[id="modal_content"]').html('Something went wrong, please try again later...!');
return false;
}
var resp_data = jQuery.parseJSON(resp);
if(resp_data['status'] == '0'){
remModalLoader();
jQuery('[id="modal_content"]').html('Something went wrong, please try again later...!');
return false;
}
var customer_data = resp_data['customer_data'];
// Direct HTML
var html = '<div class="col-xs-12"><div class="col-md-2"> '+
'<div class="form-group has-feedback"> '+
'<img id="customerProfileImg" src="'+base_url+customer_data['profile_image']+'" '+
'height="100" width="100" /> '+
'</div> '+
'</div> '+
'<div class="col-md-5"> '+
'<div class="form-group has-feedback"> '+
'<span style="padding-right: 38px;">First Name </span> : '+
'<label style="padding-left: 10px;">'+
customer_data['first_name']+
'</label> '+
'</div> '+
'<div class="form-group has-feedback"> '+
'<span style="padding-right: 68px;">Email </span> : '+
'<label style="padding-left: 10px;">'+
customer_data['email']+
'</label> '+
'</div> '+
'<div class="form-group has-feedback"> '+
'<span style="padding-right: 55px;">Address </span> : '+
'<label style="padding-left: 10px;">'+
customer_data['address']+
'</label> '+
'</div> '+
'<div class="form-group has-feedback"> '+
'<span style="padding-right: 80px;">Age </span> : '+
'<label style="padding-left: 10px;">'+
customer_data['age']+
'</label> '+
'</div> '+
'<div class="form-group has-feedback"> '+
'<span style="padding-right: 79px;">SSN </span> : '+
'<label style="padding-left: 10px;">'+
customer_data['ssn']+
'</label> '+
'</div> '+
'<div class="form-group has-feedback"> '+
'<span style="padding-right: 68px;">Issuer </span> : '+
'<label style="padding-left: 10px;">'+
customer_data['issuer']+
'</label> '+
'</div> '+
'<div class="form-group has-feedback"> '+
'<span style="padding-right: 39px;">Member ID </span> : '+
'<label style="padding-left: 10px;">'+
customer_data['member_id']+
'</label> '+
'</div> '+
'</div> '+
'<div class="col-md-5"> '+
'<div class="form-group has-feedback"> '+
'<span style="padding-right: 56px;">Last Name </span> : '+
'<label style="padding-left: 10px;">'+
customer_data['last_name']+
'</label> '+
'</div> '+
'<div class="form-group has-feedback"> '+
'<span style="padding-right: 80px;">Phone </span> : '+
'<label style="padding-left: 10px;">'+
customer_data['phone']+
'</label> '+
'</div> '+
'<div class="form-group has-feedback"> '+
'<span style="padding-right: 43px;">Date Of Dirth </span> : '+
'<label style="padding-left: 10px;">'+
customer_data['date_of_birth']+
'</label> '+
'</div> '+
'<div class="form-group has-feedback"> '+
'<span style="padding-right: 25px;">Alternate Phone </span> : '+
'<label style="padding-left: 10px;">'+
customer_data['alt_phone']+
'</label> '+
'</div> '+
'<div class="form-group has-feedback"> '+
'<span style="padding-right: 96px;">GRP </span> : '+
'<label style="padding-left: 10px;">'+
customer_data['grp']+
'</label> '+
'</div> '+
'<div class="form-group has-feedback"> '+
'<span style="padding-right: 11px;">Insurance Provider </span> : '+
'<label style="padding-left: 10px;">'+
customer_data['insurance_provider']+
'</label> '+
'</div> '+
'<div class="form-group has-feedback"> '+
'<span style="padding-right: 34px;">Group Number </span> : '+
'<label style="padding-left: 10px;">'+
customer_data['group_number']+
'</label> '+
'</div> '+
'</div> '+
'</div>';
// Dymanic Drawing
// var html = '', bodyHtml = '', profPic = '';
// profPic = '<div class="col-md-2"> '+
// '<div class="form-group has-feedback"> '+
// '<img id="customerProfileImg" src="'+base_url+customer_data['profile_image']+'" '+
// 'height="100" width="100" /> '+
// '</div> '+
// '</div>';
// bodyHtml += '<div class="col-md-10">';
// jQuery.each(customer_data, function(key,value) {
// if(key == 'customer_id' || key == 'status'){
// return true;
// }
// key = key.replace(/_/g,' ').toUpperCase();
// value = (value==''||value==null||value=='null'||value==undefined||value=='undefined')?'--':value;
// value = value;
// bodyHtml += '<div class="col-md-3">'+key+'</div>'+
// '<div class="col-md-1"><span>:</span></div>'+
// '<div class="col-md-6">'+value+'</div>';
// });
// bodyHtml += '</div>';
// html = '<div class="col-xs-12">'+profPic+bodyHtml+'</div>';
remModalLoader();
jQuery('[id="modal_content"]').html(html);
jQuery('[id="customerProfileImg"]').error(function() {
jQuery('[id="customerProfileImg"]').attr('src',base_url+'assets/images/user_avatar.jpg');
});
},
fail: function(xhr, textStatus, errorThrown){
remModalLoader();
jQuery('[id="modal_content"]').html('Something went wrong, please try again later...!');
},
error: function (ajaxContext) {
remModalLoader();
jQuery('[id="modal_content"]').html('Something went wrong, please try again later...!');
}
});
}
</script>
\ No newline at end of file
<?php
$loc = '';
$mapLocData = array();
?>
<div class="content-wrapper" >
<!-- Content Header (Page header) -->
<section class="content-header">
......@@ -11,8 +7,8 @@
</h1>
<ol class="breadcrumb">
<li><a href="<?= base_url() ?>"><i class="fa fa-star-o" aria-hidden="true"></i>Home</a></li>
<li><?= $menu ?></li>
<li class="active"><?= $sub_menu ?></li>
<li>User</li>
<li class="active">View User</li>
</ol>
</section>
<!-- Main content -->
......@@ -28,12 +24,12 @@
<?php } ?>
</div>
<div class="col-xs-12">
<div class="box box-warning">
<div "class="col-12">
<div id="map-canvas" style="width: 100%; height: 300px;"></div>
<div class="box">
<div class="box-header">
<h3 class="box-title">View User Details</h3>
</div>
<div class="box-body">
<table id="driverTable" class="table table-bordered table-striped datatable ">
<table id="" class="table table-bordered table-striped datatable ">
<thead>
<tr>
<th class="hidden">ID</th>
......@@ -58,7 +54,8 @@
<td class="center"><?= $driver->company_name ?></th>
<td class="center"><?= ($driver->status == '1')?'Active':'Inactive'?></td>
<td class="center">
<a class="btn btn-sm btn-primary" id="viewDriver" driver_id="<?= encode_param($driver->driver_id) ?>">
<a class="btn btn-sm btn-primary"
href="<?= base_url('Driver/view/'.encode_param($driver->driver_id)) ?>">
<i class="fa fa-fw fa-edit"></i>View
</a>
<a class="btn btn-sm btn-danger"
......@@ -81,14 +78,7 @@
<?php } ?>
</td>
</tr>
<?php
$drvLatLng = (!empty($driver->lat_driver) && !empty($driver->lng_driver))?
$driver->lat_driver.','.$driver->lng_driver:'';
$mapLocData[]=array('DisplayText'=>$driver->first_name.' '.$driver->last_name,
'MarkerId'=>base_url('assets/images/mapCarIconPref.png'),
'LatitudeLongitude'=>$drvLatLng,'driver_id'=>encode_param($driver->driver_id));
}
<?php }
}?>
</tbody>
</table>
......@@ -96,105 +86,3 @@
</div>
</section>
</div>
<script type="text/javascript">
var map, geocoder, marker, people = new Array(), latlng, infowindow;
jQuery(document).ready(function() {
ViewCustInGoogleMap();
});
function ViewCustInGoogleMap() {
var mapOptions = {
center: new google.maps.LatLng(<?= $drvLatLng ?>),
zoom: 7,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
var data = '<?= json_encode($mapLocData) ?>';
people = JSON.parse(data);
for (var i = 0; i < people.length; i++) {
setMarker(people[i]);
}
}
function setMarker(people) {
geocoder = new google.maps.Geocoder();
infowindow = new google.maps.InfoWindow();
if(people["LatitudeLongitude"] != '') {
var latlngStr = people["LatitudeLongitude"].split(",");
var lat = parseFloat(latlngStr[0]);
var lng = parseFloat(latlngStr[1]);
latlng = new google.maps.LatLng(lat, lng);
marker = new google.maps.Marker({
position: latlng,
map: map,
draggable: false,
html: people["DisplayText"],
icon: people["MarkerId"]
});
google.maps.event.addListener(marker, 'click', function(event) {
infowindow.setContent(this.html);
infowindow.setPosition(event.latLng);
infowindow.open(map, this);
markCalBak(people["driver_id"]);
});
}
}
jQuery('[id="viewDriver"]').on('click',function() {
markCalBak(jQuery(this).attr('driver_id'));
});
function markCalBak(driver_id){
if(driver_id=='' || driver_id==undefined || driver_id=='undefined' || driver_id==null || driver_id=='null'){
return true;
}
modalTrigger('Ride Details','');
addModalLoader();
jQuery.ajax({
url : base_url+"Driver/getDriverData",
type : 'POST',
data : {'driver_id':driver_id},
success: function(resp){
if(resp == '' || resp == undefined || resp == 'undefined' || resp == null || resp == 'null'){
remModalLoader();
jQuery('[id="modal_content"]').html('Something went wrong, please try again later...!');
return false;
}
var resp_data = jQuery.parseJSON(resp);
if(resp_data['status'] == '0'){
remModalLoader();
jQuery('[id="modal_content"]').html('Something went wrong, please try again later...!');
return false;
}
var driver_data = resp_data['driver_data'];
var html = ' <div class="col-xs-12"><div class="col-md-2"> <div class="form-group has-feedback"> <img id="driverProfileImg" src="'+base_url+driver_data['profile_image']+'" height="100" width="100" /> </div> </div> <div class="col-md-6"> <div class="form-group has-feedback"> <span style="padding-right: 52px;">Name </span> : <label style="padding-left: 10px;" for="exampleInputEmail1">'+driver_data['first_name']+' '+driver_data['last_name']+'</label> </div> <div class="form-group has-feedback"> <span style="padding-right: 38px;">Email ID </span> : <label style="padding-left: 10px;" for="exampleInputEmail1"> '+driver_data['email_id']+'</label> </div> <div class="form-group has-feedback"> <span style="padding-right: 49px;">Phone </span> : <label style="padding-left: 10px;" for="exampleInputEmail1">'+driver_data['email_id']+' </label> </div> <div class="form-group has-feedback"> <span style="padding-right: 31px;">Company </span> : <label style="padding-left: 10px;" for="exampleInputEmail1"> '+driver_data['company_name']+'</label> </div> <div class="form-group has-feedback"> <span style="padding-right: 45px;">Vechile </span> : <label style="padding-left: 10px;" for="exampleInputEmail1"> '+driver_data['vehicle_type']+' </label> </div> </div> <div class="col-md-4"> <div class="form-group has-feedback"> <div class="col-md-12" style="height: 200px;"> <img id="driverLicenceImg" src="'+base_url+driver_data['licence']+'" height="100%" /> </div> </div> </div> </div>';
remModalLoader();
jQuery('[id="modal_content"]').html(html);
jQuery('[id="driverLicenceImg"]').error(function() {
jQuery('[id="driverLicenceImg"]').attr('src',base_url+'assets/images/no_image.png');
});
jQuery('[id="driverProfileImg"]').error(function() {
jQuery('[id="driverProfileImg"]').attr('src',base_url+'assets/images/user_avatar.jpg');
});
},
fail: function(xhr, textStatus, errorThrown){
remModalLoader();
jQuery('[id="modal_content"]').html('Something went wrong, please try again later...!');
},
error: function (ajaxContext) {
remModalLoader();
jQuery('[id="modal_content"]').html('Something went wrong, please try again later...!');
}
});
}
</script>
\ No newline at end of file
......@@ -37,7 +37,7 @@
<img src="<?= base_url($driver_data->profile_image) ?>" onerror="this.src='<?=base_url("assets/images/user_avatar.jpg")?>';" height="100" width="100" />
</div>
</div>
<div class="col-md-4">
<div class="col-md-10">
<div class="form-group has-feedback">
<span style="padding-right: 52px;">Name </span> :
<label style="padding-left: 10px;" for="exampleInputEmail1">
......@@ -69,18 +69,18 @@
</label>
</div>
</div>
<div class="col-md-5">
</div>
<div class="col-md-12">
<div class="form-group has-feedback">
<div class="col-md-5" >
<br><br>
<div class="col-md-2" >
<span style="padding-right: 40px;">Licence Proof :</span>
</div>
<div class="col-md-7" style="height: 200px;">
<img id="licence_img" src="<?= base_url($driver_data->licence) ?>" onerror="this.src='<?=base_url("assets/images/no_image.png")?>';" height="100%" />
</div>
<div class="col-md-10 relative" >
<img id="licence_img" src="<?= base_url($driver_data->licence) ?>" onerror="this.src='<?=base_url("assets/images/no_image.png")?>';" height="800" width="800" />
</div>
</div>
</div>
</div>
</div>
</section>
</div>
......@@ -269,8 +269,23 @@
</section>
</div>
<script type="text/javascript">
jQuery(document).ready(function(){
jQuery('[name^="TDLS.transport_id"],[name^="TDLS.medical_no"],[name^="TDLS.patient_name"],[name^="TDLS.age"],[name^="TDLS.phone"],[name^="APRES.reason"],[name^="TDLS.appointment_time"]').prop("checked", true).parent().closest('div').addClass('disable-block');
});
</script>
\ No newline at end of file
<!-- REPORT LIST VIEW MODAL -->
<div class="modal fade" id="report_list_modal" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">&times;</button>
<h4 class="modal-title">Modal Header</h4>
</div>
<div class="modal-body col-md-12" id="report_list_content" style="border-bottom:1px solid #e5e5e5;
">
<!-- REPORT LIST VIEW CONTENT -->
</div>
<div class="modal-footer">
<div>&nbsp;</div>
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
......@@ -218,7 +218,7 @@
<div class="box-header with-border">
<h3 class="box-title">Upload Ride</h3>
</div>
<form role="form" action="<?=base_url('Ride/excelMapping')?>" method="post" class="validate" data-parsley-validate="" enctype="multipart/form-data">
<form role="form" action="<?=base_url('Ride/import')?>" method="post" class="validate" data-parsley-validate="" enctype="multipart/form-data">
<br>
<div class="box-body">
<div class="col-md-12">
......@@ -231,9 +231,7 @@
<?php
if(!empty($company_data)){
foreach ($company_data as $company) {
echo '<option value="'.$company->company_id.'">'.
$company->company_name.
'</option>';
echo '<option value="'.$company->company_id.'">'.$company->company_name.'</option>';
}
}
?>
......@@ -260,9 +258,8 @@
</div>
<div class="col-md-4">
<div class="form-group has-feedback">
<label>File to be Uploaded</label>
<input name="import_file" type="file" accept=".csv, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"
class="required" />
<label>CSV File</label>
<input name="csv_file" type="file" accept=".csv" class="required" />
</div>
</div>
</div>
......
......@@ -28,7 +28,7 @@
<?php } ?>
</div>
<div class="col-xs-12">
<div class="box box-warning">
<div class="box">
<div class="box-header">
<h3 class="box-title">Select Driver</h3>
</div>
......@@ -83,13 +83,10 @@
</td>
</tr>
<?php
$drvLatLng = (!empty($driver['lat_driver']) && !empty($driver['lng_driver']))?
$driver['lat_driver'].','.$driver['lng_driver']:'';
$markIcon = ($prefDriver == $driver['driver_id'])?'mapCarIconPref':'mapCarIcon';
$mapLocData[] = array('DisplayText'=>$driver['first_name'].' '.$driver['last_name'],
$mapLocData[]=array('DisplayText'=>$driver['first_name'].' '.$driver['last_name'],
'MarkerId'=>base_url('assets/images/'.$markIcon.'.png'),
'LatitudeLongitude'=>$drvLatLng);
'LatitudeLongitude'=>$driver['lat_driver'].','.$driver['lng_driver']);
}
}?>
</tbody>
......@@ -102,15 +99,20 @@
</section>
</div>
<script type="text/javascript">
var map, geocoder, marker, people = new Array(), latlng, infowindow;
var map;
var geocoder;
var marker;
var people = new Array();
var latlng;
var infowindow;
jQuery(document).ready(function() {
$(document).ready(function() {
ViewCustInGoogleMap();
});
function ViewCustInGoogleMap() {
var mapOptions = {
center: new google.maps.LatLng(<?= $loc ?>),
zoom: 10,
......@@ -119,17 +121,40 @@
map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
var data = '<?= json_encode($mapLocData) ?>';
people = JSON.parse(data);
for (var i = 0; i < people.length; i++) {
setMarker(people[i]);
}
}
function setMarker(people) {
geocoder = new google.maps.Geocoder();
infowindow = new google.maps.InfoWindow();
if(people["LatitudeLongitude"] != '') {
if ((people["LatitudeLongitude"] == null) || (people["LatitudeLongitude"] == 'null') || (people["LatitudeLongitude"] == '')) {
geocoder.geocode({ 'address': people["Address"] }, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
latlng = new google.maps.LatLng(results[0].geometry.location.lat(), results[0].geometry.location.lng());
marker = new google.maps.Marker({
position: latlng,
map: map,
draggable: false,
html: people["DisplayText"],
icon: people["MarkerId"]
});
//marker.setPosition(latlng);
//map.setCenter(latlng);
google.maps.event.addListener(marker, 'click', function(event) {
infowindow.setContent(this.html);
infowindow.setPosition(event.latLng);
infowindow.open(map, this);
});
}
});
}
else {
var latlngStr = people["LatitudeLongitude"].split(",");
var lat = parseFloat(latlngStr[0]);
var lng = parseFloat(latlngStr[1]);
......@@ -137,10 +162,12 @@
marker = new google.maps.Marker({
position: latlng,
map: map,
draggable: false,
html: people["DisplayText"],
icon: people["MarkerId"]
draggable: false, // cant drag it
html: people["DisplayText"], // Content display on marker click
icon: people["MarkerId"] // Give ur own image
});
//marker.setPosition(latlng);
//map.setCenter(latlng);
google.maps.event.addListener(marker, 'click', function(event) {
infowindow.setContent(this.html);
infowindow.setPosition(event.latLng);
......
<?php
$headerArr = Array(0=>'Medicaid_Number',1=>'Members_Last_Name',2=>'Members_First_Name',
3=>'Members_Date_of_Birth',4=>'Members_Age',5=>'Members_Phone_Number',
6=>'Members_Alt_Phone',7=>'Trip_Number',8=>'Appointment_Date',
9=>'Appointment_Day_of_Week',10=>'Appointment_Time',11=>'Trip_Reason_Code',
12=>'Trip_Status',13=>'Vehicle_Type',14=>'Trip_Type',15=>'Wheelchair_Flag',
16=>'Crutches_\/_Walker_\/_Cane_Flag',17=>'Number_of_Car_Seats_Required',
18=>'Pregnant_Flag',19=>'Number_of_Additional_Passengers',
20=>'Additional_Passengers_With_Appointments',21=>'Trip_Mileage',22=>'Trip_Cost',
23=>'Pickup_Address',24=>'Pickup_City',25=>'Pickup_State',26=>'Pickup_Zip_Code',
27=>'Delivery_Name',28=>'Delivery_Address',29=>'Delivery_City',30=>'Delivery_State',
31=>'Delivery_Zip_Code',32=>'Delivery_Phone_Number',33=>'Special_Needs',
34=>'Inst_\/_Directions',35=>'Return_Time',36=>'Attendant_Flag',
37=>'Trip_Bid_Status',38=>'Date_Trip_Bid_Status_Was_Changed',
39=>'Confirmation_Number',40=>'Copay',41=>'Trip_Status_Date');
$reqFields = array(0,2,1,4,5,7,23,28,22,14,11,8,10,11,12,13);
$headerArr = array_replace(array_flip($reqFields),$headerArr);
?>
<div class="content-wrapper">
<section class="content-header">
<h1>
<?= $page_title ?>
<small><?= $page_desc ?></small>
</h1>
<ol class="breadcrumb">
<li><a href="<?= base_url() ?>"><i class="fa fa-star-o" aria-hidden="true"></i>Home</a></li>
<li><?= $menu ?></li>
<li class="active"><?= $sub_menu ?></li>
</ol>
</section>
<section class="content">
<div class="row">
<div class="col-md-12">
<?php if($this->session->flashdata('message')) {
$flashdata = $this->session->flashdata('message'); ?>
<div class="alert alert-<?= $flashdata['class'] ?>">
<button class="close" data-dismiss="alert" type="button">×</button>
<?= $flashdata['message'] ?>
</div>
<?php } ?>
</div>
<div class="col-md-12">
<div class="box box-warning">
<div class="box-header with-border">
<div class="col-md-6">
<h3 class="box-title">Excel Mapping</h3>
</div>
</div>
<div class="box-body">
<div class="col-md-7">
<div style="overflow:scroll;height:400px;">
<table id="mappedHeaders" class="border-cls" style="width:98%;">
<?php
foreach($headerArr AS $id => $header){
$reqDisp = '';
$requiredFlag = 'required="no"';
if(in_array($id,$reqFields)){
$reqDisp = '<i class="fa fa-asterisk text-danger" style="font-size:8px;"></i>';
$requiredFlag = 'required="yes"';
}
echo '<tr class="border-cls tr-cls">
<td class="headtag-td">
'.str_replace('_',' ',$header).' '.$reqDisp.'
</td>
<td class="headtag-td">
<div type="child" '.$requiredFlag.' class="drag-box" id="order_'.$id.'" ondrop="dropElement(event)"
ondragover="allowDropElement(event)" headOrder="'.$id.'"></div>
</td>
</tr>';
}
?>
</table>
</div>
</div>
<div class="col-md-5">
<div type="parent" class="header-tag-box" ondrop="dropElement(event)" ondragover="allowDropElement(event)">
<?php
if(!empty($headerArr)){
foreach ($headerArr AS $headID => $heading) { ?>
<div id="tempHead_<?= $headID ?>" class="header-tag" draggable="true"
ondragstart="dragElement(event)" tmporder="<?= $headID ?>">
<?= str_replace(array('/','_'),array('',' '),$heading) ?>
</div>
<?php }
}
?>
</div>
</div>
<div class="col-md-12 btn-mapping">
<button id="upload_excell" type="button" class="btn btn-primary" dmclick="0">Import Excell</button>
</div>
</div>
</div>
</div>
</div>
</section>
<input type="hidden" name="fileType" value="<?= $fileType ?>">
<input type="hidden" name="broker_id" value="<?= $broker_id ?>">
<input type="hidden" name="company_id" value="<?= $company_id ?>">
<input type="hidden" name="import_file" value="<?= $import_file ?>">
</div>
\ No newline at end of file
<div class="content-wrapper">
<section class="content-header">
<h1>
<?= $page_title ?>
<small><?= $page_desc ?></small>
</h1>
<ol class="breadcrumb">
<li><a href="<?= base_url() ?>"><i class="fa fa-star-o" aria-hidden="true"></i>Home</a></li>
<li><?= $menu ?></li>
<li class="active"><?= $sub_menu ?></li>
</ol>
</section>
<section class="content">
<div class="row">
<div class="col-md-12">
<?php if($this->session->flashdata('message')) {
$flashdata = $this->session->flashdata('message'); ?>
<div class="alert alert-<?= $flashdata['class'] ?>">
<button class="close" data-dismiss="alert" type="button">×</button>
<?= $flashdata['message'] ?>
</div>
<?php } ?>
</div>
<div class="col-md-12">
<div class="box box-warning">
<div class="box-header with-border">
<div class="col-md-6">
<h3 class="box-title">Scheduled Rides</h3>
</div>
</div>
<div class="box-body">
<form action="<?= base_url('Ride/scheduled_rides') ?>" method="post" class="validate" data-parsley-validate="" enctype="multipart/form-data">
<div class="col-md-12">
<div class="form-group has-feedback">
<label>Appointment Date</label>
<div class="input-group date" data-provide="datepicker">
<input id="datepicker" type="text" class="form-control required" data-parsley-trigger="change" data-parsley-minlength="2" required="" name="search_date" placeholder="Search Date" autocomplete="off">
<div class="input-group-addon">
<i class="fa fa-calendar"></i>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<div class="col-md-2" style="float:right;padding:initial;">
<a class="btn btn-sm btn-primary" style="width: 150px;" href="<?= base_url('Ride/scheduled_rides') ?>">View All</a>
</div>
<div class="col-md-2" style="float:right;padding:initial;">
<button class="btn btn-sm btn-primary" style="width: 150px;" type="submit">Search</button>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="col-md-12">
<div class="box box-warning">
<div class="box-body">
<table class="table table-bordered table-striped datatable ">
<thead>
<tr>
<th class="hidden">ID</th>
<th width="100px">Scheduled Time</th>
<th width="100px">Arrival Time</th>
<th width="100px">Coustomer Name</th>
<th width="100px">Mobility</th>
<th width="100px">Pick Up Address</th>
<th width="100px">Drop Off Address</th>
<th width="100px">Rider Status</th>
<th width="40px">View</th>
</tr>
</thead>
<tbody>
<?php
$report_data = array();
if(!empty($ride_data)){
foreach($ride_data as $ride) {
$json_ride = json_decode($ride->data,true);
if(empty($json_ride)){
continue;
} ?>
<tr>
<th class="hidden"><?= $ride->transport_id ?></th>
<th class="center">
<?= date("d-m-y G:i",$ride->appointment_time) ?>
</th>
<th class="center"></th>
<th class="center"><?= $ride->patient_name ?></th>
<th class="center"></th>
<th class="center"><?= $ride->pickup_location ?></th>
<th class="center"><?= $ride->drop_location ?></th>
<th class="center">
<?php
if(!empty($ride->assigned_driver) && $ride->driver_assign_status == '1'){
echo 'Driver Cancelled & Auto Assigned to Dispatcher';
} else if (empty($ride->assigned_driver) && $ride->driver_assign_status == '1'){
echo 'No Driver Found, ride assigned to dispatcher';
} else if (!empty($ride->assigned_driver) && $ride->driver_assign_status == '0' && !empty($ride->assigned_driver_name) && $ride->status == 3){
echo 'Waiting for driver response : Driver Name '.$ride->assigned_driver_name;
} else if (!empty($ride->assigned_driver) && $ride->driver_assign_status == '0' && !empty($ride->assigned_driver_name) && $ride->status == 4){
echo 'Driver Accepted : Driver Name '.$ride->assigned_driver_name;
}
?>
</th>
<th class="center">
<a id="viewRideDetails" key="<?= $ride->transport_id ?>" class="cpoint">
<i class="fa fa-fw fa-eye"></i>
</a>
</th>
</tr>
<?php
$report_data[$ride->transport_id] = $json_ride;
}
}
?>
</tbody>
</table>
</div>
</div>
</div>
</div>
</section>
</div>
<script type="text/javascript">
report_data = <?= json_encode($report_data); ?>;
</script>
\ No newline at end of file
<?php
$headerArr = array("Medicaid_Number","Members_Last_Name","Members_First_Name","Members_Date_of_Birth","Members_Age","Members_Phone_Number","Members_Alt_Phone","Trip_Number","Appointment_Date","Appointment_Day_of_Week","Appointment_Time","Trip_Reason_Code","Trip_Status","Vehicle_Type","Trip_Type","Wheelchair_Flag","Crutches_/_Walker_/_Cane_Flag","Number_of_Car_Seats_Required","Pregnant_Flag","Number_of_Additional_Passengers","Additional_Passengers_With_Appointments","Trip_Mileage","Trip_Cost","Pickup_Address","Pickup_City","Pickup_State","Pickup_Zip_Code","Delivery_Name","Delivery_Address","Delivery_City","Delivery_State","Delivery_Zip_Code","Delivery_Phone_Number","Special_Needs","Inst_/_Directions","Return_Time","Attendant_Flag","Trip_Bid_Status","Date_Trip_Bid_Status_Was_Changed","Confirmation_Number","Copay","Trip_Status_Date");
?>
<div class="content-wrapper" >
<!-- Content Header (Page header) -->
<section class="content-header">
......@@ -26,126 +23,78 @@
</div>
<?php } ?>
</div>
<div class="col-md-12">
<div class="box box-warning">
<div class="box-header with-border">
<h3 class="box-title">Ride Management</h3>
</div>
<div class="box-body">
<form role="form" id="getBrokerRides" action="<?=base_url('Ride/view_rides')?>" method="post" class="validate" data-parsley-validate="" enctype="multipart/form-data">
<div class="col-md-12">
<div class="form-group">
<label>Select Broker</label>
<select name="broker_id" class="form-control" onchange="getBrokerRides()">
<option selected value="">All Rides</option>
<?php
if(!empty($broker_data)){
foreach ($broker_data as $broker) {
$chkFlg = ($broker_id == $broker->broker_id)?'selected':'';
echo '<option value="'.$broker->broker_id.'" '.$chkFlg.'>
'.$broker->broker_name.
'</option>';
}
}
?>
<option value="0" <?= ($broker_id != '' && $broker_id == 0)?'selected':'' ?>>Phone Bookings</option>
</select>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="col-xs-12">
<div class="box">
<div class="box-header">
<h3 class="box-title">View User Details</h3>
</div>
<div class="box-body">
<table class="table table-bordered table-striped datatable ">
<table id="" class="table table-bordered table-striped datatable ">
<thead>
<tr>
<th class="hidden">ID</th>
<th width="100px"></th>
<?php
foreach ($headerArr AS $head) {
echo '<th width="100%;">'.str_replace('_',' ',$head).'</th> ';
}
?>
<th width="150px;">Patient Name</th>
<th width="50px;">Age</th>
<th width="100px;">Phone</th>
<th width="150px;">Appointment Date</th>
<th width="150px;">Status</th>
<th width="150px;">Data Source</th>
<th width="320px;">Action</th>
</tr>
</thead>
<tbody>
<?php
$ride_ids = array();
$report_data = array();
if(!empty($ride_data)){
foreach($ride_data as $ride) {
$ride_ids[] = $ride->transport_id;
$json_ride = json_decode($ride->data,true);
if(empty($json_ride)){
continue;
}
?>
<tr>
<th class="hidden"><?= $ride->transport_id ?></th>
<th class="center">
<?php if($this->session->userdata['user_type'] != 1){
$style = 'style="color:red;";';
if($ride->is_scheduled == 1){
$style = 'style="color:green;";';
} ?>
<a id="markSchedule_<?= $ride->transport_id ?>" transport_id="<?= $ride->transport_id ?>"
is_scheduled="<?= $ride->is_scheduled ?>" class="cpoint">
<i class="fa fa-fw fa-check" <?=$style?> ></i>
</a>
<?php } ?>
<a id="viewRideDetails" key="<?= $ride->transport_id ?>" class="cpoint">
<i class="fa fa-fw fa-eye"></i>
</a>
<a href="<?= base_url("Ride/changeStatus/".encode_param($ride->transport_id))."/2" ?>"
onClick="return doconfirm()"><i class="fa fa-fw fa-trash" style="color:#dd4b39;"></i></a>
</th>
<td class="center"><?= $ride->patient_name ?></th>
<td class="center"><?= $ride->age ?></th>
<td class="center"><?= $ride->phone ?></th>
<td class="center"><?= date('d-M-Y G:i',$ride->appointment_time) ?></th>
<td class="center">
<?php
$json_ride = array_merge(array_flip($headerArr),$json_ride);
foreach($json_ride AS $key => $data){
if(!in_array($key,$headerArr)){
continue;
if(strtotime(date('d-M-Y G:i')) > $ride->appointment_time && ($ride->status == 1 || $ride->status == 0)){
echo 'Ride Expired';
}else{
switch ($ride->status){
case 0: echo 'Inactive';break;
case 1: echo 'Yet to assign Driver';break;
case 3: echo 'Waiting For Driver Approval';break;
case 4: echo 'Driver Accepted';break;
case 5: echo 'Processing';break;
case 6: echo 'Ride Completed';break;
case 7: echo 'Driver Canceled';break;
case 8: echo 'Driver Manually Assigned';break;
}
switch ($key){
case 'Wheelchair_Flag': $json_ride[$key] = ($data == 1)?'YES':'NO'; break;
case 'Attendant_Flag': $json_ride[$key] = ($data == 1)?'YES':'NO'; break;
case 'Pregnant_Flag': $json_ride[$key] = ($data == 1)?'YES':'NO'; break;
case 'Members_Date_of_Birth': $json_ride[$key] = ($data == 1)?'YES':'NO'; break;
case 'Crutches_/_Walker_/_Cane_Flag': $json_ride[$key] = ($data == 1)?'YES':'NO'; break;
case 'Trip_Reason_Code': $json_ride[$key] = $ride->reason; break;
case 'Vehicle_Type': $json_ride[$key] = $ride->vehicle_type; break;
case 'Trip_Type': $json_ride[$key] = $ride->trip_type; break;
case 'Trip_Status': $json_ride[$key] = $ride->trip_status; break;
}
echo '<td class="center">'.$data.'</td>';
$report_data[$ride->transport_id] = $json_ride;
} ?>
<th class="center"><?= (!empty($ride->broker_name)?$ride->broker_name:'Phone Booking') ?></th>
?>
</td>
<td class="center"><?= (!empty($ride->broker_name)?$ride->broker_name:'Phone Booking') ?></th>
<td class="center">
<a class="btn btn-sm btn-primary"
href="<?= base_url('Ride/view/'.encode_param($ride->transport_id)) ?>">
<i class="fa fa-fw fa-edit"></i>View
</a>
<a class="btn btn-sm btn-danger"
href="<?= base_url("Ride/changeStatus/".encode_param($ride->transport_id))."/2" ?>"
onClick="return doconfirm()">
<i class="fa fa-fw fa-trash"></i>Delete
</a>
<?php if($this->session->userdata['user_type'] != 1 && ($ride->status == 1 || $ride->status == 7) && strtotime(date('d-M-Y G:i')) < $ride->appointment_time){?>
<a class="btn btn-sm btn-primary"
href="<?= base_url('Ride/assign_driver/'.encode_param($ride->transport_id)) ?>">
<i class="fa fa-fw fa-edit"></i>Assign Driver
</a>
<?php } ?>
</td>
</tr>
<?php }
}?>
</tbody>
</table>
<?php if($this->session->userdata['user_type'] != 1){ ?>
<div class="col-md-1" style="float:right;padding:initial;">
<a id="scheduleAll" class="btn btn-sm btn-primary">
Schedule All
</a>
</div>
<?php } ?>
</div>
</div>
</div>
</div>
</section>
</div>
<script type="text/javascript">
ride_ids = <?= json_encode($ride_ids); ?>;
report_data = <?= json_encode($report_data); ?>;
</script>
</div>
</section>
</div>
\ No newline at end of file
<div class="content-wrapper">
<section class="content-header">
<h1>
<?= $page_title ?>
<small><?= $page_desc ?></small>
</h1>
<ol class="breadcrumb">
<li><a href="<?= base_url() ?>"><i class="fa fa-star-o" aria-hidden="true"></i>Home</a></li>
<li><?= $menu ?></li>
<li class="active"><?= $sub_menu ?></li>
</ol>
</section>
<section class="content">
<div class="row">
<div class="col-md-12">
<?php if($this->session->flashdata('message')) {
$flashdata = $this->session->flashdata('message'); ?>
<div class="alert alert-<?= $flashdata['class'] ?>">
<button class="close" data-dismiss="alert" type="button">×</button>
<?= $flashdata['message'] ?>
</div>
<?php } ?>
</div>
<div class="col-md-12">
<div class="box box-warning">
<div class="box-header with-border">
<h3 class="box-title">Edit Driver Details</h3>
</div>
<form method="post" class="validate" role="form" action="<?= base_url().'Settings/change_settings'?>" enctype="multipart/form-data" data-parsley-validate="">
<div class="box-body">
<div class="row">
<div class="form-group col-xs-4">
<label>Site Title</label>
<input type="text" name="title" class="form-control required" placeholder="Enter Site Title" value="<?= $data['title'] ?>">
</div>
<div class="form-group col-xs-3">
<label>Title Short</label>
<input type="text" name="title_short" class="form-control required" placeholder="Enter Site Title" value="<?= $data['title_short'] ?>">
</div>
<div class="form-group col-xs-5">
<label>Site Logo</label>
<div class="col-md-12">
<div class="col-md-3">
<img id="site_logo" src="<?= base_url($data['site_logo']) ?>" onerror="this.src='<?=base_url("assets/images/no_image.png")?>';" height="75" width="75">
</div>
<div class="col-md-9" style="padding-top: 25px;">
<input name="site_logo" type="file" accept="image/*" onchange="setImg(this,'site_logo');" />
</div>
</div>
</div>
</div>
<div class="row">
<div class="form-group col-xs-4">
<label>Country Code</label>
<input type="text" name="country_flag" class="form-control required" placeholder="Enter SMTP Username" value="<?= $data['country_flag'] ?>">
</div>
<div class="form-group col-xs-3">
<label>Currency</label>
<input type="text" name="currency" class="form-control required" placeholder="Enter SMTP Password" value="<?= $data['currency'] ?>">
</div>
<div class="form-group col-xs-5">
<label>Favicon Icon</label>
<div class="col-md-12">
<div class="col-md-3">
<img id="fav_icon_image" src="<?= base_url($data['fav_icon']) ?>" onerror="this.src='<?=base_url("assets/images/no_image.png")?>';" height="75" width="75">
</div>
<div class="col-md-9" style="padding-top: 25px;">
<input name="fav_icon" type="file" accept="image/*" onchange="setImg(this,'fav_icon_image');" />
</div>
</div>
</div>
</div>
<div class="row">
<div class="form-group col-xs-4">
<label>SMTP Username</label>
<input type="text" name="smtp_username" class="form-control required" placeholder="Enter SMTP Username" value="<?= $data['smtp_username'] ?>">
</div>
<div class="form-group col-xs-3">
<label>SMTP Password</label>
<input type="text" name="smtp_password" class="form-control required" placeholder="Enter SMTP Password" value="<?= $data['smtp_password'] ?>">
</div>
<div class="form-group col-xs-4">
<label>Google API Key</label>
<input type="text" name="google_api_key" class="form-control required" placeholder="Enter Google API" value="<?= $data['google_api_key'] ?>">
</div>
</div>
</div>
<div class="box-footer" style="padding-left:46%">
<button type="submit" class="btn btn-info">Update</button>
</div>
</form>
</div>
</section>
</div>
\ No newline at end of file
......@@ -2,7 +2,7 @@
base_url = "<?php echo base_url(); ?>";
country_flag = '<?= $this->session->userdata['settings']['country_flag'] ?>';
</script>
<script src="https://maps.googleapis.com/maps/api/js?key=<?= $this->session->userdata['settings']['google_api_key'] ?>&libraries=places"></script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyC9JX3BZZfx2S6GQieC_PqjuJdUbZ7_wyM&libraries=places"></script>
<script src="<?php echo base_url(); ?>assets/js/bootstrap.min.js"></script>
<script src="<?php echo base_url(); ?>assets/js/pace.js"></script>
<script src="<?php echo base_url(); ?>assets/js/select2.full.min.js"></script>
......@@ -12,46 +12,37 @@
<script src="<?php echo base_url(); ?>assets/js/app.min.js"></script>
<script src="<?php echo base_url(); ?>assets/js/custom-script.js"></script>
<script src="<?php echo base_url();?>assets/js/parsley.min.js"></script>
<script src="<?php echo base_url();?>assets/js/nemt_custom.js?<?= time() ?>"></script>
<script src="<?php echo base_url();?>assets/js/nemt_custom.js"></script>
<script src="https://cdn.ckeditor.com/4.5.7/standard/ckeditor.js"></script>
<script src="<?php echo base_url();?>assets/js/bootstrap-datepicker.js"></script>
<script type="text/javascript" src="<?= base_url('assets/js/clockpicker.js') ?>"></script>
<script>
jQuery('.clockpicker').clockpicker();
$(function () {
$('.datatable').DataTable({
"ordering" : $(this).data("ordering"),
"order": [[ 0, "asc" ]]
});
});
function doconfirm(){
function doconfirm()
{
job=confirm("Are you sure to delete permanently?");
if(job!=true)
return false;
}
<?php
jQuery('.clockpicker').clockpicker();
</script>
<?php
$ci = & get_instance();
$controllerName = $ci->uri->segment(1);
$actionName = $ci->uri->segment(2);
$page = $controllerName . '-' . $actionName;
switch ($page) {
case 'Ride-view_rides': ?>
jQuery(function () {
jQuery('.datatable').DataTable({
scrollY: "300px",
scrollX: true,
scrollCollapse: true,
paging: false,
fixedColumns: {
heightMatch: 'none'
case 'Ride-import_ride':
?><?php
break;
}
});
});
<?php break;
default : ?>
jQuery(function () {
jQuery('.datatable').DataTable({
"ordering" : jQuery(this).data("ordering"),
"order": [[ 0, "asc" ]]
});
});
<?php } ?>
</script>
\ No newline at end of file
?>
\ No newline at end of file
<!-- POP-UP VIEW MODAL END -->
<div class="modal fade" id="popup_modal" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">&times;</button>
<h4 class="modal-title" id="modal_header"></h4>
</div>
<div class="modal-body col-md-12" id="modal_content" style="border-bottom:1px solid #e5e5e5;">
<!-- POP-UP VIEW MODAL CONTENT -->
</div>
<div class="modal-footer">
<div>&nbsp;</div>
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- POP-UP VIEW MODAL END -->
<footer class="main-footer">
<div class="pull-right hidden-xs">
<b>Version</b> 1.0
......
......@@ -3,9 +3,7 @@
<a href="<?php echo base_url(); ?>" class="logo">
<!-- mini logo for sidebar mini 50x50 pixels -->
<!-- <span class="logo-mini"><b>B S</b></span>-->
<span class="logo-mini">
<img id="fav_icon" src="<?= base_url($this->session->userdata['settings']['site_logo']) ?>" onerror="this.src='<?=base_url("assets/images/no_image.png")?>';" height="50" width="50" />
</span>
<span class="logo-mini"><b><?=$this->session->userdata['settings']['title_short']?></b></span>
<!-- logo for regular state and mobile devices -->
<!-- <span class="logo-lg"><b>Bus Solution</b></span>-->
<span class="hidden-xs"><?=$this->session->userdata['settings']['title_short']?></span>
......
......@@ -2,7 +2,6 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title><?=$this->session->userdata['settings']['title_short']?></title>
<link href="<?= base_url($this->session->userdata['settings']['fav_icon']) ?>" type="image/x-icon" />
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<link rel="stylesheet" href="<?php echo base_url(); ?>assets/css/bootstrap.min.css">
......@@ -12,16 +11,12 @@
<link rel="stylesheet" href="<?php echo base_url(); ?>assets/css/dataTables.bootstrap.css">
<link rel="stylesheet" href="<?php echo base_url(); ?>assets/css/AdminLTE.min.css">
<link rel="stylesheet" href="<?php echo base_url(); ?>assets/css/pace.css">
<link rel="stylesheet" href="<?php echo base_url(); ?>assets/css/<?= $this->config->item("theme_color") ?>.css">
<link rel="stylesheet" href="<?php echo base_url(); ?>assets/css/custom-style.css?<?= time() ?>">
<link rel="stylesheet" href="<?php echo base_url(); ?>assets/css/<?php echo $this->config->item("theme_color"); ?>.css">
<link rel="stylesheet" href="<?php echo base_url(); ?>assets/css/custom-style.css">
<link href="<?php echo base_url();?>assets/css/parsley/parsley.css" rel="stylesheet">
<link href="<?php echo base_url();?>assets/css/bootstrap-datepicker3.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="<?= base_url('assets/css/clockpicker.css') ?>">
<script src="<?php echo base_url(); ?>assets/js/jQuery-2.1.4.min.js"></script>
<script type="text/javascript">
report_data = ride_ids = [];
</script>
</head>
......@@ -40,32 +40,10 @@
</li>
</ul>
</li>
<?php if($this->session->userdata['user_type'] == 1){ ?>
<li class="treeview">
<a href="#">
<i class="fa fa-bars" aria-hidden="true"></i>
<span>Customer Management</span>
<i class="fa fa-angle-left pull-right"></i>
</a>
<ul class="treeview-menu">
<li>
<a href="<?= base_url('Customer/addCustomerUser') ?>">
<i class="fa fa-circle-o text-aqua"></i>
Add Customer
</a>
</li>
<li>
<a href="<?= base_url('Customer/listCustomerUsers') ?>">
<i class="fa fa-circle-o text-aqua"></i>
View Customer
</a>
</li>
</ul>
</li>
<li class="treeview">
<a href="#">
<i class="fa fa-bars" aria-hidden="true"></i>
<span>Company Management</span>
<i class="fa fa-angle-left pull-right"></i>
</a>
......@@ -147,25 +125,17 @@
</a>
<ul class="treeview-menu">
<li>
<a href="<?= base_url('Ride/view_rides') ?>">
<i class="fa fa-circle-o text-aqua"></i>
View Rides
</a>
</li>
<li>
<a href="<?= base_url('Ride/import_ride') ?>">
<i class="fa fa-circle-o text-aqua"></i>
Import Rides
</a>
</li>
<?php if($this->session->userdata['user_type'] != 1){ ?>
<li>
<a href="<?= base_url('Ride/scheduled_rides') ?>">
<a href="<?= base_url('Ride/view_rides') ?>">
<i class="fa fa-circle-o text-aqua"></i>
Scheduled Rides
View Rides
</a>
</li>
<?php } ?>
</ul>
</li>
<li><a href="<?= base_url('Payment/getPayDetails') ?>">
......@@ -176,12 +146,6 @@
<i class="fa fa-wrench" aria-hidden="true">
</i><span>Report Generation</span></a>
</li>
<?php if($this->session->userdata['user_type'] == 1){ ?>
<li><a href="<?= base_url('Settings') ?>">
<i class="fa fa-wrench" aria-hidden="true">
</i><span>Settings</span></a>
</li>
<?php } ?>
</ul>
</section>
<!-- /.sidebar -->
......
......@@ -81,20 +81,20 @@
width: 34px;
margin-top:10px;
height: 41px;
}.seater{
}.seater{
background-image: url(./images/4.png);background-repeat: no-repeat;height: 23px;
width: 34px;
margin-top:10px;
height: 41px;
}.sleeper1{
}.sleeper1{
background-image: url(../images/empty.png);background-repeat: no-repeat;height: 23px;
width: 34px;
margin-top:10px;
height: 41px;
}
}
.sub_buttons{padding-top:23px !important;}
.well {
.sub_buttons{padding-top:23px !important;}
.well {
position: absolute;
z-index: 1;
margin-top: -30px;
......@@ -102,14 +102,14 @@
min-height: 30px;
padding: 0 6.5px;
left: 25%;
}
}
.thumbnailss {
.thumbnailss {
list-style:none;
}
}
/******SEAT BLOCK CSS********/
.sleeper {
/******SEAT BLOCK CSS********/
.sleeper {
background-image: url(../images/1.png);
background-repeat: no-repeat;
height: 23px;
......@@ -209,101 +209,15 @@
margin-top: 10px;
height: 21px;
}
/******SEAT BLOCK CSS********/
/******SEAT BLOCK CSS********/
.prevent-click {
.prevent-click {
pointer-events: none;
cursor: default;
text-decoration: none;
color: black;
}
}
.hide {
.hide {
display:none !important;
}
.loader{
position: absolute;
top: 0px;
right: 0px;
bottom: 0px;
left: 0px;
text-align: center;
background-image: url(../images/loader.gif);
background-size: 5%;
background-position: center;
background-repeat: no-repeat;
background-color: rgba(0,0,0,0.56);
}
.height_200{
height: 200px !important;
}
.cpoint{
cursor: pointer !important;
}
.overlay {
position: fixed;
display: none;
width: 100%;
height: 100%;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0,0,0,0.5);
z-index: 2;
cursor: pointer;
}
.drag-box {
float: left;
width: 100%;
min-height: 28px;
margin: 2px;
border: 1px solid #A8A8A8;
}
.border-cls {
border: 1px solid #e0dbdb;
}
.headtag-td {
padding: 5px;
width: 50%;
}
.header-tag {
border: 1px solid darkgray;
border-radius: 10px;
padding: 0px 10px;
display: inline-block;
margin: 2px;
background: #c2ccd6;
}
.header-tag-box {
width:100%;
min-height:400px;
border: 1px solid #dfdbdb;
padding: 2px;
}
.clear {
clear: both !important;
}
.btn-mapping {
text-align: center;
padding: 15px;
}
.tr-cls {
height: 43px;
}
.disable-block {
pointer-events: none;
opacity: 0.5;
}
\ No newline at end of file
}
\ No newline at end of file
jQuery(document).ready(function(){
jQuery('<div class="overlay"></div>').insertBefore(".content-wrapper");
});
function setImg(input,id) {
if (input.files && input.files[0]) {
var reader = new FileReader();
......@@ -41,7 +37,6 @@ function checkChild(thisObj){
} else {
jQuery('[id^="table_'+table+'_"]').prop("checked", false);
}
jQuery('[name^="TDLS.transport_id"],[name^="TDLS.medical_no"],[name^="TDLS.patient_name"],[name^="TDLS.age"],[name^="TDLS.phone"],[name^="APRES.reason"],[name^="TDLS.appointment_time"]').prop("checked", true).parent().closest('div').addClass('disable-block');
}
jQuery('[name="fieldType"]').click(function(){
......@@ -53,6 +48,7 @@ jQuery('[name="fieldType"]').click(function(){
}
});
report_data = [];
jQuery('[id="rGenerate"]').click(function(){
event.preventDefault();
var fields = '',
......@@ -66,6 +62,7 @@ jQuery('[id="rGenerate"]').click(function(){
}
thisObj.attr('dmclick','1');
jQuery('[name^="TDLS.transport_id"],[name^="TDLS.medical_no"],[name^="TDLS.patient_name"],[name^="TDLS.age"],[name^="TDLS.phone"],[name^="APRES.reason"],[name^="TDLS.appointment_time"]').prop("checked", true);
if(fieldType == 'custom'){
jQuery.each(jQuery('[id="field_list"]').serialize().split('&'), function (key,field) {
var field_arr = field.split('=');
......@@ -130,27 +127,16 @@ function slideTo(id){
}
jQuery('#report_table tbody').on('click','a',function() {
var thisObj = jQuery(this),
key = thisObj.attr('key');
viewOrderDetails(key);
});
jQuery('[id="viewRideDetails"]').click(function(){
console.log('sdrfg');
var thisObj = jQuery(this),
var body_html = rowHtml = '',
thisObj = jQuery(this),
key = thisObj.attr('key');
viewOrderDetails(key);
});
function viewOrderDetails(key){
var body_html = rowHtml = '';
var colCount = 1;
body_html = '<div class="col-xs-12">';
jQuery.each(report_data[key], function(field,value) {
value = (value == null || value == 'null' || value == undefined || value == 'undefined')?'--':value;
rowHtml += '<div class="col-xs-6"><div class="col-xs-12">'+
'<div class="col-xs-6">'+field.replace(/_/g,' ')+'</div>'+
'<div class="col-xs-6">'+field.replace('_',' ')+'</div>'+
'<div class="col-xs-1">:</div>'+
'<div class="col-xs-5">'+value+'</div>'+
'</div></div>';
......@@ -162,208 +148,11 @@ function viewOrderDetails(key){
colCount++;
}
});
body_html += (rowHtml != '')?rowHtml+'</div>':'</div>';
modalTrigger('Ride Details',body_html);
}
function getBrokerRides(){
jQuery('[id="getBrokerRides"]').submit();
}
body_html += '</div>';
jQuery('[id="report_list_content"]').html(body_html);
jQuery('[id="report_list_modal"]').modal('show');
});
function getCmpyPayDetls(){
jQuery('[id="cmpyPayDetlsForm"]').submit();
}
\ No newline at end of file
function modalTrigger(header,body_html){
jQuery('[id="modal_content"]').html(body_html);
jQuery('[id="modal_header"]').html(header);
jQuery('[id="popup_modal"]').modal('show');
}
function modalHide(){
jQuery('[id="popup_modal"]').modal('hide');
}
function addModalLoader(){
jQuery("[id='modal_content']").addClass('relative height_200');
jQuery("[id='modal_content']").prepend("<div id='modal_loader_body' class='loader'></div>");
}
function remModalLoader(){
jQuery("[id='modal_loader_body']").remove();
jQuery("[id='modal_content']").removeClass('relative height_200');
}
jQuery('[id="scheduleAll"]').click(function(){
if(ride_ids==undefined || ride_ids=='undefined' || ride_ids==null || ride_ids=='null' || ride_ids==''){
return false;
}
markAsScheduled(ride_ids,'0');
});
jQuery('[id^="markSchedule_"]').click(function(){
var thisObj = jQuery(this),
is_scheduled = thisObj.attr('is_scheduled'),
transport_id = thisObj.attr('transport_id');
if(transport_id == undefined || transport_id == 'undefined' || transport_id == null || transport_id == 'null' || transport_id == '' ||
is_scheduled == undefined || is_scheduled == 'undefined' || is_scheduled == null || is_scheduled == 'null' || is_scheduled == ''){
return false;
}
if(is_scheduled == 1){
flag = confirm("Are you sure to continue with this action...?");
if(flag != true) return false;
}
markAsScheduled(transport_id,is_scheduled);
});
function markAsScheduled(transport_id,is_scheduled){
if(transport_id == undefined || transport_id == 'undefined' || transport_id == null || transport_id == 'null' || transport_id == '' ||
is_scheduled == undefined || is_scheduled == 'undefined' || is_scheduled == null || is_scheduled == 'null' || is_scheduled == ''){
return false;
}
showFullScreenLoader();
jQuery.ajax({
url : base_url+"Ride/changeSchuduleStatus",
type : 'POST',
data : {'transport_id':transport_id,'is_scheduled':is_scheduled},
success: function(resp){
if(resp == '' || resp == undefined || resp == null || resp == 'null' || resp == 'undefined'){
remFullScreenLoader();
return false;
}
resp = jQuery.parseJSON(resp);
if(resp['status'] == 1){
var color = '';
if(is_scheduled == 1){
color = 'red'
is_scheduled = 0;
} else {
color = 'green'
is_scheduled = 1;
}
jQuery.each(resp['succArr'], function(index,value) {
jQuery('[id="markSchedule_'+value+'"]').attr('is_scheduled',is_scheduled);
jQuery(jQuery('[id="markSchedule_'+value+'"]')).children().css( "color", color );
});
remFullScreenLoader();
} else {
remFullScreenLoader();
setErrModal('Error Scheduling Rides','Something went wrong, please try again..!');
}
},
error: function (jqXHR, exception) {
remFullScreenLoader();
}
});
}
function showFullScreenLoader(){
var thisObj = jQuery('.overlay');
thisObj.css("display",'block');
thisObj.addClass('relative');
thisObj.prepend("<div id='fullScreenLoaderBody' class='loader'></div>");
}
function remFullScreenLoader(){
var thisObj = jQuery('.overlay');
thisObj.css("display",'none');
jQuery('[id="fullScreenLoaderBody"]').remove();
thisObj.removeClass('relative');
}
function allowDropElement(ev) {
if(ev.target.getAttribute('type') != 'parent' && ev.target.firstChild != null){
return false;
}
ev.preventDefault();
}
function dragElement(ev) {
ev.dataTransfer.setData("tmporderid", ev.target.getAttribute('id'));
}
function dropElement(ev) {
ev.preventDefault();
jQuery(event.target).css('border-color','#A8A8A8');
var tmporderid = ev.dataTransfer.getData("tmporderid");
ev.target.appendChild(document.getElementById(tmporderid));
}
jQuery('[id="upload_excell"]').click(function(){
var thisObj = jQuery(this), childThisObj = '', headerOrder = [], fileType = jQuery('[name="fileType"]').val(),
broker_id = jQuery('[name="broker_id"]').val(), company_id = jQuery('[name="company_id"]').val(),
import_file = jQuery('[name="import_file"]').val(), childHead = '', errMsg = '', error = '0';
if(thisObj.attr('dmclick') != 0){
return false;
}
if(fileType == '' || fileType == undefined || fileType == null || fileType == 'null' || fileType == 'undefined' ||
broker_id == '' || broker_id == undefined || broker_id == null || broker_id == 'null' || broker_id == 'undefined' ||
company_id == '' || company_id == undefined || company_id == null || company_id == 'null' || company_id == 'undefined' ||
import_file == '' || import_file == undefined || import_file == null || import_file == 'null' || import_file == 'undefined'){
setErrModal('Error Uploading Excell','Please Map All the Fields to the corrospinding header..!');
return false;
}
showFullScreenLoader();
thisObj.attr('dmclick',1);
jQuery('[id="mappedHeaders"] [required="yes"]').each(function(){
childThisObj = jQuery(this);
if (childThisObj.children().length <= 0) {
remFullScreenLoader();
thisObj.attr('dmclick',0);
childThisObj.css('border-color','red');
setErrModal('Error Uploading Excell','Map all required fields..!');
error = '1';
}
childHead = childThisObj.children();
headerOrder[childThisObj.attr('headOrder')] = childHead.attr('tmporder');
});
if(error == '1'){
return false;
}
jQuery.ajax({
url : base_url+"Ride/import",
type : 'POST',
data : {'broker_id':broker_id,'company_id':company_id,'header_order':headerOrder,'file_type':fileType,'import_file':import_file},
success: function(resp){
if(resp == '' || resp == undefined || resp == null || resp == 'null' || resp == 'undefined'){
remFullScreenLoader();
thisObj.attr('dmclick',0);
setErrModal('Error Uploading Excell','Something went wrong, please try again..!');
return false;
}
resp = jQuery.parseJSON(resp);
if(resp['status'] == 1){
window.location.replace(base_url+'Ride/view_rides');
} else {
if (resp['status'] == 0) {
errMsg = 'Something went wrong, please try again..!';
} else if (resp['status'] == 2) {
errMsg = 'Invalid File given, please try again later..!';
} else if (resp['status'] == 3) {
errMsg = 'No data found, please try again later..!';
} else if (resp['status'] == 4) {
errMsg = 'Invalid header given, please try again later..!';
}
remFullScreenLoader();
thisObj.attr('dmclick',0);
setErrModal('Error Uploading Excell',errMsg);
}
return false;
},
error: function (jqXHR, exception) {
remFullScreenLoader();
thisObj.attr('dmclick',0);
setErrModal('Error Uploading Excell','Something went wrong, please try again..!');
return false;
}
});
});
\ No newline at end of file
......@@ -56,7 +56,7 @@ ob_start();
* NOTE: If you change these, also change the error_reporting() code below
*/
//define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');
define('ENVIRONMENT', 'development');
define('ENVIRONMENT', 'production');
/*
*---------------------------------------------------------------
......@@ -76,7 +76,7 @@ switch (ENVIRONMENT)
case 'testing':
case 'production':
error_reporting(-1);
ini_set('display_errors', 0);
ini_set('display_errors', 1);
if (version_compare(PHP_VERSION, '5.3', '>='))
{
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment