Nucleus(JP)フォーラム

NucleusCMS日本語版ユーザーのためのサポートフォーラムです。疑問が生じたらまずは記事検索をご利用ください。

ログインしていません。

#1 2016-12-15 23:46:34

ピヨピヨbird
メンバー
登録日: 2015-04-05
投稿: 78

[終了] アイテムの公開期限設定 暫定仕様2016

[380での実装中止] アイテムの公開期限設定
  item_rev の実装の妨げになるので 関連コミットのリバート プルリクエストしました。
  -------------------------------
アイテムの公開期限設定  暫定仕様

公開 [する/しない]の設定:チェックボックス
公開する場合、期限付きにするかの設定
  それぞれの期限は、チェックボックスのチェックで on/offで有効にできます
公開開始日時:公開を開始する日時を指定します。
公開終了日時:公開を終了する日時を指定します。

いままでは
・未来の日付で投稿する
・スケジュールプラグインにより、ドラフトに戻したり削除する
などの方法で、公開範囲に制限をかけることができました。

★変更による未対応プラグインへの影響がありますので
この機能は、v3.8から使えるようになる予定です。

★いままで通り 以下の影響を受けます
・ドラフトの状態で表示・非表示
・投稿日が未来の日付の時は表示しない

★データベーステーブル itemに列を追加しました。

`ipublic`    は廃止して   `istatus`  varchar(255)  NOT NULL default 'published', に変更 値は次の投稿を参照

  `ipublic_enable_term_start`  tinyint(2)   NOT NULL default '0',
  `ipublic_enable_term_end`    tinyint(2)   NOT NULL default '0',
  公開の期限を使用するかしないかです。 0の場合は、制限がかかりません。
  1の場合、それぞれ以下の日時の範囲で制限します
  `ipublic_term_start`   datetime     NOT NULL default '2000-01-01 00:00:00',
  `ipublic_term_end`     datetime     NOT NULL default '2099-01-01 00:00:00',

★ITEMクラスに関数を追加しました
訪問者用の公開表示クエリの既存のコードに下記のフィルターを結合することで表示の制限を行うことができます

ITEM::getShowQueryFilterForPublicFeature($table_alias="")
 戻り値: AND ~が返ってきます
ITEM::addShowQueryFilterForPublicFeature(&$query, $table_alias="")
 戻り値: ありません。 第1引数に AND ~ で条件が結合されます

★関数やテーブルの列名は、現時点での情報です

★その他
(1) 未対応プラグインは、この設定は反映されませんので、
   対応させるには、既存のwhere句に、表示用の条件式を追加してください。

既存のクエリ($query)のwhere句で以下の2行で条件式がANDで結合されます。

if ( method_exists( 'ITEM', 'addShowQueryFilterForPublicFeature' ))
    ITEM::addShowQueryFilterForPublicFeature($query);

$query = "SELECT * FROM ".sql_table("item")." as i WHERE i.idraft=0";
があるとすると
テーブルの別名を使って追加するには、
ITEM::addShowQueryFilterForPublicFeature($query, "i");
のように使います

・修正部分の検索のヒント
idraft
で検索して該当しそうな場所を探して修正します

(2) $manager->getItemの変更
$manager->getItem($itemid, 1, 1);

$manager->getItem($itemid, 1, 1, 0);
にすることで表示の対応ができます

・修正部分の検索のヒント
使用している場合は,正規表現
\$manager->getItem\s*\([^,]+,\s*1\s*,\s*1\s*\)
で検索すると引っかかります

(3) 期限がきたものを
  「自動で公開フラグをoffにしたい」「アイテムを移動したい」「消したい」
  などは、専用プラグインが出現するのを待ちましょう。

編集者 ピヨピヨbird (2016-12-26 18:09:23)

オフライン

#2 2016-12-16 21:54:01

yama
Administrator
登録日: 2005-07-07
投稿: 1,242
ウェブサイト

Re: [終了] アイテムの公開期限設定 暫定仕様2016

すみません、ちょっと考えてたことがあって。あとで変更となると大変だと思うので、今のうちにシェアします。

itemテーブルに「istatusフィールド」を追加することを考えてました。格納する値は以下のようなものです。どのアイテムも、以下の6つのうちのいずれかに当てはまる、且つ、いずれかひとつにしか当てはまらない、というイメージです。

published: 公開中
unpublished: 非公開
future: 予約投稿
deleted: 削除済み。正確には削除待ち。将来「ごみ箱を空にする」のような機能を実装した場合に使う
draft: 下書き(現在のidraftと同じ。実装するとしたらidraftのデータ移行が必要)
pending: 下書きと似ているが、複数メンバー間のやりとりを想定。承認ワークフロー機能実装時に用いる。

WordPressのpostsテーブルを参考にしています。WordPressはシンプルだけどなんでも詰め込める汎用的なDB設計という感じなので、そのへんはNucleusとはだいぶ違うので必然的にこんだけ目的を絞りました。でもWordPressと同様、あまり理屈っぽくならないよう、実用的・直感的にと考えてます。

> (3) 期限がきたものを
>  「自動で公開フラグをoffにしたい」「アイテムを移動したい」「消したい」

オフにする・削除するのは、リクエストのタイミングごとにistatusとipublic_enable_term_endを参照することでわりと簡単に実装できると思います。それだけならipublic_enable_term_startフィールドだけ見てもいいんですが、where istatus=future で絞って公開待ちリソースのリストを直感的に得たいこともあると思いますし、数十万ページくらいの大規模サイトでも扱いやすい気がします。

オフライン

#3 2016-12-16 22:36:39

ピヨピヨbird
メンバー
登録日: 2015-04-05
投稿: 78

Re: [終了] アイテムの公開期限設定 暫定仕様2016

yama さんの発言:

itemテーブルに「istatusフィールド」を追加することを考えてました。格納する値は以下のようなものです。どのアイテムも、以下の6つのうちのいずれかに当てはまる、且つ、いずれかひとつにしか当てはまらない、というイメージです。

ipublic は廃止して istatus フィールドに変更しますね

デフォルトなにがいいのかわかりませんけど、デフォルト値はリリース前に調整するとして
nucleus_item

`istatus`  varchar(255)  NOT NULL default 'published',

  INDEX `istatus` (`istatus`),

でいいですか?

v3.80公開すると修正が大変なことになるので
v3.80延期してもらって その辺の修正をかけたほうがいいですね。

編集者 ピヨピヨbird (2016-12-16 22:43:14)

オフライン

#4 2016-12-16 22:47:46

yama
Administrator
登録日: 2005-07-07
投稿: 1,242
ウェブサイト

Re: [終了] アイテムの公開期限設定 暫定仕様2016

ありがとうございます、それでよさそうに思います。
後ほど、全体的によく確認してみます

オフライン

#5 2016-12-17 15:47:36

ピヨピヨbird
メンバー
登録日: 2015-04-05
投稿: 78

Re: [終了] アイテムの公開期限設定 暫定仕様2016

列名の変更終わりました

オフライン

#6 2016-12-19 17:05:22

yama
Administrator
登録日: 2005-07-07
投稿: 1,242
ウェブサイト

Re: [終了] アイテムの公開期限設定 暫定仕様2016

370からアップデートしたところ、
istatus: Changing initial value to future ... mySQL error with query UPDATE `nucleus_item` SET `istatus`='future' WHERE itime>'\'2016-12-19 07:52:38\'': Incorrect datetime value: ''2016-12-19 07:52:38'' for column 'itime' at row 1
というエラーが出ました。同じように2回目を試したら、今度は大丈夫でしたが。

upgrade3.8.phpの

> if ($upgrade_istatus) {

の判定で

> // set to future
> $query = sprintf("UPDATE `%s` SET `istatus`='future' WHERE itime>%s", $table_item, sql_quote_string($date));

これが実行されるようですが、sql_quote_string($date)のところで、内側のエスケープ済みクオートが不要か、そもそもクオートで囲むこと自体が不要?かなと思ったのですが。ちょっとよく分からなかったので、こちらで報告です。

オフライン

#7 2016-12-19 23:36:17

ピヨピヨbird
メンバー
登録日: 2015-04-05
投稿: 78

Re: [終了] アイテムの公開期限設定 暫定仕様2016

sqldateでクオートされているので
sql_quote_string()はいらないですね。

オフライン

Board footer