Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[fix] refs #113 dtb_baseinfo のキャッシュが不完全 #385

Merged
merged 7 commits into from
Jan 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions data/Smarty/templates/admin/basis/point.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

<form name="point_form" id="point_form" method="post" action="">
<input type="hidden" name="<!--{$smarty.const.TRANSACTION_ID_NAME}-->" value="<!--{$transactionid}-->" />
<input type="hidden" name="mode" value="<!--{$tpl_mode|h}-->" />
<input type="hidden" name="mode" value="" />
<div id="basis" class="contents-main">
<table>
<tr>
Expand All @@ -51,7 +51,7 @@

<div class="btn-area">
<ul>
<li><a class="btn-action" href="javascript:;" onclick="eccube.fnFormModeSubmit('point_form', '<!--{$tpl_mode|h}-->', '', ''); return false;"><span class="btn-next">この内容で登録する</span></a></li>
<li><a class="btn-action" href="javascript:;" onclick="eccube.fnFormModeSubmit('point_form', 'update', '', ''); return false;"><span class="btn-next">この内容で登録する</span></a></li>
</ul>
</div>
</div>
Expand Down
4 changes: 2 additions & 2 deletions data/Smarty/templates/admin/basis/tradelaw.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

<form name="form1" id="form1" method="post" action="">
<input type="hidden" name="<!--{$smarty.const.TRANSACTION_ID_NAME}-->" value="<!--{$transactionid}-->" />
<input type="hidden" name="mode" value="<!--{$tpl_mode|h}-->" />
<input type="hidden" name="mode" value="" />
<div id="basis" class="contents-main">
<table class="form">
<tr>
Expand Down Expand Up @@ -197,7 +197,7 @@

<div class="btn-area">
<ul>
<li><a class="btn-action" href="javascript:;" onclick="eccube.fnFormModeSubmit('form1', '<!--{$tpl_mode|h}-->', '', ''); return false;"><span class="btn-next">この内容で登録する</span></a></li>
<li><a class="btn-action" href="javascript:;" onclick="eccube.fnFormModeSubmit('form1', 'update', '', ''); return false;"><span class="btn-next">この内容で登録する</span></a></li>
</ul>
</div>
</div>
Expand Down
93 changes: 69 additions & 24 deletions data/class/helper/SC_Helper_DB.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
*/
class SC_Helper_DB
{
const BASIS_DATA_CACHE_REALFILE = MASTER_DATA_REALDIR . 'dtb_baseinfo.serial';

/** ルートカテゴリ取得フラグ */
public $g_root_on;

Expand Down Expand Up @@ -121,20 +123,32 @@
/**
* 店舗基本情報を取得する.
*
* 引数 $force が false の場合は, 初回のみ DB 接続し,
* 2回目以降はキャッシュされた結果を使用する.
* 引数 $force が false の場合は, キャッシュされた結果を使用する.
*
* @param boolean $force 強制的にDB取得するか
* @param boolean $force キャッシュファイルを生成し、ローカルキャッシュを削除するか
* @return array 店舗基本情報の配列
*/
public static function sfGetBasisData($force = false)
{
static $arrData = null;

if ($force || is_null($arrData)) {
$objQuery = SC_Query_Ex::getSingletonInstance();
// キャッシュファイルが存在しない場合、キャッシュファイルを生成する
if (!$force && !file_exists(SC_Helper_DB_Ex::BASIS_DATA_CACHE_REALFILE)) {
$force = true;
}

$arrData = $objQuery->getRow('*', 'dtb_baseinfo');
if ($force) {
// キャッシュファイルを生成
$success = SC_Helper_DB_Ex::sfCreateBasisDataCache();

// ローカルキャッシュを削除
$arrData = null;
}

// ローカルキャッシュが無い場合、キャッシュファイルを読み込む
if (is_null($arrData)) {
// キャッシュデータファイルを読み込む
$arrData = SC_Helper_DB_Ex::getBasisDataFromCacheFile();

Check failure on line 151 in data/class/helper/SC_Helper_DB.php

View workflow job for this annotation

GitHub Actions / PHPStan

Static call to instance method SC_Helper_DB::getBasisDataFromCacheFile().
}

return $arrData;
Expand All @@ -143,29 +157,61 @@
/**
* 基本情報のキャッシュデータを取得する
*
* エラー画面表示で直接呼ばれる。キャッシュファイルが存在しなくとも空の配列を応答することで、(幾らかの情報欠落などはあるかもしれないが) エラー画面の表示できるよう考慮している。
* @param boolean $generate キャッシュファイルが無い時、DBのデータを基にキャッシュを生成するか
* @return array 店舗基本情報の配列
* @deprecated 2.17.1 本体で使用されていないため非推奨
*/
public static function sfGetBasisDataCache($generate = false)
{
// テーブル名
$name = 'dtb_baseinfo';
// キャッシュファイルパス
$filepath = MASTER_DATA_REALDIR . $name . '.serial';
$cacheData = [];

// ファイル存在確認
if (!file_exists($filepath) && $generate) {
if (!file_exists(SC_Helper_DB_Ex::BASIS_DATA_CACHE_REALFILE) && $generate) {
// 存在していなければキャッシュ生成
static::sfCreateBasisDataCache();
}
// 戻り値初期化
$cacheData = array();
// キャッシュファイルが存在すれば読み込む
if (file_exists($filepath)) {

$cacheData = SC_Helper_DB_Ex::getBasisDataFromCacheFile(true);

Check failure on line 175 in data/class/helper/SC_Helper_DB.php

View workflow job for this annotation

GitHub Actions / PHPStan

Static call to instance method SC_Helper_DB::getBasisDataFromCacheFile().

return $cacheData;
}

/**
* 基本情報のキャッシュデータを取得する
*
* エラー画面表示で直接呼ばれる。キャッシュファイルが存在しなくとも空の配列を応答することで、(幾らかの情報欠落などはあるかもしれないが) エラー画面の表示できるよう考慮している。
* @param boolean $ignore_error エラーを無視するか
* @return array 店舗基本情報の配列
*/
public function getBasisDataFromCacheFile($ignore_error = false)
{
$arrReturn = [];

// ファイル存在確認
if (file_exists(SC_Helper_DB_Ex::BASIS_DATA_CACHE_REALFILE)) {
// キャッシュデータファイルを読み込みアンシリアライズした配列を取得
$cacheData = unserialize(file_get_contents($filepath));
$arrReturn = unserialize(file_get_contents(SC_Helper_DB_Ex::BASIS_DATA_CACHE_REALFILE));
}
// return
return $cacheData;
elseif (!$ignore_error) {
throw new Exception('基本情報のキャッシュデータファイルが存在しません。');
}

return $arrReturn;
}

/**
* 店舗基本情報をDBから取得する.
*
* @return array 店舗基本情報の配列
*/
public function getBasisDataFromDB()
{
$objQuery = SC_Query_Ex::getSingletonInstance();

$arrReturn = $objQuery->getRow('*', 'dtb_baseinfo');

return $arrReturn;
}

/**
Expand All @@ -181,16 +227,12 @@
*/
public static function sfCreateBasisDataCache()
{
// テーブル名
$name = 'dtb_baseinfo';
// キャッシュファイルパス
$filepath = MASTER_DATA_REALDIR . $name . '.serial';
// データ取得
$arrData = static::sfGetBasisData(true);
$arrData = static::getBasisDataFromDB(true);

Check failure on line 231 in data/class/helper/SC_Helper_DB.php

View workflow job for this annotation

GitHub Actions / PHPStan

Method SC_Helper_DB::getBasisDataFromDB() invoked with 1 parameter, 0 required.

Check failure on line 231 in data/class/helper/SC_Helper_DB.php

View workflow job for this annotation

GitHub Actions / PHPStan

Static call to instance method SC_Helper_DB::getBasisDataFromDB().
// シリアライズ
$data = serialize($arrData);
// ファイルを書き出しモードで開く
$handle = fopen($filepath, 'w');
$handle = fopen(SC_Helper_DB_Ex::BASIS_DATA_CACHE_REALFILE, 'w');
if (!$handle) {
// ファイル生成失敗
return false;
Expand Down Expand Up @@ -1650,6 +1692,9 @@
$objQuery->insert('dtb_baseinfo', $arrData);
GC_Utils_Ex::gfPrintLog('dtb_baseinfo に INSERT を実行しました。');
}

// キャッシュデータファイルを生成する
SC_Helper_DB_Ex::sfCreateBasisDataCache();
}

/**
Expand Down
4 changes: 1 addition & 3 deletions data/class/pages/admin/basis/LC_Page_Admin_Basis.php
Original file line number Diff line number Diff line change
Expand Up @@ -105,12 +105,10 @@ public function action()
$arrData = $objFormParam->getDbArray();
SC_Helper_DB_Ex::registerBasisData($arrData);

// キャッシュファイル更新
$objDb->sfCreateBasisDataCache();
$this->tpl_onload .= "window.alert('SHOPマスターの登録が完了しました。');";
// breakはつけない
default:
$arrRet = $objDb->sfGetBasisData(true);
$arrRet = $objDb->getBasisDataFromDB();
$objFormParam->setParam($arrRet);
$this->arrForm = $objFormParam->getHashArray();
$this->arrForm['regular_holiday_ids'] = explode('|', $this->arrForm['regular_holiday_ids']);
Expand Down
38 changes: 14 additions & 24 deletions data/class/pages/admin/basis/LC_Page_Admin_Basis_Point.php
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,7 @@ public function action()
// POST値の取得
$objFormParam->setParam($_POST);

if ($objDb->sfGetBasisExists()) {
$this->tpl_mode = 'update';
} else {
$this->tpl_mode = 'insert';
}
$this->tpl_mode = 'update'; // 旧バージョンテンプレート互換

if (!empty($_POST)) {
// 入力値の変換
Expand All @@ -86,16 +82,15 @@ public function action()
if (count($this->arrErr) == 0) {
switch ($this->getMode()) {
case 'update':
$this->lfUpdateData($objFormParam->getHashArray()); // 既存編集
break;
case 'insert':
$this->lfInsertData($objFormParam->getHashArray()); // 新規作成
SC_Helper_DB_Ex::registerBasisData($objFormParam->getHashArray());

// 再表示
$this->tpl_onload = "window.alert('ポイント設定が完了しました。');";

break;
default:
break;
}
// 再表示
$this->tpl_onload = "window.alert('ポイント設定が完了しました。');";
}
} else {
$arrRet = $objDb->sfGetBasisData();
Expand All @@ -115,24 +110,19 @@ public function lfInitParam(&$objFormParam)
$objFormParam->addParam('会員登録時付与ポイント', 'welcome_point', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
}

/**
* @deprecated SC_Helper_DB_Ex::registerBasisData() を使う。
*/
public function lfUpdateData($post)
{
// 入力データを渡す。
$sqlval = $post;
$sqlval['update_date'] = 'CURRENT_TIMESTAMP';
$objQuery = SC_Query_Ex::getSingletonInstance();
// UPDATEの実行
$objQuery->update('dtb_baseinfo', $sqlval);
SC_Helper_DB_Ex::registerBasisData($post);
}

/**
* @deprecated SC_Helper_DB_Ex::registerBasisData() を使う。
*/
public function lfInsertData($post)
{
// 入力データを渡す。
$sqlval = $post;
$sqlval['id'] = 1;
$sqlval['update_date'] = 'CURRENT_TIMESTAMP';
$objQuery = SC_Query_Ex::getSingletonInstance();
// INSERTの実行
$objQuery->insert('dtb_baseinfo', $sqlval);
SC_Helper_DB_Ex::registerBasisData($post);
}
}
33 changes: 14 additions & 19 deletions data/class/pages/admin/basis/LC_Page_Admin_Basis_Tradelaw.php
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,7 @@ public function action()
$this->lfInitParam($objFormParam);
$objFormParam->setParam($_POST);

if ($objDb->sfGetBasisExists()) {
$this->tpl_mode = 'update';
} else {
$this->tpl_mode = 'insert';
}
$this->tpl_mode = 'update'; // 旧バージョンテンプレート互換

if (!empty($_POST)) {
// 入力値の変換
Expand All @@ -87,16 +83,15 @@ public function action()
if (count($this->arrErr) == 0) {
switch ($this->getMode()) {
case 'update':
$this->lfUpdateData($objFormParam->getHashArray()); // 既存編集
break;
case 'insert':
$this->lfInsertData($objFormParam->getHashArray()); // 新規作成
SC_Helper_DB_Ex::registerBasisData($objFormParam->getHashArray());

// 再表示
$this->tpl_onload = "window.alert('特定商取引法の登録が完了しました。');";

break;
default:
break;
}
// 再表示
$this->tpl_onload = "window.alert('特定商取引法の登録が完了しました。');";
}
} else {
$arrRet = $objDb->sfGetBasisData();
Expand Down Expand Up @@ -135,20 +130,20 @@ public function lfInitParam(&$objFormParam)
$objFormParam->addParam('返品・交換について', 'law_term06', MLTEXT_LEN, 'KVa', array('EXIST_CHECK', 'MAX_LENGTH_CHECK'));
}

/**
* @deprecated SC_Helper_DB_Ex::registerBasisData() を使う。
*/
public function lfUpdateData($sqlval)
{
$sqlval['update_date'] = 'CURRENT_TIMESTAMP';
$objQuery = SC_Query_Ex::getSingletonInstance();
// UPDATEの実行
$objQuery->update('dtb_baseinfo', $sqlval);
SC_Helper_DB_Ex::registerBasisData($sqlval);
}

/**
* @deprecated SC_Helper_DB_Ex::registerBasisData() を使う。
*/
public function lfInsertData($sqlval)
{
$sqlval['update_date'] = 'CURRENT_TIMESTAMP';
$objQuery = SC_Query_Ex::getSingletonInstance();
// INSERTの実行
$objQuery->insert('dtb_baseinfo', $sqlval);
SC_Helper_DB_Ex::registerBasisData($sqlval);
}

/* 入力内容のチェック */
Expand Down
2 changes: 1 addition & 1 deletion data/class/pages/error/LC_Page_Error.php
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@
}

// キャッシュから店舗情報取得(DBへの接続は行わない)
$this->arrSiteInfo = SC_Helper_DB_Ex::sfGetBasisDataCache(false);
$this->arrSiteInfo = SC_Helper_DB_Ex::getBasisDataFromCacheFile(true);

Check failure on line 71 in data/class/pages/error/LC_Page_Error.php

View workflow job for this annotation

GitHub Actions / PHPStan

Static call to instance method SC_Helper_DB::getBasisDataFromCacheFile().
}

/**
Expand Down
2 changes: 1 addition & 1 deletion data/class/pages/error/LC_Page_Error_DispError.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@
$objHelperPlugin->arrRegistedPluginActions = array();

// キャッシュから店舗情報取得(DBへの接続は行わない)
$this->arrSiteInfo = SC_Helper_DB_Ex::sfGetBasisDataCache(false);
$this->arrSiteInfo = SC_Helper_DB_Ex::getBasisDataFromCacheFile(true);

Check failure on line 59 in data/class/pages/error/LC_Page_Error_DispError.php

View workflow job for this annotation

GitHub Actions / PHPStan

Static call to instance method SC_Helper_DB::getBasisDataFromCacheFile().
}

/**
Expand Down
4 changes: 3 additions & 1 deletion tests/class/SC_SendMailTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,10 @@ public function testGetRecip()
*/
public function testGetBackendParams()
{
$this->objQuery->update('dtb_baseinfo', ['email04' => '[email protected]']);
$objDb = new SC_Helper_DB_Ex();

SC_Helper_DB_Ex::registerBasisData(['email04' => '[email protected]']);

$objSite = $objDb->sfGetBasisData();
$this->expected = [
'-f '.$objSite['email04']
Expand Down
Loading
Loading