الأحد، 17 نوفمبر 2013

كلاس/فئة لتحويل شكل الروابط CleanURL

السلام عليكم، اقدم لكم اليوم كلاس/فئة لتحويل شكل الروابط، فهناك ما يسمى بـ 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 بإضافة انواع عديدة لغرض الحماية كل متغير له اسم ونوع فالرابط التالي:

 www.site.com/artical.php?show=details&id=231  

حيث وأن الرابط يحتوي على المتغيرات/المعاملات التالية:
- show متغير نصي
- id  متغير رقمي

اختيار وتغيير شكل الرابط


 $link->setURL('http://www.site.com/?id=231', CleanURL::SHORT);  

تستخدم الدالة setURL لتغيير شكل الرابط ولها ثلاثة معاملات
- الأول تضع فيه الرابط.
- الثاني لتحديد شكل الرابط، وهو يأخذ احدى قيمتين:
* CleanURL::SHORT وهو عبارة عن القيمة 1
* CleanURL::LONG وهو عبارة عن القيمة 2.
- الثالث يستخدم ليقوم بالتحويل قسراً حيث أن الدالة لا تقوم بتحويل أنواع الروابط الخارجية،
ويقتصر على تحويل الروابط الداخلية فقط في حالة عدم إعطاء المعامل الثالث القيمة true.
يجب ان تكون معاملات الرابط الخارجي مشابهة للمعاملات التي تم تعريفها في الدالة define.

تحديد شكل لجميع الروابط اللاحقة


 $link->setType(CleanURL::LONG);  

يمكن استخدام الدالة 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 تعليقات:

إرسال تعليق

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Blogger Templates | تعريب وتطوير : قوالب بلوجر معربة