web-dev-qa-db-ja.com

privatemsgメッセージ本文へのマークアップの追加

まず、簡単な背景情報:

単一のD7コードベースで実行されている複数のサイトでprivatemsg 7.x-1.2を実行しています。 1つのデータベースにすべてのprivatemsgテーブルがあり、プライベートメッセージの同期を維持するために、すべてのサイトからアクセスされます。

その小さなセットアップを強化するために、挿入/保存時にメッセージ本文を操作して、「このメッセージは[サイト名]経由で送信されました」という行を各メッセージの最後に追加します。これは私が最初にそれを達成した方法です:

function global_privatemsg_message_presave_alter(&$message) {
    $message->body .= "<div class=\"sent-via\">(". t("Sent via !site_link", array('!site_link' => get_site_link())) .")</div>";
}

入力フィルターが適用される前にhook_privatemsg_presave_alterが実行されるという事実を見落としたことを除いて、それはうまくいきました。そのため、ユーザーがメッセージを「フィルターされたHTML」または「プレーンテキスト」として送信すると、「送信済み」がスローされます。

したがって、私が探しているのは、メッセージボディにマークアップを追加する信頼できる方法です。または、入力フィルターによって変更されることなく、それに応じて入力できる新しいテンプレート変数を導入することさえできます(Drupalのcheck_markupの結果だと思います)。 。

できれば、PrivatemsgモジュールAPIの制約の範囲内でこれを完全に実行したいのですが、不可能を求めているのではないかと思います。

できますか?

1
Riari

(私はprivatemsgを使用していません)...しかし、D7の新機能のために実行可能であることを確認してください:

添付ファイルの代わりに、プライベートメッセージはフィールド化可能であり、任意の数およびフィールドの組み合わせをそれらに追加できます。

つまり、テキストfield_type。次に、あなたのpresaveフックであなたはただ行うでしょう:

$message->sent_by_sitename = 'some_sitename_in_your_multisite_install';

次に、メッセージ表示を変更して、マークアップを追加し、「このメッセージの送信者」マークアップを導くカスタムフォーマッタを使用して、この新しいフィールドを表示します。

私はこれを手作業で行うコードを持っていません(おそらく約30行です)。 drupal-のデフォルトユーザーオブジェクトにカスタムフィールドを追加する同様のリクエストを次に示します-リクエストはprivatemsgに関して異なりますが、おそらく同じ関数のいくつかを引き続き使用します: add -properties-to-an-entity-hook-schema-alter

要するに:

  • カスタムモジュールでカスタムフィールドを定義します。例 hook_field_info()
  • module_enable()およびmodule_disable()で、フィールドをメッセージエンティティにアタッチします。例: field_create_field() および field_create_instance()
  • 既存のprivatemsg API呼び出しを変更して、生のHTMLではなく、この新しいフィールド値を設定します。
  • privatemsgメッセージ表示を変更して、メッセージ表示の下部に関連するfield_formatterを持つ新しいフィールドを表示します。
3
tenken