zowのプログラムな日々

日々のプログラミングとか

書き直し終わり(暫定)

とりあえず書きなおしてみた。ただ、あまり以前と変わらない気がしないでもない・・・。

テーブル

CREATE TABLE site (
  `name` TEXT UNIQUE,
  `label` TEXT,
  `title` TEXT, -- サイト タイトル
  `url` TEXT, -- サイトURL
  `dev_url` TEXT, -- 開発環境URL
  `category_filename_prefix` TEXT DEFAULT 'category_', -- Categoryファイル名接頭語
  `category_filename_suffix` TEXT DEFAULT '', -- Categoryファイル名接尾語
  `tag_filename_prefix` TEXT DEFAULT 'tag_', -- Tagファイル名接頭語
  `tag_filename_suffix` TEXT DEFAULT '', -- Tagファイル名接尾語
  `page_filename_prefix` TEXT DEFAULT '', -- Pageファイル名接頭語
  `page_filename_suffix` TEXT DEFAULT '', -- Pageファイル名接尾語
  `added_at` TEXT DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE pages (
  `page_id` INTEGER PRIMARY KEY AUTOINCREMENT,
  `name` TEXT UNIQUE, -- ページ名(識別用)
  `filename` TEXT, -- 自動生成 生成するファイル名(name + html もしくはindex.html)
  `pathname` TEXT UNIQUE, -- 自動生成 パス(filename OR page_group.dirname +filename)
  `url` TEXT UNIQUE, -- 自動生成 フルURL(site.url + pathname)
  `label` TEXT, -- このページへリンクする場合のアンカーテキスト
  `title` TEXT, -- ページタイトル
  `disabled` INTEGER DEFAULT 0, -- 1でdisabled
  `description` TEXT, -- Description記述
  `template` TEXT, -- ページに適用するテンプレート名記述
  `type` TEXT, -- index(TOP)/page/category/tag/page_groupの5つ
  `type_id` TEXT, -- typeに対応するID(pageとindexは無し)
  `page_group_id` INTEGER, -- 所属page_group_id記述(page)
  `category` TEXT, -- カンマ区切りでカテゴリID記述(page)
  `tags` TEXT, -- カンマ区切りでタグID記述(page)
  `place_holder_1` TEXT, -- 予約:ヘッダ上(header_top)
  `place_holder_2` TEXT, -- 予約:ヘッダコンテンツ(header_main)
  `place_holder_3` TEXT, -- 予約:ヘッダ下(header_bottom)
  `place_holder_4` TEXT, -- 予約:メインコンテンツ(XX_main)
  `place_holder_5` TEXT, -- 予約:サイドコンテンツ(side1)
  `place_holder_6` TEXT, -- 予約:サイドコンテンツ2(side2)
  `place_holder_7` TEXT, -- 予約:フッタコンテンツ(footer)
  `place_holder_8` TEXT, -- 任意
  `place_holder_9` TEXT, -- 任意
  `place_holder_10` TEXT, -- 任意
  `place_holder_11` TEXT, -- 任意
  `place_holder_12` TEXT, -- 任意
  `place_holder_13` TEXT, -- 任意
  `place_holder_14` TEXT, -- 任意
  `place_holder_15` TEXT, -- 任意
  `place_holder_16` TEXT, -- 任意
  `place_holder_17` TEXT, -- 任意
  `place_holder_18` TEXT, -- 任意
  `place_holder_19` TEXT, -- 任意
  `place_holder_20` TEXT, -- 任意
  `added_at` TEXT DEFAULT CURRENT_TIMESTAMP
);

CREATE VIEW enable_pages AS SELECT * FROM pages WHERE `disabled` = 0;


CREATE TABLE page_group (
  `page_group_id` INTEGER PRIMARY KEY AUTOINCREMENT,
  `name` TEXT UNIQUE, --ページグループ名(識別用)
  `dirname` TEXT UNIQUE, --ページグループ ディレクトリ名
  `label` TEXT, --ページグループ表示名
  `disabled` INTEGER DEFAULT 0, -- 1 でdisabled
  `added_at` TEXT DEFAULT CURRENT_TIMESTAMP
);

CREATE VIEW enable_page_group AS SELECT * FROM page_group WHERE `disabled` = 0;


CREATE TABLE category (
  `category_id` INTEGER PRIMARY KEY AUTOINCREMENT,
  `name` TEXT UNIQUE, --カテゴリ名(識別用)
  `label` TEXT, --表示名
  `disabled` INTEGER DEFAULT 0, -- 1 でdisabled
  `added_at` TEXT DEFAULT CURRENT_TIMESTAMP
);

CREATE VIEW enable_category AS SELECT * FROM category WHERE `disabled` = 0;


CREATE TABLE tags (
  `tag_id` INTEGER PRIMARY KEY AUTOINCREMENT,
  `name` TEXT UNIQUE, --カテゴリ名(識別用)
  `label` TEXT, --表示名
  `disabled` INTEGER DEFAULT 0, -- 1 でdisabled
  `added_at` TEXT DEFAULT CURRENT_TIMESTAMP
);

CREATE VIEW enable_tags AS SELECT * FROM tags WHERE `disabled` = 0;


CREATE TABLE ext_link (
  `ext_link_id` INTEGER PRIMARY KEY AUTOINCREMENT,
  `name` TEXT UNIQUE,
  `label` TEXT,
  `disabled` INTEGER DEFAULT 0,
  `url` TEXT,
  `added_at` TEXT DEFAULT CURRENT_TIMESTAMP
);

CREATE VIEW enable_ext_link AS SELECT * FROM ext_link WHERE `disabled` = 0;


CREATE TABLE contents (
  `contents_id` INTEGER PRIMARY KEY AUTOINCREMENT,
  `name` TEXT UNIQUE, --コンテンツ名(識別用)
  `label` TEXT, --コンテンツ表示名
  `disabled` INT DEFAULT 0, -- 1 でdisabled
  `type` TEXT, -- コンテンツの種類を記述(menu等)
  `template` TEXT, -- コンテンツ表示テンプレート
  `data` TEXT, -- content_typeによってdataの扱いを変える。menuの場合はmenuawwqs_items_id列記等
  `added_at` TEXT DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TEXT
);

CREATE TABLE contents_group (
  `contents_group_id` INTEGER PRIMARY KEY AUTOINCREMENT,
  `name` TEXT UNIQUE, --コンテンツグループ名(識別用)
  `label` TEXT, --コンテンツグループ表示名
  `contents_ids` TEXT, --所属するコンテンツ(カンマ区切りでcontents_idを表示順に列記)
  `added_at` TEXT DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TEXT
);

CREATE TABLE menu_items (
  `menu_item_id` INTEGER PRIMARY KEY AUTOINCREMENT,
  `menu_item_name` TEXT, -- メニュー項目名(識別用)
  `menu_item_label` TEXT, -- メニュー表示名
  `menu_item_disabled` INTEGER DEFAULT 0, -- 1 でdisabled
  `menu_item_type` TEXT, -- 種別判別(index/page/tag/category/page_group/ext_link)
  `menu_item_type_id` INTEGER, -- page_id(index/page/tag/category/page_group) or ext_link_id
  `menu_item_link_to` TEXT, -- リンク先
  `menu_item_link_nofollow_flg` INTEGER DEFAULT 0, -- 1 でnofollow
  `added_at` TEXT DEFAULT CURRENT_TIMESTAMP
);

CREATE VIEW enable_menu_items AS SELECT * FROM menu_items WHERE `menu_item_disabled` = 0;

tags,category,page_groupの3つのテーブルは、それぞれのワードを定義するテーブルになっている。

そしてpagesに全てのページが登録されるようになっている。tags,category,page_groupの3つのページの一覧ページもpagesに登録される。その為、pagesにtypeとtype_idというフィールドを作った。このフィールドの値で、各テーブルと関連付ける様になっている。

siteテーブルはサイト全般の情報が格納されている。contentsとcontents_groupはそれぞれコンテンツを定義しているテーブルになる。新たに追加されたext_linkは外部リンクを登録するテーブルになっている。

ext_linkとpagesに登録されているレコードは同時にmenu_itemsに登録されるようになっている。メニューを作る際には、このmenu_itemsのレコードを参照して作る感じだ。

それぞれ各テーブル間で関連付けがあるんだけども、そこら辺を全部トリガで実装している。例えば、categoryにカテゴリ名を登録すると、自動でpagesにカテゴリ一覧ページが登録され、その情報を元にmenu_itemsにもカテゴリ一覧ページが登録されるようになっている。categoryテーブルのレコードのdisabledにフラグを立てると、同様にpagesとmenu_itemsにも立つようになっている。

トリガ

site

CREATE TRIGGER tri_site_add AFTER INSERT ON site
BEGIN

  INSERT INTO pages (
    `type`,
    `name`,
    `label`,
    `title`
  ) VALUES (
    'index',
    new.`name`,
    new.`label`,
    new.`label`
  );

END;


CREATE TRIGGER tri_site_url_update AFTER UPDATE OF url ON site
BEGIN

  -- URL変更
  UPDATE pages
  SET `url` = REPLACE(`url`, old.`url`, new.`url`)
  WHERE `page_id` IS NOT NULL;

END;

siteテーブルに関連するトリガは2つ。insert時に同時にpagesへindex.htmlを登録するのと、urlを変更した際にpagesのurlを変更する処理だ。本当はdev_urlに開発用のurlの定義をしようと思ってるので、そのトリガも書いておきたいところだけども、まだその段階じゃないので書いてない。実際にpythonスクリプトの方の実装が始まってから書こうと思う。

pages

----------------------------
-- page追加処理(デフォルト) --
----------------------------

CREATE TRIGGER tri_pages_add AFTER INSERT ON pages
BEGIN

-- プレースホルダ設定
  UPDATE pages
  SET
    `place_holder_1` = 'header_top',
    `place_holder_2` = 'header_main',
    `place_holder_3` = 'header_bottom',
    `place_holder_5` = 'side1',
    `place_holder_6` = 'side2',
    `place_holder_7` = 'footer'
  WHERE ROWID = new.ROWID;

  INSERT OR IGNORE INTO contents_group (
    `name`,
    `label`
  ) VALUES
    ('header_top', 'header_top'),
    ('header_main', 'header_main'),
    ('header_bottom', 'header_bottom'),
    ('side1', 'side1'),
    ('side2', 'side2'),
    ('footer', 'footer');

-- menu items 登録
  INSERT INTO menu_items (
    `menu_item_type`,
    `menu_item_type_id`,
    `menu_item_name`,
    `menu_item_label`
  ) SELECT
      `type`,
      `page_id`,
      `name`,
      `label`
    FROM pages
    WHERE ROWID = new.ROWID;

END;

------------------------
-- index page追加時処理 --
------------------------

CREATE TRIGGER tri_pages_index_page_add AFTER INSERT ON pages
  WHEN new.`type` = 'index'
BEGIN

-- ファイル名生成
  UPDATE pages
  SET `filename` = 'index.html'
  WHERE ROWID = new.ROWID;

-- プレースホルダ設定
  UPDATE pages
  SET `place_holder_4` = 'index_main'
  WHERE ROWID = new.ROWID;

  INSERT OR IGNORE INTO contents_group (
    `name`,
    `label`
  ) VALUES (
    'index_main',
    'index_main'
  );

END;

-- page削除処理

CREATE TRIGGER tri_pages_delete AFTER DELETE ON pages
BEGIN

  DELETE FROM menu_items
  WHERE `menu_item_type`  IN ('index', 'page', 'category', 'tag', 'page_group')
  AND `menu_item_type_id` = old.`page_id`;

END;

------------------
-- page追加時処理 --
------------------

CREATE TRIGGER tri_pages_page_add AFTER INSERT ON pages
  WHEN new.`type` = 'page'
BEGIN

-- ファイル名生成
  UPDATE pages
  SET `filename` =
      (SELECT `page_filename_prefix` FROM site) ||
      new.`name` ||
      (SELECT `page_filename_suffix` FROM site) ||
      '.html'
  WHERE ROWID = new.ROWID;

-- プレースホルダ設定
  UPDATE pages
  SET `place_holder_4` = 'page_' || new.`name` || '_main'
  WHERE ROWID = new.ROWID;

  INSERT OR IGNORE INTO contents_group (
    `name`,
    `label`
  ) VALUES (
    'page_' || new.`name` || '_main',
    'page_' || new.`name` || '_main'
  );

END;

----------------------------
-- category page 追加時処理 --
----------------------------

CREATE TRIGGER tri_pages_category_page_add AFTER INSERT ON pages
  WHEN new.`type` = 'category'
BEGIN

-- ファイル名生成
  UPDATE pages
  SET `filename` =
    (SELECT `category_filename_prefix` FROM site) ||
    new.`name` ||
    (SELECT `category_filename_suffix` FROM site) ||
    '.html'
  WHERE ROWID = new.ROWID;

-- プレースホルダ設定
  UPDATE pages
  SET `place_holder_4` = 'category_' || new.`name` || '_main'
  WHERE ROWID = new.ROWID;

  INSERT OR IGNORE INTO contents_group (
    `name`,
    `label`
  ) VALUES (
    'category_' || new.`name` || '_main',
    'category_' || new.`name` || '_main'
  );

END;

-----------------------
-- tag page 追加時処理 --
-----------------------

CREATE TRIGGER tri_pages_tag_page_add AFTER INSERT ON pages
  WHEN new.`type` = 'tag'
BEGIN

-- ファイル名生成
  UPDATE pages
  SET `filename` =
    (SELECT `tag_filename_prefix` FROM site) ||
    new.`name` ||
    (SELECT `tag_filename_suffix` FROM site) ||
    '.html'
  WHERE ROWID = new.ROWID;

-- プレースホルダ設定
  UPDATE pages
  SET `place_holder_4` = 'tag_' || new.`name` || '_main'
  WHERE ROWID = new.ROWID;

  INSERT OR IGNORE INTO contents_group (
    `name`,
    `label`
  ) VALUES (
    'tag_' || new.`name` || '_main',
    'tag_' || new.`name` || '_main'
  );

END;

------------------------------
-- page group page 追加時処理 --
------------------------------

CREATE TRIGGER tri_pages_page_group_page_add AFTER INSERT ON pages
  WHEN new.`type` = 'page_group'
BEGIN

-- ファイル名生成
  UPDATE pages
  SET `filename` = 'index.html'
  WHERE ROWID = new.ROWID;

-- プレースホルダ設定
  UPDATE pages
  SET `place_holder_4` = 'page_group_' || new.`name` || '_main'
  WHERE ROWID = new.ROWID;

  INSERT OR IGNORE INTO contents_group (
    `name`,
    `label`
  ) VALUES (
    'page_group_' || new.`name` || '_main',
    'page_group_' || new.`name` || '_main'
  );

END;

---------------------------------------------------
-- index/page/category/tagページ filename変更時処理 --
---------------------------------------------------
CREATE TRIGGER tri_pages_filename_update AFTER UPDATE OF `filename` ON pages
  WHEN new.`type` = 'index'
  OR new.`type` = 'category'
  OR new.`type` = 'tag'
  OR (new.`type` = 'page' AND new.`page_group_id` IS NULL)
BEGIN

-- パス名変更(ファイル名のみ)
  UPDATE pages
  SET `pathname` = new.`filename`
  WHERE ROWID = new.ROWID;

END;

------------------------------------------
-- page group 所属ページ filename変更時処理 --
------------------------------------------

CREATE TRIGGER tri_pages_pgs_filename_update AFTER UPDATE OF `filename` ON pages
  WHEN new.`page_group_id` IS NOT NULL
BEGIN

-- パス名変更(page_group.dirname + filename)
  UPDATE pages
  SET `pathname` = (
    SELECT `dirname`
    FROM page_group
    WHERE `page_group_id` = new.`page_group_id`
  ) ||
  '/' ||
  new.`filename`
  WHERE ROWID = new.ROWID;

END;


-------------------
-- パス名変更時処理 --
-------------------

CREATE TRIGGER tri_pages_pathname_update AFTER UPDATE OF `pathname` ON pages
BEGIN

-- URL変更
  UPDATE pages
  SET `url` = (SELECT url FROM site) || '/' || new.`pathname`
  WHERE ROWID = new.ROWID;

END;

-----------------
-- url変更時処理 --
-----------------

CREATE TRIGGER tri_pages_url_update AFTER UPDATE OF `url` ON pages
BEGIN
  -- menu items 変更
  UPDATE menu_items
  SET `menu_item_link_to` = new.`url`
  WHERE `menu_item_type` IN ('index', 'page', 'category', 'tag', 'page_group')
  AND`menu_item_type_id` = new.`page_id`;

END;

-----------------
-- disabled処理 --
-----------------

CREATE TRIGGER tri_pages_disabled AFTER UPDATE OF `disabled` ON pages
  WHEN new.`disabled` = 1
BEGIN

  UPDATE menu_items
  SET `menu_item_disabled` = 1
  WHERE `menu_item_type_id` = new.`page_id`;

END;

----------------
-- enabled処理 --
----------------

CREATE TRIGGER tri_pages_enabled AFTER UPDATE OF `disabled` ON pages
  WHEN new.`disabled` = 0
BEGIN

  UPDATE menu_items
  SET `menu_item_disabled` = 0
  WHERE `menu_item_type_id` = new.`page_id`;

END;

pagesに関するトリガが一番複雑になっている。上から順に説明していく。

  • tri_pages_add : レコード追加時の処理。プレースホルダにデフォルト値を設定しているのと、menu_items へのレコード登録を行っている。

  • tri_pages_index_page_add : indexページ(トップページ)追加処理。ファイル名の登録とプレースホルダの設定を行っている。

  • tri_pages_delete : ページ削除時の処理。menu_itemsからの削除を行っている。

  • tri_pages_page_add : page(普通のhtmlページ)の追加処理。ファイル名の登録とプレースホルダの設定を行っている。

  • tri_pages_category_page_add : category一覧ページの追加処理。ファイル名の登録とプレースホルダの設定を行っている。

  • tri_pages_tag_page_add : tag一覧ページの追加処理。ファイル名の登録とプレースホルダの設定を行っている。

  • tri_pages_page_group_page_add : page_group一覧ページの追加処理。ファイル名の登録とプレースホルダの設定を行っている。

  • tri_pages_filename_update : index/page/category/tagページのfilename変更時処理。page_group所属以外のページのfilename変更時処理。pathnameにファイル名を割り当てている(要するにルート直下に配置される)。

  • tri_pages_pgs_filename_update : page_group所属ページのfilename変更時処理。pathnameにpage_group.dirname/filenameを割り当てている。

  • tri_pages_pathname_update : pathname変更時処理。pathnameが変更された場合、site.urlと結合してフルURLを生成している。

  • tri_pages_url_update : URL変更時処理。URLが変更されたらmenu_itemsの該当urlを変更している。

  • tri_pages_disabled : disabled処理。pagesでdisabledされたらmenu_itemsの該当レコードをdisabledにする。

  • tri_pages_enabled : enabled処理。pagesでenabledされたらmenu_itemsの該当レコードをenabledにする。

page_group

CREATE TRIGGER tri_page_group_add AFTER INSERT ON page_group
BEGIN

  INSERT INTO pages (
    `type`,
    `type_id`,
    `page_group_id`,
    `name`,
    `label`,
    `title`
  ) VALUES (
    'page_group',
    new.`page_group_id`,
    new.`page_group_id`,
    new.`name`,
    new.`label`,
    new.`label` || 'の一覧'
  );

END;

CREATE TRIGGER tri_page_group_update_dirname AFTER UPDATE OF `dirname` ON page_group
BEGIN

  UPDATE pages
  SET `pathname` = REPLACE(`pathname`, old.`dirname`, new.`dirname`)
  WHERE `page_group_id` = new.`page_group_id`;

END;

CREATE TRIGGER tri_page_group_delete AFTER DELETE ON page_group
BEGIN

  DELETE FROM pages WHERE `type` = 'page_group' AND `type_id` = old.`page_group_id`;

  UPDATE pages
  SET
    `page_group_id` = NULL,
    `pathname` = REPLACE(`pathname` , old.`dirname` || '/' , '')
  WHERE `page_group_id` = old.`page_group_id`;

END;


-----------------
-- disabled処理 --
-----------------

CREATE TRIGGER tri_page_group_disabled AFTER UPDATE OF `disabled` ON page_group
  WHEN new.`disabled` = 1
BEGIN

  UPDATE pages
  SET `disabled` = 1
  WHERE `page_group_id` = new.`page_group_id`;

END;

----------------
-- enabled処理 --
----------------

CREATE TRIGGER tri_page_group_enabled AFTER UPDATE OF `disabled` ON page_group
  WHEN new.`disabled` = 0
BEGIN

  UPDATE pages
  SET `disabled` = 0
  WHERE `page_group_id` = new.`page_group_id`;

END;
  • tri_page_group_add : page_groupへのレコード追加時処理。pagesへpage_group一覧ページを登録している。

  • tri_page_group_update_dirname : dirname変更時処理。dirnameが変更されたらpagesにあるpage_group所属ページのpathnameを変更する。

  • tri_page_group_delete : page_groupのレコード削除時処理。pagesにあるpage_group一覧ページの削除と、page_group所属ページのpage_group_id削除とpathnameからのdirname除去を行う。

  • tri_page_group_disabled : disabled処理。page_groupでdisabledされたらpagesの該当レコードをdisabledにする。

  • tri_page_group_enabled : enabled処理。page_groupでenabledされたらpagesの該当レコードをenabledにする。

category

CREATE TRIGGER tri_category_add AFTER INSERT ON category
BEGIN

  INSERT INTO pages (
    `type`,
    `type_id`,
    `name`,
    `label`,
    `title`
  ) VALUES (
    'category',
    new.`category_id`,
    new.`name`,
    new.`label`,
    new.`label` || 'の一覧'
  );

END;

CREATE TRIGGER tri_category_delete AFTER DELETE ON category
BEGIN

  DELETE FROM pages WHERE `type` = 'category' AND `type_id` = old.`category_id`;

END;

-----------------
-- disabled処理 --
-----------------

CREATE TRIGGER tri_category_disabled AFTER UPDATE OF `disabled` ON category
  WHEN new.`disabled` = 1
BEGIN

  UPDATE pages
  SET `disabled` = 1
  WHERE `type` = 'category' AND `type_id` = new.`category_id`;

END;

----------------
-- enabled処理 --
----------------

CREATE TRIGGER tri_category_enabled AFTER UPDATE OF `disabled` ON category
  WHEN new.`disabled` = 0
BEGIN

  UPDATE pages
  SET `disabled` = 0
  WHERE `type` = 'category' AND `type_id` = new.`category_id`;

END;
  • tri_category_add : categoryへのレコード追加時処理。pagesへカテゴリ一覧ページを追加している。

  • tri_category_delete : categoryのレコード削除時処理。pagesにあるカテゴリ一覧ページを削除している。

  • tri_category_disabled : disabled処理。categoryでdisabledされたらpagesの該当レコードをdisabledにする。

  • tri_category_enabled : enabled処理。categoryでenabledされたらpagesの該当レコードをenabledにする。

tags

CREATE TRIGGER tri_tags_add AFTER INSERT ON tags
BEGIN

  INSERT INTO pages (
    `type`,
    `type_id`,
    `name`,
    `label`,
    `title`
  ) VALUES (
    'tag',
    new.`tag_id`,
    new.`name`,
    new.`label`,
    new.`label` || 'の一覧'
  );

END;

CREATE TRIGGER tri_tag_delete AFTER DELETE ON tags
BEGIN

  DELETE FROM pages WHERE `type` = 'tag' AND `type_id` = old.`tag_id`;

END;



-----------------
-- disabled処理 --
-----------------

CREATE TRIGGER tri_tags_disabled AFTER UPDATE OF `disabled` ON tags
  WHEN new.`disabled` = 1
BEGIN

  UPDATE pages
  SET `disabled` = 1
  WHERE `type` = 'tag' AND `type_id` = new.`tag_id`;

END;

----------------
-- enabled処理 --
----------------

CREATE TRIGGER tri_tag_enabled AFTER UPDATE OF `disabled` ON tags
  WHEN new.`disabled` = 0
BEGIN

  UPDATE pages
  SET `disabled` = 0
  WHERE `type` = 'tag' AND `type_id` = new.`tag_id`;

END;
  • tri_tags_add : tagsへのレコード追加時処理。pagesへタグ一覧ページを追加している。

  • tri_tag_delete : tagsのレコード削除時処理。pagesにあるタグ一覧ページを削除している。

  • tri_tags_disabled : disabled処理。tagsでdisabledされたらpagesの該当レコードをdisabledにする。

  • tri_tag_enabled : enabled処理。tagsでenabledされたらpagesの該当レコードをenabledにする。

ext_link

CREATE TRIGGER tri_ext_link_add AFTER INSERT ON ext_link
BEGIN

-- menu items 登録
  INSERT INTO menu_items (
    `menu_item_type`,
    `menu_item_type_id`,
    `menu_item_name`,
    `menu_item_label`,
    `menu_item_link_to`
  ) SELECT
      'ext_link',
      `ext_link_id`,
      `name`,
      `label`,
      `url`
    FROM ext_link
    WHERE ROWID = new.ROWID;

END;

CREATE TRIGGER tri_ext_link_delete AFTER DELETE ON ext_link
BEGIN

  DELETE FROM menu_items
  WHERE `menu_item_type` = 'ext_link'
  AND `menu_item_type_id` = old.`ext_link_id`;

END;



-----------------
-- disabled処理 --
-----------------

CREATE TRIGGER tri_ext_link_disabled AFTER UPDATE OF `disabled` ON ext_link
  WHEN new.`disabled` = 1
BEGIN

  UPDATE menu_items
  SET `menu_item_disabled` = 1
  WHERE `menu_item_type` = 'ext_link' AND `menu_item_type_id` = new.`ext_link_id`;

END;

----------------
-- enabled処理 --
----------------

CREATE TRIGGER tri_ext_link_enabled AFTER UPDATE OF `disabled` ON ext_link
  WHEN new.`disabled` = 0
BEGIN

  UPDATE menu_items
  SET `menu_item_disabled` = 0
  WHERE `menu_item_type` = 'ext_link' AND `menu_item_type_id` = new.`ext_link_id`;

END;

  • tri_ext_link_add : ext_linkへのレコード追加時処理。menu_itemsへ追加している。

  • tri_ext_link_delete : ext_linkのレコード削除時処理。menu_itemsから該当レコードを削除している。

  • tri_ext_link_disabled : disabled処理。ext_linkでdisabledされたらmenu_itemsの該当レコードをdisabledにする。

  • tri_ext_link_enabled : enabled処理。ext_linkでenabledされたらmenu_itemsの該当レコードをenabledにする。

contents

CREATE TRIGGER tri_contents_update AFTER UPDATE ON contents
BEGIN

  UPDATE contents
  SET `updated_at` = CURRENT_TIMESTAMP
  WHERE `contents_id` = new.'contents_id';

  UPDATE contents_group
  SET `updated_at` = CURRENT_TIMESTAMP
  WHERE (',' ||`contents_ids`||',') LIKE '%,' ||new.`contents_id` ||',%';

END;
  • tri_contents_update : contentsアップデート時処理。contentsがアップデートされたら該当レコードと該当レコード所属contents_groupのupdated_atを更新する。

contents_group

今のところ無し

menu_items

CREATE TRIGGER tri_menu_items_add AFTER INSERT ON menu_items
  WHEN new.`menu_item_type` IN ('index', 'page', 'page_group', 'category', 'tag')
BEGIN

  UPDATE menu_items
  SET `menu_item_link_to` = (SELECT `url` FROM pages WHERE `page_id` = new.`menu_item_type_id`)
  WHERE ROWID = new.ROWID;

END;
  • tri_menu_items_add : menu_items追加時処理。typeがext_link以外のレコードが追加された場合、pagesからurlを取得する。

まとめ

暫定的だが、とりあえず出来上がった。あとは作りこんでいくうちに追加されていくかもしれない。

現状で想定通りの動作はしてくれているのだけど、contentsとcontents_group辺りはまだこの先実装していく部分なのでほとんど書いてない。が、まずはサイトを構成できるのが前提なので、ベースとなる部分としてはこれでいいのではないかと思ってる。

一番面倒だったのはfilename→pathname→url→menu_itemsへの連携で、それぞれ独自に動くようにすることで一応連携されて変更してくれている。site.url変更時とpage_group.dirname変更時の一括変換とかはかなり悩んだが、今のところは問題なく動作するみたいだ。

小・中規模サイトを念頭に置いて作っているのもあって、シンプルだとは思うけど、これぐらいで必要十分だと思う。ここからもうちょい作りこんでいくことになるけども、あまり複雑だったり高機能だったりになりすぎないでシンプルさを追求していこうかなーって考えてる。