From b4b0c7e72d7eaee2fbfc7022022c9698323203dd Mon Sep 17 00:00:00 2001 From: ivan Date: Thu, 31 Dec 2009 13:16:41 +0000 Subject: import rt 3.8.7 --- rt/docs/creating_external_custom_fields.pod | 97 ++ rt/docs/design_docs/TransactionTypes.txt | 6 +- .../design_docs/gnupg_details_on_output_formats | 1253 ++++++++++++++++++++ rt/docs/design_docs/rql_parser_machine.graphviz | 3 + rt/docs/design_docs/string-extraction-guide.txt | 6 +- rt/docs/extending_clickable_links.pod | 157 +++ rt/docs/gnupg_integration.pod | 1 + rt/docs/porting.windows | 24 + rt/docs/queue_subject_tag.pod | 79 ++ rt/docs/templates.pod | 60 + rt/docs/using_forms_widgets.pod | 113 ++ 11 files changed, 1793 insertions(+), 6 deletions(-) create mode 100644 rt/docs/creating_external_custom_fields.pod create mode 100644 rt/docs/design_docs/gnupg_details_on_output_formats create mode 100644 rt/docs/extending_clickable_links.pod create mode 100644 rt/docs/gnupg_integration.pod create mode 100644 rt/docs/porting.windows create mode 100644 rt/docs/queue_subject_tag.pod create mode 100644 rt/docs/templates.pod create mode 100644 rt/docs/using_forms_widgets.pod (limited to 'rt/docs') diff --git a/rt/docs/creating_external_custom_fields.pod b/rt/docs/creating_external_custom_fields.pod new file mode 100644 index 000000000..f8eca44fb --- /dev/null +++ b/rt/docs/creating_external_custom_fields.pod @@ -0,0 +1,97 @@ +=head1 External custom fields + +=head2 Description + +C is extension to custom fields that allow +you to define CF with a dynamic list of values. Loading values into +this custom fields requires writing a little Perl code to fetch the +data from the external source; the code that we added to RT 3.7 +allows it to load data from arbitrary external sources. + +=head2 Introduction into writing source of values + +For each type of data source that you want, you'll need to put a file +in F (or equivilent if you +installed RT someplace other than F). To get a sense of the +code that you'll need to write, take a look at the code in +L for a simple example +which just uses RT's API to pull in a list of RT's groups. + +Running C will +show you the documentation for the API that needs to be fulfilled, by +copying and editing the C example is probably a fine place to +start. + +Later in this doc we'll describe the example a little bit more. + +=head2 Configuration + +After the custom code is written, you need to tell RT about its +existence by adding something like following to your RT_SiteConfig.pm: +Set(@CustomFieldValuesSources, "RT::CustomFieldValues::MySource"); + +The value in quotes should be the name of the class that you created. + +Stop and start your web server to enable any config changes. Open the web interface with +as an administrative user (such as root) create new custom field. In order to use +a custom source of values, you should select a custom field type +that lets users pick values from a list, for example it could be C box using: + <& /Widgets/Form/Integer:InputOnly, + Name => 'NameOfInputElement', + &> + +In such a simple case you even can avoid processing. Yeah, most probably +you want to check if value is really integer, but these widgets don't +do validation for you, but they are more about fetching values from +hash of arguments, showing these values to user and preserving state +of value between form reloads (see below). + +=head2 Processing + +Processing is required when you use L, +such as Default, Multiple or Alternative. + +To process arguments of a request you have to do the following: + $ARGS{'NameOfInputElement'} = $m->comp( + '/Widgets/Form/Integer:Process', + Arguments => \%ARGS, + Name => 'NameOfInputElement', + ); + +The method returns processed value in canonical form. For different widgets +a canonical form is different and depends on activated features, so you must +always activate the same features during showing a widget and processing +results. + +=head2 Extendent features + +=head3 Default value + +If C argument is true then widgets expect that there is some +default value for argument if user fills nothing. 'Nothing' in each +widget is different, for example in select box it's special option +which is always the first one, in integer box string '' means empty +value, but boolean box uses radio buttons in this case with three +options: Yes, No and Default. + +Each widget that supports C feature as well has C and +C arguments. + +=head4 Processing and showing with activated Default feature + +When this option is activated then C method returns undef +value if user selected default value. So for integer box it's empty +string and so on. + +As well when you show a widget you should pass undef as C +to inform widget that the current value is default one. + +As all methods of a widget are consistent in this behaviour so you +shouldn't care much about that, but this allows you to implement +custom actions if processing returned undef, for example delete user's +preference record instead of updating it (default value may change later to). + +=head4 C when C is not active + +DefaultValue argument is still actual in the Process method even if +C is not true. This argument defines intial value. If value +of a key in Arguments is not defined then it's treated as intial state +and the method returns default value. + +=head3 Multiple and Alternative + +These options are only supported by the select widget. + +TODO: Add more info + +=head2 Implementation details + +=head3 Boolean widget + +This widget a little bit tricky. When you use Default option then +things are simple and you see three radio buttons, but in other +case we use a checkbox. But as you know browsers don't pass unchecked +boxes to server, so arguments of a request has no entry for them. + +In the latter case it's hard to figure out case when user unselected +value. Imagine form with a checkbox, you want show it checked by +default and as well form is reloadable (like Reply forms that have +"Add Another File" buttons). User uncheck the box and then upload +file, in this case you want to show user's choice instead of default, +but browser doesn't send any value and you can not figure out if +it's initial state or page reload. To solve this problem we use magic +hidden input field with the same name as the box and value equal to +zero (0). Mason folds arguments with the same name into array refs, so +we get 0 if box is unchecked and [0, 1] if box is checked. An array +reference is true value and 0 is defined value so we know that it's +not initial state and avoid switching back to default. As well this +trick works good in a case when you want show a link to a page and +define default choice for some boolean argument, you don't need +to set argument twice, you just set it to true value (for ex. 1) and +things just work. + -- cgit v1.2.1