Symfony1 条令“记录”和“例外”;不能';t调用“核心::集();同时尝试保存表单数据

Symfony1 条令“记录”和“例外”;不能';t调用“核心::集();同时尝试保存表单数据,symfony1,symfony-1.4,doctrine-1.2,Symfony1,Symfony 1.4,Doctrine 1.2,我遇到了这个问题,我找不到问题所在。我试图在执行form save方法之前更新对象,我的操作如下(我编写了整个类以防万一): 这是与该表单相关的schema.yml: SdrivingMaquina: actAs: Timestampable: ~ columns: idmaquina: { type: integer(8), autoincrement: true, notnull: true, primary: true } idempresa: { typ

我遇到了这个问题,我找不到问题所在。我试图在执行form save方法之前更新对象,我的操作如下(我编写了整个类以防万一):

这是与该表单相关的schema.yml:

SdrivingMaquina:
  actAs: 
    Timestampable: ~
  columns:
    idmaquina: { type: integer(8), autoincrement: true, notnull: true, primary: true }
    idempresa: { type: integer(4), notnull: true }
    patente: { type: string(12), notnull: true }
  relations:
    Empresa: { local: idempresa, class: SdrivingEmpresa, type: one, foreignType: one, foreignAlias: MaquinaEmpresa, onDelete: CASCADE, onUpdate: CASCADE }
SdrivingMaquinaEmisor:
  actAs: 
    Timestampable: ~
  columns:
    idmaquinaemisor: { type: integer(8), primary: true, autoincrement: true }
    idmaquina: { type: integer(8), notnull: true }
    idemisor: { type: integer(8), notnull: true }
  relations:
    SdrivingEmisor: { onDelete: CASCADE, local: idemisor, foreign: idemisor, type: one }
    SdrivingMaquina: { onDelete: CASCADE, local: idmaquina, foreign: idmaquina, type: one }
正如你可能注意到的,没有一种关系是多对多的。发送表单时,我收到以下错误:

无法调用Core::set(),第二个参数应为 设置一对多引用时的集合实例

我找不到错误在哪里,所以任何帮助都将不胜感激。我在堆栈跟踪中也注意到了这一点:

at SdrivingMaquinaForm->doUpdateObject(array('idmaquina' => null, 'idempresa' => '1', 'patente' => 'TB58922', 'no_emisor' => '2'))
为什么
idmaquina
null
?我在同一时刻创造的
maquina
的价值应该会消失。保存
maquina
后,我是否应该更改逻辑并更新关系值?在这种情况下,我如何获得最新创建的
maquina
id

编辑 模板:
\u form.php

<?php use_stylesheets_for_form($form) ?>
<?php use_javascripts_for_form($form) ?>

<div class="row-fluid">
    <form action="<?php echo url_for('maquina/' . ($form->getObject()->isNew() ? 'create' : 'update') . (!$form->getObject()->isNew() ? '?idmaquina=' . $form->getObject()->getIdmaquina() . '&idempresa=' . $form->getObject()->getIdempresa() : '')) ?>" method="post" <?php $form->isMultipart() and print 'enctype="multipart/form-data" ' ?>>
        <?php if (!$form->getObject()->isNew()): ?>
            <input type="hidden" name="sf_method" value="put" />
        <?php endif; ?>
        <?php echo $form->renderHiddenFields(true) ?>
        <?php echo $form->renderGlobalErrors() ?>

        <div class="span4">
            <label><?php echo $form['patente']->renderLabel() ?></label>
            <?php echo $form['patente'] ?>
            <span class="help-block"><?php echo $form['patente']->renderError() ?></span>
        </div>
        <div class="span4">
            <label><?php echo $form['no_emisor']->renderLabel('Emisor') ?></label>
            <?php echo $form['no_emisor'] ?>
            <span class="help-block"><?php echo $form['no_emisor']->renderError() ?></span>
        </div>
        <div class="clearfix"></div>
        <p class="right-align-text marginTop">
            <button type="button" class="btn" id="cancel-btn"><?php echo __('Cancelar') ?></button>
            <input type="submit" value="<?php echo __('Guardar') ?>" class="btn btn-success" />
        </p>
    </form>

    <?php if ($sf_user->hasFlash('error')): ?>
        <div class="alert alert-error">
            <h4>Error!</h4>
            <?php echo $sf_user->getFlash('error') ?>
        </div>
    <?php endif; ?>
</div>

<script>
    $(function() {
        $('#cancel-btn').click(function() {
            history.go(-1);
            $('#myTab a[href="#<?php echo $sf_user->getFlash('activeTab', 'usuarios'); ?>"]').tab('show');
        });
    });
</script>
class maquinaActions extends sfActions {

    public function executeIndex(sfWebRequest $request) {
        $this->sdriving_maquinas = Doctrine_Core::getTable('SdrivingMaquina')->createQuery('a')->execute();
    }

    public function executeNew(sfWebRequest $request) {
        $this->getUser()->setFlash('activeTab', 'maquinas');
        $this->form = new SdrivingMaquinaForm();
    }

    public function executeCreate(sfWebRequest $request) {
        $this->forward404Unless($request->isMethod(sfRequest::POST));
        $this->form = new SdrivingMaquinaForm();
        $this->processForm($request, $this->form);
        $this->setTemplate('new');
    }

    public function executeEdit(sfWebRequest $request) {
        $this->forward404Unless($sdriving_maquina = Doctrine_Core::getTable('SdrivingMaquina')->find(array($request->getParameter('idmaquina'), $request->getParameter('idempresa'))), sprintf('Object sdriving_maquina does not exist (%s).', $request->getParameter('idmaquina'), $request->getParameter('idempresa')));
        $this->form = new SdrivingMaquinaForm($sdriving_maquina);
    }

    public function executeUpdate(sfWebRequest $request) {
        $this->forward404Unless($request->isMethod(sfRequest::POST) || $request->isMethod(sfRequest::PUT));
        $this->forward404Unless($sdriving_maquina = Doctrine_Core::getTable('SdrivingMaquina')->find(array($request->getParameter('idmaquina'), $request->getParameter('idempresa'))), sprintf('Object sdriving_maquina does not exist (%s).', $request->getParameter('idmaquina'), $request->getParameter('idempresa')));
        $this->form = new SdrivingMaquinaForm($sdriving_maquina);
        $this->processForm($request, $this->form);
        $this->setTemplate('edit');
    }

    public function executeDelete(sfWebRequest $request) {
        $this->forward404Unless($sdriving_maquina = Doctrine_Core::getTable('SdrivingMaquina')->find(array($request->getParameter('idmaquina'), $request->getParameter('idempresa'))), sprintf('Object sdriving_maquina does not exist (%s).', $request->getParameter('idmaquina'), $request->getParameter('idempresa')));
        $sdriving_maquina->delete();
        $this->getUser()->setFlash('activeTab', 'maquinas');
        $this->redirect('admin/index');
    }

    protected function processForm(sfWebRequest $request, sfForm $form) {
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
        if ($form->isValid()) {
//            try {
            $sdriving_maquina = $form->save();

            $this->getUser()->setFlash('activeTab', 'maquinas');
            $this->redirect('admin/index');
//            } catch (Exception $e) {
//                $this->getUser()->setFlash('error', 'Los valores no pueden estar duplicados, verifíquelo e inténtelo nuevamente');
//            }
        }
    }

}
编辑2

测试后,我得到的结果如下:

originalForm: array(5) { ["idmaquina"]=> string(0) "" ["idempresa"]=> string(1) "1" ["_csrf_token"]=> string(32) "54e5e3984c245e60b17abbf32518d95e" ["patente"]=> string(7) "TB58966" ["no_emisor"]=> string(1) "2" }
致命错误:对中的非对象调用成员函数getValue() /var/www/html/monitor/apps/frontend/modules/maquina/actions/actions.class.php 在线56

因此,
idmaquina
从未获得值

编辑3:解决方案 我做的第一件事是修复
schema.yml
(请参阅以获取最佳信息,不要在此处重复解决方案)。然后在
SdrivingMaquinaForm.class.php文件中,我更改了以下内容:

protected function doUpdateObject($values) {
    parent::doUpdateObject($values);

    if (isset($this['no_emisor'])) {
        if ($this->isNew()) {
            $sdrivingMaquinaEmisor = new SdrivingMaquinaEmisor();
            $this->getObject()->setSdrivingMaquinaEmisor($sdrivingMaquinaEmisor);
        } else {
            $sdrivingMaquinaEmisor = $this->getObject()->getSdrivingMaquinaEmisor();
        }

        $sdrivingMaquinaEmisor->setIdemisor($this->values['no_emisor']);
        $this->getObject()->getSdrivingMaquinaEmisor()->setIdemisor($this->values['no_emisor']);
    }
}

protected function updateDefaultsFromObject() {
    parent::updateDefaultsFromObject();
    if (isset($this['no_emisor'])) {
        $this->setDefault('no_emisor', $this->getObject()->getSdrivingMaquinaEmisor()->getIdemisor());
    }
} 
当然,我还在
configure()
方法中设置
idempresa
,如下所示:

$this->widgetSchema['idempresa'] = new sfWidgetFormInputHidden();
$id_empresa = $this->current_user->getSfGuardUserProfile()->getIdempresa();
$this->setDefault('idempresa', $id_empresa);

就是这样,在修复模式并添加代码之后,事情按我所希望的那样进行了

我可能错了,但我认为您应该在表单configure()函数中为
idmaquina
字段添加小部件和验证器

$this->widgetSchema['idmaquina'] = new sfWidgetFormInputHidden();
$this->validatorSchema['idmaquina'] = new sfValidatorChoice(array('choices' => array($this->getObject()->get('idmaquina')), 'empty_value' => $this->getObject()->get('idmaquina'), 'required' => false));
由于您没有在重载表单中创建它,因此它永远不会将其值保存到表单中,并且当您发送表单时,
idmaquina
将为空。您可以使用表单字段idmaquina的简单var_转储轻松调试它

更改表单后,转到命令行,在symfony项目文件夹中,使用以下命令清除symfony缓存:
symfony cc

请添加以下代码并检查其值:

更新对象中

doUpdateObject($values){
    echo "values: "; var_dump($values); echo "<br />";
    ///...
}
protected function processForm(sfWebRequest $request, sfForm $form) {
    $originalForm = $request->getParameter($form->getName()), 
    $request->getFiles($form->getName());
    echo "originalForm: "; var_dump($originalForm); echo "<br />";
    echo "idmaquina: " . $originalForm['idmaquina']->getValue(); echo "<br />";
    //...
}
doUpdateObject($value){
echo“值:”;var_dump($values);echo“
”; ///... }
过程表单中

doUpdateObject($values){
    echo "values: "; var_dump($values); echo "<br />";
    ///...
}
protected function processForm(sfWebRequest $request, sfForm $form) {
    $originalForm = $request->getParameter($form->getName()), 
    $request->getFiles($form->getName());
    echo "originalForm: "; var_dump($originalForm); echo "<br />";
    echo "idmaquina: " . $originalForm['idmaquina']->getValue(); echo "<br />";
    //...
}
protectedfunctionprocessform(sfWebRequest$request,sfForm$form){
$originalForm=$request->getParameter($form->getName()),
$request->getFiles($form->getName());
echo“originalForm:”;var_dump($originalForm);echo“
”; echo“idmaquina:.$originalForm['idmaquina']->getValue();echo“
”; //... }

您需要确保您正在表单中设置并发送idmaquina的值。

nop,这不是我尝试过的问题,并且出现了相同的错误,这让我疯狂。请将您的模块模板添加到表单中,并将actions.class.php添加到接收请求和表单的函数中。谢谢,我仍然建议将idmaquina添加到表单中,否则您将无法发送其值,因为当您按下submit按钮时,它将永远不会绑定到您正在发送的表单对象中。请再次查看我的帖子并添加:idmaquina小部件和验证器,同时将调试添加到您的代码中,以便我们能够进一步说明发生了什么以及表单中真正发送的值。请添加idmaquina小部件和idmaquina的新验证器。我已经更新了验证器。再次清除symfony缓存非常重要!使用F5在firefox中重新加载表单时,请使用firebug插件查看表单字段idmaquina是否已设置隐藏值。使用firefox检查idmaquina字段是否具有以下形式的值:
欢迎:)当您可以发布您最终如何解决它时,它将是完美的,这样其他人也可以从中受益