Инструменты пользователя

Инструменты сайта


eaze:samples:добавление_фотогалереи_в_vt_к_объекту

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Both sides previous revision Предыдущая версия
Следущая версия
Предыдущая версия
Следущая версия Both sides next revision
eaze:samples:добавление_фотогалереи_в_vt_к_объекту [2011/09/21 09:49]
sergeyfast
eaze:samples:добавление_фотогалереи_в_vt_к_объекту [2011/09/21 11:12]
sergeyfast
Строка 266: Строка 266:
 ===== SaveEntityAction.php ===== ===== SaveEntityAction.php =====
 Прежде всего мы должны помнить о том, что albums у объекта Entity - лист. ''​EntityFactory::​GetById( $id, array( BaseFactory::​WithLists => true ) )''​ выберет только альбомы,​ без фотографий. Фотографии будем выбрать вручную. Прежде всего мы должны помнить о том, что albums у объекта Entity - лист. ''​EntityFactory::​GetById( $id, array( BaseFactory::​WithLists => true ) )''​ выберет только альбомы,​ без фотографий. Фотографии будем выбрать вручную.
-Создадим метод ''​refillAlbumPhotos()'',​ который добавляет к альбомам фотографии+Создадим метод ''​refillAlbumPhotos()'',​ который добавляет к альбомам фотографии.
 <code php> <code php>
 protected function refillAlbumPhotos( $object ) { protected function refillAlbumPhotos( $object ) {
Строка 280: Строка 280:
     }     }
 } }
 +</​code>​
 +  * дополнительно в EntityPhotoFactory мы добавили поиск по entityId.
 +
 +Далее сделаем так, чтобы фотографии грузились только тогда, когда мы открыли объект для редактирования.
 +<code php>
 +/**
 + * Set Json Albums Data to Template
 + * @return void
 + */
 +protected function beforeSave() {
 +    if ( $this->​action != self::​UpdateAction && !empty( $this->​currentObject->​entityId ) ) {
 +        $this->​refillAlbumPhotos( $this->​currentObject );
 +    }
 +
 +    Response::​setParameter( '​data',​ EntityAlbumUtility::​PrepareAlbumsData( $this->​currentObject ) );
 +}
 +</​code>​
 +  * EntityAlbumUtility::​PrepareAlbumsData() - метод, который подготавливает переменную ''​data''​ для шаблона photos.tmpl.php.
 +
 +Теперь,​ если у объекта есть альбомы и фотографии,​ то мы уже увидим их в шаблоне :).
 +
 +Добавим валидацию альбомов и фотографий.
 +<code php>
 +protected function validate( $object ) {
 +    $errors = parent::​$factory->​Validate( $object );
 +
 +    $albumErrors = EntityAlbumUtility::​ValidateAlbums( $object->​albums );
 +    if ( !empty( $albumErrors ) ) {
 +        $errors['​fields'​]['​photos'​]['​format'​] = '​format';​
 +        Response::​setParameter( '​albumErrors',​ $albumErrors );
 +    }
 +
 +    return $errors;
 +}
 +</​code>​
 +  * fields => photos поможет нам подсветить таб "​Фотографии",​ если на нем были ошибки (''<​div data-row="​**photos**"​...''​ в photos.tmpl.php) и не дать сохранить ошибочный объект в базу.
 +
 +Теперь можно перейти к сохранению. Для этого сначала нужно заполнить $originalObject фотографиями (в оригинальном объекте они нужны для того, чтобы удалить те фотографии,​ которые мы удалили с формы).
 +<code php>
 +protected function beforeAction() {
 +    if ( !empty( $this->​originalObject ) ) {
 +       ​$this->​refillAlbumPhotos( $this->​originalObject );
 +   }
 +}
 +</​code>​
 +
 +add() и update() будут обернуты в транзакцию.
 +<code php>
 +/**
 + * Add Object
 + *
 + * @param Entity $object
 + * @return bool
 + */
 +protected function add( $object ) {
 +    ConnectionFactory::​BeginTransaction();​
 +
 +    $result = parent::​$factory->​Add( $object, array( BaseFactory::​WithReturningKeys => true ) );
 +    $result = $result && EntityAlbumUtility::​SaveAlbums( $object, $this->​originalObject );
 +
 +    ConnectionFactory::​CommitTransaction( $result );
 +
 +    return $result;
 +}
 +
 +
 +/**
 + * Update Object
 + *
 + * @param Entity $object
 + * @return bool
 + */
 +protected function update( $object ) {
 +    ConnectionFactory::​BeginTransaction();​
 +
 +    $result = parent::​$factory->​Update( $object );
 +    $result = $result && EntityAlbumUtility::​SaveAlbums( $object, $this->​originalObject );
 +
 +    ConnectionFactory::​CommitTransaction( $result );
 +    ​
 +    return $result;
 +}
 +</​code>​
 +
 +Последний штрих. При сохранении фоток мы не получаем их идентификаторы,​ из-за этого неправильно работает кнопка "​Применить"​ в режиме редактирование. Исправляется это путем переполучения фотографий только при успешном сохранении.
 +<code php>
 +protected function afterAction( $success ) {
 +    if ( $this->​redirect == '​view'​ && $success ) {
 +        $this->​refillAlbumPhotos( $this->​currentObject );
 +        Response::​setParameter( '​data',​ EntityAlbumUtility::​PrepareAlbumsData( $this->​currentObject ) );
 +    }
 +}
 +</​code>​
 +
 +Не забудьте посмотреть код [[eaze:​samples:​добавление_фотогалереи_в_vt_к_объекту_EntityAlbumUtility.php|EntityAlbumUtility.php]].
 +
 +
 +====== Итог ======
 +Поставленной цели мы добились. Осталось рассмотреть плюсы и минусы подхода.
 +
 +===== Плюсы =====
 +
 +===== Минусы =====
 +
 +
 +
 +
 +
 +
eaze/samples/добавление_фотогалереи_в_vt_к_объекту.txt · Последние изменения: 2011/09/21 11:30 — sergeyfast