ساخت آیتم‌های خبری

مجتبی پاکزاد کدایگنایتر 3.1.9 در حال تکمیل رایگان

حالا نحوه خواندن داده‌ها از دیتابیس با کمک کدایگنایتر را می‌دانید، اما هنوز اطلاعاتی را در دیتابیس وارد نکرده‌اید. در این بخش مدل و کنترلر news و مدل را که قبلا ساخته‌اید را توسعه خواهید داد تا این قابلیت‌ها به آن اضافه شود.

ساخت یک فرم

برای وارد کردن داده‌ها به دیتابیس، نیاز به ساخت یک فرم دارید که با کمک آن می‌توانید اطلاعات ورودی را ذخیره کنید. این بدین معنی است که شما به یک فرم با دو فیلد، یک فیلد برای عنوان و فیلد دیگر برای متن خبر نیاز دارید. اسلاگ را از عنوان در مدل می‌توانید استخراج کنید. یک ویو جدید در دایرکتوری application/views/news/create.php بسازید.

<h2><?php echo $title; ?></h2>

<?php echo validation_errors();?>

<?php echo form_open('news/create'); ?>

    <label for="title">Title</label>
    <input type="input" name="title" /><br>

    <label for="text">Text</label>
    <textarea name="text"></textarea><br>

    <input type="submit" name="submit" value="Create news item" />

</form>

در این کد فقط دو مورد وجود دارد که شاید ناشناخته به نظر آیند: فانکشن form_open() و فانکشن validation_errors().

فانکشن اول توسط هلپر form ارائه شده است و عناصر فرم را رندر می‌کند و قابلیت‌هایی مانند افزودن یه فیلد جلوگیری از CSRF به آن اضافه می‌کند. فانکشن دوم برای گزارش‌گیری از خطاهای مرتبط با اعتبارسنجی فرم استفاده می‌شود.

به کنترلر News برگردید. می‌خواهید دو مورد را در اینجا اضافه کنید، بررسی اینکه فرم سابمیت (Submit) شده و بررسی اینکه داده‌های سابمیت شده با قوانین اعتبارسنجی مچ بوده و تست ولیدیشن را با موفقیت پاس می‌کنند. برای این کار از لایبرری form validation استفاده خواهید کرد.

public function create()
{
    $this->load->helper('form');
    $this->load->library('form_validation');

    $data['title'] = 'Create a news item';

    $this->form_validation->set_rules('title', 'Title', 'required');
    $this->form_validation->set_rules('text', 'Text', 'required');

    if ($this->form_validation->run() === FALSE)
    {
        $this->load->view('templates/header', $data);
        $this->load->view('news/create');
        $this->load->view('templates/footer');

    }
    else
    {
        $this->news_model->set_news();
        $this->load->view('news/success');
    }
}

کد بالا قابلیت‌های زیادی را اضافه می‌کند. اولین خطوط، هلپر form و لایبرری validation را لود می‌کنند. پس از آن، قوانین مورد نظر برای اعتبارسنجی فرم تعیین می‌شوند. متد set_rules() سه آرگومنت می‌گیرد؛ نام فیلد input، نامی که در پیام‌های خطا استفاده می‌شود، و قانون. در این مورد فیلدهای عنوان و متن ضروری هستند.

همانطور که در بالا مشاهده کردید، کدایگنایتر لایبرری فرم ولیدیشن قدرتمندی دارد. (بزودی پست مربوط به این کتابخانه را ترجمه خواهیم کرد و لینک آن را در این قسمت قرار می‌دهیم.)

در ادامه کد بالا، یک شرط را می‌توانید ببینید که بررسی می‌کند که آیا اعتبارسنجی فرم با موفقیت انجام شده است یا خیر. اگر اعتبارسنجی با موفقیت انجام نشود، فرم نمایش داده خواهد شد، اما اگر داده‌های سابمیت شده با موفقیت قوانین اعتبارسنجی را پاس کنند، مدل فراخوانی می‌شود. پس از آن، یک ویو برای نمایش پیام موفقیت در انجام عملیات لود می‌شود. یک ویو در دایرکتوری application/views/news/success.php بسازید و یک پیام موفقیت در آن بنویسید.

مدل

تنها چیزی که باقی مانده، نوشتن یک متد است که داده‌ها را به دیتابیس وارد کند. از کلاس Query Builder برای وارد کردن اطلاعات و از لایبرری input برای دریافت داده‌های پست شده استفاده خواهید کرد. مدلی که قبلا ساخته‌اید را باز کنید و کد زیر را در آن وارد کنید:

public function set_news()
{
    $this->load->helper('url');

    $slug = url_title($this->input->post('title'), 'dash', TRUE);

    $data = array(
        'title' => $this->input->post('title'),
        'slug' => $slug,
        'text' => $this->input->post('text')
    );

    return $this->db->insert('news', $data);
}

این متد جدید آیتم‌های خبری را به دیتابیس وارد می‌کند. در خط سوم یک فانکشن جدید وجود دارد، url_title(). این فانکشن - ارائه شده توسط هلپر URL - کاراکترهای مخرب را حذف می‌کند، تمام فاصله‌ها را با دَش (-) جایگزین می‌کند و به کمک پارامتر سوم، همه کاراکترها را به شکل کوچک تبدیل می‌کند. خروجی این فانکشن یک اسلاگ عالی و مناسب برای استفاده در URLها است.

ادامه کار را با آماده‌سازی رکوردی شروع می‌کنیم که قرار است بعدا از طریق آرایه $data وارد دیتابیس شود. هر عنصر آرایه با یک ستون در تیبل news مرتبط است. احتمالا متوجه شده‌اید که متد جدیدی با نام post() در اینجا شده‌اید که متعلق به لایبرری input است. این متد دیتا را از فیلتری برای حذف داده‌های غیرمجاز می‌گذراند، و جلوی حملات مخرب دیگران را می‌گیرد. لایبرری input به صورت پیش‌فرض لود می‌شود. در نهایت، آرایه $data به دیتابیس وارد می‌شود.

مسیریابی

قبل از اینکه بتوانید شروع به اضافه کردن آیتم‌های خبری به اپلیکیشن کدایگنایتر خود کنید، باید قوانین مسیریابی جدید به فایل config/routes.php اضافه کنید. بررسی کنید که فایل شما شامل قوانین زیر باشد. خط اول که جدید است، باعث می‌شود کدایگنایتر به این URL به شکل یک آیتم خبری نگاه نکند، یعنی 'create' را یک اسلاگ از آیتم خبری در نظر نگیرد.

$route['news/create'] = 'news/create';
$route['news/(:any)'] = 'news/view/$1';
$route['news'] = 'news';
$route['(:any)'] = 'pages/view/$1';
$route['default_controller'] = 'pages/view';

حالا به وسیله مرورگر خود URLهای ایجاد شده در این بخش را تست کنید، برای مثال به انتهای مسیر دایرکتوری مربوط به کدایگنایتر در محیط توسعه لوکال کامپیوتر خود را index.php/news/create اضافه کنید. تبریک می‌گوییم، شما با موفقیت اولین اپلیکیشن خود را با کدایگنایتر ساختید! چند خبر اضافه کنید و صفحات مختلفی که ساخته‌اید را بازدید و بررسی کنید.