web-dev-qa-db-ja.com

ルールループ内の単一フィールドのリストのすべてのトークン値を連結するにはどうすればよいですか?

新しく作成したノードにアップロードされたファイルのリストをメールで送信しようとしています。

コンテンツタイプには、無制限の値を許可するファイルフィールドがあります。

Rules 内で、現在のアイテム「current_file」を呼び出すループを作成しました。

enter image description here

すべての値を「file_list」と呼ばれる1つの長いテキストフィールドに連結しようとしています。

メールの本文で「file_list」の値にトークンを使用するつもりです。

残念ながらできません。

データ選択モードでは、ループによって作成されたトークンにアクセスできます。

enter image description here

ただし、直接入力モードでは、トークンを使用できません。それらは、「置換パターン」セクションにリストされていません。

次の値を入力しようとすると、成功しません。

[node:field-file-list]
[current-file:file:url]

直接入力モードでトークンを使用できるようにするにはどうすればよいですか?

これを間違って行っている場合、各ファイルのすべてのURLを連結して、電子メールアクションの本文に入れることができる別の方法はありますか?

1
AndrewMRiv

この回答は、読者が Rules モジュールの使用に関する基本的な知識を持ち、ループを使用して無制限の許可された入力でフィールドのすべての値を返す方法を理解していることを前提としています。

(また、これは新しく作成されたノードでの反応のみをカバーします。)


したがって、主な問題は、「直接入力」モードではルールのループ変数を使用できなかったことですが、「データ選択」モードを使用できました。

無制限の値のファイルフィールドのすべてのファイル名とファイルURLを連結し、長いテキストフィールド(フィルターされたHTML)の順序付けされていないHTMLリストに出力する必要がありました。

これを行うにはもっと良い方法があるかもしれませんが、これが現在私がこの仕事をする唯一の方法でした。


1.)追加フィールドを作成する

ループ変数トークンは直接入力モードでは使用できないため、通常のフィールドトークンは使用できるため、ループ変数情報を新しいフィールドに入れて、それらを連結します。

次のフィールドを作成します。

  • ファイルのアップロード(無制限の値を受け入れるように設定されたファイルフィールド)
  • ファイル名フィールド(長いテキストフィールド。これをプレーンテキストに設定することが重要です。プレーンテキストではないときに問題が発生しました)
  • ファイルパス/ URLフィールド(同じ理由で長いテキスト、プレーンテキストも)
  • プレーンテキストのファイルリストフィールド(プレーンテキストのロングテキストフィールド。これは、連結されたすべての値を取得するフィールドです。これは後で意味をなします。これもプレーンテキストである必要があります。そうしないと、ルールが何らかの理由で値を連結しません。 )。
  • フィルターされたhtmlのファイルリストフィールド(フィルターされたhtmlを含む長いテキストフィールド。これはユーザーに表示されるフィールドです)

enter image description here

上記のフィールドでは、最初と最後のフィールドのみがユーザーに表示されます。残りはフィールド許可モジュールで非表示にする必要があります。

追加のフィールドは、Rulesモジュールで使用されるだけです。


2.)ループを作成する

このファイルフィールドには無制限の入力があるため、ループを作成して[ファイル]フィールドを選択します。

ループで現在のファイルに「current_file」という名前を付けました。

enter image description here


3.)ファイル名を取得します

新しく作成されたループ内で、「データ値を設定する」アクションを作成します。新しく作成されたファイル名フィールドを取得し、現在のファイルのファイル名の値を取得します。

直接入力モードではないことを確認してください。そうしないと、トークンを使用できなくなります。

enter image description here

4.)ファイルのURLを取得する

この手順は、最後の手順と似ています。

新しく作成されたファイルURL /パスフィールドの「データ値の設定」に別のアクションを追加します。現在のファイルのファイルURLからデータを取得するように設定します。

ここでも、直接入力モードになっていないことを確認してください。そうしないと、トークンを使用できなくなります。

enter image description here

5.)値を連結する

最後に、[プレーンテキストファイルリスト]フィールドで、値を連結します。

最初に現在のフィールドを表すトークンを入力し、その下に現在のファイル名とパスを追加します。

今回は、直接入力モードにして、好きなように入力できるようにしてください。

enter image description here

6.)ulタグを追加する

これがループの外にあることを確認してください。

値の周囲にulタグを追加するデータ値を設定するアクションを追加します。

enter image description here

7.)連結された値をFiltered HTMLフィールドに入力します

データ値を設定する別のアクションを追加します。プレーンテキストファイルリストの値を[フィルターされたHTMLファイルリスト]フィールドに入力します。

2つの異なるファイルリストフィールドが作成された理由は、フィルターされたHTMLフィールドでの連結が何らかの理由で機能しないためです。

enter image description here

8.)結果を見る

すべての手順を実行すると、ファイルのURLにリンクされている、アップロードされた各ファイルの順不同のHTMLリストが表示されます。

enter image description here

これははるかに少ない手順で達成できるはずですが、これが問題を解決できる唯一の方法でした。

0
AndrewMRiv

あなたが探しているものが利用できない場合は、それを利用可能にしてください。それは「各ファイルのすべてのURLを連結する別の方法(質問のように)です。詳細については、以下をお読みください...

このルールの例(ルールのエクスポート形式)をご覧ください。これは、求めているもののバリエーションです。

_{ "rules_show_list_of_fields" : {
    "LABEL" : "Show list of fields",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "ON" : { "node_insert" : [], "node_update" : [] },
    "IF" : [
      { "node_is_of_type" : { "node" : [ "node" ], "type" : { "value" : { "article" : "article" } } } }
    ],
    "DO" : [
      { "variable_add" : {
          "USING" : { "type" : "text", "value" : "StartOfList-" },
          "PROVIDE" : { "variable_added" : { "email_list" : "List of eMail IDs" } }
        }
      },
      { "LOOP" : {
          "USING" : { "list" : [ "node:field-email-addresses" ] },
          "ITEM" : { "current_email" : "Current eMail" },
          "DO" : [
            { "data_set" : {
                "data" : [ "email-list" ],
                "value" : "[email-list:value][current-email:value]-"
              }
            }
          ]
        }
      },
      { "data_set" : { "data" : [ "email-list" ], "value" : "[email-list:value]EndOfList" } },
      { "drupal_message" : { "message" : "The value of the email_list variable is: [email-list:value]." } }
    ]
  }
}
_

このルールの機能の概要は次のとおりです。

  • 新しい変数_email_list_を追加します。
  • プレフィックスを付けて_email_list_値を初期化します。
  • ループ内の各アイテムについて、そのアイテムの値を追加し、その後に区切り文字を追加します。
  • _email_list_値にサフィックスを追加します。

私の場合、電子メールIDを含むマシン名_field_email_addresses_の複数値のテキストフィールドを使用していて、「_-_ "、およびプレフィックス(= StartOfList)/サフィックス(= EndOfList)を付けます。また、ルールイベントの「既存のノードを更新」も使用します。

マイリストフィールドのマシン名をリストフィールドに置き換え、すべての「eMail」を「ファイル」に置き換えます。自分のサイトにこのルールをインポートできるはずです(ルールUIが有効になっている場合)。

接頭辞または接尾辞、および/または区切り文字(= "_-_")が必要かどうかは不明です。必要に応じて、これらのいずれかを適応または削除してください。

ボイラ ...

デモ

これは、新しいノードを作成した後、または既存のノード(Articleタイプ)を更新した後のStatusメッセージの外観です。

Email_list変数の値は、StartOfList-user2 @ example.com-user4 @ example.com-EndOfListです。

1
Pierre.Vriens