CI4

[코드이그나이터] [첫번째 어플리케이션 제작(튜터리얼)] 뉴스 섹션

으누아빠 2020. 8. 31. 17:24
반응형

뉴스 섹션

출처:
http://ci4doc.cikorea.net/tutorial/news_section.html

뉴스섹션은 데이터 베이스를 연결하고 데이터 베이스에 등록된 내용을 출력하는 페이지

데이터 베이스 생성

여기서는 mysql을 default로 이용함

# 1. mysql에 사용자 계정 추가

GRANT ALL privileges ON DB명.* TO 계정명@localhost IDENTIFIED BY '비밀번호';

#2. 데이터 베이스 생성

create database ci4 default character set utf8;

#3. 테이블 생성

CREATE TABLE news (
    id int(11) NOT NULL AUTO_INCREMENT,
    title varchar(128) NOT NULL,
    slug varchar(128) NOT NULL,
    body text NOT NULL,
    PRIMARY KEY (id),
    KEY slug (slug)
);

#4. 시드 레토드 등록

INSERT INTO news VALUES
(1,'Elvis sighted','elvis-sighted','Elvis was sighted at the Podunk internet cafe. It looked like he was writing a CodeIgniter app.'),
(2,'Say it isn\'t so!','say-it-isnt-so','Scientists conclude that some programmers have a sense of humor.'),
(3,'Caffeination, Yes!','caffeination-yes','World\'s largest coffee shop open onsite nested coffee shop for staff only.');

데이터베이스에 연결

.env 파일이나 또는 app/Config/Database.php 파일을 수정하여 데이터베이스에 연결
여기서는 .env 파일을 수정하여 연결함

.env


#--------------------------------------------------------------------
# DATABASE
#--------------------------------------------------------------------

 database.default.hostname = localhost
 database.default.database = ci4
 database.default.username = 계정명
 database.default.password = 비밀번호
 database.default.DBDriver = MySQLi

model 설정

app/Models/NewsModel.php

<?php

namespace App\Models;

use CodeIgniter\Model;

class NewsModel extends Model
{
    protected $table = 'news';

    public function getNews($slug = false)
    {
        if ($slug === false) {
            //findAll() 모든 결과를 반환

            return $this->findAll();
        }

        // where($key[, $value = NULL[, $escape = NULL]]) 쿼리빌더 클래스
        // 쿼리의 WHERE 부분을 생성

        // Parameters:    
        //     $key (mixed) – 비교할 필드 이름 또는 연관 배열
        //     $value (mixed) – 단일 키인 경우 이 값과 비교
        //     $escape (bool) – 값과 식별자를 이스케이프할지 여부

        // Returns:BaseBuilder instance
        // Return type: object        

        //asArray() find*() 메소드의 데이터를 연관 배열로 리턴
        //first() 결과 집합의 첫 번째 행을 반환

        return $this->asArray()
            ->where(['slug' => $slug])
            ->first();
    }
}

protected $table = 'news'; 선언에 의하여 해당 모델의 기본 테이블은 news가 된다.

controller 설정

app/Controllers/News.php

<?php

namespace App\Controllers;

use App\Models\NewsModel;
use CodeIgniter\Controller;

class News extends Controller
{
    public function index()
    {
        $model = new NewsModel();

        $data = [
            'news'  => $model->getNews(),
            'title' => 'News archive',
        ];

        echo view('templates/header', $data);
        echo view('news/overview', $data);
        echo view('templates/footer', $data);
    }

    public function view($slug = null)
    {
        $model = new NewsModel();

        $data['news'] = $model->getNews($slug);

        if (empty($data['news'])) {
            throw new \CodeIgniter\Exceptions\PageNotFoundException('Cannot find the news item: ' . $slug);
        }

        $data['title'] = $data['news']['title'];

        echo view('templates/header', $data);
        echo view('news/view', $data);
        echo view('templates/footer', $data);
    }
}

view 설정

app/Views/news 디렉토리를 생성한후 overview.php 파일과 view.php 파일을 생성

app/Views/news/overview.php

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

<?php if (!empty($news) && is_array($news)) : ?>

    <?php foreach ($news as $news_item) : ?>

        <h3><?= esc($news_item['title']); ?></h3>

        <div class="main">
            <?= esc($news_item['body']); ?>
        </div>
        <p><a href="/news/<?= esc($news_item['slug'], 'url'); ?>">View article</a></p>

    <?php endforeach; ?>

<?php else : ?>

    <h3>No News</h3>

    <p>Unable to find any news for you.</p>

<?php endif ?>
app/Views/news/view.php

<h2><?= esc($news['title']); ?></h2>
<?= esc($news['body']); ?>

라우팅

app/Config/Routes.php 파일을 수정하여 라우팅설정을 한다.

/**
 * --------------------------------------------------------------------
 * Route Definitions
 * --------------------------------------------------------------------
 */

// We get a performance increase by specifying the default
// route since we don't have to scan directories.
$routes->get('/', 'Home::index');
$routes->get('news/(:segment)', 'News::view/$1');
$routes->get('news', 'News::index');
$routes->get('(:any)', 'Pages::view/$1');