Flash(); - [AS3,PHP,XML]BlogParts制作のメモ

ブログパーツでやってる事の備忘録を色々。

■レコ屋リサーチ
お気に入りから色々開いてパラメータなどを確認。
http://www.spiraldelight.com/blogparts/recordShop/recordShop.html
これはエクセルのデータを作ってHTMLに書き出したもの。
まだまだ他にも世界中たくさんあって、
とりあえず日本語 Recordシートとmp3_データの上から15個を入れてます。

以下勉強メモになります。
■Flash→PHP→XML
サーバーサイド絡みを少しやってみました。
Flashの方でsendToURLでPHPに文字列を送りそれをxmlで保存。
「search」か「open」の検索ボタン押した後
そのxmlをFlashでまた読み込んでカウントを動的に表示。
下記はアナログバージョンだけのデータの保存の仕方。

○01_Flash
AS2だとsendAndLoadでAS3だとsendToURL。
スクリプトはタイムラインとクラスで混合してます。
下記はフレームアクション。

文字列をPHPに渡すソース
var pathPHP:String = "データ送るPHPのアドレス.php";
var request:URLRequest = new URLRequest(pathPHP);
var variables:URLVariables = new URLVariables();
//phpに渡す変数入れる。phpでdiggedArtistとarShopNameの文字列を受け取る。
variables.diggedArtist = digArtist;
variables.arShopName = arShopName[urlNum];
request.data = variables;
request.method = URLRequestMethod.POST;
sendToURL(request);

sendToURLでヘルプ調べると書いてありますが、
「URL リクエストをサーバーに送信しますが、応答は無視します。」
URLLoader.load() メソッド使ってイベント経由で
進捗具合とかを調べるのが確実っぽいです。

○02_XML
<?xml version="1.0" encoding="UTF-8"?>
<dig>
</dig>
XML宣言とルートエレメントだけ書いてとりあえずサーバーにあげます。
パーミッションは666。
下記のPHPで文法を組んでくれます。

○03_PHP
ソース
<?php
$file_name="書き込むXMLのPATH.xml";
$file = fopen($file_name, "r+") or die("error");
flock($file, LOCK_EX);
//flashからPOSTで受け取る
$string = $_POST["diggedArtist"];
$string2 = $_POST["arShopName"];
flock($file, LOCK_UN);
$data = "";
//1行づつ調べて正規表現
for($i=1;!feof($file);$i++){
$line = fgets($file);
if(!preg_match("/<¥/dig>/", $line)){
$data .= $line;
}
}
//XMLで吐き出す形、ここでXMLの文法を組みます。
$data .= "¥t<searchlist>"."¥n"."¥t¥t<artist>".$string."</artist>"."¥n"."¥t¥t<shop>".$string2."</shop>"."¥n"."¥t</searchlist>"."¥n";
//最後にdigタグ閉じ
$data .= "</dig>";
rewind($file);
fwrite($file, $data);
fclose($file);
?>


会社のサーバーサイドやるプログラマーの人に色々聞いて、
使うユーザーがたくさんいる場合
ファイルが壊れる事があるから注意と言われました。
ユーザーが多数使う場合、phpのライブラリがあるからそれ使用した方が
安全かつ便利らしいです。
何千何万人とかいったらDB使用なのかな。
でもこのブログパーツ需要無さそうなんでとりあえずこれで使用してます。
一応正常に動いてる。


○04_XML
Flashの方で表示してないですが後でやろうとしてる事があるので
アーティスト名と選択したお店も取得してます。
XMLではこんな風に追加されていってます。
<?xml version="1.0" encoding="UTF-8"?>
<dig>
<searchlist>
<artist>minilogue</artist>
<shop>Thirtytree</shop>
</searchlist>
<searchlist>
<artist>afx</artist>
<shop>Guinness</shop>
</searchlist>
<searchlist>
<artist>timmy</artist>
<shop>Amazon</shop>
</searchlist>
</dig>



○05_Flash(フレーム)
カウントをとる処理。
XMLの読み込みのやり方はたくさんあると思いますが、
AS3でとりあえず初めてやってみました。
searchlistタグのlength取得してます。
ここには書いて無いですが、
最後にアナログとデジタルの検索数を足して表示させてます。
var xml:XML;
var pathXml:String="読み込むXMLのpath.xml";
var urlXml:URLRequest=new URLRequest(pathXml);
var xmlLoader:URLLoader=new URLLoader(urlXml);
var Count:int;
xmlLoader.addEventListener(Event.COMPLETE,onLoadXml);
function onLoadXml(e : Event) {
xmlLoader.removeEventListener(Event.COMPLETE,onLoadXml);
xml=new XML(xmlLoader.data);
Count=xml.searchlist.length();
}

これで配列traceすれば一応アーティスト・お店を取得できる事が確認できました。
for (var i:int =0; i<xml.searchlist.length(); i++) {
arArtistXML.push(xml.searchlist.artist.children()[i]);
arShopXML.push(xml.searchlist.shop.children()[i]);
}



■Player10のFileReference

カヤックさんの逆音で使われてる「mp3 upload」部分だったり、
Flash+αで使われてるの見ました。
boreal-kissさんのところで
FlexibleFactoryの簡単にmp3をロードできるパッケージを発見。
ここのMP3FileReferenceLoaderLib.zipを一式ダウンロードして
MP3FileReferenceTest.asを少しいじり、
SoundChannelクラスのstopを追加して使用してるだけです。
下記ソースではmcSoundsにクラスを割り当ててます。
スタート、ストップはフラグで制御。
あまりよくないと思いますが、
mcのstartとstopの表示切り替えはvisibleでやっちゃってます。
フラグはボタン押した後では無く、
音源をロードしてから変えてます。

この機能は検索に意味が無いのですが、
音楽繋がりでなんとなく追加した機能です。
一応ソース。
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.FileFilter;
import flash.net.FileReference;
//
import flash.media.SoundChannel;
//
import org.audiofx.mp3.MP3FileReferenceLoader;
import org.audiofx.mp3.MP3SoundEvent;
public class MP3FR extends Sprite {
private var loader:MP3FileReferenceLoader;
private var fileReference:FileReference;
public var isPlaying:Boolean=false;
public var channel:SoundChannel;
public function MP3FR() {
mcSounds.mcStop.visible=false;
loader=new MP3FileReferenceLoader();
loader.addEventListener(MP3SoundEvent.COMPLETE,mp3LoaderCompleteHandler);
fileReference=new FileReference();
fileReference.addEventListener(Event.SELECT,fileReferenceSelectHandler);
mcSounds.addEventListener(MouseEvent.CLICK,clickHandler);
mcSounds.buttonMode=true;
}
private function clickHandler(ev:MouseEvent):void {
if (isPlaying) {
isPlaying=false;
channel.stop();
mcSounds.mcStop.visible=false;
mcSounds.mcPlay.visible=true;
} else {
fileReference.browse([new FileFilter("load mp3 file","*.mp3")]);
}
}
private function fileReferenceSelectHandler(ev:Event):void {
loader.getSound(fileReference);
}
private function mp3LoaderCompleteHandler(ev:MP3SoundEvent):void {
isPlaying=true;
mcSounds.mcStop.visible=true;
mcSounds.mcPlay.visible=false;
channel=ev.sound.play();
channel.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler);
}
private function soundCompleteHandler(ev:Event):void {
isPlaying=false;
channel.stop();
mcSounds.mcStop.visible=false;
mcSounds.mcPlay.visible=true;
}
}
}




■正規表現、置換メモ
スペースを+に変換。
var digArtist:String= "ユーザーが入力した文字列";
var artistPattern:RegExp = new RegExp(" ");
digArtist = digArtist.replace(artistPattern, "+");

http://www.jetsetrecords.net/index.php?P=search&L=JP&mode=from_top&select=artist&search_key=Aphex+Twin
jetsetRecordsの例だと「Aphex Twin」とアーティスト名入力して、
search_key=Aphex+Twinと「+」でパラメータを送っていたので「+」に変換。
置換しなくても勝手に「%20」とかにしてくれて検索できるのですが、
ほとんどのレコ屋は+で文字列繋いでたので一応対応しておきました。


「/」を「」に変換(なくす)。
var digArtist:String= "ユーザーが入力した文字列";
var artistPattern2:RegExp = /(¥n*)¥/(¥n*)/ig;
var result2:Object = artistPattern2.exec(digArtist);
while (result2 != null) {
result2 = artistPattern2.exec(digArtist);
digArtist = digArtist.replace(artistPattern2, "");
}

他にもXMLのタグに影響する「<」「>」は禁止にしています。

こちらのブログを参考にさせてもらいつつ作成。


■navigateToURLでいっぱいウィンドウ開く

普通にforループで大丈夫かと思ったら、たまにXMLの書き込み時に失敗してました。
PHPの処理が間に合ってないのかも。一度XMLのパーサエラーになりました。
エンターフレームでカウントさせて
時間差でリンク先を開いて対応してます。

コメント
管理者の承認待ちコメントです。
  • -
  • 2011/03/08 4:51 PM
管理者の承認待ちコメントです。
  • -
  • 2019/03/10 7:24 AM
管理者の承認待ちコメントです。
  • -
  • 2019/03/25 10:13 PM
コメントする








   
この記事のトラックバックURL
トラックバック
About
spiraldelight

Category
Flash(12);
Movie(14);
Sound(17);
Event(22);
Life(8);



RSS





ナウでヤングなレンタルサーバー!ロリポップ!
ソフトバンクBB my BBコミュニケーター // チカッパ! // ファーストサーバ // Speever