1

http://agiletoolkit.org/codepad/newsletterで2ステップのニュースレターの例を参照しています。例を4ステップのプロセスに変更しました。次のページクラスはステップ1であり、新しいレコードを挿入して新しいレコードIDを取得するために機能します。問題は、最後のステップまでこのレコードをデータベースに挿入したくないということです。save()関数を使用せずにこのIDを取得する方法がわかりません。どんなアイデアも役に立ちます。

class page_Ssp_Step1 extends Page {
    function init(){
        parent::init();

        $p=$this;

        $m=$p->add(Model_Publishers);
        $form=$p->add('Form');
        $form->setModel($m);
        $form->addSubmit();
        if($form->isSubmitted()){

        $m->save();//inserts new record into db.
        $new_id=$m->get('id');//gets id of new record
        $this->api->memorize('new_id',$new_id);//carries id across pages
        $this->js()->atk4_load($this->api->url('./Step2'))->execute();
        }
    }
}
4

1 に答える 1

1

これを行うには、atk4機能、mysqlトランザクションを使用するか、アプリケーションの設計の一部として使用する方法がいくつかあります。


1)ID列を自分で管理する

MySQLで自動インクリメント列を使用していると想定しているため、この自動インクリメントを行わずにシーケンスを使用して次の値を選択し、これを暗記ステートメントに保存して、->を使用してデフォルト値としてモデルに追加するというオプションがあります。 defaultValue($ this-> api-> recall('new_id')


2)自動コミットをオフにして、インサートの周りにトランザクションを作成します

私はMySQLではなくオラクルのバックグラウンドを持っていますが、MySQLではすべてを保存するかロールバックするトランザクションでいくつかのステートメントをラップすることもできるので、トランザクションを作成できる場合はこれもオプションになりますが、それでも保存できる可能性がありますただし、すべてのステップが完了すると、複数のテーブルにデータを入力する完全なトランザクションのみがコミットされます。

atk 4.1では、DBlite / mysql.phpクラスにトランザクションサポート用の関数がいくつか含まれていますが、agiletoolkit.orgのドキュメントは不完全であり、現在lib/Frontend.phpのデータベースに接続しているときに使用されているdbConnectを変更する方法が不明です。 $ this-> dbConnect()ですが、パラメーターを渡すオプションはありません。

最初のページの冒頭で、これを使用して必要なトランザクションコマンドを実行できる可能性があるようです。

 $this->api->db->query('SET AUTOCOMMIT=0');
 $this->api->db->query('START TRANSACTION');

次に、必要に応じてさまざまなページに挿入します。実行されたすべてがトランザクションに含まれるため、ユーザーがプロセスを完了しなかった場合、何も保存されないことに注意してください。
最後の挿入で、

 $this->api->db->query('COMMIT');

次に、必要に応じて、自動コミットをオンに戻して、各SQLステートメントがコミットされるようにします。

 $this->api->db->query('SET AUTOCOMMIT=1');

私はこれを試したことがありませんが、うまくいけばそれが役立つでしょう。


3)beforeInsertまたはafterInsertを使用します

データの配列を持つモデルでbeforeInsert関数をオーバーライドすることもできますが、IDが自動インクリメント列の場合、Idのパラメーターが挿入されたafterInsert関数まで値はありません。 。


4)ステータスを使用して完全な記録を示す

最後に、レコードのステータス列を使用して、それが最初のステージのみであり、これは最終ステージが完了したときにのみ完全なステータスに更新されることを示すことができます。次に、定期的に実行されるハウスキーピングジョブを実行して、すべてのステージを完了しなかったレコードを削除できます。これらのレコードを表示するグリッドまたはクラッドは、モデル内のAddCondition('status'、'C')で制限されるか、ページに追加されるため、不完全なレコードが表示されることはありません。

5)トランザクションを非SQLとして管理します

Romansが提案しているように、フォーム処理の結果をデータベースに直接格納するのではなく、セッション変数に格納し、最後のステップが完了したらSQLを使用して挿入することができます。

于 2012-07-28T20:35:40.373 に答える