5

ile "iki boyutlu" başka bir öğe ekleyin "sorunu var Drupal 8'i öğreniyorum. Bir 'iki boyutlu' 'başka bir öğe ekle' formu içeren bir sayfa oluşturmak istiyorum. Kodum neredeyse iyi çalışıyor, ancak bir eve oda eklediğimde garip bir davranışım var (benim hata ayıklama günlüklerimdeki tuhaf bir değer var, FormStateInterface :: getTriggeringElement(), kod ve günlük için aşağıya bakın)FormStateInterface :: getTriggeringElement()

İlk önce iki yapı, ev ve oda var. kullanıcı bazı evler oluşturabilir ve her ev için, o bazı odalarda oluşturabilirsiniz: Bazı evler eklediğinizde

enter image description here

form çalışıyor:

enter image description here

Biraz eklediğinizde geçen evine odaları, form ince çok çalışır:

enter image description here

Ama herhangi bir "no-last" eve bazı odalar eklediğimde, form iyi çalışmıyor (ekran görüntüsünde, blok house '1' deki "oda ekle" ye bir kez tıklıyorum, Ben olsun neden

İşte

enter image description here

benim kod ve garip hata ayıklama günlüğü, açıklayabilirim yok: (?!) (?!) "ev 1" "ev 2" ve tıklamada 5 oda eklemek oldu Bu değer ben "oda ekle" düğmesini tıklayın

<?php 

namespace Drupal\projet\Form; 
use Drupal\Core\Form\FormBase; 
use Drupal\Core\Form\FormStateInterface; 

class HouseForm extends FormBase { 

    public function getFormId(){ 
    return 'custom_rooms_form'; 
    } 

    function buildForm(array $form, FormStateInterface $form_state) { 



    $house_count = $form_state->get('house_count'); 

    if (is_null($house_count)) { 
     $house_count = 1; 
     $form_state->set('house_count', $house_count); 
    } 

    $form['house'] = array(
     //'#tree' => TRUE, 
     '#prefix' => '<div id="house-replace">', 
     '#suffix' => '</div>' 
    ); 

    for ($house_delta = 0; $house_delta < $house_count; $house_delta++) { 
     if (!isset($form['house'][$house_delta])) { 

     $room_count[$house_delta] = $form_state->get('room_count_'.$house_delta); 

     if (is_null($room_count[$house_delta])) { 
      $room_count[$house_delta] = 1; 
      $form_state->set('room_count_'.$house_delta, $room_count[$house_delta]); 
     } 

     dd($room_count, "room_COUNT"); 

     $form['house'][$house_delta]['room'] = array(
      '#type' => 'fieldset', 
      '#title' => t('house : '.$house_delta), 
      //'#tree' => TRUE, 
      '#prefix' => '<div id="room-replace-'.$house_delta.'">', 
      '#suffix' => '</div>' 
     ); 

     for ($room_delta = 0; $room_delta < $room_count[$house_delta]; $room_delta++) { 
      if (!isset($form['house'][$house_delta]['room'][$room_delta])) { 
      $room = array(
       '#type' => 'textfield' 
      ); 
      $check = array(
       '#type' => 'checkbox' 
      ); 
      $form['house'][$house_delta]['room'][$room_delta] = array(
       '#type' => 'fieldset', 
       '#title' => t('room : '.$house_delta.'.'.$room_delta), 
      ); 
      $form['house'][$house_delta]['room'][$room_delta]['text'] = $room; 
      $form['house'][$house_delta]['room'][$room_delta]['check'] = $check; 
      } 
     } 

     $form['house'][$house_delta]['room']['add'] = array(
      '#type' => 'submit', 
      '#name' => 'add', 
      '#value' => t('Add room'), 
      '#attributes' => array('class' => array('field-add-more-submit'), 'house_delta' => array($house_delta)), 
      '#submit' => array(array(get_class($this), 'room_addMoreSubmit')), 
      '#ajax' => array(
       'callback' => array($this, 'room_addMoreCallback'), 
       'wrapper' => 'room-replace-'.$house_delta, 
       'effect' => 'fade', 
      ), 
     ); 

     } 
    } 

    $form['house']['add'] = array(
     '#type' => 'submit', 
     '#name' => 'add', 
     '#value' => t('Add house'), 
     '#attributes' => array('class' => array('field-add-more-submit')), 
     '#submit' => array(array(get_class($this), 'house_addMoreSubmit')), 
     '#ajax' => array(
      'callback' => array($this, 'house_addMoreCallback'), 
      'wrapper' => 'house-replace', 
      'effect' => 'fade', 
     ), 
    ); 


    $form['submit'] = array(
     '#type' => 'submit', 
     '#value' => t('Create'), 
    ); 

    return $form; 
    } 

    public function room_addMoreSubmit(array $form, FormStateInterface $form_state) { 
    dd($form_state->getTriggeringElement(), "room : getTriggeringElement()"); // below, the log when I add a room to the house '1' (result see above with the last screenshot: "the house 1" became "house 2" and one click add 5 rooms) 
    $house = $form_state->getTriggeringElement()["#array_parents"][1]; 
    $c = $form_state->get('room_count_'.$house) + 1; 
    $form_state->set('room_count_'.$house, $c); 
    $form_state->setRebuild(TRUE); 
    } 

    public function room_addMoreCallback(array $form, FormStateInterface $form_state) { 
    $house = $form_state->getTriggeringElement()["#array_parents"][1]; 
    return $form['house'][$house]['room']; 
    } 

    public function house_addMoreSubmit(array $form, FormStateInterface $form_state) { 
    dd($form_state->getTriggeringElement()["#array_parents"], "house : getTriggeringElement()"); 
    $c = $form_state->get('house_count') + 1; 
    $form_state->set('house_count', $c); 
    $form_state->setRebuild(TRUE); 
    } 

    public function house_addMoreCallback(array $form, FormStateInterface $form_state) { 
    return $form['house']; 
    } 

} 

(room_addMoreSubmit içinde 'dd') log (room_addMoreSubmit geri aramasında getTriggeringElement() ve bu bence sorundur) ev "1":

Evin numarası 1'de "oda ekle" butonuna tıklayın

enter image description here

, eklenti düğmeye dizisi anne iade getTriggeringElement. Gördüğünüz gibi, ebeveyn "2" değil "1" (ev 1) Yani evin 1 oda ekle düğmesine tıkladığımda, bu "2" adı verilir ve ev "1" değil.

Nedenini anlamıyorum ... GetTriggeringElement özelliğini kullanmak iyi bir yol değil mi?

cevap

3

çözüm:

$form['house'][$house_delta]['room']['add'] = array(
      '#type' => 'submit', 
      '#name' => 'add-'.$house_delta, 
      '#value' => t('Add room'), 
      '#attributes' => array('class' => array('field-add-more-submit'), 'house_delta' => array($house_delta)), 
      '#submit' => array(array(get_class($this), 'room_addMoreSubmit')), 
      '#ajax' => array(
       'callback' => array($this, 'room_addMoreCallback'), 
       'wrapper' => 'room-replace-'.$house_delta, 
       'effect' => 'fade', 
      ), 
     ); 

benzersiz ad benim sorunun konuydu. Yani, isim niteliğini değiştirdim.