佐藤さんにお願いして作っていただきました。
特定アイテムを固定表示するプラグインというとNP_StickyItが有名ですが、現在配布されてません。
代替案としてNP_MultiBlogsやNP_MultiTagsを利用する方法がありますが、固定表示のために
使うには<%MultiBlogs(default,xxx,fixall,all,1)%>と書く必要があり、やや冗長です。
めったに使わない固定表示のためにパラメータを思い出すのも億劫なので、提案してみました。
<%ShowItem(template,55)%> ※アイテム55番を固定表示
これだけです。
アイテムをパーツに見立ててヘッダやナビゲーションとするような妙な使い方もできそうな勢いです。
※後で気付いたけどradek氏のNP_Itemも同じ働きを持つプラグインみたい。
オフライン
アイテムを投稿する時に、「ドラフト保存」しておくとよさそうですね 8)
オフライン
いつもお世話になっています。
パーツ的な使い方をしようと思い、ドラフト状態で記事を保存するのですが、
ドラフトだとサイトに表示されない状態です。
通常保存するとサイトに表示されるようにはなるんですが……
どこをどのように書き換えればいいでしょうか?
オフライン
試さずに書きますが、ドラフトだと表示されないのは、getSqlBlog() の中で、
. ' and i.idraft=0' // exclude drafts
の行があるせいなので、11行目の
$query = $blog->getSqlBlog('AND i.inumber='.intval($itemid));
をコメントアウトして
$query = 'SELECT '
. 'i.inumber as itemid, '
. 'i.ititle as title, '
. 'i.ibody as body, '
. 'm.mname as author, '
. 'm.mrealname as authorname, '
. 'i.itime, '
. 'i.imore as more, '
. 'm.mnumber as authorid, '
. 'm.memail as authormail, '
. 'm.murl as authorurl, '
. 'c.cname as category, '
. 'i.icat as catid, '
. 'i.iclosed as closed'
. ' FROM '
. sql_table('member') . ' as m, '
. sql_table('category') . ' as c, '
. sql_table('item') . ' as i '
. ' WHERE i.iblog=' . $blog->getID()
. ' and i.iauthor=m.mnumber'
. ' and i.icat=c.catid'
. ' and i.itime<=' . mysqldate($blog->getCorrectTime());
if ($this->getSelectedCategory()) {
$query .= ' and i.icat=' . $blog->getSelectedCategory();
}
$query .= ' and i.inumber='.intval($itemid);
に変更すると上手く行くと思います
オフライン
コア改造ですよね。僕もdraftという文字列を探しててそこに行き着いたのですが。
http://wakka.xiffy.nl/showdraft
そうかと思えば、本家にはドラフト記事を表示するプラグインもあるみたいです。
ただしこれ、ログインしてるユーザ限定なんですね。限定しないで、ログインしてようが
してなかろうが表示できればいいわけなのでコードを追いましたが挫折。
しかしドラフトでパーツ扱いですか。そのアイデア面白いです。
僕は安直にパーツ専用のブログを立てるクチで、楽天ショップ運用なんかそんな感じですけど。
オフライン
同じく試さずに書きますが、ごめんなさい。11行目を
$query = $blog->getSqlBlog('OR i.inumber='.intval($itemid));
とすれば、ドラフトであろうが未来の記事であろうが、表示されるような気がします。
メインルーチンが3行だけ(2行といっていいかも)のプラグインですね。すごい。
Nucleus-SQLite の配布は終了しました
VBScript / JScript で Win32API / 構造体 / コールバック関数: SFC mini
オフライン
RSSで補足できず、出遅れました。(ここってRSS配信しないっすよね。。。前に、けつねはんに聞いたんだけど、忘れちゃった。orz
やや!
ドラフトでパーツ扱いですか!おもしろ~い!さすがshizukiさん。
OR 試してみました。
対象レコードが複数になってしまうので、アイテム限定ができませんでしたが、ちょっと(?)付け足して、
$query = $blog->getSqlBlog('AND 0 OR i.inumber='.intval($itemid)).' limit 1';
AND 0 で全否定してから、OR して、更に limit 1で何とか動作しました。 OR とは思いつきませんでした。さすがKatsumiさん。
こんなトリッキーなことすると、limit 付けても、オーバーヘッドかかっちゃいます?(MySQL
体感的(あにまる)には、limit付けずに全表示した時と、アイテム1つにlimitした時と、全然速度が違いました。(自信なしです)
いや、素直にSQL書けばいいんですけど、、、コアがバージョンアップしてテーブル構造が変わることも有り得るかなぁ、できるだけコアのメソッド使ったほうが良いのかなぁ、と。
本当は手抜きです。(汗
トリッキーSQLと、手書きSQLと、どっちが良いのでしょうか?
各種プラグインを紹介するblog(鯖更新忘れ死亡中)
スキン・テンプレ変数を紹介するブログ(復活)
http://reference.nucleus.satona.net/
wa - Nucleusやウェブネタなど
http://wa.otesei.com/
オフライン
皆さん、ありがとうございました。
佐藤(な)さんの11行目の書き換えによって、
ドラフト保存したまま、パーツ表示的な使い方ができるようになりました。
EXTRASKINでも良かったんですが、自サイトの「お知らせ」とか「顔写真」のところが
割と頻繁に更新するところで、かつタグとか使うことも多くて手打ちでタグ書くのが面倒だったので
ドラフト記事で修正可能になり、かなり楽になりました。
オフライン
ん?あれ?
コア改造じゃないですよ
このプラグインの11行目で、getSqlBlog() 関数使ってSQL取得してるんで、直接SQL書くように変更しただけです
で、(な)さんのされてるような心配(コアがバージョンアップしてテーブル構造が変わる)を考慮すると、やっぱりコアの関数使ったほうがよさそうなので、
$manager->getitem(intval($itemid),1,0);
して
getTemplate()
あんど
echo TEMPLATE::fill()
なんてどうでしょう?
オフライン
echo TEMPLATE::fill()
だと、各種イベントが発動しないような、、
ありゃ、読み返してみたら、朝方とぼけたこと書きました。
> 体感的(あにまる)には、limit付けずに全表示した時と、アイテム1つにlimitした時と、全然速度が違いました。
そりゃ、パースする時間がかかるから。
徹夜明けでねぼけてました。orz
$blog->getSqlBlogで取得した後、正規表現置換えしても良いかもしんないし、他のメソッドでどうにかなったりしないかなぁとか。(まだねぼけてるかも。
いぁ、ドラフト想定してなかったし、全然深く考えずに作ったので。。。
Nプロジェクト終わったら、コア覗いてみようっと。
各種プラグインを紹介するblog(鯖更新忘れ死亡中)
スキン・テンプレ変数を紹介するブログ(復活)
http://reference.nucleus.satona.net/
wa - Nucleusやウェブネタなど
http://wa.otesei.com/
オフライン
確かに、いろいろスキップされるイベントでてきますねぇ
で、ふと思ったんですが、getSqlBlog() で取得できるSQLって、MySQL5使用時にShowBlogsやMultipleCategoriesでエラーが出てた時のSQLと同じなんですが、この関数って他のところで使われてないんですかねぇ
使われてるとしたら、エラーが出ないのはナゼ??
オフライン
> MySQL5使用時にShowBlogsやMultipleCategoriesでエラーが出てた時のSQLと同じなんですが、
そうなんですかー。
MySQL 5、ちんぷりかんぷりっす。
各種プラグインを紹介するblog(鯖更新忘れ死亡中)
スキン・テンプレ変数を紹介するブログ(復活)
http://reference.nucleus.satona.net/
wa - Nucleusやウェブネタなど
http://wa.otesei.com/
オフライン
ドラフト保存は面白いアイデアですね
話がずれますが、mysql5 のエラーうんぬんって話、たぶんFROM項のところですよね。
getSqlBlog()でエラーにならない理由はわかりませんが、
テーブル順を変える以外に、FROM (t1, t2, t3) WHERE ... のようにカッコでくくってしまうことでもエラー回避できるみたいです。
(※自分向けメモも兼ねて投稿・・)
Nucleusだとか
http://nucleus.datoka.jp/
オフライン
あれれれ、コア改造ではなかったですか。すごい根拠のない勘違い。
たった3行という印象が強いので、単純に「11行目」というところに反応したのでした。
勢いでモノを言いやすい時間帯の書き込みだったので、と適当な言い訳。笑
コードを追ってみたりしたのは少し勉強になりました。
オフライン
コアでエラーにならない理由について、NKJGさんより亜空間レスをいただきました
亜空間レス : MySQL5の話 @ 肉少なめ
エラーにならない理由というか、ShowBlogsやMultipleCategoriesでエラーになる理由ですね ^^;
いろいろすっ飛ばしてるところ多すぎです > 自分 :oops:
オフライン
> $query = $blog->getSqlBlog('AND 0 OR i.inumber='.intval($itemid)).' limit 1';
あほぅなSQLでリレーション切れてました。:lol: テンプレート変数が誤動作してました。
修正版です。
同じ条件が3回登場するのは、今後のNucleusのバージョンアップで、万が一getSqlBlogメソッドでの条件式のiblogとidraftの順番が変わっても対応できるようにするためです。(素直にSELECT文自前で書けば済むのに)あほです。
使い方は一緒です。
<?php
class NP_ShowItem extends NucleusPlugin {
function getName() { return 'ShowItem'; }
function getAuthor() { return 'yama.kyms, sato(na)'; }
function getURL() { return 'http://wa.otesei.com/'; }
function getVersion() { return '0.3'; }
function getDescription(){ return 'A specified item is displayed to skin.'; }
function doSkinVar($skinType, $template = '', $itemid = ''){
global $blog;
$query = $blog->getSqlBlog(" AND ".($whereinumber = "i.inumber=".intval($itemid)." "))." limit 1";
$query = preg_replace(array("/i\.idraft\s*?=\s*?0/", "/i\.iblog\s*?=\s*?[0-9]*?\s/"), $whereinumber, $query);
$blog->showUsingQuery($template, $query, '', 1, 1);
}
}
?>
Downloadファイルは、下記件(SqlTablePrefix)修正しておきました。
各種プラグインを紹介するblog(鯖更新忘れ死亡中)
スキン・テンプレ変数を紹介するブログ(復活)
http://reference.nucleus.satona.net/
wa - Nucleusやウェブネタなど
http://wa.otesei.com/
オフライン
NP_ShowItem v0.3をインストールしたらインストールに失敗しました。
"Error: plugin file NP_ShowItem.php could not be loaded, or it has been set inactive because it does not support some features (check the actionlog for more info)"
と表示されたので、管理操作履歴を確認したら
"Plugin NP_ShowItem was not loaded (does not support SqlTablePrefix)"
と記録されています。新規インストールならびv0.2インストール済みの環境にv0.3を上書きコピーでも同じ症状です。コアは3.3を使用しています。
(なんか他のプラグインでも同様の症状が発生した記憶があるのですが、何だったかな?)
お~た"ホイホ"こ~いち@ペンギンの森
http://penguinsforest.jp
http://penguinsforest.info (別館)
-------------------------------------------------
ペンギンアート展は次期開催地を選定中
http://penguin-art.com
オフライン
テーブルプリフィクスを独自にしている環境で運用してますよね。
以下のコードを試してみてください。
<?php
class NP_ShowItem extends NucleusPlugin {
function getName() { return 'ShowItem'; }
function getAuthor() { return 'yama.kyms, sato(na)'; }
function getURL() { return 'http://wa.otesei.com/'; }
function getVersion() { return '0.3'; }
function getDescription(){ return 'A specified item is displayed to skin.'; }
function supportsFeature($w) { return ($w == 'SqlTablePrefix') ? 1 : 0; }
function doSkinVar($skinType, $template = '', $itemid = ''){
global $blog;
$query = $blog->getSqlBlog(" AND ".($whereinumber = "i.inumber=".intval($itemid)." "))." limit 1";
$query = preg_replace(array("/i\.idraft\s*?=\s*?0/", "/i\.iblog\s*?=\s*?[0-9]*?\s/"), $whereinumber, $query);
$blog->showUsingQuery($template, $query, '', 1, 1);
}
}
?>
同じようにインストールに失敗するプラグインがあったとしたら、
function supportsFeature($w) { return ($w == 'SqlTablePrefix') ? 1 : 0; }
この行を適当な場所に貼り付けるとうまくいくのではと思います。
オフライン
>yama.kymsさま
ご指示のコードで問題なくインストールおよび動作しました。ありがとうございます。
テーブルプリフィクスを独自にしている環境で運用してますよね
ご指摘の通りです。なるほど、こちらが原因だったのですね。
お~た"ホイホ"こ~いち@ペンギンの森
http://penguinsforest.jp
http://penguinsforest.info (別館)
-------------------------------------------------
ペンギンアート展は次期開催地を選定中
http://penguin-art.com
オフライン
hoihoさん、ポカミスすみません。 :oops:
yama.kymsさん、フォローありがとうございます。 :oops:
Downloadファイル修正しておきました。
各種プラグインを紹介するblog(鯖更新忘れ死亡中)
スキン・テンプレ変数を紹介するブログ(復活)
http://reference.nucleus.satona.net/
wa - Nucleusやウェブネタなど
http://wa.otesei.com/
オフライン
カテゴリ選択が影響してしまうバグがありましたので修正しました。
yama.kymsさん、 NKJGさん、ありがとうございます。
各種プラグインを紹介するblog(鯖更新忘れ死亡中)
スキン・テンプレ変数を紹介するブログ(復活)
http://reference.nucleus.satona.net/
wa - Nucleusやウェブネタなど
http://wa.otesei.com/
オフライン
ホントはsql文を直接書いちゃったほうがいい。とsatonaさんがつぶやいてるのを見たので試してみました。
見た目はおおげさになったように見えますが、実は単純化・・
<?php
class NP_ShowItem extends NucleusPlugin {
function getName() { return 'ShowItem'; }
function getAuthor() { return 'yama.kyms, sato(na)'; }
function getURL() { return 'http://wa.otesei.com/'; }
function getVersion() { return '0.4.1'; }
function getDescription() { return 'A specified item is displayed to skin.'; }
function supportsFeature($w){ return ($w == 'SqlTablePrefix') ? 1 : 0; }
function doSkinVar ($skinType, $template = '', $itemid = '')
{
global $blog;
$itemtable = sql_table('item') ;
$categorytable = sql_table('category');
$membertable = sql_table('member') ;
$query = "SELECT i.inumber as itemid,
i.ititle as title,
i.ibody as body,
i.imore as more,
i.icat as catid,
i.itime,
i.iclosed as closed,
c.cname as category,
m.mnumber as authorid,
m.mname as author,
m.mrealname as authorname,
m.memail as authormail,
m.murl as authorurl
FROM $itemtable as i,
$categorytable as c,
$membertable as m
WHERE i.inumber = $itemid
limit 1";
$blog->showUsingQuery($template, $query, '', 1, 1);
}
}
?>
オフライン
すっきりしましたね。
ありがとうございます~
各種プラグインを紹介するblog(鯖更新忘れ死亡中)
スキン・テンプレ変数を紹介するブログ(復活)
http://reference.nucleus.satona.net/
wa - Nucleusやウェブネタなど
http://wa.otesei.com/
オフライン
今思ったけど、テーブル構成をシンプルに決め打ちにしちゃうのはいいかもしれないけど、
将来的にコアが構成変わる可能性ありますよね。変わるというか、追加されることはありそう。
そしたら、なぜか出力されないなんて話も出てくるし、逆に古いバージョンのNucleusでは
イレギュラーなSQL文ってことになったりするのかな、とかとか・・
オフライン
今思ったけど、テーブル構成をシンプルに決め打ちにしちゃうのはいいかもしれないけど、
将来的にコアが構成変わる可能性ありますよね。変わるというか、追加されることはありそう。
そしたら、なぜか出力されないなんて話も出てくるし、逆に古いバージョンのNucleusでは
イレギュラーなSQL文ってことになったりするのかな、とかとか・・
そう、そもそも、それを気にしてトリッキーなことをしていたために(当スレッドの最初の方参照)、かえって見通しが悪くなって、カテゴリ選択のバグが発生する状況となっていましたので、この方がよいと思います。
やまさんが気づいた「エラーページで使えない問題」を対策しておきました。(ついでに、ver0.4.1の「設定したカテゴリが変わってしまうバグ」も修正しておきました。)
<?php
class NP_ShowItem extends NucleusPlugin {
function getName() { return 'ShowItem'; }
function getAuthor() { return 'yama.kyms, sato(na)'; }
function getURL() { return 'http://wa.otesei.com/'; }
function getVersion() { return '0.4.2'; }
function getDescription() { return 'A specified item is displayed to skin.'; }
function supportsFeature($w){ return ($w == 'SqlTablePrefix') ? 1 : 0; }
function doSkinVar ($skinType, $template = '', $itemid = '')
{
global $blog, $manager;
$itemid = intval($itemid);
if (!isset($blog)) $blog = & $manager->getBlog(getBlogIDFromItemID($itemid));
$query = sprintf(
"SELECT
i.inumber AS itemid,
i.ititle AS title,
i.ibody AS body,
i.imore AS more,
i.icat AS catid,
i.itime,
i.iclosed AS closed,
c.cname AS category,
m.mnumber AS authorid,
m.mname AS author,
m.mrealname AS authorname,
m.memail AS authormail,
m.murl AS authorurl
FROM
%s AS i,
%s AS c,
%s AS m
WHERE
i.inumber=%u
AND c.catid=i.icat
limit 1"
, mysql_real_escape_string(sql_table('item'))
, mysql_real_escape_string(sql_table('category'))
, mysql_real_escape_string(sql_table('member'))
, intval($itemid) //ultrarich
);
$blog->showUsingQuery($template, $query, '', 1, 1);
}
}
?>
各種プラグインを紹介するblog(鯖更新忘れ死亡中)
スキン・テンプレ変数を紹介するブログ(復活)
http://reference.nucleus.satona.net/
wa - Nucleusやウェブネタなど
http://wa.otesei.com/
オフライン