2016-03-27 45 views
0

私はいくつかの値を手動で設定し、他の値はpatchEntityを使用して設定するエンティティ(予約)を持っています。 しかし、保存になると、2つの必須フィールドがないことを示すエラーが表示されます。CAKEPHP 3.x - エンティティ更新のエラー - 値がある場合でも主張されていないフィールド

これは、エンティティのデバッグは、次のようになります。「日付」、あなたが見ることができるように

object(App\Model\Entity\Booking) { 

    'provider_pk' => (int) 2, 
    'date' => object(Cake\I18n\Time) { 

     'time' => '2016-03-31T00:00:00+00:00', 
     'timezone' => 'UTC', 
     'fixedNowTime' => false 

    }, 
    'start' => object(Cake\I18n\Time) { 

     'time' => '2016-03-31T08:00:00+00:00', 
     'timezone' => 'UTC', 
     'fixedNowTime' => false 

    }, 
    'modules_count' => (int) 1, 
    'requester_pk' => (int) 1, 
    'remarks' => '', 
    'status_id' => (int) 1, 
    'end' => object(Cake\I18n\Time) { 

     'time' => '2016-03-31T09:00:00+00:00', 
     'timezone' => 'UTC', 
     'fixedNowTime' => false 

    }, 
    '[new]' => true, 
    '[accessible]' => [ 
     '*' => true 
    ], 
    '[dirty]' => [ 
     'provider_pk' => true, 
     'date' => true, 
     'start' => true, 
     'modules_count' => true, 
     'requester_pk' => true, 
     'remarks' => true, 
     'status_id' => true, 
     'end' => true 
    ], 
    '[original]' => [], 
    '[virtual]' => [], 
    '[errors]' => [ 
     'date' => [ 
      '_required' => 'This field is required' 
     ], 
     'start' => [ 
      '_required' => 'This field is required' 
     ] 
    ], 
    '[invalid]' => [], 
    '[repository]' => 'Bookings' 

} 

、および「スタート」フィールドに値を持っていますが、エラーのセクションでは、それは彼らがしていることを示してい行方不明

この私が新しいエンティティ($日と$開始し、対応する値を持つ)を作成する方法である:

$booking = $this->Bookings->newEntity([ 'provider_pk' => $provider_pk, 'date' => $date, 'start' => $start ]); 

その後、私はpatchEntityを使用して、それを保存する前に、私は手動で別のフィールドを設定し、してみてくださいこのようにそれを保存するために:)

$booking = $this->Bookings->patchEntity($booking, $this->request->data); 

    $booking->end = $end->modify('+' . $booking->modules_count . ' hours'); 
    if ($this->Bookings->save($booking)) 
    { 
     $this->Flash->success(__('The booking has been saved.')); 
     return $this->redirect(['action' => 'show' ]); 
    } else ... 

そして$ booking->エラーは、(これを与える:

[ 

    'date' => [ 
     '_required' => 'This field is required' 
    ], 
    'start' => [ 
     '_required' => 'This field is required' 
    ] 
] 

あなたが見ることができるように、元の値があったとしても、日付フィールドと開始フィールドは必須であると主張されています。

私は間違っていますか?ここで

はテーブルモデルです:

<?php 
namespace App\Model\Table; 

use App\Model\Entity\Booking; 
use Cake\ORM\Query; 
use Cake\ORM\RulesChecker; 
use Cake\ORM\Table; 
use Cake\Validation\Validator; 

/** 
* Bookings Model 
* 
* @property \Cake\ORM\Association\BelongsTo $Statuses 
*/ 
class BookingsTable extends Table 
{ 

    /** 
    * Initialize method 
    * 
    * @param array $config The configuration for the Table. 
    * @return void 
    */ 
    public function initialize(array $config) 
    { 
     parent::initialize($config); 

     $this->table('bookings'); 
     $this->displayField('id'); 
     $this->primaryKey('id'); 

     $this->belongsTo('Statuses', [ 
      'foreignKey' => 'status_id', 
      'joinType' => 'INNER' 
     ]); 

     // --------------------------------------------------------------------- 
     // customize for every project 

     $this->hasMany('Aircrafts'); 
     $this->belongsTo('Pilots', [ 'foreignKey' => 'requester_pk', 'joinType' => 'LEFT' ]); 

    } 

    /** 
    * Default validation rules. 
    * 
    * @param \Cake\Validation\Validator $validator Validator instance. 
    * @return \Cake\Validation\Validator 
    */ 
    public function validationDefault(Validator $validator) 
    { 
     $validator 
      ->integer('id') 
      ->allowEmpty('id', 'create'); 

     $validator 
      ->date('date') 
      ->requirePresence('date', 'create') 
      ->notEmpty('date'); 

     $validator 
      ->dateTime('start') 
      ->requirePresence('start', 'create') 
      ->notEmpty('start'); 

     $validator 
      ->dateTime('end') 
      ->requirePresence('end', 'create') 
      ->notEmpty('end'); 

     $validator 
      ->integer('modules_count') 
      ->requirePresence('modules_count', 'create') 
      ->notEmpty('modules_count'); 

     $validator 
      ->integer('requester_pk') 
      ->requirePresence('requester_pk', 'create') 
      ->notEmpty('requester_pk'); 

     $validator 
      ->integer('provider_pk') 
      ->allowEmpty('provider_pk'); 

     $validator 
      ->integer('assistant_pk') 
      ->allowEmpty('assistant_pk'); 

     $validator 
      ->allowEmpty('remarks'); 

     return $validator; 
    } 

    /** 
    * Returns a rules checker object that will be used for validating 
    * application integrity. 
    * 
    * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. 
    * @return \Cake\ORM\RulesChecker 
    */ 
    public function buildRules(RulesChecker $rules) 
    { 
     $rules->add($rules->existsIn(['status_id'], 'Statuses')); 
     return $rules; 
    } 
} 

そしてここでは、コントローラのメソッドです:

/** form for booking confirmation 
* 
* @param string|null $id cell id. 
* @return \Cake\Network\Response|null Redirects to bookings/show . 
**/ 

public function confirmBooking() 
{ 
    if(isset($this->request->query['id'])) 
    { 
     $id = $this->request->query['id']; 

     $token = strpos($id, '-'); 

     $day = substr($id, $token + 1 , 2); 
     $month = substr($id, $token + 3 , 2); 
     $year = substr($id, $token + 5 , 4); 
     $hour = substr($id, $token + 9 , 2); 
     $minutes = substr($id, $token + 11, 2); 

     $date = Time::createFromTimestamp(mktime(0, 0, 0, $month, $day, $year)); 
     $start = Time::createFromTimestamp(mktime($hour, $minutes, 0, $month, $day, $year)); 
     $end = Time::createFromTimestamp(mktime($hour + 1, $minutes, 0, $month, $day, $year)); 
     $provider_pk = substr($id, 1, $token - 1); 
    } 

    $aircrafts = $this->Bookings->Aircrafts->find('all', [ 'order' => 'registration' ]); 
    $this->set('aircrafts', $aircrafts); 

    // --------------------------------------------------------------------- 
    // depending on add or update 

    if(isset($this->request->query['booking_id'])) 
     $booking = $this->Bookings->get($this->request->query['booking_id'], [ 'contain' => [ 'Pilots' ] ]); 
    else 
    { 
     $booking = $this->Bookings->newEntity([ 'provider_pk' => $provider_pk, 'date' => $date, 'start' => $start, 'end' => $end, 'modules_count' => 1 ]); 
    } 

    if ($this->request->is('post') || ($this->request->is('put') && isset($this->request->query['booking_id']))) { 

     debug($this->request->data); 

     $booking = $this->Bookings->patchEntity($booking, $this->request->data); 

     $booking->end = $end->hour($this->request->data[ 'end_value' ][ 'hour' ]); 

     $booking->modules_count = $booking->end->diff($booking->start)->format('%h'); 


     if ($this->Bookings->save($booking)) 
     { 
      $this->Flash->success(__('The booking has been saved.')); 
      return $this->redirect(['action' => 'show' ]); 
     } else 
     { 
      $this->Flash->error(__('The booking could not be saved. Please, try again.') ); 
      return $this->redirect(['action' => 'show']); 
     } 
    } 

    $statuses = $this->Bookings->Statuses->find('list', ['limit' => 200]); 
    $assistants = $this->Bookings->Pilots->find('list' , [ 'conditions' => [ 'is_instructor =' => true ], 'fields' => [ 'id', 'firstname' ] ]);   
    $providers = $this->Bookings->Aircrafts->find('list' , [ 'fields' => [ 'id', 'registration' ] ]);   
    $requesters = $this->Bookings->Pilots->find('list' , [ 'fields' => [ 'id', 'lastname' ] ]);   

    $this->set(compact('booking', 'statuses')); 

    $this->set('_serialize', ['booking']); 
    $this->set('assistants', $assistants); 
    $this->set('providers', $providers); 
    $this->set('requesters', $requesters); 
}   
+0

テーブルコードだけでなく、これを実行しているコントローラアクションをすべて表示できますか?あなたは私たちにパズルの小さな部分を与えているだけです。 – chrisShick

答えて

0

私は問題を発見したと思います。 問題はバリデーターの "requirePresence"ルールでした。 フィールドはフォームから取得されないため(コントローラによってデフォルトとして設定されます)、渡された配列には存在しません。 私はそうですか?

よろしくお願いいたします。 ファンクド。

関連する問題