今後はこちらでブログかきます
http://info.ii-s.biz/
2012年6月27日水曜日
2012年4月16日月曜日
IODATAのUSBグラフィック USB-RGB2をwindows7で使ったらブルースクリーンが出たからその解決法 @iis_hara_dev
参考ページ
http://bbs.kakaku.com/bbs/K0000079868/
※まんま引用です
(1) CDあるいはWebからドライバーを持ってきてインストール
(2) http://www.displaylink.com/software/ から最新のdisplaylinkドライバーをダウンロード
(3) 最新のDisplaylinkドライバーをインストール
(4) 機器の接続
(5) 外部ディスプレイの接続
http://bbs.kakaku.com/bbs/K0000079868/
※まんま引用です
(1) CDあるいはWebからドライバーを持ってきてインストール
(2) http://www.displaylink.com/software/ から最新のdisplaylinkドライバーをダウンロード
(3) 最新のDisplaylinkドライバーをインストール
(4) 機器の接続
(5) 外部ディスプレイの接続
2012年3月9日金曜日
linux系のバージョンを調べる方法
引用サイト
http://oshiete.goo.ne.jp/qa/2393841.html
(1) Debian系 Debian/GNU Linux
# cat /etc/debian_version
3.1
(2) RedHat系
CentOS
# cat /etc/redhat-release
CentOS release 4.3 (Final)
Fedora Core
# cat /etc/redhat-release
Fedora Core release 5 (Bordeaux)
Vine Linux
# cat /etc/vine-release
Vine Linux 3.2 (Ducru Beaucaillou)
Turbo Linux
# cat /etc/turbolinux-release
Turbolinux Server 8.0 (Viper)
http://oshiete.goo.ne.jp/qa/2393841.html
(1) Debian系 Debian/GNU Linux
# cat /etc/debian_version
3.1
(2) RedHat系
CentOS
# cat /etc/redhat-release
CentOS release 4.3 (Final)
Fedora Core
# cat /etc/redhat-release
Fedora Core release 5 (Bordeaux)
Vine Linux
# cat /etc/vine-release
Vine Linux 3.2 (Ducru Beaucaillou)
Turbo Linux
# cat /etc/turbolinux-release
Turbolinux Server 8.0 (Viper)
2012年2月20日月曜日
【備忘録】ファィルを更新したのに画面が更新されない時のチェックリスト @iis_hara_dev
ほぼ自分用にまとめました
ありがちな順です
(1)ブラウザのキャッシュの問題
いわずもがな。
【対策】Ctrl+F5をしてみる
(2)アップロード先あるいはアップしているファイルが違う
【対策】再確認
(3)システムのキャッシュの問題
・smartyやtomcatなどフレームワークなどがキャッシュを持っている場合
イリーガルな更新をした場合などにキャッシュが更新されない時が
あります
【対策】キャッシュを削除してみる
(4)2に近いがmod_rewriteなどで見た目のディレクトリと違うファィルを参照させている
【対策】.htaccess、httpd.conf、web.xml、server.xmlなど確認
(5)一部の設定ファイルは記述の仕方を誤るとエラーとならず古いままの状態を
維持することがある
【対策】チェックコマンド、webサイトを利用する
(6)windowsサーバーの場合、管理者権限で更新しない場合、反映されない場合がある
【対策】管理者権限で更新してみる
2012年2月18日土曜日
ブログなどでブログラムを公開する時に気をつけたいなと思うこと @iis_hara_dev
最近某所でブログでプログラムを書く時に留意点などを話す機会があったので
その時の会話内容を簡単ですがまとめました
そのプログラムの背景を書く
単にプログラム内容を載せるだけでなくそれが
どういう場合にどうして必要になったかのを合わせて書く。
そうすることによって、使い所が理解できるし
必要とする人にとって検索にひっかかりやすくなります。
他人のプログラムは扱いは慎重に
このブログは自分の書いたものを公表する以外にも
備忘録として他の人のプログラムも転載することがありますが
必ずどこのサイトかのリンクは張るようにしてます。
まして本人が公開していないプログラムは必ず確認はとるべきです。
著作権がどうこうという法的な問題だけでなく、それ以上に信用問題です
また他の人のプログラムを自分のものかのように転載することで
見た人が「そのレベルのプログラムが書ける人」と誤解する可能性があります
これは他人の期待値を無駄に高めてしまい、結果として評価を
落としてしまう可能性もあります。
引用している時ははっきりと明示してかくようにしましょう
2012年2月16日木曜日
2012年2月5日日曜日
共有サーバー(ロリポップ、さくら、チカッパ)で簡単にPEARをインストール方法 2012年2月 @iis_hara_dev
何かと面倒な共有サーバーでのPEARのインストールを簡単に
行える方法としてgo-pear.phpがありますが
(4)もろもろの設定します
行える方法としてgo-pear.phpがありますが
現在webの検索で引っかかるものでは古かったりするものが多いのでまとめました。
今回はロリポップで設置・動作をしましたが基本的に共有サーバーで動くはずです
参考サイト
- http://www.karate-style.jp/2007/06/13/pear-2/
- http://masha.maakikaku.jp/2008/05/gopearpear.php
- http://d.hatena.ne.jp/tdoi/20111228/1325054820
(1)まずgo-pear.phpを用意する必要がありますが
よく出てくる http://go-pear.org/ はドメイン切れ。
http://pear.php.net/go-pear では古いためエラーとなって
動きません
の中で記述されている
を使う必要があります。
こちらをダウンロードしてgo-pear.phpという名前で保存してください
(2)これを適当なディレクトリにFTP等でアッフロードします。
今回は
/home/foo/bar/web/lib/go-pear.php とします
そしてブラウザから
http://xxxxxx/lib/go-pear.php にアクセスします
(3)下部のnextをクリックします。
Installation prefixがインストール先ののディレクトリ
php.exe path, optional (CLI command tools)がPHPのパスとなります
PHPのパスに関しては各サーバーのマニュアル参照のこと
だいたい /usr/local/bin/php になるはずです
あとはとくにデフォルトのままで問題ありません
(5)Installをクリックします
いくつか警告が出ることもあるようですが
Installation Completed !
と出れば問題ありません
(6)index.phpの修正
/home/foo/bar/web/lib/にindex.phpができているので
こちらをDLして下記の修正をします
$pear_dir = '@pear_dir@';
↓
$pear_dir = ' /home/foo/bar/web/lib/PEAR';
※各自の環境にあわせてください
(7)各パッケージのインストール
http://xxxxxx/lib/index.php にアクセス
Quick-install a package
に欲しいパッケージ名を入れてinstallボタンを押すと自動的に
インストールされます。今回は
Net_URL2などをいれてます。
(8)インクルードパスの設定
最後にhtaccessで
php_value include_path ".: /home/foo/bar/web/lib/PEAR/"
を設定してあげると
phpで使う際には
require_once('HTTP/xxx.php');
で呼び出せます。
またPEAR内部ではrequire_once('HTTP/xxx.php');で
呼び出されているのでこれがないと動キません
ただし、ロリポップでは上記の記述が効かなかったので
phpに
ini_set('include_path', " /home/foo/bar/web/lib/PEAR/ ");
と書いて対応しました
※なお、ディレクトリの絶対パスをしらべるPHPを参考として下記に書いておきます
echo getcwd();
2011年11月11日金曜日
nullと比較するif文かくときに、一歩レベルあげる書き方
多くの言語で
if($hoge == null)
といった書き方をしますが、少しの工夫で後の多大な
バグ取りの時間を防げるかもしれません。
その「少しの工夫」の書き方とは下記のとおりです。
if(null == $hoge)
逆にしただけです。なぜこの書き方が良いのか説明します。
まず前提として多くの言語では
$hoge=1;
という代入が成功した場合、"true"を返す仕様になっています
※1 ためしてみたところ、PHPの$hoge=null;でもtrueがかえります。
※2 javaは代入された値そのものがかえるようです。
つまりif($hoge = null) という文が文法エラーとならず成り立ってしまいます。
たった一個=を忘れただけで全く意図しない動きになり、かつあとから修正するときも
非常に気づきにくいバグです。
ですが
if(null == $hoge)
と書くことによってたとえば
if(null = $hoge)
と書いてしまっても、nullに代入ができるわけではないので
コンパイルエラーや実行時エラーになります。よって早い段階でミスに気づけます。
この書き方の大きなメリットは上記の単純ミスに気づくというだけではなく、
いかにしてバグの起こりにくいソースを書くかという意識づけができることです。
PGやSEの大切な仕事として「いかにしてヒューマンエラーを防ぐか」がありますが
こういった些細な書き方一つがその意識向上のきっかけになつていただければ幸いです。
if($hoge == null)
といった書き方をしますが、少しの工夫で後の多大な
バグ取りの時間を防げるかもしれません。
その「少しの工夫」の書き方とは下記のとおりです。
if(null == $hoge)
逆にしただけです。なぜこの書き方が良いのか説明します。
まず前提として多くの言語では
$hoge=1;
という代入が成功した場合、"true"を返す仕様になっています
※1 ためしてみたところ、PHPの$hoge=null;でもtrueがかえります。
※2 javaは代入された値そのものがかえるようです。
つまりif($hoge = null) という文が文法エラーとならず成り立ってしまいます。
たった一個=を忘れただけで全く意図しない動きになり、かつあとから修正するときも
非常に気づきにくいバグです。
ですが
if(null == $hoge)
と書くことによってたとえば
if(null = $hoge)
と書いてしまっても、nullに代入ができるわけではないので
コンパイルエラーや実行時エラーになります。よって早い段階でミスに気づけます。
この書き方の大きなメリットは上記の単純ミスに気づくというだけではなく、
いかにしてバグの起こりにくいソースを書くかという意識づけができることです。
PGやSEの大切な仕事として「いかにしてヒューマンエラーを防ぐか」がありますが
こういった些細な書き方一つがその意識向上のきっかけになつていただければ幸いです。
2011年11月4日金曜日
Javaの数値チェックでNumberFormatExceptionを使ってはいけない理由
この前、Javaの半角数値チェックでぐぐっていたらわりと下記みたいな
ソースコードを見つけました
private static boolean isNumeric(String hoge) {
try {
Integer.parseInt(hoge);
return true;
} catch(NumberFormatException e) {
return false;
}
}
これは動きとしては正しい結果をだしますが
好ましくありません。
下記のような書き方のほうが好ましいです
private static boolean isNumeric(String hoge){
char c = null;
for (int i = 0 ; i < hoge.length(); i++){
c = hoge.charAt(i);
if (c < '0' || c > '9'){
return false;
}
}
return true;
}
理由1
Javaはガベージコレクションのおかげでスマートなメモリ管理を
可能ですが、例外もあります。それは名の通り"例外"の時です。
Exceptionがthrowされると一時的でもヒープを大幅に使うので
やはりexceptionはなるべく避けるように使うべきです。
これが何十万件のデータを処理するバッチならば当然避けるべきです
理由2
上記とかぶりますがExceptionはその名の通り、「例外」ですので
プログラマの想定しなかったケースのみ発生するようなあり方が
好ましいためです。チェックのために使うというのはプログラム設計
としてよろしくないためです(※理由2は個人的見解です)
余談
たとえばほとんど数値以外の文字が入ってくること無いが
想定される場合はNumberFormatExceptionを使うケースでもよいかもしれません
ただその場合NumberFormatExceptionをthrowする、あるいはラッピングされた
なんからのExceptionをthrowするという設計のほうが正しい気もしますが
ソースコードを見つけました
private static boolean isNumeric(String hoge) {
try {
Integer.parseInt(hoge);
return true;
} catch(NumberFormatException e) {
return false;
}
}
これは動きとしては正しい結果をだしますが
好ましくありません。
下記のような書き方のほうが好ましいです
private static boolean isNumeric(String hoge){
char c = null;
for (int i = 0 ; i < hoge.length(); i++){
c = hoge.charAt(i);
if (c < '0' || c > '9'){
return false;
}
}
return true;
}
理由1
Javaはガベージコレクションのおかげでスマートなメモリ管理を
可能ですが、例外もあります。それは名の通り"例外"の時です。
Exceptionがthrowされると一時的でもヒープを大幅に使うので
やはりexceptionはなるべく避けるように使うべきです。
これが何十万件のデータを処理するバッチならば当然避けるべきです
理由2
上記とかぶりますがExceptionはその名の通り、「例外」ですので
プログラマの想定しなかったケースのみ発生するようなあり方が
好ましいためです。チェックのために使うというのはプログラム設計
としてよろしくないためです(※理由2は個人的見解です)
余談
たとえばほとんど数値以外の文字が入ってくること無いが
想定される場合はNumberFormatExceptionを使うケースでもよいかもしれません
ただその場合NumberFormatExceptionをthrowする、あるいはラッピングされた
なんからのExceptionをthrowするという設計のほうが正しい気もしますが
2011年9月30日金曜日
FacebookアプリでPHP SDK(v.3.1.1)を使ったバックエンド側処理
FBアプリを作るとき、フロント側とバック側で分けて作るときのサンプルみたいなもの
今回したいのは
フロント側をフラッシュやJSで実装して
通信することでバックエンド側で処理させたい
ということ
使うのはPHP SDK(v.3.1.1)
渡されるのはfacebookのIDのみ
渡される値のnameはidとアプリで個人ごとに発行されるaccess_tokenが必要
ユーザーのセッション内に
fb_(アプリID)_access_token
の名前で入っている
なお認証時に必要なpermissionを取ることを忘れないこと
以下サンプル
require 'facebook.php';//SDK読み込み
//自分のあふりにあわせて変更
$facebook = new Facebook(array(
'appId' => 'xxxxxxxxxxxxxxxxxx',
'secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
));
//ユーザーIDなし
if(!$_REQUEST['id']){
//エラー処理
}
//ユーザーID不正
if(!is_numeric($_REQUEST['id'])){
//エラー処理
}
//ユーザー情報取得
try {
$user_profile = $facebook->api('/'.$_REQUEST['userID'],'GET',array('access_token'=>$_REQUEST['accessToken']));
//print_r($user_profile);
} catch (FacebookApiException $e) {
//エラー処理
}
//友達一覧取得
try {
$friends = $facebook->api('/'.$_REQUEST['userID'].'/friends','GET',array('access_token'=>$_REQUEST['accessToken']));
} catch (FacebookApiException $e) {
//エラー処理
}
//写真をアルバムへ
try {
$facebook->api('/'.$_REQUEST['userID'].'/photos','post',array('access_token'=>$_REQUEST['accessToken'],'message' => 'hoge','picture' => '@/some/where/hoge.jpg'));
} catch (FacebookApiException $e) {
//エラー処理
}
//ウォール投稿
try {
$facebook->api('/'.$_REQUEST['userID'].'/feed','post',array('access_token'=>$_REQUEST['accessToken'],'message' => 'hoge'));
} catch (FacebookApiException $e) {
//エラー処理
}
今回したいのは
フロント側をフラッシュやJSで実装して
通信することでバックエンド側で処理させたい
ということ
使うのはPHP SDK(v.3.1.1)
渡されるのはfacebookのIDのみ
渡される値のnameはidとアプリで個人ごとに発行されるaccess_tokenが必要
ユーザーのセッション内に
fb_(アプリID)_access_token
の名前で入っている
なお認証時に必要なpermissionを取ることを忘れないこと
以下サンプル
require 'facebook.php';//SDK読み込み
//自分のあふりにあわせて変更
$facebook = new Facebook(array(
'appId' => 'xxxxxxxxxxxxxxxxxx',
'secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
));
//ユーザーIDなし
if(!$_REQUEST['id']){
//エラー処理
}
//ユーザーID不正
if(!is_numeric($_REQUEST['id'])){
//エラー処理
}
//ユーザー情報取得
try {
$user_profile = $facebook->api('/'.$_REQUEST['userID'],'GET',array('access_token'=>$_REQUEST['accessToken']));
//print_r($user_profile);
} catch (FacebookApiException $e) {
//エラー処理
}
//友達一覧取得
try {
$friends = $facebook->api('/'.$_REQUEST['userID'].'/friends','GET',array('access_token'=>$_REQUEST['accessToken']));
} catch (FacebookApiException $e) {
//エラー処理
}
//写真をアルバムへ
try {
$facebook->api('/'.$_REQUEST['userID'].'/photos','post',array('access_token'=>$_REQUEST['accessToken'],'message' => 'hoge','picture' => '@/some/where/hoge.jpg'));
} catch (FacebookApiException $e) {
//エラー処理
}
//ウォール投稿
try {
$facebook->api('/'.$_REQUEST['userID'].'/feed','post',array('access_token'=>$_REQUEST['accessToken'],'message' => 'hoge'));
} catch (FacebookApiException $e) {
//エラー処理
}
2011年3月8日火曜日
ファイルだけディレクトリだけ、パーミッションを変更したい場合のコマンド
参考サイト
http://piro791.blog.so-net.ne.jp/2010-07-21-2
ディレクトリだけ
find /some-directory -type d -exec chmod o-x {} \;
ファイルだけ
find /some-directory -type f -exec chmod o-x {} \;
http://piro791.blog.so-net.ne.jp/2010-07-21-2
ディレクトリだけ
find /some-directory -type d -exec chmod o-x {} \;
ファイルだけ
find /some-directory -type f -exec chmod o-x {} \;
2011年2月9日水曜日
[PHP]動的な文字列を縦書で表示するためのサンプルみたいなもの
時々ある、文字を縦書きさせたいという仕様に対して
調べたこと、考えたことをメモとして残します
(1)解決法その1 CSSを使う
参考:http://www.tagindex.com/stylesheet/text_font/writing_mode.html
writing-mode: tb-rl;
で出来ますがIEのみの対応となるので実質意味がありません。
IE限定の環境であればできるかも
(2)画像化する
動的な文字列を画像化することは出来なくはないのですが下記に比べて
難易度が高いので却下です。
(3)文字を配列化して改行で対応
出力例は http://ii-s.heteml.jp/test.php
ソースサンプルは下記の通り。
<?
$name="原克志";
$address="東京都品川区";
$tel="03-1234-5678";//ここらが本来動的
//文字列のながさ取得
$name_len=mb_strlen($name,'utf-8');
$address_len=mb_strlen($address,'utf-8');
$tel_len=mb_strlen($tel,'utf-8');
//ハイフンは|へ
$name=str_replace('-','|',$name);
$address=str_replace('-','|',$address);
$tel=str_replace('-','|',$tel);
//見栄えのため全角化
//参考:http://astrodeo.com/blog/archives/122
$name=mb_convert_kana($name,'ASKV','utf-8');
$address=mb_convert_kana($address,'ASKV','utf-8');
$tel=mb_convert_kana($tel,'ASKV','utf-8');
/*他置換などは仕様に準じること、置換に関しては一つの
関数にまとめることを推奨*/
//配列初期化
$name_arr=array();
$address_arr=array();
$tel_arr=array();
//文字列を配列化
for($i=0;$i<$name_len;$i++){
$name_arr[]=mb_substr($name,$i,1,'utf-8');
}
for($i=0;$i<$address_len;$i++){
$address_arr[]=mb_substr($address,$i,1,'utf-8');
}
for($i=0;$i<$tel_len;$i++){
$tel_arr[]=mb_substr($tel,$i,1,'utf-8');
}
?>
<html>
<head>
<title>縦書きテスト</title>
</head>
<body>
<!--テーブルなとでこのとき気をつけるのは縦書きのため見栄え上と反対の順序で書く必要あり-->
<table border="1">
<tr>
<td valign="top"align="center">電<br />話</td>
<td valign="top"align="center">住<br />所</td>
<td valign="top"align="center">名<br />前</td>
</tr>
<tr>
<td valign="top"align="center"><? foreach($tel_arr as $value){ echo $value.'<br />';} ?></td>
<td valign="top"align="center"><? foreach($address_arr as $value){ echo $value.'<br />';} ?></td>
<td valign="top"align="center"><? foreach($name_arr as $value){ echo $value.'<br />';} ?></td>
</tr>
</table>
</body>
</html>
調べたこと、考えたことをメモとして残します
(1)解決法その1 CSSを使う
参考:http://www.tagindex.com/stylesheet/text_font/writing_mode.html
writing-mode: tb-rl;
で出来ますがIEのみの対応となるので実質意味がありません。
IE限定の環境であればできるかも
(2)画像化する
動的な文字列を画像化することは出来なくはないのですが下記に比べて
難易度が高いので却下です。
(3)文字を配列化して改行で対応
出力例は http://ii-s.heteml.jp/test.php
ソースサンプルは下記の通り。
<?
$name="原克志";
$address="東京都品川区";
$tel="03-1234-5678";//ここらが本来動的
//文字列のながさ取得
$name_len=mb_strlen($name,'utf-8');
$address_len=mb_strlen($address,'utf-8');
$tel_len=mb_strlen($tel,'utf-8');
//ハイフンは|へ
$name=str_replace('-','|',$name);
$address=str_replace('-','|',$address);
$tel=str_replace('-','|',$tel);
//見栄えのため全角化
//参考:http://astrodeo.com/blog/archives/122
$name=mb_convert_kana($name,'ASKV','utf-8');
$address=mb_convert_kana($address,'ASKV','utf-8');
$tel=mb_convert_kana($tel,'ASKV','utf-8');
/*他置換などは仕様に準じること、置換に関しては一つの
関数にまとめることを推奨*/
//配列初期化
$name_arr=array();
$address_arr=array();
$tel_arr=array();
//文字列を配列化
for($i=0;$i<$name_len;$i++){
$name_arr[]=mb_substr($name,$i,1,'utf-8');
}
for($i=0;$i<$address_len;$i++){
$address_arr[]=mb_substr($address,$i,1,'utf-8');
}
for($i=0;$i<$tel_len;$i++){
$tel_arr[]=mb_substr($tel,$i,1,'utf-8');
}
?>
<html>
<head>
<title>縦書きテスト</title>
</head>
<body>
<!--テーブルなとでこのとき気をつけるのは縦書きのため見栄え上と反対の順序で書く必要あり-->
<table border="1">
<tr>
<td valign="top"align="center">電<br />話</td>
<td valign="top"align="center">住<br />所</td>
<td valign="top"align="center">名<br />前</td>
</tr>
<tr>
<td valign="top"align="center"><? foreach($tel_arr as $value){ echo $value.'<br />';} ?></td>
<td valign="top"align="center"><? foreach($address_arr as $value){ echo $value.'<br />';} ?></td>
<td valign="top"align="center"><? foreach($name_arr as $value){ echo $value.'<br />';} ?></td>
</tr>
</table>
</body>
</html>
2011年1月18日火曜日
EC-CUBEでメルマガとってたら送料無料に
data/class/pages/shopping/LC_Page_Shopping_Confirm.phpの
102行目ぐらい。キャンペーンを参考に
//メルマガとってたら無料
if($_SESSION['customer']['mailmaga_flg']==1 || $_SESSION['customer']['mailmaga_flg']==2){
$arrData['payment_total'] -= $arrData['deliv_fee'];
$arrData['deliv_fee'] = 0;
}
102行目ぐらい。キャンペーンを参考に
//メルマガとってたら無料
if($_SESSION['customer']['mailmaga_flg']==1 || $_SESSION['customer']['mailmaga_flg']==2){
$arrData['payment_total'] -= $arrData['deliv_fee'];
$arrData['deliv_fee'] = 0;
}
EC-CUBEでカテゴリーに対して画像を項目追加するサンプル(管理画面側)
画像保管場所とかは適当に変えてください。
まだいい方法がありそうだけどとりあえず
○前提
・ファイルアップロードのpostをcategory_imgとする
・DBのカラムも合わせる
○DBに追加
・ dtb_categoryテーブルにcategory_imgカラム追加。textあたりで
○category.tpl変更
<!--▼画面右-->
<td width="428" valign="top">
<span class="red12"><!--{$arrErr.category_name}--></span>
<input type="text" name="category_name" value="<!--{$arrForm.category_name|escape}-->" size="30" class="box30" maxlength="<!--{$smarty.const.STEXT_LEN}-->"/>
<input type="file" name="category_img" size="30" class="box30" /><!--ここを追加-->
<input type="submit" name="button" value="登録" onclick="fnModeSubmit('edit','',''); return false;"/><span class="red10"> (上限<!--{$smarty.const.STEXT_LEN}-->文字)</span>
<table width="428" border="0" cellspacing="0" cellpadding="0" summary=" ">
<tr><td height="15"></td></tr>
</table>
<tr bgcolor="#f2f1ec" align="center" class="fs12n">
<td width="30">ID</td>
<td width="30">画像</td>
<td width="160">カテゴリ名</td><!--ここを追加-->
<td width="60">編集</td>
<td width="60">削除</td>
<td width="60">移動</td>
</tr>
<!--{section name=cnt loop=$arrList}-->
<tr bgcolor="<!--{if $arrForm.category_id != $arrList[cnt].category_id}-->#ffffff<!--{else}--><!--{$smarty.const.SELECT_RGB}--><!--{/if}-->" align="left" class="fs12n">
<td><!--{$arrList[cnt].category_id}--></td>
<!--ここから追加-->
<td><img src="<!--{$smarty.const.URL_DIR}-->user_data/<!--{$arrList[cnt].category_img}-->"></td>
<!--ここまで追加-->
<td>
<!--{if $arrList[cnt].level != $smarty.const.LEVEL_MAX}-->
<a href="<!--{$smarty.server.PHP_SELF|escape}-->" onclick="fnModeSubmit('tree', 'parent_category_id', <!--{$arrList[cnt].category_id}-->); return false"><!--{$arrList[cnt].category_name|escape}--></td>
<!--{else}-->
<!--{$arrList[cnt].category_name|escape}-->
<!--{/if}-->
<td align="center">
<!--{if $arrForm.category_id != $arrList[cnt].category_id}-->
<a href="<!--{$smarty.server.PHP_SELF|escape}-->" onclick="fnModeSubmit('pre_edit', 'category_id', <!--{$arrList[cnt].category_id}-->); return false;" />編集</a>
<!--{else}-->
編集中
<!--{/if}-->
</td>
<td align="center">
<a href="<!--{$smarty.server.PHP_SELF|escape}-->" onclick="fnModeSubmit('delete', 'category_id', <!--{$arrList[cnt].category_id}-->); return false;" />削除</a>
</td>
<td align="center">
<!--{* 移動 *}-->
<!--{if $smarty.section.cnt.iteration != 1}-->
<a href="<!--{$smarty.server.PHP_SELF|escape}-->" onclick="fnModeSubmit('up','category_id', <!--{$arrList[cnt].category_id}-->); return false;">上へ</a>
<!--{/if}-->
<!--{if $smarty.section.cnt.iteration != $smarty.section.cnt.last}-->
<a href="<!--{$smarty.server.PHP_SELF|escape}-->" onclick="fnModeSubmit('down','category_id', <!--{$arrList[cnt].category_id}-->); return false;">下へ</a>
<!--{/if}-->
</td>
</tr>
<!--{/section}-->
○LC_Page_Admin_Products_category.php変更(ほんとはEXをさわるべき)
function process() {
$conn = new SC_DBConn();
$objView = new SC_AdminView();
$objSess = new SC_Session();
$objDb = new SC_Helper_DB_Ex();
$category_img_name=$_FILES['category_img']['name'];//←ここを追加
// 認証可否の判定
SC_Utils_Ex::sfIsSuccess($objSess);
(中略)
case 'edit':
$this->objFormParam->convParam();
$arrRet = $this->objFormParam->getHashArray();
$this->arrErr = $this->lfCheckError($arrRet);
//ここから追加
// ルートディレクトリ
$top_dir = USER_PATH;
// ファイル管理クラス
$objUpFile = new SC_UploadFile($top_dir, $top_dir);
// ファイル情報の初期化
$this->lfInitFile($objUpFile);
$ret = $objUpFile->makeTempFile('category_img', false);
if($ret != "") {
$arrErr['category_img'] = $ret;
} else {
$this->tpl_onload .= "alert('ファイルをアップロードしました。');";
$this->arrForm['category_img'] = $category_name_name;
// echo($_FILES['category_img']['name']."----");
}
//ここまで追加
if(count($this->arrErr) == 0) {
if($_POST['category_id'] == "") {
$objQuery = new SC_Query();
$count = $objQuery->count("dtb_category");
if($count < category_MAX) {
$this->lfInsertCat($_POST['parent_category_id'],$category_name_name);//←引数変更
} else {
print("カテゴリの登録最大数を超えました。");
}
} else {
$this->lfUpdateCat($_POST['category_id'],$category_name_name);//←引数変更
}
} else {
$this->arrForm = array_merge($this->arrForm, $this->objFormParam->getHashArray());
$this->arrForm['category_id'] = $_POST['category_id'];
}
break;
(中略)
// カテゴリの新規追加
function lfInsertCat($parent_category_id,$category_img) {//←引数変更
$objQuery = new SC_Query();
$objQuery->begin(); // トランザクションの開始
if($parent_category_id == 0) {
// ROOT階層で最大のランクを取得する。
$where = "parent_category_id = ?";
$rank = $objQuery->max("dtb_category", "rank", $where, array($parent_category_id)) + 1;
} else {
// 親のランクを自分のランクとする。
$where = "category_id = ?";
$rank = $objQuery->get("dtb_category", "rank", $where, array($parent_category_id));
// 追加レコードのランク以上のレコードを一つあげる。
$sqlup = "UPDATE dtb_category SET rank = (rank + 1) WHERE rank >= ?";
$objQuery->exec($sqlup, array($rank));
}
$where = "category_id = ?";
// 自分のレベルを取得する(親のレベル + 1)
$level = $objQuery->get("dtb_category", "level", $where, array($parent_category_id)) + 1;
// 入力データを渡す。
$sqlval = $this->objFormParam->getHashArray();
$sqlval['create_date'] = "Now()";
$sqlval['update_date'] = "Now()";
$sqlval['creator_id'] = $_SESSION['member_id'];
$sqlval['parent_category_id'] = $parent_category_id;
$sqlval['category_img'] = $category_img;//←追加
$sqlval['rank'] = $rank;
$sqlval['level'] = $level;
// INSERTの実行
$objQuery->insert("dtb_category", $sqlval);
$objQuery->commit(); // トランザクションの終了
}
// カテゴリの編集
function lfUpdateCat($category_id,$category_img) {//←引数変更
$objQuery = new SC_Query();
// 入力データを渡す。
$sqlval = $this->objFormParam->getHashArray();
$sqlval['update_date'] = "Now()";
$sqlval['category_img'] = $category_img;//←追加
$where = "category_id = ?";
$objQuery->update("dtb_category", $sqlval, $where, array($category_id));
}
(中略)
//以下の関数を追加。サイズとかは適当
/* ファイル情報の初期化 */
function lfInitFile(&$objUpFile) {
$objUpFile->addFile("カテゴリ画像", 'category_img', array('jpg', 'gif', 'png'),IMAGE_SIZE, true, SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT);
}
まだいい方法がありそうだけどとりあえず
○前提
・ファイルアップロードのpostをcategory_imgとする
・DBのカラムも合わせる
○DBに追加
・ dtb_categoryテーブルにcategory_imgカラム追加。textあたりで
○category.tpl変更
<!--▼画面右-->
<td width="428" valign="top">
<span class="red12"><!--{$arrErr.category_name}--></span>
<input type="text" name="category_name" value="<!--{$arrForm.category_name|escape}-->" size="30" class="box30" maxlength="<!--{$smarty.const.STEXT_LEN}-->"/>
<input type="file" name="category_img" size="30" class="box30" /><!--ここを追加-->
<input type="submit" name="button" value="登録" onclick="fnModeSubmit('edit','',''); return false;"/><span class="red10"> (上限<!--{$smarty.const.STEXT_LEN}-->文字)</span>
<table width="428" border="0" cellspacing="0" cellpadding="0" summary=" ">
<tr><td height="15"></td></tr>
</table>
<tr bgcolor="#f2f1ec" align="center" class="fs12n">
<td width="30">ID</td>
<td width="30">画像</td>
<td width="160">カテゴリ名</td><!--ここを追加-->
<td width="60">編集</td>
<td width="60">削除</td>
<td width="60">移動</td>
</tr>
<!--{section name=cnt loop=$arrList}-->
<tr bgcolor="<!--{if $arrForm.category_id != $arrList[cnt].category_id}-->#ffffff<!--{else}--><!--{$smarty.const.SELECT_RGB}--><!--{/if}-->" align="left" class="fs12n">
<td><!--{$arrList[cnt].category_id}--></td>
<!--ここから追加-->
<td><img src="<!--{$smarty.const.URL_DIR}-->user_data/<!--{$arrList[cnt].category_img}-->"></td>
<!--ここまで追加-->
<td>
<!--{if $arrList[cnt].level != $smarty.const.LEVEL_MAX}-->
<a href="<!--{$smarty.server.PHP_SELF|escape}-->" onclick="fnModeSubmit('tree', 'parent_category_id', <!--{$arrList[cnt].category_id}-->); return false"><!--{$arrList[cnt].category_name|escape}--></td>
<!--{else}-->
<!--{$arrList[cnt].category_name|escape}-->
<!--{/if}-->
<td align="center">
<!--{if $arrForm.category_id != $arrList[cnt].category_id}-->
<a href="<!--{$smarty.server.PHP_SELF|escape}-->" onclick="fnModeSubmit('pre_edit', 'category_id', <!--{$arrList[cnt].category_id}-->); return false;" />編集</a>
<!--{else}-->
編集中
<!--{/if}-->
</td>
<td align="center">
<a href="<!--{$smarty.server.PHP_SELF|escape}-->" onclick="fnModeSubmit('delete', 'category_id', <!--{$arrList[cnt].category_id}-->); return false;" />削除</a>
</td>
<td align="center">
<!--{* 移動 *}-->
<!--{if $smarty.section.cnt.iteration != 1}-->
<a href="<!--{$smarty.server.PHP_SELF|escape}-->" onclick="fnModeSubmit('up','category_id', <!--{$arrList[cnt].category_id}-->); return false;">上へ</a>
<!--{/if}-->
<!--{if $smarty.section.cnt.iteration != $smarty.section.cnt.last}-->
<a href="<!--{$smarty.server.PHP_SELF|escape}-->" onclick="fnModeSubmit('down','category_id', <!--{$arrList[cnt].category_id}-->); return false;">下へ</a>
<!--{/if}-->
</td>
</tr>
<!--{/section}-->
○LC_Page_Admin_Products_category.php変更(ほんとはEXをさわるべき)
function process() {
$conn = new SC_DBConn();
$objView = new SC_AdminView();
$objSess = new SC_Session();
$objDb = new SC_Helper_DB_Ex();
$category_img_name=$_FILES['category_img']['name'];//←ここを追加
// 認証可否の判定
SC_Utils_Ex::sfIsSuccess($objSess);
(中略)
case 'edit':
$this->objFormParam->convParam();
$arrRet = $this->objFormParam->getHashArray();
$this->arrErr = $this->lfCheckError($arrRet);
//ここから追加
// ルートディレクトリ
$top_dir = USER_PATH;
// ファイル管理クラス
$objUpFile = new SC_UploadFile($top_dir, $top_dir);
// ファイル情報の初期化
$this->lfInitFile($objUpFile);
$ret = $objUpFile->makeTempFile('category_img', false);
if($ret != "") {
$arrErr['category_img'] = $ret;
} else {
$this->tpl_onload .= "alert('ファイルをアップロードしました。');";
$this->arrForm['category_img'] = $category_name_name;
// echo($_FILES['category_img']['name']."----");
}
//ここまで追加
if(count($this->arrErr) == 0) {
if($_POST['category_id'] == "") {
$objQuery = new SC_Query();
$count = $objQuery->count("dtb_category");
if($count < category_MAX) {
$this->lfInsertCat($_POST['parent_category_id'],$category_name_name);//←引数変更
} else {
print("カテゴリの登録最大数を超えました。");
}
} else {
$this->lfUpdateCat($_POST['category_id'],$category_name_name);//←引数変更
}
} else {
$this->arrForm = array_merge($this->arrForm, $this->objFormParam->getHashArray());
$this->arrForm['category_id'] = $_POST['category_id'];
}
break;
(中略)
// カテゴリの新規追加
function lfInsertCat($parent_category_id,$category_img) {//←引数変更
$objQuery = new SC_Query();
$objQuery->begin(); // トランザクションの開始
if($parent_category_id == 0) {
// ROOT階層で最大のランクを取得する。
$where = "parent_category_id = ?";
$rank = $objQuery->max("dtb_category", "rank", $where, array($parent_category_id)) + 1;
} else {
// 親のランクを自分のランクとする。
$where = "category_id = ?";
$rank = $objQuery->get("dtb_category", "rank", $where, array($parent_category_id));
// 追加レコードのランク以上のレコードを一つあげる。
$sqlup = "UPDATE dtb_category SET rank = (rank + 1) WHERE rank >= ?";
$objQuery->exec($sqlup, array($rank));
}
$where = "category_id = ?";
// 自分のレベルを取得する(親のレベル + 1)
$level = $objQuery->get("dtb_category", "level", $where, array($parent_category_id)) + 1;
// 入力データを渡す。
$sqlval = $this->objFormParam->getHashArray();
$sqlval['create_date'] = "Now()";
$sqlval['update_date'] = "Now()";
$sqlval['creator_id'] = $_SESSION['member_id'];
$sqlval['parent_category_id'] = $parent_category_id;
$sqlval['category_img'] = $category_img;//←追加
$sqlval['rank'] = $rank;
$sqlval['level'] = $level;
// INSERTの実行
$objQuery->insert("dtb_category", $sqlval);
$objQuery->commit(); // トランザクションの終了
}
// カテゴリの編集
function lfUpdateCat($category_id,$category_img) {//←引数変更
$objQuery = new SC_Query();
// 入力データを渡す。
$sqlval = $this->objFormParam->getHashArray();
$sqlval['update_date'] = "Now()";
$sqlval['category_img'] = $category_img;//←追加
$where = "category_id = ?";
$objQuery->update("dtb_category", $sqlval, $where, array($category_id));
}
(中略)
//以下の関数を追加。サイズとかは適当
/* ファイル情報の初期化 */
function lfInitFile(&$objUpFile) {
$objUpFile->addFile("カテゴリ画像", 'category_img', array('jpg', 'gif', 'png'),IMAGE_SIZE, true, SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT);
}
2011年1月16日日曜日
いまさら人に聞けないRSS取得のサンプル
$url=http://xxxx.com/feeds/";
$rss = simplexml_load_file($url);//php5
$meta_title=$rss->channel->title;//全体のタイトル取得
$meta_link=$rss->channel->link;//全体のリンク先取得
echo $meta_title.'<br>';
echo $meta_link.'<br>';
echo '<hr>';
//記事群を取得
$items=$rss->channel->item;
for($i=0;$i<count($items);$i++){
$title = $items[$i]->title;//記事のタイトル
$link =$items[$i]->link;//記事のリンク
//記事の日付。パターンあり
if($items[$i]->dc->date){
$date = $items[$i]->dc->date;
} else if($items[$i]->pubDate) {
$date =$items[$i]->pubDate;
} else if($items[$i]->updated) {
$date =$items[$i]->updated;//滅多にない
}
//タイムスタンプを1970年1月1日からの秒数に変換
$timestamp = date("U",strtotime($date));
//表示用に変更
$daytime = date("Y/m/d H:i:s",strtotime($date));
//曜日を設定
$youbi = array(0 => '(日)', 1 => '(月)', 2 => '(火)', 3 => '(水)', 4 => '(木)', 5 => '(金)', 6 => '(土)');
$youbi2 = date("w",strtotime($date));
//出力
echo $daytime.$youbi[$youbi2].' '.$items[$i]->title."<br>".$link."<br><br>";
}
$rss = simplexml_load_file($url);//php5
$meta_title=$rss->channel->title;//全体のタイトル取得
$meta_link=$rss->channel->link;//全体のリンク先取得
echo $meta_title.'<br>';
echo $meta_link.'<br>';
echo '<hr>';
//記事群を取得
$items=$rss->channel->item;
for($i=0;$i<count($items);$i++){
$title = $items[$i]->title;//記事のタイトル
$link =$items[$i]->link;//記事のリンク
//記事の日付。パターンあり
if($items[$i]->dc->date){
$date = $items[$i]->dc->date;
} else if($items[$i]->pubDate) {
$date =$items[$i]->pubDate;
} else if($items[$i]->updated) {
$date =$items[$i]->updated;//滅多にない
}
//タイムスタンプを1970年1月1日からの秒数に変換
$timestamp = date("U",strtotime($date));
//表示用に変更
$daytime = date("Y/m/d H:i:s",strtotime($date));
//曜日を設定
$youbi = array(0 => '(日)', 1 => '(月)', 2 => '(火)', 3 => '(水)', 4 => '(木)', 5 => '(金)', 6 => '(土)');
$youbi2 = date("w",strtotime($date));
//出力
echo $daytime.$youbi[$youbi2].' '.$items[$i]->title."<br>".$link."<br><br>";
}
2011年1月3日月曜日
ワードプレスのcategory.phpでカテゴリースラッグを取得する方法方法
参考サイト http://ja.forums.wordpress.org/topic/1708
"カテゴリー表示の場合は、グローバル変数$catに表示しているカテゴリーのIDが入っています"
とのことなので下記の記述で対応可能。
<?php
$cat_info = get_category( $cat );
?>
<?php echo wp_specialchars( $cat_info->slug ); ?>
下記の方法だとそのcategoryに投稿されている投稿(記事)の一番最初で
判断するので最初の記事が複数カテゴリーに登録されていると
うまくいかないケースがある
<?php
$cat = get_the_category(); $cat = $cat[0]; { echo $cat->category_nicename;}
}
?>
"カテゴリー表示の場合は、グローバル変数$catに表示しているカテゴリーのIDが入っています"
とのことなので下記の記述で対応可能。
<?php
$cat_info = get_category( $cat );
?>
<?php echo wp_specialchars( $cat_info->slug ); ?>
下記の方法だとそのcategoryに投稿されている投稿(記事)の一番最初で
判断するので最初の記事が複数カテゴリーに登録されていると
うまくいかないケースがある
<?php
$cat = get_the_category(); $cat = $cat[0]; { echo $cat->category_nicename;}
}
?>
2010年12月26日日曜日
2010年12月20日月曜日
httpがあれば自動的なリンクにしてくれる正規表現
ereg_replace("(https?|ftp)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)", "<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>" , $string);
登録:
投稿 (Atom)