xoops Criteria
xoops Criteria (条件)
Criteria クラスは 条件式クラスです。
具体的には、SQL文の WHERE句を作るクラスです。
ソース
function Criteria($column, $value='', $operator='=', $prefix = '', $function = '') {
$this->prefix = $prefix;
$this->function = $function;
$this->column = $column;
$this->value = $value;
$this->operator = $operator;
}
function render() {
$value = $this->value;
if (!in_array(strtoupper($this->operator), array('IN', 'NOT IN'))) {
$value = "'".$value."'";
}
$clause = (!empty($this->prefix) ? "{$this->prefix}." : "") . $this->column;
if ( !empty($this->function) ) {
$clause = sprintf($this->function, $clause);
}
$clause .= " {$this->operator} $value";
return $clause;
}
function renderWhere() {
$cond = $this->render();
return empty($cond) ? '' : "WHERE $cond";
}
}
なぞぃ関数
strtoupper すべて大文字に
in_array 第二引数の中に、第一引数の値があるか
流れ
結論からいうと、criteriaクラス WHERE column $operator '$value'
ができます。
というか、これだけですγ(▽´ )ツヾ( `▽)ゞ
ただ、function Criteria($column, $value='', $operator='=', $prefix = '', $function = '')
この関数の引数をみてわかるように、 $prefix $function がある場合は、少し変わります。
さぁどのようになるのでしょうか('-^*)/
XOOPS xoopTpl xoopsform 連結 render
XOOPS xoopTpl xoopsform 連結 render
xoopsモジュール内で、xoopsTpl(テンプレート)を使ってxoopsformを表示する方法を説明します。
コード
$xoopsTpl->assign('sample','form=>$form->render()');
以上です。
とっても簡単です。'sample'に入っている変数を調べる場合は、print_rをテンプレート上で行ってもいいですが、tplのデバックモードをすれば、簡単にわかります。
ただ、難点は自分がしらべたところ、モジュール内でxoopsformをxoopsTplに入れて表示することに使っているのをほとんど、見つけられませんでした(探すのが下手なだけ。(´д`lll)だったらいいけど )
render()
というメソッドは、XoopsFormElementの抽象メソッドです。
This method is abstract and must be overwritten by the child classes.
* @abstract
サブクラスでオーバライド(上書きして)使ってます。
たとえば、 formtext.php
function render(){
return "<input type='text' name='".$this->getName()."' id='".$this->getName()."' size='".$this->getSize()."' maxlength='".$this->getMaxlength()."' value='".$this->getValue()."'".$this->getExtra()." />";
}
つまり、render() は表示するためのものを作っているんですね。
そのため、
echo $form->render();
というソースをよく見かけたわけです。
display()
との違いを考察していきたいところですが、また次回に持ち越そうと思います:*:・( ̄∀ ̄)・:*:
XOOPS token 3
XOOPS token
具体的な使い方を本当に説明します。
ソース
".$xoopsGTicket->getTicketHtml( __LINE__ , 1800 , 'myblocksadmin' )." //$timeout=1800秒
if( ! empty( $_POST['submit'] ) ) {
if ( ! $xoopsGTicket->check( true , 'myblocksadmin' ) ) { //第一引数 true はPOSTであるから。
redirect_header(XOOPS_URL.'/',3,$xoopsGTicket->getErrors());
}
流れ
説明しなくても、わかると思います。 便利ですね。
これを使えば荒らしにあうことも減るはずです(;´▽`A``
xoops token 2
xoops token 具体的な使い方
tokenのクラスについては、前に説明しました。
色々なモジュールを見ていると、include/gtickets.phpのtokenがフォームの確認でよく使われています。
これは、前説明した機能にプラス、
// area as module's dirname
if( ! $area && is_object( @$xoopsModule ) ) {
$area = $xoopsModule->getVar('dirname') ;
}
$_SESSION['XOOPS_G_STUBS'][] = array(
'expire' => time() + $timeout ,
'referer' => $referer ,
'area' => $area ,
'token' => $token
) ;
$area の要素が追加されています。
これは、見ての通り、モジュールのディレクトリー名が入ります。
これにより、他のモジュールないから不正にアクセスされることを防ぎます。
(多分、モジュール内に脆弱性の抱えたプログラムがあり、それを使い他のモジュールを攻めることを防ぐためのものだと思います。(・∀・))
あと、ちょっとしたことなんですが、
// record referer if browser send it
$referer = empty( $_SERVER['HTTP_REFERER'] ) ? '' : $_SERVER['REQUEST_URI'] ;
$_SERVER['HTTP_REFERER']が入ってるとき、$_SERVER['REQUEST_URI'] を$refererに代入するというのが、
最初に見たときしっくりいきませんでした。
だって、$refererって参照の変数って意味でつけたんでしょ。それなのに、REQUEST_URI ってヾ(。`Д´。)ノ
('HTTP_REFERER'は、前に参照していたページのURL,'REQUEST_URI 、このページをリクエストしたURI)
しかし、このソースに答えがありました。
if( ! empty( $found_stub['referer'] ) && strstr( @$_SERVER['HTTP_REFERER'] , $found_stub['referer'] ) ) $referer_check = true ;
前にも出てきた、strstrによって、前参照していたページのURLと、セッションに格納していたものが、一致??する場合、TRUEみたいなことが、したいので$refererにしたんですね。(多分??)
最後に strstrで調べてる意味について考察したいと思います( ̄∩ ̄#
確か、クエリとかの問題だとおもうんですが。。。
調べてみます。
また、$_SERVER['HTTP_REFERER']は、偽造が簡単にできるので気をつけましょう。
Referer Check xoops
Xoops Refere Check
Refere は、前回参照していたページのことです。 もう少し柔らかくいうと、飛んできたリンクのあったURL
$_SERVER['HTTP_REFERER']でGETできます。
ソース
function admin_refcheck($chkref = "") {
if( empty( $_SERVER['HTTP_REFERER'] ) ) {
return true ;
} else {
$ref = $_SERVER['HTTP_REFERER'];
}
$cr = XOOPS_URL;
if ( $chkref != "" ) { $cr .= $chkref; }
if ( strpos($ref, $cr) !== 0 ) { return false; }
return true;
}
なぞぃ関数
strpos -- 文字列が最初に現れる場所を見つける.
第一引数には対象の文字列を、第二引数には出現位置を検索する文字列を指定する。
流れ
今回はstrposで、$refがXOOPS_URLから始まっているか確認してます。
(自分のホームページのリンクからきた場合は、XOOPS_URLから始まるからです。)