ページ: 1
[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)
オフライン
すみません、ちょっと考えてたことがあって。あとで変更となると大変だと思うので、今のうちにシェアします。
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 で絞って公開待ちリソースのリストを直感的に得たいこともあると思いますし、数十万ページくらいの大規模サイトでも扱いやすい気がします。
オフライン
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)
オフライン
ありがとうございます、それでよさそうに思います。
後ほど、全体的によく確認してみます
オフライン
列名の変更終わりました
オフライン
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)のところで、内側のエスケープ済みクオートが不要か、そもそもクオートで囲むこと自体が不要?かなと思ったのですが。ちょっとよく分からなかったので、こちらで報告です。
オフライン
sqldateでクオートされているので
sql_quote_string()はいらないですね。
オフライン
ページ: 1