Rob,

Exactly!

Regards,
Don

On May 22, 10:46 pm, Rob <[email protected]> wrote:
> Ah I see. Thank you very much.
>
> Having gone back and reading you post now, it's all much clearer.  I
> probably should have carefully read your post again before posting and
> I might have been able to figure that one out on my own.
>
> So now what I have is an array that I have to re-organize in my
> controller so that it will work with saveAll.  I need to change it
> from
> 'model name'
>         'Field Name'
>                 'index' -> data
>
> to
>
> 'model name'
>         'index'
>                 'field names' -> data
>
> Correct? I want to make sure I have the right idea here
>
> Thanks Again.
>
> On May 23, 12:38 am, dreamingmind <[email protected]> wrote:
>
>
>
>
>
>
>
> > Rob,
>
> > That's the point of ending the 'name' attribute with the empty array
> > brackets '[ ]' as described above.
>
> > Granted, this will return your data in an array structure that will
> > require a little re-arrangement as mentioned.
>
> > Regards
> > Don
>
> > On May 22, 6:16 pm, Rob <[email protected]> wrote:
>
> > > Hey, I havent abandoned this issue.
>
> > > Armed with what I got from reading the replies here I went on some
> > > google searches and came up with a near-solution that is almost there.
>
> > > My first main problem was that this is my first foray into AJAX, so my
> > > lack of understanding was a hurdle there.  The other problem was that
> > > I have been away from cakePHP for a while so some obvious things ended
> > > up getting me snagged for a bit.  Anyway here are the steps I took,
> > > and my new problem.
>
> > > I created the view for the form that, using a Js helper request, gets
> > > appended to the original form when the user clicks a button:
>
> > > <fieldset>
> > > <?php
> > > $this->Form->create();
> > > echo $this->Form->input('Element.1.element_title_id', array('label' =>
> > > 'Element Type', 'options' => $element_titles));
> > > echo $this->Form->input('Element.1.title', array('type' => 'text'));
> > > echo $this->Form->input('Element.1.description', array('type' =>
> > > 'textarea', 'label' => 'Description'));
> > > echo $this->Form->input('Element.1.Image.0.path', array('type' =>
> > > 'file'));
> > > ?>
> > > </fieldset>
>
> > > Ajax calls the add_element action of my projects_controller which just
> > > has a simple $this->render('add_element', 'ajax') statement in it.
>
> > > This all works beautifully, and believe it or not took me a while to
> > > figure out (i tried some horrible horrible things before I got to
> > > where I am)
>
> > > Now this is what the $data looks like when I submit the form:
>
> > > Array
> > > (
> > >     [Project] => Array
> > >         (
> > >             [title] =>
> > >             [description] =>
> > >         )
>
> > >     [Element] => Array
> > >         (
> > >             [0] => Array
> > >                 (
> > >                     [element_title_id] => 3
> > >                     [title] =>
> > >                     [description] =>
> > >                     [Image] => Array
> > >                         (
> > >                             [0] => Array
> > >                                 (
> > >                                     [path] =>
> > >                                 )
>
> > >                         )
>
> > >                 )
>
> > >             [1] => Array
> > >                 (
> > >                     [element_title_id] => 3
> > >                     [title] =>
> > >                     [description] =>
> > >                     [Image] => Array
> > >                         (
> > >                             [0] => Array
> > >                                 (
> > >                                     [path] =>
> > >                                 )
>
> > >                         )
>
> > >                 )
>
> > >         )
>
> > > )
>
> > > My problem is that no matter how many times a new element is added via
> > > my add_element action. only 2 elements are sent back to the controller
> > > to be saved.  I know why this is happening; Element.
> > > 1.element_title_id.  I'm not incrementing the key there, its always
> > > 1.  For example the second time the button is clikced, that should be
> > > Element.2.element_title_id, but I have no idea how to do that
>
> > > So what it comes down to is that I have no idea how to increment this
> > > key each time the button is clicked on the form.
>
> > > Any help is appreciated.
> > > Don't hesitate to ask me to clarify...I tend to get sloppy and
> > > rambling when describing something like this
>
> > > On May 16, 11:53 am, dreamingmind <[email protected]> wrote:
>
> > > > Rob,
>
> > > > My code diverged from crisuwork's in a couple of areas. One difference
> > > > (which I think you will share); I had to add several fields rather
> > > > than one. This is a small detail but it adds a fair amount of code
> > > > though the general pattern he describes is the same I followed. It
> > > > sums up the process beautifully.
>
> > > > Another difference: when I add a group of fields I have to do some db
> > > > checks to see if data exists for the image name I'm bringing in. That
> > > > means I may need to populate some fields with existing data so I don't
> > > > rewrite or over-write things in ignorance. And I have select lists to
> > > > populate, etc.
>
> > > > These differences in complexity lead to the other difference: I set
> > > > myself the goal of following web standards and cake conventions as
> > > > closely as possible. This helped manage the complexity. Rather than
> > > > introducing the new form fields with a javascript function, I used an
> > > > Element and had my javascript return that via Ajax.
>
> > > > So my basic pattern is:
> > > > User clicks link calling javascript/ajax
> > > > Js finds form content existing? clears it out (this allows me to
> > > > toggle sections open/closed)
> > > > Js finds no content then it uses my Cake action to look up data and
> > > > return an Element containing a populated fieldset
> > > > Sends it all back to the page.
>
> > > > One important detail that crisuwork had in his code which you'll need
> > > > to note; the name attribute for his field ends with [ ]. This will let
> > > > your multiple occurrences of the same field return as an array. If the
> > > > fields have the same name attribute and don't end with the array
> > > > brackets, they'll overwrite each other and you'll get back the value
> > > > of the last one.
>
> > > > This caused me some problems in the Element because the Form Helper in
> > > > its simplest usage is incompatible with our needs in this case. The
> > > > Cake Development team was farsighted though!
>
> > > > Problem:
> > > > echo $this->Form->input('ImageId'); // cake code in the Element
>
> > > > Returns:
> > > > <div class="input text">
> > > >   <label for="ImageId">Image Id</label>
> > > >   <input
> > > >       type="text"
> > > >       id="ImageId"
> > > >       name="data[ImageId]"
> > > >   >
> > > > </div>
>
> > > > Both the normally returned 'id' and 'name' attributes will trip you up
> > > > in the kind of ajax function we're discussing (id's need to be unique
> > > > or things can break).
>
> > > > Solution, this more detailed cake code in the Element:
> > > > echo $this->Form->input('ImageId', array(
> > > >     'name' => 'data[Image][id][]',
> > > >     'id' => null,
> > > >     'class' => 'imgid',
> > > >     'type' => $type
> > > > ));
>
> > > > Returns this simpler html:
> > > > <div class="input text">
> > > >    <label for="ImageId">Image Id</label>
> > > >    <input
> > > >      type="text"
> > > >      class="imgid"
> > > >      name="data[Image][id][]"
> > > >    >
> > > > </div>
>
> > > > As you can see, both our problems are solved! You can add a 'value'
> > > > attribute also if you want to force field content. But, since this is
> > > > standard Form Helper usage, if the standard data array exists (from a
> > > > query in the controller) fields will get their appropriate content.
>
> > > > By the way, the 'type' attribute is just a debugging thing so I can
> > > > make certain fields hidden or visible as I work things out.
>
> > > > crisuworks describes the process you'll need to follow when processing
> > > > the returned data.
>
> > > > Regards,
> > > > Don
>
> > > > On May 15, 11:42 pm, crisuwork <[email protected]> wrote:
>
> > > > > I just made such a feature 2 weeks ago using a simple javascript
> > > > > function to generate more input fields with file as type. I attached
> > > > > that function to a button "Add files" and that is.
> > > > > You need than in controller to write a loop to parse all the array
> > > > > from $_FILES and for each file do call a "save()" function.
>
> > > > > Here is an example jQuery function ( this function has to be in your
> > > > > ctp file ):
> > > > > function addmorefiels(){
> > > > >     $('#yourDiv').append('<input type="file" name="myfilesforupload[]"
> > > > > value="">');
>
> > > > > }
>
> > > > > The you need in your form .ctp file some div where you push/attach new
> > > > > dynamically input fields:
> > > > > <form....>
> > > > > ...
> > > > > ...
> > > > > <div id="yourDiv"></div>
> > > > > <a href='javascript:void(0)' onclick='addmorefiels()'></a>
> > > > > </form>
>
> > > > > Than, in controller in save() function you check the array from
> > > > > "myfilesforupload":
>
> > > > > if( is_array($_FILES["myfilesforupload"]) &&
> > > > > count($_FILES["myfilesforupload"])>0   ){
> > > > >    foreach($_FILES["myfilesforupload"] as $distinctFile){
> > > > >        ... here you have to call your upload class and to save the
> > > > > files
> > > > >    }
>
> > > > > }
>
> > > > > If you want to do this without page refresh than you have to use $ajax
> > > > > from
>
> ...
>
> read more »

-- 
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
[email protected] For more options, visit this group at 
http://groups.google.com/group/cake-php

Reply via email to