我一直在尝试开发一个基于数据库中的问题生成的动态表单,但是我在表单的验证方面遇到了很多问题。我到处搜索,但是似乎没有一个可用的表单可以工作。最有希望的解决方案是使用“each”验证器,但是当我尝试使用它时,它给了我一个“数组到字符串转换”的错误,我无法修复。如果有人知道我的代码可能有什么问题,我会很感激。这是代码,它有点混乱,因为我测试了很多东西。模型
public $file;
public $respuestaCorta = [];
/**
* {@inheritdoc}
*/
public function rules()
{
return [
[['idpregunta', 'idinscripcion', 'respuesta', "respuestaCorta"], 'required'],
[['idpregunta', 'idinscripcion'], 'integer'],
[['respuesta'], 'each', 'rule' => ['string', 'max' => 500, "message" => "Esta campo no debe tener mas de 500 caracteres"]],
[['respuestaCorta'], 'each', 'rule' => ['string', 'max' => 50, "message" => "Esta campo no debe tener mas de 50 caracteres"]],
[['file'], "file", "extensions" => ["zip", "rar", "pdf"], 'skipOnEmpty' => false, 'maxSize' => 5000000, 'tooBig' => 'El limite de archivo son de 5 mb'],
[['idpregunta'], 'exist', 'skipOnError' => true, 'targetClass' => Pregunta::className(), 'targetAttribute' => ['idpregunta' => 'id']],
[['idinscripcion'], 'exist', 'skipOnError' => true, 'targetClass' => Inscripcion::className(), 'targetAttribute' => ['idinscripcion' => 'idInscripcion']],
];
}
public function upload()
{
if ($this->validate()) {
$this->file->saveAs("../web/eventos/formularios/archivos/" . $this->file->baseName . '.' . $this->file->extension);
return true;
} else {
return false;
}
}
观
<div class="responder-formulario container">
<div class="pb-5">
<div class="card-header darkish_bg text-white">
<h3>Formulario de Pre-Inscripción</h3>
<h5>Responda con <span class="pinkish_text">cuidado</span>, no se pueden editar las respuestas.</h5>
</div>
</div>
<?php
$form = ActiveForm::begin([
'id' => 'respuestas-form',
'options' => ['class' => 'form-horizontal'],
]) ?>
<?php foreach ($preguntas as $i => $pregunta) : ?>
<div class='card mb-5'>
<div class='card-header darkish_bg text-white'>
<h5>Pregunta <?= ($i + 1) ?></h5>
</div>
<div class='card-body'>
<?= $pregunta->descripcion ?>
</div>
<div class='card-footer'>
<?php if($pregunta->tipo == 1): ?>
<?= $form->field($model, 'respuestaCorta')->textInput(['maxlength' => true])->label(false) ?>
<?php endif; ?>
<?php if($pregunta->tipo == 2): ?>
<?= $form->field($model, 'respuesta')->textarea(['maxlength' => true])->label(false) ?>
<?php endif; ?>
<?php if($pregunta->tipo == 3): ?>
<?= $form->field($model, 'file')->fileInput()->label(false) ?>
<?php endif; ?>
<?php if ($respuestaYaHechas[$i] == false) : ?>
<?php $url = Url::toRoute(["respuesta/create?id=" . $pregunta->id . "&id2=" . $idInscripcion]) ?>
<?= Html::a('Completar ' . ($i + 1), $url, [
'class' => 'btn btn-lg responderPregunta'
]); ?>
<?php else : ?>
<?php if($pregunta->tipo == 3): ?>
<span>Respuesta: <?= Html::encode($respuestaYaHechas[$i]->respuesta) ?></span>
<?php else: ?>
<span>Respuesta: <?= Html::a("Descargar", Html::encode($respuestaYaHechas[$i]->respuesta), ['class' => 'btn btn-lg btn-outline-success']) ?></span>
<?php endif; ?>
<?php endif; ?>
</div>
</div>
<?php endforeach; ?>
<?php ActiveForm::end() ?>
<br><br>
<?= Html::a('Volver Atrás', Url::toRoute("eventos/ver-evento/" . $evento->nombreCortoEvento), ['class' => 'btn btn-lg btn-outline-success']); ?>
控制器
public function actionResponderFormulario($slug) {
$evento = $this->findModel("", $slug);
$inscripcion = Inscripcion::find()->where(["idEvento" => $evento->idEvento, "idUsuario" => Yii::$app->user->identity->idUsuario])
->andWhere(["<>", "estado", 1])
->andWhere(["<>", "estado", 2])
->one();
if ($inscripcion != null) {
$preguntas = Pregunta::find()->where(["idEvento" => $evento->idEvento])->all();
$respuestaYaHechas = [];
foreach ($preguntas as $pregunta){
$respuesta = RespuestaSearch::find()->where(["idpregunta" => $pregunta->id, "idinscripcion" => $inscripcion->idInscripcion])->one();
if($respuesta == null){
array_push($respuestaYaHechas, false);
}else{
array_push($respuestaYaHechas, $respuesta);
}
}
$model = new RespuestaTest();
return $this->render('responderFormulario',
["preguntas" => $preguntas,
"evento" => $evento,
"idInscripcion" => $inscripcion->idInscripcion,
"respuestaYaHechas" => $respuestaYaHechas,
"model" => $model]);
} else {
return $this->goHome();
}
}
谢谢你
2条答案
按热度按时间ecr0jaav1#
我解决了它,这是一个非常容易的事情。
我需要将输入中的名称声明为数组:
k5hmc34c2#
放入规则名称=您的属性==〉
和用于验证每个属性自定义函数