【问题标题】:Working on cjuiautocomplete Showing Exception处理 cjuiautocomplete 显示异常
【发布时间】:2012-05-25 06:23:55
【问题描述】:

我尝试了来自 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 -->

谢谢 德文达

【问题讨论】:

    标签: jquery autocomplete yii


    【解决方案1】:

    你必须更新你的 DetailController:

    array('allow', 
          // allow authenticated user to perform 'create', 'update' and 'autocompleteTest' actions
          'actions'=>array('create','update', 'autocompleteTest'),
          'users'=>array('@'),
    ),
    

    【讨论】:

    • @Segey 感谢您的回复 - 但仍然显示相同的错误日志
    • 我在 DetailController 中的 actionAutocompleteTest() 函数下添加了上面的代码 - 对吗?
    【解决方案2】:

    试试这个对你来说很简单..

    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
    
                 ));
        ?>
    

    它工作正常...

    【讨论】:

    • 我按原样复制 - 在错误日志 2012/05/25 06:55:48 [错误] [exception.CHttpException.404] 异常“CHttpException”中显示此错误,并显示消息“无法解决”请求“管理员/AutoCompleteLookup”。在 C:\wamp\yii\framework\web\CWebApplication.php:280 堆栈跟踪:#0 C:\wamp\yii\framework\web\CWebApplication.php(135): CWebApplication->runController('admin/AutoCompl. ..') #1 C:\wamp\yii\framework\base\CApplication.php(162): CWebApplication->processRequest() #2 C:\wamp\www\myapp\index.php(13): CApplication- >运行()
    • #3 {main} REQUEST_URI=/myapp/index.php?r=admin/AutoCompleteLookup&q=de&limit=10&timestamp=1337928948219 HTTP_REFERER=localhost/myapp/index.php?r=details/create
    • 在视图中给出错误的 Url... 更正 Url,如 'url' =>array('Controller name/AutoCompleteLookup');
    • 如果我更改为 (controlername/action) - 显示未授权
    • 你是这样写的 .. 'url' =>array(Details/AutoCompleteLookup),
    【解决方案3】:

    控制器代码:

    name 是模型的属性(数据库表)

    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 - 控制器名称/肌动蛋白(控制器中编写的函数名称)

            <?php $this->widget('zii.widgets.jui.CJuiAutoComplete', array(
        'name'=>'test2',
        'source'=>$this->createUrl('Customer/AutoCompleteLookup'),
    
                 'options'=>array(
                 'showAnim'=>'fold',
                  ), 
    ));
        ?>
    

    感谢 Stackoverflow

    【讨论】:

      猜你喜欢
      • 2010-12-26
      • 2010-10-15
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多