این مبحث کمی سنگین است، باید پیش از این، با کاربرد 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 دارم:
یعنی فایل header.php را از پوشه قبل (/..) ایمپورت کردهام.
خوب، حالا محتویات فایل header.php را ببینید:
یعنی در این فایل، فایل 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 را اگر اینطور کنی، درست میشود:
بله، اما این یک مسکن است! نه راه حل درست! چون تصور کنید ما فایل header.php را به فایل x.php هم ایمپورت کرده باشیم! در حالت اول فایل x.php درست کار میکرد، اما در این حالت، دیگر درست کار نمیکند.
یعنی اگر بر اساس زیرپوشه کدنویسی کنید، فایلهای سطح بالاتر به هم میریزند و اگر بر اساس سطح بالا کدنویسی کنید، ایمپورتهای زیرپوشه به هم میریزد!
ضمن اینکه گاهی اوقات دهها include در فایل header.php داریم. عاقلانه نیست که بنشینیم، یکی یکی ابتدا آنها /.. بگذاریم!
راه حل:
این تابع base یا مبنای includeها را تغییر میدهد. کافیست در ابتدای فایل index.php از این تابع استفاده کنیم. در این صورت، در نظر گرفته میشود که فایل index.php در مسیری که شما مشخص کردهاید، قرار دارد.
دقت کنید:
حالا دیگر مشکلی نخواهد بود و فایل config.php نیز ایمپورت خواهد شد. چون حالا دیگر index.php مثل x.php در سطح بالاتر (یعنی در روت) عمل خواهد کرد.
و اما، گاهی اوقات نیز شما نیاز دارید که کل لینکهای یک صفحه را که به صورت نسبی (relative) آدرسدهی شدهاند، تغییر مبنا (base) دهید. یعنی فرض کنید در یک سایت فایل index.html را از روت یک سایت کپی یا منتقل کردهایم به داخل یک پوشه. طبیعتاً قبلاً همه آدرسها درست بوده است. مثلاً برای رفتن به فایل گالری عکس، در آنجا به این صورت آدرس دادهایم:
<a href="gallery.html">گالری عکس</a>
اما اگر این فایل بیاید در یک پوشه، همه چیز به هم میریزد! چون دیگر برای رفتن به گالری عکس، باید بنویسیم:
<a href="../gallery.html">گالری عکس</a>
یعنی اگر نکتهای که میگویم را ندانیم، باید تمام لینکها را به صورت دستی ویرایش کنیم! بدتر اینکه گاهی اوقات اصلاح این فایلها ممکن نیست!
به هر حال، برای تغییر base (یعنی نقطه شروع آدرس دهی) از تگی به نام <base> استفاده میکنیم.
کافیست در ابتدای فایل خود بنویسید:
<base href="../" />
همین!
این، مثل این است که تمام لینکها را یک به یک ویرایش کنید و ابتدای آنها /.. اضافه کنید.
موفق باشید؛
حمید رضا نیرومند