Forms atk4.2表单提交如何在插入以传递参数之前获取新记录id

Forms atk4.2表单提交如何在插入以传递参数之前获取新记录id,forms,function,save,submit,atk4,Forms,Function,Save,Submit,Atk4,我正在参考上的2步新闻稿示例。我将示例修改为4步流程。下面的page类是步骤1,它用于插入新记录并获取新记录id。问题是在最后一步之前我不想将此记录插入数据库。我不知道如何在不使用save()函数的情况下检索此id。任何想法都会有帮助 class page_Ssp_Step1 extends Page { function init(){ parent::init(); $p=$this; $m=$p->add(Model_Pub

我正在参考上的2步新闻稿示例。我将示例修改为4步流程。下面的page类是步骤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();
        }
    }
}

有几种方法可以做到这一点,可以使用atk4功能、mysql事务,也可以作为应用程序设计的一部分


1)自己管理id列

我假设您在MySQL中使用的是一个自动递增列,因此一个选项是不进行此自动递增,而是使用一个序列并选择下一个值,将其保存在您的记忆语句中,并使用->defaultValue($this->api->recall('new_id')将其作为默认值添加到模型中


2)关闭自动提交并围绕插入创建事务

我来自oracle背景,而不是MySQL,但MySQL还允许您在事务中封装多个语句,可以保存所有内容或回滚,因此如果您可以创建事务,这也是一个选项,然后您可能仍然能够保存,但如果所有步骤都完成,则只会提交填充多个表的完整事务

在atk 4.1中,DBlite/mysql.php类包含一些用于事务支持的函数,但上的文档不完整,并且不清楚如何更改当前使用的dbConnect,因为您使用$this->dbConnect()连接到lib/fronted.php中的数据库,但没有传递参数的选项

看起来您可以在第一页的开头使用它来执行所需的事务命令

 $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)插入前或插入后使用

您还可以在您的模型上覆盖BeforeSert函数,该函数有一个数据数组,但我认为,若您的id是一个自动递增列,那个么在插入了id参数的afterInsert函数之前,它不会有值


4)使用状态指示完整记录

最后,您可以在记录上使用状态列来指示它仅处于第一个阶段,并且只有在最后一个阶段完成时才会更新为完整状态。然后,您可以有一个定期运行的内务管理作业,以删除未完成所有阶段的记录。显示这些记录的任何网格或crud都会受到模型中AddCondition('status','C')的限制,或者添加到页面中,这样就不会显示不完整的网格或crud

5)将事务作为非sql进行管理


正如Romans所建议的,您可以将表单处理的结果存储在会话变量中,而不是直接存储到数据库中,然后在最后一步完成后使用SQL将其插入。

有几种方法可以做到这一点,可以使用atk4功能,mysql事务或作为应用程序设计的一部分


1)自己管理id列

我假设您在MySQL中使用的是一个自动递增列,因此一个选项是不进行此自动递增,而是使用一个序列并选择下一个值,将其保存在您的记忆语句中,并使用->defaultValue($this->api->recall('new_id')将其作为默认值添加到模型中


2)关闭自动提交并围绕插入创建事务

我来自oracle背景,而不是MySQL,但MySQL还允许您在事务中封装多个语句,可以保存所有内容或回滚,因此如果您可以创建事务,这也是一个选项,然后您可能仍然能够保存,但如果所有步骤都完成,则只会提交填充多个表的完整事务

在atk 4.1中,DBlite/mysql.php类包含一些用于事务支持的函数,但上的文档不完整,并且不清楚如何更改当前使用的dbConnect,因为您使用$this->dbConnect()连接到lib/fronted.php中的数据库,但没有传递参数的选项

看起来您可以在第一页的开头使用它来执行所需的事务命令

 $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)插入前或插入后使用

您还可以在您的模型上覆盖BeforeSert函数,该函数有一个数据数组,但我认为,若您的id是一个自动递增列,那个么在插入了id参数的afterInsert函数之前,它不会有值


4)使用状态指示完整记录

最后,您可以在记录上使用状态列来指示它仅处于第一个阶段,并且只有在最后一个阶段完成时才会更新为完整状态。然后,您可以有一个定期运行的内务管理作业,以删除未完成所有阶段的记录。显示这些记录的任何网格或crud都会受到模型中AddCondition('status','C')的限制,或者添加到页面中,这样就不会显示不完整的网格或crud

5)管理