Estou tentando instalar o widget uploadify (http://www.uploadify.com) e chama-lo no _form da minha página de upload, fiz o download do jquery.uploadify-v2.1.0, descompactei e copiei para o protected/extensions, e usei os seguintes códigos:
public function actionUploadedFiles()
{
// flash does NOT pass the session
// thus we pass the id with a $_POST variable
Yii::app()->session->sessionID = $_POST['PHPSESSID'];
Yii::app()->session->init();
// Do whatever you need to do with the files you just received
$files = var_export($_FILES, true);
$this->log('Files ' . $files);
echo 1;
}
Cara, eu usei o uploadfy uma vez num projeto que não era Yii. Muito bonito e prático, mas evito usar qualquer coisa que tenha flash nas minhas apps (Preferência minha). Não sei até que ponto posso te ajudar, mas vou tentar. O que acontece quando vc tenta subir um arquivo? vc debugou o PHP? Da algum erro no controller?
Então cara, o problema é a instalação do widget, eu não sei como fazer essa instalação no yii, eu apenas descompactei o download do jquery.uploadify que eu baixei e joguei dentro do protected/extensions. Depois disso eu tentei usar a linha de codigo:
YiiBase::require(/home/rafael/public_html/bdd/protected/extensions/uploadify/uploadify.php) [<a href=‘yiibase.require’>yiibase.require</a>]: failed to open stream: No such file or directory
Se puder esclarecer estas duvidas para mim por favor seria de grande ajuda.
Uploadify é apenas o plugin do jquery. euploadify é um widget pra yii que, a partir de sua classe, gera html, css e registra os scripts necessários pra utilizar o uploadfy junto ao yii de maneira mais simpes. então, basicamente, o ero que te da é valido. Quando vc usa o código abaixo, ele em primeiro lugar, procura a classe responsável pela geração do componente em protected/extensions/uploadfy, cujo o nome da classe e do arquivo se chame uploadifyWidget.
Como vc baixou apenas o plugin do JQuery, esta classe não existe, por isso ocorre o erro. Ai vc tem duas opções:
1 - Implementar a classe widget vc mesmo.
2 - Tentar fazer os widgets criados por outros usuários funcionar. Tem 2 aqui no site pra uploadfy.
Como vc já disse que o euploadfy não ta funcionando, tenta usar o segundo. E não se esqueça de criar as actions necessárias no controller pra envio dos arquivos, pois o uploadfy envia os arquivos de forma autônoma ao seu form. Depois poste os resultados
Usa a minha extensão SFancyUpload que você será mais feliz com mais combinações de browsers / SOs…tive problemas com uplodify no Linux e por isso resolvi escrever a extensão, até o momento não me deixou na mão.
O funcionamento é basicamente o mesmo, porém, o Fancy possui barra de progresso geral e por arquivo, controle de fila e singlebutton upload.
Parece uma boa. Aqui na empresa eu vou ter que implementar o upload de fotos no cdastro de produtos, mas to adiando essa tarefa a um tempo já, por não ser primordial. Mas quando o fizer, granto que vou dar uma olhada no seu.
O Fancy, por si só, não grava os dados no banco, mas envia para o seu script de upload e este sim gravaria a descrição do arquivo.
Pode ser feito da seguinte maneira com o fancy:
colocar o input do campo descrição
passar o parâmetro de multiupload para false
enviar nos dados adicionais do fancy (tem uma propriedade "data") o conteúdo do campo descrição
no seu script de upload (a url controller/action que você informa para o fancy) você grava a descrição no banco de dados além de mover o arquivo para o diretório desejado
Não fiz um teste efetivo pra te dizer se funciona porque estou sem meu note aqui, mas com o fancy pelo menos a idéia seria essa.
Eu sugiro que você utilize o outro código de view (o multifile upload) porque este de singlebutton é mais para o usuário trocar a foto do perfil dele (pelo menos eu imagino algo assim)
Estou postando em anexo o código para o controller e o código para a view
Para efeito de teste, por favor, crie um diretório /protected/tmp e dê permissão de escrita para o servidor (para testar, se Linux, 777, se windows, dê permissão controle total para todos nesta pasta tmp debaixo de protected)
O controller coloque dentro do diretório controllers e a view, crie uma pasta dentro de protected/views chamada fancy e coloque lá dentro
Note que eu herdei a classe do controller de "Controller" porque na Yii 1.1 dá erro de breadcrumbs se você herdar direto de CController. Caso esteja utilizando a versão Yii 1.0, por favor, troque
class FancyController extends Controller por class FancyController extends CController
Como isto funciona?
repare no código da view que eu inseri um callback chamado onBeforeStart
Neste callback eu insiro na opção “data” um campo chamado extradata e atribuo a ele o valor do input text chamado descricao. O nome extradata pode ser mudado para o que você precisar, ele estará disponível no controller com um $_POST[‘extradata’]
Lá no controller eu insiro no array de retorno um elemento com o mesmo nome
Ainda não testei inserir no banco, mas eu já tenho uma tabela pronta, pra inserir os dados no banco eu nao preciso de um model ou fazer um crud no yiic?
A minha tabela "upload" tem os seguintes campos:
> idupload (auto-incremento)
> imagename (<nome_arquivo>)
> imageurl (../protected/<nome_arquivo>)
> relatedinformation (<descricao_arquivo>)
É possivel incluir uma funçao assim no FancyController?
Sim, é aconselhável que você tenha um model definido, basta criar um com o yiic.
Acredito que bastaria você incluir os códigos necessários no controller do seu model e apontar nos parâmetros da view que cria o widget do fancy a url do controller/action que você programou.
Só um detalhe que o plugin do fancy utiliza o nome "Filedata" por padrão, então se você checar
$file = CUploadedFile::getInstanceByName("Filedata"); você obtém o arquivo, caso contrário acho que pode acusar algum erro.
Pelo que deu pra perceber, o único atributo que você recebe do usuário é o relatedinformation, então bastaria checar e inserir
if (!empty($_POST[‘descricao’]) && ($file = CUploadedFile::getInstanceByName(“Filedata”)) ) {
// 1 - faça as validações necessárias para evitar upload de arquivos indesejados
$return = array(
'status' => '0',
'error' => 'erro ao obter arquivo ou descrição em branco'
);
}
//devolve para o widget sucesso ou erro
echo json_encode($return);
//o redirect você pode fazer via javascript no callback onSuccess da chamada da widget
Bom, estou sem editor aqui, mas a idéia inicial acho que seria algo assim. Eu não utilizei um atributo do model para o arquivo enviado porque as validações que eu tentei fazer em algumas versões do Yii com arquivos não me deixaram satisfeito, daí parti para a força bruta e fiz no switch case testando o mimetype (confiar só no javascript não é boa idéia).
Acho que isso dá uma idéia…se alguém tiver uma sugestão melhor, adoraria ouvir porque não estou certo se esta seria a implementação mais adequada…