2015-04-23 3 views
0

Я в процессе преобразования проекта от 2.x до 3.x. Через неделю я наконец начал понимать новую ОРМ, за исключением ...cakePHP 3.0 игнорировать сущности accessors при сохранении

Я не очень хорошо пытаюсь сделать то, что когда-то было легко достигнуто с помощью обратного вызова жизненного цикла в модели ,

У меня есть таблица Files с created и modifiedDATETIME колонны. Я использую поведение меток торта в моем классе FilesTable. Все работает правильно до этого момента.

Проблема возникает, когда я пытаюсь использовать accessor _getModified($modified) в классе сущности File для форматирования любого из полей. Он отлично работает при получении существующих записей, которые уже находятся в правильном формате DATETIME, но когда я пытаюсь сохранить что-либо новое, он пытается сохранить форматированную версию аксессура, а не версию поведения Timestamp, что приводит к сохранению 0000-00-00 00:00:00.

Вкратце: я хочу, чтобы аксессор игнорировался при вставке/обновлении записей.

Вот мой File объект класса:

class File extends Entity { 
    protected function _getModified($modified) { 
     $today = date("m-d-y"); 
     $year = date("Y"); 
     $file_day = date("m-d-y", strtotime($modified)); 
     $file_year = date("Y", strtotime($modified)); 

     if($today === $file_day){ 
      return 'Today ' . date('g:ia', strtotime($modified)); 
     } else if ($year !== $file_year) { 
      return date('M j, Y', strtotime($modified)); 
     } else { 
      return date('M j, g:ia', strtotime($modified)); 
     } 
    } 
} 

Заранее спасибо за любую помощь!

ответ

2

Вы должны рассмотреть вопрос о создании виртуальной собственности как

protected function _getFormattedDate() 
{ 
    // Move here code from _getModified 
    // $modified = $this->_properties['modified'] 
} 

удалить ваш _getModified метод и пусть Отметка Поведение контролировать аксессоров/мутаторов для modified собственности

Entities > Creating Virtual Properties

Примечание: При преобразовании объектов в JSON или массивы вам нужно явно указывать виртуальные поля, которые должны быть экспортированы в результат. В этом случае добавьте в Entity класса

protected $_virtual = ['formatted_date']; 

Entities > Exposing Virtual Properties

+0

Поскольку это, кажется, служат лишь презентационные цели, я бы также рассмотреть возможность обработки этого с помощью помощников. – ndm

+0

Ответ Романа был бы правильным, за исключением: я извлекаю эти данные с помощью запроса ** AJAX ** и возвращая объект ** JSON ** с результатами ** find **. Виртуальные свойства не могут использоваться в находках. Я ищу способ форматировать поле и иметь его в результатах без необходимости прокручивать результаты. Опять-таки, что-то вроде того, что мы делали с ** afterFind ** в 2.x. –

+0

, если вы выставляете виртуальную собственность, ее следует экспортировать в результат JSON. Попробуйте добавить эту строку в свой класс Entity: 'protected $ _virtual = ['formatted_date'];' –

Смежные вопросы