0

PHPでContaoのモジュールをプログラミングしています。データをデータベースに保存する関数「Model::save()」を使用しています。しかし、保存後にモデルを使用しようとすると、空になります。どうすればこれが起こるのかわかりません。コード スニペット:

            $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 ではすべて問題ありませんが、2 番目のダンプにはデータが表示されません! 誰かアイデアはありますか?

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 つの異なるテーブルがあります。2 つ目は、このコードで生成された新しい行の新しい ID が必要です。しかし、保存後にモデルが空であるため、機能しません。

Edit3: ProjectModel はとてもシンプルです:

    use Contao\Model;

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

$report で save メソッドを使用した場合にのみ発生することがわかりました。$project で問題なく動作しています。

更新: refresh() メソッドが新しく挿入されたデータベース行を次のように選択しようとすると、エラーが発生するようです。

    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 として空の文字列が含まれていることです。この配列がその要素をどこで取得するか知っている人はいますか?

4

1 に答える 1