Լրացուցիչ Բլոկների Տեսակներ (EBT) - Դասավորության Կառուցողի նոր փորձառություն❗

Լրացուցիչ Բլոկների Տեսակներ (EBT) - ձևավորված, կարգավորելի բլոկների տեսակներ՝ սլայդշոուներ, ներդիրներ, քարտեր, բացվող ցանկեր և շատ ուրիշներ։ Ներառված կարգավորումներ՝ ֆոնի, DOM տուփի, JavaScript փլագինների համար։ Փորձեք դասավորությունների կառուցման ապագան արդեն այսօր։

EBT մոդուլների ցուցադրական տարբերակներ Ներբեռնել EBT մոդուլները

❗Լրացուցիչ Պարբերությունների Տեսակներ (EPT) - Պարբերությունների նոր փորձառություն

Լրացուցիչ պարբերության տեսակներ (EPT) - անալոգիական պարբերության վրա հիմնված մոդուլների հավաքակազմ։

EPT մոդուլների ցուցադրական տարբերակներ Ներբեռնել EPT մոդուլները

Scroll

PHP դասեր - դաս 4 - Աշխատանք պատկերների հետ, GD2 գրադարան

10/05/2025, by Ivan

Նախորդ դասերում մենք սովորեցինք ինչպես գրել հարցումներ դեպի տվյալների բազա, ուստի հիմա մենք ավելի քիչ ուշադրություն կդարձնենք դրանց գրելու ձևին և պարզապես կվարժվենք գրելու։ Կհամադրենք հարցումների գրումը PHP-ի այլ հնարավորությունների ուսումնասիրության հետ։ Սկսենք պատկերների մշակման հնարավորություններից։ Նախորդ դասերից մեկում մենք արդեն վերբեռնում էինք ֆայլեր, և ունենք Files անունով աղյուսակ վերբեռնված ֆայլերի համար։ Եկեք պատկերներն էլ վերբեռնենք այդ նույն աղյուսակում։ Բայց մինչ այդ անհրաժեշտ է ստեղծման ձևում ավելացնել դաշտ՝ նկար վերբեռնելու համար։

$content .=	  '<label for="bodytext">Հաղորդագրություն:</label><br />';
$content .=	  '<textarea name="bodytext" id="bodytext"></textarea><br />';
$content .=   '<label for="bodytext">Կցել ֆայլ:</label><br /><input type="file" name="filename"><br />'; // ֆայլի բեռնում
$content .=   '<label for="bodytext">Կցել պատկեր:</label><br /><input type="file" name="image">'; // պատկերի բեռնում

Այժմ անհրաժեշտ է գրել ֆայլերի մշակումը։ Բայց նախ ավելացնենք մեկ սյուն Messages աղյուսակում՝ որտեղ կգրանցենք պատկերի fid-ը։ Իսկ պատկերի տվյալները կգրանցենք Files աղյուսակում՝ ինչպես մյուս ֆայլերի դեպքում։ Սյունը կոչվում է image_fid՝ INT(11), default=NULL։ Այժմ ավելացնենք ձևի մշակումը write() մեթոդում․

if($_FILES["image"]["size"] > 1024*3*1024){
  echo ("Ֆայլը գերազանցում է 3 մեգաբայթը");
  exit;
}
if(is_uploaded_file($_FILES["image"]["tmp_name"])){    // ստուգում ենք արդյոք ֆայլը վերբեռնվել է
  move_uploaded_file($_FILES["image"]["tmp_name"], "./files/".$_FILES["filename"]["name"]);
} else {
  echo("Ֆայլի բեռնումը ձախողվեց");
}

$sql = 'INSERT INTO Files (filename, filepath, filemime, filesize, timestamp) 
VALUES ("'. $_FILES['image']['name'] . '", 
 "files/' . $_FILES['image']['name'] . '",
 "'. $_FILES['image']['type'] .'",
 '. $_FILES['image']['size'] .',
 '. time() . ')';  

mysql_query($sql);

Այս մշակումը չի տարբերվում սովորական ֆայլի վերբեռնումից։ Հաջորդ դասերից մեկում կքննարկենք՝ ինչպես ստուգել՝ որ ֆայլի տեսակն է վերբեռնվում, որպեսզի pdf-ի նման ֆայլեր չանցնեն որպես պատկեր։

Մշակումը գրվեց, հիմա կվերբեռնվեն երկու ֆայլ՝ որոնցից մեկը պատկեր է։ Ահա ինչպիսին է $_POST և $_FILES զանգվածները print_r()-ով տպելուց հետո՝

Array ( 
  [title] => test 
  [bodytext] => asdfasf 
) 
Array (
  [filename] => Array ( 
    [name] => ip.txt 
    [type] => text/plain 
    [tmp_name] => Y:\tmp\php2C5.tmp 
    [error] => 0 [size] => 13 
  ) 
  [image] => Array (
    [name] => Coat_of_arms_of_Vladimiri_Oblast.png 
    [type] => image/png 
    [tmp_name] => Y:\tmp\php2C6.tmp 
    [error] => 0 [size] => 393743 
  ) 
)

Անհրաժեշտ է նաև փոխել հաղորդագրության գրանցման հարցումը՝

$sql = 'INSERT INTO Messages (title, bodytext, created, fid, image_fid) VALUES ("'. $p["title"] . '", "' . $p["bodytext"] . '", ' . time() . ',LAST_INSERT_ID()-1, LAST_INSERT_ID())';

Հետևաբար ֆայլի և պատկերի fid-ն իմանալու համար օգտագործվում է LAST_INSERT_ID(), քանի որ նախ գրվում է ֆայլը, ապա՝ պատկերը, մենք օգտագործում ենք -1 նախորդի համար։ Հիմա երբ պատկերը գրանցվում է բազայում, կարող ենք նաև այն ցույց տալ։ Պատկերների համար կստեղծենք simpleImage անունով դաս։ Ստեղծում ենք simpleImage.php ֆայլը class թղթապանակում և գրում ենք՝

<?php

class simpleCMS {

}

?>

Ստեղծեցինք դաս՝ պատկերի հետ աշխատելու համար։ Հիմա պետք է ավելացնել մեթոդներ դրա ներսում։ Նախ խոսենք դասի փոփոխականների մասին PHP-ում։

Դասի հատկությունները PHP 5-ում

PHP4-ում ամեն ինչ պարզ էր՝ var։ Բայց 5-րդ տարբերակում ավելացել է ավելի ճկուն մոտեցում։ Սկսենք public-ով՝ որը արդեն օգտագործել ենք։

Public

Public փոփոխականները հասանելի են դրսից։ Կարող ենք ուղղակիորեն վերագրել արժեք՝

<?php
  $obj = new simpleCMS(); 
  $obj->db = 'newDB';
?>

Protected

Protected-ը հասանելի է միայն տվյալ դասի կամ ժառանգված դասի ներսում։ Եթե փորձենք օգտվել դրսից՝ սխալ կստանանք։

simpleCMS.php
...
protected $db = 'testDB';
...

index.php
...
$obj = new simpleCMS(); 
$obj->db='newDB'; // սխալ
...

Հիմա ավելացնենք path փոփոխականը՝ որպես protected։ Դա կլինի պատկերի ճանապարհը։ Այն փոխանցելու ենք կոնստրուկտորի միջոցով։

Դասի կոնստրուկտոր

Կոնստրուկտորը օգտագործվում է՝ օբյեկտ ստեղծելիս սկզբնական արժեք տալու համար։ Այսպես՝

class simpleCMS {
  protected $path;
  
  public __construct($image){
    $this->path = $image;
  }
}

Երբ վերագրում ենք ճանապարհը՝ կարող ենք այդ արժեքը օգտագործել մեթոդներում։ Հիմա public_display մեթոդում ավելացնենք պատկերի ցուցադրություն։

if(!empty($row['image_fid'])){
  $sql = "SELECT * FROM Files WHERE fid=" . $row['image_fid'];
  $image_query = mysql_query($sql) or die(mysql_error());  
  $image = mysql_fetch_array($image_query);
  $content .= '<div class="image">';
    $image = new simpleImage($image['filepath']);
    $content .= $image->scale(100,100);
  $content .= '</div>';
  unset($image);
}

Այժմ ցուցադրում ենք պատկերի ճանապարհը։ Հաջորդիվ ավելացնենք մեթոդներ՝ պատկերները փոփոխելու չափսերով։ Օրինակ՝ scale և scale_and_crop ֆունկցիաները։

public function scale($width,$height){

}
public function scale_and_crop($width,$height){

}

Եկեք սկսենք `scale()` ֆունկցիայից, որը փոխում է պատկերի չափսերը՝ պահելով նրա համամասնությունները։

public function scale($width, $height){
    $path = $this->path;
    $filepath = explode('/', $this->path); // բաժանում ենք ճանապարհը
    $filename = end($filepath); // վերցնում ենք ֆայլի անունը
    $filename = substr($filename, 0, -4); // հանում ենք ընդլայնումը
    $filename = str_replace(' ', '_', $filename); // փոխարինում ենք բացատները
    $extenstion = substr($this->path, -4); // ստանում ենք ֆայլի ընդլայնումը

    // բեռնավորում ենք պատկերը ըստ ընդլայնման
    switch ($extenstion){
      case '.png':
        $srcImage = ImageCreateFromPNG($path);
        break;
      case '.jpg':
        $srcImage = ImageCreateFromJPEG($path);
        break;
      case '.gif':
        $srcImage = ImageCreateFromGIF($path);
        break;
      default:
        $srcImage = ImageCreateFromGIF($path);
        break;
    }

    // ի սկզբանե բարձրությունը և լայնությունը
    $srcWidth = ImageSX($srcImage);
    $srcHeight = ImageSY($srcImage);

    // հաշվարկում ենք չափսերի հարաբերությունը
    $ratioWidth = $srcWidth / $width;
    $ratioHeight = $srcHeight / $height;

    if ($ratioWidth  $ratioHeight){
        $destWidth = $srcWidth / $ratioHeight;
        $destHeight = $height;
    } else {
        $destWidth = $width;
        $destHeight = $srcHeight / $ratioWidth;
    }

    // ստեղծում ենք նոր պատկեր
    $destImage = imagecreate($destWidth, $destHeight);
    ImageCopyResized($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);

    // պահպանում ենք որպես JPEG
    imagejpeg($destImage, 'files/presets/'.$width.'_'.$height.'_'.$filename.'.jpg', 100);
    $newImagePath = 'files/presets/'.$width.'_'.$height.'_'.$filename.'.jpg';

    // մաքրում ենք հիշողությունը
    ImageDestroy($srcImage);
    ImageDestroy($destImage);

    return '<img src="'.$newImagePath.'" width="'.$destWidth.'" height="'.$destHeight.'" />';
}

Այժմ գրենք `scale_and_crop()` ֆունկցիան՝ պատկերները մասշտաբավորելու և կենտրոնով կտրելու համար։ Այս մեթոդը տարբերվում է նրանով, որ վերջնական պատկերը միշտ կունենա ստույգ լայնություն և բարձրություն։

public function scale_and_crop($width, $height){
    $path = $this->path;
    $filepath = explode('/', $this->path);
    $filename = end($filepath);
    $filename = substr($filename, 0, -4);
    $filename = str_replace(' ', '_', $filename);
    $extenstion = substr($this->path, -4);

    switch ($extenstion){
      case '.png':
        $srcImage = ImageCreateFromPNG($path);
        break;
      case '.jpg':
        $srcImage = ImageCreateFromJPEG($path);
        break;
      case '.gif':
        $srcImage = ImageCreateFromGIF($path);
        break;
      default:
        $srcImage = ImageCreateFromGIF($path);
        break;
    }

    $srcWidth = ImageSX($srcImage);
    $srcHeight = ImageSY($srcImage);

    $ratioSource = $srcWidth / $srcHeight;
    $ratioNew = $width / $height;

    if ($ratioSource  $ratioNew){
        $newWidth = $srcWidth;
        $newHeight = $srcHeight / $ratioNew * $ratioSource;
    } else {
        $newWidth = $srcWidth / $ratioSource * $ratioNew;
        $newHeight = $srcHeight;
    }

    $destImage = imagecreate($width, $height);
    imagecopyresampled($destImage, $srcImage, 0, 0, 0, 0, $width, $height, $newWidth, $newHeight);

    imagejpeg($destImage, 'files/presets/'.$width.'_'.$height.'_'.$filename.'.jpg', 100);
    $newImagePath = 'files/presets/'.$width.'_'.$height.'_'.$filename.'.jpg';

    ImageDestroy($srcImage);
    ImageDestroy($destImage);

    return '<img src="'.$newImagePath.'" />';
}

Եվ վերջում `display_public()` մեթոդում մենք կփոխենք պատկերի ցուցադրման կանչը՝ օգտագործելով `scale_and_crop()`:

$content .= '<div class="image">';
  $image = new simpleImage($image['filepath']);
  $content .= $image->scale_and_crop(100,100);
$content .= '</div>';

Այս ձևով կցուցադրվեն կտրած ու քառակուսի պատկերներ՝ հարմարավետ նայում ցանկացած մոնիտորի վրա։

Նշենք, որ այդ պատկերները գեներացվում են "թռիչքի պահին", սակայն դա կարող է դանդաղեցնել համակարգը։ Իրականում շատ կայքերում պատկերները գեներացվում են մեկ անգամ և պահվում բազայում կամ ֆայլային համակարգում՝ հետագա արագ բեռնումի համար։

Այս դասընթացում մենք չենք անդրադառնա պատկերների ճանապարհների բազայում գրանցելուն, քանի որ մեր սեփական CMS-ի կառուցման մեջ կօգտագործենք Zend framework, իսկ այս PHP դասերն ուղղված են լեզվի հիմունքներին ծանոթանալուն։