2016-04-18 7 views
0

私はContaoのモジュールをPHPでプログラミングしています。 私はデータをデータベースに保存する "Model :: save()"という関数を使用しています。 しかし、保存した後にモデルを使用しようとしているときは、ただ空です。どのように起こるか分かりません。 コードスニペット:だから私は保存する前のvar_dumpでphp - contao - 私のモデルを保存して空のモデルを残す

  $report->tstamp = time(); 
      $report->machine_id = $machine_data['type_of_machine']; 
      var_dump($report); 
      echo "<br/>"; 
      $report->save(); 
      var_dump($report); 
      echo "<br/>"; 

は、すべてが正常ですが、もう一つは、任意のデータが表示されません! 誰かにアイデアがありますか?

EDIT2:モジュールの OK、ここでは完全なコード:

<?php 


    use Contao\Date; 
    use Contao\FilesModel; 
    use Contao\Input; 
    use Contao\Module; 
    use Contao\PageModel; 
    use Contao\RequestToken; 
    use Contao\Validator; 

    class ModuleReportData extends Module 

{ 

protected $strTemplate = 'mod__reportdata'; 

public function generate() 
{ 

    if (TL_MODE == 'BE') 
    { 
     /** @var \BackendTemplate|object $objTemplate */ 
     $objTemplate = new \BackendTemplate('be_wildcard'); 

     $objTemplate->wildcard = '### ReportData ###'; 
     $objTemplate->href = 'contao/main.php?do=themes&amp;table=tl_module&amp;act=edit&amp;id=' . $this->id; 

     return $objTemplate->parse(); 
    } 



    return parent::generate(); 
} 

public function compile() 
{ 

    $report_id = Input::get('r'); 

    if($report_id){ 
     $report = ReportModel::findByPk($report_id); 
     $project = ProjectModel::findBy('report_id', $report_id); 
    }else{ 
     $report = new ReportModel(); 
     $project = new ProjectModel(); 
    } 
    $machine = new MachineModel(); 

    $machines = []; 
    $next_step = false; 

    //get data for selectbox machines 
    $result = $this->Database->prepare("SELECT * FROM tl_sa_machines")->execute(); 

    while($result->next()) 
    { 
     $id = $result->id; 
     $machines[$id] = $result->type; 
    } 
    //Check if form was submitted 
    if(Input::post('submit_data')){ 
     $report_data = Input::post('report_data'); 
     $project_data = Input::post('project_data'); 
     $machine_data = Input::post('machine_data'); 

     $errors = []; 
     $next_step = true; 
     foreach($report_data as $key => $data) 
     { 
      if(empty($data)) continue; 
      switch ($key) { 
       case 'document_date': 
        if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $data)) //###andere Formate hinzufügen 
        { 
         break; 
        } 
        else { 
        $next_step = false; 
        $errors[$key] ="Error"; 
        break; 
        } 
       case 'customer': 
        if(Validator::isAlphanumeric($data)) break; 
        else { 
         $next_step = false; 
         $errors[$key] ="Error"; 
         break; 
        } 
       case 'city': 
        if(Validator::isAlphanumeric($data)) break; 
        else { 
         $next_step = false; 
         $errors[$key] ="Error"; 
         break; 
        } 
       case 'country': 
        if(Validator::isAlphanumeric($data)) break; 
        else { 
         $next_step = false; 
         $errors[$key] ="Error"; 
         break; 
        } 
       case 'document_version': 
        if(Validator::isNumeric($data)) break; 
        else { 
         $next_step = false; 
         $errors[$key] ="Error"; 
         break; 
        } 
       case 'author': 
        if(Validator::isAlphanumeric($data)) break; 
        else { 
         $next_step = false; 
         $errors[$key] ="Error"; 
         break; 
        } 
       case 'max_speed': 
        if(Validator::isNumeric($data)) break; 
        else { 
         $next_step = false; 
         $errors[$key] ="Error"; 
         break; 
        } 
      } 

     } 
     $report->setRow($report_data); 

     foreach($project_data as $key => $data) 
     { 
      if(empty($data)) continue; 
      if(Validator::isAlphanumeric($data)) continue; 
      else { 
       $next_step = false; 
       $errors[$key] = "Error"; 
      } 
     } 
     $project->setRow($project_data); 

     if($next_step) 
     { 
      $project->date_of_evaluation = strtotime($project->date_of_evaluation); 
      $report->document_date = strtotime($report->document_date); 

      //save and set report_data 
      $report->tstamp = time(); 
      $report->machine_id = $machine_data['type_of_machine']; 
      var_dump($report); 
      echo "<br/>"; 
      $report->save(); 
      var_dump($report); 
      echo "<br/>"; 
      $report = ReportModel::findByPK($report_id); 
      var_dump($report); 

      //save and set project_data 
      $project->report_id = $report->id; 
      $project->tstamp = time(); 
      $project->save(); 

      //session for transfering report_id to the next page 
      /* var_dump($report->id); 
      var_dump($report_id); 
      var_dump($project->report_id); 
      if($report_id) { 
       $_SESSION['report_id'] = $report_id; 
      } 
      else 
      {//var_dump($report_id); 
       //var_dump($report->id); 
       $report_id = $report->id; 
       $_SESSION['report_id'] = $report_id; 
      } 

      $jumpTo = PageModel::findByPk($this->jumpTo); 
      $url = $this->generateFrontendUrl($jumpTo->row()); 

      $this->redirect($url);*/ 
     } 
    } 

    $this->Template->report = $report; 
    $this->Template->project = $project; 
    $this->Template->machine = $machine; 
    $this->Template->machines = $machines; 
    $this->Template->errors = $errors; 

    $this->Template->request_token = RequestToken::get(); 


} 

}

私は、新しいデータを保存するために、または既存のデータを編集するために、フォームを持っています。データベースには、データを入力しようとしている2つのテーブルがあります。私はこのコードで生成された新しい行の新しいIDが必要です。しかし、保存した後はモデルが空であるため、機能しません。

EDIT3: ProjectModelだけでは単純です:私は$レポートの保存方法を使用する場合

use Contao\Model; 

class ProjectModel extends Model{ 
    protected static $strTable = "tl_sa_projects"; 
    } 

私はちょうど見つけた、それだけで起こります。 $ projectとうまくいっています!

更新: refresh()メソッドを使用して新しい挿入databaserow選択しようとしたとき、私はエラーが出るように見えます:

public function refresh() 
    { 
     $intPk = $this->{static::$strPk}; 

     // Track primary key changes 
     if (isset($this->arrModified[static::$strPk])) 
     { 
      $intPk = $this->arrModified[static::$strPk]; 
     } 

     // Reload the database record 
     $res = \Database::getInstance()->prepare("SELECT * FROM " . static::$strTable . " WHERE " . static::$strPk . "=?") 
             ->execute($intPk); 

var_dump($res); 

     $this->setRow($res->row()); 
    } 

アップデート2: [OK]を問題は「arrModified」ということであり、 IDとして空の文字列が含まれています。誰もこの配列がその要素を取得する場所を知っていますか?

+0

'Model'サブクラスのコードを投稿してください。デフォルトのimplはデータ配列を消去しません。 – Nadir

+0

Modelサブクラスとはどういう意味ですか?モデル自体には、テーブルのデフォルト文字列が含まれています。 – Daniel

+0

あなたがしようとしていることの完全なコードを投稿してください。あなたが提供したコードには、例えばモデルオブジェクトの作成は含まれていません。 – fritzmg

答えて

1

なく、あなたの元の質問への答えが、あなたが唯一特定のプロジェクトを見つけたいので、あなたの代わりに

ProjectModel::findBy('report_id', $report_id); 

ProjectModel::findOneBy('report_id', $report_id); 

を使用する必要があります。 findByContao\Model\Collection(つまり複数の結果が返される可能性があります)を返しますが、findOneByContao\Modelを返します。

を更新:

さらに、setDatamergeRowの使用状況は、おそらくこのように意図されていません。代わりに

foreach ($project_data as $key => $val) 
{ 
    $project->$key = $val; 
} 

などを使用してください。

+0

はい、あなたは正しいです!私はすでに他の場所で言われましたが、感謝とそれのために1アップ:) – Daniel

関連する問題