-
Posts
304 -
Joined
-
Last visited
Content Type
Profiles
Forums
phpVMS Resources
Downloads
Posts posted by Fernando
-
-
Good Job !!
Thanks!
-
This looks pretty nice! Thanks for your effort! Will try to somehow implent this into my website
I left the installation manual above.
-
What is the error? So we can help you
-
I downloaded the latest version of shopp V1, the SQL sent to the server normally.
In the Admin Center, added one type and Shop
But when I click enter product the message
You must add atleast one product type before you can add a product!I can not insert a product at the mall, Can anyone help me?
-
Thank you!
-
I downloaded the latest version of shopp V1, the SQL sent to the server normally.
In the Admin Center, added one type and Shop
But when I click enter product the message
You must add atleast one product type before you can add a product!I can not insert a product at the mall, Can anyone help me?
-
You go share this work?
-
I never received a PM from you. So I sent you one
Jeff,
Send now.
Thank you.
-
I would recommend using TFDi Designs smartCARS platform. They plan on launching smartCARS 2.0 in just a few months, which will have full customization, and the current smartCARS already has a ton of functions!
You can share the link?
Can not find
-
As it states, that system is not for sale. However you may work with Jeff to create systems custom to your virtual airline.
I sent a PM to Jeff still did not respond.
-
Thank you very much!
-
where do I find it?
-
Parkho
I realized that a former programmer installed a system for automatic approval of flight by cpanel.
But I can not think it will be that this is the real problem that does not account for the sums of PIREPs site.
Within phpAdmin / Reset Count PIREP Pilot
By clicking the button above appears the number of flights for each pilot performed, but the website does not.
I believe that this script is in the cpanel that is directly impacting this count, you know where it can be installed?
-
Strider.
The coding of this system is possible as well? I wonder who is the author of APV, I want this custom insert on the my Virtual Airline
-
I wonder if this system will be marketed as personalized Kacars?
-
Anyone know if this system will be marketed?
It was very beautiful, what is the real author of the program?
Link to view it
-
As I understand this script it works by entering the number of the pilot, correct?
I need the code to be inserted in pilot_list.tpl him count the number of flights from all pilots.
When I enter the administrator and restart the PIREPs, the system identifies the number of PIREPs of each pilot.
When I go back on the page Pilot_list the number of flights for each pilot is not disclosed remains at 0
-
You can send me a PM,
I do for you without charge.
It is always a pleasure to help friends here, it costs nothing.
-
Open PilotData.class.php and add the following function at the end before the last bracket closes:
public function TotalFlightsByPilot() { $pilotid = Auth::$userinfo->pilotid; $sql = "SELECT * FROM phpvms_pireps WHERE pilotid = '$pilotid'"; return DB::get_results($sql); }
Then if you need to access the flights use the following:
<p> Total flight by pilot: <?php echo count( PilotData::TotalFlightsByPilot()) ;?></p>
Let us know what happens.
Parkho,
I did and the problem continues,
enter the code PilotData.class.php
But the number of flights is cleared, check the code below
<?php/**
* phpVMS - Virtual Airline Administration Software
* Copyright © 2008 Nabeel Shahzad
* For more information, visit www.phpvms.net
* Forums: http://www.phpvms.net/forum'>http://www.phpvms.net/forum
* Documentation: http://www.phpvms.net/docs'>http://www.phpvms.net/docs
*
* phpVMS is licenced under the following license:
* Creative Commons Attribution Non-commercial Share Alike (by-nc-sa)
* View license.txt in the root, or visit http://creativecommons.org/licenses/by-nc-sa/3.0/
*
* @author Nabeel Shahzad
* @copyright Copyright © 2008, Nabeel Shahzad
* @link http://www.phpvms.net
* @license http://creativecommons.org/licenses/by-nc-sa/3.0/
*/
class PilotData extends CodonData
{
public static $pilot_data = array();
/**
* Find any pilots based on the parameters passed in
*
* @param array $params All the parameters
* @param int $limit Number of results to return
* @param int $start Record to start from
* @return array Returns all the pilots requested
*
*/
public static function findPilots($params, $limit='', $start = '')
{
$sql = "SELECT p.*, r.`rankimage`, r.`payrate`
FROM ".TABLE_PREFIX."pilots p
LEFT JOIN ".TABLE_PREFIX."ranks r ON r.rank=p.rank ";
/* Build the select "WHERE" based on the columns passed, this is a generic function */
$sql .= DB::build_where($params);
// Order matters
if(Config::Get('PILOT_ORDER_BY') != '')
{
$sql .= ' ORDER BY '.Config::Get('PILOT_ORDER_BY');
}
if(strlen($limit) != 0)
{
$sql .= ' LIMIT '.$limit;
}
if(strlen($start) != 0)
{
$sql .= ' OFFSET '. $start;
}
$ret = DB::get_results($sql);
return $ret;
}
/**
* Get all the pilots, or the pilots who's last names start
* with the letter
*/
public static function getAllPilots($letter='')
{
$params = array();
if(!empty($letter))
{
$params['lastname'] = $letter.'%';
}
return self::findPilots($params);
}
/**
* Get all the detailed pilot's information
*/
public static function getAllPilotsDetailed($limit=20, $start='')
{
return self::findPilots(array(), $limit, $start);
}
/**
* Get a pilot's avatar
*/
public static function getPilotAvatar($pilotid)
{
if(is_numeric($pilotid))
{
$pilot = self::getPilotData($pilotid);
$pilotid = self::getPilotCode($pilot->code, $pilot->pilotid);
}
$link = AVATAR_PATH.'/'.$pilotid.'.png';
if(!file_exists(SITE_ROOT.'/'.$link))
{
return SITE_URL.'/lib/images/noavatar.png';
}
return SITE_URL.'/'.$link;
}
/**
* Get all the pilots on a certain hub
*/
public static function getAllPilotsByHub($hub)
{
return self::findPilots(array('p.hub'=>$hub));
}
/**
* Return the pilot's code (ie DVA1031), using
* the code and their DB ID
*/
public static function getPilotCode($code, $pilotid)
{
# Make sure values are entered
if(Config::Get('PILOTID_LENGTH') == '')
Config::Set('PILOTID_LENGTH', 4);
if(Config::Get('PILOTID_OFFSET') == '')
Config::Set('PILOTID_OFFSET', 0);
$pilotid = $pilotid + Config::Get('PILOTID_OFFSET');
return $code . str_pad($pilotid, Config::Get('PILOTID_LENGTH'), '0', STR_PAD_LEFT);
}
/**
* The the basic pilot information
* Quasi 'cached' in case it's called multiple times
* for the same pilot in one script
*/
public static function getPilotData($pilotid)
{
$pilot = self::findPilots(array('p.pilotid' => $pilotid), 1);
if(!$pilot)
{
return false;
}
return $pilot[0];
}
/**
* Get a pilot's information by email
*/
public static function getPilotByEmail($email)
{
$pilot = self::findPilots(array('p.email'=>$email));
if(!$pilot)
{
return false;
}
return $pilot[0];
}
/**
* Parse a pilot ID from a passed ID
*
* @param int $pilotid Pass the ID string
* @return int Returns the integer database ID
*
*/
public static function getProperPilotID($pilotid)
{
return self::parsePilotID($pilotid);
}
/**
* Parse a pilot ID from a passed ID
*
* @param int $pilotid Pass the ID string
* @return int Returns the integer database ID
*
*/
public static function parsePilotID($pilotid)
{
if(!is_numeric($pilotid))
{
$airlines = OperationsData::getAllAirlines();
foreach($airlines as $a)
{
$a->code = strtoupper($a->code);
if(strpos($pilotid, $a->code) === false)
{
continue;
}
$pilotid = intval(str_ireplace($a->code, '', $pilotid));
$pilotid = $pilotid - Config::Get('PILOTID_OFFSET');
}
}
return $pilotid;
}
/**
* Get the list of all the pending pilots
*/
public static function getPendingPilots($count='')
{
$params = array(
'p.confirmed' => PILOT_PENDING
);
return self::findPilots($params, $count);
}
public static function getLatestPilots($count=10)
{
$sql = 'SELECT * FROM '.TABLE_PREFIX.'pilots
ORDER BY `pilotid` DESC
LIMIT '.$count;
return DB::get_results($sql);
}
/**
* Change a pilot's name. This is separate because this is an
* admin-only operation (strictly speaking), and isn't included
* in a normal change of a pilot's profile (whereas SaveProfile
* only changes minute information
*/
public static function changeName($pilotid, $firstname, $lastname)
{
# Non-blank
if(empty($pilotid) || empty($firstname) || empty($lastname))
{
return false;
}
$params = array(
'firstname' => $firstname,
'lastname' => $lastname,
);
return self::updateProfile($pilotid, $params);
}
public static function changePilotID($old_pilotid, $new_pilotid)
{
$pilot_exists = self::getPilotData($new_pilotid);
if(is_object($pilot_exists))
{
return false;
}
DB::query('SET foreign_key_checks = 0;');
// List of all the tables which need to update
$table_list = array(
'groupmembers',
'pilots',
'adminlog',
'awardsgranted',
'acarsdata',
'sessions',
'pireps',
'pirepcomments',
'fieldvalues',
'bids',
);
foreach($table_list as $table)
{
$sql = 'UPDATE `'.TABLE_PREFIX.$table.'`
SET `pilotid`='.$new_pilotid.'
WHERE `pilotid`='.$old_pilotid;
DB::query($sql);
//DB::debug();
}
return true;
}
public static function changePilotRank($pilotid, $rankid)
{
$rank = RanksData::getRankInfo($rankid);
$rank_level = RanksData::getRankLevel($rankid);
if(!$rank)
{
return false;
}
$data = array(
'rankid' => $rank->rankid,
'rank' => $rank->rank,
'ranklevel' => $rank_level,
);
return self::updateProfile($pilotid, $data);
}
/**
* Save any changes to a pilot's profile, calls updateProfile()
*
* @deprecated Use updateProfile() instead!!
*
*/
/*public static function saveProfile($params)
{
$pilotid = $params['pilotid'];
unset($params['pilotid']);
return self::updateProfile($pilotid, $params);
}*/
/**
* Update a pilot, $params is an array of column_name=>value
*
* @param mixed $pilotid This is a description
* @param mixed $params This is a description
* @return mixed This is the return value description
*
*/
public static function updateProfile($pilotid, $params)
{
/*$params = array(
'pilotid' => '',
'code' => '',
'email' => '',
'location' => '',
'hub' => '',
'bgimage' => '',
'retired' => false,
);*/
if(!is_array($params))
{
return false;
}
/* Cleanup any specific parameters */
if(isset($params['location']))
{
$params['location'] = strtoupper($params['location']);
}
if(isset($params['retired']))
{
if(is_bool($params['retired']))
{
//$params['retired'] = intval($params['retired']);
# The above doesn't work for false =\
if($params['retired'] == true)
$params['retired'] = 1;
else
$params['retired'] = 0;
}
}
if(isset($params['pilotid']))
{
unset($params['pilotid']);
}
$sql = "UPDATE ".TABLE_PREFIX."pilots SET ";
$sql .= DB::build_update($params);
$sql .= " WHERE `pilotid`={$pilotid}";
$res = DB::query($sql);
if(DB::errno() != 0)
{
return false;
}
return true;
}
public static function updatePilotRankLevels()
{
$all_pilots = self::findPilots(array());
foreach($all_pilots as $pilot)
{
$rank_level = RanksData::getRankLevel($pilot->rankid);
self::updateProfile($pilot->pilotid, array('ranklevel'=>$rank_level));
}
}
public static function setPilotRetired($pilotid, $retired)
{
if($retired === true || $retired == '1')
{
$retired = 1;
}
else
{
$retired = 0;
}
return self::updateProfile($pilotid, array('retired'=>$retired));
}
/**
* Returns an array with a list of background images available
*
* @return array The background images list
*
*/
public static function getBackgroundImages()
{
$list = array();
$files = scandir(SITE_ROOT.'/lib/signatures/background');
foreach($files as $file)
{
if($file == '.' || $file == '..') continue;
if(strstr($file, '.png') !== false)
$list[] = $file;
}
return $list;
}
/**
* Save avatars
*/
public static function saveAvatar($code, $pilotid, $_FILES)
{
# Check the proper file size
# Ignored for now since there is a resize
/*if ($_FILES['avatar']['size'] > Config::Get('AVATAR_FILE_SIZE'))
{
return false;
}*/
if(!$_FILES['avatar']['type'])
return false;
# Create the image so we can convert it to PNG
if($_FILES['avatar']['type'] == 'image/gif')
{
$img = imagecreatefromgif($_FILES['file']['tmp_name']);
}
elseif($_FILES['avatar']['type'] == 'image/jpeg'
|| $_FILES['avatar']['type'] == 'image/pjpeg')
{
$img = imagecreatefromjpeg($_FILES['avatar']['tmp_name']);
}
elseif($_FILES['avatar']['type'] == 'image/png')
{
$img = imagecreatefrompng($_FILES['avatar']['tmp_name']);
}
# Resize it
$height = imagesy($img);
$width = imagesx($img);
$new_width = Config::Get('AVATAR_MAX_WIDTH');
$new_height = floor( $height * ( Config::Get('AVATAR_MAX_HEIGHT') / $width ) );
$avatarimg = imagecreatetruecolor($new_width, $new_height);
imagecopyresized($avatarimg, $img, 0,0,0,0,$new_width, $new_height, $width, $height);
# Output the file, to /lib/avatar/pilotcode.png
$pilotCode = self::getPilotCode($code, $pilotid);
imagepng($avatarimg, SITE_ROOT.AVATAR_PATH.'/'.$pilotCode.'.png');
imagedestroy($img);
}
/**
* Accept the pilot (allow them into the system)
*/
public static function AcceptPilot($pilotid)
{
return self::updateProfile($pilotid, array('confirmed'=>PILOT_ACCEPTED, 'retired'=>'0'));
}
/**
* Reject a pilot
*/
public static function RejectPilot($pilotid)
{
return self::DeletePilot($pilotid);
}
/**
* Completely delete a pilot
*
* @param int $pilotid Pilot ID
* @return mixed This is the return value description
*
*/
public static function deletePilot($pilotid)
{
$sql = array();
unset(self::$pilot_data[$pilotid]);
$sql[] = 'DELETE FROM '.TABLE_PREFIX.'acarsdata WHERE pilotid='.$pilotid;
$sql[] = 'DELETE FROM '.TABLE_PREFIX.'bids WHERE pilotid='.$pilotid;
$sql[] = 'DELETE FROM '.TABLE_PREFIX.'pireps WHERE pilotid='.$pilotid;
$sql[] = 'DELETE FROM '.TABLE_PREFIX.'pilots WHERE pilotid='.$pilotid;
# These SHOULD delete on cascade, but incase they don't
$sql[] = 'DELETE FROM '.TABLE_PREFIX.'fieldvalues WHERE pilotid='.$pilotid;
$sql[] = 'DELETE FROM '.TABLE_PREFIX.'groupmembers WHERE pilotid='.$pilotid;
$sql[] = 'DELETE FROM '.TABLE_PREFIX.'pirepcomments WHERE pilotid='.$pilotid;
foreach($sql as $query)
{
$res = DB::query($query);
}
if(DB::errno() != 0)
return false;
return true;
}
/**
* Update the login time
*/
public static function updateLogin($pilotid)
{
return self::updateProfile($pilotid, array(
'lastlogin'=>'NOW()',
'lastip' => $_SERVER['REMOTE_ADDR'],
)
);
}
public static function getPilotHours($pilotid)
{
$sql = 'SELECT `flighttime` FROM '.TABLE_PREFIX.'pireps
WHERE `accepted`='.PIREP_ACCEPTED.'
AND `pilotid`='.$pilotid;
$pireps = DB::get_results($sql);
if(!$pireps)
return '0.0';
$total = 0;
foreach($pireps as $report)
{
$total = Util::AddTime($total, $report->flighttime);
}
return $total;
}
/**
* Get the total number of hours for a pilot, add them up
*
* @param int $pilotid The pilot ID
* @return int Total hours for pilot
*
*/
public static function updateFlightHours($pilotid)
{
$total = self::getPilotHours($pilotid);
$ret = self::updateProfile($pilotid, array('totalhours'=>$total));
return $total;
}
/**
* Update a pilot's flight data, ie after a pirep
*
* @param int $pilotid Pilot ID
* @param int $flighttime Number of hours.minutes to increment by
* @param int $numflights Number of flights (default 1)
* @return bool Success
*
*/
public static function updateFlightData($pilotid, $flighttime, $numflights=1)
{
# Update the flighttime
$pilotdata = PilotData::getPilotData($pilotid);
$flighttime = Util::AddTime($pilotdata->totalhours, $flighttime);
if($numflights == '')
$numflights = 1;
$params = array(
'totalhours' => $flighttime,
'totalflights' => ($pilotdata->totalflights + $numflights),
);
return self::updateProfile($pilotid, $params);
}
public static function updatePilotStats($pilotid)
{
$pireps = PIREPData::findPIREPS(array('p.pilotid'=>$pilotid));
$totalpireps = 0;
$totalhours = 0;
if(is_array($pireps))
{
foreach($pireps as $p)
{
if($p->accepted != PIREP_ACCEPTED)
{
continue;
}
$totalpireps++;
$totalhours = Util::AddTime($p->flighttime, $totalhours);
}
}
$params = array(
'totalhours'=>$totalhours,
'totalflights'=>$totalpireps,
);
return self::updateProfile($pilotid, $params);
}
/**
* Update the last PIREP date for a pilot
*
* @param int $pilotid Pilot ID
* @return bool Success
*
*/
public static function updateLastPIREPDate($pilotid)
{
return self::updateProfile($pilotid, array('lastpirep'=>'NOW()'));
}
/**
* Don't update the pilot's flight data, but just replace it
* with the values given
*
* $data = array(
'pilotid' => '',
'flighttime' => '',
'numflights' => '',
'totalpay' => '',
'transferhours' => '',
);
*
* @param int $pilotid Pilot ID
* @param int $flighttime Number of flight hours
* @param int $numflights Number of flights
* @param int $totalpay The total amount of money they have
* @return bool Success
*
*/
public static function replaceFlightData($params)
{
/*$data = array(
'pilotid' => '',
'flighttime' => '',
'numflights' => '',
'totalpay' => '',
'transferhours' => '',
);*/
$pilotid = $data['pilotid'];
unset($data['pilotid']);
return self::updateProfile($pilotid, $params);
}
public static function resetPilotPay($pilotid)
{
$total = 0;
self::updateProfile($pilotid, array('totalpay'=>0));
$sql = "SELECT `pirepid`, `flighttime`, `pilotpay`
FROM ".TABLE_PREFIX."pireps
WHERE `pilotid`={$pilotid}";
$results = DB::get_results($sql);
if(!$results)
{
return $total;
}
foreach($results as $row)
{
$payupdate = self::getPilotPay($row->flighttime, $row->pilotpay);
$total += $payupdate;
}
self::updateProfile($pilotid, array('totalpay'=>$total));
return $total;
}
/**
* Update a pilot's pay. Pass the pilot ID, and the number of
* hours they are being paid for
*
* @param int $pilotid The pilot ID
* @param int $flighthours Number of hours to pay the pilot for
* @return bool Success
*
*/
public static function updatePilotPay($pilotid, $flighthours)
{
$sql = 'SELECT payrate
FROM '.TABLE_PREFIX.'ranks r, '.TABLE_PREFIX.'pilots p
WHERE p.rank=r.rank
AND p.pilotid='.$pilotid;
$payrate = DB::get_row($sql);
$payupdate = self::getPilotPay($flighthours, $payrate->payrate);
$sql = 'UPDATE '.TABLE_PREFIX.'pilots
SET totalpay=totalpay+'.$payupdate.'
WHERE pilotid='.$pilotid;
DB::query($sql);
if(DB::errno() != 0)
return false;
return true;
}
/**
* Get the total pay for a flight at a certain rate,
* for a certain number of hours
*
* @param float $hours Number of hours in Hours.Minutes format
* @param float $rate Hourly rate
* @return float Returns the total
*
*/
public static function getPilotPay($hours, $rate)
{
/* Hours are in hours.minutes
convert to minutes */
$peices = explode('.', $hours);
$minutes = ($peices[0] * 60) + $peices[1];
$payupdate = $minutes * ($rate/60);
return $payupdate;
}
/**
* Find and set any pilots as retired
*
* @return mixed This is the return value description
*
*/
public static function findRetiredPilots()
{
$days = Config::Get('PILOT_INACTIVE_TIME');
if($days == '')
$days = 90;
$sql = "SELECT * FROM ".TABLE_PREFIX."pilots
WHERE DATE_SUB(CURDATE(), INTERVAL {$days} DAY) > `lastlogin`
AND `totalflights` = 0 AND `lastlogin` != 0
AND `retired` = 0";
$results = DB::get_results($sql);
$sql = "SELECT * FROM ".TABLE_PREFIX."pilots
WHERE DATE_SUB(CURDATE(), INTERVAL {$days} DAY) > `lastpirep`
AND `totalflights` > 0 AND `lastpirep` != 0
AND `retired` = 0";
$results2 = DB::get_results($sql);
// messy but two queries, merge them both
if(!is_array($results) && !is_array($results2))
{
return false;
}
else
{
if(is_array($results) && is_array($results2))
{
$results = array_merge($results, $results2);
}
if(!is_array($results) && is_array($results2))
{
$results = $results2;
}
}
if(!$results)
{
return false;
}
foreach($results as $row)
{
// Set them retired
self::updateProfile($row->pilotid, array('retired'=>1));
Template::Set('pilot', $row);
$pilot_retired_template = Template::Get('email_pilot_retired.tpl', true, true, true);
Util::SendEmail($row->email, Lang::get('email.pilot.retired.subject'), $pilot_retired_template);
}
}
/**
* This saves all of the custom fields attributed to pilot
* Pass an associated array (fieldname NOT title) to value
*
* @param int $pilotid Pilot ID
* @param array $list fieldname=>fieldvalue associated array
* @return bool Success value
*
*/
public static function SaveFields($pilotid, $list)
{
$allfields = RegistrationData::getCustomFields(true);
if(!$allfields)
return true;
foreach($allfields as $field)
{
$sql = 'SELECT id FROM '.TABLE_PREFIX.'fieldvalues
WHERE fieldid='.$field->fieldid.'
AND pilotid='.$pilotid;
$res = DB::get_row($sql);
$fieldname =str_replace(' ', '_', $field->fieldname);
if(!isset($list[$fieldname]))
continue;
$value = $list[$fieldname];
// if it exists
if($res)
{
$sql = 'UPDATE '.TABLE_PREFIX.'fieldvalues
SET value="'.$value.'"
WHERE fieldid='.$field->fieldid.' AND pilotid='.$pilotid;
}
else
{
$sql = "INSERT INTO ".TABLE_PREFIX."fieldvalues
(fieldid, pilotid, value) VALUES ($field->fieldid, $pilotid, '$value')";
}
DB::query($sql);
}
return true;
}
/**
* Get all of the custom fields and values for a pilot
*
* @param int $pilotid The pilot ID
* @param bool $inclprivate TRUE to also include private fields (default false)
* @return array Returns all of the fields (names and values)
*
*/
public static function getFieldData($pilotid, $inclprivate=false)
{
$sql = 'SELECT f.fieldid, f.title, f.type, f.fieldname, f.value as fieldvalues, v.value, f.public
FROM '.TABLE_PREFIX.'customfields f
LEFT JOIN '.TABLE_PREFIX.'fieldvalues v
ON f.fieldid=v.fieldid
AND v.pilotid='.$pilotid;
if($inclprivate == false)
$sql .= ' WHERE f.public=1 ';
return DB::get_results($sql);
}
/**
* Get the value of a "custom field" for a pilot
*
* @param int $pilotid The pilot ID
* @param string $title Full title of field, as enter "VATSIM ID"
* @return string Returns the value of that field
*
*/
public static function getFieldValue($pilotid, $title)
{
$sql = "SELECT f.fieldid, v.value
FROM ".TABLE_PREFIX."customfields f, ".TABLE_PREFIX."fieldvalues v
WHERE f.fieldid=v.fieldid
AND f.title='$title'
AND v.pilotid=$pilotid";
$res = DB::get_row($sql);
return $res->value;
}
/**
* Get all of the groups a pilot is a member of
*
* @param int $pilotid The pilot ID
* @return array Groups the pilot is in (groupid and groupname)
*
*/
public static function getPilotGroups($pilotid)
{
$pilotid = DB::escape($pilotid);
$sql = 'SELECT g.groupid, g.name
FROM ' . TABLE_PREFIX . 'groupmembers u,'.TABLE_PREFIX.'groups g
WHERE u.pilotid='.$pilotid.' AND g.groupid=u.groupid';
$ret = DB::get_results($sql);
return $ret;
}
/**
* This generates the forum signature of a pilot which
* can be used wherever. It's dynamic, and adjusts it's
* size, etc based on the background image.
*
* Each image is output into the /lib/signatures directory,
* and is named by the pilot code+number (ie, VMA0001.png)
*
* This is called whenever a PIREP is accepted by an admin,
* as not to burden a server with image generation
*
* Also requires GD to be installed on the server
*
* @param int The pilot ID for which to generate a signature for
* @return bool Success
*/
public function generateSignature($pilotid)
{
$pilot = self::getPilotData($pilotid);
$pilotcode = self::getPilotCode($pilot->code, $pilot->pilotid);
if(Config::Get('TRANSFER_HOURS_IN_RANKS') === true)
{
$totalhours = $pilot->totalhours + $pilot->transferhours;
}
else
{
$totalhours = $pilot->totalhours;
}
# Configure what we want to show on each line
$output = array();
$output[] = $pilotcode.' '. $pilot->firstname.' '.$pilot->lastname;
$output[] = $pilot->rank.', '.$pilot->hub;
$output[] = 'Total Flights: ' . $pilot->totalflights;
$output[] = 'Total Hours: ' . $totalhours;
if(Config::Get('SIGNATURE_SHOW_EARNINGS') == true)
{
$output[] = 'Total Earnings: ' . $pilot->totalpay;
}
# Load up our image
# Get the background image the pilot selected
if(empty($pilot->bgimage))
$bgimage = SITE_ROOT.'/lib/signatures/background/background.png';
else
$bgimage = SITE_ROOT.'/lib/signatures/background/'.$pilot->bgimage;
if(!file_exists($bgimage))
{
# Doesn't exist so use the default
$bgimage = SITE_ROOT.'/lib/signatures/background/background.png';
if(!file_exists($bgimage))
{
return false;
}
}
$img = @imagecreatefrompng($bgimage);
if(!$img)
{
$img = imagecreatetruecolor(300, 50);
}
$height = imagesy($img);
$width = imagesx($img);
$txtcolor = str_replace('#', '', Config::Get('SIGNATURE_TEXT_COLOR'));
$color = sscanf($txtcolor, '%2x%2x%2x');
$textcolor = imagecolorallocate($img, $color[0], $color[1], $color[2]);
$font = 3; // Set the font-size
$xoffset = Config::Get('SIGNATURE_X_OFFSET'); # How many pixels, from left, to start
$yoffset = Config::Get('SIGNATURE_Y_OFFSET'); # How many pixels, from top, to start
$font = Config::Get('SIGNATURE_FONT_PATH');
$font_size = Config::Get('SIGNATURE_FONT_SIZE');
if(function_exists('imageantialias'))
{
imageantialias($img, true);
}
/* Font stuff */
if(!function_exists('imagettftext'))
{
Config::Set('SIGNATURE_USE_CUSTOM_FONT', false);
}
# The line height of each item to fit nicely, dynamic
if(Config::Get('SIGNATURE_USE_CUSTOM_FONT') == false)
{
$stepsize = imagefontheight($font);
$fontwidth = imagefontwidth($font);
}
else
{
// get the font width and step size
$bb = imagettfbbox ( $font_size, 0, $font, 'A');
$stepsize = $bb[3] - $bb[5] + Config::Get('SIGNATURE_FONT_PADDING');
$fontwidth = $bb[2] - $bb[0];
}
$currline = $yoffset;
$total = count($output);
for($i=0;$i<$total;$i++)
{
if(Config::Get('SIGNATURE_USE_CUSTOM_FONT') == false)
{
imagestring($img, $font, $xoffset, $currline, $output[$i], $textcolor);
}
else
{
// Use TTF
$tmp = imagettftext($img, $font_size, 0, $xoffset, $currline, $textcolor, $font, $output[$i]);
// Flag is placed at the end of of the first line, so have that bounding box there
if($i==0)
{
$flag_bb = $tmp;
}
}
$currline+=$stepsize;
}
# Add the country flag, line it up with the first line, which is the
# pilot code/name
$country = strtolower($pilot->location);
if(file_exists(SITE_ROOT.'/lib/images/countries/'.$country.'.png'))
{
$flagimg = imagecreatefrompng(SITE_ROOT.'/lib/images/countries/'.$country.'.png');
if(Config::Get('SIGNATURE_USE_CUSTOM_FONT') == false)
{
$ret = imagecopy($img, $flagimg, strlen($output[0])*$fontwidth,
($yoffset+($stepsize/2)-5.5), 0, 0, 16, 11);
}
else
{
# figure out where it would go
$ret = imagecopy($img, $flagimg, $flag_bb[4]+5, $flag_bb[5]+2, 0, 0, 16, 11);
}
}
# Add the Rank image
if(Config::Get('SIGNATURE_SHOW_RANK_IMAGE') == true && $pilot->rankimage!=''
&& file_exists($pilot->rankimage))
{
$ext = substr($pilot->rankimage, strlen($pilot->rankimage)-3, 3);
# Get the rank image type, just jpg, gif or png
if($ext == 'png')
$rankimg = @imagecreatefrompng($pilot->rankimage);
elseif($ext == 'gif')
$rankimg = @imagecreatefromgif($pilot->rankimage);
else
$rankimg = @imagecreatefromjpg($pilot->rankimage);
if(!$rankimg) { echo '';}
else
{
$r_width = imagesx($rankimg);
$r_height = imagesy($rankimg);
imagecopy($img, $rankimg, $width-$r_width-$xoffset, $yoffset, 0, 0, $r_width, $r_height);
}
}
if(Config::Get('SIGNATURE_SHOW_COPYRIGHT') == true)
{
#
# DO NOT remove this, as per the phpVMS license
$font = 1;
$text = 'powered by phpvms, '. SITE_NAME.' ';
imagestring($img, $font, $width-(strlen($text)*imagefontwidth($font)),
$height-imagefontheight($font), $text, $textcolor);
}
imagepng($img, SITE_ROOT.SIGNATURE_PATH.'/'.$pilotcode.'.png', 1);
imagedestroy($img);
}
public function TotalFlightsByPilot()
{
$pilotid = Auth::$userinfo->pilotid;
$sql = "SELECT * FROM phpvms_pireps WHERE pilotid = '$pilotid'";
return DB::get_results($sql);
}
}
-
I'm using a custom, but I'm back to defaut page and the problem continues.,
-
Tylor Eddy, Very nice!!!
Thank you!
- 1
-
Nice job Fernando!
Thnks for share!!
Ademar, a pleasure ...
-
Well done, thanks for share.
Thank you, it is a pleasure to share with the whole community and phpvms.
-
Obrigado, Fernando
É um prazer! em breve novas novidades.
Import CSV #SOLVED
in Support Forum
Posted
I'm trying to import my CSV route,
However When saved in CSV version columns are excluded
and is inserted ( ; )
That I generate a mistake, I need to salver stand alone (,)
example:
Correct:
When saved instead of being like the example above, it appears.
Error
Can anyone help me.
I am using excel.