شنبه ۳ آذر ۱۴۰۳ |  عضویت / ورود






[ بخش اصلی آموزشها | افزودن آموزش | داری بیشترین امتیاز | دارای بیشترین بیننده | جدیدترین نظرات ]

مباحث حرفه‌ای تغییر basedir در include کردن در زبان PHP و همینطور href در HTML


Monday, 2011 April 04   نویسنده: Hamid   تعداد بازدید: 13934 بار  #آموزش PHP‏   امتیاز متوسط: امتیازی داده نشده است

این مبحث کمی سنگین است، باید پیش از این، با کاربرد include در PHP به خوبی آشنا باشید. بهتر است مقاله زیر را مطالعه کرده باشید:
فرق include و require و توضیح include_once و require_once در زبان PHP

وقتی پای subfolder (زیرپوشه) و ایمپورت کردن (import=وارد کردن) فایل‌های مختلف در میان باشد، دردسرهای بسیاری گریبان‌گیر شماست! از جمله تغییراتی که در آدرس‌ها ایجاد می‌شود.

من مبحث را با یک مثال توضیح می‌دهم:

تصور کنید من یک فایل به نام index.php دارم که در مسیر زیر است:

/gallery/index.php

یعنی در پوشه gallery قرار دارد.

در کنار پوشه gallery، یک فایل دارم به نام header.php و یک فایل به نام config.php و یک فایل هم به نام x.php. یعنی تا اینجا داریم:

/gallery/index.php
/header.php
/config.php
/x.php

حالا در فایل index.php دارم:

http://tutorials.aftab.cc/web_designing/php/chdir_ing_php_and_base_tag_in_html/include_header.png

یعنی فایل header.php را از پوشه قبل (/..) ایمپورت کرده‌ام.

خوب، حالا محتویات فایل header.php را ببینید:

http://tutorials.aftab.cc/web_designing/php/chdir_ing_php_and_base_tag_in_html/include_config.png

یعنی در این فایل، فایل config.php را ایمپورت کرده‌ام.

به نظر شما، اگر فایل index.php (که درون پوشه gallery قرار دارد) را اجرا کنم، آیا فایل config.php نیز ایمپورت خواهد شد؟

جواب: خیر!

چون بعد از ایمپورت، کدهای فایل index.php در حقیقت اینطور خواهد شد:
کدهای پررنگ‌تر در حقیقت کدهای موجود در فایل header.php است که به جای عبارت include header.php می‌نشیند:

//Some codes here
//Some codes here

include 'config.php';

//Some codes here
//Some codes here

?>

و در این صورت، آدرس فایل config.php اشتباه است! و طبیعتاً ایمپورت صورت نمی‌گیرد.

چه کار باید کرد؟

شاید بگویید خوب، محتویات فایل header.php را اگر اینطور کنی، درست می‌شود:

http://tutorials.aftab.cc/web_designing/php/chdir_ing_php_and_base_tag_in_html/include_config2.png

بله، اما این یک مسکن است! نه راه حل درست! چون تصور کنید ما فایل header.php را به فایل x.php هم ایمپورت کرده باشیم! در حالت اول فایل x.php درست کار می‌کرد، اما در این حالت، دیگر درست کار نمی‌کند.

یعنی اگر بر اساس زیرپوشه کدنویسی کنید، فایل‌های سطح بالاتر به هم می‌ریزند و اگر بر اساس سطح بالا کدنویسی کنید، ایمپورت‌های زیرپوشه به هم می‌ریزد!

ضمن اینکه گاهی اوقات ده‌ها include در فایل header.php داریم. عاقلانه نیست که بنشینیم، یکی یکی ابتدا آن‌ها /.. بگذاریم!

راه حل:

استفاده از تابع chdir()‎

این تابع base یا مبنای includeها را تغییر می‌دهد. کافی‌ست در ابتدای فایل index.php از این تابع استفاده کنیم. در این صورت، در نظر گرفته می‌شود که فایل index.php در مسیری که شما مشخص کرده‌اید، قرار دارد.

دقت کنید:

http://tutorials.aftab.cc/web_designing/php/chdir_ing_php_and_base_tag_in_html/chdir.png

حالا دیگر مشکلی نخواهد بود و فایل config.php نیز ایمپورت خواهد شد. چون حالا دیگر index.php مثل x.php در سطح بالاتر (یعنی در روت) عمل خواهد کرد.

 

تغییر مبنای href:

و اما، گاهی اوقات نیز شما نیاز دارید که کل لینک‌های یک صفحه را که به صورت نسبی (relative) آدرس‌دهی شده‌اند، تغییر مبنا (base) دهید. یعنی فرض کنید در یک سایت فایل index.html را از روت یک سایت کپی یا منتقل کرده‌ایم به داخل یک پوشه. طبیعتاً قبلاً همه آدرس‌ها درست بوده است. مثلاً برای رفتن به فایل گالری عکس، در آنجا به این صورت آدرس داده‌ایم:

<a href="gallery.html">گالری عکس</a>

اما اگر این فایل بیاید در یک پوشه، همه چیز به هم می‌ریزد! چون دیگر برای رفتن به گالری عکس، باید بنویسیم:

<a href="../gallery.html">گالری عکس</a>

یعنی اگر نکته‌ای که می‌گویم را ندانیم، باید تمام لینک‌ها را به صورت دستی ویرایش کنیم! بدتر اینکه گاهی اوقات اصلاح این فایل‌ها ممکن نیست!

به هر حال، برای تغییر base (یعنی نقطه شروع آدرس دهی) از تگی به نام <base> استفاده می‌کنیم.

کافی‌ست در ابتدای فایل خود بنویسید:

<base href="../" />

همین!

این، مثل این است که تمام لینک‌ها را یک به یک ویرایش کنید و ابتدای آن‌ها /.. اضافه کنید.

موفق باشید؛
حمید رضا نیرومند


.



ارسال سؤال یا نظر


1- علیرضا:
بوسیله: , در: Monday, 2014 July 21-کد: 11002
عالی بود
خیلی دنبال این موضوع گشتم


Tutorials ©