2016-04-18 15 views
0

我正在爲php編程一個模塊。 我正在使用函數「Model :: save()」,它將我的數據保存到數據庫。 但是,當我試圖在保存後使用模型時,它只是空的。我不知道這是如何發生的。 代碼片段: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/>"; 

所以在我保存前的var_dump,一切都很好,但第二個不顯示任何數據! 有人有什麼想法嗎?

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(); 


} 

}

我有一個表格,以保存新的數據或編輯現有數據。數據庫中有兩個不同的表格,我試圖填充數據。 FOr第二個我需要在此代碼中生成的新行的新ID。但它不起作用,因爲模型在保存後是空的。

EDIT3: ProjectModel就是這樣簡單:

use Contao\Model; 

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

我只是發現了,就當我使用$報告的保存方法纔會發生。它與$項目工作正常!

更新: 它看起來像我得到一個錯誤,當刷新()方法嘗試選擇新插入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: 確定的問題是,在「arrModified」包含一個空字符串作爲ID。有人知道這個數組在哪裏獲得它的元素嗎?

+0

請發表你的'Model'子類的代碼。默認的impl不會擦除數據數組。 – Nadir

+0

您對模型子類的意義究竟是什麼?模型本身只包含表格的默認字符串。 – Daniel

+0

發佈你正在嘗試做的事情的完整代碼。您提供的代碼不包括模型對象的例子。 – fritzmg

回答

1

不回答你原來的問題,但因爲你只想要查找一個具體的項目,你應該使用的

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

代替

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

findBy返回Contao\Model\Collection(即可能有多個結果),而findOneBy返回Contao\Model

更新:

此外,您的setDatamergeRow用法可能並不打算這樣。您應該改用

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

例如。

+0

是的,你是對的!我已經被告知其他地方了,但是謝謝你:) – Daniel