PDA

View Full Version : سوال: چگونگی گرفتن method در php mvc



mohammadkiani
شنبه 23 اسفند 1393, 16:49 عصر
سلام دوستان
من با استفاده از آموزش زیر شروع به یادگیری php mvc کردم:
http://web.itpro.ir/tutorials/12499/%D9%82%D8%B3%D9%85%D8%AA-%D8%B4%D8%B4%D9%85-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-mvc-%D8%AF%D8%B1-php
همه چیز خوب هست. مشکل فقط اینجاست که من میخواهم به function های داخلی صفحه که در فولدر model هست دسترسی داشته باشم.
به طور مثال من در صفحه index هستم (در فولدر view/index/index.php)؛ حالا به ازای هر صفحه در فولدر model یک فایل با نام آن و model.php_ دارم که داخل آن یکسری function هست. تو آموزش یک object از این class ساخته شده. اما در لایه view نمیتونم بهش وصل بشم. چه باید بکنم؟

Mohammadsgh
شنبه 23 اسفند 1393, 22:08 عصر
درود
کار همه اینها با کنترلر هست.شما باید دو تا متد در کنترلر اصلی (mvc)برای کارهاتون بسازید.1-render2-loadmodel
1-loadmodel:کارش فراخوانی مدل در کنترلر هست
2-render:فرخوانی لایه نمایش (view) در کنترلر
و کنترلر شما از کنترلر اصلی مشتق میشه(extends) که تو کنترلرتون میتونید از اون دو تا متد استفاده کنید
این لینک رو ببینیدhttp://phpro.ir/mvc-%D8%AF%D8%B1-php-%D9%82%D8%B3%D9%85%D8%AA-%D8%B3%D9%88%D9%85-model/
تو اینجا تابع model همون کاری که میخواید رو میکنه.
این لینک هم برای view
http://phpro.ir/mvc-%D8%AF%D8%B1-php-%D9%82%D8%B3%D9%85%D8%AA-%DA%86%D9%87%D8%A7%D8%B1%D9%85-view-%D9%88-controller/
آموزش های همون لینک رو گام به گام بخونید تا متوجه بشید
http://phpro.ir/page/2/

mohammadkiani
شنبه 23 اسفند 1393, 22:37 عصر
میشه یک مثال بزنید. یعنی چطور تو لایه view بتونم استفاده کنم؟

Mohammadsgh
شنبه 23 اسفند 1393, 23:23 عصر
اگه منظورتون مدل هست اینجوری


//controller method
public function index() {
$data=array(
'getindex'=>$this->model->getindex()
);
$this->view->render('admin/index',$data,TRUE);
}

تو ویو getindex رو میشه به صورت متغییر بهش دسترسی داشت.اگه متوجه نشدید بگید توضیح بدم

mohammadkiani
یک شنبه 24 اسفند 1393, 15:32 عصر
سلام
ممنون از شما
تقریباً متوجه شدم !!!
اما چندتا مطلب:
1- آموزشی که شما گذاشته بودید رو خوندم؛ اما وقتی با لینک آموزشی که خودم گذاشته بودم مقایسه کردم جسارتاً دیدم لینک آموزشی که من گذاشتم اصولی تر هست. البته اون آموزشی که شما گذاشته بودید رو قبلا دیده بودم اما نخونده بودم. تو آموزشی که من لینک گذاشتم همه چیز توسط controller بررسی و به view , model فرستاده میشد. اما تو آموزشی که شما گذاشته بودید تو لایه کلاس view می امد query اجرا میکرد که خودتون بهتر میدونید این query میبایست در model مربوط به صفحه انجام میشد. به هر حال ...
2- من الان تو متد render کلاس view جایی برای متغیر $data در نظر نگرفتم. اما شما اینجا به عنوان پارامتر در متد ازش استفاده کردید. میشه یه توضیح بدید که با تو کد view تغییری ایجاد کنم یا خیر؟
3- ببیند وقتی تو لایه view من print_r($this) رو میگیرم چنین متنی چاپ میشه:


View Object
(
)

که کاملا صحیح هست. چون در حال حاضر داخل آبجکت view هستیم. اما وقتی تو فایل bootstrap.php که loadeer فریم ورک من هست بعد از لود مدل مربوط به صفحه از متغیر $controller پرینت میگیرم به صورت زیر چاپ میشه:


Index Object
(
[view] = View Object
(
)
[model] = Index_model
)

یعنی اینکه تو آبجکت Index من مدل هست. اما تو view نمیدونم چطور میتونم بهش دسترسی داشته باشم.
این ها رو با توجه به کدهای آموزش خودم گفتم. ممنون میشم راهنمایی کنید.

Mohammadsgh
یک شنبه 24 اسفند 1393, 16:19 عصر
راستشو بخواید من اون لینکی که دادم رو دقیق نخوندم و برای اینکه مشکلتون بر طرف بشه اون لینکو دادم.اگه به کلاس ویو من نگاه کنید 90% کار رو متوجه میشید تو این کلاس تابع extract میاد یک آرایه میگیره که همونdata هست و اندیس هاشو تبدیل به متغییر میکنه که تو ویو بشه استفاده کرد



<?php
/**
*
*/
class View
{
public function render($name,$data=array(),$show=true) {
extract($data);

if ($show==true) {
require 'views/header/header.php';
require 'views/' . $name . '.php';
require 'views/header/sidebar.php';
require 'views/header/footer.php';
}elseif ($show==false) {

require 'views/header/header_admin.php';
require 'views/header/sidebar_admin.php';
require 'views/' . $name . '.php';


}

}

public function renderp($name,$data=array()) {
extract($data);
require 'views/' . $name . '.php';
}

}

?>

mohammadkiani
یک شنبه 24 اسفند 1393, 19:17 عصر
ممنون
بله؛ متوجه شدم. فقط یک سوالی برام پیش اومده و اون اینکه آیا این روشی که وقتی داریم view را render میکنیم(یعنی اینکه یک object ازش میسازیم) داده هارو بهش assign کنیم روش درستی هست؟
چون تو object فعلی مثلا Index با توجه به اون آموزش من و اون توضیحاتی که دادم و object ایندکس رو براتون رسم کردم درسته دوباره بیایم و به object فرزند model رو بدیم؟
روشی نیست که در object فعلی بشه به object بالایی دست پیدا کرد؟

Mohammadsgh
دوشنبه 25 اسفند 1393, 10:53 صبح
در مورد assign کردن بله درسته و مشکلی نداره.در مورد model میشه منظورتون رو واضح تر بگید؟متوجه منظورتون نشدم؟

mohammadkiani
دوشنبه 25 اسفند 1393, 14:32 عصر
ممنون از توضیحتون
متوجه مشکلم شدم. اشکال من اینجا بود که از assign کردن model به object اصلی اول view رو به object اختصاص میدادم که با تغییر کد مشکلم حل شد.
حالا یک مشکل جدید برام پیش اومده:لبخندساده:
اون هم اینکه من در یک صفحه فرمی دارم که به طور مثال کاربر نام خانوادگی وارد میکنه. حالا این فرم ابتدا به controller و سپس به model صفحه مربوطه فرستاده میشه و در تابع مورد نظری که من خواستم query اجرا میشه. اما من action فرم رو به صورت report/family گذاشتم. وقتی فرم ارسال میشه url عوض میشه و از localhost/report به localhost/report/family تبدیل میشه که وقتی دوباره میخوام جستجو کنم با پیغام mothod not found رو به رو میشم. برای این مشکل چه راه حلی هست؟
و اینکه وقتی از تابع family بخوام دوباره به view داده بدم باید چه کنم؟

Mohammadsgh
دوشنبه 25 اسفند 1393, 15:24 عصر
برای آدرس دادن توی action آدرس سایتتون رو تو یک ثابت تعریف کنید و از ادامه ثابت آدرس دهی کنید.در مورد تابع family هم اگه تو کنترلر تو آرایه data مدل رو فراخوانی کنید تو ویو اندیس اون آرایه متغییر میشه و به آسانی میتونید ازش استفاده کنید.البته این روش mvc که من استفاده میکنمه باید ببینید اون آموزش چیکار میکنه؟

MMSHFE
دوشنبه 25 اسفند 1393, 15:40 عصر
این روشی که شما دارین کار میکنین، معماری قدیمی MVC هست. بهتره با الگوی جدید کار کنید. توی الگوی جدید مشکلی نیست که ویو به دیتابیس دسترسی داشته باشه (البته نه اینکه مستقیماً کوئری بزنه بلکه با کمک مدل باید کارهاش رو انجام بده). در روش جدید سه بخش Model و View و Controller هرکدوم مستقل هستن و به هم دسترسی دارن. البته اگه دقیقتر بخوایم بگیم، View دیگه شئ نیست بلکه یک فایل ساده است که توسط کنترلر صدا زده میشه و درنتیجه توی ویو با کمک this$ به خود کنترلر دسترسی خواهید داشت. لزومی هم برای همنام بودن متدها و... وجود نداره.

Mohammadsgh
دوشنبه 25 اسفند 1393, 17:16 عصر
گفته شما درسته ولی بعضی جاها نیازه که داده ها از کنترلر به ویو داده بشه.نمونش هم چند ماه پیش خودتون پست زده بودید و گفتید

MMSHFE
دوشنبه 25 اسفند 1393, 17:31 عصر
منظور من روش استارتر بود. روش شما مشکلی نداره.

Mohammadsgh
سه شنبه 26 اسفند 1393, 00:19 صبح
ببخشید خیال کردم برای من رو میگید