وقتی از تابع استفاده کنیم دیگه پارامتر ? نخواهیم داشت
حالا مثلا برای pagination و جستجو ما مجبور هستیم از این ? پارامتر درواقع استفاده کنیم
برای همچین مواقعی ما توی روترمون چه راهکاری رو در نظر خوایم گرفت
سلام.
متوجه سؤال نشدم. بیشتر توضیح بدید و اگر اشاره به ویدیوی کلاس دارید، دقیقه اش رو مشخص کنید. ?
محسن موحد۲۴ آذر ۱۴۰۰، ۱۷:۴۴
دقیقه ١ !
نمیدونم بیشتر چطور باید توضیح بدم
کجای سوالم متوجه نشدین !؟
Mehrzad Tajkarimi۲۴ آذر ۱۴۰۰، ۱۷:۵۱
از دقیقه ۱ تا آخر چند بار ببینین به ج میرسی.
محسن موحد۲۴ آذر ۱۴۰۰، ۱۸:۰۵
نرسیدم که سوال پرسیدم ...
بعنی میفرمایید از اول تا اخر این ویدیو چواب سوال من بوده !
چطور میشه استفاده کرد
domain.com/?page=1
من دقیقا به همون شکل پباده کردم ولی این تابع جلوی این درخواست میگیره
Mehrzad Tajkarimi۲۷ آذر ۱۴۰۰، ۰۵:۰۹
شما نیاز به ? ندارید.
با توجه به ساختار uri باید پارامتر مورد نظرتو مقدارشو بگیری.
مثلا اگر pagination براساس مقدار page شماره صفحه رو مشخص میکنه، از داخل پارامترها مقدارشو بخونید و بر اساس همین شماره هم میتونید صفحه رو لود کنید و هم url صفحات دیگه رو بسازید.
یک کلاس pagination قبلا نوشتم که این کلاسو توو هر ساختار و پروژه ای میشه استفاده کرد، فقط کافیه ساختار url رو بهش بدید، خودش page رو نمایش میده... میتونید ازین کدها ایده بگیرید:
<?php/**
* @author Mohsen Movahed @yahoo.com>
* @copyright 2014 Mohsen Movahed
* @date 19 May 2014 - 1393/2/28
* @version 1.0
* @license GPL
* @link http://www.bithub.ir
*/
classPagination{
private$items;
private$output;
/**
* construct method
*/publicfunction__construct($params = null)
{
$this->items = array(
'items_per_page' => 5, // Records per page to display'total_records' => 0, // Total records in database'total_pages' => 0, // Total number of pages'url_address' => '', // For example: http://www.mysite.com/?page='concat_to_url' => '', // This comes after page value - [optional]'current_page' => 1, // Number of current page'page_num_per_section' => 5, // Total number of pages to display - for example CurrentPage=16 :=> [first][next]...,14,15,[16],17,18,...[prev][last] 'mode' => false, // Mode = true or anything => Display:: 1,...,14,15,[16],17,18,...,20
);
// set valuesif (isset($params) && count($params) > 0)
{
if (is_array($params))
{
foreach ($paramsas$key => $value)
{
if (!empty($value))
{
$this->$key = $value;
}
}
}
}
// run paginate method$this->paginate();
}
/**
* get values
* @param string $key Must be index of items array
* @return mixed|boolean if there is $key, returns array value otherwise returns false.
*/publicfunction__get($key)
{
if (isset($this->items[$key]))
{
return$this->items[$key];
}
returnfalse;
}
/**
* set values
* @param string $key Index of items array
* @param mixed $value a value for set
*/publicfunction__set($key, $value)
{
if (isset($this->items[$key]))
{
$this->items[$key] = $value;
}
}
/**
* get total pages
* @return integer Return the total pages
*/privatefunctiongetTotalPages()
{
$this->items_per_page = ($this->items_per_page <= 0 ? 1 : $this->items_per_page);
$total = ceil($this->total_records / $this->items_per_page);
if ($total <= 0)
{
$total = abs($total) + 1;
}
return$total;
}
/**
* this manages to display pagination
*/privatefunctionpaginate()
{
$this->total_pages = $this->getTotalPages(); // set total pages$check = $this->checkItems(); // check item values and page number if ($check)
{
// start of section$start = $this->current_page - floor($this->page_num_per_section / 2);
// maximum start$max = $this->total_pages - floor($this->page_num_per_section / 2);
if($start <= 0 || $start > $max)
{
if ($start > $max)
$this->current_page = 1;
$start = 1;
}
// end of section$end = $start + $this->page_num_per_section - 1;
if($end > $this->total_pages)
{
$end = $this->total_pages;
}
$this->output .= '
اما اگر بعد بررسی کدها هنوز هم مشکل در پیاده سازی داشتید، فایل پروژه تون رو بذارید تا فیکسش کنم.
محسن موحد۲۷ آذر ۱۴۰۰، ۱۰:۲۴
باید مقدار به روتر فرستاده بشود درصورت که بخوام با ساختار الان پارامتر بفرستم
ممکنه چندین پارامتر ارسال بشه جهت جستجو تو این شرایط باید چی کار کرد.
من فکر میکنم درست توضیح ندادم با شما متوجه نشدین
شما دیجی کالا رو در نظر بگیر
زمانی چیزی رو جستجو میکنی مقدار ؟= به url ارسال میشه درسته ؟!
من با این ساختار نمیتونم مقدار بفرستم
وتا الان به داستان دیگر که متوجه شدم ما اسلاگ هم داریم اضافه میکنیم به آخرurlو فارسی هستش .
خود دیجی میره تو یه روت دیگه برای حستجو این رو
ولی من نمیدونم چیکار کنم گیج شدم واقعا
شما در نظر بگیر با این شرایط برای ساختار صفحه بندی هم نیازه مقدار بفرستی
Mehrzad Tajkarimi۲۸ آذر ۱۴۰۰، ۰۷:۰۶
پستهای قبلیم در مورد ارسال مقادیر مثل پیج و... در روتر هست. راه حل ساده اس.
قسمتی از کد و ساختارتونو بذارین تا بتونم کمک کنم.
فک میکنم دارید به uri خودتون ? اضافه میکنید. کدرو بزارید.
حتی در اسکریپت کلاسی که گذاشتم یه اتریبیوت بعنوان concat url میگیره. من گفتم هر ساختاری که تصور کنید رو جواب میده اون کلاس. ولی یه جای کارو دارید اشتباه تصور میکنید.
محسن موحد۲۸ آذر ۱۴۰۰، ۰۷:۱۵
ساختار همون ساختار پروژست
<?php
namespace App\\Core\\Routing;
use App\\Core\\Middleware\\Auth;
use App\\Core\\Middleware\\GlobalMiddleware;
use App\\Core\\Request;
use App\\Core\\Routing\\Route;
class Router
{
private $request;
private $routes;
private $route_current;
const BASE_CONTROLLER = '\\App\\Controllers\\\\';
public function __construct()
{
$this->request = new Request;
$this->routes = route::routes();
$this->route_current = $this->fine_route($this->request) ?? null;
$this->run_middleware();
}
public function run()
{
if (is_null($this->route_current)) {
$this->dispatch_404();
}
$this->dispatch($this->route_current);
}
private function fine_route(Request $request)
{
foreach ($this->routes as $route) {
if (!in_array($request->method(), $route['method'])) {
continue;
}
if ($this->regex_matched($route)) {
return $route;
}
}
return null;
}
private function regex_matched($route)
{
global $request;
// explode pattern '/^\\/post\\/(?[-%\\w]+)$/'
$pattern = "/^" . str_replace(['/', '{', '}','?='], ['\\/', '(?<', '>[-%\\w]+)','/([^=]+)\\=([^&]+)/m'], $route['uri']) . "$/";
// $get_pattern = "/^" . str_replace(['/', '{', '}'], ['\\/', '(?<', '>[-%\\w]+)'], $route['uri']) . "$/";
$result = preg_match($pattern, $this->req
آیا این پاسخ مشکل شما را حل کرد؟
Mehrzad Tajkarimi ۲۸ آذر ۱۴۰۰، ۱۱:۰۵
ساختار همون ساختار پروژست
request = new Request;
$this->routes = route::routes();
$this->route_current = $this->fine_route($this->request) ?? null;
$this->run_middleware();
}
public function run()uest->uri(), $matches);
if (!$result) {
return false;
}
// send key value use { global $request } from controller
foreach ($matches as $key => $value) {
if (!is_int($key)) {
$request->set_param($key, $value);
}
}
return true;
}
private function run_middleware()
{
$middles = $this->route_current['middleware'] ?? array();
foreach ($middles as $middle_class) {
$middle_object = new $middle_class;
$middle_object->handle();
}
if ($this->request->segment(2) !== 'login') {
$middle_object = new Auth;
$middle_object->handle();
}
$middle_object = new GlobalMiddleware;
$middle_object->handle();
}
private function dispatch_404()
{
header("HTTP/1.0 404 Not Found");
view_flash_message('Error.404');
die();
}
private function dispatch($route)
{
$action = $route['action'];
if (is_null($action) || empty($action)) {
return;
}
if (is_callable($action)) {
$action();
}
if (is_string($action)) {
$action = explode('@', $action);
}
if (is_array($action)) {
$uri_separator = explode('/', $route['uri']);
$routing = $uri_separator[1] == 'admin' ? 'Backend\\\\' : 'Frontend\\\\';
$class_name = self::BASE_CONTROLLER . $routing . $action[0];
$method_name = $action[1];
if (!class_exists($class_name)) {
throw new \\Exception("class $class_name Not Exists");
}
if (!method_exists($class_name, $method_name)) {
throw new \\Exception("method $method_name not exist in class $class_name");
}
$controller = new $class_name();
return $controller->{$method_name}();
}
}
}
Mehrzad Tajkarimi۲۸ آذر ۱۴۰۰، ۰۷:۳۵
ساختار همون ساختار پروژست
<?php
namespace App\\Core\\Routing;
use App\\Core\\Middleware\\Auth;
use App\\Core\\Middleware\\GlobalMiddleware;
use App\\Core\\Request;
use App\\Core\\Routing\\Route;
class Router
{
private $request;
private $routes;
private $route_current;
const BASE_CONTROLLER = '\\App\\Controllers\\\\';
public function __construct()
{
$this->request = new Request;
$this->routes = route::routes();
$this->route_current = $this->fine_route($this->request) ?? null;
$this->run_middleware();
}
public function run()
{
if (is_null($this->route_current)) {
$this->dispatch_404();
}
$this->dispatch($this->route_current);
}
private function fine_route(Request $request)
{
foreach ($this->routes as $route) {
if (!in_array($request->method(), $route['method'])) {
continue;
}
if ($this->regex_matched($route)) {
return $route;
}
}
return null;
}
private function regex_matched($route)
{
global $request;
// explode pattern '/^\\/post\\/(?[-%\\w]+)$/'
$pattern = "/^" . str_replace(['/', '{', '}','?='], ['\\/', '(?<', '>[-%\\w]+)','/([^=]+)\\=([^&]+)/m'], $route['uri']) . "$/";
// $get_pattern = "/^" . str_replace(['/', '{', '}'], ['\\/', '(?<', '>[-%\\w]+)'], $route['uri']) . "$/";
$result = preg_match($pattern, $this->request->uri(), $matches);
if (!$result) {
return false;
}
// send key value use { global $request } from controller
foreach ($matches as $key => $value) {
if (!is_int($key)) {
$request->set_param($key, $value);
}
}
return true;
}
private function run_middleware()
{
$middles = $this->route_current['middleware'] ?? array();
foreach ($middles as $middle_class) {
$middle_object = new $middle_class;
$middle_object->handle();
}
if ($this->request->segment(2) !== 'login') {
$middle_object = new Auth;
$middle_object->handle();
}
$middle_object = new GlobalMiddleware;
$middle_object->handle();
}
private function dispatch_404()
{
header("HTTP/1.0 404 Not Found");
view_flash_message('Error.404');
die();
}
private function dispatch($route)
{
$action = $route['action'];
if (is_null($action) || empty($action)) {
return;
}
if (is_callable($action)) {
$action();
}
if (is_string($action)) {
$action = explode('@', $action);
}
if (is_array($action)) {
$uri_separator = explode('/', $route['uri']);
$routing = $uri_separator[1] == 'admin' ? 'Backend\\\\' : 'Frontend\\\\';
$class_name = self::BASE_CONTROLLER . $routing . $action[0];
$method_name = $action[1];
if (!class_exists($class_name)) {
throw new \\Exception("class $class_name Not Exists");
}
if (!method_exists($class_name, $method_name)) {
throw new \\Exception("method $method_name not exist in class $class_name");
}
$controller = new $class_name();
return $controller->{$method_name}();
}
}
}
جای اینکه بگید اشتباهه و نمیشه چند بار پاسخ هامو تحلیل میکردین شاید ایراد جای دیگه از طرف شما باشه. منکه کد بدون تست نمیفرستم. حتی لینک نمونه ایم که فرستادین مدلی نبود که دنبالش بودین. کدهاییم که فرستادین ناقص بود رفتم پروژه رو از داخل دوره دانلود کردم...
نه کدی نه ساختاری وقتی بزور اطلاعات میدید من که نمیتونم همه ساختار سرور شمارو حدص بزنم.
تعجبم بعد این همه زمانیکه برای رفع ایراد گذاشتم تازه احتمالات یادتون اومد!! و وب سرورو میگید اپاچی نیست.
کل uri داره در ابتدا از طریق وب سرور هندل میشه...
محسن موحد۲۸ آذر ۱۴۰۰، ۱۳:۱۲
عزیزم بهت بر نخوره...
شما اگه ساختار پروژه که آقای اوند رو میدونستی ومرور میکردی این پیشنهادها رو نمیدادی
من مطمئنم شما اشتباه راهنمایی میدادی
اون فلا قد کد که میفرستید که بدرد من نمیخوره
من نمیخواستم بدونم سطح علمی شما چیه تو نت پره امسال کد شما ...
شما خواستی کدی که مشکل داره رو بفرست من همون قسمت مرتبط و فرستادم
یعنچی بعد از کاری که کردی من احتمالات به ذهنم رسید چه ربطی داره
تو برنامه نویسی حتما یه باگ حل میشه منتهی زمان حل باگ هست که نیاز به راهنمایی خواهد داشت به جهت سرعت بخشیدن به حل باگ
شما اگه با این اطمینان میدونستین این داستان url و وب سرور رو بهتر نبود ابتدا این سوال رو میپرسیدین
مگه حتما همه باید از وب سرو شما استفاده کنند .
بعد اگر من این احتمال رو در نظر میگرفتم دیگه به کمک شما نیاز نداشتم سریعتر متوجه میشدم داستان چیه
بعد شما الان به عنوان منتور دوره وقتی متوجه شدید مشکل من از کجاست چرا چک نکردین و توضیح ندادین مشکل کانفییگ من حل بشه
بیشتر احساس کردم حالت رفع تکلیف داشت پاسخهای شما و با دلسوزی و فکر پاسخ ندادین
خیلی خوب که سریع جواب دادین و این برای من ارزش داره ولی اینکه فقط صفحه سیاه بشه طرف بیخیال بشه بره پی کارش این نشد ،...
Mehrzad Tajkarimi۲۸ آذر ۱۴۰۰، ۱۵:۳۳
حق با شماست.
من سواد پاسخگویی به سوالات شمارو ندارم.
سوالتون رو مجدد تاپیک بزنید تا منتورهای دیگه بررسی کنن. Php سه تا منتور داره.
منتورها در سیستم سون لرن یک فعالیت دوستانه اس نه وظیفه که کسی بخواد از سر وا کنه...
موفق باشید.
محسن موحد۲۸ آذر ۱۴۰۰، ۱۶:۵۵
سلام و احترام
وقتی میتونید key رو به عنوان مثال page و value رو که میشه شماره صفحه رو داشته باشید دیگه چه نیازی به ? دارید؟
اگه امکانش هست بیشتر توضیح بدید
امیر صالحی۲۹ آذر ۱۴۰۰، ۱۹:۱۵
سلام آقای صالحی عزیز
ببینید زمانی هست که شما میخواید تو برنامه فیلترهای متعدد ایحاد کنید یا چندین جستجو باهم ارسال کنید اینجا کار نیاز هستش که تو روتر به صورتی اقدام کنیم قابلیت ارسال هر تعداد پارامتر رو به کنترولر داشته باشه
الان این قابلیت وجود نداره تو این ساختار و این به نظرم یه ایراد هستش
حتی تو فریورکها هم این امکان وجود داره
Mehrzad Tajkarimi۲۹ آذر ۱۴۰۰، ۱۹:۲۲
سلام مهرزادجان
در مورد کشدار شدن این تاپیک دلیل اصلیش مبهم بودن توضیح سوالت هست. منتورها توی سون لرن به صورت مرتبط زمان میذارن. و اگر سوالی شفاف نباشه طبیعی هست که کلی ابهام در پاسخگوییش بوجود بیاد.
لطفا زمانی که سوال میپرسی این موارد رو در نظر بگیر که زودتر جواب بگیری:
به صورت کلی اشاره به ویدیو جلسه نکن. سعی کن یه سمپل شبیه چیزی که ویدیو هست و در موردش سوال داری در صورت سوالت بذار و روی اون سوالت رو بپرس.
اگر در مورد بخشی از سورس کدهای جلسات سوال داری، حتما اسکرین شات اون بخش رو همراه سوالت الصاق کن
در نهایت در توضیح سوالت هم ساده و شفاف و با توضیحات کافی مشکلت رو مطرح کن
عموما سوالاتی که در ابتدای کار به صورت مبهم پرسیده میشن، زمان و کیفیت پاسخگوییشون بد میشه طبیعتا. پس روی این نقطه شروع تاپیک حساس باش و وقت بذار
ممنونم
لقمان آوند۲۹ آذر ۱۴۰۰، ۱۹:۲۳
در مورد رپلای آخرت هم بگم که چرا حتما میخوای این پارامترهای فیلترینگ رو به صورت پارامترهای روت بفرستی.
چیزی که اکثر جاها عرف هست به صورت کوئری پارامتر میفرستی اینها رو و اونور میگیریشون.
لقمان آوند۲۹ آذر ۱۴۰۰، ۱۹:۲۶
سلام دکتر ممنون بابت راهنمایتون در مورد سوال پرسیدن و ممنون از این که این فضا رو برای ما اماده کردید و دوستان و همکاران منتور رو به جهت راهنمایی و کمک رسوندن در اختیار ما گزاشتین ...
در خصوص سوال
به این چالش رسیدم چرا که کار فرما میگه زمان هست که مثلا جستجو یا فیلتر یا شماره صفحه بصورت لینک ارسال بشه
اونوقته که نیاز به url هستش..
Mehrzad Tajkarimi۲۹ آذر ۱۴۰۰، ۱۹:۳۱
خوب لینکی که حاوی کوئری پارامتر هست رو هم میتونی داشته باشی و کارفرما ازش استفاده کنه.
یا اینکه یه استانداردی تو فیلترینگ در url برای خودت ایجاد کن. مثل این:
/products/{filters}
و فیلترها رو اینطور کار کن:
/products/category:10,tag:mobile
ولی خوب نیاز به کارای استرینگی داری که کلید و مقدارها رو بسازی و در بیاری مجدد.
لقمان آوند۲۹ آذر ۱۴۰۰، ۱۹:۴۳
ممنون امیدوارم بودم راه منطقی و اصلاحی تو ساختار پروژه رو پیشنهاد میدادین
متاسفانه خیلی از این روش خوشم نیومد ...
چرا ما ساختار طوری طراحی نکردیم که مجبور نشیم اینشکلی پارامتر ارسال کنیم !!
Mehrzad Tajkarimi۲۹ آذر ۱۴۰۰، ۱۹:۵۹
دو سه نکته مهم رو بگم مهرزاد
اولی اینکه اگر این جلسه رو دیده باشی ما در روترمون قابلیت ارسال تعداد زیادی پارامتر در روت رو پیاده سازی کردیم که میتونی ازش استفاده کنی و هر تعداد پارامتر دوست داری میتونی در روت هات تعریف کنی و داشته باشی.
دوم اینکه این یک پروژه آموزشی هست و نه یه فریمورک عملیاتی و در ابتدای سرفصل و در طول سرفصل مدام به این مورد اشاره شد که برای اینکه نگاه مهندسی به طراحی و پیاده سازی فریمورک به صورت عمیق داشته باشید دارید آموزش میبینید
سوم و مهمتر از همه اینکه باز هم در طول دوره گفته شد اگر قراره روی پروژه واقعی و مهمی کار بکنید سعی کنید از فریمورکهای مطرح موجود استفاده کنید که برای پروداکشن آماده هستند. نه فریمورک آموزشی خودمون که طبیعتا چون با هدف آموزش توسعه داده شده ممکنه مشکلات و باگهای ریزه میزه و تست نشده زیاد داشته باشه
اگر در طول سرفصل این ویدیوها رو دیدی و به این توصیهها عمل نکردی که طبیعتا مسیر رو اشتباه رفتی. اگر هم ویدیوها رو به صورت کامل ندیدی که حتما ببین و در اولین فرصت پروژه ای که از کارفررما گرفتی رو منتقل کن روی یه فریمورکی مثل لارول ...
لقمان آوند۲۹ آذر ۱۴۰۰، ۲۰:۱۲
دکتر من متوجه هستم طلب هم ندارم که چرا چنین و چنان قبلش هم تشکر کردم بابت همه چیز ،
ویدیوها وتوضیحات شما رو در این خصوص کاملا اشراف دارم حتی اول دوره حضوری هم شما تاکید رو این موضوع داشتید خاطرم هست من به خواسته خودم این کار رو انجام دادم،
در رابطه با این سوال هم صرفاً راهنمایی میخواستم کسی رو مسئول چیزی ندونستم شما بارها به این مسئله اشاره کرده بودین ،بنده توقعی هم ندارم تا همینجا هم متشکرم و کاملا رضایت دارم ،،
امیدوارم برداشت بد نکرده باشید ،
اگر عدم رضایتم رو از راهنمایی شما اعلام کردم بخاطر این بود که فکر میکردم شما انتقاد پذیرهستید و میتونم نظرم رو بگم یادمه گفته بودین از انتقاد بیشتر تمجید استقبال میکنید ،
نکته هایی که شما میفرمایید کاملا درسته در خصوص استفاده از فریم ورک ولی پروژه من یه فروشگاه سادست درصورتی که همونجایی که کار میکنم پروژه خیلی پیچیدهتر رو با php فاگشنال نوشتن و خیلی هم از سرعتش راضی هستن فقط یه مشکل بزرگ داره اونم عدم توسعه پذیریه
ولی این cms به نظر من کمی از فریم ورک نداره برای کارهای ابتدایی ولی وقتی من دارم خودم توسعه میدم بده که نتونم یه مسأله به این سادگی رو حل کنم ،،
من هم با لاراول کار کردم هم با کدایگناتر ولی چیزی که تو لاراول اذیتم میکرد این وابستگی و ابزار بود که بدون اینکه نیاز باشه بدونی چه اتفاقی پشت صحنه افتاده ازش استفاده میکردم ،
انموقع احساس میکردم بیشتر اپراتور هستم برای همین تصمیم گرفتم یکم بیشتر به php تسلط پیدا کنم و اعتماد به نفس بیشتری بدست بیارم و تا الان هم تقریبا به خواستم رسیدم
میبخشید فکر میکنم اینجا جای این صحبتها نبود عذرخواهی میکنم بابت اینکه از صورت سوال فاصله گرفتم ،،
Mehrzad Tajkarimi۲۹ آذر ۱۴۰۰، ۲۱:۲۹
سلام مجدد
نه اصلا ناراحتی نداره. من صرفا این موارد رو بهت گفتم که تصمیم درست رو بگیری.
برای شروع و متخصص شدن قطعا لازمه که بدونی در عمق فریمورک چی میگذره. ولی بعد از به مدتی این ابزارهای بهتر هستند که کارها رو سریعتر و بهتر پیش میبرند. نمونه اش همین چیزی که الان بهش برخورد کردی. ممکنه چندین نیاز دیگه هم جلوتر برات ایجاد بشه که باز با این فریمورک در پروژه واقعی اذیتت کنه.
با توجه به اینکه دو سه ساله که میدونم داری کار میکنی بهتره از ابزارهایی که پایدارتر هستند، نگهداری بهتری دارند و سرعت توسعه ات رو افزایش میدن استفاده کنی.
اگر لاراول رو سنگین میدونی لومن استفاده کن، slim استفاده کن. کدایگنایتر یا ...
فردا تو از رو این پروژه رفتی دولوپر بعدی این فریمورک رو نمیشناسه و هزینه توسعه بالا میره ولی اگر فریمورک مطرحی باشه هزینههای توسعه و نگهداری رو پایین میاری ...