PDA

View Full Version : استفاده از pretty urls



majid1605
شنبه 17 خرداد 1393, 13:10 عصر
من اومدم تمام ادرسهای سایت رو به صورت pretty urls درآوردم ولی الان چندتا مشکل دارم
مشکلی که دارم اینه وقتی دارم از require_once استفاده می کنم چطور متغیر رو تووی صفحات استفاده کنم



$safePages = array("profile", "post", "ask","comment");
$safeAction = array("edit", "send","delete","banned");

if(isset($_SERVER["REQUEST_URI"]))
{
$path = (substr($_SERVER['REQUEST_URI'], -1) == '/') ?
substr($_SERVER['REQUEST_URI'], 0, -1) :
$_SERVER['REQUEST_URI'];
$path = (substr($path, 0 , 1) == '/') ?
substr($path, 1) :
$path;
$urlParts = explode("/",$path);
}
else
{
echo "error";
}

if(isset($urlParts))
{
if(isset($urlParts[0]) && $urlParts[1] )
{
in_array($urlParts[0] ,$safePages) ? $page = $urlParts[0] : $page = "404";
in_array($urlParts[1] ,$safePages) ? $action = $urlParts[1] : $action = "none";
}
if(isset($urlParts[2]))
$id = $urlParts[2] ;
}
switch($page)
{
case "post":
require_once("post.php");
break;
case "profile":
require_once("profile.php");
break;
default:
require_once("home.php");
}


توی آدرس های قبلیم ادرسها به صورت زیر بودن
post.php?id=26&action=show
اونجا از متغیر get استفاده می کردم حالا اینجا چیکار کنم .راهی که به ذهنم میرسه اینه که همون متغیر get رو اینجا مقدار دهی کنم با مقداری که از ادرس میگیرم


if(isset($urlParts[2]))
$_GET['id'] = $urlParts[2] ;
}
switch($page)


دومین مشکلم با همین اینکلود کردن فایل های مختلف هست
تووی ادیتور فایل ها رو به صورت ajax آپلود و نمایش میداد ولی الان دوتا مشکل تووی فال php پیش اومده
یه شرط دارم که چک می کنه آیا تووی پوشه آپلود فایل موجود یا نه الان شرط همیشه مقدار true بر می گردونه .در صورتی که فایل توی پوشه وجود داره


(!file_exists("/uploads/img/".$director."/".$fileName))


یکی هم ادرس تصاویر هست که الان همون ادرس قبلیه ولی بعد از عملیات آپلود عکس رو نشون نمیده
خروجی برای ادیتور هم تقریبا همونی که بالا ذکر کردم فقط اسم فایل یا دایرکتوری ممکنه تغییر کنه

الان نه ادرس دهی مطلق نه نسبی (استفاده از dirname , / ) بهم کمکی نکرد تووی اکشن فرمها / رو که اضافه می کنم قبل از ادرس فایل مشکل فرمها حل میشه ولی تووی صفحات پردازشی فایل اینکلود میشه که الان شناسای نمیشن قبلا به شکل زیر بود


require_once("include/user.php");

اما الان
نه


require_once("/include/user.php");

و نه با dirname
کار میکنه البته حالت بالا برای فایل های css وjs خوبه ولی برای فایل های توودر تویی که خودم نوشتم مشکل دارم
وبسته به اینکه تووی چندمین پوشه هستم باید اینکلود کنم


require_once("/../../include/user.php");



ظاهرا برای ادیتور هم این ادرس مجازی حساب میشه و ادرس عکس شامل ادرس مجازی هم میشه که نباید اینجوری بشه

lord_viper
شنبه 17 خرداد 1393, 16:34 عصر
سیستمهای مختلف پیاده سازی های خودشونو دارن ولی عموما کلاسی بنام registery دارن که اطلاعات $urlParts رو تو خودشون نگه میدارن و به کنترلها و ویو ها ارسال میشن
ساده ترین راهش هم این هست که $urlParts رو گلوبال کنین و در صفحات داخلی ازش استفاده کنید

بهتره ادرس دهی ها رو کامل( absolute) بدید اینجوری بهتره مخصوصا برای file_exists چون در غیر این صورت درست جواب نمیده

majid1605
شنبه 17 خرداد 1393, 21:38 عصر
میشه در این مورد بیشتر توضیح بدید یا اگه لینکی سراغ دارید معرفی کنید

lord_viper
یک شنبه 18 خرداد 1393, 08:35 صبح
البته این مثال mvc هستش
http://www.phpro.org/tutorials/Model-View-Controller-MVC.html

خب شما میتونین 2 تا کار بکنین
1.هر کدوم از صفحاتتون مثل post.php به url دسترسی دارن 2باره بیاید url رو بخونین و پارامترها رو بدست بیارید

یا یک متغییر global درست کنید و پارامترها رو به صورت ارایه درونش بریزید



global $parameter;
$parameter = array();
if(isset($urlParts[2]))
$parameter['id'] = $urlParts[2];


حالا تو صفحات اینکلاد شده مثلا post.php کافیه $parameter رو گلوبال کنید و به مقادیرش دسترسی داشته باشید


global $parameter;
$id = '';
if(isset($parameter['id']))
$id = $parameter['id'];

majid1605
یک شنبه 18 خرداد 1393, 16:00 عصر
در مورد file_exists چی راه دیگه ایی به جز ادرس دهی مطلق وجود نداره؟