آموزش برنامه نویسی Oop

شروع موضوع توسط hidensoft ‏28 اکتبر 2007 در انجمن مقالات و آموزش‌ها

  1. hidensoft

    hidensoft Member

    ارسال‌ها:
    604
    تشکر شده:
    378
    امتیاز دستاورد:
    16
    پولی مورفیسم واقعا سخته و پردازش هاي مخ آدم رو به بالاترين سطح مي رسونه (بهت حق مي دم)

    ببينيد با دستور
    PHP:
    if ($obj instanceof Animal)
    چك مي كنيد كه آيا obj$ عضو يا همان كلاس Animal هست يا نه ؟
    مي دونم كه متوجه نشدي .. خط به خط توضيح مي دم .. دقت كن .

    كلاس Animal
    PHP:
    class Animal {
        function makeSound()
        {
            print "Error: This method should be re-implemented in the children";
        }
    }
    كلاس cat فرزند Animal
    PHP:
    class Cat extends Animal {
        function makeSound()
        {
            print "miau";
        }
    }
    كلاس dog فرزند Animal
    PHP:
    class Dog extends Animal {
        function makeSound()
        {
            print "wuff";
        }
    }
    تابع printTheRightSound (اعلام خروجي)
    PHP:
    function printTheRightSound($obj)
    {
        if ($obj instanceof Animal)  
        {
            $obj->makeSound();
        }  
        else  
        {
            print "Error: Passed wrong kind of object";
        }
        print "\n";
    }
    كد اصلي يا بدنه
    PHP:
    printTheRightSound(new Cat());
    printTheRightSound(new Dog());
    برنامه از قسمت بدنه يا اصلي اجرا مي شه . اين دستور رو اجرا مي كنيم.
    PHP:
    printTheRightSound(new Cat());
    خط اول تابع printTheRightSound اجرا مي شه :
    PHP:
    if ($obj instanceof Animal)
    آيا obj$ فرزند يا خود كلاس Animal هست ؟ جواب : بله
    خط بعد :
    PHP:
    $obj->makeSound();
    چون ما شي Cat رو ارجا داديم .. مي ره سراغ تابع MakeSound در كلاس Cat :
    PHP:
    class Cat extends Animal {
        function makeSound()
        {
            print "miau";
        }
    }
    رشته miau در خروجي چاپ مي شه .
    همين كار ها براي Dog هم انجام مي شه .. اميد وارم كه جوابتون رو گرفته باشيد.
     
    نوشته شده توسط hidensoft در ‏17 ژانویه 2008
    o_real_love، MooQ، atazin و 2 نفر دیگر از این ارسال تشکر کرده اند.
  2. justpersian

    justpersian Member

    ارسال‌ها:
    162
    تشکر شده:
    96
    امتیاز دستاورد:
    16
    الان کلا گرفتم چی شد ...
    خیلی ممنون .
    یک سوال دیگه ، تمپلت انجینی که گذاشتید در واقع یک نوع smarty ساده هست ؟
    امیدوارم مشغله های کاری تان زود تر تمام بشه و از آموزش هاتون فیض ببریم :wink:
    موفق باشید
     
    نوشته شده توسط justpersian در ‏18 ژانویه 2008
    mahyar13652000 از این پست تشکر کرده است.
  3. hidensoft

    hidensoft Member

    ارسال‌ها:
    604
    تشکر شده:
    378
    امتیاز دستاورد:
    16
    ُSmarty يك Template Engine هست .. اوني هم كه من گذاشتم يك Template Engine ديگه . Smarty پيشرفتست و اوني كه من گذاشتم پيش نرفته !
    از اين دعا ها نكنيد تورو خدا .. اون وقت من بيكار مي شم .. :)

    شما هم همينطور
     
    نوشته شده توسط hidensoft در ‏18 ژانویه 2008
    atazin از این پست تشکر کرده است.
  4. justpersian

    justpersian Member

    ارسال‌ها:
    162
    تشکر شده:
    96
    امتیاز دستاورد:
    16
    یک سوالی برای من پیش اومد !
    این کد رو ببینید :
    PHP:

    <?php
      $c = 'php class';
        class Myclass
        {
            function printphp()
            {
                echo 'php';
            }
        }
       
        $my_var = new Myclass();
        $my_var->printphp();
    ?>
     
    ما تو خارج از کلاس یه متغیر تعریف کردیم !
    اونو چه طوری بیاریم تو فانکشن یا کلاس ؟
    واسه آوردن تو فانکشن نمیشه از همون global استفاده کرد ؟
     
    نوشته شده توسط justpersian در ‏20 ژانویه 2008
  5. hidensoft

    hidensoft Member

    ارسال‌ها:
    604
    تشکر شده:
    378
    امتیاز دستاورد:
    16
    تا اونجا که من می دونم شما نمی تونید بصورت مستقیم توسط کلاس به متغیر های خارج کلاس دسترسی داشته باشید .. شاید اگر گلوبال باشه بتونید .. امتحان کنید
     
    نوشته شده توسط hidensoft در ‏20 ژانویه 2008
    atazin از این پست تشکر کرده است.
  6. hidensoft

    hidensoft Member

    ارسال‌ها:
    604
    تشکر شده:
    378
    امتیاز دستاورد:
    16
    Search Engine

    ساخت یک موتور جستو جو گر سریع و کارآمد یکی از دق دقه های یک برنامه نویسه ، من حتی قبل از اینکه یک پروژه رو شروع کنم روس سرچ فکر می کنم . .. امروز یک کلاس بسازیم که به سریع ترین وجه ممکن و به بهترین نحوه به ما جواب مورد نظرمون رو بده ، از همه مهم تر اصولی باشه و قابل ارتقاع و سفارشی باشه ..

    class.search.php

    PHP:
    <?php

    class search_engine
    {
        function search_engine($mysql)
        {
            # set database connection
           $this->host = $mysql[0];
            $this->username = $mysql[1];
            $this->password = $mysql[2];
            $this->database = $mysql[3];
            $this->link = mysql_connect($this->host,$this->username,$this->password) or die(mysql_error());
            $this->db_selected = mysql_select_db($this->database,$this->link) or die(mysql_error());
            $this->found = array();
        }
        function set_table($table)
        {
            # set table
           $this->table = $table;
        }
        function set_keyword($keyword)
        {
            # set keywords
           $this->keyword = explode(" ", $keyword);
        }
        function set_primarykey($key)
        {
            # set primary key
           $this->key = $key;
        }
        function set_fields($field)
        {
            # set fieldnames to search
           $this->field =$field;
        }
        function set_dump()
        {
            # var dump objects
           echo '<pre>';
            var_dump($this->found);
            echo '</pre>';
        }
        function set_total()
        {
            # total results found
           return sizeof($this->found);
        }
        function set_result()
        {
            # find occurence of inputted keywords
           $key =  $this->key;
            for ($n=0; $n<sizeof($this->field); $n++)
            {
                for($i =0; $i<sizeof($this->keyword); $i++)
                {
                    $pattern = trim($this->keyword[$i]);
                    $sql = "SELECT * FROM ".$this->table." WHERE `".$this->field[$n]."` LIKE '%".$pattern."%'";
                    $result = mysql_query($sql);
                    while ($row = mysql_fetch_object($result) AND !empty($pattern))
                    {
                        $this->found[] = $row->$key;
                    }
                }
            }
            $this->found = array_unique($this->found);
            return $this->found;
        }
    }
    ?>
     
    process.php

    PHP:
    <?php

    require_once 'class.search.php';

    $config = array('localhost','root','','database');
    $table = 'bizmain';
    $key = 'biz_id';
    $fields = array('biz_name','biz_address','biz_cat');

    $keyword = $_POST['keyword'].' '.$_POST['location'];

    $found = new search_engine($config);
    $found->set_table($table);
    $found->set_primarykey($key);
    $found->set_keyword($keyword);
    $found->set_fields($fields);

    $result = $found->set_result();
    print_r($result);

    ?>
    form.php

    HTML:
    <form method=post action=process.php>
    <table border=1>
    <tr>
        <td>Search by name, category or keywords</td>
        <td><input  name=keyword></td>
    </tr>
        <td>&nbsp;</td>
        <td><input type=submit value=Submit></td>
    </table>
    </form>
     
    sql

    کد (Text):
    CREATE TABLE `bizmain` (
      `biz_id` mediumint(8) unsigned NOT NULL auto_increment,
      `biz_name` varchar(100) default NULL,
      `biz_address` varchar(255) default NULL,
      `biz_phone` varchar(100) default NULL,
      `biz_email` varchar(100) default NULL,
      `biz_url` varchar(100) default NULL,
      `biz_cat` varchar(100) default NULL,
      PRIMARY KEY  (`biz_id`)
    ) ;

    INSERT INTO `bizmain` (`biz_id`, `biz_name`, `biz_address`, `biz_phone`, `biz_email`, `biz_url`, `biz_cat`) VALUES (1, 'LocalFilipino.com', 'Makati, Philippines', '(632) 848-0886', '[email protected]', 'http://www.localfilipino.com', 'Advertising'),
    (2, 'Liberty Realty', '2451 S. Buffalo Drive, Suite 145, Las Vegas, NV 89117', '(702) 248-8899', '[email protected]', 'http://www.libertyrealty.com', 'Real Estate, Realty'),
    (3, 'FRS Philippine Freight', '5960 Spring Mtn Rd, 3-D<br> Las Vegas, NV 89146', '(702) 253-7555', '[email protected]', 'http://www.frsphilippines.com', 'Freight, Cargo');

     
    Output

    output.jpg
     
    آخرین ویرایش: ‏3 فوریه 2008
    نوشته شده توسط hidensoft در ‏3 فوریه 2008
    atazin، amirds و vizz666 از این ارسال تشکر کرده اند.
  7. vizz666

    vizz666 Member

    ارسال‌ها:
    123
    تشکر شده:
    37
    امتیاز دستاورد:
    16
    ایولا دمت گرم خیلی دنبال چنین چیزی گشتم در ضمن خیلی دقیق سرچ میکنه (;


    موفق باشی رفیق
     
    نوشته شده توسط vizz666 در ‏3 فوریه 2008
  8. zoghal

    zoghal Active Member

    ارسال‌ها:
    285
    تشکر شده:
    51
    امتیاز دستاورد:
    28
    جناب هيدن سافت. واقعا ممنون از آموزشتون.
    منتها يه در خواست داشتم.
    امكانش هست با روش oop يك سيستم ارسال / ويرايش / حذف خبر ساده آموزش بديد تا بهتر با ساختار و كارايي اين روش آشنا بشيم.
    من يك مقدار مشكل سر تجزيه و تحليلش دارم
    ممنون از شما
     
    نوشته شده توسط zoghal در ‏1 مارس 2008
  9. hidensoft

    hidensoft Member

    ارسال‌ها:
    604
    تشکر شده:
    378
    امتیاز دستاورد:
    16
    حتما .
     
    نوشته شده توسط hidensoft در ‏1 مارس 2008
    zoghal از این پست تشکر کرده است.
  10. sabasoft

    sabasoft Member

    ارسال‌ها:
    253
    تشکر شده:
    29
    امتیاز دستاورد:
    16
    با سلام و درود
    از شما براي مطالب مفيدتون ، تشکر مي کنم.

    دوستان يک سوال داشتم:

    براي اينکه محتويات بين دو مجموعه کاراکتر خاص رو به دست بياريم بايد چيکار کنيم؟

    مثلا:

    <!--start-->
    <p>
    test
    </p>
    <!--end-->

    که درخواست ما از اين کد ، <p>test</p> هست.
    باز هم تشکر مي کنم
     
    نوشته شده توسط sabasoft در ‏16 مارس 2008
  11. hidensoft

    hidensoft Member

    ارسال‌ها:
    604
    تشکر شده:
    378
    امتیاز دستاورد:
    16
    فکر نمی کنم مستقیما به Oop ربط داشته باشه .
     
    نوشته شده توسط hidensoft در ‏17 مارس 2008
  12. sabasoft

    sabasoft Member

    ارسال‌ها:
    253
    تشکر شده:
    29
    امتیاز دستاورد:
    16
    یعنی ممکنه این کار تو PHP قابل انجام نباشه؟!؟ :shock:
     
    نوشته شده توسط sabasoft در ‏17 مارس 2008
  13. hidensoft

    hidensoft Member

    ارسال‌ها:
    604
    تشکر شده:
    378
    امتیاز دستاورد:
    16
    امکانش هست ، با رگولار باید اون فرمتت رو کنترل کنی بعدش بیای و بکشی بیرون متن رو ، ولی این سوال مربوط به این قسمت نمی شه .
     
    نوشته شده توسط hidensoft در ‏17 مارس 2008
  14. sabasoft

    sabasoft Member

    ارسال‌ها:
    253
    تشکر شده:
    29
    امتیاز دستاورد:
    16
    دستت درد نکنه
    خوب من یک تاپیک زدم با همین موضوع سوال خودم ، اگر محبت کنید و تواناییش رو دارید ، من رو راهنمایی کنید ؛ خوشحال می شم و براتون دعا می کنم
     
    نوشته شده توسط sabasoft در ‏17 مارس 2008
  15. Webnevis

    Webnevis New Member

    ارسال‌ها:
    1
    تشکر شده:
    0
    امتیاز دستاورد:
    1
    only thank's alot ! :)
     
    نوشته شده توسط Webnevis در ‏29 مارس 2008
  16. www.nero.ir

    www.nero.ir Member

    ارسال‌ها:
    190
    تشکر شده:
    29
    امتیاز دستاورد:
    16
    سلام دوست عزیز ممنون بابت آموزش هایی که تا الان نوشتی توی یکی از پست ها نوشته بودی که می خوای در باره Mvc هم توضیحاتی بدی اگه میشه یک آموزش هم درباره این موضوع بزار واقعا ممنونت میشم.
     
    نوشته شده توسط www.nero.ir در ‏2 می 2008
  17. J4vad

    J4vad Member

    ارسال‌ها:
    736
    تشکر شده:
    249
    امتیاز دستاورد:
    16
    ابتدا تشکر از hidensoft عزیز به دلیل آموزش های جالبشون . امید است این کار رو با قدرت بیشتر ادامه دهند تا دوستان استفاده کنند ! بنده هم حتما در حد توان کمک خواهم نمود ! البته اگر آموزش های شما رو خراب نکنیم ! :wink:

    sabasoft دوست من با تابع Explode می توانید یک رشته خاص را در یک خط بررسی کنید .

    موفق باشید.
     
    نوشته شده توسط J4vad در ‏11 ژوئن 2008
  18. hidensoft

    hidensoft Member

    ارسال‌ها:
    604
    تشکر شده:
    378
    امتیاز دستاورد:
    16
    MVC Pattern Step 1

    سلام . بازم برگشتم که یکی دوتا مقاله توپ در مورد PHP براتون بگذارم. اما این تمام مقاله ها رو در مورد Pattern ها در PHP می نویسم. امید وارم مورد توجه شما دوستان عزیز قرار بگیرد.

    امروز می خام MVC Pattern که یکی از مهم ترین نکات PHP هست رو براتون شرح بدم .

    MVC چیست ؟

    Model View Control

    Model
    کلاس های مربوط به دیتابیس در این قسمت قرار می گیرند.
    View
    اطلاعات مربوط به صفحه خروجی در این قسمت قرار می گیرند.
    control
    اطلاعات اصلی در این قسمت قرار می گیرد .

    [​IMG]

    همونطور که در عکس می بینید ابتدا درخاست به control فرستاده می شود . ابتدا control در صورت نیاز اطلاعات در دیتا بیس را از Model می گیرد و در نهایت اطلاعات نهایی رو به View می فرستد.

    نحوه استفاده از Model و View و Control بسیار مهم هست . اگر شما یک MVC قوی داشته باشید . حتما یک framework قوی هم دارید. بله شما می توانید با استفاده از MVC یک فریم ورک مختص به خودتون داشته باشید . نیاز های خودتون را در یک فریم ورک جمع اوری کنید و براحتی پرتال بسازید.

    در مرحله بعد باهم یک MVC ساده رو می سازیم تا شما بیشتر با این Pattern آشنایی پیدا کنید.

    موفق و پیروز باشید.
     
    نوشته شده توسط hidensoft در ‏19 جولای 2008
    atazin، justpersian و yakoza از این ارسال تشکر کرده اند.
  19. yakoza

    yakoza Well-Known Member

    ارسال‌ها:
    742
    تشکر شده:
    381
    امتیاز دستاورد:
    63
    با تشکر از محمد عزیز

    یه اصطلاح دیگه که به این نوع برنامه نویسی میگن برنامه نویسی سه لایه یا همون 3tire
    که تشکیل شده از

    data acsses Layer یا همون لایه کار با دیتابیس

    business logic layer یا همون لایه ای که لایه یوزر رو به دیتابیس وصل میکنه
    user Interface layer یا همون لایه ای که به کاربر نشون داده میشه که شامل html-css-javascript

    البته اینا همونه فقط خواستم بگم که کاربرا با اصطلاحات آشنا بشن جایی شنیدن بفهمن داستان چیه

    قربانت ناصر
     
    نوشته شده توسط yakoza در ‏19 جولای 2008
    atazin و hidensoft از این پست تشکر کرده اند.
  20. hidensoft

    hidensoft Member

    ارسال‌ها:
    604
    تشکر شده:
    378
    امتیاز دستاورد:
    16
    سلام دوستان .
    امروز نوبت ساختن یک mvc سادست.
    در ابتدا این تمام کد هارو می نویسم . شما سوال حاتون رو بپرسید . من و دیگر دوستان هر زمان که بتونیم جواب می دیم.

    index.php
    PHP:
    <?php
    require_once('lib/DataAccess.php');
    require_once('lib/ProductModel.php');
    require_once('lib/ProductView.php');
    require_once('lib/ProductController.php');

    $dao=& new DataAccess ('localhost','user','pass','dbname');
    $productModel=& new ProductModel($dao);
    $productController=& new ProductController($productModel,$_GET);
    echo $productController->display();
    ?>
    lib/ProductView.php
    PHP:
    <?php
    /**
     *  Binds product data to HTML rendering
     */

    class ProductView {
        /**
        * Private
        * $model an instance of the ProductModel class
        */

        var $model;

        /**
        * Private
        * $output rendered HTML is stored here for display
        */

        var $output;

        //! A constructor.
        /**
        * Constucts a new ProductView object
        * @param $model an instance of the ProductModel class
        */

        function ProductView (&$model) {
            $this->model=& $model;
        }

        //! A manipulator
        /**
        * Builds the top of an HTML page
        * @return void
        */

        function header () {
            $this->output=
            <<<EOD
    <!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>
    <title> Our Products </title>
    <style>
    body { font-size: 13.75px; font-family: verdana }
    td { font-size: 13.75px; font-family: verdana }
    .title { font-size: 15.75px; font-weight: bold; font-family: verdana }
    .heading {
        font-size: 13.75px; font-weight: bold;
        font-family: verdana; background-color: #f7f8f9 }
    .nav { background-color: #f7f8f9 }
    </style>
    </head>
    <body>
    <div align="center" class="title">Our Products</div>
    EOD
    ;
            $this->output.="\n<div align=\"right\"><a href=\"".
                $_SERVER['PHP_SELF']."\">Start Over</a></div>\n";

        }

        //! A manipulator
        /**
        * Builds the bottom of an HTML page
        * @return void
        */

        function footer () {
            $this->output.="</body>\n</html>";
        }

        //! A manipulator
        /**
        * Displays a single product
        * @return void
        */

        function productItem($id=1) {
            $this->model->listProduct($id);
            while ( $product=$this->model->getProduct() ) {
                $this->output.="<p><b>Name</b>:".$product['PRODUCTNAME']."</p>".
                    "<p><b>Price</b>:".$product['UNITPRICE']."</p>".
                    "<p><b># In Stock</b>:".$product['UNITSINSTOCK']."</p>";
                if ( $this->$product['DISCONTINUED']==1 ) {
                    $this->output.="<p>This product has been discontinued.</p>";
                }
            }
        }

        //! A manipulator
        /**
        * Builds a product table
        * @return void
        */

        function productTable($rownum=1) {
            $rowsperpage='20';
            $this->model->listProducts($rownum,$rowsperpage);
            $this->output.="<table width=\"600\" align=\"center\">\n<tr>\n".
                    "<td class=\"heading\">Name</td>\n".
                    "<td class=\"heading\">Price</td>\n</tr>\n";
            while ( $product=$this->model->getProduct() ) {
                $this->output.="<tr>\n<td><a href=\"".$_SERVER['PHP_SELF'].
                    "?view=product&id=".$product['PRODUCTID']."\">".
                    $product['PRODUCTNAME']."</a></td>".
                    "<td>".$product['UNITPRICE']."</td>\n</tr>\n";
            }
            $this->output.="<tr class=\"nav\">\n";
            if ( $rownum!=0 && $rownum > $rowsperpage ) {
                $this->output.="<td><a href=\"".$_SERVER['PHP_SELF'].
                    "?view=table&rownum=".($rownum-$rowsperpage).
                    "\"><< Prev</a></td>";
            } else {
                $this->output.="<td>&nbsp;</td>";            
            }
            if ( $product['PRODUCTID'] < ($rownum + $rowsperpage) ) {
                $this->output.="<td><a href=\"".$_SERVER['PHP_SELF'].
                    "?view=table&rownum=".($rownum+$rowsperpage).
                    "\">Next >></a></td>";
            } else {
                $this->output.="<td>&nbsp;</td>\n";            
            }
            $this->output.="</tr>\n</table>\n";
        }

        //! An accessor
        /**
        * Returns the rendered HTML
        * @return string
        */

        function display () {
            return $this->output;
        }
    }
    ?>
    lib/ProductController.php
    PHP:
    <?php
    /**
     *  Controls the application
     */

    class ProductController extends ProductView {

        //! A constructor.
        /**
        * Constucts a new ProductController object
        * @param $model an instance of the ProductModel class
        * @param $getvars the incoming HTTP GET method variables
        */

        function ProductController (&$model,$getvars=null) {
            ProductView::ProductView($model);
            $this->header();
            switch ( $getvars['view'] ) {
                case "product":
                    $this->productItem($getvars['id']);
                    break;
                default:
                    if ( empty ($getvars['rownum']) ) {
                        $this->productTable();
                    } else {
                        $this->productTable($getvars['rownum']);
                    }
                    break;
            }
            $this->footer();
        }
    }
    ?>
    lib/ProductModel.php
    PHP:
    <?php
    /**
     *  Fetches "products" from the database
     */

    class ProductModel {
        /**
        * Private
        * $dao an instance of the DataAccess class
        */

        var $dao;

        //! A constructor.
        /**
        * Constucts a new ProductModel object
        * @param $dbobject an instance of the DataAccess class
        */

        function ProductModel (&$dao) {
            $this->dao=& $dao;
        }

        //! A manipulator
        /**
        * Tells the $dboject to store this query as a resource
        * @param $start the row to start from
        * @param $rows the number of rows to fetch
        * @return void
        */

        function listProducts($start=1,$rows=50) {
            $this->dao->fetch("SELECT * FROM products LIMIT ".$start.", ".$rows);
        }

        //! A manipulator
        /**
        * Tells the $dboject to store this query as a resource
        * @param $id a primary key for a row
        * @return void
        */

        function listProduct($id) {
            $this->dao->fetch("SELECT * FROM products WHERE PRODUCTID='".$id."'");
        }

        //! A manipulator
        /**
        * Fetches a product as an associative array from the $dbobject
        * @return mixed
        */

        function getProduct() {
            if ( $product=$this->dao->getRow() )
                return $product;
            else
                return false;
        }
    }
    ?>
    Dataaccess.php
    PHP:
    <?php
    /**
     *  A simple class for querying MySQL
     */

    class DataAccess {
        /**
        * Private
        * $db stores a database resource
        */

        var $db;
        /**
        * Private
        * $query stores a query resource
        */

        var $query; // Query resource

        //! A constructor.
        /**
        * Constucts a new DataAccess object
        * @param $host string hostname for dbserver
        * @param $user string dbserver user
        * @param $pass string dbserver user password
        * @param $db string database name
        */

        function DataAccess ($host,$user,$pass,$db) {
            $this->db=mysql_pconnect($host,$user,$pass);
            mysql_select_db($db,$this->db);
        }

        //! An accessor
        /**
        * Fetches a query resources and stores it in a local member
        * @param $sql string the database query to run
        * @return void
        */

        function fetch($sql) {
            $this->query=mysql_unbuffered_query($sql,$this->db); // Perform query here
        }

        //! An accessor
        /**
        * Returns an associative array of a query row
        * @return mixed
        */

        function getRow () {
            if ( $row=mysql_fetch_array($this->query,MYSQL_ASSOC) )
                return $row;
            else
                return false;
        }
    }
    ?>
     

    پیوست ها:

    • mvc.zip
      اندازه فایل:
      کیلوبایت 12
      نمایش ها:
      71
    آخرین ویرایش: ‏21 جولای 2008
    نوشته شده توسط hidensoft در ‏21 جولای 2008
    key12، o_real_love، webmasterafkari و 4 نفر دیگر از این ارسال تشکر کرده اند.

به اشتراک بگذارید