ایده ی بهتر برای سیستم Rendering و Database Helper
درود
این سیستم رندرینگ ای که استاد داره روی cms استفاده می کنه واقعا خیلی ناقصه. مثلا اگه من یه وبسایت داشته باشم که بخوام برای صفحه اصلیش یه قالب استفاده کنم، برای وبلاگش یکی دیگه و ... نمیتونم با این سیستم کارم رو راه بندازم و کلا اگه بشینم برای هر کدوم یه کد جدا بنویسم راحت تر هست.
اگه کسی ایده ای برای یه سیستم Rendering بهتر داره به منم بگه استفاده کنم :)
مشکل دیگه ای که هست باگ sqli توی سیستم Database Helper الان هست. اگه بخوام از PDO استفاده کنم خیلی پیچیده میشه و دوباره اگه برای هر کلاس بشینم یه کد جدا بنویسم کمتر کد میشه :))
اگه کسی برای این هم راه حلی داره بگه.
سلام. در مورد جلوگیری از sql injection خود mysqli متد prepare داره.این لینکو ببینید.(استفاده از همین متد کافیه - بهترین راه)
اما راه دیگه هم هست که مقادیر ورودیه کاربرو قبل از گذاشتن در کوئری , Escape کنید.
برای Escape کردن ورودیها باید از متد real_escape_string استفاده کنید.این لینکو ببینید.
لینک هایی که گذاشتم مثال هاشو ببین تا جریان دستت بیاد.
در مورد render و قالب در mvc هم بعدا یک مدل معرفی میکنم.
class Controller
{
public $layout = 'main';
protected function loadView($view, $values = array(), $useLayout = false)
{
extract($values);
$controller = substr(strtolower(get_class($this)), 0, -10);
$viewFile = "views/{$controller}/{$view}.php";
if(!file_exists($viewFile))
{
throw new Exception("View '{$view}.php' was not found in 'views/{$controller}' directory.");
}
ob_start();
require_once $viewFile;
$viewData = ob_get_clean();
if($useLayout)
{
$layoutFile = "views/layouts/{$this->layout}.php";
if(!file_exists($layoutFile))
{
throw new Exception("Layout '{$this->layout}.php' was not found in 'views/layouts' directory.");
}
require_once $layoutFile;
}
else
{
echo $viewData;
}
}
public function render($view, $values = array())
{
$this->loadView($view, $values, true);
}
public function renderPartial($view, $values = array())
{
echo $this->loadView($view, $values);
}
public function renderText($text)
{
echo $text;
}
}
فایل main.php داخل پوشه ی layouts:
<?php $config = Loader::load('Configs'); ?>
<!doctype html>
<html>
<head>
<title><?php echo $config->title; ?></title>
<meta charset="utf-8" />
<script src="<?php echo Base::baseUrl(); ?>js/jqmin.js" type="text/javascript"></script>
</head>
<body>
<?php echo $viewData . PHP_EOL; ?> // *****
</body>
</html>
render: محتوای فایل view رو در layout میذاره و چاپ میکنه.
renderPartial: محتوای فایل view رو بدون layout در هر قسمت از برنامه چاپ میکنه.
renderText: رشته ای که میدیمو چاپ میکنه.
loadView:
کنترلر مربوطه رو مشخص میکنه. کنترلر اصلی والد کنترلر های دیگس و با get_class این عمل انجام شده.
قسمت substr برمیگرده به نوع نام گذاری کلاس های کنترلر.
بعد ازین چک میکنیم فایل مورد نظر در فایل views وجود داره یا نه. اگر فایل وجود نداشت خطایی رخ میده و اگر وجود داشت بافر خروجی فعال میشه و فایل ویو require میشه اما چیزی چاپ نمیشه (چون بافر فعال شده) در ادامه محتوای بافر ریخته میشه در متغیر viewData.
در ادامه ی کد ها فایل layout چک میشه و در صورت وجود require میشه و محتوای layout در صفحه چاپ میشه.
در فایل layout هم متغیر viewData رو در جای مد نظرمون چاپ کردیم.
اما در renderPartial این قسمت از شرط کدهای loadView اجرا میشه:
else
{
echo $viewData;
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .