MySQL 複数テーブルを結合して検索する

複数のテーブルを結合して、一つのテーブルのように見立てて、WHEREできる。

tb_menber
menber_id name birthday address

tb_profile
tall blood hobby

SELECT * FROM `tb_member` INNER JOIN `tb_profile`

すると
menber_id name birthday address tall blood hobby
に対して WHERE文が使える

スマホの向きを判定してレイアウトを変える

デバイスの向きを判定するには「orientation」というプロパティになります。

//縦向きの場合
@media screen and (orientation:portrait){
  p {font-size: 1em; }  
}
//横向きの場合
@media screen and (orientation:landscape){
  p {font-size: 1.2em; }  
}

portraitは縦向き、landscapeは横向きとなります。縦と横でCSSを切り替えることができます。

スマホの画面サイズを取得して、横使い用のレイアウトにする

画面サイズ、ウィンドウサイズを取得するスクリプトです。

<p>画面サイズ:<span id="ScrSize"></span></p>
<p>ウィンドウサイズ:<span id="WinSize"></span></p>
<script type="text/javascript">
//画面サイズの取得
getScreenSize();
//ウィンドウサイズの取得
getWindowSize();
//画面サイズを取得する
function getScreenSize() {
	var s = "横幅 = " + window.parent.screen.width + " / 高さ = " + window.parent.screen.height;
	document.getElementById("ScrSize").innerHTML = s;
}
//ウィンドウサイズを取得する
function getWindowSize() {
	var sW,sH,s;
	sW = window.innerWidth;
	sH = window.innerHeight;
	s = "横幅 = " + sW + " / 高さ = " + sH;
	document.getElementById("WinSize").innerHTML = s;
}
</script>

これを元に

縦と横の数値を比較して

横のほうが大きければ

横使いようのレイアウトを返す。

WordPressでmod_rewriteが効かない

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /web1.download/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /web1.download/index.php [L]
</IfModule>
# END WordPress

WordPressでパーマリンクが有効にならない時
mod_rewriteが効かないと勘違いしやすい
サーバー設定かと思い「http.conf」などを見て、動かいないはずがない、変だぞ!
そんなことにハマるケースも多いです。

.htaccess を見ても文法ばかりを気にして、ドメインが違っているなんて、気づきにくいことかもしれません。
またハマってしまったので。。。

4行目、8行目にドメインが記載されています。

phpで配列をソートする(数値の場合)

PHPのソート関数では数値が昇順降順にならないという話も多いが

第二引数に「SORT_NUMERIC」を入れるとうまく行く

arsort($point_id_array, SORT_NUMERIC);

arsort asort は値とキーの関係を保ったままソートされる

array(8) {
  [2]=>
  string(4) "80.2"
  [3]=>
  string(4) "78.3"
  [1]=>
  string(4) "77.1"
  [4]=>
  string(4) "25.4"
  [0]=>
  string(3) "6.0"
  [6]=>
  string(3) "2.6"
  [7]=>
  string(3) "0.7"
  [5]=>
  string(3) "0.5"
}

rsort sort は値とキーの関係を保たない

array(8) {
  [0]=>
  string(4) "80.2"
  [1]=>
  string(4) "78.3"
  [2]=>
  string(4) "77.1"
  [3]=>
  string(4) "25.4"
  [4]=>
  string(3) "6.0"
  [5]=>
  string(3) "2.6"
  [6]=>
  string(3) "0.7"
  [7]=>
  string(3) "0.5"
}

CSS、親要素から子要素がはみ出してしまうのはなぜ?

親に position: relative;
子に position: absolute;
と書くと親のサイズ内に子が収まるようになる。

#header {
	width: 100%;
	position: relative;
	background: url(./img/main.png);
	background-size: contain;
	border: 3px solid black;
	overflow: hidden;
}
	/* 高さを幅の % に固定 */
	#header:before {
		content: "";
		display: block;
		padding-top: 44%;
		overflow: hidden;
	}
#header_in {
	margin: 0;
	display: inline;
	position: absolute;
	top: 0;
	width: 100%;
	height: 100%;
	border: 1px solid red;
}

レスポンシブデザインで背景画像のアスペクト比を維持する

CSSで背景に画像を敷いて、レスポンシブデザインにする場合
アスペクト比が維持できない。

幅は%指定でできる。
高さはどうするか?

#header {
	width: 100%;
	background: url(./img/main.png);
	border: 1px solid red;
}
	/* 高さを幅の % に固定 */
	#header:before {
		content: "";
		display: block;
		padding-top: 35%;
	}

カスタムフィールドの保存方法を見てみよう!

カスタムフィールドは、wp_options というテーブルに保存されます。サイトの基本情報やプラグイン、テーマファイルなど、様々な設定情報と同じテーブルに保存されています。書き方も暗号かとおもうほど複雑難解です。慣れれば読めるようになります。
しかし、画像の場合ここには保存されずにIDのみが保存されます。

記事やページを記録する wp-posts というテーブルに保存されていますので、上記から抽出したIDを元にソートをかけると、やっと目的の画像ファイル名にたどり着けます。

↓wp_options

wordpress のデータベース構造は最小公倍数に設計されているのでとてもシンプルですが、構造がシンプルな代わりに保存方法が無限にありますので解析するにはかなりの熟練が必要です。

EC-CUBE のカートをカスタマイズするときの悩み

「SC_CartSession.php」内で処理するのだが

var_dump($_POST)

が採れる場所と空になる場所がある

よく読めばいいことなのだが割愛して$_POSTを取得できる場所

247行目付近の

if (!$find) { の中では「$_POST」を取得できる。

そこ(247行目付近)で一旦セッションなどに保存すれば他の場所でも利用できる。

 

他の場所でPOSTを採取しようとしてもできないので、とにかくここでSESSIONに仮保存する。

php で○時間前、○日前など

phpで相対的な日時を得る方法のメモ。昨日明日、先月来月、次の日曜前の日曜、3分前、10分後など、現在日時を起点にしたあらゆるパターンの日時が得られる。

strtotime()はUnixタイムスタンプを返す組み込み関数。日時の文字列を渡すとそれに応じたUNIXタイムスタンプを返してくれる。

  1. strtotime(“1999-12-31 23:59:59”);//946652399

で、strtotime()は日時以外に、様々な相対日時を指定可能になっている。strtotime( "yesterday" )とやると前日の午前0時0分0秒のUNIXタイムスタンプが返ってくる。これをdate()関数と組み合わせて使うことで、相対日時を簡単に取得することができる。

  1. date(“Y-m-d H:i:s”, strtotime(“yesterday”));//ex 2011-10-27 00:00:00

以下はstrtotime()で使える日時指定のリスト。

現在日時

  1. strtotime(“now”);

昨日明日、一昨日、明後日など前後の日付

  1. strtotime(“+1 day”);//明日
  2. strtotime(“+2 day”);//明後日
  3. strtotime(“+10 day”);//10日後
  4. strtotime(“+365 day”);//365日後
  5.  
  6. strtotime(“1 day”);//+は省いても構わない
  7.  
  8. strtotime(“-1 day”);//昨日
  9. strtotime(“-2 day”);//一昨日
  10. strtotime(“-10 day”);//10日前
  11. strtotime(“-365 day”);//365日前

昨日今日明日の0時0分0秒

  1. strtotime(“today”);//今日の0時0分0秒
  2. strtotime(“yesterday”);//昨日の0時0分0秒
  3. strtotime(“tomorrow”);//明日の0時0分0秒
  4.  
  5. strtotime(“yesterday 15:00:00”);//昨日の15時0分0秒

strtotime( "+1 day" )が現在時のちょうど24時間後になるのに対し、strtotime( "tomorrow" )だと明日の0時0分0秒が得られる。たまにstrtotime( "tomorrow" )strtotime( "+1 day" )は同じと書いているのを見かけるが間違い。異なった数値が返ってくるので使い分ける。 strtotime( "now" ) - strtotime( "today" )で今日が始まって何秒経過したとかできて便利。

正午

  1. strtotime("noon");//今日の12時0分0秒
  2.  
  3. strtotime("yesterday noon");//昨日正午

  1. strtotime("+1 week");//1週間後
  2. strtotime("+10 week");//10週後
  3. strtotime("-1 week");//1週間前
  4. strtotime("-10 week");//10週前

  1. strtotime("+1 month");//来月1日の0時0分0秒。
  2. strtotime("+2 month");//再来月1日の0時0分0秒。
  3. strtotime("-1 month");//先月1日の0時0分0秒。
  4. strtotime("-2 month");//2カ月前1日の0時0分0秒。
  5.  
  6. strtotime("2013-07");//2013年7月1日0時0分0秒。
  7. strtotime("january");//今日が28日だとすると、今年の1月28日の0時0分0秒。
  8.  
  9. strtotime("2013-08-01 +1 month");//2013年9月1日の0時0分0秒
  10. strtotime("2013-08-31 +1 month");//2013年10月1日の0時0分0秒になってしまう!
  11. strtotime("2013-08 +1 month");//2013年9月1日の0時0分0秒

日を指定せず、YYYY-MMを与えるとその月の1日になり、Januaryのように英語月名を与えると今日の日付になる。

+1 monthを使う時は、日付まで指定して使うと予想外の値になる場合がある。例えば、strtotime( "2013-08-31 +1 month" )とすると、返ってくる値は2013-09-30ではなく2013-10-01である。strtotime( "2013-08-30 +1 month" )なら2013-09-
30になる。どうやら+1 monthは、単純に月に1を足しているだけのもよう。つまり、2013-08-31という値を+1 monthすると、まず2013-09-31という文字列を作成し、次いでこれを2013-10-01に変換しているようなのだ。よって、月送りには日付を指定せずに使うのが良い。

月初・月末

  1. strtotime("first day of 2013-07-10");//2013年7月1日0時0分0秒。
  2. strtotime("
    first day of january"
    );//first dayは年を省き月だけの指定も可能。この場合は今年の1月1日0時0分0秒。
  3. strtotime("first day of 2013-07");//これでもOK
  4.  
  5. strtotime("last day of 2013-07-01");//2013年7月31日の0時0分0秒。
  6. strtotime("last day of january");//今年の1月31日0時0分0秒。
  7. strtotime("last day of 2013-07");//2013年7月31日の0時0分0秒。
  8.  
  9. strtotime("first day of next month");//来月1日0時0分0秒。

月末日は月によってバラバラなので、last day ofは非常に便利。「月」の項目でも説明したが、strtotime("2013-08-31 +1 month")は10月1日になってしまう。2013年8月の翌月の末日を得たい場合は、strtotime( "last day of 2013-08 +1 month" )とする。これで2013-09-30が得られる。

ただし、PHPのバージョンによっては(5.4.4以前?)、first day ofとlast day ofは動かない。確実に月初や月末を得たい場合はmktime()を使う方が良い。mktime()の第5引数を0にすると、前の月の末日が得られる。

  1. strtotime("+1 year");//現在日時の1年後. 今が2014年1月1日10時ちょうどなら返り値は'2015-01-01 10:00:00'
  2. strtotime("-1 year");//現在日時の1年前. 今が2014年1月1日10時ちょうどなら返り値は'2013-01-01 10:00:00'
  3.  
  4. strtotime("last year");// "-1 year"と同じ
  5. strtotime("next year");// "+1 year"と同じ
  6.  
  7. //特定の時刻が得たいなら以下の書き方が可能
  8. strtotime("+1 year 00:00:00");//現在日時の1年後の0時0分0秒になる01-01 10:00:00'

曜日

  1. strtotime("next sunday");//次の日曜の0時0分0秒
  2. strtotime("+2 sunday");//次の次の日曜0時0分0秒
  3. strtotime("last sunday");//前の日曜の0時0分0秒
  4. strtotime("-3 sunday");//3回前の日曜0時0分0秒
  5.  
  6. strtotime("next sun");//略称でもOK
  7.  
  8. strtotime("first sun of 2011-10"
    );//指定した月の最初の日曜の日付。時間は0時0分0秒
  9. strtotime("second sun of 2011-10");//指定した月の2つめの日曜の日付
  10. strtotime("last sun of 2011-10"));//指定した月の最後の日曜の日付
  11. strtotime("first sun of october 2011");//この書き方でもOK

時分秒

  1. strtotime("+5 sec");//5秒後
  2. strtotime("+5 min");//5分後
  3. strtotime("+1 hour");//1時間後
  4. strtotime("-5 sec");//5秒前
  5. strtotime("-5 min");//5分前
  6. strtotime("-1 hour");//1時間前
  7.  
  8. strtotime("+5 second");//秒はsec・secondどちらでも可
  9. strtotime("+5 minute");//分もmin・minuteどちらも可

組み合わせ

  1. strtotime("+1 month +1 day +1 hour +1 minute");//1カ月と1日と1時間1分後

$_Cookie の使い方

$time = time() + 70 * 24 * 3600; // 70日有効, 第3引数に過去時間をセットする事で削除可能
setcookie(“クッキー名”, “内容”, $time, “/”);

クッキーの保存数に制限があるので
クッキー名[0],クッキー名[1],クッキー名[2]… のように並列にすると一つのクッキーとして扱われる。

削除と更新、上書き
上書きはできないので一旦削除する
setcookie(“クッキー名”, “内容”, – $time, “/”); // 時刻を負の数として時間切れにすることで削除とみなされ、上書きできるようになる。

取り出すときは
$cookie = $_COOKIE[クッキー名];

mod_rewrite が動かない。まただ!

apache 関連のファイルに mod_rewrite をロードさせようと追記して
apache再起動

。。。「すでにロードされている」メッセージ

でも、.htaccess が効かない

なぜだ?

/etc/apache2/sites-available/000-default.conf
↓編集前

<VirtualHost *:80>
	ServerAdmin webmaster@localhost
        DocumentRoot /home/hashimoto/www/
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
	ServerName localhost
</VirtualHost>

↓「Directory」を追記した

<VirtualHost *:80>
	ServerAdmin webmaster@localhost
        DocumentRoot /home/hashimoto/www/
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
	ServerName localhost
        <Directory /home/hashimoto/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
</VirtualHost>

無事に .htaccess が反応するようになった。

CGIも動かなかったがここにかけば動くのだろう

EC-CUBE の制作で「status」って何?

ず〜っとひっかかっていたことがあるので、書きます。
EC-CUBE の制作で「status」って何?

「status」というのは「地位、権力」といった意味があります。
カタカナで書くと「スターテス」もしくは「ステイタス」です。

EC-CUEBは時々、間違った外来カタカタを使うことでも有名です。
「state」は「状態,ありさま,ようす,様相;事態,事情,形勢」という意味です。

なぜ、「state」とすべき箇所を「status」とするのか

答えは。。。。。簡単。。。。関係者が低知能なのです。

以前のバージョンでは
「footer」を「fotter」と書いてありました。
小学生レベルのローマ字読みですね。

「status」はどんなところで使われているのか?

商品の状態、公開か非公開か、まさに状態「state」と表現すべき箇所で「status」です。
同じように、受注の対応状況、「発送済み、入金待ち」など、まさに状態「state」と表現すべき箇所で「status」です。

まだまだ続きます

何でも複数形にしようとしたがる

例えば商品一覧

↓EC-CUBEでは puroducts_list なんです。
puroducts_list = 商品たち一覧

↓product_list でいいと思うのですが。
product_list = 商品_一覧

「たくさんあります。沢山リスト。」みたいに二回書くのが好きみたいです。

中学生レベルの複数形の表現くらいはマスターしてからプログラミング業務に従事してほしいものです。

これが日本のweb業界の平均以上というかTOPクラスの人たちの知能レベルです。

同じ日本人として恥ずかしい限りです。

画像を ”vertical-align: middle;” する

画像の縦位置というか上下位置というか、中央に表示する。

.listphoto {
	width: 150px;
	height: 150px;
	border: 1px solid silver;
	display: table;
}
.listphoto .vertical_middle {
	width: 100%;
	height: 100%;
	display: table-cell; 
	vertical-align: middle;
}
.listphoto  .vertical_middle  img {
	padding: 2px;
	max-height: 146px;
	max-width: 146px;
	border: none;
	vertical-align: middle;
}

メール送信で”SSL/TLSでの接続中に。。。”のエラーで送信できない。

CORESERVER で発生した件
SMTPポートが465で接続できていたが、突然”SSL/TLSでの接続中に。。。”というエラーで接続できなくなった。

回避策
SMTPポートを”587”にしたら送信できた。

AUTO_INCREMENTの値を更新する

AUTO_INCREMENTの値として代入する数値は「’」コロンで囲まない。

$sql = "ALTER TABLE `dtb_products_class_product_class_id_seq` AUTO_INCREMENT = 777";

ついでに
EC-CUBE のあるバージョンで発生した事例。

CSVによる商品登録のさい
dtb_products_class_product_class_id_seq や dtb_products_product_id_seq において
・AUTO_INCREMENT を更新する
・sequence を更新する
両方更新しないと管理画面からの商品登録でエラーになる。

さくらのレンタルサーバでEC-CUBEを動かす

レンタルサーバー|さくらインターネット に EC-CUBEを設置するには少々コツがいります。

ファイルパーミッション(アクセス権)は
ディレクトリ(フォルダ): 0705
*.php: 0705
*.tpl: 0705
その他のファイル: 0604

EC-CUBEのルートディレクトリにある.htaccess は削除します。
かわりにサーバーの管理画面からphp.iniが設定できるので、 magic_quotes_gpc = off にします。

エラーメッセージ、問題ないが多くの警告が表示されますので、これもOFFにします。

EC-CUBEでブロックを一括変更する

dtb_blocposition を操作することで対応できる。

device_type_id PC=10、携帯電話=1、スマートフォン=2
page_id トップページ=1、一覧ページ=2、詳細ページ=3、マイページ=4、その他カスタムで作成したページへID付与。(dtb_pagelayout参照)
target_id 0=Unused、1=LeftNavi、2=MainHead、3=RightNavi、4=MainFoot、5=TopNavi、6=BottomNavi、7=HeadNavi、8=HeaderTopNavi、9=FooterBottomNavi、10=HeaderInternalNavi (mtb_target参照)
bloc_id カテゴリー=1、利用ガイド=2、かごの中=3等。(dtb_bloc参照)
bloc_row カラム内でのブロックの表示優先順位。0は非表示で、target_idに5(未使用ブロック)が選択されている場合に設定可能。
filename カテゴリー=1、利用ガイド=2、かごの中=3等。(dtb_bloc参照)bloc_idと対応している。

ブロックIDを調べるには dtb_bloc を見る。

参考処理コード

<html dir="ltr" lang="ja">
<head>
<meta charset="UTF-8" />
</head>
<body>
<?php
include './data/config/config.php';

$db = mysql_connect(DB_SERVER.":".DB_PORT,DB_USER,DB_PASSWORD);
mysql_query("SET NAMES utf8");
mysql_select_db(DB_NAME, $db);
$sql1 = "SELECT * FROM `dtb_category` WHERE `category_id` = '1'";
$rs1 = mysql_query($sql1,$db);
$item1 = mysql_fetch_assoc($rs1);
var_dump($item1);

// ページIDのMAX
$page_id_max = '37';
// 表示するカラムID
$target_id = '3';



$sql1 = "SELECT * FROM `dtb_blocposition`";
$rs1 = mysql_query($sql1,$db);

// UPDATE
while($item1 = mysql_fetch_assoc($rs1)){
	
	
	if( ( ($item1[bloc_id] == 6) || ($item1[bloc_id] == 3) || ($item1[bloc_id] == 8) || ($item1[bloc_id] == 2) || ($item1[bloc_id] == 10) ) && ($item1[device_type_id] == 10) ){
		
		
		// 表示順
		if($item1[bloc_id] == 6){
			$bloc_row = 0;
		}elseif($item1[bloc_id] == 3){
			$bloc_row = 1;
		}elseif($item1[bloc_id] == 8){
			$bloc_row = 2;
		}elseif($item1[bloc_id] == 2){
			$bloc_row = 3;
		}elseif($item1[bloc_id] == 10){
			$bloc_row = 4;
		}
		
		// 表示する
		$sql2 = "UPDATE `dtb_blocposition` SET `target_id` = '$target_id', `bloc_row` = '$bloc_row' WHERE `device_type_id`='10' AND `page_id`='$item1[page_id]' AND `bloc_id`='$item1[bloc_id]'";
		
	}else{
		// 表示しない(カラム)
		$sql2 = "UPDATE `dtb_blocposition` SET `target_id` = '0', `bloc_row` = '0' WHERE `device_type_id`='10' AND `page_id`='$item1[page_id]' AND `bloc_id`='$item1[bloc_id]'";
	}
	
	// echo $sql2.'<br>';
	
	$rs2 = mysql_query($sql2,$db);
}


// 該当ページの、該当ブロックの登録がない場合はINSERT


// 表示するブロックIDの配列
$array_block_id = array(6,3,8,2,10);

// 該当ページIDをループ
for($i = 0; $i <= $page_id_max; $i ++){
	$page_id = $i;
	
	for($a = 0; $array_block_id[$a] != ''; $a ++){
		$sql3 = "SELECT * FROM `dtb_blocposition` WHERE `device_type_id`='10' AND `page_id`='$page_id' AND `bloc_id`='$array_block_id[$a]'";
		$rs3 = mysql_query($sql3,$db);
		$item3 = mysql_fetch_assoc($rs3);
		// var_dump($item3);
		// echo '<br>';
		
		if($item3 == ''){
			
			// 表示順
			if($array_block_id[$a] == 6){
				$bloc_row = 0;
			}elseif($array_block_id[$a] == 3){
				$bloc_row = 1;
			}elseif($array_block_id[$a] == 8){
				$bloc_row = 2;
			}elseif($array_block_id[$a] == 2){
				$bloc_row = 3;
			}elseif($array_block_id[$a] == 10){
				$bloc_row = 4;
			}
			
			$sql4 = "INSERT INTO `dtb_blocposition` (
							`device_type_id`, `page_id`, `target_id`, `bloc_id`, `bloc_row`, `anywhere`
						) VALUES (
							'10', '$page_id', '$target_id', '$array_block_id[$a]', '$bloc_row', '0'
						)";
			// echo $sql4.'<br>';
			$rs4 = mysql_query($sql4,$db);
		}
	}
}


echo '処理完了!';


?>
</body>

</html>

郵便番号(住所変換用)の登録を10秒で出来る方法

EC-CUBE では、
基本情報管理 → 郵便番号DB登録
で 郵便番号の住所変換が出来るようになる。

しかし 「郵便番号DB登録」は とても時間がかかる。
サーバーのスペックにもよるが30分くらいかかるケースも少なくない。

下記のようにSQL文を書いて流し込むと
遅いサーバーでも10秒くらいで出来る。

処理の流れとしては、
1) KEN_ALL_utf-8.CSV を一行ずつ読み込む
2)「,」カンマで分割して、SQL文を発行する

$line = file('./data/downloads/KEN_ALL_utf-8.CSV');
for($i = 0; $line[$i] != ''; $i ++){
// for($i = 0; $i <= 10; $i ++){
	
	echo $i.'<br>';
	
    $array = explode(",", $line[$i]);
    
	$sql1 = "INSERT INTO `mtb_zip` (
				`code`, `old_zipcode`, `zipcode`, `state_kana`, `city_kana`, `town_kana`, `state`, `city`, `town`, `flg1`, `flg2`, `flg3`, `flg4`, `flg5`, `flg6`
				) VALUES (
				'$array[0]','$array[1]','$array[2]','$array[3]','$array[4]','$array[5]','$array[6]','$array[7]','$array[8]','$array[9]','$array[10]','$array[11]','$array[12]','$array[13]','$array[14]'
				)";
	$rs1 = mysql_query($sql1,$db);
	// echo $sql1.'<br>';
}

 
私がすごいのではない。
EC-CUBE がダメダメなのだ(--;

特定カテゴリを指定して記事一覧を表示する

<ul>
<?php
	$category_recent_post = 5; 	// 記事数
	$category_recent_id = 1;	// カテゴリID
	$posts = get_posts('numberposts=' . $category_recent_post . '&category=' . $category_recent_id);
	global $post;
	if($posts) {
		foreach($posts as $post) {
			setup_postdata($post);
			echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
		}
	}
?>
</ul>

phpMyadminにログインできない

 

ユーザー名やパスワードが間違っていない。
config.inc.php が間違っていない。
 

ログインがエラーにならないのに
ログイン画面に戻ってしまう。
ブラウザによっては「アクセスが拒否されました」と表示される。
 

つまり、パスワード云々ではなく、拒否される
権限が無いのね。
 

試しに
phpMyadmin/setup にアクセスしてみる。
↓こんなエラーだ
session_start(*************): open failed: Permission denied (13)
セッションが書き込めないのね、ということで
 

/var/lib/php/session のパーミッションを確認する

[root@hogehoge php]# ls -l
drwxrwx— 2 apache apache session

 

apache からの書き込みがOKでも動かない
動いているサーバーの設定を見てみると
webユーザーにも許可が出ている。
 

webユーザーも読み書きできるようにパーミッションを変えたら
phpMyadmin が無事に動きました。

EC-CUBEやWordpressは動いていたので、session_save_path を疑いませんでしたが
彼らは session_save_path を指定して権限を付与している。
phpMyadmin はデフォルトのsession_save_path を使っている。
session_save_path を指定して、権限を付与するのもOKってことですね。

EC-CUBEのリストコメントやメモ欄もHTMLタグを許可する

俗に言う「(タグ許可)」です。

confium.php を見てみると
<!–{$arrForm.note|h|nl2br}–>
<!–{$arrForm.main_comment|nl2br_html}–>

|h|nl2br → |nl2br_html
これだけです。

。。。おっと、待った。
まだでした。

LLTEXT_LEN にしてあげたほうがいいですね。

wordpressの検索機能は複数キーワード対応?

wordpressの検索で複数キーワードは使えないのか?

半角カンマで区切ればできますが、

スペース区切りとかではNGです。

。。。直すしかない。

「WP Multibyte Patch プラグイン」を有効にするだけです。

WP Multibyte Patch プラグインの主な機能

投稿抜粋

「文字数ベース」抜粋の補助機能を提供します。抜粋の最大文字数と more 文字列を設定ファイルより変更できます。

文字列カウント方式の設定

言語設定が ja の場合、デフォルトで文字列カウント方式の設定を「文字数ベース」に固定します。

検索

検索の際に全角スペースを区切り文字として認識させます。また、検索文字列内の重複するスペースを取り除きます。

メール送信

送信メールのエンコーディングを JIS (ISO-2022-JP) 、UTF-8、自動判別の3つのモードから選ぶことができます。有効時のデフォルトは JIS (ISO-2022-JP) です。WordPress 本体の実装とは異なり、UTF-8 モードではボディ部も base64 エンコード (7bit) します。

トラックバック受信

日本語を含む多くのエンコーディングのデータが破壊される問題を修正します。

ピンバック受信

マルチバイト文字で書かれたページからのピンバック処理機能一式 (エンコーディング検出、変換、トリム) を実装します。また、一部の UTF-8 文字が破壊される問題を修正します。

ファイル名サニタイズ

マルチバイトを含むファイル名のファイルがアップロード、またはメール添付された場合にファイル名を md5 に変換します。

管理パネル

  • ダッシュボードの「最近のコメント」、「最近の下書き」でマルチバイト文字列が正しく抜粋されるようにします。
  • 投稿エディターの文字数表示機能を正しく動作させます。
  • 既存コンテンツへの内部リンクを検索する際のインクリメンタルサーチを2文字から動作させます。
  • 日本語フォントの表示にあわせ、管理パネルのフォントファミリーを sans-serif 系に統一、イタリック体を標準に変えます。

BuddyPress 抜粋関数

bp_create_excerpt() でマルチバイト投稿の抜粋が作られない問題を修正します。HTML タグを取り除いた形の文字数ベースの抜粋を生成します。本機能はデフォルトではオフになっておりますので、ご利用の際は wpmp-config.php を編集して有効化してください。

ご注意: Activity の抜粋機能は表示時ではなく Activity データ記録時の実データに適用されます。また、抜粋化されるタイプとされないタイプの投稿があります。これらは BuddyPress の仕様によるものですのでご了承ください。

Twenty Twelve の Open Sans 対策

Twenty Twelve テーマの Open Sans Web フォントが一部ブラウザにおいて日本語表示の不具合を引き起こす問題の対応として、翻訳ファイルの有無に関わらず当該フォントの無効化を行う機能を提供します。

その他

設定ファイル (wpmp-config.php) から各パッチ機能を個別に有効化・無効化できます。

データベースのメンテナンス

データベースのオーバーヘッドは、INSERT、DELETE、UPDATEを行っているうちにできるゴミ(未使用)領域のようなものです。

これを解消するためには、テーブルの最適化が必要です。

phpMyAdminからDB表示、画面一番下の「オーバーヘッドのあるテーブルを確認」→チェックが入る→ドロップダウンリストから「テーブルを最適化する」、で実行できます。

スライドショーのJavascript 簡単でフェードインする

<style>
.fadein { position:relative; height:332px; width:500px; }
.fadein img { position:absolute; left:0; top:0; }
</style>

<script>
$(function(){
	$('.fadein img:gt(0)').hide();
	setInterval(function(){$('.fadein :first-child').fadeOut().next('img').fadeIn().end().appendTo('.fadein');}, 7000);
});
</script>
<div class="fadein">
	<img src="<!--{$TPL_URLPATH}-->img/index-image1.jpg">
	<img src="<!--{$TPL_URLPATH}-->img/index-image2.jpg">
	<img src="<!--{$TPL_URLPATH}-->img/index-image3.jpg">
</div>

カートに入れるタグ

EC-CUBEで、ブログなどから直接買い物かごに入れる場合などに利用する。

<form name="form1" id="form1" method="post" action="'.ROOT_URLPATH.'products/detail.php?product_id='.$item1&#91;product_id&#93;.'">
<input type="hidden" name="transactionid" value="'.$_SESSION&#91;transactionid&#93;.'" />
<input type="hidden" name="mode" value="cart" />
<input type="hidden" name="product_id" value="'.$item1&#91;product_id&#93;.'" />
<input type="hidden" name="product_class_id" id="product_class_id4" value="'.$item2&#91;product_class_id&#93;.'" />
<input type="hidden" name="quantity" value="1" />
	<input type="image" src="'.ROOT_URLPATH.'user_data/packages/default/img/set-cart.jpg">
</form>

※ 注意点
http://hogehoge.com/car に投げても商品は入りません。
あて先は「 products/detail.php?product_id=123 」
post する mode は cart

CSCARTでwindowsサーバーにインストールする方法

追加言語のインストール中 JA:
. . .
Error_occurred

なんてエラーで止まる。
原因は「ftp_connect」関数が使えないことらしい。
Windowsサーバーではインストールできないということだ。
でもWindowsサーバーで動かす方法はある。
Linuxサーバーでインストールしたものを移植すればいい。

公式マニュアルより
http://manual.cs-cart.jp/?page_id=347

CS-Cart日本語版v2.1.4-jp-1よりPHP標準の「ftp_connect」関数が利用できないサーバーはCS-Cartアップグレード時に手動でのファイルパーミッション操作が必要などの理由よりインストールができなくなっております。

WordPress のカテゴリにカスタムフィールドを追加する

この記事ではWordpress3.2を使用しています。

カテゴリー編集に項目を追加

さっそくですがカテゴリー編集画面に項目を追加してみましょう。
現在使用している「functions.php」に以下を追加します。

functions.php

	add_action ( 'edit_category_form_fields', 'extra_category_fields');
	function extra_category_fields( $tag ) {
	    $t_id = $tag->term_id;
	    $cat_meta = get_option( &quot;cat_$t_id&quot;);
	?>
	<tr class=&quot;form-field&quot;>
		<th><label for=&quot;extra_text&quot;>その他テキスト</label></th>
		<td><input type=&quot;text&quot; name=&quot;Cat_meta[extra_text]&quot; id=&quot;extra_text&quot; size=&quot;25&quot; value=&quot;<?php if(isset ( $cat_meta['extra_text'])) echo esc_html($cat_meta['extra_text']) ?>&quot; /></td>
	</tr>
	<tr class=&quot;form-field&quot;>
		<th><label for=&quot;upload_image&quot;>画像URL</label></th>
		<td>
			<input id=&quot;upload_image&quot; type=&quot;text&quot; size=&quot;36&quot; name=&quot;Cat_meta[img]&quot; value=&quot;<?php if(isset ( $cat_meta['img'])) echo esc_html($cat_meta['img']) ?>&quot; /><br />
			画像を追加: <img src=&quot;images/media-button-other.gif&quot; alt=&quot;画像を追加&quot;  id=&quot;upload_image_button&quot; value=&quot;Upload Image&quot; style=&quot;cursor:pointer;&quot; />
		</td>
	</tr>
	<?php
	}
	

項目を追加したい場合は「$cat_meta」の配列名を変更して追加してください。
これでカテゴリー編集画面を見ると下図のようになっているはずです。

カテゴリー編集に項目が追加された

メタデータの保存

項目を追加しただけでは保存されませんので、保存する処理を記述しましょう。
先ほど記述した「extra_category_fields」の下に追加します。

functions.php

	add_action ( 'edited_term', 'save_extra_category_fileds');
	function save_extra_category_fileds( $term_id ) {
	    if ( isset( $_POST['Cat_meta'] ) ) {
		   $t_id = $term_id;
		   $cat_meta = get_option( &quot;cat_$t_id&quot;);
		   $cat_keys = array_keys($_POST['Cat_meta']);
			  foreach ($cat_keys as $key){
			  if (isset($_POST['Cat_meta'][$key])){
				 $cat_meta[$key] = $_POST['Cat_meta'][$key];
			  }
		   }
		   update_option( &quot;cat_$t_id&quot;, $cat_meta );
	    }
	}
	

画像アップ用のjs&cssの読み込み

追加した項目がテキストフィールドだけなら必要ありませんが、今回は画像フィールドもあるので、その場でアップロードできるようにcssとjsを読み込みます。
まずは新しいjavascriptを作成します。

upload.js

	(function($) {
		$(function() {
			$('#upload_image_button').click(function() {
				formfield =$('#upload_image').attr('name');
				tb_show('', 'media-upload.php?type=image&amp;post_id=&amp;TB_iframe=true');
				return false;
			});
			window.send_to_editor = function(html) {
				imgurl = $('img',html).attr('src');
				$('#upload_image').val(imgurl);
				tb_remove();
			}
		});
	})(jQuery);
	

このjsファイルは「upload.js」として現在使用しているテーマの「js」フォルダに保存します。

次に「functions.php」に戻って下記を追加します。

functions.php

	add_action('admin_print_scripts', 'my_admin_scripts');
	add_action('admin_print_styles', 'my_admin_styles');
	function my_admin_scripts() {
		global $taxonomy;
		if( 'category' == $taxonomy ) {
			wp_enqueue_script('media-upload');
			wp_enqueue_script('thickbox');
			wp_register_
script('my-upload', get_bloginfo('template_
directory') .'/js/upload.js');
			wp_enqueue_script('my-upload');
		}
	}
	function my_admin_styles() {
		global $taxonomy;
		if( 'category' == $taxonomy ) {
			wp_enqueue_style('thickbox');
		}
	}
	

これで画像を追加の横のアイコンをクリックすると、いつもの画像を挿入するウィンドウが表示されます。

画像をアップロード画面

テンプレートファイルでの表示

入力したデータをテンプレートで表示してみます。
ここではリスト表示をしてみます。

	&lt;ul class=&quot;clearfix&quot;&gt;
	&lt;?php
	$tag_all = get_terms(&quot;category&quot;, &quot;fields=all&quot;);
	foreach($tag_all as $value):
	$cat_data = get_option('cat_'.intval($value-&gt;term_id));
	?&gt;
	&lt;li&gt;
	&lt;?php echo esc_html($value-&gt;name) ?&gt;
	&lt;img src=&quot;&lt;?php echo esc_html($cat_data['img']) ?&gt;&quot; width=&quot;110&quot; height=&quot;110&quot; /&gt;
	&lt;?php echo esc_html($cat_data['extra_text']) ?&gt;&lt;br /&gt;
	&lt;/li&gt;
	&lt;?php endforeach; ?&gt;
	&lt;/ul&gt;
	

カテゴリーで追加したカスタムフィールドのデータは「wp_options」に保存されていますので、「term_id」でidを取得したら「get_option」で取得できます。

WordPress のCSSをリセットする

WordPress にデザインをかけようとするとデフォルトのCSSが細かすぎて厄介者だ!

毎日のようにWordpressを使っていると無駄を省きたいと考えるのは皆同じことだろう。

最近主流のデザインは
ヘッダーやフッターの背景は画面いっぱい、ヘーダーの内容・フッターの内容は指定幅、というものがほとんどだ。

下記のようなCSSを基本にスタートすると作業が早い。

WordPress のCSSリセット済みThameを見る

WordPress のCSSリセット済みThameを見る

※ID名・クラス名が増えているので、注意する。

herder.php と footer.php に<3つ(#header_inner、#main_inner、#footer_inner)を追記することが必須です。 ↓style.css

/*
Theme Name: Twenty Eleven
Theme URI: http://wordpress.org/extend/themes/twentyeleven
Author: the WordPress team
Author URI: http://wordpress.org/
Description: The 2011 theme for WordPress is sophisticated, lightweight, and adaptable. Make it yours with a custom menu, header image, and background -- then go further with available theme options for light or dark color scheme, custom link colors, and three layout choices. Twenty Eleven comes equipped with a Showcase page template that transforms your front page into a showcase to show off your best content, widget support galore (sidebar, three footer areas, and a Showcase page widget area), and a custom "Ephemera" widget to display your Aside, Link, Quote, or Status posts. Included are styles for print and for the admin editor, support for featured images (as custom header images on posts and pages and as large images on featured "sticky" posts), and special styles for six different post formats.
Version: 1.4
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: dark, light, white, black, gray, one-column, two-columns, left-sidebar, right-sidebar, fixed-width, flexible-width, custom-background, custom-colors, custom-header, custom-menu, editor-style, featured-image-header, featured-images, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready
Text Domain: twentyeleven
*/

/* =Reset default browser CSS. Based on work by Eric Meyer: http://meyerweb.com/eric/tools/css/reset/index.html
-------------------------------------------------------------- */

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
border: 0;
font-family: inherit;
font-size: 100%;
font-style: inherit;
font-weight: inherit;
margin: 0;
outline: 0;
padding: 0;
vertical-align: baseline;
}
:focus {/* remember to define focus styles! */
outline: 0;
}
body {
background: #fff;
line-height: 1;
}
ol, ul {
list-style: none;
}
table {/* tables still need 'cellspacing="0"' in the markup */
border-collapse: separate;
border-spacing: 0;
}
caption, th, td {
font-weight: normal;
text-align: left;
}
blockquote:before, 
blockquote:after,
q:before, q:after {
content: "";
}
blockquote, q {
quotes: "" "";
}
a img {
border: 0;
}

narticle, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}

/* ここからデザイン
------------------------------------------------------*/

html {}

body {
font-family: "メイリオ", meirio, Verdana,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic Pro","MS Pゴシック","MS PGothic",sans-serif;
font-size: 12px;
line-height: 20px;
}

#page {

}

/* カラム割
-------------------------------------------------------*/
/*
メニューバー、背景を画面幅いっぱいに、でもコンテンツは指定幅にという流行のレイアウトに対応

画面幅のカラム(インデントなし)
指定幅のカラム(インデントあり)
*/

#header {

}
#header_inner {
width: 1000px;
margin: 0 auto;
}
#main {
width: 1002px;
margin: 0 auto;
}
#main_inner {
float: left;
width: 1000px;
margin: 0 auto;
}
#footer {
clear: both;
}
#footer_inner {
width: 1000px;
margin: 0 auto;
}

/* メインカラムとサイドバーの関係 */
#primary {
float: right;
width: 696px;
}
#secondary {
float: left;
width: 300px;
}

/* レイアウト確認Border
#header, #header_inner, #main, #main_inner, #footer, #footer_inner, #primary, #secondary {border: 2px solid red; }*/

#header {
border: 1px solid skyblue;
}
#header_inner {
border: 1px solid limegreen;
}
#main_inner {
border: 1px solid gray;
}
#primary {
border: 1px solid mediumvioletred;
}
#secondary {
border: 1px solid mediumturquoise;
}
#footer {
border: 1px solid blueviolet;
}
#footer_inner {
border: 1px solid magenta;
}

/* EOF)カラム割 */

/* =Print
----------------------------------------------- */

@media print {
body {
background: none !important;
font-size: 10pt;
}
footer.entry-meta a[rel=bookmark]:link:after,
footer.entry-meta a[rel=bookmark]:visited:after {
content: " [" attr(href) "] "; /* Show URLs */
}
#page {
clear: both !important;
display: block !important;
float: none !important;
max-width: 100%;
position: relative !important;
}
#branding {
border-top: none !important;
padding: 0;
}
#branding hgroup {
margin: 0;
}
#site-title a {
font-size: 21pt;
}
#site-description {
font-size: 10pt;
}
#branding #searchform {
display: none;
}
#branding img {
display: none;
}
#access {
display: none;
}
#main {
border-top: none;
box-shadow: none;
}
#primary {
float: left;
margin: 0;
width: 100%;
}
#content {
margin: 0;
width: auto;
}
.singular #content {
margin: 0;
width: 100%;
}
.singular .entry-header .entry-meta {
position: static;
}
.entry-meta .edit-link a {
display: none;
}
#content nav {
display: none;
}
.singular .entry-header,
.singular .entry-content,
.singular footer.entry-meta,
.singular #comments-title {
margin: 0;
width: 100%;
}
.singular .hentry {
padding: 0;
}
.entry-title,
.singular .entry-title {
font-size: 21pt;
}
.entry-meta {
font-size: 10pt;
}
.entry-header .comments-link {
display: none;
}
.page-link {
display: none;
}
.singular #author-info {
background: none;
border-bottom: none;
border-top: none;
margin: 2.2em 0 0;
padding: 0;
}
#respond {
display: none;
}
.widget-area {
display: none;
}
#colophon {
display: none;
}

/* Comments */
.commentlist &gt; li.comment {
background: none;
border: 1px solid #ddd;
-moz-border-radius: 3px 3px 3px 3px;
border-radius: 3px 3px 3px 3px;
margin: 0 auto 1.625em;
padding: 1.625em;
position: relative;
width: auto;
}
.commentlist .avatar {
height: 39px;
left: 2.2em;
top: 2.2em;
width: 39px;
}
.commentlist li.comment .comment-meta {
line-height: 1.625em;
margin-left: 50px;
}
.commentlist li.comment .fn {
ndisplay: block;
}
.commentlist li.comment .comment-content {
margin: 1.625em 0 0;
}
.commentlist .comment-edit-link {
display: none;
}
.
commentlist &gt; li::before,
.commentlist &gt; li.bypostauthor::before {
content: '';
}
.commentlist .reply {
display: none;
}

/* Post author highlighting */
.commentlist &gt; li.bypostauthor {
color: #444;
}
.commentlist &gt; li.bypostauthor .comment-meta {
color: #666;
}
.commentlist &gt; li.bypostauthor:before {
content: none;
}

/* Post Author threaded comments */
.commentlist .children &gt; li.bypostauthor {
background: #fff;
border-color: #ddd;
}
.commentlist .children &gt; li.bypostauthor &gt; article,
.commentlist .children &gt; li.bypostauthor &gt; article .comment-meta {
color: #666;
}

}

/* =IE7
----------------------------------------------- */

#ie7 article.intro {
margin-left: -7.6%;
margin-right: -7.6%;
padding-left: -7.6%;
padding-right: -7.6%;
max-width: 1000px;
}
#ie7 section.featured-post {
margin-left: -7.6%;
margin-right: -7.6%;
max-width: 850px;
}
#ie7 section.recent-posts {
margin-right: 7.6%;
}

/* =IE8
----------------------------------------------- */

#ie8 section.feature-image.large img {
width: 100%;
} 

WordPress のCSSリセット済みThameを見る

WordPress のCSSリセット済みThameを見る

[WordPress]テンプレート用タグのチートシート

My WordPress Cheat Sheet」というサイトで、Wordpressのテンプレート用のタグのチートシートが公開されている。便利なので(。_。)φメモメモ ・・・ウッシッシ

テーマのファイル構成

  • header.php – ヘッダー部分
  • index.php – メイン部分
  • sidebar.php – サイドバー部分
  • footer.php – フッター部分
  • single.php – 記事テンプレート
  • page.php – ページテンプレート
  • comments.php – コメントテンプレート
  • search.php – 検索結果
  • searchform.php – 検索フォーム
  • archive.php – アーカイブ
  • functions.php – 特別機能
  • 404.php – 404エラーページ

ループ

&lt;?php if(have_posts()) : ?&gt;
   &lt;?php while(have_posts()) : the_post(); ?&gt;
// HTMLやPHPのコード
   &lt;?php endwhile; ?&gt;
&lt;?php else : ?&gt;
&lt;?php endif; ?&gt;

テンプレート・インクルード・タグ

&lt;?php get_header(); ?&gt;
&lt;?php get_sidebar(); ?&gt;
&lt;?php get_footer(); ?&gt;
&lt;?php comments_template(); ?&gt;

ブログ情報タグ

&lt;?php bloginfo('name'); ?&gt; - ブログタイトル
&lt;?php bloginfo('charset'); ?&gt; - ブログのcharset
&lt;?php bloginfo('description'); ?&gt; - キャッチフレーズ
&lt;?php bloginfo('url'); ?&gt; - ブログのURL
&lt;?php bloginfo('rss2_url'); ?&gt; - RSSのURL
&lt;?php bloginfo('template_url'); ?&gt; - テンプレートディレクトリのURL
&lt;?php bloginfo('pingback_url'); ?&gt; - トラックバックのURL
&lt;?php bloginfo('stylesheet_url'); ?&gt; - CSSファイルのURL
&lt;?php bloginfo('wpurl'); ?&gt; - WordPressのURL

条件タグ

is_home() // メインページかどうか
is_front_page() // フロントページかどうか
is_single() // 個別記事のページかどうか
is_sticky() - check if a post is sticky
is_page() // 個別ページかどうか
is_category() // あるカテゴリーのアーカイブページかどうか

共通タグ

&lt;?php the_time(); ?&gt; - 記事の投稿時間
&lt;?php the_date(); ?&gt; - 記事の投稿月日
&lt;?php the_title(); ?&gt; - 記事のタイトル
&lt;?php the_permalink(); ?&gt; - 記事のパーマリンク
&lt;?php the_category(); ?&gt; - 記事のカテゴリ
&lt;?php the_author(); ?&gt; - 記事の投稿者
&lt;?php the_ID(); ?&gt; - 記事のID
&lt;?php wp_list_pages(); ?&gt; - 全ページのリスト出力
&lt;?php wp_tag_cloud(); ?&gt; - タグクラウド
&lt;?php wp_list_cats(); ?&gt; - 全カテゴリのリスト出力
&lt;?php get_calendar(); ?&gt; - カレンダー
&lt;?php wp_get_archives() ?&gt; - 日付別アーカイブリスト
&lt;?php posts_nav_link(); ?&gt; - 記事の前後のページへのリンク
&lt;?php next_post_link(); ?&gt; - 記事の次のページへのリンク
&lt;?php previous_post_link(); ?&gt; - 記事の前のページへのリンク

ナビゲーションメニュー

// カテゴリーベース
&lt;ul id="menu"&gt;
&lt;li &lt;?php if(is_home()) { ?&gt; class="current-cat"&lt;?php } ?&gt;&gt;
&lt;a href="&lt;?php bloginfo('home'); ?&gt;"&gt;Home&lt;/a&gt;&lt;/li&gt;
&lt;?php wp_list_categories('title_li=&orderby=id'); ?&gt;
&lt;/ul&gt;

// ページベース
&lt;ul id="menu"&gt;
&lt;li &lt;?php if(is_home()) { ?&gt; class="current_page_item"&lt;?php } ?&gt;&gt;
&lt;a href="&lt;?php bloginfo('home'); ?&gt;"&gt;home&lt;/a&gt;&lt;/li&gt;
&lt;?php wp_list_pages('sort_column=menu_order&depth=1&title_li='); ?&gt;
&lt;/ul&gt;

あるカテゴリの記事

&lt;?php query_posts('category_name=Name&showposts=10'); ?&gt;

カスタム・テンプレートファイルのインクルード

&lt;?php include (TEMPLATEPATH . '/searchform.php'); ?&gt;

参考記事(外部サイト)

EC-CUBEで受注メールが送信されない(ロリポップなど)

リターンパスの問題
MAIL_BACKENDがmailの場合、リターンパスがサーバ名の入った記載になってしまう事があります。
MAIL_BACKENDをsendmailに変更したうえで簡単なカスタムを施してやることで、問題なくリターンパスが設定したメールアドレスが記述されます。
mailのままカスタムしてやる方法もありますが、sendmailにしてすすめる方が簡単なのでおすすめです。

対処方法
パラメータ設定/MAIL_BACKENDをsendmailに変更。
data/class/SC_SendMail.php でPathを調整すると無事送信できた。
詳細はこちら

EC-CUBE 2.11系でPDF帳票(納品書)がエラーになる

Adobe のエラーが表示されたり。印刷が出来ない。表示が途中まで。症状は様々です。

data/module/fpdi/japanese.php

function Footer()
{
    $this->SetY(-15);
    $this->SetFont('Arial','I',8);
    #$this->Cell(0,10,''.$this->PageNo().' / {nb}',0,0,'C');
}

$this->SetFont(‘Arial’,’I’,8);
$this->SetFont(”,’I’,8);
として、フォント名の指定を止めると治る。

perlでUTF-8メール送信する

perlでUTF-8メール送信する。sendmail版です。

use MIME::Base64;             # ←インストールされていることが前提
sub send_email_hashimoto {
	
	local($email,$subject,$msg,$headers,$frommail);
	$email = $_[0];
	$subject = $_[1];
	$msg = $_[2];
	$headers = $_[3];
	$frommail = $_[4];

	$sendmail = "/usr/sbin/sendmail -tf $frommail"; 
	$eol = "";
	$subject_b = encode_base64($subject,$eol);
	$subject_b = "=?utf-8?B?" . $subject_b . "?=";

	open (SENDMAIL, "| $sendmail");
	print SENDMAIL $headers;
	print SENDMAIL "To: $email\n";
	print SENDMAIL "Subject: $subject_b\n\n"; # ヘッダー部分終了のため、改行を「\n\n」と重ねます。
	print SENDMAIL encode_base64($msg);  # 本文もbase64エンコードしておく
	close(SENDMAIL);
}

上記サブ関数を下記のように利用します。

$frommail = "送信元メールアドレス";
$email = "送信先メールアドレス";
$subject ="メールタイトル";
$msg = "メール本文";
$headers = "From:$frommail\nMIME-Version: 1.0\nContent-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: base64\n";
send_email_hashimoto($email,$subject,$msg,$headers,$frommail);

EC-CUBEカスタマイズ事例集

ECCUBEカスタマイズの紹介やデモサイトのご案内です。
毎日、EC-CUBEを弄っていますので、ほんの一例のご紹介です。

デモサイトは機能制限が多いです。一部意図的に機能を止めてあるものもあります。(ソースを盗む輩がいるのでご了承くださいませ。)

難易度の高いものをデモとして公開しています。
難易度の低いもの(簡単なカスタマイズ)は「ページ左側のカテゴリ」からご覧ください。ソースコードも一部公開しています。

ショッピングモール

【DEMO】https://mint123.tokyo/technology/demo/craftcrowd/

カスタマイズをいろいろ混ぜてみた

会員ランクで価格変動、口コミ新着、口コミランキング、購入数で価格変動、お友達紹介機能、など
【DEMO】https://mint123.tokyo/technology/demo/eccube-iroiro/

商品規格をCSVで無限に増やす

(規格多数のEC-CUBE、規格はCSVで自由に変更できる、規格数も無限)
動作を軽くするのが夢でした!
【DEMO】https://mint123.tokyo/technology/demo/eccube-options-v1/

さらにカスタマイズして
セット商品販売ができました。
http://keihinland.com/

選択肢により価格が変動します。
【DEMO】https://mint123.tokyo/technology/demo/eccube-options-price/

会員ランクで価格変動

DEMO
【DEMO】https://mint123.tokyo/technology/demo/eccube-2114-customer_rank
導入事例
http://fontanamoco.jp/

沢山買えばマケマッセ (購入個数で価格変動)

【DEMO】(調整中)
https://mint123.tokyo/technology/demo/eccube-kazu
導入事例
http://best-print.jp/

共同購入 (「購入個数で価格変動」の拡張機能)

解説ページ
【DEMO】https://mint123.tokyo/technology/demo/joint_shopping/
管理画面も公開中!

御覧になりたいデモがございましたらリクエストにお答えいたします。
hsmt@mint410.com

カスタマイズ一覧をすべて見る

受注メール送信を、一時的に止める

/data/class/SC_SendMail.php

268行目付近
$result = $this->objMail->send($recip, $header, $this->body);
をコメントアウトする。

/**
	* TXTメール送信を実行する.
	*
	* 設定された情報を利用して, メールを送信する.
	*
	* @return void
	*/
function sendMail($isHtml = false) {
	$header = $isHtml ? $this->getHTMLHeader() : $this->getTEXTHeader();
	$recip = $this->getRecip();
	// メール送信
	$result = $this->objMail->send($recip, $header, $this->body);
		if (PEAR::isError($result)) {
			GC_Utils_Ex::gfPrintLog($result->getMessage());
			GC_Utils_Ex::gfDebugLog($header);
			return false;
		}
	return true;
}

cgiを有効にする(httpd.conf)

<Directory "I:/home">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.2/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    
    AllowOverride All
    Order allow,deny
    Allow from all
    Options +ExecCGI
    AddHandler cgi-script .pl .cgi

</Directory>

EC-CUBEデータベースに接続の基本コード

php5〜php7

Database に接続

$pdo = new PDO('mysql:host='.DB_SERVER.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASSWORD);

ヒットがユニークの場合

$sql = "SELECT * FROM `tb_hogehoge`";
$statement = $pdo->query($sql);
$item = $statement->fetch(PDO::FETCH_ASSOC);
var_dump($item);

Roop の場合

$sql = "SELECT * FROM `tb_hogehoge`";
foreach($pdo->query($sql) as $item) {
	var_dump($item);
}

↓php7 から使えなくなる。

バージョン2.4系

$db = mysql_connect(DB_SERVER.":".DB_PORT,DB_USER,DB_PASSWORD);
// mysql_query("SET NAMES utf8");
mysql_set_charset('utf8');
mysql_select_db(DB_NAME, $db);
$sql1 = "SELECT * FROM `dtb_category` WHERE `category_id` = '$_GET[category_id]'";
$rs1 = mysql_query($sql1,$db);
$item1 = mysql_fetch_assoc($rs1);

バージョン2.11系

// Config読込み
// バージョン2.4系
// include $_SERVER[DOCUMENT_ROOT]."/data/install.php";
// バージョン2.11系
// include $_SERVER[DOCUMENT_ROOT]."/config/config.php";
// install.php を include しなくてもいいみたい。

//------------------------------------------------------
// MySQLに接続開始
    $db = mysql_connect(DB_SERVER.":".DB_PORT,DB_USER,DB_PASSWORD);
    // mysql_query("SET NAMES utf8");
    mysql_set_charset('utf8');
    // DB指定(確認用)
    if(!mysql_select_db(DB_NAME, $db)){
        // echo "&lt;div style=\"color:red;\"&gt;\nメインデータベースに接続できません。&lt;/div&gt;\n";
    }elseif(mysql_select_db(DB_NAME, $db)){
        // echo "&lt;div style=\"color:green;\"&gt;\nDB指定OK!(".DB_NAME.")&lt;/div&gt;\n\n\n";
    }
//------------------------------------------------------

$sql1 = "SELECT * FROM `dtb_category` WHERE `category_id` = '$_GET[category_id]'";
$rs1 = mysql_query($sql1,$db);
$item1 = mysql_fetch_assoc($rs1);

MT5 特定のカテゴリ一覧を表示する

指定したカテゴリと、その下の階層のカテゴリが表示されます。

<ul>
<h3>カテゴリ名</h3>
<MTSubCategories category="カテゴリ名" sort_order="ascend">
<MTIfNonZero tag="MTCategoryCount">
<li><a href="<$MTCategoryArchiveLink$>" title="<$MTCategoryDescription$>"><MTCategoryLabel></a>
<MTElse>
<li><MTCategoryLabel>
</MTElse>
</MTIfNonZero>
</li>
</MTSubCategories>
</ul>

Firefox で モバイルサイトの動作検証をするには

EC-CUBEの2.3系、2.4系では、/mobile でPCからもモバイルサイトにアクセスできた。

2.11系では、自動判別されているのでアクセスできない。
Firefox の ユーザーエージェント・スイッチャー でも「非対応機種です。」となってしまう。

モバイルの動作確認を実機で行うのは効率が悪い。

どうしよう?

そこで、Firefox の ユーザーエージェント・スイッチャー を生かす方法をご紹介します。

”SC_Helper_Mobile.php” の2箇所をコメントアウトします。

function lfMobileCheckCompatibility() {
    if (!SC_MobileUserAgent_Ex::isSupported()) {
        // header('Location: ' . ROOT_URLPATH . 'unsupported/' . DIR_INDEX_PATH);
        // exit;
    }
}

これで、Firefoxのアドオンを使えば、PCブラウザでモバイルサイトの動作検証ができるようになります。

MySQLの条件ソートで大文字小文字が区別されない

WHEREで大文字小文字が区別されないなんて迷惑な機能があります。
大文字小文字を区別するには条件式の前に”INARY”を付加するといいらしい。

SELECT * FROM `dtb_coupon` WHERE BINARY `coupon_code` = ‘$_POST[use_coupon]’ AND `del_flg` = ‘0’

cgi-lib.pl: Unknown Content-type: application/x-www-form-urlencoded;charset=shift_jis

いまどきでも、Perl で cgi のご依頼も時々あります。

そんなときに必ずぶつかるのが
『 cgi-lib.pl: Unknown Content-type: application/x-www-form-urlencoded;charset=shift_jis 』
au の 特定機種(W53CA,W54CA,etc..)でのみ発生します。

回避策は80行目あたりの

if (!defined $meth || $meth eq '' || $meth eq 'GET' ||
$meth eq 'HEAD' ||
$type eq 'application/x-www-form-urlencoded') {

の部分を下のように変更する。

if (!defined $meth || $meth eq '' || $meth eq 'GET' ||
$meth eq 'HEAD' ||
$type eq 'application/x-www-form-urlencoded' ||
$type eq 'application/x-www-form-urlencoded;charset=shift_jis') {

しかし、これだとPCブラウザでエラーになってしまう。
↓ こんな感じのエラーです。
『 cgi-lib.pl: Request to receive too much data: 175522 bytes 』
au のときだけ処理を変えるのが好ましい。

# UA 取得(モバイル振り分け)
$env2="";
$ag=$ENV{'HTTP_USER_AGENT'};
# UP.Browser が先頭だったらezweb
if(index($ag,"UP.Browser")==0){$env2 = 'au';}
# UP.Browser が先頭でなかったらezweb2
elsif(index($ag,"UP.Browser") > 0){$env2 = 'au';}


if($env2 eq 'au'){
	if (!defined $meth || $meth eq '' || $meth eq 'GET' || $meth eq 'HEAD' ||
	$type eq 'application/x-www-form-urlencoded' ||
	$type eq 'application/x-www-form-urlencoded;charset=shift_jis') {
}else{
	if (!defined $meth || $meth eq '' || $meth eq 'GET' || $meth eq 'HEAD' ||
	$type eq 'application/x-www-form-urlencoded') {
}
    local ($key, $val, $i);
	
    # Read in text
    if (!defined $meth || $meth eq '') {
      $in = $ENV{'QUERY_STRING'};
      $cmdflag = 1;  # also use command-line options

↑このような考え方ですが、これでは構文エラーになるので下記のようにします。


# UA 取得(au振り分け)
$URL="";
$ag=$ENV{'HTTP_USER_AGENT'};
if(index($ag,"UP.Browser")==0){$env2 = 'au';}
elsif(index($ag,"UP.Browser") > 0){$env2 = 'au';}

if($env2 eq 'au'){
		if (!defined $meth || $meth eq '' || $meth eq 'GET' || $meth eq 'HEAD' ||
		$type eq 'application/x-www-form-urlencoded' || $type eq 'application/x-www-form-urlencoded;charset=shift_jis'){
			$hogehoge = '1';
		}
}else{
		if (!defined $meth || $meth eq '' || $meth eq 'GET' || $meth eq 'HEAD' ||
		$type eq 'application/x-www-form-urlencoded') {
			$hogehoge = '1';
		}
}

if ($hogehoge eq '1') {
local ($key, $val, $i);

EC-CUBE 2.11 で商品登録ができない

EC-CUBE 2.11 で商品登録ができない
と思いきや

EC-CUBE 2.11 で商品登録ができない
シーケンスの調整で解決しました。

2.4系では、MySQLの場合 auto increment でしたが、
2.11系では、別テーブルにシーケンスを設定しているようです。
dtb_products_product_id_seq
dtb_products_class_product_class_id_seq

カテゴリ関係のテーブルも同様です。

こちらのサイトを参考にしました。

受注登録(受注管理)、受注メール、の商品名を操作する

規格を増やした場合など、
記録方法がとても複雑になってしまいます。
そのため動作が重くなるなど、デメリットに悩まされます。

そこで、
商品名(規格1、規格2、・・・・規格N)
のようにすることで、沢山の規格を軽快に利用できるようになりました。

カスタマイズの要は、
”SC_Helper_Purchase.php” の
「function registerOrderDetail」内で、product_name をUODATEする。

今のことろ、この手法がベストな感じです。

↓ソースコードは、整理できたら公開します。
こちらです。

eccube 2.11 ページ詳細 編集で システムエラー

設置パスがデフォルトのままならば、この問題は発生しない。

public_html
├html
└data

この構成を崩す場合、defaine.php を変更するのだが、Pathの処理に問題があり、管理画面の一部の機能がシステムエラーになる。
修復方法はとても面倒だ。お客様のご要望でどうしてもバージョン2.11で動かさねばならない。

簡易な回避方法は、
sfChangeCheckBox を使っていないのに書いてあるのがまずいらしい。
コメントアウトしてしまおう。

ソースコード解説はこちらです

EC-CUBE2.11で会員登録の初期値を仮会員にする

パラメータ設定でできるはずだが、動かない
/data/cache/mtb_constants.php のパーミッションを確認する
このファイルが更新されなければ、反映されない。

「管理者の承認が必要」とするには、
メールテンプレートを調整して、ユーザーが認証URLへアクセスできないようにする。

ファイルを編集して実装する場合
対象ファイル:/data/class/helper/SC_Helper_Customer.php

ソースコードはこちら

WordPress アーカイブ日付の日本語化

管理画面で、日本語を選択すれば、アーカイブ日付も日本語表示されます。
まれに、英語版Wordpressをインストールしてしまったとかデータベースの原因で、根本的な修正が必要な場合があります。

根本的な修正の対象ファイル、ソースコード解説はこちらです。

EC-CUBE から paypal へ「住所・氏名・メルアド」を渡す

ECcubeからペイパルの支払いページに移った時、フォームに自動入力する。

対象ファイル:data/downloads/module/mdl_paypal/paypal_link.tpl
以下を追加

    <!--{assign var=key value="first_name"}-->
    <input type="hidden" name="<!--{$key}-->" value="<!--{$arrForm&#91;$key&#93;.value}-->" />
    <!--{assign var=key value="last_name"}-->
    <input type="hidden" name="<!--{$key}-->" value="<!--{$arrForm&#91;$key&#93;.value}-->" />
    <!--{assign var=key value="state"}-->
    <input type="hidden" name="<!--{$key}-->" value="<!--{$arrForm&#91;$key&#93;.value}-->" />

※ 上記テンプレートの変更に伴い、モジュールファイルも調整が必要です。

これで、ページ遷移時にフォームへ自動入力されました。

paypal へ投げる金額に送料が加算されてしまうのを回避する

ペイパル へ投げる金額に送料が加算されてしまうのを回避する。
「商品価格+送料」をペイパルに投げると、送料にも消費税が加算されてしまう。
これを避けるために、純粋な商品価格のみをペイパルに投げるための処理。

	/**
		* パラメータ情報の初期化
		*/
	function initParam($arrData) {
		$this->objFormParam->addParam("cmd", "cmd", STEXT_LEN, "KVa", array("EXIST_CHECK", "MAX_LENGTH_CHECK"), PAYPAL_CMD);
		$this->objFormParam->addParam("business", "business", MTEXT_LEN, "KVa", array("EXIST_CHECK", "MAX_LENGTH_CHECK"), $arrData['business']);
		$this->objFormParam->addParam("undefined_quantity", "undefined_quantity", 1, "KVa", array("EXIST_CHECK", "MAX_LENGTH_CHECK"), PAYPAL_UNDEFINED_QUANTITY);
		$this->objFormParam->addParam("item_name", "item_name", 60, "KVa", array("EXIST_CHECK", "MAX_LENGTH_CHECK"), $arrData['item_name']);
		$this->objFormParam->addParam("currency_code", "currency_code", 3, "KVa", array("EXIST_CHECK", "MAX_LENGTH_CHECK"), PAYPAL_CURRENCY_CODE);
		
		// ペイパルのときは送料を引いて商品価格のみにする
		$arrData['payment_total'] = $arrData['payment_total'] - $arrData['deliv_fee'];
		
		$this->objFormParam->addParam("amount", "amount", STEXT_LEN, "n", array("NUM_CHECK", "EXIST_CHECK", "MAX_LENGTH_CHECK"), $arrData['payment_total']);
		$this->objFormParam->addParam("invoice", "invoice", STEXT_LEN, "n", array("EXIST_CHECK", "MAX_LENGTH_CHECK", "NUM_CHECK"), $arrData['order_id']);

EC-CUBE、ステータス変更でメールを自動送信する。

ステータスを「入金済み」にしたときに「ご入金確認メール」を自動送信する場合の例です。

メールテンプレートを追加する

/data/Smarty/templates/default/mail_templates/
order_mail.tpl をコピーして hoge_mail.tpl を新規に作成する。

「 管理画面 → システム設定 」で、
mtb_mail_template に追加
mtb_mail_tpl_pass にも追加

ここからが本題の自動送信処理です。

個別にステータスを変えた場合
/data/class/pages/admin/order/LC_Page_Admin_Order_Edit.php

/* DB登録処理 */
function lfRegistData($order_id) {
	$objQuery = new SC_Query();

	$objQuery->begin();

	// 入力データを渡す。
	$arrRet =  $this->objFormParam->getHashArray();
	foreach($arrRet as $key => $val) {
		// 配列は登録しない
		if(!is_array($val)) {
			$sqlval[$key] = $val;
		}
	}
	$sqlval['update_date'] = 'Now()';

	if (strlen($sqlval['deliv_date_year']) >= 0) {
		$sqlval['deliv_date'] = $sqlval['deliv_date_year'] . '-' . $sqlval['deliv_date_month'] . '-' . $sqlval['deliv_date_day'];
	}
	unset($sqlval['deliv_date_year']);
	unset($sqlval['deliv_date_month']);
	unset($sqlval['deliv_date_day']);

	unset($sqlval['total_point']);
	unset($sqlval['point']);
	unset($sqlval['commit_date']);

	$where = "order_id = ?";
	
	
	// ここから追加 ------------------------------
	// ここにメール送信処理を書きます。
	// ここまで追加 ------------------------------

	/*
		* XXX 本来なら配列だが, update 関数を string として
		*     チェックしているため...
		*/
	if (!isset($addcol)) $addcol = "";

	// 受注テーブルの更新
	$objQuery->update("dtb_order", $sqlval, $where, array($order_id), $addcol);

一括してステータスを変えた場合の対象ファイル
/data/class/pages/admin/order/LC_Page_Admin_Order_Status.php
ソースコード

OpenPNE でDBに接続

({php})
include OPENPNE_PATH.'config.php';
$db_array = $GLOBALS[_OPENPNE_DSN_LIST];
$db_array = $db_array[main][dsn];
// echo '<pre>'; var_dump($db_array); echo '</pre>';

//------------------------------------------------------
// MySQLに接続開始
	$db = mysql_connect($db_array[hostspec],$db_array[username],$db_array[password]);
	mysql_query("SET NAMES utf8");
	// DB指定(確認用)
	if(!mysql_select_db($db_array[database], $db)){
		echo "<div style=\"color:red;\">\nメインデータベースに接続できません。</div>\n";
	}elseif(mysql_select_db($db_array[database], $db)){
		// echo "<div style=\"color:green;\">\nDB指定OK!(".DB_NAME.")</div>\n\n\n";
	}
//------------------------------------------------------

// ↓一例です
// 自分のID
$c_member_id = $GLOBALS['AUTH']->uid();
// echo $c_member_id;

// 自分の性別
$sql5 = "SELECT * FROM `c_member_profile` WHERE `c_member_id` = '$c_member_id' AND `c_profile_id` = '1'";
$rs5 = mysql_query($sql5,$db);
$item5 = mysql_fetch_assoc($rs5);
({/php})

WordPressで記事一覧の文字数を変更する

WordPressで抜粋(the_excerpt)の文字数を変更する

で出来るはずと思いきや、2倍と文字はだめらしい。

1)標準装備のWP Multibyte Patchプラグインを有効化する。

2)wp-content/plugins/wp-multibyte-patchの中のwpmp-config-sample.phpをwpmp-config.phpにリネーム。

このファイルを編集すれば表示文字数が変更できる。

bbpressでプロファイルのフォームを並べ替える

「プロフィール編集のフォーム」を変更するには”function bb_profile_data_form”を編集する。

/bb-includes/functions.bb-template.php
L:2400付近

<table id="userinfo">
<?php
	if ( is_array($profile_info_keys) ) :
		$bb_current_id = bb_get_current_user_info( 'id' );
		
		// フォームの配列を置き換える
		echo '<pre>★'; var_dump($profile_info_keys); echo '</pre>'; // ←元の配列を表示してみる
		
		// 元の配列を参考に希望の配列と置き換える
		$profile_info_keys['first_name']['0'] = '';
		$profile_info_keys['first_name']['1'] = 'first_name';
		$profile_info_keys['last_name']['0'] = '';
		$profile_info_keys['last_name']['1'] = 'last_name';
		$profile_info_keys['display_name']['0'] = '';
		$profile_info_keys['display_name']['1'] = 'Display name as';
		$profile_info_keys['from']['0'] = '';
		$profile_info_keys['from']['1'] = 'Location';
		$profile_info_keys['user_email']['0'] = '';
		$profile_info_keys['user_email']['1'] = 'Email';
		$profile_info_keys['user_email']['2'] = 'email';
		$profile_info_keys['user_url']['0'] = '';
		$profile_info_keys['user_url']['1'] = 'Website';
		$profile_info_keys['user_url']['2'] = 'url';
		$profile_info_keys['occ']['0'] = '';
		$profile_info_keys['occ']['1'] = 'Occupation';
		$profile_info_keys['occ']['2'] = 'role';
		$profile_info_keys['interest']['0'] = '';
		$profile_info_keys['interest']['1'] = 'Interests';

memo

$profile_info_keys[‘*’][‘1,2,3’]
1:null
2:表示名
3:データの型

HTMLの整形は2483行目付近

CSSでタブをデザインする

画像を使わずにCSSでタブをデザインする。

#profile-menu li a {
	font-size: 1.1em;
	background-color: #ddd;
	padding: 4px 7px;
	border-top: 3px double #9e9e9e;
	position: relative;
	top: -10px;

	-moz-border-radius-topleft: 6px;
	-khtml-border-top-left-radius: 6px;
	-webkit-border-top-left-radius: 6px;
	border-top-left-radius: 6px;

	-moz-border-radius-topright: 6px;
	-khtml-border-top-right-radius: 6px;
	-webkit-border-top-right-radius: 6px;
	border-top-right-radius: 6px;

	-moz-border-radius-bottomleft: 6px;
	-khtml-border-bottom-left-radius: 6px;
	-webkit-border-bottom-left-radius: 6px;
	border-bottom-left-radius: 6px;

	-moz-border-radius-bottomright: 6px;
	-khtml-border-bottom-right-radius: 6px;
	-webkit-border-bottom-right-radius: 6px;
	border-bottom-right-radius: 6px;
}

Form の入力欄の角を丸くする

一例です。
text,textarea,password などの入力枠の角を丸くする。

#login-page fieldset input[type=text],
#profile-page fieldset input[type=text],
#login-page fieldset input[type=password],
#profile-page fieldset input[type=password] {
	width: 252px;
	border: 1px solid #ccc;
	padding: 2px;
	line-height: 14px;
	font-size: 12px;
	margin: 0;
	-moz-border-radius: 3px;
	-khtml-border-radius: 3px;
	-webkit-border-radius: 3px;
	border-radius: 3px;
}

EC-CUBE 2.11 で 会員登録の項目を増やす

フォーム
/data/Smarty/templates/default/frontparts/form_personal_input.tpl

確認画面
/data/Smarty/templates/default/entry/confirm.tpl

登録処理、Myページでの変更画面、入力チェック
/data/class/helper/SC_Helper_Customer.php
function sfCustomerEntryParam の後半で UPDATA で追加フィールドを登録する。

	function sfCustomerEntryParam (&$objFormParam, $isAdmin = false) {
		SC_Helper_Customer_Ex::sfCustomerCommonParam($objFormParam);
		SC_Helper_Customer_Ex::sfCustomerRegisterParam($objFormParam, $isAdmin);
		if($isAdmin) {
			$objFormParam->addParam("顧客ID", "customer_id", INT_LEN, 'n', array("NUM_CHECK"));
			$objFormParam->addParam('携帯メールアドレス', "email_mobile", MTEXT_LEN, 'a', array("NO_SPTAB", "EMAIL_CHECK", "SPTAB_CHECK" ,"EMAIL_CHAR_CHECK", "MAX_LENGTH_CHECK", "MOBILE_EMAIL_CHECK"));
			$objFormParam->addParam("会員状態", 'status', INT_LEN, 'n', array("EXIST_CHECK", "NUM_CHECK", "MAX_LENGTH_CHECK"));
			$objFormParam->addParam("SHOP用メモ", 'note', LTEXT_LEN, 'KVa', array("MAX_LENGTH_CHECK"));
			$objFormParam->addParam("所持ポイント", 'point', INT_LEN, 'n', array("NUM_CHECK"));
			
			
			// 項目追加
			// office_or 	office_name_kana 	office_name 	office_url 	office_gyousyu 	office_post0 	office_post1 	office_post2
			// mobile01 	mobile02 	mobile03	questionnaire0 	questionnaire1
			$objFormParam->addParam("会社名", 'office_or', INT_LEN, 'n', array());
			$objFormParam->addParam("会社名", 'office_name', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("会社名カナ", 'office_name_kana', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("会社URL", 'office_url', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("業種", 'office_gyousyu', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("役職", 'office_post0', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("部署1", 'office_post1', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("部署2", 'office_post2', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("携帯メール1", 'mobile01', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("携帯メール2", 'mobile02', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("携帯メール3", 'mobile03', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("質問1", 'questionnaire0', LTEXT_LEN, 'n', array());
			$objFormParam->addParam("質問2", 'questionnaire1', LTEXT_LEN, 'n', array());
			
		}
	}

表示に反映されない時は「SC_CustomerList.php」への追記を忘れているかも?