PDA

View Full Version : سوال تخصصي از php كار ها



dezchilds
دوشنبه 15 شهریور 1389, 17:32 عصر
سلام من ميخوام يك function را در يك function ديگه فراخواني كنم
به اين صورت
اين فانكشني هست كه اطلاعات رو از ديتابيسم ميخونه

function get_date($date, $format = "date")
{
global $SESSION;

$diff = $SESSION->conf['timezone']*60;
$date = $date - (date("Z") - $diff) + (date("I") ? 3600 : 0);

if ( $format == "date" ) {
$format = $SESSION->conf['timeformat'] ? "m/d/Y" : "d/m/Y";
}
elseif ( $format == "time" ) {
$format = $SESSION->conf['timeformat'] ? "h:i a" : "H:i";
}
elseif ( $format == "rss" ) {
$format = "r";
}
elseif ( $format == "full" ) {
$format = $SESSION->conf['timeformat'] ? "m/d/Y h:i a" : "d/m/Y H:i";
}

return date($format, $date);
}

حالا ميخوام نتيجه اين رو تو يه فانكشن ديگه كه فرمت رو به صورت timeago نمايش ميده فراخواني كنم و ميخوام اين فانكشن فانكشن بالايي رو به صورت timeago تغير بده .
اين فانكشن

function vldext_get_date($params = array())
{
global $PREFS, $SESSION;

$timestamp = isset($params['tmst']) && $params['tmst'] ? intval($params['tmst']) : 0;
$format = isset($params['format']) && $params['format'] ? $params['format'] : "full";


if ($format !== "timeago")
{
$diff = $SESSION->conf['timezone']*60;
$datetime = $timestamp - (date("Z") - $diff) + (date("I") ? 3600 : 0);

$date = $SESSION->conf['timeformat'] ? date("m/d/Y", $datetime) : date("d/m/Y", $datetime);
$now = time();
$now = $now - (date("Z") - $diff) + (date("I") ? 3600 : 0);
$today = $SESSION->conf['timeformat'] ? date("m/d/Y", $now) : date("d/m/Y", $now);
$yesterday = $SESSION->conf['timeformat'] ? date("m/d/Y", $now-86400) : date("d/m/Y", $now-86400);

if ($date == $today)
$date = 'امروز';
else if ($date == $yesterday)
$date = 'دیروز';

if ( $format == "date" ) {
return $date;
}
elseif ( $format == "time" ) {
return ($SESSION->conf['timeformat'] ? date("h:i A", $datetime) : date("H:i", $datetime));
}
elseif ( $format == "rss" ) {
date("r", $datetime);
}
elseif ( $format == "full" ) {
return $date.' ' . ($SESSION->conf['timeformat'] ? date("h:i A", $datetime) : date("H:i", $datetime));
}
}
else
{
/**
* Formats a timestamp nicely with an adaptive "x units of time ago" message.
* Based on the original Twitter JavaScript badge. Only handles past dates.
* @return string Nicely-formatted message for the timestamp.
* @param $time Output of strtotime() on your choice of timestamp.
*/

$delta = time() - $timestamp;
if ($delta < 60) {
return 'کمتر از یک دقیقه پیش';
} else if ($delta < 120) {
return 'حدود يك دقيقه پيش';
} else if ($delta < (45 * 60)) {
return floor($delta / 60) . ' minutes ago';
} else if ($delta < (90 * 60)) {
return 'حدود يك ساعت پيش';
} else if ($delta < (120 * 60)) {
return 'حدود دو ساعت پيش';
} else if ($delta < (24 * 60 * 60)) {
return 'حدود ' . floor($delta / 3600) . ' ساعت پيش';
} else if ($delta < (48 * 60 * 60)) {
return 'يك روز پيش';
} else {
return floor($delta / 86400) . ' روز پيش';
}
}

}

sama01
دوشنبه 15 شهریور 1389, 19:54 عصر
مشکل چیه؟

- - - - - - - - - - - - - - - -
در حاشیه:
ضمنا برای چک کردن مقادیر مختلف یک متغیر به جای elseif ها متعدد، از switch case استفاده کنید. به مراتب بهینه‌تر است.

dezchilds
دوشنبه 15 شهریور 1389, 22:29 عصر
سلام داداش اين يه تكه كد مال يه اسكريپته من ميخوام تاريخش رو به صورت time ago نشون بدم

mlf_mlv
سه شنبه 16 شهریور 1389, 02:08 صبح
اگه منظورتون اینیه که گفتم خدا رو شکر ولی اگه نبود بم خبر بدید:چشمک:
برای فراخونی یه تابع که تو یه کلاسه می تونی از

$this->function name
استفاده کنی

sama01
سه شنبه 16 شهریور 1389, 02:41 صبح
به نظرم در این‌جا هم یه مشکل بزرگ داریم و آن این که شما سوال خود را درست مطرح نمی‌کنید.
اگر سوال شما این است که چگونه از توابعی که فرستاده‌اید می‌توانید استفاده کنید، این پاسخ شما است:



$time = time()-600; // ده دقیقه پیش
$params = array('tmst'=>$time, 'format'=>'timeago');
$timeFinal = vldext_get_date($params);

// or
echo $timeFinal = vldext_get_date(array('tmst'=>$time, 'format'=>'timeago'));
تابع اول هم نیازی نیست.

ولی شما بگید مشکل‌تان چیست.
آیا این تابع کار نمی‌کند؟ (که در سیستم من به خوبی کار کرد)
آیا نمی‌دانید که چگونه باید از آن استفاده کنید. (که توضیح دادم)
آیا نمی‌دانید که چگونه می‌توانید این تابع را وارد سایت‌تان کنید؟ (این بستگی به سایت شما دارد و البته میزان تسلط شما به php. نمی‌توان نسخه‌ی کلی پیچید)

dezchilds
سه شنبه 16 شهریور 1389, 11:14 صبح
سلام ببينيد اينا كد هاي يه اسكريپت هستند (البته فقط تابع اولي ) و بوسيله ي اين تابع date از database خوانده ميشه و اين تابع اونو به صورت ميلادي در مياره مثلآ
342010 رو ميكنه : 3/4/2010 و بعدش اين تابع توي home page فراخواني ميشه خوب حالا من ميخوام با استفاده از تابع دوم(كه زمان رو ميخونه و به صورت دقيقه پيش نشان ميده مثلا : ارسال شده در 20 دقيقه پيش ) همين تابع اول رو فراخواني كنم يعني نتيجه تابع اول رو بفرستم تو دومي بعد تابع دوم رو تو home page فراخواني كنم مشكل در اين است كه نمي دونم چطوري نتيجه رو به تابع دوم بدم
شما فرض كنيد يه متغير داريد كه از كاربر يه عدد ميگيره و * 4 ميكنه (به عنوان تابع اول ) و حالا ميخواهيد
يه نتيجه اش رو تو يه متغير ديگه كه عدد رو - 1 ميكنه بريزيد البته اين مثال بود حالا من با اين تابع هم ميخوام همين كار رو كنم يعني فقط ميخوام نتيجه تابع اول رو تو دومي بيارم

sama01
سه شنبه 16 شهریور 1389, 22:48 عصر
ورودی تابع دومی
من نمی‌دونم تابع اوش شما $SESSION->conf['timezone'] چیه.
ولی حدس می‌زنم در پایان کار تابع اول، متغیر $date معادل timestamp تاریخ مورد نظر باشه. اگر دست حدس زده باشم، شما می‌تونی با یک تغییر کوچک، تابع دوم را در دل تابع اول جای بدی و با استفاده از format مورد نظر، خروجی خودتون رو بگیرید.
مثلا به این شکل:


function get_date($date, $format = "date")
{
global $SESSION;

$diff = $SESSION->conf['timezone']*60;
$date = $date - (date("Z") - $diff) + (date("I") ? 3600 : 0);

if ( $format == "date" ) {
$format = $SESSION->conf['timeformat'] ? "m/d/Y" : "d/m/Y";
}
elseif ( $format == "time" ) {
$format = $SESSION->conf['timeformat'] ? "h:i a" : "H:i";
}
elseif ( $format == "rss" ) {
$format = "r";
}
elseif ( $format == "full" ) {
$format = $SESSION->conf['timeformat'] ? "m/d/Y h:i a" : "d/m/Y H:i";
}
elseif ($format == "timeago"){

$delta = time() - $date;

if ($delta < 60) {
return 'کمتر از یک دقیقه پیش';
} else if ($delta < 120) {
return 'حدود يك دقيقه پيش';
} else if ($delta < (45 * 60)) {
return floor($delta / 60) . ' دقیقه پیش';
} else if ($delta < (90 * 60)) {
return 'حدود يك ساعت پيش';
} else if ($delta < (120 * 60)) {
return 'حدود دو ساعت پيش';
} else if ($delta < (24 * 60 * 60)) {
return 'حدود ' . floor($delta / 3600) . ' ساعت پيش';
} else if ($delta < (48 * 60 * 60)) {
return 'يك روز پيش';
} else {
return floor($delta / 86400) . ' روز پيش';
}
}
return date($format, $date);
}

dezchilds
چهارشنبه 17 شهریور 1389, 03:56 صبح
سلام مشكل همين جاست كه من نميخوام اصلا توي تابع اول تغيري ايجاد كنم چون تابع اولي براي ذخيره كردن اطلاعات زمان در ديتابيس هم مورد استفاده قرار ميگيره نميشه كه مثلا اگه كسي يه نظر ارسال ميكنه تو ديتابيس ذخيره بشه 5 دقيقه پيش ميخوام جاهايي تابع دوم روفراخواني كنم كه نياز به خروجي داشته باشيم مثلا تو نمايش نظرات .

sama01
چهارشنبه 17 شهریور 1389, 04:10 صبح
سلام مشكل همين جاست كه من نميخوام اصلا توي تابع اول تغيري ايجاد كنم چون تابع اولي براي ذخيره كردن اطلاعات زمان در ديتابيس هم مورد استفاده قرار ميگيره نميشه كه مثلا اگه كسي يه نظر ارسال ميكنه تو ديتابيس ذخيره بشه 5 دقيقه پيش ميخوام جاهايي تابع دوم روفراخواني كنم كه نياز به خروجي داشته باشيم مثلا تو نمايش نظرات .
این چه فرمایشیه؟
شما از این تابع می‌تونید بسته به نیازتون استفاده کنید. تغییراتی که من دادم، هیچ تغییری در خروجی‌های قبلی تابع نمی‌ده.
فقط من اومدم یک format دیگه هم بهش اضافه کردم.
حالا شما هر جا خواستید می‌تونید از این فرمت استفاده کنید.

در ضمن، مگه شما از این تابع برای ذخیره تاریخ در database استفاده می‌کنید؟ مگه تاریخ رو timestamp ذخیره نمی‌کنید؟

dezchilds
چهارشنبه 17 شهریور 1389, 12:04 عصر
سلام چرا حق با شماست من از اين فقط براي فراخواني استفاده ميكنم حالا يه چيز ديگه اگه بخواهيم اين رو به صورت شمسي برگردونيم چي ميشه ؟ چطوري بايد اينو بنويسيم ؟ يعني بازم يه شرط بزاريم و تاريخ رو به صورت شمسي بنويسيم

sama01
چهارشنبه 17 شهریور 1389, 12:16 عصر
توابع تبدیل تاریخ شمسی (جلالی) به میلادی و بالعکس در اینترنت موجود است.
می‌توانید آن‌ها را بگیرید و مثل کاری که من کردم ترکیب کنید. مثلا یک format جدید بسازید به اسم jalali.
ولی حواستان باشد که اطلاعات را به فرمتی باید به آن توابع بدهید که برای‌شان قابل فهم باشد.

در مجموع سعی کنید همین تابع را گسترش دهید.
فقط کمی غیر استاندارده. مثلا به جای استفاده از if ...elseif....elseif به‌تره از switch case استفاده بشه.