On Sat, Apr 16, 2011 at 5:34 PM, turbo2ltr <turbo2...@gmail.com> wrote:
> So I'm brand new to cakePHP, but I consider myself a pretty decent php
> developer.  I'm trying to give it time to soak in, but at this point
> it would have been faster to write php.  Hopefully someone can shove
> me in the right direction as I'd really like to learn this framework.
> I got my start by going through all of Andrew Perkins' video tutorials
> on youtube, which really give me a decent base to start from.
>
> I've spent several hours on this, reading, searching and trying and I
> can't seem to find a good answer.
>
> I have a table "Parts" and one of the fields is "Type".  Normally I'd
> just declare this as an enum with the values as "Part", "Assembly" and
> "Reference".
>
> I'm having a hell of a time trying to get cake to output a select tag
> with this data.
>
> While I found some workarounds in various blogs, I read that cake
> doesn't really know what to do with the enum type yet,
>
> I was able to manually create an array of types and pass it to the
> $form->select in the view which created the proper select tag, but
> hard coding the types might paint me into a corner down the road, and
> I couldn't seem to get the select to pre-select the current value in
> the edit action.
>
> So I decided to try an association.  I created a table called
> part_types and related it to parts. I changed the type field to
> part_type_id.  This relation worked (after a lot of trial and
> error...it was my first association), but did little to help me to
> automatically create the select tag.
>
> So I guess my question is, whats the standard way to do this?  It
> seems so simple.

You're on the right track. Cake does not use ENUMs and the workaround
is to use an association (which is better from a normalised DB
standpoint, anyhow).

Your part_types table should have columns id (PK, auto_increment) and
name. If the column iscalled something other than name set the
$displayName class var in Part.

In your controller:

public function admin_add()
{
        if (!empty($this->data))
        {
                $this->Part->set($this->data);
                
                if ($this->Part->validates())
                {
                        if ($this->Part->save())
                        {
                                // redirect
                        }
                        else
                        {
                                // flash msg -- save failed
                        }
                }
                else
                {
                        // flash msg -- error in submission
                }
        }

        // will run on first invocation or if validation/save fails
        $this->set(
                'part_types',
                $this->Part->PartType->find('list')
        );
}

view:
echo $this->Form->select('Part.part_type_id', $part_types);

It's important where you put the find('list') line. On first
invocation the if block will be bypassed. When the form is submitted,
you do your validation, then save. If either of those fails, set the
flash msg but do not redirect. That way, the find is run again.
Because $this->data is set this time, it's passed to the view, meaning
that the form will be pre-populated with whatever the user entered the
first time. Not really part of your question I know.

-- 
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