web-dev-qa-db-ja.com

計算フィールドとNodeクローンモジュールが一緒に機能している別のフィールドに基づいて自動インクリメントフィールドを作成するにはどうすればよいですか?

計算されたフィールド で値を計算します(別のフィールドに値Aがある場合、同じ値を持つノードをカウントし、1を追加して、計算されたフィールド値の結果を使用します。増分のような)。このフィールドは、 Rules によってノードタイトルを作成するために使用されます。

ノードを保存するたびに、このフィールドが計算されます。いいよ.

ノードを更新するたびに、フィールドが計算されません。いいよ.

しかし、 clone ノードも必要です。ノードを複製するたびに、フィールドは計算されませんが、再計算する必要があります。その結果、ノードのタイトルが同一になり、複製されたノードの計算されたフィールド値が間違っています。

ルールを試しましたが、計算フィールドは「データ値の設定」などのアクションでの書き込みをサポートしていません。次に、 Computed Field を中止し、 Rules を使用してPHP Evaluationを使用してデータ値を設定しましたが、現在、トークンに問題があります。PHP評価で呼び出す必要があり、管理できませんでした…PHP構文は 計算済みフィールド および ルール

計算フィールドとNode Cloneを一緒に機能させるにはどうすればよいですか?

助けてくれてありがとう。

興味深い質問:

計算されたフィールド値をルールで使用する

EDIT 1:

Computed Field から Rules にコードを転送しようとしましたが、非常に近いと思います。しかし、私はまだトークンについてのアドバイスが必要です。 PHP Evaluation(action Set a data value))でトークンを呼び出すにはどうすればよいですか?token_replace?たとえば、[node:nid]、それを変数に入れるには$nid? ($nodeはこの Rules アクションでは使用できません...)

このPHP構文についてのヒントをありがとう。

EDIT 2:

リクエストに応じて、 Computed Field コードに触発されたルールのエクスポートを以下に示します。問題は、エンティティ参照フィールドのNIDを取得するクエリです(field_site_id_target_id)。 field_get_items計算済みフィールド ですが、ルールではPHP評価、機能しません(?)。この値はトークンで使用できることを知っています( [node:field-site-id:nid])ですが、PHP評価でそれを呼び出す方法がわかりません。このNIDを取得するために「変数を追加する」ことも試みましたが、それを呼び出す方法がわかりませんPHP評価。

私は誰かがこのフォーラムでこれを解決できると確信しています:)

{ "rules_titre_auto_sample_2" : {
    "LABEL" : "Titre auto Sample 2",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "php", "rules" ],
    "ON" : {
      "node_insert--sample" : { "bundle" : "sample" },
      "node_update--sample" : { "bundle" : "sample" }
    },
    "DO" : [
      { "data_set" : {
          "data" : [ "node:field-sample-number-2" ],
          "value" : {
            "select" : "node:nid",
            "php" : { "code" : "$nid_site=db_query(\u0022SELECT field_site_id_target_id FROM {field_data_field_site_id}\u0022)-\u003EfetchField();\r\n$result=db_query(\u0022SELECT count(*) FROM {field_data_field_site_id} WHERE field_site_id_target_id=\u0022.$nid_site)-\u003EfetchField();\r\n$value=sprintf(\u0027%03d\u0027,$result+1);\r\nreturn $value;\r\n" }
          }
        }
      },
      { "data_set" : {
          "data" : [ "node:title" ],
          "value" : "[node:field-site-id]-[node:field_sample_number_2]"
        }
      }
    ]
  }
}

EDIT 3:

問題を理解するために要求されたように:

タイトルSite A – 001でNode/1を作成(フィールドサイトID =サイトA、サンプル番号= 001(計算済み))OK

タイトルSite A – 002でNode/2を作成(フィールドサイトID =サイトA、サンプル番号= 002(計算済み))OK

Node/2の編集:タイトルは変更されません。 OK

タイトルSite B – 001でNode/3を作成(フィールドサイトID =サイトB、サンプル番号= 001(計算済み))OK

タイトルサイトBを持つNode/4のNode/3のクローンを作成– 001(フィールドサイトID =サイトB、サンプル番号= 001(計算済み))[〜#〜]エラー[〜#〜] :サイトB – 002である必要があります。

ノードを複製すると、新しい計算の代わりにサンプル番号の値が貼り付けられます。

お役に立てれば。

EDIT 4:

最初の回答とNode Clone。

残念ながら、それは私の元の問題では機能しません。そうです、「保存して編集」オプションを使用すると、クローン後のイベントを使用した場合にルールがトリガーされます。しかし、それでも、私の計算されたフィールドはre-computedではなく、フィールド値が複製され、タイトルは同じです。

私の場合、私は2つの方法しか見ていません:

計算フィールドを中止し、ルールとPHP評価でのみ機能します

OR

コンテンツが保存または更新されたときに計算フィールドを再計算する方法を見つける。計算フィールドに再計算するオプションがあることは知っていますが、表示されるたびに機能し、ノンストップで増加する数の奇妙な結果が得られます...

問題は、計算フィールドが書き込みをサポートしていないことです...したがって、ルールからのデータを設定するアクションは、ここでは使用できません。

その上、あなたのオプションで、それはクローンをすぐに保存し、それは私のクライアントには適切ではありません。例えば、彼らがクローン手順を試してみたいだけなら、彼らは新しいコンテンツを検索してそれを削除しなければならず、私はこれが欲しいです可能な限りユーザーフレンドリー。

私は計算フィールドを再考し、何が起こるかを見ていきます...

EDIT 5:

Computed fieldNode CloneRulesAuto-LabelPathauto 、私は本当に何かに近いです。

これまでの質問を要約しましょう:

  • フィールドAは、コンテンツが保存されるたびに、計算フィールドで計算されます。
  • このフィールドAは、別のフィールドの値(フィールドB)に基づいて自動インクリメントされます。予想される結果の例については、編集3を参照してください。
  • 自動エンティティラベルモジュールでは、コンテンツフォームのタイトルを非表示にできます(タイトルのパターンなし)。
  • コンテンツが保存または更新されるたびにルールがトリガーされ、ノードタイトル(=フィールドB-フィールドA)が作成されます。
  • ノードクローンを使用すると、コンテンツのクローンを作成できますが、フィールドAは再計算されないため、ノードタイトルは同じです。

私のテストとピエールヴリアンからのコメントに基づいて、私は新しい角度を試しました。

計算フィールドには、「毎回フィールド値を再計算する」というオプションがあり、私はそれを試してみました。これで、ノードの作成時またはノードのクローン作成時に、計算​​されたフィールドとタイトルを取得できました。

しかし、まだ最後の問題があります。コンテンツを保存すると、「ページが見つかりません」というメッセージが表示されます...

実際、Pathautoは各ノード([node:content-type]/[node:title])。驚くべきことに、ノードは適切なURLエイリアス(コンテンツの概要で利用可能)で適切に作成されていますが、新しいコンテンツを保存(または複製)した直後に、「ページが見つかりません」"と表示されます。今回はアクションシーケンスに問題があると思います。

この最後の障害について何か考えはありますか?

この手順で問題がなければ、使用した各ステップで明確な答えを作成します。

1
Toki

最後に、 計算済みフィールド なしのソリューションが見つかりました。

Edit 5で引用されているCF以外のすべてのモジュールを使用して、Rulesで自動インクリメント値を作成しました。

  • 新しいコンテンツを保存した後/既存のコンテンツを更新した後
  • 自動インクリメントするフィールドが空の場合
  • 次に、カスタムPHPコード(要求されたPHPフィルターコアモジュール)を実行して、適切な値(SQL)を取得します。
  • 以前に計算された値(トークンを使用)を使用して、データ値を設定してノードのタイトルを書き換えます

ノードのクローンを作成するときに新しい計算を強制するために、ルールノードの「ノードのクローン作成後」(Pierre.Vriensの提案どおり)を使用しましたが、Nodeクローンの構成。次に、ノードのクローンを作成して値を計算し、ノードのタイトルを書き換えるルールを作成しました。

この問題により、新しい強力なモジュールである 条件付きルール に出会いました。そのすばらしいモジュールのおかげで、あなたはルール内で、もしそうでなければ、スイッチを入れることができます...持つ必要があります。

0
Toki

ルールのエクスポート形式で、この(非常に基本的な)ルールを見てください。

{ "rules_demo_of_node_cloning" : {
    "LABEL" : "Demo of node cloning",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "clone" ],
    "ON" : { "clone_node" : [] },
    "DO" : [
      { "drupal_message" : { "message" : "bingo, a cloned node ... add any additional Rules Actions you want (after this action)." } }
    ]
  }
}

上記のルールはルールイベントを使用しますノードのクローンを作成した後Node clone モジュールを有効にしている場合に使用できるイベント) 。このルールで行うことは、「bingo、cloned node ...」で始まるメッセージを表示することだけです。 "(申し訳ありませんが、ルールを単体テストする私のお気に入りの方法...)少なくともそれが起こるはずです...

ただし、 comment nr 6 in issue nr 2212039 によると、このイベントはNode cloneの構成オプション "新しいノードとして保存して編集します。 "、オプション"ノードフォームフィールドに事前入力します "。これらのオプションはadmin/config/content/cloneにあります。そして、このオプションを変更した後、そのようなbingo-message(ルールはそのイベントによってトリガーされます)。

したがって、回避策として、そのオプションを使用することをお勧めします "新しいノードとして保存して編集します。 "、次にこのルールイベント(=ノードのクローン作成後)を既存のルールに追加します。または、このルールイベントを使用して新しいルールを作成し、適切なルール条件/アクションを追加します。これは、新しいノードまたは更新されたノードですでに作業しているルールに類似している可能性があります。さらに良いのは、上記のNode clone構成オプションを変更するだけで、ノードを作成または更新するための)既存のルールが既にトリガーされている可能性があるためです(他に何もする必要はありません)。 。

0
Pierre.Vriens