スタッフブログ
こんにちわ。なおとです。
XOOPSでjQueryを使うとき、XOOPSのSmartyプラグインとの組み合わせで、ちょっとしたノウハウをご紹介します。
jQueryでセレクタを使うときに(もちろん)idを指定することができます。 そのとき、操作対象の要素のid属性の値に使われる文字種には、注意する必要があります。
大雑把に言うと、特にcssセレクタとして使う場合も考慮するなら、できれば英数字と-(ハイフン)だけの組み合わせを使うのが、一番無難です。
(参考:名前付けの注意点 『The Web KANZAKI ごく簡単なHTMLの説明』より)
jQueryの話に戻りますが、idに「[](大括弧)」が含まれていると、idセレクタでその要素を「掴む」ことができません。
しかし、XOOPSのSmartyプラグイン「xoops_input」を使うと、いくつかの条件が重なると、idに[]を含む文字列が入ります。 これはハマりどころで、私もこの現象に気づくまで、かなり悩みました。
その問題の条件は、name属性の値に[]を使っていて、php側では配列で値を受け取れるようにしていることと、自動でidをつける(明示的に指定しなければそうなる)ようにしている時、という条件が重なった場合です。
(参考:xoops_input『SourceForge.net: xoopscube » Legacy_Theme_Smarty;ja』より)
テンプレート <{xoops_input type=checkbox name="checkbox[]" value="value1" default=$value}> <{xoops_input type=checkbox name="checkbox[]" value="value2" default=$value}> <{xoops_input type=checkbox name="checkbox[]" value="value3" default=$value}> ↓ 出力 <input name="checkbox[]" id="legacy_xoopsform_checkbox[]_value1" value="value1" type="checkbox"> <input name="checkbox[]" id="legacy_xoopsform_checkbox[]_value2" value="value2" type="checkbox"> <input name="checkbox[]" id="legacy_xoopsform_checkbox[]_value3" value="value3" type="checkbox">
この場合には、明示的にidを指定することによってidの値をある程度コントロールできるので、それで解決できます。
テンプレート <{xoops_input type=checkbox name="checkbox[]" value="value1" default=$value id="checkboxvalue1"}> <{xoops_input type=checkbox name="checkbox[]" value="value2" default=$value id="checkboxvalue2"}> <{xoops_input type=checkbox name="checkbox[]" value="value3" default=$value id="checkboxvalue3"}> ↓ 出力 <input name="checkbox[]" id="checkboxvalue1_value1" value="value1" type="checkbox"> <input name="checkbox[]" id="checkboxvalue2_value2" value="value2" type="checkbox"> <input name="checkbox[]" id="checkboxvalue3_value3" value="value3" type="checkbox">
これでうまく要素を掴めるようになります。
今回はXOOPSの簡単にできるTipsについて書いてみようと思います。
[内容]
ユーザーメニューブロックにユーザのアバターを表示させる。
[効用]
SNS風な感じにログインしていることが一目でわかりよりパーソナライズ
されたCMSを雰囲気を演出できる。
管理者や開発社は複数のアカウントを使用している人もどのアカウントで
ログインしているか一目でわかって便利。
[やり方]
テンプレートファイルを編集します。
編集するテンプレートは互換モジュールのlegacy_block_usermenu.html
になります。このにファイルにアバターを表示するために1行追加します。
以下の例ですと4行目になります。
<table cellspacing="0">
<tr>
<td id="usermenu">
<img src="<{$block.uid|xoops_user_avatarize}>" />
<a class="menuTop" href="<{$xoops_url}>/user.php">
(必要な部分だけ抜粋。実際のテンプレートファイルはもうちょっと長いです)
以上のように1行追加するだけで作業は簡単です。
ですが、わりと実用的なTipsではないかなと思います。
ブログのタイトルで「その1」としましたが、持ちネタが少ないので、次に何か良いネタが
できたら「その2」を書こうと思いますので、よろしくお願いします。
[謝辞]
suinさん貴重なアドバイスありがとうございました。
なおとです。
古い話になるのですが、今年の4月にあった第32回PHP勉強会で知ったことを、最近になって活用しました。ためになったのでそれを紹介したいと思います。 ベイエリア情報局「ライブラリが直接実行された場合はプログラムとして実行する」(btoさん)です。
前回私が書いたブログ記事の続きでもあるのですが、作りたい機能がXOOPSの中での処理だけでなく、CRON経由でCLI(コマンドラインインターフェイス)のphpを併用することがあります。
例えばなにかメールを送る機能があったとして、その場で送るのと、あとから非同期に(CRONから叩いて)送る場合と、2パターンがあるとします。 具体的な処理としては「送るメールの文面をつくる」「メールを送る」など、共通しています。XOOPSではPHPMailerというライブラリを使って送信する機能が盛り込まれているので、できるだけそれを使います。 ただし直接利用するだけでなく、ビジネスロジック側にすり寄せた、使いやすいようなインターフェイス(独自のクラス)を通して使ったりします。 これには、送信の記録を含むアプリケーション・ログを記録する部分を実装したります。
ここからはやり方次第なのですが、クラスを書いた部分以外に、同じファイルを読み込んで処理するような作りになる場合もあります。 例を具体的に挙げると、あるモジュールのアクションとして使われているスクリプトを、CLIからも呼び出すようなやり方です。
その中身は例えばなのですが、簡略化するとだいたいこんな感じになります。<?php global $xoopsOption, $xoopsConfig, $xoopsDB, $xoopsUser, $xoopsModule; if (check_exec($argv)) { $xoopsOption['nocommon'] = 1; require_once dirname(dirname(__FILE__)) . '/public_html/mainfile.php'; $mydirname = basename(dirname(dirname(__FILE__))); $mydirpath = XOOPS_ROOT_PATH . '/modules/' . $mydirname; $mydirurl = XOOPS_URL . '/modules/' . $mydirname; require_once $mydirpath . '/mytrustdirname.php'; // set $mytrustdirname $mytrustdirpath = XOOPS_TRUST_PATH . '/modules/' . $mytrustdirname; $root =& XCube_Root::getSingleton(); $root->mController->executeCommonSubset(); } if (!defined('XOOPS_TRUST_PATH')) die('set XOOPS_TRUST_PATH in mainfile.php'); // mail送信など実際の処理(省略) $mail = new MyMail($mydirname); (snip) function check_exec($argv) { // コマンドラインか判別する // HTTPD経由だと$argvは未定義 if (isset($argv[0]) and (__FILE__ === realpath($argv[0]))) { return TRUE; } return FALSE; } ?>
私の中ではこの辺の「これ」というノウハウはまだ持てていなくて、試行錯誤をしながら(つまったりして)開発しています。 面白味がある部分です。
ちょっとしたことなのですが、さっと検索してパッと見つかって、それが使えると分かればどんどん使うのが、できるエンジニアだと思います。
まとまりのない感じですが、そんなことがありました。
Googleドキュメントは、無料で発行されるGoogleのアカウントさえあれば、どなたでも使えるサービスで、Wordのような「文書」やエクセルのような「スプレッドシート」を作成できる便利なサービスです。
・Googleドキュメント
このGoogleドキュメントのスプレッドシートに、登録用フォームを作成する機能があります。
この機能を使うことで、簡単にアンケートフォームを作成して、エクセルのような表にアンケート内容を記録することができちゃいます。
では手順を説明しますね。
こんにちわ2回目のなおとです。
今日はRYUSの伝統?に倣って、XOOPS Hackネタをご披露します。
とはいえ私も若輩の身、お手軽なHTMLテクニックで行きたいと思います。
題のとおりなのですが、google-code-prettifyを使った、プログラム・コードのシンタックス・ハイライトつまり色分けをします。
google-code-prettifyについては1年以上前のマイコミジャーナルの記事、「ハイライトもGoogle流 - "google-code-prettify"でソースコードに色付けを」が参考になります。
Javascriptでいろいろうまい具合にやってくれて、大変お手軽です。
これを組み込むと、フォーラムやブログで書いた、 some codes
それでは今回の肝になる部分ですが、以下のJavascript等の固まりを、HTMLの「できるだけ後のほう」に組み込めばミッション・クリアです。
その前に、外部jsと外部cssファイルは上記リンク先から入手して、サーバにアップロードしておいてくださいね。
<script src="/themes/prettify.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="/themes/prettify.css" />
<script type="text/javascript">
// fetch a list of nodes to rewrite
var preXCodeSegments = document.getElementsByTagName('pre');
for (var i = 0; i < preXCodeSegments.length; ++i) {
preXCodeSegments[i].className = 'prettyprint';
}
prettyPrint();
</script>
方法その1 テーマで
XOOPS_ROOT_PATH/themes/[mytheme]/theme.html
を書き換えます。詳細の説明は省きます。当サイトではこの手法でやっています。
方法その2 カスタム・ブロックで
管理メニューに入って、「互換モジュール >> ブロックの管理」画面の、「カスタムブロック追加」ボタンからはじめます。もちろんaltsysを使ってもかまいません。
で、上のカコミの中身をHTML(無変換)でコンテンツエリアに書きます。
タイトルは好きにしてかまいません。ただ、表示サイドは必ず「サイドブロック 右」で、並び順も99といったように、できるだけ後のほうになるように指定してください。この方法だと、ブロックのタイトルがどうしても表示されてしまうのが欠点です。。。
表示先のモジュールは「すべてのモジュール」、アクセス権はサイト管理者と登録ユーザとゲスト、つまり全部許可でいいと思います。このあたりは適宜調整してください。
ほかにも、フッターエリアを使う方法も考えられます。ただ、テーマによってはうまくいかないかも知れません。
さて。
ここでたとえば、上記のカスタマイズを一撃でクリアしてくれるようなモジュールを用意しました〜、と言えれば最高だったのですが、そこはそれ。今後の宿題ということで、皆さんもチャレンジしてはいかが?ということでお茶を濁らさせていただきます。
しまらない感じでしたが、じっさい、当ブログのように、頻繁にプログラムを書く人には効果は絶大ですよ。