-2

書き直された Ext.Direct 機能を Yii に実装しようとしています。doRpcそして、関数を正しく動作させることができないことを除いて、すべてがスムーズに動作します。これは、アプリケーションが正しく動作するために不可欠です。関数はSencha Ext.Direct チュートリアルで定義されていますが、いくつか変更を加えたので、ここに書き直しました。コード:

components/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 をテストしていないことに注意してください)

4

1 に答える 1

2

Yii のインポートを使用します。

<?php
Yii::import('application.modules.direct.views.classes.Temporary');
于 2013-02-13T13:38:59.267 に答える