سؤال

لدي عدد كبير من مربعات الاختيار التي تم تحديدها افتراضيًا.من المحتمل أن يقوم المستخدمون بإلغاء تحديد عدد قليل (إن وجد) من مربعات الاختيار وترك الباقي محددًا.

هل هناك أي طريقة لجعل النموذج POST مربعات الاختيار الموجودة لا فحص، بدلا من تلك التي نكون التحقق؟

هل كانت مفيدة؟

المحلول

أضف مدخلاً مخفيًا لمربع الاختيار بمعرف مختلف:

<input id='testName' type='checkbox' value='Yes' name='testName'>
<input id='testNameHidden' type='hidden' value='No' name='testName'>

قبل إرسال النموذج، قم بتعطيل الإدخال المخفي بناءً على الشرط المحدد:

if(document.getElementById("testName").checked) {
    document.getElementById('testNameHidden').disabled = true;
}

نصائح أخرى

الحل الذي أعجبني أكثر حتى الآن هو وضع إدخال مخفي يحمل نفس اسم مربع الاختيار الذي قد لا يكون محددًا.أعتقد أنه يعمل بحيث إذا لم يتم تحديد مربع الاختيار، فإن الإدخال المخفي لا يزال ناجحًا ويتم إرساله إلى الخادم ولكن إذا تم تحديد مربع الاختيار، فسوف يتجاوز الإدخال المخفي قبله.بهذه الطريقة لن تضطر إلى تتبع القيم الموجودة في البيانات المنشورة والتي من المتوقع أن تأتي من مربعات الاختيار.

<form>
  <input type='hidden' value='0' name='selfdestruct'>
  <input type='checkbox' value='1' name='selfdestruct'>
</form>

لقد قمت بحلها باستخدام Vanilla JavaScript:

<input type="hidden" name="checkboxName" value="0"><input type="checkbox" onclick="this.previousSibling.value=1-this.previousSibling.value">

احرص على عدم وجود أي مسافات أو فواصل أسطر بين عنصري الإدخال هذين!

يمكنك استخدام this.previousSibling.previousSibling للحصول على العناصر "العليا".

باستخدام PHP، يمكنك التحقق من الحقل المخفي المسمى بـ 0 (غير محدد) أو 1 (مجموعة).

مفضلتي الشخصية هي إضافة حقل مخفي بنفس الاسم الذي سيتم استخدامه إذا لم يتم تحديد خانة الاختيار.لكن الحل ليس سهلا كما قد يبدو.

إذا أضفت هذا الكود:

<form>
  <input type='hidden' value='0' name='selfdestruct'>
  <input type='checkbox' value='1' name='selfdestruct'>
</form>

لن يهتم المتصفح حقًا بما تفعله هنا.سيرسل المتصفح كلا المعلمتين إلى الخادم، وعلى الخادم أن يقرر ما يجب فعله بهما.

PHP على سبيل المثال تأخذ القيمة الأخيرة باعتبارها القيمة المستخدمة (انظر: الموضع الرسمي لمفاتيح استعلام HTTP GET المكررة)

لكن الأنظمة الأخرى التي عملت معها (المعتمدة على Java) تفعل ذلك بنفس الطريقة - فهي تقدم لك القيمة الأولى فقط..NET بدلاً من ذلك سيعطيك مصفوفة تحتوي على كلا العنصرين بدلاً من ذلك

سأحاول اختبار ذلك باستخدام Node.js وPython وPerl في وقت ما.

الأسلوب الشائع حول هذا هو حمل متغير مخفي مع كل مربع اختيار.

<input type="checkbox" name="mycheckbox" />
<input type="hidden" name="mycheckbox.hidden"/>

على جانب الخادم، نكتشف أولاً قائمة المتغيرات المخفية ولكل متغير مخفي، نحاول معرفة ما إذا كان إدخال مربع الاختيار المقابل قد تم إرساله في بيانات النموذج أم لا.

من المحتمل أن تبدو خوارزمية جانب الخادم كما يلي:

for input in form data such that input.name endswith .hidden
  checkboxName = input.name.rstrip('.hidden')
  if chceckbName is not in form, user has unchecked this checkbox

ما ورد أعلاه لا يجيب على السؤال بالضبط، ولكنه يوفر وسيلة بديلة لتحقيق وظائف مماثلة.

لا تحتاج إلى إنشاء حقل مخفي لجميع مربعات الاختيار، فقط قم بنسخ الكود الخاص بي.سيتم تغيير قيمة مربع الاختيار إذا لم يتم تحديده value سوف يعين 0 وإذا تم تحديد خانة الاختيار، فقم بتعيينها value داخل 1

$("form").submit(function () {

    var this_master = $(this);

    this_master.find('input[type="checkbox"]').each( function () {
        var checkbox_this = $(this);


        if( checkbox_this.is(":checked") == true ) {
            checkbox_this.attr('value','1');
        } else {
            checkbox_this.prop('checked',true);
            //DONT' ITS JUST CHECK THE CHECKBOX TO SUBMIT FORM DATA    
            checkbox_this.attr('value','0');
        }
    })
})

يمكنك القيام ببعض جافا سكريبت في حدث إرسال النموذج.هذا كل ما يمكنك فعله، رغم ذلك، لا توجد طريقة لجعل المتصفحات تقوم بذلك بنفسها.وهذا يعني أيضًا أن النموذج الخاص بك سوف يتعطل بالنسبة للمستخدمين الذين ليس لديهم جافا سكريبت.من الأفضل أن تعرف على الخادم خانات الاختيار الموجودة، حتى تتمكن من استنتاج أن تلك الغائبة عن قيم النموذج المنشورة ($_POST في PHP) لم يتم تحديدها.

$('input[type=checkbox]').on("change",function(){
    var target = $(this).parent().find('input[type=hidden]').val();
    if(target == 0)
    {
        target = 1;
    }
    else
    {
        target = 0;
    }
    $(this).parent().find('input[type=hidden]').val(target);
});

<p>
    <input type="checkbox" />
    <input type="hidden" name="test_checkbox[]" value="0" />
</p>
<p>
    <input type="checkbox" />
    <input type="hidden" name="test_checkbox[]" value="0" />
</p>
<p>
    <input type="checkbox" />
    <input type="hidden" name="test_checkbox[]" value="0" />
</p>

إذا تركت اسم مربع الاختيار، فلن يتم تمريره.فقط مجموعة test_checkbox.

سأفعل في الواقع ما يلي.

احصل على حقل الإدخال المخفي بنفس الاسم مع إدخال مربع الاختيار

<input type="hidden" name="checkbox_name[]" value="0" />
<input type="checkbox" name="checkbox_name[]" value="1" />

وبعد ذلك عندما أقوم بالنشر، أقوم أولاً بإزالة القيم المكررة التي تم التقاطها في مصفوفة $_POST، مما يعرض كل قيمة فريدة من نوعها.

  $posted = array_unique($_POST['checkbox_name']);
  foreach($posted as $value){
    print $value;
  }

لقد حصلت على هذا من وظيفة إزالة القيم المكررة من المصفوفة

"لقد اتبعت نهج الخادم.يبدو أنه يعمل بشكل جيد - شكرا.– التوصل إلى 4thelasers 1 ديسمبر 2009 الساعة 15:19" أود أن أوصي به من المالك.كما نقلت:يعتمد حل جافا سكريبت على كيفية معالج الخادم (لم أتحقق منه)

مثل

if(!isset($_POST["checkbox"]) or empty($_POST["checkbox"])) $_POST["checkbox"]="something";

تتطلب معظم الإجابات هنا استخدام JavaScript أو عناصر تحكم الإدخال المكررة.في بعض الأحيان يحتاج هذا إلى التعامل معه بالكامل من جانب الخادم.

أعتقد أن المفتاح (المقصود) لحل هذه المشكلة الشائعة هو التحكم في إدخال إرسال النموذج.

لتفسير القيم غير المحددة لمربعات الاختيار والتعامل معها بنجاح، يجب أن تكون لديك معرفة بما يلي:

  1. أسماء خانات الاختيار
  2. اسم عنصر إدخال إرسال النموذج

من خلال التحقق مما إذا كان النموذج قد تم إرساله (يتم تعيين قيمة لعنصر إدخال الإرسال)، يمكن تعيين أي قيم لمربعات اختيار غير محددة يفترض.

على سبيل المثال:

<form name="form" method="post">
  <input name="value1" type="checkbox" value="1">Checkbox One<br/>
  <input name="value2" type="checkbox" value="1" checked="checked">Checkbox Two<br/>
  <input name="value3" type="checkbox" value="1">Checkbox Three<br/>
  <input name="submit" type="submit" value="Submit">
</form>

عند استخدام PHP، من السهل جدًا اكتشاف مربعات الاختيار التي تم تحديدها.

<?php

$checkboxNames = array('value1', 'value2', 'value3');

// Persisted (previous) checkbox state may be loaded 
// from storage, such as the user's session or a database.
$checkboxesThatAreChecked = array(); 

// Only process if the form was actually submitted.
// This provides an opportunity to update the user's 
// session data, or to persist the new state of the data.

if (!empty($_POST['submit'])) {
    foreach ($checkboxNames as $checkboxName) {
        if (!empty($_POST[$checkboxName])) {
            $checkboxesThatAreChecked[] = $checkboxName;
        }
    }
    // The new state of the checkboxes can be persisted 
    // in session or database by inspecting the values 
    // in $checkboxesThatAreChecked.
    print_r($checkboxesThatAreChecked);
}

?>

يمكن تحميل البيانات الأولية عند كل تحميل للصفحة، ولكن يجب تعديلها فقط في حالة إرسال النموذج.وبما أن أسماء مربعات الاختيار معروفة مسبقًا، فيمكن اجتيازها وفحصها بشكل فردي، بحيث يشير غياب قيمها الفردية إلى عدم التحقق منها.

لقد جربت نسخة سام أولاً.فكرة جيدة، ولكنها تتسبب في وجود عناصر متعددة في النموذج بنفس الاسم.إذا كنت تستخدم أي جافا سكريبت يبحث عن العناصر بناءً على الاسم، فسوف يُرجع الآن مصفوفة من العناصر.

لقد قمت بتنفيذ فكرة شايليش في لغة PHP، وقد نجحت بالنسبة لي.هذا هو الكود الخاص بي:

/* Delete '.hidden' fields if the original is present, use '.hidden' value if not. */
foreach ($_POST['frmmain'] as $field_name => $value)
{
    // Only look at elements ending with '.hidden'
    if ( !substr($field_name, -strlen('.hidden')) ) {
        break;
    }

    // get the name without '.hidden'
    $real_name = substr($key, strlen($field_name) - strlen('.hidden'));

    // Create a 'fake' original field with the value in '.hidden' if an original does not exist
    if ( !array_key_exists( $real_name, $POST_copy ) ) {
        $_POST[$real_name] = $value;
    }

    // Delete the '.hidden' element
    unset($_POST[$field_name]);
}

أستخدم هذه المجموعة من jQuery، والتي ستضيف مدخلاً مخفيًا في وقت الإرسال إلى كل مربع اختيار لم يتم تحديده.سيضمن لك دائمًا الحصول على قيمة يتم إرسالها لكل مربع اختيار، في كل مرة، دون تشويش العلامات الخاصة بك والمخاطرة بنسيان القيام بذلك في مربع الاختيار الذي تضيفه لاحقًا.كما أنه لا يتوافق مع أي مكدس خلفي (PHP، وRuby، وما إلى ذلك) الذي تستخدمه.

// Add an event listener on #form's submit action...
$("#form").submit(
    function() {

        // For each unchecked checkbox on the form...
        $(this).find($("input:checkbox:not(:checked)")).each(

            // Create a hidden field with the same name as the checkbox and a value of 0
            // You could just as easily use "off", "false", or whatever you want to get
            // when the checkbox is empty.
            function(index) {
                var input = $('<input />');
                input.attr('type', 'hidden');
                input.attr('name', $(this).attr("name")); // Same name as the checkbox
                input.attr('value', "0"); // or 'off', 'false', 'no', whatever

                // append it to the form the checkbox is in just as it's being submitted
                var form = $(this)[0].form;
                $(form).append(input);

            }   // end function inside each()
        );      // end each() argument list

        return true;    // Don't abort the form submit

    }   // end function inside submit()
);      // end submit() argument list

يمكنك أيضًا اعتراض حدث form.submit والتحقق العكسي قبل الإرسال

$('form').submit(function(event){
    $('input[type=checkbox]').prop('checked', function(index, value){
        return !value;
    });
});

يعجبني أيضًا الحل الذي يتمثل في نشر حقل إدخال إضافي، حيث يبدو استخدام JavaScript أمرًا صعبًا بعض الشيء بالنسبة لي.

اعتمادًا على ما تستخدمه في الواجهة الخلفية، سيعتمد على المدخلات التي يتم إدخالها أولاً.

بالنسبة للواجهة الخلفية للخادم حيث يتم استخدام التواجد الأول (JSP)، يجب عليك القيام بما يلي.

  <input type="checkbox" value="1" name="checkbox_1"/>
  <input type="hidden" value="0" name="checkbox_1"/>


بالنسبة للواجهة الخلفية للخادم حيث يتم استخدام آخر تكرار (PHP، Rails)، يجب عليك القيام بما يلي.

  <input type="hidden" value="0" name="checkbox_1"/>
  <input type="checkbox" value="1" name="checkbox_1"/>


بالنسبة للواجهة الخلفية للخادم حيث يتم تخزين جميع الأحداث في نوع بيانات القائمة ([],array).(بايثون / زوبي)

يمكنك النشر بأي ترتيب تريده، ما عليك سوى محاولة الحصول على القيمة من الإدخال باستخدام ملف checkbox سمة النوع.لذا فإن الفهرس الأول للقائمة إذا كانت خانة الاختيار قبل العنصر المخفي والفهرس الأخير إذا كانت خانة الاختيار بعد العنصر المخفي.


([])

يمكنك الآن محاولة الحصول على الفهرس الأول من القائمة إذا كانت خانة الاختيار موجودة قبل العنصر المخفي والحصول على الفهرس الأخير إذا كانت خانة الاختيار بعد العنصر المخفي.

Backend parameter handling

مصدر الصورة

أرى أن هذا السؤال قديم وله الكثير من الإجابات، لكنني سأعطي قرسي على أي حال.تصويتي لصالح حل جافا سكريبت في حدث "إرسال" النموذج، كما أشار البعض.لا داعي لمضاعفة المدخلات (خاصة إذا كان لديك أسماء طويلة وسمات تحتوي على كود php ممزوجًا بـ html)، ولا داعي للقلق من جانب الخادم (يتطلب ذلك معرفة جميع أسماء الحقول والتحقق منها واحدًا تلو الآخر)، ما عليك سوى إحضار جميع العناصر التي لم يتم تحديدها ، وقم بتعيين قيمة 0 لهم (أو أي شيء تحتاجه للإشارة إلى الحالة "غير محددة") ثم قم بتغيير السمة الخاصة بهم "محددة" إلى true

    $('form').submit(function(e){
    var b = $("input:checkbox:not(:checked)");
    $(b).each(function () {
        $(this).val(0); //Set whatever value you need for 'not checked'
        $(this).attr("checked", true);
    });
    return true;
});

بهذه الطريقة سيكون لديك مصفوفة $_POST مثل هذا:

Array
(
            [field1] => 1
            [field2] => 0
)
$('form').submit(function () {
    $(this).find('input[type="checkbox"]').each( function () {
        var checkbox = $(this);
        if( checkbox.is(':checked')) {
            checkbox.attr('value','1');
        } else {
            checkbox.after().append(checkbox.clone().attr({type:'hidden', value:0}));
            checkbox.prop('disabled', true);
        }
    })
});

أعلم أن هذا السؤال عمره 3 سنوات ولكني وجدت حلاً أعتقد أنه يعمل بشكل جيد.

يمكنك التحقق من تعيين المتغير $_POST وحفظه في متغير.

$value = isset($_POST['checkboxname'] ? 'YES' : 'NO';

تتحقق الدالة isset() من تعيين المتغير $_POST.حسب المنطق، إذا لم يتم تعيينه، فلن يتم تحديد خانة الاختيار.

ما فعلته كان مختلفًا بعض الشيء.قمت أولاً بتغيير قيم جميع خانات الاختيار التي لم يتم تحديدها.إلى "0"، ثم حددهم جميعًا، حتى يتم إرسال القيمة.

function checkboxvalues(){
  $("#checkbox-container input:checkbox").each(function({ 
    if($(this).prop("checked")!=true){
      $(this).val("0");
      $(this).prop("checked", true);
    }
  });
}

أفضّل تجميع ملف $_POST

if (!$_POST['checkboxname']) !$_POST['checkboxname'] = 0;

إنه يفكر، إذا لم يكن POST يحتوي على قيمة "اسم مربع الاختيار"، فقد تم إلغاء تحديده، لذا قم بتعيين قيمة.

يمكنك إنشاء مصفوفة من قيم ckeckbox الخاصة بك وإنشاء وظيفة تتحقق من وجود القيم، وإذا لم تكن موجودة، فسيتم إلغاء تحديدها ويمكنك تعيين قيمة

مثال على إجراءات Ajax هو(':checked') استخدام jQuery بدلاً من .val();

            var params = {
                books: $('input#users').is(':checked'),
                news : $('input#news').is(':checked'),
                magazine : $('input#magazine').is(':checked')
            };

ستحصل المعلمات على قيمة TRUE أو FALSE ..

تمثل مربعات الاختيار عادةً البيانات الثنائية المخزنة في قاعدة البيانات كقيم نعم/لا أو Y/N أو 1/0.مربعات اختيار HTML لها طبيعة سيئة لإرسال القيمة إلى الخادم فقط إذا تم تحديد خانة الاختيار!وهذا يعني أن البرنامج النصي للخادم الموجود على موقع آخر يجب أن يعرف مسبقًا جميع مربعات الاختيار الممكنة على صفحة الويب حتى يتمكن من تخزين القيم الإيجابية (المحددة) أو السلبية (غير المحددة).في الواقع، تمثل القيم السلبية فقط مشكلة (عندما يقوم المستخدم بإلغاء تحديد القيمة التي تم تحديدها مسبقًا (مسبقًا) - كيف يمكن للخادم معرفة ذلك عندما لا يتم إرسال أي شيء إذا كان لا يعرف مسبقًا أنه يجب إرسال هذا الاسم).إذا كان لديك برنامج نصي من جانب الخادم يقوم بإنشاء برنامج UPDATE ديناميكيًا، فهناك مشكلة لأنك لا تعرف ما هي جميع مربعات الاختيار التي يجب استلامها لتعيين قيمة Y للقيم المحددة وقيمة N للقيم غير المحددة (غير المستلمة).

نظرًا لأنني أقوم بتخزين القيمتين "Y" و"N" في قاعدة البيانات الخاصة بي وتمثيلهما من خلال مربعات الاختيار المحددة وغير المحددة في الصفحة، فقد أضفت حقلًا مخفيًا لكل قيمة (مربع اختيار) بقيم "Y" و"N" ثم استخدم مربعات الاختيار فقط للعناصر المرئية التمثيل، واستخدم وظيفة JavaScript بسيطة check() لتعيين قيمة if وفقًا للاختيار.

<input type="hidden" id="N1" name="N1" value="Y" />
<input type="checkbox"<?php if($N1==='Y') echo ' checked="checked"'; ?> onclick="check(this);" />
<label for="N1">Checkbox #1</label>

استخدم مستمع JavaScript عند النقر ووظيفة الاتصال check() لكل مربع اختيار على صفحة الويب الخاصة بي:

function check(me)
{
  if(me.checked)
  {
    me.previousSibling.previousSibling.value='Y';
  }
  else
  {
    me.previousSibling.previousSibling.value='N';
  }
}

بهذه الطريقة يتم دائمًا إرسال القيم "Y" أو "N" إلى البرنامج النصي من جانب الخادم، فهو يعرف ما هي الحقول التي يجب تحديثها وليست هناك حاجة لتحويل قيمة مربع الاختيار "on" إلى "Y" أو مربع الاختيار غير المستلم إلى "N" '.

ملحوظة:المسافة البيضاء أو السطر الجديد هي أيضًا شقيقة، لذا أحتاج هنا إلى .previousSibling.previousSibling.value.إذا لم يكن هناك مسافة بينهما، فقط .previousSibling.value


لا تحتاج إلى إضافة مستمع النقر بشكل صريح كما كان من قبل، يمكنك استخدام مكتبة jQuery لإضافة مستمع النقر ديناميكيًا مع وظيفة لتغيير القيمة إلى جميع مربعات الاختيار في صفحتك:

$('input[type=checkbox]').click(function()
{
  if(this.checked)
  {
    $(this).prev().val('Y');
  }
  else
  {
    $(this).prev().val('N');
  }
});

المشكلة في مربعات الاختيار هي أنه إذا لم يتم تحديدها، فلن يتم نشرها مع النموذج الخاص بك.إذا قمت بتحديد خانة اختيار ونشرت نموذجًا، فستحصل على قيمة خانة الاختيار في المتغير $_POST الذي يمكنك استخدامه لمعالجة النموذج، وإذا لم يتم تحديده فلن تتم إضافة أي قيمة إلى المتغير $_POST.

في PHP، يمكنك عادةً التغلب على هذه المشكلة عن طريق إجراء فحص isset() على عنصر مربع الاختيار الخاص بك.إذا لم يتم تعيين العنصر الذي تتوقعه في المتغير $_POST، فإننا نعلم أن مربع الاختيار لم يتم تحديده وأن القيمة يمكن أن تكون خاطئة.

if(!isset($_POST['checkbox1']))
{
     $checkboxValue = false;
} else {
     $checkboxValue = $_POST['checkbox1'];
}

ولكن إذا قمت بإنشاء نموذج ديناميكي، فلن تعرف دائمًا سمة الاسم لمربعات الاختيار الخاصة بك، وإذا كنت لا تعرف اسم مربع الاختيار، فلن تتمكن من استخدام الدالة isset للتحقق مما إذا كان قد تم إرسال هذا مع المتغير $_POST.

لا يمكن تحقيق ذلك إلا باستخدام بعض جافا سكريبت، حيث لا يتم إرسال مربعات الاختيار غير المحددة.لذلك أنت بحاجة إلى جافا سكريبت على سبيل المثال.يضيف خلف الكواليس حقولًا مخفية عند إلغاء تحديد خانة الاختيار.بدون جافا سكريبت لا يمكن القيام بذلك.

هناك حل أفضل.أولاً، قم بتوفير سمة الاسم لمربعات الاختيار التي تم تحديدها فقط.ثم على النقر submit, ، من خلال جافا سكريبت function قمت بتحديد كافة المربعات غير المحددة.لذلك عندما submit سيتم استرداد تلك فقط في form collection أولئك الذين لديهم name ملكية.

  //removing name attribute from all checked checkboxes
                  var a = $('input:checkbox:checked');
                   $(a).each(function () {
                       $(this).removeAttr("name");        
                   });

   // checking all unchecked checkboxes
                   var b = $("input:checkbox:not(:checked)");
                   $(b).each(function () {
                       $(this).attr("checked", true);
                   });

ميزة:لا حاجة لإنشاء صناديق مخفية إضافية والتلاعب بها.

لقد فهم @cpburnz الأمر بشكل صحيح ولكن بالنسبة إلى الكثير من التعليمات البرمجية، فإليك نفس الفكرة باستخدام تعليمات برمجية أقل:

شبيبة:

// jQuery OnLoad
$(function(){
    // Listen to input type checkbox on change event
    $("input[type=checkbox]").change(function(){
        $(this).parent().find('input[type=hidden]').val((this.checked)?1:0);
    });
});

HTML (لاحظ اسم الحقل باستخدام اسم صفيف):

<div>
    <input type="checkbox" checked="checked">
    <input type="hidden" name="field_name[34]" value="1"/>
</div>
<div>
    <input type="checkbox">
    <input type="hidden" name="field_name[35]" value="0"/>
</div>
<div>

وبالنسبة لـ PHP:

<div>
    <input type="checkbox"<?=($boolean)?' checked="checked"':''?>>
    <input type="hidden" name="field_name[<?=$item_id?>]" value="<?=($boolean)?1:0?>"/>
</div>

نسخة jQuery من إجابة @vishnu.

if($('#testName').is(":checked")){
    $('#testNameHidden').prop('disabled', true);
}

إذا كنت تستخدم jQuery 1.5 أو أقل، فيرجى استخدام الدالة .attr() بدلاً من .prop()

هذا الحل مستوحى من حل @desw.

إذا كانت أسماء الإدخال الخاصة بك في "نمط النموذج"، فسوف تفقد ارتباط فهرس المصفوفة بقيم مربع الاختيار الخاص بك بمجرد تحديد مربع اختيار واحد، مما يؤدي إلى زيادة هذا "التفكك" بمقدار وحدة واحدة في كل مرة يتم فيها تحديد مربع اختيار.يمكن أن يكون هذا هو الحال بالنسبة لنموذج لإدراج شيء مثل الموظفين يتكون من بعض الحقول، على سبيل المثال:

<input type="text" name="employee[]" />
<input type="hidden" name="isSingle[] value="no" />
<input type="checkbox" name="isSingle[] value="yes" />

في حالة قيامك بإدخال ثلاثة موظفين في وقت واحد وكان الأول والثاني منفردين، فسوف ينتهي بك الأمر إلى 5 عناصر isSingle لذلك لن تتمكن من تكرار المصفوفات الثلاث مرة واحدة، على سبيل المثال، لإدراج الموظفين في قاعدة البيانات.

يمكنك التغلب على هذا من خلال بعض عمليات المعالجة اللاحقة السهلة للمصفوفة.أنا أستخدم PHP من جانب الخادم وقد فعلت هذا:

$j = 0;
$areSingles = $_POST['isSingle'];
foreach($areSingles as $isSingle){
  if($isSingle=='yes'){
    unset($areSingles[$j-1]);
  }
  $j++;
}
$areSingles = array_values($areSingles);

لذا فإن هذا الحل مبالغ فيه بالنسبة لهذا السؤال، ولكنه ساعدني عندما كان لدي نفس مربع الاختيار الذي حدث عدة مرات لصفوف مختلفة في الجدول.كنت بحاجة إلى معرفة الصف الذي تمثله خانة الاختيار ومعرفة حالة خانة الاختيار (محددة/غير محددة).

ما فعلته هو إزالة سمة الاسم من مدخلات مربع الاختيار الخاص بي، ومنحهم نفس الفئة، وإنشاء مدخلات مخفية من شأنها أن تحتوي على مكافئ JSON للبيانات.

لغة البرمجة

 <table id="permissions-table">
    <tr>
	<td>
	    <input type="checkbox" class="has-permission-cb" value="Jim">
	    <input type="checkbox" class="has-permission-cb" value="Bob">
	    <input type="checkbox" class="has-permission-cb" value="Suzy">
	</td>
    </tr>
 </table>
 <input type="hidden" id="has-permissions-values" name="has-permissions-values" value="">

جافا سكريبت للتشغيل عند إرسال النموذج

var perms = {};
$(".has-permission-checkbox").each(function(){
  var userName = this.value;
  var val = ($(this).prop("checked")) ? 1 : 0
  perms[userName] = {"hasPermission" : val};
});
$("#has-permissions-values").val(JSON.stringify(perms));

سيتم تمرير سلسلة json بالنموذج $_POST["has-permissions-values"].في PHP، قم بفك تشفير السلسلة إلى مصفوفة وسيكون لديك مصفوفة ترابطية تحتوي على كل صف وقيمة صواب/خطأ لكل مربع اختيار مطابق.ومن ثم يصبح من السهل جدًا الاطلاع على قيم قاعدة البيانات الحالية ومقارنتها.

جميع الإجابات رائعة، ولكن إذا كان لديك مربعات اختيار متعددة في نموذج يحمل نفس الاسم وتريد نشر حالة كل مربع اختيار.ثم قمت بحل هذه المشكلة عن طريق وضع حقل مخفي مع مربع الاختيار (الاسم المتعلق بما أريد).

<input type="hidden" class="checkbox_handler" name="is_admin[]" value="0" />
<input type="checkbox" name="is_admin_ck[]" value="1" />

ثم التحكم في حالة تغيير خانة الاختيار عن طريق كود jquery أدناه:

$(documen).on("change", "input[type='checkbox']", function() {
    var checkbox_val = ( this.checked ) ? 1 : 0;
    $(this).siblings('input.checkbox_handler').val(checkbox_val);
});

الآن عند تغيير أي مربع اختيار، سيتم تغيير قيمة الحقل المخفي ذي الصلة.وعلى الخادم، يمكنك البحث فقط في الحقول المخفية بدلاً من مربعات الاختيار.

نأمل أن يساعد هذا شخص ما لديه هذا النوع من المشاكل.يشجع :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top