プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。

Flash+PHPで会員制の情報システムを開発しています。

PHPから商品IDと商品名を受け取り、その商品数分のムービークリップをattachMovieで配置しています。
(商品数や商品名はユーザによって変わります。)

配置したムービークリップにgetURLを設定し、それぞれにパラメータとして商品IDを付与して送信したいのです。
(以下のように設定したいのですが、item_idはPHPから受け取ったものでそれぞれ異なります。)

getURL("URL?item_id=2")

attachMovieの際にgetURLをムービークリップに貼るのでしょうか?それともムービークリップにgetURLを書いて変数を参照するのでしょうか?

困っています。ご回答、宜しくお願いします。

A 回答 (3件)

#1&2 です。



うまく行きませんでしたか...。
1つ書いている部分とスクリプトがずれていたので,訂正させてください。

> _root[itemMC_name].onRelease = function() {
> // 自分自身の中の変数 myVal を参照して getURL
> getURL("URL?item_id="+myVar);
> };
   ↓ この部分を変更 ↓

- - - - - - - - - - - - - - - - - - - - - - - - - -
_root[itemMC_name].onRelease = function() {
// 自分自身の中の変数 myVar を参照して getURL
getURL("URL?item_id="+this.myVar);
};
- - - - - - - - - - - - - - - - - - - - - - - - - -


this.myVar の this が抜けていました。
これ,私も理由がよくわからないのですが,
普通は省略できるはずの this が省略できない場合があるのです。
この辺は勉強不足で説明できませんが,
上のように this を入れてもう一度やってみてください。
(どうも検証できない回答は辛い…)


あと,
話がややこしいので,最後の方から書きます。

> どうやってクリックしたMCのインスタンス名を取るのでしょうか?

インスタンス名は this._name で取れます。

ムービークリップの場合,
例えば,ステージ上に 「myMC1」 というインスタンス名のムービークリップがあったとします。
そのムービークリップ自体に

---------------------------
on (release) {
trace(this._name);
}
---------------------------

と書いて,ムービープレビュー。
そのムービークリップをクリックすると,
自分自身(自分自身の階層)のインスタンス名が trace されます。
つまり「myMC1」が trace されます。
もしくは,ムービークリップのスクリプトを消して,
フレームに,次のように書いても同じことになります。

---------------------------
_root.myMC1.onRelease = function() {
trace(this._name);
};
---------------------------


> MCをクリックしたときには、
> itemMC_name の i は既にループ後の値になっています。
> 1番目のMCをクリックしているのに、itemMC_nameは item5
> となっています。(商品数が5の場合)
> ですので、そもそも別のMCをクリックしている?
> ことになっているような気がします。

どういうことかよくわかりませんが,
itemMC_name を参照して表示させれば,当然そういう結果になりますよ。
_root か LoadVars 内の変数 itemMC_name は for文の i によって item5 にまで変わっていますから。
ですから,この回答の最初で書いた部分を,
こう↓変更してみてはいかがでしょうか?

----------------------------------------
_root[itemMC_name].onRelease = function() {
trace(this._name);
// 自分自身の中の変数 myVal を参照して getURL
getURL("URL?item_id="+this.myVar);
};
----------------------------------------



> 1~3は、SWFがロードされたときに実行され、
> 4.は各MCがクリックされたときに初めて実行されますよね?


だいたい合っていると思います。
正確には,

> 1. SWFがロードされ、PHPから商品データをロードします。

これが,
SWFがロードされたときに実行が "開始" されます。

> 2. 上記スクリプトはsendAndLoadのonLoad内にあります。
>  ですので、商品データのロード後に実行されます。

そうですね。
商品データのロード後に onLoad が実行されます。

> 3. forループで商品数分、MCをステージに貼り付け、
>   MCのローカル変数myVarに
>  各商品ID( itemid_arr の i番要素)を代入します。

LoadVars.onLoad = function(){ } 内にforループが書いてあれば,
データロード後に for文が実行されますね。

> 4. MCがクリックされたときに各MCのローカル変数myVarを
>  引き渡し、getURLを実行します。

ええ,
これが,ムービークリップがクリックされたときに実行されます。

このあたりの流れは間違いないと思いますよ。
sendAndLoad の onLoad で連動するようにしてあれば大丈夫だと思います。
ついでに, itemid_arr という配列も, onLoad 内にあれば良いわけです。
ややこしいので私は,_root に配列を用意すると思いますが,
LoadVars内でもかまいません。

以上ですが,
いかがでしょうか?
    • good
    • 0
この回答へのお礼

できました!
ありがとうございます。thisを追加することで取得できました。

長々とお付き合いくださいまして本当にありがとうございました。

お礼日時:2006/12/30 17:46

#1です。


最後のスクリプト(と言っても単なるイメージ)は,
空でタラタラっと書いた物なので重大な欠陥があります。

for文 で onRelease などを定義する場合,
その onRelease = function() { } の { } 内には for文の 変数 i が届きません。
したがって,
attachMovie で作成したムービークリップインスタンス内のローカル変数に,
あらかじめ 変数と値 入れておいて,
後にローカルな変数を参照しなければならないのでした。
そのことをついうっかり忘れていました。


> for( i=0; i<itemid_arr.length; i++ ) {
>  itemMC_name = "item" + i;
>  _root.attachMovie("itemMC", itemMC_name, i);
>  _root[ itemMC_name ].onRelease = function() {
>   getURL( "URL?item_id=" + itemid_arr[ i ] );
>  }
> }


 getURL( "URL?item_id=" + itemid_arr[ i ] );

内に書いてある

 itemid_arr[ i ]

これだと,
ムービークリップ itemMC_name 内の配列変数 itemid_arr を参照してしましますよ。
それと,
私が書いたスクリプトのミスの両方が含まれています。

確かに上のスクリプトでできそうな気配なのに,
できないのでしたら,
こうすればいかがでしょうか↓?

------------------------------------------------
for (i=0; i<itemid_arr.length; i++) {
itemMC_name = "item"+i;
_root.attachMovie("itemMC", itemMC_name, i);

// 各MCのローカル変数 myVar に
// 配列 itemid_arr の i 番要素を代入
_root[itemMC_name].myVar = itemid_arr[i];

_root[itemMC_name].onRelease = function() {
// 自分自身の中の変数 myVal を参照して getURL
getURL("URL?item_id="+myVar);
};
}
------------------------------------------------

検証はしてみていませんが,
書かれているスクリプトで行けそうな感じであれば,
こんな感じにすればできる気がします。
    • good
    • 0
この回答へのお礼

何度もありがとうございます。
ですが、やっぱり「undefined」となってしまいます。。
申し訳ありませんが、もう少しお付き合い下されば幸いです。

> for (i=0; i<itemid_arr.length; i++) {
> itemMC_name = "item"+i;
> _root.attachMovie("itemMC", itemMC_name, i);
>
> // 各MCのローカル変数 myVar に
> // 配列 itemid_arr の i 番要素を代入
> _root[itemMC_name].myVar = itemid_arr[i];
>
> _root[itemMC_name].onRelease = function() {
> // 自分自身の中の変数 myVal を参照して getURL
> getURL("URL?item_id="+myVar);
> };
> }

ここで整理させてください。
上記のスクリプトはメインタイムラインにあります。
(ちなみに、Flash8 Professionalを使用しています。)

 1. SWFがロードされ、PHPから商品データをロードします。
 2. 上記スクリプトはsendAndLoadのonLoad内にあります。
  ですので、商品データのロード後に実行されます。
 3. forループで商品数分、MCをステージに貼り付け、MCのローカル変数myVarに
  各商品ID( itemid_arr の i番要素)を代入します。
 4. MCがクリックされたときに各MCのローカル変数myVarを引き渡し、getURLを実行します。

1~3は、SWFがロードされたときに実行され、
4.は各MCがクリックされたときに初めて実行されますよね?
(このあたりの理解について非常に自身がありません。。)

色々と検証してみたのですが、
MCをクリックしたときには、itemMC_name の i は既にループ後の値になっています。
1番目のMCをクリックしているのに、itemMC_nameは item5 となっています。(商品数が5の場合)
ですので、そもそも別のMCをクリックしている?ことになっているような気がします。

どうやってクリックしたMCのインスタンス名を取るのでしょうか?

お礼日時:2006/12/30 15:38

> PHPから商品IDと商品名を受け取り、


> その商品数分のムービークリップをattachMovieで配置しています。

ということですから,
LoadVars や XML クラスなどの インスタンスオブジェクト 内に,
すでに,商品IDと商品名がロードされているのではないでしょうか?
その辺りは,
現物の FLA ファイルを見てみないとなんとも言えませんが。


例えば,
「myLV」や「myXML」などと言うインスタンス名のオブジェクトが,

 var myLV = new LoadVars();

とか,

 var myXML = new LoadVars();

とかいう感じで,フレーム1 か フレーム2 辺りで生成されていて,
その「myLV」や「myXML」などのインスタンスの中に,

 item_id という変数とその値,

または

 <商品2 item_id=2>みかんの皮むき機</商品>

のような形でロードされていると思います。
「myLV」や「myXML」というのは,
今私が勝手に作ったインスタンス名ですから,実際にはどんな名前かわかりません。
そのインスタンス名を決めた人が決める物です。

それで,そのインスタンスの中から,
ロードされた値を参照しなければならないと思いますよ。


こちらといたしましては,
データもFLAも見ることができないので,なんとも回答できませんね。
データやFLAファイルを見ても複雑なものであれば理解できない可能性もあります。


最終的な形としては,値を参照して,

getURL("URL?item_id=" + 参照した変数名)

のような形で実行できると思います。
それ以上は何とも言えません。


> attachMovieの際にgetURLをムービークリップに貼るのでしょうか?
> それともムービークリップにgetURLを書いて変数を参照するのでしょうか?

なんとかすればどちらでもできると思いますが,
どちらかと言うと,attachMovieの際にgetURLをムービークリップに貼る方が簡単だと思います。

例えば myMC0 ~ myMC? を attachMovie で配置したあとに,

-------------------------------------
for (var i= 0; i<データ数; i++) {
// 各MCをクリックしたときの動作を定義
_root["myMC"+i].onRelease = function() {
getURL("URL?item_id=" + i);
};
}
-------------------------------------

とか,

-------------------------------------
for (var i= 0; i<データ数; i++) {
// 各MCをクリックしたときの動作を定義
_root["myMC"+i].onRelease = function() {
getURL("URL?item_id=" + _root.myLV["item_id"+i]);
};
}
-------------------------------------

このような感じでするのが簡単だと思います。
しかし,
これまた,FLAやデータを見ていないのでなんとも言えません。
上のスクリプトは,単なる雰囲気的なものです。
実際にはまずうまく動作しないと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

以下のようにattachMovieの際にgetURLを貼って試しているのですが、値がundefinedとなります。

itemid_arrにはロードした商品IDが格納してあります。

for( i=0; i<itemid_arr.length; i++ ) {
 itemMC_name = "item" + i;
 _root.attachMovie("itemMC", itemMC_name, i);
 _root[ itemMC_name ].onRelease = function() {
  getURL( "URL?item_id=" + itemid_arr[ i ] );
 }
}

sassakun様からご指摘いただいた内容と代わりないように思うのですが、、。
traceで確認してもitemid_arrには値はあるのですが、クリックして飛んだ先のURLを見ると「URL?item_id=undefined」となります。
どのタイミングで値がなくなっているのでしょうか?

お礼日時:2006/12/30 14:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!