【问题标题】:Wordpress echo something in for loop only onceWordpress 在 for 循环中只回显一次
【发布时间】:2017-02-08 13:06:16
【问题描述】:

所以我尝试只打印一次标签,每个循环有四个标签。

所以本质上我正在尝试循环遍历每个标签并打印一次标签。

第二个是每个循环打印四个标签。

为了更好地解释这里有一些图片。

我想要什么 - http://i.imgur.com/LPbqd53.png 目前是什么 - http://i.imgur.com/WqNrgBc.png

这是我的代码

  <div class="wpt_test fill_form">

    <div class="answers">
      <div class="content">
        <form
        <?php foreach ($formAttributes as $key => $value):?>
          <?php echo $key ?>="<?php echo htmlspecialchars(is_array($value) ? json_encode($value) : $value) ?>"
        <?php endforeach; ?>>
        <?php if ($isShowContent): ?><div class="content" style="margin:0;"><?php echo $content ?></div><?php endif ?>    
        <?php if ($shortDescription): ?><div class="short-description"><?php echo $wp->autoParagraphise($shortDescription) ?></div><?php endif ?>
        <?php $wp->doAction('wp_testing_template_fill_form_questions_before') ?>                            
          <?php foreach($questions as $q => $question): /* @var $question WpTesting_Model_Question */ ?>
            <?php $wp->doAction('wp_testing_template_fill_form_question_before', $question, $q) ?>
          <div class="question">      
              <div class="title">
              <span class="question-title" style="width:100%;"><?php echo $question->getTitle() ?>
                <?php $wp->doAction('wp_testing_template_fill_form_label_end', array('required' => true)) ?></span>
                <?php if (!$isMultipleAnswers): ?>
                  <input type="hidden" name="<?php echo $answerIdName ?>[<?php echo $answerIndex ?>]" value="" />
                <?php endif ?>
              </div>
              <div class="answer-block">
                <?php foreach($question->buildAnswers() as $a => $answer): /* @var $answer WpTesting_Model_Answer */ ?>
                  <?php $answerId = 'wpt-test-question-' . $question->getId() . '-answer-' . $answer->getId() ?>
                  <div class="question-titles">
                    <div class="question-labels">
                    <label for="<?php echo $answerId ?>">
                        <input type="<?php echo $isMultipleAnswers ? 'checkbox' : 'radio' ?>" id="<?php echo $answerId ?>"
                            data-errormessage="<?php echo $isMultipleAnswers
                                ? __('Please select at least one answer.', 'wp-testing')
                                : __('Please choose only one answer.', 'wp-testing') ?>"
                            <?php if (0 == $a): ?>required="required" aria-required="true"<?php endif ?>
                            name="<?php echo $answerIdName ?>[<?php echo $answerIndex ?>]" value="<?php echo $answer->getId() ?>" />
                        <?php echo $answer->getTitleOnce() ?>
                    </label>     
                    </div>  
                  </div>  
                  <?php if ($isMultipleAnswers) {$answerIndex++;} ?>
                <?php endforeach ?>
              </div>
              <?php $wp->doAction('wp_testing_template_fill_form_question_after', $question, $q) ?>
              <?php if (!$isMultipleAnswers) {$answerIndex++;} ?>
            <?php endforeach ?>
          </div>

          <?php $wp->doAction('wp_testing_template_fill_form_questions_after') ?>

          <?php if($isFinal): ?>
            <p>
              <input type="submit" class="button" value="<?php echo $submitButtonCaption ?>" />
              <?php if($stepsCounter): ?><span class="steps-counter"><?php echo $stepsCounter ?></span><?php endif ?>
            </p>
          <?php else: ?>
            <div class="wpt_warning">
              <h4><?php echo __('Test is under construction', 'wp-testing') ?></h4>
              <p><?php echo __('You can not get any results from it yet.', 'wp-testing') ?></p>
            </div>
          <?php endif ?>
          <?php foreach($hiddens as $name => $value): ?><input type="hidden" name="<?php echo htmlspecialchars($name) ?>" value="<?php echo htmlspecialchars($value) ?>" /><?php endforeach ?>
        </form>
      </div>
    </div>

  </div>

【问题讨论】:

    标签: php wordpress plugins


    【解决方案1】:

    这绝不是一种复制粘贴的解决方案。您的代码中有一些变量,我不知道它们包含什么,但这应该作为解决方案的一个潜在想法。本质上,所需的结果是数据“表”。是否使用表格或 div 来构建 HTML 结构取决于您。您可以使用诸如 bootstrap 或 Foundation 或其他 CSS 框架提供的布局。此示例仅使用表来提供结构。您需要将答案标签绘制到一个容器中,例如一个用于在表头中迭代的数组。然后,您可以简单地输入每个答案,而不用关心是否在每次迭代中打印它。希望这会有所帮助!

    <?php
    /**
     * @var array $answerLabels
     * @var WpTesting_Model_Question[] $questions
     */
    ?>
    <table>
        <thead>
            <tr>
                <td></td>
                <?php foreach ($answerLabels as $label): ?>
                    <td><?= $label ?></td>
                <?php endforeach; ?>
            </tr>
        </thead>
        <tbody>
            <?php foreach ($questions as $question): ?>
                <tr>
                    <td><?= $question->getTitle() ?></td>
                    <?php foreach ($question->buildAnswers() as $index =>     $answer):
                        $answerId = 'wpt-test-question-' . $question->getId() . '-answer-' . $answer->getId(); 
                    ?>
                        <td>
                            <label for="<?= $answerId ?>">
                                <input type="<?= $isMultipleAnswers ? 'checkbox' : 'radio' ?>"    
                                       id="<?= $answerId ?>"
                                       data-errormessage="<?= $isMultipleAnswers
                                           ? __('Please select at least one answer.', 'wp-testing')
                                           : __('Please choose only one answer.', 'wp-testing') ?>"
                                    <?php if (0 == $index): ?>
                                        required="required"
                                        aria-required="true"
                                    <?php endif ?>
                                       name="<?= $answerIdName ?>[<?= $answerIndex ?>]"
                                       value="<?= $answer->getId() ?>"/>
                            </label>
                        </td>
                    <?php endforeach; ?>
                </tr>
            <?php endforeach; ?>
        </tbody>
    </table>
    

    【讨论】:

    • 基本上,答案是分配给问题的,每个问题的答案都是一样的。所以,从问题中,它从问题中得到答案。
    • 如果所有问题的答案都相同,为什么不通过 $questions 数组和 $answers 数组来干掉它。由于众所周知,所有问题的答案都是相同的,因此您可以通过这样做和更清晰、更清晰的构建 HTML 实现来获得更好的性能。或者是否希望让单页处理多种类型的问题?我可能在那里遗漏了一些东西。
    • 我正在使用插件,所以我无法更改功能,因为它不是我自己的。基本上,每个问题都有相同的答案集,这段代码循环遍历问题并打印出标签,因为我本可以进行具有多个不同答案的测试,但是在这种情况下它只有相同的答案集,但我只需要打印四个不同的答案一次,但每个循环的问题。
    • IIn这种情况下,您可以在循环之前设置$isFirst = true,然后在第一个问题和答案之前打印表头,然后设置$isFirst = false,这样它就不会再次发生。这就像您的 $isFinal 变量仅适用于第一行。
    【解决方案2】:

    我设法通过重置解决了这个问题。

    <?php if($i==0): ?>
    
    <?php foreach($question->buildAnswers() as $a => $answer): /* @var $answer WpTesting_Model_Answer */ ?>
    
    <?php $answerId = 'wpt-test-question-' . $question->getId() . '-answer-' . $answer->getId() ?>
    
    <label for="<?php echo $answerId ?>"> <?php echo $answer->getTitleOnce(); ?></label>
    
    <?php if ($isMultipleAnswers) {$answerIndex++;} ?>
    
    <?php endforeach ?>
    
    <?php $i = 1; ?>
    
    <?php endif; ?>
    

    【讨论】:

      【解决方案3】:

      实际上你做错了,因为你正在打印带有输入的标签。

      您可以先打印标签静态,然后您应该打印为

      foreach 输入显示内联

      您还可以使用表 &lt;tr&gt; &lt;td&gt; 正确对齐输入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多