我尝试了来自
的te源代码Source Code i used for CJUIAutoComplete
没有弄到错误的地方 显示未经授权的错误请帮助我,我是Yii框架和调试的新手。
这是我的错误日志
2012/05/25 06:07:28 [error] [exception.CHttpException.403] exception 'CHttpException' with message 'You are not authorized to perform this action.' in C:\wamp\yii\framework\web\auth\CAccessControlFilter.php:157
Stack trace:
#0 C:\wamp\yii\framework\web\auth\CAccessControlFilter.php(120) CAccessControlFilter->accessDenied(Object(CWebUser), 'You are not aut...')
#1 C:\wamp\yii\framework\web\filters\CFilter.php(39) CAccessControlFilter->preFilter(Object(CFilterChain))
#2 C:\wamp\yii\framework\web\CController.php(1146): CFilter->filter(Object(CFilterChain))
#3 C:\wamp\yii\framework\web\filters\CInlineFilter.php(59) CController->filterAccessControl(Object(CFilterChain))
#4 C:\wamp\yii\framework\web\filters\CFilterChain.php(131) CInlineFilter->filter(Object(CFilterChain))
#5 C:\wamp\yii\framework\web\CController.php(292): CFilterChain->run()
#6 C:\wamp\yii\framework\web\CController.php(266): CController->runActionWithFilters(Object(CInlineAction), Array)
#7 C:\wamp\yii\framework\web\CWebApplication.php(276): CController->run('autocompleteTes...')
#8 C:\wamp\yii\framework\web\CWebApplication.php(135): CWebApplication->runController('details/autocom...')
#9 C:\wamp\yii\framework\base\CApplication.php(162): CWebApplication->processRequest()
#10 C:\wamp\www\myapp\index.php(13): CApplication->run()
#11 {main}
REQUEST_URI=/myapp/index.php?r=details/autocompleteTest&term=asss
HTTP_REFERER=http://localhost/myapp/index.php?r=details/create
控制器代码
<?php
class DetailsController extends Controller
{
/**
* @var string the default layout for the views. Defaults to '//layouts/column2', meaning
* using two-column layout. See 'protected/views/layouts/column2.php'.
*/
public $layout='//layouts/column2';
/**
* @return array action filters
*/
public function filters()
{
return array(
'accessControl', // perform access control for CRUD operations
);
}
public function actionAutocompleteTest() {
$res =array();
if (isset($_GET['term'])) {
$qtxt ="SELECT name FROM {{details}} WHERE name LIKE :username";
$command =Yii::app()->db->createCommand($qtxt);
$command->bindValue(":name", '%'.$_GET['term'].'%', PDO::PARAM_STR);
$res =$command->queryColumn();
}
echo CJSON::encode($res);
Yii::app()->end();
}
/**
* Specifies the access control rules.
* This method is used by the 'accessControl' filter.
* @return array access control rules
*/
public function accessRules()
{
return array(
array('allow', // allow all users to perform 'index' and 'view' actions
'actions'=>array('index','view'),
'users'=>array('*'),
),
array('allow', // allow authenticated user to perform 'create' and 'update' actions
'actions'=>array('create','update'),
'users'=>array('@'),
),
array('allow', // allow admin user to perform 'admin' and 'delete' actions
'actions'=>array('admin','delete'),
'users'=>array('admin'),
),
array('deny', // deny all users
'users'=>array('*'),
),
);
}
/**
* Displays a particular model.
* @param integer $id the ID of the model to be displayed
*/
public function actionView($id)
{
$this->render('view',array(
'model'=>$this->loadModel($id),
));
}
/**
* Creates a new model.
* If creation is successful, the browser will be redirected to the 'view' page.
*/
public function actionCreate()
{
$model=new Details;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['Details']))
{
$model->attributes=$_POST['Details'];
if($model->save())
$this->redirect(array('view','id'=>$model->id1));
}
$this->render('create',array(
'model'=>$model,
));
}
/**
* Updates a particular model.
* If update is successful, the browser will be redirected to the 'view' page.
* @param integer $id the ID of the model to be updated
*/
public function actionUpdate($id)
{
$model=$this->loadModel($id);
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['Details']))
{
$model->attributes=$_POST['Details'];
if($model->save())
$this->redirect(array('view','id'=>$model->id1));
}
$this->render('update',array(
'model'=>$model,
));
}
/**
* Deletes a particular model.
* If deletion is successful, the browser will be redirected to the 'admin' page.
* @param integer $id the ID of the model to be deleted
*/
public function actionDelete($id)
{
if(Yii::app()->request->isPostRequest)
{
// we only allow deletion via POST request
$this->loadModel($id)->delete();
// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
if(!isset($_GET['ajax']))
$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
}
else
throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');
}
/**
* Lists all models.
*/
public function actionIndex()
{
$dataProvider=new CActiveDataProvider('Details');
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
/**
* Manages all models.
*/
public function actionAdmin()
{
$model=new Details('search');
$model->unsetAttributes(); // clear any default values
if(isset($_GET['Details']))
$model->attributes=$_GET['Details'];
$this->render('admin',array(
'model'=>$model,
));
}
/**
* Returns the data model based on the primary key given in the GET variable.
* If the data model is not found, an HTTP exception will be raised.
* @param integer the ID of the model to be loaded
*/
public function loadModel($id)
{
$model=Details::model()->findByPk($id);
if($model===null)
throw new CHttpException(404,'The requested page does not exist.');
return $model;
}
/**
* Performs the AJAX validation.
* @param CModel the model to be validated
*/
protected function performAjaxValidation($model)
{
if(isset($_POST['ajax']) && $_POST['ajax']==='details-form')
{
echo CActiveForm::validate($model);
Yii::app()->end();
}
}
}
表单代码
<div class="form">
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'details-form',
'enableAjaxValidation'=>false,
)); ?>
<p class="note">Fields with <span class="required">*</span> are required.</p>
<?php echo $form->errorSummary($model); ?>
<div class="row">
<?php echo $form->labelEx($model,'id'); ?>
<?php echo $form->textField($model,'id'); ?>
<?php echo $form->error($model,'id'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'name'); ?>
<?php $this->widget('zii.widgets.jui.CJuiAutoComplete', array(
'name'=>'test1',
'value'=>'test21',
'source'=>$this->createUrl('details/autocompleteTest'),
// additional javascript options for the autocomplete plugin
'options'=>array(
'showAnim'=>'fold',
),
));
?>
<?php echo $form->error($model,'name'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'phone'); ?>
<?php echo $form->textField($model,'phone'); ?>
<?php echo $form->error($model,'phone'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($model,'email'); ?>
<?php echo $form->textField($model,'email'); ?>
<?php echo $form->error($model,'email'); ?>
</div>
<div class="row buttons">
<?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>
</div>
<?php $this->endWidget(); ?>
</div><!-- form -->
由于 Devendar
答案 0 :(得分:1)
您必须更新DetailController:
array('allow',
// allow authenticated user to perform 'create', 'update' and 'autocompleteTest' actions
'actions'=>array('create','update', 'autocompleteTest'),
'users'=>array('@'),
),
答案 1 :(得分:0)
试试这个对你来说非常简单..
public function actionAutoCompleteLookup()
{
if(Yii::app()->request->isAjaxRequest && isset($_GET['q']))
{
$name = $_GET['q'];
$qtxt ="SELECT name FROM details WHERE name LIKE '%".$name."%'";
$command =Yii::app()->db->createCommand($qtxt);
$userArray =$command->queryColumn();
$returnVal = '';
foreach($userArray as $userAccount)
{
$returnVal .= $userAccount->getAttribute('first_name').'|'
.$userAccount->getAttribute('user_id')."\n";
}
echo $returnVal;
}
}
在这样的视图代码中..
<?php $this->widget('CAutoComplete',
array(
//name of the html field that will be generated
'name'=>'name',
//replace controller/action with real ids
'url'=>array('detail/AutoCompleteLookup'),
'max'=>10, //specifies the max number of items to display
//specifies the number of chars that must be entered
//before autocomplete initiates a lookup
));
?>
工作正常......
答案 2 :(得分:0)
控制器代码:
name是model(数据库表)的属性
public function actionAutoCompleteLookup() {
$res =array();
if (isset($_GET['term'])) {
$qtxt ="SELECT name FROM customer WHERE name LIKE :name";
$command =Yii::app()->db->createCommand($qtxt);
$command->bindValue(":name", '%'.$_GET['term'].'%', PDO::PARAM_STR);
$res =$command->queryColumn();
}
echo CJSON::encode($res);
Yii::app()->end();
}
查看代码
创建URL - 控制器名称/ Actin(函数名称在控制器中编写)
<?php $this->widget('zii.widgets.jui.CJuiAutoComplete', array(
'name'=>'test2',
'source'=>$this->createUrl('Customer/AutoCompleteLookup'),
'options'=>array(
'showAnim'=>'fold',
),
));
?>
感谢Stackoverflow