آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

ایده ی بهتر برای سیستم Rendering و Database Helper

Mr Mehdi  11 سال پیش  11 سال پیش
+1 0

درود

این سیستم رندرینگ ای که استاد داره روی cms استفاده می کنه واقعا خیلی ناقصه. مثلا اگه من یه وبسایت داشته باشم که بخوام برای صفحه اصلیش یه قالب استفاده کنم، برای وبلاگش یکی دیگه و ... نمیتونم با این سیستم کارم رو راه بندازم و کلا اگه بشینم برای هر کدوم یه کد جدا بنویسم راحت تر هست. 

اگه کسی ایده ای برای یه سیستم Rendering بهتر داره به منم بگه استفاده کنم :)

مشکل دیگه ای که هست باگ sqli توی سیستم Database Helper الان هست. اگه بخوام از PDO استفاده کنم خیلی پیچیده میشه و دوباره اگه برای هر کلاس بشینم یه کد جدا بنویسم کمتر کد میشه :))

اگه کسی برای این هم راه حلی داره بگه.

 برای این سوال 3 پاسخ وجود دارد.
پاسخ به سوال 
محسن موحد  11 سال پیش
+5 0

سلام. در مورد جلوگیری از sql injection خود mysqli متد prepare داره.این لینکو ببینید.(استفاده از همین متد کافیه - بهترین راه)

اما راه دیگه هم هست که مقادیر ورودیه کاربرو قبل از گذاشتن در کوئری , Escape کنید.
برای Escape کردن ورودیها باید از متد real_escape_string استفاده کنید.این لینکو ببینید.

لینک هایی که گذاشتم مثال هاشو ببین تا جریان دستت بیاد.

در مورد render و قالب در mvc هم بعدا یک مدل معرفی میکنم.

0 0
فعلا از همون روش Escape کردن استفاده کردم. نمیدونم جواب میده یا نه :/ در مورد render هم الان یه توضیح مختصر بدی متوجه میشم یا حداقل یه لینک انگلیسی آدموار بده (11 سال پیش)
0 0
بله escape مشکلتونو حل میکنه. در کنترلر اصلی یک فیلد معرفی کنید مثله public $layout='/layouts/column1'; که مقدار پیش فرض مشخص میکنی و اگر در یک کنترلر خواستین قالبو عوض کنید کافیه با $this->layout این مقدارو در اون کنترلر تغییر بدید. (11 سال پیش)
0 0
یعنی بصورت پارامتر بفرستم برای کلاس رندر؟ (11 سال پیش)
0 0
یا فکر کنم منظورتون مسیر رو بصورت یه متغیر تو همون کلاس رندر تعریف کنم و بعدا فقط هرجا خواستم با یه قالب دیگه بسازم متغیر رو دوباره تغیر بدم (11 سال پیش)
0 0
داخل متد render باید با توجه به $layout ویو مورد نظرو در داخل اون layout بریزی و اجرا کنی.اگر نیازه یک نمونه کد بیارم! (11 سال پیش)
0 0
دقیقا منظور از اینکه layout رو بریزم توی رندر رو متوجه نمیشم. منظورت با استفاده از پارامتر هست یا چیز دیگه؟ (11 سال پیش)
پاسخ به سوال 
محسن موحد  11 سال پیش
+4 0

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>
0 0
خب فکر کنم اینجا کلا قضیه فرق کرد. چون استاد یه کلاس جدا برای رندر درست کرده بود (11 سال پیش)
0 0
یه کم گیج کنندس. یخورده توضیح بده :دی (11 سال پیش)
0 0
شما از همین کدها ایده بگیرید و طبق کلاس هایی که دارید پیاده سازی کنید. (11 سال پیش)
0 0
اتفاقا اینطوری بهتره. فکر کنم اصلا کلاس رندر یه چیز اضافی بود که استاد گفت بسازیم :| (11 سال پیش)
پاسخ به سوال 
محسن موحد  11 سال پیش
+3 0

render: محتوای فایل view رو در layout میذاره و چاپ میکنه.
renderPartial: محتوای فایل view رو بدون layout در هر قسمت از برنامه چاپ میکنه.
renderText: رشته ای که میدیمو چاپ میکنه.

loadView:
کنترلر مربوطه رو مشخص میکنه. کنترلر اصلی والد کنترلر های دیگس و با get_class این عمل انجام شده.
قسمت substr برمیگرده به نوع نام گذاری کلاس های کنترلر.
بعد ازین چک میکنیم فایل مورد نظر در فایل views وجود داره یا نه. اگر فایل وجود نداشت خطایی رخ میده و اگر وجود داشت بافر خروجی فعال میشه و فایل ویو require میشه اما چیزی چاپ نمیشه (چون بافر فعال شده) در ادامه محتوای بافر ریخته میشه در متغیر viewData.

در ادامه ی کد ها فایل layout چک میشه و در صورت وجود require میشه و محتوای layout در صفحه چاپ میشه.
در فایل layout هم متغیر viewData رو در جای مد نظرمون چاپ کردیم.


اما در renderPartial این قسمت از شرط کدهای loadView اجرا میشه:

else
{
    echo $viewData;
}

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .