Yii2 modèle d'enregistrement actif ne pas enregistrer les données
J'ai construit un formulaire simple modèle & vue, un simple modèle AR, et un contrôleur simple. Le formulaire modèle attribue les valeurs correctes pour l'AR exemple, mais quand j'ai appeler la méthode save(), aucun de ces valeurs sont enregistrées dans la base de données. Des idées?
Le modèle de formulaire de:
<?php
namespace app\models;
use Yii;
use yii\base\Model;
class PromptForm extends Model
{
public $name;
public $intro;
public $prompt;
public $notes;
public $questions;
public function attributeLabels()
{
return [
'name' => 'Prompt title',
'intro' => 'Intro',
'prompt' => 'Prompt body',
'notes' => 'Closing notes',
'questions' => 'Exploration questions',
];
}
/**
* @return array the validation rules.
*/
public function rules()
{
return [
[['name', 'prompt'], 'required'],
['name', 'filter', 'filter' => 'trim'],
['name', 'string', 'max' => 255],
[['intro', 'prompt', 'notes', 'questions'], 'default'],
];
}
public function post()
{
if ($this->validate()) {
$prompt = new Prompt();
$prompt->name = $this->name;
$prompt->intro = $this->intro;
$prompt->prompt = $this->prompt;
$prompt->notes = $this->notes;
$prompt->questions = $this->questions;
$prompt->author = \Yii::$app->user->getId();
//die(print_r($prompt, TRUE));
$prompt->save();
return $prompt;
}
return null;
}
}
Le modèle AR:
<?php
namespace app\models;
use Yii;
use yii\db\ActiveRecord;
/**
* Prompt is the model behind the prompt item.
*/
class Prompt extends ActiveRecord
{
public $name;
public $intro;
public $prompt;
public $notes;
public $questions;
public $status;
public $author;
public $id;
/**
* @return string the name of the table associated with this ActiveRecord class.
*/
public static function tableName()
{
return 'prompt';
}
/**
* @return array the attribute labels.
*/
public function attributeLabels()
{
return [
'name' => 'Prompt title',
'intro' => 'Intro',
'prompt' => 'Prompt body',
'notes' => 'Closing notes',
'questions' => 'Exploration questions',
'status' => 'Status',
'author' => 'Author ID',
];
}
}
Le contrôleur:
<?php
namespace app\controllers;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\PromptForm;
use app\models\Prompt;
class PromptsController extends Controller
{
public function actionIndex()
{
//Return a list of all prompts:
return $this->render('index');
}
public function actionNew()
{
if (\Yii::$app->user->isGuest) {
return $this->goHome();
}
$model = new PromptForm();
if ($model->load(Yii::$app->request->post())) {
if ($prompt = $model->post()) {
Yii::$app->getSession()->setFlash('success', 'Your prompt was created successfully!');
return $this->goHome();
} else {
Yii::$app->getSession()->setFlash('error', 'Error while submitting your prompt.');
}
}
return $this->render('create', [
'model' => $model,
]);
}
}
source d'informationauteur Tal V. | 2014-11-09
Vous devez vous connecter pour publier un commentaire.
Bon, j'ai tout compris. S'avère que si vous déclarez public attributs dans votre ActiveRecord modèle, ils occultent les attributs automatiques qui sont créés par AR. Données sera affectée à votre occultant les attributs, mais n'est pas envoyé dans la base de données.
Le bon modèle AR doit avoir été tout simplement ceci:
Essayer
Utilisation
Si cela fonctionne cela signifie que certaines des règles de validation échoue.
Contrôleur, changer votre condition si comme suit :
Cela permettra de valider le fait que la valeur de retour n'est pas null.
Votre condition de validation est seulement de la validation d'où la valeur est assignée à la variable $invite ou pas. Et c'est pourquoi il est retourne toujours true.
J'ai couru à travers le même problème récemment, lorsque je combine l'Enregistrement Actif de la classe avec La classe du Modèle. Parce que je sais que l'AR s'étend en fait de Modèle dans Yii2. Pourquoi ne pas écrire moins de code.J'ai donc déplacer le code à partir du Modèle à l'AR.
Mais l'AR du _attribute n'ai pas le post de données dans le formulaire. les données du formulaire est en fait dans un Modèle objet.
il suffit de supprimer l'attribut public que vous voulez de masse de céder à l'AR instance de le faire fonctionner.