首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >根据类型(文本、复选框、选择等)以适当的布局显示问题不能正常工作

根据类型(文本、复选框、选择等)以适当的布局显示问题不能正常工作
EN

Stack Overflow用户
提问于 2018-05-25 03:37:22
回答 1查看 127关注 0票数 0

我有一个用户创建自定义问题的表单。为此,用户需要引入问题(例如:接收通知?)以及字段的类型(文本、长文本、复选框、选择菜单、单选按钮)。如果用户选择一个复选框字段,选择菜单或单选按钮,他还需要介绍问题的可用选项。

在数据库中,问题被插入到问题和question_options表中,如下所示:

//问题表

id     question                    type          conference_id      
1       question1                 text                 1
2       question2                long_text             1   
3       question3                checkbox              1  
4       question4                radio_btn             1  
5       question5                select_menu            1      

//question_options表:

id     question_id                   type                
1       3                             q3op1       
2       3                              q3op2
3       4                             q4op1 
4       4                              q4op2 
5       5                              q5op1      
6       5                              q5op2      

我的疑问是如何在registration.blade.php中正确地显示输入(文本、单选按钮、复选框、选择、文本区和输入文件),这是基于存储在问题表的“类型”列中的类型。现在不能正常工作,它看起来像图像的左屏幕,但应该看起来像图像的右屏幕:

您知道为什么图像的屏幕不像右侧那样显示吗?

在问题模型中,有这个getHtmlInput方法():

  switch ($this->type) {
            case "text":
                  return "<input type='text' name='$name' val='$val' class='$class''" . ($required?:"required") . "/>";
            case "checkbox":
                return "<input type='checkbox' name='$name' class='$class''" . ($required?:"required") . "/>";
            case "radio_btn":
                return "<input type='radio' name='$name' class='$class''" . ($required?:"required") . "/>";
            case "select_menu":
                return "<select name='$name' class='$class''" . ($required?:"required") . "></select>";
            case "textarea":
                return "<textarea name='$name' class='$class''" . ($required?:"required") . "></textaera>";
        }

在registration.blade.php中,问题用以下代码表示:

@if ($allParticipants == 0)
    @foreach($selectedRtype['questions'] as $customQuestion)
        <div class="form-group">
            <label for="participant_question">{{$customQuestion->question}}</label>
            {!! $customQuestion->getHtmlInput(
            'participant_question[]',($customQuestion->pivot->required == "1") ? 'required' : '',
            $class = "form-control",
             $customtype=$customQuestion->type) !!}
        </div>
        @if($customQuestion->hasOptions())
            @foreach($customQuestion->options as $option)
                <p>{{ $option->value }}</p>
            @endforeach
        @endif
    @endforeach
@endif     

用于创建问题的QuestionController存储方法:

public function store(Request $request, $id){
    $this->validate($request, [
        'question' => 'required|max:255|string',
        'type' => 'required|max:255|string',
    ]);
    $conference = Conference::find($id);
    $question = Question::create([
        'conference_id' => $conference->id,
        'question' => $request->question,
        'type' => $request->type,
    ]);


    if(in_array($request->type, Question::$typeHasOptions)){
        foreach($request->input('questionOptions') as $questionOption) {
            QuestionOption::create([
                'question_id' => $question->id,
                'value' => $questionOption
            ]);
        }
    }
    Session::flash('success', 'Question created with success.');
    return redirect()->back();
}

型号:

//问题模型

class Question extends Model
{
    protected $fillable = [
        'question', 'type', 'conference_id',
    ];

    public static $typeHasOptions = [
        'radio_btn',
        'select_menu',
        'checkbox'
    ];

    public function ticket_types(){
        return $this->belongsToMany('App\TicketType', 'ticket_type_questions')
            ->withPivot('required');
    }

    public function options() {
        return $this->hasMany('App\QuestionOption');
    }


    public function hasOptions() {
        return in_array($this->type, self::$typeHasOptions);
    }

    public function getHtmlInput($name = "", $val = "", $required = false, $class = "", $customtype=false)
    {
        switch ($this->type) {
            case "text":
                  return "<input type='".($customtype?:"text")."' name='$name' val='$val' class='$class''" . ($required?:"required") . ">";
            case "checkbox":
                return "<input type='".($customtype?:"checkbox")."' name='$name' class='$class''" . ($required?:"required") . ">";
            case "radio_btn":
                return "<input type='".($customtype?:"radio")."' name='$name' class='$class''" . ($required?:"required") . ">";
            case "select_menu":
                return "<input type='".($customtype?:"radio")."' name='$name' class='$class''" . ($required?:"required") . ">";
            case "textarea":
                return "<input type='".($customtype?:"radio")."' name='$name' class='$class''" . ($required?:"required") . ">";
        }
    }


}

// QuestionOption模型

class QuestionOption extends Model
{
    protected $fillable = [ 'question_id', 'value' ];

    public function question() {
        return $this->belongsTo('App\Question');
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 21:55:05

代码中的错误:

class='$class''"

  • In
  • getHtmlInput中设置了两次引号getHtmlInput 3 switch中的最后一个输入是用name[]生成的,但是[]只需要radio
    • 打印输入,并且在选项循环中只打印一次值<p>{{ $option->value }}</p>
    • Using <radio>d21registration.blade.php在这种情况下没有意义,因为它应该绑定到具有唯一id的输入。

每个输入都应该有唯一的name字段。您需要在questions表中添加name字段。并在模板中用作$customQuestion->name

已修复代码的示例(未测试):

registration.blade.php

可能如下所示:

@if ($allParticipants == 0)
@foreach($selectedRtype['questions'] as $customQuestion)
    <div class="form-group">
        <div>
            {{$customQuestion->question}}
        </div>
        <div>
            @if($customQuestion->hasOptions())
                {!! $customQuestion->getHtmlInput(
                    $customQuestion->name,
                    $customQuestion->options,
                    ($customQuestion->pivot->required == '1'),
                    'form-control',
                    $customQuestion->type) 
                !!}
            @endif
        </div>        
    </div>
@endforeach
@endif

和方法getHtmlInput()

可能如下所示:

public function getHtmlInput($name = "", $options = "", $required = false, $class = "", $customtype=false)
{
    $html = '';
    $html .= $customtype == 'select_menu' ? "<select name='$name' class='$class' ".($required?:" required").">" : '';


    foreach($options as $option) {
        switch ($customtype) {
        case "text":
            $html .= "<div><input type='text' name='$name' value='".$option->value."' class='$class'" . ($required?:" required") . "></div>";
            break;
        case "checkbox":
            $html .= "<div><input type='checkbox' name='".$name."[]' value='".$option->value."' class='$class'" . ($required?:" required") . ">". $option->value."</div>";
            break;
        case "radio_btn":
            $html .= "<div><input type='radio' name='".$name."[]' class='$class'" . ($required?:" required") . "> ".$option->value."</div>";
            break;
        case "select_menu":
            $html .= "<option value='".$option->value."'>";
            break;
        case "textarea":
            $html .= "<div><textarea name='$name' class='$class'" . ($required?:" required") . ">" . $option->value . "</textarea></div>";
            break;
    }
    }

    $html .= $customtype == 'select_menu' ? "</select>" : '';

    return $html;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50516960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档