ログイン |  新規登録
メインメニュー
広告
リンク
テーマ選択

(6 テーマ)

Counter: 4492, today: 2, yesterday: 2

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 {
    // 送信失敗
}