Yii uploading pictures - yii

I'm a new to yii, so I was following this tutorial.
when I try to upload picture it reports empty field even if it is not.
my _form view:
<div class="form">
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'picture-form',
'enableAjaxValidation'=>false,
'htmlOptions' => array('enctype' => 'multipart/form-data'),
));
?>
...
<div class="row">
<?php echo $form->labelEx($model,'path_to'); ?>
<?php echo $form->fileField($model,'path_to'); ?>
<?php echo $form->error($model,'path_to'); ?>
</div>
...
<?php $this->endWidget(); ?>
</div><!-- form -->
and here is my action method:
public function actionCreate()
{
$model=new Picture;
if(isset($_POST['Picture']))
{
$model->attributes=$_POST['Picture'];
$model->picture=CUploadedFile::getInstance($model,'path_to');
if($model->save()){
$log->lwrite('in save'.$model->picture);
$model->picture->saveAs(Yii::app()->basePath.'/../images/'.$model->picture);
$this->redirect(array('view','id'=>$model->id));
$log->lclose();
}
}
$this->render('create',array('model'=>$model,));
}
when I print_r($_FILES) everything what should be there is there
when I print_r($_POST) the field 'path_to' is empty and the validator probably is picking that one.
I'm probably missing something here and I'm clueless.
update1:
I've noticed yii is using hidden field with the same name as file input, than attributes are read from $_POST, which is causing the engine reading empty hidden field.
I understand that the hidden field is there for update when user is not entering new picture.
Can anyone advice what is the best way of doing picture upload?
update2:
model code:
class Picture extends CActiveRecord
{
public $picture;
...
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('path_to, page_id', 'required'),
array('page_id', 'numerical', 'integerOnly'=>true),
array('alt_text', 'safe'),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array('id, alt_text, path_to, page_id', 'safe', 'on'=>'search'),
//array('path_to', 'file','types'=>'jpg, gif, png', 'allowEmpty'=>true, 'on'=>'update'),
//array('path_to', 'length', 'max'=>255, 'on'=>'insert,update'),
array('path_to', 'unsafe'),
);
}
...
Best!

I think because you've declared 'path_to' to be unsafe in your rules, the massive assignment line:
$model->attributes=$_POST['Picture'];
Will fail, which will then cause the rule validation to fail. Change your rules to allow for path_to to be safe, and you should be good to go . . .
It also appears you're requiring a page_id, which I'm not seeing in your form.

_form code for file upload field :
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'post-form',
'enableAjaxValidation'=>false,
'htmlOptions' => array('enctype' => 'multipart/form-data'),
)); ?>
<div class="row">
<?php echo $form->labelEx($model, 'image');?>
<?php echo $form->fileField($model, 'image'); ?>
<?php echo $form->error($model, 'image'); ?>
</div>
<?php $this->endWidget(); ?>
Controller Code:
public function actionCreate()
{
$model=new Post;
if(isset($_POST['Post']))
{
$model->attributes=$_POST['Post'];
$uploadedFile=CUploadedFile::getInstance($model,'image');
$fileName = $uploadedFile;
$model->image = $fileName;
if($model->save()){
$uploadedFile->saveAs('C:/Program Files/Apache Group/Apache2/htdocs'.Yii::app()->baseUrl.'/images/thumbnails/'.$fileName);
$this->redirect(array('view','id'=>$model->id));
}
}
$this->render('create',array(
'model'=>$model,
));
}
diplay view code :
<?php $this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$model->search(),
'ajaxUpdate' => false,
'columns'=>array(
array(
'name'=>'Thumbnail',
'value'=>array($model,'showThumbnail'), // function in model
'type'=>'html',
'htmlOptions'=>array('class'=>'thumbnail'),
),
)
));
?>
model code :
place this function in ur model :
public function showThumbnail($data){
$path = $data->image;
return CHtml::image(Yii::app()->baseUrl.'/images/thumbnails/'.$path); // same path as ur uploaded file path
}

Related

Class 'yii\models\user' not found in view yii2

I am using YII2 advanced and I am trying from some hour but not any code working for me. I want to create dropdown from user table in my post page. I have found this error Class 'yii\models\user' not found. i have created this post with GII. my _form.php code
<?php
use yii\helpers\Html;
use yii\helpers\ArrayHelper;
use yii\models\user;
use yii\widgets\ActiveForm;
/* #var $this yii\web\View */
/* #var $model app\models\Posts */
/* #var $form yii\widgets\ActiveForm
<?php/* <?= $form->field($model, 'id')->textInput(['value' => \Yii::$app->user->identity->id]) ?>
use yii\models\user;
*/
?>
<div class="posts-form">
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'post_title')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'post_description')->textarea(['rows' => 6]) ?>
<?php
echo Html::activeDropDownList($model, 'author_id',ArrayHelper::map(User::find()->all(),'id','username'),['prompt'=>'Select User']);
?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
Why not working please anyone help me.
Thanks in advence
User::find() shows that you would use a User model, so really in uppercase as scaisEdge has answered to you.
However you have to know, in what namespace your User model is sitting. Yii2 doesn't have a User model, you have to create it. You mentioned, that you are using the advanced template. In that case you should create a User model in 'common/models/User.php' instead of 'models/User.php'. Follow the description in the Yii2 Guide.
In php typically a class name begin with an Uppercase char so in a unix like env (with file system based on a case sensitive constrain ) this must match try
use yii\models\User;

I can not create Dropdownbox in Yii framework

I want to create dropdownbox in Yii framework which have name is Category,I copy in the stackoverflow but it has error,
<form>
<?php
$list = CHtml::listData(Categories::model()->findAll(array('order' => 'cate_name')), 'id', 'cate_name');
echo $form->dropDownList("Category", 'cate_name', $list);
?>
</form>
here is error:
Undefined variable: form
Your form should looks like this:
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'your-form',
'enableAjaxValidation'=>false,
)); ?>
<?php
$list = CHtml::listData(Categories::model()->findAll(array('order' => 'cate_name')), 'id', 'cate_name');
echo $form->dropDownList("Category", 'cate_name', $list);
?>
<?php $this->endWidget(); ?>
NOTE: replace form tag with form widget
Instead of using html form tag, you have to use yii form widget.
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'form_id',
)); ?>
For tutorial: http://www.yiiframework.com/doc/guide/1.1/en/form.view

Yii framework How to integrate login form in header that should be visible on every page ,

I have three module 1 ) client 2 ) producer and search , I want to show login form in header
Login form is for producer , means producer can login
themes\mytheme\views\layouts
<div id=weppr>
<div class=fr header-right>
<?php $form=$this->beginWidget(CActiveForm, array(
id=>login-form,
enableClientValidation=>true,
clientOptions=>array(
validateOnSubmit=>true,
),
));
echo $form->textField($model,username,array(placeholder=>Enter Email,class=>login-input));
echo $form->passwordField($model,password,array(placeholder=>Enter Password,class=>login-input));
echo CHtml::submitButton(Login,array(class=>login-button));
$this->endWidget();
<div>
<?php echo $content; ?>
</div>
It gives error ,
Is possible to put in main.php , Is it acceptable coding , If not please how to do , and how to integrate login page that should be visible on every page with different module
I think you should try something like this:
LoginWidget.php
<?php class LoginWidget extends CWidget {
public function run() {
$model = new LoginFormModel;
$form= $this->beginWidget('CActiveForm', array(
'id'=>'login-form',
'action'=>array('site/login'),
'enableClientValidation'=>true,
'clientOptions'=>array(
'validateOnSubmit'=>true,
)
));
echo $form->textField($model,'username',array('placeholder'=>'Enter Email',class=>'login-input'));
echo $form->passwordField($model,'password',array('placeholder'=>'Enter Password',class=>'login-input'));
echo CHtml::submitButton('Login',array(class=>'login-button'));
$this->endWidget();
} } ?>
In your Layout File:
<?php $this->widget('LoginWidget'); ?>
That should do it!

CCaptcha displaying no image yii

I have a user registration form, in which I am trying to display a Captcha image by using Yii widget CCaptcha, however my image link appears broken,
Controller file:
public function actions()
{
return array(
// captcha action renders the CAPTCHA image displayed on the contact page
'captcha'=>array(
'class'=>'CCaptchaAction',
'backColor'=>0xFFFFFF,
),
);
}
Model File:
public function rules()
{
return array( array('verifyCode','captcha','allowEmpty'=>!CCaptcha::checkRequirements(),'on'=>'insert'),
);
}
And view file:
<?php if(CCaptcha::checkRequirements()): ?>
<div class="row">
<?php echo $form->labelEx($model,'verifyCode'); ?>
<div>
<?php $this->widget('CCaptcha'); ?>
<?php echo $form->textField($model,'verifyCode'); ?>
</div>
<div class="hint">Please enter the letters as shown.
<br/>Letters are not case-sensitive.</div>
<?php echo $form->error($model,'verifyCode'); ?>
</div>
<?php endif; ?>
As a answer provided somewhere I also tried giving the access rules in my controller file as
public function accessRules()
{
return array(
array('allow',
'actions' => array('captcha'),
'users' => array('*'),
),
);
}
But nothing seems to be working.
The problem was with the controller file,it should have been,
public function accessRules()
{
return array(
array('allow',
'actions'=>array('create', 'captcha'),
'users'=>array('*'),
),
}
whereas I had mentioned the action for captcha at the end, which I figured out is not allowed in Yii. All the allow actions for * should be together.
Yii captcha will create a png image. A possible explanation for the broken image link would be a missing GD extension or imagick extension, which can be identified by the presence of the following text in your error.log:
call to undefined function imagecreatetruecolor
For details and fix see "call to undefined function imagecreatetruecolor" error in PHP & pChart

How should I display the content of the database in CActiveForm?

Now I am building the view of a website and I use the widget CActiveForm as the view. However, I need to display some of the contents of the database, for example, the result of a SQL query. Then what should I do to accomplish the goal? Thank you!
Some of my code is provided below:
<div class="form">
<?php
$form=$this->beginWidget('CActiveForm', array(
'id'=>'login-form',
'enableClientValidation'=>true,
'clientOptions'=>array(
'validateOnSubmit'=>true,
),
));
?>
<p class="note">Fields with <span class="required">*</span> are required.</p>
<div class="row buttons">
<?php echo CHtml::submitButton('Login'); ?>
</div>
<div class="row radiobuttons">
<?php echo CHtml::radioButtonList(
$Paper,
'Q1No',
array('A'=>'A','B'=>'B','C'=>'C','D'=>'D'),
array('template'=>'<span class="radio">{input}{label}</span>','separator'=>''));
?>
</div>
<?php $this->endWidget(); ?>
</div><!-- form -->
This is my code. And I need to add some contents of the database in the form. The content is listed below:
public function actionTaketest()
{
// Get the ID of the test paper from the URL ---ztm
if(isset($_GET['paperid']))
{
$paperid=(int)$_GET['paperid'];
$dsn = 'mysql:host=localhost;dbname=mydatabase';
$username = 'root';
$password = '000000';
$connection=new CDbConnection($dsn,$username,$password);
// establish connection. You may try...catch possible exceptions
$connection->active=true;
$rawData = Yii::app()->db->createCommand()
->select('*')
->from('Paper, Question') array(':PaperNo'=>$paperid))
->queryAll();
$dataProvider=new CArrayDataProvider($rawData, array(
'id'=>'PaperNo',
));
$connection->active=false; // close connection
$model=new LoginForm;
$this->render('form',array('model'=>$model, 'dataProvider'=>$dataProvider));
}
else
{
// Deny illegal access to the page ---ztm
throw new CHttpException(404,'invalid request');
}
}
This code are in the controller.
Your code is too messy, and looks invalid in some places. First of all you don't need to create CDbConnection in controller, you can specify credentials in config. To read data from database you can use ActiveRecord:
$paper = Paper::model()->findByAttributes(array('PaperNo' => $paperid));
And then in your html:
echo CHtml::activeRadioButtonList(
$paper,
'Q1No',
array('A'=>'A','B'=>'B','C'=>'C','D'=>'D'),
array('template'=>'<span class="radio">{input}{label}</span>','separator'=>'')
);
I hope it helps a little bit.