Bir formda iki gönderme düğmesi


534

Bir formda iki gönderme düğmem var . Hangisinin hit sunucu tarafında olduğunu nasıl belirleyebilirim?


Papağan'ın cevabına kabul edilen cevabı değiştirmeyi düşünün .
Peter Mortensen

2
@PeterMortensen - Ne kabul edilen cevap ne de Parrot'un cevabı bugün en iyisi değil. Özellik kullanarak daha yeni HTML5 çözümü için Leo'nun cevabına bakın formaction. Veya , HTML'nin kullanıcıya nasıl görünebileceğini tarayıcıya gönderilen değerden bağımsız hale getirmek için kiril'in cevabına bakın - uluslararasılaşma sorununu Greg'in veya Parrot'un cevabından daha kolay kodlanabilir bir şekilde çözün.
ToolmakerSteve

Yanıtlar:


447

Her birine bir ad verirseniz, tıklanan ad başka bir giriş olarak gönderilir.

<input type="submit" name="button_1" value="Click me">

101
Ayrıca düğmenin adının doğru ada sahip olduğundan emin olun! Örneğin "düğme-1" işe yaramaz. Birini çok fazla sıkıntıdan kurtarabilir, bu yüzden bunu aklınızda bulundurun.
pdolinaj

22
Normalde, formdaki tüm girdiler formla birlikte gönderilir. Bir düğmenin değeri yalnızca tıklandığında gönderildiği için, bu önceden tanımlanmış adlar için form değerlerinde arama yapmanız gerekir. Farklı değerlerle aynı adın verilmesini içeren diğer yanıtın ( stackoverflow.com/a/21778226/88409 ) daha mantıklı olduğunu düşünüyorum. Sonra sadece bilinen bir form alanı adı altında değeri kapmak. Ayrıca, radyo düğmelerinin nasıl çalıştığı gibi (aynı ad, farklı değerler), belirli bir giriş adı için yalnızca bir değerin (tıklanan) gönderileceğini daha açık hale getirir.
Triynko

6
@ Triynko, Robin Green'in bu cevabın yorumlarında söylediği gibi, bu uluslararasılaşma için daha iyidir. Örneğin, sayfa İspanyolca oluşturulmuşsa, düğmelerin metni muhtemelen farklı olacaktır. Bu nedenle, kodunuzun mantığının o düğmenin metnine bağlı olması bu durumda kırılacaktır. Kullanıcıya gösterilmeyen bir değer olduğundan, adla gitmek daha güvenlidir ve bu nedenle daha çok "özel" değişken olarak ve daha az kullanıcılara mesaj olarak değerlendirilebilir.
sfarbota

@ Sfarbota'nın açıklamasını netleştirmek için: Parrot'un cevabında gösterilen ilk çözüm, kullanıcı tarafından görülebilir değerin test edilmesine bağlı olduğundan sorunludur . Bu şüpheli - kullanıcı tarafından görülebilir bir kelimeyi değiştirirken kırılan kod "kırılgan" olarak kabul edilir. İkinci Parrot'un cevap gösterilen çözüm gayet - bu bir aynıdır. Parrot'un ikinci çözümü de yazılmaya karşılık gelen kodu gösterir, bu yüzden bundan daha yararlı bir cevaptır.
ToolmakerSteve

2
Özellik kullanarak daha yeni HTML5 çözümü için Leo'nun cevabına bakın formaction. Veya , HTML'nin tarayıcıya gönderilen değerden bağımsız olarak nasıl görünür hale getirilebileceğine dair kiril'in cevabına bakın - uluslararasılaştırma sorununu çözün.
ToolmakerSteve

875

Çözüm 1:
Her girişe farklı bir değer verin ve aynı adı koruyun:

<input type="submit" name="action" value="Update" />
<input type="submit" name="action" value="Delete" />

Daha sonra hangisinin tetiklendiğini görmek için kod kontrolünde:

if ($_POST['action'] == 'Update') {
    //action for update here
} else if ($_POST['action'] == 'Delete') {
    //action for delete
} else {
    //invalid action!
}

Buradaki problem, mantığınızı giriş içindeki kullanıcı tarafından görülebilir metne bağlamanızdır.


Çözüm 2:
Her birine benzersiz bir ad verin ve $ _POST girdisinin varlığını kontrol edin:

<input type="submit" name="update_button" value="Update" />
<input type="submit" name="delete_button" value="Delete" />

Ve kodda:

if (isset($_POST['update_button'])) {
    //update action
} else if (isset($_POST['delete_button'])) {
    //delete action
} else {
    //no button pressed
}

37
İ18n amaçları için, seçilen cevabı kullanmak daha iyi olabilir.
Robin Green

11
@LaszloPapp cevabın kendisinin söylediği gibi, yukarıdaki seçilen cevabı kullanırsanız, mantığı etkilemeden formu uluslararası hale getirebilirsiniz (yani farklı dillere veya lehçelere tercüme edebilirsiniz). Bu yanıttaki ilk seçeneği kullanırsanız, mantık, formun gerçekten sunulduğu dile bağlıdır.
Robin Green

1
@RobinGreen: Sanırım çoğu insan ikinci mantığı kullanacak, değil mi?
lpapp

5
i18n = i [nternationalizatio] n, ve 18 ilk ve son arasındaki 18 harfi temsil eder.
Buttle Butkus

18
OP PHP istemedi.
Rudey

110

Daha da iyi bir çözüm, formu göndermek için düğme etiketlerini kullanmaktan oluşur:

<form>
    ...
    <button type="submit" name="action" value="update">Update</button>
    <button type="submit" name="action" value="delete">Delete</button>
</form>

Düğmenin içindeki HTML (örn ..>Update<... Kullanıcı tarafından görülen şeydir; HTML sağlandığı için value, kullanıcı tarafından görülebilir değildir; yalnızca sunucuya gönderilir. Bu şekilde uluslararasılaştırma ve birden çok görüntüleme diliyle ( eski çözüm, düğmenin etiketi de sunucuya gönderilen değerdir).


13
Görünüşe göre tarayıcı davranışı farklıdır; bazıları değer özniteliğini, diğerleri etiketler arasındaki dizeyi gönderir ... Bu yüzden buna dikkat edin.
Jeroen Dierckx

1
Sağlanan snippet'in tamamen desteklendiğini düşünüyorum ( w3schools.com/tags/att_button_type.asp )
kiril

2
@kiril bu linkteki pasaj iki farklı tip kullanır <button>: submitve reset. resetHiçbir şey göndermediğini unutmayın, sadece formu sıfırlar. Böylece Jeroen'in argümanı kalır.
fizruk

7
Tamam, haklısın. Sonra HTML5 W3C Çalışma Taslağını kontrol ettim. Quoting: >> value özelliği, form gönderme amacıyla öğenin değerini verir. Öğenin değeri, varsa öğenin değer özniteliğinin veya aksi takdirde boş dizenin değeridir. >> NOT: Bir düğme (ve değeri) yalnızca form gönderimine başlamak için düğmenin kendisi kullanılmışsa form gönderimine dahil edilir.
Kiril

8
@Jeroen Bull. Hangi tarayıcılar etiketleri etiketler arasında gönderir? Bir giriş veya düğme yalnızca 'değer' niteliğini göndermelidir. Bir düğme, resimler veya diğer HTML etiketleri de dahil olmak üzere etiketleri arasında tam anlamıyla herhangi bir şeye sahip olabilir. Bu, bir giriş öğesi üzerinde bir düğme kullanmanın tüm amacı ve tarayıcının tüm bu içeriği değer olarak atacağını mı önermeye çalışıyorsunuz? Olmaz.
Triynko

93

Buna yeni bir HTML5 yaklaşımı var formaction:

<button type="submit" formaction="/action_one">First action</button>
<button type="submit" formaction="/action_two">Second action</button>

Görünüşe göre bu IE9 ve önceki sürümlerde çalışmıyor, ancak diğer tarayıcılar için iyi olmalısınız (bkz: w3schools.com HTML <düğmesi> formaction Attribute ).

Şahsen ben genellikle Javascript kullanarak formları uzaktan (daha hızlı algılanan geri bildirim için) bu yaklaşımla yedekleme olarak göndermek için kullanıyorum. Bu ikisi arasında, yalnızca kapsamı olmayanlar Javascript devre dışı bırakılmış IE <9'dur.

Tabii ki, hangi düğmeye basıldığına bakılmaksızın temel olarak aynı işlemi sunucu tarafında gerçekleştiriyorsanız uygun olmayabilir, ancak genellikle iki kullanıcı tarafı eylemi varsa, bunlar da iki sunucu tarafı eylemiyle eşleşir.

Düzenleme: Yorumlarda Pascal_dher tarafından belirtildiği gibi, bu özellik <input>etiket üzerinde de mevcuttur .


1
"Giriş" etiketi için de kullanılabilir. W3Schools'da doğrultusunda kapsamınızı: farklı değerler sunabilir düğme etiketi farklı tarayıcılar kullanılırken: w3schools.com/tags/tag_button.asp
Pascal_dher

3
12 yıldır web geliştiriciyim ve bu benim için yeni ve tam da ihtiyacım olan şeydi. Teşekkürler!
KyleFarris

1
Hoşgeldin @KyleFarris! Bunun göreceli olarak son zamanlarda mümkün olduğuna inanıyorum, bu yüzden henüz karşı karşıya kalmadıysanız sürpriz olmaz.
Leo

2
Rails kullanıcılarına not: formunuz kullanılarak oluşturulmuşsa bu özelliği eklemek işe yaramaz form_tag. Çalışmamın tek yolu geçmek form_forve kullanmak f.submit formaction: 'your_path'.
fgblomqvist


27

Bunu test etmek son derece kolaydır

<form action="" method="get">

<input type="submit" name="sb" value="One">
<input type="submit" name="sb" value="Two">
<input type="submit" name="sb" value="Three">

</form>

Bunu bir HTML sayfasına koyun, düğmeleri tıklayın ve URL'ye bakın


5
Burada GET kullanmak biraz kötü bir uygulamadır, mümkünse POST kullanılmalıdır.
Syncrossus

6
@Syncrossus Bu test amaçlıdır.
Etienne Martin

22

formactionHTML özelliğini kullanın (5. satır):

<form action="/action_page.php" method="get">
    First name: <input type="text" name="fname"><br>
    Last name: <input type="text" name="lname"><br>
    <button type="submit">Submit</button><br>
    <button type="submit" formaction="/action_page2.php">Submit to another page</button>
</form>


@ToolmakerSteve - Ancak kullanıcılar oy kullandı . istediğini al!!
user12379095

21
<form>
    <input type="submit" value="Submit to a" formaction="/submit/a">
    <input type="submit" value="submit to b" formaction="/submit/b">    
</form>

HTML5 özelliği. Son web tarayıcılarında mükemmel çalışır, teşekkürler!
Stephane Lallemagne

1
NOT: Bu, Leo'dan önceki yanıtla aynı gibi görünmektedir , ancak inputetiket yerine etiket kullanımını gösterir button.
ToolmakerSteve

11

Birden fazla gönderme düğmesi ile baş etmenin en iyi yolu, sunucu komut dosyasında anahtar durumu kullanmaktır

<form action="demo_form.php" method="get">

Choose your favorite subject:

<button name="subject" type="submit" value="html">HTML</button>
<button name="subject" type="submit" value="css">CSS</button>
<button name="subject" type="submit" value="javascript">Java Script</button>
<button name="subject" type="submit" value="jquery">jQuery</button>

</form>

sunucu kodu / sunucu betiği - formu gönderdiğiniz adres:

demo_form.php

<?php

switch($_REQUEST['subject']) {

    case 'html': //action for html here
                break;

    case 'css': //action for css here
                break;

    case 'javascript': //action for javascript here
                        break;

    case 'jquery': //action for jquery here
                    break;
}

?>

Kaynak: W3Schools.com


Evet, eylem komut dosyaları (sunucu tarafı komut dosyası yazma teknolojisi) hakkında bir fikriniz olmalıdır. Gönderilen verileri işlemek için herhangi bir komut dosyası / dosyayı kullanabilirsiniz, örneğin php, asp, jsp, vb. <form action="demo_form.php" method="get">
Shailesh Sonare

Tamam. ActionScript adında bir dil de olduğu için bu kafa karıştırıcıydı. Bunun yerine "sunucu kodu" veya "sunucu komut dosyası" demelisiniz.
Sivil

Düğmelerle yapabileceğiniz hakkında hiçbir fikrim yoktu
William Isted

10

Belki burada önerilen çözümler 2009 yılında çalıştı, ancak tüm bu yükseltilmiş cevapları test ettim ve kimse herhangi bir tarayıcıda çalışmıyor.

çalışma buldum sadece çözüm şudur: (ama bence kullanmak için biraz çirkin)

<form method="post" name="form">
<input type="submit" value="dosomething" onclick="javascript: form.action='actionurl1';"/>
<input type="submit" value="dosomethingelse" onclick="javascript: form.action='actionurl2';"/>


2
Neden sadece kullanmıyorsunuz formaction="actionurl1"? JavaScript'e ihtiyacınız yok.
rybo111

3
@ rybo111 IE9 tarayıcı (cadı nispeten hala yaygın olarak kullanılmaktadır) desteklemiyorformaction
clueless007

1
@inaliaghle Doğru, kullanıcıların yaklaşık% 1'i - projenin kime yönelik olduğuna bağlıdır. Kullanıcıların yaklaşık% 1'i JavaScript kullanmıyor.
rybo111

1
Gelecekteki okuyucular için: bu cevaptaki gibi javascript kullanmanın yanlış bir yanı yoktur. Bunu bilmek faydalı bir yetenek. OTOH, daha yüksek derecede onaylanmış cevaplar da iyi çalışır - bu cevabın baştaki cümlesini görmezden gelin. Herhangi bir nedenden ötürü bu diğer yanıtları çalıştıramazsanız, tam kodunuzu bir SO sorusu olarak gönderin, ne olduğunu (veya gerçekleşmediğini) açıklayın ve ne yaptığınızı sorun.
ToolmakerSteve

6

Define nameolarak array.

<form action='' method=POST>
    (...) some input fields (...)
    <input type=submit name=submit[save] value=Save>
    <input type=submit name=submit[delete] value=Delete>
</form>

Örnek sunucu kodu (PHP):

if (isset($_POST["submit"])) {
    $sub = $_POST["submit"];

    if (isset($sub["save"])) {
        // save something;
    } elseif (isset($sub["delete"])) {
        // delete something
    }
}

elseifçok önemli, çünkü ikisi de ayrıştırılacak. Zevk almak.


Çok kolay fazla vakalarla fazla düğme ekleyin ve kullanabilir çünkü çoğunlukla - Şimdi bu mükemmel bir öneridir switchbiri bir düğme eklendi ve unuttuğu takdirde eklemek için varsayılan bir eylem ile switch(ve / veya Yanlış yazılmış bir şey vs.)
Gwyneth Llewelyn

Ayrıca, @Pato muhtemelen daha deyimsel olan benzer bir cevap ekledi , ancak sizinki iyi çalışıyor!
Gwyneth Llewelyn

1
@GwynethLlewelyn Diğer cevabı geri görmedim veya kendi cevabımı yazdığımda fark etmedim. Aslında aynı, ama bu çoğu insanın bu mantığı nasıl tercih ettiğini vurguluyor. Fark sadece anlamsal nedenlerle isimlerle, çaylaklar için iyi bir anlayışla veya onunla başlamaktan hoşlananlarla ilgilidir.
Thielicious

5

Hangi sunucu tarafı komut dosyası yöntemini kullandığınızı belirtmediğiniz için, CherryPy kullanarak Python için çalışan bir örnek vereceğim (diğer bağlamlar için de yararlı olabilir):

<button type="submit" name="register">Create a new account</button>
<button type="submit" name="login">Log into your account</button>

Hangi düğmeye basıldığını belirlemek için değeri kullanmak yerine adı kullanabilirsiniz ( <button>etiket yerine <input>). Bu şekilde, düğmeleriniz aynı metne sahipse sorun yaratmaz. Düğmeler de dahil olmak üzere tüm form öğelerinin adları URL'nin bir parçası olarak gönderilir. CherryPy'de, bunların her biri sunucu tarafı kodunu yapan bir yöntem için bir argümandır. Bu nedenle, yönteminizin **kwargsparametre listesi varsa (her form öğesinin her bir adını sıkıcı bir şekilde yazmak yerine), hangi düğmeye basıldığını kontrol edebilirsiniz:

if "register" in kwargs:
    pass #Do the register code
elif "login" in kwargs:
    pass #Do the login code

3
<form method="post">
<input type="hidden" name="id" value="'.$id.'" readonly="readonly"/>'; //any value to post PHP
<input type='submit' name='update' value='update' formAction='updateCars.php'/>
<input type='submit' name='delete' value='delete' formAction='sqlDelete.php'/>
</form>

2

Sanırım GET dizinizdeki adı / değeri okuyabilmelisiniz. Tıklanmayan düğmenin bu listede görünmeyeceğini düşünüyorum.


Muhtemelen POST dizisini kastediyorsunuz.
ypnos

3
Formun yöntemi "POST" ise GET dizisinde görünmez. Çoğu form POST yoluyla gönderilir.
Papağanlar

2
Ya teknik olarak doğru ve yine de yanlış. Method = "GET" ile bir form gönderebilirsiniz, ancak dikkat çekicidir.
Kertenkele Bill

4
Uygun olmayan şekilde kullanıldığında sadece "dikkat çekicidir": w3.org/2001/tag/doc/whenToUseGet.html .
mercator

2
Evet, GET'i önermeye çalışmıyordum, sadece bir şeyleri genelleştirmeye çalışıyordum.
John Bubriski

1

Bu şekilde de yapabilirsiniz (N girişiniz varsa çok uygun olduğunu düşünüyorum).

<input type="submit" name="row[456]" value="something">
<input type="submit" name="row[123]" value="something">
<input type="submit" name="row[789]" value="something">

Yaygın bir kullanım durumu, her düğme için bir veritabanından farklı kimlikler kullanmaktır, böylece daha sonra sunucuda hangi satırın tıklandığını öğrenebilirsiniz.

Sunucu tarafında (bu örnekte PHP) kimliği almak için dizi olarak "satır" okuyabilirsiniz. $_POST['row']şeklinde yalnızca bir öğe içeren bir dizi olacaktır [ id => value ](örneğin:[ '123' => 'something' ] .

Dolayısıyla, tıklanan kimliği almak için şunları yaparsınız:

$index = key($_POST['row']);

http://php.net/manual/en/function.key.php


Bu, @Thielicious tarafından gönderilen cevaba benzer , ancak sizinki muhtemelen daha deyimseldir. Şahsen ben okunabilirlik (her düğmenin ne yapması gerektiğini hatırlamak daha kolay), ama YMMV için indeks için alfasayısal etiketleri kullanmayı tercih ediyorum (sayılar aksine). Ancak $_POST['row']çağrışımsal bir dizi olmaktan faydalanmak akıllıdır!
Gwyneth Llewelyn

1
Statik düğmelerle uğraşıyorsanız, adlandırılmış anahtarlar kullanmanız gerektiğini kabul ediyorum. Ancak bazı durumlarda yapamazsınız. Bazen bu girdileri dinamik olarak üretirsiniz. Bunun en yaygın durumu, her biri bir kimlikle tanımlanan satırların bir listesi olacaktır. Sanırım cevabı yazarken bu davayı düşünüyordum (4 yıl önce!). Düzenledim, bu yüzden sayının bir dizin değil, bir kimlik olduğu daha açık.
Pato

Aferin! Evet, katılıyorum, şimdi daha açık; Hala cevabınızın @Thielicious tarafından verilen yanıttan daha iyi olduğuna inanıyorum (ve özellikle de çok sayıda düğme varsa, muhtemelen biraz daha verimli).
Gwyneth Llewelyn

1

Bir form örneğinde birden çok gönderme düğmesi için formaction

 <input type="submit" name="" class="btn action_bg btn-sm loadGif" value="Add Address" title="" formaction="/addAddress"> 
 <input type="submit" name="" class="btn action_bg btn-sm loadGif" value="update Address" title="" formaction="/updateAddress"> 

0

Basit farklı gönderme düğmeleri form eylemini değiştirebilirsiniz tıklatın.

Bunu belgede deneyin. Hazır

$(".acceptOffer").click(function () {
       $("form").attr("action", "/Managers/SubdomainTransactions");
});

$(".declineOffer").click(function () {
       $("form").attr("action", "/Sales/SubdomainTransactions");
});

0

Ayrıca, bir href niteliği kullanabilir ve her düğme için eklenen değerle bir get gönderebilirsiniz. Ama o zaman form gerekli olmayacaktı

href="/SubmitForm?action=delete"
href="/SubmitForm?action=save"

Bu, POSTrota altındaki kontrolörler için işe yaramaz .
Xavi Montero

dolayısıyla, "bir gönder"
Jonathan Laliberte

3
Katıldığım için üzgünüm, ama GETher zaman uygun değil. "Modelinizin durumunu değiştirirseniz" asla a kullanmamalısınız GET, çünkü tarayıcıyı yenilemek aynı isteği iki kez şeffaf bir şekilde göndermede yol açabilir. Kullan GETsadece "görünümü" şeyler ve POSTdurum değişiklikleri (ekleme, kaldırma, düzenleme, vs.) istekleri göndermek için. daha sonra POSTdenetleyici eyleminizde durumu (veritabanı, sesion ...) değiştirin ve ardından GETyeni değiştirilmiş durum olan bir yönlendirme yanıtı verin . Yapma GETmodel devlet değişiklik için çok kirli ve iyi bir kodlayıcı yüzden kaçınmalıdır. Bunu söylediğim için üzgünüm. Kod kurallarını temizleyin.
Xavi Montero

Doğru. Ancak kirli oynamak bazen temiz olabilir. Tam olarak ne yaptığınıza bağlıdır. Şahsen bir get üzerinde silme ve düzenleme istekleri harita olmaz, ancak çalışmasını sağlamak için yollar vardır .. zaten silinmiş olup olmadığını kontrol, veya kullanıcının bunu yapmak için izin olup olmadığını kontrol gibi ...
Jonathan Laliberte

-1

Düğmeleri şu şekilde sunabilirsiniz:

<input type="submit" name="typeBtn" value="BUY">
<input type="submit" name="typeBtn" value="SELL">

Ve sonra kodda değeri kullanarak değeri alabilirsiniz:

if request.method == 'POST':
    #valUnits = request.POST.get('unitsInput','')
    #valPrice = request.POST.get('priceInput','')
    valType = request.POST.get('typeBtn','')

(valUnits ve valPrice, gösterim amacıyla bıraktığım formdan çıkardığım diğer bazı değerlerdir)


-1

Hangi sunucu tarafı komut dosyası yazma yöntemini kullandığınızı belirtmediğiniz için size PHP için çalışan bir örnek vereceğim

<?php
   if(isset($_POST["loginForm"]))
   {
    print_r ($_POST); // FOR Showing POST DATA
   }
   elseif(isset($_POST["registrationForm"]))
   {
    print_r ($_POST);
   }
   elseif(isset($_POST["saveForm"]))
   {
    print_r ($_POST);
   }
   else{

   }
?>
<html>
<head>
</head>
<body>
  
  <fieldset>
    <legend>FORM-1 with 2 buttons</legend>
      <form method="post" >
      <input type="text" name="loginname" value ="ABC" >

     <!--Always use type="password" for password --> 
     <input type="text" name="loginpassword" value ="abc123" >
     
     <input type="submit" name="loginForm" value="Login"><!--SUBMIT Button 1 -->
     <input type="submit" name="saveForm" value="Save">  <!--SUBMIT Button 2 -->
   </form>
  </fieldset>



  <fieldset>
    <legend>FORM-2 with 1 button</legend>
     <form method="post" >
      <input type="text" name="registrationname" value ="XYZ" >
      
     <!--Always use type="password" for password -->
     <input type="text" name="registrationpassword" value ="xyz123" >
     
     <input type="submit" name="registrationForm" value="Register"> <!--SUBMIT Button 3 -->
   </form>
  </fieldset>
  

</body>
</html>

Formlar

Login -> loginForm'a tıkladığınızda

Kaydet -> saveForm'u tıkladığınızda

Kayıt Ol -> registerForm'u tıkladığınızda

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.