formun tamamını mı yoksa yalnızca bir kısmını mı yeniden oluşturduğunuzu bilin ve formu , tetikleyici öğenin #ajax tanımında kullanacağınız "sarmalayıcı" olarak ID özniteliğine sahip div öğesine uygun şekilde sarın . Bunun için #prefix ve #suffix niteliklerini kullanın ( ). Ayrıca, formunuzun bu durumda ( ) önekini ve son ekini OLMAMASI için özel bir şablonunuz varsa, aksi takdirde iki kez oluşturulacağını unutmayın - şablonunuz ve ayrıca form tema sarıcısı tarafından. Form şablonu gerçek form html öğesini içerdiğinden #theme_wrappers öğesini boş diziye ayarlayarak bunu önleyemezsiniz.$form['#prefix'] = '<div id="myform-ajax-wrapper">'; $form['#suffix'] = '</div>';
{{ form|without('#prefix', '#suffix') }}
ajax gönderme işleyicinizde, sardığınız ve yeniden oluşturmak istediğiniz formun tamamını veya bir kısmını iade edin ( return $form
veya return $form['myelement']
). Ek olarak sadece form yapısını döndürmek yerine ajax komutlarını kullanabilirsiniz, ancak bu daha gelişmiş şeylerdir.
siz formu gönderene kadar her değeri form durumunun deposunda saklayın. Bunu gönderme işleyicisinde ( $form_state->set('somevalue', $form_state->getValue('somevalue'))
) yapın ve $form_state->setRebuild()
son form gönderimini yapmıyorsanız daima arayın . Özel gönderme işleyicilerine sahip olmayı tercih ediyorum, ancak birincil gönderme işleyicisinde daha fazla mantığa sahip olmak da tamamen tamam.
her zaman #name
gönderimi yapan düğmede niteliği kullanın ve yalnızca tek bir form gönderme işleyicisi varsa formu $for_state->getTriggeringElement()['#name']
hangi öğenin gönderdiğini algılamak için kullanın .
#ajax tanımında 'trigger_as' kullanıyorsanız, formu örneğin select öğesiyle göndermek istemeniz durumunda, her zaman düğmedeki gibi #ajax tanımını kullanın. Benim tecrübelerime göre bu gerekli - belgelerde belirtilmese de.
kullanmak #limit_validation_errors
bazen çok zor olabilir ve formun neden çalışmadığını anlamak biraz zaman alabilir, bu yüzden dikkatli bir şekilde kullanın (bu, yalnızca gerçekte oluşturduğunuz elemanlarda form hatalarını izole etmek için iyidir, böylece kodunuz formun diğer bölümlerini etkilemez).
formu göndermek için her zaman düğmeleri kullanın ve tetikleyici öğe olarak seçmek gibi süslü bir şey istiyorsanız, #ajax yapılandırmasının 'trigger_as' seçeneğini kullanın ve iyi bir kullanıcı arayüzü için 'js-hide' sınıfıyla gerçek düğmeyi gizleyin.
form tanımında, varsa, form durumunun deposundan varsayılan değerleri alın veya yoksa depolama alanına atayın. Aksi takdirde form düzgün çalışmaz.
$ this komutunu veya dışarıdan erişiminiz olmayan başka bir şeyi kullanmayın, aksi takdirde ajax'ı bozar. her zaman statik ajax işleyicileri kullanın.
nihayet formu gönderirken, ajax için özel bir form gönderme işleyicisine sahip olmanıza bağlı olarak, formun yeniden oluşturulmasını arayarak devre dışı bırakın $form_state->setRebuild(FALSE)
.
ajax gönderme öğesinde ( $element['#ajax']['callback'] = '::ajaxFormRebuild';
ve $element['#submit'] = [['::ajaxFormSubmitHandler'];
) :: steno çağrılarını kullanabilirsiniz .
ajax geri çağrısı tamamen yeniden oluşturulmuş formu veya ajax komutlarını döndürmektir. Asla değiştirilmiş formu döndürmeyin (yani, bu geri çağrıdaki form dizisini değiştirmeyin).