web-dev-qa-db-ja.com

段落アイテム内のhook_form_alter()の方法

段落アイテムのnode_formのフィールドを編集したいのですが。通常のフィールドでは、以下のコードのようなものを使用して、field_p_custom_id(d7)というフィールドを微調整します

function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
    switch ($form_id) {
        // Tweak CONTENTTYPE_node_form 
        case 'CONTENTTYPE_node_form':
            // hide custom ID field for all users, even admin (this field should never be changed)
            $form['field_p_custom_id']['#access'] = FALSE;

        break;
    }
}

...しかし、段落アイテムの場合、field_p_custom_idは段落バンドル内に配置されます。 $ formと$ form_state内を検索しましたが、このフィールドを変更する場所が見つかりません。 (段落アイテムは必須ではなく、無制限に追加できるため、フォームにはデフォルトでは存在しません)

4
user1292738

Drupal 8の場合、 hook_field_widget_WIDGET_TYPE_form_alter を実装できます。

/**  
 * Implements hook_field_widget_WIDGET_TYPE_form_alter().  
 */  
function paragraphs_test_field_widget_entity_reference_paragraphs_form_alter(&$element, &$form_state, $context) {
  if ($element['#paragraph_type'] == 'altered_paragraph') {
    $element['subform']['field_text']['widget'][0]['#title'] = 'Altered title';
  }
} 

ここで私の答えを参照してください: 段落フィールド内に含まれるフォームフィールドの動作を変更するにはどうすればよいですか

2

この2日間、私はこれに苦労しています。ユーザーがASINを入力してボタンをクリックできるようにするボタンを追加しようとしていました。これにより、Amazon APIから大量の情報が取得されます。ある種のフックを使用して、API呼び出しからの情報を直接段落に入れるためのボタンといくつかの追加のコンテナーを配置したいと思いました。しかし、それを行う方法を見つけることができませんでした。機能するソリューションを構築することになりましたが、Drupalの方法ではありません)。

Hook_form_FORM_ID_alter()を使用して、誰かが「新しい段落を追加」ボタンをクリックした後に起動したページにjQuery ajaxCompleteコマンドを挿入しました。コールバック関数で、クリックハンドラー付きのボタンを新しい段落フォームに挿入しました(ユーザーが「新しい段落を追加」ボタンをクリックするたびにボタンが1回だけ作成されるようにいくつかのチェックを行いました)。

次に、クリックハンドラーが独自のajax呼び出しを行い、hook_menuを使用してそれをキャッチし、Amazon API呼び出しを処理しました。最後に、ハック感のあるjQuery呼び出しをまとめてdivを作成し、そこにAmazon情報を挿入しました。

それはあまりエレガントではありませんが、誰かを助けるために私のコードは以下にあります。

私が見つけたのは Drupal 8 の段落に探しているフックを誰かが構築/パッチしたことです。残念ながら、Drupal 7.うまくいけば、誰かがより良い解決策を指摘したり、将来的にフックを作成したりできます。

<?php

function Amazon_fill_form_Amazon_list_node_form_alter(&$form, &$form_state, $form_id) {

$form['from'] = array(

    '#type' => 'item',

    '#markup' => '  
        <script>
            var beer = function() {
                event.preventDefault();
                var ASIN = jQuery(this).parent().parent().find("input").val();
                var preThis = this;
                jQuery.get("/bestpresentsfor.com/getamazoninfo/?asin=" + ASIN, function(info) {
                    console.log(info);
                    var paragraphContainer = jQuery(preThis).closest(".ajax-new-content");
                    jQuery(paragraphContainer).find(".field-name-field-title").find(".description").after("<div class=\"asin-title-container\">This is the title that Amazon provides:<br>" + info[ASIN].title + "</div>");
                    jQuery(paragraphContainer).find(".field-type-link-field").find("input").val(info[ASIN].detailpageurl);
                    jQuery(paragraphContainer).find(".field-name-field-product-image").find(".description").after("<div class=\"asin-image-container\">This is the image that Amazon provides:<br><img src=\" " + info[ASIN].imagesets.largeimage.url + " \" alt=\"There is no Amazon image for this product!\"></div>");
                    jQuery(paragraphContainer).find(".field-name-field-product-description-Amazon").find(".description").after("<div class=\"asin-description-container\">This is the description that Amazon provides:<br>" + info[ASIN].editorialreviews[0].content + "</div>");
                });
                return false;
            }

            var megaIndex = 0;
            var newButton = "<div class=\"asin-button-container\"><button class=\"asin-button\" onclick=\"beer.call(this)\">Enter ASIN</button></div>";
            jQuery( document ).ajaxComplete(function() {
                addASINS = jQuery(".field-type-asin");
                for (var i = 0; i < addASINS.length; i++) {
                    if (jQuery(addASINS[i]).find(".asin-button").length == 0) {
                        jQuery(addASINS[i]).append(newButton);
                    }
                }
            })
        </script>
    ',
);
}

function Amazon_fill_menu() {
     $items['getamazoninfo'] = array(
         'page callback' => 'page_callback', 
         'type' => MENU_CALLBACK,
         'access arguments' => array('access content'),
     );
     return $items;
}

function page_callback() {
     $asin = $_GET['asin'];
     $info = Amazon_item_lookup_from_web($item_ids = array( $asin ));
     drupal_json_output(
         $info
     );
     drupal_exit(); 
}
1
kosher

新しいノードを作成すると、段落フィールドは常に空になります。ノードを作成していくつかの段落を追加してから、ノードを編集して$ form内を検索できます。多分あなたは最初にデフォルトの段落を追加することができます https://www.drupal.org/project/paragraphs_defaults

0
Rafael Guedez