You are on page 1of 33

‫‪25‬‬

‫‪PHP‬‬ ‫
 ‬
‫‪PHP Extension Libraries‬‬

‫ﺗﺄﰐ ‪ PHP‬ﻣﻊ ﺃﻛﺜﺮ ﻣﻦ ‪ 75‬ﻣﻠﺤﻘﺎﹰ ﺑﻨﻮﺍ‪‬ﺎ ﻛﻠﻐﺔ‪ .‬ﺗﺴﻤﺢ ﻫﺬﻩ ﺍﳌﻠﺤﻘﺎﺕ ﻟﻠﻤﻄﻮﺭﻳﻦ ﲟﻌﺎﳉﺔ ﻣﻬـﺎﻡ‬
‫ﳐﺘﻠﻔﺔ ﻣﻦ ﻗﺒﻴﻞ ﺇﻧﺸﺎﺀ ﻣﻠﻔﺎﺕ ‪ ،PDF‬ﻭﺍﻟﱪﳎﺔ ﺍﻟﻨﺼﻴﺔ ﻷﻓـﻼﻡ ‪ ،Flash‬ﻭﺇﻧﺸـﺎﺀ ﺗﻄﺒﻴﻘـﺎﺕ ‪WAP‬‬

‫ﻭﺻﻔﺤﺎﺕ ‪ ،WML‬ﻭﺇﻧﺸﺎﺀ ﺍﻟﺼﻮﺭ‪.‬‬


‫ﺑﺪﺃ ﺩﻋﻢ ﺍﳌﻠﺤﻘﺎﺕ ﰲ ‪ PHP‬ﺍﻋﺘﺒﺎﺭﺍﹰ ﻣﻦ ﺍﻹﺻﺪﺍﺭ ‪ ،PHP3‬ﻭﺍﻟﺬﻱ ﰎ ﻓﻴﻪ ﺗـﻮﻓﲑ ﺍﻟـﺪﻋﻢ ﻟﻠﻮﺣـﺪﺓ‬
‫ﺍﻟﻨﻤﻄﻴﺔ ﺍﻟﺪﻳﻨﺎﻣﻴﻜﻴﺔ‪ .‬ﻭﺑﺬﻟﻚ ﺑﺎﺕ ﲟﻘﺪﻭﺭ ﻣﺆﻟﻔﻲ ﺍﻟﻄﺮﻑ ﺍﻟﺜﺎﻟﺚ ﻛﺘﺎﺑﺔ ﻣﻠﺤﻘﺎﺕ ‪ ،PHP‬ﻭﺫﻟـﻚ‬
‫ﻭﺻﻮﻻﹰ ﺇﱃ ﲢﻘﻴﻖ ﻭﻇﺎﺋﻒ ﺇﺿﺎﻓﻴﺔ ﰲ ﺑﺮﺍﳎﻬﻢ‪.‬‬
‫ﻳﻌﺘﱪ ‪) PHP Base Library‬ﻭﺗﻌﺮﻑ ﺃﻳﻀﺎﹰ ﺑﺎﻻﺳﻢ ‪ (PHPLIB‬ﻭﺍﺣﺪﺍﹰ ﻣﻦ ﺍﳌﻠﺤﻘﺎﺕ ﺍﻷﻭﱃ ﺍﻟـﱵ ﺍﻧﺘﺸـﺮﺕ‬
‫ﺑﺸﻜﻞ ﻛﺒﲑ‪ .‬ﻻ ﻳﺰﺍﻝ ‪ ،PHPLIB‬ﺭﻏﻢ ﺃﻧﻪ ﻛﺘﺐ ﻣﻦ ﺃﺟﻞ ‪ ،PHP3‬ﻳﺸﻤﻞ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻟﺘﻮﺍﺑﻊ ﺍﳌﻔﻴﺪﺓ‬
‫ﳌﻌﺎﳉﺔ ﺟﻠﺴﺎﺕ ﺍﻟﻌﻤﻞ )‪ ،(sessions‬ﻭﻫﻮ ﻣﺘﺎﺡ ﻋﻠﻰ ﺍﳌﻮﻗﻊ ‪ .http://phplib.netuse.de/‬ﻻﺣﻆ ﺃﻥ‬
‫‪ PHPLIB‬ﻟﻴﺲ ﻣﻜﺘﺒﺔ ﻣﻠﺤﻘﺎﺕ ﲝﺪ ﺫﺍﺗﻪ‪ ،‬ﻭﻟﻜﻨﻪ ﳎﻤﻮﻋﺔ ﻣﻦ ﺑﺮﺍﻣﺞ ‪ PHP‬ﺍﻟﻨﺼﻴﺔ ﺍﻟﱵ ‪‬ﺪﻑ ﺇﱃ‬
‫ﺗﻮﺳﻴﻊ ﻭﻇﺎﺋﻒ ‪.PHP 3‬‬
‫ﻳﻌﺘﱪ ‪ PHP-GTK‬ﻣﻜﺘﺒﺔ ﺟﺪﻳﺪﺓ‪ ،‬ﻭﺍﻟﻘﺼﺪ ﻣﻨﻬﺎ ﺗﻘﺪﱘ ﻭﻇﺎﺋﻒ ﻟﻠﻐﺔ ‪ PHP‬ﺧﺎﺭﺝ ﻣﻨﺎﺥ ﺍﻟﻮﻳﺐ‪ ،‬ﻭﻫﻮ‬
‫ﻣﺘﺎﺡ ﺣﺎﻟﻴﺎﹰ ﻋﻠﻰ ﺍﳌﻮﻗﻊ ‪ .http://www.php.net/‬ﳛﻘﻖ ﻫﺬﺍ ﺍﳌﻠﺤﻖ ﺍﻟﺮﺑﻂ ﺍﻟﻠﻐﻮﻱ ﻣﻊ ‪ ،GTK+‬ﳑـﺎ‬
‫ﻳﺴﻤﺢ ﺑﺘﺤﻘﻴﻖ ﻭﺍﺟﻬﺔ ﻛﺎﺋﻨﻴﺔ ﺍﻟﺘﻮﺟﻪ ﻟﺘﻮﺍﺑﻊ ﻭﺃﺻﻨﺎﻑ ‪ .GTK+‬ﻳﺴﻤﺢ ﺫﻟﻚ ﻟﻠﻤـﱪﳎﲔ ﺑﻜﺘﺎﺑـﺔ‬
‫ﺗﻄﺒﻴﻘﺎﺕ ‪ GUI‬ﻣﺴﺘﻘﻠﺔ ﻋﻦ ﺍﳌﻨﺼﺔ‪ .‬ﻻﺣﻆ ﺃﻥ ﺍﻷﺩﺍﺓ ‪ GTK+‬ﻻ ‪‬ﺪﻑ ﺇﱃ ﺍﻟﺘﻌﺎﻣـﻞ ﻣـﻊ ﺑﻴﺌـﺔ‬
‫ﺍﻹﻧﺘﺮﻧﺖ‪ ،‬ﻭﻫﻲ ﻣﻮﺟﻬﺔ ﺇﱃ ﺇﻧﺸﺎﺀ ﺗﻄﺒﻴﻘﺎﺕ ﻗﺎﺋﻤﺔ ﲝﺪ ﺫﺍ‪‬ﺎ‪.‬‬
‫ﻗﺪ ﻳﺒﺪﻭ ﺍﺳﺘﺨﺪﺍﻡ ﺍﳌﻜﺘﺒﺎﺕ ﻣﻊ ‪ PHP‬ﻣﻀﻨﻴﺎﹰ ﺃﺣﻴﺎﻧﺎﹰ‪ .‬ﻭﻋﺎﺩﺓ ﻣﺎ ﺗﻜﻮﻥ ﺍﻟـﱪﺍﻣﺞ ﺍﻟـﱵ ﺗﺴـﺘﺨﺪﻡ‬
‫ﺍﳌﻠﺤﻘﺎﺕ ﻣﻜﻮﻧﺔ ﻣﻦ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻻﺳﺘﺪﻋﺎﺀﺍﺕ ﻟﻠﺘﻮﺍﺑﻊ‪ ،‬ﻭﺫﻟﻚ ﺑﻐﻴﺔ ﺃﺩﺍﺀ ﻣﻬﻤﺔ ﺑﺴﻴﻄﺔ ﻛﺘﻮﻟﻴﺪ ﻧﺺ‬

‫‪www.raypub.com‬‬
‫‪raypubsales@gmail.com‬‬
‫‪25 : PHP Extension Lbraries‬‬ ‫‪1084‬‬

‫ﺃﻭ ﻋﺮﺽ ﺻﻮﺭﺓ‪ .‬ﺑﻜﻞ ﺍﻷﺣﻮﺍﻝ‪ ،‬ﺗﺬﻛﺮ ﺩﺍﺋﻤﺎﹰ ﺃﻥ ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ ‪ PHP‬ﺗﻮﻓﺮ ﻃﺮﻗـﺎﹰ ﺭﺍﺋﻌـﺔ‬
‫ﻟﺘﺤﻘﻴﻖ ﻣﻬﺎﻡ ﻗﺪ ﺗﻜﻮﻥ ﻣﺴﺘﺤﻠﻴﺔ ﻋﻨﺪ ﺍﺳﺘﺨﺪﺍﻡ ‪ PHP‬ﲟﻔﺮﺩﻫﺎ‪.‬‬

‫‪The PDF Library‬‬ ‫‪PDF‬‬ ‫‬


‫ﺗﻌﺘﱪ ﺍﳌﻜﺘﺒﺔ ﺍ‪‬ﺎﻧﻴﺔ ‪ PDFlib‬ﻣﻔﻴﺪﺓ ﻟﻠﻐﺎﻳﺔ‪ ،‬ﺫﻟﻚ ﺃ‪‬ﺎ ﺗﺴﻤﺢ ﺑﺈﻧﺸﺎﺀ ﻭﺗﻌﺪﻳﻞ ﻣﺴﺘﻨﺪﺍﺕ ‪) PDF‬ﲤﺜـﻞ‬
‫ﻣﺴﺘﻨﺪﺍﺕ ‪ PDF‬ﳏﺎﻭﻟﺔ ‪ Adobe‬ﻟﺘﻮﻓﲑ ﺗﻨﺴﻴﻖ ﻣﺴﺘﻨﺪ ﻗﻴﺎﺳﻲ ﺫﻱ ﻧﻮﻋﻴﺔ ﻋﺎﻟﻴﺔ(‪ .‬ﺇﺿﺎﻓﺔ ﺇﱃ ﺫﻟـﻚ‪،‬‬
‫ﻭﺣﻴﺚ ﺃﻥ ﻫﺬﻩ ﺍﻟﻄﺮﻳﻘﺔ ﻹﻧﺸﺎﺀ ﻣﻠﻔﺎﺕ ‪ PDF‬ﳎﺎﻧﻴﺔ‪ ،‬ﻓﻬﻲ ﺍﻟﻄﺮﻳﻘﺔ ﺍﻷﻓﻀﻞ ﻟﺬﻟﻚ‪.‬‬

‫‪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‬ﻭﳝﻜﻨﻚ ﺍﻟﺘﺄﻛﺪ ﻣﻦ ﺫﻟﻚ‬ ‫‬

‫ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﺎﺑﻊ ) (‪ .phpinfo‬ﻓﺈﺫﺍ ﻣﺎ ﺷﺎﻫﺪﺕ ﺳﻄﺮﺍﹰ ﰲ ﺑﺮﻧﺎﻣﺞ ﺍﻟﺘﻜﻮﻳﻦ ﺍﻟﻨﺼﻲ ﻳﺘﻀﻤﻦ‬


‫‪ ،--with-pdflib=yes‬ﺃﻭ >‪ ،--with-pdflib=<dir‬ﻓﺴﺘﺤﺘﺎﺝ ﺇﱃ ﺇﻋﺎﺩﺓ ﺗﺮﲨﺔ ‪ PHP‬ﻭﻓﻘﺎﹰ ﳋﻴﺎﺭ‬
‫ﺍﻟﺘﻜﻮﻳﻦ ‪.--with-pdflib=no‬‬

‫‪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‬ﻭﻣﻦ ﰒ ﺗﺸﻐﻴﻞ‬ ‫‬

‫ﺍﻷﻣﺮﻳﻦ ‪ make‬ﻭ ‪.make install‬‬


‫ﻧﺴﺦ ﻣﻠﻔﺎﺕ ‪ PDFlib‬ﺍﳋﺎﺻﺔ ﺑﺎﻟﻠﻐﺔ ‪ PHP‬ﺿﻤﻦ ﺷﺠﺮﺓ ﻣﺼﺪﺭ ‪ PHP‬ﻣﻊ‪:‬‬ ‫‬
‫"‪"cp<pdflib_directory>/bind/php/ext/pdf/* <php_directory>/ext/pdf‬‬

‫ﻋﻨﺪ ﺇﻋﺎﺩﺓ ﺑﻨﺎﺀ ‪ PHP‬ﻣﻊ ﺍﳌﻠﺤﻖ ‪ PDFlib‬ﻣﺼﺪﺭﻱ ﺍﻟﺸﻜﻞ‪ ،‬ﻗﻢ ﺑﺘﻜﻮﻳﻦ ‪ PHP‬ﻣﻊ‬ ‫‬

‫]>‪ ،--with–pbflib [=<pdflib_installation_directory‬ﺣﻴﺚ ﺳﻴﻜﻮﻥ ﺩﻟﻴﻞ ﺍﻟﺘﺜﺒﻴﺖ ﻣﻜﺎﻓﺊ‬


‫‪ /usr/lib/‬ﻋﻠﻰ ﻧﻈﺎﻡ ﺍﻟﺘﺸﻐﻴﻞ ﻟﺪﻳﻚ‪ .‬ﻭﻓﻴﻤﺎ ﻋﺪﺍ ﺫﻟﻚ‪ ،‬ﻗﻢ ﺑﺘﻜﻮﻳﻦ ‪ PHP‬ﻣﻊ‪:‬‬
‫‪--with-pdflib=<pdflip_directory>/bind/c‬‬

‫ﺃﻋﺪ ﺑﻨﺎﺀ ‪ PHP‬ﻛﺎﻟﻌﺎﺩﺓ‪ ،make :‬ﰒ ‪.make install‬‬ ‫‬

‫‪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‬‬

‫ﻣﻊ ﺑﺎﻗﻲ ﺍﳌﻌﻠﻮﻣﺎﺕ ﺍﳌﻀﻤﻨﺔ ﰲ ﺍﻟﺼﻔﺤﺔ‪:‬‬


‫;)"‪header("Content-type: application/pdf‬‬
‫;)"‪header("Content-Length: $pdfLen‬‬
‫;)"‪header("Content-Disposition: inline; filename=phpMade.pdf‬‬

‫‪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‬‬

‫( ‪CREATE TABLE manual.entries‬‬


‫‪id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,‬‬
‫‪topic VARCHAR(100) NOT NULL UNIQUE,‬‬
‫‪content BLOB NOT NULL‬‬
‫;)‬

‫ﺩﻋﻨﺎ ﺍﻵﻥ ﻧﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﺑﺮﻧﺎﻣﺞ ﻧﺼﻲ ﺑﺴﻴﻂ‪ ،‬ﻭﺍﻟﺬﻱ ﳝﻜﻨﻨﺎ ﻣﻦ ﺧﻼﻟﻪ ﺇﺿﺎﻓﺔ ﺇﺩﺧﺎﻻﺕ ﺇﱃ ﻗﺎﻋﺪﺓ‬
‫ﺍﻟﺒﻴﺎﻧﺎﺕ‪:‬‬
‫‪<?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

//Create a new PDF object and "open" it as inline


$pdfFile = pdf_new();
pdf_open_file($pdfFile, "");

//Set miscellaneous information


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");

:‫ﻧﻘﻮﻡ ﺃﻭﻻﹰ ﺑﺎﳊﺼﻮﻝ ﻋﻠﻰ ﺍﻹﺩﺧﺎﻻﺕ ﻣﻦ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ‬


$entries = mysql("manual", "SELECT * FROM entries");

:‫ ﻻﺳﺘﺨﻼﺹ ﺍﳌﻌﻠﻮﻣﺎﺕ ﺍﳋﺎﺻﺔ ﺑﻜﻞ ﺇﺩﺧﺎﻝ‬for ‫ﰒ ﻧﻘﻮﻡ ﺑﺈﻋﺪﺍﺩ ﺣﻠﻘﺔ‬


for($index = 0; $index < mysql_num_rows($entries); $index++) {

//Grab information for the current row


$entry = mysql_fetch_array($entries);

www.raypub.com
raypubsales@gmail.com
25 : PHP Extension Lbraries 1090

//Start a new page


pdf_begin_page($pdfFile, 595, 842);

//Add a bookmark with the name of the entry topic


pdf_add_bookmark($pdfFile, $entry['topic']);

//Set the font to 9 point Arial or give an error message


if ($font = pdf_findfont($pdfFile, "Arial", "winansi", 1)) {
PDF_setfont($pdfFile, $font, 9);
} else {
echo("Font Not Found.");

pdf_end_page($pdfFile);
pdf_close($pdfFile);
pdf_delete($pdfFile);

exit;
}

:‫ﻧﻘﻮﻡ ﻫﻨﺎ ﺑﺈﺧﺮﺍﺝ ﺍﶈﺘﻮﻯ ﺍﻋﺘﺒﺎﺭﺍﹰ ﻣﻦ ﻗﺎﻋﺪﺓ ﺍﻟﺒﻴﺎﻧﺎﺕ ﻟﻴﺘﻮﺿﻊ ﰲ ﻧﻘﻄﺔ ﳏﺪﺩﺓ‬
pdf_show_xy($pdfFile, $entry['content'], 50, 780);

‫ ﻭﺑﺬﻟﻚ ﻧﺴﺘﻄﻴﻊ ﺑﺪﺀ ﺻﻔﺤﺔ ﺟﺪﻳﺪﺓ ﻋﻨﺪﻣﺎ ﻧـﺪﺧﻞ ﺍﳊﻠﻘـﺔ‬،‫ﺳﻮﻑ ﻧﻨﻬﻲ ﺍﻟﺼﻔﺤﺔ ﺩﺍﺧﻞ ﺍﳊﻠﻘﺔ‬
:‫ﺩﺍﹰ‬‫ﳎﺪ‬
pdf_end_page($pdfFile);
}

:‫ ﺍﻟﻘﻴﺎﺳﻴﺔ‬PDF ‫ﻳﺘﻢ ﺑﻨﺎﺀ ﺍﳉﺰﺀ ﺍﻷﺧﲑ ﺍﻋﺘﻤﺎﺩﺍﹰ ﻋﻠﻰ ﺍﳌﺰﻳﺪ ﻣﻦ ﺗﻮﺍﺑﻊ‬


//Close the $pdfFile
pdf_close($pdfFile);

//Get ready to output


$pdf = pdf_get_buffer($pdfFile);
$pdfLen = strlen($pdf);

//Send relevant headers


header("Content-type: application/pdf");
header("Content-Length: $pdfLen");
header("Content-Disposition: inline; filename=phpMade.pdf");

//Send the info to the browser


print($pdf);

www.raypub.com
raypubsales@gmail.com
‫‪1091‬‬ ‫‪PHP‬‬ ‫‪ : 25‬ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ‬

‫‪//Get rid of the object.‬‬


‫;)‪pdf_delete($pdfFile‬‬
‫>?‬

‫‪Macromedia Flash‬‬ ‫‪Macromedia Flash‬‬ ‫


 ‬
‫ﻻﺑﺪ ﻭﺃﻥ ﻳﻜﻮﻥ ﻛﻞ ﻣﻨﺎ ﻗﺪ ﺷﺎﻫﺪ ﻗﻄﻌﺎﹰ ﻣﻦ ﺍﶈﺘﻮﻯ ﺍﳉﻤﻴﻞ ﺍﻟﺬﻱ ﻳﻨﺘﺠﻪ ﺍﻟﱪﻧﺎﻣﺞ ‪ Flash‬ﻣﻦ ﺷﺮﻛﺔ‬
‫‪ .Macromedia‬ﻟﻘﺪ ﻗﺎﻣﺖ ﻫﺬﻩ ﺍﻟﺸﺮﻛﺔ ﺑﺈﻧﺸﺎﺀ ﺗﻨﺴﻴﻖ ﺍﳌﻠﻒ ‪ .swf‬ﺍﳋﺎﺹ ‪‬ﺎ )ﻭﻫـﻮ ﺍﺧﺘﺼـﺎﺭ‬
‫ﻟﻠﻌﺒﺎﺭﺓ ‪ (Shockwave Flash files‬ﺫﻱ ﺍﳌﺼﺪﺭ ﺍﳌﻔﺘﻮﺡ‪ .‬ﻭﻗﺪ ﺟﻌﻠﺖ ﺍﻟﻄﺒﻴﻌﺔ ﺍﳌﻔﺘﻮﺣﺔ ﳍﺬﺍ ﺍﻟﺘﻨﺴـﻴﻖ‬
‫ﻣﻦ ﺍﳌﻤﻜﻦ ﺗﻄﻮﻳﺮ ﻣﻜﺘﺒﺎﺕ ﺗﺴﻤﺢ ﻟﻨﺎ ﺑﺘﺤﺮﻳﺮ ﳏﺘﻮﻯ ‪ Shockwave Flash‬ﻧﺼﻴﺎﹰ‪.‬‬

‫‪Ming vs.LibSWF‬‬ ‫‪LibSWF  Ming‬‬


‫ﺗﻮﺟﺪ ﻣﻜﺘﺒﺘﺎﻥ ﻣﻮﺟﻬﺘﺎﻥ ﻣﻦ ﺃﺟﻞ ‪ ،PHP‬ﻭﺫﻟﻚ ﻟﻠﺴﻤﺎﺡ ﺑﺈﻧﺸﺎﺀ ﻣﻠﻔـﺎﺕ ‪ ،Shockwave‬ﻭﳘـﺎ‪:‬‬
‫‪ Ming‬ﻭ‪ .LibSWF‬ﺳﻮﻑ ﻧﺘﻌﻠﻢ ﰲ ﻫﺬﺍ ﺍﻟﻔﺼﻞ ﻣﺎ ﳜﺺ ﺍﳌﻜﺘﺒﺔ ‪ ،Ming‬ﺫﻟﻚ ﺃ‪‬ﺎ ﺗﺘﻢ ﲟﺰﺍﻳﺎ ﻋﺪﻳﺪﺓ‬
‫ﲡﻌﻠﻬﺎ ﺗﺘﻔﻮﻕ ﻋﻠﻰ ‪ .LibSWF‬ﻓﻬﻲ ﻣﺜﻼﹰ ﻣﻔﺘﻮﺣﺔ ﺍﳌﺼﺪﺭ‪ ،‬ﻓﻴﻤﺎ ﻟﻴﺴﺖ ‪ LibSWF‬ﻛﺬﻟﻚ‪ ،‬ﻭﺍﻟﱵ ﻟﻦ‬
‫ﲣﻀﻊ ﻟﻠﻤﺰﻳﺪ ﻣﻦ ﺍﻟﺘﻄﻮﺭ‪ .‬ﺗﺪﻋﻢ ‪ Ming‬ﻣﻌﻈﻢ ﻣﺰﺍﻳﺎ ‪) Flash 4‬ﰎ ﺩﻣﺞ ﻣﺰﺍﻳﺎ ‪،Flash 5 ActionScript‬‬
‫ﻭﻫﻲ ﺣﺎﻟﻴﺎﹰ ﰲ ﺍﻟﻮﺿﻊ ‪ ،(CVS‬ﲟﺎ ﰲ ﺫﻟﻚ ﺍﻟﺘﺪﺭﺟﺎﺕ‪ ،‬ﻭﺍﻷﺷﻜﺎﻝ‪ ،‬ﻭﺍﻟﺼﻮﺭ ﺍﻟﻨﻘﻄﻴـﺔ‪ ،‬ﻭﺍﻷﺯﺭﺍﺭ‪،‬‬
‫ﻭﺍﻟﺪﻓﻖ ﺍﻟﺼﻮﰐ ‪ ،mp3‬ﻭﻏﲑﻫﺎ…‬
‫ﺗﺘﻮﻓﺮ ‪ Ming‬ﳎﺎﻧﻴﺔ ﻋﻠﻰ ﺍﳌﻮﻗﻊ ‪ .http://www.opaque.net/ming/‬ﺇﺫﺍ ﻗﻤﺖ ﺑﺘﺤﻤﻴـﻞ ‪ PHP‬ﻋﻠـﻰ‬
‫‪ ،Windows‬ﻓﻘﺪ ﻳﻜﻮﻥ ﻟﺪﻳﻚ ﺑﺎﻟﻔﻌﻞ ﺍﻟﻮﺣﺪﺓ ﺍﻟﻨﻤﻄﻴﺔ ‪ Ming‬ﰲ ﺩﻟﻴﻞ ﻣﻠﺤﻘﺎﺕ ‪ ،PHP‬ﻟﻜﻦ‪ ‬ﻣـﻦ‬
‫ﺍﳊﻜﻤﺔ ﺃﻥ ﺗﻘﻮﻡ ﺑﺘﺜﺒﻴﺖ ﺃﺣﺪﺙ ﺇﺻﺪﺍﺭ )ﺫﻟﻚ ﺃﻥ ﺍﻹﺻﺪﺍﺭ ﺍﻟﻘﺪﱘ ﻗﺪ ﻻ ﻳﻌﻤﻞ ﺑﺸﻜﻞ ﺻـﺤﻴﺢ‬
‫ﺣﺎﻟﻴﺎﹰ(‪ .‬ﻭﺇﺫﺍ ﻛﻨﺖ ﺗﺴﺘﺨﺪﻡ ﻧﻈﺎﻡ ‪ ،UNIX‬ﻓﻠﺪﻳﻚ ﻃﺮﻳﻘﺘﺎﻥ ﻟﺒﻨﺎﺀ ‪ Ming‬ﻣﻦ ﺃﺟﻞ ‪ :PHP‬ﻛﻤﻠﺤـﻖ‬
‫ﻟﻠﻐﺔ ‪ ،PHP‬ﻭﻻ ﺗﺘﺠﺎﻭﺯ ﺻﻌﻮﺑﺔ ﺑﻨﺎﺀ ‪ Ming‬ﺻﻌﻮﺑﺔ ﺗﺜﺒﻴﺖ ‪ ،PDFlib‬ﻛﻤﺎ ﻭﺗﺘـﻮﻓﺮ ‪ Ming‬ﻛﻮﺣـﺪﺓ‬
‫ﳕﻄﻴﺔ ﻣﺴﺒﻘﺔ ﺍﻟﺒﻨﺎﺀ‪ ،‬ﻭﺫﻟﻚ ﻋﻠﻰ ﺍﳌﻮﻗﻊ ﺍﻟﺬﻱ ﺃﺷﺮﻧﺎ ﺇﻟﻴﻪ ﻓﻴﻤﺎ ﺳﺒﻖ‪ .‬ﳝﻜﻨﻚ ﺇﺿﺎﻓﺔ ‪ Ming‬ﺇﱃ ﺍﳌﻠﻒ‬
‫‪ ،php.ini‬ﺃﻭ ﲤﺮﻳﺮﻫﺎ ﺇﱃ ﺍﻟﺘﺎﺑﻊ ) (‪ ،dl‬ﺃﻭ ﺑﻨﺎﺀﻫﺎ ﻛﻮﺣﺪﺓ ﳕﻄﻴﺔ ﺑﺎﺗﺒﺎﻉ ﺍﳋﻄﻮﺍﺕ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬
‫ﻗﻢ ﺑﺘﺤﻤﻴﻞ ﻭﻓﺮﺩ ﻣﺼﺪﺭ ‪ Ming‬ﰲ ﺍﻟﺪﻟﻴﻞ >‪.<ming_directory‬‬ ‫‬

‫‪ make‬ﰲ ﺍﻟﺪﻟﻴﻞ >‪.<ming_directory‬‬ ‫‪static‬‬ ‫ﻧﻔﺬ ﺍﻷﻣﺮ‬ ‫‬

‫ﺍﻧﺘﻘﻞ ﺇﱃ ﺍﻟﺪﻟﻴﻞ ‪.<ming_directry>/php_ext/‬‬ ‫‬

‫‪.make‬‬ ‫‪php_ming.so‬‬ ‫ﻧﻔﺬ ﺍﻷﻣﺮ‬ ‫‬

‫‪www.raypub.com‬‬
‫‪raypubsales@gmail.com‬‬
‫‪25 : PHP Extension Lbraries‬‬ ‫‪1092‬‬

‫ﺃﻣﺎ ﻟﺒﻨﺎﺀ ‪ Ming‬ﺿﻤﻦ ‪ ،PHP‬ﻓﺎﺗﺒﻊ ﺍﳋﻄﻮﺍﺕ ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬


‫ﻗﻢ ﺑﺘﺤﻤﻴﻞ ﻭﻓﺮﺩ ﻣﺼﺪﺭ ‪ Ming‬ﰲ ﺍﻟﺪﻟﻴﻞ >‪.<ming_directory‬‬ ‫‬

‫ﻧﻔﺬ ﺍﻷﻣﺮ ‪.mdkir <php_directory>/ext/ming/‬‬ ‫‬

‫ﻧﻔﺬ ﺍﻷﻣﺮ ‪.cd php_ext/* <php_directory>/ext/ming/‬‬ ‫‬

‫ﻧﻔﺬ ﺍﻷﻣﺮ ‪.cd <php_directory>/‬‬ ‫‬

‫ﻧﻔﺬ ﺍﻷﻣﺮ ‪../buildconf/‬‬ ‫‬

‫ﻧﻔﺬ ﺍﻷﻣﺮ >‪../configure --with-ming <other configuration options‬‬ ‫‬

‫ﻗﻢ ﺑﺒﻨﺎﺀ ﺗﺜﺒﻴﺖ ‪ PHP‬ﻛﺎﻟﻌﺎﺩﺓ‪ ،make :‬ﰒ ‪.make install‬‬ ‫‬

‫ﺃﻋﺪ ﺗﺸﻐﻴﻞ ﻣﻠﻘﻢ ﺍﻟﻮﻳﺐ ﺍﳋﺎﺹ ﺑﻚ‪.‬‬ ‫‬

‫‪Using Ming‬‬ ‫ 
 ‪Ming‬‬
‫ﺳﻮﻑ ﻧﺘﻌﻠﻢ ﺍﻵﻥ ﻛﻴﻔﻴﺔ ﺑﻨﺎﺀ ﳕﺎﺫﺝ ﺣﺮﻛﻴﺔ )‪ (animations‬ﺑﺴﻴﻄﺔ ﰲ ‪ ،Flash‬ﻭﺫﻟـﻚ ﺑﺎﺳـﺘﺨﺪﺍﻡ‬
‫ﺍﳌﻜﺘﺒﺔ ‪ .Ming‬ﲢﺘﺎﺝ ﺍﻟﻜﺎﺋﻨﺎﺕ )ﺃﻭ ﺍﻷﺷﻜﺎﻝ( ﰲ ‪ Flash‬ﺇﱃ ﻗﻄﻌﺔ ﺭﺳﻢ ﻗﻤﺎﺷﻴﺔ )‪ (canvas‬ﻟﺘﻌﺮﺽ‬
‫ﻋﻠﻴﻬﺎ‪ .‬ﺗﺪﻋﻮ ‪ Ming‬ﻫﺬﻩ ﺍﻟﻘﻄﻌﺔ ﺑﺎﻻﺳﻢ ‪ ،SWFMovie‬ﻭﺍﻟﱵ ﺗﺘﻤﺘﻊ ﺑﻌﺪﺓ ﺧﺼﺎﺋﺺ ﻋﺎﺩﺓ ﻣﺎ ﲤﻴﻞ ﺇﱃ‬
‫ﺇﻋﺪﺍﺩﻫﺎ ﻛﻠﻤﺎ ﺃﻧﺸﺄﺕ ﻓﻴﻠﻤﺎﹰ ﺟﺪﻳﺪﺍﹰ‪ ،‬ﻭﻣﻨﻬﺎ‪ :‬ﻟﻮﻥ ﺍﳋﻠﻔﻴﺔ‪ ،‬ﻭﺃﺑﻌﺎﺩ ﺍﻟﻔﻴﻠﻢ‪ ،‬ﻭﻣﻌﺪ‪‬ﻝ ﺍﻹﻃﺎﺭﺍﺕ )‪.(frame‬‬
‫ﻳﺘﻢ ﺍﺷﺘﻘﺎﻕ ﺍﻟﺼﻨﻒ ‪ SWFMovie‬ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫)(‪$movie = new SWFMovie‬‬

‫ﻟﻨﻔﺮﺽ ﺃﻧﻨﺎ ﺃﻧﺸﺄﻧﺎ ﺍﻟﻔﻴﻠﻢ ﻛﻤﺘﺤﻮﻝ ‪ ،$movie‬ﳝﻜﻨﻨﺎ ﺇﺫﻥ ﺗﻌﻴﲔ ﻟﻮﻥ ﺍﳋﻠﻔﻴﺔ ﻛﺎﻟﺘﺎﱄ‪:‬‬
‫;)‪$movie->setBackground(0, 0x44, 0x95‬‬

‫ﻛﻤﺎ ﻧﻘﻮﻡ ﺑﺘﻌﻴﲔ ﺍﻷﺑﻌﺎﺩ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬


‫;)‪$movie->setDimension(320, 240‬‬

‫ﻭﺃﺧﲑﺍﹰ‪ ،‬ﻧﻌﲔ ﻣﻌﺪ‪‬ﻝ ﺍﻹﻃﺎﺭﺍﺕ‪:‬‬


‫;)‪$movie->setRate(12.0‬‬

‫‪www.raypub.com‬‬
‫‪raypubsales@gmail.com‬‬
‫‪1093‬‬ ‫‪PHP‬‬ ‫‪ : 25‬ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ‬

‫ﻣﻦ ﺍﳌﻬﻢ ﺃﻥ ﺗﺘﺬﻛﺮ ﺃﻧﻚ ﺇﺫﺍ ﻣﺎ ﻋﻴﻨﺖ ﺃﺑﻌﺎﺩ ﻓﻴﻠﻤﻚ ﻋﻠﻰ ﺍﻟﻘﻴﻤﺔ ‪ ،640 × 480‬ﻭﺩﳎﺖ ﺍﻟﻔـﻴﻠﻢ ﰲ‬
‫‪ HTML‬ﺑﺎﳊﺠﻢ ‪ ،320×240‬ﻓﺴﻴﺘﻢ ﺍﺧﺘﺰﺍﻝ ﺣﺠﻢ ﲨﻴﻊ ﻛﺎﺋﻨﺎﺗﻚ ﺇﱃ ﻧﺼـﻒ ﺍﳊﺠـﻢ ﺍﻟـﺬﻱ ﰎ‬
‫ﺇﻧﺸﺎﺅﻫﺎ ﻋﻠﻴﻪ )ﻭﻋﻠﻰ ﺍﻟﺮﻏﻢ ﻣﻦ ﺃﻥ ﺍﻟﻔﻦ ﺍﻟﺸﻌﺎﻋﻲ ﻳﻬﺪﻑ ﺇﱃ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﺃﻗﻞ ﺧﺴﺎﺭﺓ ﺟـﺮ‪‬ﺍﺀ‬
‫ﺗﻐﲑ ﺍﳊﺠﻢ‪ ،‬ﺇﻻ ﺃﻧﻪ ﺗﻮﺟﺪ ﺣﺘﻤﺎﹰ ﺑﻌﺾ ﺍﳌﻨﺎﻃﻖ ﺫﺍﺕ ﺍﳉﻮﺩﺓ ﺍﳌﻨﺨﻔﻀﺔ(‪.‬‬
‫ﺗﺘﻢ ﺇﺿﺎﻓﺔ ﺍﻷﺷﻜﺎﻝ ﺇﱃ ﺍﻟﻔﻴﻠﻢ ﺑﺴﻬﻮﻟﺔ‪:‬‬
‫;)‪$movie->add($shape‬‬

‫ﻛﻤﺎ ﺃﻥ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻋﺪﺓ ﺇﻃﺎﺭﺍﺕ ﰲ ﺍﻟﻔﻴﻠﻢ ﺑﺴﻴﻂ ﺃﻳﻀﺎﹰ‪:‬‬


‫)(‪$movie->nextframe‬‬

‫ﻧﻈﺮﺍﹰ ﻷﻧﻪ ﻳﺘﻢ ﺇﻧﺸﺎﺀ ﺍﻷﺷﻜﺎﻝ ﻛﻤﺜﻴﻼﺕ )ﻛﻤﺎ ﺳﻨﺮﻯ ﰲ ﺍﳌﻘﻄﻊ ﺍﻟﺘﺎﱄ(‪ ،‬ﻓﺄﻥ ﺇﻧﺸﺎﺀ ﻋﺪﺓ ﻣﺜﻴﻼﺕ‬
‫ﻋﻦ ﺍﻷﺷﻜﺎﻝ ﺑﺴﻴﻄﺎﹰ ﺃﻳﻀﺎﹰ‪ ،‬ﻭﻳﺘﺤﻘﻖ ﺿﻤﻦ ﺣﻠﻘﺔ ‪ for‬ﺃﻭ ‪ .while‬ﻋﻨﺪﻣﺎ ﺗﻜﻮﻥ ﺟﺎﻫﺰﺍﹰ ﳊﺬﻑ ﺷﻜﻞ‬
‫ﻣﻦ ﻟﻮﺣﺔ ﺍﻟﺮﺳﻢ ﺍﻟﻘﻤﺎﺷﻴﺔ ﺍﳋﺎﺻﺔ ﺑﺎﻟﻔﻴﻠﻢ‪ ،‬ﳝﻜﻨﻚ ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﺎﺑﻊ ) (‪ .remove‬ﻭﻳﺘﻮﱃ ﻫﺬﺍ ﺍﻷﺧﲑ‬
‫ﺣﺬﻑ ﻣﺜﻴﻞ )‪ (instance‬ﺍﻟﺸﻜﻞ ﻓﻘﻂ ﻣﻦ ﺍﻟﻔﻴﻠﻢ‪ ،‬ﺃﻣﺎ ﺍﻟﺸﻜﻞ ﻧﻔﺴﻪ ﻓﻼ ﳛﺬﻑ ﻣﻦ ﺍﻟﻔﻴﻠﻢ‪ ،‬ﻭﳝﻜﻦ‬
‫ﺑﺎﻟﺘﺎﱄ ﺗﻌﻴﻴﻨﻪ ﳎﺪﺩﺍﹰ‪:‬‬
‫)‪$instance2 = $movie->add($shapeVaribale‬‬

‫ﺃﺧﲑﺍﹰ‪ ،‬ﻧﺒﲔ ﻓﻴﻤﺎ ﻳﻠﻲ ﻛﻴﻔﻴﺔ ﺗﺼﺪﻳﺮ ﻓﻴﻠﻢ ﺇﱃ ﺍﳌﺴﺘﻌﺮﺽ‪ .‬ﻻﺑﺪ ﻟﻨﺎ ﻣﻦ ﺗﻌﻴﲔ ﺭﺃﺱ ﳜﱪ ﺍﳌﺴـﺘﻌﺮﺽ‬
‫ﺑﻘﺪﻭﻡ ﻣﻠﻒ ‪ ،Shockwave Flash‬ﻭﻣﻦ ﰒ ﻳﺘﻢ ﻋﺮﺽ ﺍﳌﻠﻒ‪ .‬ﲡﻌﻞ ‪ Ming‬ﻣﻦ ﻃﺮﻳﻘﺔ ﻋﺮﺽ ﺍﳌﻠـﻒ‬
‫ﻏﺎﻳﺔ ﰲ ﺍﻟﺒﺴﺎﻃﺔ‪:‬‬
‫;)"‪header("Content-type: application/x-shockwave-flash‬‬
‫;)(‪$movie->output‬‬

‫ﻫﺬﺍ ﻛﻞ ﻣﺎ ﻳﺘﻌﻠﻖ ﺑﺈﻧﺸﺎﺀ ﺃﻓﻼﻡ ﺑﺎﺳﺘﺨﺪﺍﻡ ‪.Ming‬‬

‫‪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‬ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ‬

‫)]‪void swfshape->addfil(SWFbitmap bitmap [, int flags‬‬

‫ﺣﻴﺚ ﻳﻜـﻮﻥ ﺍﻟﻮﺳـﻴﻂ ‪ flags‬ﺇﻣـﺎ ‪) SWFFILL_CLIPPED_BITMAP‬ﺑﺸـﻜﻞ ﺍﻓﺘﺮﺍﺿـﻲ(‪ ،‬ﺃﻭ‬


‫‪ .SWFILL_TILED_BITMAP‬ﲢﺪﺩ ﻫﺎﺗﺎﻥ ﺍﻟﻘﻴﻤﺘﺎﻥ ﻣﺎ ﺇﺫﺍ ﻛﻨﺎ ﺳﻨﻘﻮﻡ ﺑﺎﻣﺘﺼﺎﺹ )ﲤﺪﻳﺪﻫﺎ ﺃﻭ ﺗﻐﻴﲑ‬
‫ﺣﺠﻤﻬﺎ ﻟﺘﻼﺋﻢ ﺍﻟﺸﺎﺷﺔ( ﺃﻭ ﺗﻜﺮﺍﺭ )ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻋﺪﺓ ﻣﺮﺍﺕ ﺩﻭﻥ ﺗﻐﻴﲑ ﺣﺠﻤﻬﺎ ﺃﻭ ﺟﻌﻠﻬﺎ ﺗﻼﺋـﻢ‬
‫ﺍﻟﺸﺎﺷﺔ( ﺍﻟﺼﻮﺭﺓ ﺍﻟﻨﻘﻄﻴﺔ‪ ،‬ﻋﻠﻰ ﺍﻟﺘﺮﺗﻴﺐ‪.‬‬
‫ﻳﺒﻘﻰ ﻟﺪﻳﻨﺎ ﺍﻵﻥ ﻣﻮﺿﻮﻉ ﺍﻟﺘﺪﺭﺟﺎﺕ )‪ .(Gradients‬ﻭﺣﻴﺚ ﺃﻥ ﺍﻟﺘﺪﺭﺟﺎﺕ ﺗﻮﻓﺮ ﻣﺮﺍﺣﻞ ﺍﻧﺘﻘﺎﻟﻴـﺔ‬
‫ﻧﺎﻋﻤﺔ ﰲ ﺍﻟﻠﻮﻥ‪ ،‬ﳚﺐ ﺃﻥ ﲢﺪﺩ ﺍﳌﺮﺍﺣﻞ ﺍﻻﻧﺘﻘﺎﻟﻴﺔ ﳉﻤﻴﻊ ﺍﻷﻟﻮﺍﻥ‪ ،‬ﻭﺑﺎﻟﺘﺮﺗﻴﺐ ﺍﻟﺬﻱ ﺗﻈﻬـﺮ ﺑـﻪ‪،‬‬
‫ﻛﻨﺴﺒﺔ ﻣﻦ ﺍﻟﺼﻔﺮ ﺇﱃ ﺍﻟﻮﺍﺣﺪ‪ .‬ﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ‪ ،‬ﺇﺫﺍ ﻛﺎﻥ ﻟﺪﻳﻚ ﺗﺪﺭﺝ ﺑﻌﺸﺮﺓ ﺃﻟﻮﺍﻥ ﳍﺎ ﲨﻴﻌـﺎﹰ‬
‫ﻧﻔﺲ ﺍﻟﻨﺴﺐ ﺍﻟﻠﻮﻧﻴﺔ‪ ،‬ﳚﺐ ﺃﻥ ﻳﺘﻢ ﺗﻌﻴﲔ ﻛﻞ ﻟﻮﻥ ﻣﻨﻬﺎ ﻋﻠﻰ ﺍﻟﻘﻴﻤﺔ ‪.0.1‬‬
‫ﲤﺜﻞ ﺍﻟﺘﺪﺭﺟﺎﺕ ﺑﺪﻭﺭﻫﺎ ﻛﺎﺋﻨﺎﺕ ‪ ،SWFObject‬ﻭﻳﺘﻢ ﺇﻧﺸﺎﺅﻫﺎ ﺑﺎﺷﺘﻘﺎﻕ ﻛﺎﺋﻦ ﺟﺪﻳﺪ ﻣﻦ ﺍﻟﺼـﻨﻒ‬
‫‪:SWFGradient‬‬
‫)(‪$gradient = new SWFGradient‬‬

‫ﲢﺪﺩ ﺑﻌﺪ ﺫﻟﻚ ﺇﺩﺧﺎﻻﺕ ﺍﻟﺘﺪﺭﺝ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﺎﺑﻊ ) (‪:addEntry‬‬


‫‪void swfgradient->addentry(float ratio, int red, int green,‬‬
‫)]‪int blue [, int a‬‬

‫ﻳﺘﻢ ﺇﺛﺮ ﺫﻟﻚ ﺗﻄﺒﻴﻖ ﺍﻟﺘﺪﺭﺝ‪ ،‬ﻭﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﺎﺑﻊ ) (‪ addFill‬ﺃﻳﻀﺎﹰ‪:‬‬


‫)]‪void swfshape->addfill(SWFGradient gradient [, int flags‬‬

‫ﻳﻜﻮﻥ ﺍﻟﻮﺳﻴﻂ ‪ flags‬ﻟﻜﺎﺋﻦ ﺍﻟﺘﺪﺭﺝ ﺑﺈﺣﺪﻯ ﻗﻴﻤـﺘﲔ‪ SWFFILL_LINEAR_GRADIENT :‬ﻟﺘﻮﻟﻴـﺪ‬


‫ﺗﺪﺭﺝ ﺧﻄﻲ )ﻭﻫﻲ ﺍﻟﻘﻴﻤﺔ ﺍﻻﻓﺘﺮﺍﺿﻴﺔ(‪ ،‬ﻭ‪ SWFFILL_RADIAL_GRADIENT‬ﻟﺘﻮﻟﻴﺪ ﺗﺪﺭﺝ ﻗﻄﺮﻱ‪.‬‬
‫ﺳﻨﻘﻮﻡ ﻓﻴﻤﺎ ﻳﻠﻲ ﺑﺈﻧﺸﺎﺀ ﺗﺪﺭﺝ ﺑﺴﻴﻂ ﺑﻠﻮﻧﲔ ﻣﺘﺴﺎﻭﻳﻲ ﺍﻟﻨﺴﺒﺔ‪ ،‬ﻭﲝﻴﺚ ﻻ ﻳﻄﻔﺊ ﺃﺣﺪﳘﺎ ﻋﻠﻰ ﺍﻵﺧﺮ‪:‬‬
‫;)(‪$gradient = new SWFGradient‬‬

‫;)‪$gradient->addEntry(0, 0xff, 0, 0‬‬


‫;)‪$gradient->addEntry(1.0, 0, 0, 0xff‬‬

‫;)‪$shape->addFill($gradient‬‬

‫ﳝﻜﻦ ﺗﻄﺒﻴﻖ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻟﺘﺤﻮﻳﻼﺕ ﻭﺍﻟﺘﺄﺛﲑﺍﺕ ﻋﻠﻰ ﻋﻤﻠﻴﺎﺕ ﺍﻟﺘﻌﺒﺌﺔ ﻫﺬﻩ‪ ،‬ﻭﺍﻟﱵ ﻳـﺘﻢ ﺇﻧﺸـﺎﺅﻫﺎ‬
‫ﺑﻮﺍﺳﻄﺔ ‪ .Ming‬ﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ‪ ،‬ﳝﻜﻦ ﻧﻘﻠﻬﺎ‪ ،‬ﻭﺗﻐﻴﲑ ﺣﺠﻤﻬﺎ‪ ،‬ﻭﺗﺪﻭﻳﺮﻫﺎ‪ ،‬ﻭﺇﻣﺎﻟﺘﻬﺎ‪.‬‬

‫‪www.raypub.com‬‬
‫‪raypubsales@gmail.com‬‬
‫‪25 : PHP Extension Lbraries‬‬ ‫‪1098‬‬

‫‪void‬‬ ‫)‪swffill->moveto(int x, int y‬‬


‫‪void‬‬ ‫)‪swffill->scaleto(int x, int y‬‬
‫‪void‬‬ ‫)‪swffill->rotateto(float degrees‬‬
‫‪void‬‬ ‫)‪swffill->skewxto(float x‬‬
‫‪void‬‬ ‫)‪swffill->skewyto(float y‬‬

‫ﺗﺬﻛﺮ ﺃﻥ ﺍﳌﻜﺘﺒﺔ ‪ Ming‬ﺗﺴﺘﺨﺪﻡ ﻭﺣﺪﺍﺕ ﺍﻟﻘﻴﺎﺱ ﺍﻟﻨﺴﺒﻴﺔ‪ ،‬ﻭﺑﺬﻟﻚ ﺳﺘﺴﺘﻨﺪ ﺍﻟﺘﺄﺛﲑﺍﺕ ﺇﱃ ﻣﻮﻗـﻊ‬
‫ﻗﻠﻢ ﺍﻟﺮﺳﻢ ﻭﺍﻟﺸﻜﻞ‪.‬‬
‫ﺗﻌﺘﱪ ﻫﺬﻩ ﺍﻟﺘﺤﻮﻳﻼﺕ ﺿﺮﻭﺭﻳﺔ ﺃﺣﻴﺎﻧﺎﹰ‪ ،‬ﻭﺫﻟﻚ ﺃﻧﻪ ﻻ ﺗﻄﺒﻖ ﻋﻤﻠﻴﺎﺕ ﺍﻟﺘﻌﺒﺌﺔ ﺩﺍﺋﻤﺎﹰ ﺣﻴﺚ ﺗﺮﻳـﺪ ﺩﺍﺧـﻞ‬
‫ﻛﺎﺋﻨﺎﺕ ‪ .SWFShape‬ﳝﻜﻨﻚ ﺍﻋﺘﺒﺎﺭ ﻫﺬﻩ ﺍﻟﺘﻮﺍﺑﻊ ﺃﻗﻞ ﺃﳘﻴﺔ ﺇﺫﺍ ﻣﺎ ﻧﻈﺮﺕ ﺇﻟﻴﻬﺎ ﻣﻦ ﻧﺎﺣﻴﺔ ﺍﺳـﺘﺨﺪﺍﻣﻬﺎ‬
‫ﻣﻊ ﻋﻤﻠﻴﺎﺕ ﺍﻟﺘﻌﺒﺌﺔ ﻓﻘﻂ‪ ،‬ﻭﻟﻜﻨﻬﺎ ﻗﺎﺑﻠﺔ ﻟﻼﺳﺘﺨﺪﺍﻡ ﻣﻊ ﺍﻷﺷﻜﺎﻝ ﺃﻳﻀﺎﹰ‪.‬‬
‫ﺗﻮﻓﺮ ﺍﻟﺘﻮﺍﺑﻊ ﺍﻟﺘﺎﻟﻴﺔ ﻃﺮﻗﺎﹰ ﻟﻨﻘﻞ ﻭﺇﻣﺎﻟﺔ ﻭﺗﺪﻭﻳﺮ ﻭﺗﻐﻴﲑ ﺣﺠﻢ ﺃﺷﻜﺎﻟﻚ‪ ،‬ﺇﺿﺎﻓﺔ ﺇﱃ ﺍﻟﻄﺮﻕ ﺍﻟﱵ ﺗﺴﻤﺢ‬
‫ﺑﺎﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺃﻟﻮﺍﻥ ﻫﺬﻩ ﺍﻷﺷﻜﺎﻝ‪:‬‬
‫ﺍﻟﻮﺻﻒ‬ ‫ﺍﻟﻄﺮﻳﻘﺔ‬
‫ﺗﻨﻘﻞ ﺍﻟﺸﻜﻞ ﺇﱃ ﻧﻘﻄﺔ ﺑﺈﺣﺪﺍﺛﻴﺎﺕ )‪ (x,y‬ﳏﺪﺩﺓ‪.‬‬ ‫)‪moveTo(x, y‬‬

‫ﺗﺰﻳﺢ )‪ (offsets‬ﺍﻟﺸﻜﻞ ﺗﺒﻌﺎﹰ ﻟﻺﺣﺪﺍﺛﻴﺎﺕ )‪ (x,y‬ﺍﳌﻌﻄﺎﺓ‪.‬‬ ‫)‪move(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‬‬

‫ﺇﻣﺎﻟﺔ ﺍﻹﺣﺪﺍﺛﻴﺔ ‪ y‬ﺇﱃ ﺍﻟﻘﻴﻤﺔ ‪ skew‬ﺍﶈﺪ‪‬ﺩﺓ‪.‬‬ ‫)‪skewY(skew‬‬

‫ﺇﻣﺎﻟﺔ ﺍﻹﺣﺪﺍﺛﻴﺔ ‪ y‬ﺑﺎﻟﻘﻴﻤﺔ ‪ skew‬ﺍﶈﺪ‪‬ﺩﺓ‪.‬‬ ‫)‪skewY(skew‬‬

‫ﲢﻘﻖ ﺍﺳﺘﺪﺍﺭﺓ ﻟﻠﺸﻜﻞ ﺇﱃ ﻗﻴﻤﺔ ﺍﻟﺰﺍﻭﻳﺔ ﺍﳌﻌﻄﺎﺓ‪.‬‬ ‫)‪rotateTo(degrees‬‬

‫ﲢﻘﻖ ﺍﺳﺘﺪﺍﺭﺓ ﻟﻠﺸﻜﻞ ﺑﻘﻴﻤﺔ ﺍﻟﺰﺍﻭﻳﺔ ﺍﳌﻌﻄﺎﺓ‪.‬‬ ‫)‪rotate(degrees‬‬

‫ﺗﻐﲑ ﺃﺑﻌﺎﺩ ﺍﻟﺸﻜﻞ ﺇﱃ ﻋﺮﺽ ﻭﺍﺭﺗﻔﺎﻉ ﺑﻨﺴﺒﺔ ﳏﺪﺩﺓ )ﺇﺫﺍ ﻛﺎﻥ ﺍﻻﺭﺗﻔﺎﻉ ﺃﻭ‬ ‫)]‪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‬ﻋﻦ ﺍﻟﻘﻨﺎﺓ ﺑﺎﺳﺘﻄﺎﻋﺘﻬﺎ ﺍﻟﻠﻮﻧﻴﺔ ﺍﻟﻜﺎﻣﻠﺔ(‪.‬‬

‫‪Buttons‬‬ ‫ ‬


‫ﺗﻌﺘﱪ ﺍﻷﺯﺭﺍﺭ ﺳﻬﻠﺔ ﺍﻹﻧﺸﺎﺀ ﻧﺴﺒﻴﺎﹰ‪ ،‬ﻭﻫﻲ ﺗﺸﻤﻞ ﺃﺭﺑﻌﺔ ﻣﺜﻴﻼﺕ‪ :‬ﻧﻘﺮ )‪ ،(hit‬ﻭﺍﳔﻔـﺎﺽ )‪،(down‬‬
‫ﻭﲤﺮﻳﺮ )‪ ،(over‬ﻭﺃﻋﻠﻰ )‪ ،(up‬ﺫﻟﻚ ﺃ‪‬ﺎ ﺗﺘﻌﻠﻖ ﺑﺴﻠﻮﻙ ﺍﻟﻔﺄﺭﺓ ﺃﻣﺎﻡ ﺍﻟﺰﺭ‪ .‬ﻟﻴﺴـﺖ ﺍﻷﺯﺭﺍﺭ ﰲ ‪Flash‬‬

‫ﺑﺄﻛﺜﺮ ﻣﻦ ﺃﺷﻜﺎﻝ ﺗﺴﺘﺠﻴﺐ ﺇﱃ ﺃﻓﻌﺎﻝ ﺍﻟﻔﺄﺭﺓ‪ ،‬ﻭﻫﻲ ﺗﻌﺮ‪‬ﻑ ﻛﻜﺎﺋﻦ‪:‬‬


‫)(‪$button = new SWFButton‬‬

‫ﺗﻀﺎﻑ ﺍﻷﺷﻜﺎﻝ )ﺍﳌﻨﺎﻃﻖ ﺍﻟﱵ ﻳﻜﻮﻥ ﻓﻴﻬﺎ ﺍﻟﺰﺭ ﻗﺎﺑﻼﹰ ﻟﻠﻨﻘﺮ ﻋﻠﻴﻪ( ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫)‪void swfbutton->addshape(resource shape, int flags‬‬

‫ﺣﻴﺚ ﻳﻜﻮﻥ ﺍﻟﻮﺳﻴﻂ ‪ flags‬ﻭﺍﺣﺪﺍﹰ ﺃﻭ ﺃﻛﺜﺮ ﳑﺎ ﻳﻠـﻲ‪ ،SWFBUTTON_HIT :‬ﺃﻭ ‪،SWFBUTTON_DOWN‬‬


‫ﺃﻭ ‪ ،SWFBUTTON_UP‬ﺃﻭ ‪ .SWFBUTTON_OVER‬ﻻﺣﻆ ﺃﻥ ﺍﻷﻋﻼﻡ ﻫﻲ ﻗﻴﻢ ﺛﺎﺑﺘﺔ‪ ،‬ﻭﻟﻴﺴـﺖ‬
‫ﺳﻼﺳﻞ ﳏﺮﻓﻴﺔ‪ ،‬ﻭﻻ ﳚﺐ ﺃﻥ ﺗﻮﺿﻊ ﺑﲔ ﻋﻼﻣﱵ ﺍﻗﺘﺒﺎﺱ‪ .‬ﳝﻜﻨﻚ‪ ،‬ﺑﺈﻧﺸﺎﺀ ﺃﺷﻜﺎﻝ ﳐﺘﻠﻔﺔ ﻟﻜﻞ ﻋﻠﻢ‪،‬‬
‫ﺇﺿﺎﻓﺔ ﺍﳊﻴﺎﺓ ﺇﱃ ﺯﺭﻙ‪ .‬ﻟﻨﻔﺮﺽ ﺃﻥ ﻟﺪﻳﻚ ﺷﻜﻼﹰ ﺃﲪﺮ‪ ،‬ﻭﺁﺧﺮ ﺃﺧﻀﺮ‪ ،‬ﻭﺁﺧﺮ ﺑﺮﺗﻘﺎﻟﻴـﺎﹰ ﺑـﺎﳊﺠﻢ‬
‫ﻧﻔﺴﻪ‪ .‬ﺳﻮﻑ ﺗﺘﻮﱃ ﻗﻄﻌﺔ ﺍﻟﺸﻴﻔﺮﺓ ﺍﻟﺘﺎﻟﻴﺔ ﺇﻧﺸﺎﺀ ﺯﺭ ﺃﲪﺮ ﻳﺘﺤﻮﻝ ﺇﱃ ﺍﻟﱪﺗﻘﺎﱄ ﻋﻨﺪ ﻣﺮﻭﺭ ﺍﻟﻔـﺄﺭﺓ‬
‫ﻓﻮﻗﻪ‪ ،‬ﻛﻤﺎ ﻭﻳﺘﺤﻮﻝ ﺇﱃ ﺍﻷﺧﻀﺮ ﻋﻨﺪ ﺍﻟﻨﻘﺮ ﻋﻠﻴﻪ‪:‬‬
‫;)(‪$button = new SWFButton‬‬
‫;)‪$button->addShape($redShape, SWFBUTTON_UP | SWFBUTTON_HIT‬‬
‫;)‪$button->addShape($orangeShape, SWFBUTTON_OVER‬‬
‫;)‪$button->addShape($greenShape, SWFBUTTON_DOWN‬‬

‫‪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‬‬

‫?‪What about Text‬‬ ‫  ‬


‫ﺗﻌﺘﱪ ﺇﺿﺎﻓﺔ ﻧﺺ ﺇﱃ ﺃﻓﻼﻣﻚ ﺃﻛﺜﺮ ﺻﻌﻮﺑﺔ ﻣﻦ ﺇﺿﺎﻓﺔ ﺍﻟﺼﻮﺭ ﺍﻟﻨﻘﻄﻴﺔ‪ ،‬ﻭﻫﻲ ﺗﺘﻄﻠﺐ ﻣﻨﻚ ﺃﻥ ﲤﻠﻚ‬
‫ﻣﻠﻒ ﻗﺎﻟﺐ ﳛﻮﻱ ﺍﳋﻂ ﺍﻟﺬﻱ ﺗﻨﻮﻱ ﺍﺳﺘﺨﺪﺍﻣﻪ‪ .‬ﳚﺐ ﻋﻠﻴﻚ ﺃﻭﻻﹰ ﺃﻥ ﺗﺴـﺘﺨﺪﻡ ﺍﻷﺩﺍﺓ ‪،makefdb‬‬
‫ﺍﻟﱵ ﺗﻮﻓﺮﻫﺎ ‪ ،Ming‬ﻟﺘﺤﻮﻳﻞ ﻣﻠﻒ ‪ SWT‬ﻟﺪﻳﻚ ﺇﱃ ﻣﻠﻒ ﺧﻂ ﳝﻜﻦ ﺃﻥ ﺗﻘﺮﺃﻩ ‪.Ming‬‬
‫ﺑﻌﺪ ﺃﻥ ﲢﺼﻞ ﻋﻠﻰ ﺍﳋﻂ ﺩﺍﺧﻞ ﻣﻠﻒ ‪ ،FDB‬ﳝﻜﻨﻚ ﲢﻤﻴﻞ ﺍﳋﻂ ﺑﺎﺳﺘﺨﺪﺍﻡ‪:‬‬
‫)‪$font = new SWFFont(fontFileName‬‬

‫ﳝﻜﻦ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﻣﻌﻠﻮﻣﺎﺕ ﺍﳋﻂ ﺍﳌﺘﺮﻳﺔ )ﺍﻟﻘﻴﺎﺳـﻴﺔ( ﺑﺎﺳـﺘﺨﺪﺍﻡ ﺍﳋﺼـﺎﺋﺺ ) (‪،getAscent‬‬
‫ﻭ) (‪ ،getDescent‬ﻭ) (‪ ،getLeading‬ﻭ) ‪ getWidthe(string‬ﻟﻠﻜﺎﺋﻦ ‪ .SWFFont‬ﺗﻜﻮﻥ ﺍﻟﻘﻴﻤﺔ ﺍﳌﻌﺎﺩﺓ‬
‫ﻣﻦ ﻫﺬﺍ ﺍﻟﺘﺎﺑﻊ ﻣﻮﺍﻓﻘﺔ ﳋﻂ ﺑﺎﺭﺗﻔﺎﻉ ‪ .1024‬ﻭﺇﺫﺍ ﱂ ﺗﻌﲔ ﺣﺠﻢ ﺍﳋﻂ ﻋﻠﻰ ‪ ،1024‬ﻓﺴـﺘﺤﺘﺎﺝ ﺇﱃ‬
‫ﺿﺮﺏ ﻫﺬﻩ ﺍﻟﻘﻴﻢ ﺑﺎﻟﻨﺴﺒﺔ )ﺍﻻﺭﺗﻔﺎﻉ‪ .(1024 /‬ﺩﻋﻨﺎ ﻧﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﺳﻠﺴﻠﺔ ﳏﺮﻓﻴﺔ ﺑﺴﻴﻄﺔ ﻭﻧﺮﺳﻠﻬﺎ ﺇﱃ‬
‫ﺍﳌﺴﺘﻌﺮﺽ )ﻳﻔﺘﺮﺽ ﺫﻟﻚ ﺃﻥ ﻟﺪﻳﻚ ‪ Ming‬ﰲ ‪ ،php.ini‬ﺃﻭ ﻣﻀﻤﻨﺔ ﰲ ‪ ،PHP‬ﻭﺃﻧﻚ ﺃﻧﺸﺄﺕ ﺑﺎﻟﻔﻌﻞ‬
‫ﺧﻄﱠﺎﹰ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻷﺩﺍﺓ ‪ makefdb‬ﻭﻟﻨﺪﻋﻪ ‪:(Arial.fdb‬‬
‫‪<?php‬‬

‫;)(‪$movie = new SWFMvie‬‬


‫;)‪$movie->setDimension(320, 240‬‬
‫;)‪$movie->setBackground(0, 0x44, 0x95‬‬
‫;)‪$movie->setRate(12.0‬‬

‫;)"‪$font = newSWFFont("Arial.fdb‬‬

‫;)(‪$string = new SWFText‬‬


‫;)‪$string->setFont($font‬‬
‫;)‪$string->setHeight(25‬‬
‫;)‪$string->setColor(0, 0, 0‬‬
‫;)‪$string->moveTo(10, 20‬‬
‫;)"‪$string->addString("PHP/Ming-Generated Text‬‬

‫;)‪$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‬‬

‫‪WAP and WML‬‬ ‫‪WML WAP‬‬


‫ﺗﻮﻓﺮ ‪ PHP‬ﻃﺮﻗﺎﹰ ﺭﺍﺋﻌﺔ ﻟﺘﻮﻟﻴﺪ ﳏﺘﻮﻯ ﻣﻨﺎﺳﺐ ﻟﻸﺟﻬﺰﺓ ﺍﻟﻼﺳﻠﻜﻴﺔ ﻣﺜﻞ ‪ ،PDAs‬ﻭﺍﳊﻮﺍﺳﺐ ﺍﶈﻤﻮﻟﺔ‪،‬‬
‫ﻭﺍﳍﻮﺍﺗﻒ ﺍﳋﻠﻴﻮﻳﺔ‪ .‬ﺗﻌﺘﱪ ﻟﻐﺔ ﺍﻟﺘﻮﺻﻴﻒ ﺍﻟﻼﺳﻠﻜﻲ )‪ (WML‬ﻣﺸﺎﺑﻪ ﰲ ﺻﻴﻐﺘﻬﺎ ﻟﻠﻐﺔ ‪ ،XML‬ﺫﻟﻚ ﺃ‪‬ﺎ‬
‫ﺗﺴﺘﻨﺪ ﺇﱃ ‪ ،XML‬ﻭﻫﻲ ﺳﻬﻠﺔ ﺍﻟﺘﻌﻠﻢ ﻣﺜﻞ ‪ XML‬ﺃﻭ ‪.HTML‬‬

‫ﺗﻮﺥ‪ ‬ﺍﳊﺬﺭ ﻋﻨﺪ ﺇﻧﺸﺎﺀ ﺻﻔﺤﺎﺕ ‪ ،WML‬ﺫﻟﻚ ﺃﻥ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺃﺟﻬﺰﺓ ‪) WAP‬ﺑﺮﻭﺗﻮﻛﻮﻝ ﺍﻟﻮﺻﻮﻝ‬
‫ﺍﻟﻼﺳﻠﻜﻲ( ﻻ ﺗﺴﺘﻄﻴﻊ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺃﻛﺜﺮ ﻣﻦ ‪ 1400‬ﺑﺎﻳﺖ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﳌﺘﺮﲨﺔ )ﻧﻘﺼﺪ ﺑﺎﳌﺘﺮﲨﺔ‬
‫ﻋﻼﱠﻣﺎﺕ ‪ ،WML‬ﻭﺍﻟﻨﺺ‪ ،‬ﻭﻏﲑﻫﺎ ﻣﻦ ﺍﻟﺒﻴﺎﻧﺎﺕ ﺍﻟﱵ ﺗﻘﺪﻡ ﰲ ﺍﻟﺼﻔﺤﺔ(‪.‬‬

‫ﳝﻜﻨﻚ ﺍﻟﻌﻮﺩﺓ ﺇﱃ ﺍﳌﻮﻗﻊ ‪ http://www.oasis-open.org/cover/wap-wml.html‬ﻟﻼﻃﻼﻉ ﻋﻠﻰ ﳐﺘﻠﻒ‬


‫ﻣﻔﺎﻫﻴﻢ ‪ .WML‬ﻭﻓﻴﻤﺎ ﻋﺪﺍ ﺃ‪‬ﺎ ﺗﺴﺘﻨﺪ ﺇﱃ ﺍﻟﺼﻔﺤﺎﺕ‪ ،‬ﺗﺴﺘﻨﺪ ‪ WML‬ﺃﻳﻀﺎﹰ ﺇﱃ ﺍﻟﺼﻔﺤﺎﺕ ﺍﻟﻔﺮﻋﻴﺔ‬
‫) ﻭﺗﺪﻋﻰ ﺑﻄﺎﻗﺎﺕ( ﻭﺍﻟﱵ ﺗﺴﺘﻘﺮ ﰲ ﺍﻟﺼﻔﺤﺔ ﺍﻟﺮﺋﻴﺴﻴﺔ )ﻭﺗﺪﻋﻰ ﻣﺮﺳﻰ(‪ .‬ﳝﻜﻦ ﺃﻥ ﺗﻜﻮﻥ ﺻـﻔﺤﺔ‬
‫‪ WML‬ﺑﺴﻴﻄﺔ ﺑﺎﻟﺼﻴﻐﺔ ﺍﻟﺘﺎﻟﻴﺔ‪.:‬‬
‫>‪<wml‬‬
‫>"‪<card id="home‬‬
‫>‪<p>Welcome, wireless users!</p‬‬
‫>‪</card‬‬
‫>‪</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

#Catch WAP Browsers


RewriteCond %{HTTP_ACCEPT} text/vnd\.wap\.wml [OR]

#WAPjag and WindWAP call pages with this USER_AGENT header


RewriteCond %{HTTP_USER_AGENT} wap [OR]

#Nokia sdk emulators call WAP pages with this header


RewriteCond %{HTTP_USER_AGENT} 7110

#Send them to your wireless page


RewriteRule ^[\./](.*)$ /home/mydirectory/wireless/home.wml [L]

‫ ﻹﻋﺎﺩﺓ ﺗﺸﻐﻴﻞ‬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‬‬

‫?‪What about the Library‬‬ ‫  ‬


‫ﺗﻮﺟﺪ ﻣﻜﺘﺒﺔ ﻟﺘﻮﻟﻴﺪ ﺻﻔﺤﺎﺕ ‪ ،WML‬ﻭﺗﺪﻋﻰ ‪.(HTML And WML Hybrid Adapted Webserver) HAWHAW‬‬
‫ﻭ‪‬ﺬﺍ ﺗﻜﻮﻥ ﻟﺪﻳﻨﺎ ﻃﺮﻳﻘﺔ ﻟﻮﺿﻊ ﻛﺎﺋﻨﺎﺕ ‪ WML‬ﻣﺒﺎﺷﺮﺓ ﰲ ﺷﻴﻔﺮﺓ ‪ ،PHP‬ﻭﺩﻭﻥ ﺍﻟﻘﻠﻖ ﺣﻴﺎﻝ ﺍﻟﺘﺮﻣﻴﺰ‬
‫ﺍﻟﻔﻌﻠﻲ ﻟﻠﻐﺔ ‪) WML‬ﻣﺎ ﻳﻜﺎﻓﺊ ﻋﺪﻡ ﻗﻄﻊ ﺷﻴﻔﺮﺓ ‪ PHP‬ﺧﺎﺻﺘﻚ(‪ .‬ﺗﺘﻮﻓﺮ ‪ HAWHAW‬ﻋﻠﻰ ﺍﳌﻮﻗـﻊ‬
‫‪ .http://www.hawhaw.de/‬ﻛﻤﺎ ﻳﺴﺘﻄﻴﻊ ‪ HAWHAW‬ﺍﻟﺘﻌﺮﻑ ﻋﻠﻰ‪:‬‬
‫ﻣﺴﺘﻌﺮﺿﺎﺕ ‪) HDML‬ﺍﻹﺻﺪﺍﺭ ﺍﻟﺴﺎﺑﻖ ﻣﻦ ‪ ،(WAP‬ﻭﺍﻟﺬﻱ ﻳﺴﺘﻄﻴﻊ ﺗﻀﻤﲔ ﺃﻱ ﻋﺪﺩ ﻣﻄﻠﻮﺏ‬ ‫‬

‫ﻣﻦ ﺍﻟﺒﻄﺎﻗﺎﺕ‪.‬‬
‫ﻣﺴﺘﻌﺮﺿﺎﺕ ‪ WML/WAP‬ﺍﻟﱵ ﺗﻀﻤﻦ ﻣﺮﺳﻰ ﻭﺑﻄﺎﻗﺔ ﻭﺣﻴﺪﻳﻦ ﻓﻘﻂ‪.‬‬ ‫‬

‫ﻣﺴﺘﻌﺮﺿﺎﺕ ‪ AvantGo‬ﻭ‪ ،iMode‬ﻭﺫﻟﻚ ﺑﺘﻮﻟﻴﺪ ﺷﻴﻔﺮﺓ ‪ HTML‬ﺻﺤﻴﺤﺔ‪.‬‬ ‫‬

‫ﻣﺴﺘﻌﺮﺿﺎﺕ ‪.HTML‬‬ ‫‬

‫ﻟﻴﺴﺖ ‪ HAWHAW‬ﺑﺘﻄﺒﻴﻖ ﻣﺜﺒ‪‬ﺖ‪ ،‬ﻭﺇﳕﺎ ﺑﺮﻧﺎﻣﺞ ﻧﺼﻲ ﳝﻜﻨﻚ ﺗﻀﻤﻴﻨﻪ ﰲ ﺷﻴﻔﺮﺓ ‪ PHP‬ﺑﺎﺳـﺘﺨﺪﺍﻡ‬
‫;)"‪.include ("hawhaw.inc‬‬
‫ﻭﻟﻌﻞﱠ ﺃﻓﻀﻞ ﻣﺎ ﳜﺺ ‪ HAWHAW‬ﻫﻮ ﺃ‪‬ﺎ ﺗﻘﺪﻡ ﳐﻄﻄﺎﹰ ﻣﺮﻛﺒﺎﹰ ﻟﺘﻮﻟﻴﺪ ﺍﻟﺼﻔﺤﺎﺕ‪ ،‬ﻭﺍﻟﱵ ﺗﻨﻘﻞ ﻛﻤﺎ‬
‫ﻫﻲ ﺇﱃ ﺍﳌﺴﺘﻌﺮﺽ‪ .‬ﻭﺑﺎﻟﺘﺎﱄ‪ ،‬ﳝﻜﻨﻚ ﺍﺳﺘﺨﺪﺍﻡ ‪ HAWHAW‬ﻹﻧﺸﺎﺀ ‪ HTML‬ﻣﺮﻛﺒﺔ‪ ،‬ﻭﻛﺬﻟﻚ ﺻﻔﺤﺎﺕ‬
‫‪ ،WML‬ﻟﻨﺠﻨﺐ ﺃﻧﻔﺴﻨﺎ ﺑﺬﻟﻚ ﺍﳌﺸﺎﻛﻞ ﻭﺍﻻﺿﻄﺮﺍﺏ ﰲ ﲢﺪﻳﺪ ﺍﻟﻮﺟﻬﺔ ﺍﻟﱵ ﺳﻨﻤﻀﻲ ﺇﻟﻴﻬﺎ‪.‬‬

‫‪Using HAWHAW‬‬ ‫ 
 ‪HAWHAW‬‬
‫ﻳﺒﺪﺃ ﺇﺭﺳﺎﺀ ‪ WML‬ﺑﺎﻟﺼﻨﻒ ‪ ،HAW_deck‬ﻭﺍﻟﺬﻱ ﳚﺐ ﺃﻥ ﲢﻮﻱ ﻛﻞ ﺻﻔﺤﺔ ﻣﻨﻪ ﺑﻄﺎﻗﺔ ﻭﺍﺣـﺪﺓ‬
‫ﻓﻘﻂ )ﺫﻟﻚ ﺃﻥ ﺍﻟﺼﻔﺤﺎﺕ ﺍﻟﻼﺳﻠﻜﻴﺔ ﺗﺴﺘﺨﺪﻡ ﺍﻟﺒﻄﺎﻗﺎﺕ ﻟﻠﺘﻔﺎﻋﻞ(‪ .‬ﳝﻜﻨﻨﺎ ﺇﻧﺸﺎﺀ ﺻـﻔﺤﺔ ‪WML‬‬

‫ﺑﺴﻴﻄﺔ ﺑﺎﺳﺘﺨﺪﺍﻡ ‪ HAWHAW‬ﻛﻤﺎ ﻳﻠﻲ‪:‬‬


‫‪<?php‬‬
‫‪...‬‬
‫;)"‪$page = new HAW_deck("Simple Page Made With HAWHAW‬‬
‫‪...‬‬

‫‪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‬‬ ‫‬

‫ﺗﻀﻴﻒ ﻛﺎﺋﻦ ‪ HAW_text‬ﺇﱃ ﺍﻟﺼﻨﻒ ‪ ،HAW_deck‬ﻭﺗﻌﺮﺿﻪ ﻋﻨﺪ ﺗﻮﻟﻴﺪ ﺍﻟﺼﻔﺤﺔ‪.‬‬


‫)‪function add_image(object HAW_image‬‬ ‫‬

‫ﺗﻀﻴﻒ ﻛﺎﺋﻦ ‪ HAW_image‬ﺇﱃ ﺍﻟﺼﻨﻒ ‪ ،HAW_deck‬ﻭﺗﻌﺮﺿﻪ ﻋﻨﺪ ﺗﻮﻟﻴﺪ ﺍﻟﺼﻔﺤﺔ‪.‬‬


‫)‪function add_table(object HAW_table‬‬ ‫‬

‫ﺗﻀﻴﻒ ﻛﺎﺋﻦ ‪ HAW_table‬ﺇﱃ ﺍﻟﺼﻨﻒ ‪ ،HAW_deck‬ﻭﺗﻌﺮﺿﻪ ﻋﻨﺪ ﺗﻮﻟﻴﺪ ﺍﻟﺼﻔﺤﺔ‪.‬‬


‫)‪function add_form(object HAW_form‬‬ ‫‬

‫ﺗﻀﻴﻒ ﻛﺎﺋﻦ ‪ HAW_form‬ﺇﱃ ﺍﻟﺼﻨﻒ ‪ ،HAW_deck‬ﻭﺗﻌﺮﺿﻪ ﻋﻨﺪ ﺗﻮﻟﻴﺪ ﺍﻟﺼﻔﺤﺔ‪.‬‬


‫)‪function add_link(object HAW_link‬‬ ‫‬

‫ﺗﻀﻴﻒ ﻛﺎﺋﻦ ‪ HAW_link‬ﺇﱃ ﺍﻟﺼﻨﻒ ‪ ،HAW_deck‬ﻭﺗﻌﺮﺿﻪ ﻋﻨﺪ ﺗﻮﻟﻴﺪ ﺍﻟﺼﻔﺤﺔ‪.‬‬


‫)‪function add_linkset(object HAW_linkset‬‬ ‫‬

‫ﺗﻀﻴﻒ ﻛﺎﺋﻦ ‪ HAW_linkset‬ﺇﱃ ﺍﻟﺼﻨﻒ ‪ ،HAW_deck‬ﻭﺗﻌﺮﺿﻪ ﻋﻨﺪ ﺗﻮﻟﻴﺪ ﺍﻟﺼﻔﺤﺔ‪.‬‬


‫ﻳﻮﺟﺪ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﻟﺘﻮﺍﺑﻊ ﺍﻷﺧﺮﻯ ﳍﺬﺍ ﺍﻟﺼﻨﻒ‪ ،‬ﻭﻟﻜﻨﻬﺎ ﻟﻴﺴﺖ ‪ WML‬ﺃﻭ ﻣﺘﻮﺍﻓﻘﺔ ﻣـﻊ ﺍﻷﺟﻬـﺰﺓ‬
‫ﺍﶈﻤﻮﻟﺔ‪ .‬ﻟﺬﺍ‪ ،‬ﱂ ﻧﺬﻛﺮﻫﺎ ﻫﻨﺎ‪ .‬ﻭﺇﺫﺍ ﺃﺭﺩﺕ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﻣﺮﺟﻊ ﻛﺎﻣﻞ‪ ،‬ﺭﺍﺟﻊ ﻣﻮﻗﻊ ﺍﻟﻮﻳﺐ ﺍﳋﺎﺹ‬
‫ﺑﺎﳌﻜﺘﺒﺔ ‪.HAWHAW‬‬

‫‪www.raypub.com‬‬
‫‪raypubsales@gmail.com‬‬
‫‪1105‬‬ ‫‪PHP‬‬ ‫‪ : 25‬ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ‬

‫ﻳﻌﺘﱪ ﺗﻌﻴﲔ ﺍﻟﻨﺺ ﺑﺎﺳﺘﺨﺪﺍﻡ ‪ HAWHAW‬ﺳﻬﻼﹰ ﻫﻨﺎ‪ ،‬ﻭﻳﻮﺟﺪ ﺍﻟﻌﺪﻳﺪ ﻣﻦ ﺍﳋﻴﺎﺭﺍﺕ ﻟﺘﺤﻘﻴﻖ ﻧﺼﻚ‪.‬‬
‫ﻳﺴﺘﺪﻋﻰ ﺍﻟﻜﺎﺋﻦ ‪ HAW-text‬ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺴﻠﺴﻠﺔ ﺍﶈﺮﻓﻴﺔ ﻟﻠﻨﺺ ﺍﻟﺬﻱ ﺗﺮﻳﺪ ﻋﺮﺿﻪ‪ ،‬ﺇﺿﺎﻓﺔ ﺇﱃ ﻭﺍﺣﺪ‬
‫ﺃﻭ ﺃﻛﺜﺮ ﻣﻦ ﺍﻷﻋﻼﻡ ﺍﻟﻨﺼﻴﺔ ﺍﻟﱵ ﺗﺘﻮﱃ ﺇﻋﺪﺍﺩ ﳕﻂ ﺍﻟﻨﺺ‪ .‬ﺃﺿﻒ ﺇﱃ ﻣﺎ ﺳﺒﻖ ﺃﻧﻨﺎ ﻧﺴﺘﻄﻴﻊ ﺍﺳﺘﺨﺪﺍﻡ‬
‫ﺍﳋﺎﺻﺔ ) (‪ set_br‬ﳍﺬﺍ ﺍﻟﺼﻨﻒ‪ ،‬ﻭﺫﻟﻚ ﺑﻐﻴﺔ ﺗﻌﻴﲔ ﻋﺪﺩ ﺍﻟﺴﻄﻮﺭ ﺍﻟﻔﺎﺻﻠﺔ ﺍﻟﱵ ﺳﺘﺄﰐ ﺑﻌﺪ ﺍﻟـﻨﺺ‪.‬‬
‫ﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ‪ ،‬ﺇﺫﺍ ﺃﺭﺩﻧﺎ ﺍﻟﺘﺮﺣﻴﺐ ﲟﺴﺘﺨﺪﻣﻲ ﺻﻔﺤﺘﻨﺎ ﺑـﺎﻟﻨﺺ "!‪ "Hello Users‬ﺫﻱ ﺍﻟﺘﻨﺴـﻴﻖ‬
‫ﺍﻷﺳﻮﺩ ﺍﻟﻌﺮﻳﺾ )‪ ،(bold‬ﻭﺃﻥ ﻧﺘﺮﻙ ﺛﻼﺛﺔ ﺳﻄﻮﺭ ﻓﺎﺭﻏﺔ ﺑﻌﺪ ﺍﻟﻨﺺ‪ ،‬ﻓﻌﻠﻴﻨﺎ ﺃﻥ ﻧﺴﺘﺨﺪﻡ ﺍﻟﺸـﻴﻔﺮﺓ‬
‫ﺍﻟﺘﺎﻟﻴﺔ‪:‬‬
‫‪<?php‬‬
‫;)"‪include("hawhaw.inc‬‬

‫;)"‪$page = new HAW_deck("Simple Page Made with HAWHAW‬‬

‫;)‪$text = new HAW_text("Hello Users!", HAW_TEXTFORMAT_BOLD‬‬


‫;)‪$text->set_br(3‬‬

‫;)‪$page->add_text($text‬‬

‫;)(‪$page->create_page‬‬

‫>?‬

‫ﻛﻤﺎ ﻭﳝﻜﻨﻨﺎ ﺇﻧﺸﺎﺀ ﺍﺭﺗﺒﺎﻁ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﻜﺎﺋﻦ ‪ ،HAW_link‬ﻭﺍﻟﺬﻱ ﻳﺘﻤﺘﻊ ﺑﺎﻟﺘﻨﺴﻴﻖ‪:‬‬


‫)]‪new HAW_link(string linkedText, string URL [, string title‬‬

‫ﺳﻴﻌﺮﺽ ﺍﻟﻮﺳﻴﻂ‪ ،‬ﺍﻟﺴﻠﺴﻠﺔ ﺍﻟﻨﺼﻴﺔ‪ title ،‬ﺍﻟﻨﺺ ﰲ ﺷﺮﻳﻂ ﻣﻌﻠﻮﻣﺎﺕ ﻣﺴﺘﻌﺮﺽ ‪ HTML‬ﻋﻨـﺪ ﲢﻘـﻖ‬
‫ﺍﳊﺪﺙ ‪ .MouseOver‬ﻭﻳﺒﺪﺃ ﺍﻻﺭﺗﺒﺎﻁ ﰲ ﻫﺬﻩ ﺍﻟﺼﻔﺤﺔ ﺑﻌﺪ ﺛﻼﺛﺔ ﺳﻄﻮﺭ ﲢﺖ ﺍﻟـﻨﺺ "!‪."Hello Users‬‬
‫ﻭﻟﺪﻳﻨﺎ ﺍﻵﻥ‪:‬‬
‫‪<?php‬‬
‫;)"‪include("hawhaw.inc‬‬

‫;)"‪$page = new HAW_deck("Simple Page Made With HAWHAW‬‬

‫;)‪$text = new HAW_text("Hello Users!", HAW_TEXTFORMAT_BOLD‬‬


‫;)‪$text->set_br(3‬‬

‫;)"‪$link = new HAW_link("SiteTronics", "http://www.sitetronics.com/‬‬

‫;)‪$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‬‬

‫ﻓﻴﻤﺎ ﳝﺜﻞ ‪ WBMP_source‬ﻣﺴﺎﺭ ﺍﻟﺼﻮﺭﺓ ﰲ ﺍﻟﺘﻨﺴﻴﻖ ‪ BMP‬ﺍﻟﻼﺳﻠﻜﻲ‪ ،‬ﳝﺜﻞ ‪ HTML_source‬ﻣﺴﺎﺭ‬


‫ﺍﻟﺼﻮﺭﺓ ﰲ ﺃﻱ ﺗﻨﺴﻴﻖ ﻣﺘﻮﺍﻓﻖ ﻣﻊ ‪) HTML‬ﻣﺜﻞ ‪ ،GIF‬ﻭ‪ ،JPEG‬ﻭ‪ ،PNG‬ﻭﻏﲑﻫﺎ(‪ .‬ﳝﺜﻞ ﺍﻟﻮﺳﻴﻂ ‪alt‬‬

‫ﺍﻟﻨﺺ ﺍﻟﺒﺪﻳﻞ ﺍﻟﺬﻱ ﺳﻴﻌﺮﺽ ﺭﻳﺜﻤﺎ ﻳﺘﻢ ﲢﻤﻴﻞ ﺍﻟﺼـﻮﺭﺓ )ﺃﻭ ﰲ ﺍﳌﺴﺘﻌﺮﺿـﺎﺕ ﺍﻟـﱵ ﻻ ﺗـﺪﻋﻢ‬
‫ﺍﻟﺼﻮﺭ!(‪ .‬ﻛﻤﺎ ﳝﺜﻞ ﺍﻟﻮﺳﻴﻂ ‪ BMP_source‬ﺍﻟﺼﻮﺭﺓ ﺫﺍﺕ ﺍﻟﺘﻨﺴﻴﻖ ‪ BMP‬ﺃﺣﺎﺩﻱ ﺍﻟﻠـﻮﻥ‪ ،‬ﻭﺍﻟـﱵ‬
‫ﺳﺘﻌﺮﺽ ﰲ ﺍﳌﺴﺘﻌﺮﺿﺎﺕ ﺫﺍﺕ ﺍﻟﻌﺮﺽ ﺃﺣﺎﺩﻱ ﺍﻟﻠﻮﻥ )ﻣﺜﻞ ‪.(UPSim 3.2‬‬
‫ﻓﻴﻤﺎ ﻳﺘﻌﻠﻖ ﺑﻨﺎ ﳓﻦ ﻣﱪﳎﻲ ‪ ،PHP‬ﻗﺪ ﺗﻜﻮﻥ ﺍﻟﻨﻤﺎﺫﺝ ﺃﻛﺜﺮ ﻣﺎ ‪‬ﺘﻢ ﺑﻪ‪ .‬ﻭﺗﻘـﺪﻡ ‪ HAWHAW‬ﻣـﻦ‬
‫ﺟﻬﺘﻬﺎ ﺗﻮﺍﺑﻊ ﳕﻮﺫﺝ ﺳﻬﻠﺔ ﻭﻣﻔﻴﺪﺓ‪ .‬ﻟﻜﻦ‪ ‬ﻋﻠﻴﻚ ﺃﻥ ﺗﺘﺬﻛﺮ ﺩﺍﺋﻤﺎﹰ ﺃﻥ ﺍﻟﻄﺮﻳﻘﺔ ‪ GET‬ﻭﺣﺪﻫﺎ ﺍﻟﱵ ﰎ‬
‫ﺩﻋﻤﻬﺎ ﻹﺭﺳﺎﻝ ﺍﻟﺒﻴﺎﻧﺎﺕ‪ .‬ﺩﻋﻨﺎ ﻧﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﺑﺮﻧﺎﻣﺞ ﻧﺼﻲ ﻟﻨﻤﻮﺫﺝ ﺑﺮﻳﺪ ﻣﻦ ﺃﺟـﻞ ﻣﺴـﺘﺨﺪﻣﻲ‬
‫ﺍﻷﺟﻬﺰﺓ ﺍﻟﻼﺳﻠﻜﻴﺔ‪ ،‬ﻭﺫﻟﻚ ﻹﺭﺳﺎﻝ ﺭﺩﻭﺩ ﺃﻓﻌﺎﳍﻢ ﻋﻦ ﺻﻔﺤﺎﺗﻨﺎ ﺍﻟﻼﺳﻠﻜﻴﺔ‪ .‬ﺳﻨﺪﻋﻮ ﻫﺬﺍ ﺍﻟﱪﻧﺎﻣﺞ‬
‫ﺍﻟﻨﺼﻲ ﺑﺎﻻﺳﻢ ‪ .input.wml‬ﺗﺬﻛﱠﺮ ﺃﻥ ‪ PHP‬ﺳﺘﻔﺴ‪‬ﺮ ﺍﻵﻥ ﻣﻠﻔﺎﺕ ‪ ،WML‬ﺫﻟﻚ ﺃﻧﻨﺎ ﺃﺿـﻔﻨﺎﻫﺎ ﺇﱃ‬
‫ﺍﳌﻠﻒ ‪:httpd.conf‬‬
‫‪<?php‬‬
‫;)"‪include("hawhaw.inc‬‬

‫;)"‪$page = new HAW_deck("WAPMail‬‬

‫;)"‪$form = new HAW_form("submit.wml‬‬

‫;)"‪$text = new HAW_text("Please take the time to fill this out‬‬


‫;)‪$text->set_br(2‬‬

‫;)"‪$nameInput = new HAW_input("name", "", "Your Name‬‬


‫;)‪$nameInput->set_size(10‬‬
‫;)‪$nameInput->set_maxlength(25‬‬
‫;)"‪$emailInput = new HAW_input("email", "", "Your E-Mail‬‬
‫;)‪$emailInput->set_size(15‬‬
‫;)‪$emailInput->set_maxlength(100‬‬

‫‪www.raypub.com‬‬
‫‪raypubsales@gmail.com‬‬
1107 PHP ‫ ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ‬: 25

$comment = new HAW_input("comment", "", "Short Comment");


$comment->set_size(15);
$comment->set_maxlength(100);

$submit = new HAW_submit("Submit", "submit");

$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 ‫ﺑﺪﻻﹰ ﻣﻦ ﺍﳌﺘﺤﻮﻻﺕ ﺍﳌﺴﺘﺨﺪﻣﺔ ﰲ ﻋﺒﺎﺭﺍﺕ‬


<?php
include("hawhaw.inc");

$page = new HAW_deck("E-Mail Submission");

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;
}

$body .= "Name: $name\n";


$body .= "E-Mail: $email\n\n";
$body .= "Comments:\n$comment\n";

mail("devon@sitetronics.com", "WAPMail", $body, "From: $email");

$text = new HAW_text("Thank you for your input!");


$text->set_br(1);
$link = new HAW_link("Home", "homepage.wml");

$page->add_text($text);
$page->add_link($link);
$page->create_page();

?>


 
  
 
Image Creation and Manipulating
،‫ﺎ ﺗﺴﻤﺢ ﺑﺈﻧﺸﺎﺀ ﺣﻴﻮﻱ ﻟﻠﺼﻮﺭ ﻭﺗﻌﺪﻳﻠﻬﺎ‬‫ ﻣﻔﻴﺪﺓ ﻣﻦ ﻧﺎﺣﻴﺔ ﺃ‬GD ‫ﺗﻌﺘﱪ ﻣﻜﺘﺒﺔ ﺍﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻟﺼﻮﺭ‬
.http://www.boutell.com/gd/ ‫ ﻭﳝﻜﻨﻚ ﲢﻤﻴﻞ ﻫﺬﻩ ﺍﳌﻜﺘﺒﺔ ﻣﻦ ﺍﳌﻮﻗﻊ‬.PHP ‫ﻭﺫﻟﻚ ﺍﻋﺘﺒﺎﺭﺍﹰ ﻣﻦ‬

Installing The GD Library GD  


‫ ﺇﱃ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﻭﺣﺪﺓ ﳕﻄﻴﺔ ﺩﻳﻨﺎﻣﻴﻜﻴﺔ )ﳝﻜﻦ ﺃﻥ ﳚـﺪﻭﻫﺎ ﰲ‬Windows ‫ﺳﻴﺤﺘﺎﺝ ﻣﺴﺘﺨﺪﻣﻮ‬
‫ ﻓﺴـﻴﺤﺘﺎﺟﻮﻥ‬UNIX ‫ ﺃﻣﺎ ﻣﺴﺘﺨﺪﻣﻮ‬.‫( ﻭﻭﺿﻌﻬﺎ ﰲ ﺩﻟﻴﻞ ﺍﳌﻠﺤﻘﺎﺕ ﻟﺪﻳﻬﻢ‬PHP ‫ ﻣﻦ‬Windows ‫ﻧﺴﺨﺔ‬
‫ ﻣـﻦ ﺍﳌﻮﻗـﻊ‬zlip ‫ ﻭﻣﻜﺘﺒـﺎﺕ‬،http://www.libpng.org/pub/png/ ‫ ﻣﻦ ﺍﳌﻮﻗﻊ‬libpng ‫ﺇﱃ ﺍﳊﺼﻮﻝ ﻋﻠﻰ‬

www.raypub.com
raypubsales@gmail.com
‫‪1109‬‬ ‫‪PHP‬‬ ‫‪ : 25‬ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ‬

‫‪ ،http://www.info-zip.org/pub/infozip/zlib/‬ﻭ‪) FreeType‬ﺑﺸــﻜﻞ ﺍﺧﺘﻴــﺎﺭﻱ( ﻣــﻦ ﺍﳌﻮﻗــﻊ‬


‫‪ ،http://www.freetype.org/‬ﻭﻣﻜﺘﺒﺎﺕ ‪ LibJPEG‬ﻣﻦ ﺍﳌﻮﻗـﻊ ‪ ،ftp//ftp.uu.net/graphics/jpeg/‬ﻭﻣـﻦ ﰒ‬
‫ﺗﺜﺒﻴﺘﻬﺎ ﲨﻴﻌﺎﹰ ﻗﺒﻞ ﺇﻧﺸﺎﺀ ﻭﺗﺜﺒﻴﺖ ‪ .GD‬ﺗﻔﺘﺮﺽ ﺗﻌﻠﻴﻤﺎﺕ ﺍﻟﺘﺜﺒﻴﺖ ﺍﻟﺘﺎﻟﻴـﺔ ﺃﻥ ‪ X-Windows‬ﻭ‪automake‬‬

‫ﻣﺜﺒﺘﺎﻥ‪:‬‬
‫ﻳﻌﺘﱪ ﺗﺜﺒﻴﺖ ‪ zlib‬ﺳﻬﻼﹰ ﻟﻠﻐﺎﻳﺔ‪ :‬ﻗﻢ ﺑﺒﺴﺎﻃﺔ ﺑﺘﻜﻮﻳﻨﻪ ﻣﺴﺘﺨﺪﻣﺎﹰ ﺍﻷﻭﺍﻣﺮ ‪،./configure --shared‬‬ ‫‬

‫ﻭ‪ ،make‬ﻭ‪.make install‬‬


‫ﺑﻌﺪ ﻓﺮﺩ ﺍﳌﻜﺘﺒﺔ ‪ ،libpng‬ﻭﻧﺴﺦ ﺍﳌﻠﻒ ‪ makefile‬ﺍﻟﺬﻱ ﻳﻮﺍﻓﻖ ﻧﻈﺎﻡ ﺍﻟﺘﺸﻐﻴﻞ ﰲ ﺃﻋﻠﻰ ﺍﻟﺪﻟﻴﻞ‬ ‫‬
‫‪) libpng‬ﻋﻠﻰ ﺳﺒﻴﻞ ﺍﳌﺜﺎﻝ‪ ،‬ﻟﻨﺴﺦ ﺍﳌﻠﻒ ‪ makefile‬ﺍﻟﻘﻴﺎﺳﻲ ﺍﳋﺎﺹ ﺑﺎﻟﻨﻈﺎﻡ ‪ ،UNIX‬ﳝﻜﻨﻚ‬
‫ﺍﺳﺘﺨﺪﺍﻡ ﺍﻷﻣﺮ ‪ .(cp scripts/makefile.std makefile‬ﻗﻢ ﺑﺎﻟﺘﺤﻘﻖ ﻣﻦ ﺍﳌﻠﻒ ‪ makefile‬ﻭ‪pngconf.h‬‬

‫ﻟﻠﺘﺤﻘﻖ ﻣﻦ ﺃﻳﺔ ﺗﻐﻴﲑﺍﺕ ﺗﺮﻳﺪ ﺇﺟﺮﺍﺀﻫﺎ‪ ،‬ﰒ ﻧﻔﺬ ﺍﻷﻣﺮ ‪.make install‬‬
‫ﻟﺘﺜﺒﻴﺖ ﺍﳌﻜﺘﺒﺔ ‪ ،LibJPEG‬ﺳﻨﺤﺘﺎﺝ ﺇﱃ ﺗﻨﻔﻴﺬ ﺍﻷﻣﺮ ‪ ،/configure --enable-shared‬ﻭﻣﻦ ﰒ ﺍﻷﻣﺮ‬ ‫‬

‫‪ ،make‬ﰒ ‪.make install‬‬


‫ﺃﻣﺎ ﺗﺜﺒﻴﺖ ﺍﳌﻜﺘﺒﺔ ‪ FreeType‬ﻓﻬﻮ ﺃﻛﺜﺮ ﺻﻌﻮﺑﺔ‪ ،‬ﺇﺫ ﻳﺘﻢ ﺍﻟﺘﻜﻮﻳﻦ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻷﻣﺮ‪:‬‬ ‫‬

‫‪./configure --enable-shared --x-includes=/usr/X11R6/include --x-libraries=/usr/x11R6/lib‬‬

‫ﻗﻢ ﺑﻌﺪ ﺑﺘﻨﻔﻴﺬ ﺍﻷﻣﺮ ‪ ،make‬ﰒ ﺍﻷﻣﺮ ‪.make install‬‬


‫ﺃﺧﲑﺍﹰ‪ ،‬ﻗﻢ ﺑﺒﻨﺎﺀ ﻭﺗﺜﺒﻴﺖ ﺍﳌﻜﺘﺒﺔ ‪ GD‬ﺑﻔﺮﺩﻫﺎ ﻭﺗﻨﻔﻴﺬ ﺍﻷﻣﺮ ‪ ،make‬ﻭﻣﻦ ﰒ ﺍﻷﻣﺮ ‪.make install‬‬ ‫‬

‫ﳝﻜﻨﻚ ﺇﺿﺎﻓﺔ ﺩﻋﻢ ‪ 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‬‬

‫‪//Create a new image with width x height of 250 x 250‬‬


‫;)‪$image = ImageCreate(250, 250‬‬

‫‪//Define colors to be used by the image‬‬


‫‪//Red has a RGB value of 255, 0, 0‬‬
‫;)‪$red = IamgeColorAllocate($image, 255, 0, 0‬‬

‫‪//This blue is just a full channel of blue‬‬


‫;)‪$blue = ImageColorAllocate($image, 0, 0, 255‬‬

‫‪//We can now draw the line in the image from (0, 125) to‬‬
‫)‪//(250, 125‬‬
‫;)‪ImageLine($image, 0, 125, 250, 125, $blue‬‬

‫‪//Send the image out to the world...‬‬


‫;)‪ImagePng($image‬‬

‫‪www.raypub.com‬‬
‫‪raypubsales@gmail.com‬‬
‫‪1111‬‬ ‫‪PHP‬‬ ‫‪ : 25‬ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ‬

‫‪//Free our memory resources‬‬


‫;)‪ImageDestroy($image‬‬
‫>?‬

‫ﺗﻮﺟﺪ ﻋﺪﺓ ﺗﻮﺍﺑﻊ ﺇﺿﺎﻓﻴﺔ ﻗﺪ ﺗﻜﻮﻥ ﻣﻔﻴﺪﺓ ﰲ ﺍﻟﺸﻴﻔﺮﺓ ﺍﻟﺴﺎﺑﻘﺔ‪ .‬ﺇﺫ ﻟﻴﺲ ﲟﻘﺪﻭﺭﻙ ﺇﻧﺸﺎﺀ ﺻـﻮﺭﺓ‬
‫ﺟﺪﻳﺪﺓ ﻓﺎﺭﻏﺔ ﻓﻘﻂ‪ ،‬ﺑﻞ ﻭﳝﻜﻨﻚ ﺗﻌﺪﻳﻞ ﺍﻟﺼﻮﺭ ﺍﻟﱵ ﰎ ﺇﻧﺸﺎﺅﻫﺎ ﻣﺴﺒﻘﺎﹰ‪ .‬ﻭﻧﻘﻮﻡ ﺑﺬﻟﻚ ﺑﺎﺳـﺘﺨﺪﺍﻡ‬
‫ﺍﻟﺘﺎﺑﻊ ) (‪ ،ImageCreateFromPng‬ﻭﺍﻟﺬﻱ ﻳﻌﻴﺪ ﻣﺮﺟﻌﺎﹰ ﺇﱃ ﺍﻟﺼﻮﺭﺓ ﻋﻨﺪ ﺍﻟﻌﺜﻮﺭ ﻋﻠﻴﻬﺎ‪ ،‬ﻭﻳﻮﻟﺪ ﺭﺳﺎﻟﺔ‬
‫ﺧﻄﺄ ﺇﺫﺍ ﱂ ﻳﺘﻤﻜﻦ ﻣﻦ ﺫﻟﻚ‪ .‬ﺇﺿﺎﻓﺔ ﺇﱃ ﻣﺎ ﺳﺒﻖ‪ ،‬ﻭﺇﺫﺍ ﻣﺎ ﺃﺭﺩﻧﺎ ﺣﻔﻆ ﺻﻮﺭﺗﻨﺎ ﰲ ﻣﻠﻒ‪ ،‬ﻓﻴﻤﻜﻨﻨﺎ‬
‫ﺍﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﺎﺑﻊ ) (‪ ImagePng‬ﻣﻊ ﺇﺭﻓﺎﻗﻪ ﺑﺴﻠﺴﻠﺔ ﳏﺮﻓﻴﺔ ﺗﻌﱪ ﻋﻦ ﺍﺳﻢ ﺍﳌﻠﻒ‪:‬‬
‫‪ImagePng($imageIdent, "image.png")).‬‬

‫ﻛﻤﺎ ﳛﺘﻤﻞ ﺃﻳﻀﺎﹰ ﺃﻧﻨﺎ ﻗﺪ ﻧﺮﻏﺐ ﲟﻌﺮﻓﺔ ﺣﺠﻢ )ﺍﻟﻄﻮﻝ ﻭﺍﻟﻌﺮﺽ( ﺍﻟﺼﻮﺭﺓ ﺍﻟﱵ ﻧﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ‪ .‬ﻭﳝﻜﻨﻨﺎ‬
‫ﲢﻘﻴﻖ ﺫﻟﻚ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﺎﺑﻊ ) (‪ ،GetImageSize‬ﻭﺍﻟﺬﻱ ﺳﻴﻌﻴﺪ ﻣﺼﻔﻮﻓﺔ‪ .‬ﻻﺣﻆ ﺃﻥ ﻫﺬﺍ ﺍﻟﺘﺎﺑﻊ ﻻ‬
‫ﳛﺘﺎﺝ ﺇﱃ ﺗﺜﺒﻴﺖ ﻣﻜﺘﺒﺔ ‪ GP‬ﻭﻫﻮ ﺃﺻﻴﻞ ﰲ ‪.PHP‬‬
‫ﲢﻮﻱ ﺍﳌﺼﻔﻮﻓﺔ ﺃﺭﺑﻌﺔ ﻋﻨﺎﺻﺮ‪ :‬ﻋﺮﺽ ﺍﻟﺼﻮﺭﺓ ﻣﻘﺪﺭﺍﹰ ﺑﺎﻟﺒﻜﺴﻞ‪ ،‬ﻭﻃﻮﳍﺎ ﺑﺎﻟﺒﻜﺴﻞ ﺃﻳﻀﺎﹰ‪ ،‬ﻭﻋﻠﻤـﹰﺎ‬
‫ﻳﺸﲑ ﺇﱃ ﻧﻮﻉ ﻣﻠﻒ ﺍﻟﺼﻮﺭﺓ )‪ ،PNG‬ﺃﻭ ‪ ،JPG‬ﺃﻭ ‪ ،(WBMP‬ﻭﺳﻠﺴﻠﺔ ﳏﺮﻓﻴﺔ ﻧﺼﻴﺔ ﲢﻤﻞ ﺍﻟﻌـﺮﺽ‬
‫ﻭﺍﻻﺭﺗﻔﺎﻉ )ﺃﻱ‪ ("HEIGHT = imgHeight WIDTH = imgWidth" :‬ﳝﻜﻦ ﺍﺳﺘﺨﺪﺍﻣﻬﺎ ﻣﺒﺎﺷﺮﺓ ﺩﺍﺧﻞ‬
‫ﺍﻟﻌﻼﱠﻣﺔ >‪ .<img‬ﳝﻜﻨﻨﺎ‪ ،‬ﻣﺘﺴﻠﺤﲔ ‪‬ﺬﻩ ﺍﳌﻌﺮﻓﺔ‪ ،‬ﺃﻥ ﻧﻨﺸﺊ ﺗﺎﺑﻌﺎﹰ ﺩﻳﻨﺎﻣﻴﻜﻴﹰﺎ ﻟﺘﻮﻟﻴﺪ ﻋﻼﱠﻣـﺔ >‪<img‬‬

‫)ﻭﺍﻟﺬﻱ ﻻ ﳛﺘﺎﺝ ﺑﺪﻭﺭﻩ ﺇﱃ ﺗﺜﺒﻴﺖ ﺍﳌﻜﺘﺒﺔ ‪ GD‬ﻋﻠﻰ ﻧﻈﺎﻣﻚ(‪:‬‬


‫)‪function imgTag($filename‬‬
‫{‬
‫;)‪$imageSize = GetImageSize($filename‬‬
‫;)">" ‪echo("<img src=\"$fileName\"" . $imageSize[3] .‬‬

‫‪Making a Counter With GD‬‬ ‫ 



 
 ‪GD‬‬
‫ﺗﺜﺒﺖ ﺍﳌﻜﺘﺒﺔ ‪ GD‬ﻋﻦ ﻣﺪﻯ ﻓﺎﺋﺪ‪‬ﺎ ﰲ ﺗﻮﻟﻴﺪ ﺻﻮﺭ ﺣﻴﻮﻳﺔ ﻋﻨﺪ ﺇﻧﺸﺎﺀ ﻋﺪﺍﺩ ﺩﺧﻮﻝ ﺇﱃ ﺍﳌﻮﻗﻊ‪ .‬ﳚﺐ‬
‫ﺃﻥ ﺗﻜﻮﻥ ﺧﻮﺍﺭﺯﻣﻴﺔ ﺍﻟﻌﺪﺍﺩ ﻛﻤﺎ ﻳﻠﻲ‪:‬‬
‫ﺍﺳﺘﺪﻋﺎﺀ ﻟﻌﺪﺩ ﻣﺮﺍﺕ ﺍﻟﺪﺧﻮﻝ ﻣﻦ ﻣﻠﻒ ﺍﻟﺘﺴﺠﻴﻞ‪.‬‬ ‫‬

‫ﺇﺿﺎﻓﺔ ‪ 1‬ﺇﱃ ﻣﻠﻒ ﺍﻟﺘﺴﺠﻴﻞ‪.‬‬ ‫‬

‫ﺗﻮﻟﻴﺪ ﺍﻟﺼﻮﺭﺓ ﻣﻊ ﻋﺪﺩ ﻣﺮﺍﺕ ﺍﻟﺪﺧﻮﻝ‪.‬‬ ‫‬

‫‪www.raypub.com‬‬
‫‪raypubsales@gmail.com‬‬
‫‪25 : PHP Extension Lbraries‬‬ ‫‪1112‬‬

‫ﻋﺮﺽ ﺍﻟﺼﻮﺭﺓ ﰲ ﺍﳌﺴﺘﻌﺮﺽ‪.‬‬ ‫‬

‫ﲢﺪﻳﺪ ﻣﻮﺍﺭﺩ ﺍﻟﻨﻈﺎﻡ‪.‬‬ ‫‬

‫‪Counter Code‬‬ ‫ ‬


‫ﺗﺘﻤﺜﻞ ﺍﻟﺘﻮﺍﺑﻊ ﺍﻟﻮﺣﻴﺪﺓ ﺍﻟﱵ ﺳﻨﺠﺪﻫﺎ ﰲ ﻫﺬﺍ ﺍﳌﺜﺎﻝ‪ ،‬ﺩﻭﻥ ﺃﻥ ﻳﻜﻮﻥ ﻗﺪ ﺳﺒﻖ ﻟﻨﺎ ﻭﺃﻥ ﲢﺪﺛﻨﺎ ﻋﻨﻬﺎ‪،‬‬
‫ﰲ ﺗﻮﺍﺑﻊ ﺍﻟﺴﻼﺳﻞ ﺍﶈﺮﻓﻴﺔ ﻭﺗﻮﺍﺑﻊ ﺍﻟﺸﻜﻞ ﻭﺍﻟﺼﻮﺭﺓ‪ ،‬ﻭﺍﻟﱵ ﺗﻘﻮﺩﻧﺎ ﺇﱃ ﺇﻧﺸﺎﺀ ﻣﺴـﺘﻄﻴﻞ ﻭﺗﻌﺒﺌﺘـﻪ‪.‬‬
‫ﺗﺘﻌﺎﻣﻞ ﺗﻮﺍﺑﻊ ﺍﻟﺴﻼﺳﻞ ﺍﶈﺮﻓﻴﺔ ﻣﻊ ﲤﺜﻴﻞ ﺍﻟﺼﻮﺭﺓ ﻛﺴﻠﺴﻠﺔ ﳏﺮﻓﻴﺔ‪ ،‬ﻭﺳﻨﺴﺘﺨﺪﻣﻬﺎ ﻟﻌـﺮﺽ ﻋـﺪﺩ‬
‫ﻣﺮﺍﺕ ﺍﻟﺪﺧﻮﻝ ﺍﻟﱵ ﰎ ﺗﺴﺠﻴﻠﻬﺎ ﰲ ﻣﻠﻒ ﺍﻟﺘﺴﺠﻴﻞ‪ .‬ﻭﳝﻜﻨﻚ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﻗﺎﺋﻤﺔ ﻛﺎﻣﻠﺔ ﺑﺘﻮﺍﺑـﻊ‬
‫ﺍﳌﻜﺘﺒﺔ ‪ GD‬ﺑﺎﻟﻌﻮﺩ ﺇﱃ ﺩﻟﻴﻞ ﺍﺳﺘﺨﺪﺍﻡ ‪.PHP‬‬
‫ﻳﺴﻤﺢ ﻟﻨﺎ ﻫﺬﺍ ﺍﻟﺘﺎﺑﻊ ﺑﺈﺿﺎﻓﺔ ﺳﻼﺳﻞ ﳏﺮﻓﻴﺔ ﻧﺼﻴﺔ ﻟﺼﻮﺭﻧﺎ‪ ،‬ﻭﻫﻲ ﰲ ﺣﺎﻟﺘﻨﺎ ﻫﺬﻩ ﺃﻋﺪﺍﺩ ﺗﺄﰐ ﻣـﻦ‬
‫ﺗﺎﺑﻊ ﺍﻟﺘﺴﺠﻴﻞ ﺍﻟﺬﻱ ﳛﻮﻱ ﻋﺪﺩ ﻣﺮﺍﺕ ﺍﻟﺪﺧﻮﻝ‪ .‬ﻟﻨﺪﻋﻮ ﻫﺬﺍ ﺍﳌﻠﻒ ﺑﺎﻻﺳﻢ ‪:counter.php‬‬
‫‪<?php‬‬
‫)‪function hitCount($fileName‬‬
‫{‬

‫ﻋﻠﻴﻨﺎ ﺃﻭﻻﹰ ﺃﻥ ﻧﺒﲔ ﻓﻴﻤﺎ ﺇﺫﺍ ﻛﻨﺎ ﻗﺎﺩﺭﻳﻦ ﻋﻠﻰ ﻓﺘﺢ ﺍﳌﻠﻒ ﻟﻠﺘﻌﺎﻣﻞ ﻣﻊ ﺍﻟﻌﺪ‪‬ﺍﺩ‪:‬‬
‫{ ))"‪if (!$filePointer = fopen($fileName, "r+‬‬
‫;)"‪echo("Error opening file $fileName\n‬‬
‫;‪exit‬‬
‫}‬

‫ﰒ ﳓﺎﻭﻝ ﺍﳊﺼﻮﻝ ﻋﻠﻰ ﻋﺪﺩ ﻣﺮﺍﺕ ﺍﻟﺪﺧﻮﻝ ﻣﻦ ﻣﻠﻒ ﺍﻟﺘﺴﺠﻴﻞ‪:‬‬


‫{ )))‪if (!$hits = fread($filePointer, filesize($fileName‬‬
‫;)"‪echo("Error reading hits from $fileName\n‬‬
‫;‪exit‬‬
‫}‬

‫‪//Increment the number of hits‬‬


‫;‪$hits++‬‬

‫‪//Rewind the file for a clean write‬‬


‫{ )‪if (rewind($filePointer) == 0‬‬
‫;)"‪echo("Couldn't rewind file‬‬
‫;‪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‬‬

‫ﻧﻘﻮﻡ ﺍﻵﻥ ﺑﺘﻮﻟﻴﺪ ﺍﻟﺼﻮﺭ ﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﺘﺎﺑﻊ ﺍﳌﻮﺻ‪‬ﻒ ﻓﻴﻤﺎ ﻳﻠﻲ‪:‬‬


‫;)‪$image = makeImage($hits‬‬

‫ﺃﺧﲑﺍﹰ‪ ،‬ﻧﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﻋﻼﱠﻣﺔ >‪ <img‬ﻟﻠﺼﻔﺤﺔ ﺍﳌﺴﺘﺪﻋﺎﺓ‪ .‬ﻛﻤﺎ ﻭﳒﻌﻠﻬﺎ ﻣﻔﻬﻮﻣﺔ ﻣﻦ ﻗﺒـﻞ ﺗﻠـﻚ‬
‫ﺍﳌﺴﺘﻌﺮﺿﺎﺕ ﻏﲑ ﺍﻟﺮﺳﻮﻣﻴﺔ‪:‬‬
‫;">"\‪$counter = "<img src=\"$image\" alt=\"Hits: $hits‬‬

‫;‪return $counter‬‬
‫}‬

‫ﳓﺘﺎﺝ ﺍﻵﻥ ﺇﱃ ﺇﻧﺸﺎﺀ ﺗﺎﺑﻊ ﻳﺘﻮﱃ ﺇﻧﺸﺎﺀ ﺻﻮﺭﺓ ﺣﻴﻮﻳﺔ ﻭﺇﻋﺎﺩﺓ ﻣﺴﺎﺭﻫﺎ‪:‬‬
‫)‪function makeImage($number‬‬
‫{‬

‫ﳝﺜﻞ ﻣﺎ ﻳﻠﻲ ﺍﺳﻢ ﻣﻠﻒ ﻋﺪ‪‬ﺍﺩﻧﺎ‪:‬‬


‫;"‪$image = "./hits.png‬‬

‫ﺳﻮﻑ ﻧﻘﻮﻡ ﺑﺘﻌﻴﲔ ﺑﻌﺾ ﺍﳌﺘﺤﻮﻻﺕ ﻟﺘﺤﺪﻳﺪ ﻃﻮﻝ ﻭﻋﺮﺽ ﺍﻟﺼﻔﺤﺔ ﺍﳊﻴﻮﻳﺔ‪:‬‬
‫;)‪$lenHits = strlen($number‬‬
‫;)‪$charHeight = ImageFontHeight(5‬‬
‫;)‪$charWidth = ImageFontWidth(5‬‬
‫;‪$stringWidth = $charWidth * $lenHits‬‬

‫ﺩﻋﻨﺎ ﻧﻀﻴﻒ ﺑﻌﺪ ﺍﻟﺘﻮﺳﻊ ﻷﺑﻌﺎﺩ ﺻﻮﺭﺗﻨﺎ‪ ،‬ﻭﺑﺬﻟﻚ ﻻ ﺗﺒﺪﻭ ﻫﺬﻩ ﻣﻀﻐﻮﻃﺔ ﻟﻠﻐﺎﻳﺔ‪:‬‬

‫‪www.raypub.com‬‬
‫‪raypubsales@gmail.com‬‬
25 : PHP Extension Lbraries 1114

$imgWidth = $stringWidth + 10;


$imgHeight = $charHeight + 10;

//Find centering dimensions


$imgMidX = $imgWidth / 2;
$imgMidY = $imgHeight / 2;

:‫ ﻭﺑﺎﺳﺘﺨﺪﺍﻡ ﺍﻟﻘﻴﻢ ﺍﶈﺴﻮﺑﺔ ﻓﻴﻤﺎ ﺳﺒﻖ‬،$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);

:‫ﺳﻮﻑ ﻧﻘﻮﻡ ﺑﺈﻧﺸﺎﺀ ﺗﺄﺛﲑ "ﻇﻞ ﺳﺎﻗﻂ" ﺑﺎﺳﺘﺨﺪﺍﻡ ﻣﺴﺘﻄﻴﻠﲔ‬


ImageFilledRectangle($i, 3, 3, $imgWidth, $imgHeight, $black);
ImageFilledRectangle($i, 0, 0, $imgWidth-3, $imgHeight-3, $red);

‫( ﻟﻨﺤﺪﺩ ﺍﳌﻨﻄﻘﺔ ﺍﻟﱵ‬midpoint) ‫ﻧﺴﺘﺨﺪﻡ ﺍﻵﻥ ﻣﻮﺍﺿﻊ ﺗﻘﻊ ﰲ ﻣﻨﺘﺼﻒ ﺍﳌﺴﺎﻓﺔ ﺍﻟﱵ ﺗﻔﺼﻞ ﻧﻘﻄﺘﲔ‬
:‫ﺳﻨﺒﺪﺃ ﺍﻟﺮﺳﻢ ﻣﻨﻬﺎ‬
$textX = $imgMidX - ($stringWidth / 2) + 1;
$textY = $imgMidY - ($charHeight / 2);

1 ‫ )ﻭﺍﻟﱵ ﺗﺘﺮﺍﻭﺡ ﻣـﻦ‬GD ‫ ﳝﺜﻞ ﺍﻟﺒﺎﺭﺍﻣﺘﺮ ﺍﻟﺜﺎﱐ ﺃﺣﺪ ﺍﳋﻄﻮﻁ ﺍﳌﻀﻤﻨﺔ ﰲ‬.‫ﻧﻘﻮﻡ ﺍﻵﻥ ﺑﺮﺳﻢ ﺍﻟﻌﺪﺩ‬
:(5 ‫ﺣﱴ‬
ImageString($i, 4, $textX, $textY, $number, $black);

:PNG ‫ﻳﺘﻢ ﺍﻵﻥ ﺇﺧﺮﺍﺝ ﺍﻟﺼﻮﺭﺓ ﺇﱃ ﻣﻠﻒ‬


ImagePng($i, $image);

:<img> ‫ ﻧﻌﻴﺪ ﻣﺴﺎﺭ ﺍﻟﻌﻼﹼﻣﺔ‬،‫ﺃﺧﲑﺍﹰ‬


return $image;
}
?>

www.raypub.com
raypubsales@gmail.com
‫‪1115‬‬ ‫‪PHP‬‬ ‫‪ : 25‬ﻣﻜﺘﺒﺎﺕ ﻣﻠﺤﻘﺎﺕ‬

‫ﱂ ﻳﺒﻖ ﻋﻠﻴﻨﺎ ﺍﻵﻥ ﺇﻻ ﺍﺳﺘﺪﻋﺎﺀ ﺍﻟﺼﻮﺭﺓ ﺿﻤﻦ ﻣﻠﻒ ‪ HTML‬ﺍﳋﺎﺹ ﺑﻨﺎ‪:‬‬


‫>‪<html‬‬

‫>‪<head‬‬
‫>‪<title>Test Page For Our Counter</title‬‬
‫>‪</head‬‬
‫>‪<body‬‬

‫>‪<!-- HTML Content of The Page --‬‬

‫ﳕﻴﻞ ﺇﱃ ﻭﺿﻊ ﺍﻟﺼﻮﺭﺓ ﰲ ﻣﻠﻒ ‪ ،HTML‬ﻭﰲ ﻣﻮﺿﻊ ﻗﺮﻳﺐ ﻣﻦ ﺃﺳﻔﻞ ﺍﻟﺼﻔﺤﺔ‪ .‬ﻭﻳﺘﺤﻘﻖ ﺫﻟـﻚ‬
‫ﻛﻤﺎ ﻳﻠﻲ )ﻋﻠﻰ ﻓﺮﺽ ﺃﻥ ﻣﻠﻒ ﺗﺴﺠﻴﻞ ﻋﺪ‪‬ﺍﺩﻙ ﻫﻮ ‪:(hitlog.txt‬‬
‫‪<?php‬‬
‫;)"‪include("counter.php‬‬
‫;)"!‪echo("We've had " . hitCount("hitlog.txt") . "visitors‬‬
‫>?‬

‫>‪<br‬‬

‫>‪<!-- More content, if desired --‬‬

‫>‪</body‬‬
‫>‪</html‬‬

‫‪Summary‬‬ ‫‬
‫ﺃﻟﻘﻴﻨﺎ ﺍﻟﻀﻮﺀ ﰲ ﻫﺬﺍ ﺍﻟﻔﺼﻞ ﻋﻠﻰ ﺑﻌﺾ ﻣﻦ ﺍﳌﻜﺘﺒﺎﺕ ﺍﻟﻌﺪﻳﺪﺓ ﺍﻟﱵ ﺗﻘﺪﻡ ﻣﻠﺤﻘﺎﺕ ﻟﻨﻮﺍﺓ ﻟﻐﺔ ‪.PHP‬‬
‫ﻭﻗﺪ ﺗﻌﻠﻤﻨﺎ ﻛﻴﻔﻴﺔ ﺍﺳﺘﺨﺪﺍﻡ ‪ PDFlib‬ﻟﺘﻮﻟﻴﺪ ﻣﺴﺘﻨﺪﺍﺕ ‪ ،PDF‬ﻭ‪ Ming‬ﻟﺘﻮﻟﻴﺪ ﻣﻠﻔـﺎﺕ ‪Shockwave Flash‬‬
‫ﺣﻴﻮﻳﺔ‪ ،‬ﻭ‪ HAWHAW‬ﻟﻨﺴﻤﺢ ﳌﺴﺘﺨﺪﻣﻲ ﺍﻷﺟﻬﺰﺓ ﺍﻟﻼﺳﻠﻜﻴﺔ ﲟﺸﺎﻫﺪﺓ ﻣﻮﺍﻗﻌﻨﺎ‪ ،‬ﻭﻣﻜﺘﺒﺔ ‪ GD‬ﻹﻧﺸـﺎﺀ‬
‫ﺻﻮﺭ ﺣﻴﻮﻳﺔ‪ .‬ﻭﳝﻜﻨﻨﺎ‪ ،‬ﺑﺎﺳﺘﺨﺪﺍﻡ ﻫﺬﻩ ﺍﳌﻜﺘﺒﺎﺕ ﻭﻏﲑﻫﺎ‪ ،‬ﺗﻠﺒﻴﺔ ﺣﺎﺟﺎﺕ ﺃﻱ ﻣﺴﺘﺨﺪﻡ ﻟﻺﻧﺘﺮﻧـﺖ‬
‫ﺗﻘﺮﻳﺒﺎﹰ‪.‬‬

‫‪www.raypub.com‬‬
‫‪raypubsales@gmail.com‬‬

You might also like