Tylër 0 Denunciar post Postado Julho 13, 2010 Boa tarde a todos, estou com problemas ao atualizar ou deletar tópico, onde atualizar todos os dados do banco de dados, realizar o upload e atualiza o campo "imagem" no BD também, mas não deleta a imagem antiga do servidor de jeito nenhum.... Para adiantar, segue toda a minha classe posts_controller.php <?phpclass PostsController extends AppController{ var $name = 'Posts'; var $uses = array( 'Post', 'Categoria' ); var $pageTitle = 'Posts'; # chamando alguns helpers para componentes especiais, como o paginate (Form) var $helpers = array( 'Html', 'Form', 'Javascript', 'Session' ); var $paginate = array( 'limit'=>10, 'page'=>1, 'order'=>array('Post.id'=>'asc') ); var $components = array( 'UparFotos' ); function index() { #$this->set( 'posts', $this->Post->find('all') ); # lista todos os posts relativos ao Model 'Post' $this->Post->recursive = 0; $this->set( 'posts', $this->paginate() ); # gera a paginacao } function view( $id = null ) { $this->Post->id = $id; $this->set( 'post', $this->Post->read() ); # lendo um post especifico } function add() { $categoria = $this->Categoria->find( 'list', array('conditions'=>'categoria.id') ); $this->set( 'categoria', $categoria ); if( !empty($this->data) ) { $path = '../../../images/posts'; # Se houver uma foto, mando para o componente if( $this->data['Post']['fotodestaque']['name'] ) { $nome_novo = date('HisYmd'); # Envia o conteudo do field para o componente $this->UparFotos->fotos( $this->data['Post']['fotodestaque'] ); $resultado = $this->UparFotos->redimensiona_salva( 250, $path, $nome_novo ); # Salva a imagem no BD $this->data['Post']['photo'] = $resultado; } if( $this->Post->save($this->data) ) { $this->Session->setFlash('O post foi salvo!', 'default', array('class'=>'flash_good') ); $this->redirect('/posts/'); } } } function edit( $id = null ) { $this->Post->id = $id; if( !empty($this->data) ) { if( $this->data['Post']['fotodestaque']['name'] ) { if( $this->data['Post']['photo'] ) { unlink("../../../images/posts/".$this->data['Post']['photo']); } $this->UparFotos->fotos( $this->data['Post']['fotodestaque'] ); $nome_novo = date('HisYmd'); $resultado = $this->UparFotos->redimensiona_salva( 250, "../../../images/posts/", $nome_novo ); $this->data['Post']['photo'] = $resultado; # seta o novo nome da imagem } $this->Post->save($this->data); $this->Session->setFlash( 'O post foi atualizado!', 'default', array('class'=>'flash_good') ); $this->redirect('/posts/'); } else { $this->data = $this->Post->read( null, $id ); $categoria = $this->Categoria->find( 'list' ); $this->set( 'categoria', $categoria ); } } function delete( $id = null ) { #if( $this->data['Post']['photo'] ) { unlink("../../../images/posts/".$this->data['Post']['photo']); #} #$this->Post->del($id); #$this->Session->setFlash('O post de ID '.$id.' foi deletado!', 'default', array('class'=>'flash_good') ); #$this->redirect('/posts/'); }}?> Necessito de ajuda, aguardo retorno! Tanks! É como se fôssemos fazer isto: function deletar($id = null){ // deletamos a noticia (model) pelo seu $id if($this->Noticia->delete($id)){ $this->Session->setFlash('Deletado com sucesso!'); } }Mas inserindo o unlink para deletar as respectivas imagens deste tópico em específico, ficando assim: function deletar( $id = null ){ $path = "../../../images/posts/"; if( unlink($path.$this->data['Post']['photo']) ) { $this->Post->del($id); $this->Session->setFlash('O post de ID '.$id.' foi deletado!', 'default', array('class'=>'flash_good') ); $this->redirect('/posts/'); }}Olha o warning: Warning (2): unlink(../../../images/posts/) [function.unlink]: Permission denied [APPcontrollersposts_controller.php, line 74] Me parece que não está pegando a imagem... Alguém? Compartilhar este post Link para o post Compartilhar em outros sites
lucaswxp 22 Denunciar post Postado Julho 14, 2010 De um pr() em $this->data['Post'] para ver se esta tudo certo. (poste aki) Para fazer o unlink: unlink(Router::url('/images/posts/minhaImage.jpg'));É melhor para pegar o caminho corretamente Compartilhar este post Link para o post Compartilhar em outros sites
Tylër 0 Denunciar post Postado Julho 14, 2010 * Oh, tanks Lucas por me add como amigo rsrssrr Eh, não tá retornando a imagem, é isso ~~ function delete( $id = null ) { $this->Post->id = $id; #if( $this->data['Post']['photo'] ) { //unlink( Router::url("/files/images/".$this->data['Post']['photo']) ); pr('saída: '.$this->data['Post']['photo']); #} #$this->Post->del($id); #$this->Session->setFlash('O post de ID '.$id.' foi deletado!', 'default', array('class'=>'flash_good') ); #$this->redirect('/posts/'); } retorno: saída: Olha que curioso: se eu fizer isto: pr('saída: '.$this->Post->photo = $id); retorna a id do tópico mas não tá dando certo pra pegar a imagem do BD... Compartilhar este post Link para o post Compartilhar em outros sites
lucaswxp 22 Denunciar post Postado Julho 14, 2010 Se você tem o ID, basta fazer um find. Faz um find('first'), ou findById. http://book.cakephp.org/pt/view/807/find-first http://book.cakephp.org/pt/view/451/findBy Compartilhar este post Link para o post Compartilhar em outros sites
Tylër 0 Denunciar post Postado Julho 14, 2010 ao buscar assim: pr( $this->Post->findById( $id ) ); obtenho o array: Array ( [Post] => Array ( [id] => 36 [categoria_id] => 1 [photo] => 09245720100714.jpg [title] => Certificado de segurança em seu site de vendas [body] => Insira seu texto aqui... [created] => 2010-07-14 09:24:57 [modified] => 2010-07-14 09:24:57 ) [categoria] => Array ( [id] => 1 [title] => Categoria 1 [created] => 2010-07-01 23:24:09 [modified] => 2010-07-01 23:42:16 ) ) assim: pr( $this->Post->id = $id ); obtenho a id do tópico... Compartilhar este post Link para o post Compartilhar em outros sites
kakaroto developer 0 Denunciar post Postado Julho 14, 2010 Ola meu velho eu tava olhando a postagem aquele warning ta meio estranho colocar uma img dentro da pasta que você deleta exemplo: 1.jpg e tentar isso aqui function deletar( $id = null ) { $path = "../../../images/posts/1.jpg"; unlink($path); } } outra coisa legal e usar o file_exists e o chmod na pasta gere pasta dinamicar com o id_do post assim você tem mais liberdade e nao faz pesquisa de imagem no banco e isso pelo id do post Compartilhar este post Link para o post Compartilhar em outros sites
Tylër 0 Denunciar post Postado Julho 14, 2010 Olá meu velho, realizei o teste e funcionou ;] Então não está pegando a imagem do bd.. Bom. vou passar toda a modelagem aí:: ---- Banco de Dados: `cms`---- ------------------------------------------------------------ Estrutura da tabela `posts`--DROP TABLE IF EXISTS `posts`;CREATE TABLE IF NOT EXISTS `posts` ( `id` int(11) NOT NULL AUTO_INCREMENT, `categoria_id` int(11) NOT NULL, `photo` varchar(80) COLLATE utf8_bin NOT NULL, `title` varchar(50) COLLATE utf8_bin NOT NULL, `body` text COLLATE utf8_bin NOT NULL, `created` datetime DEFAULT NULL, `modified` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `FOREGNY KEY` (`categoria_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='table to posts' AUTO_INCREMENT=37 ;post_controller.php <?phpclass PostsController extends AppController{ var $name = 'Posts'; var $uses = array( 'Post', 'Categoria' ); var $paginate = array( 'limit'=>10, 'page'=>1, 'order'=>array('Post.id'=>'asc') ); function view( $id = null, $json = false ) { $this->Post->id = $id; $this->set( 'post', $this->Post->read() ); # lendo um post especifico if( $json ) { $this->view = 'Json'; $this->set( 'json', 'posts' ); } } function delete( $id = null ) { #if( $this->data['Post']['photo'] ) { //unlink( Router::url("/files/images/".$this->data['Post']['photo']) ); $path = "../../../files/images/1_1.jpg"; unlink($path); # $photo = $this->Post->read( 'photo', $id ); # pr('saída: '.$photo); #pr( $this->Post->findById( $id ) ); #pr( $this->Post->id = $id ); #pr( $this->Post->photo = "/files/images/".$this->data['Post']['photo'] ); #pr( 'saída: '.$this->data['Post']['photo'] ); // unlink( Router::url( "/files/images/".$image ) ); // unlink( Router::url( "/files/thumbs/".$image ) ); #} #$this->Post->del($id); #$this->Session->setFlash('O post de ID '.$id.' foi deletado!', 'default', array('class'=>'flash_good') ); #$this->redirect('/posts/'); }}?>kakaroto, depois que deletei a imagem, executei a pagina novamente e mostrou um warning parecido, pois a imagem já nao se encontrava lá...Então está confirmado de que no meu caso, não está buscando a imagem do banco de dados, onde deixa o caminho assim: /images/files/ sem a imagem.. Compartilhar este post Link para o post Compartilhar em outros sites
kakaroto developer 0 Denunciar post Postado Julho 15, 2010 vamos de novo function delete( $id ) { $path = "../../../files/images/"; $foto=$this->Post->findById( $id ); pr($foto); } ?> e me mandar o resultado disso ai Compartilhar este post Link para o post Compartilhar em outros sites
Tylër 0 Denunciar post Postado Julho 15, 2010 O mesmo array de cima: Array ( [Post] => Array ( [id] => 36 [categoria_id] => 1 [photo] => 09245720100714.jpg [title] => Certificado de segurança em seu site de vendas [body] => Insira seu texto aqui... [created] => 2010-07-14 09:24:57 [modified] => 2010-07-14 09:24:57 ) [categoria] => Array ( [id] => 1 [title] => Categoria 1 [created] => 2010-07-01 23:24:09 [modified] => 2010-07-01 23:42:16 ) ) E aí está o campo da imagem: [photo] => 09245720100714.jpg Compartilhar este post Link para o post Compartilhar em outros sites
lucaswxp 22 Denunciar post Postado Julho 23, 2010 Se você tem o nome da imagem, basta deletar agora: $path = '../../../files/images/'; $data = $this->Post->findById($id); $file = $path . $data['Post']['photo']; if(file_exists($file)){ if(unlink($file)){ $this->Session->setFlash('Imagem deletada!', 'default', array('class'=>'flash_good') ); } }else{ $this->Session->setFlash('A imagem não existe', 'default', array('class'=>'flash_bad') ); } Veja se corre tudo certo =) OBS: O CakePHP tem uma classe para manipulação de arquivos, pode ser interessante dar uma olhada Compartilhar este post Link para o post Compartilhar em outros sites
Tylër 0 Denunciar post Postado Julho 26, 2010 Desculpe o atraso para responder! Estás solucionado! o/ Bom, agora estás tudo conforme desejado! ... mas se fosse preciso deletar todo o diretório? Tentei o uso com GLOB_GRACE mas este, limpou todo o diretório, mas não o deletou =/ Compartilhar este post Link para o post Compartilhar em outros sites
lucaswxp 22 Denunciar post Postado Julho 26, 2010 Para deletar um diretório é uma função diferente: http://br3.php.net/manual/en/function.rmdir.php E ela só deleta diretórios vazios. Descendo mais um pouco a página você encontra funções feita pelos users que deletam o diretório e os arquivos e diretórios deste, como: function remove_dir($current_dir) { if($dir = @opendir($current_dir)) { while (($f = readdir($dir)) !== false) { if($f > '0' and filetype($current_dir.$f) == "file") { unlink($current_dir.$f); } elseif($f > '0' and filetype($current_dir.$f) == "dir") { remove_dir($current_dir.$f."\\"); } } closedir($dir); rmdir($current_dir); } } Tem várias outras lá. Compartilhar este post Link para o post Compartilhar em outros sites
Tylër 0 Denunciar post Postado Agosto 4, 2010 Muito melhor que o GLOB_BRACE Muito obrigado mais uma vez! Lucas... a última dúvida... Se a estrutura dos arquivos é assim: |- posts |- 1 |---- images |---------- 1.jpg |---------- 2.jpg |---- thumbs |---------- 1.jpg |---------- 2.jpgvou precisar realizar outro teste pra verificar se existem outros diretórios além do diretóri "/1/" ? $path = '../../../files/images/posts'; $dirImages = 'images'; $dirThumbs = 'thumbs'; $data = $this->Categgallery->findById($id); $current_dir = $path.'/'.$id; if( $dir = @opendir( $current_dir ) ) { while( ( $f = readdir($dir) ) !== false ) { if( $f > '0' and filetype( $current_dir.$f ) == 'file' ) { unlink( $current_dir.$f ); } elseif( $f > '0' and filetype( $current_dir.$f ) == 'dir' ) { delete( $current_dir.$f.''.$dirThumbs.'' ); // nao deleta delete( $current_dir.$f.''.$dirImages.'' ); // nao deleta delete( $current_dir.$f.'' ); // nao deleta } } closedir( $dir ); # fecha o diretorio rmdir( $current_dir ); # deleta o diretorioTentei assim mas não obtive sucesso: function delete( $id = null, $empty = false ) { $path = '../../../files/images/posts'; $dirImages = 'images'; $dirThumbs = 'thumbs'; $data = $this->Categgallery->findById($id); $directory = $path.'/'.$id; if( substr($directory,-1) == "/" ) { $directory = substr($directory,0,-1); } if( !file_exists($directory) || !is_dir($directory) ) { return false; } elseif( !is_readable($directory) ) { return false; } else { $directoryHandle = opendir( $directory ); while ( $contents = readdir($directoryHandle) ) { if( $contents != '.' && $contents != '..' ) { $path = $directory . "/" . $contents; if( is_dir($path) ) { delete( $path ); } else { unlink( $path ); } } } closedir( $directoryHandle ); if( $empty == false ) { if( !rmdir($directory) ) { return false; } } return true; } $this->redirect( '/posts/' ); } Compartilhar este post Link para o post Compartilhar em outros sites
lucaswxp 22 Denunciar post Postado Agosto 4, 2010 Não entendi sua dúvida =/ OBS: Se você quiser diminuir o código do controller e utilizar o conceito de "Fat Model", sugiro utilizar os callbacks: http://book.cakephp.org/view/685/beforeDelete http://book.cakephp.org/view/686/afterDelete Compartilhar este post Link para o post Compartilhar em outros sites
Tylër 0 Denunciar post Postado Agosto 4, 2010 Bom, minha dúvida é em saber como deletar toda esta estrutura aqui: |- posts |- 1 | |---- images |---------- 1.jpg |---------- 2.jpg | |---- thumbs |---------- 1.jpg |---------- 2.jpg Antes você me passou um código que deletavam todos os arquivos e por último os diretórios... E acima eu te passei o código que tentei utilizar pra realizar esta mesma checagem mas com mais diretórios e arquivos dentro deles.... Bom... não dava certo... Compartilhar este post Link para o post Compartilhar em outros sites
Tylër 0 Denunciar post Postado Agosto 5, 2010 Bom, pesquisei muito e não consegui encontrar nada só warnings ~~ Vou explicar bem detalhadamente: Como apagar vários diretórios , subdiretórios e arquivos dentro deles de uma vez no cakePHP? No php usa-se funções como estas: http://www.php.net/m...ction.rmdir.php Não consegui adaptar para deletar diretório dentro de diretório e imagens dentro deles.... Minha estrutura é assim: |- /posts/ | |------ /images/ |------------ /imagem_1.jpg (esta dentro de /images/) |------------ /imagem_2.jpg | |------ /thumbs/ |------------ / imagem_1.jpg (esta dentro de /thumgs/) VISUALIZAÇÃO Acima a imagem de tudo que estou tentando apagar ( tudo dentro do diretório 2, que é a id acessada ) A url acessada: http://localhost/min...leries/delete/2 A função utilizada e as demais maneiras também: function delete( $id = null ) { $path = '../../../files/images/galleries'; $data = $this->Categgallery->findById($id); $current_dir = $path.'/'.$id.'/'; if( $dir = @opendir( $current_dir ) ) { while( ( $f = readdir($dir) ) !== false ) { # Deletando imagens do diretorio if( $f > '0' and filetype( $current_dir.$f ) == 'file' ) { unlink( $current_dir.$f ); } # Deletando diretorio vazio elseif( $f > '0' and filetype( $current_dir.$f ) == 'dir' ) { delete( $current_dir.$f.'\\' ); } } closedir( $dir ); # fecha o diretorio rmdir( $current_dir ); # deleta o diretorio //$this->Categgallery->delete( $id ); # deletando post //$this->Session->setFlash( 'Galeria deletada!', 'default', array( 'class'=>'flash_good' ) ); } else { //$this->Session->setFlash( 'Erro ao deletar galeria!', 'default', array( 'class'=>'flash_bad' ) ); } /* if( is_dir($dir) ) { $objects = scandir( $dir ); foreach( $objects as $object ) { if( $object != "." && $object != ".." ) { if( filetype( $dir.$object ) == "dir" ) delete( $dir.$object ); elseif( filetype( $dir.$object ) == "file" ) unlink( $dir.$object ); } } reset( $objects ); rmdir( $dir ); } */ //$this->redirect( '/categgalleries/' ); } O warning visualizado: Fatal error: Call to undefined function delete() in C:\wamp\www\minha_cms\cake\app\controllers\categgalleries_controller.php on line 96 Linha 96: delete( $current_dir.$f.'\\' ); Compartilhar este post Link para o post Compartilhar em outros sites
Tylër 0 Denunciar post Postado Agosto 5, 2010 Nosss Hj meu cérebro inchou do tamanho da lua pra resolver isso aqui e nem por isso foi uma solução profissional ~~ $data = $this->Categgallery->findById($id); $path = '../../../files/images/galleries'; $dirImages = 'images/'; $dirThumbs = 'thumbs/'; $current_dir = $path.'/'.$id.'/'; if( !is_dir($current_dir) || !$data['Categgallery']['id'] ) { $this->Session->setFlash( 'Erro ao deletar galeria!', 'default', array( 'class'=>'flash_bad' ) ); $this->redirect( '/categgalleries/' ); } else { # Realizando a magica! :)/> if( $dir = @opendir( $current_dir.$dirThumbs ) ) { while( ( $f = readdir( $dir ) ) !== false ) { if( $f > '0' and filetype( $current_dir.$dirThumbs.$f ) == 'file' ) unlink( $current_dir.$dirThumbs.$f ); elseif( $f > '0' and filetype( $current_dir.$dirThumbs.$f ) == 'dir' ) delete( $current_dir.$dirThumbs.$f.'\\' ); } closedir( $dir ); # Fecha o diretorio rmdir( $current_dir.$dirThumbs ); } if( $dir = @opendir( $current_dir.$dirImages ) ) { while( ( $f = readdir( $dir ) ) !== false ) { if( $f > '0' and filetype( $current_dir.$dirImages.$f ) == 'file' ) unlink( $current_dir.$dirImages.$f ); elseif( $f > '0' and filetype( $current_dir.$f ) == 'dir' ) delete( $current_dir.$dirImages.$f.'\\' ); } closedir( $dir ); rmdir( $current_dir.$dirImages ); } if( $dir = @opendir( $current_dir ) ) { while( ( $f = readdir( $dir ) ) !== false ) { if( $f > '0' and filetype( $current_dir.$f ) == 'file' ) unlink( $current_dir.$f ); # Deletando imagens do diretorio elseif( $f > '0' and filetype( $current_dir.$f ) == 'dir' ) delete( $current_dir.$f.'\\' ); # Deletando diretorio vazio } closedir( $dir ); rmdir( $current_dir ); # Deleta o diretorio } } Mas pelo menos me será muito útil! :)/> ESTRUTURA DELETANDO PRONTO :)/> Compartilhar este post Link para o post Compartilhar em outros sites