yii framework Insert Contact Form in Home Page - yii

i've have problem in understanding how can i render contact form created by default from Yii at the bottom of my Home Page.
What i can use? renderPartial() or simply render() and what is the right way to do this?
<?php $this->renderPartial('contact', array('model'=>$model)); ?> return me error of undefined value $model.
I'm new on Yii Framework someone can help me?
TIA
Now i have problems building contact Portlet
This is my component ContactForm.php
<?php
Yii::import('zii.widgets.CPortlet');
class ContactForm extends CPortlet
{
public $title="Contact Us";
protected function renderContent() {
$form = new ContactForm;
if(isset ($_POST['ContactForm']))
{
$form->attributes=$_POST['ContactForm'];
if($form->validate())
$this->controller->refresh ();
}
$this->render('contactForm', array('form'=>$form));
}
}
And this is my contacForm.php view that give me error:
<?php echo CHtml::beginForm(); ?>
<div class="row">
<?php echo CHtml::activeLabel($form,'name'); ?>
<br/>
<?php echo CHtml::activeTextField($form,'name') ?>
<?php echo CHtml::error($form,'name'); ?>
</div>
<div class="row">
<?php echo CHtml::submitButton('Submit'); ?>
</div>
<?php echo CHtml::endForm(); ?>
CException
ContactForm and its behaviors do not have a method or closure named "getAttributeLabel".
This is the part of SiteController where there is the contact function:
/**
* Displays the contact page
*/
public function actionContact()
{
$model=new ContactForm;
if(isset($_POST['ContactForm']))
{
$model->attributes=$_POST['ContactForm'];
if($model->validate())
{
$headers="From: {$model->email}\r\nReply-To: {$model->email}";
mail(Yii::app()->params['adminEmail'],$model->subject,$model->body,$headers);
Yii::app()->user->setFlash('contact','Thank you for contacting us. We will respond to you as soon as possible.');
$this->refresh();
}
}
$this->render('contact',array('model'=>$model));
}
Where is the error?

Looks like a use case for a portlet. Here is a tutorial for creating a User-login portlet; with the contact form, it should be similar:
http://www.yiiframework.com/doc/blog/1.0/en/portlet.login

Related

Check if User.isLoggedIn

I have the following piece of code which I use to display a downloadable link only if the user is logged in. The code used to work.
After the user is logged in, the link tells me I still need to login. I expect it has to do with formkey.
How can I go about fixing this?
<?php if(!Mage::getSingleton('customer/session')->isLoggedIn()): /*If user is not logged in*/ ?>
<?php $registerUrl = $this->getData('registerUrl'); /** generate your register URL*/ ?>
<div>
<?php echo "<a href='$registerUrl'>Please login to download, gelieve eerst in te loggen, Bitte erst Anmelden </a>"; /*Ask user to Register*/ ?>
</div>
<?php else: /*If user logged in*/ ?>
<?php $downloadUrl = $this->getData('downloadUrl');/**generate your download URL */ ?>
<div>
<?php echo "<a href='$downloadUrl'>Link</a>"; /* Allow user to download */ ?>
</div>
<?php endif; ?>
I found the solution. I added
<?php Mage::getSingleton('core/session')->getFormKey() ?>
Just before
<?php if(!Mage::getSingleton('customer/session')->isLoggedIn()): /*If user is not logged in*/ ?>

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

Yii uploading pictures

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
}

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.