entity_metadata_wrapper-> save()がノードのリビジョンを更新しないのはなぜですか?


8

ノードを更新するモジュールを開発しています(リビジョンを有効化)。こんな感じです。

 $nodes = node_load_multiple(array(), array('type' => $bundleType));
 foreach ($ndoes as $node){
    $w = entity_metadata_wrapper('node',$node);
    $w->MyFields->set($someValue);
    $w->save();
 }

フィールドは正しく設定されましたが、ノードのリビジョンIDは後に変更されませんでした$w->save()

リビジョンIDを更新するにはどうすればよいですか?


されたcreate new revisionフラグは、コンテンツタイプのノードに設定されていますか?$w->revision->set(1);保存する前に試しましたか?....
テンケン

はい、「新しいリビジョンを作成」がオンになっています。について$w->revision->set(1)はあまり知りませんが、ノードが更新されたことをdrupalに手動で通知する方法ですか?やってみます。
zhuchun

うーん、$w->revision->set()動作します。誤解するようです$w->save()。保存中に自動的にrevision-idを増やすべきだと思いました。次の増加リビジョンIDを取得する方法はありますか?ありがとう
zhuchun

いいえ、revision->set(1)ノードの今後の/現在の編集に関する新しいリビジョンを記録するようにノードに指示します。メタデータラッパーがcreate new revision .....のグローバル設定を認識していない理由はわかりませんが、リビジョンフラグを設定することは、今見たように非常に簡単な回避策です。将来他のユーザーが正しい答えを見つけるのに役立つようにコメントをアップしたい場合は、以下の回答として私のコメントを提供します。
テンケン2014年

回答:


6

コンテンツタイプのノードに新しいリビジョンの作成フラグが設定されていますか?$ w-> revision-> set(1);のように試しましたか?保存する前に?....

編集:

著者は設定$w->revision->set(1)が彼の問題を解決すると言います。


簡単な回避策です。なぜそれが笑う必要があるのか​​分からない。ありがとうございました!
zhuchun

10

UIを介してノードを編集する場合、それはを介して行われnode_form()ます。これには、node_object_prepare()そのノードのデフォルト値を設定するへの呼び出しが上部近くにあります。これには、のデフォルト値の設定が含まれます。これは、新しいリビジョンが必要かどうかを判断するために$node->revision使用されnode_save()ます。

Entity APIはリビジョンに対応していますnode_object_prepare()が、ノード固有のものです。つまり、ノード編集フォームの動作を模倣するリビジョンプロパティの設定を含め、値を自分で管理する必要があります。


7

これらの答えはどれも実際には正しく->set(1)ありません。これを行うと、実際にリビジョン番号を変更したように聞こえるため、インクリメントする必要があります。

これは実際にはブール値のフラグなので、正しい答えは $node->revision->set(true);

zhuchunが言うように:彼はそれが必要な理由を理解していません、ブールフラグとして説明されるとき、それは数よりも完全に理にかなっています。


drupal_submit_formたとえば、電話をかけるのが最も簡単な新しい人形のコンテンツを作成する時期がありました。ノード送信フォームのPOST値を調べるrevision = 1と、フォームアイテムcreate new revisionボックスがオンになっているため、POSTフィールドに次のように表示されます。以来1 == TRUE、コードは、いずれかの方法で動作します。しかし、あなたの主張は有効です。
テンケン

これは受け入れられるべき答えです
Alex Skrypnyk 2017年


0

ノードタイプでリビジョンがデフォルトで有効になっていない場合、新しいリビジョンをリクエストする最も簡単な方法は次のとおりです。

$w->revision = TRUE;

これは次のものを使用するのとまったく同じです:

$w->revision->set(TRUE);

しかし、タイピングが少なくて済みます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.