web-dev-qa-db-ja.com

モジュールから呼び出されたときにJTable(コンポーネント内)の保存が失敗する

これが私がやろうとしていることです。ここでコピーする必要があるコードの部分がわからないので、簡単にするために、単純化した疑似コードから始めましょう。

モデル、テーブルなどがすべて機能するメインコンポーネント(com_main)があります。私のview.htmlから私は呼び出すことができます

$modelTU = $this->getModel('TimeUnits');
$modelTU->GetSchedule($date,...);

TUモデル

public function GetSchedule($date,...){
    $query = self::getQuery();
    $items = $this->_getList((string) $query...);

    if (empty($items)){  //if non found, create new from template
        $templateModel = $this->getModel('Templates');
        $templateModel->createFromTemplate($date);   //create TU's from a tempalte

     }
     return $items;
}

テンプレートモデル...パブリック関数createFromTemplate($ date、...){

    //****THIS fails (or =FALSE) if called from module
    //This works fine when called from the component!!
    $modelTU =  JModelLegacy::getInstance('TimeUnit', COM_MODEL_PREFIX); //THIS FAILS

    $query = self::getQueryTempalte(....);
    $items = $this->_getList((string) $query...);
    foreach ($items as $item){
       $valTimeUnit = array(
            'duration' => $item->duration,
            'price' => $item->price
             ...
        );
        $modelTU->save($valTimeUnit);   
        //I also tried store bind here
        $tblTu = $modelTU->getTable();
        $tblTu->bind(valTimeUnit);  //table = False !!!

    }
 }

他にこれを説明する方法がわかりません。一番下の行:時間単位(TU)を読み込みます...そして、指定された日付が存在しない場合は、テンプレートモデルを呼び出して、TUに複製するテンプレート単位のセットを読み込みます。

これは、コンポーネント内から呼び出されると正常に動作します

モジュールを経由してモデルをimport require_once(JPATH_ROOT。 '/components/com_main/models/timeunit.php');等

動作します。存在する場合は、Timeunitをロードできます。

また、templateModelを呼び出して、私のマーカーまで新しいコピーを1回作成します。****最終的なTimeUnitモデル-> Save、または-> getTable();失敗する

しかし、モジュールから呼び出されたときのみ

私は何を間違っていますか/ルールに違反していますか?名前空間のインポートが最初の2つのモデルレベルをロードして機能し、最後の1つをロードできない方法がわかりません。 'JPATH_COMPONENT_SITE'を使用してコンポーネント内のファイルを要求できない場合は、モジュールから機能させる場合は 'JPATH_ROOTを使用します。 「/ components/com_byteitbooking /」。

私がダニが見逃しているものはありますか?

ありがとう

編集:JModelAdminを拡張するタイムユニットモデルで、このテストを行った追加コード

public function getTable($type = self::THIS_CLASS_NAME, $prefix = COM_TABLE_PREFIX,   $config = array()) {
    dumpMessage("-> admin.MODEL.TimeUnit.getTable()");
    dumpMessage("-> $type,$prefix");
    dump($config,'$config');
    $tb = JTable::getInstance($type, $prefix, $config);
    dump($tb,'$tb');
    return $tb;
    //return JTable::getInstance($type, $prefix, $config);
}

コンポーネントから最初に呼び出された結果、モジュールから2番目の結果...変数は正しく解決されます

  • admin.MODEL.TimeUnit.getTable()
  • TimeUnit、ByteitBookingTable
  • [配列] $ config =(空)
  • [ByteitBookingTableTimeUnitオブジェクト] $ tb

VS

  • admin.MODEL.TimeUnit.getTable()
  • TimeUnit、ByteitBookingTable
  • [配列] $ config =(空)
  • [ブール値] $ tb = FALSE

モデル/テーブルを使用するためにモジュールにコピーする必要がありますか? Joomlaには何らかの制限がありますか?

2
Andreas

モデルとテーブルの両方のパスを含める必要があると思います。

JModelLegacy::addIncludePath(JPATH_SITE . '/components/com_main/models', 'ByteitBookingModel');

$modelTU = JModelLegacy::getInstance('TimeUnit', 'ByteitBookingModel');
$modelTU->addTablePath(JPATH_ADMINISTRATOR . '/components/com_main/tables');
2
Dmitry Rekun