Ir para conteúdo

POWERED BY:

Arquivado

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

Matheus P.

Problema com WideImage no cakePHP

Recommended Posts

Uma explicação breve do problema, desenvolvi um painel de administração utilizando cakePHP 2.x, o add funciona normalmente, porém, o edit só faz o update no banco se eu substituir a imagem existente (caso não existe imagem, eu não preciso substituir e funciona normalmente). O espaço que armazena o nome da imagem no banco é o thumb (varchar).

 

admin_edit.ctp

<?php echo $this->Form->create('BBlog', array('type' => 'file')) ?>
<?php echo $this->Form->input('id', array('type' => 'hidden')); ?>
<?php echo $this->Form->input('thumb', array('type' => 'file', 'label' => false)); ?>
<?php echo $this->Form->end();?>

Model.php

    public function beforeSave($options = array())
    {
        if (!empty($this->data['BBlog']['thumb'])) {
            $thumb = $this->data['BBlog']['thumb'];
            if(!empty($thumb['name'])) {
                $arquivo = $this->thumb('blog'); //Nome da pasta em parâmetro
                $this->data['BBlog']['thumb'] = $arquivo;
            }
        }
        return true;
    }

AppModel.php

    public function thumb($pasta="blog"){
        App::import('Vendor', 'WideImage/WideImage');
        $dir        = WWW_ROOT.'img'.DS.$pasta;
        $file       = $this->data['BBlog']['thumb'];
        $filename   = strtolower($this->data['BBlog']['slug'].'-'.date('Ymd').'.jpg');

        $img = WideImage::load($file['tmp_name']);
        $img = $img->resize(960, 500,'outside', 'any');
        $img = $img->crop('50%-480','50%-250',960,500);
        $img->saveToFile($dir.DS.$filename, 80);
        return $filename;
    }

Controller.php

    public function admin_edit($id = null) {

        $artigo = $this->BBlog->find('first', array(
            'conditions' => array(
                'BBlog.id' => $id,
                'BBlog.status' => 0
            ),
        ));
        $this->set(compact('artigo'));

        if (empty($artigo)) {
            $this->Session->setFlash('Você não possui autorização de editar esse artigo', array(), 'default', 'erro');
            return $this->redirect(array('controller' => 'BBlogs', 'action' => 'index', 'admin' => true));
        } else {

            if ($this->request->is(array('post', 'put'))) {

                if (empty($this->request->data['BBlog']['thumb']['name'])) {
                    $this->request->data['BBlog']['thumb'] = $artigo['BBlog']['thumb'];
                }

                if ($this->BBlog->save($this->request->data)) {
                    $this->Session->setFlash('Artigo alterado com sucesso', 'default', array(), 'sucesso');
                    return $this->redirect(array('controller' => 'BBlogs', 'action' => 'index', 'admin' => true));
                } else {
                    $this->Session->setFlash('Erro ao alterar artigo', 'default', array(), 'erro');
                }
            } else {
                $options = array('conditions' => array('BBlog.' . $this->BBlog->primaryKey => $id));
                $this->request->data = $this->BBlog->find('first', $options);
            }

        }

    }

Erro

/* ERRO 1 */
Warning (2): file_get_contents(b) [function.file-get-contents]: failed to open stream: No such file or directory [APP/Vendor/WideImage/WideImage.php, line 195]
Warning (2): unpack() [function.unpack]: Type c: not enough input, need 1, have 0 [APP/Vendor/WideImage/vendor/de77/TGA.php, line 93]

/* ERRO CAKEPHP */
File 'b' appears to be an invalid image source.
Error: An Internal Error Has Occurred.

Compartilhar este post


Link para o post
Compartilhar em outros sites

esta trazendo alguma coisa aqui $file['tmp_name']?

Compartilhar este post


Link para o post
Compartilhar em outros sites
AppModel.php
    public function thumb($pasta="blog"){
        App::import('Vendor', 'WideImage/WideImage');
        $dir        = WWW_ROOT.'img'.DS.$pasta;
        $file       = $this->data['BBlog']['thumb'];
        $filename   = strtolower($this->data['BBlog']['slug'].'-'.date('Ymd').'.jpg');

        $img = WideImage::load($file['tmp_name']);
        $img = $img->resize(960, 500,'outside', 'any');
        $img = $img->crop('50%-480','50%-250',960,500);
        $img->saveToFile($dir.DS.$filename, 80);
        return $filename;
    }

Você esta quebrando literalmente as regras de camadas do cakephp, colocando esta função na classe AppModel, esta classe é responsável por carregar os recursos do Cake, como validates, find etc...

 

E WideImage é um vendor, e como tal, esta função deve ser colocada no SeuModel ou em SeuController, ou até mesmo em uma classe dentro da Lib e importada onde ira utiliza-la.

 

E de um pr();

pr( $this->request->data )

Para ver como os dados estão sendo passados;

 

ou

pr( $_FILES )

e faça os tratamentos devidos.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Passei a function thumb para o model e dei o print no $_FILES, o retorno é tudo vazio, embora eu tenha tentado vários if no Controller, o mesmo erro persiste.

Array
(
    [data] => Array
        (
            [name] => Array
                (
                    [BBlog] => Array
                        (
                            [thumb] => 
                        )

                )

            [type] => Array
                (
                    [BBlog] => Array
                        (
                            [thumb] => 
                        )

                )

            [tmp_name] => Array
                (
                    [BBlog] => Array
                        (
                            [thumb] => 
                        )

                )

            [error] => Array
                (
                    [BBlog] => Array
                        (
                            [thumb] => 4
                        )

                )

            [size] => Array
                (
                    [BBlog] => Array
                        (
                            [thumb] => 0
                        )

                )

        )

)

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.