Professional Documents
Culture Documents
PHP
PHP Extension Libraries
ﺗﺄﰐ PHPﻣﻊ ﺃﻛﺜﺮ ﻣﻦ 75ﻣﻠﺤﻘﺎﹰ ﺑﻨﻮﺍﺎ ﻛﻠﻐﺔ .ﺗﺴﻤﺢ ﻫﺬﻩ ﺍﳌﻠﺤﻘﺎﺕ ﻟﻠﻤﻄﻮﺭﻳﻦ ﲟﻌﺎﳉﺔ ﻣﻬـﺎﻡ
ﳐﺘﻠﻔﺔ ﻣﻦ ﻗﺒﻴﻞ ﺇﻧﺸﺎﺀ ﻣﻠﻔﺎﺕ ،PDFﻭﺍﻟﱪﳎﺔ ﺍﻟﻨﺼﻴﺔ ﻷﻓـﻼﻡ ،Flashﻭﺇﻧﺸـﺎﺀ ﺗﻄﺒﻴﻘـﺎﺕ WAP
www.raypub.com
raypubsales@gmail.com
25 : PHP Extension Lbraries 1084
ﺃﻭ ﻋﺮﺽ ﺻﻮﺭﺓ .ﺑﻜﻞ ﺍﻷﺣﻮﺍﻝ ،ﺗﺬﻛﺮ ﺩﺍﺋﻤﺎﹰ ﺃﻥ ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ PHPﺗﻮﻓﺮ ﻃﺮﻗـﺎﹰ ﺭﺍﺋﻌـﺔ
ﻟﺘﺤﻘﻴﻖ ﻣﻬﺎﻡ ﻗﺪ ﺗﻜﻮﻥ ﻣﺴﺘﺤﻠﻴﺔ ﻋﻨﺪ ﺍﺳﺘﺨﺪﺍﻡ PHPﲟﻔﺮﺩﻫﺎ.
Installation
ﻻ ﻳﺘﻄﻠﺐ ﺗﺜﺒﻴﺖ PDFlibﰲ ﻧﻈﻢ Windowsﺫﻟﻚ ﺍﳉﻬﺪ ﺍﻟﻜﺒﲑ ،ﺇﺫ ﻟﻴﺲ ﻋﻠﻴـﻚ ﺇﻻ ﺃﻥ ﺗﻨﺴـﺦ
ﺍﳌﻠﺤﻖ ﺍﻟﺪﻳﻨﺎﻣﻴﻜﻲ ) (php_pdf.dllﺇﱃ ﺍﻟﺪﻟﻴﻞ " "extensionsﻟﺪﻳﻚ )ﺇﺫﺍ ﱂ ﻳﻜﻦ ﻣﻮﺟـﻮﺩﺍﹰ ﻫﻨـﺎﻙ
ﺑﺎﻟﻔﻌﻞ( ،ﻭﻣﻦ ﰒ ﳚﺐ ﺃﻥ ﺗﻠﻐﻲ ﻋﻼﻣﺔ ﺍﻟﺘﻌﻠﻴﻖ ﻋﻦ extension = php_pdf.dllﰲ ﺍﳌﻠﻒ .php.ini
ﺃﻣﺎ ﺗﺜﺒﻴﺖ ﻫﺬﺍ ﺍﳌﻠﺤﻖ ﰲ ﻧﻈﻢ *nixﻓﻴﻨﺤﻮ ﻣﻨﺤﻰ ﺁﺧﺮ ﲤﺎﻣﺎﹰ .ﺗﻮﺟﺪ ﻃﺮﻳﻘﺘﺎﻥ ﳐﺘﻠﻔﺘﺎﻥ ﻹﺿﺎﻓﺔ ﺩﻋﻢ
PDFlibﺇﱃ ﻫﺬﻩ ﺍﻟﻨﻈﻢ :ﺇﻣﺎ ﺑﺎﺳﺘﺨﺪﺍﻡ ﻭﺣﺪﺍﺕ ﳕﻄﻴﺔ ﻗﺎﺑﻠﺔ ﻟﻠﺘﺤﻤﻴﻞ ،ﻛﻤﺎ ﰲ ،Windowsﺃﻭ ﺑﺒﻨﺎﺀ
PDFlibﺿﻤﻦ .PHPﻭﺗﻌﺘﱪ ﺍﻟﻄﺮﻳﻘﺔ ﺍﻷﺧﲑﺓ ﻫﺬﻩ ﺻﻌﺒﺔ ﺍﻟﺘﺤﻘﻴﻖ ،ﺫﻟﻚ ﺃﻥ ﻋﻠﻴﻚ ﺃﻥ ﺗﻌﻴﺪ ﺑﻨـﺎﺀ
PHPﻟﺪﻣﺞ ﺍﻟﺪﻋﻢ .ﺇﺫ ﻗﺒﻞ ﺗﺜﺒﻴﺖ ،PDFlibﺳﺘﺤﺘﺎﺝ ﺇﱃ ﺗﺜﺒﻴﺖ ﻛـﻞ ﻣـﻦ LibTIFFﻭ،LibJPEG
ﻭﺍﻟﻠﺬﺍﻥ ﲡﺪﳘﺎ ﻋﻠﻰ ﺍﳌﻮﻗﻌﲔ ،http://www.libtiff.orgﻭ ftp://ftp.uu.net/graphies/jpeg/ﻋﻠﻰ ﺍﻟﺘﺮﺗﻴﺐ.
PDF ﺗﻨﺤﺼﺮ ﺍﻟﻨﺴﺨﺔ ﺍﻟﺜﻨﺎﺋﻴﺔ ﺍﳌﻮﺯﻋﺔ ﻣﻦ PDFlibﺑﺎﻟﺘﺮﺧﻴﺺ ﺍﻟﺘﺠﺎﺭﻱ ﻓﻘﻂ .ﻓﺈﺫﺍ ﺃﺭﺩﺕ ﺍﺳﺘﺨﺪﺍﻡ
) Import Libraryﺗﻌﺮﻑ ﺃﻳﻀﺎﹰ ﺑﺎﻻﺧﺘﺼﺎﺭ ،(PDIﻓﻌﻠﻴﻚ ﺃﻥ ﺗﺴﺘﺨﺪﻡ ﺍﻹﺻﺪﺍﺭ ﺍﻟﺜﻨﺎﺋﻲ ﻣﻦ ،PDFlib
ﺫﻟﻚ ﺃﻥ PDIﻏﲑ ﻣﺘﺎﺡ ﻋﻠﻰ ﺷﻜﻞ ﻣﺼﺪﺭ.
ﻟﺘﺜﺒﻴﺖ PDFlibﻛﻮﺣﺪﺓ ﳕﻄﻴﺔ ﻗﺎﺑﻠﺔ ﻟﻠﺘﺤﻤﻴﻞ ،ﻭﻫﻲ ﺍﻟﻄﺮﻳﻘﺔ ﺍﳌﺴﺘﺤﺴﻨﺔ ﻟﺘﺜﺒﻴـﺖ PDFlibﻋﻠـﻰ
ﻧﻈﺎﻣﻚ ،ﳚﺐ ﻋﻠﻴﻚ ﺃﻭﻻﹰ ﺍﻟﺘﺄﻛﺪ ﻣﻦ ﲢﻘﻖ ﺍﻟﺸﺮﻭﻁ ﺍﻟﺘﺎﻟﻴﺔ:
ﻻ ﳚﺐ ﺃﻥ ﻳﻜﻮﻥ ﺩﻋﻢ PDFlipﻣﺘﺮﲨﺎﹰ ﺑﺎﻟﻔﻌﻞ ﰲ .PHPﻭﳝﻜﻨﻚ ﺍﻟﺘﺄﻛﺪ ﻣﻦ ﺫﻟﻚ
www.raypub.com
raypubsales@gmail.com
1085 PHP : 25ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ
ﳚﺐ ﺃﻥ ﻳﺘﻢ ﻭﺿﻊ ﺍﻟﻮﺣﺪﺓ ﺍﻟﻨﻤﻄﻴﺔ ﰲ ﺍﻟﺪﻟﻴﻞ ﺍﶈﺪﺩ ﻛﺪﻟﻴﻞ ﻟﻠﻤﻠﺤﻘﺎﺕ ،ﻭﺫﻟﻚ ﰲ ﺍﳌﻠﻒ
.php.ini
ﳚﺐ ﺃﻥ ﻳﺘﻀﻤﻦ php.iniﻛﻼ ﻣﻦ ،safe_mode = Offﻭ.enable_dl = On
ﳚﺐ ﺃﻥ ﺗﻮﺍﻓﻖ ﺧﺼﺎﺋﺺ ﺇﺻﺪﺍﺭ PHPﺍﻟﺬﻱ ﻟﺪﻳﻚ ﺑﻨﺎﺀ ﻭﺣﺪﺓ ﳕﻄﻴﺔ ﻗﺎﺑﻠﺔ ﻟﻠﺘﺤﻤﻴﻞ ،ﺇﺫ ﳚﺐ
ﺃﻻﱠ ﺗﻜﻮﻥ ﺑﻨﻴﺘﻚ ﻧﺴﺨﺔ ﺗﺘﺒﻊ ﺃﺧﻄﺎﺀ ،ﻭﳚﺐ ﺃﻥ ﺗﻜﻮﻥ ﺁﻣﻨﺔ ﲡﺎﻩ ﺍﳌﺴﻠﻚ ) .(threadﻭﺇﺫﺍ
ﺣﺼﻠﺖ ﻋﻠﻰ ﺧﻄﺄ ،ﻓﻘﺪ ﲤﻴﻞ ﺇﱃ ﺍﻟﺘﺤﻘﻖ ﻣﻦ ﺍﻟﺪﻟﻴﻞ ،<pdflib-directory>/bind/php/ﻭﺍﻟﺬﻱ
ﻗﺪ ﳛﻮﻱ ﻭﺣﺪﺓ ﳕﻄﻴﺔ ﳝﻜﻦ ﳍﺎ ﺃﻥ ﺗﻌﻤﻞ ﻣﻊ ﺑﻨﻴﺘﻚ ﺍﳋﺎﺻﺔ ﻣﻦ .PHP
ﺇﺫﺍ ﻛﻨﺖ ﻗﺪ ﺗﺮﲨﺖ PDFlibﺑﺎﻟﻔﻌﻞ ﰲ ،PHPﻭﻛﻨﺖ ﺗﺘﺴﺎﺀﻝ ﱂ ﻋﻠﻴﻚ ﺍﺳﺘﺨﺪﺍﻡ ﻭﺣﺪﺓ ﳕﻄﻴـﺔ
ﺛﻨﺎﺋﻴﺔ ﻣﺴﺒﻘﺔ ﺍﻟﺒﻨﺎﺀ ،ﻓﺬﻟﻚ ﺃﺎ ﲢﻮﻱ ﺍﻟﺪﻋﻢ ،PDIﻭﺍﻟﺬﻱ ﻻ ﻳﺘﻮﻓﺮ ﻋﻠﻰ ﺷﻜﻞ ﻣﺼﺪﺭ ﻛﻤﺎ ﺳـﺒﻖ
ﻭﺃﺷﺮﻧﺎ .ﺗﺘﻮﻓﺮ ﺣﺎﻟﻴﺎﹰ ﻭﺣﺪﺍﺕ ﳕﻄﻴﺔ ﻣﻦ ﺃﺟﻞ ،PHP4.0.5 ،PHP4.0.4p11ﻭ ،PHP4.0.6ﻭﻟﻜﻞ ﻣـﻦ
ﻧﻈﻢ UNIXﻭ.Windows
ﺑﻌﺪ ﺃﻥ ﻳﺘﻢ ﻧﺴﺦ ﺍﳌﻠﺤﻖ ﺇﱃ ﺍﻟﺪﻟﻴﻞ ﺍﶈﺪﺩ ﰲ ،php.iniﻳﺘﻮﺟﺐ ﻋﻠﻴﻚ ﲢﻤﻴﻠﻪ ﺑﺎﺳـﺘﺨﺪﺍﻡ
extension = php_pdf.dllﺃﻭ .extension = libpdf_php.soﺃﻣﺎ ﺇﺫﺍ ﱂ ﺗﺮﻏﺐ ﺑﺈﺿﺎﻓﺔ ﻫﺬﺍ ﺍﻟﺴـﻄﺮ
ﺇﱃ ﺍﳌﻠﻒ php.iniﺍﻟﺬﻱ ﻟﺪﻳﻚ ،ﻓﻴﻤﻜﻨﻚ ﺗﻀﻤﲔ ﺩﻋﻢ PDFlibﻋﻠـﻰ ﺷـﻜﻞ ﻣﻠﻔـﺎﺕ ﻓﺮﺩﻳـﺔ
ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﺎﺑﻊ )"> .dl ("<pdflib_moduleﻭﺑﺎﺳﺘﺨﺪﺍﻡ ﻫﺬﺍ ﺍﻟﺘﺎﺑﻊ ،ﳝﻜﻨﻚ ﺍﻻﺳـﺘﻔﺎﺩﺓ ﺑﺸـﻜﻞ
ﻛﺎﻣﻞ ﻋﻨﺪﻣﺎ ﺗﻌﻤﻞ PHPﻛﻌﻤﻠﻴﺔ ) CGIﻭﻟﻴﺲ ﻛﻮﺣﺪﺓ ﳕﻄﻴﺔ( .ﻛﻤﺎ ﻭﻳﺴﻤﺢ ﻟﻚ ﺫﻟﻚ ﺑﺘﺤﻤﻴـﻞ
ﺍﳌﻠﺤﻖ ﻋﻨﺪ ﺍﳊﺎﺟﺔ ﻓﻘﻂ ،ﻭﻟﻴﺲ ﰲ ﻛﻞ ﻋﻤﻠﻴﺔ ﺟﺪﻳﺪﺓ ﺗﺆﺩﻱ ﺇﱃ ﺑﺪﺀ ﺗﺸﻐﻴﻞ .PHP
ﻳﺘﻄﻠﺐ ﺑﻨﺎﺀ ﺩﻋﻢ PHPFlibﺍﺗﺒﺎﻉ ﺍﳋﻄﻮﺍﺕ ﺍﻟﺘﺎﻟﻴﺔ:
ﻓﺮﺩ ﻧﺴﺨﺔ ) PDFlibﺍﳌﺼﺪﺭ ﺃﻭ ﺍﻟﺜﻨﺎﺋﻴﺔ( ﺇﱃ ﺍﻟﺪﻟﻴﻞ > ،<Pdflib_directoryﻭﻣﻦ ﰒ ﺗﺸﻐﻴﻞ
ﻋﻨﺪ ﺇﻋﺎﺩﺓ ﺑﻨﺎﺀ PHPﻣﻊ ﺍﳌﻠﺤﻖ PDFlibﻣﺼﺪﺭﻱ ﺍﻟﺸﻜﻞ ،ﻗﻢ ﺑﺘﻜﻮﻳﻦ PHPﻣﻊ
www.raypub.com
raypubsales@gmail.com
25 : PHP Extension Lbraries 1086
Using PDFlib
PDFlib
ﺗﺸﺮﺡ ﺗﻮﺍﺑﻊ PDFlibﻧﻔﺴﻬﺎ ﺑﻨﻔﺴﻬﺎ ،ﻭﻣﻌﻈﻤﻬﺎ ﺳﻬﻞ ﺍﻻﺳﺘﺨﺪﺍﻡ ﻋﻤﻮﻣﺎﹰ .ﻟﻴﺲ ﻫﻨﺎﻙ ﺇﻻ ﺷـﻲﺀ
ﻭﺍﺣﺪ ﺻﻌﺐ ﰲ ،PDFlibﻭﻳﺘﻌﻠﻖ ﲝﻘﻴﻘﺔ ﺃﻥ ﲢﺮﻳﺮ ﻣﺴﺘﻨﺪ ﺑﺸﻜﻞ ﻧﺼﻲ ) (scriptﻳﺄﺧﺬ ﻭﻗﺘﺎﹰ ﺃﻃﻮﻝ
ﻣﻦ ﻛﺘﺎﺑﺘﻪ ،ﻭﻫﺬﺍ ﻣﺎ ﳚﻌﻞ ﻣﻦ ﺍﻹﻧﺸﺎﺀ ﺍﻟﻔﻌﻠﻲ ﳌﺴﺘﻨﺪ PDFﻣﻬﻤﺔ ﺻﻌﺒﺔ ﻧﻮﻋﺎﹰ ﻣﺎ.
ﻟﻨﻔﺮﺽ ﺃﻧﻨﺎ ﺍﻧﺘﻬﻴﻨﺎ ﻣﻦ ﺑﻨﺎﺀ PDFlibﰲ ) PHPﺃﻭ ﺗﻀﻤﻴﻨﻬﺎ ﰲ ﺍﳌﻠﻒ ،(php.iniﳝﻜﻨﻨﺎ ﺇﺫﻥ ﺇﻧﺸـﺎﺀ
ﻣﻠﻒ PDFﺑﺴﻴﻂ ﺑﺎﺳﺘﺨﺪﺍﻡ ،PHPﻭﺍﻟﺬﻱ ﳛﻮﻱ ﻣﻌﻠﻮﻣﺎﺕ ﺑﺴﻴﻄﺔ .ﻗﺪ ﻳﺒﺪﻭ ﺫﻟﻚ ﻛـﺜﲑﺍﹰ ﻋﻠـﻰ
ﳎﺮﺩ ﺇﻧﺸﺎﺀ ﻣﻠﻒ PDFﻳﺘﻀﻤﻦ ﺍﻟﻌﺒﺎﺭﺓ "! ."Sample text in Arial Fontﳊﺴﻦ ﺍﳊﻆ ،ﺗﺸﻜﻞ ﻣﻌﻈﻢ
ﺍﻷﻭﺍﻣﺮ ﺍﻟﺘﺎﱄ ﺟﺰﺀﺍﹰ ﻣﻦ ﻗﺎﻟﺐ ﻳﺴﺮﻱ ﻋﻠﻰ ﺃﻱ ﻣﺴﺘﻨﺪ PDFﺗﺮﻳﺪ ﺇﻧﺸﺎﺅﻩ.
ﺳﻮﻑ ﻳﻈﻬﺮ ﻫﺬﺍ ﺍﻟﻨﺺ ﰲ ﺃﻋﻠﻰ ﺃﻱ ﻣﺴﺘﻨﺪ PDFﻳﻮﻟﺪ ﺍﻋﺘﺒﺎﺭﺍﹰ ﻣﻦ :PHP
<?php
//pdfdemo.php
;)($pdfFile = pdf_new
;)"" PDF_open_file($pdfFile,
ﻧﻘﻮﻡ ﻫﻨﺎ ﺑﺈﻋﺪﺍﺩ ﻣﻌﻠﻮﻣﺎﺕ ﻣﺴﺘﻨﺪ PDFﻗﻴﺎﺳﻲ ﺗﺘﻌﻠﻖ ﺑﻜﻴﻔﻴﺔ ﺇﻧﺸﺎﺀ ﻫﺬﺍ ﺍﳌﺴﺘﻨﺪ ،ﻭﻣﺎ ﻫﻮ ﺍﻟﻐﺮﺽ
ﻣﻨﻪ:
pdf_set_info($pdfFile, ;)""Author", "Devon O'Dell
pdf_set_info($pdfFile, ;)""Creator", "Devon O'Dell
pdf_set_info($pdfFile, ;)""Title", "PDFlib Demonstration
pdf_set_info($pdfFile, ;)""Subject", "Demonstrating the PDFlib
ﻳﺒﺘﺪﺉ ﻫﺬﺍ ﺍﻟﺴﻄﺮ ﺻﻔﺤﺔ ﺟﺪﻳﺪﺓ .ﻭﻗﺪ ﲤﻴﻞ ﺃﻳﻀﹰﺎ ﺇﱃ ﺍﺳﺘﺨﺪﺍﻡ 595ﻭ 842ﻛﻌـﺮﺽ ﻭﺍﺭﺗﻔـﺎﻉ
ﳌﺴﺘﻨﺪﻙ ،ﻭﺫﻟﻚ ﰲ ﻛﻞ ﻣﺮﺓ ﺗﻘﻮﻡ ﻓﻴﻬﺎ ﺑﺈﻧﺸﺎﺀ ﻣﺴﺘﻨﺪ ﺟﺪﻳﺪ ،ﺫﻟﻚ ﺃﻥ ﻫﺎﺗﲔ ﺍﻟﻘﻴﻤﺘﲔ ﲤـﺜﻼﻥ
ﺍﻟﺒﻌﺪﻳﻦ ﺍﻟﻘﻴﺎﺳﻴﲔ ﻟﻠﺼﻔﺤﺔ:
;)pdf_begin_page($pdfFile, 595, 842
ﻳﻀﻴﻒ ﻫﺬﺍ ﺍﻟﺘﺎﺑﻊ ﺇﺷﺎﺭﺓ ﻣﺮﺟﻌﻴﺔ ) (bookmarkﻟﻠﺼﻔﺤﺔ ﺍﻟﺘﺎﻟﻴﺔ ،ﻭﻫﺬﺍ ﻣﻔﻴﺪ ﺟﺪﺍﹰ ﺇﺫﺍ ﻣﺎ ﻛﺎﻧـﺖ
ﻟﺪﻳﻨﺎ ﻋﺪﺓ ﻣﻘﺎﻃﻊ ﰲ ﻣﺴﺘﻨﺪﻧﺎ ﲝﻴﺚ ﺃﻧﻨﺎ ﳓﺘﺎﺝ ﻟﻠﺘﺠﻮﻝ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺟﺪﻭﻝ ﳏﺘﻮﻳﺎﺕ ) .(TOCﻋﻨـﺪ
ﺍﺳﺘﺨﺪﺍﻡ ﻫﺬﺍ ﺍﻟﺘﺎﺑﻊ ،ﺳﻮﻑ ﻳﻘﻮﻡ ﻗﺎﺭﺉ PDFﺗﻠﻘﺎﺋﻴﺎﹰ ﺑﺈﻧﺸﺎﺀ TOCﻋﻠﻰ ﺍﳉﻬﺔ ﺍﻟﻴﻤﲎ ﻣﻦ ﺍﻟﺸﺎﺷﺔ،
ﺍﻷﻣﺮ ﺍﻟﺬﻱ ﻣﻦ ﺷﺄﻧﻪ ﺃﻥ ﻳﺴﻤﺢ ﻟﻠﻤﺴﺘﺨﺪﻣﲔ ﺑﺎﻟﺘﺠﻮﻝ ﺑﲔ ﺻﻔﺤﺎﺕ ﺍﳌﺴﺘﻨﺪ ﺍﳌﺨﺘﻠﻔﺔ ﺑﺴـﺮﻋﺔ،
ﻭﺍﻋﺘﻤﺎﺩﺍﹰ ﻋﻠﻰ ﺍﳌﻮﺍﺿﻴﻊ:
;)"pdf_add_bookmark($pdfFile, "Page 1
www.raypub.com
raypubsales@gmail.com
1087 PHP : 25ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ
ﻧﻘﻮﻡ ﺍﻵﻥ ﺑﺘﺤﺪﻳﺪ ﺍﳋﻂ ﺍﻟﺬﻱ ﺳﻨﺴﺘﺨﺪﻣﻪ ﻭﻫﻮ Arialﰲ ﺣﺎﻟﺘﻨﺎ ،ﻣﻊ ﻧﻮﻉ ﺍﻟﺘﺮﻣﻴـﺰ "،"winansi
ﺇﺿﺎﻓﺔ ﺇﱃ ﺇﻋﺪﺍﺩ ﺍﻟﻌﻠﻢ ) (flagﻋﻠﻰ ﺍﻟﻘﻴﻤﺔ 1ﰲ ﺍﻟﻨﻬﺎﻳﺔ ،ﻭﺫﻟﻚ ﻟﻺﺷﺎﺭﺓ ﺇﱃ ﺃﻧﻨﺎ ﻧﺮﻳﺪ ﺩﻣـﺞ ﻫـﺬﺍ
ﺍﳋﻂ ﰲ ﻣﺴﺘﻨﺪ .PDFﺇﺫﺍ ﱂ ﻧﺘﻤﻜﻦ ﻣﻦ ﺍﻟﻌﺜﻮﺭ ﻋﻠﻰ ﺍﳋﻂ ﰲ ﺍﻟﻨﻈﺎﻡ ،ﻧﻘﻮﻡ ﺑﺒﺴﺎﻃﺔ ﺑﺈﺧﺮﺍﺝ ﺭﺳﺎﻟﺔ
ﺧﻄﺄ ،ﻭﺇﺟﺮﺍﺀ ﻣﺮﺍﺣﻞ ﺍﻟﺘﻨﻈﻴﻒ ﻭﺍﳋﺮﻭﺝ )ﻻ ﻧﺮﻳﺪ ﺃﻥ ﻧﻘﺪﻡ ﻟﻠﻤﺴﺘﺨﺪﻡ ﻣﺴﺘﻨﺪ PDFﻓﺎﺭﻏﺎﹰ(:
{ ))if ($font = pdf_findfont($pdfFile, "Arial", "winansi", 1
;)PDF_setfont($pdfFile, $font, 12
{ } else
;)"echo("Font Not Found.
;)pdf_end_page($pdfFile
;)pdf_close($pdfFile
;)pdf_delete($pdfFile
;exit
}
50,780 ﺃﻣﺎ ﺍﻟﻘﺴﻢ ﺍﻟﻐﲏ ﺍﳊﻘﻴﻘﻲ ﳍﺬﻩ ﺍﻟﺼﻔﺤﺔ ﻓﻴﻌﺮﻑ ﻫﻨﺎ .ﻧﺮﻳﺪ ﺍﻟﺒﺪﺀ ﺑﺎﻟﻜﺘﺎﺑﺔ ﺍﻋﺘﺒﺎﺭﹰﺍ ﻣﻦ ﺍﻟﻨﻘﻄﺔ
ﰲ ﻫﺬﻩ ﺍﻟﺼﻔﺤﺔ ،ﻭﺫﻟﻚ ﻟﻨﺴﻤﺢ ﺑﻮﺿﻊ ﻫﺎﻣﺶ ﺑﲔ ﻳﺴﺎﺭ ﻭﺃﻋﻠﻰ ﻣﺴﺘﻨﺪ :PDF
;)pdf_show_xy($pdfFile, "Sample Text in Arial Font", 50, 780
ﻧﺸﲑ ﻫﻨﺎ ﺇﱃ ﺃﻧﻨﺎ ﻭﺻﻠﻨﺎ ﺇﱃ ﺎﻳﺔ ﺍﻟﺼﻔﺤﺔ ،ﻭﻧﻘﻮﻡ ﺑﻌﺪ ﺫﻟﻚ ﺑﺘﺤﺮﻳﺮ ﺍﳌﻮﺍﺭﺩ ﺍﳌﺘﻌﻠﻘﺔ ﲟﺴﺘﻨﺪﻧﺎ ﺑﻐﻴﺔ
ﺍﺳﺘﻌﺎﺩﺓ ﺑﻌﺾ ﺍﻟﺬﺍﻛﺮﺓ .ﻳﺘﻢ ﲢﺮﻳﺮ ﲨﻴﻊ ﻣﻮﺍﺭﺩ PDFﻋﻨﺪ ﺍﻧﺘﻬﺎﺀ ﺗﻨﻔﻴﺬ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﻨﺼﻲ:
;)pdf_end_page($pdfFile
;)pdf_close($pdfFile
ﻧﻘﻮﻡ ﺍﻵﻥ ﺑﺘﺨﺰﻳﻦ ﳏﺘﻮﻳﺎﺕ ﻣﺴﺘﻨﺪ PDFﰲ ﻣﺘﺤﻮﻝ ﻳﺪﻋﻰ ،$pdgﻛﻤﺎ ﻭﻧﻘﻮﻡ ﺑﺘﺨﺰﻳﻦ ﻃﻮﻟـﻪ ﰲ
ﺍﳌﺘﺤﻮﻝ .$pdflenﻣﻦ ﺍﻟﻀﺮﻭﺭﻱ ﺃﻥ ﻧﻘﻮﻡ ﺑﺘﺨﺰﻳﻦ ﻃﻮﻝ ﺍﳌﻠﻒ ،ﺫﻟﻚ ﺃﻧﻨـﺎ ﳓﺘـﺎﺝ ﺇﱃ ﺇﻋـﻼﻡ
ﺍﳌﺴﺘﻌﺮﺽ ﲝﺠﻢ ﺍﳌﺴﺘﻨﺪ ﺍﻟﻀﻤﲏ ﺍﻟﺬﻱ ﻧﻘﻮﻡ ﺑﺈﺭﺳﺎﻟﻪ ﻟﻪ:
;)$pdf = pdf_get_buffer($pdfFile
;)$pdfLen = strlen($pdf
ﳓﺘﺎﺝ ﻷﻥ ﳔﱪ ﺍﳌﺴﺘﻌﺮﺽ ﺑﺘﻮﻗﻊ ﻭﺻﻮﻝ ﻣﺴﺘﻨﺪ .PDFﻟﺬﺍ ،ﳓﺘﺎﺝ ﺇﱃ ﺇﺭﺳﺎﻝ ﺍﻟﺮﺅﻭﺱ ﺍﻟﺘﺎﻟﻴﺔ ﺇﻟﻴﻪ.
ﻟﻴﺲ ﺍﳊﻘﻞ filenameﰲ Content-Descriptionﲢﺼﻴﻞ ﺣﺎﺻﻞ ،ﺫﻟﻚ ﺃﻧﻪ ﻳﺮﺳﻞ ﺿـﻤﻨﻴﺎﹰ )(inline
www.raypub.com
raypubsales@gmail.com
25 : PHP Extension Lbraries 1088
ﳝﻜﻨﻨﺎ ﺍﻵﻥ ﺇﺧﺮﺍﺝ ﻣﻠﻒ PDFﺍﳌﺨﺰﻥ ﻣﺆﻗﺘﺎﹰ ﺑﺴﻬﻮﻟﺔ ﻋﻠﻰ ﺍﳌﺴﺘﻌﺮﺽ ،ﺫﻟﻚ ﺃﻧﻪ ﻳﻌﻠـﻢ ﺑـﺎﻗﺘﺮﺍﺏ
ﻭﺻﻮﻝ ﻣﻠﻒ :PDF
;)print($pdf
ﻧﻘﻮﻡ ﺍﻵﻥ ﲝﺬﻑ ﺍﻟﻜﺎﺋﻦ PDFﻭﲢﺮﻳﺮ ﲨﻴﻊ ﻣﻮﺍﺭﺩ ﺍﻟﻨﻈﺎﻡ ﺍﳌﺘﻌﻠﻘﺔ ﺑﻪ:
;)pdf_delete($pdfFile
>?
ﺗﺬﻛﺮ ﻋﻨﺪ ﺇﻧﺸﺎﺀ ﻣﺴﺘﻨﺪﺍﺕ PDFﺃﻥ ﻧﻈﺎﻡ ﺇﺣﺪﺍﺛﻴﺎﺕ ﻫﺬﺍ ﺍﳌﺴﺘﻨﺪ ﳛﻮﻡ ﺣﻮﻝ .Quadrant 1ﻧﻘﺼﺪ
ﺑﺬﻟﻚ ﺃﻥ ﺍﳌﺒﺪﺃ ) (0,0ﻣﺘﻮﺿﻊ ﰲ ﺍﻟﺰﺍﻭﻳﺔ ﺍﻟﻴﺴﺮﻯ ﺍﻟﺴﻔﻠﻰ ﻣﻦ ﺍﻟﺼﻔﺤﺔ .ﻭﻫﺬﺍ ﻋﻠﻰ ﺍﻷﻏﻠﺐ ﻋﻜﺲ
ﻣﺎ ﺗﺴﺘﺨﺪﻣﻪ ﻋﻨﺪ ﺍﻟﻌﻤﻞ ﻣﻊ ﺍﻟﺼﻮﺭﺓ ﺃﻭ ﺍﻟﱪﺍﻣﺞ ﺍﻟﱵ ﺗﺴﺘﺨﺪﻡ ﻧﻈﺎﻡ ﺍﻹﺣﺪﺍﺛﻴﺎﺕ .Quadrant 4
ﻣﺎ ﻫﻲ ﺃﻭﺟﻪ ﺃﳘﻴﺔ ﻫﺬﺍ ﺍﻟﻌﻤﻞ ﻭﻣﻼﺀﻣﺘﻪ ﳌﺎ ﲢﺘﺎﺝ ﺇﻟﻴﻪ ﺍﻟﺘﻄﺒﻴﻘﺎﺕ ﺍﻟﻔﻌﻠﻴﺔ؟ ﺇﻧﻪ ﻣﻔﻴﺪ ﺑﺎﻟﻔﻌﻞ ﺧﺎﺻﺔ
ﺇﺫﺍ ﻛﻨﺎ ﰲ ﺻﺪﺩ ﺇﻧﺸﺎﺀ ﻧﻈﺎﻡ ﺩﻟﻴﻞ ﺍﺳﺘﺨﺪﺍﻡ ﺣﻴﻮﻱ ﻣﺜﻼﹰ ،ﺍﻷﻣﺮ ﺍﻟﺬﻱ ﺳﻨﻤﻀﻲ ﺇﱃ ﻋﺮﺿﻪ ﻗﺮﻳﺒـﺎﹰ.
ﺳﻮﻑ ﻧﺴﺘﺨﺪﻡ PHPﻻﺳﺘﺮﺩﺍﺩ ﻣﻌﻠﻮﻣﺎﺕ ﻣﻦ ﻗﺎﻋﺪﺓ ﺑﻴﺎﻧﺎﺕ ،MySQLﻟﻨﺤﻤﻠﻬﺎ ﻣﻦ ﰒ ﰲ ﺩﻟﻴـﻞ
ﺍﻻﺳﺘﺨﺪﺍﻡ ).(manual
ﳓﺘﺎﺝ ﺃﻭﻻﹰ ﺇﱃ ﺇﻧﺸﺎﺀ ﻗﺎﻋﺪﺓ ﺑﻴﺎﻧﺎﺕ ﻟﺘﺨﺰﻳﻦ ﺇﺩﺧﺎﻻﺕ ﺩﻟﻴﻞ ﺍﻻﺳﺘﺨﺪﺍﻡ:
;CREATE DATABASE manual
;USE manual
ﺩﻋﻨﺎ ﺍﻵﻥ ﻧﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﺑﺮﻧﺎﻣﺞ ﻧﺼﻲ ﺑﺴﻴﻂ ،ﻭﺍﻟﺬﻱ ﳝﻜﻨﻨﺎ ﻣﻦ ﺧﻼﻟﻪ ﺇﺿﺎﻓﺔ ﺇﺩﺧﺎﻻﺕ ﺇﱃ ﻗﺎﻋﺪﺓ
ﺍﻟﺒﻴﺎﻧﺎﺕ:
<?php
//admin.php
{ )if (!$submit
>?
><html
><head><title>Admin.php</title></head
www.raypub.com
raypubsales@gmail.com
1089 PHP ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ: 25
<body>
<form action="<?php echo($PHP_SELF); ?>" method="POST">
Topic: <input type=text maxlength=100 name=topic><br>
Content:<br>
<textarea rows=80 cols=25 name=content></textarea><br>
<input type=submit name=submit>
</form>
</body>
</html>
<?php
} else {
if (@mysql("manual", "INSERT INTO entries (id, topic, content)
VALUES (NULL, '$topic', '$content')")) {
echo("Successfully added information into database");
} else {
echo("Error: " . mysql_error());
}
}
?>
PDF ﻭﻧﺒﺪﺃ ﻣـﻊ ﺗﻮﺍﺑـﻊ.( ﻣﻦ ﺧﻼﻝ ﺍﻟﺸﻴﻔﺮﺓ ﺍﻟﺘﺎﻟﻴﺔmanual) ﳝﻜﻨﻨﺎ ﺍﻵﻥ ﺇﻧﺸﺎﺀ ﺩﻟﻴﻞ ﺍﻻﺳﺘﺨﺪﺍﻡ
:ﺍﻟﺘﻘﻠﻴﺪﻳﺔ
<?php
//manual.php
www.raypub.com
raypubsales@gmail.com
25 : PHP Extension Lbraries 1090
pdf_end_page($pdfFile);
pdf_close($pdfFile);
pdf_delete($pdfFile);
exit;
}
:ﻧﻘﻮﻡ ﻫﻨﺎ ﺑﺈﺧﺮﺍﺝ ﺍﶈﺘﻮﻯ ﺍﻋﺘﺒﺎﺭﺍﹰ ﻣﻦ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻟﻴﺘﻮﺿﻊ ﰲ ﻧﻘﻄﺔ ﳏﺪﺩﺓ
pdf_show_xy($pdfFile, $entry['content'], 50, 780);
ﻭﺑﺬﻟﻚ ﻧﺴﺘﻄﻴﻊ ﺑﺪﺀ ﺻﻔﺤﺔ ﺟﺪﻳﺪﺓ ﻋﻨﺪﻣﺎ ﻧـﺪﺧﻞ ﺍﳊﻠﻘـﺔ،ﺳﻮﻑ ﻧﻨﻬﻲ ﺍﻟﺼﻔﺤﺔ ﺩﺍﺧﻞ ﺍﳊﻠﻘﺔ
:ﺩﺍﹰﳎﺪ
pdf_end_page($pdfFile);
}
www.raypub.com
raypubsales@gmail.com
1091 PHP : 25ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ
www.raypub.com
raypubsales@gmail.com
25 : PHP Extension Lbraries 1092
Using Ming
Ming
ﺳﻮﻑ ﻧﺘﻌﻠﻢ ﺍﻵﻥ ﻛﻴﻔﻴﺔ ﺑﻨﺎﺀ ﳕﺎﺫﺝ ﺣﺮﻛﻴﺔ ) (animationsﺑﺴﻴﻄﺔ ﰲ ،Flashﻭﺫﻟـﻚ ﺑﺎﺳـﺘﺨﺪﺍﻡ
ﺍﳌﻜﺘﺒﺔ .Mingﲢﺘﺎﺝ ﺍﻟﻜﺎﺋﻨﺎﺕ )ﺃﻭ ﺍﻷﺷﻜﺎﻝ( ﰲ Flashﺇﱃ ﻗﻄﻌﺔ ﺭﺳﻢ ﻗﻤﺎﺷﻴﺔ ) (canvasﻟﺘﻌﺮﺽ
ﻋﻠﻴﻬﺎ .ﺗﺪﻋﻮ Mingﻫﺬﻩ ﺍﻟﻘﻄﻌﺔ ﺑﺎﻻﺳﻢ ،SWFMovieﻭﺍﻟﱵ ﺗﺘﻤﺘﻊ ﺑﻌﺪﺓ ﺧﺼﺎﺋﺺ ﻋﺎﺩﺓ ﻣﺎ ﲤﻴﻞ ﺇﱃ
ﺇﻋﺪﺍﺩﻫﺎ ﻛﻠﻤﺎ ﺃﻧﺸﺄﺕ ﻓﻴﻠﻤﺎﹰ ﺟﺪﻳﺪﺍﹰ ،ﻭﻣﻨﻬﺎ :ﻟﻮﻥ ﺍﳋﻠﻔﻴﺔ ،ﻭﺃﺑﻌﺎﺩ ﺍﻟﻔﻴﻠﻢ ،ﻭﻣﻌﺪﻝ ﺍﻹﻃﺎﺭﺍﺕ ).(frame
ﻳﺘﻢ ﺍﺷﺘﻘﺎﻕ ﺍﻟﺼﻨﻒ SWFMovieﻛﻤﺎ ﻳﻠﻲ:
)($movie = new SWFMovie
ﻟﻨﻔﺮﺽ ﺃﻧﻨﺎ ﺃﻧﺸﺄﻧﺎ ﺍﻟﻔﻴﻠﻢ ﻛﻤﺘﺤﻮﻝ ،$movieﳝﻜﻨﻨﺎ ﺇﺫﻥ ﺗﻌﻴﲔ ﻟﻮﻥ ﺍﳋﻠﻔﻴﺔ ﻛﺎﻟﺘﺎﱄ:
;)$movie->setBackground(0, 0x44, 0x95
www.raypub.com
raypubsales@gmail.com
1093 PHP : 25ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ
ﻣﻦ ﺍﳌﻬﻢ ﺃﻥ ﺗﺘﺬﻛﺮ ﺃﻧﻚ ﺇﺫﺍ ﻣﺎ ﻋﻴﻨﺖ ﺃﺑﻌﺎﺩ ﻓﻴﻠﻤﻚ ﻋﻠﻰ ﺍﻟﻘﻴﻤﺔ ،640 × 480ﻭﺩﳎﺖ ﺍﻟﻔـﻴﻠﻢ ﰲ
HTMLﺑﺎﳊﺠﻢ ،320×240ﻓﺴﻴﺘﻢ ﺍﺧﺘﺰﺍﻝ ﺣﺠﻢ ﲨﻴﻊ ﻛﺎﺋﻨﺎﺗﻚ ﺇﱃ ﻧﺼـﻒ ﺍﳊﺠـﻢ ﺍﻟـﺬﻱ ﰎ
ﺇﻧﺸﺎﺅﻫﺎ ﻋﻠﻴﻪ )ﻭﻋﻠﻰ ﺍﻟﺮﻏﻢ ﻣﻦ ﺃﻥ ﺍﻟﻔﻦ ﺍﻟﺸﻌﺎﻋﻲ ﻳﻬﺪﻑ ﺇﱃ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﺃﻗﻞ ﺧﺴﺎﺭﺓ ﺟـﺮﺍﺀ
ﺗﻐﲑ ﺍﳊﺠﻢ ،ﺇﻻ ﺃﻧﻪ ﺗﻮﺟﺪ ﺣﺘﻤﺎﹰ ﺑﻌﺾ ﺍﳌﻨﺎﻃﻖ ﺫﺍﺕ ﺍﳉﻮﺩﺓ ﺍﳌﻨﺨﻔﻀﺔ(.
ﺗﺘﻢ ﺇﺿﺎﻓﺔ ﺍﻷﺷﻜﺎﻝ ﺇﱃ ﺍﻟﻔﻴﻠﻢ ﺑﺴﻬﻮﻟﺔ:
;)$movie->add($shape
ﻧﻈﺮﺍﹰ ﻷﻧﻪ ﻳﺘﻢ ﺇﻧﺸﺎﺀ ﺍﻷﺷﻜﺎﻝ ﻛﻤﺜﻴﻼﺕ )ﻛﻤﺎ ﺳﻨﺮﻯ ﰲ ﺍﳌﻘﻄﻊ ﺍﻟﺘﺎﱄ( ،ﻓﺄﻥ ﺇﻧﺸﺎﺀ ﻋﺪﺓ ﻣﺜﻴﻼﺕ
ﻋﻦ ﺍﻷﺷﻜﺎﻝ ﺑﺴﻴﻄﺎﹰ ﺃﻳﻀﺎﹰ ،ﻭﻳﺘﺤﻘﻖ ﺿﻤﻦ ﺣﻠﻘﺔ forﺃﻭ .whileﻋﻨﺪﻣﺎ ﺗﻜﻮﻥ ﺟﺎﻫﺰﺍﹰ ﳊﺬﻑ ﺷﻜﻞ
ﻣﻦ ﻟﻮﺣﺔ ﺍﻟﺮﺳﻢ ﺍﻟﻘﻤﺎﺷﻴﺔ ﺍﳋﺎﺻﺔ ﺑﺎﻟﻔﻴﻠﻢ ،ﳝﻜﻨﻚ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﺎﺑﻊ ) ( .removeﻭﻳﺘﻮﱃ ﻫﺬﺍ ﺍﻷﺧﲑ
ﺣﺬﻑ ﻣﺜﻴﻞ ) (instanceﺍﻟﺸﻜﻞ ﻓﻘﻂ ﻣﻦ ﺍﻟﻔﻴﻠﻢ ،ﺃﻣﺎ ﺍﻟﺸﻜﻞ ﻧﻔﺴﻪ ﻓﻼ ﳛﺬﻑ ﻣﻦ ﺍﻟﻔﻴﻠﻢ ،ﻭﳝﻜﻦ
ﺑﺎﻟﺘﺎﱄ ﺗﻌﻴﻴﻨﻪ ﳎﺪﺩﺍﹰ:
)$instance2 = $movie->add($shapeVaribale
ﺃﺧﲑﺍﹰ ،ﻧﺒﲔ ﻓﻴﻤﺎ ﻳﻠﻲ ﻛﻴﻔﻴﺔ ﺗﺼﺪﻳﺮ ﻓﻴﻠﻢ ﺇﱃ ﺍﳌﺴﺘﻌﺮﺽ .ﻻﺑﺪ ﻟﻨﺎ ﻣﻦ ﺗﻌﻴﲔ ﺭﺃﺱ ﳜﱪ ﺍﳌﺴـﺘﻌﺮﺽ
ﺑﻘﺪﻭﻡ ﻣﻠﻒ ،Shockwave Flashﻭﻣﻦ ﰒ ﻳﺘﻢ ﻋﺮﺽ ﺍﳌﻠﻒ .ﲡﻌﻞ Mingﻣﻦ ﻃﺮﻳﻘﺔ ﻋﺮﺽ ﺍﳌﻠـﻒ
ﻏﺎﻳﺔ ﰲ ﺍﻟﺒﺴﺎﻃﺔ:
;)"header("Content-type: application/x-shockwave-flash
;)($movie->output
Shapes
ﻳﻌﺘﱪ SWFShapeﺍﻟﻜﺎﺋﻦ ﺍﻷﺳﺎﺳﻲ ﰲ .Mingﻭﺣﻴﺚ ﺃﻥ Mingﻣﺼﻤﻤﺔ ﻟﻼﺳـﺘﺨﺪﺍﻡ ﻛـﺎﺋﲏ
ﺍﻟﺘﻮﺟﻪ ،ﻳﻌﺮﻑ ﻫﺬﺍ ﺍﻟﻜﺎﺋﻦ ﻛﻤﺎ ﻳﻠﻲ:
;)($shape = new SWFShape
www.raypub.com
raypubsales@gmail.com
25 : PHP Extension Lbraries 1094
ﺗﻌﺘﱪ " Mingﻣﺴﺘﻨﺪﺓ ﺇﱃ ﻗﻠﻢ ﺍﻟﺮﺳﻢ" ،ﺃﻱ ﺃﺎ ﲢﺘﻔﻆ ﲟﻮﻗﻊ ﲣﻴﻠﻲ ﳌﻜﺎﻥ ﺍﻟﺮﺳﻢ ،ﻭﺗﺘﻌﺎﻣﻞ ﺗﻮﺍﺑـﻊ
Mingﻣﻊ ﻗﻀﻴﺔ ﻣﺎ ﺇﺫﺍ ﻛﺎﻥ ﺍﻟﻘﻠﻢ ﻳﺮﺳﻢ .ﲟﻌﺮﻓﺘﻨﺎ ﳍﺬﻩ ﺍﻟﻨﻘﻄﺔ ،ﳝﻜﻨﻨـﺎ ﺍﺳـﺘﺨﺪﺍﻡ ﺗﻮﺍﺑـﻊ Ming
ﺍﻷﺳﺎﺳﻴﺔ .ﺗﻮﻟﺪ ﺍﻟﺸﻴﻔﺮﺓ ﻣﺮﺑﻌﺎﹰ ﺃﺧﻀﺮ ﺫﺍ ﺑﻌﺪ 100ﻭﺣﺪﺓ ﻗﻴﺎﺱ .ﺍﻧﺘﺒﻪ ﺇﱃ ﻋـﺪﺓ ﺃﺷـﻴﺎﺀ ﲣـﺺ
ﺍﻟﺸﻴﻔﺮﺓ :ﻻ ﻳﻮﺟﺪ ﺗﺎﺑﻊ " ،"squareﺃﻱ ﺃﻥ ﻋﻠﻴﻨﺎ ﲢﺪﻳﺪ ﲨﻴﻊ ﺭﺳﻮﻣﻨﺎ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﳋﻄﻮﻁ )ﻭﻫـﺬﺍ
ﺍﻷﻣﺮ ﻏﲑ ﺻﺤﻴﺢ ﰲ ﺣﺎﻟﺔ ﺇﻧﺸﺎﺀ ﺍﻟﻘﻄﻮﻉ ﺫﺍﺕ ﺍﶈﺮﻕ ﺃﻭ ﺍﶈﺮﻗﲔ( .ﻻﺣﻆ ﺃﻳﻀـﺎﹰ ﺃﻥ ﻋﻠﻴﻨـﺎ ﺃﻥ
ﻧﻌﺮﻑ ﲨﻴﻊ ﺃﻟﻮﺍﻧﻨﺎ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﻤﺜﻴﻞ ﺍﻟﺴﺘﺔ ﻋﺸﺮﻱ ﳍﺎ.
ﻧﺒﺪﺃ ﻋﻤﻠﻨﺎ ﺑﺈﻋﺪﺍﺩ ﺧﺼﺎﺋﺺ ﲨﻴﻊ ﺍﳋﻄﻮﻁ ﺍﻟﱵ ﺳﺘﺮﺳﻢ ﻻﺣﻘﺎﹰ ،ﻭﺫﻟﻚ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﺎﺑﻊ ) (،setLine
ﻭﺍﻟﱵ ﳝﻜﻦ ﺇﻋﺎﺩﺓ ﺇﻋﺪﺍﺩﻫﺎ ﰲ ﺃﻱ ﻭﻗﺖ ﻻﺣﻖ .ﻳﺘﻮﱃ ﺍﻟﻌﺪﺩ ﺍﻷﻭﻝ ﺗﻌﻴﲔ ﲰﺎﻛﺔ ﺍﻟﺴﻄﺮ ) 20ﻭﺣﺪﺓ
ﻗﻴﺎﺱ( .ﻻﺣﻆ ﺃﻥ ﺍﳊﺠﻮﻡ ﰲ Flashﻣﻮﺻﻔﺔ ﻧﺴﺒﺔ ﺇﱃ ﻭﺣﺪﺍﺕ ﻗﻴﺎﺱ ،ﺫﻟﻚ ﺃﻥ ﺍﻟﻌﺮﺽ ﻭﺍﻻﺭﺗﻔـﺎﻉ
ﻗﺪ ﻳﺘﻐﲑ ﺗﺒﻌﺎﹰ ﳊﺠﻢ ﺷﺎﺷﺔ ﺍﻟﺘﻘﺪﱘ ﰲ ﺍﳌﺴﺘﻌﺮﺽ.
ﻧﻘﻮﻡ ﺑﻌﺪﻫﺎ ﺑﺈﻋﺪﺍﺩ ﻗﻴﻢ ﺍﻷﻟﻮﺍﻥ :ﺍﻷﲪﺮ ،ﻭﺍﻷﺧﻀﺮ ،ﻭﺍﻷﺯﺭﻕ .ﺇﺫﺍ ﻛﺎﻥ ﻟﺪﻳﻚ ﺧﱪﺓ ﰲ ﺍﻟﺘﺼﻤﻴﻢ
ﺍﻟﺮﺳﻮﻣﻲ ﺃﻭ ﺗﺼﻤﻴﻢ ،HTMLﻓﻘﺪ ﺗﻜﻮﻥ ﻋﻠﻰ ﻣﻌﺮﻓﺔ ﺑﺎﺻﻄﻼﺣﺎﺕ ﺍﻷﻟﻮﺍﻥ ﺍﻟﺴﺖ ﻋﺸﺮﻳﺔ .ﻻﺣﻆ
ﺃﻥ ﺑﺈﻣﻜﺎﻥ ﺍﻟﺘﺎﺑﻊ ) ( setLineﺃﺧﺬ ﺑﺎﺭﺍﻣﺘﺮ ﺍﺧﺘﻴﺎﺭﻱ ﺃﻳﻀﺎﹰ ،alpha ،ﻭﺍﻟﺬﻱ ﻳﺘﺤﻜﻢ ﺑﺸﻔﺎﻓﻴﺔ ﺍﻟﻠﻮﻥ:
;)$shape->setLine(20, 0, 0xff, 0
ﻧﻘﻮﻡ ﺍﻵﻥ ﺑﺮﺳﻢ ﺧﻄﻮﻃﻨﺎ ﻛﻤﺎ ﻫﻲ ﳑﺜﻠﺔ ﺑﺎﻟﻨﻈﺎﻡ ﺍﻹﺣﺪﺍﺛﻲ .ﻳﻨﻄﻠﻖ ﺍﳋﻂ ﺍﻷﻭﻝ ﻣﻦ ﻧﻘﻄـﺔ ﻗﻠـﻢ
ﺍﻟﺮﺳﻢ ﺍﳊﺎﻟﻴﺔ ﺇﱃ ﺍﻟﻨﻘﻄﺔ .0.100ﻭﻣﻦ ﻫﻨﺎﻙ ،ﻳﺘﻢ ﺭﺳﻢ ﺧﻂ ﺇﱃ ﺍﻟﻨﻘﻄـﺔ ،100.100ﰒ ﺇﱃ ،100.0
ﻭﻧﺴﺘﻤﺮ ﺣﱴ ﻧﻨﻬﻲ ﺭﺳﻢ ﺍﳌﺮﺑﻊ .ﺃﺧﲑﺍﹰ ،ﻳﻀﺎﻑ ﺍﻟﺸﻜﻞ ﺇﱃ ﺍﻟﻜﺎﺋﻦ :SWFMovie
;)$shape->drawLineTo(0, 100
;)$shape->drawLineTo(100, 100
;)$shape->drawLineTo(100, 0
;)$shape->drawLineTo(0, 0
;)$movie->add($shape
ﻟﻨﻔﺮﺽ ﺑﺄﻧﻚ ﺗﺮﻳﺪ ﺭﺳﻢ ﺍﳌﺮﺑﻊ ﰲ ﻣﻜﺎﻥ ﺁﺧﺮ ﻋﻠﻰ ﺍﻟﺸﺎﺷﺔ ،ﳝﻜﻨﻚ ﻋﻨـﺪﻫﺎ ﺍﺳـﺘﺨﺪﺍﻡ ﺍﻟﺘـﺎﺑﻊ
) ،movePenTo (x,yﻭﺍﻟﺬﻱ ﻳﺄﺧﺬ ﻋﺪﺩﻳﻦ )ﺇﺣﺪﺍﺛﻴﺎ ﺍﻟﻨﻘﻄﺔ ﺍﻟﱵ ﺗﺮﻳﺪ ﻧﻘﻞ ﺍﻟﻘﻠﻢ ﺇﻟﻴﻬﺎ( .ﳝﻜﻨﻚ ﺍﺧﺘﻴﺎﺭﻳﺎﹰ
ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﺎﺑﻊ ﺍﻟﻨﺴﱯ ) ( ،drawLineﻭﺍﻟﺬﻱ ﻳﺴﻤﺢ ﻟﻚ ﺑﺮﺳﻢ ﺧﻂ ﺑﺎﻟﻨﺴﺒﺔ ﺇﱃ ﺍﳌﻮﻗﻊ ﺍﳊﺎﱄ ﻟﻠﻘﻠﻢ.
ﻭﻗﺪ ﺗﻜﻮﻥ ﻫﺬﻩ ﺍﻟﻄﺮﻳﻘﺔ ﻏﺎﻟﺒﺎﹰ ﺃﻛﺜﺮ ﻗﺎﺑﻠﻴﺔ ﻟﻠﻔﻬﻢ )ﻋﻠﻤﺎﹰ ﺑﺄﻧﻚ ﺗﺴﺘﻄﻴﻊ ﺍﺳﺘﺨﺪﺍﻡ ﻗﻴﻢ ﺳﺎﻟﺒﺔ( .ﳝﻜﻨﻨـﺎ
ﺭﺳﻢ ﺍﳌﺮﺑﻊ ﻧﻔﺴﻪ ﺑﺎﻟﻨﺴﺒﺔ ﺇﱃ ﺍﳌﻮﺿﻊ ﺍﳊﺎﱄ ﻟﻘﻠﻢ ﺍﻟﺮﺳﻢ ،ﻭﺫﻟﻚ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺸﻴﻔﺮﺓ ﺍﻟﺘﺎﻟﻴﺔ:
www.raypub.com
raypubsales@gmail.com
1095 PHP : 25ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ
;)$shape->movePenTo(100, 100
;)$shape->drawLine(0, -100
;)$shape->drawLine(-100, 0
;)$shape->drawLine(0, 100
;)$shape->drawline(100, 0
ﺗﻮﺟﺪ ﻃﺮﻳﻘﺘﺎﻥ ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻣﻬﻤﺎ ﻟﺮﺳﻢ ﻣﻨﺤﻨﻴﺎﺕ ) bezierﻋﺎﱂ ﺭﻳﺎﺿﻲ( .ﻭﺗﺘﻌﻠـﻖ ﺇﺣـﺪﺍﳘﺎ
ﺑﺎﻟﻨﻘﻄﺔ ﺍﳊﺎﻟﻴﺔ ،ﻓﻴﻤﺎ ﺗﺴﺘﺨﺪﻡ ﺍﻷﺧﺮﻯ ﺍﻟﻄﺮﻳﻘﺔ ﺍﻟﺘﺮﺑﻴﻌﻴﺔ ﺍﻟﱵ ﲢﺪﺩ ﻓﻴﻬـﺎ ﻧﻘﻄـﺔ ﺍﻟـﺘﺤﻜﻢ ،ﻭﳘـﺎ
) drawCurve (x,yﻭ) drawCurveTo (control_x, control_y, end_x, end_yﻋﻠﻰ ﺍﻟﺘﺮﺗﻴﺐ.
ﻳﻌﱪ ﻣﻨﺤﲏ bezierﻋﻦ ﻣﻨﺤﻦﹴ ﻳﺘﻢ ﺗﻮﻟﻴﺪﻩ ﺑﺈﺷﺮﺍﻑ ﺃﺭﺑﻊ ﻧﻘﺎﻁ ﺃﺧﺮﻯ .ﻭﺑﺒﺴﺎﻃﺔ ﻧﻘﻮﻝ ،ﳝﺜﻞ ﻣﻨﺤﲏ
bezierﻣﻨﺤﻨﻴﺎﹰ ﳝﺮ ﺑﺎﻟﻨﻘﺎﻁ ﺍﻷﺭﺑﻊ .ﻭﺗﺒﻌﺎﹰ ﳌﻮﻗﻊ ﻫﺬﻩ ﺍﻟﻨﻘﺎﻁ ،ﳝﻜﻨﻨﺎ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﻣﻨﺤﻦ ﳐﺘﻠـﻒ.
ﻳﻨﺘﺞ ﺍﳌﻨﺤﲏ ﻋﻦ ﺍﻟﻌﺪﻳﺪ )ﻗﺪ ﺗﻜﻮﻥ ﻻ ﺎﺋﻴﺔ( ﻣﻦ ﺍﳋﻄﻮﻁ ﺍﻟﺼﻐﲑﺓ ﺍﳌﺴﺘﻘﻴﻤﺔ ﺍﻟﱵ ﲢﺪﺩ ﺭﻳﺎﺿﻴﺎﹰ ﻣﻊ
ﺍﺣﺘﺮﺍﻡ ﻧﻘﺎﻁ ﺍﻟﺘﺤﻜﻢ.
ﺇﺿﺎﻓﺔ ﺇﱃ ﺫﻟﻚ ،ﺗﻮﻓﺮ Mingﺗﻮﺍﺑﻊ ﻟﺘﻌﺒﺌﺔ ﺍﻷﺷﻜﺎﻝ ،ﻭﺇﺿﺎﻓﺔ ﺃﻗﻨﻌﺔ ﻧﻘﻄﻴﺔ ﻭﺗﺪﺭﺟﺎﺕ ﺇﻟﻴﻬﺎ .ﻟﺴﻮﺀ ﺍﳊﻆ،
ﺗﻌﺘﱪ ﻃﺮﻳﻘﺔ ﲢﻘﻴﻖ ﺫﻟﻚ ﺻﻌﺒﺔ ﺍﻟﻔﻬﻢ ﻟﻠﻮﻫﻠﺔ ﺍﻷﻭﱃ .ﻭﻳﻌﻮﺩ ﺫﻟﻚ ﺇﱃ ﺃﻥ Shockwave Playerﻳﺮﺳـﻢ
ﺍﻷﺷﻜﺎﻝ ﲞﻄﻮﻁ ﻣﺴﺢ ،ﻭﳚﺐ ﺃﻥ ﻳﻌﻠﻢ ﻣﻦ ﺃﻱ ﺍﲡﺎﻩ ﺳﻴﺒﺪﺃ ﺑﺎﻟﺘﻌﺒﺌﺔ )ﲢﻘﻴﻘﺎﹰ ﻟﻠﻤﺮﺩﻭﺩ ﺍﻷﻓﻀـﻞ(.
ﻭﺑﺎﻟﺘﺎﱄ ،ﳚﺐ ﻋﻠﻴﻨﺎ ﺃﻥ ﳓﺪﺩ ﺍﲡﺎﻩ ﺍﻟﺘﻌﺒﺌﺔ ﻟﻠﻜﺎﺋﻦ ﺍﻟﺬﻱ ﻧﺮﻳﺪ ﺗﻌﺒﺌﺘﻪ ،ﻭﺫﻟﻚ ﺑﺎﺳـﺘﺨﺪﺍﻡ ﺍﻟﺘـﺎﺑﻌﲔ
) ،setRightFill (SWFObjectﻭ).setLeftFill (SWFObject
) (addFill ﺩﻋﻨﺎ ﳕﻀﻲ ﻗﺪﻣﺎﹰ ﻭﻧﻄﺒﻖ ﺍﻟﺘﻌﺒﺌﺔ ﻋﻠﻰ ﺍﳌﺮﺑﻊ ﺍﻟﺬﻱ ﺳﺒﻖ ﻭﺃﻥ ﻋﺮﻓﻨﺎﻩ .ﻻﺣﻆ ﻫﻨـﺎ ﺃﻥ ﺍﻟﺘـﺎﺑﻊ
ﳝﻜﻨﻪ ﺃﻥ ﻳﺄﺧﺬ ﺍﺧﺘﻴﺎﺭﻳﺎﹰ ﺍﻟﻮﺳﻴﻂ alpleﺃﻳﻀﺎﹰ:
;)($shape = new SWFShape
;)$fill = $shape->addFill(0xff, 0, 0
;)$shape->setLeftFill($fill
;)$shape->setLine(10, 0, 0xff, 0
;)$shape->movePenTo(100, 100
;)$shape->drawLine(0, -100
;)$shape->drawLine(-100, 0
;)$shape->drawLine(0, 100
;)$shape->drawLine(100, 0
ﻧﺴﺘﺨﺪﻡ ﺍﻟﺘﺎﺑﻊ ) ( setLeftFillﻷﻧﻨﺎ ﺭﲰﻨﺎ ﺍﳋﻂ ﺑﻌﻜﺲ ﺍﲡﺎﻩ ﻋﻘﺎﺭﺏ ﺍﻟﺴﺎﻋﺔ .ﺗـﺬﻛﺮ ﺃﻥ ﺍﻟﺘـﺎﺑﻊ
) ( drawLineﻳﺴﺘﺨﺪﻡ ﺍﻹﺯﺍﺣﺔ ﺑﺎﻟﻨﺴﺒﺔ ﺇﱃ ﺍﳌﻮﻗﻊ ﺍﳊﺎﱄ ﻟﻘﻠﻢ ﺍﻟﺮﺳﻢ ﻟﺮﺳﻢ ﺍﳋﻄﻮﻁ .ﻭﺑﺎﻟﺘﺎﱄ ،ﻳﺘﻢ
ﺭﺳﻢ ﺍﳋﻂ ﻛﻤﺎ ﻳﻠﻲ:
www.raypub.com
raypubsales@gmail.com
25 : PHP Extension Lbraries 1096
ﺗﻮﺟﺪ ﺻﻌﻮﺑﺔ ﺃﻳﻀﺎﹰ ﰲ ﺇﺿﺎﻓﺔ ﳐﻄﻂ ﺃﻋﺪﺍﺩ ﺛﻨﺎﺋﻴﺔ ) (bitmapsﺇﱃ ﺍﻟﺼﻮﺭ .ﻻ ﺗﻘﺮﺃ Mingﺇﻻ ﺍﻟﺼﻮﺭ
ﺫﺍﺕ ﺍﻟﺘﻨﺴﻴﻖ JPEGﺍﳌﺮﻣﺰ ﺍﺳﺘﻨﺎﺩﺍﹰ ﺇﱃ ﺍﳋﻂ )ﻟﻦ ﺗﻌﻤﻞ ﺻـﻮﺭ JPEGﺍﳌﻀـﻐﻮﻃﺔ ﺫﺍﺕ ﺍﻷﻣﺜﻠﻴـﺔ
ﺍﳌﺴﺘﻨﺪﺓ ﺇﱃ ﺍﳋﻂ( ﻭﺍﳌﻠﻔﺎﺕ ﺫﺍﺕ ﺍﻟﺘﻨﺴﻴﻖ ) DBLﻭﻫﻲ ﻣﻠﻔﺎﺕ PNGﺍﻟﱵ ﰎ ﺗﻌﺪﻳﻠﻬﺎ ﺑﺎﺳـﺘﺨﺪﺍﻡ
ﺍﻷﺩﺍﺓ png2dblﺍﻟﱵ ﺗﺄﰐ ﻣﻊ .(Mingﻭﳚﺐ ﺃﻥ ﻳﺸﻤﻞ ﺍﻟﺪﻋﻢ ﺍﳌﺴﺘﻘﺒﻠﻲ ﻛﻼﱠ ﻣﻦ ،PNGﻭﲨﻴـﻊ
ﺗﻨﺴﻴﻘﺎﺕ ،JPEGﻭ ،GIFﻭ.TTF
ﻹﺿﺎﻓﺔ ﺻﻮﺭﺓ ﻧﻘﻄﻴﺔ ﺇﱃ ﻓﻴﻠﻤﻚ ،ﳚﺐ ﻋﻠﻴﻚ ﺍﺷﺘﻘﺎﻕ ﻛـﺎﺋﻦ SWFObjectﺟﺪﻳـﺪ ،ﻭﻟﻨﺪﻋـﻪ
:SWFBitmap
)]new SWFBitmap(string filename [, int aplhafilename
ﳚﺐ ﺃﻥ ﻳﻜﻮﻥ ﻣﻠﻒ ﺍﻟﻘﻨﺎﻉ ﺻﻮﺭﺓ GIFﲤﻠﻚ ﻧﻔﺲ ﺃﺑﻌﺎﺩ ) JPEGﺃﻭ (DBLﺍﶈـﺪﺩﺓ ،ﻭﺍﻟـﱵ ﰎ
ﺗﻌﺪﻳﻠﻬﺎ ﺑﻮﺍﺳﻄﺔ ﺍﻟﱪﻧﺎﻣﺞ ) gifzmaskﻭﺍﻟﺬﻱ ﻳﻜﻮﻥ ﻣﻀﻤﻨﺎﹰ ﰲ ﻣﺼﺪﺭ .(Mingﳝﺜﻞ ﺍﻟﻘﻨﺎﻉ ﺻـﻮﺭﺓ
)ﺃﻭ ﻟﻮﻧﺎﹰ( ﻟﻪ ﻗﻴﻤﺔ ﺷﻔﺎﻓﻴﺔ ﻭﻳﺘﻮﺿﻊ ﻓﻮﻕ ﻛﺎﺋﻦ ﺁﺧﺮ ﻟﺘﺤﻘﻴﻖ ﻧﻮﻉ ﻣﻦ ﺃﺛﺮ "ﺍﻟﺘﻘﻨﻴﻊ" ،ﻟﲑﺑﻂ ﺑـﺬﻟﻚ
ﺑﲔ ﺍﻟﻜﺎﺋﻦ ﻭﺍﻟﺼﻮﺭﺓ )ﺃﻭ ﺍﻟﻠﻮﻥ(.
ﺗﻮﺟﺪ ﺗﻮﺍﺑﻊ ﺃﺧﺮﻯ ﻣﻔﻴﺪﺓ ﻣﻊ SWFBitmapﻣﺜﻞ ) ( getWidthﻭ) ( ،getHeightﻭﺍﻟﻠـﺬﺍﻥ ﻳﻌﻴـﺪﺍﻥ
ﻗﻴﻤﱵ ﺍﻟﻌﺮﺽ ﻭﺍﻻﺭﺗﻔﺎﻉ ،ﻋﻠﻰ ﺍﻟﺘﺮﺗﻴﺐ ،ﻟﻠﻜﺎﺋﻦ .SWFBitmapﻋﻠﻰ ﺃﻥ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﺼﻮﺭ ﺍﻟﻨﻘﻄﻴﺔ
ﰲ ﻓﻴﻠﻢ Flashﳛﺠﺐ ﻗﺪﺭﺓ ﻓﻴﻠﻤﻚ ﻋﻠﻰ ﺃﻥ ﻳﻜﻮﻥ ﻗﺎﺑﻼﹰ ﻟﻠﺘﺪﺭﺝ ) ،(scalableﺇﺿﺎﻓﺔ ﺇﱃ ﺃﻧﻪ ﻳﻨﻘﺺ
ﻣﻦ ﺍﳉﻮﺩﺓ ﺍﻟﺮﺳﻮﻣﻴﺔ.
ﻛﻤﺎ ﻭﳝﻜﻨﻨﺎ ﺗﻌﺒﺌﺔ ﻛﺎﺋﻨﺎﺕ ﺍﻟﺼﻮﺭ ﺍﻟﻨﻘﻄﻴﺔ ،ﻭﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﺎﺑﻊ ) ( addFillﺃﻳﻀﺎﹰ ،ﻋﻠﻰ ﺃﻥ ﻫﻨـﺎﻙ
ﻓﺮﻕ ﰲ ﺍﻟﺼﻴﻐﺔ .ﻭﻧﺒﲔ ﻓﻴﻤﺎ ﻳﻠﻲ ﺍﻟﻄﺮﻳﻘﺔ ﺍﳌﺴﺘﺨﺪﻣﺔ ﻻﺳـﺘﺪﻋﺎﺀ ﺍﻟﺘـﺎﺑﻊ ) ( addFillﻣـﻊ ﺍﻟﻜـﺎﺋﻦ
.SWFBitmap
www.raypub.com
raypubsales@gmail.com
1097 PHP : 25ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ
;)$shape->addFill($gradient
ﳝﻜﻦ ﺗﻄﺒﻴﻖ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻟﺘﺤﻮﻳﻼﺕ ﻭﺍﻟﺘﺄﺛﲑﺍﺕ ﻋﻠﻰ ﻋﻤﻠﻴﺎﺕ ﺍﻟﺘﻌﺒﺌﺔ ﻫﺬﻩ ،ﻭﺍﻟﱵ ﻳـﺘﻢ ﺇﻧﺸـﺎﺅﻫﺎ
ﺑﻮﺍﺳﻄﺔ .Mingﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ ،ﳝﻜﻦ ﻧﻘﻠﻬﺎ ،ﻭﺗﻐﻴﲑ ﺣﺠﻤﻬﺎ ،ﻭﺗﺪﻭﻳﺮﻫﺎ ،ﻭﺇﻣﺎﻟﺘﻬﺎ.
www.raypub.com
raypubsales@gmail.com
25 : PHP Extension Lbraries 1098
ﺗﺬﻛﺮ ﺃﻥ ﺍﳌﻜﺘﺒﺔ Mingﺗﺴﺘﺨﺪﻡ ﻭﺣﺪﺍﺕ ﺍﻟﻘﻴﺎﺱ ﺍﻟﻨﺴﺒﻴﺔ ،ﻭﺑﺬﻟﻚ ﺳﺘﺴﺘﻨﺪ ﺍﻟﺘﺄﺛﲑﺍﺕ ﺇﱃ ﻣﻮﻗـﻊ
ﻗﻠﻢ ﺍﻟﺮﺳﻢ ﻭﺍﻟﺸﻜﻞ.
ﺗﻌﺘﱪ ﻫﺬﻩ ﺍﻟﺘﺤﻮﻳﻼﺕ ﺿﺮﻭﺭﻳﺔ ﺃﺣﻴﺎﻧﺎﹰ ،ﻭﺫﻟﻚ ﺃﻧﻪ ﻻ ﺗﻄﺒﻖ ﻋﻤﻠﻴﺎﺕ ﺍﻟﺘﻌﺒﺌﺔ ﺩﺍﺋﻤﺎﹰ ﺣﻴﺚ ﺗﺮﻳـﺪ ﺩﺍﺧـﻞ
ﻛﺎﺋﻨﺎﺕ .SWFShapeﳝﻜﻨﻚ ﺍﻋﺘﺒﺎﺭ ﻫﺬﻩ ﺍﻟﺘﻮﺍﺑﻊ ﺃﻗﻞ ﺃﳘﻴﺔ ﺇﺫﺍ ﻣﺎ ﻧﻈﺮﺕ ﺇﻟﻴﻬﺎ ﻣﻦ ﻧﺎﺣﻴﺔ ﺍﺳـﺘﺨﺪﺍﻣﻬﺎ
ﻣﻊ ﻋﻤﻠﻴﺎﺕ ﺍﻟﺘﻌﺒﺌﺔ ﻓﻘﻂ ،ﻭﻟﻜﻨﻬﺎ ﻗﺎﺑﻠﺔ ﻟﻼﺳﺘﺨﺪﺍﻡ ﻣﻊ ﺍﻷﺷﻜﺎﻝ ﺃﻳﻀﺎﹰ.
ﺗﻮﻓﺮ ﺍﻟﺘﻮﺍﺑﻊ ﺍﻟﺘﺎﻟﻴﺔ ﻃﺮﻗﺎﹰ ﻟﻨﻘﻞ ﻭﺇﻣﺎﻟﺔ ﻭﺗﺪﻭﻳﺮ ﻭﺗﻐﻴﲑ ﺣﺠﻢ ﺃﺷﻜﺎﻟﻚ ،ﺇﺿﺎﻓﺔ ﺇﱃ ﺍﻟﻄﺮﻕ ﺍﻟﱵ ﺗﺴﻤﺢ
ﺑﺎﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺃﻟﻮﺍﻥ ﻫﺬﻩ ﺍﻷﺷﻜﺎﻝ:
ﺍﻟﻮﺻﻒ ﺍﻟﻄﺮﻳﻘﺔ
ﺗﻨﻘﻞ ﺍﻟﺸﻜﻞ ﺇﱃ ﻧﻘﻄﺔ ﺑﺈﺣﺪﺍﺛﻴﺎﺕ ) (x,yﳏﺪﺩﺓ. )moveTo(x, y
ﺗﺆﺩﻱ ﺇﱃ ﺇﻣﺎﻟﺔ ﺍﻹﺣﺪﺍﺛﻴﺔ xﺇﱃ ﺍﻟﻘﻴﻤﺔ skewﺍﶈﺪﺩﺓ ،ﻭﺗﺪﻝ ﺍﻟﻘﻴﻤﺔ 0ﻋﻠﻰ )skewXTo(skew
ﻋﺪﻡ ﻓﺮﺽ ﺃﻳﺔ ﺇﻣﺎﻟﺔ .ﺃﻣﺎ 1.0ﻓﺘﻤﺜﻞ ﺇﻣﺎﻟﺔ ﺑﺰﺍﻭﻳﺔ 45ﺩﺭﺟﺔ ،ﻭ 2.0ﺑﺰﺍﻭﻳﺔ 90
ﺩﺭﺟﺔ ،ﻭﻫﻜﺬﺍ ﺩﻭﺍﻟﻴﻚ .ﳝﻜﻦ ﲢﺪﻳﺪ ﺩﺭﺟﺔ ﺍﻹﻣﺎﻟﺔ ﺑﺴﻬﻮﻟﺔ ﺑﺎﺳﺘﺨﺪﺍﻡ
ﺍﻟﺘﻨﺎﺳﺐ )ﺃﻱ ،ﳝﻜﻦ ﺣﺴﺎﺏ ﺍﻹﻣﺎﻟﺔ ﺑﺰﺍﻭﻳﺔ 30ﺑﺘﻘﺴﻴﻢ 1.0ﻋﻠﻰ ،45ﻭﻣﻦ ﰒ
ﺿﺮﺏ ﺍﻟﻨﺎﺗﺞ ﺑﺎﻟﻌﺪﺩ ،30ﻟﻨﺤﺼﻞ ﻋﻠﻰ ﺍﻟﻘﻴﻤﺔ 2/3ﺃﻭ .(0.66667
ﺇﻣﺎﻟﺔ ﺍﻹﺣﺪﺍﺛﻴﺔ xﺑﺎﻟﻘﻴﻤﺔ skewﺍﶈﺪﺩﺓ. )skewX(skew
ﺗﻐﲑ ﺃﺑﻌﺎﺩ ﺍﻟﺸﻜﻞ ﺇﱃ ﻋﺮﺽ ﻭﺍﺭﺗﻔﺎﻉ ﺑﻨﺴﺒﺔ ﳏﺪﺩﺓ )ﺇﺫﺍ ﻛﺎﻥ ﺍﻻﺭﺗﻔﺎﻉ ﺃﻭ )]scaleTo(x [, y
ﺍﻟﻘﻴﻤﺔ ،yﻏﲑ ﳏﺪﺩ ،ﻳﺘﻢ ﺗﻐﻴﲑ ﺣﺠﻢ ﺍﻻﺭﺗﻔﺎﻉ ﲤﺎﻣﺎﹰ ﺑﺎﻟﻨﺴﺒﺔ ﺍﳌﻮﺍﻓﻘﺔ ﻟﹻ .(x
ﻳﻌﺮﻑ ﺍﻟﻌﺮﺽ ﻭﺍﻻﺭﺗﻔﺎﻉ ﺑﻌﺪ ﺍﻟﺘﻐﻴﲑ ﺑﻘﻴﻤﱵ ﺍﻟﻌﺮﺽ ﻭﺍﻻﺭﺗﻔﺎﻉ ﺍﶈﺪﺩﺗﲔ
ﻛﻘﻴﻤﺘﲔ ﻟﻺﺣﺪﺍﺛﻴﺎﺕ ،y ،xﺃﻭ ﺑﺎﻟﻌﺮﺽ ﻭﺍﻻﺭﺗﻔﺎﻉ ﺍﻟﻨﻬﺎﺋﻴﲔ ﻟﻠﺸﻜﻞ.
ﺗﻐﲑ ﺃﺑﻌﺎﺩ ﺍﻟﺸﻜﻞ ﺑﻘﻴﻤﱵ ﺍﻟﻌﺮﺽ ﻭﺍﻻﺭﺗﻔﺎﻉ ﺍﶈﺪﺩﺗﲔ. )]scale(x[,y
ﺗﻌﲔ ﺍﻟﻠﻮﻥ )ﻭﻗﻴﻤﺔ alphaﺑﺸﻜﻞ ﺍﺧﺘﻴﺎﺭﻱ( ﳌﺜﻴﻞ ﺍﻟﺸﻜﻞ ﰲ ﻓﻴﻠﻤﻚ. addColor(red, green,
)]blue [, alpha
www.raypub.com
raypubsales@gmail.com
1099 PHP : 25ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ
ﺍﻟﻮﺻﻒ ﺍﻟﻄﺮﻳﻘﺔ
ﻳﻀﺮﺏ ﻗﻨﻮﺍﺕ ﺍﻟﻠﻮﻥ ﺍﳊﻤﺮﺍﺀ ،ﻭﺍﳋﻀﺮﺍﺀ ،ﻭﺍﻟﺰﺭﻗﺎﺀ ،ﻭﺍﺧﺘﻴﺎﺭﻳﺎﹰ ﻗﻨﺎﺓ ،alpha multicolor(red,
ﻭﺫﻟﻚ ﺑﺎﻟﻘﻴﻢ ﺍﻟﱵ ﲢﺪﺩﻫﺎ .ﻳﻀﺮﺏ ﻫﺬﺍ ﺍﻟﺘﺎﺑﻊ ﻗﻴﻤﺔ RGBﺍﳊﺎﻟﻴﺔ ﻟﻜﻞ ﺑﻴﻜﺴﻞ green, blue [,
ﺑﺎﻟﻘﻴﻤﺔ ﺍﶈﺪﺩﺓ ،ﻭﺑﺬﻟﻚ ﳝﻜﻦ ﺟﻌﻞ ﺍﻟﺼﻮﺭﺓ ﺳﻠﺒﻴﺔ ﺑﻀﺮﺏ ﻛﻞ ﻗﻨﺎﺓ ﺑﺎﻟﻘﻴﻤﺔ )]alpha
) -1.0ﻳﻌﱪ 1.0ﻋﻦ ﺍﻟﻘﻨﺎﺓ ﺑﺎﺳﺘﻄﺎﻋﺘﻬﺎ ﺍﻟﻠﻮﻧﻴﺔ ﺍﻟﻜﺎﻣﻠﺔ(.
ﺗﻀﺎﻑ ﺍﻷﺷﻜﺎﻝ )ﺍﳌﻨﺎﻃﻖ ﺍﻟﱵ ﻳﻜﻮﻥ ﻓﻴﻬﺎ ﺍﻟﺰﺭ ﻗﺎﺑﻼﹰ ﻟﻠﻨﻘﺮ ﻋﻠﻴﻪ( ﻛﻤﺎ ﻳﻠﻲ:
)void swfbutton->addshape(resource shape, int flags
Actions
ﺗﺪﻋﻢ Mingﺑﻌﺾ ﺇﺟﺮﺍﺀﺍﺕ ،Flashﻭﺍﻟﱵ ﺗﻜﺮﺭ ﺍﻟﻌﺮﻭﺽ ﺍﻟﺘﻘﺪﳝﻴﺔ ﻹﺟﺮﺍﺀﺍﺕ .Flashﻭﳒﺪ ﻣـﻦ
ﺑﻴﻨﻬﺎ ﺍﻹﺟﺮﺍﺀ ) ( getURLﺍﳌﻔﻴﺪ ﺟﺪﺍﹰ ،ﻭﺍﻟﺬﻱ ﻳﺮﺳﻞ ﺇﱃ ﺍﳌﺴﺘﻌﺮﺽ ﻋﻨﻮﺍﻥ URLﺟﺪﻳـﺪ .ﳝﻜﻨﻨـﺎ
ﺇﺿﺎﻓﺔ ﺍﻟﺸﻴﻔﺮﺓ ﺍﻟﺘﺎﻟﻴﺔ ﺇﱃ ﺯﺭﻧﺎ ﳉﻌﻠﻪ ﻳﻔﺘﺢ ﺻﻔﺤﺔ ﻭﻳﺐ ﰲ ﻧﺎﻓﺬﺓ ﺟﺪﻳﺪﺓ:
$button->addAction(new SWFAction("getURL
;)('http://www.sitetronics.com/', 'newWindow');"), SWFBUTTON_MOUSEUP
www.raypub.com
raypubsales@gmail.com
25 : PHP Extension Lbraries 1100
ﻧﻈﺮﺍﹰ ﻷﻥ ﺍﻹﺟﺮﺍﺀﺍﺕ ﺟﺪﻳﺪﺓ ﻧﺴﺒﻴﺎﹰ ﰲ ،Mingﻭﻏﲑ ﻣﺪﻋﻮﻣﺔ ﻛﻠﻴﺎﹰ ،ﺃﻗﺘﺮﺡ ﻋﻠﻴﻚ ﺑﺄﻥ ﺗﻌـﻮﺩ ﺇﱃ
ﻣﻮﻗﻊ Mingﻋﻠﻰ ﺍﻟﻮﻳﺐ ﻟﻠﺤﺼﻮﻝ ﻋﻠﻰ ﻣﻌﻠﻮﻣﺎﺕ ﺇﺿﺎﻓﻴﺔ ﻋﻦ ﺇﺟﺮﺍﺀﺍﺕ .Flash
ﳝﻜﻦ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﻣﻌﻠﻮﻣﺎﺕ ﺍﳋﻂ ﺍﳌﺘﺮﻳﺔ )ﺍﻟﻘﻴﺎﺳـﻴﺔ( ﺑﺎﺳـﺘﺨﺪﺍﻡ ﺍﳋﺼـﺎﺋﺺ ) (،getAscent
ﻭ) ( ،getDescentﻭ) ( ،getLeadingﻭ) getWidthe(stringﻟﻠﻜﺎﺋﻦ .SWFFontﺗﻜﻮﻥ ﺍﻟﻘﻴﻤﺔ ﺍﳌﻌﺎﺩﺓ
ﻣﻦ ﻫﺬﺍ ﺍﻟﺘﺎﺑﻊ ﻣﻮﺍﻓﻘﺔ ﳋﻂ ﺑﺎﺭﺗﻔﺎﻉ .1024ﻭﺇﺫﺍ ﱂ ﺗﻌﲔ ﺣﺠﻢ ﺍﳋﻂ ﻋﻠﻰ ،1024ﻓﺴـﺘﺤﺘﺎﺝ ﺇﱃ
ﺿﺮﺏ ﻫﺬﻩ ﺍﻟﻘﻴﻢ ﺑﺎﻟﻨﺴﺒﺔ )ﺍﻻﺭﺗﻔﺎﻉ .(1024 /ﺩﻋﻨﺎ ﻧﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﺳﻠﺴﻠﺔ ﳏﺮﻓﻴﺔ ﺑﺴﻴﻄﺔ ﻭﻧﺮﺳﻠﻬﺎ ﺇﱃ
ﺍﳌﺴﺘﻌﺮﺽ )ﻳﻔﺘﺮﺽ ﺫﻟﻚ ﺃﻥ ﻟﺪﻳﻚ Mingﰲ ،php.iniﺃﻭ ﻣﻀﻤﻨﺔ ﰲ ،PHPﻭﺃﻧﻚ ﺃﻧﺸﺄﺕ ﺑﺎﻟﻔﻌﻞ
ﺧﻄﱠﺎﹰ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻷﺩﺍﺓ makefdbﻭﻟﻨﺪﻋﻪ :(Arial.fdb
<?php
;)"$font = newSWFFont("Arial.fdb
;)$movie->add($string
;)"header("Content-type: application/x-shockwave-flash
;)($movie->output
>?
www.raypub.com
raypubsales@gmail.com
1101 PHP : 25ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ
ﻳﺘﻢ ﺗﻀﻤﲔ Arial.fdbﻛﺠﺰﺀ ﻣﻦ ﺷﻴﻔﺮﺓ ﻫﺬﺍ ﺍﻟﻔﺼﻞ ،ﻭﲡﺪﻫﺎ ﻋﻠﻰ ﺍﻟﻘﺮﺹ ﺍﳌﻀﻐﻮﻁ ﺍﳌﺮﻓﻖ .ﻛﻤﺎ
ﻭﳝﻜﻨﻚ ﺍﻟﻌﻮﺩﺓ ﺇﱃ ﺍﳌﻮﻗﻊ ،http://www.opaque.net/ming/ﻭﺫﻟﻚ ﻟﻠﺤﺼﻮﻝ ﻋﻠﻰ ﺃﻣﺜﻠﺔ ﻋﺪﻳـﺪﺓ
ﻭﺟﻮﻻﺕ ﻭﻣﻌﻠﻮﻣﺎﺕ ﻋﻦ ﺍﺳﺘﺨﺪﺍﻡ ﺍﳌﻜﺘﺒﺔ .Ming
ﺗﻮﺥ ﺍﳊﺬﺭ ﻋﻨﺪ ﺇﻧﺸﺎﺀ ﺻﻔﺤﺎﺕ ،WMLﺫﻟﻚ ﺃﻥ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺃﺟﻬﺰﺓ ) WAPﺑﺮﻭﺗﻮﻛﻮﻝ ﺍﻟﻮﺻﻮﻝ
ﺍﻟﻼﺳﻠﻜﻲ( ﻻ ﺗﺴﺘﻄﻴﻊ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺃﻛﺜﺮ ﻣﻦ 1400ﺑﺎﻳﺖ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﺘﺮﲨﺔ )ﻧﻘﺼﺪ ﺑﺎﳌﺘﺮﲨﺔ
ﻋﻼﱠﻣﺎﺕ ،WMLﻭﺍﻟﻨﺺ ،ﻭﻏﲑﻫﺎ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﱵ ﺗﻘﺪﻡ ﰲ ﺍﻟﺼﻔﺤﺔ(.
ﺳﻮﻑ ﻳﺴﺘﻘﺒﻞ ﺃﻱ ﺟﻬﺎﺯ ﻻﺳﻠﻜﻲ ﻳﺼﻞ ﺇﱃ ﻫﺬﻩ ﺍﻟﺼﻔﺤﺔ ﺍﻟﻨﺺ "! ."welcome, wireless usersﻗﺪ
ﺗﺘﺴﺎﺀﻝ ﻋﻦ ﻛﻴﻔﻴﺔ ﺗﻠﻘﻲ ﻣﺴﺘﺨﺪﻣﻲ ﺍﻷﺟﻬﺰﺓ ﺍﻟﻼﺳـﻠﻜﻴﺔ ﻟﻠﺼـﻔﺤﺔ ﺫﺍﺕ ﺍﳌﻠـﻒ ﺍﻻﻓﺘﺮﺍﺿـﻲ
،index.htmlﻭﺍﻟﺬﻱ ﻳﻌﺮﺽ ﻋﻨﺪﻣﺎ ﻳﺼﻞ ﺍﳌﺴﺘﺨﺪﻣﻮﻥ ﻣﻮﻗﻌﻚ .ﻳﺘﻄﻠﺐ ﻫﺬﺍ ﺍﻷﻣﺮ ﻣﻌﺮﻓﺔ ﺑـﺈﺩﺍﺭﺓ
.Apacheﳚﺐ ﻋﻠﻴﻨﺎ ﺃﻭﻻﹰ ﲢﺮﻳﺮ ﺍﳌﻠﻒ httpd.confﻭﺇﺿﺎﻓﺔ .wmlﺇﱃ ﺍﻟﻨﻮﻉ ،MIMEﻟﻴﺼـﺎﺭ ﺇﱃ
ﻣﻌﺎﳉﺔ ﺍﳌﻠﻒ ﻣﻦ ﻗﺒﻞ .PHPﻭﻧﻘﻮﻡ ﺑﺬﻟﻚ ﺑﺎﻟﻌﺜﻮﺭ ﻋﻠﻰ ﺍﻟﺴﻄﺮ ﺍﻟﺘﺎﱄ ﰲ ﺍﳌﻠﻒ :httpd.conf
AddType application/x-httpd-php .php .phtml
www.raypub.com
raypubsales@gmail.com
25 : PHP Extension Lbraries 1102
:ﻭﺗﻐﻴﲑﻩ ﺇﱃ ﻣﺎ ﻳﻠﻲ
AddType application/x-httpd-php .php .phtml .wml
ﻟﺘﻐﻴﲑ ﻣﺴﺎﺭ ﺍﳌﻠﻒ ﺍﻟﺬﻱ ﻳﺘﻢ ﻋﺮﺿﻪmod_rewrite ﺍﻟﻨﻤﻄﻴﺔApache ﳓﺘﺎﺝ ﺃﻳﻀﺎﹰ ﺇﱃ ﺍﺳﺘﺨﺪﺍﻡ ﻭﺣﺪﺓ
ﻭﺫﻟﻚ ﺇﺫﺍ ﻣﺎ ﻛﺎﻥ ﻋﻠﻰ ﺍﳌﺴﺘﺨﺪﻡ ﺃﻥ ﻳﻄﻠﺐ ﺻﻔﺤﺔ ﻣﻦ ﻣﻠﻘﻤﻨﺎ ﻟﻴﺴﺖ،ﳌﺴﺘﺨﺪﻡ ﺍﳉﻬﺎﺯ ﺍﻟﻼﺳﻠﻜﻲ
.Apache ﺫﻟﻚ ﻳﺘﻄﻠﺐ ﺍﻟﻌﻮﺩﺓ ﺇﱃ ﻛﺘﺎﺏ ﻳﺘﻌﻠﻖ ﺑﺎﳌﻠﻘﻢ ﻭﻟﻜﻦ.ﻣﺘﻮﺍﻓﻘﺔ ﻣﻊ ﺍﻷﺟﻬﺰﺓ ﺍﻟﻼﺳﻠﻜﻴﺔ
: ﺇﱃ ﺇﺯﺍﻟﺔ ﻋﻼﻣﺔ ﺍﻟﺘﻌﻠﻴﻖ ﻋﻦ ﺍﻟﺴﻄﺮﻳﻦ ﺍﻟﺘﺎﻟﻴﲔ،mode_rewrite ﺑﻐﻴﺔ ﺗﺄﻫﻴﻞ،ﲢﺘﺎﺝ
#LoadModule rewrite_module modules/mod_rewrite.so
#AddModule mod_rewrite.c
ﳓﺘﺎﺝ ﺑﻌـﺪ.ﻠﺔ ﺗﻠﻘﺎﺋﻴﺎﹰ ﻫﺬﻩ ﺍﻟﻮﺣﺪﺓ ﺍﻟﻨﻤﻄﻴﺔ ﻣﻔﻌWindows ﰲApache ﳚﺐ ﺃﻥ ﳚﺪ ﻣﺴﺘﺨﺪﻣﻮ
:httpd.conf ﺫﻟﻚ ﺇﱃ ﺇﺿﺎﻓﺔ ﺍﻟﺸﻴﻔﺮﺓ ﺍﻟﺘﺎﻟﻴﺔ ﺇﱃ ﺍﳌﻠﻒ
RewriteEngine On
ﻹﻋﺎﺩﺓ ﺗﺸﻐﻴﻞapachectl graceful ﻳﺴﻤﺢ ﺍﺳﺘﺨﺪﺍﻡ،Apache ﲢﺘﺎﺝ ﺍﻵﻥ ﺇﱃ ﺇﻋﺎﺩﺓ ﺗﺸﻐﻴﻞ ﺍﳌﻠﻘﻢ
.(apache -k) ﺍﻷﻣﺮWindows ﻭﻳﻜﺎﻓﺊ ﺫﻟﻚ ﰲ.ﺎﺀ ﲨﻴﻊ ﺍﻻﺗﺼﺎﻻﺕ ﻗﺒﻞ ﺇﻋﺎﺩﺓ ﺍﻟﺘﺸﻐﻴﻞﺍﳌﻠﻘﻢ ﺑﺈ
ﻭﺑـﺬﻟﻚ،content-type ﺑﺒﺴﺎﻃﺔ ﲢﺪﻳﺪ ﺭﺃﺱPHP ﰲWML ﻳﺘﻄﻠﺐ ﻣﻨﻚ ﺇﻧﺸﺎﺀ ﻣﻮﻗﻊ ﻣﺘﻮﺍﻓﻖ ﻣﻊ
: ﻭﻳﺮﺳﻞ ﺍﻟﺮﺃﺱ ﺑﺒﺴﺎﻃﺔ ﻛﻤـﺎ ﻳﻠـﻲ. ﰲ ﻃﺮﻳﻘﻬﺎ ﺇﻟﻴﻪWML ﺃﻥ ﺑﻴﺎﻧﺎﺕWAP ﺳﻴﻔﻬﻢ ﻣﺴﺘﻌﺮﺽ
.header("Content-type: text/vnd.wap.wml")
: ﻋﻠﻰ ﺍﻟﺸﻜﻞ ﺍﻟﺘﺎﱄPHP ﺍﳌﺮﺳﻠﺔ ﺑﺎﺳﺘﺨﺪﺍﻡWML ﺳﺘﻜﻮﻥ ﺻﻔﺤﺔ،ﻭﻫﻜﺬﺍ
<?php
header("Content-type: text/vnd.wap.wnl");
?>
www.raypub.com
raypubsales@gmail.com
1103 PHP : 25ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ
><wml
>"<card id="home
><p>Welcome, wireless users!</p
></card
></wml
ﻣﻦ ﺍﻟﺒﻄﺎﻗﺎﺕ.
ﻣﺴﺘﻌﺮﺿﺎﺕ WML/WAPﺍﻟﱵ ﺗﻀﻤﻦ ﻣﺮﺳﻰ ﻭﺑﻄﺎﻗﺔ ﻭﺣﻴﺪﻳﻦ ﻓﻘﻂ.
ﻟﻴﺴﺖ HAWHAWﺑﺘﻄﺒﻴﻖ ﻣﺜﺒﺖ ،ﻭﺇﳕﺎ ﺑﺮﻧﺎﻣﺞ ﻧﺼﻲ ﳝﻜﻨﻚ ﺗﻀﻤﻴﻨﻪ ﰲ ﺷﻴﻔﺮﺓ PHPﺑﺎﺳـﺘﺨﺪﺍﻡ
;)".include ("hawhaw.inc
ﻭﻟﻌﻞﱠ ﺃﻓﻀﻞ ﻣﺎ ﳜﺺ HAWHAWﻫﻮ ﺃﺎ ﺗﻘﺪﻡ ﳐﻄﻄﺎﹰ ﻣﺮﻛﺒﺎﹰ ﻟﺘﻮﻟﻴﺪ ﺍﻟﺼﻔﺤﺎﺕ ،ﻭﺍﻟﱵ ﺗﻨﻘﻞ ﻛﻤﺎ
ﻫﻲ ﺇﱃ ﺍﳌﺴﺘﻌﺮﺽ .ﻭﺑﺎﻟﺘﺎﱄ ،ﳝﻜﻨﻚ ﺍﺳﺘﺨﺪﺍﻡ HAWHAWﻹﻧﺸﺎﺀ HTMLﻣﺮﻛﺒﺔ ،ﻭﻛﺬﻟﻚ ﺻﻔﺤﺎﺕ
،WMLﻟﻨﺠﻨﺐ ﺃﻧﻔﺴﻨﺎ ﺑﺬﻟﻚ ﺍﳌﺸﺎﻛﻞ ﻭﺍﻻﺿﻄﺮﺍﺏ ﰲ ﲢﺪﻳﺪ ﺍﻟﻮﺟﻬﺔ ﺍﻟﱵ ﺳﻨﻤﻀﻲ ﺇﻟﻴﻬﺎ.
Using HAWHAW
HAWHAW
ﻳﺒﺪﺃ ﺇﺭﺳﺎﺀ WMLﺑﺎﻟﺼﻨﻒ ،HAW_deckﻭﺍﻟﺬﻱ ﳚﺐ ﺃﻥ ﲢﻮﻱ ﻛﻞ ﺻﻔﺤﺔ ﻣﻨﻪ ﺑﻄﺎﻗﺔ ﻭﺍﺣـﺪﺓ
ﻓﻘﻂ )ﺫﻟﻚ ﺃﻥ ﺍﻟﺼﻔﺤﺎﺕ ﺍﻟﻼﺳﻠﻜﻴﺔ ﺗﺴﺘﺨﺪﻡ ﺍﻟﺒﻄﺎﻗﺎﺕ ﻟﻠﺘﻔﺎﻋﻞ( .ﳝﻜﻨﻨﺎ ﺇﻧﺸﺎﺀ ﺻـﻔﺤﺔ WML
www.raypub.com
raypubsales@gmail.com
25 : PHP Extension Lbraries 1104
;)$page->add_text($HAW_text_identifier
...
;)($page->create_page
...
>?
ﺗﻮﺟﺪ ﺣﻘﻴﻘﺔ ﺑﻀﻌﺔ ﺧﺼﺎﺋﺺ ﻓﻘﻂ ﻟﻠﺼﻨﻒ ،HAW_deckﻭﻫﻲ ﺗﺘﻀﻤﻦ ﺗﻮﺍﺑﻊ ﻹﺿﺎﻓﺔ ﻧﺼـﻮﺹ،
ﻭﳕﺎﺫﺝ ،ﻭﺟﺪﺍﻭﻝ ،ﻭﺍﺭﺗﺒﺎﻃﺎﺕ ،ﻭﺻﻮﺭ ،ﻭﳎﻤﻮﻋﺎﺕ ﺍﺭﺗﺒﺎﻃﺎﺕ ،ﻭﺷﻌﺎﺭﺍﺕ ﻟﺘﻮﻟﻴـﺪ ﺍﻟﺼـﻔﺤﺔ.
ﺳﻴﻮﻟﺪ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﻨﺼﻲ ﺍﻟﺴﺎﺑﻖ ﺧﻄﺄ ،ﺫﻟﻚ ﺃﻧﻪ ﻻ ﻳﻮﺟﺪ ﻣﺜﻴﻞ ﻋﻦ ﺍﻟﺼﻨﻒ ) HAW_textﺻـﻨﻒ
HAWHAWﺁﺧﺮ ﻹﻧﺸﺎﺀ ﺍﻟﻨﺼﻮﺹ( .ﻭﻧﻮﺭﺩ ﻓﻴﻤﺎ ﻳﻠﻲ ﻗﺎﺋﻤﺔ ﺑﻄﺮﻕ ﺍﻟﺼﻨﻒ :HAW_deck
)]method HAW_deck([string title, int alignFlag
ﲤﺜﻞ ﻣﺸﻴﺪ ﺍﻟﺼﻨﻒ .HAW_deckﳝﻜﻦ ﺃﻥ ﻳﻜﻮﻥ ﺍﻟﻮﺳﻴﻂ titleﺃﻳﺔ ﺳﻠﺴﻠﺔ ﳏﺮﻓﻴﺔ ،ﻓﻴﻤﺎ ﻳﻜﻮﻥ ﺍﻟﻌﻠﻢ
ﻭﺍﺣﺪﺍﹰ ﳑﺎ ﻳﻠﻲ ،HAW_ALIGN_LEFT :ﺃﻭ ،HAW_ALIGN_CENTERﺃﻭ .HAW_ALIGN_RTGHT
ﻭﳝﺜﻞ HAW_ALIGN_LEFTﺍﻟﻘﻴﻤﺔ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ.
)function add_text(object HAW_text
www.raypub.com
raypubsales@gmail.com
1105 PHP : 25ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ
ﻳﻌﺘﱪ ﺗﻌﻴﲔ ﺍﻟﻨﺺ ﺑﺎﺳﺘﺨﺪﺍﻡ HAWHAWﺳﻬﻼﹰ ﻫﻨﺎ ،ﻭﻳﻮﺟﺪ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﳋﻴﺎﺭﺍﺕ ﻟﺘﺤﻘﻴﻖ ﻧﺼﻚ.
ﻳﺴﺘﺪﻋﻰ ﺍﻟﻜﺎﺋﻦ HAW-textﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺴﻠﺴﻠﺔ ﺍﶈﺮﻓﻴﺔ ﻟﻠﻨﺺ ﺍﻟﺬﻱ ﺗﺮﻳﺪ ﻋﺮﺿﻪ ،ﺇﺿﺎﻓﺔ ﺇﱃ ﻭﺍﺣﺪ
ﺃﻭ ﺃﻛﺜﺮ ﻣﻦ ﺍﻷﻋﻼﻡ ﺍﻟﻨﺼﻴﺔ ﺍﻟﱵ ﺗﺘﻮﱃ ﺇﻋﺪﺍﺩ ﳕﻂ ﺍﻟﻨﺺ .ﺃﺿﻒ ﺇﱃ ﻣﺎ ﺳﺒﻖ ﺃﻧﻨﺎ ﻧﺴﺘﻄﻴﻊ ﺍﺳﺘﺨﺪﺍﻡ
ﺍﳋﺎﺻﺔ ) ( set_brﳍﺬﺍ ﺍﻟﺼﻨﻒ ،ﻭﺫﻟﻚ ﺑﻐﻴﺔ ﺗﻌﻴﲔ ﻋﺪﺩ ﺍﻟﺴﻄﻮﺭ ﺍﻟﻔﺎﺻﻠﺔ ﺍﻟﱵ ﺳﺘﺄﰐ ﺑﻌﺪ ﺍﻟـﻨﺺ.
ﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ ،ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﺍﻟﺘﺮﺣﻴﺐ ﲟﺴﺘﺨﺪﻣﻲ ﺻﻔﺤﺘﻨﺎ ﺑـﺎﻟﻨﺺ "! "Hello Usersﺫﻱ ﺍﻟﺘﻨﺴـﻴﻖ
ﺍﻷﺳﻮﺩ ﺍﻟﻌﺮﻳﺾ ) ،(boldﻭﺃﻥ ﻧﺘﺮﻙ ﺛﻼﺛﺔ ﺳﻄﻮﺭ ﻓﺎﺭﻏﺔ ﺑﻌﺪ ﺍﻟﻨﺺ ،ﻓﻌﻠﻴﻨﺎ ﺃﻥ ﻧﺴﺘﺨﺪﻡ ﺍﻟﺸـﻴﻔﺮﺓ
ﺍﻟﺘﺎﻟﻴﺔ:
<?php
;)"include("hawhaw.inc
;)$page->add_text($text
;)($page->create_page
>?
ﺳﻴﻌﺮﺽ ﺍﻟﻮﺳﻴﻂ ،ﺍﻟﺴﻠﺴﻠﺔ ﺍﻟﻨﺼﻴﺔ title ،ﺍﻟﻨﺺ ﰲ ﺷﺮﻳﻂ ﻣﻌﻠﻮﻣﺎﺕ ﻣﺴﺘﻌﺮﺽ HTMLﻋﻨـﺪ ﲢﻘـﻖ
ﺍﳊﺪﺙ .MouseOverﻭﻳﺒﺪﺃ ﺍﻻﺭﺗﺒﺎﻁ ﰲ ﻫﺬﻩ ﺍﻟﺼﻔﺤﺔ ﺑﻌﺪ ﺛﻼﺛﺔ ﺳﻄﻮﺭ ﲢﺖ ﺍﻟـﻨﺺ "!."Hello Users
ﻭﻟﺪﻳﻨﺎ ﺍﻵﻥ:
<?php
;)"include("hawhaw.inc
;)$page->add_text($text
;)$page->add_link($link
www.raypub.com
raypubsales@gmail.com
25 : PHP Extension Lbraries 1106
;)($page->create_page
>?
ﳝﻜﻦ ﺃﻳﻀﺎﹰ ﺇﺿﺎﻓﺔ ﺍﻟﺼﻮﺭ )ﻋﻦ ﻃﺮﻳﻖ ﺍﻟﻜﺎﺋﻦ (HAW_imageﺇﱃ ﺍﻟﺼﻔﺤﺎﺕ ﺍﻟﻼﺳﻠﻜﻴﺔ ،ﻭﳝﻜﻦ ﺩﳎﻬـﺎ
ﰲ ﺃﺣﺪ ﺍﻟﻜﺎﺋﻨﺎﺕ ،HAW_deckﺃﻭ ،HAW_formﺃﻭ .HAW_tableﻭﻳﺘﻤﺘﻊ ﺍﻟﻜﺎﺋﻦ ،HAW_imageﻣﺜﻞ
ﺍﻟﻜﺎﺋﻦ ،HAW_textﺑﺎﳋﺎﺻﺔ ) ( ،Set_brﻭﺍﻟﱵ ﳝﻜﻨﻨﺎ ﻣﻦ ﺧﻼﳍﺎ ﺗﻌﻴﲔ ﻋﺪﺩ ﺍﻟﺴﻄﻮﺭ ﺍﻟﱵ ﺗﻔﺼـﻞ
ﺍﻟﺼﻮﺭﺓ ﻋﻤﺎ ﻳﻠﻴﻬﺎ .ﻭﻳﻜﻮﻥ ﺗﻨﺴﻴﻖ ﺍﻟﺼﻨﻒ HAW_imageﻛﻤﺎ ﻳﻠﻲ:
new HAW_image(string WBMP_source, string HTML_source,
)string alt [, string BMP_source
ﺍﻟﻨﺺ ﺍﻟﺒﺪﻳﻞ ﺍﻟﺬﻱ ﺳﻴﻌﺮﺽ ﺭﻳﺜﻤﺎ ﻳﺘﻢ ﲢﻤﻴﻞ ﺍﻟﺼـﻮﺭﺓ )ﺃﻭ ﰲ ﺍﳌﺴﺘﻌﺮﺿـﺎﺕ ﺍﻟـﱵ ﻻ ﺗـﺪﻋﻢ
ﺍﻟﺼﻮﺭ!( .ﻛﻤﺎ ﳝﺜﻞ ﺍﻟﻮﺳﻴﻂ BMP_sourceﺍﻟﺼﻮﺭﺓ ﺫﺍﺕ ﺍﻟﺘﻨﺴﻴﻖ BMPﺃﺣﺎﺩﻱ ﺍﻟﻠـﻮﻥ ،ﻭﺍﻟـﱵ
ﺳﺘﻌﺮﺽ ﰲ ﺍﳌﺴﺘﻌﺮﺿﺎﺕ ﺫﺍﺕ ﺍﻟﻌﺮﺽ ﺃﺣﺎﺩﻱ ﺍﻟﻠﻮﻥ )ﻣﺜﻞ .(UPSim 3.2
ﻓﻴﻤﺎ ﻳﺘﻌﻠﻖ ﺑﻨﺎ ﳓﻦ ﻣﱪﳎﻲ ،PHPﻗﺪ ﺗﻜﻮﻥ ﺍﻟﻨﻤﺎﺫﺝ ﺃﻛﺜﺮ ﻣﺎ ﺘﻢ ﺑﻪ .ﻭﺗﻘـﺪﻡ HAWHAWﻣـﻦ
ﺟﻬﺘﻬﺎ ﺗﻮﺍﺑﻊ ﳕﻮﺫﺝ ﺳﻬﻠﺔ ﻭﻣﻔﻴﺪﺓ .ﻟﻜﻦ ﻋﻠﻴﻚ ﺃﻥ ﺗﺘﺬﻛﺮ ﺩﺍﺋﻤﺎﹰ ﺃﻥ ﺍﻟﻄﺮﻳﻘﺔ GETﻭﺣﺪﻫﺎ ﺍﻟﱵ ﰎ
ﺩﻋﻤﻬﺎ ﻹﺭﺳﺎﻝ ﺍﻟﺒﻴﺎﻧﺎﺕ .ﺩﻋﻨﺎ ﻧﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﺑﺮﻧﺎﻣﺞ ﻧﺼﻲ ﻟﻨﻤﻮﺫﺝ ﺑﺮﻳﺪ ﻣﻦ ﺃﺟـﻞ ﻣﺴـﺘﺨﺪﻣﻲ
ﺍﻷﺟﻬﺰﺓ ﺍﻟﻼﺳﻠﻜﻴﺔ ،ﻭﺫﻟﻚ ﻹﺭﺳﺎﻝ ﺭﺩﻭﺩ ﺃﻓﻌﺎﳍﻢ ﻋﻦ ﺻﻔﺤﺎﺗﻨﺎ ﺍﻟﻼﺳﻠﻜﻴﺔ .ﺳﻨﺪﻋﻮ ﻫﺬﺍ ﺍﻟﱪﻧﺎﻣﺞ
ﺍﻟﻨﺼﻲ ﺑﺎﻻﺳﻢ .input.wmlﺗﺬﻛﱠﺮ ﺃﻥ PHPﺳﺘﻔﺴﺮ ﺍﻵﻥ ﻣﻠﻔﺎﺕ ،WMLﺫﻟﻚ ﺃﻧﻨﺎ ﺃﺿـﻔﻨﺎﻫﺎ ﺇﱃ
ﺍﳌﻠﻒ :httpd.conf
<?php
;)"include("hawhaw.inc
www.raypub.com
raypubsales@gmail.com
1107 PHP ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ: 25
$form->add_input($nameInput);
$form->add_input($emailInput);
$form->add_input($comment);
$form->add_submit($submit);
$page->add_text($text);
$page->add_form($form);
$page->create_page();
?>
hompage.wml ﻭﻧﺬﻛﺮ ﻫﻨﺎ ﺑﺄﻧﻪ ﻟﻴﺲ ﻟﺪﻳﻨﺎ ﻣﻠـﻒ. ﺍﻟﺸﻴﻔﺮﺓ ﺍﻟﺘﺎﻟﻴﺔsubmit.wmlٍ ﻧﺮﻳﺪ ﺃﻥ ﻳﺘﻀﻤﻦ ﺍﳌﻠﻒ
. ﻭﺳﻨﺘﺮﻙ ﻫﺬﺍ ﺍﻟﺘﻤﺮﻳﻦ ﻟﻚ ﻋﺰﻳﺰﻱ ﺍﻟﻘﺎﺭﺉ،ﻳﺘﻢ ﺗﻮﻟﻴﺪﻩ
ﻓـﺈﺫﺍ ﱂ.php.ini ( ﰲ ﺍﳌﻠـﻒOn) ﻠﺔ ﻣﻔﻌregister_globals ﻛﻤﺎ ﺗﻔﺘﺮﺽ ﺍﻟﺸﻴﻔﺮﺓ ﺍﻟﺘﺎﻟﻴﺔ ﺃﻥ ﺍﳌﻴﺰﺓ
$HTTP_GET_VARS ['$variable'] ﺃﻭ ﺍﺳﺘﺨﺪﺍﻡ ﺍﳌﺘﺤﻮﻝ، ﺳﻴﻜﻮﻥ ﻋﻠﻴﻚ ﺇﻣﺎ ﺗﻔﻌﻴﻠﻬﺎ،ﺗﻜﻦ ﻛﺬﻟﻚ
if (!$name) {
$text = new HAW_text("You must input your name.");
$text->set_br(1);
$link = new HAW_link("Back", "input.wml");
$page->add_text($text);
$page->add_link($link);
$page->create_page();
exit;
}
if (!$email) {
$text = new HAW_text("You must input your email addy.");
$text->set_br(1);
$link = new HAW_link("Back", "input.wml");
$page->add_text($text);
www.raypub.com
raypubsales@gmail.com
25 : PHP Extension Lbraries 1108
$page->add_link($link);
$page->create_page();
exit;
}
if (!$comment) {
$text = new HAW_text("Please tell us what you think!");
$text->set_br(1);
$link = new HAW_link("Back", "input.wml");
$page->add_text($text);
$page->add_link($link);
$page->create_page();
exit;
}
$page->add_text($text);
$page->add_link($link);
$page->create_page();
?>
Image Creation and Manipulating
،ﺎ ﺗﺴﻤﺢ ﺑﺈﻧﺸﺎﺀ ﺣﻴﻮﻱ ﻟﻠﺼﻮﺭ ﻭﺗﻌﺪﻳﻠﻬﺎ ﻣﻔﻴﺪﺓ ﻣﻦ ﻧﺎﺣﻴﺔ ﺃGD ﺗﻌﺘﱪ ﻣﻜﺘﺒﺔ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻟﺼﻮﺭ
.http://www.boutell.com/gd/ ﻭﳝﻜﻨﻚ ﲢﻤﻴﻞ ﻫﺬﻩ ﺍﳌﻜﺘﺒﺔ ﻣﻦ ﺍﳌﻮﻗﻊ.PHP ﻭﺫﻟﻚ ﺍﻋﺘﺒﺎﺭﺍﹰ ﻣﻦ
www.raypub.com
raypubsales@gmail.com
1109 PHP : 25ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ
ﻣﺜﺒﺘﺎﻥ:
ﻳﻌﺘﱪ ﺗﺜﺒﻴﺖ zlibﺳﻬﻼﹰ ﻟﻠﻐﺎﻳﺔ :ﻗﻢ ﺑﺒﺴﺎﻃﺔ ﺑﺘﻜﻮﻳﻨﻪ ﻣﺴﺘﺨﺪﻣﺎﹰ ﺍﻷﻭﺍﻣﺮ ،./configure --shared
ﻟﻠﺘﺤﻘﻖ ﻣﻦ ﺃﻳﺔ ﺗﻐﻴﲑﺍﺕ ﺗﺮﻳﺪ ﺇﺟﺮﺍﺀﻫﺎ ،ﰒ ﻧﻔﺬ ﺍﻷﻣﺮ .make install
ﻟﺘﺜﺒﻴﺖ ﺍﳌﻜﺘﺒﺔ ،LibJPEGﺳﻨﺤﺘﺎﺝ ﺇﱃ ﺗﻨﻔﻴﺬ ﺍﻷﻣﺮ ،/configure --enable-sharedﻭﻣﻦ ﰒ ﺍﻷﻣﺮ
ﳝﻜﻨﻚ ﺇﺿﺎﻓﺔ ﺩﻋﻢ GDﻟﻠﻐﺔ PHPﲟﺠﺮﺩ ﺇﺿﺎﻓﺔ ) --with-gd/usr/local/gdﺃﻭ ﺍﻟﺪﻟﻴﻞ ﺍﻟﺬﻱ ﰎ ﻓﻴـﻪ
ﺗﺜﺒﻴﺖ ﺍﳌﻜﺘﺒﺔ (GDﺇﱃ ﺍﻟﱪﻧﺎﻣﺞ ﺍﻟﻨﺼﻲ ،configureﰒ ﻗﻢ ﺑﺒﻨﺎﺀ ﻭﺗﺜﺒﻴﺖ PHPﺑﺸﻜﻞ ﺍﻋﺘﻴﺎﺩﻱ.
Using GD
GD
ﻳﻌﺘﱪ ﺇﻧﺸﺎﺀ ﺍﻟﺼﻮﺭ ﺩﻳﻨﺎﻣﻴﻜﻴﺎﹰ ﻣﻔﻴﺪﺍﹰ ﻟﻠﻐﺎﻳﺔ .ﻭﳝﻜﻦ ﺇﻧﺸﺎﺀ ﺻﻮﺭ ﺩﻳﻨﺎﻣﻴﻜﻴﺔ ﻟﻠﺘﻬﻨﺌـﺔ ﻋﻠـﻰ ﳒـﺎﺡ
ﺗﺴﺠﻴﻞ ﺩﺧﻮﻝ ﺍﳌﺴﺘﺨﺪﻡ ﺇﱃ ﻧﻈﺎﻣﻚ ،ﻭﺗﻮﻟﻴﺪ ﲣﻄﻴﻄﺎﺕ Pieﺃﻭ ﺭﺳﻮﻣﺎﺕ ﺷﺮﻳﻄﻴﺔ ،ﻭﺣﱴ ﺗﻐـﻴﲑ
ﺣﺠﻢ ﺍﻟﺼﻮﺭﺓ ﺍﻟﱵ ﲢﺘﺎﺝ ﻷﻥ ﻳﻜﻮﻥ ﺣﺠﻢ ﻣﻠﻔﻬﺎ ﺃﺻﻐﺮ.
ﳝﻜﻦ ﲢﻘﻴﻖ ﻣﻌﻈﻢ ﻋﻤﻠﻴﺎﺕ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻟﺼﻮﺭﺓ ﺧﺎﺭﺝ GDﻭ ،PHPﻭﺫﻟﻚ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﺎﺑﻊ
) ( ،passthruﻭﺍﻟﺬﻱ ﻳﻨﻔﺬ ﺑﺮﻧﺎﳎﺎﹰ ﻭﻳﻠﺘﻘﻂ ﺧﺮﺟﺎﹰ ﺛﻨﺎﺋﻴﺎﹰ ﻳﻮﻟﺪﻩ ﻫﺬﺍ ﺍﻟﱪﻧﺎﻣﺞ.
www.raypub.com
raypubsales@gmail.com
25 : PHP Extension Lbraries 1110
ﻗﺒﻞ ﺃﻥ ﻧﺘﻄﺮﻕ ﺇﱃ ﺍﳊﺪﻳﺚ ﻋﻦ ﺍﻟﺘﻮﺍﺑﻊ ﺍﻟﱵ ﺗﻘﺪﻣﻬﺎ ﻣﻜﺘﺒﺔ GDﻛﻼ ﻋﻠﻰ ﺣﺪﺓ ،ﳓﺘﺎﺝ ﺇﱃ ﻓﻬـﻢ
ﺍﳌﻔﺎﻫﻴﻢ ﺍﻷﺳﺎﺳﻴﺔ ﳍﺬﻩ ﺍﳌﻜﺘﺒﺔ.
ﲢﺼﻞ ﻛﻞ ﺻﻮﺭﺓ ﺗﻮﻟﺪ ﺑﻮﺍﺳﻄﺔ PHP/GDﻋﻠﻰ ﻣﻌﺮﻑ ،ﻭﺍﻟﺬﻱ ﻳﻘﺎﺑﻞ ﺍﳌﻌﺮﻓﺎﺕ ﺍﻟﱵ ﺍﻋﺘﺪﻧﺎ ﻋﻠـﻰ
ﺗﻌﻴﻴﻨﻬﺎ ﻋﻨﺪ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﳌﻠﻒ ﻭﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ .ﻋﻨﺪ ﺍﻟﻌﻤﻞ ﻣﻊ ﺍﻟﺼﻮﺭﺓ ،ﳓﺘﺎﺝ ﺇﱃ ﺍﺳﺘﺨﺪﺍﻡ ﻫﺬﺍ
ﺍﳌﺜﻴﻞ )ﺍﳌﻌﺮﻑ( ﻟﻨﺤﺪﺩ ﻟﻠﺘﻮﺍﺑﻊ ﻣﺎ ﻧﺮﻳﺪ ﺍﻟﻌﻤﻞ ﻣﻌﻪ.
ﻧﻘﻮﻡ ﺑﻌﺪ ﺫﻟﻚ ﺑﺘﻌﻴﲔ ﺃﻟﻮﺍﻥ ﻟﻠﺼﻮﺭﺓ ،ﺍﻷﻣﺮ ﺍﻟﺬﻱ ﻳﺘﺤﻘﻖ ﺑﺴﻬﻮﻟﺔ ﻧﺴﺒﻴﺎﹰ ،ﺫﻟﻚ ﺃﻥ GDﻻ ﺗﻄﻠﺐ
ﻣﻨﻚ ﺍﺳﺘﺨﺪﺍﻡ ﻗﻴﻢ ﺳﺖ ﻋﺸﺮﻳﺔ ﻟﺘﻤﺜﻴﻞ ﺍﻷﻟﻮﺍﻥ .ﻭﺑﺪﻻﹰ ﻣﻦ ﺫﻟﻚ ،ﳝﻜﻨﻚ ﺍﺳﺘﺨﺪﺍﻡ ﻗﻴﻢ ﻋﺸـﺮﻳﺔ
ﺗﻘﻊ ﰲ ﺍﺎﻝ ) 0-255ﻻ ﻳﻌﲏ ﻫﺬﺍ ﺃﺑﺪﺍﹰ ﺃﻧﻚ ﻻ ﺗﺴﺘﻄﻴﻊ ﺍﺳﺘﺨﺪﺍﻡ ﻗﻴﻢ ﺳﺖ ﻋﺸﺮﻳﺔ ،ﺑـﻞ ﻋﻠـﻰ
ﺍﻟﻌﻜﺲ ،ﳝﻜﻨﻚ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﺑﺎﻟﺘﻨﺴﻴﻖ 0xhhﺣﻴﺚ ﻳﺮﻣﺰ hﺇﱃ ﻋﺪﺩ ﻣﺮﻣﺰ ﺳﺖ ﻋﺸﺮﻳﺎﹰ( .ﻳﺘﻢ ﺃﻭﻻﹰ
ﺗﻌﻴﲔ ﻟﻮﻥ ﺍﳋﻠﻔﻴﺔ ﻟﻠﺼﻮﺭﺓ.
ﺑﻌﺪ ﺃﻥ ﳓﺪﺩ ﻣﻜﻮﻧﺎﺕ ﺍﻟﺼﻮﺭﺓ ،ﳝﻜﻨﻨﺎ ﺇﻣﺎ ﺣﻔﻆ ﻫﺬﻩ ﺍﻟﺼﻮﺭﺓ ﻛﻤﻠﻒ ) PNGﻻ ﻧﺮﻳﺪ ﺍﺳـﺘﺨﺪﺍﻡ
GIFﺃﺧﺬﺍﹰ ﺑﻌﲔ ﺍﻻﻋﺘﺒﺎﺭ ﻟﻘﻀﺎﻳﺎ ﺍﻻﻣﺘﻴﺎﺯﺍﺕ ﺍﳊﺪﻳﺜﺔ ﺍﳋﺎﺻﺔ ﺬﺍ ﺍﻟﺘﻨﺴـﻴﻖ( ،ﺃﻭ ﺇﺧـﺮﺍﺝ ﺍﳌﻠـﻒ
ﻣﺒﺎﺷﺮﺓ ﻋﻠﻰ ﺍﳌﺴﺘﻌﺮﺽ )ﺑﺎﺳﺘﺨﺪﺍﻡ ﻋﻼﱠﻣﺔ ﺍﻟﺮﺃﺱ ﺍﻟﺼﺤﻴﺤﺔ ﺑﺎﻟﻄﺒﻊ( .ﻭﻧﻘﻮﻡ ﺑﻌﺪ ﺫﻟﻚ ﺑﺘﺤﺮﻳـﺮ
ﺍﳌﻮﺍﺭﺩ ﺇﺛﺮ ﺇﻏﻼﻕ ﺍﻟﺼﻮﺭﺓ.
ﺳﻴﺘﻮﱃ ﺍﳌﺜﺎﻝ ﺍﻟﺘﺎﱄ ﺇﻧﺸﺎﺀ ﺻﻮﺭﺓ ﺫﺍﺕ ﺧﻠﻔﻴﺔ ﲪﺮﺍﺀ ﺍﻟﻠﻮﻥ )ﻳﺴﺘﺨﺪﻡ ﺃﻭﻝ ﻟـﻮﻥ ﻳﺘﻮﺿـﻊ ﻋﻠـﻰ
ﺍﻟﺼﻮﺭﺓ ﻛﻠﻮﻥ ﳋﻠﻔﻴﺘﻬﺎ( ﳋﻂ ﺃﻓﻘﻲ ﺃﺯﺭﻕ ﻋﻠﻰ ﻃﻮﻝ ﺍﻟﺼﻮﺭﺓ:
<?php
//Let the browser know an image is coming its way
;)"header("Content-type: image/png
//We can now draw the line in the image from (0, 125) to
)//(250, 125
;)ImageLine($image, 0, 125, 250, 125, $blue
www.raypub.com
raypubsales@gmail.com
1111 PHP : 25ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ
ﺗﻮﺟﺪ ﻋﺪﺓ ﺗﻮﺍﺑﻊ ﺇﺿﺎﻓﻴﺔ ﻗﺪ ﺗﻜﻮﻥ ﻣﻔﻴﺪﺓ ﰲ ﺍﻟﺸﻴﻔﺮﺓ ﺍﻟﺴﺎﺑﻘﺔ .ﺇﺫ ﻟﻴﺲ ﲟﻘﺪﻭﺭﻙ ﺇﻧﺸﺎﺀ ﺻـﻮﺭﺓ
ﺟﺪﻳﺪﺓ ﻓﺎﺭﻏﺔ ﻓﻘﻂ ،ﺑﻞ ﻭﳝﻜﻨﻚ ﺗﻌﺪﻳﻞ ﺍﻟﺼﻮﺭ ﺍﻟﱵ ﰎ ﺇﻧﺸﺎﺅﻫﺎ ﻣﺴﺒﻘﺎﹰ .ﻭﻧﻘﻮﻡ ﺑﺬﻟﻚ ﺑﺎﺳـﺘﺨﺪﺍﻡ
ﺍﻟﺘﺎﺑﻊ ) ( ،ImageCreateFromPngﻭﺍﻟﺬﻱ ﻳﻌﻴﺪ ﻣﺮﺟﻌﺎﹰ ﺇﱃ ﺍﻟﺼﻮﺭﺓ ﻋﻨﺪ ﺍﻟﻌﺜﻮﺭ ﻋﻠﻴﻬﺎ ،ﻭﻳﻮﻟﺪ ﺭﺳﺎﻟﺔ
ﺧﻄﺄ ﺇﺫﺍ ﱂ ﻳﺘﻤﻜﻦ ﻣﻦ ﺫﻟﻚ .ﺇﺿﺎﻓﺔ ﺇﱃ ﻣﺎ ﺳﺒﻖ ،ﻭﺇﺫﺍ ﻣﺎ ﺃﺭﺩﻧﺎ ﺣﻔﻆ ﺻﻮﺭﺗﻨﺎ ﰲ ﻣﻠﻒ ،ﻓﻴﻤﻜﻨﻨﺎ
ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﺎﺑﻊ ) ( ImagePngﻣﻊ ﺇﺭﻓﺎﻗﻪ ﺑﺴﻠﺴﻠﺔ ﳏﺮﻓﻴﺔ ﺗﻌﱪ ﻋﻦ ﺍﺳﻢ ﺍﳌﻠﻒ:
ImagePng($imageIdent, "image.png")).
ﻛﻤﺎ ﳛﺘﻤﻞ ﺃﻳﻀﺎﹰ ﺃﻧﻨﺎ ﻗﺪ ﻧﺮﻏﺐ ﲟﻌﺮﻓﺔ ﺣﺠﻢ )ﺍﻟﻄﻮﻝ ﻭﺍﻟﻌﺮﺽ( ﺍﻟﺼﻮﺭﺓ ﺍﻟﱵ ﻧﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ .ﻭﳝﻜﻨﻨﺎ
ﲢﻘﻴﻖ ﺫﻟﻚ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﺎﺑﻊ ) ( ،GetImageSizeﻭﺍﻟﺬﻱ ﺳﻴﻌﻴﺪ ﻣﺼﻔﻮﻓﺔ .ﻻﺣﻆ ﺃﻥ ﻫﺬﺍ ﺍﻟﺘﺎﺑﻊ ﻻ
ﳛﺘﺎﺝ ﺇﱃ ﺗﺜﺒﻴﺖ ﻣﻜﺘﺒﺔ GPﻭﻫﻮ ﺃﺻﻴﻞ ﰲ .PHP
ﲢﻮﻱ ﺍﳌﺼﻔﻮﻓﺔ ﺃﺭﺑﻌﺔ ﻋﻨﺎﺻﺮ :ﻋﺮﺽ ﺍﻟﺼﻮﺭﺓ ﻣﻘﺪﺭﺍﹰ ﺑﺎﻟﺒﻜﺴﻞ ،ﻭﻃﻮﳍﺎ ﺑﺎﻟﺒﻜﺴﻞ ﺃﻳﻀﺎﹰ ،ﻭﻋﻠﻤـﹰﺎ
ﻳﺸﲑ ﺇﱃ ﻧﻮﻉ ﻣﻠﻒ ﺍﻟﺼﻮﺭﺓ ) ،PNGﺃﻭ ،JPGﺃﻭ ،(WBMPﻭﺳﻠﺴﻠﺔ ﳏﺮﻓﻴﺔ ﻧﺼﻴﺔ ﲢﻤﻞ ﺍﻟﻌـﺮﺽ
ﻭﺍﻻﺭﺗﻔﺎﻉ )ﺃﻱ ("HEIGHT = imgHeight WIDTH = imgWidth" :ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻣﺒﺎﺷﺮﺓ ﺩﺍﺧﻞ
ﺍﻟﻌﻼﱠﻣﺔ > .<imgﳝﻜﻨﻨﺎ ،ﻣﺘﺴﻠﺤﲔ ﺬﻩ ﺍﳌﻌﺮﻓﺔ ،ﺃﻥ ﻧﻨﺸﺊ ﺗﺎﺑﻌﺎﹰ ﺩﻳﻨﺎﻣﻴﻜﻴﹰﺎ ﻟﺘﻮﻟﻴﺪ ﻋﻼﱠﻣـﺔ ><img
www.raypub.com
raypubsales@gmail.com
25 : PHP Extension Lbraries 1112
ﻋﻠﻴﻨﺎ ﺃﻭﻻﹰ ﺃﻥ ﻧﺒﲔ ﻓﻴﻤﺎ ﺇﺫﺍ ﻛﻨﺎ ﻗﺎﺩﺭﻳﻦ ﻋﻠﻰ ﻓﺘﺢ ﺍﳌﻠﻒ ﻟﻠﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻟﻌﺪﺍﺩ:
{ ))"if (!$filePointer = fopen($fileName, "r+
;)"echo("Error opening file $fileName\n
;exit
}
www.raypub.com
raypubsales@gmail.com
1113 PHP : 25ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ
ﻧﻘﻮﻡ ﺑﻌﺪﻫﺎ ﺑﻜﺘﺎﺑﺔ ﺍﻟﻌﺪﺩ ﺍﳉﺪﻳﺪ ﳌﺮﺍﺕ ﺍﻟﺪﺧﻮﻝ ﰲ ﺍﳌﻠﻒ ،ﻫﺬﺍ ﺇﺫﺍ ﱂ ﻳﻜﻦ ﻫﺬﺍ ﺍﳌﻠـﻒ ﻣﻜﺘﻮﺑـﹰﺎ
ﺑﺎﻟﻔﻌﻞ .ﻭﻧﺴﺘﺨﺪﻡ ﺍﻟﺘﺎﺑﻊ ) ( flockﻟﻨﺘﺄﻛﺪ ﻣﻦ ﺃﻻﱠ ﺗﻘﻮﻡ ﻋﻤﻠﻴﺎﺕ ﺃﺧﺮﻯ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﳌﻠﻒ ﰲ ﻧﻔـﺲ
ﺍﻟﻮﻗﺖ ،ﻭﺫﻟﻚ ﺗﻮﺧﻴﺎﹰ ﻟﻠﺪﻗﺔ:
{ ))if (flock($filePointer, 2
{ )))if (!fwrite($filePointer, $hits, strlen($hits
;)"echo("Couldn't write updated hits to $fileName
;exit
}
}
;)flock($filePointer, 3
ﺃﺧﲑﺍﹰ ،ﻧﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﻋﻼﱠﻣﺔ > <imgﻟﻠﺼﻔﺤﺔ ﺍﳌﺴﺘﺪﻋﺎﺓ .ﻛﻤﺎ ﻭﳒﻌﻠﻬﺎ ﻣﻔﻬﻮﻣﺔ ﻣﻦ ﻗﺒـﻞ ﺗﻠـﻚ
ﺍﳌﺴﺘﻌﺮﺿﺎﺕ ﻏﲑ ﺍﻟﺮﺳﻮﻣﻴﺔ:
;">"\$counter = "<img src=\"$image\" alt=\"Hits: $hits
;return $counter
}
ﳓﺘﺎﺝ ﺍﻵﻥ ﺇﱃ ﺇﻧﺸﺎﺀ ﺗﺎﺑﻊ ﻳﺘﻮﱃ ﺇﻧﺸﺎﺀ ﺻﻮﺭﺓ ﺣﻴﻮﻳﺔ ﻭﺇﻋﺎﺩﺓ ﻣﺴﺎﺭﻫﺎ:
)function makeImage($number
{
ﺳﻮﻑ ﻧﻘﻮﻡ ﺑﺘﻌﻴﲔ ﺑﻌﺾ ﺍﳌﺘﺤﻮﻻﺕ ﻟﺘﺤﺪﻳﺪ ﻃﻮﻝ ﻭﻋﺮﺽ ﺍﻟﺼﻔﺤﺔ ﺍﳊﻴﻮﻳﺔ:
;)$lenHits = strlen($number
;)$charHeight = ImageFontHeight(5
;)$charWidth = ImageFontWidth(5
;$stringWidth = $charWidth * $lenHits
ﺩﻋﻨﺎ ﻧﻀﻴﻒ ﺑﻌﺪ ﺍﻟﺘﻮﺳﻊ ﻷﺑﻌﺎﺩ ﺻﻮﺭﺗﻨﺎ ،ﻭﺑﺬﻟﻚ ﻻ ﺗﺒﺪﻭ ﻫﺬﻩ ﻣﻀﻐﻮﻃﺔ ﻟﻠﻐﺎﻳﺔ:
www.raypub.com
raypubsales@gmail.com
25 : PHP Extension Lbraries 1114
: ﻭﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﻘﻴﻢ ﺍﶈﺴﻮﺑﺔ ﻓﻴﻤﺎ ﺳﺒﻖ،$i ﻑﻧﻘﻮﻡ ﻫﻨﺎ ﺑﺈﻧﺸﺎﺀ ﺻﻮﺭﺗﻨﺎ ﻣﻊ ﺍﳌﻌﺮ
$i = ImageCreate($imgWidth, $imgHeight);
ﻓﺴﻴﻐﺪﻭ ﻟﻮﻥ، ﺃﻭﻻﹰ$white ﺩﻧﺎ ﻭﺣﻴﺚ ﺃﻧﻨﺎ ﺣﺪ.ﳚﺐ ﺗﻌﻴﲔ ﺑﻌﺾ ﺃﲰﺎﺀ ﺍﻷﻟﻮﺍﻥ ﺍﻟﻘﻴﺎﺳﻴﺔ ﻟﺼﻮﺭﺗﻨﺎ
: ﻓﻴﻤﺜﻞ ﻟﻮﻥ ﺍﻟﻨﺺ ﻭﻟﻮﻥ ﺍﻟﻈﻞ ﺍﻟﺴﺎﻗﻂ ﺍﻟﺬﻱ ﺳﻨﻘﻮﻡ ﺑﺈﻧﺸﺎﺋﻪ$black ﺃﻣﺎ.ﺍﳋﻠﻔﻴﺔ ﻟﻠﺼﻮﺭﺓ
$white = ImageColorAllocate($i, 255, 255, 255);
$red = ImageColorAllocate($i, 255, 0, 0);
$black = ImageColorAllocate($i, 0, 0, 0);
( ﻟﻨﺤﺪﺩ ﺍﳌﻨﻄﻘﺔ ﺍﻟﱵmidpoint) ﻧﺴﺘﺨﺪﻡ ﺍﻵﻥ ﻣﻮﺍﺿﻊ ﺗﻘﻊ ﰲ ﻣﻨﺘﺼﻒ ﺍﳌﺴﺎﻓﺔ ﺍﻟﱵ ﺗﻔﺼﻞ ﻧﻘﻄﺘﲔ
:ﺳﻨﺒﺪﺃ ﺍﻟﺮﺳﻢ ﻣﻨﻬﺎ
$textX = $imgMidX - ($stringWidth / 2) + 1;
$textY = $imgMidY - ($charHeight / 2);
1 )ﻭﺍﻟﱵ ﺗﺘﺮﺍﻭﺡ ﻣـﻦGD ﳝﺜﻞ ﺍﻟﺒﺎﺭﺍﻣﺘﺮ ﺍﻟﺜﺎﱐ ﺃﺣﺪ ﺍﳋﻄﻮﻁ ﺍﳌﻀﻤﻨﺔ ﰲ.ﻧﻘﻮﻡ ﺍﻵﻥ ﺑﺮﺳﻢ ﺍﻟﻌﺪﺩ
:(5 ﺣﱴ
ImageString($i, 4, $textX, $textY, $number, $black);
www.raypub.com
raypubsales@gmail.com
1115 PHP : 25ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ
><head
><title>Test Page For Our Counter</title
></head
><body
ﳕﻴﻞ ﺇﱃ ﻭﺿﻊ ﺍﻟﺼﻮﺭﺓ ﰲ ﻣﻠﻒ ،HTMLﻭﰲ ﻣﻮﺿﻊ ﻗﺮﻳﺐ ﻣﻦ ﺃﺳﻔﻞ ﺍﻟﺼﻔﺤﺔ .ﻭﻳﺘﺤﻘﻖ ﺫﻟـﻚ
ﻛﻤﺎ ﻳﻠﻲ )ﻋﻠﻰ ﻓﺮﺽ ﺃﻥ ﻣﻠﻒ ﺗﺴﺠﻴﻞ ﻋﺪﺍﺩﻙ ﻫﻮ :(hitlog.txt
<?php
;)"include("counter.php
;)"!echo("We've had " . hitCount("hitlog.txt") . "visitors
>?
><br
></body
></html
Summary
ﺃﻟﻘﻴﻨﺎ ﺍﻟﻀﻮﺀ ﰲ ﻫﺬﺍ ﺍﻟﻔﺼﻞ ﻋﻠﻰ ﺑﻌﺾ ﻣﻦ ﺍﳌﻜﺘﺒﺎﺕ ﺍﻟﻌﺪﻳﺪﺓ ﺍﻟﱵ ﺗﻘﺪﻡ ﻣﻠﺤﻘﺎﺕ ﻟﻨﻮﺍﺓ ﻟﻐﺔ .PHP
ﻭﻗﺪ ﺗﻌﻠﻤﻨﺎ ﻛﻴﻔﻴﺔ ﺍﺳﺘﺨﺪﺍﻡ PDFlibﻟﺘﻮﻟﻴﺪ ﻣﺴﺘﻨﺪﺍﺕ ،PDFﻭ Mingﻟﺘﻮﻟﻴﺪ ﻣﻠﻔـﺎﺕ Shockwave Flash
ﺣﻴﻮﻳﺔ ،ﻭ HAWHAWﻟﻨﺴﻤﺢ ﳌﺴﺘﺨﺪﻣﻲ ﺍﻷﺟﻬﺰﺓ ﺍﻟﻼﺳﻠﻜﻴﺔ ﲟﺸﺎﻫﺪﺓ ﻣﻮﺍﻗﻌﻨﺎ ،ﻭﻣﻜﺘﺒﺔ GDﻹﻧﺸـﺎﺀ
ﺻﻮﺭ ﺣﻴﻮﻳﺔ .ﻭﳝﻜﻨﻨﺎ ،ﺑﺎﺳﺘﺨﺪﺍﻡ ﻫﺬﻩ ﺍﳌﻜﺘﺒﺎﺕ ﻭﻏﲑﻫﺎ ،ﺗﻠﺒﻴﺔ ﺣﺎﺟﺎﺕ ﺃﻱ ﻣﺴﺘﺨﺪﻡ ﻟﻺﻧﺘﺮﻧـﺖ
ﺗﻘﺮﻳﺒﺎﹰ.
www.raypub.com
raypubsales@gmail.com