モンスターカレンダー

« 2010年11月
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

xoopsで、ログインやマイアカウント、問い合わせページをSSL化。

 ↓このモジュールを使ってみた。

どこでもSSL SSL/非SSL自動切替版 anywhereSSL

 

●不具合が1点。

サイズの大きいページが出力されない。

→内部的に使用している preg_replace の長さ制限にひっかかっていた。

この関数のマニュアルページのコメントを参考に、include/buffering.inc.php を以下のように修正した。

(修正前)

   $buf = preg_replace( $pattern, $replacement, $buf );

(修正後)

     $iSet= 0;  // Count how many times we increase the limit
     while( $iSet< 10 ) {
         $sNewText= preg_replace( $pattern, $replacement, $buf );  // Try to use PREG

         if( preg_last_error()== PREG_BACKTRACK_LIMIT_ERROR ) {  // Only check on backtrack limit failure
             ini_set( 'pcre.backtrack_limit', (int)ini_get( 'pcre.backtrack_limit' )+ 30000 );  // Get current limit and increase
             $iSet++;  // Do not overkill the server
         } else {  // No fail
             $buf = $sNewText;  // On failure $sNewText would be NULL
             break;  // Exit loop
         }
     }

 

●もう1点。表示上の不具合ではないが、SEOでNGなんだそうで。

Cookieに情報を書き込むため、初回アクセス時、同じURLにリダイレクトしている。
この時にステータスが302となるが、検索エンジンでは拾ってくれなくなる。

→ とりあえずリダイレクトを外してみた。運用後1ヶ月弱だが、今のところは不具合はない。

include/precheck.inc.php 下記、一番下、headerをコメント化。

     //*****************************************************************/
     // ログイン処理時のみ、XOOPS_ROOT_PATH/include/checklogin.phpをinclude
     //*****************************************************************/
     if ( ($_SERVER['SCRIPT_FILENAME'] === XOOPS_ROOT_PATH .'/user.php') &&
      ($_SERVER['REQUEST_METHOD'] === 'POST') &&
      (!empty($_POST['op']) && $_POST['op'] === 'login') ) {
      include_once( XOOPS_ROOT_PATH.'/include/checklogin.php' );
      exit;
     }
     //header( "Location: " .$current_url );

 

このモジュール、あまり情報がないようです。使われていないのか...? xoops SSL化のスタンダードってなんだろう。

EC-CUBEで、特定商品を購入時は送料を無料にするロジックを組み込む。

参考:
EC-CUBEで送料無料
[EC- CUBE]商品に送料無料(込)のフラグを設ける

考え方は1番目のサイトの通り。
送料無料対象商品のフラグには、dtb_products の deliv_fee を利用する。(将来拡張予定のフィールドだが、本サイトでは個別送料設定はないだろうと思われるため)
(2番目のサイトは、フラグのフィールドを新たに設けるやり方)

管理画面のテンプレートは1番目のサイトの通りに変更。プログラム変更はナシ。(厳密には必須チェックしなければいけないが今回は見送り)

ソース変更は、1番目サイトのID登録が必要なようなのであきらめ、2番目のサイトのコードを参考に修正する。

●SC_Helper_DB_Ex.php

1.function sfTotalCart(&$objPage, $objCartSess, $arrInfo)

(1)add行追加。

        $objPage->tpl_total_pretax = 0;        // 費用合計(税込み)
        $objPage->tpl_total_tax = 0;        // 消費税合計
        if (USE_POINT === true) {
            $objPage->tpl_total_point = 0;        // ポイント合計
        }
        $objPage->tpl_postage_flag = 0;      // add:送料無料フラグ

(2)del行削除、add行追加。
        // 商品ごとの合計金額
        $objPage->arrProductsClass[$cnt]['total_pretax'] = $objCartSess->getProductTotal($arrInfo, $arrCart[$i]['id']);
               
        // 送料の合計を計算する
        //$objPage->tpl_total_deliv_fee+= ($arrData['deliv_fee'] * $arrCart[$i]['quantity']);  //del
        $objPage->tpl_total_deliv_fee = 0;  //add

        //送料無料フラグを判定する add
        if ($arrData['deliv_fee'] > 0) {    //1:送料込み=送料無料
            $objPage->tpl_postage_flag = 1;
        }

2.function sfTotalConfirm($arrData, &$objPage, &$objCartSess, $arrInfo, $objCustomer = "")

(1)del行削除
        //del
        // 商品ごとの送料が有効の場合
        /*if (OPTION_PRODUCT_DELIV_FEE == 1) {
            $arrData['deliv_fee']+= $objCartSess->getAllProductsDelivFee();
        }*/

(2)add行追加。
        // 送料無料条件が設定されている場合
        if($arrInfo['free_rule'] > 0) {
            // 小計が無料条件を超えている場合
            if($arrData['subtotal'] >= $arrInfo['free_rule']) {
                $arrData['deliv_fee'] = 0;
            }
        }

        //add
        // 送料無料商品が含まれている場合
        if ($objPage->tpl_postage_flag > 0) {
            $arrData['deliv_fee'] = 0;
        }


●ショップ画面
商品詳細画面と一覧画面で、deliv_fee == 1 で判定し、該当する場合は「この商品を購入の際は送料無料」のメッセージを表示する。
(カート画面、トップのオススメ一覧でも対応すればなおよし。今回は対象外)
サイトメンテナンス中は、メンテ中画面を単に表示しているだけだったが、ステータス503を返しておくのがよいとのこと。

メンテナンス中画面を出す正しい作法と.htaccessの書き方

.htaccessに以下のように書けばOK。

ErrorDocument 503 /maintenance.html

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteRule ^.*$ - [R=503,L]
</IfModule>

これは簡単。と適用してみると500エラーになってしまう。
エラーログには「RewriteRule: invalid HTTP response code for flag 'R'」と出ている。
調べてみると「RewriteRuleでR=503を指定するのは2.2系でしか使えない」だそうだ。上述のページのコメント欄に指摘があり、今回対象のサーバは使えないようだ...

メンテナンス画面を表示させる方法(Apache 1.3対応版)

上記の設定でようやくOK。

●503を返す503.phpを作成。
<?php
header ('HTTP/1.0 503 Service Temporarily Unavailable');
include(dirname(__FILE__) . '/index.html');
?>
●.htaccessの設定。

RewriteCond %{REQUEST_URI} !\.css$
RewriteCond %{REQUEST_URI} !\.js$
RewriteCond %{REQUEST_URI} !\.jpg$
RewriteCond %{REQUEST_URI} !\.gif$
RewriteCond %{REQUEST_URI} !\.png$
RewriteCond %{REQUEST_URI} !\.swf$
RewriteCond %{REMOTE_ADDR} !=192.168.0.1 #(管理者のIPアドレス)
RewriteCond %{REQUEST_FILENAME} !503.php
RewriteRule ^.*$ /maintenance/503.php [R,L]

ほんの10分で済む予定が1時間かかってしまいました。。
xoopsのブックマークモジュール「Shiori」を入れたが動かない。
管理メニュー動かすと画面が真っ白。
PHP Fatal error:  Call to undefined function spl_autoload_register()...
この関数はphp5で使えるということで、4からバージョンアップしてみた。しかしやはり動かない。
このモジュールで同様な事例を探すが、特にない。phpinfoでsplも入っているし。

マニュアルでは
「すべての登録済み __autoload 関数を配列で返します。 autoload スタックが有効になっていない場合は、FALSE. が返されます。 関数が何も登録されていない場合は、空の配列が返されます。」
FALSEが返ってきているから、スタックが有効になっていないらしい。有効にするには?と調べるが、なかなかヒットせず...

そんなこんなでトライ&エラーで、ようやく動きました。

        spl_autoload_register('spl_autoload');
        spl_autoload_register(array(__CLASS__, 'autoload'));

1行目を追加することで、スタックが有効になったのか?
システムによってはこれが自動で実行されるようになっているから問題ないのか?
よく分からないが、便利なモジュールなんで動いてよかった。。

どう考えてもメインページなのに、is_home()でfalseが返ってくる。is_archive()がtrue...

テンプレートのあちこちでページタイプを表示させてやっと分かった。

query_post()を使って、あるカテゴリ下の最新記事を取得していたのだが、これ以前ならhome、これ以降はarchiveとなってしまう。

なんじゃそりゃ。

もしやと思い、その後に空の条件でquery_post()を発行したらhomeに戻ってた。

外から使える関数でページタイプ変わってちゃいかんでしょーー! 内部処理ダメダメ。。

WordPress 2.9


(追記2010/4/6)

条件をデフォルトに戻すのは以下になるらしい。

 query_posts($query_string);

query_posts() で指定した条件をクリアする方法

公開されていないグローバル変数を開発に使わなければ実用的にならないシステムっていうのもなんだかな...

MTのカスタムフィールドは便利。でもデータコピーとかがすんなりできなかったり、微妙に好きではないのですが。

とはいえ、便利さが勝って使ってしまう。
テキストフィールドなどは、「システム全体で使う」にしておけば、テスト・本番ブログの2本立てサイトにしている場合、テンプレートコピーの際にまるごとコピーできるので便利です。(ブログごとのカスタムフィールドだと、名称が異なってしまい、タグも異なったりする)

画像のカスタムフィールドでは、システム全体が選べず大変不便でした。
しかしこれを力技で変更することに成功。
・phpMyAdminなどで、mt_fieldテーブルを開く。
・「field_blog_id」が、そのカスタムフィールドが使えるブログIDを示す。これを「ゼロ」にすれば、あら不思議。全体で使えるようになります。

ただし!管理画面から選べないので、当然マニュアルにも記載されていないし、何かの不具合が起きる可能性もあります。ので、このようにする場合は自己責任でお願いします。当方は責任を負いかねます。

しばらく使っている限りでは、記事作成、再構築等では問題なかったです。
ただ、カスタムフィールド自体の更新ができませんでした。名称と説明を変更したかっただけなのですが、なにやら必須項目が指定されていないとエラーがでました。なのでまたDBを開けて、直接修正。

※MT4.2です。5系はどうなっているのか不明。
MTRemoveBlank プラグイン」は、ページ内のタグとタグの間のスペースとタブを削除するプラグイン。便利に使わせていただいております。
これは文末1つだけ改行を残すのですが(ソースとして見やすくするためでしょう)、全ての改行を削除したい場面が出てきました。
なので、1行だけいじらせてもらいました。

RemoveBlankAll

pluginフォルダにuploadするだけです。
使い方は、MTRemoveBlankと同じです。余分なブランク(スペースやタブ)を公開時に削除したいテンプレートやその部分を囲みます。
※ブログ全体に対してタグ指定なしに自動的に削除するプラグインはありましたが、今回はファイルの一部だけでよかったので...

ちなみに、全ての改行を削除したくなったある場面とは、Ajaxを使ったMT内の高速検索で対象となる出力ファイル作成時。改行があるとうまく動いてくれなかった。
これもちょっとjsを改造しようとしているので、また後日記事書こうと思います。
EC-CUBEのテンプレートを修正する時、どんな変数が使えるのか、配列がどんな構造か知りたい。
下記を書けば表示できる。

<!--{php}-->
$arrOrder = $this->get_template_vars('arrOrder');
print_r($arrOrder);
<!--{/php}-->


ごく普通にタグを書いたのに期待通り動かない。
他のブログでは動いている通り書いたのに動かない。
原因はダイナミックパブリッシングだったからでした。staticにしたらちゃんと動いた。
基本のMTのタグなのに、動かないってバグじゃないの?プラグインじゃあるまいし~
対象タグは MTSubCategories で、カテゴリ指定した場合。特定のカテゴリだけNG。機能するカテゴリもあるところがまたはまりポイントでした。がっかり。

とあるディレクトリ以下のファイルへアクセスする際、ログインさせたい。
ディレクトリ以下が静的なページなら、PHPで認証後そのページを読み込んで表示させる方法がある。
あるいは拡張子phpにしておいて、先頭で認証ロジック呼ぶ。
が、ファイルにはPDFもあるという。
となると、思いつくのはBasic認証しかなく(いろいろ調べたけれど、他にはなかった)。

簡単に使うには .htaccess にBasic認証の記述をし、別途ユーザ(パスワード)ファイルを置く。
今回、ユーザIDとパスワードのほかにも氏名等の情報も保持したいので、会員登録の要求があった場合、ユーザファイルに書き込む&DBにもその他情報を書き込む、の2本立てかと思っていたのだが、調べるとBasic認証のユーザ情報をPostgreSQLに保持できる方法があった。
Apacheのモジュールで「mod_auth_pgsql」というもの。

http://www.giuseppetanzilli.it/mod_auth_pgsql/
ローカルはApache2だったのでそれ用のtarを落としてきて解凍。インストールはDSOで、INSTALLに書いてあるそのままの手順でOKだった。

DBにはユーザテーブルを作っておく。(最低IDとパスワード)
そして認証をかけたいディレクトリに.htaccessをおき(httpd.confに書いてもいい)、
mod_auth_pgsql用の定義を書く。

AuthName "My PostgreSQL Authenticator"
AuthType basic
Auth_PG_host localhost
Auth_PG_port 5432
Auth_PG_user postgres
Auth_PG_database www
Auth_PG_pwd_table valid_users
Auth_PG_uid_field user
Auth_PG_pwd_field password
<LIMIT GET POST>
require valid-user
</LIMIT>

まだ試していないが、ログ用のテーブルを作ればログもとれるし、一度認証が通った後にDBアクセスさせたくなければ Auth_PG_cache_passwords を On にすればいいそうだ。
簡単に動いてかなり嬉しかった..

ただ、Basic認証なので(厳密な)ログアウトはできなくて「ブラウザをすべて閉じる」しかないのは欠点。これは仕方ない...