2013-06-25 2 views
0

У меня проблема, и я не могу найти, что не так. Я пытаюсь обновить объект до выполнения формы метод сохранения и я как следует (я написал весь класс на всякий случай):Doctrine_Record_Exception «Не удалось вызвать Doctrine_Core :: set()» при попытке сохранить данные формы

class SdrivingMaquinaForm extends BaseSdrivingMaquinaForm { 

    protected $current_user; 

    public function configure() { 
     $this->current_user = sfContext::getInstance()->getUser()->getGuardUser(); 

     unset($this['updated_at'], $this['created_at']); 

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

     $this->widgetSchema['no_emisor'] = new sfWidgetFormDoctrineChoice(array('model' => 'SdrivingEmisor', 'add_empty' => 'Seleccione un Emisor', 'table_method' => 'fillChoice')); 
     $this->validatorSchema['idempresa'] = new sfValidatorPass(); 
     $this->validatorSchema['no_emisor'] = new sfValidatorPass(); 
    } 

    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']); 
     } 
    } 
} 

Это 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 } 

Как вы можете заметить ни одно отношение много для многих. Когда я отправить форму, я получаю эту ошибку:

Couldn't call Doctrine_Core::set(), second argument should be an instance of Doctrine_Collection when setting one-to-many references.

И я не мог найти, где ошибка, так что любая помощь будет оценена. Кроме того, я замечаю это в трассировке стека:

at SdrivingMaquinaForm->doUpdateObject(array('idmaquina' => null, 'idempresa' => '1', 'patente' => 'TB58922', 'no_emisor' => '2')) 

Почему idmaquina является null? Там должно пойти значение maquina, которое я создаю в тот же момент. Должен ли я изменить свою логику и обновить значения отношений после сохранения maquina? В этом случае, как я получаю id из новейших maquina?

EDIT шаблона: _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> 

Действие Класс: action.class.php

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'); 
//   } 
     } 
    } 

} 

EDIT 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" } 

Fatal error: Call to a member function getValue() on a non-object in /var/www/html/monitor/apps/frontend/modules/maquina/actions/actions.class.php on line 56

Так idmaquina никогда не получает значение

EDIT 3: Решение Первое, что я был исправить schema.yml (см this post для лучшей информации и не повторять решение здесь). Затем в 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()); 
    } 
} 

конечно же я поставил idempresa на configure() следующим способом:

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

Это было все, после того, как исправить схему и добавить код вещи работает, как я хочу

ответ

1

Возможно, вы ошибаетесь, но я думаю, вы должны добавить виджет и валидатор в поле idmaquina в свою форму configure().

$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 будет нулевым.Вы можете легко отладить его с помощью простого var_dump поля формы idmaquina.

После изменения формы, перейдите в командную строку и в папку Symfony проекта, очистить кэш Symfony с: symfony cc

Пожалуйста, добавьте следующий код и проверить его значение:

В doUpdateObject:

doUpdateObject($values){ 
    echo "values: "; var_dump($values); echo "<br />"; 
    ///... 
} 

В processForm:

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 />"; 
    //... 
} 

Вы должны убедиться, что вы устанавливаете и посылая значение idmaquina в вашей форме.

+0

nop, это не проблема, я пробовал и получаю ту же ошибку, что и этот диск, я с ума сошел – Reynier

+0

Пожалуйста, добавьте свой шаблон модуля в форму и свои действия.class.php с функцией, которая получает запрос и форму. – xtrm

+0

Я добавил к основному сообщению, см. Edit – Reynier