2015-05-04 2 views
1

В моем Symfony2 проекта, у меня есть две связки:Два жгуты используют один и тот же слушатель событий

  • UploadBundle, который регистрирует загруженный файл в Database; и * UploadSfdcBundle, который регистрирует upoaded файл в SalesForce

Я использую oneup/uploader-bundle, чтобы загрузить файлы.

Я настроил слушателя событий для каждого комплекта, как это:

Для uploadBundle:

services.yml:

services:       
    envivio_upload.upload_listener: 
     class: Envivio\UploadBundle\Listeners\UploadListener 
     arguments: [@doctrine.orm.entity_manager] 
     tags: 
      - { name: kernel.event_listener, event: oneup_uploader.pre_upload, method: onPreUpload } 
      - { name: kernel.event_listener, event: oneup_uploader.post_upload, method: onPostUpload } 

UploadListener класс загрузки файла в Database

и для UploadSfdcbundle:

services.yml:

services: 
    envivio_upload_sfdc.upload_listener: 
     class: Envivio\UploadSfdcBundle\Listeners\UploadSfdcListener 
     arguments: ["@codemitte_forcetk.client", "@codemitte_forcetk.query_builder"] 
     tags: 
      - { name: kernel.event_listener, event: oneup_uploader.pre_upload, method: onPreUpload } 
      - { name: kernel.event_listener, event: oneup_uploader.post_upload, method: onPostUpload } 

UploadSfdcListener загрузить файл в SalesForce.

Проблема в том, что если я хочу загрузить файл в database, будет выполнен и прослушиватель SalesForce, и наоборот.

Как я могу сказать, Symfony2 использовать UploadListener, когда я загрузке в database и использовать UploadSfdcListener когда я загрузки на Salesforce?

+0

Использование различного события – jamek

+0

Кажется, что вы запускаете оба события, когда выполняете свои закачки, так как кажется, что ваши services.yml прекрасны, поскольку имена обоих событий разные. – Augwa

+0

@jamek как я могу использовать другое событие; событие 'oneup_uploader.pre_upload' предопределено в' oneup/uploader-bundle' – ihssan

ответ

1

Поскольку вы используете OneupUploader, вам следует добавить некоторые пользовательские данные с загрузкой, чтобы вы знали, какой процесс/тип загрузки запускается. Каждый контроллер/служба, которая отвечает за отображение страницы twig, должна передать пользовательскую переменную, доступную в twig, которую я называю «filetype». В вашем Salesforce пачке установите

$filetype = 'salesforce'; 

Я использую blueimp фронтэнда и вот как добавить custom data на вашей странице веточку:

<script type="text/javascript"> 
$(document).ready(function() 
{ 
    var url = "{{ oneup_uploader_endpoint('salesforce') }}"; 
    $('#fileupload').fileupload({ 
     url: url, 
     dataType: 'json', 
     formData: { 
      id: "{{user.getId}}" 
      ,filetype: "salesforce" 
      }, 
     done: function (e, data) { 
      $.each(data.result.files, function (index, file) { 
       $("#begin").remove(); 
       $('<p/>').text(file).appendTo('#files'); 
       console.log(file); 
       console.log(data.result.files[index].name); 
      }); 
      $('#progress .progress-bar').css('width', '100%'); 
     }, 
     progressall: function (e, data) { 
      var progress = parseInt(data.loaded/data.total * 100, 10); 
      $('#progress .progress-bar').css(
       'width', 
       progress + '%' 
     ); 
    } 
    }); 
    $("#fileupload").change(function() { 
      $('<p id="begin">Upload started...</p>').appendTo("#files"); 
    }); 
}); 

В моем прослушивателя событий у меня есть:

public function onUpload(PostPersistEvent $event) { 
    ... 
    $uploadtype = $request->get('filetype'); 

    switch ($uploadtype) { 
     //custom logic for each different type of upload 
    } 

    //code always processed for all files 

} 

При тестировании я использую хром и смотрю на вкладку консоли, чтобы увидеть данные tha t, а затем проверить журналы dev, чтобы узнать, что вызывается и обрабатывается. Для правильной работы потребовалось немного работы, но у меня много разных частей, где люди могут загружать файлы с различными целями для этих файлов.Некоторые из них сохраняются в частной области, некоторые из них размещаются в общедоступной службе хранения, и мне было проще всего, чтобы 1 прослушиватель событий разбирался в том, что следует обрабатывать вместо нескольких слушателей.

Одна проблема с этим - это то, с чем это связано? Если вы хотите сделать свой код повторно используемым, вы можете захотеть отдельных слушателей для каждого пакета и обработать только тип файла, подходящий для этого пакета. У меня есть «главный комплект», который управляет другими пакетами, и это то, где у меня есть слушатели событий. Он хорошо работает для этого проекта, но не обязательно чист.

Я открыт для чьих-либо мыслей, если они делают это по-другому, поскольку это очень распространенная ситуация.

+0

спасибо за ответ, но я не понял, куда я должен положить точно: '$ filetype = 'salesforce';' в моем коде – ihssan

+0

Вы можете добавить это к контроллеру, который вызывает файл twig, который отображает страницу загрузки, и вам нужно передать его в файл twig. – George

+0

спасибо за решение – ihssan

2

Каждый прослушиватель событий получает объект события PostUploadEvent/PreUploadEvent. Это имеет метод getType() (который является ключом настройки onup_uploader.mappings). Используя это значение, вы можете определить, какой контроллер был использован. Если это неверно, используйте return, чтобы остановить выполнение метода.

+0

Я попытался 'event-> getType()', но он возвращает каталог при загрузке файла, потому что в дополнение к хранению информации о файле в базе данных я сохраняю загруженный файл в определенном каталоге, поэтому я не работаю для меня – ihssan

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