ブログ

MTAppConvertUrlForWebViewタグのヒント

このエントリーをはてなブックマークに追加

Aplikoでは記事・ウェブページのアーカイブパスをWebView用アーカイブテンプレートのアーカイブパスに変換するために「MTAppConvertUrlForWebViewタグ」を提供しています。

もう少しかみ砕いて説明すると、例えばPC・スマートフォンのブラウザで閲覧するためのHTMLを生成するための「記事」テンプレート(こちらが優先するアーカイブマッピング)、そしてAplikoで生成したアプリで表示するための「アプリ用記事(WebView)」テンプレートがある時、MTEntryPermalinkで出力されるURLは常に「記事」テンプレートで設定したアーカイブパスを元にしたURLとなります。このままでは「アプリ用記事(WebView)」テンプレートで出力したHTMLのURLが自動で出力できません。そのためにMTAppConvertUrlForWebViewタグが用意されているのです。

テンプレート例と出力例

テンプレート例

<!-- ブラウザ向けURL -->
<a href="<$mt:EntryPermalink>">
<!-- アプリ向けURL -->
<mt:AppConvertUrlForWebView><a href="<$mt:EntryPermalink$>"></mt:AppConvertUrlForWebView>

出力例

<!-- ブラウザ用URL -->
<a href="/2018/02/powercms5_beta.html">
<!-- アプリ用URL -->
<a href="/__app__/entries/[記事ID].html">

補足

MTAppConvertUrlForWebViewタグは、出力されるソースの中のa要素に対して変換操作を行います。そのため、a要素の前後をMTAppConvertUrlForWebViewタグで囲みます。以下のテンプレートは正しく動作しません。

<mt:AppConvertUrlForWebView><$mt:EntryPermalink$></mt:AppConvertUrlForWebView>

アプリ用URLが出力されない場合

現在新たなAplikoのテーマを作成しているのですが、MTAppConvertUrlForWebViewタグを使用したにもかかわらずアプリ用URLが出力されない場合がありました。原因を探ったところ、ほぼ確実にmt_entryテーブルのentry_ma_permalinkフィールド(Aplikoが追加したフィールド)に起因することが分かりました。

具体的なケースと対策を示します。

記事をインポートした時

記事をインポートした直後はentry_ma_permalinkフィールドがNULLになっています。そのため、MTAppConvertUrlForWebViewタグを使ってもブラウザ用の記事URLが出力されます。

対策としてはスケジュールタスクが動作するまで待ちます。標準では実行間隔が6時間に設定されているため、最大6時間かかります。(cronの実行間隔が1日1回の場合は1日かかります。)

6時間も待てない方は、MobileApps.packのconfig.yamlにあるmobile_apps_scheduled_tasksfrequency1等に変更してスケジュールタスクを動かしてみて下さい。(タスクを動かした後は元に戻して下さい。)

tasks:
    mobile_apps_scheduled_tasks:
        label: Tasks for Mobile Apps
        frequency: 21600    # ←ここを変更します
        code: $mobileapps::MobileApps::Tasks::_mobile_apps_scheduled_tasks
        priority: 5

途中でブラウザ用記事テンプレートのアーカイブマッピングを変更した時

レアなケースかもしれませんが、運用中・試用中にブラウザ用記事テンプレートのアーカイブマッピングを変更してしまうと、mt_entryテーブルのentry_ma_permalinkフィールドに記録されたブラウザ用記事URLと実際の記事URLに差異が発生してしまい、MTAppConvertUrlForWebViewタグがアプリ用の記事URLを出力できなくなってしまいます。

現在の所、phpMyAdminなどでクエリを実行し、mt_entryテーブルのentry_ma_permalinkフィールドの値を一旦NULLにする必要があります。ブログIDが1のウェブサイトについて対応する場合のクエリの例を示します。なお、クエリを実行する前は必ずバックアップを取得してください。

UPDATE `mt_entry` SET `entry_ma_permalink` = NULL, `entry_ma_permalink_wv` = NULL WHERE `entry_blog_id` = 1;

まとめ

MTAppConvertUrlForWebViewタグは、mt_entryテーブルやmt_templateテーブル等を元に動作しているため、少し動作が複雑です。私が遭遇した状況全てをご紹介いたしましたが、もしそれでも上手くいかないという方はお知らせ下さい。その際、テンプレートとデータベースのダンプがあるとスムーズに調査が行えます。