備忘録的な @7wk

phpとjavascript系をメインに扱っていく予定。

簡易CMSを作る その1

RebornCMSはかなり期待したのに
残念な事になっているので
簡単なCMSを実装します。

まずはCRUDが利用できる状態にします。

記事テーブルの作成します。
表題と本文があればいいでしょう。
カテゴリIDはついでです。

CREATE TABLE IF NOT EXISTS `articles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `category_id` int(11) unsigned NOT NULL DEFAULT '0',
  `subject` varchar(24) NOT NULL,
  `body` text NOT NULL,
  `created_at` datetime NOT NULL DEFAULT  '0000-00-00 00:00:00',
  `modified_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `category_id` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


modelも作成します。
created_atとmodified_atは自動で更新されるようにしておきます。
が、今回は省略です。

model/article.php

<?php
namespace Model;

class Article extends \Orm\Model
{
}

controllerです。
今回はセキュリティやエラー処理やら使い勝手はパスです。
気が向いたら書きます。

controller/article.php

<?php

namespace Controller;

class Article extends \Controller\Base_Auth
{
	public function action_index()
	{
		$article = \Model\Article::forge();
		$list = $article->find('all');

		return \Response::forge(\View::forge('article/list.html', array('articles' => $list)));
	}

	public function action_edit($article_id = 0)
	{
		$article = \Model\Article::forge();
		$data = $article->find($article_id);

		return \Response::forge(\View::forge('article/edit.html', array('article' => $data)));
	}

	public function action_regist()
	{
		if (\Input::method() == 'POST') {
			$article = \Model\Article::forge();
			if (0 < (INT)\Input::post('id')) {
				$article = $article->find((INT)\Input::post('id'));
			}
			$article->subject = \Input::post('subject');
			$article->body = \Input::post('body');
			$article->save();
		}
		// とりあえずリストへ
		return \Response::redirect('article/index');
	}


}

viewも最低限です。
もちろんtwigを使っています。

article/list.html

{% extends "layout.html" %}

{% block content %}
	<table class="table table-bordered">
		<thead>
			<tr>
				<th></th>
				<th>ID</th>
				<th>Subject</th>
				<th>Body</th>
			</tr>
		</thead>
		<tbody>
			{% for article in articles %}
				<tr>
					<td><a href="{{ url("article/edit/#{ article.id }") }}">編集</a></td>
					<td>{{ article.id }}</td>
					<td>{{ article.subject }}</td>
					<td>{{ article.body }}</td>
				</tr>
			{% endfor %}
		</tbody>
	</table>
	<a href="{{ url("article/edit") }}">新規作成</a>
{% endblock %}

article/edit.html

{% extends "layout.html" %}

{% block content %}
	{{ form_open('article/regist') }}
		{{ form_hidden('id', article.id) }}
		<table class="table table-bordered">
			<thead>
			</thead>
			<tbody>
				<tr>
					<td>ID</td>
					<td>
						{{ article.id }}
					</td>
				</tr>
				<tr>
					<td>Subject</td>
					<td>{{ form_input('subject', article.subject) }}</td>
				</tr>
				<tr>
					<td>Body</td>
					<td>{{ form_textarea('body', article.body, {'rows':20, 'class':'xxlarge'}) }}</td>
				</tr>
			</tbody>
		</table>
	{{ form_button('submit', '登録', {'type':'submit','class':'btn btn-primary'}) }}
	{{ form_close }}
{% endblock %}


これでCRUDのD以外ができました。Dは省略。
今回はこれにて終了。

地震起きなくて良かった。