2010-11-18 22 views
5

मैं एक मौजूदा वेबसाइट पर काम करने की कोशिश कर रहा हूं और मुझे एक बग मिला है, लेकिन मुझे यकीन नहीं है कि यह एक बग क्यों है या इसके आसपास कैसे काम करना है।एचटीएमएल चेकबॉक्स तत्व केवल तभी सबमिट किए जाते हैं जब वे चेक किए जाते हैं?

वेबसाइट मूल रूप से कुछ वाणिज्यिक गुणों को सूचीबद्ध करती है जो एक शहर में पट्टे पर हैं। एक वर्ग है जो डेटाबेस से लिस्टिंग पकड़ लेता है और प्रत्येक से एक ऑब्जेक्ट बनाता है। प्रत्येक ऑब्जेक्ट में छवियों की एक सरणी होती है जो उस संपत्ति से जुड़े होते हैं।

जब उपयोगकर्ता एक सूची संपादित करता है, तो उन्हें एक संपादन पृष्ठ मिलता है जिसमें छवियों की एक सूची होती है, और उनके आगे "हटाएं" चेकबॉक्स होता है। चेकबॉक्स में सभी का एक ही नाम होता है, ताकि जब वे सर्वर पर वापस सबमिट किए जाएंगे, तो ऐप को हटाए जाने वाले चित्रों की एक सरणी मिल जाएगी।

क्या होने वाला है, यह है कि ऐप में इस मान को ऑन/ऑफ मान (जहां = हटाएं) है, और सरणी में प्रत्येक मान की अनुक्रमणिका लिस्टिंग ऑब्जेक्ट में किसी छवि के सूचकांक से मेल खाती है - जब मानों में से एक "चालू" होता है, तो उस "ऑन" मान से संबंधित छवियों सरणी में फ़ाइल नाम फ़ाइल सिस्टम से हटा दिया जाता है, और वह छवि डेटाबेस से हटा दी जाती है।

हालांकि, जब फॉर्म सबमिट किया जाता है, तो ऐप केवल चेक किए गए चेकबॉक्स की 0-अनुक्रमित सरणी प्राप्त करता है। तो अगर मैं हटाने के लिए तीन मनमाना छवियों निर्धारित करते हैं, अनुप्रयोग

 
Array { 
    [0] => "on", 
    [1] => "on", 
    [2] => "on" 
} 

यह मिलेगा स्पष्ट रूप से काम नहीं करता है, सूची में पहले 3 छवियों परवाह किए बिना, जिनमें से चेक बॉक्स सेट कर रहे हैं हटा दिया जाएगा।

मैं इसे कैसे ठीक कर सकता हूं? मैं प्रत्येक चेकबॉक्स नामकरण से बचना चाहता हूं (delete_1, delete_2, delete_3, आदि) क्योंकि सिस्टम पहले से ही उसी नाम वाले सभी चेकबॉक्स के साथ काम करने के लिए बनाया गया है। क्या कोई तरीका है कि मैं सभी चेकबॉक्स को "चालू" या "ऑफ" के साथ सबमिट करने के लिए मजबूर कर सकता हूं?

उत्तर

5

नहीं, आप अनियंत्रित चेक बॉक्स के लिए मजबूर नहीं कर सकते हैं प्रस्तुत किया जाना है, लेकिन आप कर सकते हैं उन्हें नाम बदलने के बिना कौन से चेक किए जाते हैं यह निर्धारित करने के लिए उन्हें अद्वितीय मूल्य (सभी के लिए "चालू" के बजाय) दें।

+0

बहुत बढ़िया देगा, आपको नहीं पता था कि आप कर सकते हैं उस। बहुत बहुत धन्यवाद (अनुमति मिलने पर स्वीकार करेगा) –

+0

ओएमजी, यह एक भयानक समाधान है और निश्चित रूप से इस सवाल का जवाब नहीं है। – zerkms

+2

@ स्टेव मैं उन सभी को अलग-अलग नाम देने से बचना चाहता था, क्योंकि उन्हें बैकएंड के व्यवहार को बदलना होगा। मुझे एहसास नहीं हुआ कि आप "चालू" या "ऑफ" के अलावा किसी अन्य मूल्य को सबमिट कर सकते हैं - इसके लिए न्यूनतम परिवर्तन –

6

मजबूर करने के लिए कोई तरीका नहीं है, लेकिन आप केवल एक ही नाम के साथ चेकबॉक्स से पहले एक छिपे हुए सही जोड़ सकते हैं और जरूरत मूल्य:

<input type="hidden" name="delete[42]" value="off" /> 
<input type="checkbox" name="delete[42]" value="on" /> 
+2

क्षमा करें, मैं अलग-अलग होने से बचने की कोशिश कर रहा था प्रत्येक चेकबॉक्स के लिए एमएस। वर्तमान में वे सभी को सिर्फ 'हटाएं' नाम दिया गया है और ऐप उन्हें एक सरणी के रूप में प्राप्त करता है। मुझे नहीं लगता कि यह तकनीक उनके साथ काम करेगी, सभी का नाम –

+0

@ करसन मायर्स: जैसा कि मैंने कहा था कि आप ** उसी नाम ** को चेकबॉक्स में दे सकते हैं। यह स्पष्ट नहीं है कि आपके पास क्या नाम हैं <इनपुट प्रकार = "छुपा" नाम = "हटाएं [1]" मूल्य = "बंद" /> '। क्या यह बेहतर है? – zerkms

+0

@ करसन मायर्स: "मुझे नहीं लगता कि यह तकनीक काम करेगी" --- आप कोशिश क्यों नहीं करते? ;-) – zerkms

1

यदि आप वास्तव में ऑन और ऑफ पर एक सरणी वापस करना चाहते हैं, तो आपको सबमिट किए गए फॉर्म में एक फ़ंक्शन संलग्न करना होगा जो दिए गए नाम के साथ सभी चेक बॉक्स को स्कैन करेगा, और उनके मान सरणी में रखेगा ।

jQuery में यह कुछ ऐसा दिखाई देगा ...

$('#yourForm').submit(function(){ 
    var array = new Array(); 
    $('input[name="nameOfCheckboxes"]').each(function(index){ 
     array[index] = $(this).value(); 
    } 
    var r = $.param(array); 
    $('#someHiddenFieldInForm').value(r); 
} 

(कोड अपरीक्षित है, निश्चित रूप से)

+2

+1, लेकिन जावास्क्रिप्ट इस समस्या के लिए ओवरकिल लगता है –

+0

जावास्क्रिप्ट, वास्तव में? – Stephen

+0

क्या शिकायत करने के लिए आपके पास वास्तव में कुछ भी बेहतर नहीं है? कार्सन ने समाधान के लिए कहा जिसे मौजूदा "कार्यक्षमता" को बदलने की आवश्यकता नहीं थी। उनका सवाल इस बात पर स्पष्ट नहीं था कि वह कितना बदलना चाहता था, और जावास्क्रिप्ट का उपयोग करने के लिए मौजूदा कोड में कोई बदलाव नहीं था। – Jeremy

1

आप निम्न jQuery जोड़कर इस का समाधान कर सकता:

$(function() { 
    $("#myform").submit(function(){ 
    $("input[name='delete']:not(:checked)").attr("checked","checked").val("off"); 
    }); 
}); 

myform आपके फॉर्म की आईडी और delete चेकबॉक्स का नाम होने के नाते।

+1

मैंने संक्षेप में जावास्क्रिप्ट का उपयोग करने पर विचार किया, लेकिन यह स्थिति में अधिक से अधिक लग रहा था। इस प्रश्न के स्वीकृत उत्तर में 'foreach ($ लिस्टिंग [' delete '] को $ index => $ state के रूप में बदलना शामिल है) 'to foreach ($ index [' delete '] $ अनुक्रमणिका के रूप में)', जो मुझे लगता है आदर्श है मेरे लिए समाधान वैध समाधान के लिए +1 हालांकि –

+0

गर्ट, जैसे आपकी तुलना में बेहतर है। +1 – Jeremy

+1

जावास्क्रिप्ट एक हैक समाधान है। – Stephen

1

फ्रेड नर्क का समाधान अच्छा है और मैंने इसे ऊपर उठाया। निजी तौर पर जब मेरे पास यह स्थिति होती है, तो मैंने हमेशा फ़ील्ड को अलग-अलग नाम दिए हैं। मैं एक सामान्य उपसर्ग का उपयोग करता हूं, उसके बाद अंडरस्कोर होता है, इसलिए इसे पहचानना आसान होता है, और फिर कुछ प्रकार की आईडी। मैं अक्सर फ़ील्ड का एक सेट उसी पैटर्न के साथ बनाउंगा, जैसे "name_1", "राशि_1", "foobar_1", "name_2", "राशि_2" इत्यादि।खेतों के माध्यम से लूप करना काफी आसान है और इन नामों को अलग करें। (जावा में, सिर्फ indexOf ('_')।)

0

इस समस्या के आसपास दूसरी तरफ HTML फॉर्म की अजीबता को स्वीकार करना और इसे स्थानीय चर के साथ पकड़ना है जो घोषणा के दौरान ternary operators को नियोजित करता है।

उदाहरण के लिए

, एक चेकबॉक्स

<input type="checkbox" name="notify_users" id="notify_cb"> 

आप चेकबॉक्स मूल्य के शामिल किए जाने की परवाह किए बिना इस तरह पद पर कार्रवाई कर सकते हैं दी: अतिरिक्त Javascript जोड़ने के लिए

// normal boolean value  
$notify_users = ((!empty($_POST['notify_users']) and $_POST['notify_users'] == 'on');  
// explicitly set a 1 or 0 
$notify_users = ((!empty($_POST['notify_users']) and $_POST['notify_users'] == 'on')? 1 : 0); 
// explicitly set 'yes' or 'no' 
$notify_users = ((!empty($_POST['notify_users']) and $_POST['notify_users'] == 'on')? 'yes' : 'no'); 

मेरे मन में यह बेहतर है क्लाइंट के लिए, अगर केवल इसलिए कि यह बनाए रखने के लिए थोड़ा सा छोटा है (और उत्तराधिकारी/अन्य देव के लिए तर्कसंगत रूप से स्पष्ट है कि क्या हो रहा है)

संबंधित मुद्दे