Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Luis Paullo

[Resolvido] Enviar arquivo EXTJS

Recommended Posts

Salve pessoal seguinte..

 

to com um sistema Extjs em MVC..

 

Tava tudo ok até eu tenta enviar um arquivo .. Simplismente não consigo recupera o arquivo

no PHP.

 

Meu extjs

////  View 
//ta assim campo q envia o arquivo
{
	inputType:'file',
	allowBlank: true,
	name: 'img-file',
               fieldLabel: 'Add Imagem'
           }

STORE.js

meu store ta assim
....
proxy: {
       simpleSortMode: true,
       type: 'ajax',
       api: {
           read: 'noticia.php',
           create: 'noticiaInsert.php',
           update: 'noticiaAction.php?action=update',
           destroy: 'noticiaAction.php?action=delete'
       },
       actionMethods: {
           read: 'POST',
           create: 'POST',
           update: 'POST',
           destroy: 'POST'
       },  
       reader: {
           type: 'json',
           root: 'data',
           successProperty: 'success'
       },
       writer: {
           type: 'json',
           writeAllFields: true,
           encode: true,  
           root: 'data'
       },
       extraParams: { 
           start : 'start',   
           limit : 'limit',  
           sort : 'nome',    
           dir : 'ASC', 
           total:'total' 
       }, 

meu php ta assim

 

//recebe os dados vindo do Formulario.. e decodifica

$obj = json_decode($_REQUEST['data'],true);

 

eu tenho que descodificar os POST..

funciona normal com todos campos

 

mais qndo é o arquivo simplismente manda o name'img-file' em branco.

 

num consigo pega nenhum $_FILES['img-file'] no meu php

 

alguem sabe como posso resolve.

 

desde já agradeço

Compartilhar este post


Link para o post
Compartilhar em outros sites

você poderia passar a view completa? Porque não dá para saber se está usando um form ou o campo diretamente...

 

So um detalhe, o xtype para o campo de upload de arquivos é filefield ou fileuploadfield (http://docs.sencha.com/ext-js/4-0/#!/api/Ext.form.field.File) e não existe proprieadade fieldType.

Compartilhar este post


Link para o post
Compartilhar em outros sites

opa ta ae

 

abstract combo e form não tem nd alem de configs simples

 

abstract window tem os botões que submit meu form

Abstract Windows:

Ext.define('Admv2.view.AbstractWindow',{
   extend: 'Ext.window.Window',
   alias: 'widget.abstractwindow',
   title: 'Edição',
   layout: 'fit',
width: '',
   autoShow: true,
   modal: true,

   initComponent: function(){

       this.buttons = [{
           text: 'Salvar',
           action: 'save',
           iconCls: 'save'
       },
       {
           text: 'Cancelar',
           scope: this,
           iconCls: 'cancel',
           handler: this.close
       }];

       this.callParent(arguments);
   }
});

 

meu views form

View:


Ext.require(['Admv2.view.AbstractForm']);
Ext.require(['Admv2.view.AbstractWindow']);	
Ext.require(['Admv2.view.noticia.Combo']);	

Ext.define('Admv2.view.noticia.Edit', {
   extend: 'Admv2.view.AbstractWindow',
   alias : 'widget.noticiaEdit',
   title : 'Edição Noticias',
width:600,
maximizable: true,

   initComponent: function() {

       this.items = [{
           xtype: 'abstractform',
           items: [{
                name : 'nome',
                fieldLabel: 'Nome'

          	 },{ xtype:'noticiaCombo' },{

//upload
	          xtype: 'fileuploadfield',
	          emptyText: '',
	          fieldLabel: 'Thumb Image',
	          buttonText: 'Select a File',
	          name: 'ufile',
	          id: 'form-file-3'
	 },{ 
                xtype: 'htmleditor',
		flex: 1,
		labelAlign: 'top',
                height: 300,
		name: 'text',
                fieldLabel: 'Texto'

           }
        ]}
       ];

       this.callParent(arguments);
   }
});

 

Controllers:

Ext.require('Ext.window.MessageBox');

Ext.define('Admv2.controller.Noticia', {
   extend: 'Ext.app.Controller',
   stores: ['Noticias'],
   models: ['Noticia'], 

   views: [
   'noticia.List',
   'noticia.Edit'
   ],

   refs: [
   {
       ref:'noticiaEdit', 
       selector:'noticiaEdit'
   },
   {
       ref:'noticiaList', 
       selector:'noticiaList'
   }
   ],

   init: function() {
       this.control({
           'noticiaList': {
               itemdblclick: this.edit
           },

           'noticiaList button[action=insert]': {
               click: this.insert
           },

           'noticiaList button[action=edit]': {
               click: this.edit
           },

           'noticiaList button[action=destroy]': {
               click: this.destroy
           },

           'noticiaList button[action=refresh]': {
               click: this.refresh
           },

           'noticiaEdit button[action=save]': {
               click: this.save
           }
       });
   },

   disparandoNossoEvento: function(){
       console.log('Evento customizado detectado');
   },

   refresh: function(){
       this.getNoticiaList().store.load();
   },

   insert: function(btn, evt, opt) {
       var view = Ext.widget('noticiaEdit');
       view.setTitle('Inserindo nova Noticia');
   },

   destroy: function() {

       var grid    = this.getNoticiaList(),
           records = grid.getSelectionModel().getSelection();

       if(records.length === 0){
           Ext.Msg.alert('Atenção', 'Nenhum registro selecionado');
           return false;
       }else{
           Ext.Msg.show({
               title : 'Confirmação',
               msg : 'Tem certeza que deseja deletar o(s) registro(s) selecionado(s)?',
               buttons : Ext.Msg.YESNO,
               icon : Ext.MessageBox.WARNING,
               scope : this,
               width : 450,
               fn : function(btn, ev){
                   if (btn == 'yes') {
                       var store = this.getNoticiaList().store;
                       store.remove(records);
                       this.getNoticiaList().store.sync();
                   }
               }
           });
       }
   },

   save: function(button, evt, opt) {	

       var win     = button.up('window'),
           form    = win.down('form').getForm(),
           id      = form.getRecord() ? form.getRecord().get('id') : 0;

       if (form.isValid()) {
           var record = form.getRecord(),
               values = form.getValues();

           if (record){
               if(record.data['id']){
                   record.set(values);
               }
           } else{
               var record = Ext.create('Admv2.model.Noticia');
               record.set(values);
               this.getNoticiaList().store.add(record);
           }

           win.close();
           this.getNoticiaList().store.sync();
       }else{
           Ext.ux.Msg.flash({
               msg: 'Há campos preenchidos incorretamente',
               type: 'error'
           });

       }

   },

   edit: function(){

       var records = this.getNoticiaList().getSelectionModel().getSelection();    	

       if(records.length === 1){
           var editWind = Ext.widget('noticiaEdit');    	
           var editForm = editWind.down('form');
           var record = records[0];
           editForm.loadRecord(record);
       }else{
           return;
       }		
   }

});

 

mais importante do store ta no topic acima

 

fico meio grande o topic =X .. mais to realmente precisando faze essa upload funciona :(

 

Pensei no caso de fazer tudo direto pela Views..

 

ao invez de passa pra controller o envio dos dados .. joga um "form.submit()", na propria views..

 

sera q teria como?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pensei no caso de fazer tudo direto pela Views..

 

Pegue este pensamento, o amasse, e jogue-o na lixeira. :P

 

sera q teria como?

 

Ter tem, mas seria o correto?

Re: Não.

 

Você deve seguir o padrão MVC, e quem deve controlar o fluxo de sua aplicação é algum Controller. Neste caso o Admv2.controller.Noticia.

 

Agora que você mudou o xtype, o que o PHP recebe, continua a receber uma array vazia?

O Console do firefox exibe algum erro? O campo exibido no formulário realmente é um campo de upload? Tem algum exemplo online?

Compartilhar este post


Link para o post
Compartilhar em outros sites

=X vai sai do padrão MVC msm

 

o firebug m retorna isso

 

data	[{"id":"","idCateg":2,"nome":"nome","nomeCateg":"","text":"\u200bsdfadfasdfasdfasdfasdfasd","tags":"","categoria":"","status":"0","ufile":"","data":""},{"id":"","idCateg":2,"nome":"asdaSDAsdaSD","nomeCateg":"","text":"\u200bSADFASDFASDFASDFASDF","tags":"","categoria":"","status":"0",   "UFILE":""   ,"data":""}]
dir	ASC
limit	limit
sort	nome
start	start
total	total

 

problema acho q está no fato que eu passo os dados via POST decodificado... sei la =X

 

O 'UFILE' destaquei la so pra mostra..

 

ele continua vindo fazio..

 

eu poderia despara um evento novo na controller fazendo o submit(). problema q so iniciante ainda num sei como ficaria isso

 

minha ideia seguinte..

 

VIEW.
this.buttons = [{
           text: 'Salvar',
           action: 'UPLOAD',
           iconCls: 'save'
       }
CONTROLLER

init: function() {
       this.control({


          'noticiaList button[action=UPLOAD]': {
               click: this.disparaUpload
          }, ....
// aqui seria o submit novo porem .. eu num sei como faze aqui
disparaUpload: function()

var form = this.up('form').getForm();
                   form.submit({
                       url: 'upload.php',
                       waitMsg: 'Sending Data',

 

seria nessa Controller que postei no topic acima.. disparando um evento personalizado

 

como que faço essa function() funcion?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Man, desculpa mas não entendi direito. Você gostaria de disparar uma função quando o evento de envio do form fosse ativado, é isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

queria faze um evento que envia os dados =X

 

eu ja tenho um so que ele num manda o FILES.. então faço outro diferente..

 

olha a função de save(submit).

    save: function(button, evt, opt) {	

       var win     = button.up('window'),
           form    = win.down('form').getForm(),
           id      = form.getRecord() ? form.getRecord().get('id') : 0;

       if (form.isValid()) {
           var record = form.getRecord(),
               values = form.getValues();

           if (record){
               if(record.data['id']){
                   record.set(values);
               }
           } else{
               var record = Ext.create('Admv2.model.Noticia');
               record.set(values);
               this.getNoticiaList().store.add(record);
           }

           win.close();
           this.getNoticiaList().store.sync();
       }else{
           Ext.ux.Msg.flash({
               msg: 'Há campos preenchidos incorretamente',
               type: 'error'
           });

       }

   }

 

num achei nd sobre envia arquivo em MVC no Extjs..

Compartilhar este post


Link para o post
Compartilhar em outros sites

ta ai

Ext.define('Admv2.model.Noticia', {
   extend: 'Ext.data.Model',
   fields: [
    { name: 'id' },
	{ name: 'idCateg' },
	{ name: 'nome', type: 'string' }, 
	{ name: 'nomeCateg', type: 'string'},
	{ name: 'text', type: 'string' }, 
	{ name: 'tags', type: 'string'},
	{ name: 'categoria', type: 'string'}, 
	{ name: 'status'},
	{ name: 'ufile'}, // o campo do file
	{ name: 'data'}
   ]
});

 

ta dificil recupera esse danado do FILE no meu php =X

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá me parecendo problema com o teu store e o campo, você já tentou fazer um envio normal, sem usar o store? APenas enviar os dados para determinada url e verificar se recebe os dados?

 

Veja: http://loianegroner.com/2011/07/extjs-4-file-upload-spring-mvc-3-example/

Compartilhar este post


Link para o post
Compartilhar em outros sites

sem passa pelo store eu pego.. =(

 

direto na views fiz assim :

 

quero passa isso pra um evento na Controllers agora

   this.buttons = [{ 
			text: 'Save',
			iconCls: 'save',
               handler: function() {
				 var win     = this.up('window'),
             			 form    = win.down('form').getForm()
                   form.submit({
                       url: 'noticiaInsert.php',
                       waitMsg: 'Sending Data',
                       success: function(form, o) {
                           alert(o.response.responseText);
                       }
                   });
			}
		},{
           text: 'Cancelar',
           scope: this,
           iconCls: 'cancel',
           handler: this.close
       }];

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvido *______*

 

fiz assim no meu controller

 

save: function(button, evt, opt) {	

       var win     = button.up('window'),
           form    = win.down('form').getForm(),
           id      = form.getRecord() ? form.getRecord().get('id') : 0;

		 if (form.isValid()) {

			 var  record  = form.getRecord(),
				  values  = form.getValues();

			if(record){
				var u = 'uploadNot.php?action=update'; 
				 console.log('to no update');
			}else{
				var  u = 'uploadNot.php';
				 console.log('to no insert');
			}
			 form.submit({
				 methods:'POST',
                                 url: u,
				      success: function.... 


Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.