創(chuàng)建新聞項(xiàng)目?

你現(xiàn)在知道如何使用CodeIgniter從數(shù)據(jù)庫(kù)讀取數(shù)據(jù),但你尚未向數(shù)據(jù)庫(kù)寫入任何信息。在本節(jié)中,你將擴(kuò)展之前創(chuàng)建新的控制器和模型以包含此功能。

創(chuàng)建表格?

要將數(shù)據(jù)輸入數(shù)據(jù)庫(kù),你需要?jiǎng)?chuàng)建一個(gè)表格,你可以在其中輸入要存儲(chǔ)的信息。這意味著你將需要一個(gè)包含兩個(gè)字段的表格,一個(gè)用于標(biāo)題,另一個(gè)用于文本。你將從模型中的標(biāo)題中獲得slug。在*application / Views / news / create.php*創(chuàng)建新視圖

<h2><?= esc($title); ?></h2>

<?= \Config\Services::validation()->listErrors(); ?>

<?= 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>

這里只有兩個(gè)函數(shù)你可能不熟悉: form_open() 函數(shù)和 ConfigServices::validation()->listErrors() 函數(shù)。 第一個(gè)函數(shù)由 form helper 提供,并呈現(xiàn)表格元素并添加額外的功能,例如添加一個(gè)隱藏的 CSRF prevention field。后者用于報(bào)告與表格驗(yàn)證相關(guān)的錯(cuò)誤。

回到你的新聞控制器。你將在此處執(zhí)行兩項(xiàng)操作,檢查表格是否已提交以及提交的數(shù)據(jù)是否通過(guò)了驗(yàn)證規(guī)則。你將使用 form validation 庫(kù)來(lái)執(zhí)行此操作。

public function create()
{
    helper('form');
    $model = new NewsModel();

    if (! $this->validate($this->request, [
        'title' => 'required|min[3]|max[255]',
        'text'  => 'required'
    ]))
    {
        echo view('templates/header', ['title' => 'Create a news item']);
        echo view('news/create');
        echo view('templates/footer');

    }
    else
    {
        $model->save([
            'title' => $this->request->getVar('title'),
            'slug'  => url_title($this->request->getVar('title')),
            'text'  => $this->request->getVar('text'),
        ]);
        echo view('news/success');
    }
}

上面的代碼添加了很多功能。前幾行加載表格helper和NewsModel。之后,Controller提供的輔助函數(shù)用于驗(yàn)證$_POST字段。在這種情況下,標(biāo)題和文本字段是必需的。

如上所示,CodeIgniter具有強(qiáng)大的驗(yàn)證庫(kù)。你可以閱讀:doc:more about this library here <../libraries/validation>

接下來(lái),你可以看到檢查表格驗(yàn)證是否成功運(yùn)行的條件。如果沒(méi)有,則顯示表格,如果提交并傳遞了所有規(guī)則,則調(diào)用模型。這將負(fù)責(zé)將新聞項(xiàng)傳遞到模型中。這包含一個(gè)新函數(shù)url_title()。這個(gè)函數(shù)由 URL helper 提供,它將你傳遞的字符串剝離出來(lái),用短劃線(-)替換所有空格,并確保所有內(nèi)容都是小寫字符。這給你留下了一個(gè)漂亮的slug,非常適合創(chuàng)建URI。

在此之后,加載視圖以顯示成功消息。在 application/Views/news/success.php 創(chuàng)建一個(gè)視圖 并寫一條成功消息。

模型?

最適合剩下的就是確保你的模型設(shè)置為允許正確保存數(shù)據(jù)。使用的``save()``方法將根據(jù)主鍵的存在來(lái)確定是否應(yīng)插入信息,或者行是否已存在且應(yīng)更新。在這種情況下,沒(méi)有``id``傳遞給它的字段,所以它會(huì)在它的表中插入一個(gè)新行,即**news**。

但是,默認(rèn)情況下,模型中的插入和更新方法實(shí)際上不會(huì)保存任何數(shù)據(jù),因?yàn)樗恢滥男┳侄慰梢园踩?。編輯模型以在``$allowedFields``屬性中為其提供可更新字段的列表。

<?php
class NewsModel extends \CodeIgniter\Model
{
    protected $table = 'news';

    protected $allowedFields = ['title', 'slug', 'text'];
}

此新屬性現(xiàn)在包含我們?cè)试S保存到數(shù)據(jù)庫(kù)的字段。請(qǐng)注意,我們遺漏了``id``?那是因?yàn)槟銕缀醪恍枰@樣做,因?yàn)樗菙?shù)據(jù)庫(kù)中的自動(dòng)遞增字段。這有助于防止批量分配漏洞。如果你的模型正在處理你的時(shí)間戳,你也可以將其保留。

路由?

在開始將新聞項(xiàng)添加到CodeIgniter應(yīng)用程序之前,必須向*Config/Routes.php*文件添加額外的規(guī)則。確保你的文件包含以下內(nèi)容。這可以確保CodeIgniter將’create’視為一種方法,而不是新聞項(xiàng)目的slug。

$routes->post('news/create', 'News::create');
$routes->add('news/(:segment)', 'News::view/$1');
$routes->get('news', 'News::index');
$routes->add('(:any)', 'Pages::view/$1');

現(xiàn)在將瀏覽器指向安裝CodeIgniter的本地開發(fā)環(huán)境,并將index.php/news/create添加到URL。恭喜,你剛剛創(chuàng)建了第一個(gè)CodeIgniter應(yīng)用程序!添加一些新聞并查看你制作的不同頁(yè)面。