2013-02-13 2 views
-2

Я пытаюсь реализовать переписанную функциональность Ext.Direct в Yii. И все работает плавно, за исключением того, что я не могу нормально работать с функцией doRpc, и это жизненно важно для правильной работы приложения, функция определена в Sencha Ext.Direct Tutorial, хотя я внесла некоторые изменения в это, так что вот мой переписанный код:Yii PHP Framework: не удалось require_once внутри Yii

компоненты/Ext_Router.php

class Ext_Router extends CApplicationComponent 
{ 
    public function doRpc($cdata) 
    { 
     $API = Yii::app()->ext_api->getApi(); 
     try { 
      if(!isset($API[$cdata->action])){ 
       throw new Exception('Call to undefined action: ' . $cdata->action); 
      } 

      $action = $cdata->action; 
      $a = $API[$action]; 

      Yii::app()->ext_router->doAroundCalls($a['before'], $cdata); 

      $method = $cdata->method; 
      $mdef = $a['methods'][$method]; 
      if(!$mdef){ 
       throw new Exception("Call to undefined method: $method on action $action"); 
      } 
      Yii::app()->ext_router->doAroundCalls($mdef['before'], $cdata); 

      $r = array(
       'type'=>'rpc', 
       'tid'=>$cdata->tid, 
       'action'=>$action, 
       'method'=>$method 
      ); 

      // TODO require_once always returns: No such file or directory 
      require_once("index.php?r=direct/classes/index&classaction=$action"); 

      $o = new $action(); 
      if (isset($mdef['len'])) { 
       $params = isset($cdata->data) && is_array($cdata->data) ? $cdata->data : array(); 
      } else { 
       $params = array($cdata->data); 
      } 

      $r['result'] = call_user_func_array(array($o, $method), $params); 

      Yii::app()->ext_router->doAroundCalls($mdef['after'], $cdata, $r); 
      Yii::app()->ext_router->doAroundCalls($a['after'], $cdata, $r); 
     } 
     catch(Exception $e){ 
      $r['type'] = 'exception'; 
      $r['message'] = $e->getMessage(); 
      $r['where'] = $e->getTraceAsString(); 
     } 
     return $r; 
    } 

    public function doAroundCalls(&$fns, &$cdata, &$returnData=null) 
    { 
     if(!$fns){ 
      return; 
     } 
     if(is_array($fns)){ 
      foreach($fns as $f){ 
       $f($cdata, $returnData); 
      } 
     }else{ 
      $fns($cdata, $returnData); 
     } 
    } 
} 

модули/прямые/контроллеры/ClassesController.php

class ClassesController extends Controller 
{ 
    public function actionIndex($classaction) 
    { 
     $this->render("$classaction"); 
    } 
} 

модули/прямые/просмотров/классы/Temporary.php

class Temporary 
{ 
    protected $_result; 
    public $results; 

    public function getResults(stdClass $params) 
    { 
     $_result = Temporary::model()->findAllByAttributes(array('id'=>Yii::app()->session['id'])); 

     $results = array(); 

     if($_results != null) { 
      foreach($_result as $row) { 
       $results[] = $row; 
      } 
     } 

     return $results; 
    } 

    ... 
} 

Проблема:

require_once("index.php?r=direct/classes/index&classaction=$action"); 

Что такое лучший способ обойти эту проблему? Как «разобрать»/включить/потребовать этот файл PHP?

(Имейте в виду, что я не удосужился к тестированию мой Temporary.php, потому что я просто не получил мимо текущей ошибки)

+2

Я не конечно, что вы пытаетесь сделать здесь. Каков ожидаемый результат? – Jon

+0

Возможный дубликат [PHP - включить файл php, а также отправить параметры запроса] (http://stackoverflow.com/questions/1232097/php-include-a-php-file-and-also-send-query-parameters) или [php include проблема с URL-адресами с параметрами? view = task & others file not found] (http://stackoverflow.com/questions/3592251/php-include-problem-with-urls-with-options-view-taskothers-file- not-found? rq = 1) – deceze

+0

Я пытаюсь использовать 'require_once' для включения файла, указанного в вызове. Для этого случая он называется «Временный», поэтому он станет «require_once (« index.php? R = direct/classes/index & classaction = Temporary »);' - но для других действий это будет что-то другое. Но 'require_once' всегда приводит к:' require_once (index.php? R = direct/classes/index & classaction = Temporary): не удалось открыть поток: нет такого файла или каталога'. – rnngau

ответ

2

Использование Yii's import:

<?php 
Yii::import('application.modules.direct.views.classes.Temporary'); 
+0

Только то, что я искал. Благодаря! – rnngau

Смежные вопросы