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