/ / पोस्टेड सीजीआई सामग्री से परम टाइप प्राप्त करना (या मूल्यों पर चेकबॉक्स के साथ काम करना) - एचटीएमएल, पर्ल, चेकबॉक्स, सीटीआई

पोस्ट सीजीआई सामग्री से परम प्रकार प्राप्त करना (या मूल्यों पर चेकबॉक्स के साथ काम करना) - एचटीएमएल, पर्ल, चेकबॉक्स, सीटीआई

मेरे HTML में एक चेकबॉक्स है जो इस तरह दिखता है:

<input type="hidden" name="<TMPL_VAR NAME=SHORT>" value="<TMPL_VAR NAME=ELSE>">
<input type="checkbox" name="<TMPL_VAR NAME=SHORT>" id="checkbox-2" value="<TMPL_VAR NAME=FLAG>" class="checkbox mid-margin-left">
<label for="checkbox-2" class="label"><TMPL_VAR NAME="NAME"></label>

मूल रूप से, जो मैं यहां पूरा करने की कोशिश कर रहा हूं वह हैएक मान भेजा जा सकता है अगर चेकबॉक्स चेक किया गया है, और दूसरा भेजा जा सकता है अगर चेकबॉक्स चेक नहीं किया गया है (मूल रूप से डिफ़ॉल्ट मान)। अब, यह गतिशील है, इसलिए मैं कहने के लिए CGI में वास्तव में कुछ करने में असमर्थ हूं, "अगर इसे परिभाषित किया गया है, तो इसका मतलब यह है, और यदि यह नहीं है तो इसका मतलब कुछ और है।"

वैसे भी, जब मैं बॉक्स को अनियंत्रित छोड़ देता हूं, तो मुझे मिल जाता हैछिपे हुए इनपुट से मूल्य। हालाँकि, जब मैं इसकी जाँच करता हूँ तो मुझे दोनों मान मिलते हैं। अब, मैं कह सकता हूं, "यदि इसका एक से अधिक मूल्य है, तो उपयोग करने का मूल्य दूसरा है।" लेकिन, क्या होगा यदि मुझे कई मानों को स्वीकार करने वाली चुनिंदा सूची का मूल्य मिल रहा है? उस स्थिति में मैं यह कहना नहीं चाहता कि दूसरा मान लें, क्योंकि भेजे गए सभी मान मान्य हैं।

इसलिए, जो मैं कहने की कोशिश कर रहा हूं वह यह है: "अगर यह एक चेकबॉक्स है, और एक से अधिक मूल्य है, तो दूसरा मूल्य है; अन्यथा, पहले ले लो।"

इसे कैसे करना है इस पर कोई आइडिया?शायद मैं यह सही नहीं कर रहा हूँ? इसे पूरा करने के बेहतर तरीके पर कोई सुझाव? मैं एक बूलियन (हाँ / नहीं) के लिए एक रेडियो बटन का उपयोग नहीं करना चाहता, लेकिन अगर वह एकमात्र तरीका है, तो ऐसा ही हो।

उत्तर:

जवाब के लिए 2 № 1

यदि आप जेएस नहीं चाहते हैं, तो मैं आपको अपना फॉर्म बदलने का सुझाव दूंगा ताकि नाम के उपसर्ग के साथ हर क्षेत्र के लिए एक वैकल्पिक मूल्य हो:

<form id="myform" method="post" action="/echo/json/">
<input type="hidden" name= "alternate-foo" value="foo not selected" />
<input type="hidden" name="alternate-bar" value="first bar" />
<p>Foo <input type="checkbox" name="foo" id="foo" value="foo selected" /></p>
<p>
<select name="bar" id="bar" multiple>
<option value="first bar">bar 1</option>
<option value="second bar">bar 2</option>
<option value="third bar">bar 3</option>
</select>
</p>
<p><input type="submit" name="submit" value="submit" /></p>
</form>

आपके पर्ल कोड में, आप कुछ ऐसा कर सकते हैं:

use strict;
use warnings;
use CGI;

my $q = CGI->new;

$q->param( "foo", $q->param("alternate-foo") ) unless $q->param("foo");
$q->param( "bar", $q->param("alternate-bar") ) unless $q->param("bar");

या, अधिक गतिशील होने के लिए:

use 5.014;
foreach my $alt ( grep { /^alternate-/ } $q->param ) {
my $name = $alt =~ s/^alternate-//r;
$q->param( $name, $q->param( $alt )) unless $q->param($name);
}

जवाब के लिए 2 № 2

मैं इसे सुविधा के लिए जावास्क्रिप्ट और jQuery के साथ करूँगा। केवल नकारात्मक पक्ष यह है कि यह काम नहीं करेगा यदि आपके ग्राहकों ने जेएस को अक्षम कर दिया है।

आपका रूप बहुत अधिक समान रह सकता है। मैंने एक साधारण उदाहरण दिया। सुनिश्चित करें कि हर चीज पर आईडी हैं।

<form id="myform" method="post" action="/echo/json/">
<input type="hidden" id="hidden-foo" value="foo not selected" />
<p>Foo <input type="checkbox" name="foo" id="foo" value="foo selected" /></p>
<p>
<select name="bar" id="bar" multiple>
<option value="first bar">bar 1</option>
<option value="second bar">bar 2</option>
<option value="third bar">bar 3</option>
</select>
</p>
<p><input type="submit" name="submit" value="submit" /></p>
</form>

अब यहाँ जेएस कोड है, जिसे फॉर्म के नीचे या जेएस के लिए एक इवेंट हैंडलर के अंदर रखा जाना चाहिए load घटना:

$(document).ready(function() {
$("#myform").submit(function(){
// if checkbox is not checked, change value and check so it"s transmitted
if (! $("#foo").is(":checked")) {
$("#foo").val($("#hidden-foo").val()).prop("checked", true);
}

// take first option if no option is selected
if( $("#bar option:selected").length == 0 ) {
$("#bar option:first").attr("selected","selected");
}
})
});

यह बहुत सीधा-आगे है:

  • यदि चेकबॉक्स को टिक नहीं किया जाता है, तो यह छिपे हुए फ़ील्ड में से एक के मूल्य को बदल देगा और इसे टिक कर देगा।
  • यदि कोई विकल्प नहीं चुना गया है, तो यह पहले वाले का चयन करेगा

यहाँ एक है jsFiddle प्रदर्शित करने के लिए। आउटपुट देखने के लिए आपको अपना फायरबग कंसोल खोलना चाहिए।

इसे अब कुछ डायनेमिक में बदलना काफी आसान होना चाहिए जो कि आपके टेम्पलेट इंजन के बिना सभी फॉर्म फील्ड को हैंडल कर सकता है जिसमें जेएस कोड शामिल नहीं है।