Posts tagged IE

optionタグを選択不可にする disabled 属性を IE6 でも有効にする方法

0

optionタグを選択不可にする disabled 属性で紹介したように option タグに disabled 属性を指定することにより選択不可にすることができるのですが、IE6 では選択できてしまいます。

JavaScript で解決する方法です。

Select, Option, Disabled And The JavaScript Solution

上記の参考サイトに詳しくやり方が書かれていますので、簡単に手順だけ紹介。

  • 参考サイトの「Implementing」にある download リンクより JavaScript コード(select-option-disabled-emulation.js)をダウンロード
  • select-option-disabled-emulation.js を適当な場所に保存
  • html 内で select-option-disabled-emulation.js を読み込む
  • 選択不可にしたい option タグに disabled 属性を指定する

DHTML で解決する方法です。

これは上記参考サイトの補足で紹介されていたサイトです。
apptaro’s blog: Emulating Disabled Options in IE with DHTML Behaviors

こちらも上記URL に詳しいやり方が書かかれていますので、簡単にご紹介。

  • 参考サイトの中央よりやや下にある Download よりファイル一式をダウンロード
  • 適当な場所に css, htc ファイルを保存
  • html で上記 css を読み込む
  • 選択不可にしたい option タグに disabled 属性を指定する

これで IE6 でも option タグの disabled 属性が使えるようになりました。

optionタグを選択不可にする disabled 属性

2

フォーム画面を動的に表示してある条件のときにはラジオボタンなどを disabled にしたりします。
今回もあるフォームを作成していて在庫が0のときに select タグで表示する項目を選択できないようにしたかったので調べてみたところ、option タグにも disabled 属性がありました。

そこで下記のようにしてみたところ

<form action="">
<select>
<option>オプション1</option>
<option disabled="disabled">オプション2</option>
<option>オプション3</option>
<option>オプション4</option>
</select>
<input type="submit">
</form>

option-desiabled

うまく選択不可になりました。
ところが Firefox では OK だったのですが、IE6では選択可能に。。。

調べてみると
Disable Option’s In A Select (Dropdown) Element ? Post Archive ? www.lattimore.id.au

It never ceases to amaze me how a browser like IE6, managed to not implement something as trivial as an attribute like disabled. The IE team managed to implement it against the <select> element, but some how overlooked the <option> element. They implement the readonly attribute against the appropriate elements – yet some how the disabled attribute managed to be overlooked when they implemented it. More surprising is that, since the HTML4.01 specification came out in late 1999, IE has been updated and upgraded for various things literally hundreds of times. Why hasn’t this made it into an update? You’d begin to think that Microsoft aren’t aware of it, however the thought of that just seems too far fetched.

どうも IE6 のバグのようです。

CakePHP cakeError でエラー処理

1

CakePHP でエラー処理をさせるのに cakeError を使ってみました。
致命的なエラーのときに、メールを送信したりログを記録したりするのに使えるかと思います。

/app/error.php を作成

class AppError extends ErrorHandler
{
    function foo($params){
        // ここにエラー処理を書く

        // $params を展開
        extract($params);

        // view のディレクトリを指定
        $this->controller->viewPath='errors';

        $this->controller->set('message', $message);
        $this->controller->render('foo');
        exit();
    }
}

エラー用のビューを app/views/errors/foo.thtml に作成

呼び出し方は第1引数にメソッド名、第2引数にメソッドに渡すパラメータ

$params = array( array('message'=>'Error!') );
$this->cakeError('foo', $params);

$params の指定方法にちょっとだけ注意が必要です。

CakePHP DISTINCT の使用方法

1

cakebaker ? Using distinct and count with CakePHP

CakePHP で DISTINCT を使いたい時の方法が紹介されていました。

$this->User->find(null, "COUNT(DISTINCT User.city) AS 'count'");

find は /cake/libs/model/model_php5.php
function find($conditions = null, $fields = null, $order = null, $recursive = null)
と定義されています。
この $fields をうまく使っているということですね。

WordPress 携帯閲覧用プラグイン

0

本ブログに携帯閲覧用プラグインをインストールしてみました。
下記のサイトに詳しくインストール方法は書かれています。

WordPress Japan :: 携帯閲覧用プラグイン

非常に簡単でした。
ファイルを2つアップロードして管理画面からプラグインをアクティブ化するだけで携帯から閲覧するのに適したページにしてくれます。

XREA に設置した WordPress で画像のアップロードができない

18

前の投稿で初めて画像をアップロードしました。
そのときに、なかなか画像のアップロードができなかったので対策メモ。

最初はパーミッションでエラーになった
-> FTP から wp-content ディレクリにパーミッションの設定をした。
再度アップロードすると今度は wp-content 内に uploads ディレクトリがないとエラー。
-> FTP からディレクトリの作成をおこない、パーミッションの設定をして再度アップロードしてみた。
今度はファイルを移動できないとのこと。

ググってみると、XREA の PHP はセーフモードでした。
そのためFTP でディレクトリを作成するとユーザが apache になるために保存できなかったのですね。

そこで下記のようにしました。

  • ローカル側で wp-content 内に uploads ディレクトリを作成
  • そのディレクトリをアップロード
  • FTP で wp-content/uploads ディレクトリに書き込みパーミッションを設定

再度アップロードすると今度はうまく行きました。
他には CGI として PHP を動かす方法もあるようです。

参考サイト
WordPress Japan :: トピックを表示 – XREAでファイルアップロードが出来ない
XREA で WordPress ファイルアップロード機能を利用する – Numb.
PHPをCGIとして動かす方法について – XREA&CORE SUPPORT BOARD

CakePHP コントローラのメソッドをURLから実行させない

0

コントローラにアクション以外のメソッドを書かないのが一番いいのかもしれません。
ただ、どうしても書きたいという場合にはメソッド名にアンダーバー “_” を付けるとURLからアクセスできなくなります。

試しに posts_controller.php_foo というメソッド名を作り /posts/_foo/ にアクセスしてみると
Private Method in PostsController
You are seeing this error because the private class method _foo should not be accessed directly.

とプライベートメソッドなのでアクセスできませんよというエラーメッセージが出力されました。

しかしこのメッセージってあまりよくないのではと思い、試しに DEBUG=0 とデバッグモードを本番環境用にしたところ、

Not found
The requested address posts/_foo/ was not found on this server.

となりました。やはり考えてますよねそれくらい。

ちなみにエラーメッセージは
/cake/libs/view/templates/errors/
にエラーの種類によって15のテンプレートが用意されています。
自分で Not found などのエラーを修正したい場合は
/cake/libs/view/templates/errors/error404.thtml

/app/views/errors/error404.thtml
にコピーして修正すればそちらのテンプレートが使用されます。

CakePHP の日本語マニュアルに書かれている

メンバ関数を protected にして見えるようにするには、コントローラアクション名を ‘-’ ではじめてください。(訳注:将来の仕様???)
メンバ関数を private にするためには、コントローラアクション名を ‘–’ ではじめてください。(訳注:将来の仕様???)

というのはこれのことなのかな?
ただ、”_” ではなく “-” になっている。(英語のマニュアルも同様に “-” でした。)

CakePHP 日本語マニュアル
C.4. コントローラ(Controllers)

CakePHP マニュアル(英語)
CakePHP Manual

CakePHP htmlヘルパーでラジオボタンを離れた場所に分けて書く方法

1

html ヘルパーでラジオボタンを書く場合
<?php echo $html->radio('Model/field', array('1'=>'option1','2'=>'option2', '3'=>'option3')); ?>
のように書くと、ラジオボタンを横に並べて表示させることができます。

ただ、デザインによってはテーブルなどを使用していたり縦に並べたりして、ひとつづつ表示させたいときもあると思います。

その場合は

<?php echo $html->radio('Model/field', array('1'=>'option1')); ?>
<?php echo $html->radio('Model/field', array('2'=>'option2')); ?>
<?php echo $html->radio('Model/field', array('3'=>'option3')); ?>

とすれば、それぞれのボタンを希望の位置に表示させることができます。

CakePHP html ヘルパーでラジオボタンの選択状態 (checked) を指定する方法

1

html ヘルパーを使用してラジオボタンの選択状態 (checked) を指定する方法です。

下記のようにすると option2 にチェックがつきます。
<?php echo $html->radio('Model/field', array('1'=>'option1','2'=>'option2', '3'=>'option3'), null, array('value'=>'2'), false); ?>

第4パラメータの array(‘value’=>’2′) でチェックするボタンを指定しています。
キーの ‘value’ は固定で、値の’2′ の方をチェックしたいラジオボタンの value 属性の値と同じものを指定すれば、そのボタンがチェックされます。

デフォルトや以前入力された状態を表示するために使用できそうです。

CakePHP html ヘルパーでラジオボタンを表示する

0

htmlヘルパーで radio ボタンを表示させるには下記のようにします。
下記の例では3つのラジオボタンを表示しています。
<?php echo $html->radio('Model/field', array('1'=>'option1','2'=>'option2', '3'=>'option3'), ' | ', array('onchange'=>'alert(this.value)'), false); ?>

表示される HTML は下記のようになります。
(実際には1行で出力されますが改行を入れています)

<input type="radio" name="data[Model][field]" id="field_1" onchange="alert(this.value)" value="1"  />option1 |
<input type="radio" name="data[Model][field]" id="field_2" onchange="alert(this.value)" value="2"  />option2 |
<input type="radio" name="data[Model][field]" id="field_3" onchange="alert(this.value)" value="3"  />option3 |

radio メソッド
string radio(string $fieldName, arrray $options [,string $inbetween=null [,array $htmlAttributes=array() [,bool $return=false ]]])

$fieldName
name属性の値
$option
array(‘value’=>’表示名’);
value は value=”value” になり、表示名はラジオボタンの後ろに表示される文字名
$inbetween
ラジオボタンの間に表示される文字列
$htmlAttributes
html の属性 array(‘属性名’=>’値’)で指定する
$return
ヘルパーの自動出力を抑止する(参考:ヘルパーの出力を echo を使わずに出力する方法)
Go to Top