rafaelyukio, on 26 January 2010 - 11:38 AM, said:

Muitoooo legal!
O upload funcionou certinho aqui!
Muito Obrigado, Scoob!
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?
public function actionCreate()
{
Yii::app()->setLanguage(Yii::app()->user->sitelanguage);
$model=new upload;
if(isset($_POST['upload']))
{
$model->attributes=$_POST['upload'];
$model->imagename = CUploadedFile::getInstance($model, "imagename");
$model->imagename->saveAs('protected/views/upload/images/'.$model->imagename->getName());
$model->imageurl = "protected/views/upload/images/".$model->imagename->getName();
if($model->save())
{
//echo "Upload done!";
//echo $model->imageurl."|||".$model->idupload;
//echo $model->imagename."|||".$model->idupload;
exit();
}//$this->redirect(array('show','id'=>$model->idupload));
}
$this->renderPartial('create',array('model'=>$model));
}
Grato,
Rafael Yukio
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
switch(CFileHelper::getMimeType($file->getTempName())){
case 'application/zip':
break;
case 'image/jpeg':
$info = @getimagesize($file->getTempName());
if ($info) {
$return['width'] = $info[0];
$return['height'] = $info[1];
$return['mime'] = $info['mime'];
}
break;
default:
$return = array(
'status' => '0',
'error' => 'Tipo de arquivo não permitido'
);
}
// 2 - defina um save path
$savePath = Yii::app()->getBasePath().'/views/upload/images/';
// 3 - atribua os outros valores
$model = new upload;
$model->imagename = $file->getName();
$model->imageurl = $savePath . $file->getName(); //não sei se você quer o caminho físico ou a url, ajustar conforme necessário
$model->relatedinformation = $_POST['descricao'];
if ($model->save()){
//vamos retornar sucesso para a widget do fancy
$return = array(
'status' => '1',
'name' => $file->getName()
);
// 4 - salva a imagem
$model->imagename->saveAs($savePath.$model->imagename->getName());
} else {
$return = array(
'status' => '0',
'error' => 'erro na gravação'
);
}
} else {
$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..
Abraços!!!