yii 2.0 framework trying to show search results - php

I have a submit form with one field called case_no, when I enter in the case_no it should then populate the table with that specific information that matched the case_no.
Controller:
public function actionSearch()
{
$model = new LegalCase();
$category = new Category();
/*$categories = Category::findAll();*/
if ($model->load(Yii::$app->request->post())) {
Yii::$app->session->setFlash('searchFormSubmitted');
$case = $model->findByCaseNo($case_no);
return $this->render('search', [
'model' => $model,
'dataProvider' => $model->findAll(),
'results' => $case
]);
return $this->refresh();
} else {
return $this->render('search', [
'model' => $model,
]);
}
}
Model:
class LegalCase extends Model
{
public $id;
public $case_no;
public $name;
public $judgement_date;
public $year;
public $neutral_citation;
private static $cases = [
'100' => [
'id' => '1',
'case_no' => '3',
'name' => 'first case'
],
'101' => [
'id' => '1',
'case_no' => '125',
'name' => 'second case'
],
];
/**
* #inheritdoc
*/
public static function findAll()
{
//$query = new Query();
$provider = new ArrayDataProvider([
'allModels' => self::$cases,
'sort' => [
'attributes' => ['id', 'case_no', 'name'],
],
'pagination' => [
'pageSize' => 10,
],
]);
return $provider->getModels();
}
/**
* #inheritdoc
*/
public static function findIdentity($id)
{
return isset(self::$cases[$id]) ? new static(self::$cases[$id]) : null;
}
/**
* Finds case by name
*
* #param string $name
* #return static|null
*/
/**
* Finds case by number
*
* #param string $case_no
* #return static|null
*/
public static function findByCaseNo($case_no)
{
foreach (self::$cases as $case) {
if (strcasecmp($case['case_no'], $case_no) === 0) {
return new static($case);
}
}
return null;
}
View:
<?php
use yii\helpers\ArrayHelper;
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use yii\widgets\ListView;
use app\models\LegalCase;
use backend\models\Standard;
/* #var $this yii\web\View */
/* #var $form yii\bootstrap\ActiveForm */
/* #var $model app\models\LegalCase */
$this->title = 'Search';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="site-login">
<h1><?= Html::encode($this->title) ?></h1>
<p>Please fill out the following fields to login:</p>
<?php $form = ActiveForm::begin([
'id' => 'search-form',
'options' => ['class' => 'form-horizontal'],
'fieldConfig' => [
'template' => "{label}\n<div class=\"col-lg-3\">{input} </div>\n<div class=\"col-lg-8\">{error}</div>",
'labelOptions' => ['class' => 'col-lg-1 control-label'],
],
]); ?>
<?= $form->field($model, 'case_no') ?>
<?= $form->field($model, 'name') ?>
<?php /*= Html::activeDropDownList($model, 's_id',
ArrayHelper::map(Standard::find()->all(), 's_id', 'name'))*/ ?>
<?php
?>
<div class="form-group">
<div class="col-lg-offset-1 col-lg-11">
<?= Html::submitButton('Search', ['class' => 'btn btn-primary', 'name' => 'search-button']) ?>
</div>
</div>
<?php if (Yii::$app->session->hasFlash('searchFormSubmitted')) { ?>
<table class="table table-striped">
<tr>
<th>ID</th>
<th>case_no</th>
<th>name</th>
</tr>
</table>
<?php //$posts = $results->getModels();
foreach($results as $case){
echo '<tr>';
//print_r($case);
echo $case;
//echo $case->id;
/*echo '<td>' . $post['id'] . '</td>';
echo '<td>' . $post['case_no'] . '</td>';
echo '<td>' . $post['name'] . '</td>';*/
echo '</tr>';
} ?>
Any idea why this is not working?

Use $_POST['LegalCase']['case_no'] instead of $case_no.
EDIT: note: I'm using an older version of Yii so things might have changed.

You need to do this:
$case = $model->findByCaseNo($model->case_no);
But your attribute $case_no will be empty after the form submit. This happened because attribute is not safe. Function load() set only safe model attributes. If you want to load model attributes after submit you need to add validation to the LegalCase model. For example:
public function rules()
{
return [
['case_no', 'trim'],
];
}

Related

Form doesn't get submitted in yii2

I'm using yii2 advanced app and im stuck at a point where my form doesn't get submitted. It refreshes and stays on the same page. There are no errors shown too.
Here is the model code Countries.php
<?php
namespace backend\models\base;
use Yii;
use yii\behaviors\TimestampBehavior;
use yii\behaviors\BlameableBehavior;
use mootensai\behaviors\UUIDBehavior;
/**
* This is the base model class for table "countries".
*
* #property integer $id
* #property string $sortname
* #property string $name
* #property integer $phonecode
* #property integer $created_at
* #property integer $updated_at
* #property integer $created_by
* #property integer $updated_by
* #property integer $deleted_at
* #property integer $deleted_by
*
* #property \backend\models\States[] $states
*/
class Countries extends \yii\db\ActiveRecord
{
use \mootensai\relation\RelationTrait;
private $_rt_softdelete;
private $_rt_softrestore;
public function __construct(){
parent::__construct();
$this->_rt_softdelete = [
'deleted_by' => \Yii::$app->user->id,
'deleted_at' => date('Y-m-d H:i:s'),
];
$this->_rt_softrestore = [
'deleted_by' => 0,
'deleted_at' => date('Y-m-d H:i:s'),
];
}
/**
* This function helps \mootensai\relation\RelationTrait runs faster
* #return array relation names of this model
*/
public function relationNames()
{
return [
'states'
];
}
/**
* #inheritdoc
*/
public function rules()
{
return [
[['sortname', 'name', 'phonecode'], 'required'],
[['phonecode', 'created_at', 'updated_at', 'created_by', 'updated_by', 'deleted_at', 'deleted_by'], 'integer'],
[['sortname'], 'string', 'max' => 3],
[['name'], 'string', 'max' => 150],
[['lock'], 'default', 'value' => '0'],
[['lock'], 'mootensai\components\OptimisticLockValidator']
];
}
/**
* #inheritdoc
*/
public static function tableName()
{
return 'countries';
}
/**
*
* #return string
* overwrite function optimisticLock
* return string name of field are used to stored optimistic lock
*
*/
public function optimisticLock() {
return 'lock';
}
/**
* #inheritdoc
*/
public function attributeLabels()
{
return [
'id' => Yii::t('app', 'ID'),
'sortname' => Yii::t('app', 'Sortname'),
'name' => Yii::t('app', 'Name'),
'phonecode' => Yii::t('app', 'Phonecode'),
];
}
/**
* #return \yii\db\ActiveQuery
*/
public function getStates()
{
return $this->hasMany(\backend\models\States::className(), ['country_id' => 'id']);
}
/**
* #inheritdoc
* #return array mixed
*/
public function behaviors()
{
return [
'timestamp' => [
'class' => TimestampBehavior::className(),
'createdAtAttribute' => 'created_at',
'updatedAtAttribute' => 'updated_at',
'value' => new \yii\db\Expression('NOW()'),
],
'blameable' => [
'class' => BlameableBehavior::className(),
'createdByAttribute' => 'created_by',
'updatedByAttribute' => 'updated_by',
],
'uuid' => [
'class' => UUIDBehavior::className(),
'column' => 'id',
],
];
}
/**
* #inheritdoc
* #return \backend\models\query\CountriesQuery the active query used by this AR class.
*/
public static function find()
{
$query = new \backend\models\query\CountriesQuery(get_called_class());
return $query->where(['countries.deleted_by' => 0]);
}
}
And the controller CountriesController.php
<?php
namespace backend\controllers;
use Yii;
use backend\models\Countries;
use backend\models\search\CountriesSearch;
use backend\controllers\BackendController;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
/**
* CountriesController implements the CRUD actions for Countries model.
*/
class CountriesController extends BackendController
{
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
],
'access' => [
'class' => \yii\filters\AccessControl::className(),
'rules' => [
[
'allow' => true,
'actions' => ['index', 'view', 'create', 'update', 'delete', 'pdf', 'save-as-new','add-states'],
'roles' => ['admin']
],
[
'allow' => false
]
]
]
];
}
/**
* Lists all Countries models.
* #return mixed
*/
public function actionIndex()
{
$searchModel = new CountriesSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
/**
* Displays a single Countries model.
* #param integer $id
* #return mixed
*/
public function actionView($id)
{
$model = $this->findModel($id);
$providerStates = new \yii\data\ArrayDataProvider([
'allModels' => $model->states,
]);
return $this->render('view', [
'model' => $this->findModel($id),
'providerStates' => $providerStates,
]);
}
/**
* Creates a new Countries model.
* If creation is successful, the browser will be redirected to the 'view' page.
* #return mixed
*/
public function actionCreate()
{
$model = new Countries();
if ($model->loadAll(Yii::$app->request->post()) && $model->saveAll()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
/**
* Updates an existing Countries model.
* If update is successful, the browser will be redirected to the 'view' page.
* #param integer $id
* #return mixed
*/
public function actionUpdate($id)
{
if (Yii::$app->request->post('_asnew') == '1') {
$model = new Countries();
}else{
$model = $this->findModel($id);
}
if ($model->loadAll(Yii::$app->request->post()) && $model->saveAll()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('update', [
'model' => $model,
]);
}
}
/**
* Deletes an existing Countries model.
* If deletion is successful, the browser will be redirected to the 'index' page.
* #param integer $id
* #return mixed
*/
public function actionDelete($id)
{
$this->findModel($id)->deleteWithRelated();
return $this->redirect(['index']);
}
/**
*
* Export Countries information into PDF format.
* #param integer $id
* #return mixed
*/
public function actionPdf($id) {
$model = $this->findModel($id);
$providerStates = new \yii\data\ArrayDataProvider([
'allModels' => $model->states,
]);
$content = $this->renderAjax('_pdf', [
'model' => $model,
'providerStates' => $providerStates,
]);
$pdf = new \kartik\mpdf\Pdf([
'mode' => \kartik\mpdf\Pdf::MODE_CORE,
'format' => \kartik\mpdf\Pdf::FORMAT_A4,
'orientation' => \kartik\mpdf\Pdf::ORIENT_PORTRAIT,
'destination' => \kartik\mpdf\Pdf::DEST_BROWSER,
'content' => $content,
'cssFile' => '#vendor/kartik-v/yii2-mpdf/assets/kv-mpdf-bootstrap.min.css',
'cssInline' => '.kv-heading-1{font-size:18px}',
'options' => ['title' => \Yii::$app->name],
'methods' => [
'SetHeader' => [\Yii::$app->name],
'SetFooter' => ['{PAGENO}'],
]
]);
return $pdf->render();
}
/**
* Creates a new Countries model by another data,
* so user don't need to input all field from scratch.
* If creation is successful, the browser will be redirected to the 'view' page.
*
* #param mixed $id
* #return mixed
*/
public function actionSaveAsNew($id) {
$model = new Countries();
if (Yii::$app->request->post('_asnew') != '1') {
$model = $this->findModel($id);
}
if ($model->loadAll(Yii::$app->request->post()) && $model->saveAll()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('saveAsNew', [
'model' => $model,
]);
}
}
/**
* Finds the Countries model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* #param integer $id
* #return Countries the loaded model
* #throws NotFoundHttpException if the model cannot be found
*/
protected function findModel($id)
{
if (($model = Countries::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException(Yii::t('app', 'The requested page does not exist.'));
}
}
/**
* Action to load a tabular form grid
* for States
* #author Yohanes Candrajaya <moo.tensai#gmail.com>
* #author Jiwantoro Ndaru <jiwanndaru#gmail.com>
*
* #return mixed
*/
public function actionAddStates()
{
if (Yii::$app->request->isAjax) {
$row = Yii::$app->request->post('States');
if((Yii::$app->request->post('isNewRecord') && Yii::$app->request->post('_action') == 'load' && empty($row)) || Yii::$app->request->post('_action') == 'add')
$row[] = [];
return $this->renderAjax('_formStates', ['row' => $row]);
} else {
throw new NotFoundHttpException(Yii::t('app', 'The requested page does not exist.'));
}
}
}
and the view file create.php
<?php
use yii\helpers\Html;
/* #var $this yii\web\View */
/* #var $model backend\models\Apps */
$this->title = Yii::t('app', 'Create Apps');
?>
<div class="uk-container uk-container-small uk-position-relative">
<div><!----> <div>
<h1 id="navbar" class="uk-h2 tm-heading-fragment">
Apps
</h1>
<!-- Start Breadcrumb -->
<ul class="uk-breadcrumb">
<li><?= Html::a('Admin', ['/'])?></li>
<li><?= Html::a('Apps', ['/apps'])?></li>
<li>Create</li>
</ul>
<!-- End Breadcrumb -->
<?= $this->render('_form', [
'model' => $model,
]) ?>
</div>
and view _form.php
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use alexeevdv\widget\SluggableInputWidget;
use dosamigos\ckeditor\CKEditor;
/* #var $this yii\web\View */
/* #var $model backend\models\Apps */
/* #var $form yii\widgets\ActiveForm */
?>
<div class="uk-margin-auto">
<?php $form = ActiveForm::begin(); ?>
<?= $form->errorSummary($model); ?>
<?= $form->field($model, 'title')->textInput(['maxlength' => true, 'placeholder' => 'Title']) ?>
<?= $form->field($model, 'slug')->widget(SluggableInputWidget::className(), [
'dependsOn' => 'title',
]); ?>
<?= $form->field($model, 'content')->widget(CKEditor::className(), [
'options' => ['rows' => 6],
'preset' => 'basic',
'clientOptions' => [
'filebrowserImageBrowseUrl' => yii\helpers\Url::to(['imagemanager/manager', 'view-mode'=>'iframe', 'select-type'=>'ckeditor']),
]
]);?>
<?= $form->field($model, 'video')->textInput(['maxlength' => true, 'placeholder' => 'Video']) ?>
<?= $form->field($model, 'category')->widget(\kartik\widgets\Select2::classname(), [
'data' => \yii\helpers\ArrayHelper::map(\backend\models\Categories::find()->orderBy('id')->asArray()->all(), 'id', 'name'),
'options' => ['placeholder' => Yii::t('app', 'Choose a category')],
'pluginOptions' => [
'allowClear' => true
],
]); ?>
<?= $form->field($model, 'status')->textInput(['placeholder' => 'Status']) ?>
<div class="form-group">
<?php if(Yii::$app->controller->action->id != 'save-as-new'): ?>
<?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn uk-button uk-button-primary' : 'btn uk-button uk-button-primary']) ?>
<?php endif; ?>
<?php if(Yii::$app->controller->action->id != 'create'): ?>
<?= Html::submitButton(Yii::t('app', 'Save As New'), ['class' => 'btn uk-button uk-button-default', 'value' => '1', 'name' => '_asnew']) ?>
<?php endif; ?>
<?= Html::a(Yii::t('app', 'Cancel'), Yii::$app->request->referrer , ['class'=> 'btn uk-button uk-button-danger']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
I've browsed few articles, but of no help. My form has a <?php ActiveForm::end(); ?> at the end of the form. I also tried to remove the select2 widget but i still get the same issue. Could someone help me out why this is happening?
Html output rendered of create.php
<div class="uk-container uk-container-small uk-position-relative">
<div><!----> <div>
<h1 id="navbar" class="uk-h2 tm-heading-fragment">
Countries
</h1>
<!-- Start Breadcrumb -->
<ul class="uk-breadcrumb">
<li>Admin</li>
<li>Countries</li>
<li>Create</li>
</ul>
<!-- End Breadcrumb -->
<div class="uk-margin-auto">
<form id="w0" action="/final/backend/en-us/countries/create" method="post">
<input type="hidden" name="_csrf" value="zIvM0awWY3XpcrF1kY6gFY00ghnL1cgwTYhaEqF7RO2hch4x5AznMwtfWxWp4D-YW9yJy5aiNupb0JnMSbi5qQ==">
<div class="error-summary" style="display:none"><p>Please fix the following errors:</p><ul></ul></div>
<div class="form-group field-countries-id">
<input type="text" id="countries-id" class="form-control" name="Countries[id]" style="display:none">
</div>
<div class="form-group field-countries-sortname required">
<label class="control-label" for="countries-sortname">Sortname</label>
<input type="text" id="countries-sortname" class="form-control" name="Countries[sortname]" maxlength="3" placeholder="Sortname" aria-required="true">
<div class="help-block"></div>
</div>
<div class="form-group field-countries-name required">
<label class="control-label" for="countries-name">Name</label>
<input type="text" id="countries-name" class="form-control" name="Countries[name]" maxlength="150" placeholder="Name" aria-required="true">
<div class="help-block"></div>
</div>
<div class="form-group field-countries-phonecode required">
<label class="control-label" for="countries-phonecode">Phonecode</label>
<input type="text" id="countries-phonecode" class="form-control" name="Countries[phonecode]" placeholder="Phonecode" aria-required="true">
<div class="help-block"></div>
</div>
<div id="w3-container" class=" tabs-above tab-align-left tabs-krajee"><ul id="w3" class="nav nav-tabs nav nav-tabs hidden-print" data-krajee-tabsx="tabsX_0b4b2adf" role="tablist"><li class="active"><i class="glyphicon glyphicon-book"></i> States</li></ul>
<div class="tab-content printable"><div class="h3 visible-print-block"><i class="glyphicon glyphicon-book"></i> States</div>
<div id="w3-tab0" class="tab-pane fade in active"><div class="form-group" id="add-states">
<div id="w1" class="grid-view hide-resize" data-krajee-grid="kvGridInit_7fee31f2"><div class="panel panel-default">
<div class="rc-handle-container" style="width: 628px;"><div class="rc-handle" style="left: 50px; height: 37px;"></div><div class="rc-handle" style="left: 496px; height: 37px;"></div></div><div id="w1-container" class="table-responsive kv-grid-container"><table class="kv-grid-table table table-hover kv-table-wrap"><thead>
<tr><th class="kv-align-center kv-align-middle" style="width: 7.96%;" data-col-seq="0">#</th><th class="kv-align-top kv-grid-hide" data-col-seq="1">Id</th><th class="kv-align-top" data-col-seq="2" style="width: 71.02%;">Name</th><th class="kv-align-middle" data-col-seq="3" style="width: 21.02%;"></th></tr>
</thead>
<tbody>
<tr><td colspan="4"><div class="empty">No results found.</div></td></tr>
</tbody></table></div>
<div class="kv-panel-after"><button type="button" class="btn btn-success kv-batch-create" onclick="addRowStates()"><i class="fa fa-plus"></i>Add States</button></div>
</div></div> </div>
</div>
</div></div> <div class="form-group">
<button type="submit" class="uk-button uk-button-primary">Create</button> <a class="uk-button uk-button-danger">Cancel</a> </div>
</form>
</div>
</div>
</div>
</div>
Changing loadAll() and saveAll() to load() and save() has solved the issue
<?php
namespace backend\controllers;
use Yii;
use backend\models\Countries;
use backend\models\search\CountriesSearch;
use backend\controllers\BackendController;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
/**
* CountriesController implements the CRUD actions for Countries model.
*/
class CountriesController extends BackendController
{
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
],
'access' => [
'class' => \yii\filters\AccessControl::className(),
'rules' => [
[
'allow' => true,
'actions' => ['index', 'view', 'create', 'update', 'delete', 'pdf', 'save-as-new','add-states'],
'roles' => ['admin']
],
[
'allow' => false
]
]
]
];
}
/**
* Lists all Countries models.
* #return mixed
*/
public function actionIndex()
{
$searchModel = new CountriesSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
/**
* Displays a single Countries model.
* #param integer $id
* #return mixed
*/
public function actionView($id)
{
$model = $this->findModel($id);
$providerStates = new \yii\data\ArrayDataProvider([
'allModels' => $model->states,
]);
return $this->render('view', [
'model' => $this->findModel($id),
'providerStates' => $providerStates,
]);
}
/**
* Creates a new Countries model.
* If creation is successful, the browser will be redirected to the 'view' page.
* #return mixed
*/
public function actionCreate()
{
$model = new Countries();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
/**
* Updates an existing Countries model.
* If update is successful, the browser will be redirected to the 'view' page.
* #param integer $id
* #return mixed
*/
public function actionUpdate($id)
{
if (Yii::$app->request->post('_asnew') == '1') {
$model = new Countries();
}else{
$model = $this->findModel($id);
}
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('update', [
'model' => $model,
]);
}
}
/**
* Deletes an existing Countries model.
* If deletion is successful, the browser will be redirected to the 'index' page.
* #param integer $id
* #return mixed
*/
public function actionDelete($id)
{
$this->findModel($id)->deleteWithRelated();
return $this->redirect(['index']);
}
/**
*
* Export Countries information into PDF format.
* #param integer $id
* #return mixed
*/
public function actionPdf($id) {
$model = $this->findModel($id);
$providerStates = new \yii\data\ArrayDataProvider([
'allModels' => $model->states,
]);
$content = $this->renderAjax('_pdf', [
'model' => $model,
'providerStates' => $providerStates,
]);
$pdf = new \kartik\mpdf\Pdf([
'mode' => \kartik\mpdf\Pdf::MODE_CORE,
'format' => \kartik\mpdf\Pdf::FORMAT_A4,
'orientation' => \kartik\mpdf\Pdf::ORIENT_PORTRAIT,
'destination' => \kartik\mpdf\Pdf::DEST_BROWSER,
'content' => $content,
'cssFile' => '#vendor/kartik-v/yii2-mpdf/assets/kv-mpdf-bootstrap.min.css',
'cssInline' => '.kv-heading-1{font-size:18px}',
'options' => ['title' => \Yii::$app->name],
'methods' => [
'SetHeader' => [\Yii::$app->name],
'SetFooter' => ['{PAGENO}'],
]
]);
return $pdf->render();
}
/**
* Creates a new Countries model by another data,
* so user don't need to input all field from scratch.
* If creation is successful, the browser will be redirected to the 'view' page.
*
* #param mixed $id
* #return mixed
*/
public function actionSaveAsNew($id) {
$model = new Countries();
if (Yii::$app->request->post('_asnew') != '1') {
$model = $this->findModel($id);
}
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('saveAsNew', [
'model' => $model,
]);
}
}
/**
* Finds the Countries model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* #param integer $id
* #return Countries the loaded model
* #throws NotFoundHttpException if the model cannot be found
*/
protected function findModel($id)
{
if (($model = Countries::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException(Yii::t('app', 'The requested page does not exist.'));
}
}
/**
* Action to load a tabular form grid
* for States
* #author Yohanes Candrajaya <moo.tensai#gmail.com>
* #author Jiwantoro Ndaru <jiwanndaru#gmail.com>
*
* #return mixed
*/
public function actionAddStates()
{
if (Yii::$app->request->isAjax) {
$row = Yii::$app->request->post('States');
if((Yii::$app->request->post('isNewRecord') && Yii::$app->request->post('_action') == 'load' && empty($row)) || Yii::$app->request->post('_action') == 'add')
$row[] = [];
return $this->renderAjax('_formStates', ['row' => $row]);
} else {
throw new NotFoundHttpException(Yii::t('app', 'The requested page does not exist.'));
}
}
}
Thank you #aendeerei for the quick help!

Yii2 - using 2 models in 1 view

I tried using 2 models in 1 view, but the fields I added are "(not set)" but they're deffinetly set in the database so what did i do wrong
Here you see the result of the added fields
here is the view code:
<?php
use yii\helpers\Html;
use yii\widgets\DetailView;
use app\models\Facturen;
/* #var $this yii\web\View */
/* #var $model app\models\Facturen */
/* #var $modelProducten app\models\Producten */
$this->title = $model->factuur_id;
$this->params['breadcrumbs'][] = ['label' => 'Factures', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="facturen-view">
<h1><?= Html::encode($this->title) ?></h1>
<p>
<?= Html::a('Update', ['update', 'id' => $model->factuur_id], ['class' => 'btn btn-primary']) ?>
<?= Html::a('Delete', ['delete', 'id' => $model->factuur_id], [
'class' => 'btn btn-danger',
'data' => [
'confirm' => 'Are you sure you want to delete this item?',
'method' => 'post',
],
]) ?>
</p>
<?= DetailView::widget([
'model' => $model,
'modelProducten' => $modelProducten,
'attributes' => [
'factuur_id',
'company.company_name',
'person.first_name',
'product.product_id',
'product.product_name',
'product.amount',
'product.price',
'date',
],
]) ?>
</div>
also the create code might be usefull
public function actionCreate()
{
$model = new Facturen();
$modelProducten = [new Producten];
if ($model->load(Yii::$app->request->post())) {
$transaction = Yii::$app->db->beginTransaction();
$success = true;
$modelProducten = Model::createMultiple(Producten::classname());
Model::loadMultiple($modelProducten, Yii::$app->request->post());
if ($model->save()) {
foreach($modelProducten as $modelProduct) {
$modelProduct->factuur_id = $model->factuur_id;
if (! $modelProduct->save()) {
$success = false;
break;
}
}
} else {
$success = false;
}
if ($success) {
$transaction->commit();
return $this->redirect(['view', 'id' => $model->factuur_id]);
} else {
Yii::$app->session->setFlash('danger', 'Kan niet opslaan, validate errors');
}
}
return $this->render('create', [
'model' => $model,
'modelProducten' => (empty($modelProducten)) ? [new Producten] : $modelProducten
]);
}
if you need any extra code just ask I'll provide it!
hopefully you guys understand the problem and are able to help me out
~ edit ~
#Gunnrryy
the relations are here
also the person works totaly fine only the "Producten" fields don't work
the Facturen model Code
<?php
namespace app\models;
use Yii;
/**
* This is the model class for table "facturen".
*
* #property integer $factuur_id
* #property string $date
* #property integer $company_id
* #property integer $person_id
*
* #property Companies $company
* #property Spokepersons $person
* #property Producten[] $productens
*/
class Facturen extends \yii\db\ActiveRecord
{
/**
* #inheritdoc
*/
public static function tableName()
{
return 'facturen';
}
/**
* #inheritdoc
*/
public function rules()
{
return [
[['date', 'company_id', 'person_id'], 'required'],
[['date'], 'string', 'max' => 64],
[['company_id', 'person_id'], 'integer'],
[['company_id'], 'exist', 'skipOnError' => true, 'targetClass' => Companies::className(), 'targetAttribute' => ['company_id' => 'company_id']],
[['person_id'], 'exist', 'skipOnError' => true, 'targetClass' => Spokepersons::className(), 'targetAttribute' => ['person_id' => 'person_id']],
];
}
/**
* #inheritdoc
*/
public function attributeLabels()
{
return [
'factuur_id' => 'Factuurnummer',
'date' => 'Factuurdatum',
'company_id' => 'Bedrijfsnaam',
'person_id' => 'Contactpersoon',
];
}
/**
* #return \yii\db\ActiveQuery
*/
public function getCompany()
{
return $this->hasOne(Companies::className(), ['company_id' => 'company_id']);
}
/**
* #return \yii\db\ActiveQuery
*/
public function getPerson()
{
return $this->hasOne(Spokepersons::className(), ['person_id' => 'person_id']);
}
/**
* #return \yii\db\ActiveQuery
*/
public function getProduct()
{
return $this->hasMany(Producten::className(), ['factuur_id' => 'factuur_id']);
}
}
do the fact you already have function for relation you could add a getter for the related field you neeed
eg for company name you could add this function in you Facturen model
/* Getter for Company name name */
public function getCompanyName() {
return $this->company->company_name;
}
then in detail view you can simply companyName
<?= DetailView::widget([
'model' => $model,
'modelProducten' => $modelProducten,
'attributes' => [
'factuur_id',
'companyName',
'date',
],
]) ?>

missing id passed in urlindent

I am trying to upload file on server and to view the file uploaded I have to pass the model id to the view action. It is all good untill I add
'options' => ['enctype'=>'multipart/form-data']
to my ActiveForm. After I add it the id passed to the action view by URL doesn't show anymore and I get missing parameter message.
i am using yii 2.0.2
Create action:
public function actionCreate()
{
$model = new SubContent();
if ($model->load(Yii::$app->request->post()) ) {
//$fileName = $model->id;
$model->save();
$fileName = $model->id;
$files =UploadedFile::getInstance($model,'files');
$files->saveAs( 'uploads/'.$files->getBaseName().'.'.$files->getExtension());
$model->files=$files;
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
Form:
<div class="sub-content-form">
<?php $form = ActiveForm::begin(['options' => ['enctype'=>'multipart/form-data']]); ?>
<?= $form->field($model, 'files')->fileInput(['maxlength' => 255]) ?>
<?= $form->field($model, 'sub_id')
->dropDownList(ArrayHelper::map(Subjects::find()
->where(['year'=>\Yii::$app->user->identity->year])
->all(),'id','sub_name'),
['prompt'=>' select subject']
) ?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
and this is my model
<?php
namespace frontend\models;
use Yii;
/**
* This is the model class for table "sub_content".
*
* #property integer $id
* #property string $files
* #property integer $sub_id
*
* #property Subjects $sub
*/
class SubContent extends \yii\db\ActiveRecord
{
/**
* #inheritdoc
*/
public static function tableName()
{
return 'sub_content';
}
public function rules()
{
return [
[['files', 'sub_id'], 'required'],
[['sub_id'], 'integer'],
[['files'], 'string', 'max' => 255]
];
}
public function attributeLabels()
{
return [
'id' => 'ID',
'files' => 'Files',
'sub_id' => 'Sub ID',
];
}
/**
* #return \yii\db\ActiveQuery
*/
public function getSub()
{
return $this->hasOne(Subjects::className(), ['id' =>
'sub_id']);
}
}
edited..... still didnt work
First of all - since 2.0.8 you don't have to add enctype, it's done automatically when you add fileInput field.
You are not verifying if $model->save() returned true and it looks like that model did not pass validation and because of that $model is not saved and because of that $model->id is not set.
You should do something like:
public function actionCreate()
{
$model = new SubContent();
if ($model->load(Yii::$app->request->post()) ) {
$model->files = UploadedFile::getInstance($model,'files');
if ($model->save()) {
$model->files->saveAs('uploads/' . $files->getBaseName() . '.' . $files->getExtension());
return $this->redirect(['view', 'id' => $model->id]);
}
}
return $this->render('create', ['model' => $model]);
}
For this to work you need to set proper validation rules in SubContent model.

How to upload file in Yii along with form data?

I'm stuck at a problem where in I need to upload two different files (e.g. one of type jpg and the other of the type pdf/epub) along with the additional form data.
The form data should be uploaded to a database along with the path of the files and the files should be saved inside a directory.
Any help would be appreciated.
BooksController.php
<?php
namespace backend\controllers;
use backend\models\Books;
use Yii;
use yii\data\ActiveDataProvider;
use yii\filters\VerbFilter;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\web\UploadedFile;
/**
* BooksController implements the CRUD actions for Books model.
*/
class BooksController extends Controller
{
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
],
],
];
}
/**
* Lists all Books models.
* #return mixed
*/
public function actionIndex()
{
$dataProvider = new ActiveDataProvider([
'query' => Books::find(),
]);
return $this->render('index', [
'dataProvider' => $dataProvider,
]);
}
/**
* Displays a single Books model.
* #param integer $id
* #return mixed
*/
public function actionView($id)
{
return $this->render('view', [
'model' => $this->findModel($id),
]);
}
/**
* Creates a new Books model.
* If creation is successful, the browser will be redirected to the 'view' page.
* #return mixed
*/
public function actionCreate()
{
$model = new Books();
$path = Yii::$app->basePath . '../../uploads/';
if (!is_dir($path)) {
mkdir($path);
}
if (Yii::$app->request->post()) {
$book_file = UploadedFile::getInstance($model, 'book');
$cover_file = UploadedFile::getInstance($model, 'cover');
$book_file->saveAs($path . $book_file->baseName . '.' . $book_file->extension);
$cover_file->saveAs($path . $book_file->baseName . '_' . $cover_file->baseName . '.' . $cover_file->extension);
return $this->redirect(['view', 'id' => $model->id]);
}
return $this->render('create', ['model' => $model]);
}
/**
* Updates an existing Books model.
* If update is successful, the browser will be redirected to the 'view' page.
* #param integer $id
* #return mixed
*/
public function actionUpdate($id)
{
$model = $this->findModel($id);
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('update', [
'model' => $model,
]);
}
}
/**
* Deletes an existing Books model.
* If deletion is successful, the browser will be redirected to the 'index' page.
* #param integer $id
* #return mixed
*/
public function actionDelete($id)
{
$this->findModel($id)->delete();
return $this->redirect(['index']);
}
/**
* Finds the Books model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* #param integer $id
* #return Books the loaded model
* #throws NotFoundHttpException if the model cannot be found
*/
protected function findModel($id)
{
if (($model = Books::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}
}
Books.php (Model)
<?php
namespace backend\models;
use Yii;
/**
* This is the model class for table "books".
*
* #property integer $id
* #property string $title
* #property string $subtitle
* #property string $description
* #property string $author
* #property string $isbn
* #property integer $page
* #property string $year
* #property string $publisher
* #property string $cover
* #property string $link
*/
class Books extends \yii\db\ActiveRecord
{
public $book;
public $cover;
/**
* #inheritdoc
*/
public static function tableName()
{
return 'books';
}
/**
* #inheritdoc
*/
public function rules()
{
return [
[['title', 'page', 'cover', 'book'], 'required'],
[['description'], 'string'],
[['isbn', 'page'], 'integer'],
['year', 'date'],
[['title', 'subtitle', 'author', 'publisher'], 'string', 'max' => 255],
['book', 'file', 'extensions' => 'pdf, epub', 'maxSize' => 1024 * 1024 * 1024],
['cover', 'file', 'extensions' => 'jpg, jpeg, png', 'maxSize' => 1024 * 1024 * 10]
];
}
/**
* #inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'title' => 'Title',
'subtitle' => 'Subtitle',
'description' => 'Description',
'author' => 'Author',
'isbn' => 'Isbn',
'page' => 'Page',
'year' => 'Year',
'publisher' => 'Publisher',
'cover' => 'Cover',
'book' => 'Book'
];
}
}
_form.php (View)
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/* #var $this yii\web\View */
/* #var $model backend\models\Books */
/* #var $form yii\widgets\ActiveForm */
?>
<div class="books-form">
<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?>
<?= $form->field($model, 'title')->textInput(['maxlength' => 255]) ?>
<?= $form->field($model, 'subtitle')->textInput(['maxlength' => 255]) ?>
<?= $form->field($model, 'description')->textarea(['rows' => 6]) ?>
<?= $form->field($model, 'author')->textInput(['maxlength' => 255]) ?>
<?= $form->field($model, 'isbn')->textInput(['maxlength' => 13]) ?>
<?= $form->field($model, 'page')->textInput() ?>
<?= $form->field($model, 'year')->textInput() ?>
<?= $form->field($model, 'publisher')->textInput(['maxlength' => 255]) ?>
<?= $form->field($model, 'book')->fileInput() ?>
<?= $form->field($model, 'cover')->fileInput() ?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
What exactly doesn't work – saving file into filesystem, o saving model attribute? It looks like you are not calling $model->save() in your actionCreate. Also if model attribute is named file and it is used to handle uploaded file here will be a problem when saving model. Probably you want to save only file name / file path to DB. In this case you need additional attributes to handle those values.
You can use CMultiFileUpload widget. See example in docs. And do not forget to add multipart/form-data to your form:
$form = $this->beginWidget('CActiveForm', array(
'id'=>'user-form',
'htmlOptions' => array( 'enctype' => 'multipart/form-data' ),
));
And file can be processed „along with the additional form data“. Also see CUploadedFile.

How to process data in the class behavior public properties in model? (Yii2)

Model code:
<?php
namespace common\models;
use Yii;
use yii\db\ActiveRecord;
use common\components\behaviors\PageAncestorBehavior;
/**
* This is the model class for table "page".
*
* #property integer $id
* #property string $title
* #property string $title_eng
* #property string $text
* #property integer $update_ts
*
* #property PageTreepath[] $pageTreepaths
*/
class Page extends \yii\db\ActiveRecord
{
public $ancestor;
public $descendant;
/**
* #inheritdoc
*/
public static function tableName()
{
return '{{%page}}';
}
/**
* #inheritdoc
*/
public function rules()
{
return [
[['title', 'text'], 'required'],
[['text'], 'string'],
[['update_ts'], 'integer'],
[['title', 'title_eng'], 'string', 'max' => 255]
];
}
/**
* #inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'title' => Yii::t('app', 'Заголовок'),
'title_eng' => Yii::t('app', 'Транcлитерация заголовка'),
'text' => Yii::t('app', 'Текст страницы'),
'update_ts' => Yii::t('app', 'Дата и время последнего обновления'),
'ancestor' => Yii::t('app', 'Категория'),
];
}
/**
* #inheritdoc
*/
public function behaviors()
{
return [
'timestamp' => [
'class' => 'yii\behaviors\TimestampBehavior',
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['update_ts'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['update_ts'],
],
],
'pageAncestor' => [
'class' => PageAncestorBehavior::className(),
'ancestor' => $this->ancestor
]
];
}
/**
* #return \yii\db\ActiveQuery
*/
public function getPageTreepaths()
{
return $this->hasMany(PageTreepath::className(), ['ancestor' => 'id']);
}
/**
* Get all pages
* #return array
*/
public static function getAllPages() {
$query = new \yii\db\Query;
$query->select('id, title')
->from('{{%page}}')
->orderBy('title');
$command = $query->createCommand();
return $command->queryAll();
}
/**
* Get list all pages for dropdown list
* #return array
*/
public static function getListAllPages() {
$data = self::getAllPages();
$result = array(0 => '-');
if (!empty($data)) {
foreach ($data as $d) {
$result[$d['id']] = $d['title'];
}
}
return $result;
}
}
Behavior code:
<?php
namespace common\components\behaviors;
use yii;
use yii\base\Behavior;
use yii\db\ActiveRecord;
use common\models\Page;
class PageAncestorBehavior extends Behavior
{
public $ancestor;
public function events()
{
return [
ActiveRecord::EVENT_BEFORE_INSERT => 'beforeInsert',
];
}
/**
* #param $event
*/
public function beforeInsert($event)
{
// --- How to get ancestor value?
//error_log("Ancestor:".$this->ancestor);
}
/**
* #return Page
*/
private function getOwner() {
return $this->owner;
}
}
View:
<?php $form = ActiveForm::begin([
'enableClientValidation'=> true,
'enableAjaxValidation'=> false,
'validateOnSubmit' => true,
'validateOnChange' => true,
'validateOnType' => true,
]); ?>
<?php echo $form->errorSummary($model); ?>
<?= $form->field($model, 'title')->textInput(['maxlength' => 255]) ?>
<?php
$redactor = yii\imperavi\Widget::widget(
[
'model' => $model,
'attribute' => 'text',
'options' => [
'minHeight' => 400,
],
]
);
$error = Html::error($model,'text', ['class' => 'help-block']); //error
?>
<?= $form->field($model, 'text', ['template' => "{$error}\n{label}\n{hint}\n{$redactor}"])->textarea();?>
<br />
<?php
// There is select for Page[ancestor]. Inf Behavior i don't recieved this.
echo $form->field($model, 'ancestor')->dropDownList($allPages);
?>
<div class="form-group">
<?= Html::submitButton(
$model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'),
['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']
) ?>
</div>
<?php ActiveForm::end(); ?>
Controller:
public function actionCreate()
{
$model = new Page;
$allPages = Page::getListAllPages();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
'allPages' => $allPages
]);
}
}
I obtain all data from the form, but I don't receive value of $ancestor.
I want to receive these ancestor from the form that to use them in behavior.
Sorry for my English.
Just add ancestor to your rules and try!
[['title','ancestor', 'text'], 'required'],
The variable must be public in the behavior. And in the behavior you access it with this a way $this->ancestor
In your model set pageAncestor, but the name of behavior is PageAncestorBehavior.... why?

Categories