1

解決:

アプリケーションのドキュメント ルートに Samples.php ファイルがありました。アプリの通常の Yii 実行チェーンでこれが実際にどのように機能したかは、私にはわかりません。しかし、それはありました。私はそれを削除しましたが、今では正常に機能しています。ありがとう!


更新: (私が知っている) すべてのキャッシュが無効になっていることを除けば、これはほぼ確実にアプリ レベルのキャッシュの問題です。製品の Models フォルダに移動してさまざまなモデルを削除すると、Yii はすぐに、これらのモデルが存在しないという予期されたエラーをスローします。Samples モデルではそうではありません。それは周りにとどまります。


Yii Search で非常に奇妙な問題が発生しています。

私がやっていることは、以前に 100 回行ったのと同じように、関連するモデルを検索することです。これは私の開発ホストでは正常に動作しますが、本番ホストに公開するとすぐに失敗します: Property "Samples.cancer_search" is not defined.

ファイルが実際に公開されていることを 2 回、3 回確認しました。このプロパティは、Samples モデルのルール内の「セーフ オン サーチ」リストにリストされています。プロパティは、モデルで public var として宣言されています。開発では完全に機能しますが、これらのファイル (およびアプリ全体) を本番環境に公開すると、プロパティが定義されていません。

これよりも奇妙なことに、私は製品サーバーに入り、悪いモデル、コントローラー、およびビューをコピーして新しい名前を使用し (同じ db テーブルを使用)、正常に動作しました。モデル、コントローラー、ビューの名前を Samples から SamplesTest/SamplesTestController に変更しただけで、うまくいきました。

すべてのキャッシュを無効にし (memcache を使用していた)、サーバーを再起動しました。それでも同じエラーが発生します。

モデル (製品ではなく開発で動作します。明確にするために短縮されています)

 class Samples extends CActiveRecord
 {

// .... // 

// for search/sort on related data
public $cancer_search;
public $cancer_search_test;

// .... // 

public function rules()
{
    return array(
        array('id, patient_id, cancer, cancer_id, cancer_search, cancer_search_test, requested_date, ...', 'safe', 'on'=>'search'),
    );
}

public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
        'cancer' => array(self::BELONGS_TO, 'Cancers', 'cancer_id'),
        'cancerTest' => array(self::BELONGS_TO, 'Cancers', 'cancer_id'),
        )
}

public function attributeLabels()
{
    return array(
        'cancer_id' => 'Cancer Classification',
        'cancer' => 'Cancer Classification',
        'cancer_search' => 'Cancer Classification',
        'cancer_search_test' => 'Cancer Classification',
    );
}

public function search()
{  
    $criteria=new CDbCriteria;        
    $criteria->group = 't.id';  
    $criteria->together = true;

    $criteria->with[] = 'cancer';
    if($this->cancer_search) {
      $criteria->addSearchCondition("cancer.name",$this->cancer_search);
    }

    $criteria->compare('id',$this->id,true);
    $criteria->compare('patient_id',$this->patient_id,true);

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
        'sort'=>array(
            'attributes'=>array(                   
                 'cancer_search'=>array(
                    'asc'=>'cancer.name',
                    'desc'=>'cancer.name DESC',
                ),
                '*',
            ),
        ),

    ));

}

および検索ビュー

 // on production, this doesn't throw an error, but the search doesn't work
 $columns[]= array(
        'name'  => 'cancer',
        'value'=>'$data->cancer->name', 
        'type'  => 'raw',
        'htmlOptions'=>array('style'=>'width:100px;'),
    );

 // gives property not defined error on prod, even though it is defined, and works fine on dev
 $columns[]= array(
        'name'  => 'cancer_search',
        'value'=>'$data->cancer->name', 
        'type'  => 'raw',
        'htmlOptions'=>array('style'=>'width:100px;'),
    );

  // both of these work fine on dev.

Yii アセット フォルダをクリアしましたが、役に立ちませんでした。

私は気が狂っているのですか、それとも私が気付いていないキャッシングの可能性がありますか?

ありがとう。

--

もう 1 つの手がかり - 検索グリッドで、prod サーバーの列ヘッダーにも正しい属性ラベルが使用されていないことに気付きました。dev と prod で同じである理由がわかりません。


edit 2モデルでパブリック変数を宣言し、コントローラー検索メソッドでログにトレースするだけで、同じ取引を試みました。Var は dev には存在しますが、prod には存在しません。

edit 3 これで、何かがキャッシュされていることがわかりました。Samples モデルを削除したところ、古いキャッシュ バージョンが引き続き使用され、新しいプロパティが見つかりません。Memcached が無効になっており、mysql クエリ キャッシュをリセットしました。このファントムモデルを今でも使用しています。

4

1 に答える 1

1

アプリケーションのドキュメント ルートに古い Samples.php モデル ファイルが存在することが判明しました。たまたまそこにアップロードしたに違いありません。

驚いたことに、これは Yii アプリを失敗させるのではなく、Models/ にあった (またはなかった) Samples.php モデルをオーバーライドするために実際に機能しました。

アプリは Protected の下にあるコンポーネントのみをロードすると予想していましたが、明らかにそうではありませんでした。

ありがとう。

于 2013-05-03T15:53:57.417 に答える