2009-04-16 8 views
3

Quelle est la meilleure façon de définir automatiquement un élément sélectionné pour un élément de sélection/option en post-retour? Voici la façon dont nous faisons actuellement il:Option de sélection automatique ColdFusion

<select id="grade" name="grade"> 
    <option value="A"<cfif form.grade = 'A'> selected="selected"</cfif>>A</option> 
    <option value="B"<cfif form.grade = 'B'> selected="selected"</cfif>>B</option> 
    <option value="C"<cfif form.grade = 'C'> selected="selected"</cfif>>C</option> 
    <option value="D"<cfif form.grade = 'D'> selected="selected"</cfif>>D</option> 
    <option value="F"<cfif form.grade = 'F'> selected="selected"</cfif>>F</option> 
</select> 

est-il un produit de nettoyage ou plus facile de le faire avec ColdFusion? Merci d'avance!

Répondre

1

utilise cfscript avec des fonctions

<cfscript> 
Function setSelected(val1, val2){ 
    if (val1 EQ val2) 
    { 
     Return 'selected="selected"'; 
    } 
    else 
    { 
     Return ''; 
    } 
} 
</cfscript> 
<select id="grade" name="grade"> 
    <option value="A" #setSelected('A', form.grade)#>A</option> 
    <option value="B" #setSelected('B', form.grade)#>B</option> 
    <option value="C" #setSelected('C', form.grade)#>C</option> 
    <option value="D" #setSelected('D', form.grade)#>D</option> 
    <option value="F" #setSelected('F', form.grade)#>F</option> 
</select> 
+1

Hmm ... et quelle est la différence réelle entre ceci et les manières originales? :) – Sergii

+1

Eugh! La différence est que l'original est juste répétitif, alors que c'est à la fois laid et mal nommé. –

+0

Je pense que l'utilisateur cherchait une meilleure façon de faire le cfif à l'intérieur de la balise d'option, pas comment mettre les options dans une liste et faire une boucle à travers eux. Si vous avez mieux (ou juste d'autres façons) de faire le cfif alors je voudrais aussi les entendre. – Jason

2

Comme ceci:

<cfsavecontent variable="GradeOptions"> 
A:A 
B:B 
C:C 
D:D 
F:F 
</cfsavecontent> 

<select id="grade" name="grade"> 
    <cfloop index="CurOpt" list="#trim(GradeOptions)#" delimiters="#Chr(10)#"> 
     <option value="#ListFirst(CurOpt,':')#"<cfif form.grade EQ ListFirst(CurOpt,':')> selected="selected"</cfif>>#ListRest(CurOpt,':')#</option> 
    </cfloop> 
</select> 


Cela suppose que vous ayez toujours une valeur distincte: information sur l'étiquette - si votre valeur et l'étiquette sont toujours les mêmes, vous pouvez le faire:

<cfsavecontent variable="GradeOptions"> 
A 
B 
C 
D 
F 
</cfsavecontent> 

<select id="grade" name="grade"> 
    <cfloop index="CurOpt" list="#trim(GradeOptions)#" delimiters="#Chr(10)#"> 
     <option<cfif form.grade EQ CurOpt> selected="selected"</cfif>>#CurOpt#</option> 
    </cfloop> 
</select> 
2

Vous pouvez également le faire avec un tableau de structures.

<cfparam name="form.grade" default="C"> 
<cfset mydata = [{grade="A",value="A"},{grade="B",value="B"},{grade="C",value="C"},{grade="D",value="D"},{grade="F",value="F"}]> 
<cfoutput> 
<select id="grade" name="grade"> 
    <cfloop array="#mydata#" index="i"> 
     <option value="#i['value']#"<cfif form.grade EQ i['grade']> selected="selected"</cfif>>#i['value']#</option> 
    </cfloop> 
</select> 
</cfoutput> 
0

Que pensez-vous de cela?

<cfparam name="form.grade" default="A"> 
<cfoutput> 
<select id="grade" name="grade"> 
<cfloop index="code" from="65" to="90"> 
    <option value="#Chr(code)#"<cfif form.grade EQ Chr(code)> selected="selected"</cfif>>#Chr(code)#</option> 
</cfloop> 
</select> 
</cfoutput> 

Un peu difficile, oui :)

+0

Je ne sais pas pourquoi on pourrait vouloir utiliser des codes de caractères, mais si vous allez, vous devrait: Vous devriez indiquer que c'est intentionnel en faisant AZ ici. Pour plus de lisibilité, vous pouvez faire depuis = "# Asc ('A') #" to = "# Asc ('Z') #" –

+0

Oui, vous avez raison. Cela rend le code un peu plus lisible. Je voulais juste montrer l'idée. – Sergii

0

Vous savez, il peut être impopulaire de le dire, mais la solution que vous avez initialement décrites dans la question est le meilleur.

C'est simple, il est facile de voir ce qui se fait, et ce n'est pas difficile d'être compliqué.

Parfois, vous avez juste besoin de porter des gants

http://thedailywtf.com/Articles/The_Complicator_0x27_s_Gloves.aspx

+1

J'aime votre raisonnement. Je suis un énorme partisan du code non gonflé, donc je pense que votre commentaire est très valable. La fonctionnalité du est simple, donc ça devrait rester comme ça, n'est-ce pas? La seule raison pour laquelle j'ai posté la question en premier lieu était de m'assurer qu'il n'y avait pas de façon évidente et extrêmement simple de faire cela. Merci! – Alex

0

Pour développer mon autre réponse, ce que vous devez faire est correctement séparer vos données de votre interface, en stockant les notes dans votre base de données, en utilisant un code similaire à:

<cfset GradeOptions = Grades.readAvailable() /> 

<select id="grade" name="grade"> 
    <cfloop query="GradeOptions"> 
     <option value="#GradeCode#" 
      <cfif Form.Grade EQ GradeCode>selected="selected</cfif> 
      >#GradeCode# - #GradeDesc#</option> 
    </cfloop> 
</select> 

(. Encore une fois, si les grades ne doivent être traités comme une seule lettre, les valeurs peuvent être fournies dans une liste simple/tableau plutôt que requête)

L'élément clé est que vous pouvez changer la structure de vos notes sans avoir à changer d'interface. De même, la mise à jour de l'interface ne nécessite pas de connaître les notes.

+1

Même si je suis d'accord avec vous dans la plupart des cas, ce sont des notes. A, B, C, D, F. Ils n'ont pas changé depuis des générations. Ont-ils vraiment besoin d'être stockés dans une base de données? Vraiment? Ce serait comme utiliser une base de données pour stocker le nombre de jours dans une semaine, au cas où cela changerait. –

+1

@Joel, nous ne savons pas comment cette question est générale. Peut-être que pour A-Z même ma réponse est la plus courte et pour quelqu'un peut être mieux. Les réponses de Peter (et rip747) montrent simplement la manière la plus flexible, quand select peut contenir plus de données dynamiques. Pourquoi pas? – Sergii

+0

WTF !? Bien sûr, les notes changent! Certains endroits utilisent A, B, C, D, F mais pas tous. Je me souviens d'avoir A, B, C, D, E, F, G - où il n'y avait pas «échec», mais D, E, F, G étaient mauvais (pour moi). Ensuite, pour les examens ultérieurs, mon école utilisait les ensembles A, B, C, D, E, N, U (Échec et Échec des deux échecs). A uni nous avions A1, A2, B1, B2, C1, C2, D1, D2, E1, E2 (avec des descriptions de chacun). Et puis, les notes finales BSc Hons - 1er, 2: 1,2: 2,3, Pass, Fail. Et c'est juste moi, je suis sûr qu'il y a d'autres systèmes. –

0

Pour être honnête, je ne vois pas comment ces valent mieux qu'une version corrigée de votre premier passage (ci-dessous)

<select id="grade" name="grade"> 
     <option value="A"<cfif form.grade EQ "A"> selected </cfif> >A</option> 
     <option value="B"<cfif form.grade EQ "B"> selected </cfif> >B</option> 
     <option value="C"<cfif form.grade EQ "C"> selected </cfif> >C</option> 
     <option value="D"<cfif form.grade EQ "D"> selected </cfif> >D</option> 
     <option value="F"<cfif form.grade EQ "F"> selected </cfif> >F</option> 
    </select> 

Il est simple, propre et compréhensible.

Si vous ressentez le besoin d'être plus léger et que vous allez faire beaucoup de manipulation de l'interface utilisateur, investissez un peu de temps dans jQuery. Étudiez les jQuery and CF Posts de Ray Camden et Javascript and CF Posts de Ben Nadel et bientôt ce sera une seconde nature ...

<script type="text/javascript">           
    jQuery(document).ready(function() { 
    $("#grade option[value='<CFOUTPUT>#FORM.Grade#</CFOUTPUT>']") 
     .attr('selected', 'selected'); 
    }); 
</script> 

<select id="grade" name="grade"> 
    <option value="A">A</option> 
    <option value="B">B</option> 
    <option value="C">C</option> 
    <option value="D">D</option> 
    <option value="F">F</option> 
</select> 

Bien sûr, il est farfelue à la recherche que certains des autres options ici, mais étonnamment puissant pour résoudre les problèmes que FC est tout simplement pas bon à la fois que vous l'apprendre (faites-moi confiance, il fera rapidement le sens et vous vous demanderez comment avez-vous déjà fait le code de l'interface utilisateur client sans cela). Apprenez l'une des bibliothèques JavaScript populaires et votre code client ColdFusion deviendra nettement plus élégant et puissant.

3

À mon avis, l'une des meilleures façons de faire est d'utiliser un CFSELECT:

<cfquery name="getGrades" datasource="#application.dsn#"> 
    select gradeLetter from Grades 
</cfquery> 

<cfselect 
    name="grade" 
    query="getGrades" 
    display="gradeLetter" 
    value="gradeLetter" 
    selected="#form.grade#" /> 
+0

Très propre - J'aime que vous n'utilisiez qu'une seule fois la commande "selected" dans ce scénario, quelles que soient les données. Y a-t-il des problèmes avec la sortie HTML des cfforms en ce qui concerne l'accessibilité et le code valide? – Alex

Questions connexes