1

PHPActiveRecord/Twigで結合テーブルにアクセスできません。これが簡略化されたコードです。2つのモデル(コードとユーザー)があり、各コードは1人のユーザーに属しているので、コードの作成者の名前でコードをリストしたいと思います。

php

// model
class Code extends ActiveRecord\Model {
    static $belongs_to = array(
        array('user'),
    );
}

class User extends ActiveRecord\Model {
    static $has_many = array(
        array('code'),
    );
}


// controller
$codes = Code::all(array('include' => 'user'));
var_dump($codes);      //-> successfully displayed codes list and their authors

$this->twig->display('codelist.twig', $codes);

template.twig

{% for code in codes %}
{{ code.name }}        //-> successfully displayed code's name
{{ code.user.name }}   //-> failed to output user's name with error
{% endfor %}
// error:
// An exception has been thrown during the rendering of a template ("Call to undefined method: user") in "inc/template.twig" at line **.

私はこのページを見ました:http: //twig.sensiolabs.org/doc/templates.html

実装

便宜上、foo.barはPHPレイヤーで次のことを行います。

fooが配列であるかどうかを確認し、有効な要素を禁止します。そうでない場合、およびfooがオブジェクトである場合は、barが有効なプロパティであることを確認してください。そうでない場合、およびfooがオブジェクトである場合は、barが有効なメソッドであることを確認してください(barがコンストラクターであっても、代わりに__construct()を使用してください)。そうでない場合、およびfooがオブジェクトである場合は、getBarが有効なメソッドであることを確認してください。そうでない場合、およびfooがオブジェクトである場合は、isBarが有効なメソッドであることを確認してください。そうでない場合は、null値を返します。一方、foo['bar']はPHP配列でのみ機能します。

fooが配列であるかどうかを確認し、有効な要素を禁止します。そうでない場合は、null値を返します。

$ codes [0]-> userを介してユーザー属性にアクセスできますが、twigテンプレートファイルのユーザー属性にアクセスできないのはなぜですか?

4

1 に答える 1

1

greutのおかげで、私は問題を解決しました。PHPActiveRecordのlib/Model.phpの関数__issetを置き換えました。

/**
 * Determines if an attribute exists for this {@link Model}.
 *
 * @param string $attribute_name
 * @return boolean
 */
public function __isset($name)
    {
        // check for getter
        if (method_exists($this, "get_$name"))
        {
            $name = "get_$name";
            $value = $this->$name();
            return $value;
        }

        return $this->read_attribute($name);
    }

https://github.com/kla/php-activerecord/issues/156

于 2012-05-24T16:40:41.617 に答える