Home

WolaWola

Asset Handler for Movable Type

やっと出来ました。先月末に完成してたけど、記事書けなくて大分遅れた・・・

Asset Handlerとは

naoaki011/mt-plugin-assethandler - GitHub
何度も取り上げてるけど、しつこくもう一度解説。
「Asset Handler」は、Moveble TypeにAsset(アイテム)を一括で取り扱うための機能を追加するプラグインです。
オリジナルは、「Asset Handler | Movalog Plugins: Movable Type plugins by Arvind Satyanarayan」。「Movalog」の開発したプラグインで、サーバー上にアップロードされているファイルを、アイテムとして一括インポートする機能と、アイテム情報の一括編集が可能です。
有償プラグインでしたが、その後海外のMTプラグイン開発者サイトのご多分に漏れず、サイトでの公開更新を停止し、活動の場をGitHubに移行。現在はGPLv2として公開されています。
私以外にもendevverの「jayallen」がこのプラグインをフォークしています。

改変にあたってのコンセプト

私のフォークバージョンのコンセプトは2つ。

  • 最新のMT日本語環境に対応すること
  • Asset Handlerという割には、「取り扱いに関する機能」が貧弱に思えたので、機能を追加すること

特に海外の主要なMTプラグインの作者が、MT5以降への対応を完全に無視し、Melodyもしくは稀にMT4.3xへの、1バイト圏の運用しか考慮しない対応しか行わなくなっている流れに逆らいたいという意識があります。
これは、私がフォークしている他のプラグインにも共通した考えです。

Asset Handlerの機能

MT5.1xに対応しています。特にリスティングフレームワーク対応が、今回の修正の大きな特徴です。

アイテムの一括インポート機能

このプラグイン一番の売りの機能です。サーバー上にあるアップロード済みの、アイテム未登録画像を一括でMTのアイテムとしてインポートします。

具体的にはファイルパスと対応する登録URLを指定することで、取り込み処理が行われます。パスとしてディレクトリを指定した場合、ディレクトリ内のファイルをまとめて登録ができます。(ファイル選択や拡張子指定も可能です)
AssetHandlerのMT5対応版公開します - WolaWola

MT5.1では、「アイテム」メニューのサブメニューとして実装しています。既存の「新規」は「アップロード」と表示されます。その下に「インポート」メニューが追加され、そこから起動されます。MT5.0以下では、今まで通りページアクションとしてリンクが表示されます。

なお、以前より問題になっていた、アイテムが重複登録される件についても対応を行なっています。このバージョンのAsset Handlerで取り込んだアイテム同士の場合、同じファイルを再登録する事はありません。旧バージョンでの取り込み分を含む既存の登録済みアイテムとの重複回避には、後述の「アイテムの内部パス情報の修正機能」か「アイテム情報を更新する機能」により、アイテムの内部情報の修正が必要になる場合があります。

アイテムの一括編集機能

ブログ記事の一括編集機能のような、簡易的なアイテムの一括編集画面が、使用できるようになります。

一括編集ボタン

こんな感じの画面です。

一括編集画面

チョットだけ、多めに情報表示しています。(まぁ変更可能なのは、アイテム名・説明・タグだけですが)

MT5.0xおよびMT4.xでは、一括編集はボタンではなくプルダウンによるプラグインアクションとして表示されます。

アイテム一覧への表示情報の拡張(2.02で追加)

MT5.1のリスティングフレームワークに対応し、アイテム一覧画面に様々な情報を表示します。

アイテム一覧画面

「表示」「ファイル名」「ピクセル数」「リンク」「パス」「フォルダ」「作成時間」「更新日」「更新時間」「ファイルの拡張子」「説明」「MIMEタイプ」「種類」「親アイテムID」「関連記事」「タグ」が、項目として表示可能です。

個人的には「フォルダ」(ブログルートからのフォルダパスが表示)と「表示」(実ファイルへのリンク)がお気に入りです。

なお、MT5.0以下の一覧画面に対しても、「関連記事」に付いては表示されるようになっています。

アイテムの登録のみ削除する機能(2.02で追加)

Asset Unlink」の機能を取り込みました。
一般に登録アイテムを削除すると、実アイテムも削除されてしまいます。様々な理由により、アイテムが重複して登録されてしまった場合などに、片方のアイテムを削除すると実ファイルが削除されてしまい、残りの登録アイテムには対応するファイルが存在しない状態になってしまいます。
この様な状態の時に「アイテムを削除」ではなく「アイテムの登録削除」する事で、アイテムをそのままに重複分の登録削除が可能になります。

アイテムの登録削除

MT5.0xおよびMT4.xでは、登録解除はボタンではなくプルダウンによるプラグインアクションとして表示されます。

アイテムの内部パス情報の修正機能(2.02で追加)

アイテムのパス情報を修正する機能です。「ブログパスを「%r」に変更」「ブログパスをフルパスに展開」「URLをファイルパスに合わせて修正」「ファイルパス値を変更する」があります。
これらはファイルをそのままに、アイテム情報のみを修正します。Asset Handlerによる登録時に、パスの入力を間違えた場合など、特殊な場合にしか発生しない状況ですが、その様な状態からアイテム情報の修正が行えます。

ブログパスを%rに変更

本来アイテムは、ブログルートを起点とした相対パスでパス情報を持っています。
ブログ直下にある「images」フォルダ内の「fuga.jpg」というファイルは、アイテムとしては「%r/images/fuga.jpg」というパスとして格納されます。アーカイブパスを起点にした場合は「%a」になるなどれ以外はありますが、基本はそう理解してください。

と言いつつも、フルパスでファイルパスを持つことも可能で、旧バージョンのAssetHandler(例えばMovalogで公開されているもの)などでは、その様なパスを書き込んでいました。この様に様々な値で保存されているパスの値を、「%r」による記述に変更するのが、「ブログパスを「%r」に変更」になります。

その逆の操作を行うのが「ブログパスをフルパスに展開」です。この2つを組み合わせることで、次のようなことが実現できます。
「ブログの公開パスを変更したいが、使用中のアイテムは今の場所から移動したくない。」
まず「ブログパスをフルパスに展開」でアイテムをフルパスに変更した後、ブログの公開パスを変更します。その場合でもアイテムはフルパス記述ですので、場所は変わりません。その後「ブログパスを「%r」に変更」で、相対パスへと戻してやります。

「URLをファイルパスに合わせて修正」はファイルパスとURLが正しく整合性がとれていない場合に、ファイルパスを元にURLを設定し直します。あまり発生しない状況だと思いますが、URLのみが変更されます。

「ファイルパス値を変更する」は上記と逆に、ファイルパスを書き換える時に使います。URLについてはファイルパスと対応する正しい値に修正されます。

アイテムをブログ内で移動する機能(2.02で追加)

「あれ、アップロード先間違えた」という時あると思います。「もう記事に使っちゃってるので、上げなおすのも面倒だな。」
そういう時にはアイテムのパスを変更することが可能です。

アイテムを移動する

操作により、ファイルの移動・アイテム情報の修正・使用されている記事(本文・追記)内のリンクパスの修正が行われます。
制限として、ブログの公開パス以下でのみ変更可能です。

アイテムファイル名を変更する機能(2.02で追加)

「急いで登録したので、不適当なファイル名になっている。」そういう時には実ファイルのファイル名を変更することが可能です。

アイテムのファイル名を変更する

操作により、ファイル名の変更・アイテム情報の修正・使用されている記事(本文・追記)内のリンクパスの修正が行われます。ただし、日本語を含むファイル名についてはテストを行なっていませんし、おそらく正常には動作しません。

アイテム情報を更新する機能(2.02で追加)

様々な理由により、アイテム情報の不整合な状態が残っている場合があります。「アイテム情報の更新」を行うことで、ファイルのパスの相対指定への変更やMimeタイプ等様々な情報を正しく修正します。

アイテムデータを自動修正する

Asset handler 2.03について

現在の公開バージョンは、AssetHandler2.03.zipです。
MT4.1xからMT5.1xまで対応しています。

最新版はgithubから入手可能です。すでにアイテム登録日をExif情報から取得する変更などが加えられています。

残っている問題点としては「リスティングフレームワークでの追加情報の表示オプションで、ラベルのローカライズが行われない問題」があります。
次期バージョンで追加を予定している機能としては、「アイテムの親子情報を切り離し、親アイテムを削除しても子アイテムだけ残す事が出来る機能」を予定しています。

Asset handlerのライセンスについて

オリジナルと同じく、GPLv2として公開します。

ひとりごと

ココに上げた機能以外にも、実は隠し機能が追加されています。あるテーマ(mt.Vicunaではありません)と連動する、自分のための機能ですが、おそらく普通に使っていれば出くわすことはないでしょう。
「ついでに圧縮ファイルでまとめてアップロードできれば・・・」はい、それについてはコレとは別プラグイン「ArchiveAssets」として用意しています。そちらの紹介は後々という事で・・・

スマートフォンオプションでSSHA形式のパスワードを使用する

スマートフォンオプション

Movable Typeをスマートフォン対応にする、スマートフォンオプションというのが公開されました。
スマートフォンオプションを公開 | MovableType.jp
52,500円(税込)の製品ですが、Movable Type Proと同じく「個人無償ライセンス」が用意されており、「本Softwareを非営利目的で、非独占且つ譲渡禁止の条件により利用できる」そうです。

で、プラ厨としては早速インストールしたものの、mt-sp.cgiというのを叩くと管理画面に入れるらしいのですが、うまくログイン出来ない。
まぁ、例の通りTwitter上でぼやいたりしてたら、@riatwがヒントくれた。

@naoaki011 完全な憶測で恐縮ですが、スマフォオプション側からログインすると、他のプラグインが動いてないとかはないでしょうか。 プラグインで認証周り、MD5とかの当たりに追加で処理挟むことってあんまり無いとは思いますが…。

おぉ、プラグインが無効化というのは考えても居なかった。プラグインは読み込まれていて、でも正常に動作できないことばかり考えていたよ。

PCでもアクセス可能みたいなので、PCからmt.cgiでログインして、URL入力でmt-sp.cgiに切り替えて表示してみた。ログインセッションはそのまま引き継がれているなぁ。(声を小さく)ココらへんはセキュリティ的にはどうなんだろう。
mt-sp.cgiでのログイン状態でシステムのプラグイン一覧を見てみたら、みごとプラグインが無効化されているのを確認。
まじめに情報探したら、ドキュメントに記述がありました。

mt-sp.cgiからアクセスすると、「Movable Type出荷時に同梱されているプラグインおよびAddons以外のプラグインを全て無効化する」状態になります。

[管理画面を置換するプラグインの併用について ]

決められたプラグイン以外は読み込まないようですね。
なるほど、普通にmt.cgi使うんでも大丈夫みたいです。(ただし、全プラグインが読み込まれるので、(うちみたいなところ・要はプラグインが3桁近く入っている環境・だと)表示で問題が発生する可能性が高いという事ですね)

パスワードプラグインが無効かも

ログイン出来ないのがプラグインの影響だとして、頭に浮かんだのが以下のプラグインです。
Movable TypeのパスワードをSSHA形式に変更するプラグインSSHAPassword - BSDあれこれ
パスワード京香強化のプラグインですが、なんかいきなり発作的に入れてしまったプラグインです。
確かに、コレが無効になればログイン出来なくなりますね。

さて、スマートフォンオプションは、以下の3つが一つにまとまったものです。

  • スマホでの管理画面アクセスを向上する「Smartphone Option」プラグイン
  • スマホ表示に最適化された「Smart Blog」テーマ
  • 「Smart Blog」テーマでの表示最適化機能を追加する「DynamicMTML」Addon

今回の管理画面での制約に関しては、「Smartphone Option」プラグインで行われています。
プラグイン内 /plugins/SmartphoneOption/lib/MT/App/CMS/Smartphone.pm の14行目の部分に以下の記述があります。

    my %default_plugin_switch = map { $_ => 1 } qw(
        Enterprise.pack
        Commercial.pack
        Community.pack
        FacebookCommenters/plugin.pl
        feeds-app-lite/mt-feeds.pl
        Markdown/Markdown.pl
        Markdown/SmartyPants.pl
        mixiComment/mixiComment.pl
        MultiBlog/multiblog.pl
        SmartphoneOption
        spamlookup/spamlookup.pl
        spamlookup/spamlookup_urls.pl
        spamlookup/spamlookup_words.pl
        StyleCatcher
        Textile/textile2.pl
        TypePadAntiSpam
        WidgetManager/WidgetManager.pl
        WXRImporter
        DynamicMTML.pack
    );

これが有効なプラグインのリストですねぇ。
このリストに有効にしたいプラグインを追加すればいいようです。
ここの最後にSSHAPassword/SSHAPassword.plを追加してログインしてみました。

IMG_0169.PNG

おぉ、うまくいった。

スマホオプションに思うこと

チョット触ってみて思ったこと。
デバッグモード云々(PC用にデバッグモードにしていても、スマホでは読み込まないようにならないかなとか)は、まぁ言ってみただけと言うレベルですけど、今回のようなプラグインの問題は、もう少し突っ込んで対応して欲しい気がしました。

スマホオプションと共に動作する(というか使って欲しい)プラグインとか、スマホオプションが有効な時には動作して欲しくないプラグインとか、そういうのをプラグイン作者側が指定できる機能が欲しいと思いますた。
なんかレジストリで指定してやる感じにして、「これはmt-sp.cgiでのみ動作してね」「これはmt-sp.cgiでは動作しないでね」「これは常に動作してね」が設定して置けるように。

実はすでにそういう機能が入っている?
そういう事あるからなぁ・・・

SmartphonePluginSwicthというDirective(環境変数)があるみたい(なので、今回のケースはプラグイン書き換えなくて、コレを追加すればいいかも)だけど、これだとチョット違うなぁ。
ユーザーが追加するんじゃなくて、プラグイン作者が指定できるようになってほしい。

他にも、改行オプションを拡張するプラグインや、サインオンプロバイダーを追加するプラグインなんかが、オフにされると困るよねぇ。

ウェブページをブログからウェブサイトに移動させる時の関連アイテムパス変更

他人のエントリーに相乗りシリーズ・その1(って、絶対続かないと思うけど・・・)
SQLで特定のブログのブログ記事を別のブログのウェブページに変更する - かたつむりくんのWWW
ブログのウェブページだったものを、ウェブサイトに移動した時に、関連するアイテムパスをSQLでゴニョゴニョするです。

ウェブサイトのURLが http://hoge.com/ な時に、そこにぶら下がるブログのURLが http://hoge.com/fuga/ だったします。
その時に、ブログで登録したアイテムのURLが http://hoge.com/fuga/image/gazo.jpg だったとすると、そのアイテムのmt_assetテーブル上のasset_urlカラムでは「%r/image/gazo.jpg」として保存されています。(絶対ではなく違う場合もあるのですが、通常はそうです。)
また、asset_file_pathも同じく「%r/image/gazo.jpg」として保存されて居ることが多いです。(こちらは、OSに依存したパス区切り文字に変更されている場合もあります。例:「%r\image\gazo.jpg」)
この%rはブログの公開URL/ブログの公開パスをそれぞれ表しています。
つまり、ブログルートを基準とした相対パスで記述されているということです。

このアイテムをウェブサイトのアイテムに変更する場合、ブログ(正しくはウェブサイト)の公開パスが変更されるので、必然的に相対パスも変わってきます。
この場合は「%r/fuga/image/gazo.jpg」になります。このパス変更を行うSQLは以下になります。

UPDATE `mt_asset` SET `asset_url`=REPLACE(`asset_url`,"%r/","%r/fuga");

実際には、asset_urlと共にasset_file_pathの変更も必要ですし、大抵はasset_blog_idの変更も必要なはずです。
それらを含めて、以下のようなSQLで変更が可能になります。

UPDATE `mt_asset`
SET
`asset_blog_id` = ウェブサイトのブログID,
`asset_url` = REPLACE(`asset_url`, "%r/", "%r/fuga"),
`asset_file_path` = REPLACE(`asset_file_path`, "%r/", "%r/fuga")
WHERE `asset_blog_id` = 現在のブログのブログID

ただし、これらは細かい条件指定をしていないので、ブログに属する全てのアイテムが対象になっています。適切なWHERE句で対象を指定するか、phpMyAdminの検索機能などを使って絞り込んだ上でSQLを実行するとよいでしょう。

関連アイテムとしてウェブページに関連付けが行われている場合は、もちろんそこも修正が必要です。
こちらはアイテムID(objectasset_asset_id)、ブログID(objectasset_blog_id)、エントリーID(objectasset_object_id)の組み合わせなので、変更先ブログIDへと書き換えが必要です。
ブログIDが「1」のブログ・ウェブサイトにある、ウェブページの関連付けデータを、ブログID「2」のブログに変更したい場合は以下のSQLで実行できます。

UPDATE `mt_objectasset`
SET `objectasset_blog_id` = '2'
WHERE `objectasset_blog_id` = '1'
AND `objectasset_object_ds` = 'page';

挿入画像の幅を制限するMaxImageWidthプラグイン

サイトのデザイン上、記事に挿入される画像サイズには制限があるものの、実際の運用時には無頓着に画像を貼っていき、レイアウト崩れのクレームが来るなんてことは多々あるんじゃないでしょうか。
そういう時に便利なプラグインの紹介です。

こちらもお馴染み、Endevverのプラグインを元に、MT5以降日本語環境での使用を前提に修正したもので、実はかなり前に完成していていました。
naoaki011/mt-plugin-maximagewidth - GitHub

プラグイン設定

上のようにプラグイン設定で、挿入可能な画像の横幅の最大値を設定しておくと、下のように入力が制限されます。

挿入画面

上に表示されている幅と高さは、下のスライダーの位置と連動していて、幅は設定した値以上には設定できなくなります。

スライダーで変更

スライダーを使い、設定変更も可能ですし、それぞれの入力欄に直接入力しても、縦横比はキープされます。

オリジナルでは、「サムネイルを作成する」のチェックボックスが外せるようになっていて、「何だ意味無いじゃん」てな状態でしたので、挿入画像の横幅が設定値よりも大きい時は、チェックボックスが常に入った状態になるよう変更しました。
チェックボックスのonclickでチェックを付けるという力技ですが、設定値より大きな画像の場合は、必ずサムネイル作成になります。

それから、あれ、これってブログ毎にオン・オフ出来ないのとか思いませんでした?
プラグイン設定での入力欄を空にして保存すると、機能がオフになります。

AssetThumbnailURLの指定・・・

Long Long Time Ago Far Far Away...
という訳ではないですけれど、まぁかなり昔に目についた話・・・
104130: AssetThumbnailURL only processes one dimension at a time - FogBugz

MTAssetThumbnailURLに「width」と「height」を指定したら、オリジナルサイズの画像が戻ってきたとかいう話っぽいです。
で、そもそも「width」と「height」を同時にしてみたらどうなるかというのが、今回の話。
すでに、「MTAssetThumbnailURL | テンプレートタグリファレンス」も書きなおされているので、そこを見るのが早いけど、要はオリジナル画像のサイズも関係するということらしいです。
あくまでも「MTAssetThumbnailURL」では縦横比は変更されない訳です。

で、ここで昨日のチョットばかり続き。
Image Cropper」の登場。
Image Cropperで切り取るサイズは指定出来るんだけど、全部の画像に切り取り作業やるのは面倒だから、大半は自動生成にしちゃうとかいった場合に、画像が揃わなくなるんですねぇ。当たり前といえば当たり前。

オリジナル「endevver/mt-plugin-imagecropper - GitHub」のサンプルコード

<mt:Asset id="136">
  <mt:CroppedAsset label="Square">
    <img src="<$mt:AssetURL$>" width="100" height="100" />
  <mt:Else>
    <img src="<$mt:AssetThumbnailURL square="1" width="100"$>" />
  </mt:CroppedAsset>
</mt:Asset>

正方の例を使ってごまかしているけど、まぁ破錠するのはよく見なくても予想可能。
なら、サイズ指定でトリミングするタグを追加すればいいじゃないかというのが結論。
という訳で、苦労しつつ以下のタグを追加しました。

<$mt:ScaleThumbnailURL$>
widthとheightで指定された領域に内接するように縮小された画像のURLを返す
<$mt:FillThumbnailURL$>
widthとheightで指定された領域に外接するように縮小された画像のURLを返す
<$mt:CropThumbnailURL$>
widthとheightで指定された領域に外接する縮小画像の、はみ出し分を切り取った画像のURLを返す
<$mt:PrototypeVar$>
Image Cropperで定義したカスタムひな形の値を返す

コレを使って以下のようにすると、全てのサイズが揃うわけです。

<mt:Asset id="136">
  <mt:CroppedAsset label="Square">
    <img src="<$mt:AssetURL$>" width="<$mt:AssetProperty property="image_width"$>" height="<$mt:AssetProperty property="image_height"$>" />
  <mt:Else>
    <mt:PrototypeVar label="Square" property="max_width" setvar="width" />
    <mt:PrototypeVar label="Square" property="max_height" setvar="height" />
    <img src="<$mt:CropThumbnailURL width="$width" height="$height"$>" width="<$mt:Var name="width"$>" height="<$mt:Var name="height"$>" />
  </mt:CroppedAsset>
</mt:Asset>

CropThumbnailURLの切り取る位置ですが、デフォルトでは上からになってます。(左右は中央です)
最初は全て中央のつもりでしたが、意外と(特に人物)写真って、アタマから流すようなトリミングになっていて、上から切り取った方が良い結果が得られることが多かったです。

それで、もし位置が気に入らない場合は「align_x」と「align_y」というモディファイアで指定が出来るようになっています。

PrototypeVarについては、テーマに記述した値の取得が出来ていません。registryで設定した値をタグ内で取得する方法を調査中。また、themeの場合って管理画面でロードする時に取得されるので、そこら辺も難しい・・・
そういえば、アイテム登録もしてないけど、それはそのうち・・・
でも、それなりに結果は出たので、今日は満足。

MoreEntry...

MoreArchives...

AllEntries...

Home

Tag Cloud
Feeds
Link Status
In One

なかのひと

位置情報ブログパーツ「なかのひと」

Links
Powered By

Return to page top