السلام عليكم،
اقدم لكم اليوم كلاس/فئة لتحويل شكل الروابط،
فهناك ما يسمى بـ clean url وهي روابط صديقة لمحركات البحث
ويكون بالشكل التالي:
http://www.site.com/artical/details/231
بينما الشكل العادي للروابط يكون على النحو التالي:
http://www.site.com/artical.php?show=details&id=231
تعريف المتغيرات
$link->define(" str show; int id; ");
يجب تعريف متغيرات الرابط التي تستخدمها من خلال الدالة define
وذلك لحماية المتغيرات
وتسمح الدالة define بإضافة انواع عديدة لغرض الحماية كل متغير له اسم ونوع فالرابط التالي:
وتسمح الدالة define بإضافة انواع عديدة لغرض الحماية كل متغير له اسم ونوع فالرابط التالي:
www.site.com/artical.php?show=details&id=231
حيث وأن الرابط يحتوي على المتغيرات/المعاملات التالية:
- show متغير نصي
- id متغير رقمي
- show متغير نصي
- id متغير رقمي
اختيار وتغيير شكل الرابط
$link->setURL('http://www.site.com/?id=231', CleanURL::SHORT);
تستخدم الدالة setURL لتغيير شكل الرابط ولها ثلاثة معاملات
- الأول تضع فيه الرابط.
- الثاني لتحديد شكل الرابط، وهو يأخذ احدى قيمتين:
* CleanURL::SHORT وهو عبارة عن القيمة 1
* CleanURL::LONG وهو عبارة عن القيمة 2.
- الثالث يستخدم ليقوم بالتحويل قسراً حيث أن الدالة لا تقوم بتحويل أنواع الروابط الخارجية،
ويقتصر على تحويل الروابط الداخلية فقط في حالة عدم إعطاء المعامل الثالث القيمة true.
يجب ان تكون معاملات الرابط الخارجي مشابهة للمعاملات التي تم تعريفها في الدالة define.
- الأول تضع فيه الرابط.
- الثاني لتحديد شكل الرابط، وهو يأخذ احدى قيمتين:
* CleanURL::SHORT وهو عبارة عن القيمة 1
* CleanURL::LONG وهو عبارة عن القيمة 2.
- الثالث يستخدم ليقوم بالتحويل قسراً حيث أن الدالة لا تقوم بتحويل أنواع الروابط الخارجية،
ويقتصر على تحويل الروابط الداخلية فقط في حالة عدم إعطاء المعامل الثالث القيمة true.
يجب ان تكون معاملات الرابط الخارجي مشابهة للمعاملات التي تم تعريفها في الدالة define.
تحديد شكل لجميع الروابط اللاحقة
$link->setType(CleanURL::LONG);
يمكن استخدام الدالة setType لتحديد شكل جميع الروابط، وتبقى الأولوية للدالة setURL لتحديد شكل الرابط.
وعند استخدام الدالة setType فلا تحتاج لتحديد شكل الرابط في الدالة setURL. استبعاد مسار أو اسم ملف
وعند استخدام الدالة setType فلا تحتاج لتحديد شكل الرابط في الدالة setURL. استبعاد مسار أو اسم ملف
$link->exclusionPath( 'forum/thread');
إذا كان هناك مسار لمجلد معين فيجب تحديده كمسار
لكي يتم استبعاده من عملية التحويل، فالرابط التالي:
http://mysite/forum/thread/512
يحتوي على مسار
form/thread
ويحتوي على متغير
id=512
لذا نستخدم الدالة exclusionPath ونحدد المسار المراد استبعاده
$link->exclusionPath('artical.php', '.php');
يحتلف تطبيق الدالة exclusionPath على الروابط الطويلة
حيث يمكن استبعاد مسار وحذف جزء منه
فمثلاً إذا أردنا تحويل الرابط:
فمثلاً إذا أردنا تحويل الرابط:
http://www.site.com/artical.php?show=details&id=231
ليكون على الشكل :
www.site.com/artical/details/231
يجب استبعاد المسار artical.php
واستبعاد اللاحقة .php ايضاً
لذا نستخدم الدالة exclusionPath.
ملاحظات للتطوير
بقي التذكير بأنه في حالة رغبتك بتطوير هذا الكلاس تستطيع استخدام الدالتين _short2long و _long2short لتحويل متغيرات الرابط، حيث تقوم كل دالة بتغيير نوع الرابط للشكل المناسب ولاحاجة للتعديل عليهما، وما عدا ذلك فيمكنك تغييره حسب الحاجة.كود الكلاس/الفئة CleanURL
<?php /* *********************************** * Author : <HishamDalal@gmail.com> * Project Name : CleanURL * Version : 1.0 * Date : 2013-11-10 13:10 * *********************************** */ class CleanURL { const SHORT = 1; const LONG = 2; // $link_types Would be like this array Ex. array('page'=>1, 'cat'=>'news', 'id'=>23); private $link_types = array(); private $type = 0; private $full_url = null; private $site_name = null; private $exclusion_path = null; private $remove_from_path = null; //------------------------------------------------------------------// // This function has an effect that change URL type, //so you don't need to mention the type in second parameter when you use the function "set" function setType($to){ $to = intval($to); if($to == CleanURL::SHORT || $to == CleanURL::LONG){ $this->type = $to; } } //------------------------------------------------------------------// // Used to define URL parameter types function define($strCode){ preg_match_all("/([\w]+)[\s]+([\w]+);/s", $strCode, $m); if(isset($m[1]) && isset($m[2])){ $this->link_types = array_combine($m[2], $m[1]); } } //------------------------------------------------------------------// // Make a decision private function _set($link, $type=0) { if($type==CleanURL::LONG){ return $this->_short2long($link); }elseif($type==CleanURL::SHORT){ return $this->_long2short($link); }elseif($this->type==CleanURL::LONG){ return $this->_short2long($link); }elseif($this->type==CleanURL::SHORT){ return $this->_long2short($link); } return $link; } //------------------------------------------------------------------// private function _short2long($link) { //Find wrong sign if(strpos($link, '&')){ return $link; } $link = trim($link, '/'); $ary = explode('/', $link); if(is_array($ary) && count($ary)>1){ $i=0; $link = '?'; foreach($this->link_types as $key=>$type){ $myKey = @$ary[$i]; if(isset($myKey)){ $value = $this->_applayVarType($myKey, $type); $link .= $key.'='.$value.'&'; } $i++; } $link = rtrim($link, '&'); } return $link; } //------------------------------------------------------------------// private function _long2short($link1) { $link1 = trim($link1, '?'); $ary = explode('&', $link1); $link = ''; if(is_array($ary) && count($ary)>1){ foreach($ary as $var) { $varData = explode('=', $var); if(count($varData)>1){ $key = $varData[0]; $value = $varData[1]; if(isset($this->link_types[$key])){ $value = $this->_applayVarType($value, $this->link_types[$key]); $link .= $value.'/'; } }else{ return $link1; } } return rtrim($link, '/'); } return $link1; } //------------------------------------------------------------------// // Secure variable type. private function _applayVarType($value, $type) { switch($type) { // You can add any security function you want. case 'int': $value = intval($value); break; case 'chr': $value = strlen($value)==1 ? $value : $value[0]; break; } return $value; } //------------------------------------------------------------------// function exclusionPath($path, $remove=null){ $this->exclusion_path = $path;//str_replace($remove, '', $path); $this->remove_from_path = $remove; } //------------------------------------------------------------------// //------------------------------------------------------------------// // Main function for end-user, It's used to convert URL format function setURL($url, $type=0, $force=null){ $parse = parse_url($url); if( isset($parse['host']) || $force){ $scheme = isset($parse['scheme']) ? $parse['scheme'].'//' : ''; $host = isset($parse['host']) ? $parse['host'] : ''; $path = isset($parse['path']) ? $parse['path'] : ''; $query = isset($parse['query']) ? $parse['query'] : ''; if(@$parse['host']==$_SERVER['HTTP_HOST'] || $force){ if( $query ){ // long to short $path = str_replace($this->exclusion_path, '', $path); $url = $scheme.$host.$path . str_replace($this->remove_from_path, '/', $this->exclusion_path) . $this->_set($query, $type); }elseif( $path ){ // short to long $path = str_replace($this->exclusion_path, '', $path); $url = $scheme.$host.'/' .$this->exclusion_path .$this->_set($path, $type); } $this->exclusion_path = null; $this->remove_from_path = null; } }else{ trigger_error("Wrong URL Format!"); } return $url; } //------------------------------------------------------------------// } ?>
استخدام الفئة
<?php $link = new CleanURL(); // Define parameters types $link->define(" int page; str cat; str sub; int id; chr k; "); $url = 'http://localhost/1z/news/details/12/y'; echo '<hr><b>Convert short to long:</b>'; echo '<br /><b>Source:</b> '. $url .'<br /><b>Result:</b> '; echo $link->setURL($url, CleanURL::LONG); //------------------------------------------------------------------------ $url = 'http://localhost/?page=1&cat=news&sub=details&id=12code&k=false'; echo '<hr><b>Convert long to short:</b>'; echo '<br /><b>Source:</b> '. $url .'<br /><b>Result:</b> '; echo $link->setURL($url, CleanURL::SHORT, true); //------------------------------------------------------------------------ $link->exclusionPath( 'forum/index.php'); $url = 'http://localhost/forum/index.php/1z/news/details/12/y'; echo '<hr><b>Convert short to long</b> [Use function "exclusionPath()"]: '; echo '<br /><b>Source:</b> '. $url .'<br /><b>Result:</b> '; echo $link->setURL($url, CleanURL::LONG); //------------------------------------------------------------------------ $link->exclusionPath( 'index.php' , '.php'); $url = 'http://localhost/forum/index.php?page=1&cat=news&sub=details&id=12code&k=false'; echo '<hr><b>Convert long to short:</b> [Use function "exclusionPath()"]: '; echo '<br /><b>Source</b>: '. $url .'<br /><b>Result:</b> '; echo $link->setURL($url, CleanURL::SHORT); //------------------------------------------------------------------------ $url = 'http://localhost/1/news/details/12/y'; echo '<hr><b>Convert short to long</b> [Use function "setType()"]: '; echo '<br /><b>Source:</b> '. $url .'<br /><b>Result:</b> '; $link->setType(CleanURL::LONG); echo $link->setURL($url); //------------------------------------------------------------------------ $url = 'http://othersite.com/any-query'; echo '<hr><b>Convert other site url</b> (Doesn\'t convert): '; echo '<br /><b>Source</b>: '. $url .'<br /><b>Result:</b> '; echo $link->setURL($url, CleanURL::LONG); $url = 'http://othersite.com/forum/?page=1&cat=news&sub=details&id=12code&k=false'; echo '<hr><b>Convert other site url:</b> [Use "force" to convert]: '; echo '<br /><b>Source</b>: '. $url .'<br /><b>Result:</b> '; echo $link->setURL($url, CleanURL::SHORT, true); ?>
0 تعليقات:
إرسال تعليق