4


3

Drupal 6 / jQuery Ajaxがフィールドを更新

私は同じサイト上の別のパスにいます、そして私はユーザーが別の場所に書いたノード上のフィールドの内容を変更することを許可する必要があります。 私はnodeidとフィールド名、そしてidなどを持っています。

私はこれがそれほど難しいとは思わないが、チュートリアルや説明は素晴らしいだろう。

ありがとう。

編集:尋ねるためにanschauungありがとう、そう明確にするために:

CCKのテキストエリアです。 その理由としては、リンクノード参照ノードが多数ある中央ノードタイプがあります。 セントラルノードを参照するノードの編集ページから、セントラルノードのフィールドを編集して保存できる必要があります。 だから私のユースケースです。

再度、感謝します。

どうもありがとうございます、本当にありがとうございます。

これが私がこれまでに持っているものです:

ステップ1の場合:

function update_main_field_menu() {

  $items = array();

  $items['update_main_field/%'] = array(
    'title' => 'Update Main Field',
    'page callback' => 'post_to_main_node',
    'page arguments' => 1,
    'type' => MENU_CALLBACK
  );

  return $items;
}

ステップ2:

function post_to_main_node(){
    // Sorry, I'm totally lost. What do I put here?
}

また、あなたはこれを述べました:

_ hook_form_alter、hook_nodeapi、またはノードフォームが生成されたときに呼び出されるその他のフックのいずれかです。 あなたはあなたの状況に最も適しているものを調査するべきです。 _

ノードフォームを生成する方法

ステップ3:

function modulename_form_mainct???_node_form_alter (&$form, &$form_state) {

    // I'm not sure about which form I'm doing node form alter on. If I do it to the mainct, wouldn't that alter the regular edit page the user is viewing? I only want to load the js for the ajax submission. Is there a update_main_field node form?


    drupal_add_js(drupal_get_path('module', 'modulename') ."/updateField.js");
}

また、ステップ2の関数とステップ3のノード形式の取得の間には何がありますか?

*ステップ4:*私はほとんど理解していると思いますが、他のことでまだテストできないのですが。 :)

私は本当にこれをdrupalで行う方法を学びたいのですが、あなたがあなたの言語のダミーレベルを少し上げることができればそれは膨らむでしょう。 :Dもう一度ありがとうございます。

'' '' '

もう一度編集:

昨日実際にアクセス引数を入れようとしましたが、何らかの理由でうまくいきませんでした。 :(しかし今それは! ええ、あなたは魔法を持っています。

今、私はこのような記事をトリガーすると:

Drupal.behaviors.ajax_update_field = function (context) {
    $("#button").click(function(){
        var url = $("#edit-field-reference-0-nid-nid").val().replace(/.*?\[nid:(\d+)?]/ig, "$1");
        url =  "/update_main_field/"+url;

            // The data is just some silly test thing
        $.post(url, {data: $("#edit-field-reference-0-nid-nid-wrapper label").text()}, function(value) {

            // Here you can write your js to handle a response to the user,
            // or if something went wrong an error message.
            // value = response data from drupal

            alert(value);

        });
    });
}

正しいデータを含むURLへの投稿が表示されます。 どっちがいい。 しかし反応はありません。 アラートは空です。

また新しい空白…​ 何かが作成されました。 そこには何もありませんが、ノードに対してフィルターをかけたときにビューで見ることができます。 タイトル、フィールドなどはありません。 投稿日だけです。

更新したいノードが更新されていません。

そのため、ステップ2はおそらく多少正しくないと考えるようになります。 いくつか質問があります。

function post_to_main_node(){

    // Is this sufficient to load the node? nid doesn't have to be set as an arg for the function?
    $node = node_load($_POST['nid']);

    // Is the field set like this? 'field_library' is the 'machine name' of the field. This is what's needed right?
    $node->field_library = $_POST['data'];
    node_save($node);
}

もう一度ありがとうございます。

1 Answer


7


これは非常に簡単に実行できますが、いくつかのステップがあります。

*これを行う方法を示すためにコードを更新しました。 このコードはほとんどあなたのdrupalプロジェクトにコピーすることができますが、私はそれを戦闘テストしていないので、ここにタイプミスやそこにバグがあるかもしれません

  1. hook_menu()を使用して投稿できるURLを設定します。 あなたはCALLBACK型を使う必要があります。 覚えておく必要があるのは、メニュー項目にある種のアクセス制御を追加することです。 アクセス制御が行われていないため、ユーザー1でもアクセスできない場合はアクセスできません。 この場合、あなたはアクセス引数を使い、ユーザが持っている必要があるパーマの名前を置くべきです。 別のモジュールに既に存在するものを使用することも、 hook_permを使用して独自のモジュールを作成することもできます。 ユーザーがこれを使用できるようにするには、ユーザーに正しい権限があることを確認する必要があります。 これは通常Drupal AIを通して行われます。

関数modulename_menu(){$ items = array(); $ items ['update_main_field'] = array( 'ページコールバック' => 'call_back'、 'type' => MENU_CALLBACK、 'アクセス引数' => array( 'name of perm')、); $ itemsを返します。
  1. 指定したコールバック関数を作成します。これは、誰かがURLにアクセスしたときに実行される関数です。 単純化されたバージョンはこんな感じです。 ノードを保存する前に、データを検証してそのようなことをする必要があります。 また、権限チェックをすることもできます。

関数call_back(){$ result = array(); //ここで、日付を確認してノードを取得し、cckフィールドを更新して保存します。 $ node = isset($ _ POST ['nid'])? node_load($ _ POST ['nid']):FALSE; // nidが設定されていない場合、またはnidが無効な場合、// $ nodeはfalseになります。 if(!$ node ||!isset($ _ POST ['テキスト']); {$結果['ステータス'] = 'エラー'; $結果['メッセージ'] = t( 'エラーメッセージ');}ロードされたノードが正しい型を持っているかどうかをチェックして、欲しいフィールドがあるようにします。 そうでなければ($ node-> type!= 'node_type'){$ result ['status'] = 'error'; $ result ['message'] = t( 'エラーメッセージ'); } else {$ node-> field = $ _POST ['text']; node_save($ node); $ result ['status'] = 'success'; $ result ['message'] = t( '成功メッセージ'); drupal_json($ result)を返します。 }
  1. jsファイルを追加します。これは drupal_add_js()で行うことができます、あなたはhttp://api.drupal.org/apiを調べたいと思うかもしれません/ function / drupal_get_path / 6 [drupal_get_path()]をクリックして、jsファイルの正しいパスを作成します。 jsファイルを追加する方法はいくつかあります。 hook_form_alter、hook_nodeapi、またはノードフォームが生成されたときに呼び出されるその他のフックのいずれかです。 あなたはあなたの状況に最も適しているものを調査するべきです。 hook_form_alterを使うと、このようになります。

modulename_form_alter( if($ form_id == 'content_type_name_node_form'){drupal_add_js(drupal_get_path( 'module'、 'modulename'))。 '/script.js'); }}
  1. あなたがjxを使ってあなたのjavascriptのものをしてくださいこれがあなたがfxにボタンとテキストフィールドを持っていたなら、これはこのように見えるでしょう:

$( "#button_id#")。(function(){var nid = $( "#編集フィールド参照0-nid-nid")。val()をクリックします。(/.*?\ [nid: (\ d)?] / ig、 "$ 1"); var text = $( "#編集フィールド参照0-nid-nid-ラッパーラベル")。text(); $ .post( "/ update_main_field" 、{"nid":nid、 "text"、text}、function(data){//これは基本的にjQueryが応答データをjsonに変換する方法です。var json = eval( "(" data ")"); if(json [ 'status'] == "error"){//エラーケースを処理します。 } else if(json ['status'] == "success"){//成功ケースを処理します。 ;}}); ;));
  1. あなたのコールバック関数であなたは$ _POSTにあるであろうデータを扱う、そしてあなたはあなたのjsがユーザーに何が起こったのかを知らせるために行動できるようにあなたが返すjsonデータによってあなたの関数を終了するべきです。 これには drupal_jsonを使用できます。