Advertisement
teague

marathon.php

Jul 9th, 2016
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 8.79 KB | None | 0 0
  1. <?php
  2.  
  3. require_once('mysql/mysql.class.php');
  4.  
  5. class MarathonImageWizard
  6. {
  7.  
  8.     private $marathon;
  9.     private $vars;
  10.  
  11.     public function __construct($marathon)
  12.     {
  13.         $this->marathon = $marathon;
  14.     }
  15.  
  16.     private function replaceVars($matches)
  17.     {
  18.         $vars = $this->vars;
  19.         if (isset($vars[$matches[1]]))
  20.         {
  21.             $value = $vars[$matches[1]];
  22.             if ($matches[1] == 'days')
  23.             {
  24.                 $days_word = getNumEnding($value, array('день', 'дня', 'дней'));
  25.                 return $value . ' ' . $days_word;
  26.             }
  27.             if ($matches[1] == 'remains')
  28.             {
  29.                 $days_word = getNumEnding($value, array('день', 'дня', 'дней'));
  30.  
  31.                 return $value . ' ' . $days_word;
  32.             }
  33.             return $vars[$matches[1]];
  34.         }
  35.     }
  36.  
  37.     private function fitTeamText($text, $font, $position, $image_width)
  38.     {
  39.         $size = 14;
  40.  
  41.         $text_bbox           = imagettfbbox($size, 0, $font, $text);
  42.         $attempt_shrink_font = false;
  43.         $shrink_font_to      = 8; //pt
  44.         $attempt_move_left   = false;
  45.         $move_to             = 15; //position in pixels
  46.         $step                = (int) ($size / 2);
  47.         while ($position->x + $text_bbox[2] > $image_width && $position->x > $move_to)
  48.         {
  49.             $position->x -= $step;
  50.         }
  51.         $attempt_move_left = $position->x >= $move_to;
  52.  
  53.         if (!$attempt_move_left)
  54.         {
  55.  
  56.             while ($position->x + $text_bbox[2] > $image_width && $position->x > $move_to)
  57.             {
  58.                 $size --;
  59.                 $text_bbox = imagettfbbox($size, 0, $font, $text);
  60.             }
  61.         }
  62.         else
  63.         {
  64.             $position->x -= $step*3;
  65.         }
  66.         return array('font_size' => $size, 'bbox' => $text_bbox, 'position' => array('x' => $position->x));
  67.     }
  68.  
  69.     public function getImg()
  70.     {
  71.         $marathon  = $this->marathon;
  72.         $img       = $marathon->template_path;
  73.         $positions = array(
  74.             1 => "Капитан",
  75.             2 => "Заместитель капитана",
  76.             3 => "Мудрец",
  77.             4 => "Помощник рефери",
  78.             5 => "Мотиваторник",
  79.             6 => "Демотиваторник",
  80.             7 => "Позитивник",
  81.             8 => "Другое..."
  82.         );
  83.         $pinfo     = pathinfo($img, PATHINFO_EXTENSION);
  84.  
  85.         if (8 != $marathon->position)
  86.         {
  87.             $position = $positions[$marathon->position];
  88.         }
  89.         else
  90.         {
  91.             $position = $marathon->other_occupation;
  92.         }
  93.         switch ($pinfo)
  94.         {
  95.             case "png":
  96.                 $im = imagecreatefrompng($img);
  97.                 break;
  98.             case "jpg":
  99.                 $im = imagecreatefromjpeg($img);
  100.                 break;
  101.             case "gif":
  102.                 $im = imagecreatefromgif($img);
  103.                 break;
  104.         }
  105.         list($width, $height, $type, $attr) = getimagesize($img);
  106.  
  107.         $navy_text = imagecolorallocate($im, 42, 80, 123);
  108.         $red_text  = imagecolorallocate($im, 189, 81, 0);
  109.  
  110.         $italic  = 'fonts/Cuprum-Italic.ttf';
  111.         $regular = 'fonts/Cuprum.ttf';
  112.  
  113.         $this->vars = array('position' => $marathon->position, 'days' => $marathon->getElapsed(), 'remains' => $marathon->getRemaining());
  114.  
  115.         $replaced_text = preg_replace_callback('#\{\$([^\}]+)\}#', array($this, 'replaceVars'), $marathon->text_template);
  116.         $team          = $marathon->team;
  117.  
  118.         imagefttext($im, MAIN_TEXT_FONT_SIZE, 0, 35, 10, $navy_text, $italic, $replaced_text, array());
  119.         imagefttext($im, MAIN_TEXT_FONT_SIZE, 0, 35, 26, $red_text, $italic, $position, array());
  120.         if (!empty($marathon->team))
  121.         {
  122.             $position    = new stdClass();
  123.             $position->x = 120;
  124.             $position->y = 27;
  125.             //array('font_size' => MAIN_TEXT_FONT_SIZE, 'bbox'=>array(0=>$position->x, 1=>$position->y))
  126.             $fit         = $this->fitTeamText($team, $italic, $position, $width);
  127.             imagefttext($im, $fit['font_size'], 0, $fit['position']['x'], $position->y, $red_text, $italic, $team, array());
  128.         }
  129.         imagefttext($im, 22, 0, 280, 24, $navy_text, $regular, $marathon->marathon_number, array());
  130.         $new_fname      = mt_rand();
  131.         $new_fname_full = IMAGE_PATH . $new_fname . '.' . $pinfo;
  132.         imagepng($im, $new_fname_full);
  133.         imagedestroy($im);
  134.         return $new_fname_full;
  135.     }
  136.  
  137. }
  138.  
  139. class Marathon
  140. {
  141.  
  142.     public $id;
  143.     public $length;
  144.     public $marathon_start;
  145.     public $marathon_name;
  146.     public $position;
  147.     public $team;
  148.     public $other_occupation;
  149.     public $resulting_image;
  150.     public $text_template;
  151.     public $record_created;
  152.     public $dbconn;
  153.  
  154.     public function __construct()
  155.     {
  156.         $this->dbconn = new MySQL(true, LINES_DB_NAME, null, LINES_DB_USER, LINES_DB_PASS, 'UTF8');
  157.     }
  158.  
  159.     public function getElapsed($time = null)
  160.     {
  161.         $time1 = !empty($time) ? date('d.m.Y H:i:s', strtotime($time)) : date('d.m.Y H:i:s');
  162.         $time2 = !empty($this->id) ? $this->marathon_start : date('d.m.Y H:i:s');
  163.         return (int) ((strtotime($time1) - strtotime($time2)) / 86400);
  164.     }
  165.  
  166.     public function getRemaining($time = null)
  167.     {
  168.         $time1   = !empty($time) ? date('d.m.Y H:i:s', strtotime($time)) : date('d.m.Y H:i:s');
  169.         $time2   = !empty($this->id) ? $this->marathon_start : date('d.m.Y H:i:s');
  170.         $elapsed = (int) ((strtotime($time1) - strtotime($time2)) / 86400);
  171.         return $this->length - $elapsed;
  172.     }
  173.  
  174.     public function loadMarathon($id)
  175.     {
  176.         if (!empty($id) && is_numeric($id))
  177.         {
  178.             $row = $this->dbconn->QuerySingleRow('SELECT * FROM settings WHERE id = ' . intval($id));
  179.  
  180.             foreach ($row as $key => $value)
  181.             {
  182.                 try
  183.                 {
  184.                     $this->$key = $value;
  185.                 }
  186.                 catch (Exception $ex)
  187.                 {
  188.                    
  189.                 }
  190.             }
  191.         }
  192.         else
  193.         {
  194.             return null;
  195.         }
  196.     }
  197.  
  198.     public function loadFromArray($arr)
  199.     {
  200.         $this->id               = intval($arr['id']);
  201.         $this->length           = intval($arr['ndays_count']);
  202.         $this->template_path    = 'uploads/100dney.png'; //$arr['image_path'];
  203.         $this->team             = $arr['team'];
  204.         $this->marathon_name    = $arr['marathon_name'];
  205.         $this->marathon_number  = $arr['marathon_number'];
  206.         $this->position         = $arr['occupation'];
  207.         $this->text_template    = 'До окончания стодневки осталось {$remains}';
  208.         $this->other_occupation = $arr['other_occupation'];
  209.         $this->marathon_start   = $arr['start_date'];
  210.         $this->record_created   = date('Y-m-d');
  211.     }
  212.  
  213.     public function getError()
  214.     {
  215.         echo $this->dbconn->Error();
  216.         $this->dbconn->Kill();
  217.     }
  218.  
  219.     public function saveMarathon()
  220.     {
  221.         $row = array();
  222.         foreach ($this as $prop_key => $prop_val)
  223.         {
  224.             if (!is_object($prop_val) && !is_array($prop_val))
  225.             {
  226.                 $row[$prop_key] = $prop_val;
  227.             }
  228.         }
  229.  
  230.         $id = isset($row['id']) && !empty($row['id']) ? $row['id'] : 0;
  231.         if (!empty($id) && is_numeric($id))
  232.         {
  233.             foreach ($row as $key => &$value)
  234.             {
  235.                 $row[$key] = MySQL::SQLValue($value);
  236.             }
  237.             //unset($row['id']);
  238.             $this->dbconn->UpdateRows('settings', $row, array('id' => $id));
  239.         }
  240.         else
  241.         {
  242.             foreach ($row as $key => &$value)
  243.             {
  244.                 $row[$key] = MySQL::SQLValue($value);
  245.             }
  246.             $id = $this->dbconn->InsertRow('settings', $row);
  247.         }
  248.         return $id;
  249.     }
  250.  
  251. }
  252.  
  253. class Marathons
  254. {
  255.  
  256.     private $dbconn;
  257.  
  258.     public function __construct()
  259.     {
  260.         $this->dbconn = new MySQL(true, LINES_DB_NAME, null, LINES_DB_USER, LINES_DB_PASS, 'UTF8');
  261.     }
  262.  
  263.     public function getMarathons()
  264.     {
  265.         $sql_get_marathons = 'SELECT * FROM settings ORDER BY id';
  266.         $rows              = $this->dbconn->Query($sql_get_marathons);
  267.         return $rows;
  268.     }
  269.  
  270. }
  271.  
  272. class HelperFunctions
  273. {
  274.  
  275.     function listFiles($dir)
  276.     {
  277.         $dir      = "/tmp";
  278.         $dh       = opendir($dir);
  279.         $files    = array();
  280.         while (false !== ($filename = readdir($dh)))
  281.         {
  282.             if (preg_match('#^.*?\.jpg$#'))
  283.             {
  284.                 $files[] = $filename;
  285.             }
  286.         }
  287.         return $files;
  288.     }
  289.  
  290. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement