Thanks Cricket,

I realise a lot of the stuff i'm doing in the model would be better served
in a component - maybe one day if i revisit it i'll break it out properly
into a component... for the time being it "works", and its not "wrong" ...
maybe just not as "right" as it could be :P




On Fri, Feb 25, 2011 at 5:43 AM, cricket <zijn.digi...@gmail.com> wrote:

> On Thu, Feb 24, 2011 at 3:43 AM, Greg Skerman <gsker...@gmail.com> wrote:
> > Hi,
> >
> > I've been working on a very simple app to upload and resize some images,
> and
> > name the file in accordance with some information that has been provided
> in
> > a form.
> >
> > To do this, my model has a public method "createFilename", which relies
> on
> > $this->data to build the filename in accordance with the provided
> business
> > rules.
> >
> > It was all working fine, until I connected the model to a database table
> and
> > started also saving the meta-data.... now it appears $this->data is being
> > unset for subsequent calls to the method.
> >
> > The method is simple enough:
> >
> > public function createFilename() {
> >
> >         CakeLog::write('debug', 'photo name is '.
> > $this->data['Photo']['name']);
> >
> >         $name = $this->data['Photo']['name'];
> >
> >         $level = $this->data['Photo']['level'];
> >
> >         $category = $this->data['Photo']['category'];
> >
> >         $month = strtoupper($this->data['Photo']['month']);
> >
> >
> >         return $level . $category . $month . $name . '.jpg';
> >
> > }
> >
> >
> > According to the information that I log, in the 4 times this method is
> > called during the processing of the image, the first time
> > $this->data['Photo']['name']  contains data, and then each subsequent
> call
> > is empty.
> >
> > The first time the method is called is at validation to prevent duplicate
> > files with the same metadata being created, and this seems to be working
> > fine, but then the following times (which are used for naming the file
> after
> > it has been manipulated, moving the file out of the TMP directory into
> the
> > uploaded images directory, and including the filename in an email
> > attachment, $this->data appears to be empty.
>
> I realise, from your other post, that you're not doing calling that
> method repeatedly anymore. It's really inefficient to do that.
>
> The way I've approached this is to use a FileHandlerComponent and
> ImageHandlerComponent. Any controller that deals with an upload calls
> __handleUpload() after saving the record. The first component deals
> with moving the file to the correct location and the second with
> resizing. I split them into separate components because I deal with a
> lot of non-image uploads.
>
> Example from FilesController:
>
> private function __handleImageUpload()
> {
>        $this->FileHandler->setModelName('Link');
>        $this->FileHandler->setBase(WWW_ROOT);
>        $this->FileHandler->setSubDirectory('files/links');
>
>        if ($this->FileHandler->upload('upload', false))
>        {
>                $upload_data = $this->FileHandler->getUploadData();
>
>                /* create a reasonably-sized image
>                 */
>                if (!empty($upload_data))
>                {
>                        /* resize if necessary
>                         */
>                        $img_data = $this->ImageHandler->apply(
>                                array_merge($this->Link->image_settings,
> array('basename' =>
> $upload_data['basename'])),
>
>  
> $this->FileHandler->getBase().$upload_data['directory'].DS.$upload_data['basename'],
>
>  $upload_data['directory'].DS.$upload_data[0]['basename']
>                        );
>
>                        /* Save image details
>                         */
>                        if (is_array($img_data) && !empty($img_data))
>                        {
>                                $data = array(
>                                        'Link' => array(
>                                                'id' => $this->Link->id,
>                                                'directory' =>
> $upload_data[0]['directory'],
>                                                'basename' =>
> $img_data['basename'],
>                                                'extension' =>
> $img_data['extension'],
>                                                'type' => $img_data['type'],
>                                                'size' => $img_data['size'],
>                                                'width' =>
> $img_data['width'],
>                                                'height' =>
> $img_data['height']
>                                        )
>                                );
>
>                                /* see if there's already an image
>                                 */
>                                $old_image = $this->Link->find(
>                                        'first',
>                                        array(
>                                                'conditions' => array('id'
> => $this->Link->id),
>                                                'recursive' => -1
>                                        )
>                                );
>
>                                if ($this->Link->save($data, false))
>                                {
>                                        if
> (isset($old_image['Link']['basename']))
>                                        {
>
>  
> unlink(WWW_ROOT.$old_image['Link']['directory'].DS.$old_image['Link']['basename']);
>                                        }
>                                }
>
>
> The model var $image_settings contains things like the maximum width &
> height, etc.
>
> Dealing with existing images (whether to overwrite, how to re-name)
> could also be done within the component, as long as the model save is
> also done there (because you don't want to unlink a file if the new
> record didn't save).
>
>
> > Does the act of saving a record to the database automatically unset the
> > $this->data variable or is there something else going on here?
>
> Only for the model. The controller's data is still available.
>
> --
> Our newest site for the community: CakePHP Video Tutorials
> http://tv.cakephp.org
> Check out the new CakePHP Questions site http://ask.cakephp.org and help
> others with their CakePHP related questions.
>
>
> To unsubscribe from this group, send email to
> cake-php+unsubscr...@googlegroups.com For more options, visit this group
> at http://groups.google.com/group/cake-php
>

-- 
Our newest site for the community: CakePHP Video Tutorials 
http://tv.cakephp.org 
Check out the new CakePHP Questions site http://ask.cakephp.org and help others 
with their CakePHP related questions.


To unsubscribe from this group, send email to
cake-php+unsubscr...@googlegroups.com For more options, visit this group at 
http://groups.google.com/group/cake-php

Reply via email to