web-dev-qa-db-fra.com

Comment hook_form_alter () à l'intérieur d'un élément de paragraphe

Je souhaite modifier un champ dans la forme node_form d'un élément de paragraphe. Pour les champs normaux, j'utiliserais quelque chose comme le code ci-dessous pour modifier un champ appelé 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;
    }
}

... mais, dans le cas d'un élément de paragraphe, le field_p_custom_id est placé à l'intérieur d'un ensemble de paragraphes. J'ai cherché dans $ form et $ form_state, mais je ne trouve pas où modifier ce champ. (l'élément de paragraphe n'est pas présent par défaut sur le formulaire car il n'est pas obligatoire et peut être ajouté un nombre illimité de fois)

4
user1292738

Pour Drupal 8, vous pouvez implémenter 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';
  }
} 

voir ma réponse ici: Comment puis-je modifier le comportement des champs de formulaire contenus dans le champ de paragraphe?

2
Lars Jendrzejewski

Je me bats avec ça depuis deux jours. Je cherchais à ajouter un bouton qui permettrait aux utilisateurs d'entrer un ASIN et de cliquer sur le bouton, qui obtiendrait un tas d'informations de l'API Amazon. Je voulais utiliser une sorte de crochet pour placer le bouton et des conteneurs supplémentaires pour les informations de l'appel d'API directement dans le paragraphe. Cependant, je ne pouvais pas trouver un moyen de le faire. J'ai fini par construire une solution qui fonctionne, mais qui n'est pas tout à fait la méthode Drupal.

J'ai utilisé hook_form_FORM_ID_alter () pour insérer une commande jQuery ajaxComplete dans la page qui s'est déclenchée après que quelqu'un a cliqué sur le bouton "ajouter un nouveau paragraphe". Dans la fonction de rappel, j'ai inséré mon bouton avec un gestionnaire de clics dans le nouveau formulaire de paragraphe (avec quelques vérifications pour que mon bouton ne soit créé qu'une fois à chaque fois que l'utilisateur clique sur le bouton "ajouter un nouveau paragraphe").

Le gestionnaire de clics a ensuite effectué son propre appel ajax, et j'ai utilisé un hook_menu pour intercepter cela et prendre en charge l'appel Amazon API. Enfin, j'ai rassemblé un tas d'appels jQuery au toucher hacky pour créer des divs et y insérer les informations Amazon.

Ce n'est pas très élégant, mais mon code est ci-dessous s'il aidera quelqu'un.

J'ai trouvé que quelqu'un a construit/patché les crochets que nous recherchons aux paragraphes dans Drupal 8 . Dommage que nous ne les ayons pas pour Drupal 7. J'espère que quelqu'un pourra indiquer une meilleure solution et/ou créer les crochets à l'avenir.

<?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

Lorsque vous créez un nouveau nœud, le champ de paragraphe sera toujours vide, vous pouvez essayer de créer un nœud et ajouter un paragraphe, puis modifier le nœud et rechercher dans $ form. Vous pouvez peut-être d'abord ajouter un paragraphe par défaut https://www.drupal.org/project/ Paragraphs_defaults

0
Rafael Guedez