2016-03-27 16 views
0

değerlerinde bile eksik alanlar istendiğinde, bazı değerleri manuel olarak ayarladığım ve diğer değerlerin de patchEntity kullanılarak ayarlandığı bir varlık (rezervasyon) var. Ancak kaydetme söz konusu olduğunda, iki zorunlu alanın eksik olduğunu belirten bir hata oluştu. CAKEPHP 3.x - Varlık güncellemesiyle ilgili hata -

Bu

varlık ayıklama neye benzediği:

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' 

} 

Eğer 'tarih' ve görebileceğiniz gibi 'start' alanların bir değere sahip, ancak hatalar bölümünde, bunların olduğunu göstermektedir eksik.

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

Sonra denemek Ben patchEntity kullanın ve kaydetmeden önce, elle ardından başka bir alan ayarlayın ve:

Bu benim ($ tarih ve $ başlangıç ​​karşılık gelen değerlere sahip) yeni varlık yaratmak nasıl

$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 ... 

Ve sonra $ rezervasyon-> hataları() Bu veriyor: böyle kaydetmek için

[ 

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

Gördüğünüz gibi tarih ve başlangıç ​​alanlarının başlangıçta bir değere sahip olduğunda bile talep edildiği iddia ediliyor.

Neyi yanlış yapıyorum?

İşte tablo modeli:

<?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; 
    } 
} 

Ve burada kontrolör bir yöntem vardır:

/** 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

Bize tüm tablo kodunu ve bunu yaptığınız denetleyici eylemini gösterebilir misiniz? Bize sadece bulmacanın küçük bir parçasını veriyorsun. – chrisShick

cevap

0

Sanırım sorunu buldum. Sorun, doğrulayıcıda "requirePresence" kuralıydı. Alan form yoluyla elde edilemediğinden (denetleyici tarafından varsayılan olarak ayarlanır), iletilen dizide mevcut değildir. Haklı mıyım?

Saygılarımızla. Facundo.