*Smarty [#c63da8dc] RIGHT:更新日 &lastmod(); **Smartyのインストール [#t1ff2142] ロジックを作成する作業と、HTMLデザインを編集する作業を分担して行うことが可能になるPHPのテンプレートエンジンとしてSmartyがある。 http://www.smarty.net/download.phpからダウンロード。 ***設定 [#uc04dee8] $ cd /usr/local/src $ tar zxvf Smarty-2.6.19.tar.gz $ cd /usr/local/src $ cd /usr/local $ su # mv src/Smarty-2.6.19 . # exit $ cd ホームディレクトリに作成するテンプレートを入れるフォルダsmatry_testを作成しディレクトリ構造を作成する(cache/ configs/ templates/ templates_c/を作成) $ mkdir smatry_test $ cd smatry_test $ mkdir cache $ mkdir configs $ mkdir templates $ mkdir templates_c $ su # chown -R apache.apache cache # chown -R apache.apache templates_c Smartyでwebアクセスする場所をsmarty_testとするため # mkdir /var/www/html/smarty_test ''設定ファイル'' Smartyの環境を呼び出すのに必要 /var/www/html/smarty_test/init.php <?php // Linux スタイル (大文字の 'S' に注意) define('SMARTY_DIR', '/usr/local/Smarty-2.6.19/libs/'); <==Smartyの展開ディレクトリ require_once(SMARTY_DIR . 'Smarty.class.php'); $smarty = new Smarty(); // テンプレート、キャシュ等のディレクトリを指定。 $smarty->template_dir = '/home/okada/smatry_test/templates/'; $smarty->compile_dir = '/home/okada/smatry_test/templates_c/'; $smarty->config_dir = '/home/okada/smatry_test/configs/'; $smarty->cache_dir = '/home/okada/smatry_test/cache/'; ?> /var/www/html/smarty_test/test.phpにアクセスページ(testページ)を指定 <?php require_once("/var/www/html/smarty_test/init.php"); $smarty->assign('name','JE2ISM'); $smarty->assign('name2','JF2LYU'); //** 次の行のコメントをはずすと、デバッギングコンソールを表示します //$smarty->debugging = true; $smarty->display('index.tpl'); $smarty->display('index2.tpl'); ?> ''/home/okada/smatry_test/templates/index.tpl'' {* Smarty *} こんにちは、{$name}。ようこそ Smarty へ! ''/home/okada/smatry_test/templates/index2.tpl'' {* Smarty *} <p> こんにちは、{$name2}。<Br> ようこそ Smarty へ!<Br> ''アクセス'' http://(サーバ)/smarty_test/test.php ''結果'' こんにちは、JE2ISM。ようこそ Smarty へ! こんにちは、JF2LYU。 ようこそ Smarty へ! **EC CUBEの複数の店のユーザを単一管理 [#g797abf6] DBからテーブルをエクスポートしてそれを別テーブルにインポート。新規の場合は同じユニークキーがあるレコードはスキップし、新規レコードをインポートする。修正時は修正レコードupdate_dateフィールのの一番新しいレコードを変更レコードと判断し(このあたりが臭いが)そのレコードをから変更前のpointを抽出したあと上書きし、その後、先の抽出したpointを書き戻す ある時は上書きする。 ''tbsync_new.php''(新規登録)~ <?php $cmd = "/usr/bin/mysql -B --skip-column-names -u ism \--password=ism -D eccube_ism -e 'select * from dtb_customer;' -h 192.168.30.16"; exec($cmd, $output); $fp=fopen("/home/okada/temp/dtb_customer.txt","w"); // fputs(implode("\n",$output) . "\n",$fp); foreach ($output as $a){ // NULL文字は\Nとしてインポートの必要あり $a = ereg_replace("NULL", "\N", $a); fputs($fp,$a."\n"); } fclose($fp); // print_r($output); // echo "<BR>\n"; // $a = implode("\n",$output) . "\n"; // echo "$a <BR>\n"; $cmd ="/usr/bin/mysqlimport --local eccube_ism2 /home/okada/temp/dtb_customer.txt \ -u ism --password=ism --ignore -h 192.168.30.16"; exec($cmd); ?> html/entry/complete.phpの最後の行に require_once("/home/okada/temp/tbsync.php"); を追加 ''tbsync_c.php''(登録削除を含むレコードコピー)~ <?php // データ削除時に他のDBのレコードの書き換え(レコード全体) // 元DBのデータ最終変更レコードのcustomer_idを抽出 $cmd = "/usr/bin/mysql -B --skip-column-names -u ism --password=ism \ -D eccube_ism -e 'select customer_id from dtb_customer where \ update_date=(select max(update_date) from dtb_customer);' -h 192.168.30.16"; exec($cmd, $id); // echo "ID $id[0] \n"; // 元DBのデータ先のcustomer_idのレコードを抽出してTextファイルに書き込み $cmd = "/usr/bin/mysql -B --skip-column-names -u ism --password=ism \ -D eccube_ism -e 'select * from dtb_customer where customer_id =" . $id[0] . ";' -h 192.168.30.16"; exec($cmd, $output); // echo "$cmd <br>"; $fp=fopen("/home/okada/temp/dtb_customer.txt","w"); foreach ($output as $a){ // NULL文字は\Nとしてインポートの必要あり $a = ereg_replace("NULL", "\N", $a); fputs($fp,$a."\n"); } fclose($fp); // 元データの先のTextファイルを変更先DBにインポート $cmd ="/usr/bin/mysqlimport --local eccube_ism2 /home/okada/temp/dtb_customer.txt \ -u ism --password=ism -r -h 192.168.30.16"; exec($cmd); ?> html/mypage/refusal_complete.php最後の行に require_once("/home/okada/temp/tbsync_d.php"); を追加 ''tbsync_r.php''(登録変更時のコピーただしpointはコピーされない)~ <?php // データ修正時にpointを変更さいないようにする。 // 元DBのデータ最終変更レコードのcustomer_idを抽出 $cmd = "/usr/bin/mysql -B --skip-column-names -u ism --password=ism \ -D eccube_ism -e 'select customer_id from dtb_customer where \ update_date=(select max(update_date) from dtb_customer);' -h 192.168.30.16"; exec($cmd, $id); // echo "ID $id[0] \n"; // 変更先DBの先のcustomer_idのpointを抽出 (1) $cmd = "/usr/bin/mysql -B --skip-column-names -u ism --password=ism \ -D eccube_ism2 -e 'select point from dtb_customer where \ customer_id =" . $id[0] .";' -h 192.168.30.16"; exec($cmd, $point); // echo "Henkousaki Point $point[0] <Br>\n"; // 元DBのデータ先のcustomer_idのレコードを抽出してTextファイルに書き込み $cmd = "/usr/bin/mysql -B --skip-column-names -u ism --password=ism \ -D eccube_ism -e 'select * from dtb_customer where \ customer_id =" . $id[0] . ";' -h 192.168.30.16"; exec($cmd, $output); // echo "$cmd <br>"; $fp=fopen("/home/okada/temp/dtb_customer.txt","w"); foreach ($output as $a){ // NULL文字は\Nとしてインポートの必要あり $a = ereg_replace("NULL", "\N", $a); fputs($fp,$a."\n"); } fclose($fp); // 元データの先のTextファイルを変更先DBにインポート $cmd ="/usr/bin/mysqlimport --local eccube_ism2 /home/okada/temp/dtb_customer.txt \ -u ism --password=ism -r -h 192.168.30.16"; exec($cmd); // 変更先DBのポイントを(1)で抽出したデータに書き換えて変更されないようにする。 $cmd ="/usr/bin/mysql -B --skip-column-names -u ism --password=ism \ -D eccube_ism2 -e 'update dtb_customer set point=" . $point[0] . " \ where customer_id=" . $id[0] . ";' -h 192.168.30.16"; exec($cmd); // echo "$cmd \n"; ?> html/mypage/change_complete.php最後の行に require_once("/home/okada/temp/tbsync_r.php"); を追加 ***Topの左上ヘッダーのロゴ画像をクリックしたとき指定URLへ移動 [#nabc637d] 指定URL http://www2.data-map.net/~okada/shop_top.html # cd shop/data/Smarty/templates/default # cp header.tpl header2.tpl ''header2.tpl'' <!--▼HEADER--> <div id="header"> <h1> <a href="http://www2.data-map.net/~okada/shop_top.html"> <==ここを変更 <em><!--{$arrSiteInfo.shop_name|escape}-->/<!--{$tpl_title|escape}--></em> </a> </h1> <div id="information"> ''data/class/SC_View.php'' 103行あたりに追加 // ヘッダとフッタを割り当て $header_tpl = USER_PATH . USER_PACKAGE_DIR . TEMPLATE_NAME . "/" . "header.tpl"; $footer_tpl = USER_PATH . USER_PACKAGE_DIR . TEMPLATE_NAME . "/" . "footer.tpl"; // ユーザー作成のテンプレートが無ければ, 指定テンプレートを割り当て if (!$this->_smarty->template_exists($header_tpl)) { // Edit By JE2ISM // if(ereg("/mypage/login.php", $_SERVER['REQUEST_URI'] ) || ereg("/entry/kiyaku.php", $_SERVER['REQUEST_URI'] ) || ereg("/entry/index.php",\ $_SERVER['REQUEST_URI'] ) || ereg("/entry/complete.php", $_SERVER['REQUEST_URI']) || ereg("/mypage/index.php", $_SERVER['REQUEST_URI'])){ if(ereg("/html/$", $_SERVER['REQUEST_URI'] || ereg("/html/\? transactionid=", $_SERVER['REQUEST_URI'] ))){ $header_tpl = TEMPLATE_DIR . "header2.tpl"; }else{ $header_tpl = TEMPLATE_DIR . "header.tpl"; } } if (!$this->_smarty->template_exists($footer_tpl)) { $footer_tpl = TEMPLATE_DIR . "footer.tpl"; } ***管理画面の顧客管理 [#v4e063bd] ''変更について'' data/class/pages/admin/customer/LC_Page_Admin_Customer_Edit.php 197行ぐらいに追加 } //-- 編集登録 $objDb->sfEditCustomerData($this->arrForm, $arrRegistColumn); // 更新時にテーブルを同期させる(Edit By JE2ISM) require_once("/home/okada/temp/tbsync_r.php"); <==追加 } } } //---- ページ表示 $objView->assignobj($this); $objView->display(MAIN_FRAME); ''削除について'' data/class/pages/admin/customer/LC_Page_Admin_Customer.php 211行あたりに追加 // 顧客削除 if ($_POST['mode'] == "delete") { $sql = "SELECT status,email FROM dtb_customer WHERE customer_id = ? AND del_flg = 0"; $result_customer = $objQuery->conn->getAll($sql, array($_POST["edit_customer_id"])); if ($result_customer[0]["status"] == 2) { //本会員削除 $arrDel = array("del_flg" => 1, "update_date" => "NOW()"); $objQuery->conn->autoExecute("dtb_customer", $arrDel, "customer_id = " . SC_Utils_Ex::sfQuoteSmart($_POST["edit_customer_id"]) ); } elseif ($result_customer[0]["status"] == 1) { //仮会員削除 $sql = "DELETE FROM dtb_customer WHERE customer_id = ?"; $objQuery->conn->query($sql, array($_POST["edit_customer_id"])); } // 削除時にテーブルを同期させる(Edit by JE2ISM) require_once("/home/okada/temp/tbsync_c.php"); <==追加 } &color(red){''以下のように管理者画面での変更、削除Smartyコンパイル後のファイルを変更してもよいが美しくないし、再コンパイルされると書き直す必要がある''}; ''Smartyのコンパイル後を変更'' 顧客管理で内容変更を行ったときtbsync.phpを実行させるにはSmartyのテンプレート上に記入するとよいのでテンプレートでphp実行できるように~ data/module/Smarty/libs/Smarty.class.phpを * @var integer */ /* var $php_handling = SMARTY_PHP_PASSTHRU;*/ var $php_handling = SMARTY_PHP_ALLOW; <==変更 * @var array */ var $security_settings = array( /* 'PHP_HANDLING' => false, */ 'PHP_HANDLING' => true, <==変更 'IF_FUNCS' => array('array', 'list', 'isset', 'empty', 'count', 'sizeof', 'in_array', 'is_array', 'true', 'false', 'null'), 'INCLUDE_ANY' => false, /* 'PHP_TAGS' => false, */ 'PHP_TAGS' => true, <==変更 'MODIFIER_FUNCS' => array('count'), 'ALLOW_CONSTANTS' => false ); のように変更する 本来はdata/Smarty/templates_c/default/admin/edit_complete.tplに記載すればよいがデリミターが<!--{ }-->とdata/module/Smarty/libs/Smarty.class.phpに定義されいるため、<!--{php}-->がコメントになってしまうようなので、コンパイル済の~ data/Smarty/templates_c/default/admin/%%38^380^3807D3B7%%edit_complete.tpl.phpに </form> </table> <!-- 以下を追加 --> <?php require_once("/home/okada/temp/tbsync.php"); ?> <!--★★メインコンテンツ★★--> これはコンパイル澄みなためdata/Smarty/templates_c/default/admin/edit_complete.tplを変更した場合は追加しなおす必要あり。 ''削除について'' data/Smarty/templates_c/default/admin/%%18^185^1850FD4F%%index.tpl.php function fnDelete(customer_id) { if (confirm('この顧客情報を削除しても宜しいですか?')) { document.form1.mode.value = "delete" document.form1['edit_customer_id'].value = customer_id; document.form1.submit(); <?php -| require_once("/home/okada/temp/tbsync.php"); |<==追加 ?> -| return false; } } &color(red){%%にすると%%abc%%のように取り消しになるので、数値参照文字&#x(文字コード);にするとよい};