Điểm:0

Tôi có thể thêm các phần tử vào tiện ích trường bằng AJAX không?

lá cờ lb

Tôi muốn thêm các trường tùy thuộc vào tùy chọn đầu tiên được chọn. Tôi cũng đã tạo một biểu mẫu có hành vi tương tự nhưng đó không phải là tiện ích trường.

Tôi đã sử dụng mô-đun này làm ví dụ để tạo biểu mẫu

Tôi không chắc liệu cách tôi triển khai hành vi AJAX này có khác trong một tiện ích hay không.

Hành vi của biểu mẫu này có thể được triển khai trong tiện ích trường không? Tôi đang cố gắng tìm kiếm các ví dụ về các tiện ích trường cụ thể triển khai điều này nhưng tôi vẫn chưa tìm thấy bất kỳ thứ gì có thể trợ giúp `

 hàm công khai formElement(FieldItemListInterface $items, $delta, mảng $element, mảng &$form, FormStateInterface $form_state) {
    $value = isset($items[$delta]->value) ? $items[$delta]->value : '';
    phần tử $ = [];

    // Tập hợp số lượng tên trong mẫu đã có.
    $num_names = $form_state->get('num_names');
    // Chúng ta phải đảm bảo rằng có ít nhất một trường tên.
    nếu ($num_names === NULL) {
        $tên_trường = $form_state->set('num_names', 1);
        $num_names = 1;
    } 

    $element['breakpoints'] = [
      '#type' => 'chọn',
      '#title' => $this->t('Nhóm điểm ngắt'),
      '#options' => $this->getBreakpointsGroups(),
      '#default_value' => $value,
      '#empty_option' => $this->t('-Chọn nhóm điểm dừng-'),
    ];   



    $element['images_fieldset'] = [
        '#type' => 'bộ trường',
        '#title' => $this->t('Tải hình ảnh cho từng điểm dừng'),
        '#prefix' => '<div id="breakpoint-wrapper">',
        '#suffix' => '</div>',
    ];

    for ($i = 0; $i < $num_names; $i++) {
        $element['images_fieldset']['image'][$i] = [
            '#type' => 'hình ảnh',
            '#title' => $this->t('Hình ảnh'),
            '#name' => "Tên"
        ];
    }

    $element['images_fieldset']['submit'] = [
        '#type' => 'gửi',
        '#title' => 'Gửi',
        '#submit' => ['::submitForm'],
        '#value' => $this->t("gửi"),
        '#ajax' => [
            'gọi lại' => '::loadImageFields',
            'trình bao bọc' => 'trình bao bọc điểm dừng',
        ],
    ];


    trả về ['giá trị' => $element];
}

/**
 * Trả về danh sách các điểm dừng.
 *
 * @return mảng
 * Một mảng kết hợp các điểm dừng, phù hợp để sử dụng làm biểu mẫu
 *   tùy chọn.
 */
chức năng được bảo vệ getBreakpointsGroups() {
    $breakpoints = \Drupal::service('breakpoint.manager')->getGroups();
    $breakpoint_names = array_keys($breakpoints);
    $breakpoint_group = mảng();
    foreach ($breakpoint_names là $name) {
        $breakpoint_group += [$name => $name];
    }
    trả về $breakpoint_group;
}

hàm được bảo vệ submitForm($form, &$form_state) {
    $state = $form_state->getTriggeringElement();
    $breakpoint= $state['#value'];
    $mảng = mảng();

    $breakpoint = \Drupal::service('breakpoint.manager')->getBreakpointsByGroup($breakpoint);
    $breakpoints_name = array_keys($breakpoint);

    foreach ($breakpoints_name as $breakpoint_definition) {
        $mediaQuery = $breakpoint[$breakpoint_definition]->getMediaQuery();
        array_push($array,$mediaQuery);
    }      

    $name_field = $form_state->get('num_names');
    $form_state->set('num_names',count($array));

    $form_state->setRebuild();

}

hàm công khai loadImageFields(mảng $form, FormStateInterface $form_state) {
    trả về $form['images_fieldset'];
 }

}

Alfred Armstrong avatar
lá cờ cn
Tôi không chắc nếu không kiểm tra nhưng tôi tự hỏi liệu cách bạn đang tạo phần tử bao bọc với ID của nó có đúng không.Hầu hết các ví dụ hoạt động mà tôi có thể tìm thấy đều sử dụng '#prefix' và '#suffix' để thêm div trình bao bọc.
Burly Uranus avatar
lá cờ lb
@AlfredArmstrong Tôi đã chỉnh sửa mã để đặt những gì tôi nhận được cho đến nay! Tiện ích thực hiện những gì nó cần làm (tạo trường) nhưng các giá trị không được lưu!
Alfred Armstrong avatar
lá cờ cn
Tôi không thể thấy bất kỳ điều gì trong mã phần tử của bạn nhận giá trị hiện tại và thiết lập biểu mẫu tương ứng. (Thông thường, bạn cần $items[$delta]->value). Bạn sẽ muốn biểu mẫu khớp với nó sẽ như thế nào nếu ai đó đã chọn giá trị đó và nó đã được cập nhật bởi ajax. Đối với giá trị được lưu trữ, theo mặc định, giá trị đó phải ở dưới $element['value'], vì vậy, bạn có thể muốn thay đổi khóa mục trường của mình thành $element['value']['breakpoints'], v.v.
Burly Uranus avatar
lá cờ lb
Cảm ơn. Giá trị đã chọn của danh sách thả xuống được lưu nhưng tôi vẫn không biết cách thêm các trường tùy thuộc vào danh sách thả xuống. Tôi đã chỉnh sửa các thay đổi của mình nếu bạn tình cờ biết cách thực hiện. Không thể thêm các trường qua AJAX nhưng tôi không biết cách thêm chúng theo cách khác. Tôi đã thử thêm chúng vào bên trong hàm formElement nhưng nó không hoạt động giống như một biểu mẫu drupal thông thường.
Alfred Armstrong avatar
lá cờ cn
Bạn nên kiểm tra giá trị được truyền vào khi xây dựng phần tử biểu mẫu và tạo các trường biểu mẫu tương ứng dựa trên giá trị.
Burly Uranus avatar
lá cờ lb
Cảm ơn, tôi đã tìm ra nó rồi. Tôi sẽ đăng giải pháp sau.
Điểm:0
lá cờ kz

Vấn đề là, bạn không thể sửa đổi cấu trúc biểu mẫu bên trong của Drupal trong lệnh gọi lại Ajax. Vì vậy, bạn sẽ cần một trình xử lý gửi, cho trường hoặc cho tiện ích hoàn chỉnh, thực hiện sửa đổi biểu mẫu ở đó và thêm $form_state->setRebuild().

Các cuộc gọi lại Ajax về cơ bản sửa đổi HTML trong trình duyệt, đó là tất cả những gì chúng làm. Chúng được gọi sau khi quá trình xác thực và gửi đã chạy.

Burly Uranus avatar
lá cờ lb
Cảm ơn câu trả lời của bạn! Một trình xử lý? Tôi sẽ cố gắng làm điều đó. Nếu bạn có thể chỉ cho tôi nơi để tìm kiếm nó, tôi sẽ rất biết ơn, nhưng dù sao thì tôi cũng sẽ tìm kiếm nó.
Burly Uranus avatar
lá cờ lb
Nếu bạn có thời gian, bạn có thể kiểm tra các thay đổi của tôi. Dù sao cũng cảm ơn.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.