Hi Massimo,

I posted the code below before checking if the form would actually submit.
What now happens is that all the fields are put through validation,
including those which I hid with JQuery, and needless to say, most of them
fail because they're empty!

There's no way I can do away with the validators, and I'm struggling to
find-out how to make it not validate those fields I hid. If I can't then
I've just thrown away a crucial 5 hours on JQuery, nice learning experience
but if I have to start again with a different approach I won't be a happy
bunny and neither will my client :-|

Any suggestions?


On Tue, Jun 22, 2010 at 2:27 PM, Andrew Buchan <[email protected]> wrote:

> Massimo,
>
> Thanks for that, I was about to reply saying that JQuery can't do what I
> want it to, then thought I'd test my statement before making it. Here's the
> code for anyone who's interested:
>
> Its all in the controller, as I pretty much use only one single
> multi-purpose view for all my pages :-)
>
> ####
>
>     #Fields to be visible for all departments
>     commonFields = [
>         'Details',
>         'Suggested_Action'
>     ]
>     form = SQLFORM.factory(db[TableName])
>
>     #Create dict of department-specific fields, this is where you make
> changes when departments change the fields they require....
>     #Note: must all exist in table def in model, exclude common fields in
> list above.
>     DepartmentFields = dict()
>     DepartmentFields['IT'] = ['Contract_Number', 'Details']
>     DepartmentFields['Projects'] = ['Work_Order_Number',
> 'Sales_Order_Number', 'Client']
>
>     #Create javascript/JQuery string for department select's onChange
> event...
>     deptchange = "$(\"TR[id^=no_table]\").hide();" +\
>         "var selectedDept = $('#To_Department :selected').text();" +\
>         "var fieldsToShow = [];" +\
>         "switch(selectedDept){"
>     for dept, fields in DepartmentFields.items():
>         fields.extend(commonFields )
>         deptchange += "case '%s': fieldsToShow=%s;break;" % (dept, fields )
>     deptchange += "default: fieldsToShow=[];};for (f in
> fieldsToShow){$('#no_table_' + fieldsToShow[f] + '__row').show();};"
>
>     #Create the department select html control and insert at the top of the
> form (place this wrong and you will get very strange results when hiding
> parts of the form)
>     DepartmentsRows = db(db.department.id >0 ).select()
>     Departments = [DepartmentsRows[i]['department_name'] for i in
> range(len(DepartmentsRows))]
>     form[0].insert(0, TR(TD('To Department: '),TD(
>                 SELECT( Departments , _name='To_Department',
> _id='To_Department', _onChange=deptchange ),
>             )))
>
> I agree it's not ideal storing part of the logic in python, and part in
> JQuery, but at least this way the dict representing the variable data can be
> kept in python (we do this for the DAL so why not...).
>
> I would still like to know the answer to me first question though: can I
> create INPUT/SELECT/TEXTAREA bits directly from the table definition field
> without going via SQLFORM? Anyone?
>
> -------------------
>
>
> On Mon, Jun 21, 2010 at 5:35 PM, mdipierro <[email protected]>wrote:
>
>> This is what I would do
>>
>> - make a single for that contains all fields you need
>> - use jQuery in the view so that depending on the selected department
>> some fields are hidden
>>
>>
>>
>> On Jun 21, 3:38 am, Andrew Buchan <[email protected]> wrote:
>> > Hello,
>> >
>> > I am trying to make a form for inserting a new record representing an
>> > internal complaint against a given department. Depending on which
>> department
>> > is selected, different fields must be completed.
>> > The way I'm planning on doing this is with a simple form with a select
>> box
>> > for the department, a DIV, and a submit button. On changing the
>> department
>> > selection, the DIV will be refreshed to display only those fields
>> applicable
>> > to that department (all of which correspond to a field in the DAL).
>> >
>> > 1. Where I'm having trouble is in generating the HTML fields based on
>> the
>> > names of a field in the DAL. I have previously always just used SQLForm
>> and
>> > sized it down to suit by passing a list of fields, but think that in
>> this
>> > situation, and many others, it would be useful to build a form from
>> fields
>> > obtained by passing the name of a field in the DAL and getting the
>> > validators brought through automatically.
>> >
>> > 2. Also, if I manage to do this, will there be an issue with the fact
>> that
>> > some of the fields in the form are nested in a DIV, will the fields
>> still
>> > auto-validate? From recollection placing a whole form within a DIV
>> doesn't
>> > work so didn't want to do that...
>> >
>> > Cheers..
>>
>
>

Reply via email to