- 2010-11-23 (火) 10:01
- MovableType


- 登録済みアイテムの登録だけを削除するプラグイン
AssetHandlerを使い始めたときに失敗したのが、間違ってすでに登録済みのアイテムを、もう一度登録してしまったこと。二重にアイテムとして表示されるようになって、気持ち悪くて、思わず重複分をアイテム一覧から削除してしまったら、実ファイルまで削除されてしまい、大慌てだった事がありました。
そもそも、まだアイテムの仕組みに慣れていなくて、実ファイルごと消えるっていうのを知らなかった時です。
昨日、思いついて、「登録済みアイテムの、MTへの登録だけ削除して、実ファイルは残すプラグイン」を作成してみる事にしました。
UIとしてはこんな感じで、つくり始めたのですが、すぐに行き詰ってしまいました。
登録だけ削除するような手段が見当たらない。ストレートに「$asset->remove;」ってやると、実ファイルごと削除されるんですね。単純に「mt-assetテーブル」から、1レコードだけ削除するような事だけしたかったんですが、方法が見つからない。(もし、やり方があるのなら、誰か教えてください)
「The blog of H.Fujimoto」の藤本さんに、「$asset->SUPER::remove;」ってのを教えていただきました。Asset.pmのremoveの箇所は、ざっと見たはずなんですけど、きちんと理解していなかったみたいです。今なら、やってる事が解ります。
恒例のコードとにらめっこしていて、ふと頭をよぎったのは、「削除するときに、どうやってファイルを判別しているんだろう」という点。予想としては、サーバー上の場所なので、「$asset->file_path」あたりかと思い、こいつを書き換えると以下の表示になります。
この状態で、アイテムを削除したところ、まぁ予想通り元アイテムは削除されずに残りました。正しくは「間違ったファイルを削除した」のであって、削除されなかった訳ではないのですが、うまくこの手を使えないかなと思い作成してみました。
動作としては、「$asset->file_path( $asset->file_path . '.dummy.file' );」してから「$asset->save;」、そして「$asset->remove;」という順番です。偶然変更後のファイル名と同じ名前のモノがあったらば、削除されてしまうわけですが、通常はありえないのではと思っています。
文字列をランダムに生成とかしても、偶然一致する可能性はゼロにはならないと思うので、とりあえず(最初のバージョン ver 1.0 としては)完成したという事にします。(修正によりダミーファイル名を削除する仕様は無くなりました。ver 1.01)
プラグイン名は「Asset Unlink」になります。以下からダウンロード可能です。
「naoaki011's mt-plugin-asset-unlink at master - GitHub」
使用上の注意(実は別な名前のファイルを削除している)をご理解の上、使ってみる気がございましたら、ダウンロードしてやってください。
藤本さんに教えていただいたので、書きなおしてみました。同時にremoveの処理を見ると、ブログ記事との関連付けと、サムネイルなどの画像の処理の部分が書いてあって、関連付けは削除されるようにしましたが、サムネイルやキャッシュの取り扱いは、もう少しどうするか考えてから対応することにします。
一応、先の話になりますが、こいつに重複したアイテムの検索機能を付けたいなと思っています。「重複検索」から「一方を削除」への流れが出来ると、便利なのではないかと。
もっとも結果の一覧画面は、まだ作ったことがないので、ListingFrameworkを使って対応しようかと夢想しています。なので、出来上がるのはかなり先だと思っています。期待せずにお待ちください。
- Newer >: ユーザーのベースネームを、アカウント名から作成する
- < Older: MTMLでグリッド表示
ping a Trackback
- TrackBack URL for this entry.(1)
Comments:(2)
-
said
November 23, 2010 8:37 PM
|
ReplyThis!
こんにちは。
アイテムの情報だけを削除するなら、「$asset->SUPER::remove」で行けるのではないかと思います。
Asset.pmのremoveプロシージャのソースを見てみると良いでしょう。
-
-
replied for
壱's comment
November 23, 2010 8:58 PM
|
ReplyThis!
こんばんは、藤本さん。
おお、やっぱりあったんですね。
それでは、書きなおしてみます。ありがとうございました。
-




スクリプトの読み込みが完了していません。
メールフォーム(Javascriptを使用していません)や、
Twitter経由のCommentでもReplyいたします。ただし返信はブログのコメントとして行う事もあります。