XOOPS 2.0.xでプログラムを作る際のTIPSを書いています。
モジュール ↑
モジュールを作りたい ↑
取り急ぎ形だけ作りたい場合はこちら XOOPSモジュール生成 使ってみてください。ガワだけできます。
参考になるサイト
D3モジュールについて ↑
参考サイト
モジュールのIDを得る ↑
$module_handler =& xoops_gethandler('module');
$xoopsModule =& $module_handler->getByDirname($basename);
$mid = $xoopsModule->mid();
データベース関係 ↑
データベースにアクセスしたい ↑
DBへのコネクションを以下のようにして得る
$xoopsDB を使う。
もしくは
$db =& Database::getInstance();
直前のクエリーで影響を与えた行数を返す。 ↑
これで分かる。
$row = $xoopsDB->getAffectedRows();
該当行があったらUPDATE、なかったらINSERTしたい場合はこのようにすると無駄がない。
(厳密にするにはトランザクション処理が必要)
UPDATE処理
if ($xoopsDB->getAffectedRows() == 0) {
// UPDATEで更新されなかった
INSERT処理
}
直近の INSERT 操作で生成された ID を得る ↑
$xoopsDB->getInsertId();
mysql_insert_id()が呼ばれる
サニタイズ処理 ↑
某サイトからの引用
主な使用方法: $myts =& MyTextSanitizer::getInstance(); $str = $myts->xoopsCodeDecode($str); ---使用推奨場所---(公式フォーラムでGIJOEさんに教えて頂きました。) 文字列型 POSTデータのDB保存(改行無し):addSlashes($text) POSTデータのDB保存(改行有り):addSlashes($text) POSTデータの通常表示(改行無し):stripSlashesGPC(htmlSpecialChars($text)) POSTデータの通常表示(改行有り):previewTarea($text, $html=0, $smiley=1, $xcode=1, $image=1, $br=1) POSTデータのテキストボックス内表示:stripSlashesGPC(htmlSpecialChars($text)) POSTデータの<textarea>内表示:stripSlashesGPC(htmlSpecialChars($text)) DB取得データの通常表示(改行無し):htmlSpecialChars($text) DB取得データの通常表示(改行有り):displayTarea($text, $html=0, $smiley=1, $xcode=1, $image=1, $br=1) DB取得データのテキストボックス内表示:htmlSpecialChars($text) DB取得データの<textarea>内表示:htmlSpecialChars($text) DB取得データのDB保存(改行無し):addSlashes($text) DB取得データのDB保存(改行有り):addSlashes($text) 数値型 POSTデータは全て:intval($num) 場合によってはis_numeric($num)で弾く DB取得データは、何もしなくて良い 文字列型については、改行が有ればmakeTarea****を、無ければmakeTbox****を そして、POSTデータのDB保存時は****Save、通常表示は****Preview、エレメント?内は ****PreviewInFormを DB取得データの通常表示は****Show、エレメント?内は****Editと、関数名が解り易く なっています。 makeT*とoops*は、deprecated(大いに非難されました。@Eciteエキサイト翻訳)との事 ですので、使用しない方が良いみ
自動採番(auto_increment)しているカラムの次の値を得る ↑
$id = $xoopsDB->genId($xoopsDB->prefix('xxxx').'_uid_seq');
実はこれ 0 しか返ってこない。
mysqldatabase.php の実装はこのようになってる。
function genId($sequence)
{
return 0; // will use auto_increment
}
INSERT後にこれでIDを得る
$uid = $xoopsDB->getInsertId();
ユーザ、グループ関係 ↑
現在のユーザIDを取ってくる ↑
セッションの場合
$uid = $_SESSION['xoopsUserId'];
$xoopsUserオブジェクトから
if (isset($xoopsUser)) {
$uid = $xoopsUser->uid();
}
ゲストユーザにはユーザIDはない。
ユーザ情報を得る ↑
$member_handler =& xoops_gethandler('member');
$user = $member_handler->getUser(ユーザID);
ユーザを追加する ↑
準備中
ユーザ情報を変更する ↑
準備中
ユーザを削除する ↑
準備中
グループ情報を得る ↑
現在のユーザのグループ情報を得る
$groups = $xoopsUser->groups();
if (is_array($groups) && isset($groups[0])) {
$group_handler =& xoops_gethandler('group');
$g = $group_handler->get($groups[0]);
$groupid = $g->getVar('groupid');
$name = $g->getVar('name');
$description = $g->getVar('description');
$group_type = $g->getVar('group_type');
}
準備中
グループを追加する ↑
準備中
グループ情報を変更する ↑
準備中
グループを削除する ↑
準備中
メンバーハンドラー($member_handler)を得る ↑
$member_handler =& xoops_gethandler('member');
モジュールハンドラー($module_handler)を得る ↑
$module_handler =& xoops_gethandler('module');
まとめてユーザID、グループIDを取ってくる ↑
$member_handler =& xoops_gethandler('member');
// ユーザIDをとってくる
$list = $member_handler->getUsers();
// グループIDをとってくる
$list = $member_handler->getGroups();
ユーザの所属グループIDを取って来る ↑
$_SESSION['xoopsUserGroups'] に入っている。
もしくは、
$arr = $xoopsUser->getGroups();
あるグループに属するユーザのIDを得る ↑
$membership_handler =& xoops_gethandler('membership');
$userid_list = $membership_handler->getUsersByGroup( XOOPS_GROUP_USERS);
プログラム的にユーザをグループに追加したい ↑
$member_handler->addUserToGroup($module_id, $uid)
プログラムの中で管理者メールアドレスを得る ↑
$mail = $xoopsConfig['adminmail']
テーマ周り ↑
ブラウザのタイトルバーの表示名を変えたい ↑
システム設定メイン »» 一般設定から変更
モジュールの表示内容に合わせて変える
$xoopsTpl->assgin('xoops_sitename', 'サイトタイトル');
$xoopsTpl->assgin('xoops_pagetitle', 'ページタイトル');
テーマこうなっている
<title><{$xoops_sitename}> - <{$xoops_pagetitle}></title>
ブロック内で $xoopsModuleConfig を得る ↑
$module_handler =& xoops_gethandler(’module’); $config_handler =& xoops_gethandler(’config’); $basename = basename(dirname(dirname(__FILE__))); $xoopsModule =& $module_handler->getByDirname($basename); $xoopsModuleConfig =& $config_handler->getConfigsByCat(0, $xoopsModule->getVar(’mid’));
権限 ↑
今表示しているユーザが管理者グループに属しているか調べる ↑
$GLOBALS['xoopsUserIsAdmin'] に 1 がセットされる。
また、$_SESSION['xoopsUserGroup'] に所属グループがセットされるので
それで調べることもできる。
if (is_array(XOOPS_GROUP_ADMIN, $_SESSION['xoopsUserGroups'])) {
// 管理者グループに属している
} else {
// 管理者グループに属していない
}
またはユーザオブジェクトからグループのリストを取ってきて調べる
$groups = $xoopsUser->groups();
if (in_array(XOOPS_GROUP_ADMIN, $groups)) {
// 管理者グループに属している
} else {
// 管理者グループに属していない
}
ブロック管理権限があるか調べる ↑
$sysperm_handler =& xoops_gethandler('groupperm');
if (!$sysperm_handler->checkRight('system_admin', XOOPS_SYSTEM_BLOCK,
$xoopsUser->getGroups()) {
// ブロック管理権限がない
}
xxxxモジュールの読み込み権限があるか調べる ↑
$module =& $module_handler->getByDirname( 'xxxx' ) ;
$sysperm_handler =& xoops_gethandler('groupperm');
if ($sysperm_handler->checkRight('module_read', $module->mid(),
$xoopsUser->getGroups()) {
// exhibitions モジュールの読み込み権がある
}
xxxxモジュールの管理権限があるか調べる ↑
$module =& $module_handler->getByDirname( 'xxxx' ) ;
$sysperm_handler =& xoops_gethandler('groupperm');
if ($sysperm_handler->checkRight('module_admin', $module->mid(),
$xoopsUser->getGroups()) {
// exhibitions モジュールの管理権限がある
}
登録ユーザグループが管理権限を持っているモジュールのIDを配列で返す ↑
$moduleperm_handler =& xoops_gethandler('groupperm');
$perm_array = $moduleperm_handler->getItemIds('module_admin', XOOPS_GROUP_USERS);
登録ユーザグループが読込権限を持っているモジュールのIDを配列で返す ↑
$moduleperm_handler =& xoops_gethandler('groupperm');
$perm_array = $moduleperm_handler->getItemIds('module_read', XOOPS_GROUP_USERS);
今表示しているモジュールの管理者か調べる ↑
function is_module_admin() {
global $xoopsUser;
global $module_handler;
if (! is_object($xoopsUser)) {
return false;
}
// $mydirname はモジュールのディレクトリ名
$module =& $module_handler->getByDirname( $mydirname ) ;
if( ! is_object( $module ) ) {
die( "invalid module dirname:" . htmlspecialchars( $src_dirname ) )
;
}
$mid = $module->getvar( 'mid' ) ;
return $xoopsUser->isAdmin($mid);
}
モジュールのグループの権限を調べる ↑
次で得る
// groupperm ハンドラーを得る $gperm_handler =& xoops_gethandler( 'groupperm' ) ; // 権限を得る $gm = $gperm_handler->checkRight( 'fischher_global' , 権限の番号(整数) , グループID , モジュールID )
$gm が 1 なら権限あり。0 ならなし。
参考資料 ↑
XOOPS API のリファレンスが読みたい ↑
ここが参考になる
その他 ↑
画像のアップロードを行いたい ↑
通常のPHPの $_FILES を使ってアップロードを行ってもよいが、
画像用のアップロードクラスがあるので使ってみる。
以下は waffle モジュールより抜粋
include_once XOOPS_ROOT_PATH.'/class/uploader.php';
$uploader = new XoopsMediaUploader($updir, array('image/gif',
'image/jpeg',
'image/pjpeg',
'image/x-png',
'image/png'),
$maxsize, $maxx, $maxy);
$uploader->setAllowedExtensions(array('gif', 'jpeg', 'jpg', 'png'));
if ($uploader->fetchMedia($key)) {
$uploader->setPrefix($this->get_mydirname() . '_image_');
if ($uploader->upload()) {
$f = $updir . $uploader->getSavedFileName();
if (preg_match('/\.png$/', $uploader->getSavedFileName())) {
$im = @imagecreatefrompng($f);
} else if (preg_match('/\.gif$/', $uploader->getSavedFileName())) {
$im = @imagecreatefromgif($f);
} else if (preg_match('/\.jpg$/', $uploader->getSavedFileName()) ||
preg_match('/\.jpeg$/', $uploader->getSavedFileName())) {
$im = @imagecreatefromjpeg($f);
}
$x = imagesx($im); // 画像の横ドット数を得る
$y = imagesy($im); // 画像の縦ドット数を得る
$size = filesize($f); // ファイル容量を得る
// ドット数、ファイル容量チェック
if ($maxx < $x) {
$validate->set_error($key, $val['desc'] . ':エラーが発生しました(3)');
} else if ($maxy < $y) {
$validate->set_error($key, $val['desc'] . ':エラーが発生しました(4)');
} else if ($maxsize < $size) {
$validate->set_error($key, $val['desc'] . ':エラーが発生しました(5)');
} else {
$ar = array('path' => $uploader->getSavedFileName(),
'width' => $x,
'height' => $y,
'file_size' => $size
);
$y = $this->get_mydirname() . '_image.yml';
$image = WaffleMAP::new_with_cache($y);
$image->insert($ar);
$post_data[$key] = $xoopsDB->getInsertId();
}
} else {
$validate->set_error($key, $val['desc'] . ':エラーが発生しました(1) ' .
$uploader->getErrors());
}
} else {
$validate->set_error($key, $val['desc'] . ':エラーが発生しました(2)');
}
YAMLを使いたい ↑
準備中
XoopsGTicketとは? ↑
調査中
コメントを使えるようにしたい ↑
準備中
管理画面で設定できるようにしたい(config) ↑
準備中
イベント通知したい(notification_handler) ↑
ここのイベント通知機能を参照。
ハマッたのが、イベント通知はイベントを起こしたユーザには通知されないのを勘違いして通知が来ないと思ったこと。
XoopsThemeFormを使いたい ↑
こんな感じ。調べていけばわかる?
function item_make_form()
{
$form = new XoopsThemeForm(_MD_A_CREATENEWITEM, "itemmakeform",
"item.php", "post");
$form->addElement(new XoopsFormText(_MD_A_ITEMTITLE, "name", 50, 100, ""),
true);
$form->addElement(new XoopsFormText(_MD_A_ITEMORDER, "iorder", 5, 10, "0"),
false);
$button = new XoopsFormElementTray('','');
$button->addElement(new XoopsFormHidden("mode", "item_make"));
$button->addElement(new XoopsFormButton('', 'submit', _MD_A_CREATENEWITEM,
'submit'));
$form->addElement($button);
$form->display();
}
ブロックを作りたい ↑
準備中
XOOPS標準の検索で検索きるようにしたい ↑
xoops_version.php に以下のように追記
$modversion['hasSearch'] = 1; $modversion['search']['file'] = "include/search.inc.php"; $modversion['search']['func'] = "fischher_search";
PHPファイルと関数名を指定する。
function fischher_search($queryarray, $andor, $limit, $offset, $userid)
{
global $xoopsDB;
$sql = "SELECT id, name, description, reg_time, reg_user FROM "
$sql .= $xoopsDB->prefix("fischher_schedule")." WHERE 1 ";
if ( $userid != 0 ) {
$sql .= " AND reg_user=".intval($userid)." ";
}
if ( is_array($queryarray) && $count = count($queryarray) ) {
$sql .= " AND ((name LIKE '%$queryarray[0]%' OR ";
$sql .= "description LIKE '%$queryarray[0]%')";
for($i=1;$i<$count;$i++){
$sql .= " $andor ";
$sql .= "(name LIKE '%$queryarray[$i]%' OR ";
$sql .= "description LIKE '%$queryarray[$i]%')";
}
$sql .= ") ";
}
$sql .= "ORDER BY start_time DESC";
$result = $xoopsDB->query($sql,$limit,$offset);
$ret = array();
$i = 0;
while($myrow = $xoopsDB->fetchArray($result)){
$ret[$i]['link'] = "view.php?sid=".$myrow['id'].""; // リンク先URL
$ret[$i]['title'] = $myrow['name']; // 見出し
$ret[$i]['time'] = $myrow['reg_time']; // 時刻
$ret[$i]['uid'] = $myrow['reg_user']; // 投稿したユーザID
$i++;
}
return $ret;
}
管理画面を追加したい ↑
準備中
メニューにサブメニューを追加したい ↑
モジュールの xoops_version.php に以下を追加
$modversion['sub'][1]['name'] = _MI_FISCHHER_NEW_SCHEDULE; $modversion['sub'][1]['url'] = 'regist.php'; $modversion['sub'][2]['name'] = _MI_FISCHHER_MEETINGROOM_SCHEDULE; $modversion['sub'][2]['url'] = 'meetingroom.php';
バッチ処理プログラム等でXOOPSの設定を読み込みたい ↑
XOOPSの重い初期化プロセスは読まないでDB等の設定だけ読みたい場合、このようにするとよい。
// xoops の common.php は読まない
$xoopsOption['nocommon'] = 1;
require('mainfile.php');
定数のXOOPS_DB_HOST、XOOPS_DB_NAME、XOOPS_DB_USER、
XOOPS_DB_PASS 等がセットされる
ファイルをダウンロードさせたい ↑
XOOPSに限った話じゃないが、以下のようにしてリンク後すぐダウンロードを
実現できる。
$size_file = strlen($s);
header("Content-Type:application/octet-stream; charset=Shift-JIS");
header("Content-Disposition:attachment; filename=download.csv");
header("Content-Transfer-Encoding: binary");
header("Content-Length: $size_file");
header("Pragma: no-cache");
header("Expires: 0");
print $s;
exit();
プログラムの中でサイト名を得る ↑
$sitename = $xoopsConfig['sitename']
小技 ↑
assert() を活用する ↑
XOOPS に限った話じゃないけど assert() の活用はプログラムの信頼性向上に有効。
引数に結果が true になるようにチェックしたい条件を書く。
true の場合はなにもおきない。false の場合は warning が出る。
(Cだけどlinuxカーネルや MySQL、apache、python などなどのソースでも assert() が
活用されている。使い方も参考になる)
assert_options(ASSERT_ACTIVE, 0); とするとチェックを無効にできる。
使い方:
引数のチェック
function foo($bar, $baz)
{
assert(is_numeric($bar));
assert(0 < $bar);
上記は引数チェックを行っている。
$bar が整数以外、または 0 以下だった場合に warning が出る。
// 実際の処理
}
分岐のチェック
if ($baz == 1) {
// なにかする
} else if ($bar == $baz) {
// なにかする
} else {
// 仕様上ありえない分岐。assert を出す。
assert(0);
}
未整理 ↑
更新後のリダイレクト画面を出したい ↑
以下でXOOPSではお馴染みの、メッセージを表示してリダイレクトする画面を表示する。
redirect_header('index.php',5,_US_ACTKEYNOT);
引数:
リダイレクト先
表示する秒数
表示するメッセージ
登録ユーザにメール、もしくはPMを送りたい ↑
register.php より
$xoopsMailer =& getMailer();
$xoopsMailer->setTemplate('register.tpl'); // メール本文のテンプレート
$xoopsMailer->assign('SITENAME', $xoopsConfig['sitename']);
$xoopsMailer->assign('ADMINMAIL', $xoopsConfig['adminmail']);
$xoopsMailer->assign('SITEURL', XOOPS_URL."/");
$xoopsMailer->setToUsers(new XoopsUser($newid));
$xoopsMailer->setFromEmail($xoopsConfig['adminmail']);
$xoopsMailer->setFromName($xoopsConfig['sitename']);
$xoopsMailer->setSubject(sprintf(_US_USERKEYFOR, $uname));
if ( !$xoopsMailer->send() ) {
// 送信成功
} else {
// 送信失敗
}
