我一直在尝试开发一种基于数据库中的问题生成的动态表单,但是我在表单验证方面遇到了很多问题。我到处搜索,但似乎没有可用的。最有希望的解决方案是使用"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();
}
}
谢谢
我解决了,这是一件非常简单的事情。
我需要将输入中的名称声明为数组:
<?= $form->field($model, 'respuestaCorta[$i]')->textInput(['maxlength' => true])->label(false) ?>
输入规则名称= 你的属性 ==>
[['name'], 'eachAlphaNumeric'],
和用于验证每个属性的自定义函数
public function eachAlphaNumeric($attribute)
{
$alphaNumeric = true;
$arr = explode(',', $this->$attribute);
foreach ($arr as $key) {
if (preg_match("/^[a-zA-Z0-9]*$/", $key) != 1 || in_array($key, ['NA', 'NULL', 'nill'])) {
$alphaNumeric = false;
$this->addError($attribute, 'invalid_value');
break;
}
}
return $alphaNumeric;
}