代码之家  ›  专栏  ›  技术社区  ›  Mike Revelle

循环内的函数

  •  -1
  • Mike Revelle  · 技术社区  · 7 年前

    我整天都在盯着代码看,似乎找不到我想要的东西,我知道如何用PHP来实现这一点,但我对动态的东西还不熟悉。

    此代码位于数据库生成的循环中。下拉项是固定的,但每个项目都在数据库中。我希望能够根据第一个下拉框选择下一个下拉框。此代码可以工作,但不适用于循环中的每个人。循环中的每个项目只更新顶部的项目。

    <div class="grid-container-fluid" style="margin-bottom: 25px;">
        <div class="grid-container" style="font-family: 'Roboto Condensed', sans-serif;">
            <div class="grid-x align-center">
            <div class="large-10 cell">
                <div class="grid-x">
    
                    <?php
                        if ($result->num_rows > 0) {
    
                            echo '<div class="large-12 cell">';
                                echo '<p style="font-family: Roboto Condensed, sans-serif; letter-spacing: 2px; font-weight: bold; line-height:1; font-size: 30px;">ADMIN PANEL:</p>';
                                echo '<p style="font-family: Roboto Condensed, sans-serif; font-size: 20px;">Income: $'.$total.'/mo<br>Program Value: $'.$value.'/person</p>';
                            echo '</div>';
    
    
                            echo '<div class="large-12 hide-for-small-only cell" style="border-bottom: 3px black solid; padding-bottom: 5px;">';
                                echo '<div class="grid-x">';
                                    echo '<div class="medium-auto small-6 cell">';
                                        echo '<p align="left" style="margin: 0;">NAME</p>';
                                    echo '</div>';
    
                                    echo '<div class="medium-auto small-6 cell">';
                                        echo '<p align="left" style="margin: 0;">EMAIL</p>';
                                    echo '</div>';
    
                                    echo '<div class="medium-auto small-6 cell">';
                                        echo '<p align="left" style="margin: 0;">PROGRAM</p>';
                                    echo '</div>';
    
                                    echo '<div class="medium-auto small-6 cell">';
                                        echo '<p align="left" style="margin: 0;">PLAN</p>';
                                    echo '</div>';
    
                                    echo '<div class="medium-2 small-6 cell">';
                                        echo '<p align="left" style="margin: 0;">STATUS</p>';
                                    echo '</div>';
    
                                    echo '<div class="medium-1 small-12 cell" style="padding-left: 15px;">';
                                            echo '<p style="margin:0; text-align: center">';
                                                echo '<i class="fi-wrench"></i>';
                                            echo '</p>';
                                    echo '</div>';
                                echo '</div>';
                            echo '</div>';
    
                            // output data of each row
                            while($row = $result->fetch_assoc()) {
    
                                echo '<div class="large-12 cell" style="border-bottom: 1px black solid; padding: 5px;">';
    
                                        echo '<div class="grid-x align-middle">';
                                            echo '<div class="medium-auto small-12 cell" style="padding:2px;">';
                                                echo '<input style="background-color: white; border: 0; margin: 0;" value="'.$row["name"].'" name="name">';
                                            echo '</div>';
    
                                            echo '<div class="medium-auto small-12 cell" style="padding:2px;">';
                                                echo '<input style="background-color: white; border: 0; margin: 0;" value="'.$row["email"].'" name="email">';
                                            echo '</div>';
    
    
                                            echo '<div class="medium-auto small-12 cell" style="padding:2px;">';
                                            echo '<select style="margin: 0; height: auto; border: 0;" name="program" id="program" onChange="changecat(this.value, '.$value.');">';
                                                echo '<option value="" disabled selected>'.$row["program"].'</option>';
                                                echo '<option value="Hockey">Hockey</option>';
                                                echo '<option value="Fundamentals">Fundamentals</option>';
                                            echo '</select>';
                                            echo '</div>';
    
                                            echo '<div class="medium-auto small-12 cell" style="padding:2px;">';
                                            echo '<select style="margin: 0; height: auto; border: 0;" name="plan" id="plan">';
                                                echo '<option value="" disabled selected>'.$row["plan"].'</option>';
                                            echo '</select>';
                                            echo '</div>';
                                            ?>
    
                                            <script>
    
                                                var programsByplan = {
                                                    Hockey: ["Off Season", "Pre Season", "In Season"],
                                                    Fundamentals: ["Phase 1"],
                                                }
    
                                                function changecat(value) {
                                                    if (value.length == 0) document.getElementById("plan").innerHTML = "<option></option>";
                                                    else {
                                                        var catOptions = "";
                                                        for (planId in programsByplan[value]) {
                                                            catOptions += "<option>" + programsByplan[value][planId] + "</option>";
                                                        }
                                                        document.getElementById("plan").innerHTML = catOptions;
                                                    }
                                                }
    
                                            </script>
    
    
    
    
    
                                            <?php
                                            echo '<div class="medium-2 small-12 cell">';
                                                echo '<div class="grid-x align-middle">';
    
                                                    echo '<div class="small-6 cell">';
                                                        echo '<select style="margin: 0; height: auto; border: 0;" name="week">';
                                                            echo '<option value="'.$row["week"].'">' . 'Week ' . $row["week"] . '</option>';
                                                            echo '<option value="1">Week 1</option>';
                                                            echo '<option value="2">Week 2</option>';
                                                            echo '<option value="3">Week 3</option>';
                                                            echo '<option value="4">Week 4</option>';
                                                            echo '<option value="5">Week 5</option>';
                                                            echo '<option value="6">Week 6</option>';
                                                            echo '<option value="7">Week 7</option>';
                                                            echo '<option value="8">Week 8</option>';
                                                            echo '<option value="9">Week 9</option>';
                                                            echo '<option value="10">Week 10</option>';
                                                            echo '<option value="11">Week 11</option>';
                                                            echo '<option value="12">Week 12</option>';
                                                            echo '<option value="13">Week 13</option>';
                                                            echo '<option value="14">Week 14</option>';
                                                            echo '<option value="15">Week 15</option>';
                                                        echo '</select>';
                                                    echo '</div>';
    
                                                    echo '<div class="small-6 cell">';
                                                        echo '<select style="margin: 0; height: auto; border: 0;" name="day">';
                                                            echo '<option value="'.$row["day"].'">' . 'Day ' . $row["day"] . '</option>';
                                                            echo '<option value="1">Day 1</option>';
                                                            echo '<option value="2">Day 2</option>';
                                                            echo '<option value="3">Day 3</option>';
                                                            echo '<option value="4">Day 4</option>';
                                                        echo '</select>';
                                                    echo '</div>';
                                                echo '</div>';
                                            echo '</div>';
    
                                            echo '<div class="medium-1 small-12 cell" style="padding-left: 15px;">';
                                                echo '<p style="margin:0; text-align: center">';
                                                    echo '<input style="font-size: 12px;" class="expanded button nav" type="submit" value="Update" name="submit" id="submit"/>';
                                                echo '</p>';
                                            echo '</div>';
    
                                        echo '</div>';
                                echo '</div>';
                            }
                        }
                    ?>
                </div>
            </div>
            </div>
        </div>
    </div>
    

    我知道它需要一个唯一的id,我只是不知道在哪里。

    1 回复  |  直到 7 年前
        1
  •  -1
  •   Community CDub    4 年前

    类似这样:

    echo '<div class="medium-auto small-12 cell" style="padding:2px;">';
    echo '<select style="margin: 0; height: auto; border: 0;" name="program" id="program-'.$row['id'].'" >';
        echo '<option value="" disabled selected>'.$row["program"].'</option>';
        echo '<option value="Hockey">Hockey</option>';
        echo '<option value="Fundamentals">Fundamentals</option>';
    echo '</select>';
    echo '</div>';
    
    echo '<div class="medium-auto small-12 cell" style="padding:2px;">';
    echo '<select style="margin: 0; height: auto; border: 0;" name="plan" id="plan-'.$row['id'].'">';
        echo '<option value="" disabled selected>'.$row["plan"].'</option>';
    echo '</select>';
    echo '</div>';
    ?>
    
    <script>
        var programsByplan = {
            Hockey: ["Off Season", "Pre Season", "In Season"],
            Fundamentals: ["Phase 1"],
        }
        
        $('select[name="program"]').change(function(){
            var program = $(this).val();
            var plan_id = $(this).prop('id').replace('program', 'plan');
            if(programsByplan[program]){
                var options = [];
                $.each(programsByplan[program], function(i,v){
                    options.push('<option value="'+v+'">'+v+'</option>');
                });
                $('#'+plan_id).html(options.join("\n"));
            }else{
                //or, do somkind of error recovery here.
               $('#'+plan_id).html('<option value="">No Plans</option>');
            }
        });
    </script>
    

    我会摆脱 onChange ,我也大量使用jQuery,但问题被标记了。

    所以在更改任何带有名称的select时 program (我们没有更改,所以它们都有相同的名称)我们触发事件回调。当然,你也可以在课堂上做这部分。

    在回调中,我们获取当前select中选择的值,然后检查它是否存在于 programsByplan (它总是应该这样做),但检查也无妨。

    然后我们转换程序id program-'.$row['id'].' plan-'.$row['id'].' .现在我们知道要更改的计划。我更喜欢使用数组来添加选项,但您可以 += 事情现在我们知道了计划元素的id,用 .html()

    我还没有测试过这个,但应该很接近。重要的是通过让id易于关联,或者换言之,易于找到正确的id,让自己成功 plan 更改的元素 程序 要素

    我还假设你有 $row['id'] 这至少是生成这些的循环所特有的。

    使现代化

    但是,当数据库中的程序/计划正确时,如何获得显示在页面加载上的选项

    我想进一步修改如下:

    //outside of the loop define your data
    $programsByplan = [
            'Hockey' => ["Off Season", "Pre Season", "In Season"],
            'Fundamentals' => ["Phase 1"],
    ];
    
    //inside the loop
    echo '<div class="medium-auto small-12 cell" style="padding:2px;">';
    echo '<select style="margin: 0; height: auto; border: 0;" name="program" id="program-'.$row['id'].'" >'; 
        foreach($programsByplan as $program => $plans){
            //$selected = $row["program"] == $program ? 'disabled selected' : '';
            $selected = $row["program"] == $program ? 'selected="selected"' : '';
            echo '<option value="'.$program.'" '.$selected.'>'.$program.'</option>';
        }
    echo '</select>';
    echo '</div>';
    
    echo '<div class="medium-auto small-12 cell" style="padding:2px;">';
    echo '<select style="margin: 0; height: auto; border: 0;" name="plan" id="plan-'.$row['id'].'">';
        foreach($programsByplan[$row["program"]] as $plan){
            //$selected = $row["plan"] == $plan ? 'disabled selected' : '';
            $selected = $row["plan"] == $plan ? 'selected="selected"' : '';
            echo '<option value="'.$plan.'" '.$selected.'>'.$plan.'</option>';
        }
    echo '</select>';
    echo '</div>';
    ?>
    
    <script>
        var programsByplan = <?php echo json_encode($programsByplan); ?>;
        
        //... other code
    

    我们在这里添加 $programsByplan 在PHP中,然后使用json\u encode,我们可以将相同的数组添加到Javascript中,这很了不起。希望这能奏效

    var programsByplan = <?php echo json_encode($programsByplan); ?>;
    

    有时可能需要一些修改,但它在代码的可维护性方面有巨大的好处。因为您只使用了一个权威的数据源。而不是到处传播。这样做的一个附带好处是,如果您将程序和计划制作为具有多对一关系的两个表,那么您可以将它们放在数据库中,并通过构建该数组轻松更新代码。看看数据是否只是硬编码的,那么以后很难做出这样的更改。

    它还允许我们修复最初构建select时遇到的一些其他问题,并简化了代码。一个大问题是删除所选项目上的值,并且有重复的项目。

      echo '<option value="" disabled selected>'.$row["program"].'</option>';
    

    实际上,您正在删除此处的值,这可能不是您想要的。我也不确定 disabled 有点,所以我把它放在里面了。也许这只是为了解决初始化时的选择问题?不管怎样,我在评论中提到了这一部分。我总是这样选择:

    $selected = $row["program"] == $program ? 'selected="selected"' : '';
    

    这可能是“老派”的做法,但对我来说一直都很有效。

    无论如何,很明显,如果我们试图获取所选选项的值,而其值已被删除,那么结果可能不会很好。更不用说,没有办法“知道”什么是删除具有相同值的选项,当它只是像以前一样硬编码时,因此您将得到一个重复的选项。

    这应该可以解决大部分问题,但这一切都是在我的脑子里完成的,所以希望一切都能像我想的那样顺利。无论如何,这个理论是正确的。

    您可以在此沙盒中进行测试:

    http://sandbox.onlinephpfunctions.com/code/077c8a988697122549713ede9c305bf4f7620ed9

    使用(作为行的屏蔽数据。)

    $row = [
        'id' => 1,
        'program' => 'Hockey',
        'plan' => 'Off Season'
    ];
    

    其输出:

    <div class="medium-auto small-12 cell" style="padding:2px;">
        <select style="margin: 0; height: auto; border: 0;" name="program" id="program-1" >
            <option value="Hockey" selected="selected">Hockey</option>
            <option value="Fundamentals" >Fundamentals</option>
        </select>
    </div>
    
    <div class="medium-auto small-12 cell" style="padding:2px;">
        <select style="margin: 0; height: auto; border: 0;" name="plan" id="plan-1">
            <option value="Off Season" selected="selected">Off Season</option>
            <option value="Pre Season" >Pre Season</option>
            <option value="In Season" >In Season</option>
        </select>
    </div>
    

    正如你所看到的 program-1 plan-1 我们的ID,然后两个选择都有适当的元素 selected="selected"

    更新2

    处理以前没有为程序选择数据的情况。

    对于上面的第一个循环,我将添加以下内容

     //echo <select ...
     echo '<option value="" > - Please select a program - </option>';
     //foreach( ...
    

    在循环之前和打开之后进行 <select 。然后对于第二个循环,我将禁用第二个选择,直到他们在第一个循环中做出选择。

    $disabled = empty($row["program"]) ? 'disabled="disabled"': '';
    echo '<select style="margin: 0; height: auto; border: 0;" name="plan" id="plan-'.$row['id'].'" '.$disabled.'>';
    

    然后在Javascript中

    $('select[name="program"]').change(function(){
        var program = $(this).val();
        if(program == '' ) return; //exit on empty selection
        var plan_id = $(this).prop('id').replace('program', 'plan');
        //enable the select if disabled.
        $('#'+plan_id).attr('disabled',false);
    

    然后,您可能只想在保存之前检查他们是否选择了某个程序等。。

    更新3

    对于任何Javascript问题,请始终使用浏览器中的调试窗口(f12),然后单击 console .然后在你的代码中,你可以

    console.log(var);
    

    它将在控制台中打印该值。它类似于PHP的var\u导出、print\u r或var\u转储等。。。

    所以我从这个开始

     <script>
        var programsByplan = <?php echo json_encode($programsByplan); ?>;
        console.log(programsByplan);
       
        
        $('select[name="program"]').change(function(){
            var program = $(this).val();
    
            console.log(program);
    
            var plan_id = $(this).prop('id').replace('program', 'plan');
    
            console.log(programsByplan[program]);
    
            if(programsByplan[program]){
                var options = [];
                $.each(programsByplan[program], function(i,v){
                    options.push('<option value="'+v+'">'+v+'</option>');
                });
                $('#'+plan_id).html(options.join("\n"));
            }else{
                //or, do somkind of error recovery here.
               $('#'+plan_id).html('<option value="">No Plans</option>');
            }
        });
    </script>
    

    等等,看看这些值是什么。这可能是最好的方法。

    干杯