بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

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

مدیریت گفتگو
Mr Mehdi 11 سال پیش
آخرین تغییر: 11 سال پیش

درود

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

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

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

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

نظرات

پاسخ‌ها 3

محسن موحد 11 سال پیش

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

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

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

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

نظرات

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

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>

نظرات

Mr Mehdi 11 سال پیش
خب فکر کنم اینجا کلا قضیه فرق کرد. چون استاد یه کلاس جدا برای رندر درست کرده بود
Mr Mehdi 11 سال پیش
یه کم گیج کنندس. یخورده توضیح بده :دی
محسن موحد 11 سال پیش
شما از همین کدها ایده بگیرید و طبق کلاس هایی که دارید پیاده سازی کنید.
Mr Mehdi 11 سال پیش
اتفاقا اینطوری بهتره. فکر کنم اصلا کلاس رندر یه چیز اضافی بود که استاد گفت بسازیم :|
محسن موحد 11 سال پیش

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

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

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


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

else
{
    echo $viewData;
}

نظرات


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