XOOPSでFCKeditorからckeditorへ

InternetExproler10が世に出てから、お客様からよく「エディターが無くなりました」というお問い合わせをいただきました。
FCKEditorがIE10という「10」というのを想定して作られていなかったのと、跡継ぎエディターのCKEditorが出てきていたのとあって、対応されたものがなく、また、XOOPSで使用していたFCKEditorはXOOPS用にうまいこと動くように改造していただいていたものでした。

FCKEditorをIE10以降の環境でも使えるようにという技はいろいろとあったし、私もこのブログで紹介していたけれど、結局思ったような動きをせず、IEの互換モードを利用して、管理画面だけ強制的にIE8にすることで、この問題を避けてきました。

しかし、来年あたりに出るだろうIE12からは、この互換モードもなくなるだろうという噂を聞き、やはりFCKeditorからCKeditorにしなくてはならないかぁ……といろいろ調べていたところ、「CKEditor4」というXOOPS用に変更されたモジュールがあることを知り(ありがとうございます!)、サーバーブラウザにもXelfinderというものを提供していただいているということを知って(ありがとうございます)、ここ数日その変更をいろいろと試していたところです。

CKEditor4」は、リンク先のページによると動作確認されているXOOPSのバージョンが、XOOPS CUBE Legacy2.2.0からの方がよいみたい(1.7.2で試していたけど、うまくいかなかった)

ので、

1.XOOPS CUBE Legacy 2.2.0以上にバージョンアップする(どうせバージョンアップするならなるべく最新に)

2.CKEditor4をインストール

3.eXlfinderをインストール

という流れで。

まず、

1.XOOPS CUBE Legacy 2.2.0以上にバージョンアップする(どうせバージョンアップするならなるべく最新に)

以下のページを参考にアップデート

http://sourceforge.net/apps/mediawiki/xoopscube/index.php?title=Upgrade22;ja

なんで、このアップデート、今頃まで躊躇していたかというと、管理画面のデザインがかわるからだったりします。
普段操作に不慣れなお客様だと、ボタンの色一つ変わるだけで、「あれ?」と思う方もいらっしゃるので……。
なるべく管理画面とか変わってほしくないなぁ……なんて思ったりしますが、この際、デザインの変更点もちゃんと説明することにします。

2.CKEditor4をインストール

インストールするだけで、picoでエディターが動く的な説明をどこかで読みましたが、私の場合インストールするだけではだめでした。

テンプレートの「xx_main_content_form.html」より

<{$body_wysiwyg}>  を<{ck4dhtmltarea name=body value=$content.body editor=html}>  に変更します。

 3.eXlfinderをインストール

特に難しいことはありません。インストールすれば、ckeditor4のサーバブラウザとして使うことができます。

4.bulletinが2.04だったら2.2にアップしておく必要があります。

取りあえず以上……。

XOOPSのモジュールAltsysがインストールできない

XOOPS Cube Legacy 2.2をインストール後、Altsysやpicoをインストールしようとすると、「コールバック ‘xoops_module_install_altsys’ を実行することができませんでした」というエラーが出てインストールできない。

ちなみにサーバの環境は

PHPバージョン : 5.2.17
MySQLのバージョン : 5.5.28-log

以下の記事を参考にしました。

http://xoopscube.jp/forum/6771

しかし上記の記事の置換では、なぜかうまくいかなかったため、該当するモジュールのソースの

「 TYPE=MyISAM」を検索して、「ENGINE=MyISAM」に置換したファイルをアップして、インストール完了です。

picoのメニューの表示の仕方 その2

picoのメニューの表示の仕方 その1の続きです。
カテゴリーの階層

カテゴリー1
│  ├記事1
│  ├記事2
│  └記事3
カテゴリー2
│ │└記事4
│ └カテゴリー2-a
│    ├記事ア
│    └記事イ
カテゴリー3
   ├記事5
   ├記事6
   └記事7

という階層があったとする。このとき、カテゴリー2-aは、カテゴリー2のサブカテゴリーです。

このときに、そのカテゴリーの記事が表示されているときだけ記事リストを表示させたい。つまり、カテゴリー1の記事1を読んでいるときには、

カテゴリー1
│  ├記事1
│  ├記事2
│  └記事3
カテゴリー2
カテゴリー3

カテゴリー2内の記事4を読んでいるときは、

カテゴリー1
カテゴリー2
│ │└記事4
│ └カテゴリー2-a
カテゴリー3

となるようにしたいです。

Continue reading

picoのメニューの表示の仕方 その1

カテゴリーの階層

カテゴリー1
│  ├記事1
│  ├記事2
│  └記事3
カテゴリー2
│ │└記事4
│ └カテゴリー2-a
│    ├記事ア
│    └記事イ
カテゴリー3
   ├記事5
├記事6
└記事7

という階層があったとする。このとき、カテゴリー2-aは、カテゴリー2のサブカテゴリーです。
このときに、いろいろなメニューの表示をさせたいと思います。
例えば、カテゴリーのみ表示させて、記事のリストは該当のカテゴリーにいるときのみ展開させるということなどです。

まずは、デフォルトのテンプレートでの表示です。 Continue reading

承認前に「新着」に情報が反映される

picoとd3pipesの組み合わせで、更新された情報を「新着情報」として自動で表示する仕組みにしています。
このとき、投稿者がpicoのページの内容を変更した後、承認される前に、「新着情報」に反映されてしまいます。
これは、d3pipesがpicoの情報を吸い上げている部分(trust_path\modules\d3pipes\joints\block\D3pipesBlockPicolist.class.php)が、picoのblockの部分、「b_pico_list_show」を利用してデータを引っ張っているからです。(trust_path\modules\pico\blocks\list.php)
そのとき、「更新時間(modified_time)」順で並べられます。

また、picoのしくみでは投稿者が投稿した時点で、「更新時間(modified_time)」が更新されます。
また、その時間は投稿者によって変更することができません。

投稿者の投稿したデータが承認される前には、「新着情報」として表示されてほしくない。
二通り考えました。
「新着情報」で吸い上げるデータは「作成時間」に基づいてリスト化する。その場合、承認者が承認後に「作成時間」を変更することによって「新着情報」に反映されるというしくみになります。
もう1つは承認待ち中はリストに含めない。何らかの方法で「承認中」というフラグを立てます。

後者の方法で対応しました。(前者だと更新者側でいろいろとルール決めをしなくてはならなさそうだったので)

Continue reading

picoのextra_fieldsは、すごいね!

いまさらですが、感動しちゃった。

picoのextrafields
http://www.xugj.org/modules/xpwiki/?ModuleManuals%2F%E2%80%8Bpico%2Fextra_fields

でも、imageのほうがうまくいかなかったんだー。

しかし、これ、なんでもできそうだなーなんて思いました。

管理画面が編集できるって、すっごいなぁ。

あと、メモ。

<pre>
<{$content.ef|@var_dump}>
</pre>

これ、便利。いつも忘れるので、メモメモ。

picoのブロックメニューの変更

ちょっとかわった作り方で、

TOPカテゴリー
 ・A
 ・B
 ・C
 [カテゴリー1]
  ・D
  ・E
 [カテゴリー2]
  ・F
  ・G

という風なページ形成だとします。

Aを選んだときには、メニューに「A」のみ。(しかも該当するバナー画像)
Bを選んだときには、メニューに「B」のみ。(しかも該当するバナー画像)

Dを選んだときは、「カテゴリー1」」のタイトルを表示し、その下に、DとEを表示という風にしたい。

ツꀀ
<div id=”n-img”>
<{foreach item=category from=$block.categories}>
ツꀀ<{if $content.link == “index.php?content_id=`$smarty.get.content_id`” || $category.id == $smarty.get.cat_id}>
ツꀀツꀀ<a href=”<{$block.mod_url}>/<{$category.link}>”>
ツꀀツꀀ<{if $category.id != 0}>
ツꀀツꀀツꀀ<img src=”/data/naka-img/category<{$category.id}>.gif” alt=”<{$category.title}>”>
ツꀀツꀀ<{else}>
ツꀀツꀀ<{/if}>
ツꀀツꀀ</a>
ツꀀツꀀ<{assign var=”content_in_array” value=FALSE}>
ツꀀツꀀ
ツꀀツꀀ<{foreach item=content from=$category.contents}>
ツꀀツꀀツꀀ<{if $content.link == “index.php?content_id=`$smarty.get.content_id`” || $category.id == $smarty.get.cat_id}>
ツꀀツꀀツꀀ<{assign var=”content_in_array” value=TRUE}>
ツꀀツꀀツꀀ<{/if}>
ツꀀツꀀ<{/foreach}>
ツꀀツꀀ
ツꀀツꀀ
ツꀀツꀀ<{if $content_in_array == “TRUE”}>
ツꀀツꀀツꀀ<{if $category.id != 0}>
ツꀀツꀀツꀀツꀀ<ul id=”nakanavi”>
ツꀀツꀀツꀀツꀀ<{foreach item=content from=$category.contents}>
ツꀀツꀀツꀀツꀀツꀀ<li style=”margin:0;background-color:#fff;”><a href=”<{$block.mod_url}>/<{$content.link}>” title=”<{$block.lang_lastupdated}>:<{$content.created_time_formatted}>”><{$content.subject}></a></li>
ツꀀツꀀツꀀツꀀ<{/foreach}>
ツꀀツꀀツꀀツꀀ</ul>
ツꀀツꀀツꀀ<{else}>
ツꀀツꀀツꀀ
ツꀀツꀀツꀀツꀀ<{foreach item=content from=$category.contents}>
ツꀀツꀀツꀀツꀀツꀀ<{if $content.link == “index.php?content_id=`$smarty.get.content_id`”}>
ツꀀツꀀツꀀツꀀツꀀ<a href=”<{$block.mod_url}>/<{$content.link}>” title=”<{$block.lang_lastupdated}>:<{$content.created_time_formatted}>”>
ツꀀツꀀツꀀツꀀツꀀ<img src=”/data/naka-img/contents<{$smarty.get.content_id}>.gif” alt=”<{$content.subject}>”></a>
ツꀀツꀀツꀀツꀀツꀀ<{/if}>
ツꀀツꀀツꀀツꀀ<{/foreach}>
ツꀀツꀀツꀀ<{/if}>
ツꀀツꀀ<{/if}>
ツꀀツꀀ
ツꀀ<{/if}>
<{/foreach}>
</div>

picoで、カテゴリー内のコンテンツが開いているときだけ、そのカテゴリーのメニューを出す。

つまり、たとえば

カテゴリーA
  ├ コンテンツA
  ├ コンテンツB
  └ コンテンツC

カテゴリーB
  ├ コンテンツ1
  ├ コンテンツ2
  └ コンテンツ3

という風に、コンテンツをいれるとき、「メニュー」をブロックに表示していると、全部展開した状態で表示されちゃうんだけども、「コンテンツA」を表示しているときは

カテゴリーA
  ├ コンテンツA
  ├ コンテンツB
  └ コンテンツC

カテゴリーB

という風に、カテゴリーAのコンテンツのみ展開。カテゴリーBは閉じておく(もしくは消しておく)ということがしたいのです。

これに関しては

PICOで表示コンテンツのカテゴリーのみコンテンツリスト表示 (@Xoops Users Group Japan)にて回答がありました。

つまり・・・・・・

jidaikobo さんのお答え block_menu.html に

<{foreach item=category from=$block.categories}>
<dl>
<dt style=”margin:5px 0 0;padding:3px;background-color:#eee;”>
<a href=”<{$block.mod_url}>/<{$category.link}>”>
<{$category.title}>
</a>
</dt>
<{assign var=”content_in_array” value=FALSE}>
<{foreach item=content from=$category.contents}>
<{if $content.link == “index.php?content_id=`$smarty.get.content_id`” || $category.id == $smarty.get.cat_id}>
<{assign var=”content_in_array” value=TRUE}>
<{/if}>
<{/foreach}>
<{if $content_in_array == “TRUE”}>
<dd style=”margin:0;”><ul>
<{foreach item=content from=$category.contents}>
<li style=”margin:0;background-color:#fff;”><a href=”<{$block.mod_url}>/<{$content.link}>” title=”<{$block.lang_lastupdated}>:<{$content.created_time_formatted}>”><{$content.subject}></a></li>
<{/foreach}>
</ul></dd>
<{/if}>
</dl>
<{/foreach}>

とあります。

ただし、1.7系で使えるそうです。 ありがとうございます。

picoのwrapsの範囲を変えてみる

picoのwraps機能は、XOOPS_TRUST_PATH/wraps/任意のモジュールパス名のページを読み込んでくれるもので、自動的に<body></body>の間を取り出すようになっています。

<body></body>の中を注意してつくればいいんですけども、やっぱデザイナーさん的には、周りのフレームをつけた状態でコーディングしたいし、あとで<body></body>内からフレームをけすことも出来るけど、校正はつけて、実際ははずして・・・・・・なんて、あとのデータの管理が大変。

デザイナーさんにストレスなくコーディングしてもらうために、任意の記号内を取り出す仕様にできないかなぁと改造。

やっぱり、ちょっと手を加えるので、非推奨かも・・・・・・。メモ代わりに

xoops_trust_path/modules/pico/filters/pico_wraps.phpのファイルL.20あたり

if( preg_match( ‘/\<body[^<>]*\>(.*)\<\/body\>/is’ , $text , $regs ) ) {

if( preg_match( ‘/\<here[^<>]*\>(.*)\<\/here\>/is’ , $text , $regs ) ) {

に。

そして、ファイルのほうは、取り出したい部分を<here></here>で囲みます。

このhereって大丈夫だと思うけど・・・・・・。

まぁ、別のありえない文字にしてもよいと思います。

terarinとか・・・。