diff --git a/CHANGELOG.txt b/CHANGELOG.txt new file mode 100644 index 0000000000000000000000000000000000000000..34b12a68c19a36ba5aee616ff0515b4675e42cc6 --- /dev/null +++ b/CHANGELOG.txt @@ -0,0 +1,312 @@ +CHANGELOG for Views 2 for Drupal 6 + +Views 2.x-dev + Bug fixes: + o Table style when not overriding sorts put sorts in wrong order. + o #488908 by sl27257: "Node: Has new content" only worked when exposed. + o #451110 by wonder95: Fixed missing word in transform case help text. + o #385904 by JirkaRybka: Prevent duplication of id edit-submit on views exposed form. + o #489888 by TheRec: Remove erroneous "alt" attribute from when using link rewriting. + o #499078 by Darren Oh: Make sure theme is initialized for pre_render hook. + o #490516 by v_20q: Some fields not properly being marked as translatable due to option unpacking bug. + o #484222 by dereine: Attachment displays were ignoring access settings. + o #503098 by Davide Goode: Feed displays should have link displays since they link to a page display. + o #381346 by ayalon: Allow Taxonomy: Tid as a field, which is now needed for rewrites which may need tids. + o #485296 by overall and deekayen: Remove unnecessary t() call. + o #460838 by Darren Oh: Make DISTINCT more distinct. + o #503774 by dereine: Cache time failed to return the proper cutoff time. + o #506098: Table sorting with no default was overriding sorts even tho it was not supposed to. + o #407538: Ensure views_break_phrase() will stop providing warnings on empty strings. + o #420850 by dereine: Commas should not be used to separate items in a profile list field. + o #482162 by agentrickard: link path needed further sanitization to properly encode special characters. + o Tables would not accept 0 as having data so columns with zeroes would lose data when merging with other columns. + o #529164: Fatal typo in profile list field. + o #537870 by dww: Fixed a bug in the [uplodate_fid-size] token where format_size() was called on it twice. + o #510910 by mfb: Fixed bug where multiple fields sharing a column in a table was broken so only the final field would display. + o #546586 by dww: Fixed bugs that prevented '0' being a valid rewrite text or empty text for a view field. Also fixes a logic bug regarding the handling of the 'Count the number 0 as empty' setting. + o #507884 by TheRec: Removed matching title (alt) attribute on node links.\ + o #468370 by emackn: Proper timezone support on postgres. + o #508124 by voxpelli: Optionally allow boolean to treat NULL as FALSE. + o #487528 by dereine: Fix typo in 'Maximum length' field instructions. + o #303800 by Justin W Freeman: Improve dashes to spaces transformation. + o #538530 by elcuco: Views export textareas should be LTR. + o #538204 by dereine: User picture should be sortable. + o #540122 by stella: Attachment displays should attach even if arguments caused the primary display to abort. + o #544098 by joachim: Fix validation quirks with defaulted handlers. + o #485872 by dereine: Make sure views.css is always loaded for all users. + o #442982 by killes: Make destroy() method more robust so that views are more readily reused. + o #520558 by bdurbin: node access filter not properly checking 'view'. + o #535424 by Hugo Wetterberg: Download file link could provide empty a tag if no file is available. + o #554000 by killes: Preview checking wrong flag for preview state causes feeds to display incorrectly when embedded. + o #554016 by webchick: views_embed_view() should check view access. + o #523222 by gpk: Contact link should not be allowed for the anonymous user. + o #563540 by dereine: Fix description of cache plugin settings. + o #564536 by dereine: Node links should allow language setting from node data. + o #551752 by dereine: Clean up row counter code. + o #451208 by dereine and superbaloo: Fix grid style to not leave missing tds in bottom row. + o #561892 by dereine: Unchecking "rewrite this field" but leaving a value caused field to be rewritten anyway. + o #408894 by dereine: Views AJAX incorrectly used "access content" permission. + o #574150 by dereine: Remove user search because user.module does not store user keywords. + o #511908 by dww: Too many check plains in selects because of problems with checkboxes. + + Other changes: + o Implement a post_render hook (for themes too) and cache method. + o #501552 by neclimdul: Work around a core bug with DISTINCT on nodes. + o #430068 by overall and aclight: Improvements to the global "counter" field. + o #492002 by iterato: Allow "target" specification in field linking. + o #466454 by neclimdul: PHP strict fixes. + o Can now directly add a taxonomy term relationship to nodes, allowing more control by vocabulary. + o #472194: !1 can now be used with field rewriting to get the raw argument. + o #480162: Fields row style now contains option to hide empty fields. + o #433318: Special handling for empty fields, allowing them to avoid rewriting and not be displayed. + o #354457 by ausvalue: Example integrating node_example.module with Views API. + o #479728 by enboig: Allow "Does not start with" and "Does not end with" as string operators. + o #511468 by dereine: State which view was saved after saving a view. + o #520632 by DamZ: Add comment hostname and mail to available comment fields. + o #523580 by JirkaRybka: More documentation on Reduce Duplicates option. + o #510920 by apanag: Add set_current_page() method to view class. + o #337741 by joachim: Allow profile fields to have "link to user" option. + o #534680 by dagmar: Visual indicator if checkbox will expand options. + o #512650 by sdboyer: Multiple many to one arguments on the same relationship were not relationship safe. + o #536994 by dboulet: Store result in variables for use in unformatted style. + o #458194 by voxpelli: Add first and last row classes to table style. + o #254895: Add form to clean up Views 1 tables. + +Views 2.6 + Bugs fixed: + o #419226 by kelvincool: Respect admin theme during views ajax operations. + o #419270 by voxpelli: set_where_group() could fail if no previous groups. + o #422054 by yhahn: Protect exports from impropertly indenting multiline strings. + o #437070 by mikeryan: Base table formerly limited to 32 characters. + o #317271 by quicksketch: ensure_my_table() limited to one relationship per table. + o #441520 by jonathan1055: Allow the "time ago" date format to work on future dates as well. + o #445398 by casey: reduce_value_options() using wrong value array. + o #451370 by skwashd: base.js had some DOS line endings. + o #454754 by dww: Fix PGSQL related errors with comment author filtering. + o #384286 by dww: Make it possible to expose the filter for "Node: Has new content" + o #463634 by alienbrain: "Empty field name" incorrectly specified. + o #463580 by ximo: AJAX summary links broken in some displays. + o #468336 by psynaptic: Fix broken hook_views_admin_links_alter + o #422868 by mattman: Breadcrumbs not properly substuting % replacements. + o #440676 by dereine and Razorraser: View import form crashed on empty view input. + o #461842 by dereine: Use gmtime() instead of format_date() to prevent localization of dates in RSS feeds. + o #316556 by darrenoh and JirkaRybka: More 1.x upgrade fixes. + o #382398 by elcuco: Force LTR in the views admin. + o #461144: Fix trimming to correctly remove tags when they are trimmed in half. + o #330956: Theme: Information only scanned information from the default theme. + o SA-CONTRIB-2009-037: Filter checkboxes could be displayed unfiltered allowing XSS attacks. + + Other changes: + o #298616: Add argument for node updated time similar to node created time. + o #325607 by bangpound: Automatically sort exports from bulk export. + o #323049 by yched: Allow Empty/Not Empty on select many to one. + o #340701 by swentel: Restore allowing Views to set block caching mode. + o #347892 by dww: Allow option in Boolean filters. + o #358314 by brmassa: Catch the exposed filter form so it doesn't process twice on a single view. + o #154865 by Zack Rosen, josh_k and KarenS: Allow user contact form as a field. + o #411880 by fgm: Add "options callback" to items using in_operator handler. + o #360657 by yhahn: new hook_views_default_views_alter(). + o #430068 by dereine: New global counter field for displaying row number. + o #420340 by derine: Translate node type filter. + o #325796 by yang_yi_cn: Translate node type argument. + o #446726 by yhahn: Improved performance for js dependencies. + o #437760 by leeneman: Remove duplicate terms from taxonomy term argument title. + o #354270 by dereine: Allow "tag" to be added to the theme template suggestions. + o #408180 by joachim: Allow taxonomy term parent argument. + o #469456 by dereine: Automatically give .info file during views bulk export. + o #424460 by thePanz: Customizable breadcrumb title for arguments. + o #436398 by Pasqualle: Support for aggregator category table. + o #424648 by quicksketch and dereine: Allow format selection on filesize field. + o #478312 by yhahn: Provide specific node access filter. + o #479878 by dereine: User language field. + o #468824 by eaton: Pluggable caching mechanism which can cache both the query result and rendered result. + o #399534 by clemens.tolboom and drewish: Add fragment and query string as options when making fields into links. + o #315915 by dixon_: Add another base row class to rows. + o #353403 by agentrickard: Field to provide "more" text. + o #377896 by dereine: When ticked "link to node" show node title as a href title attribute. + o #386098 by dereine: Add "watchdog" as a debug logging options. + o #409428 by gpk: Missing field: node input format. + o #271833 by grugnog, agentrickard and others: Taxonomy depth in filter. + +Views 2.5 + Bugs fixed: + o #363817 by thePanz: Empty fields in table could still trigger separators. + o #388952 by nikita@protsenko.com: Ensure taxonomy term validator sets the validated title when available. + o #392176: Trim on word boundary would stop at newlines. + o #415706 by dww: Fix broken relationship in search that caused SQL error. + o #428742 by fralenuvol: Fix broken relationship causing sql error with multiple taxonomy term arguments. + o #428102 with help from deviantintegral: Broken option_definition() causes warnings. + + Other changes: + o #379382 by neochief: Add option to strip tags during advanced rendering. + o #400914 by joachim: Add a link field to get to comments for a node that works just like the normal links. + o #402650 by drewish: Bulk export views alphabetically by view name. + o #349157 by yched: Support CCK build modes in node style. + +Views 2.4 + Bugs fixed: + o #371466 by dereine: Fix incorrect link to comments. + o #371923 by noahb: Summaries could be distinct even when they should not be. + o #368764: Fix User ID validator to actually have proper dependencies. + o #375342 by dww: node_comment_statistics should be INNER joined because there is always 1:1 reference. + o #372959: Archive view should not use AJAX by default. + o #373155: Not clearing "many to one" data breaks some attachment displays. + o #375000 by elcuco: View name should always be LTR. + o #378534 by dww: Validators do not fire if argument === 0 due to PHP loose type conversions. + o #378164 by yched: Unexposed taxonomy filter could accidentally stop working. + o #371923 by David_Rothstein: Another DISTINCT fix related to summaries. + o #365831 by tomiyana: Fix typos in help. + o #357368 by Pasquale: schema descriptions should not be translated. + o #379602 by dww: Add a second "time ago" variant to dates to allow NOT printing the word "ago". + o #379354 by neochief: Add an extra regex to remove mangled HTML entities in output rewriting. + o #362830: Search was mostly broken, especially score but also searching on multiple terms. + o #350376 by pfournier: Missing "return" statement caused certain argument date validation to fail. + o #364082 by hass: Unique key missing on views_view table. + o #366250 by sirkitree: Fix deprecated jquery selectors so we can work with jquery 1.2.6 as well as 1.3.2. + o #386986: 2 or more relationships could block a normal table from being added. + o #371219 by aclight: Incorrect logic in views_many_to_one_helper::ensure_my_table() + o #376570 by yhahn: Better AJAX scrolling. + o #412576 by yhahn: Restore missing views_handler_filter_float class. + o #378710: Add strip_tags() to path when displaying a field as a link as a path can never have HTML in it. + o #380560: UI could suddenly cause errors with get_handlers() in certain situations with relationships. + o #342215: Occasional "holes" could appear in taxonomy term field causing query errors when relationship is used but not present. + o #414074 by dereine: Prevent fields becoming not editable by having just spaces in them in the Views UI. + o #378724: Displaying uploaded files as a link accidentally made the entire field a link rather than each one. + o #415672 by yhahn: Views inadvertently rounds negative numbers down instead of up when truncating. + o #408414 by rb7: Prevent empty links with the "has new comments" field. + o #406680 by Büke Beyond: Missing clear-block caused problems in IE for Views UI. + o #373771 by dropcube: Fix missing aggregator feed trying to use non-existing handlers. + o #341960 by sun: Clean up dependent.js javascript declarations which potentially caused .js errors. + o #372227: On Debian etch, tables would lose fields due to PHP bug. + + Other changes: + o #375182 by vaish: Allow a reset parameter to views_get_all_views(). + o #356276 by nedjo: Locale support. + o #316556 by Darren Oh: Better Views 1.x upgrades. + o #383242 by dww: Allow - Any - instead of as an option in the Views tools menu. + o #303800 by KarenS: Additional dashes to spaces option in taxonomy argument validator. + o #327366 by yched: Allow row styles to follow relationships too. + o #405130 by dereine: Make the output field rewrite a textfield rather than textarea. + +Views 2.3 + Bugs fixed: + o #349739: Fix arguments not getting transmitted to attachment displays properly. + o #354707: Display attachment happened too early preventing default arguments from passing to the attachment. + o #277321 by nedjo: Use AJAX properly supports summaries in attachments. + o #291292 by sammys (reroll by jaydub): Proper use of DISTINCT on summary views on pgsql. + o #291079 by sammys (reroll by jaydub): Fix use of GROUP BY on pgsql. + o #295246 by webchick: Wrong table type on views object cache caused truncation of cached data and mysterious errors on large views. + o #315007 by Garrett Albright, Paul Kishimoto and catch: Take into account page count when using comment new link. + o #317562 by ingaro: Wrong date format for PGSQL. + o #327604 by mr.baileys: Fix improper use of multibyte library when mb library unavailable. + o #335926 by sapark and drewish: "January, 2009" should be "January 2009". + o #341263 by cdale: Prevent exposed filter forms from processing during batch operations. + o #342322 by drewish: Correct label for translation status. + o #343223 by alienbrain: Ensure path before join. + o #343284 by andypost: Fix odd/even reversed in table style compared to Drupal core. + o #345545 by mfb: Correct occasional Drupal.settings related javascript error. + o #345546: Fix Node: Created day argument off by 1 error. + o #345707 by aries: Do not display breadcrumb link if no link text. + o #355939 by yhager: Fix missing comment GUID in comment RSS style. + o #321332 with help from brahms: views_handler_field_markup only worked if format was named "format". + o #348322 by Darren Oh: Fix missing /code in api plugins help. + o #353090 by eaton: RSS feeds were not using all of the Drupal hooks to ensure full compatibility with core feeds. + o #293832 by drewish: Allow menu items to have administrative description. + o #345528: Mini-pager generated invalid HTML with empty li tags. + o #351745: Exposed taxonomy term autocomplete filter failed if term existed in multiple vocabularies. + o #353002: tracker view had wrong argument and was not picking up comments by the selected user. + o Case sensitivity on string filter checkmark was backward. + o #355919: views_theme() needed to include plugin theme files to detect functions. + o #353515: Many characters could get incorrectly translated in exposed filters combined with ajax tablesorting. + o #359818: Delete button should say Revert when reverting a view to default. + o #359132 by grugnog: CSS files should be marked conditional so they don't impact the CSS cache. + o #360637: Extra slash in theme includes could cause some systems to fail. + o #363081: Disabled views could still provide blocks. + o #366666 by Deadmonk also yched: File size field should not try to print a size on NULL values. + o #367203: Improper caching of default views caused incomplete handlers that could WSOD. + o #365283: views_handler_filter_ncs_last_updated improperly registered causing fatal errors trying to use it. + o #365712: select list exposed filters were trying to limit to list when selecting "All" even when "limit" was not selected. + o #357196 by Grugnog: hook_views_pre_view not getting $display_id sent properly. + + Other changes: + o #288801 by drewish and eaton: Aggregator item support! Make views of feeds! + o #335647 by markus_petrux: Add memory and a reset button to the Views list page. + o #343047 by alienbrain: Allow all handlers to participate in view validation. + o #339223 by greggles: Allow taxonomy term tid to be sortable. + o #324378 by eigentor: CSS improvements to the view list page. + o #354736 by Shai: Clarification on exposed filter text. + o #364637 by moshe and dww: Allow preprocessors to add row classes to table style. + o #349178 by agentrickard: Add generic link handling plus a custom text field. Also automatic trimming. + o #368234 by dww and neclimdul: Allow the "Anonymous" user to have a different (or no) name in User: name field. + o #368754 by dww: User ID validator, with role testing. + o #369505 by dww: Add helper function to get the value of a view argument. + o #353002 by neclimdul: Provide a filter for user posted or commented on to complement the argument with the same functionality. + + 2.3 API Notes: + A minor change in the API now requires that styles that render fields MUST + render them in order, first by row and then by field ID. Not doing so will + cause the token expansion to fail. + +Views 2.2 + Bugs fixed: + o #305756: Number formatting caused illogical rounding. + o #324272 by neochief: hook_pre_render never called. + o #324058: Broken queries created by string values in multiple fields. + o #324726: "tag" fields should be autocomplete in View edit. + o #324058 by yched: Make aliases safer for many to one tables. + o #325765: Prevent key merge errors on query::add_where and query::add_having. + o #324378: Minor usability improvements to the list page. + o #326934: Need another check to make sure already added aliases do not get blown away. + o #324513: If a relationship table was added more than 1 hop away from the base, SQL errors resulted. + o #326129 by mindgame: Not between operator did not function. + o #326198: != mistakenly typod as = (display only) + o #326379: Provide a default title for the archive view. + o #327151: Add filter for node_counter.timestamp. + o #327113: Clean up error text when display will not validate. + o #307287: (Panels related) view::preview() would override previously set arguments if no arguments were sent. + o #321589: Comment template preprocessor misnamed so it would not fire. + o #329746: Comment rendering in the node row style was not working. + o #321109: view::destroy() needs to unset current_display or future init_displays won't work. + o #325115: If the block description is not set, show the display title as well as the view name in block administration. + o #327604 by henrrrik: should use multibyte string functions. + o #328933 by cmyers: views_handler_filter_date fails to use exposed operator. + o #332568 by Moonshine: Correct views performance timers. + o #332679 by yched: render_link() does not check for empty data. + o #333593: Incorrect reference to non-existent views_handler_join in help/api-tables.html. + o #334337 by miro_dietiker: Documentation clarification for arguments, blocks and PHP Code plugins. + o #336456 by dww: Date filter had trouble with NULL operators. + o #336125 by nedjo: Missing filter for node translation. + o #337360: Menu selection causes crash if menu module not active. + o #339295 by katbailey: AJAX paging could fail with the same view in multiple tabs. + o #339676 by nedjo: Source translation had wrong filter handler. + o #340002 by hass: Allow the "Add display" button to wrap for translations whose phrase is longer. + o #340033 by pancho: Clearer wording on some field help texts. + o #340515: views_perm() was incorrectly views_ui_perm(). + o #330897: Invalid displays causing 'path' lookup to crash. + o #339674 by nedjo: Translation code cleanup. + o #341897: views_perm() mistakenly declared in views_ui.module. + + Other changes: + o Reorganize the analysis code into analyze.inc to make it easier for people to find the code and use it externally. + o #298884 by neclimdul: Requested missing filter to filter for whether a user has a picture or not. + o #336531 by dww: Set boolean filter to not use a checkbox which is lesser UI. + o #338632 by drewish: Remove use of format_rss_channel and use proper templating instead. + o #326034 by yched: Allow short names in admin summaries via new "title short" definition. + o #335613 by swentel: Add hook_views_api() setting to bulk export. + o #339707 by nedjo: Add filter to show child translations. + o #284768 by drewish: Proper templates for RSS feeds rather than format_rss_item(). + + +Views 2.1 + Bugs fixed: + o #322862: 1.0037 debug code left in. + o #322908: README.txt update. + o #323014 by yched: Typo in exposed filter text. + o #323033: Using empty/is not empty in string/numeric filters caused notices. + o #322874 by yched: Errors in summary for some filters. + o #323282: Taxonomy term default choice handled incorrectly. + o #323318: Exposed taxonomy term failed if not set force single. + +Views 2.0 + o First 2.0 official release + diff --git a/README.txt b/README.txt new file mode 100644 index 0000000000000000000000000000000000000000..32c939a2262553ab9cc323ff73d53bc186dc9639 --- /dev/null +++ b/README.txt @@ -0,0 +1,28 @@ +// $Id$ + +Welcome to Views 2. Please see the advanced help for more information. + +If you're having trouble installing this module, please ensure that your +tar program is not flattening the directory tree, truncating filenames +or losing files. + +Installing Views: + +Place the entirety of this directory in sites/all/modules/views + +Navigate to administer >> build >> modules. Enable Views and Views UI. + +If upgrading from Drupal 5 and Views 1, your views need to be +converted manually. See administer >> build >> modules >> views >> tools >> convert. + +If you're new to Views, try the Simple Views module which can create some +often used Views for you, this might save you some time. + +Recommended modules for use with Views: + CCK + Voting API + Views Bonus Pack + Views Bulk Operations + +Experimental modules: + Views OR \ No newline at end of file diff --git a/css/views-admin.css b/css/views-admin.css new file mode 100644 index 0000000000000000000000000000000000000000..8d9fe45fdfa901897a6c60194e154d1386e49190 --- /dev/null +++ b/css/views-admin.css @@ -0,0 +1,656 @@ +/* $Id$ */ + +/* + * Summary pad + */ +/* set up some defaults so weird themes don't override us too badly. */ +.views-tabset { + color: #494949; + background-color: white; +} + +.views-tabset a:visited, +.views-tabset a:hover, +.views-tabset a { + color: #027AC6; +} + +.views-tabset .views-tab fieldset { + margin-top: 0; +} + +/* + * First column: display drawers + */ +.views-tabset .views-tabs { + background: #F6F6F6; + border-top: #D6DBDE 1px solid; + border-bottom: #D6DBDE 1px solid; + border-left: #D6DBDE 1px solid; + float: left; + width: 117px; + margin-right: 0; +} + +* html .views-tabset .views-tabs { + width: 114px; + position: relative; + left: 4px; +} + +.views-tabset .views-tabs ul { + list-style-type: none !important; + list-style-image: none !important; + padding: 0; + margin: 0; + position: relative; +} + +.views-tabset .views-tabs ul li { + background: #efefef; + list-style-type: none; + list-style-image: none; + line-height: 100%; + border-bottom: #D6DBDE 1px solid; + margin: 0; + padding: 0; + position: relative; +} + +.views-tabset .views-tabs ul li.active { + background: #fff url(../images/arrow-active.png) no-repeat right; + position: relative; + width: 118px; + margin-right: -1px; +} + +.views-tabset .views-tabs ul li a { + display: block; + font-size: 90%; + color: #777; + font-weight: normal; + padding: 0.5em; +} + +.views-tabset .views-tabs ul li a:hover { + background-color: #f6f6f6; + text-decoration: none; +} + +.views-tabset .views-tabs ul li.active a { + color: #000; + font-weight: bold; +} + +.views-tabset .views-tabs ul li.active a:hover { + color: #000; + background: #fff url(../images/arrow-active.png) no-repeat right; +} + +.views-tabset .extra { + text-align: center; + margin-right: 0; +} + +.views-tabset .extra input { + margin-top: 0; + margin-right: 0; + white-space: normal; +} + +/* + * Three columns with setting-summaries + */ +.views-tabset .views-display { + border: #D6DBDE 1px solid; + margin-left: 118px; /* 118 -1 causes borders to overlap */ + min-height: 302px; + _height: 300px; /*stupid IE hack */ +} + +* html .views-tabset .views-display { + margin-left: 114px; +} + +div.views-display-deleted, +div.views-display-deleted div.top, +div.views-display-deleted div.tab-section { + background-color: #eee; +} + +.views-display { + background: #fff; +} + +.views-display div { + font-size: 8pt; + line-height: 12pt; +} + +.views-display .top { + padding: 0.5em 0em 0em 1em; + background: #fff; +} + +.views-display .top .display-title { + font-weight: bold; +} +.views-display .top .display-description { + margin-left: 1em; + font-style: italic; + overflow: hide; + white-space: nowrap; + font-size: 90%; +} + +.views-display .tab-section { + width: 32.5%; + padding: 0; + margin: 0; + float: left; + min-height: 273px; + _height: 274px; +} + +.views-display .tab-section .inside { + margin: 0.5em 0.5em 0.5em 1em; +} + +.views-display .tab-section .inside .views-category { + margin-bottom: 1em; + background: #f6f6f6; + border: 1px #efefef solid; +} + +.views-display .tab-section .inside .views-category-content { + padding: 0em 0em 0.5em 1em; +} + +.views-display .tab-section .inside .views-category-title { + padding: .1em .1em .1em .3em; + margin: 0 0 .1em 0; + font-size: 9pt; + font-weight: bold; + background-color: #efefef; + border-bottom: 1px #efefef solid; +} + +.views-display .tab-section .links { + float: right; + font-size: 6pt; + position: relative; + display: inline; +} + +.views-display .tab-section .links a { + font-size: 6pt; + font-style: italic; +} + +.views-display .form-submit, +#views-ajax-pad .form-submit { + margin: 0; +} + +.views-display .middle { + width: 34%; +} + +.views-basic-info { + margin: 0.5em 0em 0 0; + padding: 0.5em; +} + +/* + * AJAX pad, the bottom part where settings are edited. + */ +#views-ajax-pad { + background: transparent; + margin-top: 0px; +} + +#views-ajax-title { + background: #f6f6f6; + border-left: #D6DBDE 1px solid; + border-right: #D6DBDE 1px solid; + margin: 0 0 0 118px; + padding: 1em 1em 0em 1em; + font-weight: bold; +} + +#views-ajax-pad .message { + background: #f6f6f6; + margin-left: 118px; + border: #D6DBDE 1px solid; + border-top: 0; + /* padding: 3em 0em; */ + text-align: center; + font-style: italic; +} + +#views-ajax-pad form { + background: #fff; + margin-left: 118px; + border: #D6DBDE 1px solid; + padding-top: 3px; + border-top: 0; +} + +#views-ajax-pad .views-messages { + background: transparent; + margin-left: 118px; + padding: 5px; + border: #D6DBDE 1px solid; + border-top: 0; +} + +#views-ajax-pad .form-buttons { + margin: 0; + padding: 0.5em 1em; + background: #f6f6f6; + clear: left; +} + +#views-ajax-pad .clear { + clear: left; +} + +#views-ajax-pad .form-buttons .form-submit { + margin: 0 .5em 0 0; + padding: 0; +} + +#views-ajax-pad .form-item { + margin: 0.5em; + padding: 0em 0.5em; +} + +/* These put checkboxes closer together */ +#views-ajax-pad .form-checkboxes .form-item, +#views-ajax-pad .form-checkboxes .description, +#views-ajax-pad .form-checkboxes input, +#views-ajax-pad .form-radios .form-item, +#views-ajax-pad .form-radios label, +#views-ajax-pad .form-radios input { + margin-top: 0; + margin-bottom: 0; +} + +#views-ajax-pad .form-item .form-checkboxes, +#views-ajax-pad .form-checkboxes input, +#views-ajax-pad .form-checkboxes label, +#views-ajax-pad .form-item .form-checkboxes .form-item, +#views-ajax-pad .form-item .form-radios, +#views-ajax-pad .form-radios input, +#views-ajax-pad .form-radios label, +#views-ajax-pad .form-item .form-radios .form-item { + padding-left: 0; + margin-left: 0; +} + +#views-ajax-pad .form-checkboxes .description, +#views-ajax-pad .form-radios .description { + margin-left: 2em; +} + +#views-ajax-pad { + display: none; +} + +html.js #views-ajax-pad { + display: block; +} + +.views-override, +.views-expose { + padding: 0.5em 1em 0em 1em; +} + +#views-ajax-pad .views-override .form-submit, +#views-ajax-pad .views-expose .form-submit { + float: right; + margin: 0 .5em 0 1em; +} + +#views-ajax-pad .views-expose .description, +#views-ajax-pad .views-override .description { + margin-bottom: .25em; +} + +/* + * Some column widths for use within the ajax pad + */ +#views-ajax-pad .views-left-10 { + float: left; + width: 10%; +} + +#views-ajax-pad .views-left-20 { + float: left; + width: 20%; +} + +#views-ajax-pad .views-left-25 { + float: left; + width: 25%; +} + +#views-ajax-pad .views-left-30 { + float: left; + width: 30%; +} + +#views-ajax-pad .views-left-40 { + float: left; + width: 40%; +} + +#views-ajax-pad .views-left-50 { + float: left; + width: 49.5%; +} + +#views-ajax-pad .views-right-50 { + float: right; + width: 50%; +} + +#views-ajax-pad .views-right-60 { + float: right; + width: 60%; +} + +#views-ajax-pad .views-right-70 { + float: right; + width: 70%; +} + +#views-ajax-pad .views-left-75 { + float: left; + width: 75%; +} + +#views-ajax-pad .views-radio-box { + overflow: auto; + height: 22em; +} + +#views-ajax-pad fieldset { + margin: 0 .5em; +} + +#views-ajax-pad table td .form-item, +#views-ajax-pad table td .form-item input, +#views-ajax-pad table td .form-item select { + padding: 0; + margin: 0; +} + +#views-ajax-pad label.hidden-options { + background: transparent url(../images/arrow-active.png) no-repeat right; + height: 12px; + padding-right: 12px; +} + +#views-ajax-pad label.expanded-options { + background: transparent url(../images/expanded-options.png) no-repeat right; + height: 12px; + padding-right: 16px; +} + +#views-ajax-pad .dependent-options { + padding-left: 30px; +} + +/* + * Add, Rearrange and Configure buttons using sprites + */ +a.views-button-configure, +a.views-button-add, +a.views-button-rearrange, +a.views-button-remove { + background:transparent url(../images/sprites.png); + display: inline-block; + float: right; + height: 12px; + width: 16px; + margin: 2px 0px 1px 0px; + border-bottom: #C2C9CE 1px solid; + border-right: #C2C9CE 1px solid; + padding: 0px; +} + +a.views-button-remove { + background-position: 0px -72px; + position: relative; + top: -4px; +} +a.views-button-remove:hover { + background-position: 0px -84px; +} + +a.views-button-configure { + background-position: 0px -48px; + margin: 0; +} +a.views-button-configure:hover { + background-position: 0px -60px; +} + +a.views-button-add { + background-position: 0px -24px; +} +a.views-button-add:hover { + background-position: 0px -36px; +} + +a.views-button-rearrange { + background-position: 0px 0px; +} +a.views-button-rearrange:hover { + background-position: 0px -12px; +} + +a.views-button-remove span, +a.views-button-rearrange span, +a.views-button-configure span, +a.views-button-add span { + display: none; +} + +html.js #arrange thead { + display: none; +} + +html.js .views-remove-checkbox { + display: none; +} + +a.views-button-remove { + display: none; +} + +html.js a.views-button-remove { + display: inline; +} + +#arrange tr.even, +#arrange tr.odd, +#arrange td { + padding-top: 0; + padding-bottom: 0; +} + +#arrange .form-item { + padding: 0; +} + +div.changed { + background-color: #ffe; + font-weight: bold; +} + +div.view-changed { + display: none; + float: right; + font-style: italic; + color: #f93; + padding-left: 1em; +} + +div.views-tab div.changed a { + +} + +div.changed div.view-changed { + display: block; +} + +.views-display .tab-section .inside .overridden { + /* all this so we don't mess up background-color */ +/* background-image: url(../images/overridden.gif); + background-repeat: no-repeat; + background-position: left; + padding-left: 10px; */ +} + +.views-display .tab-section .views-category-content.overridden { + background-image: none; +} + +.views-display .tab-section .inside .defaulted { + color: #aaa; + font-style: italic; +} + +.views-display .tab-section .inside .defaulted a { + font-style: italic; +} + +.hilited { + color: #000; + font-weight: bold; + background-color: #ffd; + padding-left: 10px; +} + +#views-ajax-pad fieldset { + background: transparent; + padding-left: 10px; +} + +#views-ajax-pad pre { + overflow: auto; + border: 1px solid #333; + background-color: #f0f0f0; + padding: .5em; +} + +form#views-add-display-form { + margin-bottom: 0em; + border-bottom: 1px solid #ccc; +} + +form#views-add-display-form select { + width: 8.5em; +} + +#views-ui-edit-view-form { + margin: 0; + padding: 0; +} + +#views-live-preview { + padding-top: .5em; +} + +form#views-ui-preview-form, +#center form#views-ui-preview-form { + border: 1px solid #D6DBDE; + margin: 0 0 .5em 0; + padding: .5em; +} + +form#views-ui-preview-form div#preview-display-id-wrapper, +form#views-ui-preview-form div#preview-args-wrapper { + float: left; + margin: 0; + padding: 0 1em 0 0; +} + +form#views-ui-preview-form input#preview-submit { + margin: 1.7em 0 0 0; +} + +.view-locked { + color: red; + border: 1px solid red; + padding: 1em; +} + +/* Hide by default only with js */ +html.js .views-hidden { + display: none; +} + +.views-query-info { +/* overflow: auto; */ +} + +.views-query-info pre { + white-space: pre; /* CSS2 */ + white-space: -moz-pre-wrap; /* Mozilla */ + white-space: -hp-pre-wrap; /* HP printers */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: pre-wrap; /* CSS 2.1 */ + white-space: pre-line; /* CSS 3 (and 2.1 as well, actually) */ + word-wrap: break-word; /* IE */ + max-height: 200px; + overflow: scroll; +} + +.views-quick-links { + float: right; +} + +.views-quick-links ul.links li { + padding-left: 1em; +} + +.views-quick-links li.last { +} + +.views-edit-view .advanced-help-link { + padding-right: 3px; +} + +#views-ajax-title .advanced-help-link { + position: relative; + top: 2px; + padding-right: 3px; +} + +#views-ajax-pad input, +#views-ajax-pad textarea { + max-width: 95%; +} + +.remove-display { + float: right; + margin: 0; + padding: .2em 1em 0 0; + position: relative; + top: .1em; +} + +.views-display .remove-display form, +.remove-display input { + margin: 0 !important; +} + +.views-validator-options { + padding: 0 1em; + margin: 0 1em; + border: 1px solid; +} diff --git a/css/views-list-rtl.css b/css/views-list-rtl.css new file mode 100644 index 0000000000000000000000000000000000000000..c9452db14172f7543a6d5fde53380cba8a1808e0 --- /dev/null +++ b/css/views-list-rtl.css @@ -0,0 +1,28 @@ +/* $Id$ */ + +table.views-entry { + clear: right; /* RTL */ +} + +table.views-entry td.view-ops { + text-align: left; /* RTL */ +} + +#views-ui-list-views-form .form-item { + padding-left: 1em; /* RTL */ + float: right; /* RTL */ +} + +#edit-order-wrapper { + clear: right; /* RTL */ +} + +#edit-views-apply, +#edit-views-reset { + float: right; /* RTL */ +} + +.views-entry .advanced-help-link { + padding-left: 3px; /* RTL */ +} + diff --git a/css/views-list.css b/css/views-list.css new file mode 100644 index 0000000000000000000000000000000000000000..7e8fe10a0d74836a08aae7e9866e83893cf4a4d2 --- /dev/null +++ b/css/views-list.css @@ -0,0 +1,84 @@ +/* $Id$ */ + +table.views-entry { + margin: 3px 0; + border: 1px solid #ddd; + background-color: white; + color: #494949; /* matches garland */ + clear: left; /* LTR */ + width: 100%; +} + +table.views-entry tbody { + border: none; +} + +table.views-entry td.view-ops { + width: 45%; + text-align: right; /* LTR */ + background-color: #eee; +} + +table.views-entry td.view-name { + background-color: #eee; +} + +table.views-entry .description { + vertical-align: top; +} + +body form#views-ui-list-views-form { + margin: 0 0 1.5em 0; +} + +#views-ui-list-views-form .form-item { + padding-right: 1em; /* LTR */ + float: left; /* LTR */ + margin-top: 0; + margin-bottom: 0; +} + +#edit-order-wrapper { + clear: left; /* LTR */ +} + +#edit-views-apply, +#edit-views-reset { + margin-top: 1.65em; + float: left; /* LTR */ +} + +.views-entry .advanced-help-link { + position: relative; + top: 2px; + padding-right: 3px; /* LTR */ +} + +table.view-disabled { + color: #999; +} + +table.views-entry td { + line-height: 1.4; + padding-bottom: 10px; +} +table.view-disabled td { + line-height: 1.4; + padding-bottom: 10px; + background: none; +} +table.view-enabled td.view-name, +table.view-enabled td.view-ops, +table.view-disabled td.view-name, +table.view-disabled td.view-ops { + line-height: 1.6; + padding-bottom: 0.3em; +} +table.views-entry td.view-name, +table.views-entry td.view-ops { + background: #eee; +} +table.view-enabled td.view-name, +table.view-enabled td.view-ops { + background: #E4F0F8; +} diff --git a/css/views-tabs.css b/css/views-tabs.css new file mode 100644 index 0000000000000000000000000000000000000000..e884e076af53abb056cb15f87c453f6cac8e864c --- /dev/null +++ b/css/views-tabs.css @@ -0,0 +1,5 @@ +/* $Id */ + +.ui-tabs-hide { + display: none; +} diff --git a/css/views.css b/css/views.css new file mode 100644 index 0000000000000000000000000000000000000000..958c9af5ebd82a6a34c906432f574512387d3217 --- /dev/null +++ b/css/views.css @@ -0,0 +1,96 @@ +/* $Id$ */ +.views-exposed-form .views-exposed-widget { + float: left; + padding: .5em 1em 0 0; +} + +.views-exposed-form .views-exposed-widget .form-submit { + margin-top: 1.6em; +} + +.views-exposed-form .form-item, +.views-exposed-form .form-submit { + margin-top: 0; + margin-bottom: 0; +} + +.views-exposed-form label { + font-weight: bold; +} + +.views-exposed-widgets { + margin-bottom: .5em; +} + +html.js a.views-throbbing, +html.js span.views-throbbing { + background:url(../images/status-active.gif) no-repeat right center; + padding-right:18px; +} + +/* administrative hover links */ + +div.view div.views-admin-links { + font-size: xx-small; + margin-right: 1em; + margin-top: 1em; + width: 95%; +} + +.block div.view div.views-admin-links { + margin-top: 0; +} + +div.view div.views-admin-links ul { + padding-left: 0; +} + +div.view div.views-admin-links li a { + color: #ccc; +} + +div.view div.views-admin-links li { + padding-bottom: 2px; + z-index: 201; +} + +div.view div.views-admin-links-hover a, +div.view div.views-admin-links:hover a { + color: #000; +} + +div.view div.views-admin-links-hover, +div.view div.views-admin-links:hover { + background: transparent;; +} + +div.view div.views-admin-links a:before { + content: "["; +} + +div.view div.views-admin-links a:after { + content: "]"; +} + +div.view div.views-hide { + display: none; +} + +/** For IE we add the class via js; for other browsers we rely on :hover **/ +div.view div.views-hide-hover, +div.view:hover div.views-hide { + display: block; + position: absolute; + z-index: 200; +} + +/* don't do this one in IE */ +div.view:hover div.views-hide { + margin-top: -1.5em; +} + +/* Remove the border on tbody that system puts in */ +.views-view-grid tbody { + border-top: none; +} + diff --git a/docs/docs.php b/docs/docs.php new file mode 100644 index 0000000000000000000000000000000000000000..40aed9159d66935822a0dc4a6fd3c0b84a3aa141 --- /dev/null +++ b/docs/docs.php @@ -0,0 +1,658 @@ + 'nid', + 'title' => t('Example table'), + 'help' => t("Example table contains example content and can be related to nodes."), + 'weight' => -10, + ); + + // This table references the {node} table. + // This creates an 'implicit' relationship to the node table, so that when 'Node' + // is the base table, the fields are automatically available. + $data['example_table']['table']['join'] = array( + // Index this array by the table name to which this table refers. + // 'left_field' is the primary key in the referenced table. + // 'field' is the foreign key in this table. + 'node' => array( + 'left_field' => 'nid', + 'field' => 'nid', + ), + ); + + // Next, describe each of the individual fields in this table to Views. For + // each field, you may define what field, sort, argument, and/or filter + // handlers it supports. This will determine where in the Views interface you + // may use the field. + + // Node ID field. + $data['example_table']['nid'] = array( + 'title' => t('Example content'), + 'help' => t('Some example content that references a node.'), + // Because this is a foreign key to the {node} table. This allows us to + // have, when the view is configured with this relationship, all the fields + // for the related node available. + 'relationship' => array( + 'base' => 'node', + 'field' => 'nid', + 'handler' => 'views_handler_relationship', + 'label' => t('Example node'), + ), + ); + + // Example plain text field. + $data['example_table']['plain_text_field'] = array( + 'title' => t('Plain text field'), + 'help' => t('Just a plain text field.'), + 'field' => array( + 'handler' => 'views_handler_field', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + // Example numeric text field. + $data['example_table']['numeric_field'] = array( + 'title' => t('Numeric field'), + 'help' => t('Just a numeric field.'), + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // Example boolean field. + $data['example_table']['boolean_field'] = array( + 'title' => t('Boolean field'), + 'help' => t('Just an on/off field.'), + 'field' => array( + 'handler' => 'views_handler_field_boolean', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_boolean_operator', + 'label' => t('Published'), + 'type' => 'yes-no', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // Example timestamp field. + $data['example_table']['timestamp_field'] = array( + 'title' => t('Timestamp field'), + 'help' => t('Just a timestamp field.'), + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + ); + + return $data; +} + +/** + * The full documentation for this hook is now in the advanced help. + * + * This hook should be placed in MODULENAME.views.inc and it will be auto-loaded. + * This must either be in the same directory as the .module file or in a subdirectory + * named 'includes'. + * + * This is a stub list as a reminder that this needs to be doc'd and is not used + * in views anywhere so might not be remembered when this is formally documented: + * - style: 'even empty' + */ +function hook_views_plugins() { + // example code here +} + +/** + * Register handler, file and parent information so that handlers can be + * loaded only on request. + * + * The full documentation for this hook is in the advanced help. + */ +function hook_views_handlers() { + // example code here +} + +/** + * Register View API information. This is required for your module to have + * its include files loaded; for example, when implementing + * hook_views_default_views(). + * + * @return + * An array with the following possible keys: + * - api: (required) The version of the Views API the module implements. + * - path: (optional) If includes are stored somewhere other than within + * the root module directory or a subdirectory called includes, specify + * its path here. + */ +function hook_views_api() { + return array( + 'api' => 2, + 'path' => drupal_get_path('module', 'example') . '/includes/views', + ); +} + +/** + * This hook allows modules to provide their own views which can either be used + * as-is or as a "starter" for users to build from. + * + * This hook should be placed in MODULENAME.views_default.inc and it will be + * auto-loaded. This must either be in the same directory as the .module file + * or in a subdirectory named 'includes'. + * + * The $view->disabled boolean flag indicates whether the View should be + * enabled or disabled by default. + * + * @return + * An associative array containing the structures of views, as generated from + * the Export tab, keyed by the view name. A best practice is to go through + * and add t() to all title and label strings, with the exception of menu + * strings. + */ +function hook_views_default_views() { + // Begin copy and paste of output from the Export tab of a view. + $view = new view; + $view->name = 'frontpage'; + $view->description = t('Emulates the default Drupal front page; you may set the default home page path to this view to make it your front page.'); + $view->tag = t('default'); + $view->view_php = ''; + $view->base_table = 'node'; + $view->is_cacheable = '0'; + $view->api_version = 2; + $view->disabled = FALSE; // Edit this to true to make a default view disabled initially + $view->display = array(); + $display = new views_display; + $display->id = 'default'; + $display->display_title = t('Defaults'); + $display->display_plugin = 'default'; + $display->position = '1'; + $display->display_options = array ( + 'style_plugin' => 'default', + 'style_options' => + array ( + ), + 'row_plugin' => 'node', + 'row_options' => + array ( + 'teaser' => 1, + 'links' => 1, + ), + 'relationships' => + array ( + ), + 'fields' => + array ( + ), + 'sorts' => + array ( + 'sticky' => + array ( + 'id' => 'sticky', + 'table' => 'node', + 'field' => 'sticky', + 'order' => 'ASC', + ), + 'created' => + array ( + 'id' => 'created', + 'table' => 'node', + 'field' => 'created', + 'order' => 'ASC', + 'relationship' => 'none', + 'granularity' => 'second', + ), + ), + 'arguments' => + array ( + ), + 'filters' => + array ( + 'promote' => + array ( + 'id' => 'promote', + 'table' => 'node', + 'field' => 'promote', + 'operator' => '=', + 'value' => '1', + 'group' => 0, + 'exposed' => false, + 'expose' => + array ( + 'operator' => false, + 'label' => '', + ), + ), + 'status' => + array ( + 'id' => 'status', + 'table' => 'node', + 'field' => 'status', + 'operator' => '=', + 'value' => '1', + 'group' => 0, + 'exposed' => false, + 'expose' => + array ( + 'operator' => false, + 'label' => '', + ), + ), + ), + 'items_per_page' => 10, + 'use_pager' => '1', + 'pager_element' => 0, + 'title' => '', + 'header' => '', + 'header_format' => '1', + 'footer' => '', + 'footer_format' => '1', + 'empty' => '', + 'empty_format' => '1', + ); + $view->display['default'] = $display; + $display = new views_display; + $display->id = 'page'; + $display->display_title = t('Page'); + $display->display_plugin = 'page'; + $display->position = '2'; + $display->display_options = array ( + 'defaults' => + array ( + 'access' => true, + 'title' => true, + 'header' => true, + 'header_format' => true, + 'header_empty' => true, + 'footer' => true, + 'footer_format' => true, + 'footer_empty' => true, + 'empty' => true, + 'empty_format' => true, + 'items_per_page' => true, + 'offset' => true, + 'use_pager' => true, + 'pager_element' => true, + 'link_display' => true, + 'php_arg_code' => true, + 'exposed_options' => true, + 'style_plugin' => true, + 'style_options' => true, + 'row_plugin' => true, + 'row_options' => true, + 'relationships' => true, + 'fields' => true, + 'sorts' => true, + 'arguments' => true, + 'filters' => true, + 'use_ajax' => true, + 'distinct' => true, + ), + 'relationships' => + array ( + ), + 'fields' => + array ( + ), + 'sorts' => + array ( + ), + 'arguments' => + array ( + ), + 'filters' => + array ( + ), + 'path' => 'frontpage', + ); + $view->display['page'] = $display; + $display = new views_display; + $display->id = 'feed'; + $display->display_title = t('Feed'); + $display->display_plugin = 'feed'; + $display->position = '3'; + $display->display_options = array ( + 'defaults' => + array ( + 'access' => true, + 'title' => false, + 'header' => true, + 'header_format' => true, + 'header_empty' => true, + 'footer' => true, + 'footer_format' => true, + 'footer_empty' => true, + 'empty' => true, + 'empty_format' => true, + 'use_ajax' => true, + 'items_per_page' => true, + 'offset' => true, + 'use_pager' => true, + 'pager_element' => true, + 'use_more' => true, + 'distinct' => true, + 'link_display' => true, + 'php_arg_code' => true, + 'exposed_options' => true, + 'style_plugin' => false, + 'style_options' => false, + 'row_plugin' => false, + 'row_options' => false, + 'relationships' => true, + 'fields' => true, + 'sorts' => true, + 'arguments' => true, + 'filters' => true, + ), + 'relationships' => + array ( + ), + 'fields' => + array ( + ), + 'sorts' => + array ( + ), + 'arguments' => + array ( + ), + 'filters' => + array ( + ), + 'displays' => + array ( + 'default' => 'default', + 'page' => 'page', + ), + 'style_plugin' => 'rss', + 'style_options' => + array ( + 'mission_description' => 1, + 'description' => '', + ), + 'row_plugin' => 'node_rss', + 'row_options' => + array ( + 'item_length' => 'default', + ), + 'path' => 'rss.xml', + 'title' => t('Front page feed'), + ); + $view->display['feed'] = $display; + // End copy and paste of Export tab output. + + // Add view to list of views to provide. + $views[$view->name] = $view; + + // ...Repeat all of the above for each view the module should provide. + + // At the end, return array of default views. + return $views; +} + +/** + * This hook is called right before all default views are cached to the + * database. It takes a keyed array of views by reference. + */ +function hook_views_default_views_alter(&$views) { + if (isset($views['taxonomy_term'])) { + $views['taxonomy_term']->set_display('default'); + $views['taxonomy_term']->display_handler->set_option('title', 'Categories'); + } +} + +/** + * Stub hook documentation + * + * This hook should be placed in MODULENAME.views_convert.inc and it will be auto-loaded. + * This must either be in the same directory as the .module file or in a subdirectory + * named 'includes'. + */ +function hook_views_convert() { + // example code here +} + +/** + * Stub hook documentation + */ +function hook_views_query_substitutions() { + // example code here +} + +/** + * This hook is called at the very beginning of views processing, + * before anything is done. + * + * Adding output to the view cam be accomplished by placing text on + * $view->attachment_before and $view->attachment_after + */ +function hook_views_pre_view(&$view, &$display_id, &$args) { + // example code here +} + +/** + * This hook is called right before the build process, but after displays + * are attached and the display performs its pre_execute phase. + * + * Adding output to the view cam be accomplished by placing text on + * $view->attachment_before and $view->attachment_after + */ +function hook_views_pre_build(&$view) { + // example code here +} + +/** + * This hook is called right before the execute process. The query is + * now fully built, but it has not yet been run through db_rewrite_sql. + * + * Adding output to the view cam be accomplished by placing text on + * $view->attachment_before and $view->attachment_after + */ +function hook_views_pre_execute(&$view) { + // example code here +} + +/** + * This hook is called right before the render process. The query has + * been executed, and the pre_render() phase has already happened for + * handlers, so all data should be available. + * + * Adding output to the view cam be accomplished by placing text on + * $view->attachment_before and $view->attachment_after + * + * This hook can be utilized by themes. + */ +function hook_views_pre_render(&$view) { + // example code here +} + +/** + * Post process any rendered data. + * + * This can be valuable to be able to cache a view and still have some level of + * dynamic output. In an ideal world, the actual output will include HTML + * comment based tokens, and then the post process can replace those tokens. + * + * Example usage. If it is known that the view is a node view and that the + * primary field will be a nid, you can do something like this: + * + * + * + * And then in the post render, create an array with the text that should + * go there: + * + * strtr($output, array('', 'output for FIELD of nid 1'); + * + * All of the cached result data will be available in $view->result, as well, + * so all ids used in the query should be discoverable. + * + * This hook can be utilized by themes. + */ +function hook_views_post_render(&$view, &$output, &$cache) { + +} + +/** + * Stub hook documentation + * + * This hook should be placed in MODULENAME.views.inc and it will be auto-loaded. + * This must either be in the same directory as the .module file or in a subdirectory + * named 'includes'. + * + */ +function hook_views_query_alter(&$view, &$query) { + // example code here +} + +/** + * This hook should be placed in MODULENAME.views.inc and it will be auto-loaded. + * This must either be in the same directory as the .module file or in a subdirectory + * named 'includes'. + * + * Alter the links that appear over a view. They are in a format suitable for + * theme('links'). + * + * Warning: $view is not a reference in PHP4 and cannot be modified here. But it IS + * a reference in PHP5, and can be modified. Please be careful with it. + * + * @see theme_links + */ +function hook_views_admin_links_alter(&$links, $view) { + // example code here +} + +/** + * This hook should be placed in MODULENAME.views.inc and it will be auto-loaded. + * This must either be in the same directory as the .module file or in a subdirectory + * named 'includes'. + * + * Alter the rows that appear with a view, which includes path and query information. + * The rows are suitable for theme('table'). + * + * Warning: $view is not a reference in PHP4 and cannot be modified here. But it IS + * a reference in PHP5, and can be modified. Please be careful with it. + * + * @see theme_table + */ +function hook_views_preview_info_alter(&$rows, $view) { + // example code here +} + +/** + * @} + */ diff --git a/documentation-standards.txt b/documentation-standards.txt new file mode 100644 index 0000000000000000000000000000000000000000..ea6113571ee8692e4af9688bf8603b005191e673 --- /dev/null +++ b/documentation-standards.txt @@ -0,0 +1,6 @@ +- If the interface text is *bolded*, it got strong tags. +- If it's a button they need to click, that's *bold* too. +- If the text is not bolded (ex: links to click, options to check), it +got /italicized/. +- If it's user-entered text it got 'single quotes'. + diff --git a/handlers/views_handler_argument.inc b/handlers/views_handler_argument.inc new file mode 100644 index 0000000000000000000000000000000000000000..14774ee6ca968ffc0f0a6b915f60b8a789b6ed5b --- /dev/null +++ b/handlers/views_handler_argument.inc @@ -0,0 +1,774 @@ +definition['name field'])) { + $this->name_field = $this->definition['name field']; + } + if (!empty($this->definition['name table'])) { + $this->name_table = $this->definition['name table']; + } + } + + function init(&$view, &$options) { + parent::init($view, $options); + } + + /** + * Give an argument the opportunity to modify the breadcrumb, if it wants. + * This only gets called on displays where a breadcrumb is actually used. + * + * The breadcrumb will be in the form of an array, with the keys being + * the path and the value being the already sanitized title of the path. + */ + function set_breadcrumb(&$breadcrumb) { } + + /** + * Determine if the argument can generate a breadcrumb + * + * @return TRUE/FALSE + */ + function uses_breadcrumb() { + $info = $this->default_actions($this->options['default_action']); + return !empty($info['breadcrumb']); + } + + function is_wildcard($arg = NULL) { + if (!isset($arg)) { + $arg = $this->argument; + } + + return !empty($this->options['wildcard']) && $this->options['wildcard'] === $arg; + } + + function wildcard_title() { + return $this->options['wildcard_substitution']; + } + + /** + * Determine if the argument needs a style plugin. + * + * @return TRUE/FALSE + */ + function needs_style_plugin() { + $info = $this->default_actions($this->options['default_action']); + $validate_info = $this->default_actions($this->options['validate_fail']); + return !empty($info['style plugin']) || !empty($validate_info['style plugin']); + } + + function option_definition() { + $options = parent::option_definition(); + + $options['default_action'] = array('default' => 'ignore'); + $options['style_plugin'] = array('default' => 'default_summary'); + $options['style_options'] = array('default' => array()); + $options['wildcard'] = array('default' => 'all'); + $options['wildcard_substitution'] = array('default' => t('All'), 'translatable' => TRUE); + $options['title'] = array('default' => '', 'translatable' => TRUE); + $options['breadcrumb'] = array('default' => '', 'translatable' => TRUE); + $options['default_argument_type'] = array('default' => 'fixed'); + $options['default_argument'] = array('default' => ''); + $options['validate_type'] = array('default' => 'none'); + $options['validate_fail'] = array('default' => 'not found'); + + return $options; + } + + function options_form(&$form, &$form_state) { + $defaults = $this->default_actions(); + + $form['title'] = array( + '#prefix' => '
', + '#suffix' => '
', + '#type' => 'textfield', + '#title' => t('Title'), + '#default_value' => $this->options['title'], + '#description' => t('The title to use when this argument is present. It will override the title of the view and titles from previous arguments. You can use percent substitution here to replace with argument titles. Use "%1" for the first argument, "%2" for the second, etc.'), + ); + + $form['breadcrumb'] = array( + '#prefix' => '
', + '#suffix' => '
', + '#type' => 'textfield', + '#title' => t('Breadcrumb'), + '#default_value' => $this->options['breadcrumb'], + '#description' => t('The Breadcrumb title to use when this argument is present. If no breadcrumb is setted here, default Title values will be used, see "Title" for percent substitutions.'), + ); + + $form['clear_start'] = array( + '#value' => '
', + ); + + $form['defaults_start'] = array( + '#value' => '
', + ); + + $form['default_action'] = array( + '#type' => 'radios', + '#title' => t('Action to take if argument is not present'), + '#default_value' => $this->options['default_action'], + ); + + $form['defaults_stop'] = array( + '#value' => '
', + ); + + $form['wildcard'] = array( + '#prefix' => '
', + // prefix and no suffix means these two items will be grouped together. + '#type' => 'textfield', + '#title' => t('Wildcard'), + '#size' => 20, + '#default_value' => $this->options['wildcard'], + '#description' => t('If this value is received as an argument, the argument will be ignored; i.e, "all values"'), + ); + + $form['wildcard_substitution'] = array( + '#suffix' => '
', + '#type' => 'textfield', + '#title' => t('Wildcard title'), + '#size' => 20, + '#default_value' => $this->options['wildcard_substitution'], + '#description' => t('The title to use for the wildcard in substitutions elsewhere.'), + ); + + $form['clear_stop'] = array( + '#value' => '
', + ); + + $options = array(); + $validate_options = array(); + foreach ($defaults as $id => $info) { + $options[$id] = $info['title']; + if (empty($info['default only'])) { + $validate_options[$id] = $info['title']; + } + if (!empty($info['form method'])) { + $this->{$info['form method']}($form, $form_state); + } + } + + $form['default_action']['#options'] = $options; + + $form['validate_options_div_prefix'] = array( + '#id' => 'views-validator-options', + '#value' => '
' . t('Validator options') . '', + ); + + $form['validate_type'] = array( + '#type' => 'select', + '#title' => t('Validator'), + '#default_value' => $this->options['validate_type'], + ); + + $validate_types = array('none' => t('')); + $plugins = views_fetch_plugin_data('argument validator'); + foreach ($plugins as $id => $info) { + if (!empty($info['no ui'])) { + continue; + } + + $valid = TRUE; + if (!empty($info['type'])) { + $valid = FALSE; + if (empty($this->definition['validate type'])) { + continue; + } + foreach ((array) $info['type'] as $type) { + if ($type == $this->definition['validate type']) { + $valid = TRUE; + break; + } + } + } + + // If we decide this validator is ok, add it to the list. + if ($valid) { + $plugin = views_get_plugin('argument validator', $id); + if ($plugin) { + $plugin->init($this->view, $this, $id); + if ($plugin->access() || $this->options['validate_type'] == $id) { + $plugin->validate_form($form, $form_state, $id); + $validate_types[$id] = $info['title']; + } + } + } + } + + asort($validate_types); + $form['validate_type']['#options'] = $validate_types; + + $form['validate_fail'] = array( + '#type' => 'select', + '#title' => t('Action to take if argument does not validate'), + '#default_value' => $this->options['validate_fail'], + '#options' => $validate_options, + ); + + $form['validate_options_div_suffix'] = array( + '#value' => '
', + ); + } + + /** + * Provide a list of default behaviors for this argument if the argument + * is not present. + * + * Override this method to provide additional (or fewer) default behaviors. + */ + function default_actions($which = NULL) { + $defaults = array( + 'ignore' => array( + 'title' => t('Display all values'), + 'method' => 'default_ignore', + 'breadcrumb' => TRUE, // generate a breadcrumb to here + ), + 'not found' => array( + 'title' => t('Hide view / Page not found (404)'), + 'method' => 'default_not_found', + 'hard fail' => TRUE, // This is a hard fail condition + ), + 'empty' => array( + 'title' => t('Display empty text'), + 'method' => 'default_empty', + 'breadcrumb' => TRUE, // generate a breadcrumb to here + ), + 'summary asc' => array( + 'title' => t('Summary, sorted ascending'), + 'method' => 'default_summary', + 'method args' => array('asc'), + 'style plugin' => TRUE, + 'breadcrumb' => TRUE, // generate a breadcrumb to here + ), + 'summary desc' => array( + 'title' => t('Summary, sorted descending'), + 'method' => 'default_summary', + 'method args' => array('desc'), + 'style plugin' => TRUE, + 'breadcrumb' => TRUE, // generate a breadcrumb to here + ), + 'default' => array( + 'title' => t('Provide default argument'), + 'method' => 'default_default', + 'form method' => 'default_argument_form', + 'has default argument' => TRUE, + 'default only' => TRUE, // this can only be used for missing argument, not validation failure + ), + ); + + if ($which) { + if (!empty($defaults[$which])) { + return $defaults[$which]; + } + } + else { + return $defaults; + } + } + + /** + * Provide a form for selecting the default argument when the + * default action is set to provide default argument. + */ + function default_argument_form(&$form, &$form_state) { + $plugins = views_fetch_plugin_data('argument default'); + $options = array(); + + // This construct uses 'hidden' and not markup because process doesn't + // run. It also has an extra div because the dependency wants to hide + // the parent in situations like this, so we need a second div to + // make this work. + $form['default_options_div_prefix'] = array( + '#type' => 'hidden', + '#id' => 'views-default-options', + '#prefix' => '
' . t('Provide default argument options') . '', + '#process' => array('views_process_dependency'), + '#dependency' => array('radio:options[default_action]' => array('default')), + ); + + $form['default_argument_type'] = array( + '#prefix' => '
', + '#suffix' => '
', + '#type' => 'radios', + '#id' => 'edit-options-default-argument-type', + '#title' => t('Default argument type'), + '#default_value' => $this->options['default_argument_type'], + '#process' => array('expand_radios', 'views_process_dependency'), + '#dependency' => array('radio:options[default_action]' => array('default')), + ); + + foreach ($plugins as $id => $info) { + $plugin = views_get_plugin('argument default', $id); + if ($plugin) { + $plugin->init($this->view, $this, $id); + + if ($plugin->access() || $this->options['default_argument_type'] == $id) { + $options[$id] = $info['title']; + $plugin->argument_form($form, $form_state); + } + } + } + + $form['default_options_div_suffix'] = array( + '#value' => '
', + ); + + asort($options); + $form['default_argument_type']['#options'] = $options; + } + + /** + * Handle the default action, which means our argument wasn't present. + * + * Override this method only with extreme care. + * + * @return + * A boolean value; if TRUE, continue building this view. If FALSE, + * building the view will be aborted here. + */ + function default_action($info = NULL) { + if (!isset($info)) { + $info = $this->default_actions($this->options['default_action']); + } + + if (!$info) { + return FALSE; + } + + if (!empty($info['method args'])) { + return call_user_func_array(array(&$this, $info['method']), $info['method args']); + } + else { + return $this->{$info['method']}(); + } + } + + /** + * How to act if validation failes + */ + function validate_fail() { + $info = $this->default_actions($this->options['validate_fail']); + return $this->default_action($info); + } + /** + * Default action: ignore. + * + * If an argument was expected and was not given, in this case, simply + * ignore the argument entirely. + */ + function default_ignore() { + return TRUE; + } + + /** + * Default action: not found. + * + * If an argument was expected and was not given, in this case, report + * the view as 'not found' or hide it. + */ + function default_not_found() { + // Set a failure condition and let the display manager handle it. + $this->view->build_info['fail'] = TRUE; + return FALSE; + } + + /** + * Default action: empty + * + * If an argument was expected and was not given, in this case, display + * the view's empty text + */ + function default_empty() { + // We return with no query; this will force the empty text. + $this->view->built = TRUE; + $this->view->executed = TRUE; + $this->view->result = array(); + return FALSE; + } + + /** + * This just returns true. The view argument builder will know where + * to find the argument from. + */ + function default_default() { + return TRUE; + } + + /** + * Determine if the argument is set to provide a default argument. + */ + function has_default_argument() { + $info = $this->default_actions($this->options['default_action']); + return !empty($info['has default argument']); + } + + /** + * Get a default argument, if available. + */ + function get_default_argument() { + $plugin = views_get_plugin('argument default', $this->options['default_argument_type']); + if ($plugin) { + $plugin->init($this->view, $this); + return $plugin->get_argument(); + } + } + + /** + * Default action: summary. + * + * If an argument was expected and was not given, in this case, display + * a summary query. + */ + function default_summary($order) { + $this->view->build_info['summary'] = TRUE; + $this->view->build_info['summary_level'] = $this->options['id']; + + // Change the display style to the summary style for this + // argument. + $this->view->plugin_name = $this->options['style_plugin']; + $this->view->style_options = $this->options['style_options']; + + // Clear out the normal primary field and whatever else may have + // been added and let the summary do the work. + $this->query->clear_fields(); + $this->summary_query(); + + $this->summary_sort($order); + + // Summaries have their own sorting and fields, so tell the View not + // to build these. + $this->view->build_sort = $this->view->build_fields = FALSE; + return TRUE; + } + + /** + * Build the info for the summary query. + * + * This must: + * - add_groupby: group on this field in order to create summaries. + * - add_field: add a 'num_nodes' field for the count. Usually it will + * be a count on $view->base_field + * - set_count_field: Reset the count field so we get the right paging. + * + * @return + * The alias used to get the number of records (count) for this entry. + */ + function summary_query() { + $this->ensure_my_table(); + // Add the field. + $this->base_alias = $this->query->add_field($this->table_alias, $this->real_field); + + $this->summary_name_field(); + return $this->summary_basics(); + } + + /** + * Add the name field, which is the field displayed in summary queries. + * This is often used when the argument is numeric. + */ + function summary_name_field() { + // Add the 'name' field. For example, if this is a uid argument, the + // name field would be 'name' (i.e, the username). + + if (isset($this->name_table)) { + // if the alias is different then we're probably added, not ensured, + // so look up the join and add it instead. + if ($this->table_alias != $this->table) { + $j = views_get_table_join($this->name_table, $this->table); + if ($j) { + $join = drupal_clone($j); + $join->left_table = $this->table_alias; + $this->name_table_alias = $this->query->add_table($this->name_table, $this->relationship, $join); + } + } + else { + $this->name_table_alias = $this->query->ensure_table($this->name_table, $this->relationship); + } + } + else { + $this->name_table_alias = $this->table_alias; + } + + if (isset($this->name_field)) { + $this->name_alias = $this->query->add_field($this->name_table_alias, $this->name_field); + } + else { + $this->name_alias = $this->base_alias; + } + } + + /** + * Some basic summary behavior that doesn't need to be repeated as much as + * code that goes into summary_query() + */ + function summary_basics($count_field = TRUE) { + // Add the number of nodes counter + $field = $this->query->base_table . '.' . $this->query->base_field; + $distinct = ($this->view->display_handler->get_option('distinct') && empty($this->query->no_distinct)); + + $count_alias = $this->query->add_field(NULL, $field, 'num_records', + array('count' => TRUE, 'distinct' => $distinct)); + $this->query->add_groupby($this->name_alias); + + if ($count_field) { + $this->query->set_count_field($this->table_alias, $this->real_field); + } + + $this->count_alias = $count_alias; + } + + /** + * Sorts the summary based upon the user's selection. The base variant of + * this is usually adequte. + * + * @param $order + * The order selected in the UI. + */ + function summary_sort($order) { + $this->query->add_orderby(NULL, NULL, $order, $this->name_alias); + } + + /** + * Provide the argument to use to link from the summary to the next level; + * this will be called once per row of a summary, and used as part of + * $view->get_url(). + * + * @param $data + * The query results for the row. + */ + function summary_argument($data) { + return $data->{$this->base_alias}; + } + + /** + * Provides the name to use for the summary. By default this is just + * the name field. + * + * @param $data + * The query results for the row. + */ + function summary_name($data) { + $value = $data->{$this->name_alias}; + if (empty($value) && !empty($this->definition['empty field name'])) { + $value = $this->definition['empty field name']; + } + return check_plain($value); + } + + /** + * Set up the query for this argument. + * + * The argument sent may be found at $this->argument. + */ + function query() { + $this->ensure_my_table(); + $placeholder = empty($this->definition['numeric']) ? "'%s'" : '%d'; + $this->query->add_where(0, "$this->table_alias.$this->real_field = $placeholder", $this->argument); + } + + /** + * Get the title this argument will assign the view, given the argument. + * + * This usually needs to be overridden to provide a proper title. + */ + function title() { + return check_plain($this->argument); + } + + /** + * Called by the view object to get the title. This may be set by a + * validator so we don't necessarily call through to title(). + */ + function get_title() { + if (isset($this->validated_title)) { + return $this->validated_title; + } + else { + return $this->title(); + } + } + + /** + * Validate that this argument works. By default, all arguments are valid. + */ + function validate_arg($arg) { + // By using % in URLs, arguments could be validated twice; this eases + // that pain. + if (isset($this->argument_validated)) { + return $this->argument_validated; + } + + if ($this->is_wildcard($arg)) { + return $this->argument_validated = TRUE; + } + + if ($this->options['validate_type'] == 'none') { + return $this->argument_validated = $this->validate_argument_basic($arg); + } + + $plugin = views_get_plugin('argument validator', $this->options['validate_type']); + if ($plugin) { + $plugin->init($this->view, $this, $this->options['validate_type']); + return $this->argument_validated = $plugin->validate_argument($arg); + } + + // If the plugin isn't found, fall back to the basic validation path: + return $this->argument_validated = $this->validate_argument_basic($arg); + } + + /** + * Called by the menu system to validate an argument. + * + * This checks to see if this is a 'soft fail', which means that if the + * argument fails to validate, but there is an action to take anyway, + * then validation cannot actually fail. + */ + function validate_argument($arg) { + $validate_info = $this->default_actions($this->options['validate_fail']); + if (empty($validate_info['hard fail'])) { + return TRUE; + } + + $rc = $this->validate_arg($arg); + + // If the validator has changed the validate fail condition to a + // soft fail, deal with that: + $validate_info = $this->default_actions($this->options['validate_fail']); + if (empty($validate_info['hard fail'])) { + return TRUE; + } + + return $rc; + } + + /** + * Provide a basic argument validation. + * + * This can be overridden for more complex types; the basic + * validator only checks to see if the argument is not NULL + * or is numeric if the definition says it's numeric. + */ + function validate_argument_basic($arg) { + if (!isset($arg) || $arg === '') { + return FALSE; + } + + if (isset($this->definition['numeric']) && !isset($this->options['break_phrase']) && !is_numeric($arg)) { + return FALSE; + } + + return TRUE; + } + + /** + * Set the input for this argument + * + * @return TRUE if it successfully validates; FALSE if it does not. + */ + function set_argument($arg) { + $this->argument = $arg; + return $this->validate_arg($arg); + } + + /** + * Get the value of this argument. + */ + function get_value() { + // If we already processed this argument, we're done. + if (isset($this->argument)) { + return $this->argument; + } + + // Otherwise, we have to pretend to process ourself to find the value. + $value = NULL; + // Find the position of this argument within the view. + $position = 0; + foreach ($this->view->argument as $id => $argument) { + if ($id == $this->options['id']) { + break; + } + $position++; + } + + $arg = isset($this->view->args[$position]) ? $this->view->args[$position] : NULL; + $this->position = $position; + + // Clone ourselves so that we don't break things when we're really + // processing the arguments. + $argument = drupal_clone($this); + if (!isset($arg) && $argument->has_default_argument()) { + $arg = $argument->get_default_argument(); + } + // Set the argument, which will also validate that the argument can be set. + if ($argument->set_argument($arg)) { + $value = $argument->argument; + } + unset($argument); + return $value; + } +} + +/** + * A special handler to take the place of missing or broken handlers. + * + * @ingroup views_argument_handlers + */ +class views_handler_argument_broken extends views_handler_argument { + function ui_name($short = FALSE) { + return t('Broken/missing handler'); + } + + function ensure_my_table() { /* No table to ensure! */ } + function query() { /* No query to run */ } + function options_form(&$form, &$form_state) { + $form['markup'] = array( + '#prefix' => '
', + '#value' => t('The handler for this item is broken or missing and cannot be used. If a module provided the handler and was disabled, re-enabling the module may restore it. Otherwise, you should probably delete this item.'), + ); + } + + /** + * Determine if the handler is considered 'broken' + */ + function broken() { return TRUE; } +} + +/** + * @} + */ diff --git a/handlers/views_handler_argument_date.inc b/handlers/views_handler_argument_date.inc new file mode 100644 index 0000000000000000000000000000000000000000..316d3c163bdf0d5d08ce50855633648aa2cbea5f --- /dev/null +++ b/handlers/views_handler_argument_date.inc @@ -0,0 +1,67 @@ + t('Current date')); + $form['default_argument_type']['#options'] += array('node_created' => t("Current node's creation time")); + $form['default_argument_type']['#options'] += array('node_changed' => t("Current node's update time")); } + + /** + * Set the empty argument value to the current date, + * formatted appropriately for this argument. + */ + function get_default_argument($raw = FALSE) { + if (!$raw && $this->options['default_argument_type'] == 'date') { + return date($this->arg_format, time()); + } + else if (!$raw) { + foreach (range(1, 3) as $i) { + $node = menu_get_object('node', $i); + if (!empty($node)) { + continue; + } + } + + if (arg(0) == 'node' && is_numeric(arg(1))) { + $node = node_load(arg(1)); + } + + if (empty($node)) { + return parent::get_default_argument(); + } + else if ($this->options['default_argument_type'] == 'node_created') { + return date($this->arg_format, $node->created); + } + else if ($this->options['default_argument_type'] == 'node_changed') { + return date($this->arg_format, $node->changed); + } + } + else { + return parent::get_default_argument($raw); + } + } +} diff --git a/handlers/views_handler_argument_formula.inc b/handlers/views_handler_argument_formula.inc new file mode 100644 index 0000000000000000000000000000000000000000..713cb73d962c64289a5cf92368d3b74919202863 --- /dev/null +++ b/handlers/views_handler_argument_formula.inc @@ -0,0 +1,55 @@ +definition['formula'])) { + $this->formula = $this->definition['formula']; + } + } + + function get_formula() { + return str_replace('***table***', $this->table_alias, $this->formula); + } + + /** + * Build the summary query based on a formula + */ + function summary_query() { + $this->ensure_my_table(); + // Now that our table is secure, get our formula. + $formula = $this->get_formula(); + + // Add the field. + $this->base_alias = $this->name_alias = $this->query->add_field(NULL, $formula, $this->field); + $this->query->set_count_field(NULL, $formula, $this->field); + + return $this->summary_basics(FALSE); + } + + /** + * Build the query based upon the formula + */ + function query() { + $this->ensure_my_table(); + // Now that our table is secure, get our formula. + $formula = $this->get_formula(); + + $this->query->add_where(0, "$formula = '%s'", $this->argument); + } +} diff --git a/handlers/views_handler_argument_many_to_one.inc b/handlers/views_handler_argument_many_to_one.inc new file mode 100644 index 0000000000000000000000000000000000000000..559e500aac9fec9593c50fb94c8a260d8f1b3fd3 --- /dev/null +++ b/handlers/views_handler_argument_many_to_one.inc @@ -0,0 +1,158 @@ +helper = new views_many_to_one_helper($this); + + // Ensure defaults for these, during summaries and stuff: + $this->operator = 'or'; + $this->value = array(); + } + + function option_definition() { + $options = parent::option_definition(); + + if (!empty($this->definition['numeric'])) { + $options['break_phrase'] = array('default' => FALSE); + } + + $options['add_table'] = array('default' => FALSE); + $options['require_value'] = array('default' => FALSE); + + views_many_to_one_helper::option_definition($options); + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + + // allow + for or, , for and + if (!empty($this->definition['numeric'])) { + $form['break_phrase'] = array( + '#type' => 'checkbox', + '#title' => t('Allow multiple terms per argument.'), + '#description' => t('If selected, users can enter multiple arguments in the form of 1+2+3 (for OR) or 1,2,3 (for AND).'), + '#default_value' => !empty($this->options['break_phrase']), + ); + } + + $form['add_table'] = array( + '#type' => 'checkbox', + '#title' => t('Allow multiple arguments to work together.'), + '#description' => t('If selected, multiple instances of this argument can work together, as though multiple terms were supplied to the same argument. This setting is not compatible with the "Reduce duplicates" setting.'), + '#default_value' => !empty($this->options['add_table']), + ); + + $form['require_value'] = array( + '#type' => 'checkbox', + '#title' => t('Do not display items with no value in summary'), + '#default_value' => !empty($this->options['require_value']), + ); + + $this->helper->options_form($form, $form_state); + } + + /** + * Override ensure_my_table so we can control how this joins in. + * The operator actually has influence over joining. + */ + function ensure_my_table() { + $this->helper->ensure_my_table(); + } + + function query() { + if (empty($this->argument)) { + parent::ensure_my_table(); + $this->query->add_where(0, "$this->table_alias.$this->real_field IS NULL"); + return; + } + + if (!empty($this->options['break_phrase'])) { + views_break_phrase($this->argument, $this); + } + else { + $this->value = array($this->argument); + $this->operator = 'or'; + } + + $this->helper->add_filter(); + } + + function title() { + if (!$this->argument) { + return !empty($this->definition['empty field name']) ? $this->definition['empty field name'] : t('Uncategorized'); + } + + if (!empty($this->options['break_phrase'])) { + views_break_phrase($this->argument, $this); + } + else { + $this->value = array($this->argument); + $this->operator = 'or'; + } + + // @todo -- both of these should check definition for alternate keywords. + + if (empty($this->value)) { + return !empty($this->definition['empty field name']) ? $this->definition['empty field name'] : t('Uncategorized'); + } + + if ($this->value === array(-1)) { + return !empty($this->definition['invalid input']) ? $this->definition['invalid input'] : t('Invalid input'); + } + + return implode($this->operator == 'or' ? ' + ' : ', ', $this->title_query()); + } + + function summary_query() { + $field = $this->table . '.' . $this->field; + $join = $this->get_join(); + + if (!empty($this->options['require_value'])) { + $join->type = 'INNER'; + } + + if (empty($this->options['add_table']) || empty($this->view->many_to_one_tables[$field])) { + $this->table_alias = $this->query->ensure_table($this->table, $this->relationship, $join); + } + else { + $this->table_alias = $this->helper->summary_join(); + } + + // Add the field. + $this->base_alias = $this->query->add_field($this->table_alias, $this->real_field); + + $this->summary_name_field(); + + return $this->summary_basics(); + } + + function summary_argument($data) { + $value = $data->{$this->base_alias}; + if (empty($value)) { + $value = 0; + } + + return $value; + } + + /** + * Override for specific title lookups. + */ + function title_query() { + return $this->value; + } +} + diff --git a/handlers/views_handler_argument_null.inc b/handlers/views_handler_argument_null.inc new file mode 100644 index 0000000000000000000000000000000000000000..b4c7677fc5ce52932f8a622827498486bda90dc0 --- /dev/null +++ b/handlers/views_handler_argument_null.inc @@ -0,0 +1,60 @@ + FALSE); + return $options; + } + + /** + * Override options_form() so that only the relevant options + * are displayed to the user. + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['must_not_be'] = array( + '#type' => 'checkbox', + '#title' => t('Fail basic validation if any argument is given'), + '#default_value' => !empty($this->options['must_not_be']), + '#description' => t('By checking this field, you can use this to make sure views with more arguments than necessary fail validation.'), + ); + + unset($form['wildcard']); + unset($form['wildcard_substitution']); + } + + /** + * Override default_actions() to remove actions that don't + * make sense for a null argument. + */ + function default_actions($which = NULL) { + if ($which) { + if (in_array($which, array('ignore', 'not found', 'empty', 'default'))) { + return parent::default_actions($which); + } + return; + } + $actions = parent::default_actions(); + unset($actions['summary asc']); + unset($actions['summary desc']); + return $actions; + } + + function validate_argument_basic($arg) { + if (!empty($this->options['must_not_be'])) { + return !isset($arg); + } + + return parent::validate_argument_basic($arg); + } + + /** + * Override the behavior of query() to prevent the query + * from being changed in any way. + */ + function query() {} +} diff --git a/handlers/views_handler_argument_numeric.inc b/handlers/views_handler_argument_numeric.inc new file mode 100644 index 0000000000000000000000000000000000000000..9a874598435bd43eb88dcf88601eafe9f2af1908 --- /dev/null +++ b/handlers/views_handler_argument_numeric.inc @@ -0,0 +1,94 @@ + FALSE); + $options['not'] = array('default' => FALSE); + + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + + // allow + for or, , for and + $form['break_phrase'] = array( + '#type' => 'checkbox', + '#title' => t('Allow multiple terms per argument.'), + '#description' => t('If selected, users can enter multiple arguments in the form of 1+2+3 or 1,2,3.'), + '#default_value' => !empty($this->options['break_phrase']), + ); + + $form['not'] = array( + '#type' => 'checkbox', + '#title' => t('Exclude the argument'), + '#description' => t('If selected, the numbers entered in the argument will be excluded rather than limiting the view.'), + '#default_value' => !empty($this->options['not']), + ); + } + + function title() { + if (!$this->argument) { + return !empty($this->definition['empty field name']) ? $this->definition['empty field name'] : t('Uncategorized'); + } + + if (!empty($this->options['break_phrase'])) { + views_break_phrase($this->argument, $this); + } + else { + $this->value = array($this->argument); + $this->operator = 'or'; + } + + if (empty($this->value)) { + return !empty($this->definition['empty field name']) ? $this->definition['empty field name'] : t('Uncategorized'); + } + + if ($this->value === array(-1)) { + return !empty($this->definition['invalid input']) ? $this->definition['invalid input'] : t('Invalid input'); + } + + return implode($this->operator == 'or' ? ' + ' : ', ', $this->title_query()); + } + + /** + * Override for specific title lookups. + */ + function title_query() { + return $this->value; + } + + function query() { + $this->ensure_my_table(); + + if (!empty($this->options['break_phrase'])) { + views_break_phrase($this->argument, $this); + } + else { + $this->value = array($this->argument); + } + + if (count($this->value) > 1) { + $operator = empty($this->options['not']) ? 'IN' : 'NOT IN'; + $placeholders = implode(', ', array_fill(0, sizeof($this->value), '%d')); + $this->query->add_where(0, "$this->table_alias.$this->real_field $operator ($placeholders)", $this->value); + } + else { + $operator = empty($this->options['not']) ? '=' : '!='; + $this->query->add_where(0, "$this->table_alias.$this->real_field $operator %d", $this->argument); + } + } +} diff --git a/handlers/views_handler_argument_string.inc b/handlers/views_handler_argument_string.inc new file mode 100644 index 0000000000000000000000000000000000000000..1b203e40b5d236b391110e9951051e5aa035692f --- /dev/null +++ b/handlers/views_handler_argument_string.inc @@ -0,0 +1,216 @@ +definition['many to one'])) { + $this->helper = new views_many_to_one_helper($this); + + // Ensure defaults for these, during summaries and stuff: + $this->operator = 'or'; + $this->value = array(); + } + } + + function option_definition() { + $options = parent::option_definition(); + + $options['glossary'] = array('default' => FALSE); + $options['limit'] = array('default' => 0); + $options['case'] = array('default' => 'none'); + $options['path_case'] = array('default' => 'none'); + $options['transform_dash'] = array('default' => FALSE); + + if (!empty($this->definition['many to one'])) { + $options['add_table'] = array('default' => FALSE); + $options['require_value'] = array('default' => FALSE); + } + + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + + $form['glossary'] = array( + '#type' => 'checkbox', + '#title' => t('Glossary mode'), + '#description' => t('Glossary mode applies a limit to the number of characters used in the argument, which allows the summary view to act as a glossary.'), + '#default_value' => $this->options['glossary'], + ); + + $form['limit'] = array( + '#type' => 'textfield', + '#title' => t('Character limit'), + '#description' => t('How many characters of the argument to filter against. If set to 1, all fields starting with the letter in the argument would be matched.'), + '#default_value' => $this->options['limit'], + '#process' => array('views_process_dependency'), + '#dependency' => array('edit-options-glossary' => array(TRUE)), + ); + + $form['case'] = array( + '#type' => 'select', + '#title' => t('Case'), + '#description' => t('When printing the argument result, how to transform the case.'), + '#options' => array( + 'none' => t('No transform'), + 'upper' => t('Upper case'), + 'lower' => t('Lower case'), + 'ucfirst' => t('Capitalize first letter'), + 'ucwords' => t('Capitalize each word'), + ), + '#default_value' => $this->options['case'], + ); + + $form['path_case'] = array( + '#type' => 'select', + '#title' => t('Case in path'), + '#description' => t('When printing url paths, how to transform the case of the argument. Do not use this unless with Postgres as it uses case sensitive comparisons.'), + '#options' => array( + 'none' => t('No transform'), + 'upper' => t('Upper case'), + 'lower' => t('Lower case'), + 'ucfirst' => t('Capitalize first letter'), + 'ucwords' => t('Capitalize each word'), + ), + '#default_value' => $this->options['path_case'], + ); + + $form['transform_dash'] = array( + '#type' => 'checkbox', + '#title' => t('Transform spaces to dashes in URL'), + '#default_value' => $this->options['transform_dash'], + ); + + if (!empty($this->definition['many to one'])) { + $form['add_table'] = array( + '#type' => 'checkbox', + '#title' => t('Allow multiple arguments to work together.'), + '#description' => t('If selected, multiple instances of this argument can work together, as though multiple terms were supplied to the same argument. This setting is not compatible with the "Reduce duplicates" setting.'), + '#default_value' => !empty($this->options['add_table']), + ); + + $form['require_value'] = array( + '#type' => 'checkbox', + '#title' => t('Do not display items with no value in summary'), + '#default_value' => !empty($this->options['require_value']), + ); + } + } + + /** + * Build the summary query based on a string + */ + function summary_query() { + if (empty($this->definition['many to one'])) { + $this->ensure_my_table(); + } + else { + $this->table_alias = $this->helper->summary_join(); + } + + if (empty($this->options['glossary'])) { + // Add the field. + $this->base_alias = $this->name_alias = $this->query->add_field($this->table_alias, $this->real_field); + $this->query->set_count_field($this->table_alias, $this->real_field); + } + else { + // Add the field. + $formula = $this->get_formula(); + $this->base_alias = $this->name_alias = $this->query->add_field(NULL, $formula, $this->field . '_truncated'); + $this->query->set_count_field(NULL, $formula, $this->field, $this->field . '_truncated'); + } + + return $this->summary_basics(FALSE); + } + + /** + * Get the formula for this argument. + * + * $this->ensure_my_table() MUST have been called prior to this. + */ + function get_formula() { + return "SUBSTR($this->table_alias.$this->real_field, 1, " . intval($this->options['limit']) . ")"; + } + + /** + * Build the query based upon the formula + */ + function query() { + $argument = $this->argument; + if (!empty($this->options['transform_dash'])) { + $argument = strtr($argument, '-', ' '); + } + + if (!empty($this->definition['many to one'])) { + if (!empty($this->options['glossary'])) { + $this->helper->formula = TRUE; + } + $this->value = array($argument); + $this->helper->ensure_my_table(); + $this->helper->add_filter(); + return; + } + + $this->ensure_my_table(); + if (empty($this->options['glossary'])) { + $field = "$this->table_alias.$this->real_field"; + } + else { + $field = $this->get_formula(); + } + + $this->query->add_where(0, "$field = '%s'", $argument); + } + + function summary_argument($data) { + $value = $this->case_transform($data->{$this->base_alias}, 'path_case'); + if (!empty($this->options['transform_dash'])) { + $value = strtr($value, ' ', '-'); + } + return $value; + } + + function case_transform($string, $option) { + global $multibyte; + + switch ($this->options[$option]) { + default: + return $string; + case 'upper': + return drupal_strtoupper($string); + case 'lower': + return drupal_strtolower($string); + case 'ucfirst': + return drupal_strtoupper(drupal_substr($string, 0, 1)) . drupal_substr($string, 1); + case 'ucwords': + if ($multibyte == UNICODE_MULTIBYTE) { + return mb_convert_case($string, MB_CASE_TITLE); + } else { + return ucwords($string); + } + } + } + + function title() { + $title = $this->case_transform($this->argument, 'case'); + if (!empty($this->options['transform_dash'])) { + $title = strtr($title, '-', ' '); + } + + return check_plain($title); + } + + function summary_name($data) { + return $this->case_transform(parent::summary_name($data), 'case'); + } + +} + diff --git a/handlers/views_handler_field.inc b/handlers/views_handler_field.inc new file mode 100644 index 0000000000000000000000000000000000000000..629daa4cbe31d723c933b8ba89f7dc5618e50fb9 --- /dev/null +++ b/handlers/views_handler_field.inc @@ -0,0 +1,807 @@ + array('table' => tablename, + * 'field' => fieldname); as many fields as are necessary + * may be in this array. + * - click sortable: If TRUE, this field may be click sorted. + */ +class views_handler_field extends views_handler { + var $field_alias = 'unknown'; + var $aliases = array(); + + /** + * Construct a new field handler. + */ + function construct() { + parent::construct(); + + $this->additional_fields = array(); + if (!empty($this->definition['additional fields'])) { + $this->additional_fields = $this->definition['additional fields']; + } + + if (!isset($this->options['exclude'])) { + $this->options['exclude'] = ''; + } + } + + /** + * Determine if this field can allow advanced rendering. + * + * Fields can set this to FALSE if they do not wish to allow + * token based rewriting or link-making. + */ + function allow_advanced_render() { + return TRUE; + } + + function init(&$view, $options) { + parent::init($view, $options); + + $this->options += array( + 'exclude' => FALSE, + ); + } + + /** + * Called to add the field to a query. + */ + function query() { + $this->ensure_my_table(); + // Add the field. + $this->field_alias = $this->query->add_field($this->table_alias, $this->real_field); + + $this->add_additional_fields(); + } + + /** + * Add 'additional' fields to the query. + * + * @param $fields + * An array of fields. The key is an identifier used to later find the + * field alias used. The value is either a string in which case it's + * assumed to be a field on this handler's table; or it's an array in the + * form of + * @code array('table' => $tablename, 'field' => $fieldname) @endcode + */ + function add_additional_fields($fields = NULL) { + if (!isset($fields)) { + // notice check + if (empty($this->additional_fields)) { + return; + } + $fields = $this->additional_fields; + } + if (!empty($fields) && is_array($fields)) { + foreach ($fields as $identifier => $info) { + if (is_array($info)) { + if (isset($info['table'])) { + $table_alias = $this->query->ensure_table($info['table'], $this->relationship); + } + else { + $table_alias = $this->table_alias; + } + $this->aliases[$identifier] = $this->query->add_field($table_alias, $info['field']); + } + else { + $this->aliases[$info] = $this->query->add_field($this->table_alias, $info); + } + } + } + } + + /** + * Called to determine what to tell the clicksorter. + */ + function click_sort($order) { + $this->query->add_orderby($this->table, $this->field, $order, $this->field_alias); + } + + /** + * Determine if this field is click sortable. + */ + function click_sortable() { + return !empty($this->definition['click sortable']); + } + + /** + * Get this field's label. + */ + function label() { + if (!isset($this->options['label'])) { + return ''; + } + return $this->options['label']; + } + + /** + * Return DIV or SPAN based upon the field's element type. + */ + function element_type() { + if (isset($this->definition['element type'])) { + return $this->definition['element type']; + } + + return 'span'; + } + + function option_definition() { + $options = parent::option_definition(); + + $options['label'] = array('default' => $this->definition['title'], 'translatable' => TRUE); + $options['alter'] = array( + 'contains' => array( + 'alter_text' => array('default' => FALSE), + 'text' => array('default' => '', 'translatable' => TRUE), + 'make_link' => array('default' => FALSE), + 'path' => array('default' => '', 'translatable' => TRUE), + 'alt' => array('default' => '', 'translatable' => TRUE), + 'link_class' => array('default' => ''), + 'prefix' => array('default' => '', 'translatable' => TRUE), + 'suffix' => array('default' => '', 'translatable' => TRUE), + 'target' => array('default' => '', 'translatable' => TRUE), + 'trim' => array('default' => FALSE), + 'max_length' => array('default' => ''), + 'word_boundary' => array('default' => TRUE), + 'ellipsis' => array('default' => TRUE), + 'strip_tags' => array('default' => FALSE), + 'html' => array('default' => FALSE), + ), + ); + $options['empty'] = array('default' => '', 'translatable' => TRUE); + $options['hide_empty'] = array('default' => FALSE); + $options['empty_zero'] = array('default' => FALSE); + + return $options; + } + + /** + * Default options form that provides the label widget that all fields + * should have. + */ + function options_form(&$form, &$form_state) { + $form['label'] = array( + '#type' => 'textfield', + '#title' => t('Label'), + '#default_value' => isset($this->options['label']) ? $this->options['label'] : '', + '#description' => t('The label for this field that will be displayed to end users if the style requires it.'), + ); + $form['exclude'] = array( + '#type' => 'checkbox', + '#title' => t('Exclude from display'), + '#default_value' => $this->options['exclude'], + '#description' => t('Check this box to not display this field, but still load it in the view. Use this option to not show a grouping field in each record, or when doing advanced theming.'), + ); + + if ($this->allow_advanced_render()) { + $form['alter']['#tree'] = TRUE; + $form['alter']['alter_text'] = array( + '#type' => 'checkbox', + '#title' => t('Rewrite the output of this field'), + '#description' => t('If checked, you can alter the output of this field by specifying a string of text with replacement tokens that can use any existing field output.'), + '#default_value' => $this->options['alter']['alter_text'], + ); + + $form['alter']['text'] = array( + '#title' => t('Text'), + '#type' => 'textarea', + '#default_value' => $this->options['alter']['text'], + '#description' => t('The text to display for this field. You may include HTML. You may enter data from this view as per the "Replacement patterns" below.'), + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'edit-options-alter-alter-text' => array(1) + ), + ); + + $form['alter']['make_link'] = array( + '#type' => 'checkbox', + '#title' => t('Output this field as a link'), + '#description' => t('If checked, this field will be made into a link. The destination must be given below.'), + '#default_value' => $this->options['alter']['make_link'], + ); + $form['alter']['path'] = array( + '#title' => t('Link path'), + '#type' => 'textfield', + '#default_value' => $this->options['alter']['path'], + '#description' => t('The Drupal path or absolute URL for this link. You may enter data from this view as per the "Replacement patterns" below.'), + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'edit-options-alter-make-link' => array(1) + ), + ); + $form['alter']['link_class'] = array( + '#title' => t('Link class'), + '#type' => 'textfield', + '#default_value' => $this->options['alter']['link_class'], + '#description' => t('The CSS class to apply to the link.'), + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'edit-options-alter-make-link' => array(1) + ), + ); + $form['alter']['alt'] = array( + '#title' => t('Alt text'), + '#type' => 'textfield', + '#default_value' => $this->options['alter']['alt'], + '#description' => t('Text to place as "alt" text which most browsers display as a tooltip when hovering over the link.'), + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'edit-options-alter-make-link' => array(1) + ), + ); + $form['alter']['prefix'] = array( + '#title' => t('Prefix text'), + '#type' => 'textfield', + '#default_value' => $this->options['alter']['prefix'], + '#description' => t('Any text to display before this link. You may include HTML.'), + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'edit-options-alter-make-link' => array(1) + ), + ); + $form['alter']['suffix'] = array( + '#title' => t('Suffix text'), + '#type' => 'textfield', + '#default_value' => $this->options['alter']['suffix'], + '#description' => t('Any text to display after this link. You may include HTML.'), + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'edit-options-alter-make-link' => array(1) + ), + ); + $form['alter']['target'] = array( + '#title' => t('Target'), + '#type' => 'textfield', + '#default_value' => $this->options['alter']['target'], + '#description' => t("Target of the link, such as _blank, _parent or an iframe's name. This field is rarely used."), + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'edit-options-alter-make-link' => array(1) + ), + ); + + + // Get a list of the available fields and arguments for token replacement. + $options = array(); + foreach ($this->view->display_handler->get_handlers('field') as $field => $handler) { + $options[t('Fields')]["[$field]"] = $handler->ui_name(); + // We only use fields up to (and including) this one. + if ($field == $this->options['id']) { + break; + } + } + $count = 0; // This lets us prepare the key as we want it printed. + foreach ($this->view->display_handler->get_handlers('argument') as $arg => $handler) { + $options[t('Arguments')]['%' . ++$count] = t('@argument title', array('@argument' => $handler->ui_name())); + $options[t('Arguments')]['!' . $count] = t('@argument input', array('@argument' => $handler->ui_name())); + } + + $this->document_self_tokens($options[t('Fields')]); + + // Default text. + $output = t('

You must add some additional fields to this display before using this field. These fields may be marked as Exclude from display if you prefer. Note that due to rendering order, you cannot use fields that come after this field; if you need a field not listed here, rearrange your fields.

'); + // We have some options, so make a list. + if (!empty($options)) { + $output = t('

The following substitution patterns are available for this display. Use the pattern shown on the left to display the value indicated on the right. Note that due to rendering order, you cannot use fields that come after this field; if you need a field not listed here, rearrange your fields.

'); + foreach (array_keys($options) as $type) { + if (!empty($options[$type])) { + $items = array(); + foreach ($options[$type] as $key => $value) { + $items[] = $key . ' == ' . $value; + } + $output .= theme('item_list', $items, $type); + } + } + } + // This construct uses 'hidden' and not markup because process doesn't + // run. It also has an extra div because the dependency wants to hide + // the parent in situations like this, so we need a second div to + // make this work. + $form['alter']['help'] = array( + '#type' => 'hidden', + '#id' => 'views-tokens-help', + '#prefix' => '
' . t('Replacement patterns') . '' . $output . '
', + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'edit-options-alter-make-link' => array(1), + 'edit-options-alter-alter-text' => array(1), + ), + ); + + $form['alter']['trim'] = array( + '#type' => 'checkbox', + '#title' => t('Trim this field to a maximum length'), + '#description' => t('If checked, this field be trimmed to a maximum length in characters.'), + '#default_value' => $this->options['alter']['trim'], + ); + + $form['alter']['max_length'] = array( + '#title' => t('Maximum length'), + '#type' => 'textfield', + '#default_value' => $this->options['alter']['max_length'], + '#description' => t('The maximum number of characters this field can be.'), + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'edit-options-alter-trim' => array(1) + ), + ); + + $form['alter']['word_boundary'] = array( + '#type' => 'checkbox', + '#title' => t('Trim only on a word boundary'), + '#description' => t('If checked, this field be trimmed only on a word boundary. This is guaranteed to be the maximum characters stated or less. If there are no word boundaries this could trim a field to nothing.'), + '#default_value' => $this->options['alter']['word_boundary'], + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'edit-options-alter-trim' => array(1) + ), + ); + + $form['alter']['ellipsis'] = array( + '#type' => 'checkbox', + '#title' => t('Add an ellipsis'), + '#description' => t('If checked, a "..." will be added if a field was trimmed.'), + '#default_value' => $this->options['alter']['ellipsis'], + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'edit-options-alter-trim' => array(1) + ), + ); + + $form['alter']['strip_tags'] = array( + '#type' => 'checkbox', + '#title' => t('Strip HTML tags'), + '#description' => t('If checked, all HTML tags will be stripped.'), + '#default_value' => $this->options['alter']['strip_tags'], + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'edit-options-alter-trim' => array(1) + ), + ); + + $form['alter']['html'] = array( + '#type' => 'checkbox', + '#title' => t('Field can contain HTML'), + '#description' => t('If checked, HTML corrector will be run to ensure tags are properly closed after trimming.'), + '#default_value' => $this->options['alter']['html'], + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'edit-options-alter-trim' => array(1) + ), + ); + } + $form['empty'] = array( + '#type' => 'textfield', + '#title' => t('Empty text'), + '#default_value' => $this->options['empty'], + '#description' => t('If the field is empty, display this text instead.'), + ); + + $form['empty_zero'] = array( + '#type' => 'checkbox', + '#title' => t('Count the number 0 as empty'), + '#default_value' => $this->options['empty_zero'], + '#description' => t('If the field contains the number zero, display the empty text instead'), + ); + + $form['hide_empty'] = array( + '#type' => 'checkbox', + '#title' => t('Hide if empty'), + '#default_value' => $this->options['hide_empty'], + '#description' => t('Do not display anything for this field if it is empty. Note that the field label may still be displayed. Check style or row style settings to hide labels for empty fields.'), + ); + } + + /** + * Provide extra data to the administration form + */ + function admin_summary() { + return $this->label(); + } + + /** + * Run before any fields are rendered. + * + * This gives the handlers some time to set up before any handler has + * been rendered. + * + * @param $values + * An array of all objects returned from the query. + */ + function pre_render($values) { } + + /** + * Render the field. + * + * @param $values + * The values retrieved from the database. + */ + function render($values) { + $value = $values->{$this->field_alias}; + return check_plain($value); + } + + /** + * Render a field using advanced settings. + * + * This renders a field normally, then decides if render-as-link and + * text-replacement rendering is necessary. + */ + function advanced_render($values) { + if ($this->allow_advanced_render() && method_exists($this, 'render_item')) { + $raw_items = $this->get_items($values); + } + else { + $this->last_render = $value = $this->render($values); + $this->original_value = $value; + } + + if ($this->allow_advanced_render()) { + $tokens = NULL; + if (method_exists($this, 'render_item')) { + $items = array(); + foreach ($raw_items as $count => $item) { + $this->last_render = $this->render_item($count, $item); + $this->original_value = $this->last_render; + + $alter = $item + $this->options['alter']; + $items[] = $this->render_text($alter); + } + + $value = $this->render_items($items); + } + else { + $value = $this->render_text($this->options['alter']); + } + + // This happens here so that render_as_link can get the unaltered value of + // this field as a token rather than the altered value. + $this->last_render = $value; + } + + if (empty($this->last_render)) { + if ($this->last_render !== 0 || !empty($this->options['empty_zero'])) { + $this->last_render = $this->options['empty']; + } + } + + return $this->last_render; + } + + /** + * Perform an advanced text render for the item. + * + * This is separated out as some fields may render lists, and this allows + * each item to be handled individually. + */ + function render_text($alter) { + $value = $this->last_render; + if ($this->options['hide_empty'] && empty($value) && ($value !== 0 || $this->options['empty_zero'])) { + return ''; + } + + if (!empty($alter['alter_text']) && $alter['text'] !== '') { + $tokens = $this->get_render_tokens($alter); + $value = $this->render_altered($alter, $tokens); + } + + if (!empty($alter['trim']) && !empty($alter['max_length'])) { + $value = $this->render_trim_text($alter, $value); + } + + if (!empty($alter['make_link']) && !empty($alter['path'])) { + if (!isset($tokens)) { + $tokens = $this->get_render_tokens($alter); + } + $value = $this->render_as_link($alter, $value, $tokens); + } + + return $value; + } + + /** + * Render this field as altered text, from a fieldset set by the user. + */ + function render_altered($alter, $tokens) { + // Filter this right away as our substitutions are already sanitized. + $value = filter_xss_admin($alter['text']); + $value = strtr($value, $tokens); + + return $value; + } + + /** + * Trim the field down to the specified length. + */ + function render_trim_text($alter, $value) { + if (!empty($alter['strip_tags'])) { + $value = strip_tags($value); + // NOTE: It's possible that some external fields might override the + // element type so if someone from, say, CCK runs into a bug here, + // this may be why =) + $this->definition['element type'] = 'span'; + } + + if (drupal_strlen($value) <= $alter['max_length']) { + return $value; + } + + $value = drupal_substr($value, 0, $alter['max_length']); + + if (!empty($alter['word_boundary'])) { + if (preg_match("/(.*)\b.+/us", $value, $matches)) { + $value = $matches[1]; + } + } + // Remove scraps of HTML entities from the end of a strings + $value = rtrim(preg_replace('/(?:<(?!.+>)|&(?!.+;)).*$/us', '', $value)); + + if (!empty($alter['ellipsis'])) { + $value .= '...'; + } + + if (!empty($alter['html'])) { + $value = _filter_htmlcorrector($value); + } + + return $value; + } + + /** + * Render this field as a link, with the info from a fieldset set by + * the user. + */ + function render_as_link($alter, $text, $tokens) { + $value = ''; + + if (!empty($alter['prefix'])) { + $value .= filter_xss_admin(strtr($alter['prefix'], $tokens)); + } + + $options = array( + 'html' => 'true', + ); + + // $path will be run through check_url() by l() so we do not need to + // sanitize it ourselves. + $path = $alter['path']; + + // Use strip tags as there should never be HTML in the path. + // However, we need to preserve special characters like " that + // were removed by check_plain(). + $path = strip_tags(html_entity_decode(strtr($path, $tokens))); + + // Parse the URL and move any query and fragment parameters out of the path. + $url = parse_url($path); + if (isset($url['query'])) { + $path = strtr($path, array('?' . $url['query'] => '')); + $options['query'] = $url['query']; + } + if (isset($url['fragment'])) { + $path = strtr($path, array('#' . $url['fragment'] => '')); + $options['fragment'] = $url['fragment']; + } + + $alt = strtr($alter['alt'], $tokens); + // Set the title attribute of the link only if it improves accessibility + if ($alt && $alt != $text) { + $options['attributes']['title'] = $alt; + } + + $class = strtr($alter['link_class'], $tokens); + if ($class) { + $options['attributes']['class'] = $class; + } + + $target = check_plain(trim($alter['target'])); + if (!empty($target)) { + $options['attributes']['target'] = $target; + } + + // If the query and fragment were programatically assigned overwrite any + // parsed values. + if (isset($alter['query'])) { + $options['query'] = strtr($alter['query'], $tokens); + } + if (isset($alter['fragment'])) { + $options['fragment'] = strtr($alter['fragment'], $tokens); + } + if (isset($this->options['alter']['language'])) { + $options['language'] = $this->options['alter']['language']; + } + + $value .= l($text, $path, $options); + + if (!empty($alter['suffix'])) { + $value .= filter_xss_admin(strtr($alter['suffix'], $tokens)); + } + + return $value; + } + + /** + * Get the 'render' tokens to use for advanced rendering. + * + * This runs through all of the fields and arguments that + * are available and gets their values. This will then be + * used in one giant str_replace(). + */ + function get_render_tokens($item) { + $tokens = array(); + if (!empty($this->view->build_info['substitutions'])) { + $tokens = $this->view->build_info['substitutions']; + } + $count = 0; + foreach ($this->view->display_handler->get_handlers('argument') as $arg => $handler) { + $token = '%' . ++$count; + if (!isset($tokens[$token])) { + $tokens[$token] = ''; + } + + $tokens['!' . $count] = isset($this->view->args[$count - 1]) ? check_plain($this->view->args[$count - 1]) : ''; + } + + // Now add replacements for our fields. + foreach ($this->view->display_handler->get_handlers('field') as $field => $handler) { + if (isset($handler->last_render)) { + $tokens["[$field]"] = $handler->last_render; + } + else { + $tokens["[$field]"] = ''; + } + // We only use fields up to (and including) this one. + if ($field == $this->options['id']) { + break; + } + + $this->add_self_tokens($tokens, $item); + } + + return $tokens; + } + + /** + * Add any special tokens this field might use for itself. + * + * This method is intended to be overridden by items that generate + * fields as a list. For example, the field that displays all terms + * on a node might have tokens for the tid and the term. + * + * By convention, tokens should follow the format of [token-subtoken] + * where token is the field ID and subtoken is the field. If the + * field ID is terms, then the tokens might be [terms-tid] and [terms-name]. + */ + function add_self_tokens(&$tokens, $item) { } + + /** + * Document any special tokens this field might use for itself. + * + * @see add_self_tokens() for details. + */ + function document_self_tokens(&$tokens) { } + + /** + * Call out to the theme() function, which probably just calls render() but + * allows sites to override output fairly easily. + */ + function theme($values) { + return theme($this->theme_functions(), $this->view, $this, $values); + } + + function theme_functions() { + $themes = array(); + $hook = 'views_view_field'; + + $display = $this->view->display[$this->view->current_display]; + + if (!empty($display)) { + $themes[] = $hook . '__' . $this->view->name . '__' . $display->id . '__' . $this->options['id']; + $themes[] = $hook . '__' . $this->view->name . '__' . $display->id; + $themes[] = $hook . '__' . $display->id . '__' . $this->options['id']; + $themes[] = $hook . '__' . $display->id; + if ($display->id != $display->display_plugin) { + $themes[] = $hook . '__' . $this->view->name . '__' . $display->display_plugin . '__' . $this->options['id']; + $themes[] = $hook . '__' . $this->view->name . '__' . $display->display_plugin; + $themes[] = $hook . '__' . $display->display_plugin . '__' . $this->options['id']; + $themes[] = $hook . '__' . $display->display_plugin; + } + } + $themes[] = $hook . '__' . $this->view->name . '__' . $this->options['id']; + $themes[] = $hook . '__' . $this->view->name; + $themes[] = $hook . '__' . $this->options['id']; + $themes[] = $hook; + + return $themes; + } +} + +/** + * A special handler to take the place of missing or broken handlers. + */ +class views_handler_field_broken extends views_handler_field { + function ui_name($short = FALSE) { + return t('Broken/missing handler'); + } + + function ensure_my_table() { /* No table to ensure! */ } + function query() { /* No query to run */ } + function options_form(&$form, &$form_state) { + $form['markup'] = array( + '#prefix' => '
', + '#value' => t('The handler for this item is broken or missing and cannot be used. If a module provided the handler and was disabled, re-enabling the module may restore it. Otherwise, you should probably delete this item.'), + ); + } + + /** + * Determine if the handler is considered 'broken' + */ + function broken() { return TRUE; } +} + +/** + * Render a numeric value as a size. + */ +class views_handler_field_file_size extends views_handler_field { + function option_definition() { + $options = parent::option_definition(); + + $options['file_size_display'] = array('default' => 'formatted'); + + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['file_size_display'] = array( + '#title' => t('File size display'), + '#type' => 'select', + '#options' => array( + 'formatted' => t('Formatted (in KB or MB)'), + 'bytes' => t('Raw bytes'), + ), + ); + } + + function render($values) { + if ($values->{$this->field_alias}) { + switch ($this->options['file_size_display']) { + case 'bytes': + return $values->{$this->field_alias}; + case 'formatted': + default: + return format_size($values->{$this->field_alias}); + } + } + else { + return ''; + } + } +} + +/** + * A handler to run a field through simple XSS filtering + */ +class views_handler_field_xss extends views_handler_field { + function render($values) { + $value = $values->{$this->field_alias}; + return filter_xss($value); + } +} + +/** + * @} + */ + diff --git a/handlers/views_handler_field_boolean.inc b/handlers/views_handler_field_boolean.inc new file mode 100644 index 0000000000000000000000000000000000000000..b7a70c9d1050e6b29e8052d3b0d5e381f673bf37 --- /dev/null +++ b/handlers/views_handler_field_boolean.inc @@ -0,0 +1,57 @@ + 'yes-no'); + $options['not'] = array('definition bool' => 'reverse'); + + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['type'] = array( + '#type' => 'select', + '#title' => t('Output format'), + '#options' => array( + 'yes-no' => t('Yes/No'), + 'true-false' => t('True/False'), + 'on-off' => t('On/Off'), + ), + '#default_value' => $this->options['type'], + ); + $form['not'] = array( + '#type' => 'checkbox', + '#title' => t('Reverse'), + '#description' => t('If checked, true will be displayed as false.'), + '#default_value' => $this->options['not'], + ); + } + + function render($values) { + $value = $values->{$this->field_alias}; + if (!empty($this->options['not'])) { + $value = !$value; + } + + switch ($this->options['type']) { + case 'yes-no': + default: + return $value ? t('Yes') : t('No'); + case 'true-false': + return $value ? t('True') : t('False'); + case 'on-off': + return $value ? t('On') : t('Off'); + } + } +} diff --git a/handlers/views_handler_field_counter.inc b/handlers/views_handler_field_counter.inc new file mode 100644 index 0000000000000000000000000000000000000000..01575c14693467bd8e8c3709a0c06c58c47345f8 --- /dev/null +++ b/handlers/views_handler_field_counter.inc @@ -0,0 +1,42 @@ + 1); + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + + $form['counter_start'] = array( + '#type' => 'textfield', + '#title' => t('Starting value'), + '#default_value' => $this->options['counter_start'], + '#description' => t('Specify the number the counter should start at.'), + //'#process' => array('views_process_dependency'), + '#size' => 2, + ); + } + + function query() { + // do nothing -- to override the parent query. + } + + function render($values) { + // Note: 1 is subtracted from the counter start value below because the + // counter value is incremented by 1 at the end of this function. + $count = is_numeric($this->options['counter_start']) ? $this->options['counter_start'] - 1 : 0; + $pager = $this->view->pager; + // Get the base count of the pager. + if ($pager['use_pager']) { + $count += ($pager['items_per_page'] * $pager['current_page']) + $pager['offset']; + } + // Add the counter for the current site. + $count += $this->view->row_index + 1; + + return $count; + } +} diff --git a/handlers/views_handler_field_custom.inc b/handlers/views_handler_field_custom.inc new file mode 100644 index 0000000000000000000000000000000000000000..2347745ef57d8342171980be3ce1e5cf8d49800e --- /dev/null +++ b/handlers/views_handler_field_custom.inc @@ -0,0 +1,35 @@ + TRUE); + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + + // Remove the checkbox + unset($form['alter']['alter_text']); + unset($form['alter']['text']['#dependency']); + unset($form['alter']['text']['#process']); + } + + function render($values) { + // Nothing to render. + return ''; + } +} diff --git a/handlers/views_handler_field_date.inc b/handlers/views_handler_field_date.inc new file mode 100644 index 0000000000000000000000000000000000000000..0783d2ad301173cd556a22ec0152cd3dd671b368 --- /dev/null +++ b/handlers/views_handler_field_date.inc @@ -0,0 +1,75 @@ + 'small'); + $options['custom_date_format'] = array('default' => ''); + + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $time = time(); + + $form['date_format'] = array( + '#type' => 'select', + '#title' => t('Date format'), + '#options' => array( + 'small' => format_date($time, 'small'), + 'medium' => format_date($time, 'medium'), + 'large' => format_date($time, 'large'), + 'custom' => t('Custom'), + 'raw time ago' => t('Time ago'), + 'time ago' => t('Time ago (with "ago" appended)'), + 'raw time span' => t('Time span (future dates start with - )'), + 'time span' => t('Time span (with "ago/hence" appended)'), + ), + '#default_value' => isset($this->options['date_format']) ? $this->options['date_format'] : 'small', + ); + $form['custom_date_format'] = array( + '#type' => 'textfield', + '#title' => t('Custom date format'), + '#description' => t('If "Custom", see the PHP docs for date formats. If "Time ago" this is the the number of different units to display, which defaults to two.'), + '#default_value' => isset($this->options['custom_date_format']) ? $this->options['custom_date_format'] : '', + '#process' => array('views_process_dependency'), + '#dependency' => array('edit-options-date-format' => array('custom', 'raw time ago', 'time ago', 'raw time span', 'time span')), + ); + } + + function render($values) { + $value = $values->{$this->field_alias}; + $format = $this->options['date_format']; + if (in_array($format, array('custom', 'raw time ago', 'time ago', 'raw time span', 'time span'))) { + $custom_format = $this->options['custom_date_format']; + } + + if (!$value) { + return theme('views_nodate'); + } + else { + $time_diff = time() - $value; // will be positive for a datetime in the past (ago), and negative for a datetime in the future (hence) + switch ($format) { + case 'raw time ago': + return format_interval($time_diff, is_numeric($custom_format) ? $custom_format : 2); + case 'time ago': + return t('%time ago', array('%time' => format_interval($time_diff, is_numeric($custom_format) ? $custom_format : 2))); + case 'raw time span': + return ($time_diff < 0 ? '-' : '') . format_interval(abs($time_diff), is_numeric($custom_format) ? $custom_format : 2); + case 'time span': + return t(($time_diff < 0 ? '%time hence' : '%time ago'), array('%time' => format_interval(abs($time_diff), is_numeric($custom_format) ? $custom_format : 2))); + case 'custom': + return format_date($value, $format, $custom_format); + default: + return format_date($value, $format); + } + } + } +} diff --git a/handlers/views_handler_field_markup.inc b/handlers/views_handler_field_markup.inc new file mode 100644 index 0000000000000000000000000000000000000000..10c93ea3395099b43676504b784aa50330ac7ede --- /dev/null +++ b/handlers/views_handler_field_markup.inc @@ -0,0 +1,42 @@ +format = $this->definition['format']; + + $this->additional_fields = array(); + if (!is_numeric($this->format)) { + $this->additional_fields['format'] = array('field' => $this->format); + } + } + + function render($values) { + $value = $values->{$this->field_alias}; + $format = is_numeric($this->format) ? $this->format : $values->{$this->aliases['format']}; + return check_markup($value, $format, FALSE); + } + + function element_type() { + if (isset($this->definition['element type'])) { + return $this->definition['element type']; + } + + return 'div'; + } +} diff --git a/handlers/views_handler_field_numeric.inc b/handlers/views_handler_field_numeric.inc new file mode 100644 index 0000000000000000000000000000000000000000..2fc51d8d8ecfda1e162be735d70304e912a865de --- /dev/null +++ b/handlers/views_handler_field_numeric.inc @@ -0,0 +1,96 @@ + FALSE); + $options['precision'] = array('default' => 0); + $options['decimal'] = array('default' => '.', 'translatable' => TRUE); + $options['separator'] = array('default' => ',', 'translatable' => TRUE); + $options['prefix'] = array('default' => '', 'translatable' => TRUE); + $options['suffix'] = array('default' => '', 'translatable' => TRUE); + + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + + if (!empty($this->definition['float'])) { + $form['set_precision'] = array( + '#type' => 'checkbox', + '#title' => t('Round'), + '#description' => t('If checked, the number will be rounded.'), + '#default_value' => $this->options['set_precision'], + ); + $form['precision'] = array( + '#type' => 'textfield', + '#title' => t('Precision'), + '#default_value' => $this->options['precision'], + '#description' => t('Specify how many digits to print after the decimal point.'), + '#process' => array('views_process_dependency'), + '#dependency' => array('edit-options-set-precision' => array(TRUE)), + '#size' => 2, + ); + $form['decimal'] = array( + '#type' => 'textfield', + '#title' => t('Decimal point'), + '#default_value' => $this->options['decimal'], + '#description' => t('What single character to use as a decimal point.'), + '#size' => 2, + ); + } + $form['separator'] = array( + '#type' => 'textfield', + '#title' => t('Thousands separator'), + '#default_value' => $this->options['separator'], + '#description' => t('What single character to use as the thousands separator.'), + '#size' => 2, + ); + $form['prefix'] = array( + '#type' => 'textfield', + '#title' => t('Prefix'), + '#default_value' => $this->options['prefix'], + '#description' => t('Text to put before the number, such as currency symbol.'), + ); + $form['suffix'] = array( + '#type' => 'textfield', + '#title' => t('Suffix'), + '#default_value' => $this->options['suffix'], + '#description' => t('Text to put after the number, such as currency symbol.'), + ); + } + + function render($values) { + $value = $values->{$this->field_alias}; + if (!empty($this->options['set_precision'])) { + $value = number_format($value, $this->options['precision'], $this->options['decimal'], $this->options['separator']); + } + else { + $remainder = abs($value) - intval(abs($value)); + $value = $value > 0 ? floor($value) : ceil($value); + $value = number_format($value, 0, '', $this->options['separator']); + if ($remainder) { + // The substr may not be locale safe. + $value .= $this->options['decimal'] . substr($remainder, 2); + } + } + + // Check to see if hiding should happen before adding prefix and suffix. + if ($this->options['hide_empty'] && empty($value) && ($value !== 0 || $this->options['empty_zero'])) { + return ''; + } + + return check_plain($this->options['prefix'] . $value . $this->options['suffix']); + } +} diff --git a/handlers/views_handler_field_prerender_list.inc b/handlers/views_handler_field_prerender_list.inc new file mode 100644 index 0000000000000000000000000000000000000000..9b532bcf04b5848ee5739203c511df4dfbce6e0a --- /dev/null +++ b/handlers/views_handler_field_prerender_list.inc @@ -0,0 +1,112 @@ +items + * + * @ingroup views_field_handlers + */ +class views_handler_field_prerender_list extends views_handler_field { + function option_definition() { + $options = parent::option_definition(); + + $options['type'] = array('default' => 'separator'); + $options['separator'] = array('default' => ', '); + + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['type'] = array( + '#type' => 'radios', + '#title' => t('Display type'), + '#options' => array( + 'ul' => t('Unordered list'), + 'ol' => t('Ordered list'), + 'separator' => t('Simple separator'), + ), + '#default_value' => $this->options['type'], + ); + + $form['separator'] = array( + '#type' => 'textfield', + '#title' => t('Separator'), + '#default_value' => $this->options['separator'], + '#process' => array('views_process_dependency'), + '#dependency' => array('radio:options[type]' => array('separator')), + ); + } + + /** + * Render the field. + * + * This function is deprecated, but left in for older systems that have not + * yet or won't update their prerender list fields. If a render_item method + * exists, this will not get used by advanced_render. + */ + function render($values) { + $field = $values->{$this->field_alias}; + if (!empty($this->items[$field])) { + if ($this->options['type'] == 'separator') { + return implode(check_plain($this->options['separator']), $this->items[$field]); + } + else { + return theme('item_list', $this->items[$field], NULL, $this->options['type']); + } + } + } + + /** + * Render all items in this field together. + * + * When using advanced render, each possible item in the list is rendered + * individually. Then the items are all pasted together. + */ + function render_items($items) { + if (!empty($items)) { + if ($this->options['type'] == 'separator') { + return implode(check_plain($this->options['separator']), $items); + } + else { + return theme('item_list', $items, NULL, $this->options['type']); + } + } + } + + /** + * Return an array of items for the field. + * + * Items should be stored in the result array, if possible, as an array + * with 'value' as the actual displayable value of the item, plus + * any items that might be found in the 'alter' options array for + * creating links, such as 'path', 'fragment', 'query' etc, such a thing + * is to be made. Additionally, items that might be turned into tokens + * should also be in this array. + */ + function get_items($values) { + $field = $values->{$this->field_alias}; + if (!empty($this->items[$field])) { + return $this->items[$field]; + } + + return array(); + } + + /** + * Determine if advanced rendering is allowed. + * + * By default, advanced rendering will NOT be allowed if the class + * inheriting from this does not implement a 'render_items' method. + */ + function allow_advanced_render() { + // Note that the advanced render bits also use the presence of + // this method to determine if it needs to render items as a list. + return method_exists($this, 'render_item'); + } +} diff --git a/handlers/views_handler_field_url.inc b/handlers/views_handler_field_url.inc new file mode 100644 index 0000000000000000000000000000000000000000..118893b35c07bb00beb524b9a11e183453a51ed7 --- /dev/null +++ b/handlers/views_handler_field_url.inc @@ -0,0 +1,39 @@ + TRUE); + + return $options; + } + + /** + * Provide link to the page being visited. + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['display_as_link'] = array( + '#title' => t('Display as link'), + '#type' => 'checkbox', + '#default_value' => !empty($this->options['display_as_link']), + ); + } + + function render($values) { + $value = $values->{$this->field_alias}; + if (!empty($this->options['display_as_link'])) { + return l(check_plain($value), $value, array('html' => TRUE)); + } + else { + return $value; + } + } +} diff --git a/handlers/views_handler_filter.inc b/handlers/views_handler_filter.inc new file mode 100644 index 0000000000000000000000000000000000000000..6392880fbd38eca6b68c337b678b163e278bb712 --- /dev/null +++ b/handlers/views_handler_filter.inc @@ -0,0 +1,614 @@ +operator = $this->options['operator']; + $this->value = $this->options['value']; + + // Compatibility: Set use_operator to true if the old way of using + // the operator is set and use_operator is NULL (was never set). + if (!empty($options['exposed']) && !empty($options['expose']['operator']) && !isset($options['expose']['use_operator'])) { + $this->options['expose']['use_operator'] = TRUE; + } + + // If there are relationships in the view, allow empty should be true + // so that we can do IS NULL checks on items. Not all filters respect + // allow empty, but string and numeric do and that covers enough. + if ($this->view->display_handler->get_option('relationships')) { + $this->definition['allow empty'] = TRUE; + } + } + + function option_definition() { + $options = parent::option_definition(); + + $options['operator'] = array('default' => '='); + $options['value'] = array('default' => ''); + $options['group'] = array('default' => '0'); + $options['exposed'] = array('default' => FALSE); + $options['expose'] = array( + 'contains' => array( + 'operator' => array('default' => FALSE), + 'label' => array('default' => '', 'translatable' => TRUE), + ), + ); + + return $options; + } + + /** + * Display the filter on the administrative summary + */ + function admin_summary() { + return check_plain((string) $this->operator) . ' ' . check_plain((string) $this->value); + } + + /** + * Determine if a filter can be exposed. + */ + function can_expose() { return TRUE; } + + /** + * Provide the basic form which calls through to subforms. + * If overridden, it is best to call through to the parent, + * or to at least make sure all of the functions in this form + * are called. + */ + function options_form(&$form, &$form_state) { + if ($this->can_expose()) { + $this->show_expose_button($form, $form_state); + } + $form['op_val_start'] = array('#value' => '
'); + $this->show_operator_form($form, $form_state); + $this->show_value_form($form, $form_state); + $form['op_val_end'] = array('#value' => '
'); + if ($this->can_expose()) { + $this->show_expose_form($form, $form_state); + } + } + + /** + * Simple validate handler + */ + function options_validate(&$form, &$form_state) { + $this->operator_validate($form, $form_state); + $this->value_validate($form, $form_state); + if (!empty($this->options['exposed'])) { + $this->expose_validate($form, $form_state); + } + + } + + /** + * Simple submit handler + */ + function options_submit(&$form, &$form_state) { + unset($form_state['values']['expose_button']); // don't store this. + $this->operator_submit($form, $form_state); + $this->value_submit($form, $form_state); + if (!empty($this->options['exposed'])) { + $this->expose_submit($form, $form_state); + } + } + + /** + * Shortcut to display the operator form. + */ + function show_operator_form(&$form, &$form_state) { + $this->operator_form($form, $form_state); + $form['operator']['#prefix'] = '
'; + $form['operator']['#suffix'] = '
'; + } + + /** + * Provide a form for setting the operator. + * + * This may be overridden by child classes, and it must + * define $form['operator']; + */ + function operator_form(&$form, &$form_state) { + $options = $this->operator_options(); + if (!empty($options)) { + $form['operator'] = array( + '#type' => count($options) < 10 ? 'radios' : 'select', + '#title' => t('Operator'), + '#default_value' => $this->operator, + '#options' => $options, + ); + } + } + + /** + * Provide a list of options for the default operator form. + * Should be overridden by classes that don't override operator_form + */ + function operator_options() { return array(); } + + /** + * Validate the operator form. + */ + function operator_validate($form, &$form_state) { } + + /** + * Perform any necessary changes to the form values prior to storage. + * There is no need for this function to actually store the data. + */ + function operator_submit($form, &$form_state) { } + + /** + * Shortcut to display the value form. + */ + function show_value_form(&$form, &$form_state) { + $this->value_form($form, $form_state); + if (empty($this->no_operator)) { + $form['value']['#prefix'] = '
' . (isset($form['value']['#prefix']) ? $form['value']['#prefix'] : ''); + $form['value']['#suffix'] = (isset($form['value']['#suffix']) ? $form['value']['#suffix'] : '') . '
'; + } + } + + /** + * Provide a form for setting options. + * + * This should be overridden by all child classes and it must + * define $form['value'] + */ + function value_form(&$form, &$form_state) { $form['value'] = array(); } + + /** + * Validate the options form. + */ + function value_validate($form, &$form_state) { } + + /** + * Perform any necessary changes to the form values prior to storage. + * There is no need for this function to actually store the data. + */ + function value_submit($form, &$form_state) { } + + /** + * Shortcut to display the expose/hide button. + */ + function show_expose_button(&$form, &$form_state) { + $form['expose_button'] = array( + '#prefix' => '
', + '#suffix' => '
', + ); + if (empty($this->options['exposed'])) { + $form['expose_button']['button'] = array( + '#type' => 'submit', + '#value' => t('Expose'), + '#submit' => array('views_ui_config_item_form_expose'), + ); + $form['expose_button']['markup'] = array( + '#prefix' => '
', + '#value' => t('This item is currently not exposed. If you expose it, users will be able to change the filter as they view it.'), + '#suffix' => '
', + ); + } + else { + $form['expose_button']['button'] = array( + '#type' => 'submit', + '#value' => t('Hide'), + '#submit' => array('views_ui_config_item_form_expose'), + ); + $form['expose_button']['markup'] = array( + '#prefix' => '
', + '#value' => t('This item is currently exposed. If you hide it, users will not be able to change the filter as they view it.'), + '#suffix' => '
', + ); + } + } + + /** + * Shortcut to display the exposed options form. + */ + function show_expose_form(&$form, &$form_state) { + if (empty($this->options['exposed'])) { + return; + } + + $form['expose'] = array( + '#prefix' => '
', + '#suffix' => '
', + ); + $this->expose_form($form, $form_state); + + // When we click the expose button, we add new gadgets to the form but they + // have no data in $_POST so their defaults get wiped out. This prevents + // these defaults from getting wiped out. This setting will only be TRUE + // during a 2nd pass rerender. + if (!empty($form_state['force_expose_options'])) { + foreach (element_children($form['expose']) as $id) { + if (isset($form['expose'][$id]['#default_value']) && !isset($form['expose'][$id]['#value'])) { + $form['expose'][$id]['#value'] = $form['expose'][$id]['#default_value']; + } + } + } + } + + /** + * Overridable form for exposed filter options. + * + * If overridden, it is best to call the parent or re-implement + * the stuff here. + * + * Many filters will need to override this in order to provide options + * that are nicely tailored to the given filter. + */ + function expose_form(&$form, &$form_state) { + $form['expose']['start_left'] = array( + '#value' => '
', + ); + + $this->expose_form_left($form, $form_state); + + $form['expose']['end_left'] = array( + '#value' => '
', + ); + + $form['expose']['start_checkboxes'] = array( + '#value' => '
', + ); + + $this->expose_form_right($form, $form_state); + + $form['expose']['end_checkboxes'] = array( + '#value' => '
', + ); + } + + /** + * Handle the 'left' side fo the exposed options form. + */ + function expose_form_left(&$form, &$form_state) { + if (!empty($form['operator']['#type'])) { + $form['expose']['use_operator'] = array( + '#type' => 'checkbox', + '#title' => t('Unlock operator'), + '#description' => t('When checked, the operator will be exposed to the user'), + '#default_value' => !empty($this->options['expose']['use_operator']), + ); + $form['expose']['operator'] = array( + '#type' => 'textfield', + '#default_value' => $this->options['expose']['operator'], + '#title' => t('Operator identifier'), + '#size' => 40, + '#description' => t('This will appear in the URL after the ? to identify this operator.'), + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'edit-options-expose-use-operator' => array(1) + ), + ); + } + else { + $form['expose']['operator'] = array( + '#type' => 'value', + '#value' => '', + ); + } + + $form['expose']['identifier'] = array( + '#type' => 'textfield', + '#default_value' => $this->options['expose']['identifier'], + '#title' => t('Filter identifier'), + '#size' => 40, + '#description' => t('This will appear in the URL after the ? to identify this filter. Cannot be blank.'), + ); + $form['expose']['label'] = array( + '#type' => 'textfield', + '#default_value' => $this->options['expose']['label'], + '#title' => t('Label'), + '#size' => 40, + ); + } + + /** + * Handle the 'right' side fo the exposed options form. + */ + function expose_form_right(&$form, &$form_state) { + $form['expose']['optional'] = array( + '#type' => 'checkbox', + '#title' => t('Optional'), + '#description' => t('This exposed filter is optional and will have added options to allow it not to be set.'), + '#default_value' => $this->options['expose']['optional'], + ); + if (empty($this->no_single)) { + $form['expose']['single'] = array( + '#type' => 'checkbox', + '#title' => t('Force single'), + '#description' => t('Force this exposed filter to accept only one option.'), + '#default_value' => $this->options['expose']['single'], + ); + } + $form['expose']['remember'] = array( + '#type' => 'checkbox', + '#title' => t('Remember'), + '#description' => t('Remember the last setting the user gave this filter.'), + '#default_value' => $this->options['expose']['remember'], + ); + } + + /** + * Validate the options form. + */ + function expose_validate($form, &$form_state) { + if (empty($this->options['expose']['identifier'])) { + if (empty($form_state['values']['options']['expose']['identifier'])) { + form_error($form['expose']['identifier'], t('The identifier is required if the filter is exposed.')); + } + } + + if (!empty($form_state['values']['options']['expose']['identifier']) && $form_state['values']['options']['expose']['identifier'] == 'value') { + form_error($form['expose']['identifier'], t('This identifier is not allowed.')); + } + } + + /** + * Perform any necessary changes to the form exposes prior to storage. + * There is no need for this function to actually store the data. + */ + function expose_submit($form, &$form_state) { } + + /** + * Provide default options for exposed filters. + */ + function expose_options() { + $this->options['expose'] = array( + 'use_operator' => FALSE, + 'operator' => $this->options['id'] . '_op', + 'identifier' => $this->options['id'], + 'label' => $this->ui_name(), + 'remember' => FALSE, + 'single' => TRUE, + 'optional' => TRUE, + ); + } + + /** + * Render our chunk of the exposed filter form when selecting + * + * You can override this if it doesn't do what you expect. + */ + function exposed_form(&$form, &$form_state) { + if (empty($this->options['exposed'])) { + return; + } + + if (!empty($this->options['expose']['use_operator']) && !empty($this->options['expose']['operator'])) { + $operator = $this->options['expose']['operator']; + $this->operator_form($form, $form_state); + $form[$operator] = $form['operator']; + + if (isset($form[$operator]['#title'])) { + unset($form[$operator]['#title']); + } + + $this->exposed_translate($form[$operator], 'operator'); + + unset($form['operator']); + } + + if (!empty($this->options['expose']['identifier'])) { + $value = $this->options['expose']['identifier']; + $this->value_form($form, $form_state); + $form[$value] = $form['value']; + + if (isset($form[$value]['#title']) && !empty($form[$value]['#type']) && $form[$value]['#type'] != 'checkbox') { + unset($form[$value]['#title']); + } + + $this->exposed_translate($form[$value], 'value'); + + if (!empty($form['#type']) && ($form['#type'] == 'checkboxes' || ($form['#type'] == 'select' && !empty($form['#multiple'])))) { + unset($form[$value]['#default_value']); + } + + if (!empty($form['#type']) && $form['#type'] == 'select' && empty($form['#multiple'])) { + $form[$value]['#default_value'] = 'All'; + } + + if ($value != 'value') { + unset($form['value']); + } + } + } + + /** + * Make some translations to a form item to make it more suitable to + * exposing. + */ + function exposed_translate(&$form, $type) { + if (!isset($form['#type'])) { + return; + } + + if ($form['#type'] == 'radios') { + $form['#type'] = 'select'; + } + // Checkboxes don't work so well in exposed forms due to GET conversions. + if ($form['#type'] == 'checkboxes') { + if (empty($form['#no_convert']) || !empty($this->options['expose']['single'])) { + $form['#type'] = 'select'; + } + if (empty($this->options['expose']['single'])) { + $form['#multiple'] = TRUE; + } + } + if (!empty($this->options['expose']['single']) && isset($form['#multiple'])) { + unset($form['#multiple']); + $form['#size'] = NULL; + } + + if ($type == 'value' && !empty($this->options['expose']['optional']) && $form['#type'] == 'select' && empty($form['#multiple'])) { + $any_label = variable_get('views_exposed_filter_any_label', 'old_any') == 'old_any' ? t('') : t('- Any -'); + $form['#options'] = array('All' => $any_label) + $form['#options']; + $form['#default_value'] = 'All'; + } + } + + /** + * Tell the renderer about our exposed form. This only needs to be + * overridden for particularly complex forms. And maybe not even then. + */ + function exposed_info() { + if (empty($this->options['exposed'])) { + return; + } + + return array( + 'operator' => $this->options['expose']['operator'], + 'value' => $this->options['expose']['identifier'], + 'label' => $this->options['expose']['label'], + ); + } + + /** + * Check to see if input from the exposed filters should change + * the behavior of this filter. + */ + function accept_exposed_input($input) { + if (empty($this->options['exposed'])) { + return TRUE; + } + + + if (!empty($this->options['expose']['use_operator']) && !empty($this->options['expose']['operator']) && isset($input[$this->options['expose']['operator']])) { + $this->operator = $input[$this->options['expose']['operator']]; + } + + if (!empty($this->options['expose']['identifier'])) { + $value = $input[$this->options['expose']['identifier']]; + + // Various ways to check for the absence of optional input. + if (!empty($this->options['expose']['optional'])) { + if ($value == 'All' || $value === array()) { + return FALSE; + } + + if (!empty($this->no_single) && $value === '') { + return FALSE; + } + } + + + if (isset($value)) { + $this->value = $value; + if (!empty($this->options['expose']['single'])) { + $this->value = array($value); + } + } + else { + return FALSE; + } + } + + return TRUE; + } + + function store_exposed_input($input, $status) { + if (empty($this->options['exposed']) || empty($this->options['expose']['identifier'])) { + return TRUE; + } + + if (empty($this->options['expose']['remember'])) { + return; + } + + // Figure out which display id is responsible for the filters, so we + // know where to look for session stored values. + $display_id = ($this->view->display_handler->is_defaulted('filters')) ? 'default' : $this->view->current_display; + + // shortcut test. + $operator = !empty($this->options['expose']['use_operator']) && !empty($this->options['expose']['operator']); + + // false means that we got a setting that means to recuse ourselves, + // so we should erase whatever happened to be there. + if (!$status && isset($_SESSION['views'][$this->view->name][$display_id])) { + $session = &$_SESSION['views'][$this->view->name][$display_id]; + if ($operator && isset($session[$this->options['expose']['operator']])) { + unset($session[$this->options['expose']['operator']]); + } + + if (isset($session[$this->options['expose']['identifier']])) { + unset($session[$this->options['expose']['identifier']]); + } + } + + if ($status) { + if (!isset($_SESSION['views'][$this->view->name][$display_id])) { + $_SESSION['views'][$this->view->name][$display_id] = array(); + } + + $session = &$_SESSION['views'][$this->view->name][$display_id]; + + if ($operator && isset($input[$this->options['expose']['operator']])) { + $session[$this->options['expose']['operator']] = $input[$this->options['expose']['operator']]; + } + + $session[$this->options['expose']['identifier']] = $input[$this->options['expose']['identifier']]; + } + } + + /** + * Add this filter to the query. + * + * Due to the nature of fapi, the value and the operator have an unintended + * level of indirection. You will find them in $this->operator + * and $this->value respectively. + */ + function query() { + $this->ensure_my_table(); + $this->query->add_where($this->options['group'], "$this->table_alias.$this->real_field " . $this->operator . " '%s'", $this->value); + } +} + + +/** + * A special handler to take the place of missing or broken handlers. + */ +class views_handler_filter_broken extends views_handler_filter { + function ui_name($short = FALSE) { + return t('Broken/missing handler'); + } + + function ensure_my_table() { /* No table to ensure! */ } + function query() { /* No query to run */ } + function options_form(&$form, &$form_state) { + $form['markup'] = array( + '#prefix' => '
', + '#value' => t('The handler for this item is broken or missing and cannot be used. If a module provided the handler and was disabled, re-enabling the module may restore it. Otherwise, you should probably delete this item.'), + ); + } + + /** + * Determine if the handler is considered 'broken' + */ + function broken() { return TRUE; } +} + + +/** + * @} + */ diff --git a/handlers/views_handler_filter_boolean_operator.inc b/handlers/views_handler_filter_boolean_operator.inc new file mode 100644 index 0000000000000000000000000000000000000000..9511ac6cfd9d95ddd4e686ed61891ae9078bfe76 --- /dev/null +++ b/handlers/views_handler_filter_boolean_operator.inc @@ -0,0 +1,149 @@ +value_value = t('True'); + if (isset($this->definition['label'])) { + $this->value_value = $this->definition['label']; + } + if (isset($this->definition['accept_null'])) { + $this->accept_null = (bool) $this->definition['accept null']; + } + $this->value_options = NULL; + parent::construct(); + } + + /** + * Return the possible options for this filter. + * + * Child classes should override this function to set the possible values + * for the filter. Since this is a boolean filter, the array should have + * two possible keys: 1 for "True" and 0 for "False", although the labels + * can be whatever makes sense for the filter. These values are used for + * configuring the filter, when the filter is exposed, and in the admin + * summary of the filter. Normally, this should be static data, but if it's + * dynamic for some reason, child classes should use a guard to reduce + * database hits as much as possible. + */ + function get_value_options() { + if (isset($this->definition['type'])) { + if ($this->definition['type'] == 'yes-no') { + $this->value_options = array(1 => t('Yes'), 0 => t('No')); + } + if ($this->definition['type'] == 'on-off') { + $this->value_options = array(1 => t('On'), 0 => t('Off')); + } + } + + // Provide a fallback if the above didn't set anything. + if (!isset($this->value_options)) { + $this->value_options = array(1 => t('True'), 0 => t('False')); + } + } + + function option_definition() { + $options = parent::option_definition(); + + $options['value']['default'] = FALSE; + + return $options; + } + + function operator_form(&$form, &$form_state) { + $form['operator'] = array(); + } + + function value_form(&$form, &$form_state) { + if (empty($this->value_options)) { + // Initialize the array of possible values for this filter. + $this->get_value_options(); + } + if (!empty($form_state['exposed'])) { + // Exposed filter: use a select box to save space. + $filter_form_type = 'select'; + } + else { + // Configuring a filter: use radios for clarity. + $filter_form_type = 'radios'; + } + $form['value'] = array( + '#type' => $filter_form_type, + '#title' => $this->value_value, + '#options' => $this->value_options, + '#default_value' => $this->value, + ); + if (!empty($this->options['exposed'])) { + $identifier = $this->options['expose']['identifier']; + if (!isset($form_state['input'][$identifier])) { + $form_state['input'][$identifier] = $this->value; + } + // If we're configuring an exposed filter, add an option. + $any_label = variable_get('views_exposed_filter_any_label', 'old_any') == 'old_any' ? t('') : t('- Any -'); + if ($form['value']['#type'] != 'select') { + $any_label = check_plain($any_label); + } + $form['value']['#options'] = array('All' => $any_label) + $form['value']['#options']; + } + } + + function value_validate(&$form, &$form_state) { + if ($form_state['values']['options']['value'] == 'All' && empty($form_state['values']['options']['expose']['optional'])) { + form_set_error('value', t('You must select a value unless this is an optional exposed filter.')); + } + } + + function admin_summary() { + if (!empty($this->options['exposed'])) { + return t('exposed'); + } + if (empty($this->value_options)) { + $this->get_value_options(); + } + // Now that we have the valid options for this filter, just return the + // human-readable label based on the current value. The value_options + // array is keyed with either 0 or 1, so if the current value is not + // empty, use the label for 1, and if it's empty, use the label for 0. + return $this->value_options[!empty($this->value)]; + } + + function expose_options() { + parent::expose_options(); + $this->options['expose']['operator'] = ''; + $this->options['expose']['label'] = $this->value_value; + $this->options['expose']['optional'] = FALSE; + } + + function query() { + $this->ensure_my_table(); + + $where = "$this->table_alias.$this->real_field "; + + if (empty($this->value)) { + $where .= '= 0'; + if ($this->accept_null) { + $where = '(' . $where . " OR $this->table_alias.$this->real_field IS NULL)"; + } + } + else { + $where .= '<> 0'; + } + $this->query->add_where($this->options['group'], $where); + } +} diff --git a/handlers/views_handler_filter_boolean_operator_string.inc b/handlers/views_handler_filter_boolean_operator_string.inc new file mode 100644 index 0000000000000000000000000000000000000000..09b5c23eee58a95387e03ca46f4ef0f201e54c7c --- /dev/null +++ b/handlers/views_handler_filter_boolean_operator_string.inc @@ -0,0 +1,28 @@ +ensure_my_table(); + $where = "$this->table_alias.$this->real_field "; + + if (empty($this->value)) { + $where .= "= ''"; + if ($this->accept_null) { + $where = '(' . $where . " OR $this->table_alias.$this->real_field IS NULL)"; + } + } + else { + $where .= "<> ''"; + } + $this->query->add_where($this->options['group'], $where); + } +} diff --git a/handlers/views_handler_filter_date.inc b/handlers/views_handler_filter_date.inc new file mode 100644 index 0000000000000000000000000000000000000000..a894c14cad197d5c607fd67f54231e8c32fdcb92 --- /dev/null +++ b/handlers/views_handler_filter_date.inc @@ -0,0 +1,153 @@ + 'radios', + '#title' => t('Value type'), + '#options' => array( + 'date' => t('A date in any machine readable format. CCYY-MM-DD HH:MM:SS is preferred.'), + 'offset' => t('An offset from the current time such as "+1 day" or "-2 hours and 30 minutes"'), + ), + '#default_value' => !empty($this->value['type']) ? $this->value['type'] : 'date', + ); + } + parent::value_form($form, $form_state); + } + + function options_validate(&$form, &$form_state) { + parent::options_validate($form, $form_state); + + if (!empty($form_state['values']['options']['expose']['optional'])) { + // Who cares what the value is if it's exposed and optional. + return; + } + + $this->validate_valid_time($form['value'], $form_state['values']['options']['operator'], $form_state['values']['options']['value']); + } + + function exposed_validate(&$form, &$form_state) { + if (empty($this->options['exposed'])) { + return; + } + + if (!empty($this->options['expose']['optional'])) { + // Who cares what the value is if it's exposed and optional. + return; + } + + $value = &$form_state['values'][$this->options['expose']['identifier']]; + if (!empty($this->options['expose']['use_operator']) && !empty($this->options['expose']['operator'])) { + $operator = $form_state['values'][$this->options['expose']['operator']]; + } + else { + $operator = $this->operator; + } + + $this->validate_valid_time($this->options['expose']['identifier'], $operator, $value); + + } + + /** + * Validate that the time values convert to something usable. + */ + function validate_valid_time(&$form, $operator, $value) { + $operators = $this->operators(); + + if ($operators[$operator]['values'] == 1) { + $convert = strtotime($value['value']); + if ($convert == -1 || $convert === FALSE) { + form_error($form['value'], t('Invalid date format.')); + } + } + elseif ($operators[$operator]['values'] == 2) { + $min = strtotime($value['min']); + if ($min == -1 || $min === FALSE) { + form_error($form['min'], t('Invalid date format.')); + } + $max = strtotime($value['max']); + if ($max == -1 || $max === FALSE) { + form_error($form['max'], t('Invalid date format.')); + } + } + } + + function accept_exposed_input($input) { + if (empty($this->options['exposed'])) { + return TRUE; + } + + // Store this because it will get overwritten. + $type = $this->value['type']; + $rc = parent::accept_exposed_input($input); + + // Don't filter if value(s) are empty. + $operators = $this->operators(); + if (!empty($this->options['expose']['use_operator']) && !empty($this->options['expose']['operator'])) { + $operator = $input[$this->options['expose']['operator']]; + } + else { + $operator = $this->operator; + } + + if ($operators[$operator]['values'] == 1) { + if ($this->value['value'] == '') { + return FALSE; + } + } + else { + if ($this->value['min'] == '' || $this->value['max'] == '') { + return FALSE; + } + } + + // restore what got overwritten by the parent. + $this->value['type'] = $type; + return $rc; + } + + function op_between($field) { + if ($this->operator == 'between') { + $a = intval(strtotime($this->value['min'], 0)); + $b = intval(strtotime($this->value['max'], 0)); + } + else { + $a = intval(strtotime($this->value['max'], 0)); + $b = intval(strtotime($this->value['min'], 0)); + } + + if ($this->value['type'] == 'offset') { + $a = '***CURRENT_TIME***' . sprintf('%+d', $a); // keep sign + $b = '***CURRENT_TIME***' . sprintf('%+d', $b); // keep sign + } + // %s is safe here because strtotime scrubbed the input and we might + // have a string if using offset. + $this->query->add_where($this->options['group'], "$field >= %s", $a); + $this->query->add_where($this->options['group'], "$field <= %s", $b); + } + + function op_simple($field) { + $value = intval(strtotime($this->value['value'], 0)); + if (!empty($this->value['type']) && $this->value['type'] == 'offset') { + $value = '***CURRENT_TIME***' . sprintf('%+d', $value); // keep sign + } + $this->query->add_where($this->options['group'], "$field $this->operator %s", $value); + } +} diff --git a/handlers/views_handler_filter_equality.inc b/handlers/views_handler_filter_equality.inc new file mode 100644 index 0000000000000000000000000000000000000000..5fc31909d70668e5be7b8d9dcfd1ccad5e8e292f --- /dev/null +++ b/handlers/views_handler_filter_equality.inc @@ -0,0 +1,39 @@ + t('Is equal to'), + '!=' => t('Is not equal to'), + ); + } + + /** + * Provide a simple textfield for equality + */ + function value_form(&$form, &$form_state) { + $form['value'] = array( + '#type' => 'textfield', + '#title' => t('Value'), + '#size' => 30, + '#default_value' => $this->value, + ); + + if (!empty($form_state['exposed'])) { + $identifier = $this->options['expose']['identifier']; + if (!isset($form_state['input'][$identifier])) { + $form_state['input'][$identifier] = $this->value; + } + } + } +} + diff --git a/handlers/views_handler_filter_float.inc b/handlers/views_handler_filter_float.inc new file mode 100644 index 0000000000000000000000000000000000000000..89badd4f67bab7a04909ba60518befb8b43bf0bb --- /dev/null +++ b/handlers/views_handler_filter_float.inc @@ -0,0 +1,23 @@ +operator == 'between') { + $this->query->add_where($this->options['group'], "$field >= %f", $this->value['min']); + $this->query->add_where($this->options['group'], "$field <= %f", $this->value['max']); + } + else { + $this->query->add_where($this->options['group'], "$field <= %f OR $field >= %f", $this->value['min'], $this->value['max']); + } + } + + function op_simple($field) { + $this->query->add_where($this->options['group'], "$field $this->operator %f", $this->value['value']); + } +} diff --git a/handlers/views_handler_filter_in_operator.inc b/handlers/views_handler_filter_in_operator.inc new file mode 100644 index 0000000000000000000000000000000000000000..1dd81f08253f22957472640c37fb833f82600d25 --- /dev/null +++ b/handlers/views_handler_filter_in_operator.inc @@ -0,0 +1,360 @@ +value_title = t('Options'); + $this->value_options = NULL; + } + + /** + * Child classes should be used to override this function and set the + * 'value options', unless 'options callback' is defined as a valid function + * or static public method to generate these values. + * + * This can use a guard to be used to reduce database hits as much as + * possible. + */ + function get_value_options() { + if (isset($this->value_options)) { + return; + } + + if (isset($this->definition['options callback']) && is_callable($this->definition['options callback'])) { + $this->value_options = call_user_func($this->definition['options callback']); + } + else { + $this->value_options = array(t('Yes'), t('No')); + } + } + + function expose_options() { + parent::expose_options(); + $this->options['expose']['reduce'] = FALSE; + } + + function expose_form_right(&$form, &$form_state) { + parent::expose_form_right($form, $form_state); + $form['expose']['reduce'] = array( + '#type' => 'checkbox', + '#title' => t('Limit list to selected items'), + '#description' => t('If checked, the only items presented to the user will be the ones selected here.'), + '#default_value' => !empty($this->options['expose']['reduce']), // safety + ); + } + + function option_definition() { + $options = parent::option_definition(); + + $options['operator']['default'] = 'in'; + $options['value']['default'] = array(); + + return $options; + } + + /** + * This kind of construct makes it relatively easy for a child class + * to add or remove functionality by overriding this function and + * adding/removing items from this array. + */ + function operators() { + $operators = array( + 'in' => array( + 'title' => t('Is one of'), + 'short' => t('in'), + 'short_single' => t('='), + 'method' => 'op_simple', + 'values' => 1, + ), + 'not in' => array( + 'title' => t('Is not one of'), + 'short' => t('not in'), + 'short_single' => t('<>'), + 'method' => 'op_simple', + 'values' => 1, + ), + ); + // if the definition allows for the empty operator, add it. + if (!empty($this->definition['allow empty'])) { + $operators += array( + 'empty' => array( + 'title' => t('Is empty (NULL)'), + 'method' => 'op_empty', + 'short' => t('empty'), + 'values' => 0, + ), + 'not empty' => array( + 'title' => t('Is not empty (NULL)'), + 'method' => 'op_empty', + 'short' => t('not empty'), + 'values' => 0, + ), + ); + } + + return $operators; + } + + /** + * Build strings from the operators() for 'select' options + */ + function operator_options($which = 'title') { + $options = array(); + foreach ($this->operators() as $id => $info) { + $options[$id] = $info[$which]; + } + + return $options; + } + + function operator_values($values = 1) { + $options = array(); + foreach ($this->operators() as $id => $info) { + if (isset($info['values']) && $info['values'] == $values) { + $options[] = $id; + } + } + + return $options; + } + + function value_form(&$form, &$form_state) { + $form['value'] = array(); + + $this->get_value_options(); + $options = $this->value_options; + $default_value = (array) $this->value; + + $which = 'all'; + if (!empty($form['operator'])) { + $source = ($form['operator']['#type'] == 'radios') ? 'radio:options[operator]' : 'edit-options-operator'; + } + if (!empty($form_state['exposed'])) { + $identifier = $this->options['expose']['identifier']; + + if (empty($this->options['expose']['use_operator']) || empty($this->options['expose']['operator'])) { + // exposed and locked. + $which = in_array($this->operator, $this->operator_values(1)) ? 'value' : 'none'; + } + else { + $source = 'edit-' . form_clean_id($this->options['expose']['operator']); + } + + if (!empty($this->options['expose']['reduce'])) { + $options = $this->reduce_value_options(); + + if (empty($this->options['expose']['single']) && !empty($this->options['expose']['optional'])) { + $default_value = array(); + } + } + + if (!empty($this->options['expose']['single'])) { + if (!empty($this->options['expose']['optional']) && (empty($default_value) || !empty($this->options['expose']['reduce']))) { + $default_value = 'All'; + } + else if (empty($default_value)) { + $keys = array_keys($options); + $default_value = array_shift($keys); + } + else { + $copy = $default_value; + $default_value = array_shift($copy); + } + } + } + + if ($which == 'all' || $which == 'value') { + $form['value'] = array( + '#type' => $this->value_form_type, + '#title' => $this->value_title, + '#options' => $options, + '#default_value' => $default_value, + // These are only valid for 'select' type, but do no harm to checkboxes. + '#multiple' => TRUE, + '#size' => count($options) > 8 ? 8 : count($options), + ); + if (!empty($form_state['exposed']) && !isset($form_state['input'][$identifier])) { + $form_state['input'][$identifier] = $default_value; + } + + $process = array(); + if ($this->value_form_type == 'checkboxes') { + // If this form element will use checkboxes in the UI, we need to + // check_plain() all the options ourselves since FAPI is inconsistent + // about this. However, instead of directly doing that to the #options + // right now, we define a #process callback since we might change our + // mind later and convert this into a 'select' form element, which + // would lead to double-escaping the options. + $process[] = 'views_process_check_options'; + } + if ($which == 'all') { + if (empty($form_state['exposed']) && ($this->value_form_type == 'checkboxes' || $this->value_form_type == 'radios')) { + $process[] = "expand_$this->value_form_type"; + $form['value']['#prefix'] = '
'; + $form['value']['#suffix'] = '
'; + } + $process[] = 'views_process_dependency'; + $form['value']['#dependency'] = array($source => $this->operator_values(1)); + } + if (!empty($process)) { + $form['value']['#process'] = $process; + } + } + } + + /** + * When using exposed filters, we may be required to reduce the set. + */ + function reduce_value_options($input = NULL) { + if (!isset($input)) { + $input = $this->value_options; + } + + // Because options may be an array of strings, or an array of mixed arrays + // and strings (optgroups) or an array of objects, we have to + // step through and handle each one individually. + $options = array(); + foreach ($input as $id => $option) { + if (is_array($option)) { + $options[$id] = $this->reduce_value_options($option); + continue; + } + else if (is_object($option)) { + $keys = array_keys($option->option); + $key = array_shift($keys); + if (isset($this->options['value'][$key])) { + $options[$id] = $option; + } + } + else if (isset($this->options['value'][$id])) { + $options[$id] = $option; + } + } + return $options; + } + + function accept_exposed_input($input) { + // A very special override because the All state for this type of + // filter could have a default: + if (empty($this->options['exposed'])) { + return TRUE; + } + + // If this is single and optional, this says that yes this filter will + // participate, but using the default settings, *if* 'limit is true. + if (!empty($this->options['expose']['single']) && !empty($this->options['expose']['optional']) && !empty($this->options['expose']['limit'])) { + $identifier = $this->options['expose']['identifier']; + if ($input[$identifier] == 'All') { + return TRUE; + } + } + + return parent::accept_exposed_input($input); + } + + function value_submit($form, &$form_state) { + // Drupal's FAPI system automatically puts '0' in for any checkbox that + // was not set, and the key to the checkbox if it is set. + // Unfortunately, this means that if the key to that checkbox is 0, + // we are unable to tell if that checkbox was set or not. + + // Luckily, the '#value' on the checkboxes form actually contains + // *only* a list of checkboxes that were set, and we can use that + // instead. + + $form_state['values']['options']['value'] = $form['value']['#value']; +// $form_state['values']['options']['value'] = array_filter($form_state['values']['options']['value']); + } + + function admin_summary() { + if (!empty($this->options['exposed'])) { + return t('exposed'); + } + $info = $this->operators(); + + $this->get_value_options(); + + if (!is_array($this->value)) { + return; + } + + $operator = check_plain($info[$this->operator]['short']); + $values = ''; + if (in_array($this->operator, $this->operator_values(1))) { + if (count($this->value) == 1) { + // If any, use the 'single' short name of the operator instead. + if (isset($info[$this->operator]['short_single'])) { + $operator = check_plain($info[$this->operator]['short_single']); + } + + $keys = $this->value; + $key = array_shift($keys); + if (isset($this->value_options[$key])) { + $values = check_plain($this->value_options[$key]); + } + else { + $values = t('Unknown'); + } + } + else { + foreach ($this->value as $value) { + if ($values !== '') { + $values .= ', '; + } + if (strlen($values) > 8) { + $values .= '...'; + break; + } + $values .= check_plain($this->value_options[$value]); + } + } + } + + return $operator . (($values !== '') ? ' ' . $values : ''); + } + + function query() { + $info = $this->operators(); + if (!empty($info[$this->operator]['method'])) { + $this->{$info[$this->operator]['method']}(); + } + } + + function op_simple() { + if (empty($this->value)) { + return; + } + $this->ensure_my_table(); + $placeholder = !empty($this->definition['numeric']) ? '%d' : "'%s'"; + + $replace = array_fill(0, sizeof($this->value), $placeholder); + $in = ' (' . implode(", ", $replace) . ')'; + + // We use array_values() because the checkboxes keep keys and that can cause + // array addition problems. + $this->query->add_where($this->options['group'], "$this->table_alias.$this->real_field " . $this->operator . $in, array_values($this->value)); + } + + function op_empty() { + $this->ensure_my_table(); + $field = "$this->table_alias.$this->real_field"; + + if ($this->operator == 'empty') { + $operator = "IS NULL"; + } + else { + $operator = "IS NOT NULL"; + } + + $this->query->add_where($this->options['group'], "$field $operator"); + } +} diff --git a/handlers/views_handler_filter_many_to_one.inc b/handlers/views_handler_filter_many_to_one.inc new file mode 100644 index 0000000000000000000000000000000000000000..68ed4bf79b26b57861fbbe618d07f2f9265d007d --- /dev/null +++ b/handlers/views_handler_filter_many_to_one.inc @@ -0,0 +1,104 @@ +helper = new views_many_to_one_helper($this); + } + + function option_definition() { + $options = parent::option_definition(); + + $options['operator']['default'] = 'or'; + $options['value']['default'] = array(); + + return $options; + } + + function operators() { + $operators = array( + 'or' => array( + 'title' => t('Is one of'), + 'short' => t('or'), + 'short_single' => t('='), + 'method' => 'op_helper', + 'values' => 1, + 'ensure_my_table' => 'helper', + ), + 'and' => array( + 'title' => t('Is all of'), + 'short' => t('and'), + 'short_single' => t('='), + 'method' => 'op_helper', + 'values' => 1, + 'ensure_my_table' => 'helper', + ), + 'not' => array( + 'title' => t('Is none of'), + 'short' => t('not'), + 'short_single' => t('<>'), + 'method' => 'op_helper', + 'values' => 1, + 'ensure_my_table' => 'helper', + ), + ); + // if the definition allows for the empty operator, add it. + if (!empty($this->definition['allow empty'])) { + $operators += array( + 'empty' => array( + 'title' => t('Is empty (NULL)'), + 'method' => 'op_empty', + 'short' => t('empty'), + 'values' => 0, + ), + 'not empty' => array( + 'title' => t('Is not empty (NULL)'), + 'method' => 'op_empty', + 'short' => t('not empty'), + 'values' => 0, + ), + ); + } + + return $operators; + } + + var $value_form_type = 'select'; + function value_form(&$form, &$form_state) { + parent::value_form($form, $form_state); + + if (empty($form_state['exposed'])) { + $this->helper->options_form($form, $form_state); + } + } + + /** + * Override ensure_my_table so we can control how this joins in. + * The operator actually has influence over joining. + */ + function ensure_my_table() { + // Defer to helper if the operator specifies it. + $info = $this->operators(); + if (isset($info[$this->operator]['ensure_my_table']) && $info[$this->operator]['ensure_my_table'] == 'helper') { + return $this->helper->ensure_my_table(); + } + + return parent::ensure_my_table(); + } + + function op_helper() { + if (empty($this->value)) { + return; + } + $this->helper->add_filter(); + } +} diff --git a/handlers/views_handler_filter_numeric.inc b/handlers/views_handler_filter_numeric.inc new file mode 100644 index 0000000000000000000000000000000000000000..789cb4c9bbfc8183f28d607567042b076ea831a4 --- /dev/null +++ b/handlers/views_handler_filter_numeric.inc @@ -0,0 +1,303 @@ + array( + 'min' => array('default' => ''), + 'max' => array('default' => ''), + 'value' => array('default' => ''), + ), + ); + + return $options; + } + + function operators() { + $operators = array( + '<' => array( + 'title' => t('Is less than'), + 'method' => 'op_simple', + 'short' => t('<'), + 'values' => 1, + ), + '<=' => array( + 'title' => t('Is less than or equal to'), + 'method' => 'op_simple', + 'short' => t('<='), + 'values' => 1, + ), + '=' => array( + 'title' => t('Is equal to'), + 'method' => 'op_simple', + 'short' => t('='), + 'values' => 1, + ), + '!=' => array( + 'title' => t('Is not equal to'), + 'method' => 'op_simple', + 'short' => t('!='), + 'values' => 1, + ), + '>=' => array( + 'title' => t('Is greater than or equal to'), + 'method' => 'op_simple', + 'short' => t('>='), + 'values' => 1, + ), + '>' => array( + 'title' => t('Is greater than'), + 'method' => 'op_simple', + 'short' => t('>'), + 'values' => 1, + ), + 'between' => array( + 'title' => t('Is between'), + 'method' => 'op_between', + 'short' => t('between'), + 'values' => 2, + ), + 'not between' => array( + 'title' => t('Is not between'), + 'method' => 'op_between', + 'short' => t('not between'), + 'values' => 2, + ), + ); + + // if the definition allows for the empty operator, add it. + if (!empty($this->definition['allow empty'])) { + $operators += array( + 'empty' => array( + 'title' => t('Is empty (NULL)'), + 'method' => 'op_empty', + 'short' => t('empty'), + 'values' => 0, + ), + 'not empty' => array( + 'title' => t('Is not empty (NULL)'), + 'method' => 'op_empty', + 'short' => t('not empty'), + 'values' => 0, + ), + ); + } + + return $operators; + } + + /** + * Provide a list of all the numeric operators + */ + function operator_options($which = 'title') { + $options = array(); + foreach ($this->operators() as $id => $info) { + $options[$id] = $info[$which]; + } + + return $options; + } + + function operator_values($values = 1) { + $options = array(); + foreach ($this->operators() as $id => $info) { + if ($info['values'] == $values) { + $options[] = $id; + } + } + + return $options; + } + /** + * Provide a simple textfield for equality + */ + function value_form(&$form, &$form_state) { + $form['value']['#tree'] = TRUE; + + // We have to make some choices when creating this as an exposed + // filter form. For example, if the operator is locked and thus + // not rendered, we can't render dependencies; instead we only + // render the form items we need. + $which = 'all'; + if (!empty($form['operator'])) { + $source = ($form['operator']['#type'] == 'radios') ? 'radio:options[operator]' : 'edit-options-operator'; + } + + if (!empty($form_state['exposed'])) { + $identifier = $this->options['expose']['identifier']; + + if (empty($this->options['expose']['use_operator']) || empty($this->options['expose']['operator'])) { + // exposed and locked. + $which = in_array($this->operator, $this->operator_values(2)) ? 'minmax' : 'value'; + } + else { + $source = 'edit-' . form_clean_id($this->options['expose']['operator']); + } + } + + if ($which == 'all') { + $form['value']['value'] = array( + '#type' => 'textfield', + '#title' => empty($form_state['exposed']) ? t('Value') : '', + '#size' => 30, + '#default_value' => $this->value['value'], + '#process' => array('views_process_dependency'), + '#dependency' => array($source => $this->operator_values(1)), + ); + if (!empty($form_state['exposed']) && !isset($form_state['input'][$identifier]['value'])) { + $form_state['input'][$identifier]['value'] = $this->value['value']; + } + } + else if ($which == 'value') { + // When exposed we drop the value-value and just do value if + // the operator is locked. + $form['value'] = array( + '#type' => 'textfield', + '#title' => empty($form_state['exposed']) ? t('Value') : '', + '#size' => 30, + '#default_value' => $this->value['value'], + ); + if (!empty($form_state['exposed']) && !isset($form_state['input'][$identifier])) { + $form_state['input'][$identifier] = $this->value['value']; + } + } + + if ($which == 'all' || $which == 'minmax') { + $form['value']['min'] = array( + '#type' => 'textfield', + '#title' => empty($form_state['exposed']) ? t('Min') : '', + '#size' => 30, + '#default_value' => $this->value['min'], + ); + $form['value']['max'] = array( + '#type' => 'textfield', + '#title' => empty($form_state['exposed']) ? t('And max') : t('And'), + '#size' => 30, + '#default_value' => $this->value['max'], + ); + if ($which == 'all') { + $dependency = array( + '#process' => array('views_process_dependency'), + '#dependency' => array($source => $this->operator_values(2)), + ); + $form['value']['min'] += $dependency; + $form['value']['max'] += $dependency; + } + if (!empty($form_state['exposed']) && !isset($form_state['input'][$identifier]['min'])) { + $form_state['input'][$identifier]['min'] = $this->value['min']; + } + if (!empty($form_state['exposed']) && !isset($form_state['input'][$identifier]['max'])) { + $form_state['input'][$identifier]['max'] = $this->value['max']; + } + + if (!isset($form['value'])) { + // Ensure there is something in the 'value'. + $form['value'] = array( + '#type' => 'value', + '#value' => NULL + ); + } + } + } + + function query() { + $this->ensure_my_table(); + $field = "$this->table_alias.$this->real_field"; + + $info = $this->operators(); + if (!empty($info[$this->operator]['method'])) { + $this->{$info[$this->operator]['method']}($field); + } + } + + function op_between($field) { + if ($this->operator == 'between') { + $this->query->add_where($this->options['group'], "$field >= %d", $this->value['min']); + $this->query->add_where($this->options['group'], "$field <= %d", $this->value['max']); + } + else { + $this->query->add_where($this->options['group'], "$field <= %d OR $field >= %d", $this->value['min'], $this->value['max']); + } + } + + function op_simple($field) { + $this->query->add_where($this->options['group'], "$field $this->operator %d", $this->value['value']); + } + + function op_empty($field) { + if ($this->operator == 'empty') { + $operator = "IS NULL"; + } + else { + $operator = "IS NOT NULL"; + } + + $this->query->add_where($this->options['group'], "$field $operator"); + } + + function admin_summary() { + if (!empty($this->options['exposed'])) { + return t('exposed'); + } + + $options = $this->operator_options('short'); + $output = check_plain($options[$this->operator]); + if (in_array($this->operator, $this->operator_values(2))) { + $output .= ' ' . t('@min and @max', array('@min' => $this->value['min'], '@max' => $this->value['max'])); + } + elseif (in_array($this->operator, $this->operator_values(1))) { + $output .= ' ' . check_plain($this->value['value']); + } + return $output; + } + + /** + * Do some minor translation of the exposed input + */ + function accept_exposed_input($input) { + if (empty($this->options['exposed'])) { + return TRUE; + } + + // rewrite the input value so that it's in the correct format so that + // the parent gets the right data. + if (!empty($this->options['expose']['identifier'])) { + $value = &$input[$this->options['expose']['identifier']]; + if (!is_array($value)) { + $value = array( + 'value' => $value, + ); + } + } + + $rc = parent::accept_exposed_input($input); + + if (!empty($this->options['expose']['optional'])) { + // We have to do some of our own optional checking. + $info = $this->operators(); + if (!empty($info[$this->operator]['values'])) { + switch ($info[$this->operator]['values']) { + case 1: + if ($value['value'] === '') { + return FALSE; + } + break; + case 2: + if ($value['min'] === '' && $value['max'] === '') { + return FALSE; + } + break; + } + } + } + + return $rc; + } +} diff --git a/handlers/views_handler_filter_string.inc b/handlers/views_handler_filter_string.inc new file mode 100644 index 0000000000000000000000000000000000000000..f5e14a04fffc53c2a6a7282cccede8f3020ef6f7 --- /dev/null +++ b/handlers/views_handler_filter_string.inc @@ -0,0 +1,303 @@ + TRUE); + + return $options; + } + + /** + * This kind of construct makes it relatively easy for a child class + * to add or remove functionality by overriding this function and + * adding/removing items from this array. + */ + function operators() { + $operators = array( + '=' => array( + 'title' => t('Is equal to'), + 'short' => t('='), + 'method' => 'op_equal', + 'values' => 1, + ), + '!=' => array( + 'title' => t('Is not equal to'), + 'short' => t('!='), + 'method' => 'op_equal', + 'values' => 1, + ), + 'contains' => array( + 'title' => t('Contains'), + 'short' => t('contains'), + 'method' => 'op_contains', + 'values' => 1, + ), + 'word' => array( + 'title' => t('Contains any word'), + 'short' => t('has word'), + 'method' => 'op_word', + 'values' => 1, + ), + 'allwords' => array( + 'title' => t('Contains all words'), + 'short' => t('has all'), + 'method' => 'op_word', + 'values' => 1, + ), + 'starts' => array( + 'title' => t('Starts with'), + 'short' => t('begins'), + 'method' => 'op_starts', + 'values' => 1, + ), + 'not_starts' => array( + 'title' => t('Does not start with'), + 'short' => t('not_begins'), + 'method' => 'op_not_starts', + 'values' => 1, + ), + 'ends' => array( + 'title' => t('Ends with'), + 'short' => t('ends'), + 'method' => 'op_ends', + 'values' => 1, + ), + 'not_ends' => array( + 'title' => t('Does not end with'), + 'short' => t('not_ends'), + 'method' => 'op_not_ends', + 'values' => 1, + ), + 'not' => array( + 'title' => t('Does not contain'), + 'short' => t('!has'), + 'method' => 'op_not', + 'values' => 1, + ), + ); + // if the definition allows for the empty operator, add it. + if (!empty($this->definition['allow empty'])) { + $operators += array( + 'empty' => array( + 'title' => t('Is empty (NULL)'), + 'method' => 'op_empty', + 'short' => t('empty'), + 'values' => 0, + ), + 'not empty' => array( + 'title' => t('Is not empty (NULL)'), + 'method' => 'op_empty', + 'short' => t('not empty'), + 'values' => 0, + ), + ); + } + + return $operators; + } + + /** + * Build strings from the operators() for 'select' options + */ + function operator_options($which = 'title') { + $options = array(); + foreach ($this->operators() as $id => $info) { + $options[$id] = $info[$which]; + } + + return $options; + } + + function admin_summary() { + if (!empty($this->options['exposed'])) { + return t('exposed'); + } + + $options = $this->operator_options('short'); + $output = check_plain($options[$this->operator]); + if (in_array($this->operator, $this->operator_values(1))) { + $output .= ' ' . check_plain($this->value); + } + return $output; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['case'] = array( + '#type' => 'checkbox', + '#title' => t('Case sensitive'), + '#default_value' => $this->options['case'], + '#description' => t('Case sensitive filters may be faster. MySQL might ignore case sensitivity.'), + ); + } + + function operator_values($values = 1) { + $options = array(); + foreach ($this->operators() as $id => $info) { + if (isset($info['values']) && $info['values'] == $values) { + $options[] = $id; + } + } + + return $options; + } + + /** + * Provide a simple textfield for equality + */ + function value_form(&$form, &$form_state) { + // We have to make some choices when creating this as an exposed + // filter form. For example, if the operator is locked and thus + // not rendered, we can't render dependencies; instead we only + // render the form items we need. + $which = 'all'; + if (!empty($form['operator'])) { + $source = ($form['operator']['#type'] == 'radios') ? 'radio:options[operator]' : 'edit-options-operator'; + } + if (!empty($form_state['exposed'])) { + $identifier = $this->options['expose']['identifier']; + + if (empty($this->options['expose']['use_operator']) || empty($this->options['expose']['operator'])) { + // exposed and locked. + $which = in_array($this->operator, $this->operator_values(1)) ? 'value' : 'none'; + } + else { + $source = 'edit-' . form_clean_id($this->options['expose']['operator']); + } + } + + if ($which == 'all' || $which == 'value') { + $form['value'] = array( + '#type' => 'textfield', + '#title' => t('Value'), + '#size' => 30, + '#default_value' => $this->value, + ); + if (!empty($form_state['exposed']) && !isset($form_state['input'][$identifier])) { + $form_state['input'][$identifier] = $this->value; + } + + if ($which == 'all') { + $form['value'] += array( + '#process' => array('views_process_dependency'), + '#dependency' => array($source => $this->operator_values(1)), + ); + } + } + + if (!isset($form['value'])) { + // Ensure there is something in the 'value'. + $form['value'] = array( + '#type' => 'value', + '#value' => NULL + ); + } + } + + function case_transform() { + return !empty($this->options['case']) ? '' : 'UPPER'; + } + + /** + * Add this filter to the query. + * + * Due to the nature of fapi, the value and the operator have an unintended + * level of indirection. You will find them in $this->operator + * and $this->value respectively. + */ + function query() { + $this->ensure_my_table(); + $field = "$this->table_alias.$this->real_field"; + $upper = $this->case_transform(); + + $info = $this->operators(); + if (!empty($info[$this->operator]['method'])) { + $this->{$info[$this->operator]['method']}($field, $upper); + } + } + + function op_equal($field, $upper) { + // operator is either = or != + $this->query->add_where($this->options['group'], "$upper(%s) $this->operator $upper('%s')", $field, $this->value); + } + + function op_contains($field, $upper) { + $this->query->add_where($this->options['group'], "$upper(%s) LIKE $upper('%%%s%%')", $field, $this->value); + } + + function op_word($field, $upper) { + $where = array(); + preg_match_all('/ (-?)("[^"]+"|[^" ]+)/i', ' ' . $this->value, $matches, PREG_SET_ORDER); + foreach ($matches as $match) { + $phrase = false; + // Strip off phrase quotes + if ($match[2]{0} == '"') { + $match[2] = substr($match[2], 1, -1); + $phrase = true; + } + $words = trim($match[2], ',?!();:-'); + $words = $phrase ? array($words) : preg_split('/ /', $words, -1, PREG_SPLIT_NO_EMPTY); + foreach ($words as $word) { + $where[] = "$upper(%s) LIKE $upper('%%%s%%')"; + $values[] = $field; + $values[] = trim($word, " ,!?"); + } + } + + if (!$where) { + return; + } + + if ($this->operator == 'word') { + $where = '(' . implode(' OR ', $where) . ')'; + } + else { + $where = implode(' AND ', $where); + } + // previously this was a call_user_func_array but that's unnecessary + // as views will unpack an array that is a single arg. + $this->query->add_where($this->options['group'], $where, $values); + } + + function op_starts($field, $upper) { + $this->query->add_where($this->options['group'], "$upper(%s) LIKE $upper('%s%%')", $field, $this->value); + } + + function op_not_starts($field, $upper) { + $this->query->add_where($this->options['group'], "$upper(%s) NOT LIKE $upper('%s%%')", $field, $this->value); + } + + function op_ends($field, $upper) { + $this->query->add_where($this->options['group'], "$upper(%s) LIKE $upper('%%%s')", $field, $this->value); + } + + function op_not_ends($field, $upper) { + $this->query->add_where($this->options['group'], "$upper(%s) NOT LIKE $upper('%%%s')", $field, $this->value); + } + + function op_not($field, $upper) { + $this->query->add_where($this->options['group'], "$upper(%s) NOT LIKE $upper('%%%s%%')", $field, $this->value); + } + + function op_empty($field) { + if ($this->operator == 'empty') { + $operator = "IS NULL"; + } + else { + $operator = "IS NOT NULL"; + } + + $this->query->add_where($this->options['group'], "$field $operator"); + } + +} diff --git a/handlers/views_handler_relationship.inc b/handlers/views_handler_relationship.inc new file mode 100644 index 0000000000000000000000000000000000000000..c0d880dfd063990ec199462817fd734088b6b6af --- /dev/null +++ b/handlers/views_handler_relationship.inc @@ -0,0 +1,153 @@ +definition['relationship table'])) { + $this->table = $this->definition['relationship table']; + } + if (isset($this->definition['relationship field'])) { + $this->field = $this->definition['relationship field']; + } + } + + /** + * Get this field's label. + */ + function label() { + if (!isset($this->options['label'])) { + return $this->ui_name(); + } + return $this->options['label']; + } + + function option_definition() { + $options = parent::option_definition(); + + $label = !empty($this->definition['label']) ? $this->definition['label'] : $this->definition['field']; + $options['label'] = array('default' => $label, 'translatable' => TRUE); + $options['required'] = array('default' => FALSE); + + return $options; + } + + /** + * Default options form that provides the label widget that all fields + * should have. + */ + function options_form(&$form, &$form_state) { + $form['label'] = array( + '#type' => 'textfield', + '#title' => t('Label'), + '#default_value' => isset($this->options['label']) ? $this->options['label'] : '', + '#description' => t('The label for this relationship that will be displayed only administratively.'), + ); + + $form['required'] = array( + '#type' => 'checkbox', + '#title' => t('Require this relationship'), + '#description' => t('If required, items that do not contain this relationship will not appear.'), + '#default_value' => !empty($this->options['required']), + ); + } + + /** + * Called to implement a relationship in a query. + */ + function query() { + // Figure out what base table this relationship brings to the party. + $table_data = views_fetch_data($this->definition['base']); + $base_field = empty($this->definition['base field']) ? $table_data['table']['base']['field'] : $this->definition['base field']; + + $this->ensure_my_table(); + + $def = $this->definition; + $def['table'] = $this->definition['base']; + $def['field'] = $base_field; + $def['left_table'] = $this->table_alias; + $def['left_field'] = $this->field; + if (!empty($this->options['required'])) { + $def['type'] = 'INNER'; + } + + if (!empty($def['join_handler']) && class_exists($def['join_handler'])) { + $join = new $def['join_handler']; + } + else { + $join = new views_join(); + } + + $join->definition = $def; + $join->construct(); + $join->adjusted = TRUE; + + // use a short alias for this: + $alias = $def['table'] . '_' . $this->table; + + $this->alias = $this->query->add_relationship($alias, $join, $this->definition['base'], $this->relationship); + } +} + +/** + * A special handler to take the place of missing or broken handlers. + */ +class views_handler_relationship_broken extends views_handler_relationship { + function ui_name($short = FALSE) { + return t('Broken/missing handler'); + } + + function ensure_my_table() { /* No table to ensure! */ } + function query() { /* No query to run */ } + function options_form(&$form, &$form_state) { + $form['markup'] = array( + '#prefix' => '
', + '#value' => t('The handler for this item is broken or missing and cannot be used. If a module provided the handler and was disabled, re-enabling the module may restore it. Otherwise, you should probably delete this item.'), + ); + } + + /** + * Determine if the handler is considered 'broken' + */ + function broken() { return TRUE; } +} + +/** + * @} + */ diff --git a/handlers/views_handler_sort.inc b/handlers/views_handler_sort.inc new file mode 100644 index 0000000000000000000000000000000000000000..74d67ee56d1f67279c4e00e87653761f97e4a733 --- /dev/null +++ b/handlers/views_handler_sort.inc @@ -0,0 +1,87 @@ +ensure_my_table(); + // Add the field. + $this->query->add_orderby($this->table_alias, $this->real_field, $this->options['order']); + } + + function option_definition() { + $options = parent::option_definition(); + + $options['order'] = array('default' => 'ASC'); + + return $options; + } + + /** + * Display whether or not the sort order is ascending or descending + */ + function admin_summary() { + switch ($this->options['order']) { + case 'ASC': + case 'asc': + default: + $type = t('asc'); + break; + case 'DESC'; + case 'desc'; + $type = t('desc'); + break; + } + return '' . $type . ''; + } + + /** + * Basic options for all sort criteria + */ + function options_form(&$form, &$form_state) { + $form['order'] = array( + '#type' => 'radios', + '#title' => t('Sort order'), + '#options' => array('ASC' => t('Ascending'), 'DESC' => t('Descending')), + '#default_value' => $this->options['order'], + ); + } +} + +/** + * A special handler to take the place of missing or broken handlers. + */ +class views_handler_sort_broken extends views_handler_sort { + function ui_name($short = FALSE) { + return t('Broken/missing handler'); + } + + function ensure_my_table() { /* No table to ensure! */ } + function query() { /* No query to run */ } + function options_form(&$form, &$form_state) { + $form['markup'] = array( + '#prefix' => '
', + '#value' => t('The handler for this item is broken or missing and cannot be used. If a module provided the handler and was disabled, re-enabling the module may restore it. Otherwise, you should probably delete this item.'), + ); + } + + /** + * Determine if the handler is considered 'broken' + */ + function broken() { return TRUE; } +} + + +/** + * @} + */ diff --git a/handlers/views_handler_sort_date.inc b/handlers/views_handler_sort_date.inc new file mode 100644 index 0000000000000000000000000000000000000000..2944e0a41224b7c985a5094f7a67557f5db1e088 --- /dev/null +++ b/handlers/views_handler_sort_date.inc @@ -0,0 +1,70 @@ + 'second'); + + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + + $form['granularity'] = array( + '#type' => 'radios', + '#title' => t('Granularity'), + '#options' => array( + 'second' => t('Second'), + 'minute' => t('Minute'), + 'hour' => t('Hour'), + 'day' => t('Day'), + 'month' => t('Month'), + 'year' => t('Year'), + ), + '#description' => t('The granularity is the smallest unit to use when determining whether two dates are the same; for example, if the granularity is "Year" then all dates in 1999, regardless of when they fall in 1999, will be considered the same date.'), + '#default_value' => $this->options['granularity'], + ); + } + + /** + * Called to add the sort to a query. + */ + function query() { + $this->ensure_my_table(); + switch ($this->options['granularity']) { + case 'second': + default: + $this->query->add_orderby($this->table_alias, $this->real_field, $this->options['order']); + return; + case 'minute': + $formula = views_date_sql_format('YmdHi', "$this->table_alias.$this->real_field"); + break; + case 'hour': + $formula = views_date_sql_format('YmdH', "$this->table_alias.$this->real_field"); + break; + case 'day': + $formula = views_date_sql_format('Ymd', "$this->table_alias.$this->real_field"); + break; + case 'month': + $formula = views_date_sql_format('Ym', "$this->table_alias.$this->real_field"); + break; + case 'year': + $formula = views_date_sql_format('Y', "$this->table_alias.$this->real_field"); + break; + } + + // Add the field. + $this->query->add_orderby(NULL, $formula, $this->options['order'], $this->table_alias . '_' . $this->field . '_' . $this->options['granularity']); + } +} diff --git a/handlers/views_handler_sort_formula.inc b/handlers/views_handler_sort_formula.inc new file mode 100644 index 0000000000000000000000000000000000000000..c1ceab2e55e7fd64ffac356cf6f816b5a1fb8026 --- /dev/null +++ b/handlers/views_handler_sort_formula.inc @@ -0,0 +1,48 @@ +formula = $this->definition['formula']; + if (is_array($this->formula) && !isset($this->formula['default'])) { + $this->error = t('views_handler_sort_formula missing default: @formula', array('@formula' => var_export($this->formula, TRUE))); + } + parent::construct(); + } + /** + * Called to add the sort to a query. + */ + function query() { + if (is_array($this->formula)) { + global $db_type; + if (isset($this->formula[$db_type])) { + $formula = $this->formula[$db_type]; + } + else { + $formula = $this->formula['default']; + } + } + else { + $formula = $this->formula; + } + $this->ensure_my_table(); + // Add the field. + $this->query->add_orderby(NULL, $formula, $this->options['order'], $this->table_alias . '_' . $this->field); + } +} diff --git a/handlers/views_handler_sort_menu_hierarchy.inc b/handlers/views_handler_sort_menu_hierarchy.inc new file mode 100644 index 0000000000000000000000000000000000000000..c143a3ada2461af6911829ae2974531786f9a7f3 --- /dev/null +++ b/handlers/views_handler_sort_menu_hierarchy.inc @@ -0,0 +1,20 @@ +ensure_my_table(); + $max_depth = isset($this->definition['max depth']) ? $this->definition['max depth'] : MENU_MAX_DEPTH; + for ($i = 1; $i <= $max_depth; ++$i) { + $this->query->add_orderby($this->table_alias, $this->field . $i, $this->options['order']); + } + } +} diff --git a/handlers/views_handler_sort_random.inc b/handlers/views_handler_sort_random.inc new file mode 100644 index 0000000000000000000000000000000000000000..06913a1a359513e8e2c21b44c28177b4854a6c34 --- /dev/null +++ b/handlers/views_handler_sort_random.inc @@ -0,0 +1,28 @@ +query->add_orderby(NULL, $formula, $this->options['order'], '_' . $this->field); + } + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['order']['#access'] = FALSE; + } +} diff --git a/help/about.html b/help/about.html new file mode 100644 index 0000000000000000000000000000000000000000..47afa0c712259f22669f2917f00f23a7583ec481 --- /dev/null +++ b/help/about.html @@ -0,0 +1,18 @@ + +The views module allows administrators and site designers to create, manage, and display lists of content. Each list managed by the views module is known as a "view", and the output of a view is known as a "display". Displays are provided in either block or page form, and a single view may have multiple displays. Optional navigation aids, including a system path and menu item, can be set for each page-based display of a view. By default, views may be created that list content (a Node view type), content revisions (a Node revisions view type) or users (a User view type). A view may be restricted to members of specific user roles, and may be added, edited or deleted at the views administration page + +The "building block" design of the views system provides power and flexibility, allowing parameters to be specified only when needed. While an advanced view may use all of available parameters to create complex and highly interactive applications, a simple content listing may specify only a few options. All views rely on a conceptual framework that includes: + +
    +
  • Fields, or the individual pieces of data being displayed. Adding the fields Node: Title, Node: Type, and Node: Post date to a node view, for example, includes the title, content type and creation date in the displayed results
  • + +
  • Relationships, or information about how data elements relate to one another. If relationship data is available, like that provided by a CCK nodereference field, items from a related node may be included in the view
  • + +
  • Arguments, or additional parameters that dynamically refine the view results, passed as part of the path. Adding an argument of Node: Type to a node view with a path of "content", for example, dynamically filters the displayed items by content type. In this example (shown with Clean URLs enabled), accessing the view through the path "http://www.example.com/content/page" displays all posts of the type "page", the path "http://www.example.com/content/story" displays all posts of the type "story", and "http://www.example.com/content" displays all posts regardless of type)
  • + +
  • Sort criteria, which determine the order of items displayed in the view results. Adding the sort criteria Node: Post date (in descending order) to a node view, for example, sorts the displayed posts in descending order by creation date
  • + +
  • Filters, which limit items displayed in the results. Adding the filter Node: Published (and setting it equal to "Published") to a node view, for example, prevents unpublished items from being displayed
  • + +
  • Displays, which control where the output will be seen. Every view has a default display, which doesn't actually display the view anywhere, but is used to hold the default settings for the view, and is used when the view is called programmatically if another display is not specified. Much more useful to users are the page display, which gives a view a path and allows it to be the primary content of a page, or the block display which allows it to appear as secondary content on other pages.
  • +
diff --git a/help/analyze-theme.html b/help/analyze-theme.html new file mode 100644 index 0000000000000000000000000000000000000000..ea55a410c2fe9a6d5eca1ad069e10dd54c76c901 --- /dev/null +++ b/help/analyze-theme.html @@ -0,0 +1,24 @@ + +

You may use any of the following possible theme files to modify individual parts of your view. In total, there are four parts to theming a view.

+
    +
  • The display theme is usually views-view.tpl.php and it largely controls the decorations around a view; where the header, footer, pager, more link, feed icon, etc, will be placed.
  • + +
  • The style will control how all of the results of the display are put together. It may be as simple as just displaying all of the rows, or it may be a complex table generator or something in between.
  • + +
  • The row style controls each individual row; not all styles utilize the row style (notably the table), but most others do. + +
  • Finally, field themes allow you to override the look and even the data of each individual field, if the style uses fields. The actual template the system will use should be hilighted in bold.
  • +
+ +
+ +A breakdown of View output +
+ +

The link to the left of each type will give you information about the default template used for that type. You may cut and paste this and place it in your theme with the appropriate template, or you may copy the base file from the views/theme directory (or, if provided by a module, from the module's directory). It is important that you clear the theme registry cache every time you add a new template, or the new template will not be picked up.

+ +

Important note: You place your custom template files in your theme directory, not views/theme. This is always true of theming with Drupal. + +

In addition to this tool, the very useful devel module contains a tool called the "Theme developer" which does a good job of visually showing you which areas of your site use which themes. Be careful with it, though, as the theme developer causes the Views edit page to break.

+ +

Also, this feature will only work properly with Drupal 6.3 and later; prior to Drupal 6.3 this patch will be required.

diff --git a/help/api-default-views.html b/help/api-default-views.html new file mode 100644 index 0000000000000000000000000000000000000000..bf39c06845b5c68a029b5e73149d8a421edcd468 --- /dev/null +++ b/help/api-default-views.html @@ -0,0 +1,102 @@ + +Views can be stored in the database, which is typical of smaller sites and hobby sites. However, Views may also be stored directly in the code as "default" views, (which simply means they're available by default). Modules often come with views that are specific to the module data, but it's also possible -- and highly recommended -- that sites which have separate "development" and "production" sites export their views into default views in a site-specific module. This makes it very easy to transfer views from dev to production without making database changes. + +

Creating a module

+First, create a directory in sites/all/modules for your new module. Call it whatever you like, but for this example we will call it mymodule. + +In this directory, create a mymodule.module file. It can be empty for now, but it should at least contain an opening PHP tag: +
<?php
+// $Id $
+
+ +It should not contain a closing ?> tag, as the closing ?> tag is not required and anything AFTER the closing tag, such as a space or a linefeed, will be displayed directly to the browser and can potentially cause problems. + +The .module file will contain functions and drupal hooks. Hooks are specially named functions that Drupal will call in order to get your module's response at certain times while generating pages. The only function you will need for this exercise is the 'views_api' hook that tells Views that this module supports the Views API and what version: + +
function mymodule_views_api() {
+  return array('api' => 2.0);
+}
+
+ +For other uses you may well add additional functions. + +Second, you need to create a mymodule.info file: + +
; $Id $
+name = My module
+description = My site specific module.
+core = 6.x
+
+ +Once you have these two files set up, you should be able to activate your new module at the Administer >> Site building >> Modules page. +

Exporting your views

+ +The easiest way to do this is to activate the 'views_export' module, and navigate to Administer >> Views >> Tools >> Bulk export Place a check next to each view that you want in your module, type the module name into the text field, and click export. This will create the entire hook_views_default_views() function for you. + +You can also export individual views. If you do this, keep in mind that this export does not include the line that adds the exported $view into the larger $views array: + +
$views[$view->name] = $view
+ +To place this into your hook_views_default_views() you will need to place that after the view, and make sure the function returns $views at the end. + +

Placing your exported views into your module

+Cut and paste the entire output of the bulk export tool into mymodule.views_default.inc -- and be sure to put a <?php at the top of the file so that the webserver knows that it's PHP code! Then visit the Views tools page and clear the Views cache. Your views should now be listed as Overridden on the view list page. If you revert these views, they will be removed from the database, but will remain in code. + +

Theming your views in your module

+You can theme these views in the module and not need to rely on the theme to do this at all; and in fact, the theme can continue to override these just like it ordinarily would, even if your module provides a theme. This is very useful for distributing a module where the view needs to look "just so." + +To do this, you need to implement hook_theme() in your module: +
function mymodule_theme($existing) {
+  return array(
+    'views_view__viewname_displayid' => array (
+      'arguments' => array('view' => NULL),
+      'template' => 'views-view--viewname--displayid',
+      'original hook' => 'views_view',
+    ),
+  );
+}
+
+ +There are a small number of gotchas in doing this that you must be aware of. + +
    +
  1. When referring to a template filename, you always use dashes in the name. i.e, views-view--viewname--displayid.tpl.php. However, when referring to the hook or function names, you use underscores instead of dashes. i.e, views_view and views_view__viewname_displayid
  2. + +
  3. The 'arguments' change based upon which of the 3 types you're overriding. There's the 'display', the 'style' and the 'row' style. The above code is assuming the display, which is usually just views_view. Here are the possibilities: + +
    display: array('view' => NULL),
    +style: array('view' => NULL, 'options' => NULL, 'rows' => NULL, 'title' => NULL),
    +row style: array('view' => NULL, 'options' => NULL, 'row' => NULL),
    +
    + +Be sure to use the right arguments line or the theme system will not properly translate. +
  4. +
  5. The 'template' line should never include the extension, so drop the .tpl.php from it.
  6. + +
  7. You need to make sure that the Views preprocess functions get registered. The 'original hook' line in the definition does that, but it can only do it if it comes after the Views registration, which actually happens very late in theme building. 99% of the time, your module will come before Views. You have two choices to deal with this: +
      +
    1. Set your module's weight to 11 or higher in the database. Views' weight is 10. You can make this happen automatically when the module is first installed by creating a mymodule.install file and using this code: +
      function mymodule_install() {
      +  db_query("UPDATE {system} SET weight = 11 WHERE name = 'mymodule'");
      +}
      +
      + If you use this method, the original hook should be set to the name of the original template being used. i.e, if this is a variate of views-view-list.tpl.php, this should be 'views_view_list'. +
    2. +
    3. You can also just force it to list the preprocessors without actually having to detect them. This doesn't require modifying your module's weight, which is not always possible, you can insert this code into the array: +
            'preprocess functions' => array(
      +        'template_preprocess',
      +        'template_preprocess_views_view',
      +        'mymodule_preprocess_views_view__viewname_displayid',
      +      ),
      +
      + + The first one is the global 'template_preprocess' function which all templates utilize. It does some basic things such as setting up $zebra and a few other items. See api.drupal.org for specifics. + + The second one is the plugin specific preprocess. Like 'original hook' it should conform to the name used by the original template. i.e, if the original template was views-view-list.tpl.php then that preprocess function would be named template_preprocess_views_view_list. + + The third one is your module's preprocess function, if it needs one. In general, you probably will not need one, and you should only attempt to use one if you are reasonably familiar with the concept of preprocess functions and Drupal's theme system in general. See Drupal's theme documentation for more information. +
    4. +
    +
  8. +
+ diff --git a/help/api-example.html b/help/api-example.html new file mode 100644 index 0000000000000000000000000000000000000000..9a7a51d567ca45e86e7ab3b2500d89f4da4220f7 --- /dev/null +++ b/help/api-example.html @@ -0,0 +1,181 @@ + + +For the new table defined by the Node example module to be understood by the views module you need to create a node_example.views.inc file that describes the table and its relationships to the rest of the database. In order for views to know that this file is to be loaded you need to implement hook_views_api. This is done by adding the following function into your node_example.module file + +
+<?php
+/**
+ * Implementation of hook_views_api().
+ *
+ * This tells drupal that there is Views integration file named 
+ * module-name.views.inc 
+ */
+function node_example_views_api() {
+  // Note that you can include 'path' in this array so that your views.inc 
+  // file can be stored in a different location.
+  return array(
+    'api' => 2.0
+  );
+}
+?>
+
+ +Below is the contents of a simple node_example.views.inc file that allows you to create views that include the new color and quantity information. + +
+<?php
+// $Id$ 
+
+/**
+ * This file is used to tell the views module about the new node_example table.
+ *
+ * Database definition:
+ * @code
+ *   CREATE TABLE node_example (
+ *     vid int(10) unsigned NOT NULL default '0',
+ *     nid int(10) unsigned NOT NULL default '0',
+ *     color varchar(255) NOT NULL default '',
+ *     quantity int(10) unsigned NOT NULL default '0',
+ *     PRIMARY KEY (vid, nid),
+ *     KEY `node_example_nid` (nid)
+ *   )
+ * @endcode
+ */
+
+function node_example_views_data()  {
+  // Basic table information.
+
+  // ----------------------------------------------------------------
+  // node_example table
+  //  New group within Views called 'Example'
+  //  The group will appear in the UI in the dropdown tha allows you
+  //  to narrow down which fields and filters are available.
+
+  $data = array();
+  $data['node_example']['table']['group']  = t('Example');
+
+  // Let Views know that our example table joins to the 'node'
+  // base table. This means it will be available when listing
+  // nodes and automatically make its fields appear.
+  //
+  // We also show up for node revisions.
+  $data['node_example']['table']['join'] = array(
+    'node_revisions' => array(
+      'left_field' => 'vid',
+      'field' => 'vid',
+    ),
+    'node' => array(
+      'left_field' => 'vid',
+      'field' => 'vid',
+    ),
+  );
+
+  // quantity
+  $data['node_example']['quantity'] = array(
+    'title' => t('Quantity'),
+    'help' => t('Quantity of items.'),
+    'field' => array(
+      'handler' => 'views_handler_field_numeric',
+      'click sortable' => TRUE,
+     ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+
+  // Color		
+  $data['node_example']['color'] = array(
+    'title' => t('Color'),
+    'help' => t('Color of item.'),
+
+    'field' => array(
+      'handler' => 'views_handler_field',
+      'click sortable' => TRUE,
+     ),
+     'filter' => array(
+      'handler' => 'views_handler_filter_string',
+     ),
+     'argument' => array(
+       'handler' => 'views_handler_argument_string',
+     ),
+     'sort' => array(
+      'handler' => 'views_handler_sort',
+     ),
+  );
+
+  return $data;
+}
+
+?>
+
+ +Some notes on usage: + +Within Views, click on the Add tab. You have a number of type options here. Normally you would select either 'Node' (if you only want to display information on current nodes) or 'Node revision' (if you want to display information on all revisions of the nodes) + +With this configuration you always pull out of the database, data for every single node, whether or not it has color and quantity information. To display information on just those nodes that have color and quantity information you can use a filter so that only nodes which don't have a NULL color or a NULL quantity are displayed. + +

Type/relationship extension

+ +When your tables have first class data, you will often need to have own View types and View relationships defined. With the current node_example table this isn't required although I try to justify it below on an efficiency basis. See [[http://groups.drupal.org/node/17236#comment-58980|this discussion]] as to why it isn't justified. + +Pulling data out of the database for every node when you only want data for the new Example node type is inefficient. To reduce the initial data extraction to just that relating to the new Example nodes requires that you make the node_example table the base table. This can be done by adding the following code into the node_example.views.inc file just before the 'return $data;' + +
+<?php
+
+//  **** Begin optional extra for type and relationships ****
+
+  //  Use node_example as a new base table
+  //     by creating a new views type called 'Node example'
+  //  This allows it to be selected as the 'view type'
+  //          when you initially add a new view. 
+  $data['node_example']['table']['base'] = array(
+    'field' => 'vid',
+    'title' => t('Node example'),
+    'help' => t("Node example type with color and quantity information."),
+    'weight' => -9,
+  );
+
+  // When using the new 'Node example' type you need to use relationships
+  //   to access fields in other tables.
+
+  // Relationship to the 'Node revision' table
+  $data['node_example']['vid'] = array(
+    'title' => t('Node revision'),
+    'help' => t('The particular node revision the color and quantity is attached to'),
+    'relationship' => array(
+      'label' => t('Node revision'),
+      'base' => 'node_revisions',
+      'base field' => 'vid',
+      // This allows us to not show this relationship if the base is already
+      // node_revisions so users won't create circular relationships.
+      'skip base' => array('node', 'node_revisions'),
+    ),
+  );
+
+  // Relationship to the 'Node' table
+  $data['node_example']['nid'] = array(
+    'title' => t('Node'),
+    'help' => t('The particular node the color and quantity is attached to'),
+    'relationship' => array(
+      'label' => t('Node'),
+      'base' => 'node',
+      'base field' => 'nid',
+      // This allows us to not show this relationship if the base is already
+      // node so users won't create circular relationships.
+      'skip base' => array('node', 'node_revisions'),
+    ),
+  );
+
+//  **** End optional extra for type and relationships ****
+
+?>
+
+ +The above code adds a new 'Node example' to the view types that can be selected within the Add tab window of views. Selecting this sets the node_example table to be the base table. + +If you select 'Node example' as view type, when you initially go into the edit window of views you will find the only fields available are the color and quantity fields. To get fields from other tables you need to add a relationship. Relationships may be found at the top in the same column as the fields. diff --git a/help/api-handlers.html b/help/api-handlers.html new file mode 100644 index 0000000000000000000000000000000000000000..36171d14e618fdd83a1b0b0ded0020a08289b2c3 --- /dev/null +++ b/help/api-handlers.html @@ -0,0 +1,71 @@ + +In Views, a handler is an object that is part of the view and is part of the query building flow. + +Handlers are objects; much of the time, the base handlers will work, but often you'll need to override the handler for something. One typical handler override will be views_handler_filter_operator_in which allows you to have a filter select from a list of options; you'll need to override this to provide your list. + +Handlers have two distint code flows; the UI flow and the view building flow. + +For the query flow: + +
+
handler->construct()
+
Create the initial handler; at this time it is not yet attached to a view. It is here that you can set basic defaults if needed, but there will be no knowledge of the environment yet.
+
handler->set_definition()
+
Set the data from hook_views_data() relevant to the handler.
+
handler->init()
+
Attach the handler to a view, and usually provides the options from the display.
+
handler->pre_query()
+
Run prior to the query() stage to do early processing.
+
handler->query()
+
Do the bulk of the work this handler needs to do to add itself to the query.
+
+ +Fields, being the only handlers concerned with output, also have an extended piece of the flow: +
+
handler->pre_render()
+
Called prior to the actual rendering, this allows handlers to query for extra data; the entire resultset is available here, and this is where items that have "multiple values" per record can do their extra query for all of the records available. There are several examples of this at work in the code.
+
handler->render()
+
This does the actual work of rendering the field.
+
+ +Most handlers are just extensions of existing classes with a few tweaks that are specific to the field in question. For example: + +
+/**
+ * Filter by node type
+ */
+class views_handler_filter_node_type extends views_handler_filter_in_operator {
+  function get_value_options() {
+    if (!isset($this->value_options)) {
+      $this->value_title = t('Node type');
+      $types = node_get_types();
+      foreach ($types as $type => $info) {
+        $options[$type] = $info->name;
+      }
+      $this->value_options = $options;
+    }
+  }
+}
+
+ +views_handler_filter_in_operator provides a simple mechanism to set the list used and the rest of the handler is perfectly fine for this. + +Handlers are stored in their own files; for these files to be loaded by Views on demand, they must first be registered. Since Views core handlers are also loaded this way, it's imperative that your module also implement this pattern in order to prevent code crashes when your handler's parent class is not yet available. + +To register handlers, you must implement hook_views_handlers(). This hook returns an array with two keys; the first key is info which contains the modulename (which is only necessary if you're registering handlers on behalf of another module, such as what Views does) and path, which is the search path to find the files. This path is only necessary if your files will not be stored in the same directory as the .module file. + +The other key is handlers which contains a full array of handlers and the information for each handler. The key to each handler array is the name of the handler class. It can contain: +
+
parent
+
The class that this handler extends. This is important to make sure that the parent class is included before your handler class. Without this, you may cause people's sites to crash in a difficult to recover state. Be sure you get this right!
+
file
+
The filename the handler is in. By default, this will be classname.inc -- however, you can have multiple similar handlers together in one file. However, because there is only one parent, please be sure that the parentage on these handlers matches! Otherwise you will run into whitescreens as not all parents will be loaded.
+
+ +You can see examples of this function in any of the various module.views.inc files in the views modules directory. + +The best place to learn more about handlers and how they work is to explore the views API site and use existing handlers as a guide and a model. Understanding how views_handler and its child classes work is handy but you can do a lot just following these models. You can also explore the views module directory, particularly node.views.inc. + +Please note that while all handler names in views are prefixed with views_, you should use your own module's name to prefix your handler names in order to ensure namespace safety. Note that the basic pattern for handler naming goes like this: + +[module]_handler_[type]_[tablename]_[fieldname]. Sometimes table and fieldname are not appropriate, but something that resembles what the table/field would be can be used. \ No newline at end of file diff --git a/help/api-plugins.html b/help/api-plugins.html new file mode 100644 index 0000000000000000000000000000000000000000..2b20845b433f7ce4282433519a81dd74fb2f55c2 --- /dev/null +++ b/help/api-plugins.html @@ -0,0 +1,80 @@ + +In Views, a plugin is a bit like a handler, but plugins are not directly responsible for building the query. Instead, they are objects that are used to display the view or make other modifications. + +There are 6 types of plugins in Views: +
+
Display
+
Display plugins are responsible for controlling where a view lives. Page and block are the most common displays, as well as the ubiquitous 'default' display which is likely what will be embedded.
+
Style
+
Style plugins control how a view is displayed. For the most part they are object wrappers around theme templates. +
Row style
+
Row styles handle each individual record from a node.
+
Argument default
+
Argument default plugins allow pluggable ways of providing arguments for blocks. Views includes plugins to extract node and user IDs from the URL; additional plugins could be used for a wide variety of tasks.
+
Argument validator
+
Validator plugins can ensure arguments are valid, and even do transformations on the arguments.
+
Access
+
Access plugins are responsible for controlling access to the view.
+
+ +Plugins are registered by implementing hook_views_plugins() in your modulename.views.inc file and returning an array of data. + +The array will look something like this: + + return array( + 'display' => array( + // ... list of display plugins, + ), + 'style' => array( + // ... list of style plugins, + ), + 'row' => array( + // ... list of row style plugins, + ), + 'argument default' => array( + // ... list of argument default plugins, + ), + 'argument validator' => array( + // ... list of argument validator plugins, + ), + 'access' => array( + // ... list of access plugins, + ), + ); + + +Each plugin will be registered with an identifier for the plugin, plus a fairly lengthy list of items that can define how and where the plugin is used. Here is an example from Views core: + + + 'node' => array( + 'title' => t('Node'), + 'help' => t('Display the node with standard node view.'), + 'handler' => 'views_plugin_row_node_view', + 'path' => drupal_get_path('module', 'views') . '/modules/node', // not necessary for most modules + 'theme' => 'views_view_row_node', + 'base' => array('node'), // only works with 'node' as base. + 'uses options' => TRUE, + 'type' => 'normal', + ), + + +Of particular interest is the path directive, which works a little differently from handler registration; each plugin must define its own path, rather than relying on a global info for the paths. Also, there is an optional parent directive which is automatically filled in to be the base parent for the plugin type. Usually this is enough, but if your plugin derives from something other than the base, it must be filled in. For example: + + + 'feed' => array( + 'title' => t('Feed'), + 'help' => t('Display the view as a feed, such as an RSS feed.'), + 'handler' => 'views_plugin_display_feed', + 'parent' => 'page', // so it knows to load the page plugin .inc file + 'uses hook menu' => TRUE, + 'use ajax' => FALSE, + 'use pager' => FALSE, + 'accept attachments' => FALSE, + 'admin' => t('Feed'), + 'help topic' => 'display-feed', + ), + + +Note that unlike handler registration, where parentage is referred to by object name, with plugins it is referred to by the unique plugin identifier. Please be sure to prefix your plugin identifiers with your module name to ensure namespace safety; after all, two different modules could try to implement the 'grid2' plugin, and that would cause one plugin to completely fail. + +...TODO: Finish this document.... diff --git a/help/api-tables.html b/help/api-tables.html new file mode 100644 index 0000000000000000000000000000000000000000..6f961f20ea6ea1852970d3ae29bd0846bd371ac6 --- /dev/null +++ b/help/api-tables.html @@ -0,0 +1,235 @@ + +Tables are described to Views via hook_views_data(), which returns an array of table information, keyed by the name of the table. For example, if your module is describing three tables, 'foo', 'bar' and 'baz', your array will look like this: +
$data = array(
+  'foo' => array(
+    // ...info here...
+  ),
+  'bar' => array(
+    // ...info here...
+  ),
+  'baz' => array(
+    // ...info here...
+  ),
+);
+
+ +The key should be the actual database name of the table (not including prefix), but it can be an alias as long as the join information (explained later) contains the real name of the table. + +Each item in the array should be a field in the table, with the exception of a special information section called 'table'. Example: + +
$data['foo'] = array(
+  'table' => array(
+    // ... info about the table, described later ...
+  ),
+  'bar' => array(
+    // ... info about the field named 'bar', i.e, foo.bar,
+  ),
+  'baz' => array(
+    // ... info about the field named 'baz', i.e, foo.baz,
+  ),
+);
+
+ +Once you get down to an array that contains actual data, that piece of the array will often be referred to as the definition. + +

The 'table' section

+Each table should have a 'table' section in it, which is used to set default information for the table, such as the group, as well as the very important joins and whether or not this is a base table. + +First, there are several items that are actually for fields but can be placed here so that all fields within the table inherit them: +
+
group
+
The name of the group this item will be with. In the UI, this is displayed as Group: Title. For example, "Node: Node ID", "Taxonomy: Term description", etc. It is important to be consistent with groups, because the UI sorts by group, and allows filtering by group to find fields as well.
+
title
+
The actual name of the field; it should be concise and descriptive.
+
help
+
A longer description to help describe what the field is or does. It should try to be only a line or two so as not to clutter the UI.
+
+ +In general, having 'title' and 'help' at the table level doesn't make a lot of sense, but usually every item in a table is in the same group. Thus it is very common to define the 'group': + +
+  $data['foo']['table']['group'] = t('Foo');
+
+ +

Base table

+If your table is a base table -- meaning it can be the primary, central table for a View to use, you can declare it to be a base table. This primarily provides UI information so that it can be selected. +For example: +
+  // Advertise this table as a possible base table
+  $data['node']['table']['base'] = array(
+    'field' => 'nid',
+    'title' => t('Node'),
+    'help' => t("Nodes are a Drupal site's primary content."),
+    'weight' => -10,
+  );
+
+ +The following tags are available in the +
+
field
+
The primary key field for this table. For Views to treat any table as a base table, it must have a primary field. For node this is the 'nid', for users this is the 'uid', etc. Without a single primary key field (i.e. not a composite key), Views will not be able to utilize the table as a base table. If your table does not have a primary key field, it is not too difficult to just add a serial field to it, usually.
+
title
+
The title of this table in the UI. It should be singular and describe the object that this table contains from the perspective of the user.
+
help
+
A short piece of text to describe what object this table contains.
+
database
+
If this table is held in a different database from your Drupal database, specify it as a string in the exact same format as the settings.php file. This is a special purpose variable that will probably be only used in site specific code, and it must be the same database type as your Drupal database. Also, don't try to join it to any table that isn't in the same database. That'll just create all kinds of silly errors. For example: +
+  // In settings.php for your site
+  // Your drupal (site) database needs to be called 'default'
+  $db_url['default'] = 'mysqli://user:pass@host/drupal_db';
+  $db_url['budget'] = 'mysqli://user:pass@host/other_db';
+
+Then when you are describing the external database in your base table you would write something like this: +
+  $data[$table]['table']['base'] = array(
+    'field' => 'Primary key',
+    'title' => t('Field name'),
+    'help' => t('Field description'),
+    'database' => 'budget',
+    'weight' => -10,
+    );
+
+
+
+ +

Linking your table to existing base tables

+For Views to use your table, it has to either be a base table, or know how to link to an existing base table. Or sometimes both. Views uses this information to create a path to the base table; when the table is added to the query, Views will walk along this path, adding all tables required into the query. + +
+ +How term_data joins to node +
+ +In the above example, to use these with 'node' as the base table, both 'term_data' and 'term_node' need to be defined, and they each need a join handler for node: + +
+$data['term_data']['table']['join']['node'] = array(
+  'left_table' => 'term_node',
+  'left_field' => 'tid',
+  'field' => 'tid',
+);
+
+ +The above can be read as "In order to join to the node table, the term_data table must first link to the term_node table, and they join on the 'tid' field.". When adding this table to the query for a node view, Views will look at this and then look for the term_node table. + +
+$data['term_node']['table']['join']['node'] = array(
+  'left_field' => 'nid',
+  'field' => 'nid',
+);
+
+ +Above, the fact that 'left_table' is left out lets us know that term_node links directly to the node table, using the 'nid' field on both sides of the join. + +Quite a few more fields are available in this definition: +
+
handler
+
The name of the handler object to use. Defaults to 'views_join'. You may create custom join handlers that may or may not use any of the data below, as they see fit.
+
table
+
Table to join. This is optional, and should only be used if the table being referenced is an alias.
+
field
+
Field to join on. This is required.
+
left_table
+
The next step toward the final destination. If this is the final destination it may be omitted.
+
left_field
+
The field to join to on the left side. This is required.
+
type
+
Either LEFT (default) or INNER.
+
extra
+
Either a string that's directly added, or an array of items. Each item is, itself, an array: +
+
field
+
Field or formula
+
operator
+
Similar to filters, this is the operator, such as >, <, =, etc. Defaults to = or IN.
+
value
+
Must be set. If an array, operator will be defaulted to IN.
+
numeric
+
If true, the value will not be surrounded in quotes, and %d will be used for its placeholder.
+
extra type
+
How all the extras will be combined. Either AND or OR. Defaults to AND.
+
+
+
+ +

Describing fields on tables

+Aside from the special table tag, each table can also have an unlimited number of field designations; these correspond roughly to fields on the table, though it is very common to use non-fields to display data that isn't directly in a field, such as data arrived from formulae, or special links related to the object the table is part of. + +Each field is described in the view data with an array, keyed to the database name of the field. This array may contain some information fields, plus an entry in each of the five types of items Views has per field: argument, field, filter, relationship, sort. For example: + +
+$data['node']['nid'] = array(
+  'title' => t('Nid'),
+  'help' => t('The node ID of the node.'), // The help that appears on the UI,
+  // Information for displaying the nid
+  'field' => array(
+    'handler' => 'views_handler_field_node',
+    'click sortable' => TRUE,
+  ),
+  // Information for accepting a nid as an argument
+  'argument' => array(
+    'handler' => 'views_handler_argument_node_nid',
+    'name field' => 'title', // the field to display in the summary.
+    'numeric' => TRUE,
+    'validate type' => 'nid',
+  ),
+  // Information for accepting a nid as a filter
+  'filter' => array(
+    'handler' => 'views_handler_filter_numeric',
+  ),
+  // Information for sorting on a nid.
+  'sort' => array(
+    'handler' => 'views_handler_sort',
+  ),
+);
+
+ +The above example describes the 'nid' field on the 'node' table, providing 4 of the 5 handlers. Note that while field is normally expected to be the database name of the field, it doesn't have to be; you can use an alias (which is how you get multiple handlers per field) or something completely made up for items that aren't tied to the database. For example: + +
+$data['node']['edit_node'] = array(
+  'field' => array(
+    'title' => t('Edit link'),
+    'help' => t('Provide a simple link to edit the node.'),
+    'handler' => 'views_handler_field_node_link_edit',
+  ),
+);
+
+ +The above handler definition an edit link to a node, but this isn't a field in and of itself. For aliased fields, here is another example: + +
+$data['users']['uid_current'] = array(
+  'real field' => 'uid',
+  'title' => t('Current'),
+  'help' => t('Filter the view to the currently logged in user.'),
+  'filter' => array(
+    'handler' => 'views_handler_filter_user_current',
+  ),
+);
+
+ +The above definition provides an alternate filter handler on the uid field for the current user. + +The following items are allowed in the field definition: + +
+
group, title, help
+
As above, these fields are for the UI. If placed here, any of these fields will override a setting on the base table.
+
real field
+
If this field is an alias, the "real field" may be placed here, and the handler will never know the difference.
+ +
field
+
A handler definition for the "Field" section, which is a field that may be displayed in a view. The definition is an array; the contents of the array are completely up to the handler, other than the 'handler' definition. If omitted, handler will default to 'views_handler_field'.
+
filter
+
A handler definition for the "Filters" section, which will be used to apply WHERE clauses to the view. The definition is an array; the contents of the array are completely up to the handler, other than the 'handler' definition. If omitted, handler will default to 'views_handler_filter'.
+
sort
+
A handler definition for the "Sort criteria" section, which will be used to add an ORDER BY clause to the view. The definition is an array; the contents of the array are completely up to the handler, other than the 'handler' definition. If omitted, handler will default to 'views_handler_sort'.
+
relationship
+
A handler definition for the "Field" section, which is a way to bring in new or alternative base tables in the view. The definition is an array; the contents of the array are completely up to the handler, other than the 'handler' definition. If omitted, handler will default to 'views_handler_relationship'. The basic relationship handler requires 'base' and 'base field' to be set; 'base' and 'base field' represent the "right" half of the join that will use this field as the left side.
+
argument
+
A handler definition for the "Field" section, which is method of accepting user input from the URL or some other source. The definition is an array; the contents of the array are completely up to the handler, other than the 'handler' definition. If omitted, handler will default to 'views_handler_argument'.
+
+ +For more information about what handlers need/use what data, visit the Views API site and check out the available handlers. diff --git a/help/api.html b/help/api.html new file mode 100644 index 0000000000000000000000000000000000000000..14f40af71d14554e7c8028d4a5a79fda5a499256 --- /dev/null +++ b/help/api.html @@ -0,0 +1,23 @@ + +Views allows modules to describe their tables relationships to each other, as well as fields, filters, sort criteria and arguments via hook_views_data(). Whenever Views deems it necessary, this hook is called, the data aggregated together and cached. hook_views_data_alter() may also be used to modify existing data, changing other module's handlers or adding handlers to other module's tables. + +Views also allows modules to create new display types, style types, row styles, argument default handlers and argument validators via hook_views_handlers() and hook_views_plugins(). + +These hooks are kept in a file named MODULENAME.views.inc. This file is automatically included upon need, so there is no need to try and include this in hook_init or any other method of including .inc files. This file should store hook_views_data, hook_views_data_alter(), hook_views_plugins(), hook_views_handlers(), as well as any other hooks and subsidiary data that will only be used by your module when Views is active. All handlers and plugins provided by your module should be in separate .inc files. + +There are two similar files, MODULENAME.views_default.inc and MODULENAME.views_convert.inc which contain default views and views 1 to views 2 convert helpers, respectively. + +

hook_views_api()

+In order for your files to be included, your module must first implement hook_views_api() in the main .module file. This module should return array of information. The following items may be returned: + +
+
api
+
This must appear; it should be the oldest API version that your module can work with. If Views is currently running an older version of the API, it will ignore your module's views integration. This is a good thing, as it will prevent code crashes, at the expense of your module's functionality disappearing. +
+You may find the current Views API version by calling views_api_version() which is implemented at the top of views.module. This version numbering starts at 2.0. Every time changes are made to the Views handlers and plugins or other aspects of the Views API, the number will tick up (by either .001, .01 .1 or 1 depending upon how major the changes are). Note that views_api_version() was introduced in Views 2.0-rc2 and may not exist prior to that version. You may use function_exists() to test to see if this function is there. +
+Often these versions are basically compatible with each other and Views won't care if your module implements 2.000, 2.001, 2.002, etc. Your module can request that it won't work with any version older than a given version, however. Views will determine, itself, if a newer version will work. +
+
path
+
If your *.views*.inc files are not in the same directory as the .module file, then return the full path here. You should probably use something like drupal_get_path('module', 'yourmodulename') . '/includepath'.
+
diff --git a/help/argument.html b/help/argument.html new file mode 100644 index 0000000000000000000000000000000000000000..5edefbcd5d0cd13e0ce1e8e7656ed8002696e8de --- /dev/null +++ b/help/argument.html @@ -0,0 +1,58 @@ + +Arguments are input. While they often come from the URL, they don't always so please don't be shocked when they don't. Each display type may have its own source for arguments. Block displays have no source of arguments at all; they cannot pull arguments from the URL, and often require use of the default argument PHP code in order to get arguments. The argument default plugins can be used to get arguments into a block view. See "Provide default", below. + +In general, arguments are used to filter the view, and in that sense they have a very close relationship to filters, but that isn't necessarily true for every argument. Arguments can be used for any purpose, really; the extent of what the argument does is up to the developer of the argument, but the arguments that come with Views are almost entirely filters. + +A typical use of an argument might be to reduce a view to a single node, a single user, or nodes with a given taxonomy term. + +

Action to take if argument is not present

+
+
Ignore
+
The argument is removed from the view as though it weren't there and all results will be displayed.
+ +
Hide view / Page not found
+
The view will remove itself entirely if the argument is not present; for a block this means it simply won't a appear. For page views the View will return a 404 and present a "Page not found" error.
+ +
Display empty text
+
The value of the empty text will be displayed.
+ +
Summary
+
The view will attempt to display a summary of arguments available, based upon the view, and provide links to the view with those arguments. Summaries have their own style handlers as well as options. The default summary style simply displays a list of arguments with a count of entries found per argument. This special mode is a very powerful part of Views.
+ +
Provide default
+
If no argument is given, a default argument can be selected. The method of choosing the default argument is selectable and pluggable.
+
+ +

Wildcards

+All arguments have a 'wildcard', which is an argument that means to use all values. In practice, it is the same as 'Ignore' above, where the argument is simply removed and the view is created without the argument. The wildcard title is used in titles and breadcrumb trails. +

Default arguments

+Default argument selection is available only if the action to take is "Provide default". When that is selected, a new fieldset will appear letting you choose what the default argument will be. Views provides the following default selectors by default (but other modules may add more): +
+
Fixed entry
+
You may directly enter what the argument will be. This is not a variable, it will always be the same argument.
+
Node ID from URL
+
This will attempt to find a Node ID from the URL, and is primarily useful for the Node: ID argument (though other arguments that use Node IDs, such as the CCK Node Reference argument, will find it useful too). For example, when visiting the path 'node/1' or 'node/1/edit' it will know that the '1' in that path is a node ID and use it.
+
User ID from URL
+
Like Node ID from URL, this will attempt to find a user ID from the path. It also includes an option to look for a node and use the node author as the user ID.
+
User ID from logged in user
+
You can use this to easily default a menu item to the logged in user. For example, if you created the path 'blogs' and gave it a User: ID argument with this default, 'blogs' would go to the user's own blogs, and blogs/1 would go to User ID 1's blogs.
+
+ +Please bear in mind that the selection of default argument happens only if an argument is not provided. If using a display that has no argument source, such as a block, this will be the case 100% of the time. However, if using a display that reads arguments from the URL, this will happen only if the URL did not contain an argument. +

Argument validation

+Arguments can also have validators, which are pluggable systems used to ensure that arguments fit within certain parameters. When a validator is chosen, it may provide some settings for the validator, including the action to take if an argument is presented, but it fails to validate. These actions are generally the same as the default actions above, excluding the ability to provide another default. + +If a view provides a menu option, such as a tab, if the argument does not validate the tab will not appear. + +This sytem can have other validators plugged in; by default, Views provides: +
+
Basic validation
+
Ensures that the argument is present. A PHP NULL value (from eg. PHP default argument code) will invalidate.
+
Node
+
Ensure that the argument is a valid Node ID. You may select which types of node the validator will accept.
+
Taxonomy term
+
Ensure that the argument is a valid taxonomy term. This includes options to limit to specific vocabularies and can transform the argument to the right type depending upon the actual argument. Set the Argument Type option to the actual type of data that the argument being used is expecting.
+
PHP Code
+
You may enter arbitrary PHP code, similar to the php block visibility code, to determine if the argument is valid or not.
+ +
diff --git a/help/display-attachment.html b/help/display-attachment.html new file mode 100644 index 0000000000000000000000000000000000000000..71b5ebf6448bba817667db6797abec733b7f5859 --- /dev/null +++ b/help/display-attachment.html @@ -0,0 +1,2 @@ + +Attachment displays are 'attached' to another display in the same view. When the display is visited, the attached display will also be rendered and may be placed before, after or both before and after the original display. Attachment displays are often useful for displaying an argument summary view along with a page display that accepts arguments. This can be used to provide a kind of glossary. \ No newline at end of file diff --git a/help/display-block.html b/help/display-block.html new file mode 100644 index 0000000000000000000000000000000000000000..63be273cd8f6a3c205b7f391cb88d88915222929 --- /dev/null +++ b/help/display-block.html @@ -0,0 +1,11 @@ + +Block displays will show up on your blocks administration page. Once a block display is created and saved, it can be enabled and positioned in your theme by visiting administer >> site building >> blocks and selecting it from the list. + +Blocks do not accept arguments from any source; the only way to get arguments to a block is to provide defaults to it, possibly via the PHP Code default setting. + +
    +
  • Edit the argument in question; you may want to override this argument if you have multiple displays using it.
  • +
  • Change the "Action to take if argument is not present" to "Provide default argument". This will bring up a new box called "Provide default argument options".
  • +
  • The most common default argument type used for blocks is Node from URL, where it attempts to determine if the URL refers to a node, for example if visiting 'node/1' or 'node/1/edit'. User ID from URL is also very common.
  • +
  • If you change the default argument type to 'PHP Code' (note: You must have permission to use PHP code on your site) you can enter PHP to define the argument needed. Simply return the argument.
  • +
diff --git a/help/display-default.html b/help/display-default.html new file mode 100644 index 0000000000000000000000000000000000000000..2903f68b70eb405511e47a5890baf11067c926ff --- /dev/null +++ b/help/display-default.html @@ -0,0 +1,5 @@ + +The default display is primarily a display to store settings, and isn't actually used anywhere within the Views system. It is possible for external programs to use the default display, but if they do they will (hopefully) tell you which display they will be working with. The default display is also a convenient display to use to embed into your site using PHP snippets; this is useful, for example, in node content, but this is something that should generally only be done by administrators. + +In general, you probably want to add either a page display or a block display. + diff --git a/help/display-feed.html b/help/display-feed.html new file mode 100644 index 0000000000000000000000000000000000000000..49e129f765e476fffcf668ee0b06436dff731d55 --- /dev/null +++ b/help/display-feed.html @@ -0,0 +1,2 @@ + +A feed display allows you to attach an RSS feed to a view. \ No newline at end of file diff --git a/help/display-page.html b/help/display-page.html new file mode 100644 index 0000000000000000000000000000000000000000..ce9ccae89d5251db1b99fe20e15f3264cdb2f197 --- /dev/null +++ b/help/display-page.html @@ -0,0 +1,4 @@ + +Page displays have a path and an optional menu component. Page displays will be the primary content for the page, meaning they will be displayed in the main content area when you visit the URL that corresponds to the path. + +Page displays take their arguments from the URL. You can embed arguments into the URL using %; in previous versions of Views, this was '$arg'. For example, 'node/%/foo' will accept URLs such as 'node/1/foo'. \ No newline at end of file diff --git a/help/display.html b/help/display.html new file mode 100644 index 0000000000000000000000000000000000000000..f7c95e0d9c4ed0de8e2b2ddc813c1e9c739e943c --- /dev/null +++ b/help/display.html @@ -0,0 +1,8 @@ + +Displays tell Views where the output should go. By adding a display to a View, you can have your view appear as a page, or as a block, or even as an attachment to a different display on the view. + +Each display can have its own settings, but when it's created, a display will take all of its basic settings from the default display which all Views must have. For most settings, there is an override button that will override that single setting for the current display. Overridden settings will have a mark in the summary for that display. + +Please keep in mind that when you are editing a setting on a display that is not overridden, then by default you are editing that for all displays. + +For fields, arguments, sorts, filters and relationships, you can only override all of them or none of them. To do this, click on the header for the filters or the rearrange button. Once you override, the display will then have its own copies of the fields/filters/etc and changes to the defaults will not be reflected on your display. \ No newline at end of file diff --git a/help/embed.html b/help/embed.html new file mode 100644 index 0000000000000000000000000000000000000000..b9e698ff38cd317c1186a010fc87bc1f92657010 --- /dev/null +++ b/help/embed.html @@ -0,0 +1,25 @@ + +You can easily embed the results of a view into other parts of your site; +either with code as a module, or in nodes or blocks as snippets. The +easiest way is to use the function views_embed_view(): + +/** + * Embed a view using a PHP snippet. + * + * This function is meant to be called from PHP snippets, should one wish to + * embed a view in a node or something. It's meant to provide the simplest + * solution and doesn't really offer a lot of options, but breaking the function + * apart is pretty easy, and this provides a worthwhile guide to doing so. + * + * @param $name + * The name of the view to embed. + * @param $display_id + * The display id to embed. If unsure, use 'default', as it will always be + * valid. But things like 'page' or 'block' should work here. + * @param ... + * Any additional parameters will be passed as arguments. + */ +function views_embed_view($name, $display_id = 'default') { + + +To figure out the id of a display, hover your mouse over the tab to select that display. Everything after the '#views-tab-' is the id of that display. This ID is guaranteed never to change unless you delete the display and create a new one. diff --git a/help/example-author-block.html b/help/example-author-block.html new file mode 100644 index 0000000000000000000000000000000000000000..def9a9dd01584757331aacb76c2f693a34b9dab1 --- /dev/null +++ b/help/example-author-block.html @@ -0,0 +1,78 @@ + +

In this example you will create a context-sensitive block that shows the titles of recent blog entries by an author when viewing one of their posts. This will demonstrate using Views arguments to dynamically filter a view's contents at display time.

+ +

Before working through this example, enable the Blog module and populate some entries from a few different users.

+ +

Creating the View

+

The first step is creating a view for our recent blog entries block. Because the block will show the titles of blog entries, this view is considered a "Node" type. Go to add new view, enter the following properties, and click Next:

+ +
+
View name
+
recent_blog_entries
+
View description
+
List of recent blog entries for a given author.
+
View tag
+
blog
+
View type
+
Node
+
+ +

Generating a list of blog entries

+

It will be much easier to see the view progress if we can see it doing something. In this section, we will create a basic view displaying blog entry titles.

+ +
    +
  1. In the third column, locate the Fields area. Generally speaking, fields are the pieces of information that you want to display in the view (in this case, node title). Click the + icon to add a field.
  2. +
  3. Scroll down to Defaults: Add fields, below the settings table. A large selection of fields will be available.
  4. +
  5. In the Groups drop-down menu, select Node. This will limit the list to only the default fields exposed by Node module.
  6. +
  7. Scroll down the list, select the Node: Title field, and click Add.
  8. +
  9. You will now be presented with settings for the Node: Title field. Delete the label from the Label field, so that each individual node title is not prefixed with the word "Title." Additionally, check the Link this field to its node box so that visitors who see an interesting title can click directly on it to read the blog entry to which it belongs.
  10. +
  11. When finished, click Update. If you scroll down to the Live Preview section, you should now see a list of several node titles; however both blog entries and other node types will be in the list. Let's fix that.
  12. +
  13. In the fourth column, locate the Filters area. Filters limit the results displayed in the view, and we can use this to our advantage here by showing node titles only from blog entries and not every type of node. Click the + icon to add a filter.
  14. +
  15. As before, scroll down to the Defaults: Add filters section, select Node from the Groups select box to limit the list of options to only those exposed by Node module.
  16. +
  17. Scroll down and select the Node: Type field and click Add. In the settings page that appears, leave Operator as Is one of and select Blog entry under Node type. Click Update when finished.
  18. +
  19. Now, by scrolling down to Live preview, you'll see that the list only shows blog entries.
  20. +
+ +

Adding context with arguments

+

While filters are very useful for limiting the results of a view when the condition is always consistent (for example, a view of blog entry nodes should always be filtered by the blog entry type), something filters can't do is smart decision-making based on the page context. In our case, we want the view to display a different list of blog entries when looking at a post by user 'admin' than we do when looking at a post by user 'member', and filters won't be able to help.

+ +

Luckily, there's another way to filter a view's content: arguments. Through arguments, Views are able to obtain additional context (typically via dynamic URLs with IDs in them) and can take this context into consideration when displaying the view.

+ +

Let's walk through adding and configuring an argument to our view so that we can change its contents based on post author.

+ +
    +
  1. In the third column, locate the Arguments area. Click the + icon to add an argument.
  2. +
  3. Because we are basing the view around content authors, this time under Groups select User. Check User: Uid and click Add.
  4. +
  5. The Defaults: Configure Argument User: Uid settings page has a lot going on, but only a few things that need our attention.
  6. +
  7. The Title field here, unlike the Title field under Basic Settings, can be based upon the context that the view is being displayed in. Change the title to 'Recent entries by %1.' %1 will later be expanded to the user's name (based on the User: Uid argument) when the view is displayed.
  8. +
  9. Under Action to take if argument is not present, there are a variety of options, ranging from displaying a 404 or a 403 page to simply displaying all values in the view. In our case, if an argument isn't specified (which it won't be, since this view will be displayed in a sidebar block, not as a page with its own URL), we want to give it a default one to act on. Select Provide default argument.
  10. +
  11. Assuming JavaScript is enabled in your browser, you should now get another selection for Default argument type. Select User ID from URL, which will then provide a new option, Also look for a node and use the node author. Select it. This will cause Views to first see if it can figure out a user ID from the current URL (for example, user/1). If it can't, it will instead check to see if the current page is a node page (such as node/42) and, if so, take the user ID from the node's author field instead.
  12. +
  13. Validator options provide a useful way to control what kind of arguments your view will accept. Select User as the Validator. By default, changing this setting will check the incoming argument and ensure it's a valid user ID; if not, the view will be hidden from the page.
  14. +
  15. Once you have changed the argument's title, default argument, and validator options, click Update to save your changes.
  16. +
  17. You'll notice that now the Live preview no longer shows anything. Did we just break the view? Fortunately, no. It's merely abiding by our wishes to hide itself if there is no valid user ID given to it. Try entering a '1' in the Arguments box and clicking Preview. You should now see a list of only user 1's blog entries.
  18. +
+ +

Creating the block

+

So the live preview is now showing basically what we want. There's just one problem: we have no way to stick what we've done so far into a sidebar block! Let's fix that by adding a new Display.

+ +
    +
  1. In the first column, under Defaults, there is a select box containing entries such as Page, Feed, and, yes, Block! Select Block and click Add display.
  2. +
  3. There's not much else to do here as far as Views is concerned. Under Block settings, click the None link next to Admin and fill in a description for the block in the administrative interface, such as: 'Recent blog entries by author.' and click Update.
  4. +
  5. Save your work by clicking the Save button at the bottom of the Views interface. You should receive a message that the view has been saved.
  6. +
  7. Next, navigate to the blocks interface and drag the 'Recent blog entries by author' block to the right sidebar region (or similar) and click Save blocks.
  8. +
  9. You'll notice this appeared to do nothing. No block shows in the sidebar. But remember, we are looking at an adminitrative page; we are not looking at a page that would provide a user ID context. Navigate to the main blog listing and click on an entry there. You should now see a sidebar block, titled something like "Recent entries by admin," with a list of blog entries beneath it.
  10. +
+ +

Finishing touches

+

There are still a few remaining things to do before our view is complete. For example, we said that the block was to show recent blog entries, but instead it's showing them in the order they were entered, with oldest on top. Additionally, even unpublished entries are showing in the list currently.

+ +
    +
  1. Return to the recent_blog_entries view edit page.
  2. +
  3. Add an additional filter by clicking the + icon in the Filters section in the fourth column.
  4. +
  5. Change Groups to Node and select Node: Published. Click Add.
  6. +
  7. Under the Published selection, choose Yes and click Update.
  8. +
  9. To handle sorting, locate the Sort criteria area, just above filters, and click the + icon there.
  10. +
  11. Under Groups, again select Node. From the list of options, check Node: Post date and click Add.
  12. +
  13. In the settings page, change Sort order to Descending. This will place the newer posts on top of the older ones. Click Update when finished.
  14. +
  15. Finally, Save the view for your new settings to take effect.
  16. +
diff --git a/help/example-recent-stories.html b/help/example-recent-stories.html new file mode 100644 index 0000000000000000000000000000000000000000..0c3d6d44b567e81ab1a62908f6d297c601f55fb3 --- /dev/null +++ b/help/example-recent-stories.html @@ -0,0 +1,58 @@ + +In this example you will create a list of nodes of the content type "story", to be shown in a block. Through this step-by-step process, you will become familiar with some basic steps in creating a view, and familiarize yourself with the Views User Interface. + +
    +
  1. Creating a new view

    +

    Go to add new view. Give your new view the name 'recent_stories', description 'Recent Stories', tag 'story', type 'Node' and click Next.

  2. +
  3. About the interface

    +

    You have been brought to Views User Interface. As you start, you are editing the "Default" options for the view. In the 1st column on the left you can see the drop-down menu offers 'block', for example, to select settings specific only to block views. In the remaining columns, you will be able to add or change options by clicking on links or icons. These options will then appear below this main area. Most likely, you will need to scroll a bit to see the options appear.

  4. +
  5. Selecting the fields to display

    +
      +
    1. In 3rd column locate the Fields options. Click the + icon to add fields.
    2. +
    3. Scroll down to Defaults: Add fields. In the Groups drop-down menu select 'Node', then check the following two fields: Node: Post date, Node: Title. Then click Add.
    4. +
    5. You will be taken through the fields you added one at a time. Make the changes specified below. +
        +
      • For the Post date field: Delete the 'Post date' label. Change the Date format to Custom, and the Custom date format to 'F j, Y, g:i a' (do not type the single quotes; for the meaning of these letter codes, click on the PHP docs link under that box to arrive at the explanation). Click Update.
      • +
      • For the Title field: Delete the 'Title' label. Select Link this field to its node. Click Update.
      • +
      +
    6. +
    7. Scroll back up to Fields and click the ↑↓ icon to rearrange fields.
    8. +
    9. Drag the four-sided arrow next to Node: Title so that it appears above Node: Post date. Click Update to save the new field order.
    10. +
    +
  6. +
  7. Filtering to story nodes only

    +
      +
    1. Click the + icon next to Filters.
    2. +
    3. In the Groups drop-down menu select 'Node', then check the Node: Published and Node: Type filters, and click Add.
    4. +
    5. Select the Published checkbox. Click Update
    6. +
    7. Select Is one of and check Story in the Node Type field. Click Update.
    8. +
    +
  8. +
  9. Sorting to show most recent first

    +
      +
    1. Scroll up to Sort criteria and click the + icon.
    2. +
    3. In the Groups drop-down menu below, select 'Node', then check Node: Post date, and click Add. Alternatively, you may instead check Node: Last comment time, or Node: Updated/commented date, or Node: Updated date.
    4. +
    5. Select Descending Sort order. Click Update.
    6. +
    +
  10. +
  11. Refining the basic settings

    +
      +
    • In 1st column under Basic settings locate these options: +
        +
      • Items to Display setting, click 10. Change the '10' to '4'. Click Update
      • +
      • Style setting, click Unformatted. Change to List. Click Update.
      • +
      +
    • +
    +
  12. +
  13. Adding a block display for custom options

    +
      +
    1. In the dropdown on the left, ensure that Block is selected, and click Add Display.
    2. +
    3. Under Block settings, click the None link next to the Admin setting. Change Block: Block admin description to 'Recent Stories'.
    4. +
    +
  14. +
  15. Saving the view

    +

    Click Save to save your work.

  16. +
  17. Instructing Drupal to show the block

    +

    Finally, you should tell Drupal to show this block. Configure your block by going to admin/build/block. Locate the block in the list: it is labeled Recent Stories. Place this block in a region and click Save. You may click Configure to set a different title, to determine which roles can view the block, and on which pages it appears; If you want your block on the front page only, enter '<front>'.

  18. +
diff --git a/help/example-user-feed.html b/help/example-user-feed.html new file mode 100644 index 0000000000000000000000000000000000000000..bd412569ebb95084b1de846504f1792c06a63c87 --- /dev/null +++ b/help/example-user-feed.html @@ -0,0 +1,74 @@ + +

In this example you will create a Feed display to show nodes by individual users, dynamically selected through the URL. You will become familiar with the Views 2 interface, as well as learn how to use an argument to pull in a user name and use it in a dynamically created path.

+

A feed is a data format that places your site's content into a file that can be read and displayed by news reader programs. When visiting a site, you may notice a small RSS transmission icon, whereby clicking on it, you can subscribe to the site's most recent content. This makes it easier for your visitors to keep up to date with your website. You can also use this format to aggregate information into other sites. For more information, please watch a video from Common Craft about RSS in plain English.

+

Note, Drupal automatically creates a feed for your website, but you may want to create feeds with specific information. In this case, a list per user.

+
    +
  1. +

    Creating a new view

    +
      +
    1. Go to add new view. Give it the name 'user_feed', description 'A feed of user nodes.', tag 'users', type 'Node' and click Next.
    2. +
    +
  2. +
  3. About the Interface. You have been brought to the Views User Interface. As you start, you are editing the "Default" options for the view. In the 1st column on the left- you can see the pull-down menu offers 'Feed', for example, to select settings specific only to RSS views. In the remaining columns, you will be able to add or change options by clicking on links or icons. These options appear below this main area. Most likely, you will need to scroll to see the options appear. As you make changes, these options will appear in bold until you save your view.
  4. +
  5. +

    Change default display

    +
      +
    1. Under Basic Settings in the 2nd column, click Row style: Fields
    2. +
    3. A menu loads below, Defaults: How should each row in this view be styled, check the Node option, and click Update.
    4. +
    5. This loads another options menu, Defaults: Row style options click Update.
    6. +
    +
  6. +
  7. +

    Create the RSS view

    +
      +
    1. In the 1st column, select 'Feed' in the drop-down menu, and click Add Display.
    2. +
    3. Under Basic Settings in the 2nd column, click Row style:Missing style plugin
    4. +
    5. Note, options appear below the Views Interface, you may need to scroll to see Feed: How should each row in this view be styled
      + tick Node, then Update
    6. +
    7. This loads the next options menu- Display type: select "Use default RSS settings", click Update.
    8. +
    +
  8. +
  9. +

    Set the path for accessing your feed

    +
      +
    1. In the 2nd column under Feed settings, click Path: None
    2. +
    3. In options below Feed: The menu path or URL of this view enter in the path with an argument feeds/%/rss.xml
    4. +
    5. Click Update
    6. +
    +
  10. +
  11. +

    Set up your arguments to say which user's nodes to display

    +
      +
    1. To the right of Arguments, click the + sign to add and argument
    2. +
    3. In the Feed: Add arguments menu that loads below, select User in the pull-down menu
    4. +
    5. Check the box User: Name, click Add
    6. +
    7. Scroll down to options to find Case in path: select Lower case
    8. +
    9. Check the box Transform spaces to dashes in URL
    10. +
    11. Click Update default display
    12. +
    +
  12. +
  13. +

    Sort to show most recent at top of feed

    +
      +
    1. Scroll up to Sort criteria in the right most column and click the + icon.
    2. +
    3. In the Groups drop-down menu below, select 'Node', then check Node: Post date, and click Add.
    4. +
    5. Select Descending Sort order. Click Update.
    6. +
    +
  14. +
  15. +

    Set filters to hide unpublished entries

    +
      +
    1. Click the + icon next to Filters. In the options below, select Node under Groups drop-down menu, choose the Node: Published filter, and click Add.
    2. +
    3. Check the box Published. Click Update default display
    4. +
    +
  16. +
  17. +

    Test

    +
      +
    1. Click Save
    2. +
    3. Under Live preview type in the name of a user, in lowercase, replacing spaces with dashes, click Preview.
    4. +
    5. You should test and find your feeds at URLs like http://yoursite.com/feeds/user-name/rss.xml
    6. +
    7. You can use this path for aggregating on another site. You can also attach the RSS feed to another display of view to make the feed link appear on that display.
    8. +
    +
  18. +
\ No newline at end of file diff --git a/help/example-users-by-role.html b/help/example-users-by-role.html new file mode 100644 index 0000000000000000000000000000000000000000..bcf44bbd9e8cac1585d831f4298814e82a6a0a6c --- /dev/null +++ b/help/example-users-by-role.html @@ -0,0 +1,48 @@ + +In this example you will create a page view listing users on your site. Through this step-by-step process, you will become familiar with some basic steps in creating a view, and familiarize yourself with the Views User Interface. + +
    +
  1. Creating a new view

    +

    Go to add new view. Give your new view the name 'user_list', description 'A simple user listing.', tag 'users', type 'User' and click Next.

  2. +
  3. About the Interface

    +

    You have been brought to the Views User Interface. As you start, you are editing the "Default" options for the view. In the 1st column on the left you can see the drop-down menu offers 'block', for example, to select settings specific only to block views. In the remaining columns, you will be able to add or change options by clicking on links or icons. These options will then appear below this main area. Most likely, you will need to scroll to see the options appear. As you make changes, these options will appear in bold until you save your view.

  4. +
  5. Creating a page display; choosing a URL and creating a menu link

    +
      +
    1. In the 1st column, ensure that 'Page' is selected in the drop-down menu, and click Add Display.
    2. +
    3. Next we'll define the path for this page. A page must have a path, and we define it early so that Views doesn't warn us "Display Page uses path but path is undefined." Locate the Page settings in the 2nd column, and click the None link next to the Path setting. In the options editing area that appears below, set the path to 'user_list' (or something else if you prefer) and click Update.
    4. +
    5. Next to Menu setting, Click the No menu link. In the options which appear below, select Normal menu entry, and set the title to 'User list' and click Update.
    6. +
    7. Scroll up to Basic settings, in that same 2nd column, and click the No link next to Use pager. Below, in the options, select Full pager and click Update default display.
    8. +
    +
  6. +
  7. Selecting the fields to display

    +
      +
    1. In 3rd column locate the Fields options. Click the + icon to add fields.
    2. +
    3. Scroll down to Defaults: Add fields. In the Groups drop-down menu select 'User', then check the following fields: User: Created date, User: Delete link, User: Edit link, User: Last access, User: Name and User: Picture. Then click Add.
    4. +
    5. You will be taken through the fields you added one at a time. Click Update default display to go to each next field. Leave the default options on all fields except Delete link; change that field's label to 'Operations'.
    6. +
    7. Scroll back up to Fields and click the ↑↓ icon to rearrange fields. Down below, drag the Name field, by dragging its four-sided arrow, to the top. Drag the Delete link (Operations) field to the bottom, and the Edit link field just above it. Then click Update.
    8. +
    +
  8. +
  9. Seeing what we've done so far

    +

    At this point, you have done enough to create a valid view. If you scroll down, you will see a preview of your view. If it doesn't show already, click the Preview button; but generally this display updates automatically whenever you finish working in one of the mini forms.

  10. +
  11. Styling the view as a table; combining related fields into columns

    +
      +
    1. Under Basic settings, in the 1st column, click the Unformatted link next to the Style setting. In the options below, under Page: How should this view be styled, choose Table and click Update default display.
    2. +
    3. You will be taken to a Page: Style options form to edit the table settings. Locate our Edit link field in this mini form, and notice the Column drop-down. Change this drop-down to show Operations. In the Separator column next to the Operations field, type ' | ' (note the spaces around the | symbol). Check all of the Sortable checkboxes, and set Default sort to Name. When finished, click Update default display.
    4. +
    +
  12. +
  13. Filtering the user list to exclude unwanted entries

    +
      +
    1. Click the + icon next to Filters.
    2. +
    3. In the Groups drop-down menu select 'User', then check the User: Name filter, and click Add.
    4. +
    5. Select Is not one of and enter 'Anonymous' in the Usernames box. Click Update default display.
    6. +
    +
  14. +
  15. Adding an argument to list users by role dynamically

    +
      +
    1. Scroll up to Arguments, and click its + icon.
    2. +
    3. Check the User: Roles argument, and click Add. Set the title to '%1' (don't type the quotes), and under Action to take if argument is not present select Summary, sorted ascending. Leave the other settings as they are. Click Update default display, and click Update through the prompts that follow to accept their default values.
    4. +
    +
  16. +
  17. Saving the view

    +

    Finally, click the Save button to save your work. At the very top, click View "Page" to go to your new view!

  18. +
diff --git a/help/field.html b/help/field.html new file mode 100644 index 0000000000000000000000000000000000000000..b68ca317f8aca6d9f878ae261a02906457968cbc --- /dev/null +++ b/help/field.html @@ -0,0 +1,6 @@ + +Fields are the individual pieces of data being displayed. Adding the fields Node: Title, Node: Type, and Node: Post date to a node view, for example, includes the title, content type and creation date in the displayed results). + +Fields may not appear on every display, because not all style plugins actually use fields. For example, the 'node' row plugin simply displays the node through Drupal's normal mechanisms, and fields are not involved. + +For the most part, the field settings should be self explanatory. Fields will appear in the order that they are arranged in, and they will usually appear with the label they are given. \ No newline at end of file diff --git a/help/filter.html b/help/filter.html new file mode 100644 index 0000000000000000000000000000000000000000..495076b247f1f3f32ff1c0a1f699a2f3f03071e3 --- /dev/null +++ b/help/filter.html @@ -0,0 +1,13 @@ + +Filters are used to reduce the data set that Views provides. That is to say, without any filters applied, Views will return all of your content. You don't want that, so at least some filters must be used. + +Some very commonly used filters: +
    +
  • The 'Node: Published' filter is used to restrict a node View to only nodes that are are have the 'published' box checked. This can be very important to prevent users from viewing content they should not have access to.
  • +
  • The 'Node: Promoted to front page' filter can be used to show only nodes that have the 'promote to front page' turned on.
  • +
  • The 'Node: Type' filter is useful for showing only certain types of nodes. Let's say you wanted users to see only nodes that were 'book' nodes, or a combination of 'book' nodes and 'staff-blog' nodes. This filter allows you to select exactly that.
  • +
  • The 'User: Current' filter will show only nodes that the logged in user has authored.
  • +
  • The 'Node: Post date' filter can be used to show only nodes posted before, after, or between a range of dates.
  • +
+ +The above list is only a tiny fraction of the filters available in Views, referenced here to give an idea of the kinds of tasks filters can accomplish. diff --git a/help/getting-started.html b/help/getting-started.html new file mode 100644 index 0000000000000000000000000000000000000000..b31b9e2ed6e82d874535118552c77649e06a021f --- /dev/null +++ b/help/getting-started.html @@ -0,0 +1,23 @@ + +For those new to Views, it can be a complex system that appears totally overwhelming. The good news is that the UI is designed to compartmentalize everything; this means that for the most part, you can ignore the parts you're not interested in. Start small and build your way up. + +Because of this, the edit UI can seem overwhelming at first, but there are really just a few things you have to know. The rest you can find through exploration. The Views Edit UI image, below, gives an overview of what you'll find on the edit UI. + +
+ +The Views Edit UI +
+ +Notes: +1) Every view has a number of displays which represent where output will be placed. If you're familiar with the original Views 1, you could set a view to be a 'page', with a URL (path), or a block that could show up in a sidebar. With Views 2, you can add as many displays as you like. In addition, you have the default display which contains the basic settings, but doesn't actually show up anywhere. + +2) When you click on the link for an item, a form will open up. For browsers with smaller resolutions, you may have to scroll down a little to see this form. If a form is open, the item its attached to will be highlighted. + +3) Overrides mean that a particular display is not using default settings. When you create a new display, many of its settings will start off using default values. This will be indicated by italics and a lighter color. If you change these values without first overriding them, you will change the default value for all displays that use them. + +4) Some items, particularly styles, have additional settings. Ordinarily when you update a style, if it has additional settings you will automatically see that form next. Often, you will need to go directly to those settings. + +5) You can safely leave a view page to go and do other things. If you come back, the view will still be there, stored in a cache. Keep in mind, however, that while you do this, that view is locked, meaning another user cannot edit this view without breaking the lock. Breaking the lock will discard your changes. + +It helps to have something particular in mind that you want to accomplish when using Views. Here are a couple of ideas and a brief sketch of how to accomplish what you want. + diff --git a/help/images/node-term_node-term_data-large.png b/help/images/node-term_node-term_data-large.png new file mode 100644 index 0000000000000000000000000000000000000000..4fcd19146f92075a6fac35bc9f3eb3e429fe7b99 Binary files /dev/null and b/help/images/node-term_node-term_data-large.png differ diff --git a/help/images/node-term_node-term_data.png b/help/images/node-term_node-term_data.png new file mode 100644 index 0000000000000000000000000000000000000000..de1273c98a099a182ff8a05783ec22599220d64b Binary files /dev/null and b/help/images/node-term_node-term_data.png differ diff --git a/help/images/overview-ui-large.png b/help/images/overview-ui-large.png new file mode 100644 index 0000000000000000000000000000000000000000..04fbe90d1485ab7b9121237dcb80559099108425 Binary files /dev/null and b/help/images/overview-ui-large.png differ diff --git a/help/images/overview-ui-small.png b/help/images/overview-ui-small.png new file mode 100644 index 0000000000000000000000000000000000000000..ed7595f26b81039f74adc44e2ac70ac5c0c887b0 Binary files /dev/null and b/help/images/overview-ui-small.png differ diff --git a/help/images/style-breakdown-large.png b/help/images/style-breakdown-large.png new file mode 100644 index 0000000000000000000000000000000000000000..698b8cc32ad649054ad42a7c1dafb2eb57392f27 Binary files /dev/null and b/help/images/style-breakdown-large.png differ diff --git a/help/images/style-breakdown.png b/help/images/style-breakdown.png new file mode 100644 index 0000000000000000000000000000000000000000..d7513a89bad1e7e40606a35dd160f82cf8c75d50 Binary files /dev/null and b/help/images/style-breakdown.png differ diff --git a/help/images/views1-admin-large.png b/help/images/views1-admin-large.png new file mode 100644 index 0000000000000000000000000000000000000000..06744bddc5ded58cee4c2ec2d6bc9be194b55fc5 Binary files /dev/null and b/help/images/views1-admin-large.png differ diff --git a/help/images/views1-admin.png b/help/images/views1-admin.png new file mode 100644 index 0000000000000000000000000000000000000000..398c145b90e440c3a3b63dfde8278e40e75a9225 Binary files /dev/null and b/help/images/views1-admin.png differ diff --git a/help/images/views1-changeviewtype-large.png b/help/images/views1-changeviewtype-large.png new file mode 100644 index 0000000000000000000000000000000000000000..5c58d81377074cac4b1cd35c8e5fb4a2b2c18e69 Binary files /dev/null and b/help/images/views1-changeviewtype-large.png differ diff --git a/help/images/views1-changeviewtype.png b/help/images/views1-changeviewtype.png new file mode 100644 index 0000000000000000000000000000000000000000..6b1798a33b3f2cf05bdda51cbfc3adaafca04e8f Binary files /dev/null and b/help/images/views1-changeviewtype.png differ diff --git a/help/images/views2-addaview-large.png b/help/images/views2-addaview-large.png new file mode 100644 index 0000000000000000000000000000000000000000..bbad1b18fefef095764c98b71bc5a915fca90478 Binary files /dev/null and b/help/images/views2-addaview-large.png differ diff --git a/help/images/views2-addaview.png b/help/images/views2-addaview.png new file mode 100644 index 0000000000000000000000000000000000000000..546ea169c95f9dd0116217962555a52bbedee065 Binary files /dev/null and b/help/images/views2-addaview.png differ diff --git a/help/images/views2-adddisplay-large.png b/help/images/views2-adddisplay-large.png new file mode 100644 index 0000000000000000000000000000000000000000..51c367551a19d7fe693205a5eacd957145d8c8cd Binary files /dev/null and b/help/images/views2-adddisplay-large.png differ diff --git a/help/images/views2-adddisplay.png b/help/images/views2-adddisplay.png new file mode 100644 index 0000000000000000000000000000000000000000..dff143e56ea5b275e042cdee13fc3bac31b6ec7c Binary files /dev/null and b/help/images/views2-adddisplay.png differ diff --git a/help/images/views2-addfields-large.png b/help/images/views2-addfields-large.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c1ba58c2339a28772927f64cff85353dc088bb Binary files /dev/null and b/help/images/views2-addfields-large.png differ diff --git a/help/images/views2-addfields.png b/help/images/views2-addfields.png new file mode 100644 index 0000000000000000000000000000000000000000..e70c75817b355440f91e4d79d13d9c60322fa671 Binary files /dev/null and b/help/images/views2-addfields.png differ diff --git a/help/images/views2-addfieldsajax-large.png b/help/images/views2-addfieldsajax-large.png new file mode 100644 index 0000000000000000000000000000000000000000..a9308a0317004ed6d6c12a519d8d29a60990b89a Binary files /dev/null and b/help/images/views2-addfieldsajax-large.png differ diff --git a/help/images/views2-addfieldsajax.png b/help/images/views2-addfieldsajax.png new file mode 100644 index 0000000000000000000000000000000000000000..3043d04a500361f250cd5007989ff62b0301b61f Binary files /dev/null and b/help/images/views2-addfieldsajax.png differ diff --git a/help/images/views2-admin-large.png b/help/images/views2-admin-large.png new file mode 100644 index 0000000000000000000000000000000000000000..d262bc55e7a4e0a131c99221571a32f8653cb941 Binary files /dev/null and b/help/images/views2-admin-large.png differ diff --git a/help/images/views2-admin.png b/help/images/views2-admin.png new file mode 100644 index 0000000000000000000000000000000000000000..c2733638179d986ed12262aa85596acbe91964ff Binary files /dev/null and b/help/images/views2-admin.png differ diff --git a/help/images/views2-changedisplaystyle-large.png b/help/images/views2-changedisplaystyle-large.png new file mode 100644 index 0000000000000000000000000000000000000000..09925df87fb64afbdfc3b2d44b31c70fc19015ad Binary files /dev/null and b/help/images/views2-changedisplaystyle-large.png differ diff --git a/help/images/views2-changedisplaystyle.png b/help/images/views2-changedisplaystyle.png new file mode 100644 index 0000000000000000000000000000000000000000..5a82ea5610d32d23af16e6f284a31176b7e88c76 Binary files /dev/null and b/help/images/views2-changedisplaystyle.png differ diff --git a/help/images/views2-fieldspreview-large.png b/help/images/views2-fieldspreview-large.png new file mode 100644 index 0000000000000000000000000000000000000000..e2730b414b4c26872e21de02484528ae210ac289 Binary files /dev/null and b/help/images/views2-fieldspreview-large.png differ diff --git a/help/images/views2-fieldspreview.png b/help/images/views2-fieldspreview.png new file mode 100644 index 0000000000000000000000000000000000000000..5a41ab29de02367587a31eaaeee95bcae0da281b Binary files /dev/null and b/help/images/views2-fieldspreview.png differ diff --git a/help/images/views2-newview-large.png b/help/images/views2-newview-large.png new file mode 100644 index 0000000000000000000000000000000000000000..498627a90940b9fd7958ceab239aada9d6b1298b Binary files /dev/null and b/help/images/views2-newview-large.png differ diff --git a/help/images/views2-newview.png b/help/images/views2-newview.png new file mode 100644 index 0000000000000000000000000000000000000000..b522d2ce36bf1eed232940bbacf051f1a3f99856 Binary files /dev/null and b/help/images/views2-newview.png differ diff --git a/help/images/views2-rearrangefields-large.png b/help/images/views2-rearrangefields-large.png new file mode 100644 index 0000000000000000000000000000000000000000..acfed4cdf86a00dada0adcfbaf0326679b31c667 Binary files /dev/null and b/help/images/views2-rearrangefields-large.png differ diff --git a/help/images/views2-rearrangefields.png b/help/images/views2-rearrangefields.png new file mode 100644 index 0000000000000000000000000000000000000000..562df08d6858b4d33b99debf0df480ab0dd70c3d Binary files /dev/null and b/help/images/views2-rearrangefields.png differ diff --git a/help/images/views2-tablestyle-large.png b/help/images/views2-tablestyle-large.png new file mode 100644 index 0000000000000000000000000000000000000000..67e9e6b9cc0b8a4bb92d0c2aedede6d91e071571 Binary files /dev/null and b/help/images/views2-tablestyle-large.png differ diff --git a/help/images/views2-tablestyle.png b/help/images/views2-tablestyle.png new file mode 100644 index 0000000000000000000000000000000000000000..f8997403ac2d266e1898c1b760b218b81a78ff4b Binary files /dev/null and b/help/images/views2-tablestyle.png differ diff --git a/help/menu.html b/help/menu.html new file mode 100644 index 0000000000000000000000000000000000000000..b8928262810f37278c09ebac445d33293e988450 --- /dev/null +++ b/help/menu.html @@ -0,0 +1,22 @@ + +Page displays can hook into the Drupal menu system and provide menu links that will appear in the Navigation system as well as tabs that can be used to keep Views next to each other. + +For simple menu links, there is very little you need to do; simply select 'Normal menu entry' and fill in the text for the title. This will appear in the Navigation menu by default; you will need to visit the menu administration page to move this to another menu. + +Tabs are not quite so simple; there are some complex rules for using tabs in Drupal. +
    +
  1. All tabs must have a parent, which is the next level up in the path hierarchy. For example, if the view path is 'example/taba' then the parent must be 'example'. +
  2. All tabs must have one and only one default tab; this is usually the same content as the parent. +
  3. If a parent does not exist, when creating the 'default' tab, Views will allow you to also create a parent item. It will automatically set up the URL for you when it does this. +
  4. Tab weight is used to control what order the tabs are displayed in. Lower numbers will display more to the left. For tabs whose numbers are the same, they will be displayed alphabetically. +
  5. Drupal only supports 2 levels of tabs, so be careful about trying to put tabs within tabs within tabs. That won't work. +
+ +For example, if you have two views that you want to be tabs, you could set it up like this: +
    +
  • In the first view, set the path to 'tabs/tab1'. Set it to be the 'default tab', set the title to 'Tab 1' and the weight to 0. +
  • Click update and you will be taken to a form that lets you define the parent. Since 'tabs' doesn't already exist in the system, select 'Normal menu item', and set the title to 'Tabs'. +
  • On the second view, set the path to 'tabs/tab2'; set it to be a 'Menu tab', and set the title to 'Tab 2'. +
+ +With this done, you will now have a Navigation link named 'Tabs' and when you click on it, you will go to the tabs, with 'Tab 1' being the default tab that appears. You can then click between Tab 1 and Tab 2. diff --git a/help/new.html b/help/new.html new file mode 100644 index 0000000000000000000000000000000000000000..53132c661e558eb98936f1e775a97d6083d04ceb --- /dev/null +++ b/help/new.html @@ -0,0 +1,114 @@ + +Views 2 is the newest major release of Views and it is specifically coded for Drupal 6. Views 2 retains all of the core functionality of Views 1, together with a completely revamped user interface and a large set of new features which greatly expand upon the original feature-set of Views 1. This document is a side-by-side comparison of Views 1 versus Views 2 from a user's perspective, detailing the UI changes, some new ways to perform old tasks, the cool new features of Views 2 and how these features can be used to address some of the shortcomings of Views 1. + +

Admin interface

+The first thing that pops out after you install Views 2 is the radically different admin interface: +
+ +Views 2 admin interface +
+ +compared to the old comfy Views 1 interface: + +
+ +Views 1 admin interface +
+ +The new admin interface performs the same functions as the old -- listing all the views in the system, providing links to add or import views and a link to Views Tools -- but has been compacted, with each view displayed as a paragraph style-row compared to the table of Views 1 and set of filters on top to ease locating views among a large list. + +Context-help is available by clicking the small blue question-mark icon. Context-help in Views 2 is provided by the Advanced Help module, so make sure to install that together with installing Views 2. The small blue help icons will be available in various parts of the Views UI. In particular, look for them as part of the description of a display, when setting style options, and in various editing sections such as path, menu and the like. + +Several new attributes of each view are visible in the filter header: +
    +
  1. Tag - This is just another label for organizing and sorting views. Tags can be any text. Views that are provided by modules will often be tagged together to make it easy to find them.
  2. +
  3. Display - In Views 1 each view query was tied to its display; in other words your fields, sorts, filters, and arguments could only be displayed in the single page or block display provided in the view definition. In Views 2, view displays have been decoupled from view queries - it is now possible to have multiple page, block, and feed displays from a single view. More on view displays later.
  4. +
  5. Type - Views 2 view types are radically different from Views 1 types. Views 1 types basically defined how the node list displays were styled - you had Full Nodes, Teaser List, Table View, and so on. In Views 2 view display styles have been broken out into the separate Style attribute. View types now refer to the primary table on which information for the query will be retrieved which controls what arguments, fields, sort criteria and filters are available. Views 2 view types are discussed later. +
  6. +
+ +

Adding a view

+So let's jump in and add a view. For this example, we're going to create a user view, which will display a list of users. +
+ +Adding a view +
+ +The first step in adding a view is simply entering a name (only alphanumeric characters, no spaces) a description, tag, and the view type. To get the user view, we selected the User radio button. + +
+ +Configuring the new view +
+ +This might be the 2nd whoa moment as the interface here is also completely revamped from Views 1.x. The best way to summarize is to say all the pieces from the Views 1.x interface are still there...just in different places. Fields, arguments, sort critera and filters are all still there there, just in new AJAXY-flavours. + +Let's start by adding some fields: + +
+ +Adding fields +
+ +Clicking on the [+] icon next to the word Fields unfurls a section beneath the view information with all the available fields grouped by Comment, File, Node, Node revision, Taxonomy and User, and probably a few others. This is a general paradigm for the Views 2 interface -- clicking on a widget or link unfurls a section beneath the view information with the relevant interface. Usually, what is being edited will be hilited in yellow, as well. + +When adding items, you can use the Groups drop-down box to show only a subset of the fields available according to the above groups, or select All to see all fields available, which is what was selected when the section unfurled. For our example, we're selecting the 'User' group and adding the User: E-mail, User: Name and User: Picture fields. + +
+ +Adding fields +
+ +Once we add our fields they show up in the Fields section of the interface. We will be walked through each field we added, so keep clicking update, even if you don't make changes to the field and you will see the next one. + +The fields we added can be rearranged by clicking the up/down icon, right next to the add icon we used earlier. We can also remove a field using the same interface. + +
+ +Rearranging fields +
+ +From here, the fields can be dragged up and down by grabbing the little drag handle on the left and moving them where you like. Making a change to any part of the view by clicking update usually triggers a refresh of the view preview which is conveniently located right below the main interface. + +
+ +Views preview +
+ +Now that we have some fields set up we can turn our attention to Basic Settings for the view. + +It's important to note that all the interface elements pertain to the current Display selected for the view. As mentioned before a view can have multiple displays. The first time you create a view you'll be manipulating the Default display. You can add displays using the Add Display button, whose Basic Settings are completely different from each other; this lets you have as many displays of a view as you would like all sharing items such as Sort Criteria, Filters and Arguments but different display settings like Title, Style, Fields, and Pager settings. Also, any display you add automatically inherits display settings from the default display initially, so you can keep a core of common settings in your default display and add additional settings for every other display. + +
+ +Adding a Page display +
+Let's stick with the Default display and twiddle some settings. We can set the Title to "User View 1" and the Style to Table. As mentioned earlier, view styles in Views 2 correspond more to view types in Views 1 (remember, List, Table, Teasers, Full nodes). + +
+ +Selecting a Views 1 View Type +
+ +In Views 2, view styles control how a view display looks. These styles are significantly different from the Types in Views 1; in particular, types have been 'broken up'; there is now the style as well as the row style which focus on different parts of the output. + +
+ +A breakdown of View output +
+ +We change the style by clicking on the current style on the left hand side of the View information area. + +
+ +Selecting a Views 2 Display Style +
+ +We're given the style options of Grid, List, Table and Unformatted. Additional display styles can be added by modules which have Views style plugins. Choosing a style reveals a "settings" button which you can click to configure the style you've chosen. In the shot below we've selected and are configuring the Table style, which we're using to produce a more compact output than we had earlier. + +
+ +Selecting and configuring the table style +
+ +... TODO: Finish this document ... \ No newline at end of file diff --git a/help/overrides.html b/help/overrides.html new file mode 100644 index 0000000000000000000000000000000000000000..0685ce210f91d755b913ea22e269114e6b2edeb3 --- /dev/null +++ b/help/overrides.html @@ -0,0 +1,7 @@ + + +If an item is using defaults then it is using values from the default display. IMPORTANT NOTE: If you modify this value, you are modifying the default display and thus modifying for all displays that are using default values. + +If that is not what you intend, you must click the override button. Once overridden, that display now has its own version of the value; modifying it will not modify it for other displays. + +For Relationships, arguments, fields, sort criteria, and filters, each of these must be overridden as a group! In other words, you cannot override a single filter, but instead must override allr filters. A message will appear on the item to let you know what its status is, but you can only change the status by clicking on the header or the rearrange button for that item. \ No newline at end of file diff --git a/help/path.html b/help/path.html new file mode 100644 index 0000000000000000000000000000000000000000..c6bf05012390ab06bc8d96c48f916d482693dc0d --- /dev/null +++ b/help/path.html @@ -0,0 +1,8 @@ + +If a display has a path that means that it can be retrieved directly by calling a URL as a first class page on your Drupal site. Any items after the path will be passed into the view as arguments. For example, if the path is foo/bar and a user visits http://www.example.com/foo/bar/baz/beta, 'baz' and 'beta' will be given as arguments to the view. These can be handled by adding items to the arguments section. + +You may also use placeholders in your path to represent arguments that come in the middle. For example, the path node/%/someview would expect the first argument to be the second part of the path. For example, node/21/someview would have an argument of '21'. + +Note: Views 1 used $arg for this kind of thing. $arg is no longer allowed as part of the path. You must use % instead. + +If multiple displays within the same view have the same path, the user will get the first display they have access to. This means you can create successfuly less restricted displays in order to give administrators and privileged users different content at the same path. \ No newline at end of file diff --git a/help/relationship.html b/help/relationship.html new file mode 100644 index 0000000000000000000000000000000000000000..f8449ed63563b8b2cbf74a1269e2304d0d5938a2 --- /dev/null +++ b/help/relationship.html @@ -0,0 +1,14 @@ + +Relationships allow you to expand the query to include objects other than the base query. This is actually made more difficult to understand by the fact that Views actually includes a few relationships by default, and doesn't tell you they're there. For historical reasons, it would be inconvenient to remove these default relationships. When relationships are present, all fields (including relationships) will gain a new form item to let you select which relationship they will use. They will default to using no relationship at all. + +The main example of the relationship that is there by default is the node --> user relationship; every node has an author, and if a node is in the query, the user who wrote that node is automatically made available. [Note: the author considers it an error that this relationship is automatic, but by the time it was realized this was in error, it was too late to change it.] + +A similar relationship that is not automatically made available is for node revisions. Each revision has its own author, which is the user who made the revision. By adding the "Node revision: User" relationship, all of the 'user' fields, sorts, filters and arguments available to a user will now be available for the revision author. + +When a relationship is added to the view, all applicable items will gain a "Relationship" select box, where you can choose which version of that particular item you wish to use. This can be illustrated with an example: + +A 'comment' view contains the relationships 'Comment: node' and 'Comment: user'. This means that all the fields for the node that a comment is attached to are available, and all the user fields for that node author also become available. The other relationship makes fields for the author of the comment available -- very often not the author of the node! + +When you add the "User: name" field, you will be presented with a select box. Either the node relationship or the user relationship must be selected, because there are two possible user names in the view to choose from. + +Another example of relationships involves the Files table. In Drupal, files are related to users, but files are not necessarily related to nodes. However, the upload.module allows some files to be attached to nodes. The only way for Views to deal with this discrepancy is with relationships. When creating a 'node' view, it's possible to add an uploaded files relationship to get file data for nodes that were attached with the upload module. It is also possible to go the other way; from a files view you may add a relationship via the Upload table to view information about the node. diff --git a/help/sort.html b/help/sort.html new file mode 100644 index 0000000000000000000000000000000000000000..673b4ad79867c53c96616abb2678fd8707d8fd43 --- /dev/null +++ b/help/sort.html @@ -0,0 +1,25 @@ + +Sort criteria determine what order the records are retrieved from the database and displayed in; generally, all you need to do is pick a field and choose ascending (1, 2, 3, 4) or descending (4, 3, 2, 1) and it will be done. If you have multiple sort criteria, the second (and later) items only come into play if the first item is the same. + +Different data types sort just a little bit differently from others: +
+
Number fields
+
Number fields sort like you would expect. 1 comes before 2 which comes before 10 which comes before 100 which comes before 200, etc.
+
Text fields
+
Text fields always sort alphabetically, even if the text contains numbers. This can have some odd effects if you have numbers stored in text, because the values 1, 3, 7, 10, 12, 20, 100, 120 will sort like this: +
    +
  • 1
  • +
  • 10
  • +
  • 100
  • +
  • 12
  • +
  • 120
  • +
  • 200
  • +
  • 3
  • +
  • 7
  • +
+ +This is because these fields sort purely by characters, and not numeric value. i.e, comparing 200 and 3, the '2' comes before the '3', therefore, '200' is "smaller" than '3'. +
+
Date fields
+
Date fields often can have a 'granularity', which is a way of making similar dates actually be the same date. Take two dates that are close to each other: May 1, 2007 5:30 am and May 1, 2007 9:45am. Without granularity, the two dates are compared and the first date comes before the second date. However, if the granularity is set to 'day' it only looks at the parts of the date up to the day: May 1, 2007 and May 1, 2007. At that point, they are the same, and the sort would move on to the next sort criterion.
+
diff --git a/help/style-comment-rss.html b/help/style-comment-rss.html new file mode 100644 index 0000000000000000000000000000000000000000..2b20df1d49ad30a8ce90d8927554ffa47e08fa50 --- /dev/null +++ b/help/style-comment-rss.html @@ -0,0 +1,2 @@ + +This row style is only available to RSS styles. It produces XML necessary for an RSS feed for the comment. \ No newline at end of file diff --git a/help/style-fields.html b/help/style-fields.html new file mode 100644 index 0000000000000000000000000000000000000000..d9e397cb5b05111b41d73773bb5067d4b2fcaafd --- /dev/null +++ b/help/style-fields.html @@ -0,0 +1,6 @@ + +The fields row style displays each field defined in the view, one after another. Each field defines its own output. + +By default, each field is put in a <div> unless it is selected to be inline. If it is inline, it is put in a <span>. Two items in <div>s will be displayed one after another, with the second one below the first. Two items in <span>s will be displayed on the same line. One item in a <span> next to <div>s is the same as two items in <div>s. This means that for the inline setting to do anything, at least two consecutive items must be set inline. + +You may define a separator which will be placed between each item. This separator may be html. You can use &nbsp; to print blank space. \ No newline at end of file diff --git a/help/style-grid.html b/help/style-grid.html new file mode 100644 index 0000000000000000000000000000000000000000..9718619962219f14c3d4a99b5a21c4c1eeda4359 --- /dev/null +++ b/help/style-grid.html @@ -0,0 +1,21 @@ + +The grid style will display each row of your view within a grid. You may customize the number of columns, though it defaults to 4. A grid looks like this: + + + + + + +
row 1row 2row 3row 4
row 5row 6row 7row 8
row 9row 10row 11row 12
row 13row 14row 15row 16
+ +The above uses the 'horizontal' alignment, where rows are added into the grid from left to right. + +With a vertical alignment, rows will be placed from top to bottom, like this: + + + + + +
row 1row 5row 9row 13
row 2row 6row 10row 14
row 3row 7row 11row 15
row 4row 8row 12row 16
+ +This style uses a row style to determine what each row will look like. \ No newline at end of file diff --git a/help/style-list.html b/help/style-list.html new file mode 100644 index 0000000000000000000000000000000000000000..2f88a62be6fca57016065915cf0ebf950b459727 --- /dev/null +++ b/help/style-list.html @@ -0,0 +1,21 @@ + +The List view style will display every row of the view as part of an HTML list construct. For example: +
    +
  • Row 1
  • +
  • Row 2
  • +
  • Row 3
  • +
  • Row 4
  • +
+ +You may select whether or not the list is ordered which just means whether or not it uses numbers instead of the bullet: + +
    +
  1. Row 1
  2. +
  3. Row 2
  4. +
  5. Row 3
  6. +
  7. Row 4
  8. +
+ +The list style also uses a row style which means that it doesn't care what the actual output for each row of the view is. + +If you need information about using CSS to style list views, you may find this A list apart guide to styling lists useful. \ No newline at end of file diff --git a/help/style-node-rss.html b/help/style-node-rss.html new file mode 100644 index 0000000000000000000000000000000000000000..c869a311e537fdb31d2000e4bab6cb223cca8858 --- /dev/null +++ b/help/style-node-rss.html @@ -0,0 +1,2 @@ + +This row style is only available to RSS styles. It produces XML necessary for an RSS feed for the node record. \ No newline at end of file diff --git a/help/style-node.html b/help/style-node.html new file mode 100644 index 0000000000000000000000000000000000000000..5c40c6859fe923717ce8dd7c87b79911107809ee --- /dev/null +++ b/help/style-node.html @@ -0,0 +1,10 @@ + +The node row style will display each item of the view through Drupal's standard node_view() function. Views has very little control over this output, except for the options you see. Instead, the output is run through the standard node template mechanism (typically node.tpl.php or a variant thereof) and any decisions about what is output may be done there. + +Views does add an extra 'suggestion' to the list of possible node templates: node-view-VIEWNAME.tpl.php -- you may use this to theme a node specifically for the view. This can be handy for creating very small teasers and the like. + +You may opt to display the full node body or the node teaser, and you may add the node links (such as he 'comment' links that appear after a node) or not. + +Because of this behavior, the node row style does not utilize fields and the Fields section will not be displayed. + +Please note that this row style performs a node_load() for every row, and as such can produce a lot of extra queries. Sometimes this is necessary, but it can have a negative impact on your site's performance! \ No newline at end of file diff --git a/help/style-row.html b/help/style-row.html new file mode 100644 index 0000000000000000000000000000000000000000..be7ea0cecc3909b98661193fab5989a475ccce45 --- /dev/null +++ b/help/style-row.html @@ -0,0 +1,4 @@ + +A row style is an individual style to display only an individual record within a view. For example, a node type view would display one node per row; a user type view would display one user per row. + +Some row styles use fields which means you select from the available fields to display; others do not; they are able to use the base type and create a display. Usually, row styles that do not use fields produce less efficient (slower) views, so bear this in mind when contemplating the performance of your site. \ No newline at end of file diff --git a/help/style-rss.html b/help/style-rss.html new file mode 100644 index 0000000000000000000000000000000000000000..7f59e147869cca4e4d269a87bf373a33c52fd49a --- /dev/null +++ b/help/style-rss.html @@ -0,0 +1,4 @@ + +The RSS output style is only available for Feed display types. It will display the view as an RSS feed, which is a specialized XML output. This output is not user visible, but can be parsed by feed readers for aggregation. + +You may supply a description for the RSS feed; most feed readers will display this description along with the contents of the feed. You may also select to use the site's mission statement for the description. \ No newline at end of file diff --git a/help/style-summary-unformatted.html b/help/style-summary-unformatted.html new file mode 100644 index 0000000000000000000000000000000000000000..ecc29522534f14ac6db6620c8bc7283d905bcc12 --- /dev/null +++ b/help/style-summary-unformatted.html @@ -0,0 +1,4 @@ + +The unformatted summary style is only available for summary styles, which are when an argument has been set to provide a summary if it was not provided with a value. This summary provides the possible candidates for the argument one after another with no special formatting. If inline is selected, the summary items will be enclosed within <span> tags. Otherwise the items will be in <div> tags. + +You can also elect to display the number of matching records for the argument, plus change the number of items per page for the summary. This is often useful because summary views are often quite small, but other views quite space intensive. It is very common to have far more records available in the summary view than in the more normal view. \ No newline at end of file diff --git a/help/style-summary.html b/help/style-summary.html new file mode 100644 index 0000000000000000000000000000000000000000..88b6923e25a6555fcf3e686a19aa44f0d5ce8ce1 --- /dev/null +++ b/help/style-summary.html @@ -0,0 +1,4 @@ + +The list summary style is only available for summary styles, which are when an argument has been set to provide a summary if it was not provided with a value. This summary provides a list of possible candidates for the argument in a standard HTML list. Like the normal list style, you may set this list to be ordered or not. + +You can also elect to display the number of matching records for the argument, plus change the number of items per page for the summary. This is often useful because summary views are often quite small, but other views quite space intensive. It is very common to have far more records available in the summary view than in the more normal view. \ No newline at end of file diff --git a/help/style-table.html b/help/style-table.html new file mode 100644 index 0000000000000000000000000000000000000000..40c25a2c560e8ebda1223c4fadc4e341451e447a --- /dev/null +++ b/help/style-table.html @@ -0,0 +1,14 @@ + +The table style will display the View results as a table; each row of the table will correspond to a row from the view result. + +When setting the table options, each field in the view will be presented with some information next to each field: +
+
Column
+
By default, each field is its own column. However, you can place multiple fields in the same column. To do this, pick which field you want to represent the column, then pick another field and set the 'column' value to that field. You can place as many fields as you like in a single column, but only the main field in a column can be click-sorted.
+
Separator
+
If you have multiple fields in the same column, the separator will be placed between each one. At the very least, &nbsp; should be used, as without the separator the fields will be placed very close to each other. Common separators are a bullet, the | symbol, and a comma. If there are no other fields in the column, the separator will have no effect.
+
Sortable
+
If checked, the header for the column will be clickable, and the user may re-sort the table by clicking on this to sort by that field. At this time Views does not support click-sorting to sort by multiple columns at the same time.
+
Default sort
+
You may select a column which will be sorted by default when the table is first viewed. This column will be highlighted to the user. You may also select whether the default sort is ascending or descending.
+
\ No newline at end of file diff --git a/help/style-unformatted.html b/help/style-unformatted.html new file mode 100644 index 0000000000000000000000000000000000000000..ef03634282b40d8b64f74005406f02e1d9387b50 --- /dev/null +++ b/help/style-unformatted.html @@ -0,0 +1,2 @@ + +The unformatted output style simply places each row of the view, one after another, with no additional formatting. diff --git a/help/style.html b/help/style.html new file mode 100644 index 0000000000000000000000000000000000000000..4b9dcb54ec3c48d4961713b83fa579ad7e022c73 --- /dev/null +++ b/help/style.html @@ -0,0 +1,14 @@ + +The Views' style system is how you customize the output produced by your view. A view style is basically a smart theme template that processes the view data and then outputs it. All styles in Views can be overridden by placing copies of the templates in your theme directory and then modifying them. See the theme: information link available on all views to get hints for which templates a given view is using. + +
+ +A breakdown of View output +
+By default, the style is unformatted, which means that there is very little style actually used; the records are simply displayed one after another, enclosed in a <div> tag so that you can use CSS to manipulate the view. + +Some styles use a separate row style to determine how each row of the View looks. This is useful for mixing and matching styles to more readily produce exactly the kind of output you need. + +Many styles can be grouped. For styles that can, there will be a 'grouping field' option; pick one of the fields to group by. This grouping field will be displayed as a header, and all rows will be displayed beneath it. + +Each style is its own entity. \ No newline at end of file diff --git a/help/theme-css.html b/help/theme-css.html new file mode 100644 index 0000000000000000000000000000000000000000..ba824c726b2b4df51561a2140823770c8cfbbc65 --- /dev/null +++ b/help/theme-css.html @@ -0,0 +1,76 @@ + +Views uses a wide array of CSS classes on all of its content to ensure that you can easily and accurately select exactly the content you need in order to manipulate it with CSS. + +Typically, every view is wrapped in a div with the name of the view as part of its class (for all these examples, we will assume the name of the view is myview), as well as the generic class 'view': + +
+<div class="view view-myview">
+...
+</div>
+
+ +In your CSS, you can modify all views: + +
+div.view {
+  border: 1px solid black;
+}
+
+ +Or just your view: + +
+div.view-myview {
+  background: yellow;
+}
+
+ +By default, the general view template also provides the following classes to easily style other areas of the view: +
    +
  • .view-header
  • +
  • .view-filters
  • +
  • .view-content
  • +
  • .view-empty (if an "empty" text is used when the view has no results)
  • +
  • .view-footer
  • +
  • .feed-icon
  • +
  • .attachment-before (if using an "attachment" display)
  • +
  • .attachment-after (if using an "attachment" display)
  • +
+ +So for example: +
+div.view-myview div.view-header {
+  /* make the header stand out */
+  font-size: 120%;
+  font-weight: bold;
+}
+
+div.view-myview div.view-footer {
+  /* Make the footer less important */
+  font-size: 80%;
+  font-style: italic;
+  color: #CCC;
+}
+
+ +In the above example, we whimsically made the header bold and in a bigger font, and the footer smaller, italicized, and greyish. + +

Views with fields

+If your view has fields, each field is uniquely tagged with its ID. A field's ID may be gleaned from the Theme: Information page. Note that due to CSS rules, any _ in the id will be converted to - automatically, so if you have a field whose id is 'edit_node' (this is the field used to provide an "edit" link to a node), it will be 'edit-node'. Additionally, to make sure that the view IDs don't conflict with other css classes in the system, they will be pretended with 'views-field-'; thus, the final CSS class for the field with the id 'edit_node' will be views-field-edit-node. + +Exactly how this appears is going to depend upon the style you're using. For example, the 'unformatted' style uses div.views-field-edit-node and div.views-label-edit-node to access that particular field, but a table would use td.views-field-edit-node and th.views-field-edit-node to access the table header; or just .views-field-edit-node to affect both. + +
+.view-myview th {
+  color: red; /* make all headers red */
+}
+
+.view-myview .views-field-title {
+  font-weight: bold; /* Make the 'title' field bold */
+}
+
+.view-myview td.views-field-body {
+  font-size: 60%; /* Make the text in the body field small */
+}
+
+ diff --git a/help/updating.html b/help/updating.html new file mode 100644 index 0000000000000000000000000000000000000000..aade41e874e4fbf7f15aa6d3996b2f3a3cec7f18 --- /dev/null +++ b/help/updating.html @@ -0,0 +1,3 @@ + +TODO: This document needs to be fleshed out. + diff --git a/help/using-theme.html b/help/using-theme.html new file mode 100644 index 0000000000000000000000000000000000000000..c12998c7ce89780ddc4da933c69c30873baf16cc --- /dev/null +++ b/help/using-theme.html @@ -0,0 +1,51 @@ + +Views theme templates are straightforward to use with the Drupal theming system. If you are unfamiliar with the theming system at all, you should probably at least read drupal.org theming documentation. That said, these are the important things you need to know: + +
    +
  1. Copy a base Views template to one of the names provided from the Theme: Information section of the View. Copy this template right into your theme directory.
  2. +
  3. Clear the theme registry. See the instructions for how to do this.
  4. +
  5. Your new template should now operate; assuming you picked a nicely named template that includes the view name, that template should now be active for your view. A good example is views-view-list--foobar.tpl.php which would work for a view named 'foobar'.
  6. +
  7. You can now modify this template all you like.
  8. +
+ +For any template that uses fields, the fields will be in array. In order to use this effectively, you will need to understand enough PHP to fetch data from an array. This is a place where the devel module can really help you, because you can use its dsm() function right in your template to see what variables it uses. There is an alternative to dsm() that works without devel module, but it's a bit longer to use. + +For example, I placed the following code inside a loop in views-view-table.php.php: + <?php drupal_set_message('<pre>' . var_export($row, true) . '</pre>'); ?> + + +And it produced this output: + array ( + 'nid' => '97', + 'title' => 'Scisco Ideo Vicis Feugiat Qui', + 'name' => 'luwrepuslan', + ) + + +My view had three fields: +Node: Nid +Node: Title +User: Name + + +The contents of the $row variable included these fields, in precisely the order that I had arranged them to using the Views rearrange link. Also worth noting, though, is that each field also has an identifier so it can easily be pulled out of the row should I want to display it differently. Using +<?php print $row['title']; ?> + + +Would print just the title for that row. Please remember that I'm doing this inside the loop, so this will get repeated for every row of the view. + +The IDs used to fetch items from the array, id $row['title'] can be quickly and easily looked up on the Theme: Information page. Once a field has been added to the view, its ID will not change, but note that if there are two "title" fields in a view, one will be 'title' and the other will be 'title1', in order to prevent namespace collisions. + +The important thing here is that Views does provide IDs. Views doesn't tell you what these IDs are, but it's easy to get them by dumping the row data and doing a simple visual inspection. Views does guarantee that these IDs will not change, unless you actually add a new field and remove the existing one (in which case 'title', above, would become 'title1'). + +

The basic fields template

+ +The most common template people will need to rewrite is the "simple" views-view-fields.tpl.php, which is the template used by the Fields row style and all it does is display a simple list of fields. However, it is not that simple to the user. Because the template can't inherently know what the fields are, it has to go through an array in a loop. + +This loop isn't very handy when you really want to have fine control over the template by placing your fields precisely where and how you want. Relax, though; if you know what your fields are, you can rewrite this. If you end up writing your own HTML, the only part that is really important is the content for each field. We know from above that you can get the ID for each field on the Theme: Information page from the view. In the header for the template, we can see that the fields are all in the $fields array, and each field is an object. That leads us to this: + +<?php print $fields['some_id']->content; ?> + +Assuming you replace some_id with an id found on the theme: information page, this code will print the content for that field. You can also get the label and some other data about the field, as well as the raw information. Complete details for what is available are documented directly in views-view-fields.tpl.php. + +Keep in mind that if you rewrite your templates using this, you'll need to maintain this template whenever changes are made to the fields of the view; while this isn't generally recommend, sometimes it's necessary to get the kind of control you might ultimately need. diff --git a/help/view-type.html b/help/view-type.html new file mode 100644 index 0000000000000000000000000000000000000000..e5ba2f10060a57508909f66e32f1f3b5c88e9089 --- /dev/null +++ b/help/view-type.html @@ -0,0 +1,22 @@ + +

The view type describes how this view is stored; Views is capable of having Views entirely in code that are not in the database. This allows modules to easily ship with Views built in, and it allows you to create a module to store your views for easy deployment between development and production servers.

+ +
+
Normal
+
Normal views are stored in your database and are completely local to your system.
+ +
Default
+
Default views are stored only in code and are not anywhere in your database. They may be enabled or disabled but you may not completely remove them from your system. You can override the view which will create a local copy of your view. If you do this, future updates to the version in code will not affect your view.
+ +
Overridden
+
Overridden views are stored both in code and in the database; while overridden, the version that is in code is completely dormant. If you revert the view, the version in the database will be deleted, and the version that is in code will once again be used.
+
+ +You may store your views in code with the following procedure: +
    +
  1. Create a module to store the views.
  2. +
  3. Add the function MODULENAME_views_default_views() to this module.
  4. +
  5. Export the view you wish to store in your module in code. Cut and paste that into the abovenamed function. Make sure the last line of the view is: $views[$view->name] = $view;
  6. +
  7. Make sure the last line of the function is return $views;
  8. +
  9. After you make any changes, be sure to clear the Views' cache. You may do this from the Tools menu.
  10. +
diff --git a/help/views.help.ini b/help/views.help.ini new file mode 100644 index 0000000000000000000000000000000000000000..026096765762dbad125f67ddf49b6e13d4986e61 --- /dev/null +++ b/help/views.help.ini @@ -0,0 +1,204 @@ +; $Id$ +[advanced help settings] +line break = TRUE + +[about] +title = "What is Views?" +weight = -40 + +[getting-started] +title = "Getting started" +weight = -45 + +[example-users-by-role] +title = "Create a page to list users by role" +parent = getting-started +weight = -10 + +[example-recent-stories] +title = "Create a block of recent stories" +parent = getting-started +weight = 0 + +[example-user-feed] +title = "Create an RSS feed of user posts" +parent = getting-started +weight = 30 + +[example-author-block] +title = "Create a block of author's recent blog posts" +parent = getting-started +weight = 40 + +[view-type] +title = "View types" + +[display] +title = "Displays" +weight = -30 + +[display-default] +title = "Default display" +parent = display +weight = -20 + +[display-page] +title = "Page display" +parent = display +weight = -15 + +[display-block] +title = "Block display" +parent = display +weight = -10 + +[display-attachment] +title = "Attachment display" +parent = display + +[display-feed] +title = "Feed display" +parent = display + +[argument] +title = "Arguments" +parent = about + +[field] +title = "Fields" +parent = about + +[sort] +title = "Sorts" +parent = about + +[filter] +title = "Filters" +parent = about + +[relationship] +title = "Relationships" +parent = about + +[style] +title = "Output styles (View styles)" +weight = -20 + +[style-row] +title = "View row styles" +parent = style +weight = 10 + +[style-list] +title = "List output style" +parent = style + +[style-unformatted] +title = "Unformatted output style" +parent = style +weight = -6 + +[style-table] +title = "Table output style" +parent = style +weight = -5 + +[style-grid] +title = "Grid output style" +parent = style +weight = -5 + +[style-rss] +title = "RSS output style" +parent = style +weight = -5 + +[style-fields] +title = "Fields row style" +parent = style-row + +[style-node] +title = "Node row style" +parent = style-row + +[style-node-rss] +title = "Node RSS item row style" +parent = style-row + +[style-comment-rss] +title = "Comment RSS item row style" +parent = style-row + +[style-summary-unformatted] +title = "Unformatted summary style" +parent = "style" +weight = 10 + +[style-summary] +title = "List summary style" +parent = "style" +weight = 10 + +[menu] +title = "Menu options (page display)" + +[path] +title = "Path options (page display)" + +[analyze-theme] +title = "Theme information" + +[using-theme] +title = "Using Views templates" +parent = analyze-theme + +[theme-css] +title = "Using CSS with Views" +parent = analyze-theme + +[overrides] +title = What are overrides? + +[embed] +title = Embedding a view into other parts of your site + +[new] +title = What's new in Views 2 +weight = -42 + +[updating] +title = Updating your views from Views 1 to Views 2 + +; API related +[api] +title = "Views' API" +weight = 100 + +[api-tables] +title = "Describing tables to Views" +weight = -100 +parent = api + +[api-default-views] +title = "Using default views in your module" +weight = -90 +parent = api + +[api-handlers] +title = "How Views handlers work" +weight = -50 +parent = api + +[api-plugins] +title = "How Views plugins work" +weight = -40 +parent = api + +[api-upgrading] +title = "Upgrading your module Views 1 to Views 2" +parent = api + +[api-example] +title = Integrating the Node Example module +parent = api +weight = 100 \ No newline at end of file diff --git a/images/arrow-active.png b/images/arrow-active.png new file mode 100644 index 0000000000000000000000000000000000000000..3bbd3c27f29f9a1781276a2ae8faa7afd5d2d36e Binary files /dev/null and b/images/arrow-active.png differ diff --git a/images/expanded-options.png b/images/expanded-options.png new file mode 100644 index 0000000000000000000000000000000000000000..b7b755c0a44f7ebae4972e9489f7d004c0ab82c7 Binary files /dev/null and b/images/expanded-options.png differ diff --git a/images/overridden.gif b/images/overridden.gif new file mode 100644 index 0000000000000000000000000000000000000000..b7811910ef8bc56ffd61757641c3a062353ef8ed Binary files /dev/null and b/images/overridden.gif differ diff --git a/images/sprites.png b/images/sprites.png new file mode 100644 index 0000000000000000000000000000000000000000..908362229800862620d45fafead8476df6f66c2d Binary files /dev/null and b/images/sprites.png differ diff --git a/images/status-active.gif b/images/status-active.gif new file mode 100644 index 0000000000000000000000000000000000000000..207e95c3fa8cc31a89af150ad74059b1667922b6 Binary files /dev/null and b/images/status-active.gif differ diff --git a/includes/admin.inc b/includes/admin.inc new file mode 100644 index 0000000000000000000000000000000000000000..b843208fc6e4732ffaad7f95d6b84f6c8da98e27 --- /dev/null +++ b/includes/admin.inc @@ -0,0 +1,3073 @@ +enable the advanced help module, Views will provide more and better help. Hide this message.', array('@modules' => url('admin/build/modules'),'@hide' => url('admin/build/views/tools')))); + } + else { + drupal_set_message(t('If you install the advanced help module from !href, Views will provide more and better help. Hide this message.', array('!href' => l('http://drupal.org/project/advanced_help', 'http://drupal.org/project/advanced_help'), '@hide' => url('admin/build/views/tools')))); + } + } +} + +/** + * Preprocess the list views theme + */ +function template_preprocess_views_ui_list_views(&$vars) { + $items = array(); + $sorts = array(); + + $views = views_get_all_views(); + + // Respond to a reset command by clearing session and doing a drupal goto + // back to the base URL. + if (isset($_GET['op']) && $_GET['op'] == t('Reset')) { + unset($_SESSION['views']['#admin']); + drupal_goto('admin/build/views'); + } + if (count($_GET) <= 1) { + if (isset($_SESSION['views']['#admin']) && is_array($_SESSION['views']['#admin'])) { + $_GET += $_SESSION['views']['#admin']; + } + } + else { + $_SESSION['views']['#admin'] = $_GET; + unset($_SESSION['views']['#admin']['q']); + } + + $form_state = array( + 'views' => $views, + 'input' => $_GET, + 'method' => 'get', + 'rerender' => TRUE, + 'no_redirect' => TRUE, + ); + + $vars['widgets'] = drupal_build_form('views_ui_list_views_form', $form_state); + + $vars['help_type_icon'] = theme('advanced_help_topic', 'views', 'view-type'); + + $base_tables = views_fetch_base_tables(); + + foreach ($views as $view) { + if ($form_state['values']['tag'] != 'all') { + if ($form_state['values']['tag'] == 'none') { + if (!empty($view->tag)) { + continue; + } + } + else if ($form_state['values']['tag'] != $view->tag) { + continue; + } + } + if ($form_state['values']['type'] != 'all' && $form_state['values']['type'] != $view->type) { + continue; + } + + if ($form_state['values']['base'] != 'all' && $form_state['values']['base'] != $view->base_table) { + continue; + } + + if ($form_state['values']['display'] != 'all' && empty($view->display[$form_state['values']['display']])) { + continue; + } + + $item = new stdClass(); + $item->ops = array(); + if (empty($view->disabled)) { + $item->ops[] = l(t('Edit'), "admin/build/views/edit/$view->name"); + $item->ops[] = l(t('Export'), "admin/build/views/export/$view->name"); + $item->ops[] = l(t('Clone'), "admin/build/views/clone/$view->name"); + } + if ($view->type != t('Default')) { + $text = $view->type == t('Overridden') ? t('Revert') : t('Delete'); + $item->ops[] = l($text, "admin/build/views/delete/$view->name"); + } + else { + if (empty($view->disabled)) { + $item->ops[] = l(t('Disable'), "admin/build/views/disable/$view->name", array('query' => drupal_get_destination())); + } + else { + $item->ops[] = l(t('Enable'), "admin/build/views/enable/$view->name", array('query' => drupal_get_destination())); + } + } + + $item->ops = implode(' | ', $item->ops); + if (empty($view->display)) { + $item->path = t('Warning! Broken view!'); + } + else { + $item->path = $raw_path = $view->get_path(); + $item->path = $item->path && empty($view->disabled) && strpos($item->path, '%') === FALSE ? l($item->path, $item->path) : check_plain($item->path); + } + + $item->type = $view->type; + $item->name = $view->name; + + if (!empty($view->tag)) { + $item->tag = $view->tag; + } + + $item->title = $view->get_title(); + $item->base = !empty($base_tables[$view->base_table]['title']) ? $base_tables[$view->base_table]['title'] : t('Broken'); + + $item->displays = array(); + foreach ($view->display as $display) { + if (!empty($display->handler->definition['admin'])) { + $item->displays[$display->handler->definition['admin']] = TRUE; + } + } + + if ($item->displays) { + ksort($item->displays); + $item->displays = implode(', ', array_keys($item->displays)); + } + + $item->description = check_plain($view->description); + $item->classes = empty($view->disabled) ? 'view-enabled' : 'view-disabled'; + $items[] = $item; + + $sort = intval(empty($view->disabled) xor $form_state['values']['sort'] == 'asc'); + + switch ($form_state['values']['order']) { + case 'name': + default: + $sort .= strtolower($view->name); + break; + case 'title': + $sort .= strtolower($item->title); + break; + case 'path': + $sort .= strtolower($raw_path); // $path; + break; + case 'type': + $sort .= $view->type . $view->name; + break; + case 'tag': + $sort .= strtolower($view->tag); + break; + case 'desc': + $sort .= strtolower($view->description); + break; + } + + $sorts[] = $sort; + } + + if ($form_state['values']['sort'] == 'desc') { + arsort($sorts); + } + else { + asort($sorts); + } + + $i = array(); + foreach ($sorts as $id => $title) { + $i[] = $items[$id]; + } + + views_add_css('views-list'); + $vars['views'] = $i; + + $getting_started = theme('advanced_help_topic', 'views', 'getting-started', 'title'); + if (!$getting_started) { + $getting_started = t('Install the advanced help module for the getting started'); + } + + $vars['help'] = t('Not sure what to do? Try the "!getting-started" page.', array('!getting-started' => $getting_started)); +} + +/** + * Provide a form for sorting and filtering the list of views. + */ +function views_ui_list_views_form(&$form_state) { + if (!variable_get('clean_url', FALSE)) { + $form['q'] = array( + '#type' => 'hidden', + '#value' => $_GET['q'], + ); + } + + $all = array('all' => t('')); + $none = array('none' => t('')); + + $form['type'] = array( + '#type' => 'select', + '#title' => t('Storage'), + '#options' => array( + 'all' => t(''), + t('Normal') => t('Normal'), + t('Default') => t('Default'), + t('Overridden') => t('Overridden'), + ), + '#default_value' => 'all', + ); + + $bases = array(); + foreach (views_fetch_base_tables() as $table => $info) { + $bases[$table] = $info['title']; + } + + $form['base'] = array( + '#type' => 'select', + '#title' => t('Type'), + '#options' => array_merge($all, $bases), + '#default_value' => 'all', + ); + + $tags = array(); + + $extras = array(); + foreach ($form_state['views'] as $name => $view) { + if (!empty($view->tag)) { + $tags[$view->tag] = $view->tag; + } + } + + asort($tags); + + $form['tag'] = array( + '#type' => 'select', + '#title' => t('Tag'), + '#options' => array_merge($all, $none, $tags), + '#default_value' => 'all', + ); + + $displays = array(); + foreach (views_fetch_plugin_data('display') as $id => $info) { + if (!empty($info['admin'])) { + $displays[$id] = $info['admin']; + } + } + + asort($displays); + + $form['display'] = array( + '#type' => 'select', + '#title' => t('Displays'), + '#options' => array_merge($all, $displays), + '#default_value' => 'all', + ); + + $form['order'] = array( + '#type' => 'select', + '#title' => t('Sort by'), + '#options' => array( + 'name' => t('Name'), + 'title' => t('Title'), + 'tag' => t('Tag'), + 'path' => t('Path'), + 'type' => t('Type'), + 'desc' => t('Description'), + ), + '#default_value' => 'name', + ); + + $form['sort'] = array( + '#type' => 'select', + '#title' => t('Order'), + '#options' => array( + 'asc' => t('Up'), + 'desc' => t('Down'), + ), + '#default_value' => 'asc', + ); + + $form['submit'] = array( + '#name' => '', // so it won't in the $_GET args + '#type' => 'submit', + '#id' => 'edit-views-apply', + '#value' => t('Apply'), + ); + + if (!empty($_SESSION['views']['#admin'])) { + $form['reset'] = array( + '#type' => 'submit', + '#id' => 'edit-views-reset', + '#value' => t('Reset'), + ); + } + + $form['#theme'] = array('views_ui_list_views_form'); + return $form; +} + +function theme_views_ui_list_views_form($form) { + // Don't render these: + unset($form['form_id']); + unset($form['form_build_id']); + unset($form['form_token']); + return drupal_render($form); +} + +/** + * Page callback for the live preview. + * + * @todo make this use a template + */ +function views_ui_preview($js, $view) { + // Take off the items we know so that we can have just the args passed + // in for later use. + $func_args = func_get_args(); + array_shift($func_args); // $js + array_shift($func_args); // $view + $display_id = (count($func_args)) ? array_shift($func_args) : 'default'; + + $form_state = array( + 'display_id' => $display_id, + 'view_args' => $func_args ? implode('/', $func_args) : '', + 'rerender' => TRUE, + 'no_redirect' => TRUE, + 'view' => &$view, + 'ajax' => $js + ); + + $output = drupal_build_form('views_ui_preview_form', $form_state); + $args = array(); + if (isset($form_state['view_args']) && $form_state['view_args'] !== '') { + $args = explode('/', $form_state['view_args']); + } + + $errors = $view->validate(); + if ($errors === TRUE) { + $view->ajax = $js; + $view->live_preview = TRUE; + + // Store the current view URL for later use: + $view->set_display($form_state['display_id']); + $view->set_arguments($args); + + if ($view->display_handler->get_option('path')) { + $path = $view->get_url(); + } + + // Make view links come back to preview. + $view->override_path = 'admin/build/views/nojs/preview/' . $view->name . '/' . $form_state['display_id']; + + // also override $_GET['q'] so we get the pager + $_GET['q'] = $view->override_path; + if ($form_state['view_args']) { + $_GET['q'] .= '/' . $form_state['view_args']; + } + + $preview = $view->preview($form_state['display_id'], $args); + + // Get information from the preview for display. + if (!empty($view->build_info['query'])) { + $rows = array(); + $query = db_prefix_tables($view->build_info['query']); + if ($view->build_info['query_args']) { + _db_query_callback($view->build_info['query_args'], TRUE); + $query = preg_replace_callback(DB_QUERY_REGEXP, '_db_query_callback', $query); + } + $rows[] = array('' . t('Query') . '', '
' . check_plain($query) . '
'); + if (!empty($view->additional_queries)) { + $queries = '' . t('These queries were run during view rendering:') . ''; + foreach ($view->additional_queries as $query) { + if ($queries) { + $queries .= "\n"; + } + $queries .= t('[@time ms]', array('@time' => intval($query[1] * 100000) / 100)) . ' ' . $query[0]; + } + + $rows[] = array('' . t('Other queries') . '', '
' . $queries . '
'); + } + + $rows[] = array('' . t('Title') . '', filter_xss_admin($view->get_title())); + if (isset($path)) { + $path = l($path, $path); + } + else { + $path = t('This display has no path.'); + } + + $rows[] = array('' . t('Path') . '', $path); + + $rows[] = array('' . t('Query build time') . '', t('@time ms', array('@time' => intval($view->build_time * 100000) / 100))); + $rows[] = array('' . t('Query execute time') . '', t('@time ms', array('@time' => intval($view->execute_time * 100000) / 100))); + $rows[] = array('' . t('View render time') . '', t('@time ms', array('@time' => intval($view->render_time * 100000) / 100))); + drupal_alter('views_preview_info', $rows, $view); + + $info = theme('table', array(), $rows); + } + else { + $info = theme('table', array(), array(array('' . t('Query') . '', t('No query was run')))); + } + } + else { + foreach ($errors as $error) { + drupal_set_message($error, 'error'); + } + $preview = t('Unable to preview due to validation errors.'); + $info = ''; + } + + $info = '
' . $info . '
'; + + if (variable_get('views_ui_query_on_top', FALSE)) { + $output .= $info . $preview; + } + else { + $output .= $preview . $info; + } + + if (!$js) { + views_add_css('views-admin'); + drupal_set_title($view->get_title()); + return $output; + } + else { + views_include('ajax'); + $object = new stdClass(); + if (!empty($view->js_settings)) { + $object->js = $view->js_settings; + } + $object->display = ''; + if ($messages = theme('status_messages')) { + $object->display = '
' . $messages . '
'; + } + $object->display .= $output; + $object->title = $view->get_title(); + views_ajax_render($object); + } +} + +/** + * Form for generating argument information for the live preview. + */ +function views_ui_preview_form(&$form_state) { + $view = &$form_state['view']; + $view->init_display(); + $options = array(); + foreach ($view->display as $id => $display) { + $options[$id] = $display->display_title; + } + + $form['#attributes'] = array( + 'class' => 'clear-block', + ); + + $form['display_id'] = array( + '#type' => 'select', + '#title' => t('Display'), + '#options' => $options, + '#default_value' => $form_state['display_id'], + '#id' => 'preview-display-id', + ); + + $form['args'] = array( + '#type' => 'textfield', + '#title' => t('Arguments'), + '#default_value' => $form_state['view_args'], + '#description' => t('Separate arguments with a / as though they were a URL path.'), + '#id' => 'preview-args', + ); + + $form['preview'] = array( + '#type' => 'submit', + '#value' => t('Preview'), + '#id' => 'preview-submit', + ); + + $form['#action'] = url("admin/build/views/nojs/preview/$view->name"); + return $form; +} + +/** + * Submit the preview form. + * + * This just takes the data and stores it on the form state in a + * known location. The caller will be responsible for using it. + */ +function views_ui_preview_form_submit(&$form, &$form_state) { + $form_state['display_id'] = $form_state['values']['display_id']; + $form_state['view_args'] = $form_state['values']['args']; +} + +/** + * Page callback to add a new view. + */ +function views_ui_add_page() { + $form_state = array( + 'view' => NULL + ); + + return drupal_build_form('views_ui_add_form', $form_state); +} + +/** + * Page callback to add a new view. + */ +function views_ui_clone_page($view) { + $form_state = array( + 'view' => $view->copy(), + ); + + drupal_set_title(t('Clone view %view', array('%view' => $view->name))); + return drupal_build_form('views_ui_add_form', $form_state); +} + +/** + * Form constructor callback to create the views Add Form, phase 1. + */ +function views_ui_add_form(&$form_state) { + $view = $form_state['view']; + $form = array(); + + $form['name'] = array( + '#type' => 'textfield', + '#title' => t('View name'), + '#description' => t('This is the unique name of the view. It must contain only alphanumeric characters and underscores; it is used to identify the view internally and to generate unique theming template names for this view. If overriding a module provided view, the name must not be changed or instead a new view will be created.'), + '#required' => TRUE, + '#maxlength' => 32, + '#default_value' => $view ? $view->name : '', + '#attributes' => array('dir'=>'ltr'), + ); + + $form['description'] = array( + '#type' => 'textfield', + '#title' => t('View description'), + '#description' => t('This description will appear on the Views administrative UI to tell you what the view is about.'), + '#default_value' => $view ? $view->description : '', + ); + + $form['tag'] = array( + '#type' => 'textfield', + '#title' => t('View tag'), + '#description' => t('Enter an optional tag for this view; it is used only to help sort views on the administrative page.'), + '#default_value' => $view ? $view->tag : '', + '#autocomplete_path' => 'admin/views/ajax/autocomplete/tag', + ); + + $base_tables = array(); + foreach (views_fetch_base_tables() as $table => $info) { + $base_tables[$table] = $info['title'] . '
' . $info['description'] . '
'; + } + + $form['base_table'] = array( + '#type' => 'radios', + '#title' => t('View type'), + '#description' => t('The view type is the primary table for which information is being retrieved. The view type controls what arguments, fields, sort criteria and filters are available, so once this is set it cannot be changed.'), + '#default_value' => $view ? $view->base_table : 'node', + '#options' => $base_tables, + ); + + if ($view) { + $form['base_table']['#disabled'] = TRUE; + } + + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Next'), + '#validate' => array('views_ui_add_form_validate'), + '#submit' => array('views_ui_add_form_submit'), + ); + + return $form; +} + +/** + * Validate the add view form. + */ +function views_ui_add_form_validate($form, &$form_state) { + $name = $form_state['values']['name']; + + // View name must be alphanumeric or underscores, no other punctuation. + if (preg_match('/[^a-zA-Z0-9_]/', $name)) { + form_error($form['name'], t('View name must be alphanumeric or underscores only.')); + } + + // View name must already exist. + $view = views_get_view($form_state['values']['name']); + if ($view && $view->type != t('Default')) { + form_error($form['name'], t('You must use a unique name for this view.')); + } +} + +/** + * Process the add view form + */ +function views_ui_add_form_submit($form, &$form_state) { + $view = $form_state['view'] ? $form_state['view'] : views_new_view(); + $view->name = $form_state['values']['name']; + $view->description = $form_state['values']['description']; + $view->tag = $form_state['values']['tag']; + if (empty($form['base_table']['#disabled'])) { + $view->base_table = $form_state['values']['base_table']; + } + + views_ui_cache_set($view); + $form_state['redirect'] ='admin/build/views/edit/' . $view->name; +} + +/** + * Page to delete a view. + */ +function views_ui_delete_confirm(&$form_state, $view) { + $form_state['view'] = &$view; + $form = array(); + + $cancel = 'admin/build/views'; + if (!empty($_REQUEST['cancel'])) { + $cancel = $_REQUEST['cancel']; + } + + if ($view->type == t('Overridden')) { + $title = t('Are you sure you want to revert the view %name?', array('%name' => $view->name)); + $desc = t('Reverting the view will delete the view that is in the database, reverting it to the original default view. Any changes you have made will be lost and cannot be recovered.'); + $button = t('Revert'); + } + else { + $title = t('Are you sure you want to delete the view %name?', array('%name' => $view->name)); + $desc = t('Deleting a view cannot be undone.'); + $button = t('Delete'); + } + + return confirm_form($form, + $title, + $cancel, + $desc, + $button, + t('Cancel')); +} + +/** + * Submit handler to delete a view. + */ +function views_ui_delete_confirm_submit(&$form, &$form_state) { + $form_state['view']->delete(); + views_object_cache_clear('view', $form_state['view']->name); + drupal_set_message(t('The view has been deleted.')); + $form_state['redirect'] = 'admin/build/views'; +} + +/** + * Page to delete a view. + */ +function views_ui_break_lock_confirm(&$form_state, $view) { + $form_state['view'] = &$view; + $form = array(); + + if (empty($view->locked)) { + return t('There is no lock on view %view to break.', array('%name' => $view->name)); + } + + $cancel = 'admin/build/views/edit/' . $view->name; + if (!empty($_REQUEST['cancel'])) { + $cancel = $_REQUEST['cancel']; + } + + $account = user_load($view->locked->uid); + return confirm_form($form, + t('Are you sure you want to break the lock on view %name?', + array('%name' => $view->name)), + $cancel, + t('By breaking this lock, any unsaved changes made by !user will be lost!', array('!user' => theme('username', $account))), + t('Break lock'), + t('Cancel')); +} + +/** + * Submit handler to break_lock a view. + */ +function views_ui_break_lock_confirm_submit(&$form, &$form_state) { + db_query("DELETE FROM {views_object_cache} WHERE obj = 'view' AND name = '%s'", $form_state['view']->name); + $form_state['redirect'] = 'admin/build/views/edit/' . $form_state['view']->name; + drupal_set_message(t('The lock has been broken and you may now edit this view.')); +} + +/** + * The main view edit page + */ +function views_ui_edit_page($view) { + drupal_set_title(t('Edit view %view', array('%view' => $view->name))); + $output = theme('views_ui_edit_view', $view); + views_ui_check_advanced_help(); + return $output; +} + +/** + * Export a view for cut & paste. + */ +function views_ui_export_page(&$form_state, $view) { + $code = $view->export(); + $lines = substr_count($code, "\n"); + $form['code'] = array( + '#type' => 'textarea', + '#title' => $view->name, + '#default_value' => $code, + '#rows' => $lines, + ); + return $form; +} + +/** + * Import a view from cut & paste + */ +function views_ui_import_page(&$form_state) { + $form['name'] = array( + '#type' => 'textfield', + '#title' => t('View name'), + '#description' => t('Enter the name to use for this view if it is different from the source view. Leave blank to use the name of the view.'), + ); + + $form['view'] = array( + '#type' => 'textarea', + '#title' => t('Paste view code here'), + '#required' => TRUE, + ); + + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Import'), + '#submit' => array('views_ui_import_submit'), + '#validate' => array('views_ui_import_validate'), + ); + return $form; +} + +/** + * Validate handler to import a view + */ +function views_ui_import_validate($form, &$form_state) { + $view = ''; + views_include('view'); + ob_start(); + eval($form_state['values']['view']); + ob_end_clean(); + + if (!is_object($view)) { + return form_error($form['view'], t('Unable to interpret view code.')); + } + + if (empty($view->api_version) || $view->api_version < 2) { + // Check for some value that would only exist on a Views 1 view. + if (isset($view->url) || isset($view->page) || isset($view->block)) { + views_include('convert'); + $view = views1_import($view); + drupal_set_message(t('You are importing a view created in Views version 1. You may need to adjust some parameters to work correctly in version 2.'), 'warning'); + } + else { + form_error($form['view'], t('That view is not compatible with this version of Views.')); + } + } + + // View name must be alphanumeric or underscores, no other punctuation. + if (!empty($form_state['values']['name']) && preg_match('/[^a-zA-Z0-9_]/', $form_state['values']['name'])) { + form_error($form['name'], t('View name must be alphanumeric or underscores only.')); + } + + if ($form_state['values']['name']) { + $view->name = $form_state['values']['name']; + } + + $test = views_get_view($view->name); + if ($test && $test->type != t('Default')) { + form_set_error('', t('A view by that name already exists; please choose a different name')); + } + + $view->init_display(); + + $broken = FALSE; + // Make sure that all plugins and handlers needed by this view actually exist. + foreach ($view->display as $id => $display) { + if (empty($display->handler) || !empty($display->handler->broken)) { + drupal_set_message(t('Display plugin @plugin is not available.', array('@plugin' => $display->display_plugin)), 'error'); + $broken = TRUE; + continue; + } + + $plugin = views_get_plugin('style', $display->handler->get_option('style_plugin')); + if (!$plugin) { + drupal_set_message(t('Style plugin @plugin is not available.', array('@plugin' => $display->handler->get_option('style_plugin'))), 'error'); + $broken = TRUE; + } + else if ($plugin->uses_row_plugin()) { + $plugin = views_get_plugin('row', $display->handler->get_option('row_plugin')); + if (!$plugin) { + drupal_set_message(t('Row plugin @plugin is not available.', array('@plugin' => $display->handler->get_option('row_plugin'))), 'error'); + $broken = TRUE; + } + } + + foreach (views_object_types() as $type => $info) { + $handlers = $display->handler->get_handlers($type); + if ($handlers) { + foreach ($handlers as $id => $handler) { + if ($handler->broken()) { + drupal_set_message(t('@type handler @table.@field is not available.', array( + '@type' => $info['stitle'], + '@table' => $handler->table, + '@field' => $handler->field, + )), 'error'); + $broken = TRUE; + } + } + } + } + } + + if ($broken) { + form_set_error('', t('Unable to import view.')); + } + + $form_state['view'] = &$view; +} + +/** + * Submit handler for view import + */ +function views_ui_import_submit($form, &$form_state) { + // Store in cache and then go to edit. + views_ui_cache_set($form_state['view']); + $form_state['redirect'] = 'admin/build/views/edit/' . $form_state['view']->name; +} + +/** + * The main edit view form, which is really just a save/cancel/delete button. + */ +function views_ui_edit_view_form(&$form_state, $view) { + $form['buttons']['save'] = array( + '#type' => 'submit', + '#value' => t('Save'), + '#validate' => array('views_ui_edit_view_form_validate'), + '#submit' => array('views_ui_edit_view_form_submit'), + ); + + $form['buttons']['cancel'] = array( + '#type' => 'submit', + '#value' => t('Cancel'), + '#submit' => array('views_ui_edit_view_form_cancel'), + ); + + if (is_numeric($view->vid)) { + $form['buttons']['delete'] = array( + '#type' => 'submit', + '#value' => t('Delete'), + '#submit' => array('views_ui_edit_view_form_delete'), + ); + } + + $form_state['view'] = &$view; + return $form; +} + +/** + * Validate that a view is complete and whole. + */ +function views_ui_edit_view_form_validate($form, &$form_state) { + // Do not validate cancel or delete. + if (empty($form_state['clicked_button']['#value']) || $form_state['clicked_button']['#value'] != t('Save')) { + return; + } + + $errors = $form_state['view']->validate(); + if ($errors !== TRUE) { + foreach ($errors as $error) { + form_set_error('', $error); + } + } +} + +/** + * Submit handler for the edit view form. + */ +function views_ui_edit_view_form_submit($form, &$form_state) { + // Go through and remove displayed scheduled for removal. + foreach ($form_state['view']->display as $id => $display) { + if (!empty($display->deleted)) { + unset($form_state['view']->display[$id]); + } + } + + $form_state['view']->save(); + drupal_set_message(t('The view %name has been saved.', array('%name' => $form_state['view']->name))); + + // Make sure menu items get rebuilt as neces + menu_rebuild(); + + // Clear the views cache. + cache_clear_all('*', 'cache_views'); + + // Clear the page cache. + cache_clear_all(); + + // Remove this view from cache so we can edit it properly. + views_object_cache_clear('view', $form_state['view']->name); +} + +/** + * Submit handler for the edit view form. + */ +function views_ui_edit_view_form_cancel($form, &$form_state) { + // Remove this view from cache so edits will be lost. + views_object_cache_clear('view', $form_state['view']->name); + if (empty($form['view']->vid)) { + // I seem to have to drupal_goto here because I can't get fapi to + // honor the redirect target. Not sure what I screwed up here. + drupal_goto('admin/build/views'); + } +} + +function views_ui_edit_view_form_delete($form, &$form_state) { + unset($_REQUEST['destination']); + // Redirect to the delete confirm page + $form_state['redirect'] = array('admin/build/views/delete/' . $form_state['view']->name, 'cancel=admin/build/views/edit/' . $form_state['view']->name); +} + +/** + * Preprocess the view edit page. + */ +function template_preprocess_views_ui_edit_view(&$vars) { + $view = &$vars['view']; + + $vars['save_button'] = drupal_get_form('views_ui_edit_view_form', $view); + + $table = views_fetch_data($view->base_table); + $vars['base_table'] = !empty($table['table']['base']['title']) ? + $table['table']['base']['title'] : t('Unknown or missing table name'); + + views_include('tabs'); + $tabs = new views_tabset; + + $vars['message'] = '
' . t("Click on an item to edit that item's details.") . '
'; + + if (!$view->set_display('default')) { + drupal_set_message(t('This view has a broken default display and cannot be used.'), 'error'); + } + + foreach ($view->display as $display) { + list($title, $body) = views_ui_display_tab($view, $display); + // The first display is the default. + $tabs->set($display->id, $title, $body); + } + + // This is the area that will render beneath the links + $form_state = array( + 'view' => &$view, + 'ajax' => FALSE, + ); + + $display_button = drupal_build_form('views_ui_add_display_form', $form_state); + $analyze_button = drupal_get_form('views_ui_analyze_view_button', $view); + $tabs->add_extra($display_button . $analyze_button); + + $vars['tabs'] = $tabs->render(); + + $form_state = array( + 'display_id' => 'default', + 'view_args' => '', + 'rerender' => FALSE, + 'no_redirect' => TRUE, + 'view' => &$view, + 'input' => array(), + ); + $vars['preview'] = drupal_build_form('views_ui_preview_form', $form_state); + + $vars['locked'] = NULL; + if (isset($view->locked) && is_object($view->locked)) { + $account = user_load($view->locked->uid); + $vars['locked'] = theme('username', $account); + $vars['lock_age'] = format_interval(time() - $view->locked->updated); + $vars['break'] = url('admin/build/views/break-lock/' . $view->name); + } + + $vars['quick_links_raw'] = array( + array( + 'title' => t('Export'), + 'alt' => t("Export this view"), + 'href' => "admin/build/views/export/$view->name", + ), + array( + 'title' => t('Clone'), + 'alt' => t("Create a copy of this view"), + 'href' => "admin/build/views/clone/$view->name", + ), + ); + + $paths = array(); + foreach ($view->display as $id => $display) { + if (!empty($display->handler) && $display->handler->has_path()) { + $path = $display->handler->get_path(); + if (strpos($path, '%') === FALSE && !isset($paths[$path])) { + $vars['quick_links_raw'][] = array( + 'title' => t('View "@display"', array('@display' => $display->display_title)), + 'alt' => t("Go to the real page for this display"), + 'href' => $path, + ); + // Displays can have the same path; no point in showing more than one link. + $paths[$path] = TRUE; + } + } + } + + $vars['quick_links'] = theme('links', $vars['quick_links_raw']); + views_add_css('views-admin'); + views_add_css('views'); + views_add_js('ajax'); + drupal_add_js('misc/jquery.form.js'); + + // Also add any js files required by plugins: + $plugins = views_fetch_plugin_data(); + foreach ($plugins as $type => $type_plugins) { + foreach ($type_plugins as $name => $plugin) { + if (!empty($plugin['js'])) { + foreach ($plugin['js'] as $file) { + drupal_add_js($file); + } + } + } + } + + $settings = array('views' => array('ajax' => array( + 'id' => '#views-ajax-pad', + 'title' => '#views-ajax-title', + 'defaultForm' => $vars['message'], + ))); + + drupal_add_js($settings, 'setting'); +} + +function template_preprocess_views_ui_edit_tab(&$vars) { + $view = $vars['view']; + $display = $vars['display']; + $plugin = $display->handler->definition; + + $top = $left = $middle = $right = ''; + + // If this form was submitted it was already handled, so force it not to + // submit again. + + $vars['remove'] = ''; + if (empty($plugin['no remove'])) { + if (!empty($_POST['form_id']) && $_POST['form_id'] == 'views_ui_remove_display_form') { + unset($_POST['form_id']); + } + $form_state = array('view' => &$view, 'display_id' => $display->id, 'ajax' => FALSE); + $vars['remove'] = drupal_build_form('views_ui_remove_display_form', $form_state); + } + + // basic fields + $vars['title'] = check_plain($display->display_title); + $vars['description'] = check_plain($plugin['help']); + + // Special fields if tihs is the default display. + $vars['default'] = ($display->id == 'default'); + $vars['details_class'] = views_ui_item_css('details'); + if (!empty($view->changed_sections['details'])) { + $vars['details_changed'] = TRUE; + } + + $tag = empty($view->tag) ? t('None') : $view->tag; + $vars['details'] = t('Tag') . ': ' . l($tag, "admin/build/views/nojs/details/$view->name", array('attributes' => array('class' => 'views-ajax-link'))); + + // Calculate options from display plugin. + $options = $categories = array(); + $display->handler->options_summary($categories, $options); + + // Build all of the options we were returned and put them into the + // category data fields. + foreach ($options as $id => $option) { + if (empty($categories[$option['category']]['data'])) { + $categories[$option['category']]['data'] = array(); + } + $categories[$option['category']]['data'][$id] = array(); + $data = &$categories[$option['category']]['data'][$id]; + $data['content'] = ''; + $data['links'] = ''; + $data['overridden'] = FALSE; + $data['defaulted'] = FALSE; + + // If there are optional links, build them first so they float properly. + if (!empty($option['links'])) { + foreach ($option['links'] as $link_id => $link_value) { + $data['links'] .= $display->handler->option_link($link_value, $link_id, 'views-button-configure'); + } + } + if (!empty($option['title'])) { + $data['content'] .= $option['title'] . ': '; + } + + $data['content'] .= $display->handler->option_link($option['value'], $id, '', empty($option['desc']) ? '' : $option['desc']); + if (!empty($display->handler->options['defaults'][$id])) { + $display_id = 'default'; + $data['defaulted'] = TRUE; + } + else { + $display_id = $display->id; + if (!$display->handler->is_default_display()) { + if ($display->handler->defaultable_sections($id)) { + $data['overridden'] = TRUE; + } + } + } + $data['class'] = views_ui_item_css($display_id . '-' . $id); + if (!empty($view->changed_sections[$display_id . '-' . $id])) { + $data['changed'] = TRUE; + } + } + + $vars['categories'] = $categories; + + // Add a help icon + if (isset($plugin['help topic'])) { + $vars['display_help_icon'] = theme('advanced_help_topic', $plugin['module'], $plugin['help topic']); + } + else { + $vars['display_help_icon'] = ''; + } + + // Fetch style plugin info because it has some effect on how/what we render. + $style_plugin = $display->handler->get_plugin(); + + $vars['fields'] = ''; + $vars['fields'] = theme('views_ui_edit_item', 'field', $view, $display, !($style_plugin && $style_plugin->uses_fields())); + $vars['relationships'] = theme('views_ui_edit_item', 'relationship', $view, $display); + $vars['arguments'] = theme('views_ui_edit_item', 'argument', $view, $display); + $vars['filters'] = theme('views_ui_edit_item', 'filter', $view, $display); + $vars['sorts'] = theme('views_ui_edit_item', 'sort', $view, $display); +} + +/** + * Generate the summary output for a single display to render in a tab. + */ +function views_ui_display_tab($view, $display) { + if (isset($display->handler)) { + $plugin = $display->handler->definition; + } + if (empty($plugin)) { + $title = isset($display->display_title) ? $display->display_title : t('Invalid'); + return array($title, t("Error: Display @display refers to a plugin named '@plugin', but that plugin doesn't exist!", array('@display' => $display->id, '@plugin' => $display->display_plugin))); + + // @todo We can do a better 'plugin does not exist' tab. + } + + // The display should always be initialized prior to this call. + if (empty($display->handler)) { + return FALSE; + } + + $body = theme('views_ui_edit_tab', $view, $display); + return array($display->display_title, $body); +} + +/** + * Add information about a section to a display. + */ +function template_preprocess_views_ui_edit_item(&$vars) { + $type = $vars['type']; + $view = $vars['view']; + $display = $vars['display']; + + $types = views_object_types(); + + $vars['overridden'] = FALSE; + $vars['defaulted'] = FALSE; + + if ($vars['no_fields']) { + $vars['title'] = $types[$type]['title']; + $vars['item_help_icon'] = theme('advanced_help_topic', 'views', $type); + $vars['rearrange'] = NULL; + $vars['add'] = NULL; + return; + } + + $vars['rearrange'] = l('' . t('Rearrange') . '', "admin/build/views/nojs/rearrange/$view->name/$display->id/$type", array('attributes' => array('class' => 'views-button-rearrange views-ajax-link', 'title' => t('Rearrange')), 'html' => true)); + + $vars['add'] = l('' . t('Add') . '', "admin/build/views/nojs/add-item/$view->name/$display->id/$type", array('attributes' => array('class' => 'views-button-add views-ajax-link', 'title' => t('Add')), 'html' => true)); + + if (!$display->handler->is_default_display()) { + if (!$display->handler->is_defaulted($types[$type]['plural'])) { + $vars['overridden'] = TRUE; + } + else { + $vars['defaulted'] = TRUE; + } + } + + $vars['title'] = l($types[$type]['title'], "admin/build/views/nojs/config-type/$view->name/$display->id/$type", array('attributes' => array('class' => 'views-ajax-link'))); +// $vars['title'] = l($types[$type]['title'], "admin/build/views/nojs/config-type/$view->name/$display->id/$type", array('attributes' => array('class' => 'views-ajax-link'))); + + $fields = array(); + + static $relationships = NULL; + if (!isset($relationships)) { + // Get relationship labels + $relationships = array(); + // @todo: get_handlers() + foreach ($display->handler->get_option('relationships') as $id => $relationship) { + $handler = views_get_handler($relationship['table'], $relationship['field'], 'relationship'); + if (empty($handler)) { + continue; + } + $handler->init($view, $relationship); + $relationships[$id] = $handler->label(); + } + } + + // @todo: get_handlers() + foreach ($display->handler->get_option($types[$type]['plural']) as $id => $field) { + $fields[$id] = array(); + + $handler = views_get_handler($field['table'], $field['field'], $type); + if (empty($handler)) { + $fields[$id]['class'] = 'broken'; + $fields[$id]['title'] = t("Error: handler for @table > @field doesn't exist!", array('@table' => $field['table'], '@field' => $field['field'])); + $fields[$id]['info'] = ''; + continue; + } + $handler->init($view, $field); + + $field_name = $handler->ui_name(TRUE); + if (!empty($field['relationship']) && !empty($relationships[$field['relationship']])) { + $field_name = '(' . $relationships[$field['relationship']] . ') ' . $field_name; + } + + $fields[$id]['title'] = l($field_name, "admin/build/views/nojs/config-item/$view->name/$display->id/$type/$id", array('attributes' => array('class' => 'views-ajax-link'), 'html' => TRUE)); + $fields[$id]['class'] = views_ui_item_css($display->id . '-' . $type . '-' . $id); + if (!empty($view->changed_sections[$display->id . '-' . $type . '-' . $id])) { + $fields[$id]['changed'] = TRUE; + } + $fields[$id]['info'] = $handler->admin_summary(); + + if ($handler->has_extra_options()) { + $fields[$id]['links'] = l('' . t('Settings') . '', "admin/build/views/nojs/config-item-extra/$view->name/$display->id/$type/$id", array('attributes' => array('class' => 'views-button-configure views-ajax-link', 'title' => t('Settings')), 'html' => true)); + } + + if ($handler->needs_style_plugin()) { + $style_plugin = views_fetch_plugin_data('style', $handler->options['style_plugin']); + $style_title = empty($style_plugin['title']) ? t('Missing style plugin') : $style_plugin['title']; + $pid = $id . '-style-plugin'; + + if (!empty($style_plugin['uses options'])) { + $fields[$pid]['links'] = l('' . t('Change settings for this style') . '', "admin/build/views/nojs/config-style/$view->name/$display->id/$type/$id", array('attributes' => array('class' => 'views-button-configure views-ajax-link', 'title' => t('Settings')), 'html' => true)); + } + + $fields[$pid]['title'] = ' ' . t('  Style: !style', array('!style' => l($style_title, "admin/build/views/nojs/change-style/$view->name/$display->id/$type/$id", array('attributes' => array('class' => 'views-ajax-link'))))); + $fields[$pid]['class'] = views_ui_item_css($display->id . '-' . $type . '-' . $pid); + if (!empty($view->changed_sections[$display->id . '-' . $type . '-' . $pid])) { + $fields[$pid]['changed'] = TRUE; + } + $fields[$pid]['info'] = ''; + } + } + + $vars['fields'] = $fields; + $vars['item_help_icon'] = theme('advanced_help_topic', 'views', $type); +} + +/** + * Regenerate the tabs for AJAX updates. + */ +function views_ui_regenerate_tabs(&$view, $display_id = NULL, $object = NULL) { + if (empty($display_id)) { + $displays = array_keys($view->display); + } + elseif (!is_array($display_id)) { + $displays = array($display_id); + if ($display_id != 'default') { + $displays[] = 'default'; + } + } + else { + $displays = $display_id; + } + + if (!$view->set_display('default')) { + views_ajax_render(t('Invalid display id found while regenerating tabs')); + } + + if (!is_object($object)) { + $object = new stdClass(); + } + + $object->replace = array(); + foreach ($displays as $id) { + list($title, $body) = views_ui_display_tab($view, $view->display[$id]); + $object->replace['#views-tab-' . $id] = $body; + $object->replace['#views-tab-title-' . $id] = check_plain($title); + } + + if (!empty($view->changed)) { + $object->changed = TRUE; + } + + views_ajax_render($object); +} + +/** + * Provide standard buttons for the forms to make it easy. Also provide + * a hidden op operator because the forms plugin doesn't seem to properly + * provide which button was clicked. + */ +function views_ui_standard_form_buttons(&$form, &$form_state, $form_id, $name = NULL, $third = NULL, $submit = NULL) { + $form['buttons'] = array( + '#prefix' => '
', + '#suffix' => '
', + ); + + if (empty($name)) { + $name = t('Update'); + } + // remove default validate handler + $form['#validate'] = array(); + + if (empty($form_state['ok_button'])) { + // but be sure submit button validates! + $form['buttons']['submit'] = array( + '#type' => 'submit', + '#value' => $name, + '#submit' => array($form_id . '_submit'), + '#validate' => array('views_ui_standard_submit', $form_id . '_validate'), + ); + } + + $cancel_submit = function_exists($form_id . '_cancel') ? $form_id . '_cancel' : 'views_ui_standard_cancel'; + $form['buttons']['cancel'] = array( + '#type' => 'submit', + '#value' => empty($form_state['ok_button']) ? t('Cancel') : t('Ok'), + '#submit' => array($cancel_submit), + '#validate' => array(), + ); + + if ($third) { + if (empty($submit)) { + $submit = 'third'; + } + $third_submit = function_exists($form_id . '_' . $submit) ? $form_id . '_' . $submit : 'views_ui_standard_cancel'; + + $form['buttons'][$submit] = array( + '#type' => 'submit', + '#value' => $third, + '#validate' => array(), + '#submit' => array($third_submit), + ); + } + + // Compatibility, to be removed later: + // We used to set these items on the form, but now we want them on the $form_state: + if (isset($form['#title'])) { + $form_state['title'] = $form['#title']; + } + if (isset($form['#help_topic'])) { + $form_state['help_topic'] = $form['#help_topic']; + } + if (isset($form['#help_module'])) { + $form_state['help_module'] = $form['#help_module']; + } + if (isset($form['#url'])) { + $form_state['url'] = $form['#url']; + } + if (isset($form['#js'])) { + if (!empty($form_state['js settings']) && is_array($form_state['js settings'])) { + $form_state['js settings'] = array_merge($form_state['js settings'], $form['#js']); + } + else { + $form_state['js settings'] = $form['#js']; + } + } + if (isset($form['#section'])) { + $form_state['#section'] = $form['#section']; + } + // Finally, we never want these cached -- our object cache does that for us. + $form['#no_cache'] = TRUE; + + // If this isn't an ajaxy form, then we want to set the title. + if (!empty($form['#title'])) { + drupal_set_title($form['#title']); + } + views_add_css('views-admin'); +} + +/** + * Basic submit handler applicable to all 'standard' forms + */ +function views_ui_standard_submit($form, &$form_state) { + if (!empty($form['#section'])) { + $form_state['view']->changed_sections[$form['#section']] = TRUE; + } +} + +/** + * Submit handler for cancel button + */ +function views_ui_standard_cancel($form, &$form_state) { + $form_state['redirect'] = 'admin/build/views/edit/' . $form_state['view']->name; +} + +// -------------------------------------------------------------------------- +// Various subforms for editing the pieces of a view. + +function views_ui_ajax_forms($key = NULL) { + $forms = array( + 'display' => array( + 'form_id' => 'views_ui_edit_display_form', + 'args' => array('section'), + ), + 'remove-display' => array( + 'form_id' => 'views_ui_remove_display_form', + 'args' => array(), + ), + 'config-type' => array( + 'form_id' => 'views_ui_config_type_form', + 'args' => array('type'), + ), + 'rearrange' => array( + 'form_id' => 'views_ui_rearrange_form', + 'args' => array('type'), + ), + 'add-item' => array( + 'form_id' => 'views_ui_add_item_form', + 'args' => array('type'), + ), + 'config-item' => array( + 'form_id' => 'views_ui_config_item_form', + 'args' => array('type', 'id'), + ), + 'config-item-extra' => array( + 'form_id' => 'views_ui_config_item_extra_form', + 'args' => array('type', 'id'), + ), + 'change-style' => array( + 'form_id' => 'views_ui_change_style_form', + 'args' => array('type', 'id'), + ), + 'config-style' => array( + 'form_id' => 'views_ui_config_style_form', + 'args' => array('type', 'id'), + ), + ); + + if ($key) { + return !empty($forms[$key]) ? $forms[$key] : NULL; + } + + return $forms; +} + +/** + * Build a form identifier that we can use to see if one form + * is the same as another. Since the arguments differ slightly + * we do a lot of spiffy concenation here. + */ +function views_ui_build_identifier($key, $view, $display_id, $args) { + $form = views_ui_ajax_forms($key); + $identifier = implode('-', array($key, $view->name, $display_id)); + + foreach ($form['args'] as $id) { + $arg = (!empty($args)) ? array_shift($args) : NULL; + $identifier .= '-' . $arg; + } + return $identifier; +} + +/** + * Build up a $form_state object suitable for use with drupal_build_form + * based on known information about a form. + */ +function views_ui_build_form_state($js, $key, &$view, $display_id, $args) { + $form = views_ui_ajax_forms($key); + // Build up form state + $form_state = array( + 'form_key' => $key, + 'form_id' => $form['form_id'], + 'view' => &$view, + 'ajax' => $js, + 'display_id' => $display_id, + 'no_redirect' => TRUE, + ); + + foreach ($form['args'] as $id) { + $form_state[$id] = (!empty($args)) ? array_shift($args) : NULL; + } + + return $form_state; +} + +/** + * Create the URL for one of our standard AJAX forms based upon known + * information about the form. + */ +function views_ui_build_form_url($form_state) { + $form = views_ui_ajax_forms($form_state['form_key']); + $ajax = empty($form_state['ajax']) ? 'nojs' : 'ajax'; + $name = $form_state['view']->name; + $url = "admin/build/views/$ajax/$form_state[form_key]/$name/$form_state[display_id]"; + foreach ($form['args'] as $arg) { + $url .= '/' . $form_state[$arg]; + } + return $url; +} + +/** + * Add another form to the stack; clicking 'update' will go to this form + * rather than closing the ajax pad. + */ +function views_ui_add_form_to_stack($key, &$view, $display_id, $args, $top = FALSE) { + if (empty($view->stack)) { + $view->stack = array(); + } + + $stack = array(views_ui_build_identifier($key, $view, $display_id, $args), $key, &$view, $display_id, $args); + if ($top) { + array_unshift($view->stack, $stack); + } + else { + $view->stack[] = $stack; + } +} + +/** + * Generic entry point to handle forms. + * + * We do this for consistency and to make it easy to chain forms + * together. This only works for forms that use both $view + * and $display_id, so we have a couple of ajax forms that we don't + * use with this system. + */ +function views_ui_ajax_form($js, $key, &$view, $display_id) { + $form = views_ui_ajax_forms($key); + if (empty($form)) { + return drupal_not_found(); + } + + views_include('ajax'); + $args = func_get_args(); + // Remove the known args + array_splice($args, 0, 4); + + $form_state = views_ui_build_form_state($js, $key, $view, $display_id, $args); + // check to see if this is the top form of the stack. If it is, pop + // it off; if it isn't, the user clicked somewhere else and the stack is + // now irrelevant. + if (!empty($view->stack)) { + $identifier = views_ui_build_identifier($key, $view, $display_id, $args); + $top = array_shift($view->stack); + if (array_shift($top) != $identifier) { + $view->stack = array(); + } + } + + $output = views_ajax_form_wrapper($form_state['form_id'], $form_state); + + if (!$output) { + // Sometimes we need to re-generate the form for multi-step type operations. + $object = NULL; + if (!empty($view->stack)) { + $stack = $view->stack; // copy so the next shift doesn't break the array + $top = array_shift($stack); + $top[0] = $js; // change identifier into $js setting + $form_state = call_user_func_array('views_ui_build_form_state', $top); + $form_state['input'] = array(); // this is a new form, make sure it + // doesn't try to inherit $_POST info. + if (!$js) { + return drupal_goto(views_ui_build_form_url($form_state)); + } + $object = views_ajax_form_wrapper($form_state['form_id'], $form_state); + $object->url = url(views_ui_build_form_url($form_state)); + } + else if (!$js) { + // if nothing on the stack, non-js forms just go back to the main view editor. + return drupal_goto("admin/build/views/edit/$view->name"); + } + // regenerate all tabs because changes to the default tab could ripple. + return views_ui_regenerate_tabs($view, NULL, $object); + } + + return ($js) ? views_ajax_render($output) : $output; +} + +/** + * AJAX callback to add a display. + */ +function views_ui_add_display($js, $view) { + views_include('ajax'); + $form_state = array( + 'view' => &$view, + 'ajax' => $js, + ); + + $output = views_ajax_form_wrapper('views_ui_add_display_form', $form_state); + + if ($js) { + // If we don't have an output object, it was submitted. Set up the submission. + if (empty($output)) { + $id = $form_state['id']; + + // Make sure the new display is active + if (!$view->set_display('default')) { + views_ajax_render(t('Unable to initialize default display')); + } + + // Render the new display + list($title, $body) = views_ui_display_tab($view, $view->display[$id]); + + // Instruct the javascript on the browser to render the new tab. + $output = new stdClass; + $output->tab = array('#views-tab-' . $id => array('title' => $title, 'body' => $body)); + } + // Render the command object. This automatically exits. + views_ajax_render($output); + } + + // But the non-js variant will return output if it didn't redirect us. + return $output; +} + +/** + * Form to add a display to a view. + */ +function views_ui_add_display_form(&$form_state) { + $view = &$form_state['view']; + + $form['display']['display'] = array( + '#type' => 'select', + '#options' => views_fetch_plugin_names('display'), + '#default_value' => 'page', + ); + + $form['display']['add_display'] = array( + '#type' => 'submit', + '#value' => t('Add display'), + '#submit' => array('views_ui_add_display_form_submit'), + ); + + $form['#id'] = 'views-add-display-form'; + $form['#attributes'] = array('class' => 'views-ajax-form'); + $form['#action'] = url("admin/build/views/nojs/add-display/$view->name"); + + return $form; +} + +/** + * Submit handler to add a display to a view. + */ +function views_ui_add_display_form_submit($form, &$form_state) { + // Create the new display + $plugin = $form_state['values']['display']; + $form_state['id'] = $form_state['view']->add_display($plugin); + + // Store in cache + views_ui_cache_set($form_state['view']); + + // Send it back + $form_state['redirect'] = array('admin/build/views/edit/' . $form_state['view']->name, NULL, 'views-tab-' . $form_state['id']); +} + +/** + * Form to remove a display from a view. + */ +function views_ui_remove_display_form(&$form_state) { + $view = &$form_state['view']; + $display_id = $form_state['display_id']; + + if (empty($view->display[$display_id]->deleted)) { + $form['display'] = array( + '#prefix' => '
', + '#suffix' => '
', + ); + $form['remove_display'] = array( + '#type' => 'submit', + '#value' => t('Remove display'), + '#submit' => array('views_ui_remove_display_form_submit'), + ); + } + else { + $form['display'] = array( + '#prefix' => '
', + '#suffix' => '
', + ); + $form['restore_display'] = array( + '#type' => 'submit', + '#value' => t('Restore display'), + '#submit' => array('views_ui_remove_display_form_restore'), + ); + } + $form['#action'] = url("admin/build/views/nojs/remove-display/$view->name/$display_id"); + $form['#attributes'] = array('class' => 'views-ajax-form'); + + return $form; +} + +/** + * Submit handler to add a remove to a display from a view. + */ +function views_ui_remove_display_form_submit($form, &$form_state) { + // Create the new display + $plugin = views_fetch_plugin_data('display', $form_state['view']->display[$form_state['display_id']]->display_plugin); + if (empty($plugin['no remove'])) { + $id = $form_state['display_id']; + $form_state['view']->display[$id]->deleted = TRUE; + + // Store in cache + views_ui_cache_set($form_state['view']); + } +} + +/** + * Submit handler to add a restore a removed display to a view. + */ +function views_ui_remove_display_form_restore($form, &$form_state) { + // Create the new display + $id = $form_state['display_id']; + $form_state['view']->display[$id]->deleted = FALSE; + + // Store in cache + views_ui_cache_set($form_state['view']); +} + +/** + * Page callback to display analysis information on a view. + */ +function views_ui_analyze_view($js, $view) { + views_include('ajax'); + $form_state = array( + 'view' => &$view, + 'ajax' => $js, + ); + + $output = views_ajax_form_wrapper('views_ui_analyze_view_form', $form_state); + + if ($js) { + // If we don't have an output object, it was submitted. Set up the submission. + if (empty($output)) { + return views_ui_regenerate_tabs($view); + } + return views_ajax_render($output); + + } + return $output; +} + +/** + * This form doesn't particularly do much; it's really just providing a link + * but a button seems like it would be nicer here. + * + * It has no submit or anything, as we will never actually submit this form + * where the form is placed. + */ +function views_ui_analyze_view_button(&$form_state, $view) { + $form['#action'] = url("admin/build/views/nojs/analyze/$view->name"); + $form['#attributes'] = array('class' => 'views-ajax-form'); + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Analyze'), + ); + + return $form; +} + +/** + * Form constructor callback to display analysis information on a view + */ +function views_ui_analyze_view_form(&$form_state) { + $view = &$form_state['view']; + + $form['#title'] = t('View analysis'); + $form['#section'] = 'analyze'; + + views_include('analyze'); + $messages = views_analyze_view($view); + + $form['analysis'] = array( + '#prefix' => '
', + '#suffix' => '
', + '#value' => views_analyze_format_result($view, $messages), + ); + + // Inform the standard button function that we want an OK button. + $form_state['ok_button'] = TRUE; + views_ui_standard_form_buttons($form, $form_state, 'views_ui_analyze_view_form'); + return $form; +} + +/** + * Submit handler for views_ui_analyze_view_form + */ +function views_ui_analyze_view_form_submit($form, &$form_state) { + $form_state['redirect'] = 'admin/build/views/edit/' . $form_state['view']->name; +} + +/** + * Page callback to edit details of a view. + */ +function views_ui_edit_details($js, $view) { + views_include('ajax'); + $form_state = array( + 'view' => &$view, + 'ajax' => $js, + ); + + $output = views_ajax_form_wrapper('views_ui_edit_details_form', $form_state); + + if ($js) { + // If we don't have an output object, it was submitted. Set up the submission. + if (empty($output)) { + return views_ui_regenerate_tabs($view); + } + return views_ajax_render($output); + + } + return $output; +} + +/** + * Form constructor callback to edit details of a view + */ +function views_ui_edit_details_form(&$form_state) { + $view = &$form_state['view']; + + $form['#title'] = t('View details'); + $form['#section'] = 'details'; + + $form['description'] = array( + '#type' => 'textfield', + '#title' => t('View description'), + '#description' => t('This description will appear on the Views administrative UI to tell you what the view is about.'), + '#default_value' => $view->description, + ); + + $form['tag'] = array( + '#type' => 'textfield', + '#title' => t('View tag'), + '#description' => t('Enter an optional tag for this view; it is used only to help sort views on the administrative page.'), + '#default_value' => $view->tag, + '#autocomplete_path' => 'admin/views/ajax/autocomplete/tag', + ); + + views_ui_standard_form_buttons($form, $form_state, 'views_ui_edit_details_form'); + return $form; +} + +/** + * Submit handler for views_ui_edit_details_form + */ +function views_ui_edit_details_form_submit($form, &$form_state) { + $form_state['view']->description = $form_state['values']['description']; + $form_state['view']->tag = $form_state['values']['tag']; + views_ui_cache_set($form_state['view']); + $form_state['redirect'] = 'admin/build/views/edit/' . $form_state['view']->name; +} + +/** + * Form constructor callback to edit display of a view + */ +function views_ui_edit_display_form(&$form_state) { + $view = &$form_state['view']; + $display_id = $form_state['display_id']; + $section = $form_state['section']; + + if (!$view->set_display($display_id)) { + views_ajax_render(t('Invalid display id @display', array('@display' => $display_id))); + } + $display = &$view->display[$display_id]; + + // Get form from the handler. + $display->handler->options_form($form, $form_state); + $name = NULL; + if (isset($form_state['update_name'])) { + $name = $form_state['update_name']; + } + + views_ui_standard_form_buttons($form, $form_state, 'views_ui_edit_display_form', $name); + return $form; +} + +/** + * Validate handler for views_ui_edit_display_form + */ +function views_ui_edit_display_form_validate($form, &$form_state) { + $display = &$form_state['view']->display[$form_state['display_id']]; + $display->handler->options_validate($form, $form_state); +} + +/** + * Submit handler for views_ui_edit_display_form + */ +function views_ui_edit_display_form_submit($form, &$form_state) { + $display = &$form_state['view']->display[$form_state['display_id']]; + $display->handler->options_submit($form, $form_state); + + views_ui_cache_set($form_state['view']); +} + +/** + * Override handler for views_ui_edit_display_form + */ +function views_ui_edit_display_form_override($form, &$form_state) { + $display = &$form_state['view']->display[$form_state['display_id']]; + $display->handler->options_override($form, $form_state); + + views_ui_cache_set($form_state['view']); + $form_state['rerender'] = TRUE; + $form_state['rebuild'] = TRUE; +} +/** + * Form to config items in the views UI. + */ +function views_ui_config_type_form(&$form_state) { + $view = &$form_state['view']; + $display_id = $form_state['display_id']; + $type = $form_state['type']; + + $types = views_object_types(); + if (!$view->set_display($display_id)) { + views_ajax_render(t('Invalid display id @display', array('@display' => $display_id))); + } + $display = &$view->display[$display_id]; + $form['#title'] = check_plain($display->display_title) . ': '; + $form['#title'] .= t('Configure @type', array('@type' => $types[$type]['ltitle'])); + $form['#section'] = $display_id . 'config-item'; + + if ($display->handler->defaultable_sections($types[$type]['plural'])) { + $form_state['section'] = $types[$type]['plural']; + $display->handler->add_override_button($form, $form_state, $form_state['section']); + } + + if (!empty($types[$type]['options']) && function_exists($types[$type]['options'])) { + $options = $type . '_options'; + $form[$options] = array('#tree' => TRUE); + $types[$type]['options']($form, $form_state); + } + + $name = NULL; + if (isset($form_state['update_name'])) { + $name = $form_state['update_name']; + } + + views_ui_standard_form_buttons($form, $form_state, 'views_ui_config_type_form', $name); + return $form; +} + +/** + * Submit handler for type configuration form + */ +function views_ui_config_type_form_submit($form, &$form_state) { + $types = views_object_types(); + $display = &$form_state['view']->display[$form_state['display_id']]; + + // Store in cache + views_ui_cache_set($form_state['view']); +} + +/** + * Configure settings particular to filters. + */ +function views_ui_config_filters_form(&$form, &$form_state) { + +} + +/** + * Form to rearrange items in the views UI. + */ +function views_ui_rearrange_form(&$form_state) { + $view = &$form_state['view']; + $display_id = $form_state['display_id']; + $type = $form_state['type']; + + $types = views_object_types(); + if (!$view->set_display($display_id)) { + views_ajax_render(t('Invalid display id @display', array('@display' => $display_id))); + } + $display = &$view->display[$display_id]; + $form['#title'] = check_plain($display->display_title) . ': '; + $form['#title'] .= t('Rearrange @type', array('@type' => $types[$type]['ltitle'])); + $form['#section'] = $display_id . 'rearrange-item'; + + if ($display->handler->defaultable_sections($types[$type]['plural'])) { + $form_state['section'] = $types[$type]['plural']; + $display->handler->add_override_button($form, $form_state, $form_state['section']); + } + + $count = 0; + + // Get relationship labels + $relationships = array(); + // @todo: get_handlers() + foreach ($display->handler->get_option('relationships') as $id => $relationship) { + $handler = views_get_handler($relationship['table'], $relationship['field'], 'relationship'); + if (empty($handler)) { + continue; + } + $handler->init($view, $relationship); + $relationships[$id] = $handler->label(); + } + + // @todo: get_handlers() + foreach ($display->handler->get_option($types[$type]['plural']) as $id => $field) { + $form[$id] = array('#tree' => TRUE); + $form[$id]['weight'] = array( + '#type' => 'weight', + '#delta' => 25, + '#default_value' => ++$count, + ); + $handler = views_get_handler($field['table'], $field['field'], $type); + if ($handler) { + $handler->init($view, $field); + $name = $handler->ui_name() . ' ' . $handler->admin_summary(); + if (!empty($field['relationship']) && !empty($relationships[$field['relationship']])) { + $name = '(' . $relationships[$field['relationship']] . ') ' . $name; + } + + $form[$id]['name'] = array( + '#value' => $name, + ); + } + else { + $form[$id]['name'] = array('#value' => t('Broken field @id', array('@id' => $id))); + } + $form[$id]['removed'] = array( + '#type' => 'checkbox', + '#id' => 'views-removed-' . $id, + '#attributes' => array('class' => 'views-remove-checkbox'), + '#default_value' => 0, + ); + } + + // Add javascript settings that will be added via $.extend for tabledragging + $form['#js']['tableDrag']['arrange']['weight'][0] = array( + 'target' => 'weight', + 'source' => NULL, + 'relationship' => 'sibling', + 'action' => 'order', + 'hidden' => TRUE, + 'limit' => 0, + ); + + $name = NULL; + if (isset($form_state['update_name'])) { + $name = $form_state['update_name']; + } + + views_ui_standard_form_buttons($form, $form_state, 'views_ui_rearrange_form'); + return $form; +} + +/** + * Turn the rearrange form into a proper table + */ +function theme_views_ui_rearrange_form($form) { + $rows = array(); + foreach (element_children($form) as $id) { + if (isset($form[$id]['name'])) { + $row = array(); + $row[] = drupal_render($form[$id]['name']); + $form[$id]['weight']['#attributes']['class'] = 'weight'; + $row[] = drupal_render($form[$id]['weight']); + $row[] = drupal_render($form[$id]['removed']) . l('' . t('Remove') . '', 'javascript:void()', array('attributes' => array('id' => 'views-remove-link-' . $id, 'class' => 'views-button-remove views-remove-link', 'alt' => t('Remove this item'), 'title' => t('Remove this item')), 'html' => true)); + + $rows[] = array('data' => $row, 'class' => 'draggable', 'id' => 'views-row-' . $id); + } + } + if (empty($rows)) { + $rows[] = array(array('data' => t('No fields available.'), 'colspan' => '2')); + } + + $header = array('', t('Weight'), t('Remove')); + drupal_add_tabledrag('arrange', 'order', 'sibling', 'weight'); + $output = drupal_render($form['override']); + $output .= theme('table', $header, $rows, array('id' => 'arrange')); + $output .= drupal_render($form); + return $output; + +} + +/** + * Submit handler for rearranging form + */ +function views_ui_rearrange_form_submit($form, &$form_state) { + $types = views_object_types(); + $display = &$form_state['view']->display[$form_state['display_id']]; + + $old_fields = $display->handler->get_option($types[$form_state['type']]['plural']); + $new_fields = $order = array(); + + // Make an array with the weights + foreach ($form_state['values'] as $field => $info) { + // add each value that is a field with a weight to our list, but only if + // it has had its 'removed' checkbox checked. + if (is_array($info) && isset($info['weight']) && empty($info['removed'])) { + $order[$field] = $info['weight']; + } + } + + // Sort the array + asort($order); + + // Create a new list of fields in the new order. + foreach (array_keys($order) as $field) { + $new_fields[$field] = $old_fields[$field]; + } + $display->handler->set_option($types[$form_state['type']]['plural'], $new_fields); + + // Store in cache + views_ui_cache_set($form_state['view']); +} + +/** + * Form to add_item items in the views UI. + */ +function views_ui_add_item_form(&$form_state) { + $view = &$form_state['view']; + $display_id = $form_state['display_id']; + $type = $form_state['type']; + + if (!$view->set_display($display_id)) { + views_ajax_render(t('Invalid display id @display', array('@display' => $display_id))); + } + $display = &$view->display[$display_id]; + + $types = views_object_types(); + $form['#title'] = check_plain($display->display_title) . ': '; + $form['#title'] .= t('Add @type', array('@type' => $types[$type]['ltitle'])); + $form['#section'] = $display_id . 'add-item'; + + // Figure out all the base tables allowed based upon what the relationships provide. + $base_tables = $view->get_base_tables(); + $options = views_fetch_fields(array_keys($base_tables), $type); + + if (!empty($options)) { + $groups = array('all' => t('')); + $form['group'] = array( + '#type' => 'select', + '#title' => t('Groups'), + '#options' => array(), + '#attributes' => array('class' => 'views-master-dependent'), + ); + + $form['name'] = array( + '#prefix' => '
', + '#suffix' => '
', + '#tree' => TRUE, + '#default_value' => 'all', + ); + + // Group options first to simplify the DOM objects that Views + // dependent JS will act upon. + $grouped_options = array(); + foreach ($options as $key => $option) { + $group = preg_replace('/[^a-z0-9]/', '-', strtolower($option['group'])); + $groups[$group] = $option['group']; + $grouped_options[$group][$key] = $option; + } + + foreach ($grouped_options as $group => $group_options) { + $form['name'][$group . '_start'] = array('#type' => 'markup', '#value' => '
'); + foreach ($group_options as $key => $option) { + $form['name'][$key] = array( + '#type' => 'checkbox', + '#title' => t('!group: !field', array('!group' => $option['group'], '!field' => $option['title'])), + '#description' => $option['help'], + '#return_value' => $key, + ); + } + $form['name'][$group . '_end'] = array('#type' => 'markup', '#value' => '
'); + } + + $form['group']['#options'] = $groups; + } + else { + $form['markup'] = array( + '#value' => '
' . t('There are no @types available to add.', array('@types' => $types[$type]['ltitle'])) . '
', + ); + } + views_ui_standard_form_buttons($form, $form_state, 'views_ui_add_item_form', t('Add')); + + return $form; +} + +/** + * Submit handler for adding new item(s) to a view. + */ +function views_ui_add_item_form_submit($form, &$form_state) { + $type = $form_state['type']; + $types = views_object_types(); + + if (!empty($form_state['values']['name']) && is_array($form_state['values']['name'])) { + // Loop through each of the items that were checked and add them to the view. + foreach (array_keys(array_filter($form_state['values']['name'])) as $field) { + list($table, $field) = explode('.', $field, 2); + $id = $form_state['view']->add_item($form_state['display_id'], $type, $table, $field); + + // check to see if this type has settings, if so add the settings form first + $handler = views_get_handler($table, $field, $type); + if ($handler && $handler->has_extra_options()) { + views_ui_add_form_to_stack('config-item-extra', $form_state['view'], $form_state['display_id'], array($type, $id)); + } + // Then add the form to the stack + views_ui_add_form_to_stack('config-item', $form_state['view'], $form_state['display_id'], array($type, $id)); + } + } + + // Store in cache + views_ui_cache_set($form_state['view']); +} + + +/** + * Form to config_item items in the views UI. + */ +function views_ui_config_item_form(&$form_state) { + $view = &$form_state['view']; + $display_id = $form_state['display_id']; + $type = $form_state['type']; + $id = $form_state['id']; + + $form = array('options' => array('#tree' => TRUE)); + if (!$view->set_display($display_id)) { + views_ajax_render(t('Invalid display id @display', array('@display' => $display_id))); + } + $item = $view->get_item($display_id, $type, $id); + + if ($item) { + $handler = views_get_handler($item['table'], $item['field'], $type); + if (empty($handler)) { + $form['markup'] = array('#value' => t("Error: handler for @table > @field doesn't exist!", array('@table' => $item['table'], '@field' => $item['field']))); + } + else { + $handler->init($view, $item); + $types = views_object_types(); + + if ($view->display_handler->defaultable_sections($types[$type]['plural'])) { + $form_state['section'] = $types[$type]['plural']; + $view->display_handler->add_override_button($form['options'], $form_state, $form_state['section']); + } + + // A whole bunch of code to figure out what relationships are valid for + // this item. + $relationships = $view->display_handler->get_option('relationships'); + $relationship_options = array(); + + foreach ($relationships as $relationship) { + // relationships can't link back to self. But also, due to ordering, + // relationships can only link to prior relationships. + if ($type == 'relationship' && $id == $relationship['id']) { + break; + } + $relationship_handler = views_get_handler($relationship['table'], $relationship['field'], 'relationship'); + // ignore invalid/broken relationships. + if (empty($relationship_handler)) { + continue; + } + + // If this relationship is valid for this type, add it to the list. + $data = views_fetch_data($relationship['table']); + $base = $data[$relationship['field']]['relationship']['base']; + $base_fields = views_fetch_fields($base, $form_state['type']); + if (isset($base_fields[$item['table'] . '.' . $item['field']])) { + $relationship_handler->init($view, $relationship); + $relationship_options[$relationship['id']] = $relationship_handler->label(); + } + } + + if (!empty($relationship_options)) { + // Make sure the existing relationship is even valid. If not, force + // it to none. + $base_fields = views_fetch_fields($view->base_table, $form_state['type']); + if (isset($base_fields[$item['table'] . '.' . $item['field']])) { + $relationship_options = array_merge(array('none' => t('Do not use a relationship')), $relationship_options); + } + $rel = empty($item['relationship']) ? 'none' : $item['relationship']; + if (empty($relationship_options[$rel])) { + // Pick the first relationship. + $rel = key($relationship_options); + // We want this relationship option to get saved even if the user + // skips submitting the form. + $view->set_item_option($display_id, $type, $id, 'relationship', $rel); + $temp_view = $view->clone_view(); + views_ui_cache_set($temp_view); + } + + $form['options']['relationship'] = array( + '#type' => 'select', + '#title' => t('Relationship'), + '#options' => $relationship_options, + '#default_value' => $rel, + ); + } + else { + $form['options']['relationship'] = array( + '#type' => 'value', + '#value' => 'none', + ); + } + + $form['#title'] = check_plain($view->display[$display_id]->display_title) . ': '; + $form['#title'] .= t('Configure @type %item', array('@type' => $types[$type]['lstitle'], '%item' => $handler->ui_name())); + + $form['#section'] = $display_id . '-' . $type . '-' . $id; + + // Get form from the handler. + $handler->options_form($form['options'], $form_state); + $form_state['handler'] = &$handler; + } + + $name = NULL; + if (isset($form_state['update_name'])) { + $name = $form_state['update_name']; + } + + views_ui_standard_form_buttons($form, $form_state, 'views_ui_config_item_form', $name, t('Remove'), 'remove'); + } + return $form; +} + +/** + * Submit handler for configing new item(s) to a view. + */ +function views_ui_config_item_form_validate($form, &$form_state) { + $form_state['handler']->options_validate($form['options'], $form_state); +} + +/** + * Submit handler for configing new item(s) to a view. + */ +function views_ui_config_item_form_submit($form, &$form_state) { + // Run it through the handler's submit function. + $form_state['handler']->options_submit($form['options'], $form_state); + $item = $form_state['handler']->options; + + // Unset a button + unset($form_state['values']['options']['expose_button']); + + // Store the data we're given. + foreach ($form_state['values']['options'] as $key => $value) { + $item[$key] = $value; + } + + // Store the item back on the view + $form_state['view']->set_item($form_state['display_id'], $form_state['type'], $form_state['id'], $item); + + $handler = views_get_handler($item['table'], $item['field'], $form_state['type']); + $handler->init($form_state['view'], $item); + if ($handler && $handler->needs_style_plugin()) { + views_ui_add_form_to_stack('change-style', $form_state['view'], $form_state['display_id'], array($form_state['type'], $form_state['id']), TRUE); + } + + // Write to cache + views_ui_cache_set($form_state['view']); +} + +/** + * Submit handler for removing an item from a view + */ +function views_ui_config_item_form_remove($form, &$form_state) { + // Store the item back on the view + $form_state['view']->set_item($form_state['display_id'], $form_state['type'], $form_state['id'], NULL); + + // Write to cache + views_ui_cache_set($form_state['view']); +} + +/** + * Override handler for views_ui_edit_display_form + */ +function views_ui_config_item_form_expose($form, &$form_state) { + $item = &$form_state['handler']->options; + // flip + $item['exposed'] = empty($item['exposed']); + + // If necessary, set new defaults: + if ($item['exposed']) { + $form_state['handler']->expose_options(); + } + + $form_state['view']->set_item($form_state['display_id'], $form_state['type'], $form_state['id'], $item); + + views_ui_cache_set($form_state['view']); + $form_state['rerender'] = TRUE; + $form_state['rebuild'] = TRUE; + $form_state['force_expose_options'] = TRUE; +} + +/** + * Form to config_item items in the views UI. + */ +function views_ui_config_item_extra_form(&$form_state) { + $view = &$form_state['view']; + $display_id = $form_state['display_id']; + $type = $form_state['type']; + $id = $form_state['id']; + + $form = array('options' => array('#tree' => TRUE)); + if (!$view->set_display($display_id)) { + views_ajax_render(t('Invalid display id @display', array('@display' => $display_id))); + } + $item = $view->get_item($display_id, $type, $id); + + if ($item) { + $handler = views_get_handler($item['table'], $item['field'], $type); + if (empty($handler)) { + $form['markup'] = array('#value' => t("Error: handler for @table > @field doesn't exist!", array('@table' => $item['table'], '@field' => $item['field']))); + break; + } + else { + $handler->init($view, $item); + $types = views_object_types(); + + $form['#title'] = check_plain($view->display[$display_id]->display_title) . ': '; + $form['#title'] .= t('Configure extra settings for @type %item', array('@type' => $types[$type]['lstitle'], '%item' => $handler->ui_name())); + + $form['#section'] = $display_id . '-' . $type . '-' . $id; + + // Get form from the handler. + $handler->extra_options_form($form['options'], $form_state); + $form_state['handler'] = &$handler; + + } + + views_ui_standard_form_buttons($form, $form_state, 'views_ui_config_item_extra_form'); + } + return $form; +} + +/** + * Submit handler for configing new item(s) to a view. + */ +function views_ui_config_item_extra_form_validate($form, &$form_state) { + $form_state['handler']->extra_options_validate($form['options'], $form_state); +} + +/** + * Submit handler for configing new item(s) to a view. + */ +function views_ui_config_item_extra_form_submit($form, &$form_state) { + // Run it through the handler's submit function. + $form_state['handler']->extra_options_submit($form['options'], $form_state); + $item = $form_state['handler']->options; + + // Store the data we're given. + foreach ($form_state['values']['options'] as $key => $value) { + $item[$key] = $value; + } + + // Store the item back on the view + $form_state['view']->set_item($form_state['display_id'], $form_state['type'], $form_state['id'], $item); + + // Write to cache + views_ui_cache_set($form_state['view']); +} + +/** + * Form to change_style items in the views UI. + */ +function views_ui_change_style_form(&$form_state) { + $view = &$form_state['view']; + $display_id = $form_state['display_id']; + $type = $form_state['type']; + $id = $form_state['id']; + + $form = array('options' => array('#tree' => TRUE)); + if (!$view->set_display($display_id)) { + views_ajax_render(t('Invalid display id @display', array('@display' => $display_id))); + } + $item = $view->get_item($display_id, $type, $id); + + if ($item) { + $handler = views_get_handler($item['table'], $item['field'], $type); + if (empty($handler)) { + $form['markup'] = array('#value' => t("Error: handler for @table > @field doesn't exist!", array('@table' => $item['table'], '@field' => $item['field']))); + break; + } + $handler->init($view, $item); + $types = views_object_types(); + $form['#title'] = t('Change summary style for @type %item', array('@type' => $types[$type]['lstitle'], '%item' => $handler->ui_name())); + + $form['#section'] = $display_id . '-' . $type . '-' . $id . '-style-plugin'; + + $form['style_plugin'] = array( + '#type' => 'radios', + '#options' => views_fetch_plugin_names('style', 'summary'), + '#default_value' => $item['style_plugin'], + ); + + $form_state['handler'] = &$handler; + + views_ui_standard_form_buttons($form, $form_state, 'views_ui_change_style_form'); + } + return $form; +} + +function views_ui_change_style_form_validate($form, &$form_state) { + // Run it through the handler's submit function. + $form_state['handler']->options_validate($form['options'], $form_state); + + $plugin = views_get_plugin('style', $form_state['values']['style_plugin']); + if (!$plugin) { + form_error($form['style_plugin'], t('Internal error: broken plugin.')); + } +} + +/** + * Submit handler for configing new item(s) to a view. + */ +function views_ui_change_style_form_submit($form, &$form_state) { + // Run it through the handler's submit function. + $form_state['handler']->options_submit($form['options'], $form_state); + $item = $form_state['handler']->options; + + $plugin = views_get_plugin('style', $form_state['values']['style_plugin']); + if (!$plugin) { + drupal_set_message(t('Internal error: broken plugin.'), 'error'); + return; + } + + $plugin->init($form_state['view'], $form_state['view']->display[$form_state['display_id']]); + + // If changing style plugin, reset options to defaults. + if (empty($item['style_plugin']) || $item['style_plugin'] != $form_state['values']['style_plugin']) { + $item['style_options'] = $plugin->options; + } + + // Store the data we're given. + $item['style_plugin'] = $form_state['values']['style_plugin']; + + // Store the item back on the view + $form_state['view']->set_item($form_state['display_id'], $form_state['type'], $form_state['id'], $item); + + if (!empty($plugin->definition['uses options'])) { + views_ui_add_form_to_stack('config-style', $form_state['view'], $form_state['display_id'], array($form_state['type'], $form_state['id']), TRUE); + } + + // Write to cache + views_ui_cache_set($form_state['view']); +} + +/** + * Form to config_style items in the views UI. + */ +function views_ui_config_style_form(&$form_state) { + $view = &$form_state['view']; + $display_id = $form_state['display_id']; + $type = $form_state['type']; + $id = $form_state['id']; + + $form = array('options' => array('#tree' => TRUE)); + if (!$view->set_display($display_id)) { + views_ajax_render(t('Invalid display id @display', array('@display' => $display_id))); + } + $item = $view->get_item($display_id, $type, $id); + + if ($item) { + $handler = views_get_handler($item['table'], $item['field'], $type); + if (empty($handler)) { + $form['markup'] = array('#value' => t("Error: handler for @table > @field doesn't exist!", array('@table' => $item['table'], '@field' => $item['field']))); + break; + } + $handler->init($view, $item); + $types = views_object_types(); + + $form['#title'] = check_plain($view->display[$display_id]->display_title) . ': '; + $form['#title'] .= t('Configure summary style for @type %item', array('@type' => $types[$type]['lstitle'], '%item' => $handler->ui_name())); + + $form['#section'] = $display_id . '-' . $type . '-style-options'; + + $plugin = views_get_plugin('style', $item['style_plugin']); + if ($plugin) { + $form['style_options'] = array( + '#tree' => TRUE, + ); + $plugin->init($view, $view->display[$display_id], $item['style_options']); + + $plugin->options_form($form['style_options'], $form_state); + } + + $form_state['handler'] = &$handler; + + views_ui_standard_form_buttons($form, $form_state, 'views_ui_config_style_form'); + } + return $form; +} + +/** + * Submit handler for configing new item(s) to a view. + */ +function views_ui_config_style_form_submit($form, &$form_state) { + // Run it through the handler's submit function. + $form_state['handler']->options_submit($form['style_options'], $form_state); + $item = $form_state['handler']->options; + + // Store the data we're given. + $item['style_options'] = $form_state['values']['style_options']; + + // Store the item back on the view + $form_state['view']->set_item($form_state['display_id'], $form_state['type'], $form_state['id'], $item); + + // Write to cache + views_ui_cache_set($form_state['view']); +} + +/** + * Get a list of roles in the system. + */ +function views_ui_get_roles() { + static $roles = NULL; + if (!isset($roles)) { + $roles = array(); + $result = db_query("SELECT r.rid, r.name FROM {role} r ORDER BY r.name"); + while ($obj = db_fetch_object($result)) { + $roles[$obj->rid] = $obj->name; + } + } + + return $roles; +} + +/** + * Get a css safe id for a particular section. + */ +function views_ui_item_css($item) { + return views_css_safe('views-item-' . $item); +} + +/** + * Page callback for the Views enable page. + */ +function views_ui_enable_page($view) { + $views_status = variable_get('views_defaults', array()); + $views_status[$view->name] = FALSE; // false is enabled + variable_set('views_defaults', $views_status); + views_invalidate_cache(); + menu_rebuild(); + drupal_goto('admin/build/views'); +} + +/** + * Page callback for the Views enable page + */ +function views_ui_disable_page($view) { + $views_status = variable_get('views_defaults', array()); + $views_status[$view->name] = TRUE; // True is disabled + variable_set('views_defaults', $views_status); + views_invalidate_cache(); + menu_rebuild(); + drupal_goto('admin/build/views'); +} + +/** + * Page callback for the tools - other page + */ +function views_ui_admin_tools() { + $form['clear_cache'] = array( + '#type' => 'submit', + '#value' => t("Clear Views' cache"), + '#submit' => array('views_ui_tools_clear_cache'), + ); + + $form['views_sql_signature'] = array( + '#type' => 'checkbox', + '#title' => t('Add Views signature to all SQL queries'), + '#description' => t("All Views-generated queries will include a special 'VIEWS' = 'VIEWS' string in the WHERE clause. This makes identifying Views queries in database server logs simpler, but should only be used when troubleshooting."), + '#default_value' => variable_get('views_sql_signature', FALSE), + ); + + $form['views_skip_cache'] = array( + '#type' => 'checkbox', + '#title' => t('Disable views data caching'), + '#description' => t("Views caches data about tables, modules and views available, to increase performance. By checking this box, Views will skip this cache and always rebuild this data when needed. This can have a serious performance impact on your site."), + '#default_value' => variable_get('views_skip_cache', FALSE), + ); + + $form['views_hide_help_message'] = array( + '#type' => 'checkbox', + '#title' => t('Ignore missing advanced help module'), + '#description' => t("Views uses the advanced help module to provide help text; if this module is not present Views will complain, unless this setting is checked."), + '#default_value' => variable_get('views_hide_help_message', FALSE), + ); + + $form['views_ui_query_on_top'] = array( + '#type' => 'checkbox', + '#title' => t('Show query above live preview'), + '#description' => t("The live preview feature will show you the output of the view you're creating, as well as the view. Check here to show the query and other information above the view; leave this unchecked to show that information below the view."), + '#default_value' => variable_get('views_ui_query_on_top', FALSE), + ); + + $form['views_show_additional_queries'] = array( + '#type' => 'checkbox', + '#title' => t('Show other queries run during render during live preview'), + '#description' => t("Drupal has the potential to run many queries while a view is being rendered. Checking this box will display every query run during view render as part of the live preview."), + '#default_value' => variable_get('views_show_additional_queries', FALSE), + ); + + $form['views_no_hover_links'] = array( + '#type' => 'checkbox', + '#title' => t('Do not show hover links over views'), + '#description' => t("To make it easier to administrate your views, Views provides 'hover' links to take you to the edit and export screen of a view whenever the view is used. This can be distracting on some themes, though; if it is problematic, you can turn it off here."), + '#default_value' => variable_get('views_no_hover_links', FALSE), + ); + + $form['views_devel_output'] = array( + '#type' => 'checkbox', + '#title' => t('Enable views performance statistics via the Devel module'), + '#description' => t("Check this to enable some Views query and performance statistics if Devel is installed."), + '#default_value' => variable_get('views_devel_output', FALSE), + ); + + $form['views_no_javascript'] = array( + '#type' => 'checkbox', + '#title' => t('Disable javascript with Views'), + '#description' => t("If you are having problems with the javascript, you can disable it here; the Views UI should degrade and still be usable without javascript, it just not as good."), + '#default_value' => variable_get('views_no_javascript', FALSE), + ); + + $regions = system_region_list(variable_get('theme_default', 'garland')); + $regions['watchdog'] = t('Watchdog'); + + $form['views_devel_region'] = array( + '#type' => 'select', + '#title' => t('Page region to output performance statistics'), + '#default_value' => variable_get('views_devel_region', 'footer'), + '#options' => $regions, + ); + + $form['views_exposed_filter_any_label'] = array( + '#type' => 'select', + '#title' => t('Label for "Any" value on optional single-select exposed filters'), + '#options' => array('old_any' => t(''), 'new_any' => t('- Any -')), + '#default_value' => variable_get('views_exposed_filter_any_label', 'old_any'), + ); + + return system_settings_form($form); +} + +/** + * Submit hook to clear the views cache. + */ +function views_ui_tools_clear_cache() { + views_invalidate_cache(); + drupal_set_message(t('The cache has been cleared.')); +} + +/** + * Submit hook to clear Drupal's theme registry (thereby triggering + * a templates rescan). + */ +function views_ui_config_item_form_rescan($form, &$form_state) { + drupal_rebuild_theme_registry(); + + // The 'Theme: Information' page is about to be shown again. That page + // analyzes the output of theme_get_registry(). However, this latter + // function uses an internal cache (which was initialized before we + // called drupal_rebuild_theme_registry()) so it won't reflect the + // current state of our theme registry. The only way to clear that cache + // is to re-initialize the theme system: + unset($GLOBALS['theme']); + init_theme(); + + $form_state['rerender'] = TRUE; + $form_state['rebuild'] = TRUE; +} + +/** + * Override handler for views_ui_edit_display_form + */ +function views_ui_edit_display_form_change_theme($form, &$form_state) { + // This is just a temporary variable. + $form_state['view']->theme = $form_state['values']['theme']; + + views_ui_cache_set($form_state['view']); + $form_state['rerender'] = TRUE; + $form_state['rebuild'] = TRUE; +} + +/** + * Page callback for views tag autocomplete + */ +function views_ui_autocomplete_tag($string = '') { + $matches = array(); + // get matches from default views: + views_include('view'); + $views = views_discover_default_views(); + foreach ($views as $view) { + if (!empty($view->tag) && strpos($view->tag, $string) === 0) { + $matches[$view->tag] = $view->tag; + } + } + + if ($string) { + $result = db_query_range("SELECT DISTINCT tag FROM {views_view} WHERE LOWER(tag) LIKE LOWER('%s%%')", $string, 0, 10 - count($matches)); + while ($view = db_fetch_object($result)) { + $matches[$view->tag] = check_plain($view->tag); + } + } + + drupal_json($matches); +} + +// ------------------------------------------------------------------ +// Get information from the Views data + +function _views_weight_sort($a, $b) { + if ($a['weight'] != $b['weight']) { + return $a['weight'] < $b['weight'] ? -1 : 1; + } + if ($a['title'] != $b['title']) { + return $a['title'] < $b['title'] ? -1 : 1; + } + + return 0; +} + +/** + * Fetch a list of all base tables available + * + * @return + * A keyed array of in the form of 'base_table' => 'Description'. + */ +function views_fetch_base_tables() { + static $base_tables = array(); + if (empty($base_tables)) { + $weights = array(); + $tables = array(); + $data = views_fetch_data(); + foreach ($data as $table => $info) { + if (!empty($info['table']['base'])) { + $tables[$table] = array( + 'title' => $info['table']['base']['title'], + 'description' => $info['table']['base']['help'], + 'weight' => !empty($info['table']['base']['weight']) ? $info['table']['base']['weight'] : 0, + ); + } + } + uasort($tables, '_views_weight_sort'); + $base_tables = $tables; + } + + return $base_tables; +} + +function _views_sort_types($a, $b) { + if ($a['group'] != $b['group']) { + return $a['group'] < $b['group'] ? -1 : 1; + } + + if ($a['title'] != $b['title']) { + return $a['title'] < $b['title'] ? -1 : 1; + } + + return 0; +} + +/** + * Fetch a list of all fields available for a given base type. + * + * @return + * A keyed array of in the form of 'base_table' => 'Description'. + */ +function views_fetch_fields($base, $type) { + static $fields = array(); + if (empty($fields)) { + $data = views_fetch_data(); + $start = views_microtime(); + // This constructs this ginormous multi dimensional array to + // collect the important data about fields. In the end, + // the structure looks a bit like this (using nid as an example) + // $strings['nid']['filter']['title'] = 'string'. + // + // This is constructed this way because the above referenced strings + // can appear in different places in the actual data structure so that + // the data doesn't have to be repeated a lot. This essentially lets + // each field have a cheap kind of inheritance. + + foreach ($data as $table => $table_data) { + $bases = array(); + $strings = array(); + $skip_bases = array(); + foreach ($table_data as $field => $info) { + // Collect table data from this table + if ($field == 'table') { + // calculate what tables this table can join to. + if (!empty($info['join'])) { + $bases = array_keys($info['join']); + } + // And it obviously joins to itself. + $bases[] = $table; + continue; + } + foreach (array('field', 'sort', 'filter', 'argument', 'relationship') as $key) { + if (!empty($info[$key])) { + if (!empty($info[$key]['skip base'])) { + foreach ((array) $info[$key]['skip base'] as $base_name) { + $skip_bases[$field][$key][$base_name] = TRUE; + } + } + elseif (!empty($info['skip base'])) { + foreach ((array) $info['skip base'] as $base_name) { + $skip_bases[$field][$key][$base_name] = TRUE; + } + } + foreach (array('title', 'group', 'help', 'base') as $string) { + // First, try the lowest possible level + if (!empty($info[$key][$string])) { + $strings[$field][$key][$string] = $info[$key][$string]; + } + // Then try the field level + elseif (!empty($info[$string])) { + $strings[$field][$key][$string] = $info[$string]; + } + // Finally, try the table level + elseif (!empty($table_data['table'][$string])) { + $strings[$field][$key][$string] = $table_data['table'][$string]; + } + else { + if ($string != 'base') { + $strings[$field][$key][$string] = t("Error: missing @component", array('@component' => $string)); + } + } + } + } + } + } + foreach ($bases as $base_name) { + foreach ($strings as $field => $field_strings) { + foreach ($field_strings as $type_name => $type_strings) { + if (empty($skip_bases[$field][$type_name][$base_name])) { + $fields[$base_name][$type_name]["$table.$field"] = $type_strings; + } + } + } + } + } +// vsm('Views UI data build time: ' . (views_microtime() - $start) * 1000 . ' ms'); + } + + // If we have an array of base tables available, go through them + // all and add them together. Duplicate keys will be lost and that's + // Just Fine. + if (is_array($base)) { + $strings = array(); + foreach ($base as $base_table) { + if (isset($fields[$base_table][$type])) { + $strings += $fields[$base_table][$type]; + } + } + uasort($strings, '_views_sort_types'); + return $strings; + } + + if (isset($fields[$base][$type])) { + uasort($fields[$base][$type], '_views_sort_types'); + return $fields[$base][$type]; + } + return array(); +} + +/** + * Fetch a list of all base tables available + * + * @param $type + * Either 'display', 'style' or 'row' + * @param $key + * For style plugins, this is an optional type to restrict to. May be 'normal', + * 'summary', 'feed' or others based on the neds of the display. + * @param $base + * An array of possible base tables. + * + * @return + * A keyed array of in the form of 'base_table' => 'Description'. + */ +function views_fetch_plugin_names($type, $key = NULL, $base = array()) { + $data = views_fetch_plugin_data(); + + $plugins[$type] = array(); + + foreach ($data[$type] as $id => $plugin) { + // Skip plugins that don't conform to our key. + if ($key && (empty($plugin['type']) || $plugin['type'] != $key)) { + continue; + } + if (empty($plugin['no ui']) && (empty($base) || empty($plugin['base']) || array_intersect($base, $plugin['base']))) { + $plugins[$type][$id] = $plugin['title']; + } + } + + if (!empty($plugins[$type])) { + asort($plugins[$type]); + return $plugins[$type]; + } + // fall-through + return array(); +} + + +/** + * Theme the form for the table style plugin + */ +function theme_views_ui_style_plugin_table($form) { + $output = drupal_render($form['description_markup']); + + $header = array( + t('Field'), + t('Column'), + t('Separator'), + array( + 'data' => t('Sortable'), + 'align' => 'center', + ), + array( + 'data' => t('Default sort'), + 'align' => 'center', + ), + ); + $rows = array(); + foreach (element_children($form['columns']) as $id) { + $row = array(); + $row[] = drupal_render($form['info'][$id]['name']); + $row[] = drupal_render($form['columns'][$id]); + $row[] = drupal_render($form['info'][$id]['separator']); + if (!empty($form['info'][$id]['sortable'])) { + $row[] = array( + 'data' => drupal_render($form['info'][$id]['sortable']), + 'align' => 'center', + ); + $row[] = array( + 'data' => drupal_render($form['default'][$id]), + 'align' => 'center', + ); + } + else { + $row[] = ''; + $row[] = ''; + } + $rows[] = $row; + } + + // Add the special 'None' row. + $rows[] = array(t('None'), '', '', '', array('align' => 'center', 'data' => drupal_render($form['default'][-1]))); + + $output .= theme('table', $header, $rows); + $output .= drupal_render($form); + return $output; +} + diff --git a/includes/ajax.inc b/includes/ajax.inc new file mode 100644 index 0000000000000000000000000000000000000000..2193c76ce0af8c43fcaf685a4035b5039f6610b9 --- /dev/null +++ b/includes/ajax.inc @@ -0,0 +1,185 @@ +status = FALSE; + $object->display = ''; + + $arg = explode('/', $_REQUEST['view_path']); + + if ($arg[0] == 'admin' || (variable_get('node_admin_theme', '0') && $arg[0] == 'node' && ($arg[1] == 'add' || $arg[2] == 'edit'))) { + global $custom_theme; + $custom_theme = variable_get('admin_theme', '0'); + drupal_add_css(drupal_get_path('module', 'system') .'/admin.css', 'module'); + } + // Load the view. + if ($view = views_get_view($name)) { + if ($view->access($display_id)) { + + // Fix 'q' for paging. + if (!empty($path)) { + $_GET['q'] = $path; + } + + // Override the display's pager_element with the one actually used. + if (isset($pager_element)) { + $view->display[$display_id]->handler->set_option('pager_element', $pager_element); + } + // Reuse the same DOM id so it matches that in Drupal.settings. + $view->dom_id = $dom_id; + + $errors = $view->validate(); + if ($errors === TRUE) { + $object->status = TRUE; + $object->title = $view->get_title(); + $object->display .= $view->preview($display_id, $args); + } + else { + foreach ($errors as $error) { + drupal_set_message($error, 'error'); + } + } + // Register the standard JavaScript callback. + $object->__callbacks = array('Drupal.Views.Ajax.ajaxViewResponse'); + // Allow other modules to extend the data returned. + drupal_alter('ajax_data', $object, 'views', $view); + } + } + $messages = theme('status_messages'); + $object->messages = $messages ? '
' . $messages . '
' : ''; + + views_ajax_render($object); + } +} + +/** + * Simple render function to make sure output is what we want. + * + * This function renders an object into JSON, and that object contains + * commands to the ajax response parser on the other side. The actual + * commands that can be sent are completely dependent upon the client + * javascript parser, which can be anything, but this function assumes + * that 'display', at least, will be displayed in some kind of ajax + * spot or popup. + */ +function views_ajax_render($output = NULL, $title = NULL, $url = NULL, $js = NULL) { + if (empty($output)) { + $output->display = t('Server reports invalid input error.'); + $output->title = t('Error'); + } + elseif (!is_object($output)) { + $temp = new stdClass(); + $temp->display = $output; + $temp->title = $title; + $temp->url = $url; + $output = $temp; + } + if (!empty($js)) { + $output->js = $js; + } + + drupal_json($output); + exit; +} + +/** + * Wrapper around drupal_build_form to handle some AJAX stuff automatically. + * This makes some assumptions about the client. + */ +function views_ajax_form_wrapper($form_id, &$form_state) { + // This won't override settings already in. + $form_state += array( + 're_render' => FALSE, + 'no_redirect' => !empty($form_state['ajax']), + ); + + $output = drupal_build_form($form_id, $form_state); + if (!empty($form_state['ajax']) && empty($form_state['executed'])) { + // If the form didn't execute and we're using ajax, build up a + // json command object to render. + $object = new stdClass(); + $object->display = ''; + if ($messages = theme('status_messages')) { + $object->display = '
' . $messages . '
'; + } + $object->display .= $output; + + $object->title = empty($form_state['title']) ? '' : $form_state['title']; + if (!empty($form_state['help_topic'])) { + $module = !empty($form_state['help_module']) ? $form_state['help_module'] : 'views'; + $object->title = theme('advanced_help_topic', $module, $form_state['help_topic']) . $object->title; + } + $object->url = empty($form_state['url']) ? url($_GET['q'], array('absolute' => TRUE)) : $form_state['url']; + $object->js = empty($form_state['js settings']) ? NULL : $form_state['js settings']; + if (!empty($form_state['#section'])) { + $object->hilite = '.' . views_ui_item_css($form_state['#section']); + } + + $output = $object; + } + + // These forms have the title built in, so set the title here: + if (empty($form_state['ajax']) && !empty($form_state['title'])) { + drupal_set_title($form_state['title']); + } + + return $output; +} + + +/** + * Page callback for views user autocomplete + */ +function views_ajax_autocomplete_user($string = '') { + // The user enters a comma-separated list of tags. We only autocomplete the last tag. + $array = drupal_explode_tags($string); + + // Fetch last tag + $last_string = trim(array_pop($array)); + $matches = array(); + if ($last_string != '') { + $prefix = count($array) ? implode(', ', $array) . ', ' : ''; + + if (strpos('anonymous', strtolower($last_string)) !== FALSE) { + $matches[$prefix . 'Anonymous'] = 'Anonymous'; + } + $result = db_query_range("SELECT name FROM {users} WHERE LOWER(name) LIKE LOWER('%s%%')", $last_string, 0, 10); + + while ($account = db_fetch_object($result)) { + $n = $account->name; + // Commas and quotes in terms are special cases, so encode 'em. + if (strpos($account->name, ',') !== FALSE || strpos($account->name, '"') !== FALSE) { + $n = '"' . str_replace('"', '""', $account->name) . '"'; + } + $matches[$prefix . $n] = check_plain($account->name); + } + } + + drupal_json($matches); +} + +/** + * @} + */ diff --git a/includes/analyze.inc b/includes/analyze.inc new file mode 100644 index 0000000000000000000000000000000000000000..d5f3a30c9f56903491c645f217b45ffe5ec16e5d --- /dev/null +++ b/includes/analyze.inc @@ -0,0 +1,109 @@ +init_display(); + $messages = module_invoke_all('views_analyze', $view); + + return $messages; +} + +/** + * Format the analyze result into a message string. + * + * This is based upon the format of drupal_set_message which uses separate + * boxes for "ok", "warning" and "error". + */ +function views_analyze_format_result($view, $messages) { + if (empty($messages)) { + $messages = array(views_ui_analysis(t('View analysis can find nothing to report.'), 'ok')); + } + + $types = array('ok' => array(), 'warning' => array(), 'error' => array()); + foreach ($messages as $message) { + if (empty($types[$message['type']])) { + $types[$message['type']] = array(); + } + $types[$message['type']][] = $message['message']; + } + + $output = ''; + foreach ($types as $type => $messages) { + $message = ''; + if (count($messages) > 1) { + $message = theme('item_list', $messages); + } + else if ($messages) { + $message = array_shift($messages); + } + + if ($message) { + $output .= "
$message
"; + } + } + + return $output; +} + +/** + * Format an analysis message. + * + * This tool should be called by any module responding to the analyze hook + * to properly format the message. It is usually used in the form: + * @code + * $ret[] = views_ui_analysis(t('This is the message'), 'ok'); + * @endcode + * + * The 'ok' status should be used to provide information about things + * that are acceptable. In general analysis isn't interested in 'ok' + * messages, but instead the 'warning', which is a category for items + * that may be broken unless the user knows what he or she is doing, + * and 'error' for items that are definitely broken are much more useful. + * + * @param $messages + * The message to report. + * @param $type + * The type of message. This should be "ok", "warning" or "error". Other + * values can be used but how they are treated by the output routine + * is undefined. + */ +function views_ui_analysis($message, $type = 'error') { + return array('message' => $message, 'type' => $type); +} + +/** + * Implementation of hook_views_analyze(). + * + * This is the basic views analysis that checks for very minimal problems. + * There are other analysis tools in core specific sections, such as + * node.views.inc as well. + */ +function views_ui_views_analyze($view) { + $ret = array(); + // Check for something other than the default display: + if (count($view->display) < 2) { + $ret[] = views_ui_analysis(t('This view has only a default display and therefore will not be placed anywhere on your site; perhaps you want to add a page or a block display.'), 'warning'); + } + + return $ret; +} + diff --git a/includes/base.inc b/includes/base.inc new file mode 100644 index 0000000000000000000000000000000000000000..54444d65ab2bbd36f2801baea81b42892f367cb5 --- /dev/null +++ b/includes/base.inc @@ -0,0 +1,128 @@ + array( + * - 'default' => default value, + * - 'translatable' => TRUE/FALSE (wrap in t() on export if true), + * - 'contains' => array of items this contains, with its own defaults, etc. + * If contains is set, the default will be ignored and assumed to + * be array() + * + * ), + * @endcode + * Each option may have any of the following functions: + * - export_option_OPTIONNAME -- Special export handling if necessary. + * - translate_option_OPTIONNAME -- Special handling for translating data + * within the option, if necessary. + */ + function option_definition() { return array(); } + + /** + * Views handlers use a special construct function so that we can more + * easily construct them with variable arguments. + */ + function construct() { $this->set_default_options(); } + + /** + * Set default options on this object. Called by the constructor in a + * complex chain to deal with backward compatibility. + */ + function options() { } + + /** + * Set default options. + * For backward compatibility, it sends the options array; this is a + * feature that will likely disappear at some point. + */ + function set_default_options() { + $this->_set_option_defaults($this->options, $this->option_definition()); + + // Retained for complex defaults plus backward compatibility. + $this->options($this->options); + } + + function _set_option_defaults(&$storage, $options, $level = 0) { + foreach ($options as $option => $definition) { + if (isset($definition['contains']) && is_array($definition['contains'])) { + $storage[$option] = array(); + $this->_set_option_defaults($storage[$option], $definition['contains'], $level++); + } + elseif (!empty($definition['translatable']) && !empty($definition['default'])) { + $storage[$option] = t($definition['default']); + } + else { + $storage[$option] = isset($definition['default']) ? $definition['default'] : NULL; + } + } + } + + /** + * Unpack options over our existing defaults, drilling down into arrays + * so that defaults don't get totally blown away. + */ + function unpack_options(&$storage, $options, $definition = NULL) { + if (!is_array($options)) { + return; + } + + if (!isset($definition)) { + $definition = $this->option_definition(); + } + + foreach ($options as $key => $value) { + if (is_array($value)) { + if (!isset($storage[$key]) || !is_array($storage[$key])) { + $storage[$key] = array(); + } + + $this->unpack_options($storage[$key], $value, isset($definition[$key]['contains']) ? $definition[$key]['contains'] : array()); + } + else if (!empty($definition[$key]['translatable']) && !empty($value)) { + $storage[$key] = t($value); + } + else { + $storage[$key] = $value; + } + } + } + + /** + * Let the handler know what its full definition is. + */ + function set_definition($definition) { + $this->definition = $definition; + if (isset($definition['field'])) { + $this->real_field = $definition['field']; + } + } + + function destroy() { + if (isset($this->view)) { + unset($this->view); + } + + if (isset($this->display)) { + unset($this->display); + } + + if (isset($this->query)) { + unset($this->query); + } + } +} diff --git a/includes/cache.inc b/includes/cache.inc new file mode 100644 index 0000000000000000000000000000000000000000..03f59a6746eead01a5b6ff7e118cea44c8a161ee --- /dev/null +++ b/includes/cache.inc @@ -0,0 +1,270 @@ +data)) { + $cache = $data->data; + } + + if (empty($cache)) { + $cache = module_invoke_all('views_data'); + foreach (module_implements('views_data_alter') as $module) { + $function = $module . '_views_data_alter'; + $function($cache); + } + + views_cache_set('views_data', $cache, TRUE); + } + + vpr('Views data build time: ' . (views_microtime() - $start) * 1000 . ' ms'); + } + + if (!$table) { + return $cache; + } + if (isset($cache[$table])) { + return $cache[$table]; + } + + // Return an empty array if there is no match. + return array(); +} + +/** + * Fetch the plugin data from cache. + */ +function _views_fetch_plugin_data($type = NULL, $plugin = NULL) { + static $cache = NULL; + if (!isset($cache)) { + $start = views_microtime(); + views_include_handlers(); + + $cache = views_discover_plugins(); + + vpr('Views plugins build time: ' . (views_microtime() - $start) * 1000 . ' ms'); + } + + if (!$type && !$plugin) { + return $cache; + } + else if (!$plugin) { + // Not in the if above so the else below won't run + if (isset($cache[$type])) { + return $cache[$type]; + } + } + else if (isset($cache[$type][$plugin])) { + return $cache[$type][$plugin]; + } + + // Return an empty array if there is no match. + return array(); +} + +/** + * Scan all modules for default views and rebuild the default views cache. + * + * @return An associative array of all known default views. + */ +function _views_discover_default_views() { + static $cache = NULL; + + if (!isset($cache)) { + $data = views_cache_get('views_default_views', TRUE); + + if (isset($data->data) && is_array($data->data)) { + $cache = $data->data; + } + else { + views_include_default_views(); + $defaults = module_invoke_all('views_default_views'); + $cache = array(); + + foreach ($defaults as $name => $view) { + // Only views with a sufficiently high api version are eligible. + if (isset($view->api_version) && $view->api_version >= 2) { + // Do not cache dead handlers. + $view->destroy(); + $cache[$name] = $view; + } + } + + // Allow modules to modify default views before they are cached. + drupal_alter('views_default_views', $cache); + + views_cache_set('views_default_views', $cache, TRUE); + } + } + + return $cache; +} + +/** + * Set a cached item in the views cache. + * + * This is just a convenience wrapper around cache_set(). + * + * @param $cid + * The cache ID of the data to store. + * @param $data + * The data to store in the cache. Complex data types will be automatically serialized before insertion. + * Strings will be stored as plain text and not serialized. + * @param $use_language + * If TRUE, the data will be cached specific to the currently active language. + */ +function views_cache_set($cid, $data, $use_language = FALSE) { + global $language; + + if (variable_get('views_skip_cache', FALSE)) { + return; + } + if ($use_language) { + $cid .= ':' . $language->language; + } + + cache_set($cid, $data, 'cache_views'); +} + +/** + * Return data from the persistent views cache. + * + * This is just a convenience wrapper around cache_get(). + * + * @param $cid + * The cache ID of the data to retrieve. + * @param $use_language + * If TRUE, the data will be requested specific to the currently active language. + */ +function views_cache_get($cid, $use_language = FALSE) { + global $language; + + if (variable_get('views_skip_cache', FALSE)) { + return 0; + } + if ($use_language) { + $cid .= ':' . $language->language; + } + + return cache_get($cid, 'cache_views'); +} + +/** + * @defgroup views_object_cache Non-volatile cache storage + * @{ + * The non-volatile object cache is used to store an object while it is + * being edited, so that we don't have to save until we're completely + * done. The cache should be 'cleaned' on a regular basis, meaning to + * remove old objects from the cache, but otherwise the data in this + * cache must remain stable, as it includes unsaved changes. + */ + +/** + * Get an object from the non-volatile Views cache. + * + * This function caches in memory as well, so that multiple calls to this + * will not result in multiple database reads. + * + * @param $obj + * A 32 character or less string to define what kind of object is being + * stored; primarily this is used to prevent collisions. + * @param $name + * The name of the view (or other object) being stored. + * @param $skip_cache + * Skip the memory cache, meaning this must be read from the db again. + * + * @return + * The data that was cached. + */ +function views_object_cache_get($obj, $name, $skip_cache = FALSE) { + static $cache = array(); + $key = "$obj:$name"; + if ($skip_cache) { + unset($cache[$key]); + } + + if (!array_key_exists($key, $cache)) { + $data = db_fetch_object(db_query("SELECT * FROM {views_object_cache} WHERE sid = '%s' AND obj = '%s' AND name = '%s'", session_id(), $obj, $name)); + if ($data) { + $cache[$key] = unserialize($data->data); + } + } + return isset($cache[$key]) ? $cache[$key] : NULL; +} + +/** + * Store an object in the non-volatile Views cache. + * + * @param $obj + * A 32 character or less string to define what kind of object is being + * stored; primarily this is used to prevent collisions. + * @param $name + * The name of the view (or other object) being stored. + * @param $cache + * The object to be cached. This will be serialized prior to writing. + */ +function views_object_cache_set($obj, $name, $cache) { + views_object_cache_clear($obj, $name); + db_query("INSERT INTO {views_object_cache} (sid, obj, name, data, updated) VALUES ('%s', '%s', '%s', '%s', %d)", session_id(), $obj, $name, serialize($cache), time()); +} + +/** + * Remove an object from the non-volatile Views cache + * + * @param $obj + * A 32 character or less string to define what kind of object is being + * stored; primarily this is used to prevent collisions. + * @param $name + * The name of the view (or other object) being stored. + */ +function views_object_cache_clear($obj, $name) { + db_query("DELETE FROM {views_object_cache} WHERE sid = '%s' AND obj = '%s' AND name = '%s'", session_id(), $obj, $name); +} + +/** + * Remove all objects in the object cache that are older than the + * specified age. + * + * @param $age + * The minimum age of objects to remove, in seconds. For example, 86400 is + * one day. Defaults to 7 days. + */ +function views_object_cache_clean($age = NULL) { + if (empty($age)) { + $age = 86400 * 7; // 7 days + } + db_query("DELETE FROM {views_object_cache} WHERE updated < %d", time() - $age); +} + +/** + * @} + */ diff --git a/includes/convert.inc b/includes/convert.inc new file mode 100644 index 0000000000000000000000000000000000000000..2ffaa2cd13d4a05e1d7f90564aa14c18f566cfbe --- /dev/null +++ b/includes/convert.inc @@ -0,0 +1,543 @@ + t('View name'), 'field' => 'name', 'sort' => 'asc'), + array('data' => t('Description')), + array('data' => t('Operations')), + ); + $current_views = views_get_all_views(); + + $result = db_query("SELECT v.* FROM {view_view} v"); + while ($view = db_fetch_object($result)) { + $ops = array(); + if (!isset($current_views[$view->name])) { + $ops[] = l(t('Convert'), "admin/build/views1/convert/$view->name"); + } + else { + $ops[] = t('Converted'); + } + $ops[] = l(t('Delete'), "admin/build/views1/delete/$view->name"); + + $item = array(); + $item[] = check_plain($view->name); + $item[] = check_plain($view->description); + $item[] = implode(' | ', $ops); + $items[] = $item; + + $ts = tablesort_init($header); + switch ($ts['sql']) { + case 'name': + default: + $sorts[] = $item[0]; + break; + case 'title': + $sorts[] = $item[1]; + break; + } + } + + if (!empty($ts)) { + if (strtolower($ts['sort']) == 'desc') { + arsort($sorts); + } + else { + asort($sorts); + } + } + + $i = array(); + foreach ($sorts as $id => $title) { + $i[] = $items[$id]; + } + $output = t('The table below lists Views version 1 views that are stored in the database. You can either convert them to work in Views version 2, or delete them. The views are convertible only if there is no Views 2 view with the same name.'); + $output .= theme('table', $header, $i); + + $output .= drupal_get_form('views_ui_convert_cleanup_form'); + return $output; +} + +/** + * Provide form to clean up Views 1 tables. + */ +function views_ui_convert_cleanup_form() { + $form['verify'] = array( + '#type' => 'checkbox', + '#title' => t('Remove all Views 1 tables'), + '#description' => t('Check this box and then click clean up to drop all Views 1 tables. Warning: this operation will not be reversible! Do this only if you are sure you no longer need this data.'), + '#required' => TRUE, + ); + + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Clean up'), + ); + + return $form; +} + +function views_ui_convert_cleanup_form_submit($form, $form_state) { + if (empty($form_state['values']['verify'])) { + drupal_set_message('Please check the box to verify you want to destroy your Views 1 table data.'); + return; + } + + $ret = array(); + if (db_table_exists('view_view')) { + db_drop_table($ret, 'view_view'); + } + if (db_table_exists('view_sort')) { + db_drop_table($ret, 'view_sort'); + } + if (db_table_exists('view_argument')) { + db_drop_table($ret, 'view_argument'); + } + if (db_table_exists('view_tablefield')) { + db_drop_table($ret, 'view_tablefield'); + } + if (db_table_exists('view_filter')) { + db_drop_table($ret, 'view_filter'); + } + if (db_table_exists('view_exposed_filter')) { + db_drop_table($ret, 'view_exposed_filter'); + } + + drupal_set_message(t('All Views 1 tables have been removed.')); +} + +/** + * Page callback for the tools - Views 1 convert page + */ +function views_ui_convert1($name) { + $old = views1_load($name); + if (!$old) { + return t('Unable to find view.'); + } + + $view = views1_import($old); + + if ($view) { + views_ui_cache_set($view); + drupal_goto('admin/build/views/edit/' . $view->name); + } + else { + return t('Unable to convert view.'); + } +} + +/** + * Page to delete a Views 1 view. + */ +function views_ui_delete1_confirm(&$form_state, $vid) { + $form_state['vid'] = $vid; + $form = array(); + + $cancel = 'admin/build/views/tools/convert'; + if (!empty($_REQUEST['cancel'])) { + $cancel = $_REQUEST['cancel']; + } + return confirm_form($form, + t('Are you sure you want to delete the view %name?', array('%name' => $view->name)), + $cancel, + t('This action cannot be undone.'), + t('Delete'), + t('Cancel')); +} + +/** + * Submit handler to delete a view. + */ +function views_ui_delete1_confirm_submit(&$form, &$form_state) { + views1_delete($form_state['vid']); + drupal_set_message(t('The view has been deleted')); + $form_state['redirect'] = 'admin/build/views/tools/convert'; +} + +/** + * Convert a Views 1 view to a Views 2 view. + */ +function views1_import($imported) { + views_include_handlers(); + views_module_include('views_convert.inc'); + + $view = views_new_view(); + + $view->name = $imported->name; + $view->description = $imported->description; + + if (!empty($imported->page) && !empty($imported->url)) { + $page_display = $view->add_display('page'); + } + if (!empty($imported->block)) { + $block_display = $view->add_display('block'); + } + $view->init_display(); + + $handler = &$view->display['default']->handler; + $handler->set_option('title', $imported->page_title); + $handler->set_option('header', $imported->page_header); + $handler->set_option('header_format', $imported->page_header_format); + $handler->set_option('footer', $imported->page_footer); + $handler->set_option('footer_format', $imported->page_footer_format); + $handler->set_option('empty', $imported->page_empty); + $handler->set_option('empty_format', $imported->page_empty_format); + + $handler->set_option('use_pager', $imported->use_pager); + $handler->set_option('items_per_page', $imported->nodes_per_page); + $handler->set_option('pager_element', 0); + $handler->set_option('offset', 0); + + $access = array('type' => 'none', 'role' => array(), 'perm' => ''); + if ($imported->access) { + $access['type'] = 'role'; + $access['role'] = drupal_map_assoc($imported->access); + } + + $handler->set_option('access', $access); + if (!empty($imported->page) && !empty($imported->url)) { + $handler = &$view->display[$page_display]->handler; + $url = str_replace('$arg', '%', $imported->url); + $handler->set_option('path', $url); + if ($imported->menu) { + $menu = array('type' => 'normal'); + if ($imported->menu_tab) { + $menu['type'] = 'tab'; + } + if ($imported->menu_tab_default) { + $menu['type'] = 'default tab'; + } + $menu['title'] = $imported->menu_title ? $imported->menu_title : $imported->page_title; + $handler->set_option('menu', $menu); + + if ($menu['type'] == 'default tab') { + $tab_options = array('type' => 'none'); + switch ($imported->menu_tab_default_parent_type) { + case 'tab': + case 'normal': + $tab_options['type'] = $imported->menu_tab_default_parent_type; + break; + } + } + $tab_options['title'] = $imported->menu_parent_title; + $tab_options['weight'] = $imported->menu_parent_tab_weight; + $handler->set_option('tab_options', $tab_options); + } + } + + views1_convert_style($view, $handler, $imported->page_type); + + if (!empty($imported->block)) { + $handler = &$view->display[$block_display]->handler; + + if (!empty($imported->block_title)) { + if (!empty($imported->page)) { + $handler->set_override('title'); + } + $handler->set_option('title', $imported->block_title); + } + + if (!empty($imported->page)) { + $handler->set_override('use_pager'); + } + $handler->set_option('use_pager', FALSE); + + if ($imported->nodes_per_block != $imported->nodes_per_page) { + $handler->set_option('items_per_page', $imported->nodes_per_block); + $handler->set_option('offset', 0); + } + + if (empty($imported->block_use_page_header)) { + if (!empty($imported->page)) { + $handler->set_override('header'); + } + if (!empty($imported->block_header)) { + $handler->set_option('header', $imported->block_header); + $handler->set_option('header_format', $imported->block_header_format); + } + } + if (empty($imported->block_use_page_footer)) { + if (!empty($imported->page)) { + $handler->set_override('footer'); + } + if (!empty($imported->block_footer)) { + $handler->set_option('footer', $imported->block_footer); + $handler->set_option('footer_format', $imported->block_footer_format); + } + } + if (empty($imported->block_use_page_empty)) { + if (!empty($imported->page)) { + $handler->set_override('empty'); + } + if (!empty($imported->block_empty)) { + $handler->set_option('empty', $imported->block_empty); + $handler->set_option('empty_format', $imported->block_empty_format); + } + } + + $handler->set_option('use_more', $imported->block_more); + + if (!empty($imported->page)) { + $handler->set_override('style_plugin'); + } + views1_convert_style($view, $handler, $imported->block_type); + } + + // For each of the fields, arguments, filters, and sorts in the old view, + // check if a handler for this item exists in Views 2 and add it, + // then see if any other modules want to adapt it using hook_views_convert(). + + foreach ($imported->field as $field) { + $id = $view->add_item('default', 'field', $field['tablename'], $field['field'], array('label' => $field['label'])); + if ($view->display_handler->get_option('style_plugin') == 'table') { + $options = $view->display_handler->get_option('style_options'); + if (!empty($field['sortable'])) { + $options['info'][$id]['sortable'] = TRUE; + if (!empty($field['defaultsort'])) { + $options['default'] = $id; + } + } + $view->display_handler->set_option('style_options', $options); + } + foreach (module_implements('views_convert') as $module) { + module_invoke($module, 'views_convert', 'default', 'field', $view, $field, $id); + } + } + foreach ($imported->sort as $field) { + $id = $view->add_item('default', 'sort', $field['tablename'], $field['field'], array('order' => $field['sortorder'])); + foreach (module_implements('views_convert') as $module) { + module_invoke($module, 'views_convert', 'default', 'sort', $view, $field, $id); + } + } + $actions = array('ignore', 'not found', 'ignore', 'summary asc', 'summary asc', 'summary desc', 'summary asc', 'empty'); + foreach ($imported->argument as $id => $field) { + if (!empty($imported->view_args_php)) { + $field['argoptions']['default_action'] = 'default'; + $field['argoptions']['default_argument_type'] = 'php'; + $field['argoptions']['default_argument_php'] = '$args = eval(\''. str_replace("'", "\\'", $imported->view_args_php) .'\');'."\n"; + $field['argoptions']['default_argument_php'] .= 'if (isset($args['. $field['position'] .'])) {'."\n"; + $field['argoptions']['default_argument_php'] .= ' return $args['. $field['position'] .'];'."\n"; + $field['argoptions']['default_argument_php'] .= '}'; + $field['argoptions']['validate_fail'] = $actions[$field['argdefault']]; + } + else { + $field['argoptions']['default_action'] = $actions[$field['argdefault']]; + } + if (!empty($field['title'])) { + $field['argoptions']['title'] = $field['title']; + } + if (!empty($field['wildcard'])) { + $field['argoptions']['wildcard'] = $field['wildcard']; + } + if (!empty($field['wildcard_substitution'])) { + $field['argoptions']['wildcard_substitution'] = $field['wildcard_substitution']; + } + // Arguments didn't used to be identified by table.name so we just have to + // leave that out. + foreach (module_implements('views_convert') as $module) { + module_invoke($module, 'views_convert', 'default', 'argument', $view, $field, NULL); + } + } + foreach ($imported->filter as $field) { + $options = $field['value'] == '' ? array() : array('value' => $field['value']); + $id = $view->add_item('default', 'filter', $field['tablename'], $field['field'], $options); + foreach (module_implements('views_convert') as $module) { + module_invoke($module, 'views_convert', 'default', 'filter', $view, $field, $id); + } + } + // Exposed filters now get added to the filter array, not as a separate array. + $count = 0; + foreach ($imported->exposed_filter as $field) { + list(, $id) = explode('.', $field['field'], 2); + $item = $view->get_item('default', 'filter', $id); + if (views_get_handler($item['table'], $item['field'], 'filter')) { + $item['exposed'] = TRUE; + + // Use the count to emulate the old, hardcoded filter naming. + $item['expose']['identifier'] = 'filter' . $count; + $item['expose']['label'] = $field['label']; + $item['expose']['operator'] = $field['operator'] ? 'op' . $count : ''; + $item['expose']['optional'] = $field['optional']; + $item['expose']['single'] = $field['single']; + $view->set_item('default', 'filter', $id, $item); + } + $count++; + foreach (module_implements('views_convert') as $module) { + module_invoke($module, 'views_convert', 'default', 'exposed_filter', $view, $field, $id); + } + } + + return $view; +} + +function views1_convert_style(&$view, &$handler, $type) { + switch ($type) { + case 'list': + $handler->set_option('style_plugin', 'list'); + $handler->set_option('style_options', array('type' => 'ul')); + $handler->set_option('row_plugin', 'fields'); + break; + case 'node': + $handler->set_option('row_plugin', 'node'); + $handler->set_option('row_options', array('teaser' => FALSE, 'links' => TRUE)); + break; + case 'teaser': + $handler->set_option('row_plugin', 'node'); + $handler->set_option('row_options', array('teaser' => TRUE, 'links' => TRUE)); + break; + case 'table': + $options = array(); + $options['columns'] = array(); + $options['default'] = ''; + $options['info'] = array(); + $options['override'] = FALSE; + $options['order'] = 'asc'; + + $handler->set_option('style_plugin', 'table'); + $handler->set_option('style_options', $options); + break; + default: + // Ask around if anybody else knows. + foreach (module_implements('views_convert') as $module) { + module_invoke($module, 'views_convert', $handler->display->id, 'style', $view, $type); + } + } +} +/** + * Load a version 1 view from the database. + * + */ +function views1_load($arg) { + static $cache = array(); + $which = is_numeric($arg) ? 'vid' : 'name'; + if (isset($cache[$which][$arg])) { + return $cache[$which][$arg]; + } + + $where = (is_numeric($arg) ? "v.vid = %d" : "v.name = '%s'"); + $view = db_fetch_object(db_query("SELECT v.* FROM {view_view} v WHERE $where", $arg)); + + if (!$view->name) { + return NULL; + } + + $view->access = ($view->access ? explode(', ', $view->access) : array()); + + // load the sorting criteria too. + $result = db_query("SELECT * FROM {view_sort} vs WHERE vid = $view->vid ORDER BY position ASC"); + + $view->sort = array(); + while ($sort = db_fetch_array($result)) { + if (substr($sort['field'], 0, 2) == 'n.') { + $sort['field'] = 'node' . substr($sort['field'], 1); + } + $sort['id'] = $sort['field']; + $bits = explode('.', $sort['field']); + $sort['tablename'] = $bits[0]; + $sort['field'] = $bits[1]; + $view->sort[$sort['position']] = $sort; + } + + $result = db_query("SELECT * FROM {view_argument} WHERE vid = $view->vid ORDER BY position ASC"); + + $view->argument = array(); + while ($arg = db_fetch_array($result)) { + $arg['id'] = $arg['type']; + $view->argument[$arg['position']] = $arg; + } + + $result = db_query("SELECT * FROM {view_tablefield} WHERE vid = $view->vid ORDER BY position ASC"); + + $view->field = array(); + while ($arg = db_fetch_array($result)) { + if ($arg['tablename'] == 'n') { + $arg['tablename'] = 'node'; + } + $arg['id'] = $arg['fullname'] = "$arg[tablename].$arg[field]"; + $arg['queryname'] = "$arg[tablename]_$arg[field]"; + $view->field[] = $arg; + } + + $result = db_query("SELECT * FROM {view_filter} WHERE vid = $view->vid ORDER BY position ASC"); + + // TODO - Is it safe to ignore this $filters variable? This function depends + // on lots of additional code needed to call hook_implements and construct + // all the views tables, so using it will add a lot of code to this file. + //$filters = _views_get_filters(); + $view->filter = array(); + while ($filter = db_fetch_array($result)) { + if (substr($filter['field'], 0, 2) == 'n.') { + $filter['field'] = 'node' . substr($filter['field'], 1); + } + + if ($filter['operator'] == 'AND' || + $filter['operator'] == 'OR' || + $filter['operator'] == 'NOR') { + // TODO - need another way to identify this type of filter + // without being able to call hook_implements(). + //|| $filters[$filter['field']]['value-type'] == 'array' ) { + if ($filter['value'] !== NULL && $filter['value'] !== '') { + $filter['value'] = explode(',', $filter['value']); + } + else { + $filter['value'] = array(); + } + } + $filter['id'] = $filter['field']; + $bits = explode('.', $filter['field']); + $filter['tablename'] = $bits[0]; + $filter['field'] = $bits[1]; + $view->filter[$filter['position']] = $filter; + } + + $result = db_query("SELECT * FROM {view_exposed_filter} WHERE vid = $view->vid ORDER BY position ASC"); + + $view->exposed_filter = array(); + while ($arg = db_fetch_array($result)) { + $arg['id'] = $arg['field']; + $view->exposed_filter[] = $arg; + } + + $cache['vid'][$view->vid] = $view; + $cache['name'][$view->name] = $view; + + return $view; +} + +/** + * Delete a version 1 view from the database. + * + */ +function views1_delete($arg) { + static $cache = array(); + $where = (is_numeric($arg) ? "v.vid = %d" : "v.name = '%s'"); + $view = db_fetch_object(db_query("SELECT v.* FROM {view_view} v WHERE $where", $arg)); + + if (!$view->name) { + return NULL; + } + + + + $result = db_query("DELETE FROM {view_sort} WHERE vid = $view->vid"); + $result = db_query("DELETE FROM {view_argument} WHERE vid = $view->vid"); + $result = db_query("DELETE FROM {view_tablefield} WHERE vid = $view->vid"); + $result = db_query("DELETE FROM {view_filter} WHERE vid = $view->vid"); + $result = db_query("DELETE FROM {view_exposed_filter} WHERE vid = $view->vid"); + $result = db_query("DELETE FROM {view_view} WHERE vid = $view->vid"); +} + diff --git a/includes/form.inc b/includes/form.inc new file mode 100644 index 0000000000000000000000000000000000000000..b370d4d2fb111263c27c84f9effbf15865c96b56 --- /dev/null +++ b/includes/form.inc @@ -0,0 +1,299 @@ + NULL, 'submitted' => FALSE, 'input' => $_POST, 'method' => 'post'); + + $args = isset($form_state['args']) ? $form_state['args'] : array(); + $cacheable = FALSE; + + if (isset($_SESSION['batch_form_state'])) { + // We've been redirected here after a batch processing : the form has + // already been processed, so we grab the post-process $form_state value + // and move on to form display. See _batch_finished() function. + $form_state = $_SESSION['batch_form_state']; + unset($_SESSION['batch_form_state']); + } + else { + // If the incoming $_POST contains a form_build_id, we'll check the + // cache for a copy of the form in question. If it's there, we don't + // have to rebuild the form to proceed. In addition, if there is stored + // form_state data from a previous step, we'll retrieve it so it can + // be passed on to the form processing code. + if (isset($_POST['form_id']) && $_POST['form_id'] == $form_id && !empty($_POST['form_build_id'])) { + $form = form_get_cache($_POST['form_build_id'], $form_state); + if (!empty($form['#no_cache']) || empty($form)) { + unset($form); + } + } + + // If the previous bit of code didn't result in a populated $form + // object, we're hitting the form for the first time and we need + // to build it from scratch. + if (!isset($form)) { + $form_state['post'] = $form_state['input']; + // Use a copy of the function's arguments for manipulation + $args_temp = $args; + $args_temp[0] = &$form_state; + array_unshift($args_temp, $form_id); + + $form = call_user_func_array('drupal_retrieve_form', $args_temp); + $form_build_id = 'form-' . md5(mt_rand()); + $form['#build_id'] = $form_build_id; + + if ($form_state['method'] == 'get' && !isset($form['#method'])) { + $form['#method'] = 'get'; + } + + drupal_prepare_form($form_id, $form, $form_state); + // Store a copy of the unprocessed form for caching and indicate that it + // is cacheable if #cache will be set. + $original_form = $form; + $cacheable = TRUE; + unset($form_state['post']); + } + $form['#post'] = $form_state['input']; + + // Now that we know we have a form, we'll process it (validating, + // submitting, and handling the results returned by its submission + // handlers. Submit handlers accumulate data in the form_state by + // altering the $form_state variable, which is passed into them by + // reference. + drupal_process_form_new($form_id, $form, $form_state); + + // If we were told not to redirect, but not told to re-render, return + // here. + if (!empty($form_state['executed']) && empty($form_state['rerender'])) { + return; + } + + if ($cacheable && !empty($form['#cache']) && empty($form['#no_cache'])) { + // Caching is done past drupal_process_form so #process callbacks can + // set #cache. By not sending the form state, we avoid storing + // $form_state['storage']. + form_set_cache($form_build_id, $original_form, NULL); + } + } + + // Most simple, single-step forms will be finished by this point -- + // drupal_process_form() usually redirects to another page (or to + // a 'fresh' copy of the form) once processing is complete. If one + // of the form's handlers has set $form_state['redirect'] to FALSE, + // the form will simply be re-rendered with the values still in its + // fields. + // + // If $form_state['storage'] or $form_state['rebuild'] have been + // set by any submit or validate handlers, however, we know that + // we're in a complex multi-part process of some sort and the form's + // workflow is NOT complete. We need to construct a fresh copy of + // the form, passing in the latest $form_state in addition to any + // other variables passed into drupal_get_form(). + + if (!empty($form_state['rebuild']) || !empty($form_state['storage'])) { + $form = drupal_rebuild_form_new($form_id, $form_state, $args); + } + + // If we haven't redirected to a new location by now, we want to + // render whatever form array is currently in hand. + return drupal_render_form($form_id, $form); +} + +/** + * Views' replacement of drupal_rebuild_form. + * + * This change merely respects a form's wishes not to be cached. + */ +function drupal_rebuild_form_new($form_id, &$form_state, $args, $form_build_id = NULL) { + // Remove the first argument. This is $form_id.when called from + // drupal_get_form and the original $form_state when called from some AHAH + // callback. Neither is needed. After that, put in the current state. + $args[0] = &$form_state; + // And the form_id. + array_unshift($args, $form_id); + $form = call_user_func_array('drupal_retrieve_form', $args); + + if (!isset($form_build_id)) { + // We need a new build_id for the new version of the form. + $form_build_id = 'form-' . md5(mt_rand()); + } + $form['#build_id'] = $form_build_id; + drupal_prepare_form($form_id, $form, $form_state); + + if (empty($form['#no_cache'])) { + // Now, we cache the form structure so it can be retrieved later for + // validation. If $form_state['storage'] is populated, we'll also cache + // it so that it can be used to resume complex multi-step processes. + form_set_cache($form_build_id, $form, $form_state); + } + + // Originally this called drupal_process_form, but all that happens there + // is form_builder and then submission; and the rebuilt form is not + // allowed to submit. Therefore, just do this: + $form['#post'] = $form_state['input']; + $form = form_builder($form_id, $form, $form_state); + + return $form; +} + +/** + * Views' replacement for drupal_process_form that accepts commands + * not to redirect, as well as forcing processing of 'get' method forms. + */ +function drupal_process_form_new($form_id, &$form, &$form_state) { + // submitting, and handling the results returned by its submission + // handlers. Submit handlers accumulate data in the form_state by + // altering the $form_state variable, which is passed into them by + // reference. + $form_state['values'] = array(); + + // With $_GET, these forms are always submitted. + if ($form_state['method'] == 'get') { + if (!isset($form['#post']['form_build_id'])) { + $form['#post']['form_build_id'] = $form['#build_id']; + } + if (!isset($form['#post']['form_id'])) { + $form['#post']['form_id'] = $form_id; + } + if (!isset($form['#post']['form_token']) && isset($form['#token'])) { + $form['#post']['form_token'] = drupal_get_token($form['#token']); + } + } + + $form = form_builder($form_id, $form, $form_state); + // Only process the form if it is programmed or the form_id coming + // from the POST data is set and matches the current form_id. + + if ((!empty($form['#programmed'])) || (!empty($form['#post']) && (isset($form['#post']['form_id']) && ($form['#post']['form_id'] == $form_id)))) { + drupal_validate_form_new($form_id, $form, $form_state); + + // form_clean_id() maintains a cache of element IDs it has seen, + // so it can prevent duplicates. We want to be sure we reset that + // cache when a form is processed, so scenerios that result in + // the form being built behind the scenes and again for the + // browser don't increment all the element IDs needlessly. + form_clean_id(NULL, TRUE); + + if ((!empty($form_state['submitted'])) && !form_get_errors() && empty($form_state['rebuild'])) { + $form_state['redirect'] = NULL; + form_execute_handlers('submit', $form, $form_state); + + // We'll clear out the cached copies of the form and its stored data + // here, as we've finished with them. The in-memory copies are still + // here, though. + if (variable_get('cache', CACHE_DISABLED) == CACHE_DISABLED && !empty($form_state['values']['form_build_id'])) { + cache_clear_all('form_' . $form_state['values']['form_build_id'], 'cache_form'); + cache_clear_all('storage_' . $form_state['values']['form_build_id'], 'cache_form'); + } + + // If batches were set in the submit handlers, we process them now, + // possibly ending execution. We make sure we do not react to the batch + // that is already being processed (if a batch operation performs a + // drupal_execute). + if ($batch =& batch_get() && !isset($batch['current_set'])) { + // The batch uses its own copies of $form and $form_state for + // late execution of submit handers and post-batch redirection. + $batch['form'] = $form; + $batch['form_state'] = $form_state; + $batch['progressive'] = !$form['#programmed']; + batch_process(); + // Execution continues only for programmatic forms. + // For 'regular' forms, we get redirected to the batch processing + // page. Form redirection will be handled in _batch_finished(), + // after the batch is processed. + } + + // If no submit handlers have populated the $form_state['storage'] + // bundle, and the $form_state['rebuild'] flag has not been set, + // we're finished and should redirect to a new destination page + // if one has been set (and a fresh, unpopulated copy of the form + // if one hasn't). If the form was called by drupal_execute(), + // however, we'll skip this and let the calling function examine + // the resulting $form_state bundle itself. + if (!$form['#programmed'] && empty($form_state['rebuild']) && empty($form_state['storage'])) { + if (!empty($form_state['no_redirect'])) { + $form_state['executed'] = TRUE; + } + else { + drupal_redirect_form($form, $form_state['redirect']); + } + } + } + } +} + +/** + * The original version of drupal_validate_form does not have an override for + * the static check to only validate a form id once. Unfortunately, we need + * to be able to overridet his. + */ +function drupal_validate_form_new($form_id, $form, &$form_state) { + static $validated_forms = array(); + + if (isset($validated_forms[$form_id]) && empty($form_state['must_validate'])) { + return; + } + + // If the session token was set by drupal_prepare_form(), ensure that it + // matches the current user's session. + if (isset($form['#token'])) { + if (!drupal_valid_token($form_state['values']['form_token'], $form['#token'])) { + // Setting this error will cause the form to fail validation. + form_set_error('form_token', t('Validation error, please try again. If this error persists, please contact the site administrator.')); + } + } + + _form_validate($form, $form_state, $form_id); + $validated_forms[$form_id] = TRUE; +} + +/** + * Process callback to add dependency to form items. + * + * Usage: + * + * On any form item, add + * - @code '#process' => 'views_process_dependency' @endcode + * - @code '#dependency' => array('id-of-form-without-the-#' => array(list, of, values, that, make, this, gadget, visible)); @endcode + */ +function views_process_dependency($element, $edit, &$form_state, &$form) { + if (isset($element['#dependency'])) { + if (!isset($element['#dependency_count'])) { + $element['#dependency_count'] = 1; + } + if (!empty($form_state['ajax'])) { + $form_state['js settings']['viewsAjax']['formRelationships'][$element['#id']] = array('num' => $element['#dependency_count'], 'values' => $element['#dependency']); + } + else { + views_add_js('dependent'); + $options['viewsAjax']['formRelationships'][$element['#id']] = array('num' => $element['#dependency_count'], 'values' => $element['#dependency']); + drupal_add_js($options, 'setting'); + } + } + + return $element; +} + +/** + * #process callback to see if we need to check_plain() the options. + * + * Since FAPI is inconsistent, the #options are sanitized for you in all cases + * _except_ checkboxes. We have form elements that are sometimes 'select' and + * sometimes 'checkboxes', so we need decide late in the form rendering cycle + * if the options need to be sanitized before they're rendered. This callback + * inspects the type, and if it's still 'checkboxes', does the sanitation. + */ +function views_process_check_options($element, $edit, &$form_state, &$form) { + if ($element['#type'] == 'checkboxes' || $element['#type'] == 'checkbox') { + $element['#options'] = array_map('check_plain', $element['#options']); + } + return $element; +} + diff --git a/includes/handlers.inc b/includes/handlers.inc new file mode 100644 index 0000000000000000000000000000000000000000..3d9b2a2401ef53c2190b901a8c679f8f2f1aa006 --- /dev/null +++ b/includes/handlers.inc @@ -0,0 +1,1388 @@ +set_definition($definition); + // let the handler have something like a constructor. + $handler->construct(); + + return $handler; +} + +/** + * Attempt to find the include file for a given handler from its definition. + * + * This will also attempt to include all parents, though we're maxing the + * parent chain to 10 to prevent infinite loops. + */ +function views_include_handler($definition, $type, $count = 0) { + // Do not proceed if the class already exists. + if (isset($definition['handler']) && class_exists($definition['handler'])) { + return TRUE; + } + + // simple infinite loop prevention. + if ($count > 10) { + vpr(t('Handler @handler include tried to loop infinitely!', array('@handler' => $definition['handler']))); + return FALSE; + } + + if (!isset($definition['path'])) { + if ($type == 'handler') { + $definition += views_fetch_handler_data($definition['handler']); + } + else { + $definition += views_fetch_plugin_data($type, $definition['handler']); + } + } + + if (!empty($definition['parent'])) { + if ($type == 'handler') { + $parent = views_fetch_handler_data($definition['parent']); + } + else { + $parent = views_fetch_plugin_data($type, $definition['parent']); + } + + if ($parent) { + $rc = views_include_handler($parent, $type, $count + 1); + // If the parent chain cannot be included, don't try; this will + // help alleviate problems with modules with cross dependencies. + if (!$rc) { + return FALSE; + } + } + } + + if (isset($definition['path']) && $definition['file']) { + $filename = './' . $definition['path'] . '/' . $definition['file']; + if (file_exists($filename)) { + require_once $filename; + } + } + + return class_exists($definition['handler']); +} + +/** + * Prepare a handler's data by checking defaults and such. + */ +function _views_prepare_handler($definition, $data, $field) { + foreach (array('group', 'title', 'title short', 'help', 'real field') as $key) { + if (!isset($definition[$key])) { + // First check the field level + if (!empty($data[$field][$key])) { + $definition[$key] = $data[$field][$key]; + } + // Then if that doesn't work, check the table level + else if (!empty($data['table'][$key])) { + $definition[$key] = $data['table'][$key]; + } + } + } + + return _views_create_handler($definition); +} + +/** + * Fetch the handler data from cache. + */ +function views_fetch_handler_data($handler = NULL) { + static $cache = NULL; + if (!isset($cache)) { + $start = views_microtime(); + + $cache = views_discover_handlers(); + + vpr('Views handlers build time: ' . (views_microtime() - $start) * 1000 . ' ms'); + } + + if (!$handler) { + return $cache; + } + else if (isset($cache[$handler])) { + return $cache[$handler]; + } + + // Return an empty array if there is no match. + return array(); +} + +/** + * Builds and return a list of all handlers available in the system. + * + * @return Nested array of handlers + */ +function views_discover_handlers() { + $cache = array(); + // Get handlers from all modules. + foreach (module_implements('views_handlers') as $module) { + $function = $module . '_views_handlers'; + $result = $function(); + if (!is_array($result)) { + continue; + } + + $module_dir = isset($result['info']['module']) ? $result['info']['module'] : $module; + $path = isset($result['info']['path']) ? $result['info']['path'] : drupal_get_path('module', $module_dir); + + foreach ($result['handlers'] as $handler => $def) { + if (!isset($def['module'])) { + $def['module'] = $module_dir; + } + if (!isset($def['path'])) { + $def['path'] = $path; + } + if (!isset($def['file'])) { + $def['file'] = "$handler.inc"; + } + if (!isset($def['handler'])) { + $def['handler'] = $handler; + } + // merge the new data in + $cache[$handler] = $def; + } + } + return $cache; +} + +/** + * Fetch a handler to join one table to a primary table from the data cache + */ +function views_get_table_join($table, $base_table) { + $data = views_fetch_data($table); + if (isset($data['table']['join'][$base_table])) { + $h = $data['table']['join'][$base_table]; + if (!empty($h['handler']) && class_exists($h['handler'])) { + $handler = new $h['handler']; + } + else { + $handler = new views_join(); + } + + // Fill in some easy defaults + $handler->definition = $h; + if (empty($handler->definition['table'])) { + $handler->definition['table'] = $table; + } + // If this is empty, it's a direct link. + if (empty($handler->definition['left_table'])) { + $handler->definition['left_table'] = $base_table; + } + + if (isset($h['arguments'])) { + call_user_func_array(array(&$handler, 'construct'), $h['arguments']); + } + else { + $handler->construct(); + } + + return $handler; + } + // DEBUG -- identify missing handlers + vpr("Missing join: $table $base_table"); +} + +/** + * Base handler, from which all the other handlers are derived. + * It creates a common interface to create consistency amongst + * handlers and data. + * + * This class would be abstract in PHP5, but PHP4 doesn't understand that. + * + * Definition terms: + * - table: The actual table this uses; only specify if different from + * the table this is attached to. + * - real field: The actual field this uses; only specify if different from + * the field this item is attached to. + * - group: A text string representing the 'group' this item is attached to, + * for display in the UI. Examples: "Node", "Taxonomy", "Comment", + * "User", etc. This may be inherited from the parent definition or + * the 'table' definition. + * - title: The title for this handler in the UI. This may be inherited from + * the parent definition or the 'table' definition. + * - help: A more informative string to give to the user to explain what this + * field/handler is or does. + * - access callback: If this field should have access control, this could + * be a function to use. 'user_access' is a common + * function to use here. If not specified, no access + * control is provided. + * - access arguments: An array of arguments for the access callback. + */ +class views_handler extends views_object { + /** + * init the handler with necessary data. + * @param $view + * The $view object this handler is attached to. + * @param $options + * The item from the database; the actual contents of this will vary + * based upon the type of handler. + */ + function init(&$view, $options) { + $this->view = &$view; + $this->unpack_options($this->options, $options); + + // This exist on most handlers, but not all. So they are still optional. + if (isset($options['table'])) { + $this->table = $options['table']; + } + + if (isset($this->definition['real field'])) { + $this->real_field = $this->definition['real field']; + } + + if (isset($this->definition['field'])) { + $this->real_field = $this->definition['field']; + } + + if (isset($options['field'])) { + $this->field = $options['field']; + if (!isset($this->real_field)) { + $this->real_field = $options['field']; + } + } + + $this->query = &$view->query; + } + + /** + * Return a string representing this handler's name in the UI. + */ + function ui_name($short = FALSE) { + $title = ($short && isset($this->definition['title short'])) ? $this->definition['title short'] : $this->definition['title']; + return t('!group: !title', array('!group' => $this->definition['group'], '!title' => $title)); + } + + /** + * Provide a form for setting options. + */ + function options_form(&$form, &$form_state) { } + + /** + * Validate the options form. + */ + function options_validate($form, &$form_state) { } + + /** + * Perform any necessary changes to the form values prior to storage. + * There is no need for this function to actually store the data. + */ + function options_submit($form, &$form_state) { } + + /** + * If a handler has 'extra options' it will get a little settings widget and + * another form called extra_options. + */ + function has_extra_options() { return FALSE; } + + /** + * Provide defaults for the handler. + */ + function extra_options(&$option) { } + + /** + * Provide a form for setting options. + */ + function extra_options_form(&$form, &$form_state) { } + + /** + * Validate the options form. + */ + function extra_options_validate($form, &$form_state) { } + + /** + * Perform any necessary changes to the form values prior to storage. + * There is no need for this function to actually store the data. + */ + function extra_options_submit($form, &$form_state) { } + + /** + * Set new exposed option defaults when exposed setting is flipped + * on. + */ + function expose_options() { } + /** + * Render our chunk of the exposed filter form when selecting + */ + function exposed_form(&$form, &$form_state) { } + + /** + * Validate the exposed filter form + */ + function exposed_validate(&$form, &$form_state) { } + + /** + * Submit the exposed filter form + */ + function exposed_submit(&$form, &$form_state) { } + + /** + * Get information about the exposed form for the form renderer. + * + * @return + * An array with the following keys: + * - operator: The $form key of the operator. Set to NULL if no operator. + * - value: The $form key of the value. Set to NULL if no value. + * - label: The label to use for this piece. + */ + function exposed_info() { } + + /** + * Check whether current user has access to this handler. + * + * @return boolean + */ + function access() { + if (isset($this->definition['access callback']) && function_exists($this->definition['access callback'])) { + if (isset($this->definition['access arguments']) && is_array($this->definition['access arguments'])) { + return call_user_func_array($this->definition['access callback'], $this->definition['access arguments']); + } + return $this->definition['access callback'](); + } + + return TRUE; + } + + /** + * Run before the view is built. + * + * This gives all the handlers some time to set up before any handler has + * been fully run. + */ + function pre_query() { } + + /** + * Called just prior to query(), this lets a handler set up any relationship + * it needs. + */ + function set_relationship() { + // Ensure this gets set to something. + $this->relationship = NULL; + + // Don't process non-existant relationships. + if (empty($this->options['relationship']) || $this->options['relationship'] == 'none') { + return; + } + + $relationship = $this->options['relationship']; + + // Ignore missing/broken relationships. + if (empty($this->view->relationship[$relationship])) { + return; + } + + // Check to see if the relationship has already processed. If not, then we + // cannot process it. + if (empty($this->view->relationship[$relationship]->alias)) { + return; + } + + // Finally! + $this->relationship = $this->view->relationship[$relationship]->alias; + } + + /** + * Add this handler into the query. + * + * If we were using PHP5, this would be abstract. + */ + function query() { } + + /** + * Ensure the main table for this handler is in the query. This is used + * a lot. + */ + function ensure_my_table() { + if (!isset($this->table_alias)) { + if (!method_exists($this->query, 'ensure_table')) { vpr_trace(); exit; } + $this->table_alias = $this->query->ensure_table($this->table, $this->relationship); + } + return $this->table_alias; + } + + /** + * Provide text for the administrative summary + */ + function admin_summary() { } + + /** + * Determine if the argument needs a style plugin. + * + * @return TRUE/FALSE + */ + function needs_style_plugin() { return FALSE; } + + /** + * Determine if this item is 'exposed', meaning it provides form elements + * to let users modify the view. + * + * @return TRUE/FALSE + */ + function is_exposed() { + return !empty($this->options['exposed']); + } + + /** + * Take input from exposed filters and assign to this handler, if necessary. + */ + function accept_exposed_input($input) { return TRUE; } + + /** + * If set to remember exposed input in the session, store it there. + */ + function store_exposed_input($input, $status) { return TRUE; } + + /** + * Get the join object that should be used for this handler. + * + * This method isn't used a great deal, but it's very handy for easily + * getting the join if it is necessary to make some changes to it, such + * as adding an 'extra'. + */ + function get_join() { + // get the join from this table that links back to the base table. + // Determine the primary table to seek + if (empty($this->query->relationships[$this->relationship])) { + $base_table = $this->query->base_table; + } + else { + $base_table = $this->query->relationships[$this->relationship]['base']; + } + + $join = views_get_table_join($this->table, $base_table); + if ($join) { + return drupal_clone($join); + } + } + + /** + * Validates the handler against the complete View. + * + * This is called when the complete View is being validated. For validating + * the handler options form use options_validate(). + * + * @see views_handler::options_validate() + * + * @return + * Empty array if the handler is valid; an array of error strings if it is not. + */ + function validate() { return array(); } + + /** + * Determine if the handler is considered 'broken', meaning it's a + * a placeholder used when a handler can't be found. + */ + function broken() { } +} + +/** + * This many to one helper object is used on both arguments and filters. + * + * @todo This requires extensive documentation on how this class is to + * be used. For now, look at the arguments and filters that use it. Lots + * of stuff is just pass-through but there are definitely some interesting + * areas where they interact. + * + * Any handler that uses this can have the following possibly additional + * definition terms: + * - numeric: If true, treat this field as numeric, using %d instead of %s in + * queries. + * + */ +class views_many_to_one_helper { + function views_many_to_one_helper(&$handler) { + $this->handler = &$handler; + } + + function option_definition(&$options) { + $options['reduce_duplicates'] = array('default' => FALSE); + } + + function options_form(&$form, &$form_state) { + $form['reduce_duplicates'] = array( + '#type' => 'checkbox', + '#title' => t('Reduce duplicates'), + '#description' => t('This filter can cause items that have more than one of the selected options to appear as duplicate results. If this filter causes duplicate results to occur, this checkbox can reduce those duplicates; however, the more terms it has to search for, the less performant the query will be, so use this with caution. Shouldn\'t be set on single-value fields, as it may cause values to disappear from display, if used on an incompatible field.'), + '#default_value' => !empty($this->handler->options['reduce_duplicates']), + ); + } + + /** + * Sometimes the handler might want us to use some kind of formula, so give + * it that option. If it wants us to do this, it must set $helper->formula = TRUE + * and implement handler->get_formula(); + */ + function get_field() { + if (!empty($this->formula)) { + return $this->handler->get_formula(); + } + else { + return $this->handler->table_alias . '.' . $this->handler->real_field; + } + } + + /** + * Add a table to the query. + * + * This is an advanced concept; not only does it add a new instance of the table, + * but it follows the relationship path all the way down to the relationship + * link point and adds *that* as a new relationship and then adds the table to + * the relationship, if necessary. + */ + function add_table($join = NULL, $alias = NULL) { + // This is used for lookups in the many_to_one table. + $field = $this->handler->table . '.' . $this->handler->field; + + if (empty($join)) { + $join = $this->get_join(); + } + + // See if there's a chain between us and the base relationship. If so, we need + // to create a new relationship to use. + $relationship = $this->handler->relationship; + + // Determine the primary table to seek + if (empty($this->handler->query->relationships[$relationship])) { + $base_table = $this->handler->query->base_table; + } + else { + $base_table = $this->handler->query->relationships[$relationship]['base']; + } + + // Cycle through the joins. This isn't as error-safe as the normal + // ensure_path logic. Perhaps it should be. + $r_join = drupal_clone($join); + while ($r_join->left_table != $base_table) { + $r_join = views_get_table_join($r_join->left_table, $base_table); + } + // If we found that there are tables in between, add the relationship. + if ($r_join->table != $join->table) { + $relationship = $this->handler->query->add_relationship($this->handler->table . '_' . $r_join->table, $r_join, $r_join->table, $this->handler->relationship); + } + + // And now add our table, using the new relationship if one was used. + $alias = $this->handler->query->add_table($this->handler->table, $relationship, $join, $alias); + + // Store what values are used by this table chain so that other chains can + // automatically discard those values. + if (empty($this->handler->view->many_to_one_tables[$field])) { + $this->handler->view->many_to_one_tables[$field] = $this->handler->value; + } + else { + $this->handler->view->many_to_one_tables[$field] = array_merge($this->handler->view->many_to_one_tables[$field], $this->handler->value); + } + + return $alias; + } + + function get_join() { + return $this->handler->get_join(); + } + + /** + * Provide the proper join for summary queries. This is important in part because + * it will cooperate with other arguments if possible. + */ + function summary_join() { + $field = $this->handler->table . '.' . $this->handler->field; + $join = $this->get_join(); + + // shortcuts + $options = $this->handler->options; + $view = &$this->handler->view; + $query = &$this->handler->query; + + if (!empty($options['require_value'])) { + $join->type = 'INNER'; + } + + if (empty($options['add_table']) || empty($view->many_to_one_tables[$field])) { + return $query->ensure_table($this->handler->table, $this->handler->relationship, $join); + } + else { + if (!empty($view->many_to_one_tables[$field])) { + foreach ($view->many_to_one_tables[$field] as $value) { + $join->extra = array( + array( + 'field' => $this->handler->real_field, + 'operator' => '!=', + 'value' => $value, + 'numeric' => !empty($this->definition['numeric']), + ), + ); + } + } + return $this->add_table($join); + } + } + + /** + * Override ensure_my_table so we can control how this joins in. + * The operator actually has influence over joining. + */ + function ensure_my_table() { + if (!isset($this->handler->table_alias)) { + // For 'or' if we're not reducing duplicates, we get the absolute simplest: + $field = $this->handler->table . '.' . $this->handler->field; + if ($this->handler->operator == 'or' && empty($this->handler->options['reduce_duplicates'])) { + if (empty($this->handler->options['add_table']) && empty($this->handler->view->many_to_one_tables[$field])) { + // query optimization, INNER joins are slightly faster, so use them + // when we know we can. + $join = $this->get_join(); + $join->type = 'INNER'; + $this->handler->table_alias = $this->handler->query->ensure_table($this->handler->table, $this->handler->relationship, $join); + $this->handler->view->many_to_one_tables[$field] = $this->handler->value; + } + else { + $join = $this->get_join(); + $join->type = 'LEFT'; + if (!empty($this->handler->view->many_to_one_tables[$field])) { + foreach ($this->handler->view->many_to_one_tables[$field] as $value) { + $join->extra = array( + array( + 'field' => $this->handler->real_field, + 'operator' => '!=', + 'value' => $value, + 'numeric' => !empty($this->handler->definition['numeric']), + ), + ); + } + } + + $this->handler->table_alias = $this->add_table($join); + } + + return $this->handler->table_alias; + } + + if ($this->handler->operator != 'not') { + // If it's an and or an or, we do one join per selected value. + // Clone the join for each table: + $this->handler->table_aliases = array(); + foreach ($this->handler->value as $value) { + $join = $this->get_join(); + if ($this->handler->operator == 'and') { + $join->type = 'INNER'; + } + $join->extra = array( + array( + 'field' => $this->handler->real_field, + 'value' => $value, + 'numeric' => !empty($this->handler->definition['numeric']), + ), + ); + + // The table alias needs to be unique to this value across the + // multiple times the filter or argument is called by the view. + if (!isset($this->handler->view->many_to_one_aliases[$field][$value])) { + if (!isset($this->handler->view->many_to_one_count[$this->handler->table])) { + $this->handler->view->many_to_one_count[$this->handler->table] = 0; + } + $this->handler->view->many_to_one_aliases[$field][$value] = $this->handler->table . '_value_' . ($this->handler->view->many_to_one_count[$this->handler->table]++); + } + $alias = $this->handler->table_aliases[$value] = $this->add_table($join, $this->handler->view->many_to_one_aliases[$field][$value]); + + // and set table_alias to the first of these. + if (empty($this->handler->table_alias)) { + $this->handler->table_alias = $alias; + } + } + } + else { + // For not, we just do one join. We'll add a where clause during + // the query phase to ensure that $table.$field IS NULL. + $join = $this->get_join(); + $join->type = 'LEFT'; + $join->extra = array(); + $join->extra_type = 'OR'; + foreach ($this->handler->value as $value) { + $join->extra[] = array( + 'field' => $this->handler->real_field, + 'value' => $value, + 'numeric' => !empty($this->handler->definition['numeric']), + ); + } + + $this->handler->table_alias = $this->add_table($join); + } + } + return $this->handler->table_alias; + } + + function add_filter() { + if (empty($this->handler->value)) { + return; + } + $this->handler->ensure_my_table(); + + // Shorten some variables: + $field = $this->get_field(); + $options = $this->handler->options; + $operator = $this->handler->operator; + if (empty($options['group'])) { + $options['group'] = 0; + } + + $placeholder = !empty($this->handler->definition['numeric']) ? '%d' : "'%s'"; + + if ($operator == 'not') { + $this->handler->query->add_where($options['group'], "$field IS NULL"); + } + else if ($operator == 'or' && empty($options['reduce_duplicates'])) { + if (count($this->handler->value) > 1) { + $replace = array_fill(0, sizeof($this->handler->value), $placeholder); + $in = '(' . implode(", ", $replace) . ')'; + $this->handler->query->add_where($options['group'], "$field IN $in", $this->handler->value); + } + else { + $this->handler->query->add_where($options['group'], "$field = $placeholder", $this->handler->value); + } + } + else { + $field = $this->handler->real_field; + $clauses = array(); + foreach ($this->handler->table_aliases as $value => $alias) { + $clauses[] = "$alias.$field = $placeholder"; + } + + $group = empty($options['group']) ? 0 : $options['group']; + + // implode on either AND or OR. + $this->handler->query->add_where($group, implode(' ' . strtoupper($operator) . ' ', $clauses), $this->handler->value); + } + } +} + +/* + * Break x,y,z and x+y+z into an array. Numeric only. + * + * @param $str + * The string to parse. + * @param $filter + * The filter object to use as a base. If not specified one will + * be created. + * + * @return $filter + * The new filter object. + */ +function views_break_phrase($str, $filter = NULL) { + if (!$filter) { + $filter = new stdClass(); + } + + // Set up defaults: + + if (!isset($filter->value)) { + $filter->value = array(); + } + + if (!isset($filter->operator)) { + $filter->operator = 'or'; + } + + if (empty($str)) { + return $filter; + } + + if (preg_match('/^([0-9]+[+ ])+[0-9]+$/', $str)) { + // The '+' character in a query string may be parsed as ' '. + $filter->operator = 'or'; + $filter->value = preg_split('/[+ ]/', $str); + } + else if (preg_match('/^([0-9]+,)*[0-9]+$/', $str)) { + $filter->operator = 'and'; + $filter->value = explode(',', $str); + } + + // Keep an 'error' value if invalid strings were given. + if (!empty($str) && (empty($filter->value) || !is_array($filter->value))) { + $filter->value = array(-1); + return $filter; + } + + // Doubly ensure that all values are numeric only. + foreach ($filter->value as $id => $value) { + $filter->value[$id] = intval($value); + } + + return $filter; +} + +// -------------------------------------------------------------------------- +// Date helper functions + +/** + * Figure out what timezone we're in; needed for some date manipulations. + */ +function views_get_timezone() { + global $user; + if (variable_get('configurable_timezones', 1) && $user->uid && strlen($user->timezone)) { + $timezone = $user->timezone; + } + else { + $timezone = variable_get('date_default_timezone', 0); + } + + // set up the database timezone + if (in_array($GLOBALS['db_type'], array('mysql', 'mysqli', 'pgsql'))) { + $offset = '+00:00'; + static $already_set = false; + if (!$already_set) { + if ($GLOBALS['db_type'] == 'pgsql') { + db_query("SET TIME ZONE INTERVAL '$offset' HOUR TO MINUTE"); + } + elseif ($GLOBALS['db_type'] == 'mysqli' || version_compare(mysql_get_server_info(), '4.1.3', '>=')) { + db_query("SET @@session.time_zone = '$offset'"); + } + + $already_set = true; + } + } + + return $timezone; +} + +/** + * Helper function to create cross-database SQL dates. + * + * @param $field + * The real table and field name, like 'tablename.fieldname'. + * @param $field_type + * The type of date field, 'int' or 'datetime'. + * @param $set_offset + * The name of a field that holds the timezone offset or a fixed timezone + * offset value. If not provided, the normal Drupal timezone handling + * will be used, i.e. $set_offset = 0 will make no timezone adjustment. + * @return + * An appropriate SQL string for the db type and field type. + */ +function views_date_sql_field($field, $field_type = 'int', $set_offset = NULL) { + $db_type = $GLOBALS['db_type']; + $offset = $set_offset !== NULL ? $set_offset : views_get_timezone(); + switch ($db_type) { + case 'mysql': + case 'mysqli': + switch ($field_type) { + case 'int': + $field = "FROM_UNIXTIME($field)"; + break; + case 'datetime': + break; + } + if (!empty($offset)) { + $field = "($field + INTERVAL $offset SECOND)"; + } + return $field; + case 'pgsql': + switch ($field_type) { + case 'int': + $field = "$field::ABSTIME"; + break; + case 'datetime': + break; + } + if (!empty($offset)) { + $field = "($field + INTERVAL '$offset SECONDS')"; + } + return $field; + } +} + +/** + * Helper function to create cross-database SQL date formatting. + * + * @param $format + * A format string for the result, like 'Y-m-d H:i:s'. + * @param $field + * The real table and field name, like 'tablename.fieldname'. + * @param $field_type + * The type of date field, 'int' or 'datetime'. + * @param $set_offset + * The name of a field that holds the timezone offset or a fixed timezone + * offset value. If not provided, the normal Drupal timezone handling + * will be used, i.e. $set_offset = 0 will make no timezone adjustment. + * @return + * An appropriate SQL string for the db type and field type. + */ +function views_date_sql_format($format, $field, $field_type = 'int', $set_offset = NULL) { + $db_type = $GLOBALS['db_type']; + $field = views_date_sql_field($field, $field_type, $set_offset); + switch ($db_type) { + case 'mysql': + case 'mysqli': + $replace = array( + 'Y' => '%Y', + 'm' => '%m', + 'd' => '%%d', + 'H' => '%H', + 'i' => '%i', + 's' => '%s', + ); + $format = strtr($format, $replace); + return "DATE_FORMAT($field, '$format')"; + case 'pgsql': + $replace = array( + 'Y' => 'YYYY', + 'm' => 'MM', + 'd' => 'DD', + 'H' => 'HH24', + 'i' => 'MI', + 's' => 'SS', + ); + $format = strtr($format, $replace); + return "TO_CHAR($field, '$format')"; + } +} + +/** + * Helper function to create cross-database SQL date extraction. + * + * @param $extract_type + * The type of value to extract from the date, like 'MONTH'. + * @param $field + * The real table and field name, like 'tablename.fieldname'. + * @param $field_type + * The type of date field, 'int' or 'datetime'. + * @param $set_offset + * The name of a field that holds the timezone offset or a fixed timezone + * offset value. If not provided, the normal Drupal timezone handling + * will be used, i.e. $set_offset = 0 will make no timezone adjustment. + * @return + * An appropriate SQL string for the db type and field type. + */ +function views_date_sql_extract($extract_type, $field, $field_type = 'int', $set_offset = NULL) { + $db_type = $GLOBALS['db_type']; + $field = views_date_sql_field($field, $field_type, $set_offset); + + // Note there is no space after FROM to avoid db_rewrite problems + // see http://drupal.org/node/79904. + switch ($extract_type) { + case('DATE'): + return $field; + case('YEAR'): + return "EXTRACT(YEAR FROM($field))"; + case('MONTH'): + return "EXTRACT(MONTH FROM($field))"; + case('DAY'): + return "EXTRACT(DAY FROM($field))"; + case('HOUR'): + return "EXTRACT(HOUR FROM($field))"; + case('MINUTE'): + return "EXTRACT(MINUTE FROM($field))"; + case('SECOND'): + return "EXTRACT(SECOND FROM($field))"; + case('WEEK'): // ISO week number for date + switch ($db_type) { + case('mysql'): + case('mysqli'): + // WEEK using arg 3 in mysql should return the same value as postgres EXTRACT + return "WEEK($field, 3)"; + case('pgsql'): + return "EXTRACT(WEEK FROM($field))"; + } + case('DOW'): + switch ($db_type) { + case('mysql'): + case('mysqli'): + // mysql returns 1 for Sunday through 7 for Saturday + // php date functions and postgres use 0 for Sunday and 6 for Saturday + return "INTEGER(DAYOFWEEK($field) - 1)"; + case('pgsql'): + return "EXTRACT(DOW FROM($field))"; + } + case('DOY'): + switch ($db_type) { + case('mysql'): + case('mysqli'): + return "DAYOFYEAR($field)"; + case('pgsql'): + return "EXTRACT(DOY FROM($field))"; + } + } +} + +/** + * Implementation of hook_views_handlers() to register all of the basic handlers + * views uses. + */ +function views_views_handlers() { + return array( + 'info' => array( + 'path' => drupal_get_path('module', 'views') . '/handlers', + ), + 'handlers' => array( + // argument handlers + 'views_handler_argument' => array( + 'parent' => 'views_handler', + ), + 'views_handler_argument_numeric' => array( + 'parent' => 'views_handler_argument', + ), + 'views_handler_argument_formula' => array( + 'parent' => 'views_handler_argument', + ), + 'views_handler_argument_date' => array( + 'parent' => 'views_handler_argument_formula', + ), + 'views_handler_argument_string' => array( + 'parent' => 'views_handler_argument', + ), + 'views_handler_argument_many_to_one' => array( + 'parent' => 'views_handler_argument', + ), + 'views_handler_argument_null' => array( + 'parent' => 'views_handler_argument', + ), + + // field handlers + 'views_handler_field' => array( + 'parent' => 'views_handler', + ), + 'views_handler_field_date' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_boolean' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_markup' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_xss' => array( + 'parent' => 'views_handler_field', + 'file' => 'views_handler_field.inc', + ), + 'views_handler_field_url' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_file_size' => array( + 'parent' => 'views_handler_field', + 'file' => 'views_handler_field.inc', + ), + 'views_handler_field_prerender_list' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_numeric' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_custom' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_counter' => array( + 'parent' => 'views_handler_field', + ), + + // filter handlers + 'views_handler_filter' => array( + 'parent' => 'views_handler', + ), + 'views_handler_filter_equality' => array( + 'parent' => 'views_handler_filter', + ), + 'views_handler_filter_string' => array( + 'parent' => 'views_handler_filter', + ), + 'views_handler_filter_boolean_operator' => array( + 'parent' => 'views_handler_filter', + ), + 'views_handler_filter_boolean_operator_string' => array( + 'parent' => 'views_handler_filter_boolean_operator', + ), + 'views_handler_filter_in_operator' => array( + 'parent' => 'views_handler_filter', + ), + 'views_handler_filter_numeric' => array( + 'parent' => 'views_handler_filter', + ), + 'views_handler_filter_float' => array( + 'parent' => 'views_handler_filter_numeric', + ), + 'views_handler_filter_date' => array( + 'parent' => 'views_handler_filter_numeric', + ), + 'views_handler_filter_many_to_one' => array( + 'parent' => 'views_handler_filter_in_operator', + ), + + // relationship handlers + 'views_handler_relationship' => array( + 'parent' => 'views_handler', + ), + + + // sort handlers + 'views_handler_sort' => array( + 'parent' => 'views_handler', + ), + 'views_handler_sort_formula' => array( + 'parent' => 'views_handler_sort', + ), + 'views_handler_sort_date' => array( + 'parent' => 'views_handler_sort', + ), + 'views_handler_sort_menu_hierarchy' => array( + 'parent' => 'views_handler_sort', + ), + 'views_handler_sort_random' => array( + 'parent' => 'views_handler_sort', + ), + ), + ); +} + + +/** + * @} + */ + +/** + * @defgroup views_join_handlers Views' join handlers + * @{ + * Handlers to tell Views how to join tables together. + + * Here is how you do complex joins: + * + * @code + * class views_join_complex extends views_join { + * // PHP 4 doesn't call constructors of the base class automatically from a + * // constructor of a derived class. It is your responsibility to propagate + * // the call to constructors upstream where appropriate. + * function construct($table, $left_table, $left_field, $field, $extra = array(), $type = 'LEFT') { + * parent::construct($table, $left_table, $left_field, $field, $extra, $type); + * } + * + * function join($table, &$query) { + * $output = parent::join($table, $query); + * } + * $output .= "AND foo.bar = baz.boing"; + * return $output; + * } + * @endcode + */ +/** + * A function class to represent a join and create the SQL necessary + * to implement the join. + * + * This is the Delegation pattern. If we had PHP5 exclusively, we would + * declare this an interface. + * + * Extensions of this class can be used to create more interesting joins. + * + * join definition + * - table: table to join (right table) + * - field: field to join on (right field) + * - left_table: The table we join to + * - left_field: The field we join to + * - type: either LEFT (default) or INNER + * - extra: Either a string that's directly added, or an array of items: + * - - table: if not set, current table; if NULL, no table. This field can't + * be set in the cached definition because it can't know aliases; this field + * can only be used by realtime joins. + * - - field: Field or formula + * - - operator: defaults to = + * - - value: Must be set. If an array, operator will be defaulted to IN. + * - - numeric: If true, the value will not be surrounded in quotes. + * - extra type: How all the extras will be combined. Either AND or OR. Defaults to AND. + */ +class views_join { + /** + * Construct the views_join object. + */ + function construct($table = NULL, $left_table = NULL, $left_field = NULL, $field = NULL, $extra = array(), $type = 'LEFT') { + $this->extra_type = 'AND'; + if (!empty($table)) { + $this->table = $table; + $this->left_table = $left_table; + $this->left_field = $left_field; + $this->field = $field; + $this->extra = $extra; + $this->type = strtoupper($type); + } + else if (!empty($this->definition)) { + // if no arguments, construct from definition. + // These four must exist or it will throw notices. + $this->table = $this->definition['table']; + $this->left_table = $this->definition['left_table']; + $this->left_field = $this->definition['left_field']; + $this->field = $this->definition['field']; + if (!empty($this->definition['extra'])) { + $this->extra = $this->definition['extra']; + } + if (!empty($this->definition['extra type'])) { + $this->extra_type = strtoupper($this->definition['extra type']); + } + + $this->type = !empty($this->definition['type']) ? strtoupper($this->definition['type']) : 'LEFT'; + } + } + + /** + * Build the SQL for the join this object represents. + */ + function join($table, &$query) { + if (empty($this->definition['table formula'])) { + $right_table = "{" . $this->table . "}"; + } + else { + $right_table = $this->definition['table formula']; + } + + if ($this->left_table) { + $left = $query->get_table_info($this->left_table); + $left_field = "$left[alias].$this->left_field"; + } + else { + // This can be used if left_field is a formula or something. It should be used only *very* rarely. + $left_field = $this->left_field; + } + + $output = " $this->type JOIN $right_table $table[alias] ON $left_field = $table[alias].$this->field"; + // Tack on the extra. + if (isset($this->extra)) { + if (is_array($this->extra)) { + $extras = array(); + foreach ($this->extra as $info) { + $extra = ''; + // Figure out the table name. Remember, only use aliases provided + // if at all possible. + $join_table = ''; + if (!array_key_exists('table', $info)) { + $join_table = $table['alias'] . '.'; + } + elseif (isset($info['table'])) { + $join_table = $info['table'] . '.'; + } + + // And now deal with the value and the operator. Set $q to + // a single-quote for non-numeric values and the + // empty-string for numeric values, then wrap all values in $q. + $raw_value = $this->db_safe($info['value']); + $q = (empty($info['numeric']) ? "'" : ''); + + if (is_array($raw_value)) { + $operator = !empty($info['operator']) ? $info['operator'] : 'IN'; + // Transform from IN() notation to = notation if just one value. + if (count($raw_value) == 1) { + $value = $q . array_shift($raw_value) . $q; + $operator = $operator == 'NOT IN' ? '!=' : '='; + } + else { + $value = "($q" . implode("$q, $q", $raw_value) . "$q)"; + } + } + else { + $operator = !empty($info['operator']) ? $info['operator'] : '='; + $value = "$q$raw_value$q"; + } + $extras[] = "$join_table$info[field] $operator $value"; + } + + if ($extras) { + if (count($extras) == 1) { + $output .= ' AND ' . array_shift($extras); + } + else { + $output .= ' AND (' . implode(' ' . $this->extra_type . ' ', $extras) . ')'; + } + } + } + else if ($this->extra && is_string($this->extra)) { + $output .= " AND ($this->extra)"; + } + } + return $output; + } + + /** + * Ensure that input is db safe. We only check strings and ints tho + * so something that needs floats in their joins needs to do their + * own type checking. + */ + function db_safe($input) { + if (is_array($input)) { + $output = array(); + foreach ($input as $value) { + if (empty($info['numeric'])) { + $output[] = db_escape_string($value); + } + else { + $output[] = intval($value); + } + } + } + else if (empty($info['numeric'])) { + $output = db_escape_string($input); + } + else { + $output = intval($input); + } + + return $output; + } +} + +/** + * @} + */ + +// Declare API compatibility on behalf of core modules: + +/** + * Implementation of hook_views_api(). + * + * This one is used as the base to reduce errors when updating. + */ +function views_views_api() { + return array( + 'api' => 2, + 'path' => drupal_get_path('module', 'views') . '/modules', + ); +} + +function aggregator_views_api() { return views_views_api(); } + +function book_views_api() { return views_views_api(); } + +function comment_views_api() { return views_views_api(); } + +function locale_views_api() { return views_views_api(); } + +function filter_views_api() { return views_views_api(); } + +function node_views_api() { return views_views_api(); } + +function poll_views_api() { return views_views_api(); } + +function profile_views_api() { return views_views_api(); } + +function search_views_api() { return views_views_api(); } + +function statistics_views_api() { return views_views_api(); } + +function system_views_api() { return views_views_api(); } + +function taxonomy_views_api() { return views_views_api(); } + +function translation_views_api() { return views_views_api(); } + +function upload_views_api() { return views_views_api(); } + +function user_views_api() { return views_views_api(); } + +function contact_views_api() { return views_views_api(); } diff --git a/includes/plugins.inc b/includes/plugins.inc new file mode 100644 index 0000000000000000000000000000000000000000..d97f8d09d177e2a46a69de0ad93d62a3d68f3aa6 --- /dev/null +++ b/includes/plugins.inc @@ -0,0 +1,379 @@ + 'views', // This just tells our themes are elsewhere. + 'display' => array( + 'parent' => array( + // this isn't really a display but is necessary so the file can + // be included. + 'no ui' => TRUE, + 'handler' => 'views_plugin_display', + 'parent' => '', + ), + 'default' => array( + 'title' => t('Defaults'), + 'help' => t('Default settings for this view.'), + 'handler' => 'views_plugin_display_default', + 'theme' => 'views_view', + 'no ui' => TRUE, + 'no remove' => TRUE, + 'js' => array('misc/collapse.js', 'misc/textarea.js', 'misc/tabledrag.js', 'misc/autocomplete.js', "$path/dependent.js"), + 'use ajax' => TRUE, + 'use pager' => TRUE, + 'use more' => TRUE, + 'accept attachments' => TRUE, + 'help topic' => 'display-default', + ), + 'page' => array( + 'title' => t('Page'), + 'help' => t('Display the view as a page, with a URL and menu links.'), + 'handler' => 'views_plugin_display_page', + 'theme' => 'views_view', + 'uses hook menu' => TRUE, + 'use ajax' => TRUE, + 'use pager' => TRUE, + 'accept attachments' => TRUE, + 'admin' => t('Page'), + 'help topic' => 'display-page', + ), + 'block' => array( + 'title' => t('Block'), + 'help' => t('Display the view as a block.'), + 'handler' => 'views_plugin_display_block', + 'theme' => 'views_view', + 'uses hook block' => TRUE, + 'use ajax' => TRUE, + 'use pager' => TRUE, + 'use more' => TRUE, + 'accept attachments' => TRUE, + 'admin' => t('Block'), + 'help topic' => 'display-block', + ), + 'attachment' => array( + 'title' => t('Attachment'), + 'help' => t('Attachments added to other displays to achieve multiple views in the same view.'), + 'handler' => 'views_plugin_display_attachment', + 'theme' => 'views_view', + 'use ajax' => TRUE, + 'help topic' => 'display-attachment', + ), + 'feed' => array( + 'title' => t('Feed'), + 'help' => t('Display the view as a feed, such as an RSS feed.'), + 'handler' => 'views_plugin_display_feed', + 'parent' => 'page', // so it knows to load the page plugin .inc file + 'uses hook menu' => TRUE, + 'use ajax' => FALSE, + 'use pager' => FALSE, + 'accept attachments' => FALSE, + 'admin' => t('Feed'), + 'help topic' => 'display-feed', + ), + ), + 'style' => array( + 'parent' => array( + // this isn't really a display but is necessary so the file can + // be included. + 'no ui' => TRUE, + 'handler' => 'views_plugin_style', + 'parent' => '', + ), + 'default' => array( + 'title' => t('Unformatted'), + 'help' => t('Displays rows one after another.'), + 'handler' => 'views_plugin_style_default', + 'theme' => 'views_view_unformatted', + 'uses row plugin' => TRUE, + 'uses grouping' => TRUE, + 'uses options' => TRUE, + 'type' => 'normal', + 'help topic' => 'style-unformatted', + ), + 'list' => array( + 'title' => t('HTML List'), + 'help' => t('Displays rows as an HTML list.'), + 'handler' => 'views_plugin_style_list', + 'theme' => 'views_view_list', + 'uses row plugin' => TRUE, + 'uses options' => TRUE, + 'type' => 'normal', + 'help topic' => 'style-list', + ), + 'grid' => array( + 'title' => t('Grid'), + 'help' => t('Displays rows in a grid.'), + 'handler' => 'views_plugin_style_grid', + 'theme' => 'views_view_grid', + 'uses row plugin' => TRUE, + 'uses options' => TRUE, + 'type' => 'normal', + 'help topic' => 'style-grid', + ), + 'table' => array( + 'title' => t('Table'), + 'help' => t('Displays rows in a table.'), + 'handler' => 'views_plugin_style_table', + 'theme' => 'views_view_table', + 'uses row plugin' => FALSE, + 'uses fields' => TRUE, + 'uses options' => TRUE, + 'type' => 'normal', + 'help topic' => 'style-table', + ), + 'default_summary' => array( + 'title' => t('List'), + 'help' => t('Displays the default summary as a list.'), + 'handler' => 'views_plugin_style_summary', + 'theme' => 'views_view_summary', + 'type' => 'summary', // only shows up as a summary style + 'uses options' => TRUE, + 'help topic' => 'style-summary', + ), + 'unformatted_summary' => array( + 'title' => t('Unformatted'), + 'help' => t('Displays the summary unformatted, with option for one after another or inline.'), + 'handler' => 'views_plugin_style_summary_unformatted', + 'parent' => 'default_summary', + 'theme' => 'views_view_summary_unformatted', + 'type' => 'summary', // only shows up as a summary style + 'uses options' => TRUE, + 'help topic' => 'style-summary-unformatted', + ), + 'rss' => array( + 'title' => t('RSS Feed'), + 'help' => t('Generates an RSS feed from a view.'), + 'handler' => 'views_plugin_style_rss', + 'theme' => 'views_view_rss', + 'uses row plugin' => TRUE, + 'uses options' => TRUE, + 'type' => 'feed', + 'help topic' => 'style-rss', + ), + ), + 'row' => array( + 'parent' => array( + // this isn't really a display but is necessary so the file can + // be included. + 'no ui' => TRUE, + 'handler' => 'views_plugin_row', + 'parent' => '', + ), + 'fields' => array( + 'title' => t('Fields'), + 'help' => t('Displays the fields with an optional template.'), + 'handler' => 'views_plugin_row_fields', + 'theme' => 'views_view_fields', + 'uses fields' => TRUE, + 'uses options' => TRUE, + 'type' => 'normal', + 'help topic' => 'style-row-fields', + ), + ), + 'argument default' => array( + // This type of plugin does not conform to the standard and + // uses 'fixed' as the parent rather than having a separate parent. + 'fixed' => array( + 'title' => t('Fixed entry'), + 'handler' => 'views_plugin_argument_default', + ), + 'php' => array( + 'title' => t('PHP Code'), + 'handler' => 'views_plugin_argument_default_php', + 'parent' => 'fixed', + ), + ), + 'argument validator' => array( + 'parent' => array( + 'no ui' => TRUE, + 'handler' => 'views_plugin_argument_validate', + 'parent' => '', + ), + 'php' => array( + 'title' => t('PHP Code'), + 'handler' => 'views_plugin_argument_validate_php', + ), + 'numeric' => array( + 'title' => t('Numeric'), + 'handler' => 'views_plugin_argument_validate_numeric', + ), + ), + 'access' => array( + 'parent' => array( + 'no ui' => TRUE, + 'handler' => 'views_plugin_access', + 'parent' => '', + ), + 'none' => array( + 'title' => t('None'), + 'help' => t('Will be available to all users.'), + 'handler' => 'views_plugin_access_none', + 'help topic' => 'access-none', + ), + 'role' => array( + 'title' => t('Role'), + 'help' => t('Access will be granted to users with any of the specified roles.'), + 'handler' => 'views_plugin_access_role', + 'uses options' => TRUE, + 'help topic' => 'access-role', + ), + 'perm' => array( + 'title' => t('Permission'), + 'help' => t('Access will be granted to users with the specified permission string.'), + 'handler' => 'views_plugin_access_perm', + 'uses options' => TRUE, + 'help topic' => 'access-perm', + ), + ), + 'cache' => array( + 'parent' => array( + 'no ui' => TRUE, + 'handler' => 'views_plugin_cache', + 'parent' => '', + ), + 'none' => array( + 'title' => t('None'), + 'help' => t('No caching of Views data.'), + 'handler' => 'views_plugin_cache_none', + 'help topic' => 'cache-none', + ), + 'time' => array( + 'title' => t('Time-based'), + 'help' => t('Simple time-based caching of data.'), + 'handler' => 'views_plugin_cache_time', + 'uses options' => TRUE, + 'help topic' => 'cache-time', + ), + ), + ); +} + +/** + * Builds and return a list of all plugins available in the system. + * + * @return Nested array of plugins, grouped by type. + */ +function views_discover_plugins() { + $cache = array('display' => array(), 'style' => array(), 'row' => array(), 'argument default' => array(), 'argument validator' => array(), 'access' => array(), 'cache' => array()); + // Get plugins from all mdoules. + foreach (module_implements('views_plugins') as $module) { + $function = $module . '_views_plugins'; + $result = $function(); + if (!is_array($result)) { + continue; + } + + $module_dir = isset($result['module']) ? $result['module'] : $module; + // Setup automatic path/file finding for theme registration + if ($module_dir == 'views') { + $theme_path = drupal_get_path('module', $module_dir) . '/theme'; + $theme_file = 'theme.inc'; + $path = drupal_get_path('module', $module_dir) . '/plugins'; + } + else { + $theme_path = $path = drupal_get_path('module', $module_dir); + $theme_file = "$module.views.inc"; + } + + foreach ($result as $type => $info) { + if ($type == 'module') { + continue; + } + foreach ($info as $plugin => $def) { + $def['module'] = $module_dir; + if (!isset($def['theme path'])) { + $def['theme path'] = $theme_path; + } + if (!isset($def['theme file'])) { + $def['theme file'] = $theme_file; + } + if (!isset($def['path'])) { + $def['path'] = $path; + } + if (!isset($def['file'])) { + $def['file'] = $def['handler'] . '.inc'; + } + if (!isset($def['parent'])) { + $def['parent'] = 'parent'; + } + // merge the new data in + $cache[$type][$plugin] = $def; + } + } + } + return $cache; +} + +/** + * Abstract base class to provide interface common to all plugins. + */ +class views_plugin extends views_object { + /** + * Init will be called after construct, when the plugin is attached to a + * view and a display. + */ + function init(&$view, &$display) { + $this->view = &$view; + $this->display = &$display; + } + + /** + * Provide a form to edit options for this plugin. + */ + function options_form(&$form, &$form_state) { } + + /** + * Validate the options form. + */ + function options_validate(&$form, &$form_state) { } + + /** + * Handle any special handling on the validate form. + */ + function options_submit(&$form, &$form_state) { } + + /** + * Add anything to the query that we might need to. + */ + function query() { } + + /** + * Provide a full list of possible theme templates used by this style. + */ + function theme_functions() { + return views_theme_functions($this->definition['theme'], $this->view, $this->display); + } + + /** + * Provide a list of additional theme functions for the theme information page + */ + function additional_theme_functions() { + $funcs = array(); + if (!empty($this->definition['additional themes'])) { + foreach ($this->definition['additional themes'] as $theme => $type) { + $funcs[] = views_theme_functions($theme, $this->view, $this->display); + } + } + return $funcs; + } + + /** + * Validate that the plugin is correct and can be saved. + * + * @return + * An array of error strings to tell the user what is wrong with this + * plugin. + */ + function validate() { return array(); } +} + diff --git a/includes/query.inc b/includes/query.inc new file mode 100644 index 0000000000000000000000000000000000000000..3f77553cc161c26b84227f78640faf09e4de820f --- /dev/null +++ b/includes/query.inc @@ -0,0 +1,1020 @@ +base_table = $base_table; // Predefine these above, for clarity. + $this->base_field = $base_field; + $this->relationships[$base_table] = array( + 'link' => NULL, + 'table' => $base_table, + 'alias' => $base_table, + 'base' => $base_table + ); + + // init the table queue with our primary table. + $this->table_queue[$base_table] = array( + 'alias' => $base_table, + 'table' => $base_table, + 'relationship' => $base_table, + 'join' => NULL, + ); + + // init the tables with our primary table + $this->tables[$base_table][$base_table] = array( + 'count' => 1, + 'alias' => $base_table, + ); + + if ($base_field) { + $this->fields[$base_field] = array( + 'table' => $base_table, + 'field' => $base_field, + 'alias' => $base_field, + ); + } + + $this->count_field = array( + 'table' => $base_table, + 'field' => $base_field, + 'alias' => $base_field, + 'count' => TRUE, + ); + } + + // ---------------------------------------------------------------- + // Utility methods to set flags and data. + + /** + * Set the base field to be distinct. + */ + function set_distinct($value = TRUE) { + if (!(isset($this->no_distinct) && $value)) { + // Hack in a check to see if node_access is going to add its own DISTINCT + // and break this query. + // See http://drupal.org/node/284392 for the core bug. + // + // We want to bypass views distinct code if this bug will be triggered so + // if the base table is node and there is a node access module, bypass + // views distinct code. + if ($this->base_table != 'node' || !node_access_view_all_nodes()) { + $this->distinct = FALSE; + } + else { + $this->distinct = $value; + } + } + } + + /** + * Set what field the query will count() on for paging. + */ + function set_count_field($table, $field, $alias = NULL) { + if (empty($alias)) { + $alias = $table . '_' . $field; + } + $this->count_field = array( + 'table' => $table, + 'field' => $field, + 'alias' => $alias, + 'count' => TRUE, + ); + } + + /** + * Set the table header; used for click-sorting because it's needed + * info to modify the ORDER BY clause. + */ + function set_header($header) { + $this->header = $header; + } + + // ---------------------------------------------------------------- + // Table/join adding + + /** + * A relationship is an alternative endpoint to a series of table + * joins. Relationships must be aliases of the primary table and + * they must join either to the primary table or to a pre-existing + * relationship. + * + * An example of a relationship would be a nodereference table. + * If you have a nodereference named 'book_parent' which links to a + * parent node, you could set up a relationship 'node_book_parent' + * to 'node'. Then, anything that links to 'node' can link to + * 'node_book_parent' instead, thus allowing all properties of + * both nodes to be available in the query. + * + * @param $alias + * What this relationship will be called, and is also the alias + * for the table. + * @param $join + * A views_join object (or derived object) to join the alias in. + * @param $base + * The name of the 'base' table this relationship represents; this + * tells the join search which path to attempt to use when finding + * the path to this relationship. + * @param $link_point + * If this relationship links to something other than the primary + * table, specify that table here. For example, a 'track' node + * might have a relationship to an 'album' node, which might + * have a relationship to an 'artist' node. + */ + function add_relationship($alias, $join, $base, $link_point = NULL) { + if (empty($link_point)) { + $link_point = $this->base_table; + } + else if (!array_key_exists($link_point, $this->relationships)) { + return FALSE; + } + + // Make sure $alias isn't already used; if it, start adding stuff. + $alias_base = $alias; + $count = 1; + while (!empty($this->relationships[$alias])) { + $alias = $alias_base . '_' . $count++; + } + + // Make sure this join is adjusted for our relationship. + if ($link_point && isset($this->relationships[$link_point])) { + $join = $this->adjust_join($join, $link_point); + } + + // Add the table directly to the queue to avoid accidentally marking + // it. + $this->table_queue[$alias] = array( + 'table' => $join->table, + 'num' => 1, + 'alias' => $alias, + 'join' => $join, + 'relationship' => $link_point, + ); + + $this->relationships[$alias] = array( + 'link' => $link_point, + 'table' => $join->table, + 'base' => $base, + ); + return $alias; + } + + /** + * Add a table to the query, ensuring the path exists. + * + * This function will test to ensure that the path back to the primary + * table is valid and exists; if you do not wish for this testing to + * occur, use $query->queue_table() instead. + * + * @param $table + * The name of the table to add. It needs to exist in the global table + * array. + * @param $relationship + * An alias of a table; if this is set, the path back to this table will + * be tested prior to adding the table, making sure that all intermediary + * tables exist and are properly aliased. If set to NULL the path to + * the primary table will be ensured. If the path cannot be made, the + * table will NOT be added. + * @param $join + * In some join configurations this table may actually join back through + * a different method; this is most likely to be used when tracing + * a hierarchy path. (node->parent->parent2->parent3). This parameter + * will specify how this table joins if it is not the default. + * @param $alias + * A specific alias to use, rather than the default alias. + * + * @return $alias + * The alias of the table; this alias can be used to access information + * about the table and should always be used to refer to the table when + * adding parts to the query. Or FALSE if the table was not able to be + * added. + */ + function add_table($table, $relationship = NULL, $join = NULL, $alias = NULL) { + if (!$this->ensure_path($table, $relationship, $join)) { + return FALSE; + } + + if (!$join) { + $join = $this->get_join_data($table, $this->relationships[$relationship]['base']); + } + + $join = $this->adjust_join($join, $relationship); + + return $this->queue_table($table, $relationship, $join, $alias); + } + + /** + * Add a table to the query, without ensuring the path. + * + * This function will test to ensure that the path back to the primary + * table is valid and exists; if you do not wish for this testing to + * occur, use $query->queue_table() instead. + * + * @param $table + * The name of the table to add. It needs to exist in the global table + * array. + * @param $relationship + * The primary table alias this table is related to. If not set, the + * primary table will be used. + * @param $join + * In some join configurations this table may actually join back through + * a different method; this is most likely to be used when tracing + * a hierarchy path. (node->parent->parent2->parent3). This parameter + * will specify how this table joins if it is not the default. + * @param $alias + * A specific alias to use, rather than the default alias. + * + * @return $alias + * The alias of the table; this alias can be used to access information + * about the table and should always be used to refer to the table when + * adding parts to the query. Or FALSE if the table was not able to be + * added. + */ + function queue_table($table, $relationship = NULL, $join = NULL, $alias = NULL) { + // If the alias is set, make sure it doesn't already exist. + if (isset($this->table_queue[$alias])) { + return $alias; + } + + if (empty($relationship)) { + $relationship = $this->base_table; + } + + if (!array_key_exists($relationship, $this->relationships)) { + return FALSE; + } + + if (!$alias && $join && $relationship && !empty($join->adjusted) && $table != $join->table) { + if ($relationship == $this->base_table) { + $alias = $table; + } + else { + $alias = $relationship . '_' . $table; + } + } + + // Check this again to make sure we don't blow up existing aliases for already + // adjusted joins. + if (isset($this->table_queue[$alias])) { + return $alias; + } + + $alias = $this->mark_table($table, $relationship, $alias); + + // If no alias is specified, give it the default. + if (!isset($alias)) { + $alias = $this->tables[$relationship][$table]['alias'] . $this->tables[$relationship][$table]['count']; + } + + // If this is a relationship based table, add a marker with + // the relationship as a primary table for the alias. + if ($table != $alias) { + $this->mark_table($alias, $this->base_table, $alias); + } + + // If no join is specified, pull it from the table data. + if (!isset($join)) { + $join = $this->get_join_data($table, $this->relationships[$relationship]['base']); + if (empty($join)) { + return FALSE; + } + + $join = $this->adjust_join($join, $relationship); + } + + $this->table_queue[$alias] = array( + 'table' => $table, + 'num' => $this->tables[$relationship][$table]['count'], + 'alias' => $alias, + 'join' => $join, + 'relationship' => $relationship, + ); + + return $alias; + } + + function mark_table($table, $relationship, $alias) { + // Mark that this table has been added. + if (empty($this->tables[$relationship][$table])) { + if (!isset($alias)) { + $alias = ''; + if ($relationship != $this->base_table) { + // double underscore will help prevent accidental name + // space collisions. + $alias = $relationship . '__'; + } + $alias .= $table; + } + $this->tables[$relationship][$table] = array( + 'count' => 1, + 'alias' => $alias, + ); + } + else { + $this->tables[$relationship][$table]['count']++; + } + + return $alias; + } + + /** + * Ensure a table exists in the queue; if it already exists it won't + * do anything, but if it doesn't it will add the table queue. It will ensure + * a path leads back to the relationship table. + * + * @param $table + * The unaliased name of the table to ensure. + * @param $relationship + * The relationship to ensure the table links to. Each relationship will + * get a unique instance of the table being added. If not specified, + * will be the primary table. + * @param $join + * A views_join object (or derived object) to join the alias in. + * + * @return + * The alias used to refer to this specific table, or NULL if the table + * cannot be ensured. + */ + function ensure_table($table, $relationship = NULL, $join = NULL) { + // ensure a relationship + if (empty($relationship)) { + $relationship = $this->base_table; + } + + // If the relationship is the primary table, this actually be a relationship + // link back from an alias. We store all aliases along with the primary table + // to detect this state, because eventually it'll hit a table we already + // have and that's when we want to stop. + if ($relationship == $this->base_table && !empty($this->tables[$relationship][$table])) { + return $this->tables[$relationship][$table]['alias']; + } + + if (!array_key_exists($relationship, $this->relationships)) { + return FALSE; + } + + if ($table == $this->relationships[$relationship]['base']) { + return $relationship; + } + + // If we do not have join info, fetch it. + if (!isset($join)) { + $join = $this->get_join_data($table, $this->relationships[$relationship]['base']); + } + + // If it can't be fetched, this won't work. + if (empty($join)) { + return; + } + + // Adjust this join for the relationship, which will ensure that the 'base' + // table it links to is correct. Tables adjoined to a relationship + // join to a link point, not the base table. + $join = $this->adjust_join($join, $relationship); + + if ($this->ensure_path($table, $relationship, $join)) { + // Attempt to eliminate redundant joins. If this table's + // relationship and join exactly matches an existing table's + // relationship and join, we do not have to join to it again; + // just return the existing table's alias. See + // http://groups.drupal.org/node/11288 for details. + // + // This can be done safely here but not lower down in + // queue_table(), because queue_table() is also used by + // add_table() which requires the ability to intentionally add + // the same table with the same join multiple times. For + // example, a view that filters on 3 taxonomy terms using AND + // needs to join term_data 3 times with the same join. + + // scan through the table queue to see if a matching join and + // relationship exists. If so, use it instead of this join. + + // TODO: Scanning through $this->table_queue results in an + // O(N^2) algorithm, and this code runs every time the view is + // instantiated (Views 2 does not currently cache queries). + // There are a couple possible "improvements" but we should do + // some performance testing before picking one. + foreach ($this->table_queue as $queued_table) { + // In PHP 4 and 5, the == operation returns TRUE for two objects + // if they are instances of the same class and have the same + // attributes and values. + if ($queued_table['relationship'] == $relationship && $queued_table['join'] == $join) { + return $queued_table['alias']; + } + } + + return $this->queue_table($table, $relationship, $join); + } + } + + /** + * Make sure that the specified table can be properly linked to the primary + * table in the JOINs. This function uses recursion. If the tables + * needed to complete the path back to the primary table are not in the + * query they will be added, but additional copies will NOT be added + * if the table is already there. + */ + function ensure_path($table, $relationship = NULL, $join = NULL, $traced = array(), $add = array()) { + if (!isset($relationship)) { + $relationship = $this->base_table; + } + + if (!array_key_exists($relationship, $this->relationships)) { + return FALSE; + } + + // If we do not have join info, fetch it. + if (!isset($join)) { + $join = $this->get_join_data($table, $this->relationships[$relationship]['base']); + } + + // If it can't be fetched, this won't work. + if (empty($join)) { + return FALSE; + } + + // Does a table along this path exist? + if (isset($this->tables[$relationship][$table]) || + ($join && $join->left_table == $relationship) || + ($join && $join->left_table == $this->relationships[$relationship]['table'])) { + + // Make sure that we're linking to the correct table for our relationship. + foreach (array_reverse($add) as $table => $path_join) { + $this->queue_table($table, $relationship, $this->adjust_join($path_join, $relationship)); + } + return TRUE; + } + + // Have we been this way? + if (isset($traced[$join->left_table])) { + // we looped. Broked. + return FALSE; + } + + // Do we have to add this table? + $left_join = $this->get_join_data($join->left_table, $this->relationships[$relationship]['base']); + if (!isset($this->tables[$relationship][$join->left_table])) { + $add[$join->left_table] = $left_join; + } + + // Keep looking. + $traced[$join->left_table] = TRUE; + return $this->ensure_path($join->left_table, $relationship, $left_join, $traced, $add); + } + + /** + * Fix a join to adhere to the proper relationship; the left table can vary + * based upon what relationship items are joined in on. + */ + function adjust_join($join, $relationship) { + if (!empty($join->adjusted)) { + return $join; + } + + if (empty($relationship) || empty($this->relationships[$relationship])) { + return $join; + } + + // Adjusts the left table for our relationship. + if ($relationship != $this->base_table) { + // If we're linking to the primary table, the relationship to use will + // be the prior relationship. Unless it's a direct link. + + // Safety! Don't modify an original here. + $join = drupal_clone($join); + + // Do we need to try to ensure a path? + if ($join->left_table != $this->relationships[$relationship]['table'] && + $join->left_table != $this->relationships[$relationship]['base'] && + !isset($this->tables[$relationship][$join->left_table]['alias'])) { + $this->ensure_table($join->left_table, $relationship); + } + + // First, if this is our link point/anchor table, just use the relationship + if ($join->left_table == $this->relationships[$relationship]['table']) { + $join->left_table = $relationship; + } + // then, try the base alias. + else if (isset($this->tables[$relationship][$join->left_table]['alias'])) { + $join->left_table = $this->tables[$relationship][$join->left_table]['alias']; + } + // But if we're already looking at an alias, use that instead. + else if (isset($this->table_queue[$relationship]['alias'])) { + $join->left_table = $this->table_queue[$relationship]['alias']; + } + } + + $join->adjusted = TRUE; + return $join; + } + + /** + * Retrieve join data from the larger join data cache. + * + * @param $table + * The table to get the join information for. + * @param $base_table + * The path we're following to get this join. + * + * @return + * A views_join object or child object, if one exists. + */ + function get_join_data($table, $base_table) { + // Check to see if we're linking to a known alias. If so, get the real + // table's data instead. + if (!empty($this->table_queue[$table])) { + $table = $this->table_queue[$table]['table']; + } + return views_get_table_join($table, $base_table); + + } + + /** + * Get the information associated with a table. + * + * If you need the alias of a table with a particular relationship, use + * ensure_table(). + */ + function get_table_info($table) { + if (!empty($this->table_queue[$table])) { + return $this->table_queue[$table]; + } + + // In rare cases we might *only* have aliased versions of the table. + if (!empty($this->tables[$this->base_table][$table])) { + $alias = $this->tables[$this->base_table][$table]['alias']; + if (!empty($this->table_queue[$alias])) { + return $this->table_queue[$alias]; + } + } + } + + /** + * Add a field to the query table, possibly with an alias. This will + * automatically call ensure_table to make sure the required table + * exists, *unless* $table is unset. + * + * @param $table + * The table this field is attached to. If NULL, it is assumed this will + * be a formula; otherwise, ensure_table is used to make sure the + * table exists. + * @param $field + * The name of the field to add. This may be a real field or a formula. + * @param $alias + * The alias to create. If not specified, the alias will be $table_$field + * unless $table is NULL. When adding formulae, it is recommended that an + * alias be used. + * + * @return $name + * The name that this field can be referred to as. Usually this is the alias. + */ + function add_field($table, $field, $alias = '', $params = NULL) { + // We check for this specifically because it gets a special alias. + if ($table == $this->base_table && $field == $this->base_field && empty($alias)) { + $alias = $this->base_field; + } + + if ($table && empty($this->table_queue[$table])) { + $this->ensure_table($table); + } + + if (!$alias && $table) { + $alias = $table . '_' . $field; + } + + $name = $alias ? $alias : $field; + + // @todo FIXME -- $alias, then $name is inconsistent + if (empty($this->fields[$alias])) { + $this->fields[$name] = array( + 'field' => $field, + 'table' => $table, + 'alias' => $alias, + ); + } + + foreach ((array)$params as $key => $value) { + $this->fields[$name][$key] = $value; + } + + return $name; + } + + /** + * Remove all fields that may've been added; primarily used for summary + * mode where we're changing the query because we didn't get data we needed. + */ + function clear_fields() { + $this->fields = array(); + } + + /** + * Create a new grouping for the WHERE or HAVING clause. + * + * @param $type + * Either 'AND' or 'OR'. All items within this group will be added + * to the WHERE clause with this logical operator. + * @param $group + * An ID to use for this group. If unspecified, an ID will be generated. + * @param $where + * 'where' or 'having'. + * + * @return $group + * The group ID generated. + */ + function set_where_group($type = 'AND', $group = NULL, $where = 'where') { + // Set an alias. + $groups = &$this->$where; + + if (!isset($group)) { + $group = empty($groups) ? 1 : max(array_keys($groups)) + 1; + } + + // Create an empty group + if (empty($groups[$group])) { + $groups[$group] = array('clauses' => array(), 'args' => array()); + } + + $groups[$group]['type'] = strtoupper($type); + return $group; + } + + /** + * Control how all WHERE and HAVING groups are put together. + * + * @param $type + * Either 'AND' or 'OR' + */ + function set_group_operator($type = 'AND') { + $this->group_operator = strtoupper($type); + } + + /** + * Add a simple WHERE clause to the query. The caller is responsible for + * ensuring that all fields are fully qualified (TABLE.FIELD) and that + * the table already exists in the query. + * + * @param $group + * The WHERE group to add these to; groups are used to create AND/OR + * sections. Groups cannot be nested. Use 0 as the default group. + * If the group does not yet exist it will be created as an AND group. + * @param $clause + * The actual clause to add. When adding a where clause it is important + * that all tables are addressed by the alias provided by add_table or + * ensure_table and that all fields are addressed by their alias wehn + * possible. Please use %d and %s for arguments. + * @param ... + * A number of arguments as used in db_query(). May be many args or one + * array full of args. + */ + function add_where($group, $clause) { + $args = func_get_args(); + array_shift($args); // ditch $group + array_shift($args); // ditch $clause + + // Expand an array of args if it came in. + if (count($args) == 1 && is_array(reset($args))) { + $args = current($args); + } + + // Ensure all variants of 0 are actually 0. Thus '', 0 and NULL are all + // the default group. + if (empty($group)) { + $group = 0; + } + + // Check for a group. + if (!isset($this->where[$group])) { + $this->set_where_group('AND', $group); + } + + // Add the clause and the args. + if (is_array($args)) { + $this->where[$group]['clauses'][] = $clause; + // we use array_values() here to prevent array_merge errors as keys from multiple + // sources occasionally collide. + $this->where[$group]['args'] = array_merge($this->where[$group]['args'], array_values($args)); + } + } + + /** + * Add a simple HAVING clause to the query. The caller is responsible for + * ensuring that all fields are fully qualified (TABLE.FIELD) and that + * the table and an appropriate GROUP BY already exist in the query. + * + * @param $group + * The HAVING group to add these to; groups are used to create AND/OR + * sections. Groups cannot be nested. Use 0 as the default group. + * If the group does not yet exist it will be created as an AND group. + * @param $clause + * The actual clause to add. When adding a having clause it is important + * that all tables are addressed by the alias provided by add_table or + * ensure_table and that all fields are addressed by their alias wehn + * possible. Please use %d and %s for arguments. + * @param ... + * A number of arguments as used in db_query(). May be many args or one + * array full of args. + */ + function add_having($group, $clause) { + $args = func_get_args(); + array_shift($args); // ditch $group + array_shift($args); // ditch $clause + + // Expand an array of args if it came in. + if (count($args) == 1 && is_array(reset($args))) { + $args = current($args); + } + + // Ensure all variants of 0 are actually 0. Thus '', 0 and NULL are all + // the default group. + if (empty($group)) { + $group = 0; + } + + // Check for a group. + if (!isset($this->having[$group])) { + $this->set_where_group('AND', $group, 'having'); + } + + // Add the clause and the args. + if (is_array($args)) { + $this->having[$group]['clauses'][] = $clause; + $this->having[$group]['args'] = array_merge($this->having[$group]['args'], array_values($args)); + } + } + + /** + * Add an ORDER BY clause to the query. + * + * @param $table + * The table this field is part of. If a formula, enter NULL. + * @param $field + * The field or formula to sort on. If already a field, enter NULL + * and put in the alias. + * @param $order + * Either ASC or DESC. + * @param $alias + * The alias to add the field as. In SQL, all fields in the order by + * must also be in the SELECT portion. If an $alias isn't specified + * one will be generated for from the $field; however, if the + * $field is a formula, this alias will likely fail. + */ + function add_orderby($table, $field, $order, $alias = '') { + if ($table) { + $this->ensure_table($table); + } + + // Only fill out this aliasing if there is a table; + // otherwise we assume it is a formula. + if (!$alias && $table) { + $as = $table . '_' . $field; + } + else { + $as = $alias; + } + + if ($field) { + $this->add_field($table, $field, $as); + } + + $this->orderby[] = "$as " . strtoupper($order); + + // If grouping, all items in the order by must also be in the + // group by clause. Check $table to ensure that this is not a + // formula. + if ($this->groupby && $table) { + $this->add_groupby($as); + } + } + + /** + * Add a simple GROUP BY clause to the query. The caller is responsible + * for ensuring that the fields are fully qualified and the table is properly + * added. + */ + function add_groupby($clause) { + // Only add it if it's not already in there. + if (!in_array($clause, $this->groupby)) { + $this->groupby[] = $clause; + } + } + + /** + * Construct the "WHERE" or "HAVING" part of the query. + * + * @param $where + * 'where' or 'having'. + */ + function condition_sql($where = 'where') { + $clauses = array(); + foreach ($this->$where as $group => $info) { + $clause = implode(") " . $info['type'] . " (", $info['clauses']); + if (count($info['clauses']) > 1) { + $clause = '(' . $clause . ')'; + } + $clauses[] = $clause; + } + + if ($clauses) { + $keyword = drupal_strtoupper($where); + if (count($clauses) > 1) { + return "$keyword (" . implode(")\n " . $this->group_operator . ' (', $clauses) . ")\n"; + } + else { + return "$keyword " . array_shift($clauses) . "\n"; + } + } + return ""; + } + + /** + * Generate a query and a countquery from all of the information supplied + * to the object. + * + * @param $get_count + * Provide a countquery if this is true, otherwise provide a normal query. + */ + function query($get_count = FALSE) { + // Check query distinct value. + if (empty($this->no_distinct) && $this->distinct && !empty($this->fields)) { + if (!empty($this->fields[$this->base_field])) { + $this->fields[$this->base_field]['distinct'] = TRUE; + $this->add_groupby($this->base_field); + } + } + + /** + * An optimized count query includes just the base field instead of all the fields. + * Determine of this query qualifies by checking for a groupby or distinct. + */ + $fields_array = $this->fields; + if ($get_count && !$this->groupby) { + foreach ($fields_array as $field) { + if (!empty($field['distinct'])) { + $get_count_optimized = FALSE; + break; + } + } + } + else { + $get_count_optimized = FALSE; + } + if (!isset($get_count_optimized)) { + $get_count_optimized = TRUE; + } + + $joins = $fields = $where = $having = $orderby = $groupby = ''; + // Add all the tables to the query via joins. We assume all LEFT joins. + foreach ($this->table_queue as $table) { + if (is_object($table['join'])) { + $joins .= $table['join']->join($table, $this) . "\n"; + } + } + + $has_aggregate = FALSE; + $non_aggregates = array(); + + foreach ($fields_array as $field) { + if ($fields) { + $fields .= ",\n "; + } + $string = ''; + if (!empty($field['table'])) { + $string .= $field['table'] . '.'; + } + $string .= $field['field']; + + // store for use with non-aggregates below + $fieldname = (!empty($field['alias']) ? $field['alias'] : $string); + + if (!empty($field['distinct'])) { + $string = "DISTINCT($string)"; + } + if (!empty($field['count'])) { + $string = "COUNT($string)"; + $has_aggregate = TRUE; + } + else if (!empty($field['aggregate'])) { + $has_aggregate = TRUE; + } + elseif ($this->distinct && !in_array($fieldname, $this->groupby)) { + $string = $GLOBALS['db_type'] == 'pgsql' ? "FIRST($string)" : $string; + } + else { + $non_aggregates[] = $fieldname; + } + if ($field['alias']) { + $string .= " AS $field[alias]"; + } + $fields .= $string; + + if ($get_count_optimized) { + // We only want the first field in this case. + break; + } + } + + if ($has_aggregate || $this->groupby) { + $groupby = "GROUP BY " . implode(', ', array_unique(array_merge($this->groupby, $non_aggregates))) . "\n"; + if ($this->having) { + $having = $this->condition_sql('having'); + } + } + + if (!$get_count_optimized) { + // we only add the groupby if we're not counting. + if ($this->orderby) { + $orderby = "ORDER BY " . implode(', ', $this->orderby) . "\n"; + } + } + + $where = $this->condition_sql(); + + $query = "SELECT $fields\n FROM {" . $this->base_table . "} $this->base_table \n$joins $where $groupby $having $orderby"; + + $replace = array('>' => '>', '<' => '<'); + $query = strtr($query, $replace); + + return $query; + } + + /** + * Get the arguments attached to the WHERE and HAVING clauses of this query. + */ + function get_where_args() { + $args = array(); + foreach ($this->where as $group => $where) { + $args = array_merge($args, $where['args']); + } + foreach ($this->having as $group => $having) { + $args = array_merge($args, $having['args']); + } + return $args; + } +} + diff --git a/includes/tabs.inc b/includes/tabs.inc new file mode 100644 index 0000000000000000000000000000000000000000..a4d89ee87a7c0bd897e46076e95caf80210b2c96 --- /dev/null +++ b/includes/tabs.inc @@ -0,0 +1,193 @@ +set(). This will be the link to click on to + * view the tab. + * @param $body + * If given, this is the body of the tab itself. It will display + * when the tab title is clicked on. + */ + function add($name, $title = '', $body = '') { + if (is_object($name) && is_subclass_of($name, 'views_tab')) { + $this->add_tab($name); + } + elseif (is_array($name)) { + foreach ($name as $real_tab) { + $this->add($real_tab); + } + } + else { + $this->add_tab(new views_tab($name, $title, $body)); + } + } + + /** + * Add a fully realized tab object to the tabset. + * + * @param $tab + * A fully populated views_tab object. + */ + function add_tab($tab) { + $this->tabs[$tab->name] = $tab; + } + + /** + * Set the values of a tab. + * + * @param $name + * The unique identifier of the tab to set. + * @param $title + * The title of the tab; this will be clickable. + * @param $body + * The HTML body of the tab. + */ + function set($name, $title, $body = NULL) { + if (empty($this->tabs[$name])) { + return $this->add($name, $title, $body); + } + $this->tabs[$name]->title = $title; + if (isset($body)) { + $this->tabs[$name]->body = $body; + } + } + + /** + * Set the body of a tab. + */ + function set_body($name, $body) { + if (empty($this->tabs[$name])) { + return $this->add($name, '', $body); + } + $this->tabs[$name]->body = $body; + } + + /** + * Add text to the 'extra' region of the tabset. + */ + function add_extra($text) { + $this->extra .= $text; + } + + /** + * Remove a tab. + * + * @param $tab + * May be the name of the tab or a views_tab object. + */ + function remove($tab) { + if (is_string($tab)) { + unset($this->tabs[$tab]); + } + else { + unset($this->tabs[$tab->name]); + } + } + + /** + * Control which tab will be selected when it is rendered. + */ + function set_selected($name) { + $this->selected = $name; + } + + /** + * Output the HTML for the tabs. + * + * @return + * HTML representation of the tabs. + */ + function render() { + views_add_js('tabs'); + views_add_css('views-tabs'); + + if (empty($this->selected)) { + $keys = array_keys($this->tabs); + $this->selected = array_shift($keys); + } + + drupal_alter('views_tabset', $this); + return theme('views_tabset', $this->tabs, $this->extra, $this->selected); + } +} + +/** + * An object to represent an individual tab within a tabset. + */ +class views_tab { + var $title; + var $body; + var $name; + + /** + * Construct a new tab. + */ + function views_tab($name, $title, $body = NULL) { + $this->name = $name; + $this->title = $title; + $this->body = $body; + } + + /** + * Generate HTML output for a tab. + */ + function render() { + return theme('views_tab', $this->body); + } +} + +/** + * Render a tabset. + * + * @todo Turn this into a template. + */ +function theme_views_tabset($tabs, $extra = NULL, $selected = NULL) { + $link_output = "
    \n"; + $tab_output = "
    \n"; + + foreach ($tabs as $name => $tab) { + $link_output .= '' . check_plain($tab->title) . '' . "\n"; + $tab_output .= '
    ' . $tab->render() . "
    \n"; + } + $link_output .= "
\n"; + + if ($extra) { + $link_output .= "
$extra
\n"; + } + + $link_output .= "
\n"; + $tab_output .= "
\n"; + return '
' . $link_output . $tab_output . '
'; +} + +/** + * Theme a simple tab. + */ +function theme_views_tab($body) { + return $body; +} diff --git a/includes/view.inc b/includes/view.inc new file mode 100644 index 0000000000000000000000000000000000000000..daef39131a4749f931b7bc9f293bf3f9c18fce30 --- /dev/null +++ b/includes/view.inc @@ -0,0 +1,2035 @@ + FALSE, + 'items_per_page' => 10, + 'element' => 0, + 'offset' => 0, + 'current_page' => 0, + ); + + // Places to put attached renderings: + var $attachment_before = ''; + var $attachment_after = ''; + + // Exposed widget input + var $exposed_data = array(); + var $exposed_input = array(); + + // Used to store views that were previously running if we recurse. + var $old_view = array(); + /** + * Constructor + */ + function view() { + parent::init(); + // Make sure all of our sub objects are arrays. + foreach ($this->db_objects() as $object) { + $this->$object = array(); + } + + $this->query = new stdClass(); + } + + /** + * Returns a list of the sub-object types used by this view. These types are + * stored on the display, and are used in the build process. + */ + function display_objects() { + return array('argument', 'field', 'sort', 'filter', 'relationship'); + } + + /** + * Returns the complete list of dependent objects in a view, for the purpose + * of initialization and loading/saving to/from the database. + * + * Note: In PHP5 this should be static, but PHP4 doesn't support static + * methods. + */ + function db_objects() { + return array('display'); + } + + /** + * Set the arguments that come to this view. Usually from the URL + * but possibly from elsewhere. + */ + function set_arguments($args) { + $this->args = $args; + } + + /** + * Set the page size for ranged or pager queries + */ + function set_items_per_page($items_per_page) { + $this->pager['items_per_page'] = $items_per_page; + if (empty($items_per_page)) { + $this->pager['use_pager'] = FALSE; + } + } + + /** + * Change/Set the current page for the pager. + */ + function set_current_page($page) { + $this->pager['current_page'] = $page; + } + + /** + * Whether or not the pager should be used. + */ + function set_use_pager($use_pager) { + $this->pager['use_pager'] = $use_pager; + } + + /** + * The pager element id to use if use_apger is on + */ + function set_pager_element($pager_element) { + $this->pager['element'] = $pager_element; + } + + /** + * How many records to skip. This does not function if use_pager is + * set. + */ + function set_offset($offset) { + $this->pager['offset'] = $offset; + } + + /** + * Whether or not AJAX should be used. If AJAX is used, paging, + * tablesorting and exposed filters will be fetched via an AJAX call + * rather than a page refresh. + */ + function set_use_ajax($use_ajax) { + $this->use_ajax = $use_ajax; + } + + /** + * Set the exposed filters input to an array. If unset they will be taken + * from $_GET when the time comes. + */ + function set_exposed_input($filters) { + $this->exposed_input = $filters; + } + + /** + * Figure out what the exposed input for this view is. + */ + function get_exposed_input() { + // Fill our input either from $_GET or from something previously set on the + // view. + if (empty($this->exposed_input)) { + $this->exposed_input = $_GET; + // unset items that are definitely not our input: + foreach (array('page', 'q') as $key) { + if (isset($this->exposed_input[$key])) { + unset($this->exposed_input[$key]); + } + } + + // If we have no input at all, check for remembered input via session. + + // If filters are not overridden, store the 'remember' settings on the + // default display. If they are, store them on this display. This way, + // multiple displays in the same view can share the same filters and + // remember settings. + $display_id = ($this->display_handler->is_defaulted('filters')) ? 'default' : $this->current_display; + + if (empty($this->exposed_input) && !empty($_SESSION['views'][$this->name][$display_id])) { + $this->exposed_input = $_SESSION['views'][$this->name][$display_id]; + } + } + + return $this->exposed_input; + } + + /** + * Set the display for this view and initialize the display handler. + */ + function init_display($reset = FALSE) { + // The default display is always the first one in the list. + if (isset($this->current_display)) { + return TRUE; + } + + // Instantiate all displays + foreach (array_keys($this->display) as $id) { + // Correct for shallow cloning + // Often we'll have a cloned view so we don't mess up each other's + // displays, but the clone is pretty shallow and doesn't necessarily + // clone the displays. We can tell this by looking to see if a handler + // has already been set; if it has, but $this->current_display is not + // set, then something is dreadfully wrong. + if (!empty($this->display[$id]->handler)) { + $this->display[$id] = drupal_clone($this->display[$id]); + unset($this->display[$id]->handler); + } + $this->display[$id]->handler = views_get_plugin('display', $this->display[$id]->display_plugin); + if (!empty($this->display[$id]->handler)) { + // Initialize the new display handler with data. + $this->display[$id]->handler->init($this, $this->display[$id]); + // If this is NOT the default display handler, let it know which is + // since it may well utilize some data from the default. + // This assumes that the 'default' handler is always first. It always + // is. Make sure of it. + if ($id != 'default') { + $this->display[$id]->handler->default_display = &$this->display['default']->handler; + } + } + } + + $this->current_display = 'default'; + $this->display_handler = &$this->display['default']->handler; + + return TRUE; + } + + /** + * Get the first display that is accessible to the user. + * + * @param $displays + * Either a single display id or an array of display ids. + */ + function choose_display($displays) { + if (!is_array($displays)) { + return $displays; + } + + $this->init_display(); + + foreach ($displays as $display_id) { + if ($this->display[$display_id]->handler->access()) { + return $display_id; + } + } + + return 'default'; + } + + /** + * Set the display as current. + * + * @param $display_id + * The id of the display to mark as current. + */ + function set_display($display_id = NULL) { + // If we have not already initialized the display, do so. But be careful. + if (empty($this->current_display)) { + $this->init_display(); + + // If handlers were not initialized, and no argument was sent, set up + // to the default display. + if (empty($display_id)) { + $display_id = 'default'; + } + } + + $display_id = $this->choose_display($display_id); + + // If no display id sent in and one wasn't chosen above, we're finished. + if (empty($display_id)) { + return TRUE; + } + + // Ensure the requested display exists. + if (empty($this->display[$display_id])) { + $display_id = 'default'; + if (empty($this->display[$display_id])) { + vpr(t('set_display() called with invalid display id @display.', array('@display' => $display_id))); + return FALSE; + } + } + + // Set the current display. + $this->current_display = $display_id; + + // Ensure requested display has a working handler. + if (empty($this->display[$display_id]->handler)) { + return FALSE; + } + + // Set a shortcut + $this->display_handler = &$this->display[$display_id]->handler; + + return TRUE; + } + + /** + * Find and initialize the style plugin. + * + * Note that arguments may have changed which style plugin we use, so + * check the view object first, then ask the display handler. + */ + function init_style() { + if (isset($this->style_plugin)) { + return is_object($this->style_plugin); + } + + if (!isset($this->plugin_name)) { + $this->plugin_name = $this->display_handler->get_option('style_plugin'); + $this->style_options = $this->display_handler->get_option('style_options'); + } + + $this->style_plugin = views_get_plugin('style', $this->plugin_name); + + if (empty($this->style_plugin)) { + return FALSE; + } + + // init the new display handler with data. + $this->style_plugin->init($this, $this->display[$this->current_display], $this->style_options); + return TRUE; + } + + /** + * Acquire and attach all of the handlers. + */ + function init_handlers() { + if (empty($this->inited)) { + foreach (views_object_types() as $key => $info) { + $this->_init_handler($key, $info); + } + $this->inited = TRUE; + } + } + + /** + * Create a list of base tables eligible for this view. Used primarily + * for the UI. Display must be already initialized. + */ + function get_base_tables() { + $base_tables = array( + $this->base_table => TRUE, + '#global' => TRUE, + ); + + foreach ($this->display_handler->get_handlers('relationship') as $handler) { + $base_tables[$handler->definition['base']] = TRUE; + } + return $base_tables; + } + + /** + * Run the pre_query() on all active handlers. + */ + function _pre_query() { + foreach (views_object_types() as $key => $info) { + $handlers = &$this->$key; + $position = 0; + foreach ($handlers as $id => $handler) { + $handlers[$id]->position = $position; + $handlers[$id]->pre_query(); + $position++; + } + } + } + + /** + * Attach all of the handlers for each type. + * + * @param $key + * One of 'argument', 'field', 'sort', 'filter', 'relationship' + * @param $info + * The $info from views_object_types for this object. + */ + function _init_handler($key, $info) { + // Load the requested items from the display onto the object. + $this->$key = $this->display_handler->get_handlers($key); + + // This reference deals with difficult PHP indirection. + $handlers = &$this->$key; + + // Run through and test for accessibility. + foreach ($handlers as $id => $handler) { + if (!$handler->access()) { + unset($handlers[$id]); + } + } + } + + /** + * Render the exposed filter form. + * + * This actually does more than that; because it's using FAPI, the form will + * also assign data to the appropriate handlers for use in building the + * query. + */ + function render_exposed_form($block = FALSE) { + // Deal with any exposed filters we may have, before building. + $form_state = array( + 'view' => &$this, + 'display' => &$this->display_handler->display, + 'method' => 'get', + 'rerender' => TRUE, + 'no_redirect' => TRUE, + ); + + // Some types of displays (eg. attachments) may wish to use the exposed + // filters of their parent displays instead of showing an additional + // exposed filter form for the attachment as well as that for the parent. + if (!$this->display_handler->displays_exposed() || (!$block && $this->display_handler->get_option('exposed_block'))) { + unset($form_state['rerender']); + } + + if (!empty($this->ajax)) { + $form_state['ajax'] = TRUE; + } + + $output = drupal_build_form('views_exposed_form', $form_state); + if (!empty($form_state['js settings'])) { + $this->js_settings = $form_state['js settings']; + } + + return $output; + } + + /** + * Build all the arguments. + */ + function _build_arguments() { + // Initially, we want to build sorts and fields. This can change, though, + // if we get a summary view. + if (empty($this->argument)) { + return TRUE; + } + + // build arguments. + $position = -1; + + // Create a title for use in the breadcrumb trail. + $title = $this->display_handler->get_option('title'); + + $this->build_info['breadcrumb'] = array(); + $breadcrumb_args = array(); + $substitutions = array(); + + $status = TRUE; + + // Iterate through each argument and process. + foreach ($this->argument as $id => $arg) { + $position++; + $argument = &$this->argument[$id]; + + if ($argument->broken()) { + continue; + } + + $argument->set_relationship(); + + $arg = isset($this->args[$position]) ? $this->args[$position] : NULL; + $argument->position = $position; + + if (isset($arg) || $argument->has_default_argument()) { + if (!isset($arg)) { + $arg = $argument->get_default_argument(); + // make sure default args get put back. + if (isset($arg)) { + $this->args[$position] = $arg; + } + } + + // Set the argument, which will also validate that the argument can be set. + if (!$argument->set_argument($arg)) { + $status = $argument->validate_fail($arg); + break; + } + + if ($argument->is_wildcard()) { + $arg_title = $argument->wildcard_title(); + } + else { + $arg_title = $argument->get_title(); + $argument->query(); + } + + // Add this argument's substitution + $substitutions['%' . ($position + 1)] = $arg_title; + + // Since we're really generating the breadcrumb for the item above us, + // check the default action of this argument. + if ($this->display_handler->uses_breadcrumb() && $argument->uses_breadcrumb()) { + $path = $this->get_url($breadcrumb_args); + if (strpos($path, '%') === FALSE) { + $breadcrumb = !empty($argument->options['breadcrumb'])? $argument->options['breadcrumb'] : $title; + $this->build_info['breadcrumb'][$path] = str_replace(array_keys($substitutions), $substitutions, $breadcrumb); + } + } + + // Allow the argument to muck with this breadcrumb. + $argument->set_breadcrumb($this->build_info['breadcrumb']); + + // Test to see if we should use this argument's title + if (!empty($argument->options['title'])) { + $title = $argument->options['title']; + } + + $breadcrumb_args[] = $arg; + } + else { + // determine default condition and handle. + $status = $argument->default_action(); + break; + } + + // Be safe with references and loops: + unset($argument); + } + + // set the title in the build info. + if (!empty($title)) { + $this->build_info['title'] = str_replace(array_keys($substitutions), $substitutions, $title); + } + + // Store the arguments for later use. + $this->build_info['substitutions'] = $substitutions; + + return $status; + } + + /** + * Do some common building initialization. + */ + function init_query() { + // Create and initialize the query object. + $views_data = views_fetch_data($this->base_table); + $this->base_field = $views_data['table']['base']['field']; + if (!empty($views_data['table']['base']['database'])) { + $this->base_database = $views_data['table']['base']['database']; + } + views_include('query'); + $this->query = new views_query($this->base_table, $this->base_field); + } + + /** + * Build the query for the view. + */ + function build($display_id = NULL) { + if (!empty($this->built)) { + return; + } + + if (empty($this->current_display) || $display_id) { + if (!$this->set_display($display_id)) { + return FALSE; + } + } + + // Let modules modify the view just prior to executing it. + foreach (module_implements('views_pre_build') as $module) { + $function = $module . '_views_pre_build'; + $function($this); + } + + // Attempt to load from cache. + // @todo Load a build_info from cache. + + $start = views_microtime(); + // If that fails, let's build! + $this->build_info = array( + 'query' => '', + 'count_query' => '', + 'query_args' => array(), + ); + + $this->init_query(); + + // Call a module hook and see if it wants to present us with a + // pre-built query or instruct us not to build the query for + // some reason. + // @todo: Implement this. Use the same mechanism Panels uses. + + // Run through our handlers and ensure they have necessary information. + $this->init_handlers(); + + // Let the handlers interact with each other if they really want. + $this->_pre_query(); + + if ($this->display_handler->uses_exposed()) { + $this->exposed_widgets = $this->render_exposed_form(); + if (form_set_error() || !empty($this->build_info['abort'])) { + $this->built = TRUE; + return empty($this->build_info['fail']); + } + } + + // Build all the relationships first thing. + $this->_build('relationship'); + + // Build all the filters. + $this->_build('filter'); + + $this->build_sort = TRUE; + + // Arguments can, in fact, cause this whole thing to abort. + if (!$this->_build_arguments()) { + $this->build_time = views_microtime() - $start; + $this->attach_displays(); + return $this->built; + } + + // Initialize the style; arguments may have changed which style we use, + // so waiting as long as possible is important. But we need to know + // about the style when we go to build fields. + if (!$this->init_style()) { + $this->build_info['fail'] = TRUE; + return FALSE; + } + + if ($this->style_plugin->uses_fields()) { + $this->_build('field'); + } + + // Build our sort criteria if we were instructed to do so. + if (!empty($this->build_sort)) { + // Allow the style handler to deal with sorting. + if ($this->style_plugin->build_sort()) { + $this->_build('sort'); + } + // allow the plugin to build second sorts as well. + $this->style_plugin->build_sort_post(); + } + + // Allow display handler to affect the query: + $this->display_handler->query(); + + // Allow style handler to affect the query: + $this->style_plugin->query(); + + if (variable_get('views_sql_signature', FALSE)) { + $this->query->add_field(NULL, "'" . $this->name . ':' . $this->current_display . "'", 'view_name'); + } + + // Let modules modify the query just prior to finalizing it. + foreach (module_implements('views_query_alter') as $module) { + $function = $module . '_views_query_alter'; + $function($this, $this->query); + } + + $this->build_info['query'] = $this->query->query(); + $this->build_info['count_query'] = $this->query->query(TRUE); + $this->build_info['query_args'] = $this->query->get_where_args(); + $this->built = TRUE; + $this->build_time = views_microtime() - $start; + + // Attach displays + $this->attach_displays(); + return TRUE; + } + + /** + * Internal method to build an individual set of handlers. + */ + function _build($key) { + $handlers = &$this->$key; + foreach ($handlers as $id => $data) { + if (!empty($handlers[$id]) && is_object($handlers[$id])) { + // Give this handler access to the exposed filter input. + if (!empty($this->exposed_data)) { + $rc = $handlers[$id]->accept_exposed_input($this->exposed_data); + $handlers[$id]->store_exposed_input($this->exposed_data, $rc); + if (!$rc) { + continue; + } + } + $handlers[$id]->set_relationship(); + $handlers[$id]->query(); + } + } + } + + /** + * Execute the view's query. + */ + function execute($display_id = NULL) { + if (empty($this->built)) { + if (!$this->build($display_id)) { + return FALSE; + } + } + + if (!empty($this->executed)) { + return TRUE; + } + + // Let modules modify the view just prior to executing it. + foreach (module_implements('views_pre_execute') as $module) { + $function = $module . '_views_pre_execute'; + $function($this); + } + + $query = db_rewrite_sql($this->build_info['query'], $this->base_table, $this->base_field, array('view' => &$this)); + $count_query = db_rewrite_sql($this->build_info['count_query'], $this->base_table, $this->base_field, array('view' => &$this)); + + $args = $this->build_info['query_args']; + + vpr($query); + + + // Check for already-cached results. + if (!empty($this->live_preview)) { + $cache = FALSE; + } + else { + $cache = $this->display_handler->get_cache_plugin(); + } + if ($cache && $cache->cache_get('results')) { + vpr('Used cached results'); + } + else { + $items = array(); + if ($query) { + $replacements = module_invoke_all('views_query_substitutions', $this); + $query = str_replace(array_keys($replacements), $replacements, $query); + $count_query = 'SELECT COUNT(*) FROM (' . str_replace(array_keys($replacements), $replacements, $count_query) . ') count_alias'; + + if (is_array($args)) { + foreach ($args as $id => $arg) { + $args[$id] = str_replace(array_keys($replacements), $replacements, $arg); + } + } + + // Allow for a view to query an external database. + if (isset($this->base_database)) { + db_set_active($this->base_database); + $external = TRUE; + } + + $start = views_microtime(); + if (!empty($this->pager['items_per_page'])) { + // We no longer use pager_query() here because pager_query() does not + // support an offset. This is fine as we don't actually need pager + // query; we've already been doing most of what it does, and we + // just need to do a little more playing with globals. + if (!empty($this->pager['use_pager']) || !empty($this->get_total_rows)) { + $this->total_rows = db_result(db_query($count_query, $args)) - $this->pager['offset']; + } + + if (!empty($this->pager['use_pager'])) { + // dump information about what we already know into the globals + global $pager_page_array, $pager_total, $pager_total_items; + // total rows in query + $pager_total_items[$this->pager['element']] = $this->total_rows; + // total pages + $pager_total[$this->pager['element']] = ceil($pager_total_items[$this->pager['element']] / $this->pager['items_per_page']); + + // What page was requested: + $pager_page_array = isset($_GET['page']) ? explode(',', $_GET['page']) : array(); + + // If the requested page was within range. $this->pager['current_page'] + // defaults to 0 so we don't need to set it in an out-of-range condition. + if (!empty($pager_page_array[$this->pager['element']])) { + $page = intval($pager_page_array[$this->pager['element']]); + if ($page > 0 && $page < $pager_total[$this->pager['element']]) { + $this->pager['current_page'] = $page; + } + } + $pager_page_array[$this->pager['element']] = $this->pager['current_page']; + } + + $offset = $this->pager['current_page'] * $this->pager['items_per_page'] + $this->pager['offset']; + $result = db_query_range($query, $args, $offset, $this->pager['items_per_page']); + + } + else { + $result = db_query($query, $args); + } + + $this->result = array(); + while ($item = db_fetch_object($result)) { + $this->result[] = $item; + } + if (!empty($external)) { + db_set_active(); + } + $this->execute_time = views_microtime() - $start; + } + if ($cache) { + $cache->cache_set('results'); + } + } + + $this->executed = TRUE; + } + + /** + * Render this view for display. + */ + function render($display_id = NULL) { + $this->execute($display_id); + + // Check to see if the build failed. + if (!empty($this->build_info['fail'])) { + return; + } + + init_theme(); + + $start = views_microtime(); + if (!empty($this->live_preview) && variable_get('views_show_additional_queries', FALSE)) { + $this->start_query_capture(); + } + + // Check for already-cached output. + if (!empty($this->live_preview)) { + $cache = FALSE; + } + else { + $cache = $this->display_handler->get_cache_plugin(); + } + if ($cache && $cache->cache_get('output')) { + vpr('Used cached output'); + } + else { + if ($cache) { + $cache->cache_start(); + } + + // Initialize the style plugin. + $this->init_style(); + + $this->style_plugin->pre_render($this->result); + + // Let modules modify the view just prior to executing it. + foreach (module_implements('views_pre_render') as $module) { + $function = $module . '_views_pre_render'; + $function($this); + } + + // Let the theme play too, because pre render is a very themey thing. + $function = $GLOBALS['theme'] . '_views_pre_render'; + if (function_exists($function)) { + $function($this, $this->display_handler->output, $cache); + } + + // Give field handlers the opportunity to perform additional queries + // using the entire resultset prior to rendering. + if ($this->style_plugin->uses_fields()) { + foreach ($this->field as $id => $handler) { + if (!empty($this->field[$id])) { + $this->field[$id]->pre_render($this->result); + } + } + } + $this->display_handler->output = $this->display_handler->render(); + if ($cache) { + $cache->cache_set('output'); + } + } + + if ($cache) { + $cache->post_render($this->display_handler->output); + } + + // Let modules modify the view output after it is rendered. + foreach (module_implements('views_post_render') as $module) { + $function = $module . '_views_post_render'; + $function($this, $this->display_handler->output, $cache); + } + + // Let the theme play too, because post render is a very themey thing. + $function = $GLOBALS['theme'] . '_views_post_render'; + if (function_exists($function)) { + $function($this, $this->display_handler->output, $cache); + } + + if (!empty($this->live_preview) && variable_get('views_show_additional_queries', FALSE)) { + $this->end_query_capture(); + } + $this->render_time = views_microtime() - $start; + + return $this->display_handler->output; + } + + /** + * Render a specific field via the field ID and the row #. + */ + function render_field($field, $row) { + if (isset($this->field[$field]) && isset($this->result[$row])) { + return $this->field[$field]->advanced_render($this->result[$row]); + } + } + + /** + * Execute the given display, with the given arguments. + * To be called externally by whatever mechanism invokes the view, + * such as a page callback, hook_block, etc. + * + * This function should NOT be used by anything external as this + * returns data in the format specified by the display. It can also + * have other side effects that are only intended for the 'proper' + * use of the display, such as setting page titles and breadcrumbs. + * + * If you simply want to view the display, use view::preview() instead. + */ + function execute_display($display_id = NULL, $args = array()) { + if (empty($this->current_display) || $this->current_display != $this->choose_display($display_id)) { + if (!$this->set_display($display_id)) { + return FALSE; + } + } + + $this->pre_execute($args); + + // Execute the view + $output = $this->display_handler->execute(); + + $this->post_execute(); + return $output; + } + + /** + * Preview the given display, with the given arguments. + * + * To be called externally, probably by an AJAX handler of some flavor. + * Can also be called when views are embedded, as this guarantees + * normalized output. + */ + function preview($display_id = NULL, $args = array()) { + if (empty($this->current_display) || $this->current_display != $display_id) { + if (!$this->set_display($display_id)) { + return FALSE; + } + } + + $this->preview = TRUE; + $this->pre_execute($args); + // Preview the view. + $output = $this->display_handler->preview(); + + $this->post_execute(); + return $output; + } + + /** + * Run attachments and let the display do what it needs to do prior + * to running. + */ + function pre_execute($args = array()) { + $this->old_view[] = views_get_current_view(); + views_set_current_view($this); + $display_id = $this->current_display; + + // Let modules modify the view just prior to executing it. + foreach (module_implements('views_pre_view') as $module) { + $function = $module . '_views_pre_view'; + $function($this, $display_id, $args); + } + + // Prepare the view with the information we have, but only if we were + // passed arguments, as they may have been set previously. + if ($args) { + $this->set_arguments($args); + } + +// $this->attach_displays(); + + // Allow the display handler to set up for execution + $this->display_handler->pre_execute(); + } + + /** + * Unset the current view, mostly. + */ + function post_execute() { + // unset current view so we can be properly destructed later on. + // Return the previous value in case we're an attachment. + + if ($this->old_view) { + $old_view = array_pop($this->old_view); + } + + views_set_current_view(isset($old_view) ? $old_view : FALSE); + } + + /** + * Run attachment displays for the view. + */ + function attach_displays() { + if (!empty($this->is_attachment)) { + return; + } + + if (!$this->display_handler->accept_attachments()) { + return; + } + + $this->is_attachment = TRUE; + // Give other displays an opportunity to attach to the view. + foreach ($this->display as $id => $display) { + if (!empty($this->display[$id]->handler)) { + $this->display[$id]->handler->attach_to($this->current_display); + } + } + $this->is_attachment = FALSE; + } + + /** + * Called to get hook_menu information from the view and the + * named display handler. + */ + function execute_hook_menu($display_id = NULL) { + // Prepare the view with the information we have. + + // This was probably already called, but it's good to be safe. + if (!$this->set_display($display_id)) { + return FALSE; + } + + // Execute the view + if (isset($this->display_handler)) { + return $this->display_handler->execute_hook_menu(); + } + } + + /** + * Called to get hook_block information from the view and the + * named display handler. + */ + function execute_hook_block($display_id = NULL) { + // Prepare the view with the information we have. + + // This was probably already called, but it's good to be safe. + if (!$this->set_display($display_id)) { + return FALSE; + } + + // Execute the view + if (isset($this->display_handler)) { + return $this->display_handler->execute_hook_block(); + } + } + + /** + * Determine if the given user has access to the view. Note that + * this sets the display handler if it hasn't been. + */ + function access($displays = NULL, $account = NULL) { + if (!isset($this->current_display)) { + $this->init_display(); + } + + if (!$account) { + $account = $GLOBALS['user']; + } + + // We can't use choose_display() here because that function + // calls this one. + $displays = (array)$displays; + foreach ($displays as $display_id) { + if (!empty($this->display[$display_id]->handler)) { + if ($this->display[$display_id]->handler->access($account)) { + return TRUE; + } + } + } + + return FALSE; + } + + /** + * Get the view's current title. This can change depending upon how it + * was built. + */ + function get_title() { + if (empty($this->display_handler)) { + if (!$this->set_display('default')) { + return FALSE; + } + } + + // During building, we might find a title override. If so, use it. + if (!empty($this->build_info['title'])) { + $title = $this->build_info['title']; + } + else { + $title = $this->display_handler->get_option('title'); + } + + return $title; + } + + /** + * Force the view to build a title. + */ + function build_title() { + $this->init_display(); + if (empty($this->built)) { + $this->init_query(); + } + $this->init_handlers(); + + $this->_build_arguments(); + } + + /** + * Get the URL for the current view. + * + * This URL will be adjusted for arguments. + */ + function get_url($args = NULL, $path = NULL) { + if (!isset($path)) { + $path = $this->get_path(); + } + if (!isset($args)) { + $args = $this->args; + } + // Don't bother working if there's nothing to do: + if (empty($path) || (empty($args) && strpos($path, '%') === FALSE)) { + return $path; + } + + $pieces = array(); + $arguments = isset($arguments) ? $arguments : $this->display_handler->get_option('arguments'); + $argument_keys = isset($arguments) ? array_keys($arguments) : array(); + $id = current($argument_keys); + foreach (explode('/', $path) as $piece) { + if ($piece != '%') { + $pieces[] = $piece; + } + else { + if (empty($args)) { + // Try to never put % in a url; use the wildcard instead. + if ($id && !empty($arguments[$id]['wildcard'])) { + $pieces[] = $arguments[$id]['wildcard']; + } + else { + $pieces[] = '*'; // gotta put something if there just isn't one. + } + + } + else { + $pieces[] = array_shift($args); + } + + if ($id) { + $id = next($argument_keys); + } + } + } + + if (!empty($args)) { + $pieces = array_merge($pieces, $args); + } + return implode('/', $pieces); + } + + /** + * Get the base path used for this view. + */ + function get_path() { + if (!empty($this->override_path)) { + return $this->override_path; + } + + if (empty($this->display_handler)) { + if (!$this->set_display('default')) { + return FALSE; + } + } + return $this->display_handler->get_path(); + } + + /** + * Get the breadcrumb used for this view. + * + * @param $set + * If true, use drupal_set_breadcrumb() to install the breadcrumb. + */ + function get_breadcrumb($set = FALSE) { + // Now that we've built the view, extract the breadcrumb. + $base = TRUE; + $breadcrumb = array(); + + if (!empty($this->build_info['breadcrumb'])) { + foreach ($this->build_info['breadcrumb'] as $path => $title) { + // Check to see if the frontpage is in the breadcrumb trail; if it + // is, we'll remove that from the actual breadcrumb later. + if ($path == variable_get('site_frontpage', 'node')) { + $base = FALSE; + $title = t('Home'); + } + if ($title) { + $breadcrumb[] = l($title, $path, array('html' => true)); + } + } + + if ($set) { + if ($base) { + $breadcrumb = array_merge(drupal_get_breadcrumb(), $breadcrumb); + } + drupal_set_breadcrumb($breadcrumb); + } + } + return $breadcrumb; + } + + /** + * Is this view cacheable? + */ + function is_cacheable() { + return $this->is_cacheable; + } + + /** + * Set up query capturing. + * + * db_query() stores the queries that it runs in global $queries, + * bit only if dev_query is set to true. In this case, we want + * to temporarily override that setting if it's not and we + * can do that without forcing a db rewrite by just manipulating + * $conf. This is kind of evil but it works. + */ + function start_query_capture() { + global $conf, $queries; + if (empty($conf['dev_query'])) { + $this->fix_dev_query = TRUE; + $conf['dev_query'] = TRUE; + } + + // Record the last query key used; anything already run isn't + // a query that we are interested in. + $this->last_query_key = NULL; + + if (!empty($queries)) { + $keys = array_keys($queries); + $this->last_query_key = array_pop($keys); + } + } + + /** + * Add the list of queries run during render to buildinfo. + * + * @see view::start_query_capture() + */ + function end_query_capture() { + global $conf, $queries; + if (!empty($this->fix_dev_query)) { + $conf['dev_query'] = FALSE; + } + + // make a copy of the array so we can manipulate it with array_splice. + $temp = $queries; + + // Scroll through the queries until we get to our last query key. + // Unset anything in our temp array. + if (isset($this->last_query_key)) { + while (list($id, $query) = each($queries)) { + if ($id == $this->last_query_key) { + break; + } + + unset($temp[$id]); + } + } + + $this->additional_queries = $temp; + } + + /** + * Load a view from the database based upon either vid or name. + * + * This is a static factory method that implements internal caching for + * view objects. + * + * @param $arg + * The name of the view or its internal view id (vid) + * @param $reset + * If TRUE, reset this entry in the load cache. + * @return A view object or NULL if it was not available. + */ + function &load($arg, $reset = FALSE) { + static $cache = array(); + + // We want a NULL value to return TRUE here, so we can't use isset() or empty(). + if (!array_key_exists($arg, $cache) || $reset) { + $where = (is_numeric($arg) ? "vid = %d" : "name = '%s'"); + $data = db_fetch_object(db_query("SELECT * FROM {views_view} WHERE $where", $arg)); + if (empty($data)) { + $cache[$arg] = NULL; + } + else { + $view = new view(); + $view->load_row($data); + $view->type = t('Normal'); + // Load all of our subtables. + foreach ($view->db_objects() as $key) { + $object_name = "views_$key"; + $result = db_query("SELECT * FROM {{$object_name}} WHERE vid = %d ORDER BY position", $view->vid); + + while ($data = db_fetch_object($result)) { + $object = new $object_name(FALSE); + $object->load_row($data); + + // Because it can get complicated with this much indirection, + // make a shortcut reference. + $location = &$view->$key; + + // If we have a basic id field, load the item onto the view based on + // this ID, otherwise push it on. + if (!empty($object->id)) { + $location[$object->id] = $object; + } + else { + $location[] = $object; + } + } + } + + $view->loaded = TRUE; + $cache[$arg] = $view; + } + } + + return $cache[$arg]; + } + + /** + * Static factory method to load a list of views based upon a $where clause. + * + * Although this method could be implemented to simply iterate over views::load(), + * that would be very slow. Buiding the views externally from unified queries is + * much faster. + */ + function load_views() { + $result = db_query("SELECT DISTINCT v.* FROM {views_view} v"); + $views = array(); + $vids = array(); + + // Load all the views. + while ($data = db_fetch_object($result)) { + $view = new view; + $view->load_row($data); + $view->loaded = TRUE; + $view->type = t('Normal'); + $views[$view->name] = $view; + $names[$view->vid] = $view->name; + } + + // Stop if we didn't get any views. + if (!$views) { + return array(); + } + + $vids = implode(', ', array_keys($names)); + // Now load all the subtables: + foreach (view::db_objects() as $key) { + $object_name = "views_$key"; + $result = db_query("SELECT * FROM {{$object_name}} WHERE vid IN ($vids) ORDER BY vid, position"); + + while ($data = db_fetch_object($result)) { + $object = new $object_name(FALSE); + $object->load_row($data); + + // Because it can get complicated with this much indirection, + // make a shortcut reference. + $location = &$views[$names[$object->vid]]->$key; + + // If we have a basic id field, load the item onto the view based on + // this ID, otherwise push it on. + if (!empty($object->id)) { + $location[$object->id] = $object; + } + else { + $location[] = $object; + } + } + } + return $views; + } + + /** + * Save the view to the database. If the view does not already exist, + * A vid will be assigned to the view and also returned from this function. + */ + function save() { + if ($this->vid == 'new') { + $this->vid = NULL; + } + + // If we have no vid or our vid is a string, this is a new view. + if (!empty($this->vid)) { + // remove existing table entries + foreach ($this->db_objects() as $key) { + db_query("DELETE from {views_" . $key . "} WHERE vid = %d", $this->vid); + } + } + + $this->save_row(!empty($this->vid) ? 'vid' : FALSE); + + // Save all of our subtables. + foreach ($this->db_objects() as $key) { + $this->_save_rows($key); + } + + cache_clear_all('views_urls', 'cache_views'); + cache_clear_all(); // clear the page cache as well. + } + + /** + * Save a row to the database for the given key, which is one of the + * keys from view::db_objects() + */ + function _save_rows($key) { + $count = 0; + foreach ($this->$key as $position => $object) { + $object->position = ++$count; + $object->vid = $this->vid; + $object->save_row(); + } + } + + /** + * Delete the view from the database. + */ + function delete() { + if (empty($this->vid)) { + return; + } + + db_query("DELETE FROM {views_view} WHERE vid = %d", $this->vid); + // Delete from all of our subtables as well. + foreach ($this->db_objects() as $key) { + db_query("DELETE from {views_" . $key . "} WHERE vid = %d", $this->vid); + } + + cache_clear_all('views_query:' . $this->name, 'cache_views'); + cache_clear_all(); // In Drupal 5.0 and later this clears the page cache only. + menu_rebuild(); // force a menu rebuild when a view is deleted. + } + + /** + * Export a view as PHP code. + */ + function export($indent = '') { + $this->init_display(); + $output = ''; + $output .= $this->export_row('view', $indent); + // Set the API version + $output .= $indent . '$view->api_version = 2' . ";\n"; + $output .= $indent . '$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */' . "\n"; + + foreach ($this->display as $id => $display) { + $output .= $indent . '$handler = $view->new_display(' . views_var_export($display->display_plugin, $indent) . ', ' . views_var_export($display->display_title, $indent) . ', \'' . $id . "');\n"; + if (empty($display->handler)) { + // @todo -- probably need a method of exporting broken displays as + // they may simply be broken because a module is not installed. That + // does not invalidate the display. + continue; + } + + foreach ($display->handler->option_definition() as $option => $definition) { + // Special handling for some items + switch ($option) { + case 'defaults': + // skip these + break; + default: + if (!$display->handler->is_defaulted($option)) { + $value = $display->handler->get_option($option); + if ($id == 'default') { + $default = isset($definition['default']) ? $definition['default'] : NULL; + } + else { + $default = $this->display['default']->handler->get_option($option); + } + + if ($value !== $default) { + $output .= $indent . '$handler->override_option(\'' . $option . '\', ' . views_var_export($value, $indent) . ");\n"; + } + } + } + } + } + + return $output; + } + + /** + * Make a copy of this view that has been sanitized of all database IDs + * and handlers and other stuff. + * + * I'd call this clone() but it's reserved. + */ + function copy() { + $code = $this->export(); + eval($code); + return $view; + } + + /** + * Safely clone a view. + * + * Because views are complicated objects within objects, and PHP loves to + * do references to everything, if a View is not properly and safely + * cloned it will still have references to the original view, and can + * actually cause the original view to point to objects in the cloned + * view. This gets ugly fast. + * + * This will completely wipe a view clean so it can be considered fresh. + */ + function clone_view() { + $clone = version_compare(phpversion(), '5.0') < 0 ? $this : clone($this); + + $keys = array('current_display', 'display_handler', 'build_info', 'built', 'executed', 'attachment_before', 'attachment_after', 'field', 'argument', 'filter', 'sort', 'relationship', 'query', 'inited', 'style_plugin', 'plugin_name', 'exposed_data', 'exposed_input', 'many_to_one_tables'); + foreach ($keys as $key) { + if (isset($clone->$key)) { + unset($clone->$key); + } + } + $clone->built = $clone->executed = FALSE; + $clone->build_info = array(); + $clone->attachment_before = ''; + $clone->attachment_after = ''; + $clone->result = array(); + + // shallow cloning means that all the display objects + // *were not cloned*. We must clone them ourselves. + $displays = array(); + foreach ($clone->display as $id => $display) { + $displays[$id] = drupal_clone($display); + if (isset($displays[$id]->handler)) { + unset($displays[$id]->handler); + } + } + $clone->display = $displays; + + return $clone; + } + + /** + * Unset references so that a $view object may be properly garbage + * collected. + */ + function destroy() { + foreach (array_keys($this->display) as $display_id) { + if (isset($this->display[$display_id]->handler)) { + $this->display[$display_id]->handler->destroy(); + unset($this->display[$display_id]->handler); + } + + foreach (views_object_types() as $type => $info) { + if (isset($this->$type)) { + $handlers = &$this->$type; + foreach ($handlers as $id => $item) { + $handlers[$id]->destroy(); + } + unset($handlers); + } + } + + if (isset($this->style_plugin)) { + $this->style_plugin->destroy(); + unset($this->style_plugin); + } + + // Clear these to make sure the view can be processed/used again. + if (isset($this->display_handler)) { + unset($this->display_handler); + } + + if (isset($this->current_display)) { + unset($this->current_display); + } + + if (isset($this->query)) { + unset($this->query); + } + } + } + + /** + * Make sure the view is completely valid. + * + * @return + * TRUE if the view is valid; an array of error strings if it is not. + */ + function validate() { + $this->init_display(); + + $errors = array(); + + foreach ($this->display as $id => $display) { + if ($display->handler) { + if (!empty($display->deleted)) { + continue; + } + + $result = $this->display[$id]->handler->validate(); + if (!empty($result) && is_array($result)) { + $errors = array_merge($errors, $result); + } + } + } + + return $errors ? $errors : TRUE; + } +} + +/** + * Base class for views' database objects. + */ +class views_db_object { + /** + * Initialize this object, setting values from schema defaults. + * + * @param $init + * If an array, this is a set of values from db_fetch_object to + * load. Otherwse, if TRUE values will be filled in from schema + * defaults. + */ + function init($init = TRUE) { + if (is_array($init)) { + return $this->load_row($init); + } + + if (!$init) { + return; + } + + $schema = drupal_get_schema($this->db_table); + + if (!$schema) { + return; + } + + // Go through our schema and build correlations. + foreach ($schema['fields'] as $field => $info) { + if ($info['type'] == 'serial') { + $this->$field = NULL; + } + if (!isset($this->$field)) { + if (!empty($info['serialize']) && isset($info['serialized default'])) { + $this->$field = unserialize($info['serialized default']); + } + else if (isset($info['default'])) { + $this->$field = $info['default']; + } + else { + $this->$field = ''; + } + } + } + } + + /** + * Write the row to the database. + * + * @param $update + * If true this will be an UPDATE query. Otherwise it will be an INSERT. + */ + function save_row($update = NULL) { + $schema = drupal_get_schema($this->db_table); + $fields = $defs = $values = $serials = array(); + + // Go through our schema and build correlations. + foreach ($schema['fields'] as $field => $info) { + // special case -- skip serial types if we are updating. + if ($info['type'] == 'serial') { + $serials[] = $field; + continue; + } + $fields[] = $field; + switch ($info['type']) { + case 'blob': + $defs[] = '%b'; + break; + case 'int': + $defs[] = '%d'; + break; + case 'float': + case 'numeric': + $defs[] = '%f'; + break; + default: + $defs[] = "'%s'"; + } + if (empty($info['serialize'])) { + $values[] = $this->$field; + } + else { + $values[] = serialize($this->$field); + } + } + $query = ''; + if (!$update) { + $query = "INSERT INTO {" . $this->db_table . "} (" . implode(', ', $fields) . ') VALUES (' . implode(', ', $defs) . ')'; + } + else { + $query = ''; + foreach ($fields as $id => $field) { + if ($query) { + $query .= ', '; + } + $query .= $field . ' = ' . $defs[$id]; + } + $query = "UPDATE {" . $this->db_table . "} SET " . $query . " WHERE $update = " . $this->$update; + } + db_query($query, $values); + + if ($serials && !$update) { + // get last insert ids and fill them in. + foreach ($serials as $field) { + $this->$field = db_last_insert_id($this->db_table, $field); + } + } + } + + /** + * Load the object with a row from the database. + * + * This method is separate from the constructor in order to give us + * more flexibility in terms of how the view object is built in different + * contexts. + * + * @param $data + * An object from db_fetch_object. It should contain all of the fields + * that are in the schema. + */ + function load_row($data) { + $schema = drupal_get_schema($this->db_table); + + // Go through our schema and build correlations. + foreach ($schema['fields'] as $field => $info) { + $this->$field = empty($info['serialize']) ? $data->$field : unserialize(db_decode_blob($data->$field)); + } + } + + /** + * Export a loaded row, such as an argument, field or the view itself to PHP code. + * + * @param $identifier + * The variable to assign the PHP code for this object to. + * @param $indent + * An optional indentation for prettifying nested code. + */ + function export_row($identifier = NULL, $indent = '') { + if (!$identifier) { + $identifier = $this->db_table; + } + $schema = drupal_get_schema($this->db_table); + + $output = $indent . '$' . $identifier . ' = new ' . get_class($this) . ";\n"; + // Go through our schema and build correlations. + foreach ($schema['fields'] as $field => $info) { + if (!empty($info['no export'])) { + continue; + } + if (!isset($this->$field)) { + if (isset($info['default'])) { + $this->$field = $info['default']; + } + else { + $this->$field = ''; + } + + // serialized defaults must be set as serialized. + if (isset($info['serialize'])) { + $this->$field = unserialize(db_decode_blob($this->$field)); + } + } + $value = $this->$field; + if ($info['type'] == 'int') { + $value = ($info['size'] == 'tiny') ? (bool) $value : (int) $value; + } + + $output .= $indent . '$' . $identifier . '->' . $field . ' = ' . views_var_export($value, $indent) . ";\n"; + } + return $output; + } + + /** + * Add a new display handler to the view, automatically creating an id. + * + * @param $type + * The plugin type from the views plugin data. Defaults to 'page'. + * @param $title + * The title of the display; optional, may be filled in from default. + * @param $id + * The id to use. + * @return + * The key to the display in $view->display, so that the new display + * can be easily located. + */ + function add_display($type = 'page', $title = NULL, $id = NULL) { + if (empty($type)) { + return FALSE; + } + + $plugin = views_fetch_plugin_data('display', $type); + if (empty($plugin)) { + $plugin['title'] = t('Broken'); + } + + // 'default' is singular and is unique, so just go with 'default' + // for it. For all others, start counting. + if (empty($id)) { + $id = ($type == 'default') ? $type : $type . '_1'; + $title = $plugin['title']; + + $count = 1; + + // Loop through IDs based upon our style plugin name until + // we find one that is unused. + while (!empty($this->display[$id])) { + $id = $type . '_' . ++$count; + if (empty($title)) { + $title = $plugin['title'] . ' ' . $count; + } + } + } + + // Create the new display object + $display = new views_display; + $display->options($type, $id, $title); + + // Add the new display object to the view. + $this->display[$id] = $display; + return $id; + } + + /** + * Create a new display and a display handler for it. + * @param $type + * The plugin type from the views plugin data. Defaults to 'page'. + * @param $title + * The title of the display; optional, may be filled in from default. + * @param $id + * The id to use. + * @return + * A reference to the new handler object. + */ + function &new_display($type = 'page', $title = NULL, $id = NULL) { + $id = $this->add_display($type, $title, $id); + + // Create a handler + $this->display[$id]->handler = views_get_plugin('display', $this->display[$id]->display_plugin); + if (empty($this->display[$id]->handler)) { + // provide a 'default' handler as an emergency. This won't work well but + // it will keep things from crashing. + $this->display[$id]->handler = views_get_plugin('display', 'default'); + } + + if (!empty($this->display[$id]->handler)) { + // Initialize the new display handler with data. + $this->display[$id]->handler->init($this, $this->display[$id]); + // If this is NOT the default display handler, let it know which is + if ($id != 'default') { + $this->display[$id]->handler->default_display = &$this->display['default']->handler; + } + } + + return $this->display[$id]->handler; + } + + /** + * Add an item with a handler to the view. + * + * These items may be fields, filters, sort criteria, or arguments. + */ + function add_item($display_id, $type, $table, $field, $options = array(), $id = NULL) { + $types = views_object_types(); + $this->set_display($display_id); + + $fields = $this->display[$display_id]->handler->get_option($types[$type]['plural']); + + if (empty($id)) { + $count = 0; + $id = $field; + while (!empty($fields[$id])) { + $id = $field . '_' . ++$count; + } + } + + $new_item = array( + 'id' => $id, + 'table' => $table, + 'field' => $field, + ) + $options; + + $handler = views_get_handler($table, $field, $type); + + $fields[$id] = $new_item; + $this->display[$display_id]->handler->set_option($types[$type]['plural'], $fields); + + return $id; + } + + /** + * Get an array of items for the current display. + */ + function get_items($type, $display_id = NULL) { + $this->set_display($display_id); + + if (!isset($display_id)) { + $display_id = $this->current_display; + } + + // Get info about the types so we can get the right data. + $types = views_object_types(); + return $this->display[$display_id]->handler->get_option($types[$type]['plural']); + } + + /** + * Get the configuration of an item (field/sort/filter/etc) on a given + * display. + */ + function get_item($display_id, $type, $id) { + // Get info about the types so we can get the right data. + $types = views_object_types(); + // Initialize the display + $this->set_display($display_id); + + // Get the existing configuration + $fields = $this->display[$display_id]->handler->get_option($types[$type]['plural']); + + return isset($fields[$id]) ? $fields[$id] : NULL; + } + + /** + * Get the configuration of an item (field/sort/filter/etc) on a given + * display. + * + * Pass in NULL for the $item to remove an item. + */ + function set_item($display_id, $type, $id, $item) { + // Get info about the types so we can get the right data. + $types = views_object_types(); + // Initialize the display + $this->set_display($display_id); + + // Get the existing configuration + $fields = $this->display[$display_id]->handler->get_option($types[$type]['plural']); + if (isset($item)) { + $fields[$id] = $item; + } + else { + unset($fields[$id]); + } + + // Store. + $this->display[$display_id]->handler->set_option($types[$type]['plural'], $fields); + } + + /** + * Set an option on an item. + * + * Use this only if you have just 1 or 2 options to set; if you have + * many, consider getting the item, adding the options and doing + * set_item yourself. + */ + function set_item_option($display_id, $type, $id, $option, $value) { + $item = $this->get_item($display_id, $type, $id); + $item[$option] = $value; + $this->set_item($display_id, $type, $id, $item); + } +} + +/** + * A display type in a view. + * + * This is just the database storage mechanism, and isn't terribly important + * to the behavior of the display at all. + */ +class views_display extends views_db_object { + var $db_table = 'views_display'; + function views_display($init = TRUE) { + parent::init($init); + } + + function options($type, $id, $title) { + $this->display_plugin = $type; + $this->id = $id; + $this->display_title = $title; + } +} + +/** + * Provide a list of views object types used in a view, with some information + * about them. + */ +function views_object_types() { + static $retval = NULL; + + // statically cache this so t() doesn't run a bajillion times. + if (!isset($retval)) { + $retval = array( + 'field' => array( + 'title' => t('Fields'), // title + 'ltitle' => t('fields'), // lowercase title for mid-sentence + 'stitle' => t('Field'), // singular title + 'lstitle' => t('field'), // singular lowercase title for mid sentence + 'plural' => 'fields', + ), + 'argument' => array( + 'title' => t('Arguments'), + 'ltitle' => t('arguments'), + 'stitle' => t('Argument'), + 'lstitle' => t('Argument'), + 'plural' => 'arguments', + ), + 'sort' => array( + 'title' => t('Sort criteria'), + 'ltitle' => t('sort criteria'), + 'stitle' => t('Sort criterion'), + 'lstitle' => t('sort criterion'), + 'plural' => 'sorts', + ), + 'filter' => array( + 'title' => t('Filters'), + 'ltitle' => t('filters'), + 'stitle' => t('Filter'), + 'lstitle' => t('filter'), + 'plural' => 'filters', + 'options' => 'views_ui_config_filters_form', + ), + 'relationship' => array( + 'title' => t('Relationships'), + 'ltitle' => t('relationships'), + 'stitle' => t('Relationship'), + 'lstitle' => t('Relationship'), + 'plural' => 'relationships', + ), + ); + } + + return $retval; +} + +/** + * @} + */ diff --git a/js/ajax.js b/js/ajax.js new file mode 100644 index 0000000000000000000000000000000000000000..92595d7f89b1f6fbec16f00f083a3b39093ddbb1 --- /dev/null +++ b/js/ajax.js @@ -0,0 +1,313 @@ +// $Id$ +/** + * @file ajax_admin.js + * + * Handles AJAX submission and response in Views UI. + */ + +Drupal.Views.Ajax = Drupal.Views.Ajax || {}; + +/** + * Handles the simple process of setting the ajax form area with new data. + */ +Drupal.Views.Ajax.setForm = function(title, output) { + $(Drupal.settings.views.ajax.title).html(title); + $(Drupal.settings.views.ajax.id).html(output); +} + +/** + * An ajax responder that accepts a packet of JSON data and acts appropriately. + * + * The following fields control behavior. + * - 'display': Display the associated data in the form area; bind the new + * form to 'url' if appropriate. The 'title' field may also be used. + * - 'add': This is a keyed array of HTML output to add via append. The key is + * the id to append via $(key).append(value) + * - 'replace': This is a keyed array of HTML output to add via replace. The key is + * the id to append via $(key).html(value) + * + */ +Drupal.Views.Ajax.ajaxResponse = function(data) { + $('a.views-throbbing').removeClass('views-throbbing'); + $('span.views-throbbing').remove(); + + if (data.debug) { + alert(data.debug); + } + + // See if we have any settings to extend. Do this first so that behaviors + // can access the new settings easily. + + if (Drupal.settings.viewsAjax) { + Drupal.settings.viewsAjax = {}; + } + if (data.js) { + $.extend(Drupal.settings, data.js); + } + + // Check the 'display' for data. + if (data.display) { + Drupal.Views.Ajax.setForm(data.title, data.display); + + // if a URL was supplied, bind the form to it. + if (data.url) { + var ajax_area = Drupal.settings.views.ajax.id; + var ajax_title = Drupal.settings.views.ajax.title; + + // Bind a click to the button to set the value for the button. + $('input[type=submit], button', ajax_area).unbind('click'); + $('input[type=submit], button', ajax_area).click(function() { + $('form', ajax_area).append(''); + $(this).after(' '); + }); + + // Bind forms to ajax submit. + $('form', ajax_area).unbind('submit'); // be safe here. + $('form', ajax_area).submit(function(arg) { + $(this).ajaxSubmit({ + url: data.url, + data: '', + type: 'POST', + success: Drupal.Views.Ajax.ajaxResponse, + error: function() { $('span.views-throbbing').remove(); alert(Drupal.t("An error occurred at @path.", {'@path': data.url})); }, + dataType: 'json' + }); + return false; + }); + } + + Drupal.attachBehaviors(ajax_area); + } + else { + // If no display, reset the form. + Drupal.Views.Ajax.setForm('', Drupal.settings.views.ajax.defaultForm); + //Enable the save button. + $('#edit-save').removeAttr('disabled'); + // Trigger an update for the live preview when we reach this state: + $('#views-ui-preview-form').trigger('submit'); + } + + // Go through the 'add' array and add any new content we're instructed to add. + if (data.add) { + for (id in data.add) { + var newContent = $(id).append(data.add[id]); + Drupal.attachBehaviors(newContent); + } + } + + // Go through the 'replace' array and replace any content we're instructed to. + if (data.replace) { + for (id in data.replace) { + $(id).html(data.replace[id]); + Drupal.attachBehaviors(id); + } + } + + // Go through and add any requested tabs + if (data.tab) { + for (id in data.tab) { + $('#views-tabset').addTab(id, data.tab[id]['title'], 0); + $(id).html(data.tab[id]['body']); + $(id).addClass('views-tab'); + Drupal.attachBehaviors(id); + + // This is kind of annoying, but we have to actually to find where the new + // tab is. + var instance = $.ui.tabs.instances[$('#views-tabset').get(0).UI_TABS_UUID]; + $('#views-tabset').clickTab(instance.$tabs.length); + } + } + + if (data.hilite) { + $('.hilited').removeClass('hilited'); + $(data.hilite).addClass('hilited'); + } + + if (data.changed) { + $('div.views-basic-info').addClass('changed'); + } +} + +/** + * An ajax responder that accepts a packet of JSON data and acts appropriately. + * This one specifically responds to the Views live preview area, so it's + * hardcoded and specialized. + */ +Drupal.Views.Ajax.previewResponse = function(data) { + $('a.views-throbbing').removeClass('views-throbbing'); + $('span.views-throbbing').remove(); + + if (data.debug) { + alert(data.debug); + } + + // See if we have any settings to extend. Do this first so that behaviors + // can access the new settings easily. + + // Clear any previous viewsAjax settings. + if (Drupal.settings.viewsAjax) { + Drupal.settings.viewsAjax = {}; + } + if (data.js) { + $.extend(Drupal.settings, data.js); + } + + // Check the 'display' for data. + if (data.display) { + var ajax_area = 'div#views-live-preview'; + $(ajax_area).html(data.display); + + var url = $(ajax_area, 'form').attr('action'); + + // if a URL was supplied, bind the form to it. + if (url) { + // Bind a click to the button to set the value for the button. + $('input[type=submit], button', ajax_area).unbind('click'); + $('input[type=submit], button', ajax_area).click(function() { + $('form', ajax_area).append(''); + $(this).after(' '); + }); + + // Bind forms to ajax submit. + $('form', ajax_area).unbind('submit'); // be safe here. + $('form', ajax_area).submit(function() { + $(this).ajaxSubmit({ + url: url, + data: '', + type: 'POST', + success: Drupal.Views.Ajax.previewResponse, + error: function() { $('span.views-throbbing').remove(); alert(Drupal.t("An error occurred at @path.", {'@path': url})); }, + dataType: 'json' + }); + return false; + }); + } + + Drupal.attachBehaviors(ajax_area); + } +} + +Drupal.Views.updatePreviewForm = function() { + var url = $(this).attr('action'); + url = url.replace('nojs', 'ajax'); + + $('input[type=submit], button', this).after(' '); + $(this).ajaxSubmit({ + url: url, + data: '', + type: 'POST', + success: Drupal.Views.Ajax.previewResponse, + error: function() { $('span.views-throbbing').remove(); alert(Drupal.t("An error occurred at @path.", {'@path': url})); }, + dataType: 'json' + }); + + return false; +} + +Drupal.Views.updatePreviewFilterForm = function() { + var url = $(this).attr('action'); + url = url.replace('nojs', 'ajax'); + + $('input[type=submit], button', this).after(' '); + $('input[name=q]', this).remove(); // remove 'q' for live preview. + $(this).ajaxSubmit({ + url: url, + data: '', + type: 'GET', + success: Drupal.Views.Ajax.previewResponse, + error: function() { $('span.views-throbbing').remove(); alert(Drupal.t("An error occurred at @path.", {'@path': url})); }, + dataType: 'json' + }); + + return false; +} + +Drupal.Views.updatePreviewLink = function() { + var url = $(this).attr('href'); + url = url.replace('nojs', 'ajax'); + if (url.substring(0, 18) != '/admin/build/views') { + return true; + } + + $(this).addClass('views-throbbing'); + $.ajax({ + url: url, + data: '', + type: 'POST', + success: Drupal.Views.Ajax.previewResponse, + error: function() { $(this).removeClass('views-throbbing'); alert(Drupal.t("An error occurred at @path.", {'@path': url})); }, + dataType: 'json' + }); + + return false; +} + +Drupal.behaviors.ViewsAjaxLinks = function() { + // Make specified links ajaxy. + $('a.views-ajax-link:not(.views-processed)').addClass('views-processed').click(function() { + // Translate the href on the link to the ajax href. That way this degrades + // into a nice, normal link. + var url = $(this).attr('href'); + url = url.replace('nojs', 'ajax'); + + // Turn on the hilite to indicate this is in use. + $(this).addClass('hilite'); + + // Disable the save button. + $('#edit-save').attr('disabled', 'true'); + + $(this).addClass('views-throbbing'); + $.ajax({ + type: "POST", + url: url, + data: '', + success: Drupal.Views.Ajax.ajaxResponse, + error: function() { $(this).removeClass('views-throbbing'); alert(Drupal.t("An error occurred at @path.", {'@path': url})); }, + dataType: 'json' + }); + + return false; + }); + + $('form.views-ajax-form:not(.views-processed)').addClass('views-processed').submit(function(arg) { + // Translate the href on the link to the ajax href. That way this degrades + // into a nice, normal link. + var url = $(this).attr('action'); + url = url.replace('nojs', 'ajax'); + +// $('input[@type=submit]', this).after(' '); + $(this).ajaxSubmit({ + url: url, + data: '', + type: 'POST', + success: Drupal.Views.Ajax.ajaxResponse, + error: function() { $('span.views-throbbing').remove(); alert(Drupal.t("An error occurred at @path.", {'@path': url})); }, + dataType: 'json' + }); + + return false; + }); + + // Bind the live preview to where it's supposed to go. + + $('form#views-ui-preview-form:not(.views-processed)') + .addClass('views-processed') + .submit(Drupal.Views.updatePreviewForm); + + $('div#views-live-preview form:not(.views-processed)') + .addClass('views-processed') + .submit(Drupal.Views.updatePreviewFilterForm); + + $('div#views-live-preview a:not(.views-processed)') + .addClass('views-processed') + .click(Drupal.Views.updatePreviewLink); +} + +/** + * Get rid of irritating tabledrag messages + */ +Drupal.theme.tableDragChangedWarning = function () { + return ' '; +} diff --git a/js/ajax_view.js b/js/ajax_view.js new file mode 100644 index 0000000000000000000000000000000000000000..e973dee08b8207af357df5bcbda77399312ed26a --- /dev/null +++ b/js/ajax_view.js @@ -0,0 +1,156 @@ +// $Id$ + +/** + * @file ajaxView.js + * + * Handles AJAX fetching of views, including filter submission and response. + */ + +Drupal.Views.Ajax = Drupal.Views.Ajax || {}; + +/** + * An ajax responder that accepts a packet of JSON data and acts appropriately. + * + * The following fields control behavior. + * - 'display': Display the associated data in the view area. + */ +Drupal.Views.Ajax.ajaxViewResponse = function(target, response) { + + if (response.debug) { + alert(response.debug); + } + + var $view = $(target); + + // Check the 'display' for data. + if (response.status && response.display) { + var $newView = $(response.display); + $view.replaceWith($newView); + $view = $newView; + Drupal.attachBehaviors($view.parent()); + } + + if (response.messages) { + // Show any messages (but first remove old ones, if there are any). + $view.find('.views-messages').remove().end().prepend(response.messages); + } +}; + +/** + * Ajax behavior for views. + */ +Drupal.behaviors.ViewsAjaxView = function() { + if (Drupal.settings && Drupal.settings.views && Drupal.settings.views.ajaxViews) { + var ajax_path = Drupal.settings.views.ajax_path; + // If there are multiple views this might've ended up showing up multiple times. + if (ajax_path.constructor.toString().indexOf("Array") != -1) { + ajax_path = ajax_path[0]; + } + $.each(Drupal.settings.views.ajaxViews, function(i, settings) { + var view = '.view-dom-id-' + settings.view_dom_id; + if (!$(view).size()) { + // Backward compatibility: if 'views-view.tpl.php' is old and doesn't + // contain the 'view-dom-id-#' class, we fall back to the old way of + // locating the view: + view = '.view-id-' + settings.view_name + '.view-display-id-' + settings.view_display_id; + } + + + // Process exposed filter forms. + $('form#views-exposed-form-' + settings.view_name.replace(/_/g, '-') + '-' + settings.view_display_id.replace(/_/g, '-')) + .filter(':not(.views-processed)') + .each(function () { + // remove 'q' from the form; it's there for clean URLs + // so that it submits to the right place with regular submit + // but this method is submitting elsewhere. + $('input[name=q]', this).remove(); + var form = this; + // ajaxSubmit doesn't accept a data argument, so we have to + // pass additional fields this way. + $.each(settings, function(key, setting) { + $(form).append(''); + }); + }) + .addClass('views-processed') + .submit(function () { + $('input[type=submit], button', this).after(' '); + var object = this; + $(this).ajaxSubmit({ + url: ajax_path, + type: 'GET', + success: function(response) { + // Call all callbacks. + if (response.__callbacks) { + $.each(response.__callbacks, function(i, callback) { + eval(callback)(view, response); + }); + $('.views-throbbing', object).remove(); + } + }, + error: function() { alert(Drupal.t("An error occurred at @path.", {'@path': ajax_path})); $('.views-throbbing', object).remove(); }, + dataType: 'json' + }); + + return false; + }); + + $(view).filter(':not(.views-processed)') + // Don't attach to nested views. Doing so would attach multiple behaviors + // to a given element. + .filter(function() { + // If there is at least one parent with a view class, this view + // is nested (e.g., an attachment). Bail. + return !$(this).parents('.view').size(); + }) + .each(function() { + // Set a reference that will work in subsequent calls. + var target = this; + $(this) + .addClass('views-processed') + // Process pager, tablesort, and attachment summary links. + .find('ul.pager > li > a, th.views-field a, .attachment .views-summary a') + .each(function () { + var viewData = {}; + // Construct an object using the settings defaults and then overriding + // with data specific to the link. + $.extend( + viewData, + settings, + Drupal.Views.parseQueryString($(this).attr('href')), + // Extract argument data from the URL. + Drupal.Views.parseViewArgs($(this).attr('href'), settings.view_base_path) + ); + $(this).click(function () { + $(this).addClass('views-throbbing'); + $.ajax({ + url: ajax_path, + type: 'GET', + data: viewData, + success: function(response) { + $(this).removeClass('views-throbbing'); + // Scroll to the top of the view. This will allow users + // to browse newly loaded content after e.g. clicking a pager + // link. + var offset = $(target).offset(); + // Only scroll upward + if (offset.top - 10 < $(window).scrollTop()) { + $('html,body').animate({scrollTop: (offset.top - 10)}, 500); + } + // Call all callbacks. + if (response.__callbacks) { + $.each(response.__callbacks, function(i, callback) { + eval(callback)(target, response); + }); + } + }, + error: function() { $(this).removeClass('views-throbbing'); alert(Drupal.t("An error occurred at @path.", {'@path': ajax_path})); }, + dataType: 'json' + }); + + return false; + }); + }); // .each function () { + }); // $view.filter().each + }); // .each Drupal.settings.views.ajaxViews + } // if +}; diff --git a/js/base.js b/js/base.js new file mode 100644 index 0000000000000000000000000000000000000000..2b7f32c7f22ba889d7563050498415cc6eb0b5cb --- /dev/null +++ b/js/base.js @@ -0,0 +1,123 @@ +// $Id$ +/** + * @file base.js + * + * Some basic behaviors and utility functions for Views. + */ + +Drupal.Views = {}; + +/** + * jQuery UI tabs, Views integration component + */ +Drupal.behaviors.viewsTabs = function (context) { + if ($.ui && $.ui.tabs) { + $('#views-tabset:not(.views-processed)').addClass('views-processed').tabs({ + selectedClass: 'active' + }); + } + + $('a.views-remove-link') + .addClass('views-processed') + .click(function() { + var id = $(this).attr('id').replace('views-remove-link-', ''); + $('#views-row-' + id).hide(); + $('#views-removed-' + id).attr('checked', true); + return false; + }); +} + +/** + * For IE, attach some javascript so that our hovers do what they're supposed + * to do. + */ +Drupal.behaviors.viewsHoverlinks = function() { + if ($.browser.msie) { + // If IE, attach a hover event so we can see our admin links. + $("div.view:not(.views-hover-processed)").addClass('views-hover-processed').hover( + function() { + $('div.views-hide', this).addClass("views-hide-hover"); return true; + }, + function(){ + $('div.views-hide', this).removeClass("views-hide-hover"); return true; + } + ); + $("div.views-admin-links:not(.views-hover-processed)") + .addClass('views-hover-processed') + .hover( + function() { + $(this).addClass("views-admin-links-hover"); return true; + }, + function(){ + $(this).removeClass("views-admin-links-hover"); return true; + } + ); + } +} + +/** + * Helper function to parse a querystring. + */ +Drupal.Views.parseQueryString = function (query) { + var args = {}; + var pos = query.indexOf('?'); + if (pos != -1) { + query = query.substring(pos + 1); + } + var pairs = query.split('&'); + for(var i in pairs) { + var pair = pairs[i].split('='); + // Ignore the 'q' path argument, if present. + if (pair[0] != 'q' && pair[1]) { + args[pair[0]] = decodeURIComponent(pair[1].replace(/\+/g, ' ')); + } + } + return args; +}; + +/** + * Helper function to return a view's arguments based on a path. + */ +Drupal.Views.parseViewArgs = function (href, viewPath) { + var returnObj = {}; + var path = Drupal.Views.getPath(href); + // Ensure we have a correct path. + if (viewPath && path.substring(0, viewPath.length + 1) == viewPath + '/') { + var args = decodeURIComponent(path.substring(viewPath.length + 1, path.length)); + returnObj.view_args = args; + returnObj.view_path = path; + } + return returnObj; +}; + +/** + * Strip off the protocol plus domain from an href. + */ +Drupal.Views.pathPortion = function (href) { + // Remove e.g. http://example.com if present. + var protocol = window.location.protocol; + if (href.substring(0, protocol.length) == protocol) { + // 2 is the length of the '//' that normally follows the protocol + href = href.substring(href.indexOf('/', protocol.length + 2)); + } + return href; +}; + +/** + * Return the Drupal path portion of an href. + */ +Drupal.Views.getPath = function (href) { + href = Drupal.Views.pathPortion(href); + href = href.substring(Drupal.settings.basePath.length, href.length); + // 3 is the length of the '?q=' added to the url without clean urls. + if (href.substring(0, 3) == '?q=') { + href = href.substring(3, href.length); + } + var chars = ['#', '?', '&']; + for (i in chars) { + if (href.indexOf(chars[i]) > -1) { + href = href.substr(0, href.indexOf(chars[i])); + } + } + return href; +}; diff --git a/js/dependent.js b/js/dependent.js new file mode 100644 index 0000000000000000000000000000000000000000..d021eefa7a2ed0a7f7524309a773719a5e78f8e7 --- /dev/null +++ b/js/dependent.js @@ -0,0 +1,191 @@ +// $Id$ +/** + * @file dependent.js + * + * Written by dmitrig01 (Dmitri Gaskin) for Views; this provides dependent + * visibility for form items in Views' ajax forms. + * + * To your $form item definition add: + * - '#process' => array('views_process_dependency'), + * - Add '#dependency' => array('id-of-form-item' => array(list, of, values, that, + make, this, item, show), + * + * Special considerations: + * - radios are harder. Because Drupal doesn't give radio groups individual ids, + * use 'radio:name-of-radio' + * + * - Checkboxes don't have their own id, so you need to add one in a div + * around the checkboxes via #prefix and #suffix. You actually need to add TWO + * divs because it's the parent that gets hidden. Also be sure to retain the + * 'expand_checkboxes' in the #process array, because the views process will + * override it. + */ + +Drupal.Views = Drupal.Views || {}; + +Drupal.Views.dependent = { bindings: {}, activeBindings: {}, activeTriggers: [] }; + +Drupal.Views.dependent.inArray = function(array, search_term) { + var i = array.length; + if (i > 0) { + do { + if (array[i] == search_term) { + return true; + } + } while (i--); + } + return false; +} + + +Drupal.Views.dependent.autoAttach = function() { + // Clear active bindings and triggers. + for (i in Drupal.Views.dependent.activeTriggers) { + jQuery(Drupal.Views.dependent.activeTriggers[i]).unbind('change'); + } + Drupal.Views.dependent.activeTriggers = []; + Drupal.Views.dependent.activeBindings = {}; + Drupal.Views.dependent.bindings = {}; + + if (!Drupal.settings.viewsAjax) { + return; + } + + // Iterate through all relationships + for (id in Drupal.settings.viewsAjax.formRelationships) { + + // Drupal.Views.dependent.activeBindings[id] is a boolean, + // whether the binding is active or not. Defaults to no. + Drupal.Views.dependent.activeBindings[id] = 0; + // Iterate through all possible values + for(bind_id in Drupal.settings.viewsAjax.formRelationships[id].values) { + // This creates a backward relationship. The bind_id is the ID + // of the element which needs to change in order for the id to hide or become shown. + // The id is the ID of the item which will be conditionally hidden or shown. + // Here we're setting the bindings for the bind + // id to be an empty array if it doesn't already have bindings to it + if (!Drupal.Views.dependent.bindings[bind_id]) { + Drupal.Views.dependent.bindings[bind_id] = []; + } + // Add this ID + Drupal.Views.dependent.bindings[bind_id].push(id); + // Big long if statement. + // Drupal.settings.viewsAjax.formRelationships[id].values[bind_id] holds the possible values + + if (bind_id.substring(0, 6) == 'radio:') { + var trigger_id = "input[name='" + bind_id.substring(6) + "']"; + } + else { + var trigger_id = '#' + bind_id; + } + + Drupal.Views.dependent.activeTriggers.push(trigger_id); + + if (jQuery(trigger_id).attr('type') == 'checkbox') { + $(trigger_id).parent().addClass('hidden-options'); + } + + var getValue = function(item, trigger) { + if (item.substring(0, 6) == 'radio:') { + var val = jQuery(trigger + ':checked').val(); + } + else { + switch (jQuery(trigger).attr('type')) { + case 'checkbox': + var val = jQuery(trigger).attr('checked') || 0; + + if (val) { + $(trigger).parent().removeClass('hidden-options').addClass('expanded-options'); + } + else { + $(trigger).parent().removeClass('expanded-options').addClass('hidden-options'); + } + + break; + default: + var val = jQuery(trigger).val(); + } + } + return val; + } + + var setChangeTrigger = function(trigger_id, bind_id) { + // Triggered when change() is clicked. + var changeTrigger = function() { + var val = getValue(bind_id, trigger_id); + + for (i in Drupal.Views.dependent.bindings[bind_id]) { + var id = Drupal.Views.dependent.bindings[bind_id][i]; + + // Fix numerous errors + if (typeof id != 'string') { + continue; + } + + // This bit had to be rewritten a bit because two properties on the + // same set caused the counter to go up and up and up. + if (!Drupal.Views.dependent.activeBindings[id]) { + Drupal.Views.dependent.activeBindings[id] = {}; + } + + if (Drupal.Views.dependent.inArray(Drupal.settings.viewsAjax.formRelationships[id].values[bind_id], val)) { + Drupal.Views.dependent.activeBindings[id][bind_id] = 'bind'; + } + else { + delete Drupal.Views.dependent.activeBindings[id][bind_id]; + } + + var len = 0; + for (i in Drupal.Views.dependent.activeBindings[id]) { + len++; + } + + var object = jQuery('#' + id + '-wrapper'); + if (!object.size()) { + object = jQuery('#' + id).parent(); + } + + if (Drupal.settings.viewsAjax.formRelationships[id].num <= len) { + // Show if the element if criteria is matched + object.show(0); + object.addClass('dependent-options'); + } + else { + // Otherwise hide + object.hide(0); + } + } + } + + jQuery(trigger_id).change(function() { + // Trigger the internal change function + // the attr('id') is used because closures are more confusing + changeTrigger(trigger_id, bind_id); + }); + // Trigger initial reaction + changeTrigger(trigger_id, bind_id); + } + setChangeTrigger(trigger_id, bind_id); + } + } +} + +Drupal.behaviors.viewsDependent = function (context) { + Drupal.Views.dependent.autoAttach(); + + // Really large sets of fields are too slow with the above method, so this + // is a sort of hacked one that's faster but much less flexible. + $("select.views-master-dependent:not(.views-processed)") + .addClass('views-processed') + .change(function() { + var val = $(this).val(); + if (val == 'all') { + $('.views-dependent-all').show(0); + } + else { + $('.views-dependent-all').hide(0); + $('.views-dependent-' + val).show(0); + } + }) + .trigger('change'); +} diff --git a/js/tabs.js b/js/tabs.js new file mode 100644 index 0000000000000000000000000000000000000000..a66a280fe58b8e3f558d33e34f30d6d9b0846f6f --- /dev/null +++ b/js/tabs.js @@ -0,0 +1,438 @@ +// $Id$ + +/** + * @file tabs.js + * jQuery UI Tabs (Tabs 3) + * + * This is nothing more than the pure jquery UI tabs implementation. + */ +(function($) { + + // if the UI scope is not availalable, add it + $.ui = $.ui || {}; + + $.fn.tabs = function(initial, options) { + if (initial && initial.constructor == Object) { // shift arguments + options = initial; + initial = null; + } + options = options || {}; + + // first get initial tab from options + initial = initial && initial.constructor == Number && --initial || 0; + + return this.each(function() { + new $.ui.tabs(this, $.extend(options, { initial: initial })); + }); + }; + + // chainable tabs methods + $.each(['add', 'remove', 'enable', 'disable', 'click', 'load'], function(i, method) { + $.fn[method + 'Tab'] = function() { + var args = arguments; + return this.each(function() { + var instance = $.ui.tabs.instances[this.UI_TABS_UUID]; + instance[method].apply(instance, args); + }); + }; + }); + $.fn.selectedTab = function(returnElement) { + var selected; + if (returnElement) { + + } else { + + } + return selected; + }; + + $.ui.tabs = function(el, options) { + + this.source = el; + + this.options = $.extend({ + + // basic setup + initial: 0, + event: 'click', + disabled: [], + // TODO bookmarkable: $.ajaxHistory ? true : false, + unselected: false, + toggle: options.unselected ? true : false, + + // Ajax + spinner: 'Loading…', + cache: false, + hashPrefix: 'tab-', + + // animations + /*fxFade: null, + fxSlide: null, + fxShow: null, + fxHide: null,*/ + fxSpeed: 'normal', + /*fxShowSpeed: null, + fxHideSpeed: null,*/ + + // callbacks + add: function() {}, + remove: function() {}, + enable: function() {}, + disable: function() {}, + click: function() {}, + hide: function() {}, + show: function() {}, + load: function() {}, + + // CSS classes + navClass: 'ui-tabs-nav', + selectedClass: 'ui-tabs-selected', + disabledClass: 'ui-tabs-disabled', + containerClass: 'ui-tabs-container', + hideClass: 'ui-tabs-hide', + loadingClass: 'ui-tabs-loading' + + }, options); + + this.tabify(true); + + // save instance for later + var uuid = 'instance-' + $.ui.tabs.prototype.count++; + $.ui.tabs.instances[uuid] = this; + this.source['UI_TABS_UUID'] = uuid; + + }; + + // static + $.ui.tabs.instances = {}; + + $.extend($.ui.tabs.prototype, { + animating: false, + count: 0, + tabify: function(init) { + + this.$tabs = $('a:first-child', this.source); + this.$containers = $([]); + + var self = this, o = this.options; + + this.$tabs.each(function(i, a) { + // inline tab + if (a.hash && a.hash.replace('#', '')) { // safari 2 reports '#' for an empty hash + self.$containers = self.$containers.add(a.hash); + } + // remote tab + else { + var id = a.title && a.title.replace(/\s/g, '_') || o.hashPrefix + (self.count + 1) + '-' + (i + 1), url = a.href; + a.href = '#' + id; + a.url = url; + self.$containers = self.$containers.add( + $('#' + id)[0] || $('
') + .insertAfter( self.$containers[i - 1] || self.source ) + ); + } + }); + + if (init) { + + // Try to retrieve initial tab from fragment identifier in url if present, + // otherwise try to find selected class attribute on
  • . + this.$tabs.each(function(i, a) { + if (location.hash) { + if (a.hash == location.hash) { + o.initial = i; + // prevent page scroll to fragment + //if (($.browser.msie || $.browser.opera) && !o.remote) { + if ($.browser.msie || $.browser.opera) { + var $toShow = $(location.hash), toShowId = $toShow.attr('id'); + $toShow.attr('id', ''); + setTimeout(function() { + $toShow.attr('id', toShowId); // restore id + }, 500); + } + scrollTo(0, 0); + return false; // break + } + } else if ( $(a).parents('li:eq(0)').is('li.' + o.selectedClass) ) { + o.initial = i; + return false; // break + } + }); + + // attach necessary classes for styling if not present + $(this.source).is('.' + o.navClass) || $(this.source).addClass(o.navClass); + this.$containers.each(function() { + var $this = $(this); + $this.is('.' + o.containerClass) || $this.addClass(o.containerClass); + }); + + // highlight tab accordingly + var $lis = $('li', this.source); + this.$containers.addClass(o.hideClass); + $lis.removeClass(o.selectedClass); + if (!o.unselected) { + this.$containers.slice(o.initial, o.initial + 1).show(); + $lis.slice(o.initial, o.initial + 1).addClass(o.selectedClass); + } + + // trigger load of initial tab is remote tab + if (this.$tabs[o.initial].url) { + this.load(o.initial + 1, this.$tabs[o.initial].url); + if (o.cache) { + this.$tabs[o.initial].url = null; // if loaded once do not load them again + } + } + + // disabled tabs + for (var i = 0, position; position = o.disabled[i]; i++) { + this.disable(position); + } + + } + + // setup animations + var showAnim = {}, hideAnim = {}, showSpeed = o.fxShowSpeed || o.fxSpeed, + hideSpeed = o.fxHideSpeed || o.fxSpeed; + if (o.fxSlide || o.fxFade) { + if (o.fxSlide) { + showAnim['height'] = 'show'; + hideAnim['height'] = 'hide'; + } + if (o.fxFade) { + showAnim['opacity'] = 'show'; + hideAnim['opacity'] = 'hide'; + } + } else { + if (o.fxShow) { + showAnim = o.fxShow; + } else { // use some kind of animation to prevent browser scrolling to the tab + showAnim['min-width'] = 0; // avoid opacity, causes flicker in Firefox + showSpeed = 1; // as little as 1 is sufficient + } + if (o.fxHide) { + hideAnim = o.fxHide; + } else { // use some kind of animation to prevent browser scrolling to the tab + hideAnim['min-width'] = 0; // avoid opacity, causes flicker in Firefox + hideSpeed = 1; // as little as 1 is sufficient + } + } + + // callbacks + var click = o.click, hide = o.hide, show = o.show; + + // reset some styles to maintain print style sheets etc. + var resetCSS = { display: '', overflow: '', height: '' }; + if (!$.browser.msie) { // not in IE to prevent ClearType font issue + resetCSS['opacity'] = ''; + } + + // hide a tab, animation prevents browser scrolling to fragment + function hideTab(clicked, $hide, $show) { + $hide.animate(hideAnim, hideSpeed, function() { // + $hide.addClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc. + hide(clicked, $show, $hide[0]); + if ($show) { + showTab(clicked, $hide, $show); + } + }); + } + + // show a tab, animation prevents browser scrolling to fragment + function showTab(clicked, $hide, $show) { + // show next tab + if (!(o.fxSlide || o.fxFade || o.fxShow)) { + $show.css('display', 'block'); // prevent occasionally occuring flicker in Firefox cause by gap between showing and hiding the tab containers + } + $show.animate(showAnim, showSpeed, function() { + $show.removeClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc. + if ($.browser.msie) { + $hide[0].style.filter = ''; + $show[0].style.filter = ''; + } + show(clicked, $show[0], $hide[0]); + self.animating = false; + }); + + } + + // switch a tab + function switchTab(clicked, $hide, $show) { + /*if (o.bookmarkable && trueClick) { // add to history only if true click occured, not a triggered click + $.ajaxHistory.update(clicked.hash); + }*/ + $(clicked).parents('li:eq(0)').addClass(o.selectedClass) + .siblings().removeClass(o.selectedClass); + hideTab(clicked, $hide, $show); + } + + // tab click handler + function tabClick(e) { + + //var trueClick = e.clientX; // add to history only if true click occured, not a triggered click + var $li = $(this).parents('li:eq(0)'), $hide = self.$containers.filter(':visible'), $show = $(this.hash); + + // if tab may be closed + if (o.toggle && !$li.is('.' + o.disabledClass) && !self.animating) { + if ($li.is('.' + o.selectedClass)) { + $li.removeClass(o.selectedClass); + hideTab(this, $hide); + this.blur(); + return false; + } else if (!$hide.length) { + $li.addClass(o.selectedClass); + showTab(this, $hide, $show); + this.blur(); + return false; + } + } + + // If tab is already selected or disabled, animation is still running or click callback + // returns false stop here. + // Check if click handler returns false last so that it is not executed for a disabled tab! + if ($li.is('.' + o.selectedClass + ', .' + o.disabledClass) + || self.animating || click(this, $show[0], $hide[0]) === false) { + this.blur(); + return false; + } + + self.animating = true; + + // show new tab + if ($show.length) { + + // prevent scrollbar scrolling to 0 and than back in IE7, happens only if bookmarking/history is enabled + /*if ($.browser.msie && o.bookmarkable) { + var showId = this.hash.replace('#', ''); + $show.attr('id', ''); + setTimeout(function() { + $show.attr('id', showId); // restore id + }, 0); + }*/ + + if (this.url) { // remote tab + var a = this; + self.load(self.$tabs.index(this) + 1, this.url, function() { + switchTab(a, $hide, $show); + }); + if (o.cache) { + this.url = null; // if loaded once do not load them again + } + } else { + switchTab(this, $hide, $show); + } + + // Set scrollbar to saved position - need to use timeout with 0 to prevent browser scroll to target of hash + /*var scrollX = window.pageXOffset || document.documentElement && document.documentElement.scrollLeft || document.body.scrollLeft || 0; + var scrollY = window.pageYOffset || document.documentElement && document.documentElement.scrollTop || document.body.scrollTop || 0; + setTimeout(function() { + scrollTo(scrollX, scrollY); + }, 0);*/ + + } else { + throw Drupal.t('jQuery UI Tabs: Mismatching fragment identifier.'); + } + + this.blur(); // prevent IE from keeping other link focussed when using the back button + + //return o.bookmarkable && !!trueClick; // convert trueClick == undefined to Boolean required in IE + return false; + + } + + // attach click event, avoid duplicates from former tabifying + this.$tabs.unbind(o.event, tabClick).bind(o.event, tabClick); + + }, + add: function(url, text, position) { + if (url && text) { + var o = this.options; + position = position || this.$tabs.length; // append by default + if (position >= this.$tabs.length) { + var method = 'insertAfter'; + position = this.$tabs.length; + } else { + var method = 'insertBefore'; + } + if (url.indexOf('#') == 0) { // ajax container is created by tabify automatically + var $container = $(url); + // try to find an existing element before creating a new one + ($container.length && $container || $('
    ')) + [method](this.$containers[position - 1]); + } + $('
  • ' + text + '
  • ') + [method](this.$tabs.slice(position - 1, position).parents('li:eq(0)')); + this.tabify(); + o.add(this.$tabs[position - 1], this.$containers[position - 1]); // callback + } else { + throw Drupal.t('jQuery UI Tabs: Not enough arguments to add tab.'); + } + }, + remove: function(position) { + if (position && position.constructor == Number) { + this.$tabs.slice(position - 1, position).parents('li:eq(0)').remove(); + this.$containers.slice(position - 1, position).remove(); + this.tabify(); + } + this.options.remove(); // callback + }, + enable: function(position) { + var $li = this.$tabs.slice(position - 1, position).parents('li:eq(0)'), o = this.options; + $li.removeClass(o.disabledClass); + if ($.browser.safari) { // fix disappearing tab after enabling in Safari... TODO check Safari 3 + $li.animate({ opacity: 1 }, 1, function() { + $li.css({ opacity: '' }); + }); + } + o.enable(this.$tabs[position - 1], this.$containers[position - 1]); // callback + }, + disable: function(position) { + var $li = this.$tabs.slice(position - 1, position).parents('li:eq(0)'), o = this.options; + if ($.browser.safari) { // fix opacity of tab after disabling in Safari... TODO check Safari 3 + $li.animate({ opacity: 0 }, 1, function() { + $li.css({ opacity: '' }); + }); + } + $li.addClass(this.options.disabledClass); + o.disable(this.$tabs[position - 1], this.$containers[position - 1]); // callback + }, + click: function(position) { + this.$tabs.slice(position - 1, position).trigger('click'); + }, + load: function(position, url, callback) { + var self = this, + o = this.options, + $a = this.$tabs.slice(position - 1, position).addClass(o.loadingClass), + $span = $('span', $a), + text = $span.html(); + + // shift arguments + if (url && url.constructor == Function) { + callback = url; + } + + // set new URL + if (url) { + $a[0].url = url; + } + + // load + if (o.spinner) { + $span.html('' + o.spinner + ''); + } + setTimeout(function() { // timeout is again required in IE, "wait" for id being restored + $($a[0].hash).load(url, function() { + if (o.spinner) { + $span.html(text); + } + $a.removeClass(o.loadingClass); + // This callback is needed because the switch has to take place after loading + // has completed. + if (callback && callback.constructor == Function) { + callback(); + } + o.load(self.$tabs[position - 1], self.$containers[position - 1]); // callback + }); + }, 0); + } + }); +})(jQuery); diff --git a/modules/aggregator.views.inc b/modules/aggregator.views.inc new file mode 100644 index 0000000000000000000000000000000000000000..d24076af8581599c66cae2aefd797b92cf99d4ce --- /dev/null +++ b/modules/aggregator.views.inc @@ -0,0 +1,385 @@ + 'iid', + 'title' => t('Aggregator item'), + 'help' => t("Aggregator items are imported from external RSS and Atom news feeds."), + ); + + // ---------------------------------------------------------------- + // Fields + + // title + $data['aggregator_item']['title'] = array( + 'title' => t('Title'), // The item it appears as on the UI, + 'help' => t('The title of the aggregator item.'), + // Information for displaying a title as a field + 'field' => array( + 'handler' => 'views_handler_field_aggregator_title_link', + 'extra' => array('link'), + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + // Information for accepting a title as a filter + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ); + + // link + $data['aggregator_item']['link'] = array( + 'title' => t('Link'), // The item it appears as on the UI, + 'help' => t('The link to the original source URL of the item.'), + 'field' => array( + 'handler' => 'views_handler_field_url', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + // Information for accepting a title as a filter + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ); + + // author + $data['aggregator_item']['author'] = array( + 'title' => t('Author'), // The item it appears as on the UI, + 'help' => t('The author of the original imported item.'), + // Information for displaying a title as a field + 'field' => array( + 'handler' => 'views_handler_field_xss', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + // Information for accepting a title as a filter + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + // feed body + $data['aggregator_item']['description'] = array( + 'title' => t('Body'), // The item it appears as on the UI, + 'help' => t('The actual content of the imported item.'), + // Information for displaying a title as a field + 'field' => array( + 'handler' => 'views_handler_field_xss', + 'click sortable' => FALSE, + ), + // Information for accepting a title as a filter + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ); + + // item timestamp + $data['aggregator_item']['timestamp'] = array( + 'title' => t('Timestamp'), // The item it appears as on the UI, + 'help' => t('The date the original feed item was posted. (With some feeds, this will be the date it was imported.)'), + // Information for displaying a title as a field + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + // Information for accepting a title as a filter + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_date', + ), + ); + + + // ---------------------------------------------------------------------- + // Aggregator feed table + + $data['aggregator_feed']['table']['group'] = t('Aggregator feed'); + + // Explain how this table joins to others. + $data['aggregator_feed']['table']['join'] = array( + 'aggregator_item' => array( + 'left_field' => 'fid', + 'field' => 'fid', + ), + ); + + // fid + $data['aggregator_feed']['fid'] = array( + 'title' => t('Feed ID'), + 'help' => t('The unique ID of the aggregator feed.'), // The help that appears on the UI, + // Information for displaying the fid + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + // Information for accepting a fid as an argument + 'argument' => array( + 'handler' => 'views_handler_argument_aggregator_fid', + 'name field' => 'title', // the field to display in the summary. + 'numeric' => TRUE, + ), + // Information for accepting a nid as a filter + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + // Information for sorting on a nid. + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // title + $data['aggregator_feed']['title'] = array( + 'title' => t('Title'), // The item it appears as on the UI, + 'help' => t('The title of the aggregator feed.'), + // Information for displaying a title as a field + 'field' => array( + 'handler' => 'views_handler_field_aggregator_title_link', + 'extra' => array('link'), + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + // Information for accepting a title as a filter + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ); + + // link + $data['aggregator_feed']['link'] = array( + 'title' => t('Link'), // The item it appears as on the UI, + 'help' => t('The link to the source URL of the feed.'), + // Information for displaying a title as a field + 'field' => array( + 'handler' => 'views_handler_field_url', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + // Information for accepting a title as a filter + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ); + + // feed last updated + $data['aggregator_feed']['checked'] = array( + 'title' => t('Last checked'), // The item it appears as on the UI, + 'help' => t('The date the feed was last checked for new content.'), + // Information for displaying a title as a field + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + // Information for accepting a title as a filter + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_date', + ), + ); + + // feed description + $data['aggregator_feed']['description'] = array( + 'title' => t('Description'), // The item it appears as on the UI, + 'help' => t('The description of the aggregator feed.'), + // Information for displaying a title as a field + 'field' => array( + 'handler' => 'views_handler_field_xss', + 'click sortable' => FALSE, + ), + // Information for accepting a title as a filter + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ); + + // feed last updated + $data['aggregator_feed']['modified'] = array( + 'title' => t('Last modified'), // The item it appears as on the UI, + 'help' => t('The date of the most recent new content onf the feed.'), + // Information for displaying a title as a field + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + // Information for accepting a title as a filter + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_date', + ), + ); + + // ---------------------------------------------------------------------- + // Aggregator category feed table + + $data['aggregator_category_feed']['table']['join'] = array( + 'aggregator_item' => array( + 'left_field' => 'fid', + 'field' => 'fid', + ), + ); + + // ---------------------------------------------------------------------- + // Aggregator category table + + $data['aggregator_category']['table']['group'] = t('Aggregator category'); + + $data['aggregator_category']['table']['join'] = array( + 'aggregator_item' => array( + 'left_table' => 'aggregator_category_feed', + 'left_field' => 'cid', + 'field' => 'cid', + ), + ); + + // cid + $data['aggregator_category']['cid'] = array( + 'title' => t('Category ID'), + 'help' => t('The unique ID of the aggregator category.'), + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'argument' => array( + 'handler' => 'views_handler_argument_aggregator_category_cid', + 'name field' => 'title', + 'numeric' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_aggregator_category_cid', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // title + $data['aggregator_category']['title'] = array( + 'title' => t('Category'), + 'help' => t('The title of the aggregator category.'), + 'field' => array( + 'handler' => 'views_handler_field_aggregator_category', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ); + + return $data; +} + +/** + * Implementation of hook_views_handlers() to register all of the basic handlers + * views uses. + */ +function aggregator_views_handlers() { + return array( + 'info' => array( + 'path' => drupal_get_path('module', 'views') . '/modules/aggregator', + ), + 'handlers' => array( + // field handlers + 'views_handler_field_aggregator_title_link' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_aggregator_category' => array( + 'parent' => 'views_handler_field', + ), + + // argument handlers + 'views_handler_argument_aggregator_fid' => array( + 'parent' => 'views_handler_argument_numeric', + ), + 'views_handler_argument_aggregator_category_cid' => array( + 'parent' => 'views_handler_argument_numeric', + ), + + // filter handlers + 'views_handler_filter_aggregator_category_cid' => array( + 'parent' => 'views_handler_filter_in_operator', + ), + ), + ); +} + + +/** + * Implementation of hook_views_plugins + */ +function aggregator_views_plugins() { + return array( + 'module' => 'views', // This just tells our themes are elsewhere. + 'row' => array( + 'aggregator_rss' => array( + 'title' => t('Aggregator item'), + 'help' => t('Display the aggregator item using the data from the original source.'), + 'handler' => 'views_plugin_row_aggregator_rss', + 'path' => drupal_get_path('module', 'views') . '/modules/aggregator', // not necessary for most modules + 'theme' => 'views_view_row_rss', + 'base' => array('aggregator_item'), // only works with 'node' as base. + 'uses options' => TRUE, + 'type' => 'feed', + 'help topic' => 'style-aggregator-rss', + ), + ), + ); +} +/** + * @} + */ diff --git a/modules/aggregator/views_handler_argument_aggregator_category_cid.inc b/modules/aggregator/views_handler_argument_aggregator_category_cid.inc new file mode 100644 index 0000000000000000000000000000000000000000..1565e7f8414d176be31754603ff2a5f9e6c96ebd --- /dev/null +++ b/modules/aggregator/views_handler_argument_aggregator_category_cid.inc @@ -0,0 +1,21 @@ +value), '%d')); + + $result = db_query("SELECT c.title FROM {aggregator_category} c WHERE c.cid IN ($placeholders)", $this->value); + while ($term = db_fetch_object($result)) { + $titles[] = check_plain($term->title); + } + return $titles; + } +} diff --git a/modules/aggregator/views_handler_argument_aggregator_fid.inc b/modules/aggregator/views_handler_argument_aggregator_fid.inc new file mode 100644 index 0000000000000000000000000000000000000000..e9201862423c6dc37774695e84f70a2e7fb1500a --- /dev/null +++ b/modules/aggregator/views_handler_argument_aggregator_fid.inc @@ -0,0 +1,22 @@ +value), '%d')); + + $result = db_query("SELECT f.title FROM {aggregator_feed} f WHERE f.fid IN ($placeholders)", $this->value); + while ($term = db_fetch_object($result)) { + $titles[] = check_plain($term->title); + } + return $titles; + } +} + diff --git a/modules/aggregator/views_handler_field_aggregator_category.inc b/modules/aggregator/views_handler_field_aggregator_category.inc new file mode 100644 index 0000000000000000000000000000000000000000..a13b48304b0b588fb5de9f567dc840d2e1f63c36 --- /dev/null +++ b/modules/aggregator/views_handler_field_aggregator_category.inc @@ -0,0 +1,53 @@ +additional_fields['cid'] = 'cid'; + } + + function option_definition() { + $options = parent::option_definition(); + $options['link_to_category'] = array('default' => FALSE); + return $options; + } + + /** + * Provide link to category option + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['link_to_category'] = array( + '#title' => t('Link this field to its aggregator category page'), + '#description' => t('This will override any other link you have set.'), + '#type' => 'checkbox', + '#default_value' => !empty($this->options['link_to_category']), + ); + } + + /** + * Render whatever the data is as a link to the category. + * + * Data should be made XSS safe prior to calling this function. + */ + function render_link($data, $values) { + if (!empty($this->options['link_to_category']) && !empty($values->{$this->aliases['cid']}) && $data !== NULL && $data !== '') { + $cid = $values->{$this->aliases['cid']}; + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['path'] = "aggregator/category/$cid"; + } + return $data; + } + + function render($values) { + return $this->render_link(check_plain($values->{$this->field_alias}), $values); + } +} diff --git a/modules/aggregator/views_handler_field_aggregator_title_link.inc b/modules/aggregator/views_handler_field_aggregator_title_link.inc new file mode 100644 index 0000000000000000000000000000000000000000..7498616cb6e0956855a5a0dab3d3c9ae21f77eab --- /dev/null +++ b/modules/aggregator/views_handler_field_aggregator_title_link.inc @@ -0,0 +1,44 @@ +additional_fields['link'] = 'link'; + } + + function option_definition() { + $options = parent::option_definition(); + + $options['display_as_link'] = array('default' => TRUE); + + return $options; + } + + /** + * Provide link to the page being visited. + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['display_as_link'] = array( + '#title' => t('Display as link'), + '#type' => 'checkbox', + '#default_value' => !empty($this->options['display_as_link']), + ); + } + + function render($values) { + $value = $values->{$this->field_alias}; + $link = $values->{$this->table_alias . '_link'}; + if (!empty($this->options['display_as_link'])) { + return l(check_plain($value), $link, array('html' => TRUE)); + } + else { + return $value; + } + } +} \ No newline at end of file diff --git a/modules/aggregator/views_handler_filter_aggregator_category_cid.inc b/modules/aggregator/views_handler_filter_aggregator_category_cid.inc new file mode 100644 index 0000000000000000000000000000000000000000..338ecb37dc7b999af6183f5cc8d85f77d7b0a030 --- /dev/null +++ b/modules/aggregator/views_handler_filter_aggregator_category_cid.inc @@ -0,0 +1,20 @@ +value_options)) { + return; + } + + $this->value_options = array(); + + $result = db_query('SELECT * FROM {aggregator_category} ORDER BY title'); + while ($category = db_fetch_object($result)) { + $this->value_options[$category->cid] = $category->title; + } + } +} diff --git a/modules/aggregator/views_plugin_row_aggregator_rss.inc b/modules/aggregator/views_plugin_row_aggregator_rss.inc new file mode 100644 index 0000000000000000000000000000000000000000..b8dc49e060cad4cd4529b08d5fc875b3dd6d3a82 --- /dev/null +++ b/modules/aggregator/views_plugin_row_aggregator_rss.inc @@ -0,0 +1,65 @@ + 'default'); + + return $options; + } + + function options_form(&$form, &$form_state) { + $form['item_length'] = array( + '#type' => 'select', + '#title' => t('Display type'), + '#options' => array( + 'fulltext' => t('Full text'), + 'teaser' => t('Title plus teaser'), + 'title' => t('Title only'), + 'default' => t('Use default RSS settings'), + ), + '#default_value' => $this->options['item_length'], + ); + } + + function render($row) { + $sql = "SELECT ai.iid, ai.fid, ai.title, ai.link, ai.author, ai.description, "; + $sql .= "ai.timestamp, ai.guid, af.title AS feed_title, ai.link AS feed_LINK "; + $sql .= "FROM {aggregator_item} ai LEFT JOIN {aggregator_feed} af ON ai.fid = af.fid "; + $sql .= "WHERE ai.iid = %d"; + + $item = db_fetch_object(db_query($sql, $row->iid)); + + $item->elements = array( + array('key' => 'pubDate', 'value' => gmdate('r', $item->timestamp)), + array( + 'key' => 'dc:creator', + 'value' => $item->author, + 'namespace' => array('xmlns:dc' => 'http://purl.org/dc/elements/1.1/'), + ), + array( + 'key' => 'guid', + 'value' => $item->guid, + 'attributes' => array('isPermaLink' => 'false') + ), + ); + + foreach ($item->elements as $element) { + if (isset($element['namespace'])) { + $this->view->style_plugin->namespaces = array_merge($this->view->style_plugin->namespaces, $element['namespace']); + } + } + + return theme($this->theme_functions(), $this->view, $this->options, $item); + } +} + diff --git a/modules/book.views.inc b/modules/book.views.inc new file mode 100644 index 0000000000000000000000000000000000000000..39b3003abd02370fd80d934bd2f33c4db78b4d6e --- /dev/null +++ b/modules/book.views.inc @@ -0,0 +1,125 @@ + array( + 'left_field' => 'nid', + 'field' => 'nid', + ), + ); + + $data['book']['bid'] = array( + 'title' => t('Top level book'), + 'help' => t('The book the node is in.'), + 'relationship' => array( + 'base' => 'node', + 'field' => 'bid', + 'handler' => 'views_handler_relationship', + 'label' => t('Book'), + ), + // There is no argument here; if you need an argument, add the relationship + // and use the node: nid argument. + ); + + // ---------------------------------------------------------------------- + // menu_links table -- this is aliased so we can get just book relations + + // Book hierarchy and weight data are now in {menu_links}. + $data['book_menu_links']['table']['group'] = t('Book'); + $data['book_menu_links']['table']['join'] = array( + 'node' => array( + 'table' => 'menu_links', + 'left_table' => 'book', + 'left_field' => 'mlid', + 'field' => 'mlid', + ), + ); + + $data['book_menu_links']['weight'] = array( + 'title' => t('Weight'), + 'help' => t('The weight of the book page.'), + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + $data['book_menu_links']['depth'] = array( + 'title' => t('Depth'), + 'help' => t('The depth of the book page in the hierarchy; top level books have a depth of 1.'), + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + 'argument' => array( + 'handler' => 'views_handler_argument', + ), + ); + + $data['book_menu_links']['p'] = array( + 'title' => t('Hierarchy'), + 'help' => t('The order of pages in the book hierarchy. If you want the exactly right order, remember to sort by weight, too.'), + 'sort' => array( + 'handler' => 'views_handler_sort_menu_hierarchy', + ), + ); + + // ---------------------------------------------------------------------- + // book_parent table -- this is an alias of the book table which + // represents the parent book. + + // The {book} record for the parent node. + $data['book_parent']['table']['group'] = t('Book'); + $data['book_parent']['table']['join'] = array( + 'node' => array( + 'table' => 'book', + 'left_table' => 'book_menu_links', + 'left_field' => 'plid', + 'field' => 'mlid', + ), + ); + + $data['book_parent']['nid'] = array( + 'title' => t('Parent'), + 'help' => t('The parent book node.'), + 'relationship' => array( + 'base' => 'node', + 'field' => 'nid', + 'handler' => 'views_handler_relationship', + 'label' => t('Book parent'), + ), + ); + + return $data; +} + +/** + * @} + */ diff --git a/modules/book.views_convert.inc b/modules/book.views_convert.inc new file mode 100644 index 0000000000000000000000000000000000000000..b96340468f3ac467db9e8bc241509b3c1e8dda7d --- /dev/null +++ b/modules/book.views_convert.inc @@ -0,0 +1,81 @@ +get_item($display, 'field', $id); + if ($field['handler'] == 'views_handler_field_book_parent_title') { + $item['link_to_node'] = TRUE; + } + $item['relationship'] = $view->add_item($display, 'relationship', 'book_parent', 'nid', array(), 'book_parent_nid'); + $item['table'] = 'node'; + $item['field'] = 'title'; + $view->set_item($display, 'field', $id, $item); + break; + } + break; + } + break; + case 'filter': + switch ($field['tablename']) { + case 'book': + switch ($field['field']) { + case 'parent': + $operators = array('AND' => '=', 'OR' => '=', 'NOT' => '!='); + $item = $view->get_item($display, 'filter', $id); + $item['operator'] = $operators[$field['operator']]; + $item['relationship'] = $view->add_item($display, 'relationship', 'book_parent', 'nid', array(), 'book_parent_nid'); + $item['table'] = 'node'; + $item['field'] = 'nid'; + $view->set_item($display, 'filter', $id, $item); + break; + } + break; + } + break; + case 'sort': + switch ($field['tablename']) { + case 'book': + switch ($field['field']) { + case 'weight': + $view->set_item_option($display, 'sort', $id, 'table', 'book_menu_links'); + break; + } + break; + case 'book_parent_node': + switch ($field['field']) { + case 'title': + $item = $view->get_item($display, 'sort', $id); + $item['relationship'] = $view->add_item($display, 'relationship', 'book_parent', 'nid', array(), 'book_parent_nid'); + $item['table'] = 'node'; + $item['field'] = 'title'; + $view->set_item($display, 'sort', $id, $item); + break; + } + break; + } + break; + case 'argument': + $options = $field['argoptions']; + switch ($field['type']) { + case 'book_parent': + $options['relationship'] = $view->add_item($display, 'relationship', 'book_parent', 'nid', array(), 'book_parent_nid'); + $view->add_item($display, 'argument', 'node', 'nid', $options, $field['id']); + break; + } + break; + } +} diff --git a/modules/comment.views.inc b/modules/comment.views.inc new file mode 100644 index 0000000000000000000000000000000000000000..8175a8433e4bf06a5bca1319f6f0ac0fa1f550bc --- /dev/null +++ b/modules/comment.views.inc @@ -0,0 +1,562 @@ + 'cid', + 'title' => t('Comment'), + 'help' => t("Comments are responses to node content."), + ); + + //joins + $data['comments']['table']['join'] = array( + //...to the node table + 'node' => array( + 'left_field' => 'nid', + 'field' => 'nid', + ), + ); + + // ---------------------------------------------------------------- + // Fields + + // subject + $data['comments']['subject'] = array( + 'title' => t('Title'), + 'help' => t('The title of the comment.'), + 'field' => array( + 'handler' => 'views_handler_field_comment', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + // comment (the comment body) + $data['comments']['comment'] = array( + 'title' => t('Body'), + 'help' => t('The text of the comment.'), + 'field' => array( + 'handler' => 'views_handler_field_markup', + 'format' => 'format', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ); + + // cid + $data['comments']['cid'] = array( + 'title' => t('ID'), + 'help' => t('The comment ID of the field'), + 'field' => array( + 'handler' => 'views_handler_field_comment', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'argument' => array( + 'handler' => 'views_handler_argument', + ), + ); + + // name (of comment author) + $data['comments']['name'] = array( + 'title' => t('Author'), + 'help' => t("The name of the comment's author. Can be rendered as a link to the author's homepage."), + 'field' => array( + 'handler' => 'views_handler_field_comment_username', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + // homepage + $data['comments']['homepage'] = array( + 'title' => t("Author's website"), + 'help' => t("The website address of the comment's author. Can be rendered as a link. Will be empty if the author is a registered user."), + 'field' => array( + 'handler' => 'views_handler_field_url', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + // hostname + $data['comments']['hostname'] = array( + 'title' => t('Hostname'), + 'help' => t('Hostname of user that posted the comment.'), + 'field' => array( + 'handler' => 'views_handler_field', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + // mail + $data['comments']['mail'] = array( + 'title' => t('Mail'), + 'help' => t('Email of user that posted the comment. Will be empty if the author is a registered user.'), + 'field' => array( + 'handler' => 'views_handler_field', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + // timestamp (when comment was posted) + $data['comments']['timestamp'] = array( + 'title' => t('Post date'), + 'help' => t('Date and time of when the comment was posted.'), + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + ); + + // status (approved or not) + $data['comments']['status'] = array( + 'title' => t('In moderation'), + 'help' => t('Whether or not the comment is currently in moderation.'), + 'field' => array( + 'handler' => 'views_handler_field_boolean', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_boolean_operator', + 'label' => t('Moderated'), + 'type' => 'yes-no', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // link to view comment + $data['comments']['view_comment'] = array( + 'field' => array( + 'title' => t('View link'), + 'help' => t('Provide a simple link to view the comment.'), + 'handler' => 'views_handler_field_comment_link', + ), + ); + + // link to edit comment + $data['comments']['edit_comment'] = array( + 'field' => array( + 'title' => t('Edit link'), + 'help' => t('Provide a simple link to edit the comment.'), + 'handler' => 'views_handler_field_comment_link_edit', + ), + ); + + // link to delete comment + $data['comments']['delete_comment'] = array( + 'field' => array( + 'title' => t('Delete link'), + 'help' => t('Provide a simple link to delete the comment.'), + 'handler' => 'views_handler_field_comment_link_delete', + ), + ); + + // link to reply to comment + $data['comments']['replyto_comment'] = array( + 'field' => array( + 'title' => t('Reply-to link'), + 'help' => t('Provide a simple link to reply to the comment.'), + 'handler' => 'views_handler_field_comment_link_reply', + ), + ); + + $data['comments']['node_link'] = array( + 'field' => array( + 'title' => t('Node link'), + 'help' => t('Display the standard comment link used on regular nodes.'), + 'handler' => 'views_handler_field_comment_node_link', + ), + ); + + $data['comments']['thread'] = array( + 'field' => array( + 'title' => t('Depth'), + 'help' => t('Display the depth of the comment if it is threaded.'), + 'handler' => 'views_handler_field_comment_depth', + ), + 'sort' => array( + 'title' => t('Thread'), + 'help' => t('Sort by the threaded order. This will keep child comments together with their parents.'), + 'handler' => 'views_handler_sort_comment_thread', + ), + ); + + $data['comments']['nid'] = array( + 'title' => t('Node'), + 'help' => t('The node the comment is a reply to.'), + 'relationship' => array( + 'base' => 'node', + 'field' => 'nid', + 'handler' => 'views_handler_relationship', + 'label' => t('Node'), + ), + ); + + $data['comments']['uid'] = array( + 'title' => t('User'), + 'help' => t("The User ID of the comment's author."), + 'relationship' => array( + 'base' => 'users', + 'field' => 'uid', + 'handler' => 'views_handler_relationship', + 'label' => t('User'), + ), + ); + + $data['comments']['pid'] = array( + 'title' => t('Parent CID'), + 'help' => t('The Comment ID of the parent comment.'), + 'field' => array( + 'handler' => 'views_handler_field', + ), + 'relationship' => array( + 'title' => t('Parent comment'), + 'help' => t('The parent comment.'), + 'base' => 'comments', + 'field' => 'cid', + 'handler' => 'views_handler_relationship', + 'label' => t('Parent comment'), + ), + ); + + // ---------------------------------------------------------------------- + // node_comment_statistics table + + // define the group + $data['node_comment_statistics']['table']['group'] = t('Node'); + + // joins + $data['node_comment_statistics']['table']['join'] = array( + //...to the node table + 'node' => array( + 'type' => 'INNER', + 'left_field' => 'nid', + 'field' => 'nid', + ), + ); + + // last_comment_timestamp + $data['node_comment_statistics']['last_comment_timestamp'] = array( + 'title' => t('Last comment time'), + 'help' => t('Date and time of when the last comment was posted.'), + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + ); + + // last_comment_name (author's name) + $data['node_comment_statistics']['last_comment_name'] = array( + 'title' => t("Last comment author"), + 'help' => t('The name of the author of the last posted comment.'), + 'field' => array( + 'handler' => 'views_handler_field_ncs_last_comment_name', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_ncs_last_comment_name', + ), + ); + + // comment_count + $data['node_comment_statistics']['comment_count'] = array( + 'title' => t('Comment count'), + 'help' => t('The number of comments a node has.'), + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'argument' => array( + 'handler' => 'views_handler_argument', + ), + ); + + // last_comment_timestamp + $data['node_comment_statistics']['last_updated'] = array( + 'title' => t('Updated/commented date'), + 'help' => t('The most recent of last comment posted or node updated time.'), + 'field' => array( + 'handler' => 'views_handler_field_ncs_last_updated', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_ncs_last_updated', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_ncs_last_updated', + ), + ); + + return $data; +} + +/** + * Use views_data_alter to add items to the node table that are + * relevant to comments. + */ +function comment_views_data_alter(&$data) { + // new comments + $data['node']['new_comments'] = array( + 'title' => t('New comments'), + 'help' => t('The number of new comments on the node.'), + 'field' => array( + 'handler' => 'views_handler_field_node_new_comments', + ), + ); + + // Comment status of the node + $data['node']['comment'] = array( + 'title' => t('Comment status'), + 'help' => t('Whether comments are enabled or disabled on the node.'), + 'field' => array( + 'handler' => 'views_handler_field_node_comment', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_node_comment', + ), + ); + + $data['node']['uid_touch'] = array( + 'title' => t('User posted or commented'), + 'help' => t('Display nodes only if a user posted the node or commented on the node.'), + 'argument' => array( + 'field' => 'uid', + 'name table' => 'users', + 'name field' => 'name', + 'handler' => 'views_handler_argument_comment_user_uid', + ), + 'filter' => array( + 'field' => 'uid', + 'name table' => 'users', + 'name field' => 'name', + 'handler' => 'views_handler_filter_comment_user_uid' + ), + ); + +} + +/** + * Implementation of hook_views_plugins + */ +function comment_views_plugins() { + return array( + 'module' => 'views', // This just tells views our themes are in Views. + 'row' => array( + 'comment' => array( + 'title' => t('Comment'), + 'help' => t('Display the comment with standard comment view.'), + 'handler' => 'views_plugin_row_comment_view', + 'path' => drupal_get_path('module', 'views') . '/modules/comment', // not necessary for most modules + 'theme' => 'views_view_row_comment', + 'base' => array('comments'), // only works with 'comment' as base. + 'uses options' => TRUE, + 'type' => 'normal', + 'help topic' => 'style-comment', + ), + 'comment_rss' => array( + 'title' => t('Comment'), + 'help' => t('Display the comment as RSS.'), + 'handler' => 'views_plugin_row_comment_rss', + 'path' => drupal_get_path('module', 'views') . '/modules/comment', // not necessary for most modules + 'theme' => 'views_view_row_rss', + 'base' => array('comments'), // only works with 'comment' as base. + 'type' => 'feed', + 'help topic' => 'style-comment-rss', + ), + ), + ); +} + +/** + * Implementation of hook_views_handlers() to register all of the basic handlers + * views uses. + */ +function comment_views_handlers() { + return array( + 'info' => array( + 'path' => drupal_get_path('module', 'views') . '/modules/comment', + ), + 'handlers' => array( + 'views_handler_field_comment' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_comment_username' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_comment_depth' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_comment_link' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_comment_link_edit' => array( + 'parent' => 'views_handler_field_comment_link', + ), + 'views_handler_field_comment_link_delete' => array( + 'parent' => 'views_handler_field_comment_link', + ), + 'views_handler_field_comment_link_reply' => array( + 'parent' => 'views_handler_field_comment_link', + ), + 'views_handler_field_comment_node_link' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_ncs_last_comment_name' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_ncs_last_updated' => array( + 'parent' => 'views_handler_field_date', + ), + 'views_handler_field_node_new_comments' => array( + 'parent' => 'views_handler_field_numeric', + ), + 'views_handler_field_node_comment' => array( + 'parent' => 'views_handler_field', + ), + + // sort handlers + 'views_handler_sort_comment_thread' => array( + 'parent' => 'views_handler_sort', + ), + 'views_handler_sort_ncs_last_comment_name' => array( + 'parent' => 'views_handler_sort', + ), + 'views_handler_sort_ncs_last_updated' => array( + 'parent' => 'views_handler_sort_date', + ), + + // filter handlers + 'views_handler_filter_ncs_last_updated' => array( + 'parent' => 'views_handler_filter_date', + ), + 'views_handler_filter_node_comment' => array( + 'parent' => 'views_handler_filter_in_operator', + ), + 'views_handler_filter_comment_user_uid' => array( + 'parent' => 'views_handler_filter_user_name', + ), + + // argument handlers + 'views_handler_argument_comment_user_uid' => array( + 'parent' => 'views_handler_argument', + ), + ), + ); +} + +/** + * Template helper for theme_views_view_row_comment + */ +function template_preprocess_views_view_row_comment(&$vars) { + $options = $vars['options']; + $view = &$vars['view']; + $plugin = &$view->style_plugin->row_plugin; + $comment = $plugin->comments[$vars['row']->cid]; + $node = node_load($comment->nid); + // Put the view on the node so we can retrieve it in the preprocess. + $node->view = &$view; + + $links = ''; + if (!empty($options['links'])) { + $links = module_invoke_all('link', 'comment', $comment, 0); + drupal_alter('link', $links, $node); + } + + $vars['comment'] = theme('comment_view', $comment, $node, $links); +} + +/** + * @} + */ diff --git a/modules/comment.views_convert.inc b/modules/comment.views_convert.inc new file mode 100644 index 0000000000000000000000000000000000000000..4310f48e65f797e0e57f93e02607e53eedaad0af --- /dev/null +++ b/modules/comment.views_convert.inc @@ -0,0 +1,132 @@ +add_item() won't produce + * the right results, usually needed to set field options or values. + */ +function comment_views_convert($display, $type, &$view, $field, $id = NULL) { + switch ($type) { + case 'field': + switch ($field['tablename']) { + case 'comments': + switch ($field['field']) { + case 'subject': + if ($field['options'] = 'nolink') { + $view->set_item_option($display, 'field', $id, 'link_to_comment', FALSE); + } + break; + case 'cid': + $view->set_item_option($display, 'field', $id, 'link_to_comment', FALSE); + break; + case 'timestamp': + $handlers = array( + 'views_handler_field_date_small' => 'small', + 'views_handler_field_date' => 'medium', + 'views_handler_field_date_large' => 'large', + 'views_handler_field_date_custom' => 'custom', + 'views_handler_field_since' => 'time ago', + ); + $view->set_item_option($display, 'field', $id, 'date_format', $handlers[$field['handler']]); + if (!empty($field['options'])) { + $view->set_item_option($display, 'field', $id, 'custom_date_format', $field['options']); + } + break; + case 'add': + $view->set_item_option($display, 'field', $id, 'field', 'replyto_comment'); + break; + } + break; + case 'node_comment_statistics': + switch ($field['field']) { + case 'last_comment_timestamp': + $handlers = array( + 'views_handler_field_date_small' => 'small', + 'views_handler_field_date' => 'medium', + 'views_handler_field_date_large' => 'large', + 'views_handler_field_date_custom' => 'custom', + 'views_handler_field_since' => 'time ago', + ); + $view->set_item_option($display, 'field', $id, 'date_format', $handlers[$field['handler']]); + if (!empty($field['options'])) { + $view->set_item_option($display, 'field', $id, 'custom_date_format', $field['options']); + } + break; + case 'last_changed': + $handlers = array( + 'views_handler_field_date_small' => 'small', + 'views_handler_field_date' => 'medium', + 'views_handler_field_date_large' => 'large', + 'views_handler_field_date_custom' => 'custom', + 'views_handler_field_since' => 'time ago', + ); + $item = $view->get_item($display, 'field', $id); + $item['date_format'] = $handlers[$field['handler']]; + if (!empty($field['options'])) { + $item['custom_date_format'] = $field['options']; + } + $item['field'] = 'last_updated'; + $view->set_item($display, 'field', $id, $item); + break; + } + break; + } + break; + case 'filter': + switch ($field['tablename']) { + case 'node_comment_statistics': + switch ($field['field']) { + case 'comment_count': + $view->set_item_option($display, 'filter', $id, 'operator', $field['operator']); + break; + case 'last_changed': + $field['field'] = 'last_updated'; + case 'last_comment_timestamp': + $item = $view->get_item($display, 'filter', $id); + $item['operator'] = $field['operator']; + $item['value'] = array( + 'type' => $field['value'] == 'now' ? 'offset' : 'date', + 'value' => $field['value'], + ); + if (!empty($field['options'])) { + $item['value']['value'] = intval($field['options']) .' seconds'; + } + $item['field'] = $field['field']; + $view->set_item($display, 'filter', $id, $item); + break; + } + break; + } + break; + case 'sort': + switch ($field['tablename']) { + case 'comments': + switch ($field['field']) { + case 'timestamp': + $field['options'] = $field['options'] == 'normal' ? 'second' : $field['options']; + $view->set_item_option($display, 'sort', $id, 'granularity', $field['options']); + break; + } + break; + case 'node_comment_statistics': + switch ($field['field']) { + case 'last_changed': + $view->set_item_option($display, 'sort', $id, 'field', 'last_updated'); + case 'last_comment_timestamp': + $field['options'] = $field['options'] == 'normal' ? 'second' : $field['options']; + $view->set_item_option($display, 'sort', $id, 'granularity', $field['options']); + break; + } + break; + } + break; + } +} diff --git a/modules/comment.views_default.inc b/modules/comment.views_default.inc new file mode 100644 index 0000000000000000000000000000000000000000..ddbcfeda7b8660c97d505fba88f0857e22e36011 --- /dev/null +++ b/modules/comment.views_default.inc @@ -0,0 +1,361 @@ +name = 'comments_recent'; + $view->description = 'Contains a block and a page to list recent comments; the block will automatically link to the page, which displays the comment body as well as a link to the node.'; + $view->tag = 'default'; + $view->view_php = ''; + $view->base_table = 'comments'; + $view->is_cacheable = '0'; + $view->api_version = 2; + $view->disabled = TRUE; /* Edit this to true to make a default view disabled initially */ + $handler = $view->new_display('default', 'Defaults', 'default'); + $handler->override_option('relationships', array( + 'nid' => array( + 'id' => 'nid', + 'table' => 'comments', + 'field' => 'nid', + 'label' => 'Node', + 'required' => FALSE, + ), + )); + $handler->override_option('fields', array( + 'subject' => array( + 'id' => 'subject', + 'table' => 'comments', + 'field' => 'subject', + 'label' => '', + 'link_to_comment' => 1, + 'relationship' => 'none', + ), + 'timestamp' => array( + 'id' => 'timestamp', + 'table' => 'comments', + 'field' => 'timestamp', + 'label' => '', + 'date_format' => 'time ago', + 'custom_date_format' => '', + 'relationship' => 'none', + ), + )); + $handler->override_option('sorts', array( + 'timestamp' => array( + 'id' => 'timestamp', + 'table' => 'comments', + 'field' => 'timestamp', + 'order' => 'DESC', + 'granularity' => 'second', + 'relationship' => 'none', + ), + )); + $handler->override_option('filters', array( + 'status_extra' => array( + 'id' => 'status_extra', + 'table' => 'node', + 'field' => 'status_extra', + 'operator' => '=', + 'value' => '', + 'group' => 0, + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + 'relationship' => 'nid', + ), + )); + $handler->override_option('access', array( + 'type' => 'none', + 'role' => array(), + 'perm' => '', + )); + $handler->override_option('title', 'Recent comments'); + $handler->override_option('items_per_page', 5); + $handler->override_option('use_more', 1); + $handler->override_option('style_plugin', 'list'); + $handler->override_option('style_options', array( + 'type' => 'ul', + )); + $handler = $view->new_display('page', 'Page', 'page'); + $handler->override_option('fields', array( + 'title' => array( + 'id' => 'title', + 'table' => 'node', + 'field' => 'title', + 'label' => 'Reply to', + 'relationship' => 'nid', + 'link_to_node' => 1, + ), + 'timestamp' => array( + 'id' => 'timestamp', + 'table' => 'comments', + 'field' => 'timestamp', + 'label' => '', + 'date_format' => 'time ago', + 'custom_date_format' => '', + 'relationship' => 'none', + ), + 'subject' => array( + 'id' => 'subject', + 'table' => 'comments', + 'field' => 'subject', + 'label' => '', + 'link_to_comment' => 1, + 'relationship' => 'none', + ), + 'comment' => array( + 'id' => 'comment', + 'table' => 'comments', + 'field' => 'comment', + 'label' => '', + 'relationship' => 'none', + ), + )); + $handler->override_option('items_per_page', 25); + $handler->override_option('use_pager', '1'); + $handler->override_option('row_options', array( + 'inline' => array( + 'title' => 'title', + 'timestamp' => 'timestamp', + ), + 'separator' => ' ', + )); + $handler->override_option('path', 'comments/recent'); + $handler->override_option('menu', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler = $view->new_display('block', 'Block', 'block'); + $handler->override_option('block_description', 'Recent comments view'); + $views[$view->name] = $view; + + $view = new view; + $view->name = 'tracker'; + $view->description = 'Shows all new activity on system.'; + $view->tag = 'default'; + $view->view_php = ''; + $view->base_table = 'node'; + $view->is_cacheable = '0'; + $view->api_version = 2; + $view->disabled = TRUE; /* Edit this to true to make a default view disabled initially */ + $handler = $view->new_display('default', 'Defaults', 'default'); + $handler->override_option('fields', array( + 'type' => array( + 'id' => 'type', + 'table' => 'node', + 'field' => 'type', + 'label' => 'Type', + ), + 'title' => array( + 'id' => 'title', + 'table' => 'node', + 'field' => 'title', + 'label' => 'Title', + 'link_to_node' => TRUE, + ), + 'name' => array( + 'id' => 'name', + 'table' => 'users', + 'field' => 'name', + 'label' => 'Author', + 'link_to_user' => TRUE, + ), + 'comment_count' => array( + 'id' => 'comment_count', + 'table' => 'node_comment_statistics', + 'field' => 'comment_count', + 'label' => 'Replies', + 'set_precision' => FALSE, + 'precision' => 0, + 'decimal' => '.', + 'separator' => ',', + 'prefix' => '', + 'suffix' => '', + ), + 'last_comment_timestamp' => array( + 'id' => 'last_comment_timestamp', + 'table' => 'node_comment_statistics', + 'field' => 'last_comment_timestamp', + 'label' => 'Last Post', + 'date_format' => 'small', + 'custom_date_format' => '', + ), + 'timestamp' => array( + 'id' => 'timestamp', + 'table' => 'history_user', + 'field' => 'timestamp', + 'label' => '', + 'comments' => 1, + 'relationship' => 'none', + 'link_to_node' => 0, + 'comment' => 1, + ), + 'new_comments' => array( + 'id' => 'new_comments', + 'table' => 'node', + 'field' => 'new_comments', + 'label' => '', + 'set_precision' => FALSE, + 'precision' => 0, + 'decimal' => '.', + 'separator' => ',', + 'prefix' => '', + 'suffix' => ' new', + 'link_to_comment' => 1, + 'no_empty' => 1, + 'relationship' => 'none', + ), + )); + $handler->override_option('sorts', array( + 'last_comment_timestamp' => array( + 'id' => 'last_comment_timestamp', + 'table' => 'node_comment_statistics', + 'field' => 'last_comment_timestamp', + 'order' => 'ASC', + 'granularity' => 'second', + ), + )); + $handler->override_option('arguments', array( + 'uid_touch' => array( + 'id' => 'uid_touch', + 'table' => 'node', + 'field' => 'uid_touch', + 'default_action' => 'ignore', + 'style_plugin' => 'default_summary', + 'style_options' => array( + 'count' => TRUE, + 'override' => FALSE, + 'items_per_page' => 25, + ), + 'wildcard' => 'all', + 'wildcard_substitution' => 'All', + 'title' => 'Recent posts for %1', + 'default_argument_type' => 'fixed', + 'default_argument' => '', + 'validate_type' => 'none', + 'validate_fail' => 'not found', + 'relationship' => 'none', + 'default_argument_fixed' => '', + 'default_argument_php' => '', + 'validate_argument_node_type' => array( + 'album' => 0, + 'artist' => 0, + 'book' => 0, + 'page' => 0, + 'story' => 0, + 'track' => 0, + ), + 'validate_argument_php' => '', + ), + )); + $handler->override_option('filters', array( + 'status' => array( + 'id' => 'status', + 'table' => 'node', + 'field' => 'status', + 'operator' => '=', + 'value' => '1', + 'group' => 0, + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + 'status' => array( + 'id' => 'status', + 'table' => 'comments', + 'field' => 'status', + 'operator' => '=', + 'value' => 0, + 'group' => 0, + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + 'relationship' => 'none', + ), + ), + )); + $handler->override_option('access', array( + 'type' => 'none', + 'role' => array(), + 'perm' => '', + )); + $handler->override_option('title', 'Recent posts'); + $handler->override_option('items_per_page', '25'); + $handler->override_option('use_pager', TRUE); + $handler->override_option('style_plugin', 'table'); + $handler->override_option('style_options', array( + 'override' => 1, + 'order' => 'desc', + 'columns' => array( + 'type' => 'type', + 'title' => 'title', + 'name' => 'name', + 'comment_count' => 'comment_count', + 'last_comment_timestamp' => 'last_comment_timestamp', + 'timestamp' => 'title', + 'new_comments' => 'comment_count', + ), + 'info' => array( + 'type' => array( + 'sortable' => 1, + 'separator' => '', + ), + 'title' => array( + 'sortable' => 1, + 'separator' => ' ', + ), + 'name' => array( + 'sortable' => 1, + 'separator' => '', + ), + 'comment_count' => array( + 'sortable' => 1, + 'separator' => '
    ', + ), + 'last_comment_timestamp' => array( + 'sortable' => 1, + 'separator' => ' ', + ), + 'timestamp' => array( + 'separator' => '', + ), + 'new_comments' => array( + 'separator' => '', + ), + ), + 'default' => 'last_comment_timestamp', + )); + $handler = $view->new_display('page', 'Page', 'page'); + $handler->override_option('path', 'tracker'); + $handler->override_option('menu', array( + 'type' => 'normal', + 'title' => 'Recent posts', + 'weight' => 0, + )); + $handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => NULL, + 'weight' => NULL, + )); + $views[$view->name] = $view; + + return $views; +} diff --git a/modules/comment/views_handler_argument_comment_user_uid.inc b/modules/comment/views_handler_argument_comment_user_uid.inc new file mode 100644 index 0000000000000000000000000000000000000000..f60abed68204d6aaf6c5eda76fdf0cc40497ea36 --- /dev/null +++ b/modules/comment/views_handler_argument_comment_user_uid.inc @@ -0,0 +1,41 @@ +argument) { + $title = variable_get('anonymous', t('Anonymous')); + } + else { + $title = db_result(db_query("SELECT u.name FROM {users} u WHERE u.uid = %d", $this->argument)); + } + if (empty($title)) { + return t('No user'); + } + + return check_plain($title); + } + + function default_actions($which = NULL) { + // Disallow summary views on this argument. + if (!$which) { + $actions = parent::default_actions(); + unset($actions['summary asc']); + unset($actions['summary desc']); + return $actions; + } + + if ($which != 'summary asc' && $which != 'summary desc') { + return parent::default_actions($which); + } + } + + function query() { + $this->ensure_my_table(); + $this->query->add_where(0, "$this->table_alias.uid = %d OR ((SELECT COUNT(*) FROM {comments} c WHERE c.uid = %d AND c.nid = $this->table_alias.nid) > 0)", $this->argument, $this->argument); + } +} diff --git a/modules/comment/views_handler_field_comment.inc b/modules/comment/views_handler_field_comment.inc new file mode 100644 index 0000000000000000000000000000000000000000..fd12aef0464e5f3d828fb1fae850614607cc4920 --- /dev/null +++ b/modules/comment/views_handler_field_comment.inc @@ -0,0 +1,50 @@ +options['link_to_comment'])) { + $this->additional_fields['cid'] = 'cid'; + $this->additional_fields['nid'] = 'nid'; + } + } + + function option_definition() { + $options = parent::option_definition(); + $options['link_to_comment'] = array('default' => TRUE); + return $options; + } + + /** + * Provide link-to-comment option + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['link_to_comment'] = array( + '#title' => t('Link this field to its comment'), + '#description' => t('This will override any other link you have set.'), + '#type' => 'checkbox', + '#default_value' => $this->options['link_to_comment'], + ); + } + + function render_link($data, $values) { + if (!empty($this->options['link_to_comment']) && $data !== NULL && $data !== '') { + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['path'] = "node/". $values->{$this->aliases['nid']}; + $this->options['alter']['fragment'] = "comment-" . $values->{$this->aliases['cid']}; + } + + return $data; + } + + function render($values) { + return $this->render_link(check_plain($values->{$this->field_alias}), $values); + } +} diff --git a/modules/comment/views_handler_field_comment_depth.inc b/modules/comment/views_handler_field_comment_depth.inc new file mode 100644 index 0000000000000000000000000000000000000000..e3a28175d885b135b8265cf822e988b6a9342a2d --- /dev/null +++ b/modules/comment/views_handler_field_comment_depth.inc @@ -0,0 +1,14 @@ +comments_thread)) - 1; + } +} + diff --git a/modules/comment/views_handler_field_comment_link.inc b/modules/comment/views_handler_field_comment_link.inc new file mode 100644 index 0000000000000000000000000000000000000000..ed1c09baf18e72eeaa527e7d21d47eb3e8851368 --- /dev/null +++ b/modules/comment/views_handler_field_comment_link.inc @@ -0,0 +1,38 @@ +additional_fields['cid'] = 'cid'; + $this->additional_fields['nid'] = 'nid'; + } + + function option_definition() { + $options = parent::option_definition(); + $options['text'] = array('default' => '', 'translatable' => TRUE); + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['text'] = array( + '#type' => 'textfield', + '#title' => t('Text to display'), + '#default_value' => $this->options['text'], + ); + } + + function query() { + $this->ensure_my_table(); + $this->add_additional_fields(); + } + + function render($values) { + $text = !empty($this->options['text']) ? $this->options['text'] : t('view'); + return l($text, "node/" . $values->{$this->aliases['nid']}, array('html' => TRUE, 'fragment' => "comment-" . $values->{$this->aliases['cid']})); + } +} + diff --git a/modules/comment/views_handler_field_comment_link_delete.inc b/modules/comment/views_handler_field_comment_link_delete.inc new file mode 100644 index 0000000000000000000000000000000000000000..b899caec17364dd7222143834b48cac133e3b26a --- /dev/null +++ b/modules/comment/views_handler_field_comment_link_delete.inc @@ -0,0 +1,15 @@ +options['text']) ? $this->options['text'] : t('delete'); + return l($text, "comment/delete/" . $values->{$this->aliases['cid']}, array('query' => drupal_get_destination())); + } +} diff --git a/modules/comment/views_handler_field_comment_link_edit.inc b/modules/comment/views_handler_field_comment_link_edit.inc new file mode 100644 index 0000000000000000000000000000000000000000..7f78a5df9b0fd1d4f66c37a03597543b03178cea --- /dev/null +++ b/modules/comment/views_handler_field_comment_link_edit.inc @@ -0,0 +1,25 @@ +additional_fields['uid'] = 'uid'; + } + + function render($values) { + // ensure user has access to edit this comment. + $comment = new stdClass(); + $comment->cid = $values->{$this->aliases['cid']}; + $comment->uid = $values->{$this->aliases['uid']}; + if (!comment_access('edit', $comment)) { + return; + } + + $text = !empty($this->options['text']) ? $this->options['text'] : t('edit'); + return l($text, "comment/edit/" . $values->{$this->aliases['cid']}); + } +} + diff --git a/modules/comment/views_handler_field_comment_link_reply.inc b/modules/comment/views_handler_field_comment_link_reply.inc new file mode 100644 index 0000000000000000000000000000000000000000..40de6f239f09a88e8dd1abbc679b4bf5fbff30d3 --- /dev/null +++ b/modules/comment/views_handler_field_comment_link_reply.inc @@ -0,0 +1,16 @@ +options['text']) ? $this->options['text'] : t('reply'); + return l($text, "comment/reply/" . $values->{$this->aliases['nid']} . '/' . $values->{$this->aliases['cid']}); + } +} diff --git a/modules/comment/views_handler_field_comment_node_link.inc b/modules/comment/views_handler_field_comment_node_link.inc new file mode 100644 index 0000000000000000000000000000000000000000..44bd7033e65f6e2a2ca4ba9b174d66de29974d94 --- /dev/null +++ b/modules/comment/views_handler_field_comment_node_link.inc @@ -0,0 +1,63 @@ +additional_fields['nid'] = array( + 'table' => 'node', + 'field' => 'nid', + ); + $this->additional_fields['type'] = array( + 'table' => 'node', + 'field' => 'type', + ); + $this->additional_fields['comment'] = array( + 'table' => 'node', + 'field' => 'comment', + ); + } + + function option_definition() { + $options = parent::option_definition(); + $options['teaser'] = array('default' => 0); + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + + $form['teaser'] = array( + '#type' => 'checkbox', + '#title' => t('Show teaser-style link'), + '#default_value' => $this->options['teaser'], + '#description' => 'Show the comment link in the form used on standard node teasers, rather than the full node form.', + ); + + } + + function query() { + $this->ensure_my_table(); + $this->add_additional_fields(); + } + + function render($values) { + // Build fake $node. + $node = new stdClass(); + $node->nid = $values->{$this->aliases['nid']}; + $node->type = $values->{$this->aliases['type']}; + $node->comment = $values->{$this->aliases['comment']}; + + // Call comment.module's hook_link: comment_link($type, $node = NULL, $teaser = FALSE) + $links = comment_link('node', $node, $this->options['teaser']); + // question: should we run these through: drupal_alter('link', $links, $node); + // might this have unexpected consequences if these hooks expect items in $node that we don't have? + + return !empty($links) ? theme('links', $links, array('class' => 'links inline')) : ''; + } +} + diff --git a/modules/comment/views_handler_field_comment_username.inc b/modules/comment/views_handler_field_comment_username.inc new file mode 100644 index 0000000000000000000000000000000000000000..087d3dbeaae756e5968af5f737911cbb3e0bf6dd --- /dev/null +++ b/modules/comment/views_handler_field_comment_username.inc @@ -0,0 +1,48 @@ +additional_fields['uid'] = 'uid'; + $this->additional_fields['homepage'] = 'homepage'; + } + + function option_definition() { + $options = parent::option_definition(); + $options['link_to_user'] = array('default' => TRUE); + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['link_to_user'] = array( + '#title' => t("Link this field to its user or an author's homepage"), + '#type' => 'checkbox', + '#default_value' => $this->options['link_to_user'], + ); + } + + function render_link($data, $values) { + if (!empty($this->options['link_to_user'])) { + $account->uid = $values->{$this->aliases['uid']}; + $account->name = $values->{$this->field_alias}; + $account->homepage = $values->{$this->aliases['homepage']}; + + return theme('username', $account); + } + else { + return $data; + } + } + + function render($values) { + return $this->render_link(check_plain($values->{$this->field_alias}), $values); + } + +} diff --git a/modules/comment/views_handler_field_ncs_last_comment_name.inc b/modules/comment/views_handler_field_ncs_last_comment_name.inc new file mode 100644 index 0000000000000000000000000000000000000000..6a2471cc275be279d2ae9bbd0d86a29177029eb0 --- /dev/null +++ b/modules/comment/views_handler_field_ncs_last_comment_name.inc @@ -0,0 +1,46 @@ +ensure_my_table(); + // join 'users' to this table via vid + $join = new views_join(); + $join->construct('users', $this->table_alias, 'last_comment_uid', 'uid'); + $join->extra = array(array('field' => 'uid', 'operator' => '!=', 'value' => '0')); + + // ncs_user alias so this can work with the sort handler, below. +// $this->user_table = $this->query->add_relationship(NULL, $join, 'users', $this->relationship); + $this->user_table = $this->query->ensure_table('ncs_users', $this->relationship, $join); + + $this->field_alias = $this->query->add_field(NULL, "COALESCE($this->user_table.name, $this->table_alias.$this->field)", $this->table_alias . '_' . $this->field); + + $this->user_field = $this->query->add_field($this->user_table, 'name'); + $this->uid = $this->query->add_field($this->table_alias, 'last_comment_uid'); + } + + function option_definition() { + $options = parent::option_definition(); + + $options['link_to_user'] = array('default' => TRUE); + + return $options; + } + + function render($values) { + if (!empty($this->options['link_to_user'])) { + $account = new stdClass(); + $account->name = $values->{$this->field_alias}; + $account->uid = $values->{$this->uid}; + return theme('username', $account); + } + else { + return check_plain($values->{$this->field_alias}); + } + } +} diff --git a/modules/comment/views_handler_field_ncs_last_updated.inc b/modules/comment/views_handler_field_ncs_last_updated.inc new file mode 100644 index 0000000000000000000000000000000000000000..72d90cd67f3a822ecd127b7bbdf02624ed530524 --- /dev/null +++ b/modules/comment/views_handler_field_ncs_last_updated.inc @@ -0,0 +1,12 @@ +ensure_my_table(); + $this->node_table = $this->query->ensure_table('node', $this->relationship); + $this->field_alias = $this->query->add_field(NULL, "GREATEST(" . $this->node_table . ".changed, " . $this->table_alias . ".last_comment_timestamp)", $this->table_alias . '_' . $this->field); + } +} diff --git a/modules/comment/views_handler_field_node_comment.inc b/modules/comment/views_handler_field_node_comment.inc new file mode 100644 index 0000000000000000000000000000000000000000..1272a72024cd8535649302d85cbe3d2a678b9e63 --- /dev/null +++ b/modules/comment/views_handler_field_node_comment.inc @@ -0,0 +1,19 @@ +{$this->field_alias}) { + case COMMENT_NODE_DISABLED: + default: + return t('Disabled'); + case COMMENT_NODE_READ_ONLY: + return t('Read only'); + case COMMENT_NODE_READ_WRITE: + return t('Read/Write'); + } + } +} diff --git a/modules/comment/views_handler_field_node_new_comments.inc b/modules/comment/views_handler_field_node_new_comments.inc new file mode 100644 index 0000000000000000000000000000000000000000..1aaf6ff3054d67f9c642e4d165751a9cbdb3ab8e --- /dev/null +++ b/modules/comment/views_handler_field_node_new_comments.inc @@ -0,0 +1,99 @@ +options['hide_empty'] = TRUE; + unset($this->options['no_empty']); + } + } + + function construct() { + parent::construct(); + $this->additional_fields = array('nid' => 'nid', 'type' => 'type'); + } + + function option_definition() { + $options = parent::option_definition(); + + $options['link_to_comment'] = array('default' => TRUE); + + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['link_to_comment'] = array( + '#title' => t('Link this field to new comments'), + '#description' => t('This will override any other link you have set.'), + '#type' => 'checkbox', + '#default_value' => $this->options['link_to_comment'], + ); + } + + function query() { + $this->ensure_my_table(); + $this->add_additional_fields(); + $this->field_alias = $this->table . '_' . $this->field; + } + + function pre_render(&$values) { + global $user; + if (!$user->uid || empty($values)) { + return; + } + + $nids = array(); + $ids = array(); + foreach ($values as $id => $result) { + $nids[] = $result->{$this->aliases['nid']}; + $values[$id]->{$this->field_alias} = 0; + // Create a reference so we can find this record in the values again. + if (empty($ids[$result->{$this->aliases['nid']}])) { + $ids[$result->{$this->aliases['nid']}] = array(); + } + $ids[$result->{$this->aliases['nid']}][] = $id; + } + + if ($nids) { + $result = db_query("SELECT n.nid, COUNT(c.cid) as num_comments FROM {node} n INNER JOIN {comments} c ON n.nid = c.nid LEFT JOIN {history} h ON h.nid = n.nid AND h.uid = %d WHERE n.nid IN (" . implode(', ', $nids) . ") AND c.timestamp > GREATEST(COALESCE(h.timestamp, %d), %d) AND c.status = %d GROUP BY n.nid ", $user->uid, NODE_NEW_LIMIT, NODE_NEW_LIMIT, COMMENT_PUBLISHED); + + while ($node = db_fetch_object($result)) { + foreach ($ids[$node->nid] as $id) { + $values[$id]->{$this->field_alias} = $node->num_comments; + } + } + + } + } + + function render_link($data, $values) { + if (!empty($this->options['link_to_comment']) && $data !== NULL && $data !== '') { + $node = new stdClass(); + $node->nid = $values->{$this->aliases['nid']}; + $node->type = $values->{$this->aliases['type']}; + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['path'] = 'node/' . $node->nid; + $this->options['alter']['query'] = comment_new_page_count($values->node_comment_statistics_comment_count, $values->node_new_comments, $node); + $this->options['alter']['fragment'] = 'new'; + } + + return $data; + } + + function render($values) { + if (!empty($values->{$this->field_alias})) { + return $this->render_link(parent::render($values), $values); + } + else { + $this->options['alter']['make_link'] = FALSE; + } + } +} diff --git a/modules/comment/views_handler_filter_comment_user_uid.inc b/modules/comment/views_handler_filter_comment_user_uid.inc new file mode 100644 index 0000000000000000000000000000000000000000..24d882592710af13bef340889b462ce78a665839 --- /dev/null +++ b/modules/comment/views_handler_filter_comment_user_uid.inc @@ -0,0 +1,23 @@ +ensure_my_table(); + $replace = array_fill(0, sizeof($this->value), '%d'); + $condition = $this->operator . ' (' . implode(", ", $replace) . ')'; + + // We include the WHERE condition twice in the query, so we need two + // copies of these argument values. + $args = array_values($this->value); + $args = array_merge($args, $args); + + $this->query->add_where($this->options['group'], "$this->table_alias.uid " . $condition . " OR + ((SELECT COUNT(*) FROM {comments} c WHERE c.uid " . $condition . " AND c.nid = $this->table_alias.nid) > 0)", + $args); + } +} diff --git a/modules/comment/views_handler_filter_ncs_last_updated.inc b/modules/comment/views_handler_filter_ncs_last_updated.inc new file mode 100644 index 0000000000000000000000000000000000000000..6d98ff4dc8077292bb06f6b70d712d977f671bba --- /dev/null +++ b/modules/comment/views_handler_filter_ncs_last_updated.inc @@ -0,0 +1,18 @@ +ensure_my_table(); + $this->node_table = $this->query->ensure_table('node', $this->relationship); + + $field = "GREATEST(" . $this->node_table . ".changed, " . $this->table_alias . ".last_comment_timestamp)"; + + $info = $this->operators(); + if (!empty($info[$this->operator]['method'])) { + $this->{$info[$this->operator]['method']}($field); + } + } +} diff --git a/modules/comment/views_handler_filter_node_comment.inc b/modules/comment/views_handler_filter_node_comment.inc new file mode 100644 index 0000000000000000000000000000000000000000..ae648e737bfd8ba20efed2e389af6f2bb78d8c71 --- /dev/null +++ b/modules/comment/views_handler_filter_node_comment.inc @@ -0,0 +1,15 @@ +value_options = array( + COMMENT_NODE_DISABLED => t('Disabled'), + COMMENT_NODE_READ_ONLY => t('Read only'), + COMMENT_NODE_READ_WRITE => t('Read/Write'), + ); + } +} diff --git a/modules/comment/views_handler_sort_comment_thread.inc b/modules/comment/views_handler_sort_comment_thread.inc new file mode 100644 index 0000000000000000000000000000000000000000..0d1d030732ee3a794e25f557f3ce3da81fd1cd42 --- /dev/null +++ b/modules/comment/views_handler_sort_comment_thread.inc @@ -0,0 +1,21 @@ +ensure_my_table(); + + //Read comment_render() in comment.module for an explanation of the + //thinking behind this sort. + if ($this->options['order'] == 'DESC') { + $this->query->add_orderby($this->table_alias, $this->real_field, $this->options['order']); + } + else { + $alias = $this->table_alias . '_' . $this->real_field . 'asc'; + //@todo is this secure? + $this->query->add_orderby(NULL, "SUBSTRING({$this->table_alias}.{$this->real_field}, 1, (LENGTH({$this->table_alias}.{$this->real_field}) - 1))", $this->options['order'], $alias); + } + } +} diff --git a/modules/comment/views_handler_sort_ncs_last_comment_name.inc b/modules/comment/views_handler_sort_ncs_last_comment_name.inc new file mode 100644 index 0000000000000000000000000000000000000000..1864fba8fe6489925c1f069e1c21899856a9e119 --- /dev/null +++ b/modules/comment/views_handler_sort_ncs_last_comment_name.inc @@ -0,0 +1,23 @@ +ensure_my_table(); + $join = new views_join(); + $join->construct('users', $this->table_alias, 'last_comment_uid', 'uid'); + + // @todo this might be safer if we had an ensure_relationship rather than guessing + // the table alias. Though if we did that we'd be guessing the relationship name + // so that doesn't matter that much. +// $this->user_table = $this->query->add_relationship(NULL, $join, 'users', $this->relationship); + $this->user_table = $this->query->ensure_table('ncs_users', $this->relationship, $join); + $this->user_field = $this->query->add_field($this->user_table, 'name'); + + // Add the field. + $this->query->add_orderby(NULL, "LOWER(COALESCE($this->user_table.name, $this->table_alias.$this->field))", $this->options['order'], $this->table_alias . '_' . $this->field); + } +} diff --git a/modules/comment/views_handler_sort_ncs_last_updated.inc b/modules/comment/views_handler_sort_ncs_last_updated.inc new file mode 100644 index 0000000000000000000000000000000000000000..c0b0865becbd982200567899e327ef86c0b5ca79 --- /dev/null +++ b/modules/comment/views_handler_sort_ncs_last_updated.inc @@ -0,0 +1,13 @@ +ensure_my_table(); + $this->node_table = $this->query->ensure_table('node', $this->relationship); + $this->field_alias = $this->query->add_orderby(NULL, "GREATEST(" . $this->node_table . ".changed, " . $this->table_alias . ".last_comment_timestamp)", $this->options['order'], $this->table_alias . '_' . $this->field); + } +} + diff --git a/modules/comment/views_plugin_row_comment_rss.inc b/modules/comment/views_plugin_row_comment_rss.inc new file mode 100644 index 0000000000000000000000000000000000000000..2de2642a7801ec2b830c5f2fb01ed13a3ade057f --- /dev/null +++ b/modules/comment/views_plugin_row_comment_rss.inc @@ -0,0 +1,42 @@ +cid); + + $item = new stdClass(); + $item->title = $comment->subject; + $item->link = url('node/' . $comment->nid, array('absolute' => TRUE, 'fragment' => 'comment-' . $comment->cid)); + $item->description = check_markup($comment->comment, $comment->format, FALSE); + $item->elements = array( + array('key' => 'pubDate', 'value' => gmdate('r', $comment->timestamp)), + array('key' => 'dc:creator', 'value' => $comment->name), + array( + 'key' => 'guid', + 'value' => 'comment ' . $row->cid . ' at ' . $base_url, + 'attributes' => array('isPermaLink' => 'false'), + 'namespace' => array('xmlns:dc' => 'http://purl.org/dc/elements/1.1/'), + ), + ); + + foreach ($item->elements as $element) { + if (isset($element['namespace'])) { + $this->view->style_plugin->namespaces = array_merge($this->view->style_plugin->namespaces, $element['namespace']); + } + } + + return theme($this->theme_functions(), $this->view, $this->options, $item); + } +} diff --git a/modules/comment/views_plugin_row_comment_view.inc b/modules/comment/views_plugin_row_comment_view.inc new file mode 100644 index 0000000000000000000000000000000000000000..3e6c436bd636fac6f5f8e08e7ab09d5f5a94187d --- /dev/null +++ b/modules/comment/views_plugin_row_comment_view.inc @@ -0,0 +1,50 @@ + TRUE); + return $options; + } + + function options_form(&$form, &$form_state) { + $form['links'] = array( + '#type' => 'checkbox', + '#title' => t('Display links'), + '#default_value' => $this->options['links'], + ); + } + + function pre_render($result) { + $cids = array(); + $this->comments = array(); + + foreach ($result as $row) { + $cids[] = $row->cid; + } + + if (count($cids) > 1) { + $placeholder = " IN (" . implode(', ', array_fill(0, sizeof($cids), '%d')) . ")"; + } + else { + $placeholder = " = %d"; + } + + $cresult = db_query("SELECT c.cid as cid, c.pid, c.nid, c.subject, c.comment, c.format, c.timestamp, c.name, c.mail, c.homepage, u.uid, u.name AS registered_name, u.signature, u.picture, u.data, c.thread, c.status FROM {comments} c INNER JOIN {users} u ON c.uid = u.uid WHERE c.cid $placeholder", $cids); + while ($comment = db_fetch_object($cresult)) { + $comment = drupal_unpack($comment); + $comment->name = $comment->uid ? $comment->registered_name : $comment->name; + $comment->depth = count(explode('.', $comment->thread)) - 1; + $this->comments[$comment->cid] = $comment; + } + } +} + diff --git a/modules/contact.views.inc b/modules/contact.views.inc new file mode 100644 index 0000000000000000000000000000000000000000..30f301cc6ffb2d2656fbc8d442508b6f5cca8842 --- /dev/null +++ b/modules/contact.views.inc @@ -0,0 +1,33 @@ + array( + 'title' => t('Link to contact page'), + 'help' => t('Provide a simple link to the user contact page.'), + 'handler' => 'views_handler_field_contact_link', + ), + ); + return $data; +} +/** + * Implementation of hook_views_handlers() to register all of the basic handlers + * views uses. + */ +function contact_views_handlers() { + return array( + 'info' => array( + 'path' => drupal_get_path('module', 'views') . '/modules/contact', + ), + 'handlers' => array( + 'views_handler_field_contact_link' => array( + 'parent' => 'views_handler_field_user_link', + ), + ), + ); +} diff --git a/modules/contact/views_handler_field_contact_link.inc b/modules/contact/views_handler_field_contact_link.inc new file mode 100644 index 0000000000000000000000000000000000000000..8809f87e33805912a437faa6ed962d77e097935e --- /dev/null +++ b/modules/contact/views_handler_field_contact_link.inc @@ -0,0 +1,58 @@ + 'link', 'translatable' => FALSE); + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['link_display'] = array( + '#title' => t('Type of link'), + '#default_value' => $this->options['link_display'], + '#type' => 'select', + '#options' => array( + 'link' => t('Link'), + 'icon' => t('Icon'), + ), + ); + $form['text']['#title'] = t('Link label'); + $form['text']['#required'] = TRUE; + $form['text']['#default_value'] = empty($this->options['text']) ? t('contact') : $this->options['text']; + } + + function render($values) { + global $user; + $uid = $values->{$this->aliases['uid']}; + + // Only registered users can view other registered user's contact page. + if (empty($user->uid) || empty($uid)) { + return; + } + + $account = user_load($uid); + if (empty($account)) { + return; + } + + // Check access when we pull up the user account so we know + // if the user has made the contact page available. + if (!_contact_user_tab_access($account) || empty($account->contact)) { + return; + } + + if ($this->options['link_display'] == 'icon') { + return l(theme('image', 'misc/forum-new.png'), 'user/'. $account->uid .'/contact', array('html' => TRUE, 'attributes' => array('title' => t('Contact %user', array('%user' => $account->name))))); + } + else { + return l($this->options['text'], 'user/'. $account->uid .'/contact', array('attributes' => array('title' => t('Contact %user', array('%user' => $account->name))))); + } + } +} + diff --git a/modules/filter.views.inc b/modules/filter.views.inc new file mode 100644 index 0000000000000000000000000000000000000000..f113bcc55473c802ba2940b6aef0c6b935c0bf3c --- /dev/null +++ b/modules/filter.views.inc @@ -0,0 +1,55 @@ + array( + 'left_field' => 'format', + 'field' => 'format', + ), + 'node' => array( + 'left_table' => 'node_revisions', + 'left_field' => 'format', + 'field' => 'format', + ), + ); + + return $data; +} + +function filter_views_handlers() { + return array( + 'info' => array( + 'path' => drupal_get_path('module', 'views') . '/modules/filter', + ), + 'handlers' => array( + // field handlers + 'views_handler_field_filter_format_name' => array( + 'parent' => 'views_handler_field', + ), + ), + ); +} + +/** + * @} + */ diff --git a/modules/filter/views_handler_field_filter_format_name.inc b/modules/filter/views_handler_field_filter_format_name.inc new file mode 100644 index 0000000000000000000000000000000000000000..777f8b1446c8356ce2c547914c34031bea7ef08d --- /dev/null +++ b/modules/filter/views_handler_field_filter_format_name.inc @@ -0,0 +1,29 @@ +additional_fields['name'] = array('table' => 'filter_formats', 'field' => 'name'); + } + + function query() { + $this->ensure_my_table(); + $this->add_additional_fields(); + } + + function render($values) { + $format_name = $values->{$this->aliases['name']}; + if (!$format_name) { + // Default or invalid input format. + // filter_formats() will reliably return the default format even if the + // current user is unprivileged. + $format = filter_formats(variable_get('filter_default_format', 1)); + return check_plain($format->name); + } + return check_plain($format_name); + } +} diff --git a/modules/locale.views.inc b/modules/locale.views.inc new file mode 100644 index 0000000000000000000000000000000000000000..a18edb524a5c926c041abe86abbf10d657856334 --- /dev/null +++ b/modules/locale.views.inc @@ -0,0 +1,247 @@ + 'lid', + 'title' => t('Locale source'), + 'help' => t('A source string for translation, in English or the default site language.'), + ); + + // lid + $data['locales_source']['lid'] = array( + 'title' => t('LID'), + 'help' => t('The ID of the source string.'), + 'field' => array( + 'handler' => 'views_handler_field', + 'click sortable' => TRUE, + ), + 'argument' => array( + 'handler' => 'views_handler_argument_numeric', + 'numeric' => TRUE, + 'validate type' => 'lid', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // location + $data['locales_source']['location'] = array( + 'group' => t('Locale source'), + 'title' => t('Location'), + 'help' => t('A description of the location or context of the string.'), + 'field' => array( + 'handler' => 'views_handler_field', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + // Group field + $data['locales_source']['textgroup'] = array( + 'group' => t('Locale source'), + 'title' => t('Group'), + 'help' => t('The group the translation is in.'), + 'field' => array( + 'handler' => 'views_handler_field_locale_group', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_locale_group', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_locale_group', + ), + ); + + // Source field + $data['locales_source']['source'] = array( + 'group' => t('Locale source'), + 'title' => t('Source'), + 'help' => t('The full original string.'), + 'field' => array( + 'handler' => 'views_handler_field', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ); + + // Version field + $data['locales_source']['version'] = array( + 'group' => t('Locale source'), + 'title' => t('Version'), + 'help' => t('The version of Drupal core that this string is for.'), + 'field' => array( + 'handler' => 'views_handler_field', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_locale_version', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + $data['locales_source']['edit_lid'] = array( + 'group' => t('Locale source'), + 'field' => array( + 'title' => t('Edit link'), + 'help' => t('Provide a simple link to edit the translations.'), + 'handler' => 'views_handler_field_locale_link_edit', + ), + ); + + // ---------------------------------------------------------------------- + // Locales target table + + // Define the base group of this table. Fields that don't + // have a group defined will go into this field by default. + $data['locales_target']['table']['group'] = t('Locale target'); + + // Join information + $data['locales_target']['table']['join'] = array( + 'locales_source' => array( + 'left_field' => 'lid', + 'field' => 'lid', + ), + ); + + // Translation field + $data['locales_target']['translation'] = array( + 'group' => t('Locale target'), + 'title' => t('Translation'), + 'help' => t('The full translation string.'), + 'field' => array( + 'handler' => 'views_handler_field', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ); + + // Language field + $data['locales_target']['language'] = array( + 'group' => t('Locale target'), + 'title' => t('Language'), + 'help' => t('The language this translation is in.'), + 'field' => array( + 'handler' => 'views_handler_field_locale_language', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_locale_language', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_locale_language', + ), + ); + + $data['locales_target']['plid'] = array( + 'group' => t('Locale target'), + 'title' => t('Singular LID'), + 'help' => t('The ID of the parent translation.'), + 'field' => array( + 'handler' => 'views_handler_field', + ), + ); + + // Plural + $data['locales_target']['plural'] = array( + 'group' => t('Locale target'), + 'title' => t('Plural'), + 'help' => t('Whether or not the translation is plural.'), + 'field' => array( + 'handler' => 'views_handler_field_boolean', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_boolean_operator', + 'label' => t('Plural'), + 'type' => 'yes-no', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + return $data; +} + +/** + * Implementation of hook_views_handlers(). + */ +function locale_views_handlers() { + return array( + 'info' => array( + 'path' => drupal_get_path('module', 'views') . '/modules/locale', + ), + 'handlers' => array( + // Field handlers. + 'views_handler_field_locale_group' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_locale_language' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_locale_link_edit' => array( + 'parent' => 'views_handler_field', + ), + // Argument handlers. + 'views_handler_argument_locale_group' => array( + 'parent' => 'views_handler_argument', + ), + 'views_handler_argument_locale_language' => array( + 'parent' => 'views_handler_argument', + ), + // Filters. + 'views_handler_filter_locale_group' => array( + 'parent' => 'views_handler_filter_in_operator', + ), + 'views_handler_filter_locale_language' => array( + 'parent' => 'views_handler_filter_in_operator', + ), + 'views_handler_filter_locale_version' => array( + 'parent' => 'views_handler_filter_in_operator', + ), + ), + ); +} + +/** + * @} + */ diff --git a/modules/locale/views_handler_argument_locale_group.inc b/modules/locale/views_handler_argument_locale_group.inc new file mode 100644 index 0000000000000000000000000000000000000000..5c3a1e2582c95d6f021f2e0a630322b8e49d011f --- /dev/null +++ b/modules/locale/views_handler_argument_locale_group.inc @@ -0,0 +1,35 @@ +locale_group($data->{$this->name_alias}); + } + + /** + * Override the behavior of title(). Get the user friendly version + * of the language. + */ + function title() { + return $this->locale_group($this->argument); + } + + function locale_group($group) { + $groups = module_invoke_all('locale', 'groups'); + // Sort the list. + asort($groups); + return isset($groups[$group]) ? $groups[$group] : t('Unknown group'); + } +} + diff --git a/modules/locale/views_handler_argument_locale_language.inc b/modules/locale/views_handler_argument_locale_language.inc new file mode 100644 index 0000000000000000000000000000000000000000..f3232d5dbb599bc424694cf94f4399151626a499 --- /dev/null +++ b/modules/locale/views_handler_argument_locale_language.inc @@ -0,0 +1,33 @@ +locale_language($data->{$this->name_alias}); + } + + /** + * Override the behavior of title(). Get the user friendly version + * of the language. + */ + function title() { + return $this->locale_language($this->argument); + } + + function locale_language($langcode) { + $languages = locale_language_list(); + return isset($languages[$langcode]) ? $languages[$langcode] : t('Unknown language'); + } +} + diff --git a/modules/locale/views_handler_field_locale_group.inc b/modules/locale/views_handler_field_locale_group.inc new file mode 100644 index 0000000000000000000000000000000000000000..8d6406004020459f3d9a3964b619bbd1313eef0c --- /dev/null +++ b/modules/locale/views_handler_field_locale_group.inc @@ -0,0 +1,14 @@ +{$this->field_alias}]) ? $groups[$values->{$this->field_alias}] : ''; + } +} diff --git a/modules/locale/views_handler_field_locale_language.inc b/modules/locale/views_handler_field_locale_language.inc new file mode 100644 index 0000000000000000000000000000000000000000..1bdf4261b277dd2489a013927b127db605d3fd5c --- /dev/null +++ b/modules/locale/views_handler_field_locale_language.inc @@ -0,0 +1,12 @@ +{$this->field_alias}]) ? $languages[$values->{$this->field_alias}]->name : ''; + } +} diff --git a/modules/locale/views_handler_field_locale_link_edit.inc b/modules/locale/views_handler_field_locale_link_edit.inc new file mode 100644 index 0000000000000000000000000000000000000000..c215fc11c5b84d17ab90a6d7d064cc864cec6102 --- /dev/null +++ b/modules/locale/views_handler_field_locale_link_edit.inc @@ -0,0 +1,45 @@ +additional_fields['lid'] = 'lid'; + } + + function option_definition() { + $options = parent::option_definition(); + + $options['text'] = array('default' => '', 'translatable' => TRUE); + + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['text'] = array( + '#type' => 'textfield', + '#title' => t('Text to display'), + '#default_value' => $this->options['text'], + ); + } + + function query() { + $this->ensure_my_table(); + $this->add_additional_fields(); + } + + function render($values) { + // Ensure user has access to edit translations. + if (!user_access('translate interface')) { + return; + } + + $text = !empty($this->options['text']) ? $this->options['text'] : t('edit'); + return l($text, 'admin/build/translate/edit/' . $values->{$this->aliases['lid']}, array('query' => drupal_get_destination())); + } +} + diff --git a/modules/locale/views_handler_filter_locale_group.inc b/modules/locale/views_handler_filter_locale_group.inc new file mode 100644 index 0000000000000000000000000000000000000000..a3c0c57362ff5f26eae7bb826f1f8068012bb69f --- /dev/null +++ b/modules/locale/views_handler_filter_locale_group.inc @@ -0,0 +1,18 @@ +value_options)) { + $this->value_title = t('Group'); + $groups = module_invoke_all('locale', 'groups'); + // Sort the list. + asort($groups); + $this->value_options = $groups; + } + } +} + diff --git a/modules/locale/views_handler_filter_locale_language.inc b/modules/locale/views_handler_filter_locale_language.inc new file mode 100644 index 0000000000000000000000000000000000000000..678197d5b4b819b344533df6b0902074ed253b29 --- /dev/null +++ b/modules/locale/views_handler_filter_locale_language.inc @@ -0,0 +1,17 @@ +value_options)) { + $this->value_title = t('Language'); + $languages = array('***CURRENT_LANGUAGE***' => t("Current user's language"), '***DEFAULT_LANGUAGE***' => t("Default site language"), '***NO_LANGUAGE***' => t('No language')); + $languages = array_merge($languages, locale_language_list()); + $this->value_options = $languages; + } + } +} + diff --git a/modules/locale/views_handler_filter_locale_version.inc b/modules/locale/views_handler_filter_locale_version.inc new file mode 100644 index 0000000000000000000000000000000000000000..dae8cd11ba65745ad916ff2caabad6293bbccb19 --- /dev/null +++ b/modules/locale/views_handler_filter_locale_version.inc @@ -0,0 +1,22 @@ +value_options)) { + $this->value_title = t('Version'); + // Enable filtering by the current installed Drupal version. + $versions = array('***CURRENT_VERSION***' => t('Current installed version')); + $result = db_query('SELECT DISTINCT(version) FROM {locales_source} ORDER BY version'); + while ($row = db_fetch_array($result)) { + if (!empty($row['version'])) { + $versions[$row['version']] = $row['version']; + } + } + $this->value_options = $versions; + } + } +} diff --git a/modules/node.views.inc b/modules/node.views.inc new file mode 100644 index 0000000000000000000000000000000000000000..faaa8bca677690395453c41db74a3b86176c261f --- /dev/null +++ b/modules/node.views.inc @@ -0,0 +1,842 @@ + 'nid', + 'title' => t('Node'), + 'help' => t("Nodes are a Drupal site's primary content."), + 'weight' => -10, + ); + + // For other base tables, explain how we join + $data['node']['table']['join'] = array( + // this explains how the 'node' table (named in the line above) + // links toward the node_revisions table. + 'node_revisions' => array( + 'handler' => 'views_join', // this is actually optional + 'left_table' => 'node_revisions', // Because this is a direct link it could be left out. + 'left_field' => 'nid', + 'field' => 'nid', + // also supported: + // 'type' => 'INNER', + // 'extra' => array(array('field' => 'fieldname', 'value' => 'value', 'operator' => '=')) + // Unfortunately, you can't specify other tables here, but you can construct + // alternative joins in the handlers that can do that. + // 'table' => 'the actual name of this table in the database', + ), + ); + + // ---------------------------------------------------------------- + // node table -- fields + + // nid + $data['node']['nid'] = array( + 'title' => t('Nid'), + 'help' => t('The node ID of the node.'), // The help that appears on the UI, + // Information for displaying the nid + 'field' => array( + 'handler' => 'views_handler_field_node', + 'click sortable' => TRUE, + ), + // Information for accepting a nid as an argument + 'argument' => array( + 'handler' => 'views_handler_argument_node_nid', + 'parent' => 'views_handler_argument_numeric', // make sure parent is included + 'name field' => 'title', // the field to display in the summary. + 'numeric' => TRUE, + 'validate type' => 'nid', + ), + // Information for accepting a nid as a filter + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + // Information for sorting on a nid. + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // title + // This definition has more items in it than it needs to as an example. + $data['node']['title'] = array( + 'title' => t('Title'), // The item it appears as on the UI, + 'help' => t('The title of the node.'), // The help that appears on the UI, + // Information for displaying a title as a field + 'field' => array( + 'field' => 'title', // the real field. This could be left out since it is the same. + 'group' => t('Node'), // The group it appears in on the UI. Could be left out. + 'handler' => 'views_handler_field_node', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + // Information for accepting a title as a filter + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + // created field + $data['node']['created'] = array( + 'title' => t('Post date'), // The item it appears as on the UI, + 'help' => t('The date the node was posted.'), // The help that appears on the UI, + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + ); + + // changed field + $data['node']['changed'] = array( + 'title' => t('Updated date'), // The item it appears as on the UI, + 'help' => t('The date the node was last updated.'), // The help that appears on the UI, + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + ); + + // Node type + $data['node']['type'] = array( + 'title' => t('Type'), // The item it appears as on the UI, + 'help' => t('The type of a node (for example, "blog entry", "forum post", "story", etc).'), // The help that appears on the UI, + 'field' => array( + 'handler' => 'views_handler_field_node_type', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_node_type', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_node_type', + ), + ); + + // published status + $data['node']['status'] = array( + 'title' => t('Published'), + 'help' => t('Whether or not the node is published.'), + 'field' => array( + 'handler' => 'views_handler_field_boolean', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_boolean_operator', + 'label' => t('Published'), + 'type' => 'yes-no', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // published status + extra + $data['node']['status_extra'] = array( + 'title' => t('Published or admin'), + 'help' => t('Filters out unpublished nodes if the current user cannot view them.'), + 'filter' => array( + 'field' => 'status', + 'handler' => 'views_handler_filter_node_status', + 'label' => t('Published or admin'), + ), + ); + + // promote status + $data['node']['promote'] = array( + 'title' => t('Promoted to front page'), + 'help' => t('Whether or not the node is promoted to the front page.'), + 'field' => array( + 'handler' => 'views_handler_field_boolean', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_boolean_operator', + 'label' => t('Promoted to front page'), + 'type' => 'yes-no', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // moderate + $data['node']['moderate'] = array( + 'title' => t('Moderated'), // The item it appears as on the UI, + 'help' => t('Whether or not the node is moderated.'), // The help that appears on the UI, + // Information for displaying a title as a field + 'field' => array( + 'handler' => 'views_handler_field_boolean', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_boolean_operator', + 'label' => t('Moderated'), + 'type' => 'yes-no', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // sticky + $data['node']['sticky'] = array( + 'title' => t('Sticky'), // The item it appears as on the UI, + 'help' => t('Whether or not the node is sticky.'), // The help that appears on the UI, + // Information for displaying a title as a field + 'field' => array( + 'handler' => 'views_handler_field_boolean', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_boolean_operator', + 'label' => t('Sticky'), + 'type' => 'yes-no', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // links to operate on the node + + $data['node']['view_node'] = array( + 'field' => array( + 'title' => t('Link'), + 'help' => t('Provide a simple link to the node.'), + 'handler' => 'views_handler_field_node_link', + ), + ); + + $data['node']['edit_node'] = array( + 'field' => array( + 'title' => t('Edit link'), + 'help' => t('Provide a simple link to edit the node.'), + 'handler' => 'views_handler_field_node_link_edit', + ), + ); + + $data['node']['delete_node'] = array( + 'field' => array( + 'title' => t('Delete link'), + 'help' => t('Provide a simple link to delete the node.'), + 'handler' => 'views_handler_field_node_link_delete', + ), + ); + + // Bogus fields for aliasing purposes. + + $data['node']['created_fulldate'] = array( + 'title' => t('Created date'), + 'help' => t('In the form of CCYYMMDD.'), + 'argument' => array( + 'field' => 'created', + 'handler' => 'views_handler_argument_node_created_fulldate', + ), + ); + + $data['node']['created_year_month'] = array( + 'title' => t('Created year + month'), + 'help' => t('In the form of YYYYMM.'), + 'argument' => array( + 'field' => 'created', + 'handler' => 'views_handler_argument_node_created_year_month', + ), + ); + + $data['node']['created_year'] = array( + 'title' => t('Created year'), + 'help' => t('In the form of YYYY.'), + 'argument' => array( + 'field' => 'created', + 'handler' => 'views_handler_argument_node_created_year', + ), + ); + + $data['node']['created_month'] = array( + 'title' => t('Created month'), + 'help' => t('In the form of MM (01 - 12).'), + 'argument' => array( + 'field' => 'created', + 'handler' => 'views_handler_argument_node_created_month', + ), + ); + + $data['node']['created_day'] = array( + 'title' => t('Created day'), + 'help' => t('In the form of DD (01 - 31).'), + 'argument' => array( + 'field' => 'created', + 'handler' => 'views_handler_argument_node_created_day', + ), + ); + + $data['node']['created_week'] = array( + 'title' => t('Created week'), + 'help' => t('In the form of WW (01 - 53).'), + 'argument' => array( + 'field' => 'created', + 'handler' => 'views_handler_argument_node_created_week', + ), + ); + + $data['node']['changed_fulldate'] = array( + 'title' => t('Updated date'), + 'help' => t('In the form of CCYYMMDD.'), + 'argument' => array( + 'field' => 'changed', + 'handler' => 'views_handler_argument_node_created_fulldate', + ), + ); + + $data['node']['changed_year_month'] = array( + 'title' => t('Updated year + month'), + 'help' => t('In the form of YYYYMM.'), + 'argument' => array( + 'field' => 'changed', + 'handler' => 'views_handler_argument_node_created_year_month', + ), + ); + + $data['node']['changed_year'] = array( + 'title' => t('Updated year'), + 'help' => t('In the form of YYYY.'), + 'argument' => array( + 'field' => 'changed', + 'handler' => 'views_handler_argument_node_created_year', + ), + ); + + $data['node']['changed_month'] = array( + 'title' => t('Updated month'), + 'help' => t('In the form of MM (01 - 12).'), + 'argument' => array( + 'field' => 'changed', + 'handler' => 'views_handler_argument_node_created_month', + ), + ); + + $data['node']['changed_day'] = array( + 'title' => t('Updated day'), + 'help' => t('In the form of DD (01 - 31).'), + 'argument' => array( + 'field' => 'changed', + 'handler' => 'views_handler_argument_node_created_day', + ), + ); + + $data['node']['changed_week'] = array( + 'title' => t('Updated week'), + 'help' => t('In the form of WW (01 - 53).'), + 'argument' => array( + 'field' => 'changed', + 'handler' => 'views_handler_argument_node_created_week', + ), + ); + + // ---------------------------------------------------------------------- + // Node revisions table + + // Define the base group of this table. Fields that don't + // have a group defined will go into this field by default. + $data['node_revisions']['table']['group'] = t('Node revision'); + + // Advertise this table as a possible base table + $data['node_revisions']['table']['base'] = array( + 'field' => 'vid', + 'title' => t('Node revision'), + 'help' => t('Node revisions are a history of changes to nodes.'), + ); + + // For other base tables, explain how we join + $data['node_revisions']['table']['join'] = array( + // Directly links to node table. + 'node' => array( + 'left_field' => 'vid', + 'field' => 'vid', + ), + ); + + // uid field + $data['node_revisions']['uid'] = array( + 'title' => t('User'), + 'help' => t('Relate a node revision to the user who created the revision.'), + 'relationship' => array( + 'handler' => 'views_handler_relationship', + 'base' => 'users', + 'field' => 'uid', + 'label' => t('user'), + ), + ); + + // Body field + $data['node_revisions']['body'] = array( + 'group' => t('Node'), + 'title' => t('Body'), // The item it appears as on the UI, + 'help' => t('The actual, full data in the body field; this may not be valid data on all node types.'), // The help that appears on the UI, + // Information for displaying a title as a field + 'field' => array( + 'handler' => 'views_handler_field_markup', + 'format' => 'format', // The name of the format field + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ); + + // Teaser field + $data['node_revisions']['teaser'] = array( + 'group' => t('Node'), + 'title' => t('Teaser'), // The item it appears as on the UI, + 'help' => t('The stored teaser field. This may not be valid or useful data on all node types.'), // The help that appears on the UI, + // Information for displaying a title as a field + 'field' => array( + 'handler' => 'views_handler_field_markup', + 'format' => 'format', // The name of the format field + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ); + + // nid + $data['node_revisions']['vid'] = array( + 'title' => t('Vid'), + 'help' => t('The revision ID of the node revision.'), // The help that appears on the UI, + // Information for displaying the nid + 'field' => array( +// 'handler' => 'views_handler_field', + 'click sortable' => TRUE, + ), + // Information for accepting a nid as an argument + 'argument' => array( + 'handler' => 'views_handler_argument_node_vid', + 'parent' => 'views_handler_argument_numeric', // make sure parent is included + 'click sortable' => TRUE, + 'numeric' => TRUE, + ), + // Information for accepting a nid as a filter + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + // Information for sorting on a nid. + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // title + $data['node_revisions']['title'] = array( + 'title' => t('Title'), // The item it appears as on the UI, + 'help' => t('The title of the node.'), // The help that appears on the UI, + // Information for displaying a title as a field + 'field' => array( + 'field' => 'title', // the real field + 'handler' => 'views_handler_field_node', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + // log field + $data['node_revisions']['log'] = array( + 'title' => t('Log message'), // The item it appears as on the UI, + 'help' => t('The log message entered when the revision was created.'), // The help that appears on the UI, + // Information for displaying a title as a field + 'field' => array( + 'handler' => 'views_handler_field_xss', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ); + + // revision timestamp + // changed field + $data['node_revisions']['timestamp'] = array( + 'title' => t('Created date'), // The item it appears as on the UI, + 'help' => t('The date the node revision was created.'), // The help that appears on the UI, + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + ); + + // input format id + $data['node_revisions']['format'] = array( + 'title' => t('Input format id'), // The item it appears as on the UI, + 'help' => t('The numeric input format of the node revision. !default means the default input format.', array('!default' => FILTER_FORMAT_DEFAULT)), // The help that appears on the UI, + // Information for displaying an input format as a field + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + // Information for sorting on input format + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + // Information for accepting input format as a filter + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + ); + + // input format name + // A (numeric) format of 0 means the default; Drupal also applies the default + // if the format specifed for a node revision has been deleted. + // This complexity makes sorting and filtering by format name tricky, + // hence these are not yet supported. + $data['node_revisions']['format_name'] = array( + 'title' => t('Input format'), // The item it appears as on the UI, + 'help' => t('The name of the input format of the node revision.'), // The help that appears on the UI, + // Information for displaying an input format as a field + 'field' => array( + 'handler' => 'views_handler_field_filter_format_name', + ), + ); + + $data['node_revisions']['revert_revision'] = array( + 'field' => array( + 'title' => t('Revert link'), + 'help' => t('Provide a simple link to revert to the revision.'), + 'handler' => 'views_handler_field_node_revision_link_revert', + ), + ); + + $data['node_revisions']['delete_revision'] = array( + 'field' => array( + 'title' => t('Delete link'), + 'help' => t('Provide a simple link to delete the node revision.'), + 'handler' => 'views_handler_field_node_revision_link_delete', + ), + ); + + // ---------------------------------------------------------------------- + // Node access table + + // Define the base group of this table. Fields that don't + // have a group defined will go into this field by default. + $data['node_access']['table']['group'] = t('Node access'); + + // For other base tables, explain how we join + $data['node_access']['table']['join'] = array( + // Directly links to node table. + 'node' => array( + 'left_field' => 'nid', + 'field' => 'nid', + ), + ); + // nid field + $data['node_access']['nid'] = array( + 'title' => t('Access'), + 'help' => t('Filter by access.'), + 'filter' => array( + 'handler' => 'views_handler_filter_node_access', + 'help' => t('Filter for nodes by view access. Not necessary if you are using node as your base table.'), + ), + ); + + // ---------------------------------------------------------------------- + // History table + + // We're actually defining a specific instance of the table, so let's + // alias it so that we can later add the real table for other purposes if we + // need it. + $data['history_user']['table']['group'] = t('Node'); + + // Explain how this table joins to others. + $data['history_user']['table']['join'] = array( + // Directly links to node table. + 'node' => array( + 'table' => 'history', + 'left_field' => 'nid', + 'field' => 'nid', + 'extra' => array( + array('field' => 'uid', 'value' => '***CURRENT_USER***', 'numeric' => TRUE), + ), + ), + ); + + $data['history_user']['timestamp'] = array( + 'title' => t('Has new content'), + 'field' => array( + 'handler' => 'views_handler_field_history_user_timestamp', + 'help' => t('Show a marker if the node has new or updated content.'), + ), + 'filter' => array( + 'help' => t('Show only nodes that have new content.'), + 'handler' => 'views_handler_filter_history_user_timestamp', + ), + ); + return $data; +} + +/** + * Implementation of hook_views_handlers() to register all of the basic handlers + * views uses. + */ +function node_views_handlers() { + return array( + 'info' => array( + 'path' => drupal_get_path('module', 'views') . '/modules/node', + ), + 'handlers' => array( + // field handlers + 'views_handler_field_node' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_node_type' => array( + 'parent' => 'views_handler_field_node', + ), + 'views_handler_field_node_link' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_node_type' => array( + 'parent' => 'views_handler_field_node', + ), + 'views_handler_field_node_link_edit' => array( + 'parent' => 'views_handler_field_node_link', + ), + 'views_handler_field_node_link_delete' => array( + 'parent' => 'views_handler_field_node_link', + ), + 'views_handler_field_node_revision_link_revert' => array( + 'parent' => 'views_handler_field_node_link', + ), + 'views_handler_field_node_revision_link_delete' => array( + 'parent' => 'views_handler_field_node_link', + ), + 'views_handler_field_history_user_timestamp' => array( + 'parent' => 'views_handler_field_node', + ), + + // argument handlers + 'views_handler_argument_node_type' => array( + 'parent' => 'views_handler_argument', + ), + 'views_handler_argument_node_nid' => array( + 'parent' => 'views_handler_argument_numeric', + ), + 'views_handler_argument_node_vid' => array( + 'parent' => 'views_handler_argument_numeric', + ), + 'views_handler_argument_node_created_fulldate' => array( + // put several handlers in the same file + 'file' => 'views_handler_argument_dates_various.inc', + 'parent' => 'views_handler_argument_date', + ), + 'views_handler_argument_node_created_year' => array( + // put several handlers in the same file + 'file' => 'views_handler_argument_dates_various.inc', + 'parent' => 'views_handler_argument_date', + ), + 'views_handler_argument_node_created_year_month' => array( + // put several handlers in the same file + 'file' => 'views_handler_argument_dates_various.inc', + 'parent' => 'views_handler_argument_date', + ), + 'views_handler_argument_node_created_month' => array( + // put several handlers in the same file + 'file' => 'views_handler_argument_dates_various.inc', + 'parent' => 'views_handler_argument_date', + ), + 'views_handler_argument_node_created_day' => array( + // put several handlers in the same file + 'file' => 'views_handler_argument_dates_various.inc', + 'parent' => 'views_handler_argument_date', + ), + 'views_handler_argument_node_created_week' => array( + // put several handlers in the same file + 'file' => 'views_handler_argument_dates_various.inc', + 'parent' => 'views_handler_argument_date', + ), + + // filters + 'views_handler_filter_node_type' => array( + 'parent' => 'views_handler_filter_in_operator', + ), + 'views_handler_filter_history_user_timestamp' => array( + 'parent' => 'views_handler_filter', + ), + 'views_handler_filter_node_status' => array( + 'parent' => 'views_handler_filter', + ), + 'views_handler_filter_node_access' => array( + 'parent' => 'views_handler_filter', + ), + ), + ); +} + +/** + * Implementation of hook_views_plugins + */ +function node_views_plugins() { + return array( + 'module' => 'views', // This just tells our themes are elsewhere. + 'row' => array( + 'node' => array( + 'title' => t('Node'), + 'help' => t('Display the node with standard node view.'), + 'handler' => 'views_plugin_row_node_view', + 'path' => drupal_get_path('module', 'views') . '/modules/node', // not necessary for most modules + 'theme' => 'views_view_row_node', + 'base' => array('node'), // only works with 'node' as base. + 'uses options' => TRUE, + 'type' => 'normal', + 'help topic' => 'style-node', + ), + 'node_rss' => array( + 'title' => t('Node'), + 'help' => t('Display the node with standard node view.'), + 'handler' => 'views_plugin_row_node_rss', + 'path' => drupal_get_path('module', 'views') . '/modules/node', // not necessary for most modules + 'theme' => 'views_view_row_rss', + 'base' => array('node'), // only works with 'node' as base. + 'uses options' => TRUE, + 'type' => 'feed', + 'help topic' => 'style-node-rss', + ), + ), + 'argument validator' => array( + 'node' => array( + 'title' => t('Node'), + 'handler' => 'views_plugin_argument_validate_node', + 'path' => drupal_get_path('module', 'views') . '/modules/node', // not necessary for most modules + ), + ), + 'argument default' => array( + 'node' => array( + 'title' => t('Node ID from URL'), + 'handler' => 'views_plugin_argument_default_node', + 'path' => drupal_get_path('module', 'views') . '/modules/node', // not necessary for most modules + 'parent' => 'fixed', // so that the parent class is included + ), + ), + ); +} + +/** + * Template helper for theme_views_view_row_node + */ +function template_preprocess_views_view_row_node(&$vars) { + $options = $vars['options']; + + // Make sure the variables are defined. + $vars['node'] = ''; + $vars['comments'] = ''; + + $nid = $vars['row']->{$vars['field_alias']}; + if (!is_numeric($nid)) { + return; + } + + $node = node_load($nid); + + if (empty($node)) { + return; + } + + $node->view = $vars['view']; + $node->build_mode = ($options['build_mode'] == 'teaser' || $options['build_mode'] == 'full') ? NODE_BUILD_NORMAL : $options['build_mode']; + $vars['node'] = node_view($node, $options['build_mode'] == 'teaser', FALSE, $options['links']); + + if (!empty($options['comments']) && function_exists('comment_render')) { + $vars['comments'] = comment_render($node); + } +} + +/** + * Implementation of hook_views_query_substitutions(). + */ +function node_views_query_substitutions() { + return array( + '***ADMINISTER_NODES***' => intval(user_access('administer nodes')), + ); +} + +/** + * Implementation of hook_views_analyze(). + */ +function node_views_analyze($view) { + $ret = array(); + // Check for something other than the default display: + if ($view->base_table == 'node') { + foreach ($view->display as $id => $display) { + if (!$display->handler->is_defaulted('access') || !$display->handler->is_defaulted('filters')) { + // check for no access control + $access = $display->handler->get_option('access'); + if (empty($access['type']) || $access['type'] == 'none') { + $filters = $display->handler->get_option('filters'); + foreach ($filters as $filter) { + if ($filter['table'] == 'node' && ($filter['field'] == 'status' || $filter['field'] == 'status_extra')) { + continue 2; + } + } + $ret[] = views_ui_analysis(t('Display %display has no access control but does not contain a filter for published nodes.', array('%display' => $display->display_title)), 'warning'); + } + } + } + } + + return $ret; +} + +/** + * @} + */ diff --git a/modules/node.views_convert.inc b/modules/node.views_convert.inc new file mode 100644 index 0000000000000000000000000000000000000000..fb912338d02f09723d6dd44f266387731b99fd99 --- /dev/null +++ b/modules/node.views_convert.inc @@ -0,0 +1,182 @@ +add_item() won't produce + * the right results, usually needed to set field options or values. + */ +function node_views_convert($display, $type, &$view, $field, $id = NULL) { + switch ($type) { + case 'field': + switch ($field['tablename']) { + case 'node': + switch ($field['field']) { + case 'title': + if ($field['options'] != 'no_link') { + $view->set_item_option($display, 'field', $id, 'link_to_node', TRUE); + } + break; + case 'created': + case 'changed': + $handlers = array( + 'views_handler_field_date_small' => 'small', + 'views_handler_field_date' => 'medium', + 'views_handler_field_date_large' => 'large', + 'views_handler_field_date_custom' => 'custom', + 'views_handler_field_since' => 'time ago', + ); + $view->set_item_option($display, 'field', $id, 'date_format', $handlers[$field['handler']]); + if (!empty($field['options'])) { + $view->set_item_option($display, 'field', $id, 'custom_date_format', $field['options']); + } + break; + case 'body': + $field['field'] = $field['handler'] == 'views_handler_field_teaser' ? 'teaser' : $field['field']; + $view->set_item_option($display, 'field', $id, 'field', $field['field']); + $view->set_item_option($display, 'field', $id, 'table', 'node_revisions'); + break; + case 'link': + case 'edit': + case 'delete': + case 'view': + $field['field'] = $field['field'] == 'link' ? 'view_node' : "$field[field]_node"; + $view->set_item_option($display, 'field', $id, 'field', $field['field']); + if (!empty($field['options'])) { + $view->set_item_option($display, 'field', $id, 'text', $field['options']); + } + break; + } + break; + } + break; + case 'filter': + switch ($field['tablename']) { + case 'node': + switch ($field['field']) { + case 'type': + $operators = array('OR' => 'in', 'NOR' => 'not in'); + $view->set_item_option($display, 'filter', $id, 'operator', $operators[$field['operator']]); + break; + case 'anon': + $item = $view->get_item($display, 'filter', $id); + $item['value'] = array(0); + $item['table'] = 'users'; + $item['field'] = 'uid'; + $view->set_item($display, 'filter', $id, $item); + break; + case 'currentuid': + $operators = array('=' => TRUE, '!=' => FALSE); + $item = $view->get_item($display, 'filter', $id); + $item['value'] = $operators[$field['operator']]; + $item['table'] = 'users'; + $item['field'] = 'uid_current'; + $view->set_item($display, 'filter', $id, $item); + break; + case 'currentuidtouched': + $view->set_item_option($display, 'filter', $id, 'value', '='); + $view->set_item_option($display, 'filter', $id, 'field', 'uid_touch'); + break; + case 'distinct': + $view->display_handler->set_option('distinct', $field['operator'] == '=' && $field['value'] == 'distinct'); + $view->set_item($display, 'filter', $id, NULL); + break; + case 'title': + $item = $view->get_item($display, 'filter', $id); + $item['operator'] = $field['operator']; + $item['case'] = FALSE; + $view->set_item($display, 'filter', $id, $item); + break; + case 'created': + case 'changed': + $item = $view->get_item($display, 'filter', $id); + $item['operator'] = $field['operator']; + $item['value'] = array( + 'type' => $field['value'] == 'now' ? 'offset' : 'date', + 'value' => $field['value'], + ); + if (!empty($field['options'])) { + $item['value']['value'] = intval($field['options']) .' seconds'; + } + $view->set_item($display, 'filter', $id, $item); + break; + case 'body': + $item = $view->get_item($display, 'filter', $id); + $item['operator'] = $field['operator']; + $item['case'] = FALSE; + $item['table'] = 'node_revisions'; + $view->set_item($display, 'filter', $id, $item); + break; + } + break; + case 'history': + switch ($field['field']) { + case 'timestamp': + $view->set_item_option($display, 'filter', $id, 'table', 'history_user'); + break; + } + break; + } + break; + case 'sort': + switch ($field['tablename']) { + case 'node': + switch ($field['field']) { + case 'created': + case 'changed': + $field['options'] = $field['options'] == 'normal' ? 'second' : $field['options']; + $view->set_item_option($display, 'sort', $id, 'granularity', $field['options']); + break; + case 'random': + $view->set_item_option($display, 'sort', $id, 'table', 'views'); + break; + } + break; + } + break; + case 'argument': + $options = $field['argoptions']; + switch ($field['type']) { + case 'nodetype': + $view->add_item($display, 'argument', 'node', 'type', $options, $field['id']); + break; + case 'nodeletter': + if (!empty($field['options'])) { + $options['glossary'] = TRUE; + $options['limit'] = $field['options']; + } + $options['case'] = 'upper'; + $view->add_item($display, 'argument', 'node', 'title', $options, $field['id']); + break; + case 'year': + $view->add_item($display, 'argument', 'node', 'created_year', $options, $field['id']); + break; + case 'month': + $view->add_item($display, 'argument', 'node', 'created_month', $options, $field['id']); + break; + case 'week': + $view->add_item($display, 'argument', 'node', 'created_week', $options, $field['id']); + break; + case 'monthyear': + $view->add_item($display, 'argument', 'node', 'created_year_month', $options, $field['id']); + break; + case 'fulldate': + $view->add_item($display, 'argument', 'node', 'created_fulldate', $options, $field['id']); + break; + case 'nid': + if (!empty($field['options'])) { + $options['not'] = TRUE; + } + $view->add_item($display, 'argument', 'node', 'nid', $options, $field['id']); + break; + } + break; + } +} diff --git a/modules/node.views_default.inc b/modules/node.views_default.inc new file mode 100644 index 0000000000000000000000000000000000000000..d0a7cd8a2eaf19afa826e0d5e9108999d2e5904b --- /dev/null +++ b/modules/node.views_default.inc @@ -0,0 +1,384 @@ +name = 'frontpage'; + $view->description = 'Emulates the default Drupal front page; you may set the default home page path to this view to make it your front page.'; + $view->tag = 'default'; + $view->view_php = ''; + $view->base_table = 'node'; + $view->is_cacheable = '0'; + $view->api_version = 2; + $view->disabled = TRUE; /* Edit this to true to make a default view disabled initially */ + $handler = $view->new_display('default', 'Defaults', 'default'); + $handler->override_option('sorts', array( + 'sticky' => array( + 'id' => 'sticky', + 'table' => 'node', + 'field' => 'sticky', + 'order' => 'DESC', + ), + 'created' => array( + 'id' => 'created', + 'table' => 'node', + 'field' => 'created', + 'order' => 'DESC', + 'relationship' => 'none', + 'granularity' => 'second', + ), + )); + $handler->override_option('filters', array( + 'promote' => array( + 'id' => 'promote', + 'table' => 'node', + 'field' => 'promote', + 'operator' => '=', + 'value' => '1', + 'group' => 0, + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + ), + 'status' => array( + 'id' => 'status', + 'table' => 'node', + 'field' => 'status', + 'operator' => '=', + 'value' => '1', + 'group' => 0, + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + ), + )); + $handler->override_option('access', array( + 'type' => 'none', + 'role' => array(), + 'perm' => '', + )); + $handler->override_option('header_format', '1'); + $handler->override_option('footer_format', '1'); + $handler->override_option('empty_format', '1'); + $handler->override_option('use_pager', '1'); + $handler->override_option('row_plugin', 'node'); + $handler->override_option('row_options', array( + 'teaser' => 1, + 'links' => 1, + )); + $handler = $view->new_display('page', 'Page', 'page'); + $handler->override_option('path', 'frontpage'); + $handler->override_option('menu', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler = $view->new_display('feed', 'Feed', 'feed'); + $handler->override_option('sitename_title', '1'); + $handler->override_option('title', 'Front page feed'); + $handler->override_option('style_options', array( + 'mission_description' => 1, + 'description' => '', + )); + $handler->override_option('row_plugin', 'node_rss'); + $handler->override_option('row_options', array( + 'item_length' => 'default', + )); + $handler->override_option('path', 'rss.xml'); + $handler->override_option('menu', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler->override_option('displays', array( + 'default' => 'default', + 'page' => 'page', + )); + $views[$view->name] = $view; + + $view = new view; + $view->name = 'glossary'; + $view->description = 'A list of all content, by letter.'; + $view->tag = 'default'; + $view->view_php = ''; + $view->base_table = 'node'; + $view->is_cacheable = '0'; + $view->api_version = 2; + $view->disabled = TRUE; /* Edit this to true to make a default view disabled initially */ + $handler = $view->new_display('default', 'Defaults', 'default'); + $handler->override_option('fields', array( + 'title' => array( + 'label' => 'Title', + 'link_to_node' => 1, + 'exclude' => 0, + 'id' => 'title', + 'table' => 'node', + 'field' => 'title', + 'relationship' => 'none', + ), + 'name' => array( + 'label' => 'Author', + 'link_to_user' => 1, + 'exclude' => 0, + 'id' => 'name', + 'table' => 'users', + 'field' => 'name', + 'relationship' => 'none', + ), + 'changed' => array( + 'label' => 'Last update', + 'date_format' => 'large', + 'custom_date_format' => '', + 'exclude' => 0, + 'id' => 'changed', + 'table' => 'node', + 'field' => 'changed', + 'relationship' => 'none', + ), + )); + $handler->override_option('arguments', array( + 'title' => array( + 'default_action' => 'default', + 'style_plugin' => 'default_summary', + 'style_options' => array(), + 'wildcard' => 'all', + 'wildcard_substitution' => 'All', + 'title' => '', + 'default_argument_type' => 'fixed', + 'default_argument' => '', + 'validate_type' => 'none', + 'validate_fail' => 'not found', + 'glossary' => 1, + 'limit' => '1', + 'case' => 'upper', + 'path_case' => 'lower', + 'transform_dash' => 0, + 'id' => 'title', + 'table' => 'node', + 'field' => 'title', + 'relationship' => 'none', + 'default_argument_user' => 0, + 'default_argument_fixed' => 'a', + 'default_argument_php' => '', + 'validate_argument_vocabulary' => array(), + 'validate_argument_type' => 'tid', + 'validate_argument_php' => '', + ), + )); + $handler->override_option('access', array( + 'type' => 'none', + 'role' => array(), + 'perm' => '', + )); + $handler->override_option('use_ajax', '1'); + $handler->override_option('items_per_page', 36); + $handler->override_option('use_pager', '1'); + $handler->override_option('style_plugin', 'table'); + $handler->override_option('style_options', array( + 'grouping' => '', + 'override' => 1, + 'sticky' => 0, + 'order' => 'asc', + 'columns' => array( + 'title' => 'title', + 'name' => 'name', + 'changed' => 'changed', + ), + 'info' => array( + 'title' => array( + 'sortable' => 1, + 'separator' => '', + ), + 'name' => array( + 'sortable' => 1, + 'separator' => '', + ), + 'changed' => array( + 'sortable' => 1, + 'separator' => '', + ), + ), + 'default' => 'title', + )); + $handler = $view->new_display('page', 'Page', 'page'); + $handler->override_option('path', 'glossary'); + $handler->override_option('menu', array( + 'type' => 'normal', + 'title' => 'Glossary', + 'weight' => '0', + )); + $handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler = $view->new_display('attachment', 'Attachment', 'attachment'); + $handler->override_option('arguments', array( + 'title' => array( + 'default_action' => 'summary asc', + 'style_plugin' => 'unformatted_summary', + 'style_options' => array( + 'count' => 1, + 'override' => 0, + 'items_per_page' => '25', + 'inline' => 1, + 'separator' => ' | ', + ), + 'wildcard' => 'all', + 'wildcard_substitution' => 'All', + 'title' => '', + 'default_argument_type' => 'fixed', + 'default_argument' => '', + 'validate_type' => 'none', + 'validate_fail' => 'not found', + 'glossary' => 1, + 'limit' => '1', + 'case' => 'upper', + 'path_case' => 'lower', + 'transform_dash' => 0, + 'id' => 'title', + 'table' => 'node', + 'field' => 'title', + 'relationship' => 'none', + 'default_argument_user' => 0, + 'default_argument_fixed' => 'a', + 'validate_argument_vocabulary' => array(), + 'validate_argument_php' => '', + ), + )); + $handler->override_option('inherit_arguments', 0); + $handler->override_option('displays', array( + 'default' => 'default', + 'page' => 'page', + )); + $views[$view->name] = $view; + + $view = new view; + $view->name = 'archive'; + $view->description = 'Display a list of months that link to content for that month.'; + $view->tag = 'default'; + $view->view_php = ''; + $view->base_table = 'node'; + $view->is_cacheable = '0'; + $view->api_version = 2; + $view->disabled = TRUE; /* Edit this to true to make a default view disabled initially */ + $handler = $view->new_display('default', 'Defaults', 'default'); + $handler->override_option('title', 'Monthly archive'); + $handler->override_option('sorts', array( + 'created' => array( + 'id' => 'created', + 'table' => 'node', + 'field' => 'created', + 'order' => 'DESC', + 'granularity' => 'second', + 'relationship' => 'none', + ), + )); + $handler->override_option('arguments', array( + 'created_year_month' => array( + 'id' => 'created_year_month', + 'table' => 'node', + 'field' => 'created_year_month', + 'default_action' => 'summary desc', + 'style_plugin' => 'default_summary', + 'style_options' => array( + 'count' => 1, + 'override' => 1, + 'items_per_page' => '30', + ), + 'wildcard' => 'all', + 'wildcard_substitution' => 'All', + 'title' => '%1', + 'relationship' => 'none', + 'validate_type' => 'none', + 'validate_fail' => 'not found', + 'default_argument_type' => 'fixed', + ), + )); + $handler->override_option('filters', array( + 'status' => array( + 'id' => 'status', + 'table' => 'node', + 'field' => 'status', + 'operator' => '=', + 'value' => 1, + 'group' => 0, + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + 'relationship' => 'none', + ), + )); + $handler->override_option('access', array( + 'type' => 'none', + 'role' => array(), + 'perm' => '', + )); + $handler->override_option('use_pager', '1'); + $handler->override_option('row_plugin', 'node'); + $handler->override_option('row_options', array( + 'teaser' => TRUE, + 'links' => TRUE, + )); + $handler = $view->new_display('page', 'Page', 'page'); + $handler->override_option('path', 'archive'); + $handler->override_option('menu', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler = $view->new_display('block', 'Block', 'block'); + $handler->override_option('arguments', array( + 'created_year_month' => array( + 'id' => 'created_year_month', + 'table' => 'node', + 'field' => 'created_year_month', + 'default_action' => 'summary asc', + 'style_plugin' => 'default_summary', + 'style_options' => array( + 'count' => 1, + 'override' => 0, + 'items_per_page' => '30', + ), + 'wildcard' => 'all', + 'wildcard_substitution' => 'All', + 'title' => '%1', + 'relationship' => 'none', + 'validate_type' => 'none', + 'validate_fail' => 'not found', + 'default_argument_type' => 'fixed', + ), + )); + $handler->override_option('block_description', 'Archive list'); + $views[$view->name] = $view; + + return $views; +} diff --git a/modules/node/views_handler_argument_dates_various.inc b/modules/node/views_handler_argument_dates_various.inc new file mode 100644 index 0000000000000000000000000000000000000000..faceea0420942afa11ef6bd6e4ef2226cc8284be --- /dev/null +++ b/modules/node/views_handler_argument_dates_various.inc @@ -0,0 +1,169 @@ +format = 'F j, Y'; + $this->arg_format = 'Ymd'; + $this->formula = views_date_sql_format($this->arg_format, "***table***.$this->real_field"); + } + + /** + * Provide a link to the next level of the view + */ + function summary_name($data) { + $created = $data->{$this->name_alias}; + return format_date(strtotime($created), 'custom', $this->format, 0); + } + + /** + * Provide a link to the next level of the view + */ + function title() { + return format_date(strtotime($this->argument), 'custom', $this->format, 0); + } +} + +/** + * Argument handler for a year (CCYY) + */ +class views_handler_argument_node_created_year extends views_handler_argument_date { + /** + * Constructor implementation + */ + function construct() { + parent::construct(); + $this->arg_format = 'Y'; + $this->formula = views_date_sql_extract('YEAR', "***table***.$this->real_field"); + } +} + +/** + * Argument handler for a year plus month (CCYYMM) + */ +class views_handler_argument_node_created_year_month extends views_handler_argument_date { + /** + * Constructor implementation + */ + function construct() { + parent::construct(); + $this->format = 'F Y'; + $this->arg_format = 'Ym'; + $this->formula = views_date_sql_format($this->arg_format, "***table***.$this->real_field"); + } + + /** + * Provide a link to the next level of the view + */ + function summary_name($data) { + $created = $data->{$this->name_alias}; + return format_date(strtotime($created . "15"), 'custom', $this->format, 0); + } + + /** + * Provide a link to the next level of the view + */ + function title() { + return format_date(strtotime($this->argument . "15"), 'custom', $this->format, 0); + } +} + +/** + * Argument handler for a month (MM) + */ +class views_handler_argument_node_created_month extends views_handler_argument_date { + /** + * Constructor implementation + */ + function construct() { + parent::construct(); + $this->formula = views_date_sql_extract('MONTH', "***table***.$this->real_field"); + $this->format = 'F'; + $this->arg_format = 'm'; + } + + /** + * Provide a link to the next level of the view + */ + function summary_name($data) { + $month = str_pad($data->{$this->name_alias}, 2, '0', STR_PAD_LEFT); + return format_date(strtotime("2005" . $month . "15"), 'custom', $this->format); + } + + /** + * Provide a link to the next level of the view + */ + function title() { + $month = str_pad($this->argument, 2, '0', STR_PAD_LEFT); + return format_date(strtotime("2005" . $month . "15"), 'custom', $this->format, 0); + } + + function summary_argument($data) { + // Make sure the argument contains leading zeroes. + return str_pad($data->{$this->base_alias}, 2, '0', STR_PAD_LEFT); + } +} + +/** + * Argument handler for a day (DD) + */ +class views_handler_argument_node_created_day extends views_handler_argument_date { + /** + * Constructor implementation + */ + function construct() { + parent::construct(); + $this->formula = views_date_sql_extract('DAY', "***table***.$this->real_field"); + $this->format = 'j'; + $this->arg_format = 'd'; + } + + /** + * Provide a link to the next level of the view + */ + function summary_name($data) { + $day = str_pad($data->{$this->name_alias}, 2, '0', STR_PAD_LEFT); + return format_date(strtotime("2005" . "05" . $day), 'custom', $this->format, 0); + } + + /** + * Provide a link to the next level of the view + */ + function title() { + $day = str_pad($this->argument, 2, '0', STR_PAD_LEFT); + return format_date(strtotime("2005" . "05" . $day), 'custom', $this->format, 0); + } + + function summary_argument($data) { + // Make sure the argument contains leading zeroes. + return str_pad($data->{$this->base_alias}, 2, '0', STR_PAD_LEFT); + } +} + +/** + * Argument handler for a week. + */ +class views_handler_argument_node_created_week extends views_handler_argument_date { + /** + * Constructor implementation + */ + function construct() { + parent::construct(); + $this->arg_format = 'w'; + $this->formula = views_date_sql_extract('WEEK', "***table***.$this->real_field"); + } + + /** + * Provide a link to the next level of the view + */ + function summary_name($data) { + $created = $data->{$this->name_alias}; + return t('Week @week', array('@week' => $created)); + } +} diff --git a/modules/node/views_handler_argument_node_language.inc b/modules/node/views_handler_argument_node_language.inc new file mode 100644 index 0000000000000000000000000000000000000000..01465eb0198878412dd83ef72fa7e11c475c2374 --- /dev/null +++ b/modules/node/views_handler_argument_node_language.inc @@ -0,0 +1,32 @@ +node_language($data->{$this->name_alias}); + } + + /** + * Override the behavior of title(). Get the user friendly version of the + * node type. + */ + function title() { + return $this->node_language($this->argument); + } + + function node_language($langcode) { + $languages = locale_language_list(); + return isset($languages[$langcode]) ? $languages[$langcode] : t('Unknown language'); + } +} + diff --git a/modules/node/views_handler_argument_node_nid.inc b/modules/node/views_handler_argument_node_nid.inc new file mode 100644 index 0000000000000000000000000000000000000000..4a2e7d5156d4300c4669fdcf1669bd1e0a87da08 --- /dev/null +++ b/modules/node/views_handler_argument_node_nid.inc @@ -0,0 +1,26 @@ +value), '%d')); + + $result = db_query("SELECT n.title FROM {node} n WHERE n.nid IN ($placeholders)", $this->value); + while ($term = db_fetch_object($result)) { + $titles[] = check_plain($term->title); + } + return $titles; + } +} + diff --git a/modules/node/views_handler_argument_node_type.inc b/modules/node/views_handler_argument_node_type.inc new file mode 100644 index 0000000000000000000000000000000000000000..c9c12d196d522ca49da21407c95c8d9e875b69e8 --- /dev/null +++ b/modules/node/views_handler_argument_node_type.inc @@ -0,0 +1,36 @@ +node_type($data->{$this->name_alias}); + } + + /** + * Override the behavior of title(). Get the user friendly version of the + * node type. + */ + function title() { + return $this->node_type($this->argument); + } + + function node_type($type) { + $output = node_get_types('name', $type); + if (empty($output)) { + return t('Unknown node type'); + } + else { + return check_plain(t($output)); + } + } +} diff --git a/modules/node/views_handler_argument_node_vid.inc b/modules/node/views_handler_argument_node_vid.inc new file mode 100644 index 0000000000000000000000000000000000000000..862ff85d6a2e1f86fd6cdcfe15bfeee0e543a1c9 --- /dev/null +++ b/modules/node/views_handler_argument_node_vid.inc @@ -0,0 +1,28 @@ +value), '%d')); + + $result = db_query("SELECT n.title FROM {node_revisions} n WHERE n.nid IN ($placeholders)", $this->value); + while ($term = db_fetch_object($result)) { + $titles[] = check_plain($term->title); + } + return $titles; + } +} + diff --git a/modules/node/views_handler_field_history_user_timestamp.inc b/modules/node/views_handler_field_history_user_timestamp.inc new file mode 100644 index 0000000000000000000000000000000000000000..f14e1c79dc3cfe39ebd64ecfc77e6f8324360cba --- /dev/null +++ b/modules/node/views_handler_field_history_user_timestamp.inc @@ -0,0 +1,72 @@ +uid) { + $this->additional_fields['created'] = array('table' => 'node', 'field' => 'created'); + $this->additional_fields['changed'] = array('table' => 'node', 'field' => 'changed'); + if (module_exists('comment') && !empty($this->options['comments'])) { + $this->additional_fields['last_comment'] = array('table' => 'node_comment_statistics', 'field' => 'last_comment_timestamp'); + } + } + } + + function option_definition() { + $options = parent::option_definition(); + + $options['comments'] = array('default' => FALSE); + + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + if (module_exists('comment')) { + $form['comments'] = array( + '#type' => 'checkbox', + '#title' => t('Check for new comments as well'), + '#default_value' => !empty($this->options['comments']), + ); + } + } + + function query() { + // Only add ourselves to the query if logged in. + global $user; + if (!$user->uid) { + return; + } + parent::query(); + } + + function render($values) { + // Let's default to 'read' state. + // This code shadows node_mark, but it reads from the db directly and + // we already have that info. + $mark = MARK_READ; + global $user; + if ($user->uid) { + $last_read = $values->{$this->field_alias}; + $created = $values->{$this->aliases['created']}; + $changed = $values->{$this->aliases['changed']}; + + $last_comment = module_exists('comment') && !empty($this->options['comments']) ? $values->{$this->aliases['last_comment']} : 0; + + if (!$last_read && $created > NODE_NEW_LIMIT) { + $mark = MARK_NEW; + } + elseif ($changed > $last_read && $changed > NODE_NEW_LIMIT) { + $mark = MARK_UPDATED; + } + elseif ($last_comment > $last_read && $last_comment > NODE_NEW_LIMIT) { + $mark = MARK_UPDATED; + } + return $this->render_link(theme('mark', $mark), $values); + } + } +} diff --git a/modules/node/views_handler_field_node.inc b/modules/node/views_handler_field_node.inc new file mode 100644 index 0000000000000000000000000000000000000000..8cffbb5542fb68b2da71148b0132b5b0b0a80bf3 --- /dev/null +++ b/modules/node/views_handler_field_node.inc @@ -0,0 +1,64 @@ +additional_fields['nid'] = 'nid'; + if (module_exists('translation')) { + $this->additional_fields['language'] = array('table' => 'node', 'field' => 'language'); + } + } + + function option_definition() { + $options = parent::option_definition(); + $options['link_to_node'] = array('default' => FALSE); + return $options; + } + + /** + * Provide link to node option + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['link_to_node'] = array( + '#title' => t('Link this field to its node'), + '#description' => t('This will override any other link you have set.'), + '#type' => 'checkbox', + '#default_value' => !empty($this->options['link_to_node']), + ); + } + + /** + * Render whatever the data is as a link to the node. + * + * Data should be made XSS safe prior to calling this function. + */ + function render_link($data, $values) { + if (!empty($this->options['link_to_node']) && $data !== NULL && $data !== '') { + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['path'] = "node/" . $values->{$this->aliases['nid']}; + if (isset($this->aliases['language'])) { + $languages = language_list(); + if (isset($languages[$values->{$this->aliases['language']}])) { + $this->options['alter']['language'] = $languages[$values->{$this->aliases['language']}]; + } + } + } + return $data; + } + + function render($values) { + return $this->render_link(check_plain($values->{$this->field_alias}), $values); + } +} diff --git a/modules/node/views_handler_field_node_link.inc b/modules/node/views_handler_field_node_link.inc new file mode 100644 index 0000000000000000000000000000000000000000..673401b8ff3a5027a023bb62082d388b5b8714f4 --- /dev/null +++ b/modules/node/views_handler_field_node_link.inc @@ -0,0 +1,39 @@ +additional_fields['nid'] = 'nid'; + } + + function option_definition() { + $options = parent::option_definition(); + + $options['text'] = array('default' => '', 'translatable' => TRUE); + + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['text'] = array( + '#type' => 'textfield', + '#title' => t('Text to display'), + '#default_value' => $this->options['text'], + ); + } + + function query() { + $this->ensure_my_table(); + $this->add_additional_fields(); + } + + function render($values) { + $text = !empty($this->options['text']) ? $this->options['text'] : t('view'); + $nid = $values->{$this->aliases['nid']}; + return l($text, "node/$nid"); + } +} diff --git a/modules/node/views_handler_field_node_link_delete.inc b/modules/node/views_handler_field_node_link_delete.inc new file mode 100644 index 0000000000000000000000000000000000000000..adfb7714eaac1fa7efb5578f3c3022e1b1b1cc5a --- /dev/null +++ b/modules/node/views_handler_field_node_link_delete.inc @@ -0,0 +1,30 @@ +additional_fields['type'] = 'type'; + $this->additional_fields['uid'] = 'uid'; + $this->additional_fields['format'] = array('table' => 'node_revisions', 'field' => 'format'); + } + + function render($values) { + // ensure user has access to edit this node. + $node = new stdClass(); + $node->nid = $values->{$this->aliases['nid']}; + $node->uid = $values->{$this->aliases['uid']}; + $node->type = $values->{$this->aliases['type']}; + $node->format = $values->{$this->aliases['format']}; + $node->status = 1; // unpublished nodes ignore access control + if (!node_access('delete', $node)) { + return; + } + + $text = !empty($this->options['text']) ? $this->options['text'] : t('delete'); + return l($text, "node/$node->nid/delete", array('query' => drupal_get_destination())); + } +} + diff --git a/modules/node/views_handler_field_node_link_edit.inc b/modules/node/views_handler_field_node_link_edit.inc new file mode 100644 index 0000000000000000000000000000000000000000..4b0caac17275329b026a131f5845562472423fc7 --- /dev/null +++ b/modules/node/views_handler_field_node_link_edit.inc @@ -0,0 +1,30 @@ +additional_fields['uid'] = 'uid'; + $this->additional_fields['type'] = 'type'; + $this->additional_fields['format'] = array('table' => 'node_revisions', 'field' => 'format'); + } + + function render($values) { + // ensure user has access to edit this node. + $node = new stdClass(); + $node->nid = $values->{$this->aliases['nid']}; + $node->uid = $values->{$this->aliases['uid']}; + $node->type = $values->{$this->aliases['type']}; + $node->format = $values->{$this->aliases['format']}; + $node->status = 1; // unpublished nodes ignore access control + if (!node_access('update', $node)) { + return; + } + + $text = !empty($this->options['text']) ? $this->options['text'] : t('edit'); + return l($text, "node/$node->nid/edit", array('query' => drupal_get_destination())); + } +} + diff --git a/modules/node/views_handler_field_node_revision_link_delete.inc b/modules/node/views_handler_field_node_revision_link_delete.inc new file mode 100644 index 0000000000000000000000000000000000000000..af4624eea3491daa6b8f701a15d5946bffbf9ea9 --- /dev/null +++ b/modules/node/views_handler_field_node_revision_link_delete.inc @@ -0,0 +1,38 @@ +additional_fields['uid'] = array('table' => 'node', 'field' => 'uid'); + $this->additional_fields['node_vid'] = array('table' => 'node', 'field' => 'vid'); + $this->additional_fields['vid'] = 'vid'; + $this->additional_fields['format'] = 'format'; + } + + function access() { + return user_access('delete revisions') || user_access('administer nodes'); + } + + function render($values) { + // ensure user has access to edit this node. + $node = new stdClass(); + $node->nid = $values->{$this->aliases['nid']}; + $node->vid = $values->{$this->aliases['vid']}; + $node->uid = $values->{$this->aliases['uid']}; + $node->format = $values->{$this->aliases['format']}; + $node->status = 1; // unpublished nodes ignore access control + if (!node_access('delete', $node)) { + return; + } + + // Current revision cannot be deleted. + if ($node->vid == $values->{$this->aliases['node_vid']}) { + return; + } + $text = !empty($this->options['text']) ? $this->options['text'] : t('delete'); + return l($text, "node/$node->nid/revisions/$node->vid/delete", array('query' => drupal_get_destination())); + } +} diff --git a/modules/node/views_handler_field_node_revision_link_revert.inc b/modules/node/views_handler_field_node_revision_link_revert.inc new file mode 100644 index 0000000000000000000000000000000000000000..bc77b5de4ff9b91e970fb85763e428eadaa813a7 --- /dev/null +++ b/modules/node/views_handler_field_node_revision_link_revert.inc @@ -0,0 +1,39 @@ +additional_fields['uid'] = array('table' => 'node', 'field' => 'uid'); + $this->additional_fields['node_vid'] = array('table' => 'node', 'field' => 'vid'); + $this->additional_fields['vid'] = 'vid'; + $this->additional_fields['format'] = 'format'; + } + + function access() { + return user_access('revert revisions') || user_access('administer nodes'); + } + + function render($values) { + // ensure user has access to edit this node. + $node = new stdClass(); + $node->nid = $values->{$this->aliases['nid']}; + $node->vid = $values->{$this->aliases['vid']}; + $node->uid = $values->{$this->aliases['uid']}; + $node->format = $values->{$this->aliases['format']}; + $node->status = 1; // unpublished nodes ignore access control + if (!node_access('update', $node)) { + return; + } + + // Current revision cannot be reverted. + if ($node->vid == $values->{$this->aliases['node_vid']}) { + return; + } + + $text = !empty($this->options['text']) ? $this->options['text'] : t('revert'); + return l($text, "node/$node->nid/revisions/$node->vid/revert", array('query' => drupal_get_destination())); + } +} diff --git a/modules/node/views_handler_field_node_type.inc b/modules/node/views_handler_field_node_type.inc new file mode 100644 index 0000000000000000000000000000000000000000..8b5c54c241c8d19b1b34263d0de5409d9ed9a844 --- /dev/null +++ b/modules/node/views_handler_field_node_type.inc @@ -0,0 +1,13 @@ +{$this->field_alias}); + return $this->render_link(t(check_plain($value)), $values); + } +} + diff --git a/modules/node/views_handler_filter_history_user_timestamp.inc b/modules/node/views_handler_filter_history_user_timestamp.inc new file mode 100644 index 0000000000000000000000000000000000000000..06e00bc91a33f589c5a7cbe15b441155acdf741f --- /dev/null +++ b/modules/node/views_handler_filter_history_user_timestamp.inc @@ -0,0 +1,72 @@ +options['expose']['label'])) { + $label = $this->options['expose']['label']; + } + else { + $label = t('Has new content'); + } + $form['value'] = array( + '#type' => 'checkbox', + '#title' => $label, + '#default_value' => $this->value, + ); + } + } + + function query() { + global $user; + // This can only work if we're logged in. + if (!$user || !$user->uid) { + return; + } + + // Don't filter if we're exposed and the checkbox isn't selected. + if ((!empty($this->options['exposed'])) && empty($this->value)) { + return; + } + + // Hey, Drupal kills old history, so nodes that haven't been updated + // since NODE_NEW_LIMIT are bzzzzzzzt outta here! + + $limit = time() - NODE_NEW_LIMIT; + + $this->ensure_my_table(); + $field = "$this->table_alias.$this->real_field"; + $node = $this->query->ensure_table('node'); + + if (module_exists('comment')) { + $ncs = $this->query->ensure_table('node_comment_statistics'); + $clause = ("OR $ncs.last_comment_timestamp > (***CURRENT_TIME*** - $limit)"); + $clause2 = "OR $field < $ncs.last_comment_timestamp"; + } + + // NULL means a history record doesn't exist. That's clearly new content. + // Unless it's very very old content. Everything in the query is already + // type safe cause none of it is coming from outside here. + $this->query->add_where($this->options['group'], "($field IS NULL AND ($node.changed > (***CURRENT_TIME*** - $limit) $clause)) OR $field < $node.changed $clause2"); + } + + function admin_summary() { + if (!empty($this->options['exposed'])) { + return t('exposed'); + } + } +} + diff --git a/modules/node/views_handler_filter_node_access.inc b/modules/node/views_handler_filter_node_access.inc new file mode 100644 index 0000000000000000000000000000000000000000..fe69e6ce0b4f432a007259a294a61c1d14c1ecb6 --- /dev/null +++ b/modules/node/views_handler_filter_node_access.inc @@ -0,0 +1,33 @@ +ensure_my_table(); + $grants = array(); + foreach (node_access_grants('view') as $realm => $gids) { + foreach ($gids as $gid) { + $grants[] = "($table.gid = $gid AND $table.realm = '$realm')"; + } + } + $grants_sql = ''; + if (count($grants)) { + $grants_sql = implode(' OR ', $grants); + } + $this->query->add_where('AND', $grants_sql); + $this->query->add_where('AND', "$table.grant_view >= 1"); + } + } +} diff --git a/modules/node/views_handler_filter_node_status.inc b/modules/node/views_handler_filter_node_status.inc new file mode 100644 index 0000000000000000000000000000000000000000..850a480bdeb46033ed479ce6d6baade191ceaec4 --- /dev/null +++ b/modules/node/views_handler_filter_node_status.inc @@ -0,0 +1,14 @@ +ensure_my_table(); + $this->query->add_where($this->options['group'], "$table.status <> 0 OR ($table.uid = ***CURRENT_USER*** AND ***CURRENT_USER*** <> 0) OR ***ADMINISTER_NODES*** = 1"); + } +} diff --git a/modules/node/views_handler_filter_node_type.inc b/modules/node/views_handler_filter_node_type.inc new file mode 100644 index 0000000000000000000000000000000000000000..ea57a566995a945f74305d8cea2026b95260934a --- /dev/null +++ b/modules/node/views_handler_filter_node_type.inc @@ -0,0 +1,17 @@ +value_options)) { + $this->value_title = t('Node type'); + $types = node_get_types(); + foreach ($types as $type => $info) { + $options[$type] = t($info->name); + } + $this->value_options = $options; + } + } +} diff --git a/modules/node/views_plugin_argument_default_node.inc b/modules/node/views_plugin_argument_default_node.inc new file mode 100644 index 0000000000000000000000000000000000000000..a26700150bb3d86661cd732c4eb181800d630df4 --- /dev/null +++ b/modules/node/views_plugin_argument_default_node.inc @@ -0,0 +1,28 @@ +nid; + } + } + + if (arg(0) == 'node' && is_numeric(arg(1))) { + return arg(1); + } + } +} + diff --git a/modules/node/views_plugin_argument_validate_node.inc b/modules/node/views_plugin_argument_validate_node.inc new file mode 100644 index 0000000000000000000000000000000000000000..f62bed12ec1fcf2cb6a43eec51be2505abc76888 --- /dev/null +++ b/modules/node/views_plugin_argument_validate_node.inc @@ -0,0 +1,123 @@ + $info) { + $options[$type] = check_plain(t($info->name)); + } + + $arg = $this->get_argument(); + if (empty($arg)) { + $arg = array(); + } + + $form[$this->option_name] = array( + '#type' => 'checkboxes', + '#prefix' => '
    ', + '#suffix' => '
    ', + '#title' => t('Types'), + '#options' => $options, + '#default_value' => $arg, + '#description' => t('If you wish to validate for specific node types, check them; if none are checked, all nodes will pass.'), + '#process' => array('expand_checkboxes', 'views_process_dependency'), + '#dependency' => array('edit-options-validate-type' => array($this->id)), + ); + + $form['validate_argument_node_access'] = array( + '#type' => 'checkbox', + '#title' => t('Validate user has access to the node'), + '#default_value' => !empty($this->argument->options['validate_argument_node_access']), + '#process' => array('views_process_dependency'), + '#dependency' => array('edit-options-validate-type' => array($this->id)), + ); + + $form['validate_argument_nid_type'] = array( + '#type' => 'select', + '#title' => t('Argument type'), + '#options' => array( + 'nid' => t('Node ID'), + 'nids' => t('Node IDs separated by , or +'), + ), + '#default_value' => isset($this->argument->options['validate_argument_nid_type']) ? $this->argument->options['validate_argument_nid_type'] : 'nid', + '#process' => array('views_process_dependency'), + '#dependency' => array('edit-options-validate-type' => array($this->id)), + ); + } + + function validate_argument($argument) { + $types = array_filter($this->argument->options[$this->option_name]); + + $type = isset($this->argument->options['validate_argument_nid_type']) ? $this->argument->options['validate_argument_nid_type'] : 'nid'; + + switch ($type) { + case 'nid': + if (!is_numeric($argument)) { + return FALSE; + } + $node = node_load($argument); + if (!$node) { + return FALSE; + } + + if (!empty($this->argument->options['validate_argument_node_access'])) { + if (!node_access('view', $node)) { + return FALSE; + } + } + + // Save the title() handlers some work. + $this->argument->validated_title = check_plain($node->title); + + if (empty($types)) { + return TRUE; + } + + return isset($types[$node->type]); + break; + case 'nids': + $nids = new stdClass(); + $nids->value = array($argument); + $nids = views_break_phrase($argument, $nids); + if ($nids->value == -1) { + return FALSE; + } + + $placeholders = implode(', ', array_fill(0, sizeof($nids->value), '%d')); + + $test = drupal_map_assoc($nids->value); + $titles = array(); + + $result = db_query("SELECT * FROM {node} WHERE nid IN ($placeholders)", $nids->value); + while ($node = db_fetch_object($result)) { + if ($types && empty($types[$node->type])) { + return FALSE; + } + + if (!empty($this->argument->options['validate_argument_node_access'])) { + if (!node_access('view', $node)) { + return FALSE; + } + } + + $titles[] = check_plain($node->title); + unset($test[$node->nid]); + } + + $this->argument->validated_title = implode($nids->operator == 'or' ? ' + ' : ', ', $titles); + // If this is not empty, we did not find a nid. + return empty($test); + } + } +} + diff --git a/modules/node/views_plugin_row_node_rss.inc b/modules/node/views_plugin_row_node_rss.inc new file mode 100644 index 0000000000000000000000000000000000000000..75fa2525901859dad2d5a74e66a3bc4814b98e47 --- /dev/null +++ b/modules/node/views_plugin_row_node_rss.inc @@ -0,0 +1,140 @@ + 'default'); + + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + + $form['item_length'] = array( + '#type' => 'select', + '#title' => t('Display type'), + '#options' => array( + 'fulltext' => t('Full text'), + 'teaser' => t('Title plus teaser'), + 'title' => t('Title only'), + 'default' => t('Use default RSS settings'), + ), + '#default_value' => $this->options['item_length'], + ); + } + + function render($row) { + // For the most part, this code is taken from node_feed() in node.module + global $base_url; + + $nid = $row->{$this->field_alias}; + if (!is_numeric($nid)) { + return; + } + + $item_length = $this->options['item_length']; + if ($item_length == 'default') { + $item_length = variable_get('feed_item_length', 'teaser'); + } + + // Load the specified node: + $node = node_load($nid); + if (empty($node)) { + return; + } + + $node->build_mode = NODE_BUILD_RSS; + + if ($item_length != 'title') { + $teaser = ($item_length == 'teaser') ? TRUE : FALSE; + + // Filter and prepare node teaser + if (node_hook($node, 'view')) { + $node = node_invoke($node, 'view', $teaser, FALSE); + } + else { + $node = node_prepare($node, $teaser); + } + + // Allow modules to change $node->teaser before viewing. + node_invoke_nodeapi($node, 'view', $teaser, FALSE); + } + + // Set the proper node part, then unset unused $node part so that a bad + // theme can not open a security hole. + $content = drupal_render($node->content); + if ($teaser) { + $node->teaser = $content; + unset($node->body); + } + else { + $node->body = $content; + unset($node->teaser); + } + + // Allow modules to modify the fully-built node. + node_invoke_nodeapi($node, 'alter', $teaser, FALSE); + + $item = new stdClass(); + $item->title = $node->title; + $item->link = url("node/$row->nid", array('absolute' => TRUE)); + + // Allow modules to add additional item fields and/or modify $item + $extra = node_invoke_nodeapi($node, 'rss item'); + $item->elements = array_merge($extra, + array( + array('key' => 'pubDate', 'value' => gmdate('r', $node->created)), + array( + 'key' => 'dc:creator', + 'value' => $node->name, + 'namespace' => array('xmlns:dc' => 'http://purl.org/dc/elements/1.1/'), + ), + array( + 'key' => 'guid', + 'value' => $node->nid . ' at ' . $base_url, + 'attributes' => array('isPermaLink' => 'false') + ), + ) + ); + + foreach ($item->elements as $element) { + if (isset($element['namespace'])) { + $this->view->style_plugin->namespaces = array_merge($this->view->style_plugin->namespaces, $element['namespace']); + } + } + + // Prepare the item description + switch ($item_length) { + case 'fulltext': + $item->description = $node->body; + break; + case 'teaser': + $item->description = $node->teaser; + if (!empty($item->readmore)) { + $item->description .= '

    ' . l(t('read more'), 'node/' . $item->nid, array('absolute' => TRUE, 'attributes' => array('target' => '_blank'))) . '

    '; + } + break; + case 'title': + $item->description = ''; + break; + } + + return theme($this->theme_functions(), $this->view, $this->options, $item); + } +} + diff --git a/modules/node/views_plugin_row_node_view.inc b/modules/node/views_plugin_row_node_view.inc new file mode 100644 index 0000000000000000000000000000000000000000..e0d0e538cb6f562bfeb25d1e2a7fda854c3465ad --- /dev/null +++ b/modules/node/views_plugin_row_node_view.inc @@ -0,0 +1,73 @@ +options['teaser'])) { + $this->options['build_mode'] = $this->options['teaser'] ? 'teaser' : 'full'; + } + } + + function option_definition() { + $options = parent::option_definition(); + + $options['build_mode'] = array('default' => 'teaser'); + $options['links'] = array('default' => TRUE); + $options['comments'] = array('default' => FALSE); + + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + + // CCK holds the registry of available build modes, but can hardly + // push them as options for the node row style, so we break the normal + // rule of not directly relying on non-core modules. + if ($modes = module_invoke('content', 'build_modes')) { + $options = array(); + foreach ($modes as $key => $value) { + if (isset($value['views style']) && $value['views style']) { + $options[$key] = $value['title']; + } + } + } + else { + $options = array( + 'teaser' => t('Teaser'), + 'full' => t('Full node') + ); + } + $form['build_mode'] = array( + '#type' => 'select', + '#options' => $options, + '#title' => t('Build mode'), + '#default_value' => $this->options['build_mode'], + ); + $form['links'] = array( + '#type' => 'checkbox', + '#title' => t('Display links'), + '#default_value' => $this->options['links'], + ); + $form['comments'] = array( + '#type' => 'checkbox', + '#title' => t('Display node comments'), + '#default_value' => $this->options['comments'], + ); + } +} diff --git a/modules/poll.views.inc b/modules/poll.views.inc new file mode 100644 index 0000000000000000000000000000000000000000..1be49751c71266aaabe49fad37595e1a3efd12eb --- /dev/null +++ b/modules/poll.views.inc @@ -0,0 +1,56 @@ + array( + 'left_field' => 'nid', + 'field' => 'nid', + ), + ); + + // ---------------------------------------------------------------- + // Fields + + // poll active status + $data['poll']['active'] = array( + 'title' => t('Active'), + 'help' => t('Whether the poll is open for voting.'), + 'field' => array( + 'handler' => 'views_handler_field_boolean', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_boolean_operator', + 'label' => t('Active'), + 'type' => 'yes-no', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + return $data; +} + +/** + * @} + */ diff --git a/modules/profile.views.inc b/modules/profile.views.inc new file mode 100644 index 0000000000000000000000000000000000000000..e1255b0b780465a1858422822bf8529e84d1d3ca --- /dev/null +++ b/modules/profile.views.inc @@ -0,0 +1,245 @@ + array( + 'left_table' => 'profile_values', + 'left_field' => 'uid', + 'field' => 'uid', + ), + 'users' => array( + 'left_table' => 'profile_values', + 'left_field' => 'uid', + 'field' => 'uid', + ), + ); + + $fields = profile_views_get_fields(); + foreach($fields as $field) { + $table_name = 'profile_values_' . $field->name; + $data[$table_name] = array( + 'table' => array( + 'group' => t('Profile'), + 'join' => array( + 'node' => array( + 'table' => 'profile_values', + 'left_table' => 'users', + 'left_field' => 'uid', + 'field' => 'uid', + 'extra' => array(array('field' => 'fid', 'value' => $field->fid)), + ), + 'users' => array( + 'table' => 'profile_values', + 'left_field' => 'uid', + 'field' => 'uid', + 'extra' => array(array('field' => 'fid', 'value' => $field->fid)), + ), + ), + ), + ); + // All fields in the table are named 'value'. + $data[$table_name]['value'] = profile_views_fetch_field($field); + } + + return $data; +} + +/** + * Get all profile fields + */ +function profile_views_get_fields() { + static $fields = NULL; + + if (!isset($fields)) { + $fields = array(); + $results = db_query("SELECT * FROM {profile_fields} ORDER BY category, weight"); + + while ($row = db_fetch_object($results)) { + if (!empty($row->options)) { + if (!in_array(substr($row->options, 0, 2), array('a:', 'b:', 'i:', 'f:', 'o:', 's:', ))) { + // unserialized fields default version + $options = $row->options; + unset($row->options); + $row->options = $options; + } + else { + // serialized fields or modified version + $row->options = unserialize(db_decode_blob($row->options)); + } + } + $fields[$row->fid] = $row; + } + } + return $fields; +} + + +/** + * Add profile fields to view table + */ +function profile_views_fetch_field($field) { + $data = array( + 'title' => t('@field-name', array('@field-name' => $field->title)), + ); + + // Add fields specific to the profile type. + switch ($field->type) { + case 'textfield': + $data += array( + 'help' => t('Profile textfield'), + 'field' => array( + 'handler' => 'views_handler_field_user', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + break; + case 'textarea': + $data += array( + 'help' => t('Profile textarea'), + 'field' => array( + 'handler' => 'views_handler_field_markup', + 'format' => FILTER_FORMAT_DEFAULT, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ); + + break; + case 'checkbox': + $data += array( + 'help' => t('Profile checkbox'), + 'field' => array( + 'handler' => 'views_handler_field_boolean', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_boolean_operator', + ), + // @todo there ought to be a boolean argument handler + ); + + break; + case 'url': + $data += array( + 'help' => t('Profile URL'), + 'field' => array( + 'handler' => 'views_handler_field_url', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ); + + break; + case 'selection': + $data += array( + 'help' => t('Profile selection'), + 'field' => array( + 'handler' => 'views_handler_field', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_profile_selection', + 'fid' => $field->fid, + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + break; + case 'list': + $data += array( + 'help' => t('Profile freeform list %field-name.', array('%field-name' => $field->title)), + 'field' => array( + 'handler' => 'views_handler_field_profile_list', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ); + + break; + case 'date': + $data += array( + 'help' => t('Profile date %field-name.', array('%field-name' => $field->title)), + 'field' => array( + 'handler' => 'views_handler_field_profile_date', + ), + ); + + break; + } + + // @todo: add access control to hidden fields. + return $data; +} + +/** + * Implementation of hook_views_handlers() to register all of the basic handlers + * views uses. + */ +function profile_views_handlers() { + return array( + 'info' => array( + 'path' => drupal_get_path('module', 'views') . '/modules/profile', + ), + 'handlers' => array( + 'views_handler_field_profile_date' => array( + 'parent' => 'views_handler_field_date', + ), + 'views_handler_field_profile_list' => array( + 'parent' => 'views_handler_field_prerender_list', + ), + 'views_handler_filter_profile_selection' => array( + 'parent' => 'views_handler_filter_in_operator', + ), + ), + ); +} + +/** + * @} + */ diff --git a/modules/profile.views_convert.inc b/modules/profile.views_convert.inc new file mode 100644 index 0000000000000000000000000000000000000000..f8e39a723ec007252caaa4d505c287d1d1b4a68a --- /dev/null +++ b/modules/profile.views_convert.inc @@ -0,0 +1,40 @@ +add_item() won't produce + * the right results, usually needed to set field options or values. + */ +function profile_views_convert($display, $type, &$view, $field, $id = NULL) { + static $profile_fields; + if (!isset($profile_fields)) { + $profile_fields = array(); + foreach (profile_views_get_fields() as $profile_field) { + $profile_fields['profile_values_'. $profile_field->name] = $profile_field; + } + } + switch ($type) { + case 'filter': + if (isset($tables[$field['tablename']])) { + switch ($profile_fields[$field['tablename']]->type) { + case 'vocabulary': + case 'selection': + $operators = array('AND' => 'in', 'OR' => 'in', 'NOR' => 'not in'); + $view->set_item_option($display, 'filter', $id, 'operator', $operators[$field['operator']]); + break; + default: + $view->set_item_option($display, 'filter', $id, 'operator', $field['operator']); + break; + } + } + break; + } +} \ No newline at end of file diff --git a/modules/profile/views_handler_field_profile_date.inc b/modules/profile/views_handler_field_profile_date.inc new file mode 100644 index 0000000000000000000000000000000000000000..6ac4ba01919c6fe64d0a7a2fc4c89dda0caa2897 --- /dev/null +++ b/modules/profile/views_handler_field_profile_date.inc @@ -0,0 +1,82 @@ +{$this->field_alias}) { + return; + } + $value = unserialize($value->{$this->field_alias}); + $format = $this->options['date_format']; + switch ($format) { + case 'custom': + $format = $this->options['custom_date_format']; + break; + case 'small': + $format = variable_get('date_format_short', 'm/d/Y - H:i'); + break; + case 'medium': + $format = variable_get('date_format_medium', 'D, m/d/Y - H:i'); + break; + case 'large': + $format = variable_get('date_format_long', 'l, F j, Y - H:i'); + break; + } + + // Note: Avoid PHP's date() because it does not handle dates before + // 1970 on Windows. This would make the date field useless for e.g. + // birthdays. + + // But we *can* deal with non-year stuff: + $date = gmmktime(0, 0, 0, $value['month'], $value['day'], 1970); + $replace = array( + // day + 'd' => sprintf('%02d', $value['day']), + 'D' => NULL, + 'l' => NULL, + 'N' => NULL, + 'S' => date('S', $date), + 'w' => NULL, + 'j' => $value['day'], + // month + 'F' => date('F', $date), + 'm' => sprintf('%02d', $value['month']), + 'M' => date('M', $date), + 'n' => date('n', $date), + + 'Y' => $value['year'], + 'y' => substr($value['year'], 2, 2), + + // kill time stuff + 'a' => NULL, + 'A' => NULL, + 'g' => NULL, + 'G' => NULL, + 'h' => NULL, + 'H' => NULL, + 'i' => NULL, + 's' => NULL, + ':' => NULL, + 'T' => NULL, + ' - ' => NULL, + ':' => NULL, + ); + + return strtr($format, $replace); + } +} + diff --git a/modules/profile/views_handler_field_profile_list.inc b/modules/profile/views_handler_field_profile_list.inc new file mode 100644 index 0000000000000000000000000000000000000000..df766c5741fe21dd050a5c4753149cfbcb2c2e40 --- /dev/null +++ b/modules/profile/views_handler_field_profile_list.inc @@ -0,0 +1,31 @@ +{$this->field_alias}; + $this->items[$field] = array(); + foreach (split("[\n\r]", $field) as $item) { + if ($item != '' && $item !== NULL) { + $this->items[$field]['item'] = $item; + } + } + } + + function render_item($count, $item) { + return $item['item']; + } + + function document_self_tokens(&$tokens) { + $tokens['[' . $this->options['id'] . '-item' . ']'] = t('The text of the profile item.'); + } + + function add_self_tokens(&$tokens, $item) { + $tokens['[' . $this->options['id'] . '-item' . ']'] = $item['item']; + } +} diff --git a/modules/profile/views_handler_filter_profile_selection.inc b/modules/profile/views_handler_filter_profile_selection.inc new file mode 100644 index 0000000000000000000000000000000000000000..cc4c69de87711c2a2208434854b4a6caf208e90e --- /dev/null +++ b/modules/profile/views_handler_filter_profile_selection.inc @@ -0,0 +1,24 @@ +value_options)) { + return; + } + + $this->value_options = array(); + $all_options = profile_views_get_fields(); + $field = $all_options[$this->definition['fid']]; + + $lines = split("[,\n\r]", $field->options); + foreach ($lines as $line) { + if ($line = trim($line)) { + $this->value_options[$line] = $line; + } + } + } +} diff --git a/modules/search.views.inc b/modules/search.views.inc new file mode 100644 index 0000000000000000000000000000000000000000..59d80a7984c99d0707854805b2134a5afd3c0e24 --- /dev/null +++ b/modules/search.views.inc @@ -0,0 +1,224 @@ + array( + 'left_field' => 'nid', + 'field' => 'sid', + ), + ); + + $data['search_total']['table']['join'] = array( + 'node' => array( + 'left_table' => 'search_index', + 'left_field' => 'word', + 'field' => 'word', + ), + 'users' => array( + 'left_table' => 'search_index', + 'left_field' => 'word', + 'field' => 'word', + ) + ); + + $data['search_dataset']['table']['join'] = array( + 'node' => array( + 'left_table' => 'search_index', + 'left_field' => 'sid', + 'field' => 'sid', + 'extra' => 'search_index.type = search_dataset.type', + 'type' => 'INNER', + ), + 'users' => array( + 'left_table' => 'search_index', + 'left_field' => 'sid', + 'field' => 'sid', + 'extra' => 'search_index.type = search_dataset.type', + 'type' => 'INNER', + ), + ); + + // ---------------------------------------------------------------- + // Fields + + // score + $data['search_index']['score'] = array( + 'title' => t('Score'), + 'help' => t('The score of the search item. This will not be used if the search filter is not also present.'), + 'field' => array( + 'handler' => 'views_handler_field_search_score', + 'click sortable' => TRUE, + 'float' => TRUE, + ), + // Information for sorting on a search score. + 'sort' => array( + 'handler' => 'views_handler_sort_search_score', + ), + ); + + // Search node links: forward links. + $data['search_node_links_from']['table']['group'] = t('Search'); + $data['search_node_links_from']['table']['join'] = array( + 'node' => array( + 'arguments' => array('search_node_links', 'node', 'nid', 'nid', NULL, 'INNER'), + ), + ); + $data['search_node_links_from']['sid'] = array( + 'title' => t('Links from'), + 'help' => t('Other nodes that are linked from the node.'), + 'argument' => array( + 'handler' => 'views_handler_argument_node_nid', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_equality', + ), + ); + + // Search node links: backlinks. + $data['search_node_links_to']['table']['group'] = t('Search'); + $data['search_node_links_to']['table']['join'] = array( + 'node' => array( + 'arguments' => array('search_node_links', 'node', 'nid', 'sid', NULL, 'INNER'), + ), + ); + $data['search_node_links_to']['nid'] = array( + 'title' => t('Links to'), + 'help' => t('Other nodes that link to the node.'), + 'argument' => array( + 'handler' => 'views_handler_argument_node_nid', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_equality', + ), + ); + + // search filter + $data['search_index']['keys'] = array( + 'title' => t('Search Terms'), // The item it appears as on the UI, + 'help' => t('The terms to search for.'), // The help that appears on the UI, + // Information for searching terms using the full search syntax + 'filter' => array( + 'handler' => 'views_handler_filter_search', + ), + ); + + return $data; +} + +/** + * Implementation of hook_views_handlers() to register all of the basic handlers + * views uses. + */ +function search_views_handlers() { + return array( + 'info' => array( + 'path' => drupal_get_path('module', 'views') . '/modules/search', + ), + 'handlers' => array( + 'views_handler_field_search_score' => array( + 'parent' => 'views_handler_field_numeric', + ), + 'views_handler_sort_search_score' => array( + 'parent' => 'views_handler_sort', + ), + 'views_handler_filter_search' => array( + 'parent' => 'views_handler_filter', + ), + ), + ); +} + +/** + * Implementation of hook_views_plugins + */ +function search_views_plugins() { + return; + // DISABLED. This currently doesn't work. + return array( + 'module' => 'views', // This just tells our themes are elsewhere. + 'row' => array( + 'search' => array( + 'title' => t('Search'), + 'help' => t('Display the results with standard search view.'), + 'handler' => 'views_plugin_row_search_view', + 'path' => drupal_get_path('module', 'views') . '/modules/search', // not necessary for most modules + 'theme' => 'views_view_row_search', + 'base' => array('node'), // only works with 'node' as base. + 'type' => 'normal', + ), + ), + ); +} + +/** + * Template helper for theme_views_view_row_search + */ +function template_preprocess_views_view_row_search(&$vars) { + $vars['node'] = ''; // make sure var is defined. + $nid = $vars['row']->nid; + if (!is_numeric($nid)) { + return; + } + + $node = node_load($nid); + + if (empty($node)) { + return; + } + + // Build the node body. + $node = node_build_content($node, FALSE, FALSE); + $node->body = drupal_render($node->content); + + // Fetch comments for snippet + $node->body .= module_invoke('comment', 'nodeapi', $node, 'update index'); + + // Fetch terms for snippet + $node->body .= module_invoke('taxonomy', 'nodeapi', $node, 'update index'); + + $vars['url'] = url('node/' . $nid); + $vars['title'] = check_plain($node->title); + + $info = array(); + $info['type'] = node_get_types('name', $node); + $info['user'] = theme('username', $node); + $info['date'] = format_date($node->changed, 'small'); + $extra = node_invoke_nodeapi($node, 'search result'); + if (isset($extra) && is_array($extra)) { + $info = array_merge($info, $extra); + } + $vars['info_split'] = $info; + $vars['info'] = implode(' - ', $info); + + $vars['node'] = $node; + // @todo: get score from ??? +//$vars['score'] = $item->score; + $vars['snippet'] = search_excerpt($vars['view']->value, $node->body); +} + + +/** + * @} + */ diff --git a/modules/search.views_convert.inc b/modules/search.views_convert.inc new file mode 100644 index 0000000000000000000000000000000000000000..b573996c61b0589eb5b8f8821cdfbcc1b15064c1 --- /dev/null +++ b/modules/search.views_convert.inc @@ -0,0 +1,24 @@ +set_item_option($display, 'filter', $id, 'table', 'search_index'); + $view->set_item_option($display, 'filter', $id, 'field', 'keys'); + break; + } + break; + } + break; + } +} diff --git a/modules/search.views_default.inc b/modules/search.views_default.inc new file mode 100644 index 0000000000000000000000000000000000000000..4cb707e94524ef254c734b2a0e8d7181d24e7a6e --- /dev/null +++ b/modules/search.views_default.inc @@ -0,0 +1,152 @@ +name = 'backlinks'; + $view->description = 'Displays a list of nodes that link to the node, using the search backlinks table.'; + $view->tag = 'default'; + $view->view_php = ''; + $view->base_table = 'node'; + $view->is_cacheable = '0'; + $view->api_version = 2; + $view->disabled = TRUE; /* Edit this to true to make a default view disabled initially */ + $handler = $view->new_display('default', 'Defaults', 'default'); + $handler->override_option('fields', array( + 'title' => array( + 'id' => 'title', + 'table' => 'node', + 'field' => 'title', + 'label' => '', + 'relationship' => 'none', + 'link_to_node' => 1, + ), + )); + $handler->override_option('arguments', array( + 'nid' => array( + 'id' => 'nid', + 'table' => 'search_node_links_to', + 'field' => 'nid', + 'default_action' => 'not found', + 'style_plugin' => 'default_summary', + 'style_options' => array( + 'count' => TRUE, + 'override' => FALSE, + 'items_per_page' => 25, + ), + 'wildcard' => '', + 'wildcard_substitution' => '', + 'title' => 'Pages that link to %1', + 'default_argument_type' => 'fixed', + 'default_argument' => '', + 'validate_type' => 'node', + 'validate_fail' => 'not found', + 'relationship' => 'none', + 'default_argument_fixed' => '', + 'default_argument_php' => '', + 'validate_argument_node_type' => array(), + 'validate_argument_php' => '', + ), + )); + $handler->override_option('filters', array( + 'status' => array( + 'id' => 'status', + 'table' => 'node', + 'field' => 'status', + 'operator' => '=', + 'value' => 1, + 'group' => 0, + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + 'relationship' => 'none', + ), + )); + $handler->override_option('access', array( + 'type' => 'none', + 'role' => array(), + 'perm' => '', + )); + $handler->override_option('empty', 'No backlinks found.'); + $handler->override_option('empty_format', '1'); + $handler->override_option('items_per_page', 30); + $handler->override_option('use_pager', '1'); + $handler->override_option('style_plugin', 'list'); + $handler->override_option('style_options', array( + 'type' => 'ol', + )); + $handler = $view->new_display('page', 'Page', 'page'); + $handler->override_option('path', 'node/%/backlinks'); + $handler->override_option('menu', array( + 'type' => 'tab', + 'title' => 'What links here', + 'weight' => '0', + )); + $handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler = $view->new_display('block', 'Block', 'block'); + $handler->override_option('arguments', array( + 'nid' => array( + 'id' => 'nid', + 'table' => 'search_node_links_to', + 'field' => 'nid', + 'default_action' => 'default', + 'style_plugin' => 'default_summary', + 'style_options' => array( + 'count' => TRUE, + 'override' => FALSE, + 'items_per_page' => 25, + ), + 'wildcard' => '', + 'wildcard_substitution' => '', + 'title' => 'What links here', + 'default_argument_type' => 'node', + 'default_argument' => '', + 'validate_type' => 'node', + 'validate_fail' => 'not found', + 'relationship' => 'none', + 'default_argument_fixed' => '', + 'default_argument_php' => 'return ($node = menu_get_object()) ? $node->nid : FALSE;', + 'validate_argument_node_type' => array( + 'album' => 0, + 'artist' => 0, + 'book' => 0, + 'page' => 0, + 'story' => 0, + 'track' => 0, + ), + 'validate_argument_php' => '', + 'default_argument_user' => 0, + 'validate_argument_vocabulary' => array( + '3' => 0, + '4' => 0, + '1' => 0, + '5' => 0, + '2' => 0, + ), + 'validate_argument_type' => 'tid', + ), + )); + $handler->override_option('items_per_page', 6); + $handler->override_option('use_more', 1); + $handler->override_option('style_plugin', 'list'); + $handler->override_option('style_options', array( + 'type' => 'ul', + )); + $handler->override_option('block_description', 'What links here'); + $views[$view->name] = $view; + + return $views; +} diff --git a/modules/search/views_handler_field_search_score.inc b/modules/search/views_handler_field_search_score.inc new file mode 100644 index 0000000000000000000000000000000000000000..f85d0903bea05b359617e3db19d63ee1cfcb1b4a --- /dev/null +++ b/modules/search/views_handler_field_search_score.inc @@ -0,0 +1,82 @@ + ''); + $options['alternate_order'] = array('default' => 'asc'); + + return $options; + } + + function options_form(&$form, &$form_state) { + $style_options = $this->view->display_handler->get_option('style_options'); + if (isset($style_options['default']) && $style_options['default'] == $this->options['id']) { + $handlers = $this->view->display_handler->get_handlers('field'); + $options = array('' => t('No alternate')); + foreach ($handlers as $id => $handler) { + $options[$id] = $handler->ui_name(); + } + + $form['alternate_sort'] = array( + '#type' => 'select', + '#title' => t('Alternative sort'), + '#description' => t('If no search is performed and this field does not appear, pick an alternative default table sort field.'), + '#options' => $options, + '#default_value' => $this->options['alternate_sort'], + ); + + $form['alternate_order'] = array( + '#type' => 'select', + '#title' => t('Alternate sort order'), + '#options' => array('asc' => t('Ascending'), 'desc' => t('Descending')), + '#default_value' => $this->options['alternate_order'], + ); + } + + parent::options_form($form, $form_state); + } + + function query() { + // Check to see if the search filter added 'score' to the table. + // Our filter stores it as $handler->search_score -- and we also + // need to check its relationship to make sure that we're using the same + // one or obviously this won't work. + foreach ($this->view->filter as $handler) { + if (isset($handler->search_score) && $handler->relationship == $this->relationship) { + $this->field_alias = $handler->search_score; + $this->table_alias = $handler->table_alias; + return; + } + } + + // Hide this field if no search filter is in place. + $this->options['exclude'] = TRUE; + if (!empty($this->options['alternate_sort'])) { + if (isset($this->view->style_plugin->options['default']) && $this->view->style_plugin->options['default'] == $this->options['id']) { + // Since the style handler initiates fields, we plug these values right into the active handler. + $this->view->style_plugin->options['default'] = $this->options['alternate_sort']; + $this->view->style_plugin->options['order'] = $this->options['alternate_order']; + } + } + } + + function click_sort($order) { + if (isset($this->table_alias)) { + $this->query->add_orderby(NULL, NULL, $order, $this->field_alias); + } + } + + function render($values) { + // Only render if we exist. + if (isset($this->table_alias)) { + return parent::render($values); + } + } + +} diff --git a/modules/search/views_handler_filter_search.inc b/modules/search/views_handler_filter_search.inc new file mode 100644 index 0000000000000000000000000000000000000000..eb3f00ff708d046a23d06a1b185d2327a9ad877f --- /dev/null +++ b/modules/search/views_handler_filter_search.inc @@ -0,0 +1,113 @@ + 'radios', + '#title' => t('On empty input'), + '#default_value' => $this->operator, + '#options' => array( + 'optional' => t('Show All'), + 'required' => t('Show None'), + ), + ); + } + + /** + * Provide a simple textfield for equality + */ + function exposed_form(&$form, &$form_state) { + if (isset($this->options['expose']['identifier'])) { + $key = $this->options['expose']['identifier']; + $form[$key] = array( + '#type' => 'textfield', + '#size' => 15, + '#default_value' => $this->value, + '#attributes' => array('title' => t('Enter the terms you wish to search for.')), + ); + } + } + + /** + * Validate the options form. + */ + function exposed_validate($form, &$form_state) { + if (!isset($this->options['expose']['identifier'])) { + return; + } + + $key = $this->options['expose']['identifier']; + if (!empty($form_state['values'][$key])) { + $this->search_query = search_parse_query($form_state['values'][$key]); + + if ($this->search_query[2] == '') { + form_set_error($key, t('You must include at least one positive keyword with @count characters or more.', array('@count' => variable_get('minimum_word_size', 3)))); + } + if ($this->search_query[6]) { + if ($this->search_query[6] == 'or') { + drupal_set_message(t('Search for either of the two terms with uppercase OR. For example, cats OR dogs.')); + } + } + } + } + + /** + * Add this filter to the query. + * + * Due to the nature of fapi, the value and the operator have an unintended + * level of indirection. You will find them in $this->operator + * and $this->value respectively. + */ + function query() { + if (!isset($this->search_query) || empty($this->search_query[3])) { + if ($this->operator == 'required') { + $this->query->add_where($this->options['group'], '0'); + } + } + else { + $search_index = $this->ensure_my_table(); + $this->search_query[2] = str_replace('i.', "$search_index.", $this->search_query[2]); + + // Create a new join to relate the 'serach_total' table to our current 'search_index' table. + $join = new views_join; + $join->construct('search_total', $search_index, 'word', 'word'); + $search_total = $this->query->add_relationship('search_total', $join, $search_index); + + $this->search_score = $this->query->add_field('', "SUM($search_index.score * $search_total.count)", 'score', array('aggregate' => TRUE)); + + $this->query->add_where($this->options['group'], $this->search_query[2], $this->search_query[3]); + + if (empty($this->query->relationships[$this->relationship])) { + $base_table = $this->query->base_table; + } + else { + $base_table = $this->query->relationships[$this->relationship]['base']; + } + $this->query->add_where($this->options['group'], "$search_index.type = '%s'", $base_table); + if (!$this->search_query[5]) { + $search_dataset = $this->query->add_table('search_dataset'); + $this->search_query[0] = str_replace('d.', "$search_dataset.", $this->search_query[0]); + $this->query->add_where($this->options['group'], $this->search_query[0], $this->search_query[1]); + } + + $this->query->add_groupby("$search_index.sid"); + $this->query->add_having($this->options['group'], 'COUNT(*) >= %d', $this->search_query[4]); + } + } +} diff --git a/modules/search/views_handler_sort_search_score.inc b/modules/search/views_handler_sort_search_score.inc new file mode 100644 index 0000000000000000000000000000000000000000..a4bfacd6e57b4c91cad69e61a747dcfce2e52d94 --- /dev/null +++ b/modules/search/views_handler_sort_search_score.inc @@ -0,0 +1,25 @@ +search_score -- and we also + // need to check its relationship to make sure that we're using the same + // one or obviously this won't work. + foreach ($this->view->filter as $handler) { + if (isset($handler->search_score) && $handler->relationship == $this->relationship) { + $this->query->add_orderby(NULL, NULL, $this->options['order'], $handler->search_score); + $this->table_alias = $handler->table_alias; + return; + } + } + + // Do absolutely nothing if there is no filter in place; there is no reason to + // sort on the raw scores with this handler. + } +} + diff --git a/modules/search/views_plugin_row_search_view.inc b/modules/search/views_plugin_row_search_view.inc new file mode 100644 index 0000000000000000000000000000000000000000..31665d33432adf4de67db24cd4699dcc866ac0f4 --- /dev/null +++ b/modules/search/views_plugin_row_search_view.inc @@ -0,0 +1,34 @@ + TRUE); + + return $options; + } + + function options_form(&$form, &$form_state) { + $form['score'] = array( + '#type' => 'checkbox', + '#title' => t('Display score'), + '#default_value' => $this->options['score'], + ); + } + + /** + * Override the behavior of the render() function. + */ + function render($row) { + return theme($this->theme_functions(), $this->view, $this->options, $row); + } +} diff --git a/modules/statistics.views.inc b/modules/statistics.views.inc new file mode 100644 index 0000000000000000000000000000000000000000..dfdd4f0899bd6c14ab7cf3b977e5e74050c77a9b --- /dev/null +++ b/modules/statistics.views.inc @@ -0,0 +1,268 @@ + array( + 'left_field' => 'nid', + 'field' => 'nid', + ), + ); + + // totalcount + $data['node_counter']['totalcount'] = array( + 'title' => t('Total views'), + 'help' => t('The total number of times the node has been viewed.'), + + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // daycount + $data['node_counter']['daycount'] = array( + 'title' => t('Views today'), + 'help' => t('The total number of times the node has been viewed today.'), + + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // timestamp + $data['node_counter']['timestamp'] = array( + 'title' => t('Most recent view'), + 'help' => t('The most recent time the node has been viewed.'), + + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + + // ---------------------------------------------------------------- + // accesslog table + + $data['accesslog']['table']['group'] = t('Access log'); + + // Advertise this table as a possible base table + $data['accesslog']['table']['base'] = array( + 'field' => 'aid', + 'title' => t('Access log'), + 'help' => t('Stores site access information.'), + 'weight' => 10, + ); + + // For other base tables, explain how we join + $data['accesslog']['table']['join'] = array( + 'users' => array( + 'field' => 'uid', + 'left_field' => 'uid', + ), + ); + + // session id + $data['accesslog']['sid'] = array( + 'title' => t('Session ID'), + 'help' => t('Browser session ID of user that visited page.'), + + 'field' => array( + 'handler' => 'views_handler_field', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // title + $data['accesslog']['title'] = array( + 'title' => t('Page title'), + 'help' => t('Title of page visited.'), + + 'field' => array( + 'handler' => 'views_handler_field_accesslog_path', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + // path + $data['accesslog']['path'] = array( + 'title' => t('Path'), + 'help' => t('Internal path to page visited (relative to Drupal root.)'), + + 'field' => array( + 'handler' => 'views_handler_field_accesslog_path', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + //No argument here. Can't send forward slashes as arguments. + //Can be worked around by node ID. + //(but what about aliases?) + ); + + // referrer + $data['accesslog']['url'] = array( + 'title' => t('Referrer'), + 'help' => t('Referrer URI.'), + 'field' => array( + 'handler' => 'views_handler_field_url', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // hostname + $data['accesslog']['hostname'] = array( + 'title' => t('Hostname'), + 'help' => t('Hostname of user that visited the page.'), + 'field' => array( + 'handler' => 'views_handler_field', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + // user + $data['accesslog']['uid'] = array( + 'title' => t('User'), + 'help' => t('The user who visited the site.'), + 'relationship' => array( + 'handler' => 'views_handler_relationship', + 'base' => 'users', + 'field' => 'uid', + ), + ); + + // timer + $data['accesslog']['timer'] = array( + 'title' => t('Timer'), + 'help' => t('Time in milliseconds that the page took to load.'), + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // timestamp + $data['accesslog']['timestamp'] = array( + 'title' => t('Timestamp'), + 'help' => t('Timestamp of when the page was visited.'), + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + ); + + + return $data; +} + +/** + * Implementation of hook_views_handlers() to register all of the basic handlers + * views uses. + */ +function statistics_views_handlers() { + return array( + 'info' => array( + 'path' => drupal_get_path('module', 'views') . '/modules/statistics', + ), + 'handlers' => array( + 'views_handler_field_accesslog_path' => array( + 'parent' => 'views_handler_field', + ), + ), + ); +} + +/** + * @} + */ diff --git a/modules/statistics.views_convert.inc b/modules/statistics.views_convert.inc new file mode 100644 index 0000000000000000000000000000000000000000..65a6405da977bb9102a6372a523c29d9f506431e --- /dev/null +++ b/modules/statistics.views_convert.inc @@ -0,0 +1,52 @@ +add_item() won't produce + * the right results, usually needed to set field options or values. + */ +function statistics_views_convert($display, $type, &$view, $field, $id = NULL) { + switch ($type) { + case 'field': + switch ($field['tablename']) { + case 'node_counter': + switch ($field['field']) { + case 'timestamp': + $handlers = array( + 'views_handler_field_date_small' => 'small', + 'views_handler_field_date' => 'medium', + 'views_handler_field_date_large' => 'large', + 'views_handler_field_date_custom' => 'custom', + 'views_handler_field_since' => 'time ago', + ); + $view->set_item_option($display, 'field', $id, 'date_format', $handlers[$field['handler']]); + if (!empty($field['options'])) { + $view->set_item_option($display, 'field', $id, 'custom_date_format', $field['options']); + } + break; + } + break; + } + break; + case 'sort': + switch ($field['tablename']) { + case 'node_counter': + switch ($field['field']) { + case 'timestamp': + $field['options'] = $field['options'] == 'normal' ? 'second' : $field['options']; + $view->set_item_option($display, 'sort', $id, 'granularity', $field['options']); + break; + } + break; + } + break; + } +} diff --git a/modules/statistics.views_default.inc b/modules/statistics.views_default.inc new file mode 100644 index 0000000000000000000000000000000000000000..a664e40fba82bef7cb5b677224fb07902b7718e8 --- /dev/null +++ b/modules/statistics.views_default.inc @@ -0,0 +1,305 @@ +name = 'popular'; + $view->description = 'Shows the most-viewed nodes on the site. This requires the statistics to be enabled at administer >> reports >> access log settings.'; + $view->tag = 'default'; + $view->view_php = ''; + $view->base_table = 'node'; + $view->is_cacheable = '0'; + $view->api_version = 2; + $view->disabled = TRUE; /* Edit this to true to make a default view disabled initially */ + $handler = $view->new_display('default', 'Defaults', 'default'); + $handler->override_option('fields', array( + 'type' => array( + 'id' => 'type', + 'table' => 'node', + 'field' => 'type', + 'label' => 'Type', + ), + 'title' => array( + 'id' => 'title', + 'table' => 'node', + 'field' => 'title', + 'label' => 'Title', + 'link_to_node' => TRUE, + ), + 'name' => array( + 'id' => 'name', + 'table' => 'users', + 'field' => 'name', + 'label' => 'Author', + 'link_to_user' => TRUE, + ), + 'timestamp' => array( + 'id' => 'timestamp', + 'table' => 'history_user', + 'field' => 'timestamp', + 'label' => '', + 'comments' => 1, + 'relationship' => 'none', + 'link_to_node' => 0, + 'comment' => 1, + ), + )); + $handler->override_option('sorts', array( + 'totalcount' => array( + 'id' => 'totalcount', + 'table' => 'node_counter', + 'field' => 'totalcount', + 'order' => 'DESC', + 'relationship' => 'none', + ), + )); + $handler->override_option('filters', array( + 'status' => array( + 'id' => 'status', + 'table' => 'node', + 'field' => 'status', + 'operator' => '=', + 'value' => '1', + 'group' => 0, + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + ), + 'totalcount' => array( + 'id' => 'totalcount', + 'table' => 'node_counter', + 'field' => 'totalcount', + 'operator' => '>', + 'value' => array( + 'value' => '0', + 'min' => '', + 'max' => '', + ), + 'group' => 0, + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + 'relationship' => 'none', + ), + )); + $handler->override_option('access', array( + 'type' => 'none', + 'role' => array(), + 'perm' => '', + )); + $handler->override_option('title', 'Popular content'); + $handler->override_option('items_per_page', '25'); + $handler->override_option('use_pager', TRUE); + $handler->override_option('use_more', 1); + $handler->override_option('style_plugin', 'table'); + $handler->override_option('style_options', array( + 'override' => 0, + 'order' => 'desc', + 'columns' => array( + 'type' => 'type', + 'title' => 'title', + 'name' => 'name', + 'timestamp' => 'title', + 'totalcount' => 'totalcount', + ), + 'info' => array( + 'type' => array( + 'sortable' => 0, + 'separator' => '', + ), + 'title' => array( + 'sortable' => 0, + 'separator' => '', + ), + 'name' => array( + 'sortable' => 0, + 'separator' => '', + ), + 'timestamp' => array( + 'separator' => '', + ), + 'totalcount' => array( + 'sortable' => 0, + 'separator' => '', + ), + ), + 'default' => '-1', + )); + $handler = $view->new_display('page', 'Popular (page)', 'page'); + $handler->override_option('path', 'popular/all'); + $handler->override_option('menu', array( + 'type' => 'default tab', + 'title' => 'Popular content', + 'weight' => '-1', + )); + $handler->override_option('tab_options', array( + 'type' => 'normal', + 'title' => 'Popular content', + 'weight' => '', + )); + $handler = $view->new_display('page', 'Today (page)', 'page_1'); + $handler->override_option('fields', array( + 'type' => array( + 'id' => 'type', + 'table' => 'node', + 'field' => 'type', + 'label' => 'Type', + ), + 'title' => array( + 'id' => 'title', + 'table' => 'node', + 'field' => 'title', + 'label' => 'Title', + 'link_to_node' => TRUE, + ), + 'name' => array( + 'id' => 'name', + 'table' => 'users', + 'field' => 'name', + 'label' => 'Author', + 'link_to_user' => TRUE, + ), + 'timestamp' => array( + 'id' => 'timestamp', + 'table' => 'history_user', + 'field' => 'timestamp', + 'label' => '', + 'comments' => 1, + 'relationship' => 'none', + 'link_to_node' => 0, + 'comment' => 1, + ), + 'daycount' => array( + 'id' => 'daycount', + 'table' => 'node_counter', + 'field' => 'daycount', + 'label' => 'Views today', + 'set_precision' => FALSE, + 'precision' => 0, + 'decimal' => '.', + 'separator' => ',', + 'prefix' => '', + 'suffix' => '', + 'relationship' => 'none', + ), + )); + $handler->override_option('sorts', array( + 'daycount' => array( + 'id' => 'daycount', + 'table' => 'node_counter', + 'field' => 'daycount', + 'order' => 'DESC', + 'relationship' => 'none', + ), + )); + $handler->override_option('path', 'popular/today'); + $handler->override_option('menu', array( + 'type' => 'tab', + 'title' => 'Today\'s popular content', + 'weight' => '0', + )); + $handler->override_option('tab_options', array( + 'type' => 'normal', + 'title' => 'Popular content', + 'weight' => '0', + )); + $handler = $view->new_display('block', 'Popular (block)', 'block'); + $handler->override_option('fields', array( + 'title' => array( + 'id' => 'title', + 'table' => 'node', + 'field' => 'title', + 'label' => '', + 'link_to_node' => 1, + 'relationship' => 'none', + ), + 'totalcount' => array( + 'id' => 'totalcount', + 'table' => 'node_counter', + 'field' => 'totalcount', + 'label' => '', + 'set_precision' => FALSE, + 'precision' => 0, + 'decimal' => '.', + 'separator' => ',', + 'prefix' => ' (', + 'suffix' => ')', + 'relationship' => 'none', + ), + )); + $handler->override_option('items_per_page', 5); + $handler->override_option('style_plugin', 'list'); + $handler->override_option('style_options', array( + 'type' => 'ul', + )); + $handler->override_option('row_options', array( + 'inline' => array( + 'title' => 'title', + 'totalcount' => 'totalcount', + ), + 'separator' => '', + )); + $handler->override_option('block_description', 'Popular content'); + $handler = $view->new_display('block', 'Today (block)', 'block_1'); + $handler->override_option('fields', array( + 'title' => array( + 'id' => 'title', + 'table' => 'node', + 'field' => 'title', + 'label' => '', + 'link_to_node' => 1, + 'relationship' => 'none', + ), + 'daycount' => array( + 'id' => 'daycount', + 'table' => 'node_counter', + 'field' => 'daycount', + 'label' => '', + 'set_precision' => FALSE, + 'precision' => 0, + 'decimal' => '.', + 'separator' => ',', + 'prefix' => ' (', + 'suffix' => ')', + 'relationship' => 'none', + ), + )); + $handler->override_option('sorts', array( + 'daycount' => array( + 'id' => 'daycount', + 'table' => 'node_counter', + 'field' => 'daycount', + 'order' => 'DESC', + 'relationship' => 'none', + ), + )); + $handler->override_option('title', 'Today\'s popular content'); + $handler->override_option('items_per_page', 5); + $handler->override_option('link_display', 'page_1'); + $handler->override_option('style_plugin', 'list'); + $handler->override_option('style_options', array( + 'type' => 'ul', + )); + $handler->override_option('row_options', array( + 'inline' => array( + 'title' => 'title', + 'daycount' => 'daycount', + ), + 'separator' => '', + )); + $handler->override_option('block_description', 'Today\'s popular content'); + $views[$view->name] = $view; + + return $views; +} diff --git a/modules/statistics/views_handler_field_accesslog_path.inc b/modules/statistics/views_handler_field_accesslog_path.inc new file mode 100644 index 0000000000000000000000000000000000000000..a7379fa3cb2f2498f0bee121f5264d09deb21ed7 --- /dev/null +++ b/modules/statistics/views_handler_field_accesslog_path.inc @@ -0,0 +1,46 @@ +additional_fields[] = 'path'; + } + } + + function option_definition() { + $options = parent::option_definition(); + + $options['display_as_link'] = array('default' => TRUE); + + return $options; + } + + /** + * Provide link to the page being visited. + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['display_as_link'] = array( + '#title' => t('Display as link'), + '#type' => 'checkbox', + '#default_value' => !empty($this->options['display_as_link']), + ); + } + + function render($values) { + $title = check_plain($values->{$this->field_alias}); + if (!empty($this->options['display_as_link'])) { + return l($title, $values->{$this->aliases['path']}, array('html' => TRUE)); + } + else { + return $title; + } + } +} diff --git a/modules/system.views.inc b/modules/system.views.inc new file mode 100644 index 0000000000000000000000000000000000000000..6f895c8c9a24b0b85fceba23ed8642ea6cb6a9a4 --- /dev/null +++ b/modules/system.views.inc @@ -0,0 +1,218 @@ + 'fid', + 'title' => t('File'), + 'help' => t("Files maintained by Drupal and various modules."), + ); + + // The files table does not inherently join to the node table, + // but may things (such as upload.module) can add relationships + // that allow file fields to be used. + + // For other base tables, explain how we join + $data['files']['table']['join'] = array( + 'users' => array( + // direct join to the users table via 'uid' field. + 'left_field' => 'uid', + 'field' => 'uid', + ), + ); + + // fid + $data['files']['fid'] = array( + 'title' => t('File ID'), + 'help' => t('The ID of the file.'), + 'field' => array( + 'handler' => 'views_handler_field_file', + 'click sortable' => TRUE, + ), + 'argument' => array( + 'handler' => 'views_handler_argument_file_fid', + 'name field' => 'filename', // the field to display in the summary. + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // filename + $data['files']['filename'] = array( + 'title' => t('Name'), + 'help' => t('The name of the file.'), + 'field' => array( + 'handler' => 'views_handler_field_file', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + // filepath + $data['files']['filepath'] = array( + 'title' => t('Path'), + 'help' => t('The path of the file.'), + 'field' => array( + 'handler' => 'views_handler_field_file', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + // filemime + $data['files']['filemime'] = array( + 'title' => t('Mime type'), + 'help' => t('The mime type of the file.'), + 'field' => array( + 'handler' => 'views_handler_field_file', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + // filesize + $data['files']['filesize'] = array( + 'title' => t('Size'), + 'help' => t('The size of the file.'), + 'field' => array( + 'handler' => 'views_handler_field_file_size', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + ); + + // status + $data['files']['status'] = array( + 'title' => t('Status'), + 'help' => t('The status of the file.'), + 'field' => array( + 'handler' => 'views_handler_field_file_status', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_file_status', + ), + ); + + // timestamp field + $data['files']['timestamp'] = array( + 'title' => t('Upload date'), + 'help' => t('The date the file was uploaded.'), + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + ); + + + return $data; +} + +/** + * Implementation of hook_views_handlers() to register all of the basic handlers + * views uses. + */ +function system_views_handlers() { + return array( + 'info' => array( + 'path' => drupal_get_path('module', 'views') . '/modules/system', + ), + 'handlers' => array( + 'views_handler_field_file' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_file_status' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_filter_file_status' => array( + 'parent' => 'views_handler_filter_in_operator', + ), + 'views_handler_argument_file_fid' => array( + 'parent' => 'views_handler_argument', + ), + ), + ); +} + +function _views_file_status($choice = NULL) { + $status = array( + FILE_STATUS_TEMPORARY => t('Temporary'), + FILE_STATUS_PERMANENT => t('Permanent'), + ); + + if (isset($choice)) { + return isset($status[$choice]) ? $status[$choice] : t('Unknown'); + } + + return $status; +} + + +/** + * @} + */ diff --git a/modules/system/views_handler_argument_file_fid.inc b/modules/system/views_handler_argument_file_fid.inc new file mode 100644 index 0000000000000000000000000000000000000000..be6155e1ea46571c0e5c90b37baa45dce1e41838 --- /dev/null +++ b/modules/system/views_handler_argument_file_fid.inc @@ -0,0 +1,18 @@ +argument))); + if (empty($title)) { + return t('No title'); + } + + return check_plain($title); + } +} diff --git a/modules/system/views_handler_field_file.inc b/modules/system/views_handler_field_file.inc new file mode 100644 index 0000000000000000000000000000000000000000..0b88561f5998a8267d1ec3237d1fb9a6eb7a826e --- /dev/null +++ b/modules/system/views_handler_field_file.inc @@ -0,0 +1,53 @@ +additional_fields['filepath'] = 'filepath'; + } + } + + function option_definition() { + $options = parent::option_definition(); + $options['link_to_file'] = array('default' => FALSE); + return $options; + } + + /** + * Provide link to file option + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['link_to_file'] = array( + '#title' => t('Link this field to download the file'), + '#description' => t('This will override any other link you have set.'), + '#type' => 'checkbox', + '#default_value' => !empty($this->options['link_to_file']), + ); + } + + /** + * Render whatever the data is as a link to the file. + * + * Data should be made XSS safe prior to calling this function. + */ + function render_link($data, $values) { + if (!empty($this->options['link_to_file']) && $data !== NULL && $data !== '') { + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['path'] = file_create_url($values->{$this->aliases['filepath']}); + } + + return $data; + } + + function render($values) { + return $this->render_link(check_plain($values->{$this->field_alias}), $values); + } +} diff --git a/modules/system/views_handler_field_file_status.inc b/modules/system/views_handler_field_file_status.inc new file mode 100644 index 0000000000000000000000000000000000000000..c3ca6ba2cbb6d7435146228372e236c6deba0ced --- /dev/null +++ b/modules/system/views_handler_field_file_status.inc @@ -0,0 +1,11 @@ +{$this->field_alias}); + } +} + diff --git a/modules/system/views_handler_filter_file_status.inc b/modules/system/views_handler_filter_file_status.inc new file mode 100644 index 0000000000000000000000000000000000000000..b20de2b6dd0758794e541499f8a406b10e3c72ad --- /dev/null +++ b/modules/system/views_handler_filter_file_status.inc @@ -0,0 +1,13 @@ +value_options)) { + $this->value_options = _views_file_status(); + } + } +} + diff --git a/modules/taxonomy.views.inc b/modules/taxonomy.views.inc new file mode 100644 index 0000000000000000000000000000000000000000..5877d152f6f44861cf946bc771561db6777ddeff --- /dev/null +++ b/modules/taxonomy.views.inc @@ -0,0 +1,431 @@ + array( + 'left_field' => 'vid', + 'field' => 'vid', + ), + // vocabulary links to node through term_data via vid + 'node' => array( + 'left_table' => 'term_data', + 'left_field' => 'vid', + 'field' => 'vid', + ), + // vocabulary links to node_revision via term_data + 'node_revision' => array( + 'left_table' => 'term_data', + 'left_field' => 'vid', + 'field' => 'vid', + ), + ); + + // vocabulary name + $data['vocabulary']['name'] = array( + 'title' => t('Vocabulary name'), // The item it appears as on the UI, + 'field' => array( + 'help' => t('Name of the vocabulary a term is a member of. This will be the vocabulary that whichever term the "Taxonomy: Term" field is; and can similarly cause duplicates.'), + 'handler' => 'views_handler_field', + 'click sortable' => TRUE, + ), + ); + $data['vocabulary']['vid'] = array( + 'title' => t('Vocabulary ID'), // The item it appears as on the UI, + 'help' => t('The taxonomy vocabulary ID'), + 'argument' => array( + 'handler' => 'views_handler_argument_vocabulary_vid', + 'name field' => 'name', + ), + ); + + // ---------------------------------------------------------------------- + // term_data table + + $data['term_data']['table']['group'] = t('Taxonomy'); + $data['term_data']['table']['base'] = array( + 'field' => 'tid', + 'title' => t('Term'), + 'help' => t('Taxonomy terms are attached to nodes.'), + ); + + + // The term data table + $data['term_data']['table']['join'] = array( + 'node' => array( + 'left_table' => 'term_node', + 'left_field' => 'tid', + 'field' => 'tid', + ), + 'node_revision' => array( + 'left_table' => 'term_node', + 'left_field' => 'tid', + 'field' => 'tid', + ), + // This is provided for many_to_one argument + 'term_node' => array( + 'field' => 'tid', + 'left_field' => 'tid', + ), + ); + + // tid field + $data['term_data']['tid'] = array( + 'title' => t('Term ID'), + 'help' => t('The taxonomy term ID'), + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_numeric', + 'skip base' => array('node', 'node_revision'), + ), + 'filter' => array( + 'handler' => 'views_handler_filter_term_node_tid', + 'hierarchy table' => 'term_hierarchy', + 'numeric' => TRUE, + 'skip base' => array('node', 'node_revision'), + ), + ); + + // Term name field + $data['term_data']['name'] = array( + 'title' => t('Term'), + 'help' => t('Taxonomy terms. Note that using this can cause duplicate nodes to appear in views; you must add filters to reduce the result set.'), + 'field' => array( + 'handler' => 'views_handler_field_taxonomy', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + 'help' => t('Taxonomy term name.'), + 'many to one' => TRUE, + 'empty field name' => t('Uncategorized'), + ), + ); + + // taxonomy weight + $data['term_data']['weight'] = array( + 'title' => t('Weight'), + 'help' => t('The term weight field'), + 'field' => array( + 'handler' => 'views_handler_field', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // Term description + $data['term_data']['description'] = array( + 'title' => t('Term description'), // The item it appears as on the UI, + 'help' => t('The description associated with a taxonomy term.'), + 'field' => array( + 'field' => 'description', // the real field + 'group' => t('Taxonomy'), // The group it appears in on the UI, + 'handler' => 'views_handler_field_markup', + 'format' => FILTER_FORMAT_DEFAULT, + ), + ); + + // Term vocabulary + $data['term_data']['vid'] = array( + 'title' => t('Vocabulary'), + 'help' => t('Filter the results of "Taxonomy: Term" to a particular vocabulary.'), + 'filter' => array( + 'handler' => 'views_handler_filter_vocabulary_vid', + ), + ); + + // ---------------------------------------------------------------------- + // term_node table + + $data['term_node']['table']['group'] = t('Taxonomy'); + + $data['term_node']['table']['join'] = array( + 'term_data' => array( + // links directly to term_data via tid + 'left_field' => 'tid', + 'field' => 'tid', + ), + 'node' => array( + // links directly to node via vid + 'left_field' => 'vid', + 'field' => 'vid', + ), + 'node_revisions' => array( + // links directly to node_revisions via vid + 'left_field' => 'vid', + 'field' => 'vid', + ), + 'term_hierarchy' => array( + 'left_field' => 'tid', + 'field' => 'tid', + ), + ); + + // tid field + $data['term_node']['tid'] = array( + 'title' => t('Term ID'), + 'help' => t('The taxonomy term ID'), + 'field' => array( + 'title' => t('All terms'), + 'help' => t('Display all taxonomy terms associated with a node from specified vocabularies.'), + 'handler' => 'views_handler_field_term_node_tid', + 'skip base' => 'term_data', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_term_node_tid', + 'name table' => 'term_data', + 'name field' => 'name', + 'empty field name' => t('Uncategorized'), + 'numeric' => TRUE, + 'skip base' => 'term_data', + ), + 'filter' => array( + 'title' => t('Term'), + 'handler' => 'views_handler_filter_term_node_tid', + 'hierarchy table' => 'term_hierarchy', + 'numeric' => TRUE, + 'skip base' => 'term_data', + 'allow empty' => TRUE, + ), + ); + + // @todo: term_relation + + // ---------------------------------------------------------------------- + // term_hierarchy table + + $data['term_hierarchy']['table']['group'] = t('Taxonomy'); + + $data['term_hierarchy']['table']['join'] = array( + 'term_hierarchy' => array( + // links to self through left.parent = right.tid (going down in depth) + 'left_field' => 'tid', + 'field' => 'parent', + ), + 'term_data' => array( + // links directly to term_data via tid + 'left_field' => 'tid', + 'field' => 'tid', + ), + 'node' => array( + // links to node thorugh term_data + 'left_table' => 'term_data', + 'left_field' => 'tid', + 'field' => 'tid', + ), + 'node_revisions' => array( + // links to node_revisions thorugh term_data + 'left_table' => 'term_data', + 'left_field' => 'tid', + 'field' => 'tid', + ), + ); + + $data['term_hierarchy']['parent'] = array( + 'title' => t('Parent term'), + 'help' => t('The parent term of the term. This can produce duplicate entries if you are using a vocabulary that allows multiple parents.'), + 'relationship' => array( + 'base' => 'term_data', + 'field' => 'parent', + 'label' => t('Parent'), + ), + 'argument' => array( + 'help' => t('The parent term of the term.'), + 'handler' => 'views_handler_argument_numeric', + ), + ); + + // ---------------------------------------------------------------------- + // term_synonym table + + $data['term_synonym']['table']['group'] = t('Taxonomy'); + + $data['term_synonym']['table']['join'] = array( + 'term_data' => array( + // links directly to term_data via tid + 'left_field' => 'tid', + 'field' => 'tid', + ), + 'node' => array( + 'left_table' => 'term_node', + 'left_field' => 'tid', + 'field' => 'tid', + ), + 'node_revisions' => array( + 'left_table' => 'term_node', + 'left_field' => 'tid', + 'field' => 'tid', + ), + ); + + $data['term_synonym']['name'] = array( + 'title' => t('Term synonym'), + 'help' => t('Term synonyms may be used to find terms by alternate names.'), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + 'many to one' => TRUE, + 'empty field name' => t('Uncategorized'), + ), + ); + return $data; +} + +/** + * Implementation of hook_views_data_alter(). + */ +function taxonomy_views_data_alter(&$data) { + $data['node']['term_node_tid'] = array( + 'group' => t('Taxonomy'), + 'title' => t('Related terms'), + 'help' => t('Relate nodes to taxonomy terms, specifiying which vocabulary or vocabularies to use. This relationship will cause duplicated records if there are multiple terms.'), + 'relationship' => array( + 'handler' => 'views_handler_relationship_node_term_data', + 'label' => t('term'), + 'base' => 'term_data', + ), + ); + + $data['node']['term_node_tid_depth'] = array( + 'group' => t('Taxonomy'), + 'title' => t('Term ID (with depth)'), + 'help' => t('The depth filter is more complex, so provides fewer options.'), + 'real field' => 'vid', + 'argument' => array( + 'handler' => 'views_handler_argument_term_node_tid_depth', + 'accept depth modifier' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_term_node_tid_depth', + ), + ); + + $data['node']['term_node_tid_depth_modifier'] = array( + 'group' => t('Taxonomy'), + 'title' => t('Term ID depth modifier'), + 'help' => t('Allows the "depth" for Taxonomy: Term ID (with depth) to be modified via an additional argument.'), + 'argument' => array( + 'handler' => 'views_handler_argument_term_node_tid_depth_modifier', + ), + ); +} + +/** + * Implementation of hook_views_handlers() to register all of the basic handlers + * views uses. + */ +function taxonomy_views_handlers() { + return array( + 'info' => array( + 'path' => drupal_get_path('module', 'views') . '/modules/taxonomy', + ), + 'handlers' => array( + 'views_handler_argument_term_node_tid_depth' => array( + 'parent' => 'views_handler_argument', + ), + 'views_handler_argument_term_node_tid_depth_modifier' => array( + 'parent' => 'views_handler_argument', + ), + 'views_handler_argument_taxonomy' => array( + 'parent' => 'views_handler_argument', + ), + 'views_handler_argument_vocabulary_vid' => array( + 'parent' => 'views_handler_argument', + ), + 'views_handler_argument_term_node_tid' => array( + 'parent' => 'views_handler_argument_many_to_one', + ), + 'views_handler_field_term_node_tid' => array( + 'parent' => 'views_handler_field_prerender_list', + ), + 'views_handler_field_taxonomy' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_filter_vocabulary_vid' => array( + 'parent' => 'views_handler_filter_in_operator', + ), + 'views_handler_filter_term_node_tid' => array( + 'parent' => 'views_handler_filter_many_to_one', + ), + 'views_handler_filter_term_node_tid_depth' => array( + 'parent' => 'views_handler_filter_term_node_tid', + ), + 'views_handler_relationship_node_term_data' => array( + 'parent' => 'views_handler_relationship', + ), + ), + ); +} + +/** + * Implementation of hook_views_plugins + */ +function taxonomy_views_plugins() { + return array( + 'module' => 'views', // This just tells our themes are elsewhere. + 'argument validator' => array( + 'taxonomy_term' => array( + 'title' => t('Taxonomy term'), + 'handler' => 'views_plugin_argument_validate_taxonomy_term', + 'path' => drupal_get_path('module', 'views') . '/modules/taxonomy', + ), + ), + ); +} + +/** + * Helper function to set a breadcrumb for taxonomy. + */ +function views_taxonomy_set_breadcrumb(&$breadcrumb, &$argument) { + if (empty($argument->options['set_breadcrumb'])) { + return; + } + + $args = $argument->view->args; + $parents = taxonomy_get_parents_all($argument->argument); + foreach (array_reverse($parents) as $parent) { + // Unfortunately parents includes the current argument. Skip. + if ($parent->tid == $argument->argument) { + continue; + } + $args[$argument->position] = $parent->tid; + $path = $argument->view->get_url($args); + $breadcrumb[$path] = check_plain($parent->name); + } +} + +/** + * @} + */ diff --git a/modules/taxonomy.views_convert.inc b/modules/taxonomy.views_convert.inc new file mode 100644 index 0000000000000000000000000000000000000000..103cb245a01de58c5c8b5584fa6a86475a1a10ef --- /dev/null +++ b/modules/taxonomy.views_convert.inc @@ -0,0 +1,95 @@ +add_item() won't produce + * the right results, usually needed to set field options or values. + */ +function taxonomy_views_convert($display, $type, &$view, $field, $id = NULL) { + switch ($type) { + case 'field': + if ($field['tablename'] == 'term_node' || !strncmp($field['tablename'], 'term_node_', 10)) { + switch ($field['field']) { + case 'name': + $item = $view->get_item($display, 'field', $id); + if ($field['options'] != 'nolink') { + $item['link_to_taxonomy'] = TRUE; + } + if (!empty($field['vocabulary'])) { + $item['limit'] = TRUE; + $item['vids'] = array($field['vocabulary']); + } + $view->set_item($display, 'field', $id, $item); + break; + } + } + elseif ($field['tablename'] == 'term_data') { + switch ($field['field']) { + case 'name': + if ($field['field'] == 'views_handler_field_tid_link') { + $view->set_item_option($display, 'field', $id, 'link_to_taxonomy', TRUE); + } + break; + } + } + break; + case 'filter': + if ($field['tablename'] == 'term_node' || !strncmp($field['tablename'], 'term_node_', 10)) { + switch ($field['field']) { + case 'tid': + $operators = array('AND' => 'and', 'OR' => 'or', 'NOR' => 'not'); + $item = $view->get_item($display, 'filter', $id); + if ($vid = (integer) substr($field['tablename'], 10)) { + $item['table'] = 'term_node'; + $item['vid'] = $vid; + } + else { + $item['limit'] = FALSE; + } + $item['operator'] = $operators[$field['operator']]; + $item['type'] = 'select'; + $view->set_item($display, 'filter', $id, $item); + break; + } + } + elseif ($field['tablename'] == 'term_data') { + switch ($field['field']) { + case 'vid': + $operators = array('AND' => 'in', 'OR' => 'in', 'NOR' => 'not in'); + $view->set_item_option($display, 'filter', $id, 'operator', $operators[$field['operator']]); + break; + } + } + break; + case 'argument': + $options = $field['argoptions']; + switch ($field['type']) { + case 'taxid': + if (!empty($field['options'])) { + $options['depth'] = $field['options']; + } + $options['break_phrase'] = TRUE; + $view->add_item($display, 'argument', 'node', 'term_node_tid_depth', $options, $field['id']); + break; + case 'taxletter': + if (!empty($field['options'])) { + $options['glossary'] = TRUE; + $options['limit'] = $field['options']; + } + $view->add_item($display, 'argument', 'term_data', 'name', $options, $field['id']); + break; + case 'vocid': + $view->add_item($display, 'argument', 'vocabulary', 'vid', $options, $field['id']); + break; + } + break; + } +} diff --git a/modules/taxonomy.views_default.inc b/modules/taxonomy.views_default.inc new file mode 100644 index 0000000000000000000000000000000000000000..65837890bbc1433c020b5122b6a3dfa382c6f4ef --- /dev/null +++ b/modules/taxonomy.views_default.inc @@ -0,0 +1,185 @@ +name = 'taxonomy_term'; + $view->description = 'A view to emulate Drupal core\'s handling of taxonomy/term; it also emulates Views 1\'s handling by having two possible feeds.'; + $view->tag = 'default'; + $view->view_php = ''; + $view->base_table = 'node'; + $view->is_cacheable = '0'; + $view->api_version = 2; + $view->disabled = TRUE; /* Edit this to true to make a default view disabled initially */ + $handler = $view->new_display('default', 'Defaults', 'default'); + $handler->override_option('sorts', array( + 'sticky' => array( + 'id' => 'sticky', + 'table' => 'node', + 'field' => 'sticky', + 'order' => 'DESC', + 'relationship' => 'none', + ), + 'created' => array( + 'id' => 'created', + 'table' => 'node', + 'field' => 'created', + 'order' => 'DESC', + 'granularity' => 'second', + 'relationship' => 'none', + ), + )); + $handler->override_option('arguments', array( + 'term_node_tid_depth' => array( + 'id' => 'term_node_tid_depth', + 'table' => 'node', + 'field' => 'term_node_tid_depth', + 'default_action' => 'not found', + 'style_plugin' => 'default_summary', + 'style_options' => array( + 'count' => TRUE, + 'override' => FALSE, + 'items_per_page' => 25, + ), + 'wildcard' => 'all', + 'wildcard_substitution' => 'All', + 'title' => '%1', + 'default_argument_type' => 'fixed', + 'default_argument' => '', + 'validate_type' => 'taxonomy_term', + 'validate_fail' => 'not found', + 'depth' => '0', + 'break_phrase' => 1, + 'relationship' => 'none', + 'default_argument_fixed' => '', + 'default_argument_php' => '', + 'validate_argument_node_type' => array( + 'album' => 0, + 'artist' => 0, + 'book' => 0, + 'page' => 0, + 'story' => 0, + 'track' => 0, + ), + 'validate_argument_vocabulary' => array( + '3' => 0, + '4' => 0, + '1' => 0, + '5' => 0, + '2' => 0, + ), + 'validate_argument_type' => 'tids', + 'validate_argument_php' => '', + ), + 'term_node_tid_depth_modifier' => array( + 'id' => 'term_node_tid_depth_modifier', + 'table' => 'node', + 'field' => 'term_node_tid_depth_modifier', + 'default_action' => 'ignore', + 'style_plugin' => 'default_summary', + 'style_options' => array( + 'count' => TRUE, + 'override' => FALSE, + 'items_per_page' => 25, + ), + 'wildcard' => 'all', + 'wildcard_substitution' => 'All', + 'title' => '', + 'default_argument_type' => 'fixed', + 'default_argument' => '', + 'validate_type' => 'none', + 'validate_fail' => 'not found', + ), + )); + $handler->override_option('filters', array( + 'status_extra' => array( + 'id' => 'status_extra', + 'table' => 'node', + 'field' => 'status_extra', + 'operator' => '=', + 'value' => '', + 'group' => 0, + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + 'relationship' => 'none', + ), + )); + $handler->override_option('access', array( + 'type' => 'none', + 'role' => array(), + 'perm' => '', + )); + $handler->override_option('use_pager', '1'); + $handler->override_option('row_plugin', 'node'); + $handler->override_option('row_options', array( + 'teaser' => TRUE, + 'links' => TRUE, + )); + $handler = $view->new_display('page', 'Page', 'page'); + $handler->override_option('path', 'taxonomy/term/%'); + $handler->override_option('menu', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler = $view->new_display('feed', 'Core feed', 'feed'); + $handler->override_option('items_per_page', 15); + $handler->override_option('use_pager', '1'); + $handler->override_option('row_plugin', 'node_rss'); + $handler->override_option('row_options', array( + 'item_length' => 'default', + )); + $handler->override_option('path', 'taxonomy/term/%/%/feed'); + $handler->override_option('menu', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler->override_option('displays', array( + 'page' => 'page', + 'default' => 0, + )); + $handler = $view->new_display('feed', 'Views 1 feed', 'feed_1'); + $handler->override_option('items_per_page', 15); + $handler->override_option('use_pager', '1'); + $handler->override_option('row_plugin', 'node_rss'); + $handler->override_option('row_options', array( + 'item_length' => 'default', + )); + $handler->override_option('path', 'taxonomy/term/%/feed'); + $handler->override_option('menu', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + )); + $views[$view->name] = $view; + + return $views; +} + + diff --git a/modules/taxonomy/views_handler_argument_taxonomy.inc b/modules/taxonomy/views_handler_argument_taxonomy.inc new file mode 100644 index 0000000000000000000000000000000000000000..c651b7c910d924f5d08a5726a1125f7c62dcafaa --- /dev/null +++ b/modules/taxonomy/views_handler_argument_taxonomy.inc @@ -0,0 +1,20 @@ +argument); + if (!empty($term)) { + return check_plain($term->name); + } + // TODO review text + return t('No name'); + } +} diff --git a/modules/taxonomy/views_handler_argument_term_node_tid.inc b/modules/taxonomy/views_handler_argument_term_node_tid.inc new file mode 100644 index 0000000000000000000000000000000000000000..e7ae44b2e454e98da671524f15091d67c0c689fd --- /dev/null +++ b/modules/taxonomy/views_handler_argument_term_node_tid.inc @@ -0,0 +1,42 @@ + FALSE); + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['set_breadcrumb'] = array( + '#type' => 'checkbox', + '#title' => t("Set the breadcrumb for the term parents"), + '#description' => t('If selected, the breadcrumb trail will include all parent terms, each one linking to this view. Note that this only works if just one term was received.'), + '#default_value' => !empty($this->options['set_breadcrumb']), + ); + } + + function set_breadcrumb(&$breadcrumb) { + if (empty($this->options['set_breadcrumb']) || !is_numeric($this->argument)) { + return; + } + + return views_taxonomy_set_breadcrumb($breadcrumb, $this); + } + + function title_query() { + $titles = array(); + $placeholders = implode(', ', array_fill(0, sizeof($this->value), '%d')); + + $result = db_query("SELECT name FROM {term_data} WHERE tid IN ($placeholders)", $this->value); + while ($term = db_fetch_object($result)) { + $titles[] = check_plain($term->name); + } + return $titles; + } +} + diff --git a/modules/taxonomy/views_handler_argument_term_node_tid_depth.inc b/modules/taxonomy/views_handler_argument_term_node_tid_depth.inc new file mode 100644 index 0000000000000000000000000000000000000000..aec1c238c4862dc888769da700c9deb10ea98ca4 --- /dev/null +++ b/modules/taxonomy/views_handler_argument_term_node_tid_depth.inc @@ -0,0 +1,127 @@ + 0); + $options['break_phrase'] = array('default' => FALSE); + $options['set_breadcrumb'] = array('default' => FALSE); + + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['depth'] = array( + '#type' => 'weight', + '#title' => t('Depth'), + '#default_value' => $this->options['depth'], + '#description' => t('The depth will match nodes tagged with terms in the hierarchy. For example, if you have the term "fruit" and a child term "apple", with a depth of 1 (or higher) then filtering for the term "fruit" will get nodes that are tagged with "apple" as well as "fruit". If negative, the reverse is true; searching for "apple" will also pick up nodes tagged with "fruit" if depth is -1 (or lower).'), + ); + + $form['break_phrase'] = array( + '#type' => 'checkbox', + '#title' => t('Allow multiple terms per argument'), + '#description' => t('If selected, users can enter multiple arguments in the form of 1+2+3. Due to the number of JOINs it would require, AND will be treated as OR with this argument.'), + '#default_value' => !empty($this->options['break_phrase']), + ); + + $form['set_breadcrumb'] = array( + '#type' => 'checkbox', + '#title' => t("Set the breadcrumb for the term parents"), + '#description' => t('If selected, the breadcrumb trail will include all parent terms, each one linking to this view. Note that this only works if just one term was received.'), + '#default_value' => !empty($this->options['set_breadcrumb']), + ); + } + + function set_breadcrumb(&$breadcrumb) { + if (empty($this->options['set_breadcrumb']) || !is_numeric($this->argument)) { + return; + } + + return views_taxonomy_set_breadcrumb($breadcrumb, $this); + } + + /** + * Override default_actions() to remove summary actions. + */ + function default_actions($which = NULL) { + if ($which) { + if (in_array($which, array('ignore', 'not found', 'empty', 'default'))) { + return parent::default_actions($which); + } + return; + } + $actions = parent::default_actions(); + unset($actions['summary asc']); + unset($actions['summary desc']); + return $actions; + } + + function query() { + $this->ensure_my_table(); + + if (!empty($this->options['break_phrase'])) { + $tids = new stdClass(); + $tids->value = $this->argument; + $tids = views_break_phrase($this->argument, $tids); + if ($tids->value == -1) { + return FALSE; + } + + if (count($tids->value) > 1) { + $placeholder = " IN (" . implode(', ', array_fill(0, sizeof($tids->value), '%d')) . ")"; + } + else { + $placeholder = " = %d"; + } + + $tids = $tids->value; + } + else { + $placeholder = "= %d"; + $tids = array($this->argument); + } + $subquery = "\n SELECT tn.vid FROM {term_node} tn\n"; + $where = " WHERE tn.tid $placeholder\n"; + $args = $tids; + $last = "tn"; + + if ($this->options['depth'] > 0) { + $subquery .= " LEFT JOIN {term_hierarchy} th ON th.tid = tn.tid\n"; + $last = "th"; + foreach (range(1, abs($this->options['depth'])) as $count) { + $subquery .= " LEFT JOIN {term_hierarchy} th$count ON $last.parent = th$count.tid\n"; + $where .= " OR th$count.tid $placeholder\n"; + $args = array_merge($args, $tids); + $last = "th$count"; + } + } + else if ($this->options['depth'] < 0) { + foreach (range(1, abs($this->options['depth'])) as $count) { + $subquery .= " LEFT JOIN {term_hierarchy} th$count ON $last.tid = th$count.parent\n"; + $where .= " OR th$count.tid $placeholder\n"; + $args = array_merge($args, $tids); + $last = "th$count"; + } + } + + $this->query->add_where(0, "$this->table_alias.$this->real_field IN ($subquery$where )", $args); + } + + function title() { + $term = taxonomy_get_term($this->argument); + if (!empty($term)) { + return check_plain($term->name); + } + // TODO review text + return t('No name'); + } +} diff --git a/modules/taxonomy/views_handler_argument_term_node_tid_depth_modifier.inc b/modules/taxonomy/views_handler_argument_term_node_tid_depth_modifier.inc new file mode 100644 index 0000000000000000000000000000000000000000..fa460dc0770cbaba9302a2bd93f26aa02ef69d64 --- /dev/null +++ b/modules/taxonomy/views_handler_argument_term_node_tid_depth_modifier.inc @@ -0,0 +1,59 @@ +view->args[$this->position]) ? $this->view->args[$this->position] : NULL; + if (!is_numeric($argument)) { + return; + } + + if ($argument > 10) { + $argument = 10; + } + + if ($argument < -10) { + $argument = -10; + } + + // figure out which argument preceded us. + $keys = array_reverse(array_keys($this->view->argument)); + $skip = TRUE; + foreach ($keys as $key) { + if ($key == $this->options['id']) { + $skip = FALSE; + continue; + } + + if ($skip) { + continue; + } + + if (empty($this->view->argument[$key])) { + continue; + } + + if (isset($handler)) { + unset($handler); + } + + $handler = &$this->view->argument[$key]; + if (empty($handler->definition['accept depth modifier'])) { + continue; + } + + // Finally! + $handler->options['depth'] = $argument; + } + } +} + diff --git a/modules/taxonomy/views_handler_argument_vocabulary_vid.inc b/modules/taxonomy/views_handler_argument_vocabulary_vid.inc new file mode 100644 index 0000000000000000000000000000000000000000..92f01e43ad8a1f108565e1830c87835609c0e897 --- /dev/null +++ b/modules/taxonomy/views_handler_argument_vocabulary_vid.inc @@ -0,0 +1,20 @@ +argument)); + + if (empty($title)) { + return t('No vocabulary'); + } + + return check_plain($title); + } +} diff --git a/modules/taxonomy/views_handler_field_taxonomy.inc b/modules/taxonomy/views_handler_field_taxonomy.inc new file mode 100644 index 0000000000000000000000000000000000000000..3db757e5fe19e82ef2277fb820fba7a893101bc5 --- /dev/null +++ b/modules/taxonomy/views_handler_field_taxonomy.inc @@ -0,0 +1,59 @@ +additional_fields['vid'] = 'vid'; + $this->additional_fields['tid'] = 'tid'; + } + + function option_definition() { + $options = parent::option_definition(); + $options['link_to_taxonomy'] = array('default' => FALSE); + return $options; + } + + /** + * Provide link to taxonomy option + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['link_to_taxonomy'] = array( + '#title' => t('Link this field to its taxonomy term page'), + '#description' => t('This will override any other link you have set.'), + '#type' => 'checkbox', + '#default_value' => !empty($this->options['link_to_taxonomy']), + ); + } + + /** + * Render whatever the data is as a link to the taxonomy. + * + * Data should be made XSS safe prior to calling this function. + */ + function render_link($data, $values) { + if (!empty($this->options['link_to_taxonomy']) && !empty($values->{$this->aliases['tid']}) && $data !== NULL && $data !== '') { + $term = new stdClass(); + $term->tid = $values->{$this->aliases['tid']}; + $term->vid = $values->{$this->aliases['vid']}; + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['path'] = taxonomy_term_path($term); + } + return $data; + } + + function render($values) { + return $this->render_link(check_plain($values->{$this->field_alias}), $values); + } +} diff --git a/modules/taxonomy/views_handler_field_term_node_tid.inc b/modules/taxonomy/views_handler_field_term_node_tid.inc new file mode 100644 index 0000000000000000000000000000000000000000..52d83fcc2760b070274ce947a08baa0e7116b6df --- /dev/null +++ b/modules/taxonomy/views_handler_field_term_node_tid.inc @@ -0,0 +1,119 @@ +base_table == 'node_revisions') { + $this->additional_fields['vid'] = array('table' => 'node_revisions', 'field' => 'vid'); + } + else { + $this->additional_fields['vid'] = array('table' => 'node', 'field' => 'vid'); + } + } + + function option_definition() { + $options = parent::option_definition(); + + $options['link_to_taxonomy'] = array('default' => TRUE); + $options['limit'] = array('default' => FALSE); + $options['vids'] = array('default' => array()); + + return $options; + } + + /** + * Provide "link to term" option. + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['link_to_taxonomy'] = array( + '#title' => t('Link this field to its term page'), + '#type' => 'checkbox', + '#default_value' => !empty($this->options['link_to_taxonomy']), + ); + + $form['limit'] = array( + '#type' => 'checkbox', + '#title' => t('Limit terms by vocabulary'), + '#default_value'=> $this->options['limit'], + ); + + $options = array(); + $vocabularies = taxonomy_get_vocabularies(); + foreach ($vocabularies as $voc) { + $options[$voc->vid] = check_plain($voc->name); + } + + $form['vids'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#type' => 'checkboxes', + '#title' => t('Vocabularies'), + '#options' => $options, + '#default_value' => $this->options['vids'], + '#process' => array('expand_checkboxes', 'views_process_dependency'), + '#dependency' => array('edit-options-limit' => array(TRUE)), + ); + } + + /** + * Add this term to the query + */ + function query() { + $this->add_additional_fields(); + } + + function pre_render($values) { + $this->field_alias = $this->aliases['vid']; + $vids = array(); + foreach ($values as $result) { + if (!empty($result->{$this->aliases['vid']})) { + $vids[] = $result->{$this->aliases['vid']}; + } + } + + if ($vids) { + $voc = ''; + if (!empty($this->options['limit']) && !empty($this->options['vids'])) { + $voc = " AND td.vid IN (" . implode(', ', array_keys(array_filter($this->options['vids']))) . ")"; + } + + $result = db_query("SELECT tn.vid AS node_vid, td.*, v.name as vocabulary FROM {term_data} td INNER JOIN {term_node} tn ON td.tid = tn.tid INNER JOIN {vocabulary} v ON v.vid = td.vid WHERE tn.vid IN (" . implode(', ', $vids) . ")$voc ORDER BY td.weight, td.name"); + + while ($term = db_fetch_object($result)) { + $this->items[$term->node_vid][$term->tid]['name'] = check_plain($term->name); + $this->items[$term->node_vid][$term->tid]['tid'] = $term->tid; + $this->items[$term->node_vid][$term->tid]['vid'] = $term->vid; + $this->items[$term->node_vid][$term->tid]['vocabulary'] = check_plain($term->vocabulary); + + if (!empty($this->options['link_to_taxonomy'])) { + $this->items[$term->node_vid][$term->tid]['make_link'] = TRUE; + $this->items[$term->node_vid][$term->tid]['path'] = taxonomy_term_path($term); + } + } + } + } + + function render_item($count, $item) { + return $item['name']; + } + + function document_self_tokens(&$tokens) { + $tokens['[' . $this->options['id'] . '-tid' . ']'] = t('The taxonomy term ID for the term.'); + $tokens['[' . $this->options['id'] . '-name' . ']'] = t('The taxonomy term name for the term.'); + $tokens['[' . $this->options['id'] . '-vid' . ']'] = t('The vocabulary ID for the vocabulary the term belongs to.'); + $tokens['[' . $this->options['id'] . '-vocabulary' . ']'] = t('The name for the vocabulary the term belongs to.'); + } + + function add_self_tokens(&$tokens, $item) { + $tokens['[' . $this->options['id'] . '-tid' . ']'] = $item['tid']; + $tokens['[' . $this->options['id'] . '-name' . ']'] = $item['name']; + $tokens['[' . $this->options['id'] . '-vid' . ']'] = $item['vid']; + $tokens['[' . $this->options['id'] . '-vocabulary' . ']'] = $item['vocabulary']; + } +} + diff --git a/modules/taxonomy/views_handler_filter_term_node_tid.inc b/modules/taxonomy/views_handler_filter_term_node_tid.inc new file mode 100644 index 0000000000000000000000000000000000000000..57866c590e614d857ca23670fdae60978b968b64 --- /dev/null +++ b/modules/taxonomy/views_handler_filter_term_node_tid.inc @@ -0,0 +1,303 @@ + 'textfield'); + $options['limit'] = array('default' => TRUE); + $options['vid'] = array('default' => 0); + + return $options; + } + + function extra_options_form(&$form, &$form_state) { + $vocabularies = taxonomy_get_vocabularies(); + foreach ($vocabularies as $voc) { + $options[$voc->vid] = check_plain($voc->name); + } + + if ($this->options['limit']) { + // We only do this when the form is displayed so this query doesn't run + // unnecessarily just when the object is constructed. + if ($this->options['vid'] == 0) { + $this->options['vid'] = db_result(db_query('SELECT MIN(vid) FROM {vocabulary} v')); + } + + $form['vid'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#type' => 'radios', + '#title' => t('Vocabulary'), + '#options' => $options, + '#description' => t('Select which vocabulary to show terms for in the regular options.'), + '#default_value' => $this->options['vid'], + ); + } + + $form['markup_start'] = array( + '#value' => '
    ', + ); + + $form['type'] = array( + '#type' => 'radios', + '#title' => t('Selection type'), + '#options' => array('select' => t('Dropdown'), 'textfield' => t('Autocomplete')), + '#default_value' => $this->options['type'], + ); + + $form['hierarchy'] = array( + '#type' => 'checkbox', + '#title' => t('Show hierarchy in dropdown'), + '#default_value' => !empty($this->options['hierarchy']), + '#process' => array('views_process_dependency'), + '#dependency' => array('radio:options[type]' => array('select')), + ); + + $form['markup_end'] = array( + '#value' => '
    ', + ); + } + + function value_form(&$form, &$form_state) { + $vocabulary = taxonomy_vocabulary_load($this->options['vid']); + if (empty($vocabulary) && $this->options['limit']) { + $form['markup'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#value' => t('An invalid vocabulary is selected. Please change it in the options.'), + ); + return; + } + + if ($this->options['type'] == 'textfield') { + $default = ''; + if ($this->value) { + $result = db_query("SELECT * FROM {term_data} td WHERE td.tid IN (" . implode(', ', $this->value) . ')'); + while ($term = db_fetch_object($result)) { + if ($default) { + $default .= ', '; + } + $default .= $term->name; + } + } + + $form['value'] = array( + '#title' => $this->options['limit'] ? t('Select terms from vocabulary @voc', array('@voc' => $vocabulary->name)) : t('Select terms'), + '#type' => 'textfield', + '#default_value' => $default, + ); + + if ($this->options['limit']) { + $form['value']['#autocomplete_path'] = 'taxonomy/autocomplete/' . $vocabulary->vid; + } + } + else { + if (!empty($this->options['hierarchy']) && $this->options['limit']) { + $tree = taxonomy_get_tree($vocabulary->vid); + $options = array(); + + if ($tree) { + foreach ($tree as $term) { + $choice = new stdClass(); + $choice->option = array($term->tid => str_repeat('-', $term->depth) . $term->name); + $options[] = $choice; + } + } + } + else { + $options = array(); + if ($this->options['limit']) { + $result = db_query("SELECT * FROM {term_data} WHERE vid = %d ORDER BY weight, name", $vocabulary->vid); + } + else { + $result = db_query("SELECT td.* FROM {term_data} td INNER JOIN {vocabulary} v ON td.vid = v.vid ORDER BY v.weight, v.name, td.weight, td.name"); + } + while ($term = db_fetch_object($result)) { + $options[$term->tid] = $term->name; + } + } + + $default_value = (array) $this->value; + + if (!empty($form_state['exposed'])) { + $identifier = $this->options['expose']['identifier']; + + if (!empty($this->options['expose']['reduce'])) { + $options = $this->reduce_value_options($options); + + if (empty($this->options['expose']['single']) && !empty($this->options['expose']['optional'])) { + $default_value = array(); + } + } + + if (!empty($this->options['expose']['single'])) { + if (!empty($this->options['expose']['optional']) && (empty($default_value) || !empty($this->options['expose']['reduce']))) { + $default_value = 'All'; + } + else if (empty($default_value)) { + $keys = array_keys($options); + $default_value = array_shift($keys); + } + else { + $copy = $default_value; + $default_value = array_shift($copy); + } + } + } + $form['value'] = array( + '#type' => 'select', + '#title' => $this->options['limit'] ? t('Select terms from vocabulary @voc', array('@voc' => $vocabulary->name)) : t('Select terms'), + '#multiple' => TRUE, + '#options' => $options, + '#size' => min(9, count($options)), + '#default_value' => $default_value, + ); + + if (!empty($form_state['exposed']) && !isset($form_state['input'][$identifier])) { + $form_state['input'][$identifier] = $default_value; + } + } + + + if (empty($form_state['exposed'])) { + // Retain the helper option + $this->helper->options_form($form, $form_state); + } + } + + function value_validate(&$form, &$form_state) { + // We only validate if they've chosen the text field style. + if ($this->options['type'] != 'textfield') { + return; + } + + $values = drupal_explode_tags($form_state['values']['options']['value']); + $tids = $this->validate_term_strings($form['value'], $values); + + if ($tids) { + $form_state['values']['options']['value'] = $tids; + } + } + + function accept_exposed_input($input) { + if (empty($this->options['exposed'])) { + return TRUE; + } + + // If it's optional and there's no value don't bother filtering. + if ($this->options['expose']['optional'] && empty($this->validated_exposed_input)) { + return FALSE; + } + + $rc = parent::accept_exposed_input($input); + if ($rc) { + // If we have previously validated input, override. + if (isset($this->validated_exposed_input)) { + $this->value = $this->validated_exposed_input; + } + } + + return $rc; + } + + function exposed_validate(&$form, &$form_state) { + if (empty($this->options['exposed'])) { + return; + } + + $identifier = $this->options['expose']['identifier']; + + // We only validate if they've chosen the text field style. + if ($this->options['type'] != 'textfield') { + if ($form_state['values'][$identifier] != 'All') { + $this->validated_exposed_input = (array) $form_state['values'][$identifier]; + } + return; + } + + if (empty($this->options['expose']['identifier'])) { + return; + } + + $values = drupal_explode_tags($form_state['values'][$identifier]); + + $tids = $this->validate_term_strings($form[$identifier], $values); + if ($tids) { + $this->validated_exposed_input = $tids; + } + } + + /** + * Validate the user string. Since this can come from either the form + * or the exposed filter, this is abstracted out a bit so it can + * handle the multiple input sources. + */ + function validate_term_strings(&$form, $values) { + if (empty($values)) { + return array(); + } + + $tids = array(); + $placeholders = array(); + $args = array(); + $results = array(); + foreach ($values as $value) { + $missing[strtolower($value)] = TRUE; + $args[] = $value; + $placeholders[] = "'%s'"; + } + + if (!$args) { + return; + } + + // add the taxonomy vid to the argument list. + $args[] = $this->options['vid']; + + $result = db_query("SELECT * FROM {term_data} WHERE name IN (" . implode(', ', $placeholders) . ") AND vid = %d", $args); + while ($term = db_fetch_object($result)) { + unset($missing[strtolower($term->name)]); + $tids[] = $term->tid; + } + + if ($missing) { + form_error($form, format_plural(count($missing), 'Unable to find term: @terms', 'Unable to find terms: @terms', array('@terms' => implode(', ', array_keys($missing))))); + } + + return $tids; + } + + function value_submit($form, &$form_state) { + // prevent array_filter from messing up our arrays in parent submit. + } + + function expose_form_right(&$form, &$form_state) { + parent::expose_form_right($form, $form_state); + if ($this->options['type'] != 'select') { + unset($form['expose']['reduce']); + } + } + + function admin_summary() { + // set up $this->value_options for the parent summary + $this->value_options = array(); + + if ($this->value) { + $result = db_query("SELECT * FROM {term_data} td WHERE td.tid IN (" . implode(', ', $this->value) . ")"); + + while ($term = db_fetch_object($result)) { + $this->value_options[$term->tid] = $term->name; + } + } + return parent::admin_summary(); + } +} diff --git a/modules/taxonomy/views_handler_filter_term_node_tid_depth.inc b/modules/taxonomy/views_handler_filter_term_node_tid_depth.inc new file mode 100644 index 0000000000000000000000000000000000000000..4f858bba5230cc666cf077d52719163f5a80e8ce --- /dev/null +++ b/modules/taxonomy/views_handler_filter_term_node_tid_depth.inc @@ -0,0 +1,90 @@ + t('Is one of'), + ); + } + + function option_definition() { + $options = parent::option_definition(); + + $options['depth'] = array('default' => 0); + + return $options; + } + + function extra_options_form(&$form, &$form_state) { + parent::extra_options_form($form, $form_state); + + $form['depth'] = array( + '#type' => 'weight', + '#title' => t('Depth'), + '#default_value' => $this->options['depth'], + '#description' => t('The depth will match nodes tagged with terms in the hierarchy. For example, if you have the term "fruit" and a child term "apple", with a depth of 1 (or higher) then filtering for the term "fruit" will get nodes that are tagged with "apple" as well as "fruit". If negative, the reverse is true; searching for "apple" will also pick up nodes tagged with "fruit" if depth is -1 (or lower).'), + ); + } + + function query() { + // If no filter values are present, then do nothing. + if (count($this->value) == 0) { + return; + } + else if (count($this->value) == 1) { + $placeholder = " = %d"; + } + else { + $placeholder = " IN (" . implode(', ', array_fill(0, sizeof($this->value), '%d')) . ")"; + } + + // The normal use of ensure_my_table() here breaks Views. + // So instead we trick the filter into using the alias of the base table. + // See http://drupal.org/node/271833 + // If a relationship is set, we must use the alias it provides. + if (!empty($this->relationship)) { + $this->table_alias = $this->relationship; + } + // If no relationship, then use the alias of the base table. + else if (isset($this->query->table_queue[$this->query->base_table]['alias'])) { + $this->table_alias = $this->query->table_queue[$this->query->base_table]['alias']; + } + // This should never happen, but if it does, we fail quietly. + else { + return; + } + + // Now build the subqueries. + $subquery = "\n SELECT tn.vid FROM {term_node} tn\n"; + $where = " WHERE tn.tid $placeholder\n"; + $args = $this->value; + $last = "tn"; + + if ($this->options['depth'] > 0) { + $subquery .= " LEFT JOIN {term_hierarchy} th ON th.tid = tn.tid\n"; + $last = "th"; + foreach (range(1, abs($this->options['depth'])) as $count) { + $subquery .= " LEFT JOIN {term_hierarchy} th$count ON $last.parent = th$count.tid\n"; + $where .= " OR th$count.tid $placeholder\n"; + $args = array_merge($args, $this->value); + $last = "th$count"; + } + } + else if ($this->options['depth'] < 0) { + foreach (range(1, abs($this->options['depth'])) as $count) { + $subquery .= " LEFT JOIN {term_hierarchy} th$count ON $last.tid = th$count.parent\n"; + $where .= " OR th$count.tid $placeholder\n"; + $args = array_merge($args, $this->value); + $last = "th$count"; + } + } + + $this->query->add_where(0, "$this->table_alias.$this->real_field IN ($subquery$where )", $args); + } +} diff --git a/modules/taxonomy/views_handler_filter_vocabulary_vid.inc b/modules/taxonomy/views_handler_filter_vocabulary_vid.inc new file mode 100644 index 0000000000000000000000000000000000000000..b96f0a170e18c8afc25df763d237a573f0fcbb50 --- /dev/null +++ b/modules/taxonomy/views_handler_filter_vocabulary_vid.inc @@ -0,0 +1,19 @@ +value_options)) { + return; + } + + $this->value_options = array(); + $vocabularies = taxonomy_get_vocabularies(); + foreach ($vocabularies as $voc) { + $this->value_options[$voc->vid] = $voc->name; + } + } +} diff --git a/modules/taxonomy/views_handler_relationship_node_term_data.inc b/modules/taxonomy/views_handler_relationship_node_term_data.inc new file mode 100644 index 0000000000000000000000000000000000000000..dfbf950a3c58b54099cfc171bb9c3eeef22aae33 --- /dev/null +++ b/modules/taxonomy/views_handler_relationship_node_term_data.inc @@ -0,0 +1,75 @@ + array()); + return $options; + } + + /** + * Default options form that provides the label widget that all fields + * should have. + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $vocabularies = taxonomy_get_vocabularies(); + $options = array(); + foreach ($vocabularies as $voc) { + $options[$voc->vid] = check_plain($voc->name); + } + + $form['vids'] = array( + '#type' => 'checkboxes', + '#title' => t('Vocabularies'), + '#options' => $options, + '#default_value' => $this->options['vids'], + '#description' => t('Choose which vocabularies you wish to relate. Remember that every term found will create a new record, so this relationship is best used on just one vocabulary that has only one term per node.'), + ); + } + + /** + * Called to implement a relationship in a query. + */ + function query() { + $this->ensure_my_table(); + + $def = $this->definition; + $def['table'] = 'term_data'; + + if (!empty($this->options['required']) || !array_filter($this->options['vids'])) { + $term_node = $this->query->add_table('term_node', $this->relationship); + $def['left_table'] = $term_node; + $def['left_field'] = 'tid'; + $def['field'] = 'tid'; + if (!empty($this->options['required'])) { + $def['type'] = 'INNER'; + } + } + else { + // If the join is optional, join a subselect that will emulate term_data table instead + $def['left_table'] = $this->table_alias; + $def['left_field'] = 'vid'; + $def['field'] = 'revision'; + // fapi ensures vids are safe here. + $vids = implode(', ', array_filter($this->options['vids'])); + $def['table formula'] = "(SELECT td.*, tn.vid AS revision FROM {term_data} td INNER JOIN {term_node} tn ON tn.tid = td.tid WHERE td.vid IN ($vids))"; + } + + $join = new views_join(); + + $join->definition = $def; + $join->construct(); + $join->adjusted = TRUE; + + // use a short alias for this: + $alias = $def['table'] . '_' . $this->table; + + $this->alias = $this->query->add_relationship($alias, $join, 'term_data', $this->relationship); + } +} diff --git a/modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc b/modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc new file mode 100644 index 0000000000000000000000000000000000000000..b22c1cbc921102530d7b0e4399f0e5576d88f56d --- /dev/null +++ b/modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc @@ -0,0 +1,125 @@ +vid] = check_plain($voc->name); + } + + $form['validate_argument_vocabulary'] = array( + '#type' => 'checkboxes', + '#prefix' => '
    ', + '#suffix' => '
    ', + '#title' => t('Vocabularies'), + '#options' => $options, + '#default_value' => isset($this->argument->options['validate_argument_vocabulary']) ? $this->argument->options['validate_argument_vocabulary'] : array(), + '#description' => t('If you wish to validate for specific vocabularies, check them; if none are checked, all terms will pass.'), + '#process' => array('expand_checkboxes', 'views_process_dependency'), + '#dependency' => array('edit-options-validate-type' => array($this->id)), + ); + + $form['validate_argument_type'] = array( + '#type' => 'select', + '#title' => t('Argument type'), + '#options' => array( + 'tid' => t('Term ID'), + 'tids' => t('Term IDs separated by , or +'), + 'name' => t('Term name or synonym'), + 'convert' => t('Term name/synonym converted to Term ID'), + ), + '#default_value' => isset($this->argument->options['validate_argument_type']) ? $this->argument->options['validate_argument_type'] : 'tid', + '#description' => t('Select the form of this argument; if using term name, it is generally more efficient to convert it to a term ID and use Taxonomy: Term ID rather than Taxonomy: Term Name" as an argument.'), + '#process' => array('views_process_dependency'), + '#dependency' => array('edit-options-validate-type' => array($this->id)), + ); + + $form['validate_argument_transform'] = array( + '#type' => 'checkbox', + '#title' => t('Transform dashes in URL to spaces in term name arguments'), + '#default_value' => isset($this->argument->options['validate_argument_transform']) ? $this->argument->options['validate_argument_transform'] : FALSE, + '#process' => array('views_process_dependency'), + '#dependency' => array('edit-options-validate-argument-type' => array('convert')), + ); + } + + function validate_argument($argument) { + $vids = isset($this->argument->options['validate_argument_vocabulary']) ? array_filter($this->argument->options['validate_argument_vocabulary']) : array(); + $type = isset($this->argument->options['validate_argument_type']) ? $this->argument->options['validate_argument_type'] : 'tid'; + $transform = isset($this->argument->options['validate_argument_transform']) ? $this->argument->options['validate_argument_transform'] : FALSE; + + switch ($type) { + case 'tid': + if (!is_numeric($argument)) { + return FALSE; + } + + $result = db_fetch_object(db_query("SELECT * FROM {term_data} WHERE tid = %d", $argument)); + if (!$result) { + return FALSE; + } + + return empty($vids) || !empty($vids[$result->vid]); + case 'tids': + $tids = new stdClass(); + $tids->value = $argument; + $tids = views_break_phrase($argument, $tids); + if ($tids->value == array(-1)) { + return FALSE; + } + + $placeholders = implode(', ', array_fill(0, sizeof($tids->value), '%d')); + + $test = drupal_map_assoc($tids->value); + $titles = array(); + + $result = db_query("SELECT * FROM {term_data} WHERE tid IN ($placeholders)", $tids->value); + while ($term = db_fetch_object($result)) { + if ($vids && empty($vids[$term->vid])) { + return FALSE; + } + + $titles[] = check_plain($term->name); + unset($test[$term->tid]); + } + + // Remove duplicate titles + $titles = array_unique($titles); + + $this->argument->validated_title = implode($tids->operator == 'or' ? ' + ' : ', ', $titles); + // If this is not empty, we did not find a tid. + return empty($test); + case 'name': + case 'convert': + $and = ''; + if (!empty($vids)) { + $and = " AND td.vid IN(" . implode(', ', $vids) . ')'; + } + if ($transform) { + $result = db_fetch_object(db_query("SELECT td.* FROM {term_data} td LEFT JOIN {term_synonym} ts ON ts.tid = td.tid WHERE (replace(td.name, ' ', '-') = '%s' OR replace(ts.name, ' ', '-') = '%s')$and", $argument, $argument)); + } + else { + $result = db_fetch_object(db_query("SELECT td.* FROM {term_data} td LEFT JOIN {term_synonym} ts ON ts.tid = td.tid WHERE (td.name = '%s' OR ts.name = '%s')$and", $argument, $argument)); + } + if (!$result) { + return FALSE; + } + + if ($type == 'convert') { + $this->argument->argument = $result->tid; + $this->argument->validated_title = check_plain($result->name); + } + + return TRUE; + } + } +} diff --git a/modules/translation.views.inc b/modules/translation.views.inc new file mode 100644 index 0000000000000000000000000000000000000000..885335a8bcfc5d717e1060a1b5bea41a5e0ae210 --- /dev/null +++ b/modules/translation.views.inc @@ -0,0 +1,178 @@ + 'tnid', + 'field' => 'tnid', + ); + + // Language field + $data['node']['language'] = array( + 'group' => t('Node translation'), + 'title' => t('Language'), + 'help' => t('The language the content is in.'), + 'field' => array( + 'handler' => 'views_handler_field_node_language', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_node_language', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_node_language', + ), + ); + + // The translation ID (nid of the "source" translation) + $data['node']['tnid'] = array( + 'group' => t('Node translation'), + 'title' => t('Translation set node ID'), + 'help' => t('The ID of the translation set the content belongs to.'), + 'field' => array( + 'handler' => 'views_handler_field_node', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_node_tnid', + 'parent' => 'views_handler_argument_numeric', // make sure parent is included + 'name field' => 'title', // the field to display in the summary. + 'numeric' => TRUE, + 'validate type' => 'tnid', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'relationship' => array( + 'title' => t('Source translation'), + 'help' => t('The source that this content was translated from.'), + 'base' => 'node', + 'base field' => 'nid', + 'handler' => 'views_handler_relationship', + 'label' => t('Source translation'), + ), + ); + + // The source translation. + $data['node']['translation'] = array( + 'group' => t('Node translation'), + 'title' => t('Translations'), + 'help' => t('Versions of content in different languages.'), + 'relationship' => array( + 'title' => t('Translations'), + 'help' => t('Versions of content in different languages.'), + 'base' => 'node', + 'base field' => 'tnid', + 'relationship table' => 'node', + 'relationship field' => 'nid', + 'handler' => 'views_handler_relationship_translation', + 'label' => t('Translations'), + ), + ); + + // The source translation. + $data['node']['source_translation'] = array( + 'group' => t('Node translation'), + 'title' => t('Source translation'), + 'help' => t('Nodes that are either untranslated or are the original versions of a translation set.'), + 'filter' => array( + 'handler' => 'views_handler_filter_node_tnid', + ), + ); + + // The source translation. + $data['node']['child_translation'] = array( + 'group' => t('Node translation'), + 'title' => t('Child translation'), + 'help' => t('Nodes that are translations of a source translation.'), + 'filter' => array( + 'handler' => 'views_handler_filter_node_tnid_child', + ), + ); + + // Translation status + $data['node']['translate'] = array( + 'group' => t('Node translation'), + 'title' => t('Translation status'), + 'help' => t('The translation status of the node--whether or not the translation needs to be updated.'), + 'field' => array( + 'handler' => 'views_handler_field_boolean', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_boolean_operator', + 'label' => t('Outdated'), + 'type' => 'yes-no', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + +} + +/** + * Implementation of hook_views_handlers() to register all of the basic handlers + * views uses. + */ +function translation_views_handlers() { + return array( + 'info' => array( + 'path' => drupal_get_path('module', 'views') . '/modules/translation', + ), + 'handlers' => array( + // field handlers + 'views_handler_field_node_language' => array( + 'parent' => 'views_handler_field_node', + ), + // argument handlers + 'views_handler_argument_node_language' => array( + 'parent' => 'views_handler_argument', + ), + 'views_handler_argument_node_tnid' => array( + 'parent' => 'views_handler_argument', + ), + // filters + 'views_handler_filter_node_language' => array( + 'parent' => 'views_handler_filter_in_operator', + ), + 'views_handler_filter_node_tnid' => array( + 'parent' => 'views_handler_filter', + ), + // relationships + 'views_handler_relationship_translation' => array( + 'parent' => 'views_handler_relationship', + ), + 'views_handler_filter_node_tnid_child' => array( + 'parent' => 'views_handler_filter', + ), + + ), + ); +} + +/** + * @} + */ diff --git a/modules/translation/views_handler_argument_node_language.inc b/modules/translation/views_handler_argument_node_language.inc new file mode 100644 index 0000000000000000000000000000000000000000..01465eb0198878412dd83ef72fa7e11c475c2374 --- /dev/null +++ b/modules/translation/views_handler_argument_node_language.inc @@ -0,0 +1,32 @@ +node_language($data->{$this->name_alias}); + } + + /** + * Override the behavior of title(). Get the user friendly version of the + * node type. + */ + function title() { + return $this->node_language($this->argument); + } + + function node_language($langcode) { + $languages = locale_language_list(); + return isset($languages[$langcode]) ? $languages[$langcode] : t('Unknown language'); + } +} + diff --git a/modules/translation/views_handler_argument_node_tnid.inc b/modules/translation/views_handler_argument_node_tnid.inc new file mode 100644 index 0000000000000000000000000000000000000000..e33dfc318c295f03397f5b6294ade2147700bd71 --- /dev/null +++ b/modules/translation/views_handler_argument_node_tnid.inc @@ -0,0 +1,26 @@ +value), '%d')); + + $result = db_query("SELECT n.title FROM {node} n WHERE n.tnid IN ($placeholders)", $this->value); + while ($term = db_fetch_object($result)) { + $titles[] = check_plain($term->title); + } + return $titles; + } +} + diff --git a/modules/translation/views_handler_field_node_language.inc b/modules/translation/views_handler_field_node_language.inc new file mode 100644 index 0000000000000000000000000000000000000000..baef82e9201f766fe9c36875b732142a9ee4583f --- /dev/null +++ b/modules/translation/views_handler_field_node_language.inc @@ -0,0 +1,13 @@ +{$this->field_alias}]) ? $languages[$values->{$this->field_alias}] : ''; + return $this->render_link($value, $values); + } +} diff --git a/modules/translation/views_handler_field_node_translation_link.inc b/modules/translation/views_handler_field_node_translation_link.inc new file mode 100644 index 0000000000000000000000000000000000000000..21a5e49a5da9fe605cf2b87d99cea24945cfef5a --- /dev/null +++ b/modules/translation/views_handler_field_node_translation_link.inc @@ -0,0 +1,33 @@ +additional_fields['nid'] = 'nid'; + $this->additional_fields['tnid'] = 'tnid'; + $this->additional_fields['title'] = 'title'; + $this->additional_fields['language'] = 'language'; + } + + function query() { + $this->ensure_my_table(); + $this->add_additional_fields(); + } + + function render($values) { + global $language; + $tnid = $values->{$this->aliases['tnid']}; + // Only load translations if the node isn't in the current language. + if ($values->{$this->aliases['language']} != $language->language) { + $translations = translation_node_get_translations($tnid); + if (isset($translations[$language->language])) { + $values->{$this->aliases['nid']} = $translations[$language->language]->nid; + $values->{$this->aliases['title']} = $translations[$language->language]->title; + } + } + return l($values->{$this->aliases['title']}, "node/" . $values->{$this->aliases['nid']}); + } +} diff --git a/modules/translation/views_handler_filter_node_language.inc b/modules/translation/views_handler_filter_node_language.inc new file mode 100644 index 0000000000000000000000000000000000000000..64ac921c468017915b1228bf24db436cd31b7669 --- /dev/null +++ b/modules/translation/views_handler_filter_node_language.inc @@ -0,0 +1,16 @@ +value_options)) { + $this->value_title = t('Language'); + $languages = array('***CURRENT_LANGUAGE***' => t("Current user's language"), '***DEFAULT_LANGUAGE***' => t("Default site language"), '***NO_LANGUAGE***' => t('No language')); + $languages = array_merge($languages, locale_language_list()); + $this->value_options = $languages; + } + } +} + diff --git a/modules/translation/views_handler_filter_node_tnid.inc b/modules/translation/views_handler_filter_node_tnid.inc new file mode 100644 index 0000000000000000000000000000000000000000..b99e97ae102f3f37fbedb8fb2dbffa9446222e15 --- /dev/null +++ b/modules/translation/views_handler_filter_node_tnid.inc @@ -0,0 +1,39 @@ + 'radios', + '#title' => t('Include untranslated nodes'), + '#default_value' => $this->operator, + '#options' => array( + 1 => t('Yes'), + 0 => t('No'), + ), + ); + } + + function can_expose() { return FALSE; } + + function query() { + $table = $this->ensure_my_table(); + // Select for source translations (tnid = nid). Conditionally, also accept either untranslated nodes (tnid = 0). + $this->query->add_where($this->options['group'], "$table.tnid = $table.nid" . ($this->operator ? " OR $table.tnid = 0" : '')); + } +} + diff --git a/modules/translation/views_handler_filter_node_tnid_child.inc b/modules/translation/views_handler_filter_node_tnid_child.inc new file mode 100644 index 0000000000000000000000000000000000000000..d8601d411e4a9ced8ef47871084bf87a56df7a35 --- /dev/null +++ b/modules/translation/views_handler_filter_node_tnid_child.inc @@ -0,0 +1,16 @@ +ensure_my_table(); + $this->query->add_where($this->options['group'], "$table.tnid <> $table.nid AND $table.tnid > 0"); + } +} + diff --git a/modules/translation/views_handler_relationship_translation.inc b/modules/translation/views_handler_relationship_translation.inc new file mode 100644 index 0000000000000000000000000000000000000000..7331bbd4f8a10cb28193db7aa477e038973b693c --- /dev/null +++ b/modules/translation/views_handler_relationship_translation.inc @@ -0,0 +1,97 @@ + 'current'); + + return $options; + } + + /** + * Add a translation selector. + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + + $options = array( + 'all' => t('All'), + 'current' => t('Current language'), + 'default' => t('Default language'), + ); + $options = array_merge($options, locale_language_list()); + $form['language'] = array( + '#type' => 'select', + '#options' => $options, + '#default_value' => $this->options['language'], + '#title' => t('Translation option'), + '#description' => t('The translation options allows you to select which translation or translations in a translation set join on. Select "Current language" or "Default language" to join on the translation in the current or default language respectively. Select a specific language to join on a translation in that language. If you select "All", each translation will create a new row, which may appear to cause duplicates.'), + ); + } + + /** + * Called to implement a relationship in a query. + */ + function query() { + // Figure out what base table this relationship brings to the party. + $table_data = views_fetch_data($this->definition['base']); + $base_field = empty($this->definition['base field']) ? $table_data['table']['base']['field'] : $this->definition['base field']; + + $this->ensure_my_table(); + + $def = $this->definition; + $def['table'] = $this->definition['base']; + $def['field'] = $base_field; + $def['left_table'] = $this->table_alias; + $def['left_field'] = $this->field; + if (!empty($this->options['required'])) { + $def['type'] = 'INNER'; + } + + $def['extra'] = array(); + if ($this->options['language'] != 'all') { + switch ($this->options['language']) { + case 'current': + $def['extra'][] = array( + 'field' => 'language', + 'value' => '***CURRENT_LANGUAGE***', + ); + break; + case 'default': + $def['extra'][] = array( + 'field' => 'language', + 'value' => '***DEFAULT_LANGUAGE***', + ); + break; + // Other values will be the language codes. + default: + $def['extra'][] = array( + 'field' => 'language', + 'value' => $this->options['language'], + ); + break; + } + } + + if (!empty($def['join_handler']) && class_exists($def['join_handler'])) { + $join = new $def['join_handler']; + } + else { + $join = new views_join(); + } + + $join->definition = $def; + $join->construct(); + $join->adjusted = TRUE; + + // use a short alias for this: + $alias = $def['table'] . '_' . $this->table; + + $this->alias = $this->query->add_relationship($alias, $join, $this->definition['base'], $this->relationship); + } +} diff --git a/modules/upload.views.inc b/modules/upload.views.inc new file mode 100644 index 0000000000000000000000000000000000000000..a8ae3b1c545f394a62f984fe11279b6dd7e79db0 --- /dev/null +++ b/modules/upload.views.inc @@ -0,0 +1,164 @@ + array( + 'left_field' => 'vid', + 'field' => 'vid', + ), + 'node_revisions' => array( + 'left_field' => 'vid', + 'field' => 'vid', + ), + 'files' => array( + 'left_field' => 'fid', + 'field' => 'fid', + ), + ); + + $data['upload']['vid'] = array( + 'title' => t('Node'), + 'help' => t('The node the uploaded file is attached to'), + 'relationship' => array( + 'label' => t('upload'), + 'base' => 'node', + 'base field' => 'vid', + // This allows us to not show this relationship if the base is already + // node so users won't create circular relationships. + 'skip base' => array('node', 'node_revisions'), + ), + ); + + $data['upload']['description'] = array( + 'title' => t('Description'), + 'help' => t('The description of the uploaded file.'), + 'field' => array( + 'handler' => 'views_handler_field_upload_description', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + $data['upload']['list'] = array( + 'title' => t('Listed'), + 'help' => t('Whether or not the file is marked to be listed.'), + 'field' => array( + 'handler' => 'views_handler_field_boolean', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_boolean_operator', + 'label' => t('Published'), + 'type' => 'yes-no', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + $data['upload']['weight'] = array( + 'title' => t('Weight'), + 'help' => t('The weight, used for sorting.'), + 'field' => array( + 'handler' => 'views_handler_field_numeric', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_numeric', + ), + ); + + return $data; +} + +/** + * Implementation of hook_views_data_alter() + */ +function upload_views_data_alter(&$data) { + $data['node']['upload_fid'] = array( + 'group' => t('Upload'), + 'title' => t('Attached files'), + 'help' => t('All files attached to a node with upload.module.'), + 'real field' => 'vid', + 'field' => array( + 'handler' => 'views_handler_field_upload_fid', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_upload_fid', + 'title' => t('Has attached files'), + 'type' => 'yes-no', + 'help' => t('Only display items with attached files. This can cause duplicates if there are multiple attached files.'), + ), + 'relationship' => array( + 'title' => t('Attached files'), + 'help' => t('Add a relationship to gain access to more file data for files uploaded by upload.module. Note that this relationship will cause duplicate nodes if there are multiple files attached to the node.'), + 'relationship table' => 'upload', + 'relationship field' => 'fid', + 'base' => 'files', + 'field' => 'fid', + 'handler' => 'views_handler_relationship', + 'label' => t('Files'), + ), + ); +} + +/** + * Implementation of hook_views_handlers() to register all of the basic handlers + * views uses. + */ +function upload_views_handlers() { + return array( + 'info' => array( + 'path' => drupal_get_path('module', 'views') . '/modules/upload', + ), + 'handlers' => array( + 'views_handler_field_upload_fid' => array( + 'parent' => 'views_handler_field_prerender_list', + ), + 'views_handler_field_upload_description' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_filter_upload_fid' => array( + 'parent' => 'views_handler_filter_boolean_operator', + ), + ), + ); +} + +/** + * @} + */ diff --git a/modules/upload.views_convert.inc b/modules/upload.views_convert.inc new file mode 100644 index 0000000000000000000000000000000000000000..a0ff0ddcaeb6124437b70265044e7429b04fe349 --- /dev/null +++ b/modules/upload.views_convert.inc @@ -0,0 +1,108 @@ +add_item() won't produce + * the right results, usually needed to set field options or values. + */ +function upload_views_convert($display, $type, &$view, $field, $id = NULL) { + switch ($type) { + case 'field': + switch ($field['tablename']) { + case 'file_revisions': + switch ($field['field']) { + case 'fid': + $relationship = $view->add_item($display, 'relationship', 'node', 'upload_fid', array(), 'node_upload_fid'); + $view->set_item_option($display, 'field', $id, 'relationship', $relationship); + $view->set_item_option($display, 'field', $id, 'table', 'files'); + break; + } + break; + case 'files': + switch ($field['field']) { + case 'all_files': + $item = $view->get_item($display, 'field', $id); + switch ($field['options']) { + case 'link': + $item['link_to_file'] = TRUE; + break; + case 'linkdesc': + $item['link_to_file'] = TRUE; + case 'nolinkdesc': + $item['alter']['alter_text'] = TRUE; + $item['alter']['text'] = '['. $view->add_item($display, 'field', 'upload', 'description', array('exclude' => TRUE)) .']'; + break; + } + if ($field['handler'] == 'views_handler_file_listed_files') { + $item['only_listed'] = TRUE; + } + $item['table'] = 'node'; + $item['field'] = 'upload_fid'; + $view->set_item($display, 'field', $id, $item); + break; + case 'filename': + if ($field['handler'] == 'views_handler_file_filename_download') { + $view->set_item_option($display, 'field', $id, 'link_to_file', TRUE); + } + $relationship = $view->add_item($display, 'relationship', 'node', 'upload_fid', array(), 'node_upload_fid'); + $view->set_item_option($display, 'field', $id, 'relationship', $relationship); + break; + } + break; + } + break; + case 'filter': + switch ($field['tablename']) { + case 'file_revisions': + switch ($field['field']) { + case 'fid': + $view->set_item_option($display, 'filter', $id, 'table', 'node'); + $view->set_item_option($display, 'filter', $id, 'field', 'upload_fid'); + break; + case 'list': + $view->set_item_option($display, 'filter', $id, 'table', 'upload'); + break; + } + break; + case 'files': + switch ($field['field']) { + case 'filename': + case 'filemime': + $item = $view->get_item($display, 'filter', $id); + $item['operator'] = $field['operator']; + $item['case'] = FALSE; + $item['relationship'] = $view->add_item($display, 'relationship', 'node', 'upload_fid', array(), 'node_upload_fid'); + $view->set_item($display, 'filter', $id, $item); + break; + case 'filesize': + $relationship = $view->add_item($display, 'relationship', 'node', 'upload_fid', array(), 'node_upload_fid'); + $view->set_item_option($display, 'filter', $id, 'relationship', $relationship); + $view->set_item_option($display, 'filter', $id, 'operator', $field['operator']); + break; + } + break; + } + break; + case 'sorts': + switch ($field['tablename']) { + case 'file_revisions': + switch ($field['field']) { + case 'fid': + $relationship = $view->add_item($display, 'relationship', 'node', 'upload_fid', array(), 'node_upload_fid'); + $view->set_item_option($display, 'field', $id, 'relationship', $relationship); + $view->set_item_option($display, 'field', $id, 'table', 'files'); + break; + } + break; + } + break; + } +} diff --git a/modules/upload/views_handler_field_upload_description.inc b/modules/upload/views_handler_field_upload_description.inc new file mode 100644 index 0000000000000000000000000000000000000000..623e44992d4b03bf76b8c5722ed4be1e3c3e34ad --- /dev/null +++ b/modules/upload/views_handler_field_upload_description.inc @@ -0,0 +1,73 @@ +additional_fields['fid'] = 'fid'; + } + } + + function option_definition() { + $options = parent::option_definition(); + $options['link_to_file'] = array('default' => FALSE); + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['link_to_file'] = array( + '#title' => t('Link this field to download the file'), + '#type' => 'checkbox', + '#default_value' => !empty($this->options['link_to_file']), + ); + } + + function pre_render($values) { + if (empty($this->options['link_to_file'])) { + return; + } + + $fids = array(); + $this->items = array(); + + $data = array(); + foreach ($values as $result) { + if ($result->{$this->aliases['fid']}) { + $fids[] = $result->{$this->aliases['fid']}; + } + } + + if ($fids) { + $result = db_query("SELECT f.fid, f.filepath FROM {files} f WHERE f.fid IN (" . implode(', ', $fids) . ")"); + while ($file = db_fetch_object($result)) { + $this->items[$file->fid] = $file; + } + } + } + + function render($values) { + return $this->render_link($values->{$this->field_alias}, $values); + } + + /** + * Render whatever the data is as a link to the file. + * + * Data should be made XSS safe prior to calling this function. + */ + function render_link($data, $value) { + if (!empty($this->options['link_to_file']) && $value->{$this->aliases['fid']} && $data !== NULL && $data !== '') { + $values = $this->items[$value->{$this->aliases['fid']}]; + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['path'] = file_create_url($values->filepath); + } + else { + $this->options['alter']['make_link'] = FALSE; + } + return $data; + } +} diff --git a/modules/upload/views_handler_field_upload_fid.inc b/modules/upload/views_handler_field_upload_fid.inc new file mode 100644 index 0000000000000000000000000000000000000000..7a2f5403fc7b0e60b5e6ebe168bac107106dcc2d --- /dev/null +++ b/modules/upload/views_handler_field_upload_fid.inc @@ -0,0 +1,84 @@ + FALSE); + $options['only_listed'] = array('default' => FALSE); + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['link_to_file'] = array( + '#title' => t('Link this field to download the file'), + '#type' => 'checkbox', + '#default_value' => !empty($this->options['link_to_file']), + ); + + $form['only_listed'] = array( + '#title' => t('Only show "listed" file attachments'), + '#type' => 'checkbox', + '#default_value' => !empty($this->options['only_listed']), + ); + } + + function pre_render($values) { + $vids = array(); + $this->items = array(); + + foreach ($values as $result) { + $vids[] = $result->{$this->field_alias}; + } + + if ($vids) { + // Support "only listed files" option. + $where = ''; + if (!empty($this->options['only_listed'])) { + $where = " AND u.list <> 0"; + } + $result = db_query("SELECT u.vid, u.fid, f.filename, f.filepath, f.filesize, f.filemime, u.description FROM {upload} u LEFT JOIN {files} f ON f.fid = u.fid WHERE u.vid IN (" . implode(', ', $vids) . ")$where ORDER BY u.weight"); + while ($file = db_fetch_array($result)) { + $file['filename'] = check_plain($file['filename']); + $file['filemime'] = check_plain($file['filemime']); + $file['description'] = check_plain($file['description']); + $file['filesize'] = format_size($file['filesize']); + $file['filepath'] = file_create_url($file['filepath']); + if (!empty($this->options['link_to_file']) ) { + $file['make_link'] = TRUE; + $file['path'] = $file['filepath']; + } + $this->items[$file['vid']][$file['fid']] = $file; + } + } + } + + function render_item($count, $item) { + return $item['description']; + } + + function document_self_tokens(&$tokens) { + $tokens['[' . $this->options['id'] . '-fid' . ']'] = t('The file ID for the file.'); + $tokens['[' . $this->options['id'] . '-name' . ']'] = t('The name of the attached file.'); + $tokens['[' . $this->options['id'] . '-type' . ']'] = t('The MIME type of the attached file.'); + $tokens['[' . $this->options['id'] . '-description' . ']'] = t('The name of the attached file.'); + $tokens['[' . $this->options['id'] . '-path' . ']'] = t('The path of the attached file.'); + $tokens['[' . $this->options['id'] . '-size' . ']'] = t('The size of the attached file.'); + } + + function add_self_tokens(&$tokens, $item) { + $tokens['[' . $this->options['id'] . '-fid' . ']'] = $item['fid']; + $tokens['[' . $this->options['id'] . '-name' . ']'] = $item['filename']; + $tokens['[' . $this->options['id'] . '-type' . ']'] = $item['filemime']; + $tokens['[' . $this->options['id'] . '-description' . ']'] = $item['description']; + $tokens['[' . $this->options['id'] . '-path' . ']'] = $item['filepath']; + $tokens['[' . $this->options['id'] . '-size' . ']'] = $item['filesize']; + } +} diff --git a/modules/upload/views_handler_filter_upload_fid.inc b/modules/upload/views_handler_filter_upload_fid.inc new file mode 100644 index 0000000000000000000000000000000000000000..648382110d73a83799c734cea6030b4dbc92a52d --- /dev/null +++ b/modules/upload/views_handler_filter_upload_fid.inc @@ -0,0 +1,18 @@ +value_value = t('Has attached files'); + } + + function query() { + $this->ensure_my_table(); + $this->query->add_where($this->options['group'], "(SELECT COUNT(*) FROM {upload} u WHERE u.vid = $this->table_alias.$this->real_field) " . (empty($this->value) ? '=' : '<>') . " 0"); + } +} + diff --git a/modules/user.views.inc b/modules/user.views.inc new file mode 100644 index 0000000000000000000000000000000000000000..bd6c1114c4462ec07bd151bb8db27e2b6dd638ab --- /dev/null +++ b/modules/user.views.inc @@ -0,0 +1,411 @@ + 'uid', + 'title' => t('User'), + 'help' => t('Users who have created accounts on your site.'), + ); + + $data['users']['table']['join'] = array( + 'node' => array( + 'left_field' => 'uid', + 'field' => 'uid', + 'type' => 'INNER', // all nodes have an author. + ), + // This goes to the node so that we have consistent authorship. + 'node_revisions' => array( + 'left_table' => 'node', + 'left_field' => 'uid', + 'field' => 'uid', + 'type' => 'INNER', // all nodes have an author. + ), + ); + + // uid + $data['users']['uid'] = array( + 'title' => t('Uid'), + 'help' => t('The user ID'), // The help that appears on the UI, + 'field' => array( + 'handler' => 'views_handler_field_user', + 'click sortable' => TRUE, + ), + 'argument' => array( + 'handler' => 'views_handler_argument_user_uid', + 'name field' => 'name', // display this field in the summary + ), + 'filter' => array( + 'title' => t('Name'), + 'handler' => 'views_handler_filter_user_name', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // uid + $data['users']['uid_current'] = array( + 'real field' => 'uid', + 'title' => t('Current'), + 'help' => t('Filter the view to the currently logged in user.'), + 'filter' => array( + 'handler' => 'views_handler_filter_user_current', + 'type' => 'yes-no', + ), + ); + + // name + $data['users']['name'] = array( + 'title' => t('Name'), // The item it appears as on the UI, + 'help' => t('The user or author name.'), // The help that appears on the UI, + 'field' => array( + 'handler' => 'views_handler_field_user_name', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + + // mail + // Note that this field implements field level access control. + $data['users']['mail'] = array( + 'title' => t('E-mail'), // The item it appears as on the UI, + 'help' => t('Email address for a given user. This field is normally not shown to users, so be cautious when using it.'), // The help that appears on the UI, + 'field' => array( + 'handler' => 'views_handler_field_user_mail', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ); + + // language + $data['users']['language'] = array( + 'title' => t('Language'), // The item it appears as on the UI, + 'help' => t('Language of the user'), + 'field' => array( + 'handler' => 'views_handler_field_user_language', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_node_language', + ), + ); + + // picture + $data['users']['picture'] = array( + 'title' => t('Picture'), + 'help' => t("The user's picture, if allowed."), // The help that appears on the UI, + // Information for displaying the uid + 'field' => array( + 'handler' => 'views_handler_field_user_picture', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_boolean_operator_string', + 'label' => t('Has Avatar'), + 'type' => 'yes-no', + ), + ); + + // created field + $data['users']['created'] = array( + 'title' => t('Created date'), // The item it appears as on the UI, + 'help' => t('The date the user was created.'), // The help that appears on the UI, + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + ); + + // access field + $data['users']['access'] = array( + 'title' => t('Last access'), // The item it appears as on the UI, + 'help' => t("The user's last access date."), // The help that appears on the UI, + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + ); + + // login field + $data['users']['login'] = array( + 'title' => t('Last login'), // The item it appears as on the UI, + 'help' => t("The user's last login date."), // The help that appears on the UI, + 'field' => array( + 'handler' => 'views_handler_field_date', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort_date', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_date', + ), + ); + + // published status + $data['users']['status'] = array( + 'title' => t('Active'), // The item it appears as on the UI, + 'help' => t('Whether a user is active or blocked.'), // The help that appears on the UI, + // Information for displaying a title as a field + 'field' => array( + 'handler' => 'views_handler_field_boolean', + 'click sortable' => TRUE, + ), + 'filter' => array( + 'handler' => 'views_handler_filter_boolean_operator', + 'label' => t('Active'), + 'type' => 'yes-no', + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + ); + + // log field + $data['users']['signature'] = array( + 'title' => t('Signature'), // The item it appears as on the UI, + 'help' => t("The user's signature."), // The help that appears on the UI, + // Information for displaying a title as a field + 'field' => array( + 'handler' => 'views_handler_field_xss', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + ); + + $data['users']['edit_node'] = array( + 'field' => array( + 'title' => t('Edit link'), + 'help' => t('Provide a simple link to edit the user.'), + 'handler' => 'views_handler_field_user_link_edit', + ), + ); + + $data['users']['delete_node'] = array( + 'field' => array( + 'title' => t('Delete link'), + 'help' => t('Provide a simple link to delete the user.'), + 'handler' => 'views_handler_field_user_link_delete', + ), + ); + + // ---------------------------------------------------------------------- + // users_roles table + + $data['users_roles']['table']['group'] = t('User'); + + // Explain how this table joins to others. + $data['users_roles']['table']['join'] = array( + // Directly links to users table. + 'users' => array( + 'left_field' => 'uid', + 'field' => 'uid', + ), + 'node' => array( + 'left_field' => 'uid', + 'field' => 'uid', + ), + 'node_revisions' => array( + 'left_table' => 'node', + 'left_field' => 'uid', + 'field' => 'uid', + ), + ); + + $data['users_roles']['rid'] = array( + 'title' => t('Roles'), + 'help' => t('Roles that a user belongs to.'), + 'field' => array( + 'handler' => 'views_handler_field_user_roles', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_user_roles', + 'numeric' => TRUE, + ), + 'argument' => array( + 'handler' => 'views_handler_argument_users_roles_rid', + 'name table' => 'role', + 'name field' => 'name', + 'empty field name' => t('No role'), + 'numeric' => TRUE, + ), + ); + + // ---------------------------------------------------------------------- + // role table + + $data['role']['table']['join'] = array( + // Directly links to users table. + 'users' => array( + 'left_table' => 'users_roles', + 'left_field' => 'rid', + 'field' => 'rid', + ), + // needed for many to one helper sometimes + 'users_roles' => array( + 'left_field' => 'rid', + 'field' => 'rid', + ), + 'node' => array( + 'left_table' => 'users_roles', + 'left_field' => 'rid', + 'field' => 'rid', + ), + 'node_revisions' => array( + 'left_table' => 'users_roles', + 'left_field' => 'rid', + 'field' => 'rid', + ), + ); + + return $data; +} + +/** + * Implementation of hook_views_plugins + */ +function user_views_plugins() { + return array( + 'module' => 'views', // This just tells our themes are elsewhere. + 'argument default' => array( + 'user' => array( + 'title' => t('User ID from URL'), + 'handler' => 'views_plugin_argument_default_user', + 'path' => drupal_get_path('module', 'views') . '/modules/user', // not necessary for most modules + 'parent' => 'fixed', // so that the parent class is included + ), + 'current_user' => array( + 'title' => t('User ID from logged in user'), + 'handler' => 'views_plugin_argument_default_current_user', + 'path' => drupal_get_path('module', 'views') . '/modules/user', // not necessary for most modules + 'parent' => 'fixed', // so that the parent class is included + ), + ), + 'argument validator' => array( + 'user' => array( + 'title' => t('User'), + 'handler' => 'views_plugin_argument_validate_user', + 'path' => drupal_get_path('module', 'views') . '/modules/user', // not necessary for most modules + ), + ), + ); +} + +/** + * Implementation of hook_views_handlers() to register all of the basic handlers + * views uses. + */ +function user_views_handlers() { + return array( + 'info' => array( + 'path' => drupal_get_path('module', 'views') . '/modules/user', + ), + 'handlers' => array( + 'views_handler_argument_user_uid' => array( + 'parent' => 'views_handler_argument_numeric', + ), + 'views_handler_field_user' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_user_name' => array( + 'parent' => 'views_handler_field_user', + ), + 'views_handler_field_user_link' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_user_link_edit' => array( + 'parent' => 'views_handler_field_user_link', + ), + 'views_handler_field_user_link_delete' => array( + 'parent' => 'views_handler_field_user_link', + ), + 'views_handler_field_user_mail' => array( + 'parent' => 'views_handler_field_user', + ), + 'views_handler_field_user_language' => array( + 'parent' => 'views_handler_field_user', + ), + 'views_handler_field_user_picture' => array( + 'parent' => 'views_handler_field', + ), + 'views_handler_field_user_roles' => array( + 'parent' => 'views_handler_field_prerender_list', + ), + 'views_handler_filter_user_name' => array( + 'parent' => 'views_handler_filter_in_operator', + ), + 'views_handler_filter_user_current' => array( + 'parent' => 'views_handler_filter_boolean_operator', + ), + 'views_handler_filter_user_roles' => array( + 'parent' => 'views_handler_filter_many_to_one', + ), + 'views_handler_argument_users_roles_rid' => array( + 'parent' => 'views_handler_argument_many_to_one', + ), + ), + ); +} + + +/** + * Allow replacement of current userid so we can cache these queries + */ +function user_views_query_substitutions($view) { + global $user; + return array('***CURRENT_USER***' => intval($user->uid)); +} + +/** + * @} + */ diff --git a/modules/user.views_convert.inc b/modules/user.views_convert.inc new file mode 100644 index 0000000000000000000000000000000000000000..30f45103262942962e0fc1937539b5e0f34ff55c --- /dev/null +++ b/modules/user.views_convert.inc @@ -0,0 +1,61 @@ +set_item_option($display, 'field', $id, 'field', 'picture'); + break; + } + break; + } + break; + case 'filter': + if ($field['tablename'] == 'users' || !strncmp($field['tablename'], 'users_role_', 11)) { + switch ($field['field']) { + case 'uid': + $operators = array('OR' => 'in', 'NOR' => 'not in'); + $view->set_item_option($display, 'filter', $id, 'operator', $operators[$field['operator']]); + if ($rid = (integer) substr($field['tablename'], 11)) { + $view->add_item($display, 'filter', 'users_roles', 'rid', array('value' => $rid)); + } + break; + } + } + elseif ($field['tablename'] == 'users_roles') { + switch ($field['field']) { + case 'rid': + $operators = array('AND' => 'and', 'OR' => 'or', 'NOR' => 'not'); + $view->set_item_option($display, 'filter', $id, 'operator', $operators[$field['operator']]); + break; + } + } + break; + case 'argument': + $options = $field['argoptions']; + switch ($field['type']) { + case 'uid': + $view->add_item($display, 'argument', 'users', 'uid', $options, $field['id']); + break; + case 'uidtouch': + $view->add_item($display, 'argument', 'node', 'uid_touch', $options, $field['id']); + break; + case 'username': + $view->add_item($display, 'argument', 'users', 'name', $options, $field['id']); + break; + } + break; + } +} diff --git a/modules/user/views_handler_argument_user_uid.inc b/modules/user/views_handler_argument_user_uid.inc new file mode 100644 index 0000000000000000000000000000000000000000..de81975253e2fd6ddeadbb956c6ab4e8211d78b0 --- /dev/null +++ b/modules/user/views_handler_argument_user_uid.inc @@ -0,0 +1,30 @@ +argument) { + return array(variable_get('anonymous', t('Anonymous'))); + } + + $titles = array(); + $placeholders = implode(', ', array_fill(0, sizeof($this->value), '%d')); + + $result = db_query("SELECT u.name FROM {users} u WHERE u.uid IN ($placeholders)", $this->value); + while ($term = db_fetch_object($result)) { + $titles[] = check_plain($term->name); + } + return $titles; + } +} + diff --git a/modules/user/views_handler_argument_users_roles_rid.inc b/modules/user/views_handler_argument_users_roles_rid.inc new file mode 100644 index 0000000000000000000000000000000000000000..3c9619f58a95b9ce5ea20d1af6b053699a4020bb --- /dev/null +++ b/modules/user/views_handler_argument_users_roles_rid.inc @@ -0,0 +1,18 @@ +value), '%d')); + + $result = db_query("SELECT name FROM {role} WHERE rid IN ($placeholders)", $this->value); + while ($term = db_fetch_object($result)) { + $titles[] = check_plain($term->name); + } + return $titles; + } +} + diff --git a/modules/user/views_handler_field_user.inc b/modules/user/views_handler_field_user.inc new file mode 100644 index 0000000000000000000000000000000000000000..82267bf1c3c5efc1a27c77a1ea201cc89f0c1772 --- /dev/null +++ b/modules/user/views_handler_field_user.inc @@ -0,0 +1,48 @@ +options['link_to_user'])) { + $this->additional_fields['uid'] = 'uid'; + } + } + + function option_definition() { + $options = parent::option_definition(); + $options['link_to_user'] = array('default' => TRUE); + return $options; + } + + /** + * Provide link to node option + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['link_to_user'] = array( + '#title' => t('Link this field to its user'), + '#description' => t('This will override any other link you have set.'), + '#type' => 'checkbox', + '#default_value' => $this->options['link_to_user'], + ); + } + + function render_link($data, $values) { + if (!empty($this->options['link_to_user']) && user_access('access user profiles') && $values->{$this->aliases['uid']} && $data !== NULL && $data !== '') { + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['path'] = "user/" . $values->{$this->aliases['uid']}; + } + return $data; + } + + function render($values) { + return $this->render_link(check_plain($values->{$this->field_alias}), $values); + } +} diff --git a/modules/user/views_handler_field_user_language.inc b/modules/user/views_handler_field_user_language.inc new file mode 100644 index 0000000000000000000000000000000000000000..b6d9f2765b1f27a66135eee91658d2d36c11e594 --- /dev/null +++ b/modules/user/views_handler_field_user_language.inc @@ -0,0 +1,29 @@ +options['link_to_user']) && user_access('access user profiles') && $values->{$this->aliases['uid']}) { + $this->options['alter']['make_link'] = TRUE; + $this->options['alter']['path'] = 'user/' . $values->{$this->aliases['uid']}; + } + if (empty($data)) { + $lang = language_default(); + } + else { + $lang = language_list(); + $lang = $lang[$data]; + } + + return check_plain($lang->name); + } + + function render($values) { + return $this->render_link(check_plain($values->{$this->field_alias}), $values); + } +} diff --git a/modules/user/views_handler_field_user_link.inc b/modules/user/views_handler_field_user_link.inc new file mode 100644 index 0000000000000000000000000000000000000000..3f812ecfd683a6e35e6e01b5b56a2079730a926d --- /dev/null +++ b/modules/user/views_handler_field_user_link.inc @@ -0,0 +1,43 @@ +additional_fields['uid'] = 'uid'; + } + + function option_definition() { + $options = parent::option_definition(); + $options['text'] = array('default' => '', 'translatable' => TRUE); + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['text'] = array( + '#type' => 'textfield', + '#title' => t('Text to display'), + '#default_value' => $this->options['text'], + ); + } + + // An example of field level access control. + function access() { + return user_access('access user profiles'); + } + + function query() { + $this->ensure_my_table(); + $this->add_additional_fields(); + } + + function render($values) { + $text = !empty($this->options['text']) ? $this->options['text'] : t('view'); + $uid = $values->{$this->aliases['uid']}; + return l($text, "user/$uid"); + } +} + diff --git a/modules/user/views_handler_field_user_link_delete.inc b/modules/user/views_handler_field_user_link_delete.inc new file mode 100644 index 0000000000000000000000000000000000000000..b21c05b7b0330a087df2459c08adb6e55574dd45 --- /dev/null +++ b/modules/user/views_handler_field_user_link_delete.inc @@ -0,0 +1,18 @@ +options['text']) ? $this->options['text'] : t('delete'); + $uid = $values->{$this->aliases['uid']}; + return l($text, "user/$uid/delete", array('query' => drupal_get_destination())); + } +} + diff --git a/modules/user/views_handler_field_user_link_edit.inc b/modules/user/views_handler_field_user_link_edit.inc new file mode 100644 index 0000000000000000000000000000000000000000..4e6f867ab151c449fb662c2b2103792faec8362d --- /dev/null +++ b/modules/user/views_handler_field_user_link_edit.inc @@ -0,0 +1,18 @@ +options['text']) ? $this->options['text'] : t('edit'); + $uid = $values->{$this->aliases['uid']}; + return l($text, "user/$uid/edit", array('query' => drupal_get_destination())); + } +} + diff --git a/modules/user/views_handler_field_user_mail.inc b/modules/user/views_handler_field_user_mail.inc new file mode 100644 index 0000000000000000000000000000000000000000..e486c49b2730535ce0cf7fabe3531397bda84296 --- /dev/null +++ b/modules/user/views_handler_field_user_mail.inc @@ -0,0 +1,33 @@ + 'mailto'); + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['link_to_user'] = array( + '#title' => t('Link this field'), + '#type' => 'radios', + '#options' => array( + 0 => t('No link'), + 'user' => t('To the user'), + 'mailto' => t("With a mailto:"), + ), + '#default_value' => $this->options['link_to_user'], + ); + } + + function render($values) { + if ($this->options['link_to_user'] == 'mailto') { + return l($values->{$this->field_alias}, "mailto:" . $values->{$this->field_alias}); + } + return $this->render_link(check_plain($values->{$this->field_alias}), $values); + } +} diff --git a/modules/user/views_handler_field_user_name.inc b/modules/user/views_handler_field_user_name.inc new file mode 100644 index 0000000000000000000000000000000000000000..7a57e34aa172d11a1c2df94cd42a02bf7c1af7b7 --- /dev/null +++ b/modules/user/views_handler_field_user_name.inc @@ -0,0 +1,63 @@ +options['overwrite_anonymous'])) { + $this->additional_fields['uid'] = 'uid'; + } + } + + function option_definition() { + $options = parent::option_definition(); + + $options['overwrite_anonymous'] = array('default' => FALSE); + $options['anonymous_text'] = array('default' => '', 'translatable' => TRUE); + + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + + $form['overwrite_anonymous'] = array( + '#title' => t('Overwrite the value to display for anonymous users'), + '#type' => 'checkbox', + '#default_value' => !empty($this->options['overwrite_anonymous']), + '#description' => t('If selected, you will see a field to enter the text to use for anonymous users.'), + ); + $form['anonymous_text'] = array( + '#title' => t('Text to display for anonymous users'), + '#type' => 'textfield', + '#default_value' => $this->options['anonymous_text'], + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'edit-options-overwrite-anonymous' => array(1), + ), + ); + } + + function render_link($data, $values) { + if (!empty($this->options['link_to_user']) || !empty($this->options['overwrite_anonymous'])) { + $account = new stdClass(); + $account->uid = $values->{$this->aliases['uid']}; + if (!empty($this->options['overwrite_anonymous']) && !$account->uid) { + // This is an anonymous user, and we're overriting the text. + return check_plain($this->options['anonymous_text']); + } + elseif (!empty($this->options['link_to_user'])) { + $account->name = $values->{$this->field_alias}; + return theme('username', $account); + } + } + // Otherwise, there's no special handling, so return the data directly. + return $data; + } +} + diff --git a/modules/user/views_handler_field_user_picture.inc b/modules/user/views_handler_field_user_picture.inc new file mode 100644 index 0000000000000000000000000000000000000000..30caf1fd33848f8b0635d03d8064a5efdcf8c795 --- /dev/null +++ b/modules/user/views_handler_field_user_picture.inc @@ -0,0 +1,23 @@ +additional_fields['uid'] = 'uid'; + $this->additional_fields['name'] = 'name'; + } + + function render($values) { + // Fake an account object. + $account = new stdClass(); + $account->uid = $values->{$this->aliases['uid']}; + $account->name = $values->{$this->aliases['name']}; + $account->picture = $values->{$this->field_alias}; + + return theme('user_picture', $account); + } +} diff --git a/modules/user/views_handler_field_user_roles.inc b/modules/user/views_handler_field_user_roles.inc new file mode 100644 index 0000000000000000000000000000000000000000..8fbf2a4e6ea940181294702a5cddfab488ff01b2 --- /dev/null +++ b/modules/user/views_handler_field_user_roles.inc @@ -0,0 +1,47 @@ +additional_fields['uid'] = array('table' => 'users', 'field' => 'uid'); + } + + function query() { + $this->add_additional_fields(); + $this->field_alias = $this->aliases['uid']; + } + + function pre_render($values) { + $uids = array(); + $this->items = array(); + + foreach ($values as $result) { + $uids[] = $result->{$this->aliases['uid']}; + } + + if ($uids) { + $result = db_query("SELECT u.uid, u.rid, r.name FROM {role} r INNER JOIN {users_roles} u ON u.rid = r.rid WHERE u.uid IN (" . implode(', ', $uids) . ") ORDER BY r.name"); + while ($role = db_fetch_object($result)) { + $this->items[$role->uid][$role->rid]['role'] = check_plain($role->name); + $this->items[$role->uid][$role->rid]['rid'] = $role->rid; + } + } + } + + function render_item($count, $item) { + return $item['role']; + } + + function document_self_tokens(&$tokens) { + $tokens['[' . $this->options['id'] . '-role' . ']'] = t('The name of the role.'); + $tokens['[' . $this->options['id'] . '-rid' . ']'] = t('The role ID of the role.'); + } + + function add_self_tokens(&$tokens, $item) { + $tokens['[' . $this->options['id'] . '-role' . ']'] = $item['role']; + $tokens['[' . $this->options['id'] . '-rid' . ']'] = $item['rid']; + } +} diff --git a/modules/user/views_handler_filter_user_current.inc b/modules/user/views_handler_filter_user_current.inc new file mode 100644 index 0000000000000000000000000000000000000000..50b196819fd162cd0701b7118e310dde80051e75 --- /dev/null +++ b/modules/user/views_handler_filter_user_current.inc @@ -0,0 +1,28 @@ +value_value = t('Is the logged in user'); + } + + function query() { + $this->ensure_my_table(); + $where = "$this->table_alias.$this->real_field "; + + if (empty($this->value)) { + $where .= '<> ***CURRENT_USER***'; + if ($this->accept_null) { + $where = '(' . $where . " OR $this->table_alias.$this->real_field IS NULL)"; + } + } + else { + $where .= '= ***CURRENT_USER***'; + } + $this->query->add_where($this->options['group'], $where); + } +} diff --git a/modules/user/views_handler_filter_user_name.inc b/modules/user/views_handler_filter_user_name.inc new file mode 100644 index 0000000000000000000000000000000000000000..869d162eeff429f43b42c2be91a9836f8dc62158 --- /dev/null +++ b/modules/user/views_handler_filter_user_name.inc @@ -0,0 +1,144 @@ +value) { + $result = db_query("SELECT * FROM {users} u WHERE uid IN (" . implode(', ', $this->value) . ")"); + while ($account = db_fetch_object($result)) { + if ($account->uid) { + $values[] = $account->name; + } + else { + $values[] = 'Anonymous'; // Intentionally NOT translated. + } + } + } + + sort($values); + $default_value = implode(', ', $values); + $form['value'] = array( + '#type' => 'textfield', + '#title' => t('Usernames'), + '#description' => t('Enter a comma separated list of user names.'), + '#default_value' => $default_value, + '#autocomplete_path' => 'admin/views/ajax/autocomplete/user', + ); + + if (!empty($form_state['exposed']) && !isset($form_state['input'][$this->options['expose']['identifier']])) { + $form_state['input'][$this->options['expose']['identifier']] = $default_value; + } + } + + function value_validate(&$form, &$form_state) { + $values = drupal_explode_tags($form_state['values']['options']['value']); + $uids = $this->validate_user_strings($form['value'], $values); + + if ($uids) { + $form_state['values']['options']['value'] = $uids; + } + } + + function accept_exposed_input($input) { + $rc = parent::accept_exposed_input($input); + + if ($rc) { + // If we have previously validated input, override. + if (isset($this->validated_exposed_input)) { + $this->value = $this->validated_exposed_input; + } + } + + return $rc; + } + + function exposed_validate(&$form, &$form_state) { + if (empty($this->options['exposed'])) { + return; + } + + if (empty($this->options['expose']['identifier'])) { + return; + } + + $identifier = $this->options['expose']['identifier']; + $values = drupal_explode_tags($form_state['values'][$identifier]); + + $uids = $this->validate_user_strings($form[$identifier], $values); + + if ($uids) { + $this->validated_exposed_input = $uids; + } + } + + /** + * Validate the user string. Since this can come from either the form + * or the exposed filter, this is abstracted out a bit so it can + * handle the multiple input sources. + */ + function validate_user_strings(&$form, $values) { + $uids = array(); + $placeholders = array(); + $args = array(); + $results = array(); + foreach ($values as $value) { + if (strtolower($value) == 'anonymous') { + $uids[] = 0; + } + else { + $missing[strtolower($value)] = TRUE; + $args[] = $value; + $placeholders[] = "'%s'"; + } + } + + if (!$args) { + return $uids; + } + + $result = db_query("SELECT * FROM {users} WHERE name IN (" . implode(', ', $placeholders) . ")", $args); + while ($account = db_fetch_object($result)) { + unset($missing[strtolower($account->name)]); + $uids[] = $account->uid; + } + + if ($missing) { + form_error($form, format_plural(count($missing), 'Unable to find user: @users', 'Unable to find users: @users', array('@users' => implode(', ', array_keys($missing))))); + } + + return $uids; + } + + function value_submit() { + // prevent array filter from removing our anonymous user. + } + + // Override to do nothing. + function get_value_options() { } + + function admin_summary() { + // set up $this->value_options for the parent summary + $this->value_options = array(); + + if ($this->value) { + $result = db_query("SELECT * FROM {users} u WHERE uid IN (" . implode(', ', $this->value) . ")"); + + while ($account = db_fetch_object($result)) { + if ($account->uid) { + $this->value_options[$account->uid] = $account->name; + } + else { + $this->value_options[$account->uid] = 'Anonymous'; // Intentionally NOT translated. + } + } + } + + return parent::admin_summary(); + } +} diff --git a/modules/user/views_handler_filter_user_roles.inc b/modules/user/views_handler_filter_user_roles.inc new file mode 100644 index 0000000000000000000000000000000000000000..6e734b7d33a04ad80c652d0f3afa5b4ba299c952 --- /dev/null +++ b/modules/user/views_handler_filter_user_roles.inc @@ -0,0 +1,11 @@ +value_options = user_roles(TRUE); + unset($this->value_options[DRUPAL_AUTHENTICATED_RID]); + } +} diff --git a/modules/user/views_plugin_argument_default_current_user.inc b/modules/user/views_plugin_argument_default_current_user.inc new file mode 100644 index 0000000000000000000000000000000000000000..2f92ac51b4df3c31f1aed3e31b2feba0095a5ccb --- /dev/null +++ b/modules/user/views_plugin_argument_default_current_user.inc @@ -0,0 +1,17 @@ +uid; + } +} + diff --git a/modules/user/views_plugin_argument_default_user.inc b/modules/user/views_plugin_argument_default_user.inc new file mode 100644 index 0000000000000000000000000000000000000000..77bd752ead5de3e658d715c93731bfc30766101b --- /dev/null +++ b/modules/user/views_plugin_argument_default_user.inc @@ -0,0 +1,64 @@ +option_name] = array( + '#type' => 'checkbox', + '#title' => t('Also look for a node and use the node author'), + '#default_value' => !empty($this->argument->options[$this->option_name]), + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'radio:options[default_action]' => array('default'), + 'radio:options[default_argument_type]' => array($this->id) + ), + '#dependency_count' => 2, + ); + } + + function get_argument() { + foreach (range(1, 3) as $i) { + $user = menu_get_object('user', $i); + if (!empty($user)) { + return $user->uid; + } + } + + foreach (range(1, 3) as $i) { + $user = menu_get_object('user_uid_optional', $i); + if (!empty($user)) { + return $user->uid; + } + } + + if (!empty($this->argument->options[$this->option_name])) { + foreach (range(1, 3) as $i) { + $node = menu_get_object('node', $i); + if (!empty($node)) { + return $node->uid; + } + } + } + + if (arg(0) == 'user' && is_numeric(arg(1))) { + return arg(1); + } + + if (arg(0) == 'node' && is_numeric(arg(1))) { + $node = node_load(arg(1)); + if ($node) { + return $node->uid; + } + } + } +} + diff --git a/modules/user/views_plugin_argument_validate_user.inc b/modules/user/views_plugin_argument_validate_user.inc new file mode 100644 index 0000000000000000000000000000000000000000..675bd1321b47abacf02ee7a8c5c6fb7d38b17712 --- /dev/null +++ b/modules/user/views_plugin_argument_validate_user.inc @@ -0,0 +1,106 @@ +argument->options['validate_user_argument_type'])) { + $this->argument->options['validate_user_argument_type'] = 'uid'; + $this->argument->options['validate_user_roles'] = array(); + } + + $form['validate_user_argument_type'] = array( + '#type' => 'radios', + '#title' => t('Type of user argument to allow'), + '#options' => array( + 'uid' => t('Only allow numeric UIDs'), + 'name' => t('Only allow string usernames'), + 'either' => t('Allow both numeric UIDs and string usernames'), + ), + '#default_value' => $this->argument->options['validate_user_argument_type'], + '#process' => array('expand_radios', 'views_process_dependency'), + '#dependency' => array('edit-options-validate-type' => array($this->id)), + '#prefix' => '
    ', + '#suffix' => '
    ', + ); + + $form['validate_user_restrict_roles'] = array( + '#type' => 'checkbox', + '#title' => t('Restrict user based on role'), + '#default_value' => !empty($this->argument->options['validate_user_restrict_roles']), + '#process' => array('views_process_dependency'), + '#dependency' => array('edit-options-validate-type' => array($this->id)), + ); + + $form['validate_user_roles'] = array( + '#type' => 'checkboxes', + '#prefix' => '
    ', + '#suffix' => '
    ', + '#title' => t('Restrict to the selected roles'), + '#options' => user_roles(TRUE), + '#default_value' => $this->argument->options['validate_user_roles'], + '#description' => t('If no roles are selected, users from any role will be allowed.'), + '#process' => array('expand_checkboxes', 'views_process_dependency'), + '#dependency' => array( + 'edit-options-validate-type' => array($this->id), + 'edit-options-validate-user-restrict-roles' => array(1), + ), + '#dependency_count' => 2, + ); + } + + function validate_argument($argument) { + $type = $this->argument->options['validate_user_argument_type']; + // is_numeric() can return false positives, so we ensure it's an integer. + // However, is_integer() will always fail, since $argument is a string. + if (is_numeric($argument) && $argument == (int)$argument) { + if ($type == 'uid' || $type == 'either') { + $where = 'uid = %d'; + } + } + else { + if ($type == 'name' || $type == 'either') { + $where = "name = '%s'"; + } + } + + // If we don't have a WHERE clause, the argument is invalid. + if (empty($where)) { + return FALSE; + } + + $query = "SELECT uid, name FROM {users} WHERE $where"; + $account = db_fetch_object(db_query($query, $argument)); + if (empty($account)) { + // User not found. + return FALSE; + } + + // See if we're filtering users based on roles. + if (!empty($this->argument->options['validate_user_restrict_roles']) && !empty($this->argument->options['validate_user_roles'])) { + $roles = $this->argument->options['validate_user_roles']; + $acccont->roles = array(); + $account->roles[] = $account->uid ? DRUPAL_AUTHENTICATED_RID : DRUPAL_ANONYMOUS_RID; + $result = db_query('SELECT rid FROM {users_roles} WHERE uid = %d', $account->uid); + while ($role = db_fetch_object($result)) { + $account->roles[] = $role->rid; + } + if (!(bool)array_intersect($account->roles, $roles)) { + return FALSE; + } + } + + $this->argument->argument = $account->uid; + $this->argument->validated_title = check_plain($account->name); + return TRUE; + } +} + diff --git a/modules/views.views.inc b/modules/views.views.inc new file mode 100644 index 0000000000000000000000000000000000000000..fcae849c5ae6ae137ed7bb8b86b67dfb004b9601 --- /dev/null +++ b/modules/views.views.inc @@ -0,0 +1,60 @@ + array(), + ); + + $data['views']['random'] = array( + 'title' => t('Random'), + 'help' => t('Randomize the display order.'), + 'sort' => array( + 'handler' => 'views_handler_sort_random', + ), + ); + + $data['views']['null'] = array( + 'title' => t('Null'), + 'help' => t('Allow an argument to be ignored. The query will not be altered by this argument.'), + 'argument' => array( + 'handler' => 'views_handler_argument_null', + ), + ); + + $data['views']['nothing'] = array( + 'title' => t('Custom text'), + 'help' => t('Provide custom text or link.'), + 'field' => array( + 'handler' => 'views_handler_field_custom', + ), + ); + + $data['views']['counter'] = array( + 'title' => t('View result counter'), + 'help' => t('Displays the actual position of the view result'), + 'field' => array( + 'handler' => 'views_handler_field_counter', + ), + ); + + return $data; +} + +/** + * @} + */ diff --git a/plugins/views_plugin_access.inc b/plugins/views_plugin_access.inc new file mode 100644 index 0000000000000000000000000000000000000000..813e1825dab96ecf0a3d316066996440a3352e56 --- /dev/null +++ b/plugins/views_plugin_access.inc @@ -0,0 +1,82 @@ +view = &$view; + $this->display = &$display; + $this->options = array(); + + if (is_object($display->handler)) { + // Note: The below is read only. + $this->options = $display->handler->get_option('access'); + } + } + + /** + * Retrieve the default options when this is a new access + * control plugin + */ + function option_defaults(&$options) { } + + /** + * Provide the default form for setting options. + */ + function options_form(&$form, &$form_state) { } + + /** + * Provide the default form form for validating options + */ + function options_validate(&$form, &$form_state) { } + + /** + * Provide the default form form for submitting options + */ + function options_submit(&$form, &$form_state) { } + + /** + * Return a string to display as the clickable title for the + * access control. + */ + function summary_title() { + return t('Unknown'); + } + + /** + * Determine if the current user has access or not. + */ + function access($account) { + // default to no access control. + return TRUE; + } + + /** + * Determine the access callback and arguments. + * + * This information will be embedded in the menu in order to reduce + * performance hits during menu item access testing, which happens + * a lot. + * + * @return an array; the first item should be the function to call, + * and the second item should be an array of arguments. The first + * item may also be TRUE (bool only) which will indicate no + * access control.) + */ + function get_access_callback() { + // default to no access control. + return TRUE; + } +} diff --git a/plugins/views_plugin_access_none.inc b/plugins/views_plugin_access_none.inc new file mode 100644 index 0000000000000000000000000000000000000000..9652908c84515d9502a71f2c309a649106b7c456 --- /dev/null +++ b/plugins/views_plugin_access_none.inc @@ -0,0 +1,11 @@ +options['perm'], $account); + } + + function get_access_callback() { + return array('user_access', array($this->options['perm'])); + } + + function summary_title() { + return t($this->options['perm']); + } + + function option_defaults(&$options) { + $options['perm'] = 'access content'; + } + + function options_form(&$form, &$form_state) { + $perms = array(); + // Get list of permissions + foreach (module_list(FALSE, FALSE, TRUE) as $module) { + if ($permissions = module_invoke($module, 'perm')) { + $perms[$module] = drupal_map_assoc($permissions); + } + } + $form['perm'] = array( + '#type' => 'select', + '#options' => $perms, + '#title' => t('Permission'), + '#default_value' => $this->options['perm'], + '#description' => t('Only users with the selected permission flag will be able to access this display. Note that users with "access all views" can see any view, regardless of other permissions.'), + ); + } +} diff --git a/plugins/views_plugin_access_role.inc b/plugins/views_plugin_access_role.inc new file mode 100644 index 0000000000000000000000000000000000000000..f11b47b9ed76e48f97adbc033ac17fdb5f4ef3b8 --- /dev/null +++ b/plugins/views_plugin_access_role.inc @@ -0,0 +1,60 @@ +roles); + $roles[] = $account->uid ? DRUPAL_AUTHENTICATED_RID : DRUPAL_ANONYMOUS_RID; + return array_intersect(array_filter($this->options['role']), $roles); + } + + function get_access_callback() { + return array('views_check_roles', array(array_filter($this->options['role']))); + } + + function summary_title() { + $count = count($this->options['role']); + if ($count < 1) { + return t('No role(s) selected'); + } + else if ($count > 1) { + return t('Multiple roles'); + } + else { + $rids = views_ui_get_roles(); + $rid = array_shift($this->options['role']); + return $rids[$rid]; + } + } + + function option_defaults(&$options) { + $options['role'] = array(); + } + + function options_form(&$form, &$form_state) { + $form['role'] = array( + '#type' => 'checkboxes', + '#title' => t('Role'), + '#default_value' => $this->options['role'], + '#options' => views_ui_get_roles(), + '#description' => t('Only the checked roles will be able to access this display. Note that users with "access all views" can see any view, regardless of role.'), + ); + } + + function options_validate(&$form, &$form_state) { + if (!array_filter($form_state['values']['access_options']['role'])) { + form_error($form['role'], t('You must select at least one role if type is "by role"')); + } + } + + function options_submit(&$form, &$form_state) { + // I hate checkboxes. + $form_state['values']['access_options']['role'] = array_filter($form_state['values']['access_options']['role']); + } +} + + + diff --git a/plugins/views_plugin_argument_default.inc b/plugins/views_plugin_argument_default.inc new file mode 100644 index 0000000000000000000000000000000000000000..bf68aa1542c463a21adc71651dbc29ef94b6c8f4 --- /dev/null +++ b/plugins/views_plugin_argument_default.inc @@ -0,0 +1,79 @@ +view = &$view; + $this->argument = &$argument; + $this->id = $id; + } + + /** + * Determine if the administrator has the privileges to use this + * plugin + */ + function access() { return TRUE; } + + function argument_form(&$form, &$form_state) { + $form[$this->option_name] = array( + '#type' => 'textfield', + '#title' => t('Default argument'), + '#default_value' => $this->get_argument(), + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'radio:options[default_action]' => array('default'), + 'radio:options[default_argument_type]' => array($this->id) + ), + '#dependency_count' => 2, + ); + + // Only do this if using one simple standard form gadget + $this->check_access($form); + } + + /** + * If we don't have access to the form but are showing it anyway, ensure that + * the form is safe and cannot be changed from user input. + */ + function check_access(&$form) { + if (!$this->access()) { + $form[$this->option_name]['#disabled'] = TRUE; + $form[$this->option_name]['#value'] = $form[$this->option_name]['#default_value']; + $form[$this->option_name]['#description'] .= ' ' . t('Note: you do not have permission to modify this. If you change the default argument type, this setting will be lost and you will NOT be able to get it back.') . ''; + } + } + + /** + * Return the default argument. + */ + function get_argument() { + return isset($this->argument->options[$this->option_name]) ? $this->argument->options[$this->option_name] : ''; + } +} + +/** + * @} + */ + diff --git a/plugins/views_plugin_argument_default_php.inc b/plugins/views_plugin_argument_default_php.inc new file mode 100644 index 0000000000000000000000000000000000000000..ff08956545e4ddc6b6ffd7dd20b667435e9ea17f --- /dev/null +++ b/plugins/views_plugin_argument_default_php.inc @@ -0,0 +1,52 @@ +option_name] = array( + '#type' => 'textarea', + '#title' => t('PHP argument code'), + '#default_value' => $this->get_argument(TRUE), // the true forces it raw. + '#process' => array('views_process_dependency'), + '#description' => t('Enter PHP code that returns a value to use for this argument. Do not use <?php ?>. You must return only a single value for just this argument.'), + '#dependency' => array( + 'radio:options[default_action]' => array('default'), + 'radio:options[default_argument_type]' => array($this->id) + ), + '#dependency_count' => 2, + ); + + $this->check_access($form); + } + + /** + * Only let users with PHP block visibility permissions set/modify this + * default plugin. + */ + function access() { + return user_access('use PHP for block visibility'); + } + + function get_argument($raw = FALSE) { + if ($raw) { + return parent::get_argument(); + } + + // set up variables to make it easier to reference during the argument. + $view = &$this->view; + $argument = &$this->argument; + ob_start(); + $result = eval($this->argument->options[$this->option_name]); + ob_end_clean(); + return $result; + } +} diff --git a/plugins/views_plugin_argument_validate.inc b/plugins/views_plugin_argument_validate.inc new file mode 100644 index 0000000000000000000000000000000000000000..f87bd7a94baeb08a7a558b02e3a7405526a51c6c --- /dev/null +++ b/plugins/views_plugin_argument_validate.inc @@ -0,0 +1,71 @@ +view = &$view; + $this->argument = &$argument; + $this->id = $id; + } + + /** + * Determine if the administrator has the privileges to use this + * plugin + */ + function access() { return TRUE; } + + function argument_form(&$form, &$form_state) { + } + + /** + * If we don't have access to the form but are showing it anyway, ensure that + * the form is safe and cannot be changed from user input. + */ + function check_access(&$form) { + if (!$this->access()) { + $form[$this->option_name]['#disabled'] = TRUE; + $form[$this->option_name]['#value'] = $form[$this->option_name]['#default_value']; + $form[$this->option_name]['#description'] .= ' ' . t('Note: you do not have permission to modify this. If you change the validator, this setting will be lost and you will NOT be able to get it back.') . ''; + } + } + + /** + * Return the validate argument. + */ + function get_argument() { + return isset($this->argument->options[$this->option_name]) ? $this->argument->options[$this->option_name] : ''; + } + + function validate_form(&$form, &$form_state) { } + + function validate_argument($arg) { return TRUE; } +} + +/** + * @} + */ + diff --git a/plugins/views_plugin_argument_validate_numeric.inc b/plugins/views_plugin_argument_validate_numeric.inc new file mode 100644 index 0000000000000000000000000000000000000000..d8332c6e7447af397885c96833b954879a0e26f2 --- /dev/null +++ b/plugins/views_plugin_argument_validate_numeric.inc @@ -0,0 +1,28 @@ +argument->definition['numeric']); + } + + function validate_argument($argument) { + return is_numeric($argument); + } +} + diff --git a/plugins/views_plugin_argument_validate_php.inc b/plugins/views_plugin_argument_validate_php.inc new file mode 100644 index 0000000000000000000000000000000000000000..73fe51e1d833f7142efc3542ed8112ead5acfcbe --- /dev/null +++ b/plugins/views_plugin_argument_validate_php.inc @@ -0,0 +1,48 @@ +option_name] = array( + '#type' => 'textarea', + '#title' => t('PHP validate code'), + '#default_value' => $this->get_argument(), + '#description' => t('Enter PHP code that returns TRUE or FALSE. No return is the same as FALSE, so be SURE to return something if you do not want to declare the argument invalid. Do not use <?php ?>. The argument to validate will be "$argument" and the view will be "$view". You may change the argument by setting "$handler->argument".'), + '#process' => array('views_process_dependency'), + '#dependency' => array('edit-options-validate-type' => array($this->id)), + ); + + $this->check_access($form); + } + + /** + * Only let users with PHP block visibility permissions set/modify this + * validate plugin. + */ + function access() { + return user_access('use PHP for block visibility'); + } + + function validate_argument($argument) { + // set up variables to make it easier to reference during the argument. + $view = &$this->view; + $handler = &$this->argument; + + ob_start(); + $result = eval($this->argument->options[$this->option_name]); + ob_end_clean(); + return $result; + } +} + diff --git a/plugins/views_plugin_cache.inc b/plugins/views_plugin_cache.inc new file mode 100644 index 0000000000000000000000000000000000000000..3791f800ac63b05bd6f490804b008fdd1d1239a4 --- /dev/null +++ b/plugins/views_plugin_cache.inc @@ -0,0 +1,283 @@ +view = &$view; + $this->display = &$display; + $this->options = array(); + + if (is_object($display->handler)) { + // Note: The below is read only. + $this->options = $display->handler->get_option('cache'); + } + } + + /** + * Retrieve the default options when this is a new access + * control plugin + */ + function option_defaults(&$options) { } + + /** + * Return a string to display as the clickable title for the + * access control. + */ + function summary_title() { + return t('Unknown'); + } + + /** + * Determine the expiration time of the cache type, or NULL if no expire. + * + * Plugins must override this to implement expiration. + * + * @param $type + * The cache type, either 'query', 'result' or 'output'. + */ + function cache_expire($type) { } + + /** + * Save data to the cache. + * + * A plugin should override this to provide specialized caching behavior. + */ + function cache_set($type) { + switch ($type) { + case 'query': + // Not supported currently, but this is certainly where we'd put it. + break; + case 'results': + $data = array( + 'result' => $this->view->result, + 'total_rows' => $this->view->total_rows, + 'pager' => $this->view->pager, + ); + cache_set($this->get_results_key(), $data, $this->table); + break; + case 'output': + $this->gather_headers(); + $this->storage['output'] = $this->view->display_handler->output; + cache_set($this->get_output_key(), $this->storage, $this->table); + break; + } + } + + + /** + * Retrieve data from the cache. + * + * A plugin should override this to provide specialized caching behavior. + */ + function cache_get($type) { + $cutoff = $this->cache_expire($type); + switch ($type) { + case 'query': + // Not supported currently, but this is certainly where we'd put it. + return FALSE; + case 'results': + // Values to set: $view->result, $view->total_rows, $view->execute_time, + // $view->pager['current_page']. + if ($cache = cache_get($this->get_results_key(), $this->table)) { + if (!$cutoff || $cache->created > $cutoff) { + $this->view->result = $cache->data['result']; + $this->view->total_rows = $cache->data['total_rows']; + $this->view->pager = $cache->data['pager']; + $this->view->execute_time = 0; + return TRUE; + } + } + return FALSE; + case 'output': + if ($cache = cache_get($this->get_output_key(), $this->table)) { + if (!$cutoff || $cache->created > $cutoff) { + $this->storage = $cache->data; + $this->view->display_handler->output = $cache->data['output']; + $this->restore_headers(); + return TRUE; + } + } + return FALSE; + } + } + + /** + * Clear out cached data for a view. + * + * We're just going to nuke anything related to the view, regardless of display, + * to be sure that we catch everything. Maybe that's a bad idea. + */ + function cache_flush() { + cache_clear_all($this->view->name . ':', $this->table, TRUE); + } + + /** + * Post process any rendered data. + * + * This can be valuable to be able to cache a view and still have some level of + * dynamic output. In an ideal world, the actual output will include HTML + * comment based tokens, and then the post process can replace those tokens. + * + * Example usage. If it is known that the view is a node view and that the + * primary field will be a nid, you can do something like this: + * + * + * + * And then in the post render, create an array with the text that should + * go there: + * + * strtr($output, array('', 'output for FIELD of nid 1'); + * + * All of the cached result data will be available in $view->result, as well, + * so all ids used in the query should be discoverable. + */ + function post_render(&$output) { } + + /** + * Start caching javascript, css and other out of band info. + * + * This takes a snapshot of the current system state so that we don't + * duplicate it. Later on, when gather_headers() is run, this information + * will be removed so that we don't hold onto it. + */ + function cache_start() { + $this->storage['head'] = drupal_set_html_head(); + $this->storage['css'] = drupal_add_css(); + + foreach (array('header', 'footer') as $scope) { + $this->storage['js'][$scope] = drupal_add_js(NULL, NULL, $scope); + } + } + + /** + * Gather out of band data, compare it to what we started with and store the difference. + */ + function gather_headers() { + // Simple replacement for head + $this->storage['head'] = str_replace($this->storage['head'], '', drupal_set_html_head()); + + // Slightly less simple for CSS: + $css = drupal_add_css(); + $start = $this->storage['css']; + $this->storage['css'] = array(); + + foreach ($css as $media => $medias) { + foreach ($medias as $type => $types) { + foreach ($types as $path => $preprocess) { + if (!isset($start[$media][$type][$path])) { + $this->storage['css'][] = array($path, $type, $media, $preprocess); + } + } + } + } + + $js = array(); + // A little less simple for js + foreach (array('header', 'footer') as $scope) { + $js[$scope] = drupal_add_js(NULL, NULL, $scope); + } + + $start = $this->storage['js']; + $this->storage['js'] = array(); + + foreach ($js as $scope => $scopes) { + foreach ($scopes as $type => $types) { + foreach ($types as $id => $info) { + if (!isset($start[$scope][$type][$id])) { + switch ($type) { + case 'setting': + $this->storage['js'][] = array($info, $type, $scope); + break; + + case 'inline': + $this->storage['js'][] = array($info['code'], $type, $scope, $info['defer']); + break; + + default: + $this->storage['js'][] = array($id, $type, $scope, $info['defer'], $info['cache']); + } + } + } + } + } + } + + /** + * Restore out of band data saved to cache. Copied from Panels. + */ + function restore_headers() { + if (!empty($this->storage['head'])) { + drupal_set_html_head($this->storage['head']); + } + if (!empty($this->storage['css'])) { + foreach ($this->storage['css'] as $args) { + call_user_func_array('drupal_add_css', $args); + } + } + if (!empty($this->storage['js'])) { + foreach ($this->storage['js'] as $args) { + call_user_func_array('drupal_add_js', $args); + } + } + } + + function get_results_key() { + global $user; + + if (!isset($this->_results_key)) { + $key_data = array( + 'build_info' => $this->view->build_info, + 'roles' => array_keys($user->roles), + 'super-user' => $user->uid == 1, // special caching for super user. + ); + foreach (array('exposed_info', 'page', 'sort', 'order') as $key) { + if (isset($_GET[$key])) { + $key_data[$key] = $_GET[$key]; + } + } + + $this->_results_key = $this->view->name . ':' . $this->display->id . ':results:' . md5(serialize($key_data)); + } + + return $this->_results_key; + } + + function get_output_key() { + global $user; + if (!isset($this->_output_key)) { + $key_data = array( + 'result' => $this->view->result, + 'roles' => array_keys($user->roles), + 'super-user' => $user->uid == 1, // special caching for super user. + ); + + $this->_output_key = $this->view->name . ':' . $this->display->id . ':output:' . md5(serialize($key_data)); + } + + return $this->_output_key; + } + +} diff --git a/plugins/views_plugin_cache_none.inc b/plugins/views_plugin_cache_none.inc new file mode 100644 index 0000000000000000000000000000000000000000..eee2dd3421d45411ad916ff892f3e2d23638b35e --- /dev/null +++ b/plugins/views_plugin_cache_none.inc @@ -0,0 +1,19 @@ + t('Never cache')) + $options; + + $form['results_lifespan'] = array( + '#type' => 'select', + '#title' => t('Query results'), + '#description' => t('The length of time raw query results should be cached.'), + '#options' => $options, + '#default_value' => $this->options['results_lifespan'], + ); + $form['output_lifespan'] = array( + '#type' => 'select', + '#title' => t('Rendered output'), + '#description' => t('The length of time rendered HTML output should be cached.'), + '#options' => $options, + '#default_value' => $this->options['output_lifespan'], + ); + } + + function summary_title() { + return format_interval($this->options['results_lifespan'], 1) . '/' . format_interval($this->options['output_lifespan'], 1); + } + + function cache_expire($type) { + if ($lifespan = $this->options[$type . '_lifespan']) { + $cutoff = time() - $lifespan; + return $cutoff; + } + else { + return FALSE; + } + } + +} diff --git a/plugins/views_plugin_display.inc b/plugins/views_plugin_display.inc new file mode 100644 index 0000000000000000000000000000000000000000..f410bd20470d8f09bad9235b64785f4580e78c68 --- /dev/null +++ b/plugins/views_plugin_display.inc @@ -0,0 +1,1878 @@ +view = &$view; + $this->display = &$display; + + // Make some modifications: + if (!isset($options)) { + $options = $display->display_options; + } + + if ($this->is_default_display() && isset($options['defaults'])) { + unset($options['defaults']); + } + + $this->unpack_options($this->options, $options); + } + + function destroy() { + parent::destroy(); + + foreach ($this->handlers as $type => $handlers) { + foreach ($handlers as $id => $handler) { + if (is_object($handler)) { + $this->handlers[$type][$id]->destroy(); + } + } + } + + if (isset($this->default_display)) { + unset($this->default_display); + } + } + + /** + * Determine if this display is the 'default' display which contains + * fallback settings + */ + function is_default_display() { return FALSE; } + + /** + * Determine if this display uses exposed filters, so the view + * will know whether or not to build them. + */ + function uses_exposed() { + if (!isset($this->has_exposed)) { + foreach (array('field', 'filter') as $type) { + foreach ($this->view->$type as $key => $handler) { + if ($handler->is_exposed()) { + // one is all we need; if we find it, return true. + $this->has_exposed = TRUE; + return TRUE; + } + } + } + $this->has_exposed = FALSE; + } + + return $this->has_exposed; + } + + /** + * Determine if this display should display the exposed + * filters widgets, so the view will know whether or not + * to render them. + * + * Regardless of what this function + * returns, exposed filters will not be used nor + * displayed unless uses_exposed() returns TRUE. + */ + function displays_exposed() { + return TRUE; + } + + /** + * Does the display use AJAX? + */ + function use_ajax() { + if (!empty($this->definition['use ajax'])) { + return $this->get_option('use_ajax'); + } + return FALSE; + } + + /** + * Does the display have a pager enabled? + */ + function use_pager() { + if (!empty($this->definition['use pager'])) { + return $this->get_option('use_pager'); + } + return FALSE; + } + + /** + * Does the display have a more link enabled? + */ + function use_more() { + if (!empty($this->definition['use more'])) { + return $this->get_option('use_more'); + } + return FALSE; + } + + /** + * Does the display have custom link text? + */ + function use_more_text() { + if (!empty($this->definition['use more'])) { + return $this->get_option('use_more_text'); + } + return FALSE; + } + + /** + * Can this display accept attachments? + */ + function accept_attachments() { + return !empty($this->definition['accept attachments']); + } + + /** + * Allow displays to attach to other views. + */ + function attach_to($display_id) { } + + /** + * Static member function to list which sections are defaultable + * and what items each section contains. + */ + function defaultable_sections($section = NULL) { + $sections = array( + 'access' => array('access'), + 'cache' => array('cache'), + 'title' => array('title'), + 'header' => array('header', 'header_format', 'header_empty'), + 'footer' => array('footer', 'footer_format', 'footer_empty'), + 'empty' => array('empty', 'empty_format'), + 'use_ajax' => array('use_ajax'), + 'items_per_page' => array('items_per_page', 'offset', 'use_pager', 'pager_element'), + 'use_pager' => array('items_per_page', 'offset', 'use_pager', 'pager_element'), + 'use_more' => array('use_more', 'use_more_text'), + 'link_display' => array('link_display'), + 'distinct' => array('distinct'), + 'exposed_block' => array('exposed_block'), + + // Force these to cascade properly. + 'style_plugin' => array('style_plugin', 'style_options', 'row_plugin', 'row_options'), + 'style_options' => array('style_plugin', 'style_options', 'row_plugin', 'row_options'), + 'row_plugin' => array('style_plugin', 'style_options', 'row_plugin', 'row_options'), + 'row_options' => array('style_plugin', 'style_options', 'row_plugin', 'row_options'), + + // These guys are special + 'relationships' => array('relationships'), + 'fields' => array('fields'), + 'sorts' => array('sorts'), + 'arguments' => array('arguments'), + 'filters' => array('filters'), + ); + if ($section) { + if (!empty($sections[$section])) { + return $sections[$section]; + } + } + else { + return $sections; + } + } + + /** + * Set default options. + * + * Displays put their options in a different place than everything else; also + * displays spread their options out. We don't want to set defaults for + * items that are normally defaulted elsewhere. + */ + function _set_option_defaults(&$storage, $options, $level = 0) { + foreach ($options as $option => $definition) { + // If defaulted to elsewhere and we're not the default display, skip. + if ($level == 0 && !$this->is_default_display() && !empty($options['defaults']['default'][$option])) { + continue; + } + + if (isset($definition['contains']) && is_array($definition['contains'])) { + $storage[$option] = array(); + $this->_set_option_defaults($storage[$option], $definition['contains'], $level++); + } + else { + $storage[$option] = isset($definition['default']) ? $definition['default'] : NULL; + } + } + } + + function option_definition() { + $options = array( + 'defaults' => array( + 'default' => array( + 'access' => TRUE, + 'cache' => TRUE, + 'title' => TRUE, + 'header' => TRUE, + 'header_format' => TRUE, + 'header_empty' => TRUE, + 'footer' => TRUE, + 'footer_format' => TRUE, + 'footer_empty' => TRUE, + 'empty' => TRUE, + 'empty_format' => TRUE, + + 'use_ajax' => TRUE, + 'items_per_page' => TRUE, + 'offset' => TRUE, + 'use_pager' => TRUE, + 'pager_element' => TRUE, + 'use_more' => TRUE, + 'use_more_text' => TRUE, + 'distinct' => TRUE, + 'exposed_block' => TRUE, + + 'link_display' => TRUE, + + 'style_plugin' => TRUE, + 'style_options' => TRUE, + 'row_plugin' => TRUE, + 'row_options' => TRUE, + + 'relationships' => TRUE, + 'fields' => TRUE, + 'sorts' => TRUE, + 'arguments' => TRUE, + 'filters' => TRUE, + ), + ), + 'relationships' => array( + 'default' => array(), + 'export' => 'export_item', + ), + 'fields' => array( + 'default' => array(), + 'export' => 'export_item', + ), + 'sorts' => array( + 'default' => array(), + 'export' => 'export_item', + ), + 'arguments' => array( + 'default' => array(), + 'export' => 'export_item', + ), + 'filters' => array( + 'default' => array(), + 'export' => 'export_item', + ), + 'access' => array( + 'contains' => array( + 'type' => array('default' => 'none'), + ), + ), + 'cache' => array( + 'contains' => array( + 'type' => array('default' => 'none'), + ), + ), + 'title' => array( + 'default' => '', + 'translatable' => TRUE, + ), + 'header' => array( + 'default' => '', + 'translatable' => TRUE, + ), + 'header_format' => array( + 'default' => FILTER_FORMAT_DEFAULT, + ), + 'header_empty' => array( + 'default' => FALSE, + ), + 'footer' => array( + 'default' => '', + 'translatable' => TRUE, + ), + 'footer_format' => array( + 'default' => FILTER_FORMAT_DEFAULT, + ), + 'footer_empty' => array( + 'default' => FALSE, + ), + 'empty' => array( + 'default' => '', + 'translatable' => TRUE, + ), + 'empty_format' => array( + 'default' => FILTER_FORMAT_DEFAULT, + ), + 'use_ajax' => array( + 'default' => FALSE, + ), + 'items_per_page' => array( + 'default' => 10, + ), + 'offset' => array( + 'default' => 0, + ), + 'use_pager' => array( + 'default' => FALSE, + ), + 'pager_element' => array( + 'default' => 0, + ), + 'use_more' => array( + 'default' => FALSE, + ), + 'use_more_text' => array( + 'default' => 'more', + 'translatable' => TRUE, + ), + 'link_display' => array( + 'default' => '', + ), + 'distinct' => array( + 'default' => FALSE, + ), + + 'style_plugin' => array( + 'default' => 'default', + ), + 'style_options' => array( + 'default' => array(), + ), + 'row_plugin' => array( + 'default' => 'fields', + ), + 'row_options' => array( + 'default' => array(), + ), + + 'exposed_block' => array( + 'default' => FALSE, + ), + ); + + if ($this->is_default_display()) { + unset($options['defaults']); + } + return $options; + } + + /** + * Check to see if the display has a 'path' field. + * + * This is a pure function and not just a setting on the definition + * because some displays (such as a panel pane) may have a path based + * upon configuration. + * + * By default, displays do not have a path. + */ + function has_path() { return FALSE; } + + /** + * Check to see if the display has some need to link to another display. + * + * For the most part, displays without a path will use a link display. However, + * sometimes displays that have a path might also need to link to another display. + * This is true for feeds. + */ + function uses_link_display() { return !$this->has_path(); } + + /** + * Check to see which display to use when creating links within + * a view using this display. + */ + function get_link_display() { + $display_id = $this->get_option('link_display'); + // If unknown, pick the first one. + if (empty($display_id) || empty($this->view->display[$display_id])) { + foreach ($this->view->display as $display_id => $display) { + if (!empty($display->handler) && $display->handler->has_path()) { + return $display_id; + } + } + } + else { + return $display_id; + } + // fall-through returns NULL + } + + /** + * Return the base path to use for this display. + * + * This can be overridden for displays that do strange things + * with the path. + */ + function get_path() { + if ($this->has_path()) { + return $this->get_option('path'); + } + + $display_id = $this->get_link_display(); + if ($display_id && !empty($this->view->display[$display_id]) && is_object($this->view->display[$display_id]->handler)) { + return $this->view->display[$display_id]->handler->get_path(); + } + } + + /** + * Check to see if the display needs a breadcrumb + * + * By default, displays do not need breadcrumbs + */ + function uses_breadcrumb() { return FALSE; } + + /** + * Determine if a given option is set to use the default display or the + * current display + * + * @return + * TRUE for the default display + */ + function is_defaulted($option) { + return !$this->is_default_display() && !empty($this->default_display) && !empty($this->options['defaults'][$option]); + } + + /** + * Intelligently get an option either from this display or from the + * default display, if directed to do so. + */ + function get_option($option) { + if ($this->is_defaulted($option)) { + return $this->default_display->get_option($option); + } + + if (array_key_exists($option, $this->options)) { + return $this->options[$option]; + } + } + + /** + * Determine if the display's style uses fields. + */ + function uses_fields() { + $plugin = $this->get_plugin(); + if ($plugin) { + return $plugin->uses_fields(); + } + } + + /** + * Get the display or row plugin, if it exists. + */ + function get_plugin($type = 'style', $name = NULL) { + if (!$name) { + $name = $this->get_option($type . '_plugin'); + } + + $plugin = views_get_plugin($type, $name); + if ($plugin) { + $options = $this->get_option($type . '_options'); + $plugin->init($this->view, $this->display, $options); + return $plugin; + } + } + + /** + * Get the access plugin + */ + function get_access_plugin($name = NULL) { + if (!$name) { + $access = $this->get_option('access'); + $name = $access['type']; + } + + $plugin = views_get_plugin('access', $name); + if ($plugin) { + $plugin->init($this->view, $this->display); + return $plugin; + } + } + + /** + * Get the cache plugin + */ + function get_cache_plugin($name = NULL) { + if (!$name) { + $cache = $this->get_option('cache'); + $name = $cache['type']; + } + + $plugin = views_get_plugin('cache', $name); + if ($plugin) { + $plugin->init($this->view, $this->display); + return $plugin; + } + } + + /** + * Get the handler object for a single handler. + */ + function &get_handler($type, $id) { + if (!isset($this->handlers[$type])) { + $this->get_handlers($type); + } + + if (isset($this->handlers[$type][$id])) { + return $this->handlers[$type][$id]; + } + + // So we can return a reference. + $null = NULL; + return $null; + } + + /** + * Get a full array of handlers for $type. This caches them. + */ + function get_handlers($type) { + if (!isset($this->handlers[$type])) { + $this->handlers[$type] = array(); + $types = views_object_types(); + $plural = $types[$type]['plural']; + foreach ($this->get_option($plural) as $id => $info) { + $handler = views_get_handler($info['table'], $info['field'], $type); + if ($handler) { + $handler->init($this->view, $info); + $this->handlers[$type][$id] = &$handler; + } + + // Prevent reference problems. + unset($handler); + } + } + + return $this->handlers[$type]; + } + + /** + * Intelligently set an option either from this display or from the + * default display, if directed to do so. + */ + function set_option($option, $value) { + if ($this->is_defaulted($option)) { + return $this->default_display->set_option($option, $value); + } + + // Set this in two places: On the handler where we'll notice it + // but also on the display object so it gets saved. This should + // only be a temporary fix. + $this->display->display_options[$option] = $value; + return $this->options[$option] = $value; + } + + /** + * Set an option and force it to be an override. + */ + function override_option($option, $value) { + $this->set_override($option, FALSE); + $this->set_option($option, $value); + } + + /** + * Because forms may be split up into sections, this provides + * an easy URL to exactly the right section. Don't override this. + */ + function option_link($text, $section, $class = '', $title = '') { + if (!empty($class)) { + $text = '' . $text . ''; + } + + if (!trim($text)) { + $text = t('Broken field'); + } + + if (empty($title)) { + $title = $text; + } + + return l($text, 'admin/build/views/nojs/display/' . $this->view->name . '/' . $this->display->id . '/' . $section, array('attributes' => array('class' => 'views-ajax-link ' . $class, 'title' => $title), 'html' => TRUE)); + } + + /** + * Provide the default summary for options in the views UI. + * + * This output is returned as an array. + */ + function options_summary(&$categories, &$options) { + $categories['basic'] = array( + 'title' => t('Basic settings'), + ); + + $options['display_title'] = array( + 'category' => 'basic', + 'title' => t('Name'), + 'value' => check_plain($this->display->display_title), + 'desc' => t('Change the name of this display.'), + ); + + $title = strip_tags($this->get_option('title')); + if (!$title) { + $title = t('None'); + } + + $options['title'] = array( + 'category' => 'basic', + 'title' => t('Title'), + 'value' => $title, + 'desc' => t('Change the title that this display will use.'), + ); + + $style_plugin = views_fetch_plugin_data('style', $this->get_option('style_plugin')); + $style_title = empty($style_plugin['title']) ? t('Missing style plugin') : $style_plugin['title']; + + $style = ''; + + $options['style_plugin'] = array( + 'category' => 'basic', + 'title' => t('Style'), + 'value' => $style_title, + 'desc' => t('Change the style plugin.'), + ); + + // This adds a 'Settings' link to the style_options setting if the style has options. + if (!empty($style_plugin['uses options'])) { + $options['style_plugin']['links']['style_options'] = t('Change settings for this style'); + } + + if (!empty($style_plugin['uses row plugin'])) { + $row_plugin = views_fetch_plugin_data('row', $this->get_option('row_plugin')); + $row_title = empty($row_plugin['title']) ? t('Missing style plugin') : $row_plugin['title']; + + $options['row_plugin'] = array( + 'category' => 'basic', + 'title' => t('Row style'), + 'value' => $row_title, + 'desc' => t('Change the row plugin.'), + ); + // This adds a 'Settings' link to the row_options setting if the row style has options. + if (!empty($row_plugin['uses options'])) { + $options['row_plugin']['links']['row_options'] = t('Change settings for this style'); + } + } + if (!empty($this->definition['use ajax'])) { + $options['use_ajax'] = array( + 'category' => 'basic', + 'title' => t('Use AJAX'), + 'value' => $this->get_option('use_ajax') ? t('Yes') : t('No'), + 'desc' => t('Change whether or not this display will use AJAX.'), + ); + } + + if (!empty($this->definition['use pager'])) { + $options['use_pager'] = array( + 'category' => 'basic', + 'title' => t('Use pager'), + 'value' => $this->get_option('use_pager') ? ($this->get_option('use_pager') === 'mini' ? t('Mini') : t('Yes')) : t('No'), + 'desc' => t("Change this display's pager setting."), + ); + } + + $items = intval($this->get_option('items_per_page')); + $options['items_per_page'] = array( + 'category' => 'basic', + 'title' => $this->use_pager() ? t('Items per page') : t('Items to display'), + 'value' => $items ? $items : t('Unlimited'), + 'desc' => t('Change how many items to display.'), + ); + + if (!empty($this->definition['use more'])) { + $options['use_more'] = array( + 'category' => 'basic', + 'title' => t('More link'), + 'value' => $this->get_option('use_more') ? t('Yes') : t('No'), + 'desc' => t('Specify whether this display will provide a "more" link.'), + ); + } + + $options['distinct'] = array( + 'category' => 'basic', + 'title' => t('Distinct'), + 'value' => $this->get_option('distinct') ? t('Yes') : t('No'), + 'desc' => t('Display only distinct items, without duplicates.'), + ); + + $access_plugin = $this->get_access_plugin(); + if (!$access_plugin) { + // default to the no access control plugin. + $access_plugin = views_get_plugin('access', 'none'); + } + + $access_str = $access_plugin->summary_title(); + + $options['access'] = array( + 'category' => 'basic', + 'title' => t('Access'), + 'value' => $access_str, + 'desc' => t('Specify access control type for this display.'), + ); + + if (!empty($access_plugin->definition['uses options'])) { + $options['access']['links']['access_options'] = t('Change settings for this access type.'); + } + + $cache_plugin = $this->get_cache_plugin(); + if (!$cache_plugin) { + // default to the no cache control plugin. + $cache_plugin = views_get_plugin('cache', 'none'); + } + + $cache_str = $cache_plugin->summary_title(); + + $options['cache'] = array( + 'category' => 'basic', + 'title' => t('Caching'), + 'value' => $cache_str, + 'desc' => t('Specify caching type for this display.'), + ); + + if (!empty($cache_plugin->definition['uses options'])) { + $options['cache']['links']['cache_options'] = t('Change settings for this caching type.'); + } + + if ($this->uses_link_display()) { + // Only show the 'link display' if there is more than one option. + $count = 0; + foreach ($this->view->display as $display_id => $display) { + if (is_object($display->handler) && $display->handler->has_path()) { + $count++; + } + if ($count > 1) { + break; + } + } + + if ($count > 1) { + $display_id = $this->get_link_display(); + $link_display = empty($this->view->display[$display_id]) ? t('None') : check_plain($this->view->display[$display_id]->display_title); + $options['link_display'] = array( + 'category' => 'basic', + 'title' => t('Link display'), + 'value' => $link_display, + 'desc' => t('Specify which display this display will link to.'), + ); + } + } + + $options['exposed_block'] = array( + 'category' => 'basic', + 'title' => t('Exposed form in block'), + 'value' => $this->get_option('exposed_block') ? t('Yes') : t('No'), + 'desc' => t('Allow the exposed form to appear in a block instead of the view.'), + ); + + foreach (array('header' => t('Header'), 'footer' => t('Footer'), 'empty' => t('Empty text')) as $type => $name) { + if (!$this->get_option($type)) { + $field = t('None'); + } + else { + // A lot of code to get the name of the filter format. + $fmt_string = $this->get_option($type . '_format'); + if (empty($fmt_string)) { + $fmt_string = FILTER_FORMAT_DEFAULT; + } + $format_val = filter_resolve_format($fmt_string); + $format = filter_formats($format_val); + if ($format) { + $field = check_plain($format->name); + } + else { + $field = t('Unknown/missing format'); + } + } + + $options[$type] = array( + 'category' => 'basic', + 'title' => $name, + 'value' => $field, + 'desc' => t("Change this display's !name.", array('!name' => strtolower($name))), + ); + } + + $options['analyze-theme'] = array( + 'category' => 'basic', + 'title' => t('Theme'), + 'value' => t('Information'), + 'desc' => t('Get information on how to theme this display'), + ); + } + + /** + * Provide the default form for setting options. + */ + function options_form(&$form, &$form_state) { + if ($this->defaultable_sections($form_state['section'])) { + $this->add_override_button($form, $form_state, $form_state['section']); + } + $form['#title'] = check_plain($this->display->display_title) . ': '; + + // Set the 'section' to hilite on the form. + // If it's the item we're looking at is pulling from the default display, + // reflect that. Don't use is_defaulted since we want it to show up even + // on the default display. + if (!empty($this->options['defaults'][$form_state['section']])) { + $form['#section'] = 'default-' . $form_state['section']; + } + else { + $form['#section'] = $this->display->id . '-' . $form_state['section']; + } + + switch ($form_state['section']) { + case 'display_title': + $form['#title'] .= t('The name of this display'); + $form['display_title'] = array( + '#type' => 'textfield', + '#description' => t('This title will appear only in the administrative interface for the View.'), + '#default_value' => $this->display->display_title, + ); + break; + case 'title': + $form['#title'] .= t('The title of this view'); + $form['title'] = array( + '#type' => 'textfield', + '#description' => t('This title will be displayed with the view, wherever titles are normally displayed; i.e, as the page title, block title, etc.'), + '#default_value' => $this->get_option('title'), + ); + break; + case 'use_ajax': + $form['#title'] .= t('Use AJAX when available to load this view'); + $form['description'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#value' => t('If set, this view will use an AJAX mechanism for paging, table sorting and exposed filters. This means the entire page will not refresh. It is not recommended that you use this if this view is the main content of the page as it will prevent deep linking to specific pages, but it is very useful for side content.'), + ); + $form['use_ajax'] = array( + '#type' => 'radios', + '#options' => array(1 => t('Yes'), 0 => t('No')), + '#default_value' => $this->get_option('use_ajax') ? 1 : 0, + ); + break; + case 'use_pager': + $form['#title'] .= t('Use a pager for this view'); + $form['use_pager'] = array( + '#type' => 'radios', + '#options' => array(TRUE => t('Full pager'), 'mini' => t('Mini pager'), 0 => t('No')), + '#default_value' => $this->get_option('use_pager'), + ); + $form['pager_element'] = array( + '#type' => 'textfield', + '#title' => t('Pager element'), + '#description' => t("Unless you're experiencing problems with pagers related to this view, you should leave this at 0. If using multiple pagers on one page you may need to set this number to a higher value so as not to conflict within the ?page= array. Large values will add a lot of commas to your URLs, so avoid if possible."), + '#default_value' => intval($this->get_option('pager_element')), + ); + break; + case 'items_per_page': + $form['#title'] .= $this->use_pager() ? t('Items per page') : t('Items to display'); + + $form['items_per_page'] = array( + '#type' => 'textfield', + '#description' => t('The number of items to display per page. Enter 0 for no limit.'), + '#default_value' => intval($this->get_option('items_per_page')), + ); + $form['offset'] = array( + '#type' => 'textfield', + '#title' => t('Offset'), + '#description' => t('The number of items to skip. For example, if this field is 3, the first 3 items will be skipped and not displayed. Offset can not be used if items to display is 0; instead use a very large number there.'), + '#default_value' => intval($this->get_option('offset')), + ); + break; + case 'use_more': + $form['#title'] .= t('Add a more link to the bottom of the display.'); + $form['use_more'] = array( + '#type' => 'checkbox', + '#title' => t('Create more link'), + '#description' => t("This will add a more link to the bottom of this view, which will link to the page view. If you have more than one page view, the link will point to the display specified in 'Link display' above."), + '#default_value' => $this->get_option('use_more'), + ); + $form['#title'] .= t('Text to use for the more link.'); + $form['use_more_text'] = array( + '#type' => 'textfield', + '#title' => t('More link text'), + '#description' => t("The text to display for the more link."), + '#default_value' => $this->get_option('use_more_text'), + ); + break; + case 'distinct': + $form['#title'] .= t('Display only distinct items, without duplicates.'); + $form['distinct'] = array( + '#type' => 'checkbox', + '#title' => t('Distinct'), + '#description' => t('This will make the view display only distinct items. If there are multiple identical items, each will be displayed only once. You can use this to try and remove duplicates from a view, though it does not always work. Note that this can slow queries down, so use it with caution.'), + '#default_value' => $this->get_option('distinct'), + ); + break; + case 'access': + $form['#title'] .= t('Access restrictions'); + $form['access'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#tree' => TRUE, + ); + + $access = $this->get_option('access'); + $form['access']['type'] = array( + '#type' => 'radios', + '#options' => views_fetch_plugin_names('access'), + '#default_value' => $access['type'], + ); + + $access_plugin = views_fetch_plugin_data('access', $access['type']); + if (!empty($access_plugin['uses options'])) { + $form['markup'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#value' => t('You may also adjust the !settings for the currently selected access restriction by clicking on the icon.', array('!settings' => $this->option_link(t('settings'), 'access_options'))), + ); + } + + break; + case 'access_options': + $access = $this->get_option('access'); + $plugin = $this->get_access_plugin(); + $form['#title'] .= t('Access options'); + if ($plugin) { + $form['#help_topic'] = $plugin->definition['help topic']; + + $form['access_options'] = array( + '#tree' => TRUE, + ); + $form['access_options']['type'] = array( + '#type' => 'value', + '#value' => $access['type'], + ); + $plugin->options_form($form['access_options'], $form_state); + } + break; + case 'cache': + $form['#title'] .= t('Caching'); + $form['cache'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#tree' => TRUE, + ); + + $cache = $this->get_option('cache'); + $form['cache']['type'] = array( + '#type' => 'radios', + '#options' => views_fetch_plugin_names('cache'), + '#default_value' => $cache['type'], + ); + + $cache_plugin = views_fetch_plugin_data('cache', $cache['type']); + if (!empty($cache_plugin['uses options'])) { + $form['markup'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#value' => t('You may also adjust the !settings for the currently selected cache mechanism by clicking on the icon.', array('!settings' => $this->option_link(t('settings'), 'cache_options'))), + ); + } + break; + case 'cache_options': + $cache = $this->get_option('cache'); + $plugin = $this->get_cache_plugin(); + $form['#title'] .= t('Caching options'); + if ($plugin) { + $form['#help_topic'] = $plugin->definition['help topic']; + + $form['cache_options'] = array( + '#tree' => TRUE, + ); + $form['cache_options']['type'] = array( + '#type' => 'value', + '#value' => $cache['type'], + ); + $plugin->options_form($form['cache_options'], $form_state); + } + break; + case 'header': + $form['#title'] .= t('Header'); + $form['header_empty'] = array( + '#type' => 'checkbox', + '#title' => t('Display even if view has no result'), + '#default_value' => $this->get_option('header_empty'), + ); + $form['header'] = array( + '#type' => 'textarea', + '#default_value' => $this->get_option('header'), + '#rows' => 6, + '#description' => t('Text to display at the top of the view. May contain an explanation or links or whatever you like. Optional.'), + ); + + $form['header_format'] = filter_form($this->get_option('header_format'), NULL, array('header_format')); + break; + case 'footer': + $form['#title'] .= t('Footer'); + $form['footer_empty'] = array( + '#type' => 'checkbox', + '#title' => t('Display even if view has no result'), + '#default_value' => $this->get_option('footer_empty'), + ); + $form['footer'] = array( + '#type' => 'textarea', + '#default_value' => $this->get_option('footer'), + '#rows' => 6, + '#description' => t('Text to display beneath the view. May contain an explanation or links or whatever you like. Optional.'), + ); + + $form['footer_format'] = filter_form($this->get_option('footer_format'), NULL, array('footer_format')); + break; + case 'empty': + $form['#title'] .= t('Empty text'); + $form['empty'] = array( + '#type' => 'textarea', + '#default_value' => $this->get_option('empty'), + '#rows' => 6, + '#description' => t('Text to display if the view has no results. Optional.'), + ); + + $form['empty_format'] = filter_form($this->get_option('empty_format'), NULL, array('empty_format')); + break; + case 'style_plugin': + $form['#title'] .= t('How should this view be styled'); + $form['#help_topic'] = 'style'; + $form['style_plugin'] = array( + '#type' => 'radios', + '#options' => views_fetch_plugin_names('style', $this->get_style_type(), array($this->view->base_table)), + '#default_value' => $this->get_option('style_plugin'), + '#description' => t('If the style you choose has settings, be sure to click the settings button that will appear next to it in the View summary.'), + ); + + $style_plugin = views_fetch_plugin_data('style', $this->get_option('style_plugin')); + if (!empty($style_plugin['uses options'])) { + $form['markup'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#value' => t('You may also adjust the !settings for the currently selected style by clicking on the icon.', array('!settings' => $this->option_link(t('settings'), 'style_options'))), + ); + } + + break; + case 'style_options': + $form['#title'] .= t('Style options'); + $style = TRUE; + $type = 'style_plugin'; + $name = $this->get_option('style_plugin'); + + case 'row_options': + if (!isset($name)) { + $name = $this->get_option('row_plugin'); + } + // if row, $style will be empty. + if (empty($style)) { + $form['#title'] .= t('Row style options'); + $type = 'row_plugin'; + } + $plugin = $this->get_plugin(empty($style) ? 'row' : 'style'); + if ($plugin) { + if (isset($plugin->definition['help topic'])) { + $form['#help_topic'] = $plugin->definition['help topic']; + } + $form[$form_state['section']] = array( + '#tree' => TRUE, + ); + $plugin->options_form($form[$form_state['section']], $form_state); + } + break; + case 'row_plugin': + $form['#title'] .= t('How should each row in this view be styled'); + $form['#help_topic'] = 'style-row'; + $form['row_plugin'] = array( + '#type' => 'radios', + '#options' => views_fetch_plugin_names('row', $this->get_style_type(), array($this->view->base_table)), + '#default_value' => $this->get_option('row_plugin'), + ); + + $row_plugin = views_fetch_plugin_data('row', $this->get_option('row_plugin')); + if (!empty($row_plugin['uses options'])) { + $form['markup'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#value' => t('You may also adjust the !settings for the currently selected row style by clicking on the icon.', array('!settings' => $this->option_link(t('settings'), 'row_options'))), + ); + } + + break; + case 'link_display': + $form['#title'] .= t('Which display to use for path'); + foreach ($this->view->display as $display_id => $display) { + if ($display->handler->has_path()) { + $options[$display_id] = $display->display_title; + } + } + $form['link_display'] = array( + '#type' => 'radios', + '#options' => $options, + '#description' => t("Which display to use to get this display's path for things like summary links, rss feed links, more links, etc."), + '#default_value' => $this->get_link_display(), + ); + break; + case 'analyze-theme': + $form['#title'] .= t('Theming information'); + $form['#help_topic'] = 'analyze-theme'; + + if (isset($_POST['theme'])) { + $this->view->theme = $_POST['theme']; + } + else if (empty($this->view->theme)) { + $this->view->theme = variable_get('theme_default', 'garland'); + } + + global $custom_theme; + $custom_theme = $this->view->theme; + init_theme(); + + $funcs = array(); + // Get theme functions for the display. Note that some displays may + // not have themes. The 'feed' display, for example, completely + // delegates to the style. + if (!empty($this->definition['theme'])) { + $funcs[] = $this->option_link(t('Display output'), 'analyze-theme-display') . ': ' . $this->format_themes($this->theme_functions()); + $themes = $this->additional_theme_functions(); + if ($themes) { + foreach ($themes as $theme) { + $funcs[] = $this->option_link(t('Alternative display output'), 'analyze-theme-display') . ': ' . $this->format_themes($theme); + } + } + } + + $plugin = $this->get_plugin(); + if ($plugin) { + $funcs[] = $this->option_link(t('Style output'), 'analyze-theme-style') . ': ' . $this->format_themes($plugin->theme_functions(), $plugin->additional_theme_functions()); + $themes = $plugin->additional_theme_functions(); + if ($themes) { + foreach ($themes as $theme) { + $funcs[] = $this->option_link(t('Alternative style'), 'analyze-theme-style') . ': ' . $this->format_themes($theme); + } + } + + if ($plugin->uses_row_plugin()) { + $row_plugin = $this->get_plugin('row'); + if ($row_plugin) { + $funcs[] = $this->option_link(t('Row style output'), 'analyze-theme-row') . ': ' . $this->format_themes($row_plugin->theme_functions()); + $themes = $row_plugin->additional_theme_functions(); + if ($themes) { + foreach ($themes as $theme) { + $funcs[] = $this->option_link(t('Alternative row style'), 'analyze-theme-row') . ': ' . $this->format_themes($theme); + } + } + } + } + + if ($plugin->uses_fields()) { + foreach ($this->get_handlers('field') as $id => $handler) { + $funcs[] = $this->option_link(t('Field @field (ID: @id)', array('@field' => $handler->ui_name(), '@id' => $id)), 'analyze-theme-field') . ': ' . $this->format_themes($handler->theme_functions()); + } + } + } + + $form['important'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#value' => '

    ' . t('This section lists all possible templates for the display plugin and for the style plugins, ordered roughly from the least specific to the most specific. The active template for each plugin -- which is the most specific template found on the system -- is highlighted in bold.') . '

    ', + ); + + foreach (list_themes() as $key => $theme) { + $options[$key] = $theme->info['name']; + } + + $form['box'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + ); + $form['box']['theme'] = array( + '#type' => 'select', + '#options' => $options, + '#default_value' => $this->view->theme, + ); + + $form['box']['change'] = array( + '#type' => 'submit', + '#value' => t('Change theme'), + '#submit' => array('views_ui_edit_display_form_change_theme'), + ); + + $form['analysis'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#value' => theme('item_list', $funcs), + ); + + $form['rescan_button'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + ); + $form['rescan_button']['button'] = array( + '#type' => 'submit', + '#value' => t('Rescan template files'), + '#submit' => array('views_ui_config_item_form_rescan'), + ); + $form['rescan_button']['markup'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#value' => t("Important! When adding, removing, or renaming template files, it is necessary to make Drupal aware of the changes by making it rescan the files on your system. By clicking this button you clear Drupal's theme registry and thereby trigger this rescanning process. The highlighted templates above will then reflect the new state of your system."), + ); + + $form_state['ok_button'] = TRUE; + break; + case 'analyze-theme-display': + $form['#title'] .= t('Theming information (display)'); + $output = '

    ' . t('Back to !info.', array('!info' => $this->option_link(t('theming information'), 'analyze-theme'))) . '

    '; + + if (empty($this->definition['theme'])) { + $output .= t('This display has no theming information'); + } + else { + $output .= '

    ' . t('This is the default theme template used for this display.') . '

    '; + $output .= '
    ' . check_plain(file_get_contents('./' . $this->definition['theme path'] . '/' . strtr($this->definition['theme'], '_', '-') . '.tpl.php')) . '
    '; + } + + if (!empty($this->definition['additional themes'])) { + foreach ($this->definition['additional themes'] as $theme => $type) { + $output .= '

    ' . t('This is an alternative template for this display.') . '

    '; + $output .= '
    ' . check_plain(file_get_contents('./' . $this->definition['theme path'] . '/' . strtr($theme, '_', '-') . '.tpl.php')) . '
    '; + } + } + + $form['analysis'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#value' => $output, + ); + + $form_state['ok_button'] = TRUE; + break; + case 'analyze-theme-style': + $form['#title'] .= t('Theming information (style)'); + $output = '

    ' . t('Back to !info.', array('!info' => $this->option_link(t('theming information'), 'analyze-theme'))) . '

    '; + + $plugin = $this->get_plugin(); + + if (empty($plugin->definition['theme'])) { + $output .= t('This display has no style theming information'); + } + else { + $output .= '

    ' . t('This is the default theme template used for this style.') . '

    '; + $output .= '
    ' . check_plain(file_get_contents('./' . $plugin->definition['theme path'] . '/' . strtr($plugin->definition['theme'], '_', '-') . '.tpl.php')) . '
    '; + } + + if (!empty($plugin->definition['additional themes'])) { + foreach ($plugin->definition['additional themes'] as $theme => $type) { + $output .= '

    ' . t('This is an alternative template for this style.') . '

    '; + $output .= '
    ' . check_plain(file_get_contents('./' . $plugin->definition['theme path'] . '/' . strtr($theme, '_', '-') . '.tpl.php')) . '
    '; + } + } + + $form['analysis'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#value' => $output, + ); + + $form_state['ok_button'] = TRUE; + break; + case 'analyze-theme-row': + $form['#title'] .= t('Theming information (row style)'); + $output = '

    ' . t('Back to !info.', array('!info' => $this->option_link(t('theming information'), 'analyze-theme'))) . '

    '; + + $plugin = $this->get_plugin('row'); + + if (empty($plugin->definition['theme'])) { + $output .= t('This display has no row style theming information'); + } + else { + $output .= '

    ' . t('This is the default theme template used for this row style.') . '

    '; + $output .= '
    ' . check_plain(file_get_contents('./' . $plugin->definition['theme path'] . '/' . strtr($plugin->definition['theme'], '_', '-') . '.tpl.php')) . '
    '; + } + + if (!empty($plugin->definition['additional themes'])) { + foreach ($plugin->definition['additional themes'] as $theme => $type) { + $output .= '

    ' . t('This is an alternative template for this row style.') . '

    '; + $output .= '
    ' . check_plain(file_get_contents('./' . $plugin->definition['theme path'] . '/' . strtr($theme, '_', '-') . '.tpl.php')) . '
    '; + } + } + + $form['analysis'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#value' => $output, + ); + + $form_state['ok_button'] = TRUE; + break; + case 'analyze-theme-field': + $form['#title'] .= t('Theming information (row style)'); + $output = '

    ' . t('Back to !info.', array('!info' => $this->option_link(t('theming information'), 'analyze-theme'))) . '

    '; + + $output .= '

    ' . t('This is the default theme template used for this row style.') . '

    '; + + // Field templates aren't registered the normal way...and they're always + // this one, anyhow. + $output .= '
    ' . check_plain(file_get_contents(drupal_get_path('module', 'views') . '/theme/views-view-field.tpl.php')) . '
    '; + + $form['analysis'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#value' => $output, + ); + $form_state['ok_button'] = TRUE; + break; + + case 'exposed_block': + $form['#title'] .= t('Put the exposed form in a block'); + $form['description'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#value' => t('If set, any exposed widgets will not appear with this view. Instead, a block will be made available to the Drupal block administration system, and the exposed form will appear there. Note that this block must be enabled manually, Views will not enable it for you.'), + ); + $form['exposed_block'] = array( + '#type' => 'radios', + '#options' => array(1 => t('Yes'), 0 => t('No')), + '#default_value' => $this->get_option('exposed_block') ? 1 : 0, + ); + break; + } + } + + /** + * Format a list of theme templates for output by the theme info helper. + */ + function format_themes($themes) { + $registry = theme_get_registry(); + + // Run through the theme engine variables, if necessary + global $theme_engine; + $extension = '.tpl.php'; + if (isset($theme_engine)) { + $extension_function = $theme_engine . '_extension'; + if (function_exists($extension_function)) { + $extension = $extension_function(); + } + } + + $output = ''; + $picked = FALSE; + foreach ($themes as $theme) { + $template = strtr($theme, '_', '-') . $extension; + if (!$picked && !empty($registry[$theme])) { + $template_path = isset($registry[$theme]['path']) ? $registry[$theme]['path'] . '/' : './'; + if (file_exists($template_path . $template)) { + $hint = t('File found in folder @template-path', array('@template-path' => $template_path)); + $template = '' . $template . ''; + } + else { + $template = '' . $template . ' ' . t('(File not found, in folder @template-path)', array('@template-path' => $template_path)) . ''; + } + $picked = TRUE; + } + $fixed[] = $template; + } + + return implode(', ', array_reverse($fixed)); + } + + /** + * Validate the options form. + */ + function options_validate(&$form, &$form_state) { + switch ($form_state['section']) { + case 'style_options': + $style = TRUE; + case 'row_options': + // if row, $style will be empty. + $plugin = $this->get_plugin(empty($style) ? 'row' : 'style'); + if ($plugin) { + $plugin->options_validate($form[$form_state['section']], $form_state); + } + break; + case 'access_options': + $plugin = $this->get_access_plugin(); + if ($plugin) { + $plugin->options_validate($form['access_options'], $form_state); + } + break; + case 'cache_options': + $plugin = $this->get_cache_plugin(); + if ($plugin) { + $plugin->options_validate($form['cache_options'], $form_state); + } + break; + } + } + + /** + * Perform any necessary changes to the form values prior to storage. + * There is no need for this function to actually store the data. + */ + function options_submit(&$form, &$form_state) { + // Not sure I like this being here, but it seems (?) like a logical place. + $cache_plugin = $this->get_cache_plugin(); + if ($cache_plugin) { + $cache_plugin->cache_flush(); + } + + $section = $form_state['section']; + switch ($section) { + case 'display_title': + $this->display->display_title = $form_state['values']['display_title']; + break; + case 'access': + $access = $this->get_option('access'); + if ($access['type'] != $form_state['values']['access']['type']) { + $plugin = views_get_plugin('access', $form_state['values']['access']['type']); + if ($plugin) { + $access = array('type' => $form_state['values']['access']['type']); + $plugin->option_defaults($access); + $this->set_option('access', $access); + if (!empty($plugin->definition['uses options'])) { + views_ui_add_form_to_stack('display', $this->view, $this->display->id, array('access_options')); + } + } + } + + break; + case 'access_options': + $plugin = views_get_plugin('access', $form_state['values'][$section]['type']); + if ($plugin) { + $plugin->options_submit($form['access_options'], $form_state); + $this->set_option('access', $form_state['values'][$section]); + } + break; + case 'cache': + $cache = $this->get_option('cache'); + if ($cache['type'] != $form_state['values']['cache']['type']) { + $plugin = views_get_plugin('cache', $form_state['values']['cache']['type']); + if ($plugin) { + $cache = array('type' => $form_state['values']['cache']['type']); + $plugin->option_defaults($cache); + $this->set_option('cache', $cache); + if (!empty($plugin->definition['uses options'])) { + views_ui_add_form_to_stack('display', $this->view, $this->display->id, array('cache_options')); + } + } + } + + break; + case 'cache_options': + $plugin = views_get_plugin('cache', $form_state['values'][$section]['type']); + if ($plugin) { + $plugin->options_submit($form['cache_options'], $form_state); + $this->set_option('cache', $form_state['values'][$section]); + } + break; + case 'title': + case 'link_display': + $this->set_option($section, $form_state['values'][$section]); + break; + case 'use_ajax': + $this->set_option($section, (bool)$form_state['values'][$section]); + break; + case 'use_pager': + $this->set_option($section, $form_state['values'][$section]); + $this->set_option('pager_element', intval($form_state['values']['pager_element'])); + break; + case 'items_per_page': + $this->set_option($section, intval($form_state['values'][$section])); + $this->set_option('offset', intval($form_state['values']['offset'])); + break; + case 'use_more': + $this->set_option($section, intval($form_state['values'][$section])); + $this->set_option('use_more_text', $form_state['values']['use_more_text']); + case 'distinct': + $this->set_option($section, $form_state['values'][$section]); + break; + case 'row_plugin': + // This if prevents resetting options to default if they don't change + // the plugin. + if ($this->get_option($section) != $form_state['values'][$section]) { + $plugin = views_get_plugin('row', $form_state['values'][$section]); + if ($plugin) { + $this->set_option($section, $form_state['values'][$section]); + $this->set_option('row_options', array()); + + // send ajax form to options page if we use it. + if (!empty($plugin->definition['uses options'])) { + views_ui_add_form_to_stack('display', $this->view, $this->display->id, array('row_options')); + } + } + } + break; + case 'style_plugin': + // This if prevents resetting options to default if they don't change + // the plugin. + if ($this->get_option($section) != $form_state['values'][$section]) { + $plugin = views_get_plugin('style', $form_state['values'][$section]); + if ($plugin) { + $this->set_option($section, $form_state['values'][$section]); + $this->set_option('style_options', array()); + // send ajax form to options page if we use it. + if (!empty($plugin->definition['uses options'])) { + views_ui_add_form_to_stack('display', $this->view, $this->display->id, array('style_options')); + } + } + } + break; + case 'style_options': + $style = TRUE; + case 'row_options': + // if row, $style will be empty. + $plugin = $this->get_plugin(empty($style) ? 'row' : 'style'); + if ($plugin) { + $plugin->options_submit($form[$section], $form_state); + } + $this->set_option($section, $form_state['values'][$section]); + break; + case 'header': + case 'footer': + case 'empty': + $this->set_option($section, $form_state['values'][$section]); + $this->set_option($section . '_format', $form_state['values'][$section . '_format']); + if ($section != 'empty') { + $this->set_option($section . '_empty', $form_state['values'][$section . '_empty']); + } + break; + case 'exposed_block': + $this->set_option($section, (bool) $form_state['values'][$section]); + break; + } + } + + /** + * Add an override button for a given section, allowing the user to + * change whether this info is stored on the default display or on + * the current display. + */ + function add_override_button(&$form, &$form_state, $section) { + if ($this->is_default_display()) { + return; + } + + $form['override'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + ); + if ($this->is_defaulted($section)) { + $form['override']['button'] = array( + '#type' => 'submit', + '#value' => t('Override'), + '#submit' => array('views_ui_edit_display_form_override'), + ); + $form['override']['markup'] = array( + '#prefix' => '
    ', + '#value' => theme('advanced_help_topic', 'views', 'overrides') . t('Status: using default values.'), + '#suffix' => '
    ', + ); + + $form_state['update_name'] = t('Update default display'); + } + else { + $form['override']['button'] = array( + '#type' => 'submit', + '#value' => t('Use default'), + '#submit' => array('views_ui_edit_display_form_override'), + ); + $form['override']['markup'] = array( + '#prefix' => '
    ', + '#value' => theme('advanced_help_topic', 'views', 'overrides') . t('Status: using overridden values.'), + '#suffix' => '
    ', + ); + + $form_state['update_name'] = NULL; + } + } + + /** + * If override/revert was clicked, perform the proper toggle. + */ + function options_override($form, &$form_state) { + $this->set_override($form_state['section']); + } + + /** + * Flip the override setting for the given section. + */ + function set_override($section, $new_state = NULL) { + $options = $this->defaultable_sections($section); + if (!$options) { + return; + } + + if (!isset($new_state)) { + $new_state = empty($this->options['defaults'][$section]); + } + + // For each option that is part of this group, fix our settings. + foreach ($options as $option) { + if ($new_state) { + // Revert to defaults. + unset($this->options[$option]); + unset($this->display->display_options[$option]); + } + else { + // copy existing values into our display. + $this->options[$option] = $this->get_option($option); + $this->display->display_options[$option] = $this->options[$option]; + } + $this->options['defaults'][$option] = $new_state; + $this->display->display_options['defaults'][$option] = $new_state; + } + } + + /** + * Inject anything into the query that the display handler needs. + */ + function query() { + // Make the query distinct if the option was set. + if ($this->get_option('distinct')) { + $this->view->query->set_distinct(); + } + } + + /** + * Not all display plugins will support filtering + */ + function render_filters() { } + + /** + * Render the 'more' link + */ + function render_more_link() { + if ($this->use_more() && $this->view->total_rows > $this->view->pager['items_per_page']) { + $path = $this->get_path(); + if ($path) { + $path = $this->view->get_url(NULL, $path); + $url_options = array(); + if (!empty($this->view->exposed_raw_input)) { + $url_options['query'] = $this->view->exposed_raw_input; + } + $theme = views_theme_functions('views_more', $this->view, $this->display); + $path = check_url(url($path, $url_options)); + return theme($theme, $path, $this->use_more_text()); + } + } + } + + /** + * Render a text area, using the proper format. + */ + function render_textarea($area) { + static $formats = array(); + + $value = $this->get_option($area); + // Check to make sure the filter format exists; if not, we don't + // display anything. + $format = filter_resolve_format($this->get_option($area . '_format')); + + if (!array_key_exists($format, $formats)) { + $formats[$format] = db_result(db_query("SELECT name FROM {filter_formats} WHERE format = %d", $format)); + } + + if (!$formats[$format]) { + return; + } + + if ($value) { + return check_markup($value, $format, FALSE); + } + } + + /** + * Render the header of the view. + */ + function render_header() { + if (!empty($this->view->result) || $this->get_option('header_empty')) { + return $this->render_textarea('header'); + } + } + + /** + * Render the footer of the view. + */ + function render_footer() { + if (!empty($this->view->result) || $this->get_option('footer_empty')) { + return $this->render_textarea('footer'); + } + } + + /** + * Render the empty text of the view. + */ + function render_empty() { return $this->render_textarea('empty'); } + /** + * If this display creates a block, implement one of these. + */ + function hook_block($op = 'list', $delta = 0, $edit = array()) { return array(); } + + /** + * If this display creates a page with a menu item, implement it here. + */ + function hook_menu() { return array(); } + + /** + * Render this display. + */ + function render() { + return theme($this->theme_functions(), $this->view); + } + + /** + * Determine if the user has access to this display of the view. + */ + function access($account = NULL) { + if (!isset($account)) { + global $user; + $account = $user; + } + + // Full override. + if (user_access('access all views', $account)) { + return TRUE; + } + + $plugin = $this->get_access_plugin(); + if ($plugin) { + return $plugin->access($account); + } + + // fallback to all access if no plugin. + return TRUE; + } + + /** + * Set up any variables on the view prior to execution. These are separated + * from execute because they are extremely common and unlikely to be + * overridden on an individual display. + */ + function pre_execute() { + $this->view->set_use_ajax($this->use_ajax()); + // Copy pager information from the display. + $this->view->set_use_pager($this->use_pager()); + $this->view->set_pager_element($this->get_option('pager_element')); + $this->view->set_items_per_page($this->get_option('items_per_page')); + $this->view->set_offset($this->get_option('offset')); + if ($this->use_more()) { + $this->view->get_total_rows = TRUE; + } + } + + /** + * When used externally, this is how a view gets run and returns + * data in the format required. + * + * The base class cannot be executed. + */ + function execute() { } + + /** + * Fully render the display for the purposes of a live preview or + * some other AJAXy reason. + */ + function preview() { return $this->view->render(); } + + /** + * Displays can require a certain type of style plugin. By default, they will + * be 'normal'. + */ + function get_style_type() { return 'normal'; } + + /** + * Make sure the display and all associated handlers are valid. + * + * @return + * Empty array if the display is valid; an array of error strings if it is not. + */ + function validate() { + $errors = array(); + // Make sure displays that use fields HAVE fields. + if ($this->uses_fields()) { + $fields = FALSE; + foreach ($this->get_handlers('field') as $field) { + if (empty($field->options['exclude'])) { + $fields = TRUE; + } + } + + if (!$fields) { + $errors[] = t('Display "@display" uses fields but there are none defined for it or all are excluded.', array('@display' => $this->display->display_title)); + } + } + + if ($this->has_path() && !$this->get_option('path')) { + $errors[] = t('Display "@display" uses a path but the path is undefined.', array('@display' => $this->display->display_title)); + } + + // Validate style plugin + $style = $this->get_plugin(); + if (empty($style)) { + $errors[] = t('Display "@display" has an invalid style plugin.', array('@display' => $this->display->display_title)); + } + else { + $result = $style->validate(); + if (!empty($result) && is_array($result)) { + $errors = array_merge($errors, $result); + } + } + + // Validate handlers + foreach (views_object_types() as $type => $info) { + foreach ($this->get_handlers($type) as $handler) { + $result = $handler->validate(); + if (!empty($result) && is_array($result)) { + $errors = array_merge($errors, $result); + } + } + } + + return $errors; + } + + /** + * Provide the block system with any exposed widget blocks for this display. + */ + function get_special_blocks() { + $delta = '-exp-' . $this->view->name . '-' . $this->display->id; + $desc = t('Exposed form: @view-@display_id', array('@view' => $this->view->name, '@display_id' => $this->display->id)); + + return array( + $delta => array( + 'info' => $desc, + ) + ); + } + + /** + * Render any special blocks provided for this display. + */ + function view_special_blocks($type) { + if ($type == '-exp') { + // avoid interfering with the admin forms. + if (arg(0) == 'admin' && arg(1) == 'build' && arg(2) == 'views') { + return; + } + $this->view->init_handlers(); + return array( + 'content' => $this->view->render_exposed_form(TRUE), + ); + } + } + +} + + +/** + * @} + */ + diff --git a/plugins/views_plugin_display_attachment.inc b/plugins/views_plugin_display_attachment.inc new file mode 100644 index 0000000000000000000000000000000000000000..d1f669713c54700baf9247b416faf59603edc9ca --- /dev/null +++ b/plugins/views_plugin_display_attachment.inc @@ -0,0 +1,232 @@ + 'before'); + $options['inherit_arguments'] = array('default' => TRUE); + $options['inherit_exposed_filters'] = array('default' => FALSE); + $options['displays'] = array('default' => array()); + + return $options; + } + + function execute() { + return $this->view->render($this->display->id); + } + + function attachment_positions($position = NULL) { + $positions = array( + 'before' => t('Before'), + 'after' => t('After'), + 'both' => t('Both'), + ); + + if ($position) { + return $positions[$position]; + } + + return $positions; + } + + /** + * Provide the summary for attachment options in the views UI. + * + * This output is returned as an array. + */ + function options_summary(&$categories, &$options) { + // It is very important to call the parent function here: + parent::options_summary($categories, $options); + + $categories['attachment'] = array( + 'title' => t('Attachment settings'), + ); + + $options['inherit_arguments'] = array( + 'category' => 'attachment', + 'title' => t('Inherit arguments'), + 'value' => $this->get_option('inherit_arguments') ? t('Yes') : t('No'), + ); + + $options['inherit_exposed_filters'] = array( + 'category' => 'attachment', + 'title' => t('Inherit exposed filters'), + 'value' => $this->get_option('inherit_exposed_filters') ? t('Yes') : t('No'), + ); + + $options['attachment_position'] = array( + 'category' => 'attachment', + 'title' => t('Position'), + 'value' => $this->attachment_positions($this->get_option('attachment_position')), + ); + + $displays = array_filter($this->get_option('displays')); + if (count($displays) > 1) { + $attach_to = t('Multiple displays'); + } + else if (count($displays) == 1) { + $display = array_shift($displays); + if (!empty($this->view->display[$display])) { + $attach_to = check_plain($this->view->display[$display]->display_title); + } + } + + if (!isset($attach_to)) { + $attach_to = t('None'); + } + + $options['displays'] = array( + 'category' => 'attachment', + 'title' => t('Attach to'), + 'value' => $attach_to, + ); + } + + /** + * Provide the default form for setting options. + */ + function options_form(&$form, &$form_state) { + // It is very important to call the parent function here: + parent::options_form($form, $form_state); + + switch ($form_state['section']) { + case 'inherit_arguments': + $form['#title'] .= t('Inherit arguments'); + $form['inherit_arguments'] = array( + '#type' => 'checkbox', + '#title' => t('Inherit'), + '#description' => t('Should this display inherit its arguments from the parent display to which it is attached?'), + '#default_value' => $this->get_option('inherit_arguments'), + ); + break; + case 'inherit_exposed_filters': + $form['#title'] .= t('Inherit exposed filters'); + $form['inherit_exposed_filters'] = array( + '#type' => 'checkbox', + '#title' => t('Inherit'), + '#description' => t('Should this display inherit its exposed filter values from the parent display to which it is attached?'), + '#default_value' => $this->get_option('inherit_exposed_filters'), + ); + break; + case 'attachment_position': + $form['#title'] .= t('Position'); + $form['attachment_position'] = array( + '#type' => 'radios', + '#description' => t('Attach before or after the parent display?'), + '#options' => $this->attachment_positions(), + '#default_value' => $this->get_option('attachment_position'), + ); + break; + case 'displays': + $form['#title'] .= t('Attach to'); + $displays = array(); + foreach ($this->view->display as $display_id => $display) { + if (!empty($display->handler) && $display->handler->accept_attachments()) { + $displays[$display_id] = $display->display_title; + } + } + $form['displays'] = array( + '#type' => 'checkboxes', + '#description' => t('Select which display or displays this should attach to.'), + '#options' => $displays, + '#default_value' => $this->get_option('displays'), + ); + break; + } + } + + /** + * Perform any necessary changes to the form values prior to storage. + * There is no need for this function to actually store the data. + */ + function options_submit(&$form, &$form_state) { + // It is very important to call the parent function here: + parent::options_submit($form, $form_state); + switch ($form_state['section']) { + case 'inherit_arguments': + case 'inherit_exposed_filters': + case 'attachment_position': + case 'displays': + $this->set_option($form_state['section'], $form_state['values'][$form_state['section']]); + break; + } + } + + /** + * Attach to another view. + */ + function attach_to($display_id) { + $displays = $this->get_option('displays'); + + if (empty($displays[$display_id])) { + return; + } + + if (!$this->access()) { + return; + } + + // Get a fresh view because our current one has a lot of stuff on it because it's + // already been executed. + $view = $this->view->clone_view(); + $view->original_args = $view->args; + + $args = $this->get_option('inherit_arguments') ? $this->view->args : array(); + $view->set_arguments($args); + + // because of this, it is very very important that displays that can accept + // attachments not also be attachments, or this could explode messily. + $attachment = $view->execute_display($this->display->id, $args); + + switch ($this->get_option('attachment_position')) { + case 'before': + $this->view->attachment_before .= $attachment; + break; + case 'after': + $this->view->attachment_after .= $attachment; + break; + case 'both': + $this->view->attachment_before .= $attachment; + $this->view->attachment_after .= $attachment; + break; + } + + $view->destroy(); + } + + /** + * Attachment displays only use exposed widgets if + * they are set to inherit the exposed filter settings + * of their parent display. + */ + function uses_exposed() { + if (!empty($this->options['inherit_exposed_filters']) && parent::uses_exposed()) { + return TRUE; + } + return FALSE; + } + + /** + * If an attachment is set to inherit the exposed filter + * settings from its parent display, then don't render and + * display a second set of exposed filter widgets. + */ + function displays_exposed() { + return $this->options['inherit_exposed_filters'] ? FALSE : TRUE; + } +} diff --git a/plugins/views_plugin_display_block.inc b/plugins/views_plugin_display_block.inc new file mode 100644 index 0000000000000000000000000000000000000000..c6f375041552074a43153255ebddf8f69a4c8bb3 --- /dev/null +++ b/plugins/views_plugin_display_block.inc @@ -0,0 +1,193 @@ + '', 'translatable' => TRUE); + $options['block_caching'] = array('default' => BLOCK_NO_CACHE); + + return $options; + } + + /** + * The default block handler doesn't support configurable items, + * but extended block handlers might be able to do interesting + * stuff with it. + */ + function execute_hook_block($op = 'list', $delta = 0, $edit = array()) { + if ($op == 'list') { + $delta = $this->view->name . '-' . $this->display->id; + $desc = $this->get_option('block_description'); + + if (empty($desc)) { + $desc = t('@view: @display', array('@view' => $this->view->name, '@display' => $this->display->display_title)); + } + return array( + $delta => array( + 'info' => $desc, + 'cache' => $this->get_cache_type() + ) + ); + } + } + + /** + * The display block handler returns the structure necessary for a block. + */ + function execute() { + // Prior to this being called, the $view should already be set to this + // display, and arguments should be set on the view. + $info['content'] = $this->view->render(); + $info['subject'] = filter_xss_admin($this->view->get_title()); + if (!empty($this->view->result) || $this->get_option('empty') || !empty($this->view->style_plugin->definition['even empty'])) { + return $info; + } + } + + /** + * Provide the summary for page options in the views UI. + * + * This output is returned as an array. + */ + function options_summary(&$categories, &$options) { + // It is very important to call the parent function here: + parent::options_summary($categories, $options); + + $categories['block'] = array( + 'title' => t('Block settings'), + ); + + $block_description = strip_tags($this->get_option('block_description')); + if (empty($block_description)) { + $block_description = t('None'); + } + + if (strlen($block_description) > 16) { + $block_description = substr($block_description, 0, 16) . '...'; + } + + $options['block_description'] = array( + 'category' => 'block', + 'title' => t('Admin'), + 'value' => $block_description, + ); + + $cache_type = $this->get_option('block_caching'); + if (empty($cache_type)) { + $cache_type = BLOCK_NO_CACHE; + } + + $types = $this->block_caching_modes(); + $options['block_caching'] = array( + 'category' => 'block', + 'title' => t('Caching'), + 'value' => $types[$this->get_cache_type()], + ); + } + + /** + * Provide a list of core's block caching modes. + */ + function block_caching_modes() { + return array( + BLOCK_NO_CACHE => t('Do not cache'), + BLOCK_CACHE_GLOBAL => t('Cache once for everything (global)'), + BLOCK_CACHE_PER_PAGE => t('Per page'), + BLOCK_CACHE_PER_ROLE => t('Per role'), + BLOCK_CACHE_PER_ROLE | BLOCK_CACHE_PER_PAGE => t('Per role per page'), + BLOCK_CACHE_PER_USER => t('Per user'), + BLOCK_CACHE_PER_USER | BLOCK_CACHE_PER_PAGE => t('Per user per page'), + ); + } + + /** + * Provide a single method to figure caching type, keeping a sensible default + * for when it's unset. + */ + function get_cache_type() { + $cache_type = $this->get_option('block_caching'); + if (empty($cache_type)) { + $cache_type = BLOCK_NO_CACHE; + } + return $cache_type; + } + + /** + * Provide the default form for setting options. + */ + function options_form(&$form, &$form_state) { + // It is very important to call the parent function here: + parent::options_form($form, $form_state); + + switch ($form_state['section']) { + case 'block_description': + $form['#title'] .= t('Block admin description'); + $form['block_description'] = array( + '#type' => 'textfield', + '#description' => t('This will appear as the name of this block in administer >> site building >> blocks.'), + '#default_value' => $this->get_option('block_description'), + ); + break; + case 'block_caching': + $form['#title'] .= t('Block caching type'); + + $form['block_caching'] = array( + '#type' => 'radios', + '#description' => t("This sets the default status for Drupal's built-in block caching method; this requires that caching be turned on in block administration, and be careful because you have little control over when this cache is flushed."), + '#options' => $this->block_caching_modes(), + '#default_value' => $this->get_cache_type(), + ); + break; + } + } + + /** + * Perform any necessary changes to the form values prior to storage. + * There is no need for this function to actually store the data. + */ + function options_submit(&$form, &$form_state) { + // It is very important to call the parent function here: + parent::options_submit($form, $form_state); + switch ($form_state['section']) { + case 'block_description': + $this->set_option('block_description', $form_state['values']['block_description']); + break; + case 'block_caching': + $this->set_option('block_caching', $form_state['values']['block_caching']); + $this->save_block_cache($form_state['view']->name.'-'.$form_state['display_id'], $form_state['values']['block_caching']); + break; + } + } + + /** + * Block views use exposed widgets only if AJAX is set. + */ + function uses_exposed() { + if ($this->use_ajax()) { + return parent::uses_exposed(); + } + + return FALSE; + } + + /** + * Save the block cache setting in the blocks table if this block allready + * exists in the blocks table. Dirty fix untill http://drupal.org/node/235673 gets in. + */ + function save_block_cache($delta, $cache_setting) { + if ($bid = db_fetch_object(db_query("SELECT bid, cache FROM {blocks} WHERE module = 'views' AND delta = '%s'", $delta))) { + db_query("UPDATE {blocks} set cache = %d WHERE module = 'views' AND delta = '%s'", $cache_setting, $delta); + } + } +} diff --git a/plugins/views_plugin_display_default.inc b/plugins/views_plugin_display_default.inc new file mode 100644 index 0000000000000000000000000000000000000000..6134738772c2a803e4b33ea0c3b9f471ef0ce5bb --- /dev/null +++ b/plugins/views_plugin_display_default.inc @@ -0,0 +1,56 @@ +execute_display('default', $args); + * @endcode + * + * For more complex usages, a view can be partially built: + * @code + * $view->set_arguments($args); + * $view->build('default'); // Build the query + * $view->execute(); // Run the query + * $output = $view->render(); // Render the view + * @endcode + * + * If short circuited at any point, look in $view->build_info for + * information about the query. After execute, look in $view->result + * for the array of objects returned from db_query. + * + * You can also do: + * @code + * $view->set_arguments($args); + * $output = $view->render('default'); // Render the view + * @endcode + * + * This illustrates that render is smart enough to call build and execute + * if these items have not already been accomplished. + * + * Note that execute also must accomplish other tasks, such + * as setting page titles, breadcrumbs, and generating exposed filter + * data if necessary. + */ + function execute() { + return $this->view->render($this->display->id); + } +} \ No newline at end of file diff --git a/plugins/views_plugin_display_feed.inc b/plugins/views_plugin_display_feed.inc new file mode 100644 index 0000000000000000000000000000000000000000..2e893c30c97b9ead5d033c593030a9843b5f0d37 --- /dev/null +++ b/plugins/views_plugin_display_feed.inc @@ -0,0 +1,202 @@ +view->render(); + if (empty($output)) { + return drupal_not_found(); + } + print $output; + } + + function preview() { + if (!empty($this->live_preview)) { + return '
    ' . check_plain($this->view->render()) . '
    '; + } + return $this->view->render(); + } + + /** + * Instead of going through the standard views_view.tpl.php, delegate this + * to the style handler. + */ + function render() { + return $this->view->style_plugin->render($this->view->result); + } + + function defaultable_sections($section = NULL) { + if (in_array($section, array('style_options', 'style_plugin', 'row_options', 'row_plugin',))) { + return FALSE; + } + + $sections = parent::defaultable_sections($section); + + // Tell views our sitename_title option belongs in the title section. + if ($section == 'title') { + $sections[] = 'sitename_title'; + } + elseif (!$section) { + $sections['title'][] = 'sitename_title'; + } + return $sections; + } + + function option_definition() { + $options = parent::option_definition(); + + $options['displays'] = array('default' => array()); + + // Overrides for standard stuff: + $options['style_plugin']['default'] = 'rss'; + $options['style_options']['default'] = array('mission_description' => FALSE, 'description' => ''); + $options['sitename_title']['default'] = FALSE; + $options['row_plugin']['default'] = ''; + $options['defaults']['default']['style_plugin'] = FALSE; + $options['defaults']['default']['style_options'] = FALSE; + $options['defaults']['default']['row_plugin'] = FALSE; + $options['defaults']['default']['row_options'] = FALSE; + + return $options; + } + + function options_summary(&$categories, &$options) { + // It is very important to call the parent function here: + parent::options_summary($categories, $options); + + // Since we're childing off the 'page' type, we'll still *call* our + // category 'page' but let's override it so it says feed settings. + $categories['page'] = array( + 'title' => t('Feed settings'), + ); + + if ($this->get_option('sitename_title')) { + $options['title']['value'] = t('Using the site name'); + } + + // I don't think we want to give feeds menus directly. + unset($options['menu']); + + $displays = array_filter($this->get_option('displays')); + if (count($displays) > 1) { + $attach_to = t('Multiple displays'); + } + else if (count($displays) == 1) { + $display = array_shift($displays); + if (!empty($this->view->display[$display])) { + $attach_to = check_plain($this->view->display[$display]->display_title); + } + } + + if (!isset($attach_to)) { + $attach_to = t('None'); + } + + $options['displays'] = array( + 'category' => 'page', + 'title' => t('Attach to'), + 'value' => $attach_to, + ); + } + + /** + * Provide the default form for setting options. + */ + function options_form(&$form, &$form_state) { + // It is very important to call the parent function here. + parent::options_form($form, $form_state); + + switch ($form_state['section']) { + case 'title': + $title = $form['title']; + // A little juggling to move the 'title' field beyond our checkbox. + unset($form['title']); + $form['sitename_title'] = array( + '#type' => 'checkbox', + '#title' => t('Use the site name for the title'), + '#default_value' => $this->get_option('sitename_title'), + ); + $form['title'] = $title; + $form['title']['#process'] = array('views_process_dependency'); + $form['title']['#dependency'] = array('edit-sitename-title' => array(FALSE)); + break; + case 'displays': + $form['#title'] .= t('Attach to'); + $displays = array(); + foreach ($this->view->display as $display_id => $display) { + if (!empty($display->handler) && $display->handler->accept_attachments()) { + $displays[$display_id] = $display->display_title; + } + } + $form['displays'] = array( + '#type' => 'checkboxes', + '#description' => t('The feed icon will be available only to the selected displays.'), + '#options' => $displays, + '#default_value' => $this->get_option('displays'), + ); + break; + case 'path': + $form['path']['#description'] = t('This view will be displayed by visiting this path on your site. It is recommended that the path be something like "path/%/%/feed" or "path/%/%/rss.xml", putting one % in the path for each argument you have defined in the view.'); + } + } + + /** + * Perform any necessary changes to the form values prior to storage. + * There is no need for this function to actually store the data. + */ + function options_submit(&$form, &$form_state) { + // It is very important to call the parent function here: + parent::options_submit($form, $form_state); + switch ($form_state['section']) { + case 'title': + $this->set_option('sitename_title', $form_state['values']['sitename_title']); + break; + case 'displays': + $this->set_option($form_state['section'], $form_state['values'][$form_state['section']]); + break; + } + } + + /** + * Attach to another view. + */ + function attach_to($display_id) { + $displays = $this->get_option('displays'); + if (empty($displays[$display_id])) { + return; + } + + // Defer to the feed style; it may put in meta information, and/or + // attach a feed icon. + $plugin = $this->get_plugin(); + if ($plugin) { + $clone = $this->view->clone_view(); + $clone->set_display($this->display->id); + $clone->build_title(); + $plugin->attach_to($display_id, $this->get_path(), $clone->get_title()); + } + } + + function uses_link_display() { + return TRUE; + } +} diff --git a/plugins/views_plugin_display_page.inc b/plugins/views_plugin_display_page.inc new file mode 100644 index 0000000000000000000000000000000000000000..b84742a69ddc291fc4f00336831ff5b79ab61681 --- /dev/null +++ b/plugins/views_plugin_display_page.inc @@ -0,0 +1,481 @@ + ''); + $options['menu'] = array( + 'contains' => array( + 'type' => array('default' => 'none'), + // Do not translate menu and title as menu system will. + 'title' => array('default' => '', 'translatable' => FALSE), + 'description' => array('default' => '', 'translatable' => FALSE), + 'weight' => array('default' => 0), + 'name' => array('default' => 'navigation'), + ), + ); + $options['tab_options'] = array( + 'contains' => array( + 'type' => array('default' => 'none'), + // Do not translate menu and title as menu system will. + 'title' => array('default' => '', 'translatable' => FALSE), + 'description' => array('default' => '', 'translatable' => FALSE), + 'weight' => array('default' => 0), + ), + ); + + return $options; + } + + /** + * Add this display's path information to Drupal's menu system. + */ + function execute_hook_menu() { + $items = array(); + // Replace % with the link to our standard views argument loader + // views_arg_load -- which lives in views.module + + $bits = explode('/', $this->get_option('path')); + $page_arguments = array($this->view->name, $this->display->id); + + // Replace % with %views_arg for menu autoloading and add to the + // page arguments so the argument actually comes through. + foreach($bits as $pos => $bit) { + if ($bit == '%') { + $bits[$pos] = '%views_arg'; + $page_arguments[] = $pos; + } + } + + $path = implode('/', $bits); + + $access_plugin = $this->get_access_plugin(); + + if ($path) { + $items[$path] = array( + // default views page entry + 'page callback' => 'views_page', + 'page arguments' => $page_arguments, + // Default access check (per display) + 'access callback' => 'views_access', + 'access arguments' => array($access_plugin->get_access_callback()), + // Identify URL embedded arguments and correlate them to a handler + 'load arguments' => array($this->view->name, $this->display->id, '%index'), + ); + $menu = $this->get_option('menu'); + if (empty($menu)) { + $menu = array('type' => 'none'); + } + // Set the title and description if we have one. + if ($menu['type'] != 'none') { + $items[$path]['title'] = $menu['title']; + $items[$path]['description'] = $menu['description']; + } + + if (isset($menu['weight'])) { + $items[$path]['weight'] = intval($menu['weight']); + } + + switch ($menu['type']) { + case 'none': + default: + $items[$path]['type'] = MENU_CALLBACK; + break; + case 'normal': + $items[$path]['type'] = MENU_NORMAL_ITEM; + // Insert item into the proper menu + $items[$path]['menu_name'] = $menu['name']; + break; + case 'tab': + $items[$path]['type'] = MENU_LOCAL_TASK; + break; + case 'default tab': + $items[$path]['type'] = MENU_DEFAULT_LOCAL_TASK; + break; + } + + // If this is a 'default' tab, check to see if we have to create teh + // parent menu item. + if ($menu['type'] == 'default tab') { + $tab_options = $this->get_option('tab_options'); + if (!empty($tab_options['type']) && $tab_options['type'] != 'none') { + $bits = explode('/', $path); + // Remove the last piece. + $bit = array_pop($bits); + + // we can't do this if they tried to make the last path bit variable. + // @todo: We can validate this. + if ($bit != '%views_arg' && !empty($bits)) { + $default_path = implode('/', $bits); + $items[$default_path] = array( + // default views page entry + 'page callback' => 'views_page', + 'page arguments' => $page_arguments, + // Default access check (per display) + 'access callback' => 'views_access', + 'access arguments' => array($access_plugin->get_access_callback()), + // Identify URL embedded arguments and correlate them to a handler + 'load arguments' => array($this->view->name, $this->display->id, '%index'), + 'title' => $tab_options['title'], + 'description' => $tab_options['description'], + ); + switch ($tab_options['type']) { + default: + case 'normal': + $items[$default_path]['type'] = MENU_NORMAL_ITEM; + break; + case 'tab': + $items[$default_path]['type'] = MENU_LOCAL_TASK; + break; + } + if (isset($tab_options['weight'])) { + $items[$default_path]['weight'] = intval($tab_options['weight']); + } + } + } + } + } + + return $items; + } + + /** + * The display page handler returns a normal view, but it also does + * a drupal_set_title for the page, and does a views_set_page_view + * on the view. + */ + function execute() { + // Let the world know that this is the page view we're using. + views_set_page_view($this); + + // Prior to this being called, the $view should already be set to this + // display, and arguments should be set on the view. + $this->view->build(); + if (!empty($this->view->build_info['fail'])) { + return drupal_not_found(); + } + + $this->view->get_breadcrumb(TRUE); + + // And the title, which is much easier. + drupal_set_title(filter_xss_admin($this->view->get_title())); + + // And now render the view. + return $this->view->render(); + } + + /** + * Provide the summary for page options in the views UI. + * + * This output is returned as an array. + */ + function options_summary(&$categories, &$options) { + // It is very important to call the parent function here: + parent::options_summary($categories, $options); + + $categories['page'] = array( + 'title' => t('Page settings'), + ); + + $path = strip_tags($this->get_option('path')); + if (empty($path)) { + $path = t('None'); + } + + if (strlen($path) > 16) { + $path = substr($path, 0, 16) . '...'; + } + + $options['path'] = array( + 'category' => 'page', + 'title' => t('Path'), + 'value' => $path, + ); + + $menu = $this->get_option('menu'); + if (!is_array($menu)) { + $menu = array('type' => 'none'); + } + switch($menu['type']) { + case 'none': + default: + $menu_str = t('No menu'); + break; + case 'normal': + $menu_str = t('Normal: @title', array('@title' => $menu['title'])); + break; + case 'tab': + case 'default tab': + $menu_str = t('Tab: @title', array('@title' => $menu['title'])); + break; + } + + if (strlen($menu_str) > 16) { + $menu_str = substr($menu_str, 0, 16) . '...'; + } + + $options['menu'] = array( + 'category' => 'page', + 'title' => t('Menu'), + 'value' => $menu_str, + ); + + // This adds a 'Settings' link to the style_options setting if the style has options. + if ($menu['type'] == 'default tab') { + $options['menu']['links']['tab_options'] = t('Change settings for the parent menu'); + } + } + + /** + * Provide the default form for setting options. + */ + function options_form(&$form, &$form_state) { + // It is very important to call the parent function here: + parent::options_form($form, $form_state); + + switch ($form_state['section']) { + case 'path': + $form['#title'] .= t('The menu path or URL of this view'); + $form['#help_topic'] = 'path'; + $form['path'] = array( + '#type' => 'textfield', + '#description' => t('This view will be displayed by visiting this path on your site. You may use "%" in your URL to represent values that will be used for arguments: For example, "node/%/feed".'), + '#default_value' => $this->get_option('path'), + '#field_prefix' => '' . url(NULL, array('absolute' => TRUE)) . (variable_get('clean_url', 0) ? '' : '?q='), + '#field_suffix' => '‎', + '#attributes' => array('dir'=>'ltr'), + ); + break; + case 'menu': + $form['#title'] .= t('Menu item entry'); + $form['#help_topic'] = 'menu'; + $form['menu'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#tree' => TRUE, + ); + $menu = $this->get_option('menu'); + if (empty($menu)) { + $menu = array('type' => 'none', 'title' => '', 'weight' => 0); + } + $form['menu']['type'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#title' => t('Type'), + '#type' => 'radios', + '#options' => array( + 'none' => t('No menu entry'), + 'normal' => t('Normal menu entry'), + 'tab' => t('Menu tab'), + 'default tab' => t('Default menu tab') + ), + '#default_value' => $menu['type'], + ); + $form['menu']['title'] = array( + '#prefix' => '
    ', + '#title' => t('Title'), + '#type' => 'textfield', + '#default_value' => $menu['title'], + '#description' => t('If set to normal or tab, enter the text to use for the menu item.'), + '#process' => array('views_process_dependency'), + '#dependency' => array('radio:menu[type]' => array('normal', 'tab', 'default tab')), + ); + $form['menu']['description'] = array( + '#title' => t('Description'), + '#type' => 'textfield', + '#default_value' => $menu['description'], + '#description' => t("If set to normal or tab, enter the text to use for the menu item's description."), + '#process' => array('views_process_dependency'), + '#dependency' => array('radio:menu[type]' => array('normal', 'tab', 'default tab')), + ); + $form['menu']['name-warning'] = array( + '#type' => 'markup', + '#prefix' => '
    ', + '#value' => t("Warning: Changing this item's menu will not work reliably in Drupal 6.4 or earlier. Please upgrade your copy of Drupal at !url.", array('!url' => l('drupal.org', 'http://drupal.org/project/Drupal+project'))), + '#suffix' => '
    ', + '#process' => array('views_process_dependency'), + '#dependency' => array('radio:menu[type]' => array('normal')), + '#access' => version_compare(VERSION, '6.5', '<'), + ); + + // Only display the menu selector if menu module is enabled. + if (module_exists('menu')) { + $form['menu']['name'] = array( + '#title' => t('Menu'), + '#type' => 'select', + '#options' => menu_get_menus(), + '#default_value' => $menu['name'], + '#description' => t('Insert item into an available menu.'), // + '#process' => array('views_process_dependency'), + '#dependency' => array('radio:menu[type]' => array('normal')), + ); + } + else { + $form['menu']['name'] = array( + '#type' => 'value', + '#value' => $menu['name'], + ); + $form['menu']['markup'] = array( + '#value' => t('Menu selection requires the activation of menu module.'), + ); + } + $form['menu']['weight'] = array( + '#suffix' => '
    ', + '#title' => t('Weight'), + '#type' => 'textfield', + '#default_value' => isset($menu['weight']) ? $menu['weight'] : 0, + '#description' => t('The lower the weight the higher/further left it will appear.'), + '#process' => array('views_process_dependency'), + '#dependency' => array('radio:menu[type]' => array('normal', 'tab', 'default tab')), + ); + break; + case 'tab_options': + $form['#title'] .= t('Default tab options'); + $tab_options = $this->get_option('tab_options'); + if (empty($tab_options)) { + $tab_options = array('type' => 'none', 'title' => '', 'weight' => 0); + } + + $form['tab_markup'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#value' => t('When providing a menu item as a tab, Drupal needs to know what the parent menu item of that tab will be. Sometimes the parent will already exist, but other times you will need to have one created. The path of a parent item will always be the same path with the last part left off. i.e, if the path to this view is foo/bar/baz, the parent path would be foo/bar.'), + ); + + $form['tab_options'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#tree' => TRUE, + ); + $form['tab_options']['type'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#title' => t('Parent menu item'), + '#type' => 'radios', + '#options' => array('none' => t('Already exists'), 'normal' => t('Normal menu item'), 'tab' => t('Menu tab')), + '#default_value' => $tab_options['type'], + ); + $form['tab_options']['title'] = array( + '#prefix' => '
    ', + '#title' => t('Title'), + '#type' => 'textfield', + '#default_value' => $tab_options['title'], + '#description' => t('If creating a parent menu item, enter the title of the item.'), + '#process' => array('views_process_dependency'), + '#dependency' => array('radio:tab_options[type]' => array('normal', 'tab')), + ); + $form['tab_options']['description'] = array( + '#title' => t('Description'), + '#type' => 'textfield', + '#default_value' => $tab_options['description'], + '#description' => t('If creating a parent menu item, enter the description of the item.'), + '#process' => array('views_process_dependency'), + '#dependency' => array('radio:tab_options[type]' => array('normal', 'tab')), + ); + $form['tab_options']['weight'] = array( + '#suffix' => '
    ', + '#title' => t('Tab weight'), + '#type' => 'textfield', + '#default_value' => $tab_options['weight'], + '#size' => 5, + '#description' => t('If the parent menu item is a tab, enter the weight of the tab. The lower the number, the more to the left it will be.'), + '#process' => array('views_process_dependency'), + '#dependency' => array('radio:tab_options[type]' => array('tab')), + ); + break; + } + } + + function options_validate(&$form, &$form_state) { + // It is very important to call the parent function here: + parent::options_validate($form, $form_state); + switch ($form_state['section']) { + case 'path': + if (strpos($form_state['values']['path'], '$arg') !== FALSE) { + form_error($form['path'], t('"$arg" is no longer supported. Use % instead.')); + } + + if (strpos($form_state['values']['path'], '%') === 0) { + form_error($form['path'], t('"%" may not be used for the first segment of a path.')); + } + + // automatically remove '/' from path. + $form_state['values']['path'] = trim($form_state['values']['path'], '/'); + + break; + case 'menu': + $path = $this->get_option('path'); + if ($form_state['values']['menu']['type'] == 'normal' && strpos($path, '%') !== FALSE) { + form_error($form['menu']['type'], t('Views cannot create normal menu items for paths with a % in them.')); + } + + if ($form_state['values']['menu']['type'] == 'default tab' || $form_state['values']['menu']['type'] == 'tab') { + $bits = explode('/', $path); + $last = array_pop($bits); + if ($last == '%') { + form_error($form['menu']['type'], t('A display whose path ends with a % cannot be a tab.')); + } + } + + if ($form_state['values']['menu']['type'] != 'none' && empty($form_state['values']['menu']['title'])) { + form_error($form['menu']['title'], t('Title is required for this menu type.')); + } + break; + } + } + + function options_submit(&$form, &$form_state) { + // It is very important to call the parent function here: + parent::options_submit($form, $form_state); + switch ($form_state['section']) { + case 'path': + $this->set_option('path', $form_state['values']['path']); + break; + case 'menu': + $this->set_option('menu', $form_state['values']['menu']); + // send ajax form to options page if we use it. + if ($form_state['values']['menu']['type'] == 'default tab') { + views_ui_add_form_to_stack('display', $this->view, $this->display->id, array('tab_options')); + } + break; + case 'tab_options': + $this->set_option('tab_options', $form_state['values']['tab_options']); + break; + } + } + + function validate() { + $errors = parent::validate(); + + $menu = $this->get_option('menu'); + if (!empty($menu['type']) && $menu['type'] != 'none' && empty($menu['title'])) { + $errors[] = t('Display @display is set to use a menu but the menu title is not set.', array('@display' => $this->display->display_title)); + } + + if ($menu['type'] == 'default tab') { + $tab_options = $this->get_option('tab_options'); + if (!empty($tab_options['type']) && $tab_options['type'] != 'none' && empty($tab_options['title'])) { + $errors[] = t('Display @display is set to use a parent menu but the parent menu title is not set.', array('@display' => $this->display->display_title)); + } + } + + return $errors; + } +} diff --git a/plugins/views_plugin_row.inc b/plugins/views_plugin_row.inc new file mode 100644 index 0000000000000000000000000000000000000000..f7560c2e731cacb774716b947fa875171eb4ab3d --- /dev/null +++ b/plugins/views_plugin_row.inc @@ -0,0 +1,140 @@ +view = &$view; + $this->display = &$display; + + // Overlay incoming options on top of defaults + $this->unpack_options($this->options, isset($options) ? $options : $display->handler->get_option('row_options')); + } + + function uses_fields() { + return !empty($this->definition['uses fields']); + } + + + function option_definition() { + $options = parent::option_definition(); + if (isset($this->base_table)) { + $options['relationship'] = array('default' => 'none'); + } + + return $options; + } + + /** + * Provide a form for setting options. + */ + function options_form(&$form, &$form_state) { + if (isset($this->base_table)) { + $view = &$form_state['view']; + + // A whole bunch of code to figure out what relationships are valid for + // this item. + $relationships = $view->display_handler->get_option('relationships'); + $relationship_options = array(); + + foreach ($relationships as $relationship) { + $relationship_handler = views_get_handler($relationship['table'], $relationship['field'], 'relationship'); + + // If this relationship is valid for this type, add it to the list. + $data = views_fetch_data($relationship['table']); + $base = $data[$relationship['field']]['relationship']['base']; + if ($base == $this->base_table) { + $relationship_handler->init($view, $relationship); + $relationship_options[$relationship['id']] = $relationship_handler->label(); + } + } + + if (!empty($relationship_options)) { + $relationship_options = array_merge(array('none' => t('Do not use a relationship')), $relationship_options); + $rel = empty($this->options['relationship']) ? 'none' : $this->options['relationship']; + if (empty($relationship_options[$rel])) { + // Pick the first relationship. + $rel = key($relationship_options); + } + + $form['relationship'] = array( + '#type' => 'select', + '#title' => t('Relationship'), + '#options' => $relationship_options, + '#default_value' => $rel, + ); + } + else { + $form['relationship'] = array( + '#type' => 'value', + '#value' => 'none', + ); + } + } + } + + /** + * Validate the options form. + */ + function options_validate($form, &$form_state) { } + + /** + * Perform any necessary changes to the form values prior to storage. + * There is no need for this function to actually store the data. + */ + function options_submit($form, &$form_state) { } + + function query() { + if (isset($this->base_table) && isset($this->options['relationship']) && isset($this->view->relationship[$this->options['relationship']])) { + $relationship = $this->view->relationship[$this->options['relationship']]; + $this->field_alias = $this->view->query->add_field($relationship->alias, $this->base_field); + } + else { + $this->field_alias = $this->view->base_field; + } + } + + /** + * Allow the style to do stuff before each row is rendered. + * + * @param $result + * The full array of results from the query. + */ + function pre_render($result) { } + + /** + * Render a row object. This usually passes through to a theme template + * of some form, but not always. + */ + function render($row) { + return theme($this->theme_functions(), $this->view, $this->options, $row, $this->field_alias); + } +} + +/** + * @} + */ + diff --git a/plugins/views_plugin_row_fields.inc b/plugins/views_plugin_row_fields.inc new file mode 100644 index 0000000000000000000000000000000000000000..b496ab7bd8b522da5a3f2d4c45ae85467d47ea82 --- /dev/null +++ b/plugins/views_plugin_row_fields.inc @@ -0,0 +1,71 @@ + array()); + $options['separator'] = array('default' => ''); + $options['hide_empty'] = array('default' => FALSE); + return $options; + } + + /** + * Provide a form for setting options. + */ + function options_form(&$form, &$form_state) { + $options = array(); + foreach ($this->display->handler->get_handlers('field') as $field => $handler) { + $options[$field] = $handler->ui_name(); + } + + if (empty($this->options['inline'])) { + $this->options['inline'] = array(); + } + + $form['inline'] = array( + '#type' => 'checkboxes', + '#title' => t('Inline fields'), + '#options' => $options, + '#default_value' => $this->options['inline'], + '#description' => t('Inline fields will be displayed next to each other rather than one after another.'), + ); + + $form['separator'] = array( + '#title' => t('Separator'), + '#type' => 'textfield', + '#size' => 10, + '#default_value' => isset($this->options['separator']) ? $this->options['separator'] : '', + '#description' => t('The separator may be placed between inline fields to keep them from squishing up next to each other. You can use HTML in this field.'), + ); + + $form['hide_empty'] = array( + '#type' => 'checkbox', + '#title' => t('Hide empty fields'), + '#default_value' => $this->options['hide_empty'], + '#description' => t('Do not display fields, labels or markup for fields that are empty.'), + ); + } + + /** + * Perform any necessary changes to the form values prior to storage. + * There is no need for this function to actually store the data. + */ + function options_submit($form, &$form_state) { + $form_state['values']['row_options']['inline'] = array_filter($form_state['values']['row_options']['inline']); + } +} + diff --git a/plugins/views_plugin_style.inc b/plugins/views_plugin_style.inc new file mode 100644 index 0000000000000000000000000000000000000000..17d6a089e6a3f7ee172299d04cf4b5852654c8cd --- /dev/null +++ b/plugins/views_plugin_style.inc @@ -0,0 +1,235 @@ +view = &$view; + $this->display = &$display; + + // Overlay incoming options on top of defaults + $this->unpack_options($this->options, isset($options) ? $options : $display->handler->get_option('style_options')); + + if ($this->uses_row_plugin() && $display->handler->get_option('row_plugin')) { + $this->row_plugin = $display->handler->get_plugin('row'); + } + + $this->options += array( + 'grouping' => '', + ); + + $this->definition += array( + 'uses grouping' => TRUE, + ); + } + + function destroy() { + parent::destroy(); + + if (isset($this->row_plugin)) { + $this->row_plugin->destroy(); + } + } + + /** + * Return TRUE if this style also uses a row plugin. + */ + function uses_row_plugin() { + return !empty($this->definition['uses row plugin']); + } + + /** + * Return TRUE if this style also uses fields. + */ + function uses_fields() { + // If we use a row plugin, ask the row plugin. Chances are, we don't + // care, it does. + if ($this->uses_row_plugin() && !empty($this->row_plugin)) { + return $this->row_plugin->uses_fields(); + } + // Otherwise, maybe we do. + return !empty($this->definition['uses fields']); + } + + function option_definition() { + $options = parent::option_definition(); + $options['grouping'] = array('default' => ''); + return $options; + } + + function options_form(&$form, &$form_state) { + // Only fields-based views can handle grouping. Style plugins can also exclude + // themselves from being groupable by setting their "use grouping" definiton + // key to FALSE. + // @TODO: Document "uses grouping" in docs.php when docs.php is written. + if ($this->uses_fields() && $this->definition['uses grouping']) { + $options = array('' => t('')); + foreach ($this->display->handler->get_handlers('field') as $field => $handler) { + + if ($label = $handler->label()) { + $options[$field] = $label; + } + else { + $options[$field] = $handler->ui_name(); + } + } + + // If there are no fields, we can't group on them. + if (count($options) > 1) { + $form['grouping'] = array( + '#type' => 'select', + '#title' => t('Grouping field'), + '#options' => $options, + '#default_value' => $this->options['grouping'], + '#description' => t('You may optionally specify a field by which to group the records. Leave blank to not group.'), + ); + } + } + } + + /** + * Called by the view builder to see if this style handler wants to + * interfere with the sorts. If so it should build; if it returns + * any non-TRUE value, normal sorting will NOT be added to the query. + */ + function build_sort() { return TRUE; } + + /** + * Called by the view builder to let the style build a second set of + * sorts that will come after any other sorts in the view. + */ + function build_sort_post() { } + + /** + * Allow the style to do stuff before each row is rendered. + * + * @param $result + * The full array of results from the query. + */ + function pre_render($result) { + if (!empty($this->row_plugin)) { + $this->row_plugin->pre_render($result); + } + } + + /** + * Render the display in this style. + */ + function render() { + if ($this->uses_row_plugin() && empty($this->row_plugin)) { + vpr('views_plugin_style_default: Missing row plugin'); + return; + } + + // Group the rows according to the grouping field, if specified. + $sets = $this->render_grouping($this->view->result, $this->options['grouping']); + + // Render each group separately and concatenate. Plugins may override this + // method if they wish some other way of handling grouping. + $output = ''; + $this->view->row_index = 0; + foreach ($sets as $title => $records) { + if ($this->uses_row_plugin()) { + $rows = array(); + foreach ($records as $label => $row) { + $rows[] = $this->row_plugin->render($row); + $this->view->row_index++; + } + } + else { + $rows = $records; + } + + $output .= theme($this->theme_functions(), $this->view, $this->options, $rows, $title); + } + unset($this->view->row_index); + return $output; + } + + /** + * Group records as needed for rendering. + * + * @param $records + * An array of records from the view to group. + * @param $grouping_field + * The field id on which to group. If empty, the result set will be given + * a single group with an empty string as a label. + * @return + * The grouped record set. + */ + function render_grouping($records, $grouping_field = '') { + $sets = array(); + if ($grouping_field) { + $this->view->row_index = 0; + foreach ($records as $row) { + $grouping = ''; + // Group on the rendered version of the field, not the raw. That way, + // we can control any special formatting of the grouping field through + // the admin or theme layer or anywhere else we'd like. + if (isset($this->view->field[$grouping_field])) { + $grouping = $this->view->field[$grouping_field]->theme($row); + $this->view->row_index++; + if ($this->view->field[$grouping_field]->options['label']) { + $grouping = $this->view->field[$grouping_field]->options['label'] . ': ' . $grouping; + } + } + $sets[$grouping][] = $row; + } + unset($this->view->row_index); + } + else { + // Create a single group with an empty grouping field. + $sets[''] = $records; + } + return $sets; + } + + function validate() { + $errors = parent::validate(); + + if ($this->uses_row_plugin()) { + $plugin = $this->display->handler->get_plugin('row'); + if (empty($plugin)) { + $errors[] = t('Style @style requires a row style but the row plugin is invalid.', array('@style' => $this->definition['title'])); + } + } + return $errors; + } + + function query() { + parent::query(); + if (isset($this->row_plugin)) { + $this->row_plugin->query(); + } + } +} + +/** + * @} + */ + diff --git a/plugins/views_plugin_style_default.inc b/plugins/views_plugin_style_default.inc new file mode 100644 index 0000000000000000000000000000000000000000..e2e8c94c9a016fffdaae527ff9b17a5934cb94e0 --- /dev/null +++ b/plugins/views_plugin_style_default.inc @@ -0,0 +1,25 @@ + '4'); + $options['alignment'] = array('default' => 'horizontal'); + + return $options; + } + + /** + * Render the given style. + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['columns'] = array( + '#type' => 'textfield', + '#title' => t('Number of columns'), + '#default_value' => $this->options['columns'], + ); + $form['alignment'] = array( + '#type' => 'radios', + '#title' => t('Alignment'), + '#options' => array('horizontal' => t('Horizontal'), 'vertical' => t('Vertical')), + '#default_value' => $this->options['alignment'], + '#description' => t('Horizontal alignment will place items starting in the upper left and moving right. Vertical alignment will place items starting in the upper left and moving down.'), + ); + } +} + diff --git a/plugins/views_plugin_style_list.inc b/plugins/views_plugin_style_list.inc new file mode 100644 index 0000000000000000000000000000000000000000..7b257852b90154355871d254e979ef7f6057885a --- /dev/null +++ b/plugins/views_plugin_style_list.inc @@ -0,0 +1,38 @@ + 'ul'); + + return $options; + } + + /** + * Render the given style. + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['type'] = array( + '#type' => 'radios', + '#title' => t('List type'), + '#options' => array('ul' => t('Unordered list'), 'ol' => t('Ordered list')), + '#default_value' => $this->options['type'], + ); + } +} + diff --git a/plugins/views_plugin_style_rss.inc b/plugins/views_plugin_style_rss.inc new file mode 100644 index 0000000000000000000000000000000000000000..7fd1b1bdc5680fc09ce60073a2b5f31a32913bdb --- /dev/null +++ b/plugins/views_plugin_style_rss.inc @@ -0,0 +1,104 @@ +view->display[$display_id]->handler; + $url_options = array(); + $input = $this->view->get_exposed_input(); + if ($input) { + $url_options['query'] = $input; + } + + $url = url($this->view->get_url(NULL, $path), $url_options); + if ($display->has_path()) { + if (empty($this->preview)) { + drupal_add_feed($url, $title); + } + } + else { + if (empty($this->view->feed_icon)) { + $this->view->feed_icon = ''; + } + + $this->view->feed_icon .= theme('feed_icon', $url, $title); + drupal_add_link(array( + 'rel' => 'alternate', + 'type' => 'application/rss+xml', + 'title' => $title, + 'href' => $url + )); + } + } + + function option_definition() { + $options = parent::option_definition(); + + $options['description'] = array('default' => '', 'translatable' => TRUE); + $options['mission_description'] = array('default' => '', 'translatable' => TRUE); + + return $options; + } + + function options_form(&$form, &$form_state) { + $form['mission_description'] = array( + '#type' => 'checkbox', + '#default_value' => !empty($this->options['mission_description']), + '#title' => t('Use the site mission for the description'), + ); + $form['description'] = array( + '#type' => 'textfield', + '#title' => t('RSS description'), + '#default_value' => $this->options['description'], + '#description' => t('This will appear in the RSS feed itself.'), + '#process' => array('views_process_dependency'), + '#dependency' => array('edit-style-options-override' => array(FALSE)), + ); + } + + /** + * Return an array of additional XHTML elements to add to the channel. + * + * @return + * An array that can be passed to format_xml_elements(). + */ + function get_channel_elements() { + return array(); + } + + function render() { + if (empty($this->row_plugin)) { + vpr('views_plugin_style_default: Missing row plugin'); + return; + } + $rows = ''; + + // This will be filled in by the row plugin and is used later on in the + // theming output. + $this->namespaces = array(); + + // Fetch any additional elements for the channel and merge in their + // namespaces. + $this->channel_elements = $this->get_channel_elements(); + foreach ($this->channel_elements as $element) { + if (isset($element['namespace'])) { + $this->namespaces = array_merge($this->namespaces, $element['namespace']); + } + } + + foreach ($this->view->result as $row) { + $rows .= $this->row_plugin->render($row); + } + + return theme($this->theme_functions(), $this->view, $this->options, $rows); + } +} diff --git a/plugins/views_plugin_style_summary.inc b/plugins/views_plugin_style_summary.inc new file mode 100644 index 0000000000000000000000000000000000000000..1e4289038139594be9476a7a89b74dbc7d284cb3 --- /dev/null +++ b/plugins/views_plugin_style_summary.inc @@ -0,0 +1,59 @@ + TRUE); + $options['override'] = array('default' => FALSE); + $options['items_per_page'] = array('default' => 25); + + return $options; + } + + function query() { + if (!empty($this->options['override'])) { + $this->view->set_items_per_page(intval($this->options['items_per_page'])); + } + } + + function options_form(&$form, &$form_state) { + $form['count'] = array( + '#type' => 'checkbox', + '#default_value' => !empty($this->options['count']), + '#title' => t('Display record count with link'), + ); + $form['override'] = array( + '#type' => 'checkbox', + '#default_value' => !empty($this->options['override']), + '#title' => t('Override number of items to display'), + ); + $form['items_per_page'] = array( + '#type' => 'textfield', + '#title' => t('Items to display'), + '#default_value' => $this->options['items_per_page'], + '#process' => array('views_process_dependency'), + '#dependency' => array('edit-style-options-override' => array(TRUE)), + ); + } + + function render() { + $rows = array(); + foreach ($this->view->result as $row) { + // @todo: Include separator as an option. + $rows[] = $row; + } + return theme($this->theme_functions(), $this->view, $this->options, $rows); + } +} + diff --git a/plugins/views_plugin_style_summary_unformatted.inc b/plugins/views_plugin_style_summary_unformatted.inc new file mode 100644 index 0000000000000000000000000000000000000000..965e9a05a205d477cd0e72ca5dfe3e3036fa54e7 --- /dev/null +++ b/plugins/views_plugin_style_summary_unformatted.inc @@ -0,0 +1,35 @@ + FALSE); + $options['separator'] = array('default' => ''); + return $options; + } + + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $form['inline'] = array( + '#type' => 'checkbox', + '#default_value' => !empty($this->options['inline']), + '#title' => t('Display items inline'), + ); + $form['separator'] = array( + '#type' => 'textfield', + '#title' => t('Separator'), + '#default_value' => $this->options['separator'], + ); + } +} + diff --git a/plugins/views_plugin_style_table.inc b/plugins/views_plugin_style_table.inc new file mode 100644 index 0000000000000000000000000000000000000000..40cb5ae286febbf958fdc5519d7ad6f36b9a593f --- /dev/null +++ b/plugins/views_plugin_style_table.inc @@ -0,0 +1,254 @@ + array()); + $options['default'] = array('default' => ''); + $options['info'] = array('default' => array()); + $options['override'] = array('default' => TRUE); + $options['sticky'] = array('default' => FALSE); + $options['order'] = array('default' => 'asc'); + + return $options; + } + + /** + * Determine if we should provide sorting based upon $_GET inputs. + */ + function build_sort() { + if (!isset($_GET['order']) && $this->options['default'] == -1) { + return TRUE; + } + + // If a sort we don't know anything about gets through, exit gracefully. + if (isset($_GET['order']) && empty($this->view->field[$_GET['order']])) { + return TRUE; + } + + // Let the builder know whether or not we're overriding the default sorts. + return empty($this->options['override']); + } + + /** + * Add our actual sort criteria + */ + function build_sort_post() { + if (!isset($_GET['order'])) { + // check for a 'default' clicksort. If there isn't one, exit gracefully. + if (empty($this->options['default'])) { + return; + } + $sort = $this->options['default']; + $this->order = !empty($this->options['order']) ? $this->options['order'] : 'asc'; + } + else { + $sort = $_GET['order']; + // Store the $order for later use. + $this->order = !empty($_GET['sort']) ? strtolower($_GET['sort']) : 'asc'; + } + + // If a sort we don't know anything about gets through, exit gracefully. + if (empty($this->view->field[$sort])) { + return; + } + + // Ensure $this->order is valid. + if ($this->order != 'asc' && $this->order != 'desc') { + $this->order = 'asc'; + } + + // Store the $sort for later use. + $this->active = $sort; + + // Tell the field to click sort. + $this->view->field[$sort]->click_sort($this->order); + } + + /** + * Normalize a list of columns based upon the fields that are + * available. This compares the fields stored in the style handler + * to the list of fields actually in the view, removing fields that + * have been removed and adding new fields in their own column. + * + * - Each field must be in a column. + * - Each column must be based upon a field, and that field + * is somewhere in the column. + * - Any fields not currently represented must be added. + * - Columns must be re-ordered to match the fields. + * + * @param $columns + * An array of all fields; the key is the id of the field and the + * value is the id of the column the field should be in. + * @param $fields + * The fields to use for the columns. If not provided, they will + * be requested from the current display. The running render should + * send the fields through, as they may be different than what the + * display has listed due to access control or other changes. + */ + function sanitize_columns($columns, $fields = NULL) { + $sanitized = array(); + if ($fields === NULL) { + $fields = $this->display->handler->get_option('fields'); + } + + // Preconfigure the sanitized array so that the order is retained. + foreach ($fields as $field => $info) { + // Set to itself so that if it isn't touched, it gets column + // status automatically. + $sanitized[$field] = $field; + } + + foreach ($columns as $field => $column) { + // first, make sure the field still exists. + if (!isset($sanitized[$field])) { + continue; + } + + // If the field is the column, mark it so, or the column + // it's set to is a column, that's ok + if ($field == $column || $columns[$column] == $column && !empty($sanitized[$column])) { + $sanitized[$field] = $column; + } + // Since we set the field to itself initially, ignoring + // the condition is ok; the field will get its column + // status back. + } + + return $sanitized; + } + + /** + * Render the given style. + */ + function options_form(&$form, &$form_state) { + parent::options_form($form, $form_state); + $handlers = $this->display->handler->get_handlers('field'); + if (empty($handlers)) { + $form['error_markup'] = array( + '#value' => t('You need at least one field before you can configure your table settings'), + '#prefix' => '
    ', + '#suffix' => '
    ', + ); + return; + } + + $form['override'] = array( + '#type' => 'checkbox', + '#title' => t('Override normal sorting if click sorting is used'), + '#default_value' => !empty($this->options['override']), + ); + + $form['sticky'] = array( + '#type' => 'checkbox', + '#title' => t('Enable Drupal style "sticky" table headers (Javascript)'), + '#default_value' => !empty($this->options['sticky']), + '#description' => t('(Sticky header effects will not be active for preview below, only on live output.)'), + ); + + $form['order'] = array( + '#type' => 'select', + '#title' => t('Default sort order'), + '#options' => array('asc' => t('Ascending'), 'desc' => t('Descending')), + '#default_value' => $this->options['order'], + '#description' => t('If a default sort order is selected, what order should it use by default.'), + ); + + // Note: views UI registers this theme handler on our behalf. Your module + // will have to register your theme handlers if you do stuff like this. + $form['#theme'] = 'views_ui_style_plugin_table'; + + $columns = $this->sanitize_columns($this->options['columns']); + + // Create an array of allowed columns from the data we know: + foreach ($handlers as $field => $handler) { + if ($label = $handler->label()) { + $field_names[$field] = $label; + } + else { + $field_names[$field] = $handler->ui_name(); + } + } + + if (isset($this->options['default'])) { + $default = $this->options['default']; + if (!isset($columns[$default])) { + $default = -1; + } + } + else { + $default = -1; + } + + foreach ($columns as $field => $column) { + $safe = str_replace(array('][', '_', ' '), '-', $field); + // the $id of the column for dependency checking. + $id = 'edit-style-options-columns-' . $safe; + + $form['columns'][$field] = array( + '#type' => 'select', + '#options' => $field_names, + '#default_value' => $column, + ); + if ($handlers[$field]->click_sortable()) { + $form['info'][$field]['sortable'] = array( + '#type' => 'checkbox', + '#default_value' => !empty($this->options['info'][$field]['sortable']), + '#process' => array('views_process_dependency'), + '#dependency' => array($id => array($field)), + ); + // Provide an ID so we can have such things. + $radio_id = form_clean_id('edit-default-' . $field); + $form['default'][$field] = array( + '#type' => 'radio', + '#return_value' => $field, + '#parents' => array('style_options', 'default'), + '#id' => $radio_id, + // because 'radio' doesn't fully support '#id' =( + '#attributes' => array('id' => $radio_id), + '#default_value' => $default, + '#process' => array('views_process_dependency'), + '#dependency' => array($id => array($field)), + ); + } + $form['info'][$field]['separator'] = array( + '#type' => 'textfield', + '#size' => 10, + '#default_value' => isset($this->options['info'][$field]['separator']) ? $this->options['info'][$field]['separator'] : '', + '#process' => array('views_process_dependency'), + '#dependency' => array($id => array($field)), + ); + + // markup for the field name + $form['info'][$field]['name'] = array( + '#value' => $field_names[$field], + ); + } + + // Provide a radio for no default sort + $form['default'][-1] = array( + '#type' => 'radio', + '#return_value' => -1, + '#parents' => array('style_options', 'default'), + '#id' => 'edit-default-0', + '#default_value' => $default, + ); + + $form['description_markup'] = array( + '#prefix' => '
    ', + '#suffix' => '
    ', + '#value' => t('Place fields into columns; you may combine multiple fields into the same column. If you do, the separator in the column specified will be used to separate the fields. Check the sortable box to make that column click sortable, and check the default sort radio to determine which column will be sorted by default, if any. You may control column order and field labels in the fields section.'), + ); + } +} diff --git a/theme/theme.inc b/theme/theme.inc new file mode 100644 index 0000000000000000000000000000000000000000..8ff329294f3b59e60ce9529dd5bcbcf4ef502ac5 --- /dev/null +++ b/theme/theme.inc @@ -0,0 +1,699 @@ +name . '__' . $display->id; + $themes[] = $hook . '__' . $display->id; + $themes[] = $hook . '__' . preg_replace('/[^a-z0-9]/', '-', strtolower($view->tag)); + if ($display->id != $display->display_plugin) { + $themes[] = $hook . '__' . $view->name . '__' . $display->display_plugin; + $themes[] = $hook . '__' . $display->display_plugin; + } + } + $themes[] = $hook . '__' . $view->name; + $themes[] = $hook; + return $themes; +} + +/** + * Preprocess the primary theme implementation for a view. + */ +function template_preprocess_views_view(&$vars) { + global $base_path; + + $view = $vars['view']; + + $vars['rows'] = !empty($view->result) || !empty($view->style_plugin->definition['even empty']) ? $view->style_plugin->render($view->result) : ''; + + $vars['css_name'] = views_css_safe($view->name); + $vars['name'] = $view->name; + $vars['display_id'] = $view->current_display; + + if (!$vars['rows']) { + $vars['empty'] = $view->display_handler->render_empty(); + if (!$view->display_handler->get_option('header_empty')) { + $vars['header'] = ''; + } + if (!$view->display_handler->get_option('footer_empty')) { + $vars['footer'] = ''; + } + } + else { + $vars['empty'] = ''; + $header = TRUE; + } + + $vars['exposed'] = !empty($view->exposed_widgets) ? $view->exposed_widgets : ''; + if (!isset($vars['header'])) { + $vars['header'] = $view->display_handler->render_header(); + } + if (!isset($vars['footer'])) { + $vars['footer'] = $view->display_handler->render_footer(); + } + $vars['more'] = $view->display_handler->render_more_link(); + $vars['feed_icon'] = !empty($view->feed_icon) ? $view->feed_icon : ''; + + $vars['attachment_before'] = !empty($view->attachment_before) ? $view->attachment_before : ''; + $vars['attachment_after'] = !empty($view->attachment_after) ? $view->attachment_after : ''; + + $vars['pager'] = ''; + + $exposed_input = isset($view->exposed_data_raw) ? $view->exposed_data_raw : NULL; + if (!empty($view->pager['use_pager'])) { + $pager_type = ($view->pager['use_pager'] === 'mini' ? 'views_mini_pager' : 'pager'); + $pager_theme = views_theme_functions($pager_type, $view, $view->display_handler->display); + $vars['pager'] = theme($pager_theme, $exposed_input, $view->pager['items_per_page'], $view->pager['element']); + } + + // if administrator, add some links. These used to be tabs, but this is better. + if (user_access('administer views') && module_exists('views_ui') && empty($view->hide_admin_links) && !variable_get('views_no_hover_links', FALSE)) { + $vars['admin_links_raw'] = array( + array( + 'title' => t('Edit'), + 'alt' => t("Edit this view"), + 'href' => "admin/build/views/edit/$view->name", + 'fragment' => 'views-tab-' . $view->current_display, + 'query' => drupal_get_destination(), + ), + array( + 'title' => t('Export'), + 'alt' => t("Export this view"), + 'href' => "admin/build/views/export/$view->name", + ), + array( + 'title' => t('Clone'), + 'alt' => t("Create a copy of this view"), + 'href' => "admin/build/views/clone/$view->name", + ), + ); + + drupal_alter('views_admin_links', $vars['admin_links_raw'], $view); + $vars['admin_links'] = theme('links', $vars['admin_links_raw']); + } + else { + $vars['admin_links'] = ''; + $vars['admin_links_raw'] = array(); + } + views_add_css('views'); + + // Our JavaScript needs to have some means to find the HTML belonging to this + // view. + // + // It is true that the DIV wrapper has classes denoting the name of the view + // and its display ID, but this is not enough to unequivocally match a view + // with its HTML, because one view may appear several times on the page. So + // we set up a running counter, $dom_id, to issue a "unique" identifier for + // each view. This identifier is written to both Drupal.settings and the DIV + // wrapper. + static $dom_id = 1; + $vars['dom_id'] = !empty($view->dom_id) ? $view->dom_id : $dom_id++; + + // If using AJAX, send identifying data about this view. + if ($view->use_ajax) { + $settings = array( + 'views' => array( + 'ajax_path' => url('views/ajax'), + 'ajaxViews' => array( + array( + 'view_name' => $view->name, + 'view_display_id' => $view->current_display, + 'view_args' => implode('/', $view->args), + 'view_path' => $_GET['q'], + // Pass through URL to ensure we get e.g. language prefixes. +// 'view_base_path' => isset($view->display['page']) ? substr(url($view->display['page']->display_options['path']), strlen($base_path)) : '', + 'view_base_path' => $view->get_path(), + 'view_dom_id' => $vars['dom_id'], + // To fit multiple views on a page, the programmer may have + // overridden the display's pager_element. + 'pager_element' => $view->pager['element'], + ), + ), + ), + ); + + drupal_add_js($settings, 'setting'); + views_add_js('ajax_view'); + } +} + +/** + * Preprocess theme function to print a single record from a row, with fields + */ +function template_preprocess_views_view_fields(&$vars) { + $view = $vars['view']; + + // Loop through the fields for this view. + $inline = FALSE; + $vars['fields'] = array(); // ensure it's at least an empty array. + foreach ($view->field as $id => $field) { + // render this even if set to exclude so it can be used elsewhere. + $field_output = $view->field[$id]->theme($vars['row']); + $empty = $field_output !== 0 && empty($field_output); + if (empty($field->options['exclude']) && (!$empty || empty($field->options['hide_empty']))) { + $object = new stdClass(); + + $object->content = $field_output; + if (isset($view->field[$id]->field_alias) && isset($vars['row']->{$view->field[$id]->field_alias})) { + $object->raw = $vars['row']->{$view->field[$id]->field_alias}; + } + else { + $object->raw = NULL; // make sure it exists to reduce NOTICE + } + $object->inline = !empty($vars['options']['inline'][$id]); + $object->inline_html = $object->inline ? 'span' : 'div'; + if (!empty($vars['options']['separator']) && $inline && $object->inline && $object->content) { + $object->separator = filter_xss_admin($vars['options']['separator']); + } + + $inline = $object->inline; + + $object->handler = &$view->field[$id]; + $object->element_type = $object->handler->element_type(); + + $object->class = views_css_safe($id); + $object->label = check_plain($view->field[$id]->label()); + $vars['fields'][$id] = $object; + } + } + +} + +/** + * Display a single views field. + * + * Interesting bits of info: + * $field->field_alias says what the raw value in $row will be. Reach it like + * this: @code { $row->{$field->field_alias} @endcode + */ +function theme_views_view_field($view, $field, $row) { + return $field->advanced_render($row); +} + +/** + * Process a single field within a view. + * + * This preprocess function isn't normally run, as a function is used by + * default, for performance. However, by creating a template, this + * preprocess should get picked up. + */ +function template_preprocess_views_view_field(&$vars) { + $vars['output'] = $vars['field']->advanced_render($vars['row']); +} + +/** + * Preprocess theme function to print a single record from a row, with fields + */ +function template_preprocess_views_view_summary(&$vars) { + $view = $vars['view']; + $argument = $view->argument[$view->build_info['summary_level']]; + + $url_options = array(); + + if (!empty($view->exposed_raw_input)) { + $url_options['query'] = $view->exposed_raw_input; + } + foreach ($vars['rows'] as $id => $row) { + $vars['rows'][$id]->link = $argument->summary_name($row); + $args = $view->args; + $args[$argument->position] = $argument->summary_argument($row); + + $vars['rows'][$id]->url = url($view->get_url($args), $url_options); + $vars['rows'][$id]->count = intval($row->{$argument->count_alias}); + } +} + +/** + * Template preprocess theme function to print summary basically + * unformatted. + */ +function template_preprocess_views_view_summary_unformatted(&$vars) { + $view = $vars['view']; + $argument = $view->argument[$view->build_info['summary_level']]; + + $url_options = array(); + + if (!empty($view->exposed_raw_input)) { + $url_options['query'] = $view->exposed_raw_input; + } + + $count = 0; + foreach ($vars['rows'] as $id => $row) { + // only false on first time: + if ($count++) { + $vars['rows'][$id]->separator = filter_xss_admin($vars['options']['separator']); + } + $vars['rows'][$id]->link = $argument->summary_name($row); + $args = $view->args; + $args[$argument->position] = $argument->summary_argument($row); + + $vars['rows'][$id]->url = url($view->get_url($args), $url_options); + $vars['rows'][$id]->count = intval($row->{$argument->count_alias}); + } +} + +/** + * Display a view as a table style. + */ +function template_preprocess_views_view_table(&$vars) { + $view = $vars['view']; + + // We need the raw data for this grouping, which is passed in as $vars['rows']. + // However, the template also needs to use for the rendered fields. We + // therefore swap the raw data out to a new variable and reset $vars['rows'] + // so that it can get rebuilt. + // Store rows so that they may be used by further preprocess functions. + $result = $vars['result'] = $vars['rows']; + $vars['rows'] = array(); + + $options = $view->style_plugin->options; + $handler = $view->style_plugin; + + $fields = &$view->field; + $columns = $handler->sanitize_columns($options['columns'], $fields); + + $active = !empty($handler->active) ? $handler->active : ''; + $order = !empty($handler->order) ? $handler->order : 'asc'; + + $query = tablesort_get_querystring(); + if ($query) { + $query = '&' . $query; + } + + // Fields must be rendered in order as of Views 2.3, so we will pre-render + // everything. + $renders = array(); + $view->row_index = 0; + $keys = array_keys($view->field); + foreach ($result as $count => $row) { + foreach ($keys as $id) { + $renders[$count][$id] = $view->field[$id]->theme($row); + } + $view->row_index = $count; + } + unset($view->row_index); + + foreach ($columns as $field => $column) { + // render the header labels + if ($field == $column && empty($fields[$field]->options['exclude'])) { + $label = check_plain(!empty($fields[$field]) ? $fields[$field]->label() : ''); + if (empty($options['info'][$field]['sortable']) || !$fields[$field]->click_sortable()) { + $vars['header'][$field] = $label; + } + else { + // @todo -- make this a setting + $initial = 'asc'; + + if ($active == $field && $order == 'asc') { + $initial = 'desc'; + } + + $title = t('sort by @s', array('@s' => $label)); + if ($active == $field) { + $label .= theme('tablesort_indicator', $initial); + } + $link_options = array( + 'html' => true, + 'attributes' => array('title' => $title), + 'query' => 'order=' . urlencode($field) . '&sort=' . $initial . $query, + ); + $vars['header'][$field] = l($label, $_GET['q'], $link_options); + } + } + + // Create a second variable so we can easily find what fields we have and what the + // CSS classes should be. + $vars['fields'][$field] = views_css_safe($field); + if ($active == $field) { + $vars['fields'][$field] .= ' active'; + } + + // Render each field into its appropriate column. + foreach ($result as $num => $row) { + if (!empty($fields[$field]) && empty($fields[$field]->options['exclude'])) { + $field_output = $renders[$num][$field]; + + if (!isset($vars['rows'][$num][$column])) { + $vars['rows'][$num][$column] = ''; + } + + // Don't bother with separators and stuff if the field does not show up. + if ($field_output === '') { + continue; + } + + // Place the field into the column, along with an optional separator. + if ($vars['rows'][$num][$column] !== '') { + if (!empty($options['info'][$column]['separator'])) { + $vars['rows'][$num][$column] .= filter_xss_admin($options['info'][$column]['separator']); + } + } + + $vars['rows'][$num][$column] .= $field_output; + } + } + } + + foreach ($vars['rows'] as $num => $row) { + $vars['row_classes'][$num][] = ($num % 2 == 0) ? 'odd' : 'even'; + } + + $vars['row_classes'][0][] = 'views-row-first'; + $vars['row_classes'][count($vars['row_classes']) - 1][] = 'views-row-last'; + + $vars['class'] = 'views-table'; + if (!empty($options['sticky'])) { + drupal_add_js('misc/tableheader.js'); + $vars['class'] .= " sticky-enabled"; + } +} + +/** + * Display a view as a grid style. + */ +function template_preprocess_views_view_grid(&$vars) { + $view = $vars['view']; + $result = $view->result; + $options = $view->style_plugin->options; + $handler = $view->style_plugin; + + $columns = $options['columns']; + + $rows = array(); + + if ($options['alignment'] == 'horizontal') { + $row = array(); + $row_count = 0; + foreach ($vars['rows'] as $count => $item) { + $row[] = $item; + $row_count++; + if (($count + 1) % $columns == 0) { + $rows[] = $row; + $row = array(); + $row_count = 0; + } + } + if ($row) { + // Fill up the last line. + for ($i = 0; $i < ($columns - $row_count); $i++) { + $row[] = ''; + } + $rows[] = $row; + } + } + else { + $num_rows = floor(count($vars['rows']) / $columns); + // The remainders are the 'odd' columns that are slightly longer. + $remainders = count($vars['rows']) % $columns; + $row = 0; + $col = 0; + foreach ($vars['rows'] as $count => $item) { + $rows[$row][$col] = $item; + $row++; + + if (!$remainders && $row == $num_rows) { + $row = 0; + $col++; + } + else if ($remainders && $row == $num_rows + 1) { + $row = 0; + $col++; + $remainders--; + } + } + for ($i = 0; $i < count($rows[0]); $i++) { + // This should be string so that's okay :) + if (!isset($rows[count($rows) - 1][$i])) { + $rows[count($rows) - 1][$i] = ''; + } + } + } + $vars['rows'] = $rows; +} + +/** + * Display the simple view of rows one after another + */ +function template_preprocess_views_view_unformatted(&$vars) { + $view = $vars['view']; + $rows = $vars['rows']; + + $vars['classes'] = array(); + // Set up striping values. + foreach ($rows as $id => $row) { + $vars['classes'][$id] = 'views-row'; + $vars['classes'][$id] .= ' views-row-' . ($id + 1); + $vars['classes'][$id] .= ' views-row-' . ($id % 2 ? 'even' : 'odd'); + if ($id == 0) { + $vars['classes'][$id] .= ' views-row-first'; + } + } + $vars['classes'][$id] .= ' views-row-last'; +} + +/** + * Display the view as an HTML list element + */ +function template_preprocess_views_view_list(&$vars) { + template_preprocess_views_view_unformatted($vars); +} + +/** + * Preprocess an RSS feed + */ +function template_preprocess_views_view_rss(&$vars) { + global $base_url; + global $language; + + $view = &$vars['view']; + $options = &$vars['options']; + $items = &$vars['rows']; + + $style = &$view->style_plugin; + + if (!empty($options['mission_description'])) { + $description = variable_get('site_mission', ''); + } + else { + $description = $options['description']; + } + // The RSS 2.0 "spec" doesn't indicate HTML can be used in the description. + // We strip all HTML tags, but need to prevent double encoding from properly + // escaped source data (such as & becoming &amp;). + $vars['description'] = check_plain(decode_entities(strip_tags($description))); + + if ($view->display_handler->get_option('sitename_title')) { + $title = variable_get('site_name', 'Drupal'); + if ($slogan = variable_get('site_slogan', '')) { + $title .= ' - ' . $slogan; + } + } + else { + $title = $view->get_title(); + } + $vars['title'] = check_plain($title); + + // Figure out which display which has a path we're using for this feed. If there isn't + // one, use the global $base_url + $link_display_id = $view->display_handler->get_link_display(); + if ($link_display_id && !empty($view->display[$link_display_id])) { + $path = $view->display[$link_display_id]->handler->get_path(); + } + + if ($path) { + $path = $view->get_url(NULL, $path); + $url_options = array('absolute' => TRUE); + if (!empty($view->exposed_raw_input)) { + $url_options['query'] = $view->exposed_raw_input; + } + + // Compare the link to the default home page; if it's the default home page, just use $base_url. + if ($path == variable_get('site_frontpage', 'node')) { + $path = ''; + } + + $vars['link'] = check_url(url($path, $url_options)); + } + + $vars['langcode'] = check_plain($language->language); + $vars['namespaces'] = drupal_attributes($style->namespaces); + $vars['items'] = $items; + $vars['channel_elements'] = format_xml_elements($style->channel_elements); + + drupal_set_header('Content-Type: application/rss+xml; charset=utf-8'); +} + +/** + * Default theme function for all RSS rows. + */ +function template_preprocess_views_view_row_rss(&$vars) { + $view = &$vars['view']; + $options = &$vars['options']; + $item = &$vars['row']; + + $vars['title'] = check_plain($item->title); + $vars['link'] = check_url($item->link); + $vars['description'] = check_plain($item->description); + $vars['item_elements'] = empty($item->elements) ? '' : format_xml_elements($item->elements); +} + +/** + * Default theme function for all filter forms. + */ +function template_preprocess_views_exposed_form(&$vars) { + views_add_css('views'); + $form = &$vars['form']; + + // Put all single checkboxes together in the last spot. + $checkboxes = ''; + + if (!empty($form['q'])) { + $vars['q'] = drupal_render($form['q']); + } + + $vars['widgets'] = array(); + foreach ($form['#info'] as $id => $info) { + // Set aside checkboxes. + if (isset($form[$info['value']]['#type']) && $form[$info['value']]['#type'] == 'checkbox') { + $checkboxes .= drupal_render($form[$info['value']]); + continue; + } + $widget = new stdClass; + // set up defaults so that there's always something there. + $widget->label = $widget->operator = $widget->widget = NULL; + + if (!empty($info['label'])) { + $widget->label = $info['label']; + } + if (!empty($info['operator'])) { + $widget->operator = drupal_render($form[$info['operator']]); + } + $widget->widget = drupal_render($form[$info['value']]); + $vars['widgets'][$id] = $widget; + } + + // Wrap up all the checkboxes we set aside into a widget. + if ($checkboxes) { + $widget = new stdClass; + // set up defaults so that there's always something there. + $widget->label = $widget->operator = $widget->widget = NULL; + $widget->widget = $checkboxes; + $vars['widgets']['checkboxes'] = $widget; + } + + // Don't render these: + unset($form['form_id']); + unset($form['form_build_id']); + unset($form['form_token']); + + // This includes the submit button. + $vars['button'] = drupal_render($form); +} + +function theme_views_mini_pager($tags = array(), $limit = 10, $element = 0, $parameters = array(), $quantity = 9) { + global $pager_page_array, $pager_total; + + // Calculate various markers within this pager piece: + // Middle is used to "center" pages around the current page. + $pager_middle = ceil($quantity / 2); + // current is the page we are currently paged to + $pager_current = $pager_page_array[$element] + 1; + // max is the maximum page number + $pager_max = $pager_total[$element]; + // End of marker calculations. + + + $li_previous = theme('pager_previous', (isset($tags[1]) ? $tags[1] : t('‹‹')), $limit, $element, 1, $parameters); + if (empty($li_previous)) { + $li_previous = " "; + } + + $li_next = theme('pager_next', (isset($tags[3]) ? $tags[3] : t('››')), $limit, $element, 1, $parameters); + if (empty($li_next)) { + $li_next = " "; + } + + if ($pager_total[$element] > 1) { + $items[] = array( + 'class' => 'pager-previous', + 'data' => $li_previous, + ); + + $items[] = array( + 'class' => 'pager-current', + 'data' => t('@current of @max', array('@current' => $pager_current, '@max' => $pager_max)), + ); + + $items[] = array( + 'class' => 'pager-next', + 'data' => $li_next, + ); + return theme('item_list', $items, NULL, 'ul', array('class' => 'pager')); + } +} + +/** + * @defgroup views_templates Views' template files + * @{ + * All views templates can be overridden with a variety of names, using + * the view, the display ID of the view, the display type of the view, + * or some combination thereof. + * + * For each view, there will be a minimum of two templates used. The first + * is used for all views: views-view.tpl.php. + * + * The second template is determined by the style selected for the view. Note + * that certain aspects of the view can also change which style is used; for + * example, arguments which provide a summary view might change the style to + * one of the special summary styles. + * + * The default style for all views is views-view-unformatted.tpl.php + * + * Many styles will then farm out the actual display of each row to a row + * style; the default row style is views-view-fields.tpl.php. + * + * Here is an example of all the templates that will be tried in the following + * case: + * + * View, named foobar. Style: unformatted. Row style: Fields. Display: Page. + * + * - views-view--foobar--page.tpl.php + * - views-view--page.tpl.php + * - views-view--foobar.tpl.php + * - views-view.tpl.php + * + * - views-view-unformatted--foobar--page.tpl.php + * - views-view-unformatted--page.tpl.php + * - views-view-unformatted--foobar.tpl.php + * - views-view-unformatted.tpl.php + * + * - views-view-fields--foobar--page.tpl.php + * - views-view-fields--page.tpl.php + * - views-view-fields--foobar.tpl.php + * - views-view-fields.tpl.php + * + * Important! When adding a new template to your theme, be sure to flush the + * theme registry cache! + * + * @see _views_theme_functions + * @} + */ diff --git a/theme/views-exposed-form.tpl.php b/theme/views-exposed-form.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..cb9f9e0eea9f0974871e6129aa6c0c1da84abb38 --- /dev/null +++ b/theme/views-exposed-form.tpl.php @@ -0,0 +1,48 @@ +label: The visible label to print. May be optional. + * - $widget->operator: The operator for the widget. May be optional. + * - $widget->widget: The widget itself. + * - $button: The submit button for the form. + * + * @ingroup views_templates + */ +?> + + + +
    +
    + $widget): ?> +
    + label)): ?> + + + operator)): ?> +
    + operator; ?> +
    + +
    + widget; ?> +
    +
    + +
    + +
    +
    +
    \ No newline at end of file diff --git a/theme/views-more.tpl.php b/theme/views-more.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..104fd322d55816edb740199ab383edf13b8a3d82 --- /dev/null +++ b/theme/views-more.tpl.php @@ -0,0 +1,17 @@ + + + diff --git a/theme/views-ui-edit-item.tpl.php b/theme/views-ui-edit-item.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..2fbefc389421a8b69812cd7c1bfbc11ff4eb02f2 --- /dev/null +++ b/theme/views-ui-edit-item.tpl.php @@ -0,0 +1,46 @@ + + + +
    + + +
    + +
    + +
    + +
    + + $field): ?> + + + +
    + + +
    + + +
    diff --git a/theme/views-ui-edit-tab.tpl.php b/theme/views-ui-edit-tab.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..4a203da641d07d787e6c07fd161b6122d9d3c235 --- /dev/null +++ b/theme/views-ui-edit-tab.tpl.php @@ -0,0 +1,96 @@ + +
    + + +
    + +
    +
    + + + + + + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    + +
    +
    +
    + + + $category): ?> +
    +
    + +
    +
    + +
    + +
    + +
    +
    + +
    +
    + + +
    +
    +
    + +
    +
    + +
    + +
    + +
    + +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    \ No newline at end of file diff --git a/theme/views-ui-edit-view.tpl.php b/theme/views-ui-edit-view.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..f9d8debab0fdf8217ef113db4fc2e65c5f096707 --- /dev/null +++ b/theme/views-ui-edit-view.tpl.php @@ -0,0 +1,46 @@ + +
    + +
    + break this lock.', array('!user' => $locked, '!age' => $lock_age, '!break' => $break)); ?> +
    + +
    "> + vid)): ?> +
    + +
    + + + @base.', + array('%name' => $view->name, '@base' => $base_table)); ?> +
    + + + +
    +
    + +
    +
    + + +
    +
    + + + +

    +
    + +
    +
    diff --git a/theme/views-ui-list-views.tpl.php b/theme/views-ui-list-views.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..461fff6798a9b269afab87301efe02734c99b89a --- /dev/null +++ b/theme/views-ui-list-views.tpl.php @@ -0,0 +1,42 @@ + +

    + + + + + + + + + + + + + +
    + + @type @base view: @view', array('@type' => $view->type, '@view' => $view->name, '@base' => $view->base)); ?> + tag)): ?> +  (tag; ?>) + + ops ?>
    + title): ?> + $view->title)); ?>
    + + path): ?> + $view->path)); ?>
    + + displays): ?> + displays; ?>
    + +
    + description; ?> +
    + diff --git a/theme/views-view-field.tpl.php b/theme/views-view-field.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..0e1846f436fd4116283c1c354fdd2270d222eb1f --- /dev/null +++ b/theme/views-view-field.tpl.php @@ -0,0 +1,23 @@ +{$field->field_alias} + * + * The above will guarantee that you'll always get the correct data, + * regardless of any changes in the aliasing that might happen if + * the view is modified. + */ +?> + \ No newline at end of file diff --git a/theme/views-view-fields.tpl.php b/theme/views-view-fields.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..056d5629b160d7220f08c52c49b24ff79ae6cb3a --- /dev/null +++ b/theme/views-view-fields.tpl.php @@ -0,0 +1,39 @@ +content: The output of the field. + * - $field->raw: The raw data for the field, if it exists. This is NOT output safe. + * - $field->class: The safe class id to use. + * - $field->handler: The Views field handler object controlling this field. Do not use + * var_export to dump this object, as it can't handle the recursion. + * - $field->inline: Whether or not the field should be inline. + * - $field->inline_html: either div or span based on the above flag. + * - $field->separator: an optional separator that may appear before a field. + * - $row: The raw result object from the query, with all data it fetched. + * + * @ingroup views_templates + */ +?> + $field): ?> + separator)): ?> + separator; ?> + + + <inline_html;?> class="views-field-class; ?>"> + label): ?> + + + element_type is either SPAN or DIV depending upon whether or not + // the field is a 'block' element type or 'inline' element type. + ?> + <element_type; ?> class="field-content">content; ?>element_type; ?>> + inline_html;?>> + diff --git a/theme/views-view-grid.tpl.php b/theme/views-view-grid.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..6e14750bebe63c94675c3231f4da2ca13914ced9 --- /dev/null +++ b/theme/views-view-grid.tpl.php @@ -0,0 +1,37 @@ + + +

    + + + + $columns): ?> + + + $item): ?> + + + + + +
    + +
    diff --git a/theme/views-view-list.tpl.php b/theme/views-view-list.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..067c511c0b077c114a42205ab34a452675917590 --- /dev/null +++ b/theme/views-view-list.tpl.php @@ -0,0 +1,21 @@ + +
    + +

    + + <> + $row): ?> +
  • + + > +
    \ No newline at end of file diff --git a/theme/views-view-row-comment.tpl.php b/theme/views-view-row-comment.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..fc52b057b3cdd7eb39e6091233f65bd64a7faf7c --- /dev/null +++ b/theme/views-view-row-comment.tpl.php @@ -0,0 +1,18 @@ + + \ No newline at end of file diff --git a/theme/views-view-row-node.tpl.php b/theme/views-view-row-node.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..9afae690aa9fc022fc48a33a26bd80fa92b68af6 --- /dev/null +++ b/theme/views-view-row-node.tpl.php @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/theme/views-view-row-rss.tpl.php b/theme/views-view-row-rss.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..8e963b2c3d224ed5cea33467f9e564899028460b --- /dev/null +++ b/theme/views-view-row-rss.tpl.php @@ -0,0 +1,15 @@ + + + <?php print $title; ?> + + + + diff --git a/theme/views-view-rss.tpl.php b/theme/views-view-rss.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..90128e3800e9ae196303be44892d345e15db115d --- /dev/null +++ b/theme/views-view-rss.tpl.php @@ -0,0 +1,20 @@ + + version="1.0" encoding="utf-8" "; ?> +> + + <?php print $title; ?> + + + + + + + \ No newline at end of file diff --git a/theme/views-view-summary-unformatted.tpl.php b/theme/views-view-summary-unformatted.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..c53d88addd54dea0b1d8b2e6ba03ca800afbdb7e --- /dev/null +++ b/theme/views-view-summary-unformatted.tpl.php @@ -0,0 +1,20 @@ + + + '; ?> + separator)) { print $row->separator; } ?> + link; ?> + + (count; ?>) + + ' : '
    '; ?> + diff --git a/theme/views-view-summary.tpl.php b/theme/views-view-summary.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..7984dcf0f62f6d2efb846d9bed59cc1bfb37e4db --- /dev/null +++ b/theme/views-view-summary.tpl.php @@ -0,0 +1,20 @@ + +
    + +
    diff --git a/theme/views-view-table.tpl.php b/theme/views-view-table.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..8a622b789eeceb18d801e4df5ce664d18f2b4948 --- /dev/null +++ b/theme/views-view-table.tpl.php @@ -0,0 +1,42 @@ + + + + + + + + $label): ?> + + + + + + $row): ?> + + $content): ?> + + + + + +
    + +
    + +
    diff --git a/theme/views-view-unformatted.tpl.php b/theme/views-view-unformatted.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..08ff9c034cbc209449950bf25df3670840293cf6 --- /dev/null +++ b/theme/views-view-unformatted.tpl.php @@ -0,0 +1,17 @@ + + +

    + + $row): ?> +
    + +
    + diff --git a/theme/views-view.tpl.php b/theme/views-view.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..6b5b956fca1bcaa69414b71579b56cffb671dd1e --- /dev/null +++ b/theme/views-view.tpl.php @@ -0,0 +1,83 @@ + +
    + + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + +
    + +
    + + + + + + + +
    + +
    + + + + + + + + + + + +
    + +
    + + +
    diff --git a/translations/de.po b/translations/de.po new file mode 100644 index 0000000000000000000000000000000000000000..881a5aad3162baab146f93895c841abb31376dd2 --- /dev/null +++ b/translations/de.po @@ -0,0 +1,4439 @@ +# LANGUAGE translation of Drupal (general) +# Copyright YEAR NAME +# Generated from files: +# views.module,v 1.141 2006/06/25 18:24:56 merlinofchaos +# views_ui.module,v 1.28 2006/06/25 18:24:56 merlinofchaos +# views_user.inc,v 1.7 2006/06/25 18:24:56 merlinofchaos +# views_comment.inc,v 1.3 2006/06/23 22:12:23 merlinofchaos +# views_node.inc,v 1.16 2006/06/25 18:24:56 merlinofchaos +# views_upload.inc,v 1.1 2006/06/24 01:41:53 merlinofchaos +# views_rss.module,v 1.3 2006/06/25 01:57:28 merlinofchaos +# views_theme_wizard.module,v 1.2 2006/07/12 23:21:04 merlinofchaos +# views.install,v 1.21 2006/07/24 22:44:27 merlinofchaos +# +msgid "" +msgstr "" +"Project-Id-Version: German translation for views module\n" +"POT-Creation-Date: 2008-11-06 21:18+0100\n" +"PO-Revision-Date: 2008-12-01 01:16+0100\n" +"Last-Translator: Alexander Haß\n" +"Language-Team: Alexander Hass\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-SourceCharset: utf-8\n" + +#: views.module:629 +msgid "Broken handler @table.@field" +msgstr "Beschädigte Behandlungsroutine @table.@field" + +#: views.module:747 +msgid "Skipping broken view @view" +msgstr "Beschädigte Ansicht @view wurde übersprungen" + +#: views.module:794;834 +#: includes/admin.inc:98;216;216;621 +msgid "Overridden" +msgstr "Übersteuert" + +#: views.module:797;830 +#: views_ui.module:289 +#: includes/admin.inc:97;215;215;588;766 +msgid "Default" +msgstr "Standard" + +#: views.module:935 +#: includes/admin.inc:295 +#: views_export/views_export.module:116 +msgid "Apply" +msgstr "Anwenden" + +#: views.module:151 +#: views_ui.module:26 +#: views.info:0;0 +#: views_ui.info:0 +#: views_export/views_export.info:0 +msgid "Views" +msgstr "Ansichten" + +#: views.module:155 +msgid "Ajax callback for view loading." +msgstr "Ajax-Rückfrage für das Laden der Ansicht." + +#: views.module:0 +msgid "views" +msgstr "Ansichten" + +#: views_ui.module:159 +msgid "The converter will make a best-effort attempt to convert a Views 1 view to Views 2. This conversion is not reliable; you will very likely have to make adjustments to your view to get it to match. You can import Views 1 views through the normal Import tab." +msgstr "Der Konverter wird mit größter Mühe versuchen einen „View 1“ nach „View 2“ zu konvertieren. Diese Konvertierung ist nicht zuverlässig und es müssen sicherlich Anpassungen an der Ansicht vorgenommen werden, um den alten Stand wiederherzustellen. „View 1“-Ansichten können über den normalen Import-Reiter importiert werden." + +#: views_ui.module:265 +msgid "Changes cannot be made to a locked view." +msgstr "An einer gesperrten Ansicht können keine Änderungen vorgenommen werden." + +#: views_ui.module:28 +msgid "Views are customized lists of content on your system; they are highly configurable and give you control over how lists of content are presented." +msgstr "Ansichten sind benutzerdefinierte Listen von Inhalt in dem System. Diese sind hochgradig Konfigurierbar und ermöglichen die Kontrolle, wie Listen von Inhalten präsentiert werden." + +#: views_ui.module:32 +#: includes/plugins.inc:135 +msgid "List" +msgstr "Alle anzeigen" + +#: views_ui.module:38 +#: includes/admin.inc:1178;1178;2165 +msgid "Add" +msgstr "Hinzufügen" + +#: views_ui.module:43 +#: includes/admin.inc:724 +msgid "Import" +msgstr "Importieren" + +#: views_ui.module:49 +msgid "Tools" +msgstr "Werkzeuge" + +#: views_ui.module:55 +msgid "Basic" +msgstr "Basis" + +#: views_ui.module:63 +#: includes/convert.inc:30 +msgid "Convert" +msgstr "Konvertieren" + +#: views_ui.module:64 +msgid "Convert stored Views 1 views." +msgstr "Konvertiere gespeicherte Views 1 Ansichten." + +#: views_ui.module:70;83;88 +msgid "Delete view" +msgstr "Ansicht löschen" + +#: views_ui.module:76 +msgid "Convert view" +msgstr "Ansicht konvertieren" + +#: views_ui.module:113 +#: includes/admin.inc:93 +#: theme/theme.inc:89 +msgid "Edit" +msgstr "Bearbeiten" + +#: views_ui.module:0 +msgid "views_ui" +msgstr "views_ui" + +#: views.install:31 +msgid "Stores the general data for a view." +msgstr "Speichert die allgemeinen Daten für eine Ansicht." + +#: views.install:37 +msgid "The view ID of the field, defined by the database." +msgstr "Die von der Datenbank festgelegte Ansichts-ID für das Feld." + +#: views.install:45 +msgid "The unique name of the view. This is the primary field views are loaded from, and is used so that views may be internal and not necessarily in the database. May only be alphanumeric characters plus underscores." +msgstr "Der eindeutige Name der Ansicht. Dies ist das primäre Feld aus dem Ansichten geladen werden und wird verwendet, damit Ansichten intern sind und sich nicht notwendigerweise in der Datenbank befinden müssen." + +#: views.install:51 +msgid "A description of the view for the admin interface." +msgstr "Eine Beschreibung der Ansicht für die Verwaltungsoberfläche." + +#: views.install:57 +msgid "A tag used to group/sort views in the admin interface" +msgstr "Eine Kennzeichnung die verwendet wird, um Ansichten in der Verwaltungsoberfläche zu gruppieren/sortieren." + +#: views.install:61 +msgid "A chunk of PHP code that can be used to provide modifications to the view prior to building." +msgstr "Ein Stück von PHP-Code das verwendet werden kann, um Änderungen an einer Ansicht vor dem Aufbau vorzunehmen." + +#: views.install:68 +msgid "What table this view is based on, such as node, user, comment, or term." +msgstr "Auf welcher Tabelle diese Ansicht basiert, wie etwa Beitrag, Benutzer, Kommentar oder Begriff." + +#: views.install:74 +msgid "A boolean to indicate whether or not this view may have its query cached." +msgstr "Ein boolscher Wert der angibt, ob die Abfrage dieser Ansicht gecached wird oder nicht." + +#: views.install:82 +msgid "Stores information about each display attached to a view." +msgstr "Speichert Informationen über jede Anzeige, die mit einer Ansicht verbunden ist." + +#: views.install:89 +msgid "The view this display is attached to." +msgstr "Die Ansicht mit der diese Anzeige verbunden ist." + +#: views.install:97 +msgid "An identifier for this display; usually generated from the display_plugin, so should be something like page or page_1 or block_2, etc." +msgstr "Ein Bezeichner für die Anzeige. Normalerweise wird dieser vom display_plugin generiert und sollte so ähnlich wie page, page_1 oder page_2, usw. lauten." + +#: views.install:104 +msgid "The title of the display, viewable by the administrator." +msgstr "Der für einen Administrator sichtbare Titel der Anzeige." + +#: views.install:111 +msgid "The type of the display. Usually page, block or embed, but is pluggable so may be other things." +msgstr "Der Typ der Anzeige. Normalerweise eine Seite, Block oder Einbettung aber auch um andere Dinge erweiterbar." + +#: views.install:116 +msgid "The order in which this display is loaded." +msgstr "Die Reihenfolge in der die Anzeige geladen wird." + +#: views.install:120 +msgid "A serialized array of options for this display; it contains options that are generally only pertinent to that display plugin type." +msgstr "Ein serialisiertes Array von Optionen für diese Anzeige. Dies enthält Optionen die generell nur zu diesem Anzeige-Plugin-Typ gehören." + +# TODO +#: views.install:131 +msgid "A special cache used to store objects that are being edited; it serves to save state in an ordinarily stateless environment." +msgstr "Ein spezieller Cache der zum Speichern von Objekten verwendet wird, die gerade bearbeitet werden. Dieser stellt den Status " + +#: views.install:136 +msgid "The session ID this cache object belongs to." +msgstr "Die Session-ID zu der dieses Cacheobjekt gehört." + +#: views.install:141 +msgid "The name of the view this cache is attached to." +msgstr "Der Name der Ansicht mit dem dieser Cache verbunden ist." + +#: views.install:146 +msgid "The name of the object this cache is attached to; this essentially represents the owner so that several sub-systems can use this cache." +msgstr "Der Name des Objekts an den dieser Cache angehängt ist. Dies repräsentiert hauptsächlich den Eigentümer, damit verschiedene andere Subsysteme diesen Cache nutzen können." + +#: views.install:153 +msgid "The time this cache was created or updated." +msgstr "Der Zeitpunkt zu dem der Cache erstellt oder aktualisiert wurde." + +#: views.install:157 +msgid "Serialized data being stored." +msgstr "Die gespeicherten serialisierten Daten." + +#: views.info:0 +msgid "Create customized lists and queries from your database." +msgstr "Benutzerdefinierte Listen und Abfragen aus der Datenbank erstellen." + +#: views_ui.info:0 +msgid "Views UI" +msgstr "Ansichten UI" + +#: views_ui.info:0 +msgid "Administrative interface to views. Without this module, you cannot create or edit your views." +msgstr "Verwaltungsoberfläche für Ansichten. Ohne dieses Modul können Ansichten weder erstellt noch bearbeitet werden." + +#: docs/docs.php:127 +msgid "Emulates the default Drupal front page; you may set the default home page path to this view to make it your front page." +msgstr "Emuliert die standardmäßige Drupal-Startseite. Der standardmäßige Pfad der Startseite kann auf diese Ansicht eingestellt werden, um diese zur Startseite zu machen." + +#: docs/docs.php:128 +msgid "default" +msgstr "Standard" + +#: docs/docs.php:137 +#: includes/plugins.inc:25 +msgid "Defaults" +msgstr "Standards" + +#: docs/docs.php:226 +#: includes/plugins.inc:39;47 +msgid "Page" +msgstr "Seite" + +#: docs/docs.php:281 +#: includes/plugins.inc:72;80 +msgid "Feed" +msgstr "Newsfeed" + +#: docs/docs.php:349 +msgid "Front page feed" +msgstr "Newsfeed der Startseite" + +#: handlers/views_handler_argument.inc:102 +#: modules/translation/views_handler_relationship_translation.inc:23 +msgid "All" +msgstr "Alle" + +#: handlers/views_handler_argument.inc:119 +#: includes/admin.inc:272;383 +#: modules/comment.views.inc:44 +#: modules/node.views.inc:85;413 +#: plugins/views_plugin_display.inc:592 +#: plugins/views_plugin_display_page.inc:285;348 +msgid "Title" +msgstr "Titel" + +#: handlers/views_handler_argument.inc:121 +msgid "The title to use when this argument is present. It will override the title of the view and titles from previous arguments. You can use percent substitution here to replace with argument titles. Use \"%1\" for the first argument, \"%2\" for the second, etc." +msgstr "Der bei diesem vorhandenen Argument zu verwendende Titel. Dies wird den Titel der Ansicht und die Titel von vorhergehenden Argumenten übersteuern. Um Titel mit Argumenten zu ersetzen, kann die prozentuale Ersetzung verwendet werden. Dabei kann für das erste Argument „%1“, für das zweite „%2“, etc. verwendet werden." + +#: handlers/views_handler_argument.inc:134 +msgid "Action to take if argument is not present" +msgstr "Die auszuführende Aktion, wenn das Argument nicht vorhanden ist" + +#: handlers/views_handler_argument.inc:146 +msgid "Wildcard" +msgstr "Platzhalter" + +#: handlers/views_handler_argument.inc:149 +msgid "If this value is received as an argument, the argument will be ignored; i.e, \"all values\"" +msgstr "Sollte dieser Wert als Argument übergeben werden, wird das Argument ignoriert z.B. „alle Werte“" + +#: handlers/views_handler_argument.inc:155 +#, fuzzy +msgid "Wildcard title" +msgstr "Platzhaltertitel" + +#: handlers/views_handler_argument.inc:158 +msgid "The title to use for the wildcard in substitutions elsewhere." +msgstr "" + +#: handlers/views_handler_argument.inc:181 +msgid "Validator options" +msgstr "Validatoroptionen" + +#: handlers/views_handler_argument.inc:186 +#, fuzzy +msgid "Validator" +msgstr "Validator" + +#: handlers/views_handler_argument.inc:190 +msgid "" +msgstr "" + +#: handlers/views_handler_argument.inc:229 +msgid "Action to take if argument does not validate" +msgstr "Die auszuführende Aktion, wenn das Argument nicht valide ist" + +#: handlers/views_handler_argument.inc:248 +msgid "Display all values" +msgstr "Alle Werte anzeigen" + +#: handlers/views_handler_argument.inc:253 +msgid "Hide view / Page not found (404)" +msgstr "Ansicht ausblenden / Seite wurde nicht gefunden (404)" + +#: handlers/views_handler_argument.inc:258 +msgid "Display empty text" +msgstr "Leerer Text anzeigen" + +#: handlers/views_handler_argument.inc:263 +msgid "Summary, sorted ascending" +msgstr "Zusammenfassung, aufsteigend sortiert" + +#: handlers/views_handler_argument.inc:270 +msgid "Summary, sorted descending" +msgstr "Zusammenfassung, absteigend sortiert" + +#: handlers/views_handler_argument.inc:277 +msgid "Provide default argument" +msgstr "Standardargument zu Verfügung stellen" + +#: handlers/views_handler_argument.inc:310 +msgid "Provide default argument options" +msgstr "Standardmäßige Argumentoptionen zur Verfügung stellen" + +#: handlers/views_handler_argument.inc:320 +msgid "Default argument type" +msgstr "Standardtyp für Argumente" + +#: handlers/views_handler_argument.inc:708 +#: handlers/views_handler_field.inc:227 +#: handlers/views_handler_filter.inc:592 +#: handlers/views_handler_relationship.inc:133 +#: handlers/views_handler_sort.inc:66 +msgid "Broken/missing handler" +msgstr "Beschädigte/fehlende Behandlungsroutine" + +#: handlers/views_handler_argument.inc:716 +#: handlers/views_handler_field.inc:235 +#: handlers/views_handler_filter.inc:600 +#: handlers/views_handler_relationship.inc:141 +#: handlers/views_handler_sort.inc:74 +msgid "The handler for this item is broken or missing and cannot be used. If a module provided the handler and was disabled, re-enabling the module may restore it. Otherwise, you should probably delete this item." +msgstr "Die Behandlungsroutine für diesen Eintrag ist beschädigt oder fehlt und kann nicht verwendet werden. Sollte ein Modul diese Behandlungsroutine zu Verfügung gestellt haben und deaktiviert worden sein, kann die Wiederaktivierung des Moduls dies korrigieren. Ansonsten sollte der Eintrag wohl gelöscht werden." + +#: handlers/views_handler_argument_date.inc:29 +msgid "Current date" +msgstr "Aktuelles Datum" + +#: handlers/views_handler_argument_date.inc:30 +msgid "Current node's creation time" +msgstr "Aktuelles Beitragserstellungsdatum" + +#: handlers/views_handler_argument_date.inc:31 +msgid "Current node's update time" +msgstr "Aktuelles Beitragsaktualisierungsdatum" + +#: handlers/views_handler_argument_many_to_one.inc:45 +#: handlers/views_handler_argument_numeric.inc:30 +msgid "Allow multiple terms per argument." +msgstr "Ermöglicht mehrere Begriffe pro Argument." + +# English string needs work "ODER-Verknüpfung" +#: handlers/views_handler_argument_many_to_one.inc:46 +#, fuzzy +msgid "If selected, users can enter multiple arguments in the form of 1+2+3 (for OR) or 1,2,3 (for AND)." +msgstr "Sobald ausgewählt, können Benutzer mehrere Argumente in Form von 1+2+3 (für ODER-Verknüpfungen) oder 1,2,3 (für UND-Verknüpfungen) angeben." + +#: handlers/views_handler_argument_many_to_one.inc:53 +#: handlers/views_handler_argument_string.inc:95 +msgid "Allow multiple arguments to work together." +msgstr "Ermöglicht die Zusammenarbeit mehrerer Argumente." + +#: handlers/views_handler_argument_many_to_one.inc:54 +#: handlers/views_handler_argument_string.inc:96 +msgid "If selected, multiple instances of this argument can work together, as though multiple terms were supplied to the same argument. This setting is not compatible with the \"Reduce duplicates\" setting." +msgstr "" + +#: handlers/views_handler_argument_many_to_one.inc:60 +#: handlers/views_handler_argument_string.inc:102 +msgid "Do not display items with no value in summary" +msgstr "Einträge ohne Wert in der Zusammenfassung nicht anzeigen" + +#: handlers/views_handler_argument_many_to_one.inc:95;109 +#: handlers/views_handler_argument_numeric.inc:45;57 +#: modules/taxonomy.views.inc:129;208;292 +msgid "Uncategorized" +msgstr "Nicht kategorisiert" + +#: handlers/views_handler_argument_many_to_one.inc:113 +#: handlers/views_handler_argument_numeric.inc:61 +msgid "Invalid input" +msgstr "Ungültige Eingabe" + +#: handlers/views_handler_argument_null.inc:21 +msgid "Fail basic validation if any argument is given" +msgstr "Die Basisvalidierung soll fehlschlagen, wenn irgendein Argument übergeben wird" + +#: handlers/views_handler_argument_null.inc:23 +msgid "By checking this field, you can use this to make sure views with more arguments than necessary fail validation." +msgstr "" + +#: handlers/views_handler_argument_numeric.inc:31 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3 or 1,2,3." +msgstr "If selected, users can enter multiple arguments in the form of 1+2+3 or 1,2,3." + +#: handlers/views_handler_argument_numeric.inc:37 +msgid "Exclude the argument" +msgstr "Argument ausschließen" + +#: handlers/views_handler_argument_numeric.inc:38 +msgid "If selected, the numbers entered in the argument will be excluded rather than limiting the view." +msgstr "Sobald ausgewählt, werden die im Argument angegebenen Zahlen ausgeschlossen und nicht zur Begrenzung der Ansicht verwendet." + +#: handlers/views_handler_argument_string.inc:44 +msgid "Glossary mode" +msgstr "" + +#: handlers/views_handler_argument_string.inc:45 +msgid "Glossary mode applies a limit to the number of characters used in the argument, which allows the summary view to act as a glossary." +msgstr "" + +#: handlers/views_handler_argument_string.inc:51 +msgid "Character limit" +msgstr "Zeichenbegrenzung" + +#: handlers/views_handler_argument_string.inc:52 +msgid "How many characters of the argument to filter against. If set to 1, all fields starting with the letter in the argument would be matched." +msgstr "" + +#: handlers/views_handler_argument_string.inc:60 +msgid "Case" +msgstr "Groß-/Kleinschreibung" + +#: handlers/views_handler_argument_string.inc:61 +msgid "When printing the argument result, how to transform the case." +msgstr "" + +#: handlers/views_handler_argument_string.inc:63;77 +msgid "No transform" +msgstr "Keine Umwandlung" + +#: handlers/views_handler_argument_string.inc:64;78 +msgid "Upper case" +msgstr "Großschreibung" + +#: handlers/views_handler_argument_string.inc:65;79 +msgid "Lower case" +msgstr "Kleinschreibung" + +#: handlers/views_handler_argument_string.inc:66;80 +msgid "Capitalize first letter" +msgstr "Ersten Buchstaben groß schreiben" + +#: handlers/views_handler_argument_string.inc:67;81 +msgid "Capitalize each word" +msgstr "Jedes Wort groß schreiben" + +#: handlers/views_handler_argument_string.inc:74 +msgid "Case in path" +msgstr "Groß-/Kleinschreibung im Pfad" + +#: handlers/views_handler_argument_string.inc:75 +msgid "When printing url paths, how to transform the of the argument. Do not use this unless with Postgres as it uses case sensitive comparisons." +msgstr "" + +#: handlers/views_handler_argument_string.inc:88 +msgid "Transform spaces to dashes in URL" +msgstr "Leerzeichen in der URL in Striche umwandeln" + +#: handlers/views_handler_field.inc:146 +#: handlers/views_handler_filter.inc:322 +#: handlers/views_handler_relationship.inc:78 +msgid "Label" +msgstr "Bezeichnung" + +#: handlers/views_handler_field.inc:148 +msgid "The label for this field that will be displayed to end users if the style requires it." +msgstr "" + +#: handlers/views_handler_field.inc:152 +msgid "Exclude from display" +msgstr "Von der Anzeige ausschließen" + +#: handlers/views_handler_field.inc:154 +msgid "Check this box to not display this field, but still load it in the view. Use this option to not show a grouping field in each record, or when doing advanced theming." +msgstr "" + +#: handlers/views_handler_field_boolean.inc:24 +msgid "Output format" +msgstr "Ausgabeformat" + +#: handlers/views_handler_field_boolean.inc:26 +msgid "Yes/No" +msgstr "Ja/Nein" + +#: handlers/views_handler_field_boolean.inc:27 +msgid "True/False" +msgstr "Wahr/Unwahr" + +#: handlers/views_handler_field_boolean.inc:28 +msgid "On/Off" +msgstr "An/Aus" + +#: handlers/views_handler_field_boolean.inc:34 +msgid "Reverse" +msgstr "Umgekehrt" + +#: handlers/views_handler_field_boolean.inc:35 +msgid "If checked, true will be displayed as false." +msgstr "Sobald aktiviert, wird „wahr“ als „unwahr“ angezeigt." + +#: handlers/views_handler_field_boolean.inc:49 +#: handlers/views_handler_filter_boolean_operator.inc:47 +#: handlers/views_handler_filter_in_operator.inc:25 +#: plugins/views_plugin_display.inc:633;642;659;667;717;803;1207 +#: plugins/views_plugin_display_attachment.inc:63;69 +msgid "Yes" +msgstr "Ja" + +#: handlers/views_handler_field_boolean.inc:49 +#: handlers/views_handler_filter_boolean_operator.inc:47 +#: handlers/views_handler_filter_in_operator.inc:25 +#: plugins/views_plugin_display.inc:633;642;659;667;717;803;811;1207 +#: plugins/views_plugin_display_attachment.inc:63;69 +msgid "No" +msgstr "Nein" + +#: handlers/views_handler_field_boolean.inc:51 +#: handlers/views_handler_filter_boolean_operator.inc:16;61 +msgid "True" +msgstr "Wahr" + +#: handlers/views_handler_field_boolean.inc:51 +#: handlers/views_handler_filter_boolean_operator.inc:61 +msgid "False" +msgstr "Unwahr" + +#: handlers/views_handler_field_boolean.inc:53 +msgid "On" +msgstr "An" + +#: handlers/views_handler_field_boolean.inc:53 +msgid "Off" +msgstr "Aus" + +#: handlers/views_handler_field_date.inc:24 +msgid "Date format" +msgstr "Datumsformat" + +#: handlers/views_handler_field_date.inc:29 +msgid "Custom" +msgstr "Benutzerdefiniert" + +#: handlers/views_handler_field_date.inc:30 +#, fuzzy +msgid "Time ago" +msgstr "Zeit vergangen" + +#: handlers/views_handler_field_date.inc:36 +msgid "Custom date format" +msgstr "Benutzerdefiniertes Datumsformat" + +# not literally +#: handlers/views_handler_field_date.inc:37 +msgid "If \"Custom\", see the PHP docs for date formats. If \"Time ago\" this is the the number of different units to display, which defaults to two." +msgstr "Für „Benutzerdefiniert“ gibt es nähere Information über Datumsformate in der PHP-Dokumentation. Bei „Zeit vergangen“ ist dies die Anzahl der unterschiedlichen Einheiten die angezeigt werden sollen, welche standardmäßig 2-stellig sind." + +#: handlers/views_handler_field_date.inc:53 +msgid "%time ago" +msgstr "vor %time" + +#: handlers/views_handler_field_numeric.inc:32 +msgid "Round" +msgstr "Runden" + +#: handlers/views_handler_field_numeric.inc:33 +msgid "If checked, the number will be rounded." +msgstr "Sobald aktiviert, wird die Zahl gerundet." + +#: handlers/views_handler_field_numeric.inc:38 +msgid "Precision" +msgstr "Genauigkeit" + +#: handlers/views_handler_field_numeric.inc:40 +msgid "Specify how many digits to print after the decimal point." +msgstr "Festlegen, wie viele Stellen nach dem Dezimalpunkt erscheinen sollen." + +#: handlers/views_handler_field_numeric.inc:47 +msgid "Decimal point" +msgstr "Dezimalpunkt" + +#: handlers/views_handler_field_numeric.inc:49 +msgid "What single character to use as a decimal point." +msgstr "Welches Symbol als Dezimalpunkt verwendet werden soll." + +#: handlers/views_handler_field_numeric.inc:55 +msgid "Thousands separator" +msgstr "Tausender-Trennzeichen" + +#: handlers/views_handler_field_numeric.inc:57 +msgid "What single character to use as the thousands separator." +msgstr "Welches Symbol als tausender Trennzeichen verwendet werden soll." + +#: handlers/views_handler_field_numeric.inc:62 +msgid "Prefix" +msgstr "Präfix" + +#: handlers/views_handler_field_numeric.inc:64 +msgid "Text to put before the number, such as currency symbol." +msgstr "Text der vor die Zahl gestellt werden soll, wie etwa ein Währungszeichen." + +#: handlers/views_handler_field_numeric.inc:68 +msgid "Suffix" +msgstr "Suffix" + +#: handlers/views_handler_field_numeric.inc:70 +msgid "Text to put after the number, such as currency symbol." +msgstr "Text der an die Zahl angehängt werden soll, wie etwa ein Währungszeichen." + +#: handlers/views_handler_field_prerender_list.inc:29 +#: modules/node/views_plugin_row_node_rss.inc:24 +msgid "Display type" +msgstr "Anzeigetyp" + +#: handlers/views_handler_field_prerender_list.inc:31 +#: plugins/views_plugin_style_list.inc:33 +msgid "Unordered list" +msgstr "Ungeordnete Liste" + +#: handlers/views_handler_field_prerender_list.inc:32 +#: plugins/views_plugin_style_list.inc:33 +msgid "Ordered list" +msgstr "Geordnete Liste" + +#: handlers/views_handler_field_prerender_list.inc:33 +msgid "Simple separator" +msgstr "Einfacher Separator" + +#: handlers/views_handler_field_prerender_list.inc:40 +#: includes/admin.inc:2974 +#: plugins/views_plugin_row_fields.inc:47 +#: plugins/views_plugin_style_summary_unformatted.inc:30 +msgid "Separator" +msgstr "Separator" + +#: handlers/views_handler_field_prerender_list.inc:48 +msgid "Empty list text" +msgstr "Leerer Listentext" + +#: handlers/views_handler_field_prerender_list.inc:50 +msgid "If the list is empty, you may enter text here that will be displayed." +msgstr "Hier kann ein Text eingegeben werden, der bei einer leeren Liste angezeigt wird." + +#: handlers/views_handler_field_url.inc:24 +#: modules/statistics/views_handler_field_accesslog_path.inc:31 +msgid "Display as link" +msgstr "Als Link anzeigen" + +#: handlers/views_handler_filter.inc:136 +msgid "Operator" +msgstr "Operator" + +#: handlers/views_handler_filter.inc:201 +msgid "Expose" +msgstr "Hervorheben" + +# TODO as they view it. +#: handlers/views_handler_filter.inc:206 +#, fuzzy +msgid "This item is currently not exposed. If you expose it, users will be able to change the filter as they view it." +msgstr "Der Eintrag ist derzeit nicht hervorgehoben. Sollte dieser hervorgehoben werden, können Benutzer den Filter ändern." + +#: handlers/views_handler_filter.inc:213 +msgid "Hide" +msgstr "Ausblenden" + +# TODO as they view it. +#: handlers/views_handler_filter.inc:218 +#, fuzzy +msgid "This item is currently exposed. If you hide it, users will not be able to change the filter as they view it." +msgstr "Dieser Eintrag ist derzeit hervorgehoben. Sollte dieser ausgeblendet werden, können Benutzer den Filter nicht ändern." + +#: handlers/views_handler_filter.inc:289 +msgid "Unlock operator" +msgstr "Operator entsperren" + +#: handlers/views_handler_filter.inc:290 +msgid "When checked, the operator will be exposed to the user" +msgstr "Sobald aktiviert, wird der Operator für den Benutzer hervorgehoben" + +#: handlers/views_handler_filter.inc:296 +msgid "Operator identifier" +msgstr "Bezeichner für Operator" + +#: handlers/views_handler_filter.inc:298 +msgid "This will appear in the URL after the ? to identify this operator." +msgstr "Dies wird in der URL nach dem ? erscheinen, um diesen Operator zu identifizieren." + +#: handlers/views_handler_filter.inc:315 +msgid "Filter identifier" +msgstr "Bezeichner für Filter" + +#: handlers/views_handler_filter.inc:317 +msgid "This will appear in the URL after the ? to identify this filter. Cannot be blank." +msgstr "Dieser wird in der URL nach dem ? erscheinen, um den Filter zu identifizieren. Darf nicht unausgefüllt bleiben." + +#: handlers/views_handler_filter.inc:333 +msgid "Optional" +msgstr "Optional" + +#: handlers/views_handler_filter.inc:334 +msgid "This exposed filter is optional and will have added options to allow it not to be set." +msgstr "Dieser hervorgehobene Filter ist optional und wird Optionen enthalten, damit dieser nicht eingestellt werden muss." + +#: handlers/views_handler_filter.inc:340 +msgid "Force single" +msgstr "Eine Option erzwingen" + +#: handlers/views_handler_filter.inc:341 +msgid "Force this exposed filter to accept only one option." +msgstr "Diesen hervorgehobenen Filter zwingen, nur eine Option zu akzeptieren." + +#: handlers/views_handler_filter.inc:347 +msgid "Remember" +msgstr "Erinnern" + +#: handlers/views_handler_filter.inc:348 +msgid "Remember the last setting the user gave this filter." +msgstr "Die letzte Filtereinstellung des Benutzers merken." + +#: handlers/views_handler_filter.inc:359 +msgid "The identifier is required if the filter is exposed." +msgstr "Der Bezeichner ist erforderlich, wenn der Filter hervorgehoben ist." + +#: handlers/views_handler_filter.inc:364 +msgid "This identifier is not allowed." +msgstr "Dieser Bezeichner ist unzulässig." + +# Beliebig, etc ? +#: handlers/views_handler_filter.inc:465 +#, fuzzy +msgid "" +msgstr "" + +# TODO: English should be uppercase +#: handlers/views_handler_filter_boolean_operator.inc:58 +#: handlers/views_handler_filter_in_operator.inc:175 +#: handlers/views_handler_filter_numeric.inc:247 +#: handlers/views_handler_filter_string.inc:111 +#, fuzzy +msgid "exposed" +msgstr "Hervorgehoben" + +#: handlers/views_handler_filter_date.inc:24 +msgid "Value type" +msgstr "Werttyp" + +#: handlers/views_handler_filter_date.inc:26 +msgid "A date in any machine readable format. CCYY-MM-DD HH:MM:SS is preferred." +msgstr "Ein Datum in einem maschinenlesbaren Format. JJJJ-MM-TT HH:MM:SS ist bevorzugt." + +#: handlers/views_handler_filter_date.inc:27 +msgid "An offset from the current time such as \"+1 day\" or \"-2 hours and 30 minutes\"" +msgstr "Ein Zeitversatz bezogen auf die aktuellen Uhrzeit, wie etwa „+1 Tag“ oder „-2 Stunden und 30 Minuten“" + +#: handlers/views_handler_filter_date.inc:77;83;87 +msgid "Invalid date format." +msgstr "Ungültiges Datumsformat." + +#: handlers/views_handler_filter_equality.inc:15 +#: handlers/views_handler_filter_numeric.inc:38 +#: handlers/views_handler_filter_string.inc:28 +msgid "Is equal to" +msgstr "Ist gleich mit" + +#: handlers/views_handler_filter_equality.inc:16 +#: handlers/views_handler_filter_numeric.inc:44 +#: handlers/views_handler_filter_string.inc:34 +msgid "Is not equal to" +msgstr "Ist ungleich zu" + +#: handlers/views_handler_filter_equality.inc:26 +#: handlers/views_handler_filter_numeric.inc:148;163 +#: handlers/views_handler_filter_string.inc:170 +msgid "Value" +msgstr "Wert" + +#: handlers/views_handler_filter_in_operator.inc:15 +msgid "Options" +msgstr "Optionen" + +#: handlers/views_handler_filter_in_operator.inc:37 +msgid "Limit list to selected items" +msgstr "Liste auf ausgewählte Einträge begrenzen" + +#: handlers/views_handler_filter_in_operator.inc:38 +msgid "If checked, the selected items presented to the user will be the only ones selected here." +msgstr "Sobald aktiviert, werden nur die hier ausgewählten Einträge dem Benutzer präsentiert." + +#: handlers/views_handler_filter_in_operator.inc:57 +#: handlers/views_handler_filter_many_to_one.inc:32 +msgid "Is one of" +msgstr "Ist eines von" + +#: handlers/views_handler_filter_in_operator.inc:58 +msgid "Is not one of" +msgstr "Ist keines von" + +#: handlers/views_handler_filter_in_operator.inc:193 +#: modules/system.views.inc:209 +#: plugins/views_plugin_access.inc:55 +msgid "Unknown" +msgstr "Unbekannt" + +#: handlers/views_handler_filter_many_to_one.inc:33 +msgid "Is all of" +msgstr "Ist alles von" + +#: handlers/views_handler_filter_many_to_one.inc:34 +msgid "Is none of" +msgstr "Ist keines von" + +#: handlers/views_handler_filter_numeric.inc:26 +msgid "Is less than" +msgstr "Ist weniger als" + +#: handlers/views_handler_filter_numeric.inc:28 +msgid "<" +msgstr "<" + +#: handlers/views_handler_filter_numeric.inc:32 +msgid "Is less than or equal to" +msgstr "Ist weniger als oder gleich" + +#: handlers/views_handler_filter_numeric.inc:34 +msgid "<=" +msgstr "<=" + +#: handlers/views_handler_filter_numeric.inc:40 +#: handlers/views_handler_filter_string.inc:29 +msgid "=" +msgstr "=" + +#: handlers/views_handler_filter_numeric.inc:46 +#: handlers/views_handler_filter_string.inc:35 +msgid "!=" +msgstr "!=" + +#: handlers/views_handler_filter_numeric.inc:50 +msgid "Is greater than or equal to" +msgstr "Ist größer als oder gleich" + +#: handlers/views_handler_filter_numeric.inc:52 +msgid ">=" +msgstr ">=" + +#: handlers/views_handler_filter_numeric.inc:56 +msgid "Is greater than" +msgstr "Ist größer als" + +#: handlers/views_handler_filter_numeric.inc:58 +msgid ">" +msgstr ">" + +#: handlers/views_handler_filter_numeric.inc:62 +msgid "Is between" +msgstr "Ist zwischen" + +#: handlers/views_handler_filter_numeric.inc:64 +msgid "between" +msgstr "zwischen" + +#: handlers/views_handler_filter_numeric.inc:68 +msgid "Is not between" +msgstr "Ist nicht zwischen" + +#: handlers/views_handler_filter_numeric.inc:70 +msgid "not between" +msgstr "nicht zwischen" + +#: handlers/views_handler_filter_numeric.inc:79 +#: handlers/views_handler_filter_string.inc:80 +msgid "Is empty (NULL)" +msgstr "Ist leer (NULL)" + +#: handlers/views_handler_filter_numeric.inc:81 +#: handlers/views_handler_filter_string.inc:82 +msgid "empty" +msgstr "leer" + +#: handlers/views_handler_filter_numeric.inc:85 +#: handlers/views_handler_filter_string.inc:86 +msgid "Is not empty (NULL)" +msgstr "Ist nicht leer (NULL)" + +#: handlers/views_handler_filter_numeric.inc:87 +#: handlers/views_handler_filter_string.inc:88 +msgid "not empty" +msgstr "nicht leer" + +#: handlers/views_handler_filter_numeric.inc:175 +msgid "Min" +msgstr "Min" + +#: handlers/views_handler_filter_numeric.inc:181 +msgid "And max" +msgstr "Und höchstens" + +#: handlers/views_handler_filter_numeric.inc:181 +msgid "And" +msgstr "und" + +#: handlers/views_handler_filter_numeric.inc:253 +msgid "@min and @max" +msgstr "@min und @max" + +#: handlers/views_handler_filter_string.inc:40 +msgid "Contains" +msgstr "Enthält" + +#: handlers/views_handler_filter_string.inc:41 +msgid "contains" +msgstr "enthält" + +#: handlers/views_handler_filter_string.inc:46 +msgid "Contains any word" +msgstr "Enthält ein beliebiges Wort" + +#: handlers/views_handler_filter_string.inc:47 +msgid "has word" +msgstr "enthält das Wort" + +#: handlers/views_handler_filter_string.inc:52 +msgid "Contains all words" +msgstr "Enthält alle Wörter" + +#: handlers/views_handler_filter_string.inc:53 +msgid "has all" +msgstr "enthält alle" + +#: handlers/views_handler_filter_string.inc:58 +msgid "Starts with" +msgstr "Beginnt mit" + +#: handlers/views_handler_filter_string.inc:59 +msgid "begins" +msgstr "beginnt" + +#: handlers/views_handler_filter_string.inc:64 +msgid "Ends with" +msgstr "Endet mit" + +#: handlers/views_handler_filter_string.inc:65 +msgid "ends" +msgstr "endet" + +#: handlers/views_handler_filter_string.inc:70 +msgid "Does not contain" +msgstr "Enthält nicht" + +#: handlers/views_handler_filter_string.inc:71 +msgid "!has" +msgstr "!has" + +#: handlers/views_handler_filter_string.inc:126 +msgid "Case sensitive" +msgstr "Groß- und Kleinschreibung berücksichtigen" + +#: handlers/views_handler_filter_string.inc:128 +msgid "Case sensitive filters may be faster. MySQL might ignore case sensitivity." +msgstr "Filter die Groß-/Kleinschreibung beachten, können schneller sein. MySQL könnte die Groß-/Kleinschreibung ignorieren." + +#: handlers/views_handler_relationship.inc:80 +msgid "The label for this relationship that will be displayed only administratively." +msgstr "Die Bezeichnung für diese Beziehung wird nur innerhalb der Verwaltung angezeigt." + +# Relationship is required +#: handlers/views_handler_relationship.inc:85 +msgid "Require this relationship" +msgstr "Beziehung ist erforderlich" + +#: handlers/views_handler_relationship.inc:86 +msgid "If required, items that do not contain this relationship will not appear." +msgstr "" + +#: handlers/views_handler_sort.inc:38 +msgid "asc" +msgstr "aufsteigend" + +#: handlers/views_handler_sort.inc:42 +msgid "desc" +msgstr "absteigend" + +#: handlers/views_handler_sort.inc:54 +msgid "Sort order" +msgstr "Sortierreihenfolge" + +#: handlers/views_handler_sort.inc:55 +#: plugins/views_plugin_style_table.inc:149 +msgid "Ascending" +msgstr "Aufsteigend" + +#: handlers/views_handler_sort.inc:55 +#: plugins/views_plugin_style_table.inc:149 +msgid "Descending" +msgstr "Absteigend" + +#: handlers/views_handler_sort_date.inc:26 +msgid "Granularity" +msgstr "Granularität" + +#: handlers/views_handler_sort_date.inc:28 +msgid "Second" +msgstr "Sekunde" + +#: handlers/views_handler_sort_date.inc:29 +msgid "Minute" +msgstr "Minute" + +#: handlers/views_handler_sort_date.inc:30 +msgid "Hour" +msgstr "Stunde" + +#: handlers/views_handler_sort_date.inc:31 +msgid "Day" +msgstr "Tag" + +#: handlers/views_handler_sort_date.inc:32 +msgid "Month" +msgstr "Monat" + +#: handlers/views_handler_sort_date.inc:33 +msgid "Year" +msgstr "Jahr" + +#: handlers/views_handler_sort_date.inc:35 +msgid "The granularity is the smallest unit to use when determining whether two dates are the same; for example, if the granularity is \"Year\" then all dates in 1999, regardless of when they fall in 1999, will be considered the same date." +msgstr "Die Granularität ist die Kleinste zu verwendende Einheit, wenn die Gleichheit zweiter Datumsangaben ermittelt werden soll. Sollte beispielsweise die Granularität das „Jahr“ sein, wird jedes Datum in 1999 ungeachtet dem Tag in 1999, als das gleiche Datum betrachtet." + +#: handlers/views_handler_sort_formula.inc:24 +msgid "views_handler_sort_formula missing default: @formula" +msgstr "Standard für views_handler_sort_formula ist nicht vorhanden: @formula" + +#: includes/admin.inc:36 +msgid "If you enable the advanced help module, Views will provide more and better help. Hide this message." +msgstr "Das Ansichten-Modul stellt durch nach Aktivieren des erweiterten Hilfemoduls eine bessere und ausführlichere Hilfe zu Verfügung. Diese Meldung ausblenden." + +#: includes/admin.inc:39 +msgid "If you install the advanced help module from !href, Views will provide more and better help. Hide this message." +msgstr "Ansichten stellt durch die Installation des erweiterten Hilfemoduls von !href eine bessere und ausführlichere Hilfe zu Verfügung. Diese Meldung ausblenden." + +#: includes/admin.inc:94;978 +#: theme/theme.inc:96 +#: views_export/views_export.module:128 +msgid "Export" +msgstr "Exportieren" + +#: includes/admin.inc:95;983 +#: theme/theme.inc:101 +msgid "Clone" +msgstr "Duplizieren" + +#: includes/admin.inc:98 +msgid "Revert" +msgstr "Zurücksetzen" + +#: includes/admin.inc:98;634;847 +#: includes/convert.inc:35;108 +msgid "Delete" +msgstr "Löschen" + +#: includes/admin.inc:103 +msgid "Disable" +msgstr "Deaktivieren" + +#: includes/admin.inc:106 +msgid "Enable" +msgstr "Aktivieren" + +#: includes/admin.inc:112 +msgid "Warning! Broken view!" +msgstr "Warnung! Beschädigte Ansicht!" + +#: includes/admin.inc:127 +#: includes/view.inc:1666 +msgid "Broken" +msgstr "Beschädigt" + +#: includes/admin.inc:189 +msgid "Install the advanced help module for the getting started" +msgstr "Für die ersten Schritte sollte das erweiterte Hilfemodul installiert werden" + +#: includes/admin.inc:192 +msgid "Not sure what to do? Try the \"!getting-started\" page." +msgstr "Nicht sicher was Sie machen sollen? Versuchen Sie die „!getting-started“-Seite aufzurufen." + +#: includes/admin.inc:206;213;2131 +msgid "" +msgstr "" + +#: includes/admin.inc:207 +#: plugins/views_plugin_style.inc:76 +msgid "" +msgstr "" + +#: includes/admin.inc:211 +msgid "Storage" +msgstr "Speicher" + +#: includes/admin.inc:214;214 +#: includes/view.inc:1165;1215 +msgid "Normal" +msgstr "Normal" + +#: includes/admin.inc:228;275 +#: modules/node.views.inc:140 +#: plugins/views_plugin_display_page.inc:273 +msgid "Type" +msgstr "Typ" + +#: includes/admin.inc:246;273;1063 +#: views_export/views_export.module:146 +#, fuzzy +msgid "Tag" +msgstr "Kennzeichnung" + +#: includes/admin.inc:262 +msgid "Displays" +msgstr "Anzeigen" + +#: includes/admin.inc:269 +msgid "Sort by" +msgstr "Sortieren nach" + +#: includes/admin.inc:271 +#: modules/system.views.inc:69 +#: modules/user.views.inc:59;79 +#: plugins/views_plugin_display.inc:580 +msgid "Name" +msgstr "Name" + +#: includes/admin.inc:274;391 +#: modules/statistics.views.inc:149 +#: modules/system.views.inc:88 +#: plugins/views_plugin_display_page.inc:202 +msgid "Path" +msgstr "Pfad" + +#: includes/admin.inc:276 +#: includes/convert.inc:21 +#: modules/upload.views.inc:56 +#: views_export/views_export.module:146 +msgid "Description" +msgstr "Beschreibung" + +#: includes/admin.inc:283 +msgid "Order" +msgstr "Reihenfolge" + +#: includes/admin.inc:285 +msgid "Up" +msgstr "nach oben" + +#: includes/admin.inc:286 +msgid "Down" +msgstr "nach unten" + +#: includes/admin.inc:370;401 +msgid "Query" +msgstr "Abfrage" + +#: includes/admin.inc:372 +msgid "These queries were run during view rendering:" +msgstr "Diese Abfragen werden während dem Rendering der Ansicht ausgeführt:" + +#: includes/admin.inc:377 +msgid "[@time ms]" +msgstr "[@time ms] " + +#: includes/admin.inc:380 +msgid "Other queries" +msgstr "Andere Abfragen" + +#: includes/admin.inc:388 +msgid "This display has no path." +msgstr "Diese Anzeige hat keinen Pfad." + +#: includes/admin.inc:393 +msgid "Query build time" +msgstr "Aufbauzeit der Abfrage" + +#: includes/admin.inc:393;394;395 +msgid "@time ms" +msgstr "@time ms" + +#: includes/admin.inc:394 +msgid "Query execute time" +msgstr "Ausführungszeit der Abfrage" + +#: includes/admin.inc:395 +msgid "View render time" +msgstr "Renderingzeit der Ansicht" + +#: includes/admin.inc:401 +#, fuzzy +msgid "No query was run" +msgstr "Es wurde keine Abfrage ausgeführt" + +#: includes/admin.inc:408 +#, fuzzy +msgid "Unable to preview due to validation errors." +msgstr "Die Vorschau kann wegen Validierungsfehlern nicht angezeigt werden." + +#: includes/admin.inc:459 +msgid "Display" +msgstr "Anzeige" + +#: includes/admin.inc:467 +#: includes/view.inc:1870 +msgid "Arguments" +msgstr "Argumente" + +#: includes/admin.inc:469 +msgid "Separate arguments with a / as though they were a URL path." +msgstr "Argumente mit einem „/“ voneinander abtrennen, als ob diese ein URL-Pfad wären." + +#: includes/admin.inc:475 +msgid "Preview" +msgstr "Vorschau" + +#: includes/admin.inc:513 +msgid "Clone view %view" +msgstr "Ansicht %view duplizieren" + +#: includes/admin.inc:526;713 +#: includes/convert.inc:20 +msgid "View name" +msgstr "Ansichtsname" + +#: includes/admin.inc:527 +msgid "This is the unique name of the view. It must contain only alphanumeric characters and underscores; it is used to identify the view internally and to generate unique theming template names for this view. If overriding a module provided view, the name must not be changed or instead a new view will be created." +msgstr "" + +#: includes/admin.inc:535;1826 +msgid "View description" +msgstr "Beschreibung anzeigen" + +#: includes/admin.inc:536;1827 +msgid "This description will appear on the Views administrative UI to tell you what the view is about." +msgstr "Diese Beschreibung erscheint auf der Verwaltungsoberfläche der Ansichten, um darüber Aufzuklären, worum es sich bei der Ansicht handelt." + +#: includes/admin.inc:542;1833 +#, fuzzy +msgid "View tag" +msgstr "Ansichten-Kennzeichnung" + +#: includes/admin.inc:543;1834 +msgid "Enter an optional tag for this view; it is used only to help sort views on the administrative page." +msgstr "Eine optionale Kennzeichnung für diese Ansicht eingeben. Diese wird auf der Verwaltungsseite nur als Sortierhilfe für Ansichten verwendet." + +#: includes/admin.inc:555 +msgid "View type" +msgstr "Ansichtstyp" + +# Können die Argumente, Felder, Sortierkriterien und Filter *oder* der Ansichtentyp nicht mehr geändert werden? +#: includes/admin.inc:556 +#, fuzzy +msgid "The view type is the primary table for which information is being retrieved. The view type controls what arguments, fields, sort criteria and filters are available, so once this is set it cannot be changed." +msgstr "Der Ansichtentyp ist die primäre Tabelle für die Information abgefragt werden. Da der Ansichtentyp die zu Verfügung stehenden Argumente, Felder, Sortierkriterien und Filter kontrolliert, können diese nicht mehr geändert werden, nachdem diese einmal eingestellt wurden." + +#: includes/admin.inc:567 +msgid "Next" +msgstr "nächste Seite" + +#: includes/admin.inc:583;758 +msgid "View name must be alphanumeric or underscores only." +msgstr "Der Name einer Ansicht darf nur aus Buchstaben und Unterstrichen bestehen." + +#: includes/admin.inc:589 +msgid "You must use a unique name for this view." +msgstr "Für die Ansicht muss ein eindeutiger Name verwendet werden." + +#: includes/admin.inc:622 +msgid "Are you sure you want to revert the view %name?" +msgstr "Soll die Ansicht %name wirklich zurückgesetzt werden?" + +#: includes/admin.inc:623 +msgid "Reverting the view will delete the view that is in the database, reverting it to the original default view. Any changes you have made will be lost and cannot be recovered." +msgstr "Eine Ansicht zurückzusetzten wird die Ansicht in der Datenbank löschen und auf die Orginalansicht zurücksetzten. Alle vorgenommenen Änderungen gehen verloren und können nicht wiederhergestellt werden." + +#: includes/admin.inc:626 +#: includes/convert.inc:105 +msgid "Are you sure you want to delete the view %name?" +msgstr "Soll die Ansicht %name wirklich gelöscht werden?" + +#: includes/admin.inc:627 +msgid "Deleting a view cannot be undone." +msgstr "Das Löschen einer Ansicht kann nicht rückgängig gemacht werden." + +#: includes/admin.inc:635;671;840;1329 +#: includes/convert.inc:109 +msgid "Cancel" +msgstr "Abbrechen" + +#: includes/admin.inc:644 +msgid "The view has been deleted." +msgstr "Die Ansicht wurde gelöscht." + +#: includes/admin.inc:656 +msgid "There is no lock on view %view to break." +msgstr "Auf der Ansicht %view gibt es keine aufzuhebende Sperre." + +#: includes/admin.inc:666 +msgid "Are you sure you want to break the lock on view %name?" +msgstr "Soll die Sperre auf der Ansicht %name wirklich aufgehoben werden?" + +#: includes/admin.inc:669 +msgid "By breaking this lock, any unsaved changes made by !user will be lost!" +msgstr "Durch Aufheben der Sperre, gehen alle ungespeicherten Änderungen von !user verloren!" + +#: includes/admin.inc:670 +msgid "Break lock" +msgstr "Sperre aufheben" + +#: includes/admin.inc:680 +msgid "The lock has been broken and you may now edit this view." +msgstr "Die Sperre wurde aufgehoben und die Ansicht kann jetzt bearbeitet werden." + +#: includes/admin.inc:687 +msgid "Edit view %view" +msgstr "Ansicht %view bearbeiten" + +#: includes/admin.inc:714 +msgid "Enter the name to use for this view if it is different from the source view. Leave blank to use the name of the view." +msgstr "Einen Namen für die Ansicht eingeben, wenn dieser anders als die ursprüngliche Ansicht ist. Freilassen, um den Namen der Ansicht zu verwenden." + +#: includes/admin.inc:719 +msgid "Paste view code here" +msgstr "Code für die Ansicht hier einfügen" + +#: includes/admin.inc:741 +msgid "Unable to interpret view code." +msgstr "Code der Ansicht konnte nicht Interpretiert werden." + +#: includes/admin.inc:749 +msgid "You are importing a view created in Views version 1. You may need to adjust some parameters to work correctly in version 2." +msgstr "Es wird eine Ansicht aus Views-Version 1 importiert. Hier müssen möglicherweise einige Parameter angepasst werden, damit diese mit Version 2 richtig zusammenarbeitet." + +#: includes/admin.inc:752 +msgid "That view is not compatible with this version of Views." +msgstr "Diese Ansicht ist inkompatibel mit dieser Ansichtenversion." + +#: includes/admin.inc:767 +msgid "A view by that name already exists; please choose a different name" +msgstr "Eine Ansicht mit diesem Namen ist schon vorhanden. Bitte einen anderen Namen wählen." + +#: includes/admin.inc:776 +msgid "Display plugin @plugin is not available." +msgstr "Das Anzeige-Plugin @plugin ist nicht verfügbar." + +#: includes/admin.inc:783 +msgid "Style plugin @plugin is not available." +msgstr "Das Design-Plugin @plugin ist nicht verfügbar." + +#: includes/admin.inc:789 +msgid "Row plugin @plugin is not available." +msgstr "Das Zeilen-Plugin @plugin ist nicht verfügbar." + +#: includes/admin.inc:799 +msgid "@type handler @table.@field is not available." +msgstr "Die @type-Behandlungsroutine @table.@field ist nicht verfügbar." + +#: includes/admin.inc:812 +msgid "Unable to import view." +msgstr "Die Ansicht konnte nicht importiert werden." + +#: includes/admin.inc:833;861 +msgid "Save" +msgstr "Speichern" + +#: includes/admin.inc:885 +msgid "The view has been saved." +msgstr "Die Ansicht wurde gespeichert." + +#: includes/admin.inc:929 +msgid "Unknown or missing table name" +msgstr "Unbekannter oder fehlender Tabellenname" + +#: includes/admin.inc:934 +msgid "Click on an item to edit that item's details." +msgstr "Einen Eintrag anklicken, um die Details zu bearbeiten." + +#: includes/admin.inc:937 +msgid "This view has a broken default display and cannot be used." +msgstr "Diese Ansicht enthält eine beschädigte Standardanzeige und kann nicht verwendet werden." + +#: includes/admin.inc:979 +#: theme/theme.inc:97 +msgid "Export this view" +msgstr "Diese Ansicht exportieren" + +#: includes/admin.inc:984 +#: theme/theme.inc:102 +msgid "Create a copy of this view" +msgstr "Eine Kopie der Ansicht erstellen" + +#: includes/admin.inc:995 +msgid "View \"!display\"" +msgstr "Ansicht „!display“" + +#: includes/admin.inc:996 +msgid "Go to the real page for this display" +msgstr "Auf die reale Seite dieser Anzeige wechseln" + +#: includes/admin.inc:1062;3008 +#: includes/plugins.inc:218 +#: plugins/views_plugin_display.inc:587;704;723 +#: plugins/views_plugin_display_attachment.inc:90 +#: plugins/views_plugin_display_block.inc:73 +#: plugins/views_plugin_display_feed.inc:108 +#: plugins/views_plugin_display_page.inc:193 +msgid "None" +msgstr "Keines" + +#: includes/admin.inc:1140 +msgid "Invalid" +msgstr "Ungültig" + +#: includes/admin.inc:1141 +msgid "Error: Display @display refers to a plugin named '@plugin', but that plugin doesn't exist!" +msgstr "Fehler: Die Anzeige @display bezieht sich auf das nicht vorhandene Plugin ‚@plugin‘!" + +#: includes/admin.inc:1176;1176 +msgid "Rearrange" +msgstr "Umsortieren" + +#: includes/admin.inc:1216;2216;2391;2459;2544 +msgid "Error: handler for @table > @field doesn't exist!" +msgstr "Fehler: Die Behandlungsroutine für @table > @field ist nicht vorhanden!" + +#: includes/admin.inc:1235;1235;1244 +msgid "Settings" +msgstr "Einstellungen" + +#: includes/admin.inc:1240 +#: plugins/views_plugin_display.inc:598;616 +msgid "Missing style plugin" +msgstr "Fehlendes Design-Plugin" + +#: includes/admin.inc:1244 +#: plugins/views_plugin_display.inc:611;626 +msgid "Change settings for this style" +msgstr "Einstellungen für dieses Design ändern" + +#: includes/admin.inc:1247 +msgid "  Style: !style" +msgstr "   Design: !style" + +# not literally +#: includes/admin.inc:1278 +msgid "Invalid display id found while regenerating tabs" +msgstr "Eine ungültige Anzeige-ID wurde bei der Neuerstellung von Reitern gefunden" + +#: includes/admin.inc:1311 +msgid "Update" +msgstr "Aktualisieren" + +#: includes/admin.inc:1329 +msgid "Ok" +msgstr "Ok" + +#: includes/admin.inc:1600 +msgid "Unable to initialize default display" +msgstr "Die Standardanzeige konnte nicht initialisiert werden." + +#: includes/admin.inc:1632 +msgid "Add display" +msgstr "Anzeige hinzufügen" + +#: includes/admin.inc:1672 +msgid "Remove display" +msgstr "Anzeige entfernen" + +#: includes/admin.inc:1683 +msgid "Restore display" +msgstr "Anzeige wiederherstellen" + +#: includes/admin.inc:1755 +msgid "Analyze" +msgstr "Analysieren" + +#: includes/admin.inc:1767 +msgid "View analysis" +msgstr "Analyse anzeigen" + +#: includes/admin.inc:1821 +msgid "View details" +msgstr "Ansichtdetails" + +#: includes/admin.inc:1862;1916;1971;2117;2209;2384;2452;2537 +msgid "Invalid display id @display" +msgstr "Ungültige Anzeige-ID @display" + +#: includes/admin.inc:1920 +msgid "Configure @type" +msgstr "@type konfigurieren" + +#: includes/admin.inc:1975 +msgid "Rearrange @type" +msgstr "@type neu anordnen" + +#: includes/admin.inc:2018 +msgid "Broken field @id" +msgstr "Beschädigtes Feld @id" + +#: includes/admin.inc:2058;2067;2300 +msgid "Remove" +msgstr "Entfernen" + +#: includes/admin.inc:2058;2058 +msgid "Remove this item" +msgstr "Dieses Element entfernen" + +#: includes/admin.inc:2064 +msgid "No fields available." +msgstr "Keine Felder verfügbar." + +#: includes/admin.inc:2067 +#: modules/book.views.inc:57 +#: modules/taxonomy.views.inc:135 +#: modules/upload.views.inc:90 +#: plugins/views_plugin_display_page.inc:312 +msgid "Weight" +msgstr "Reihenfolge" + +#: includes/admin.inc:2123 +msgid "Add @type" +msgstr "@type hinzufügen" + +#: includes/admin.inc:2134 +msgid "Groups" +msgstr "Gruppen" + +#: includes/admin.inc:2153 +msgid "!group: !field" +msgstr "!group: !field" + +#: includes/admin.inc:2162 +#, fuzzy +msgid "There are no @types available to add." +msgstr "Es stehen keine @types zum Hinzufügen zu Verfügung." + +#: includes/admin.inc:2259 +msgid "Do not use a relationship" +msgstr "Keine Beziehung verwenden" + +#: includes/admin.inc:2273 +#: includes/view.inc:1894;1895 +msgid "Relationship" +msgstr "Beziehung" + +#: includes/admin.inc:2286 +msgid "Configure @type %item" +msgstr "@type %item konfigurieren" + +#: includes/admin.inc:2399 +msgid "Configure extra settings for @type %item" +msgstr "Besondere Einstellungen für @type %item konfigurieren" + +#: includes/admin.inc:2464 +msgid "Change summary style for @type %item" +msgstr "Zusammenfassungsdesign für @type %item ändern" + +#: includes/admin.inc:2487;2501 +msgid "Internal error: broken plugin." +msgstr "Interner Fehler: beschädigtes Plugin." + +#: includes/admin.inc:2551 +msgid "Configure summary style for @type %item" +msgstr "Zusammenfassungsdesign für @type %item konfigurieren" + +#: includes/admin.inc:2643 +msgid "Clear Views' cache" +msgstr "Ansichten-Cache leeren" + +#: includes/admin.inc:2649 +msgid "Add Views signature to all SQL queries" +msgstr "Eine View-Signatur zu allen SQL-Abfragen hinzufügen" + +# TODO troubleshooting +#: includes/admin.inc:2650 +msgid "All Views-generated queries will include a special 'VIEWS' = 'VIEWS' string in the WHERE clause. This makes identifying Views queries in database server logs simpler, but should only be used when troubleshooting." +msgstr "Alle von Ansichten generierten Abfragen werden eine spezielle Zeichenkette 'VIEWS' = 'VIEWS' in der WHERE Bedingung enthalten. Dies erlaubt die einfachere Identifikation der Abfragen von Ansichten in den Datenbankprotokollen, sollte aber nur zur Fehlersuche genutzt werden." + +#: includes/admin.inc:2656 +msgid "Disable views data caching" +msgstr "Datencaching von Ansichten deaktivieren" + +#: includes/admin.inc:2657 +msgid "Views caches data about tables, modules and views available, to increase performance. By checking this box, Views will skip this cache and always rebuild this data when needed. This can have a serious performance impact on your site." +msgstr "Ansichten cached Daten über die Tabellen, Module und verfügbaren Ansichten, um die Leistung zu steigern. Durch aktivieren dieses Ankreuzfeldes wird Ansichten den Cache übergehen und die Daten bei Bedarf neu aufbauen. Dies kann erhebliche Auswirkungen auf die Leistung der Website haben." + +#: includes/admin.inc:2663 +msgid "Ignore missing advanced help module" +msgstr "Das fehlende Erweiterte-Hilfe-Modul ignorieren" + +#: includes/admin.inc:2664 +msgid "Views uses the advanced help module to provide help text; if this module is not present Views will complain, unless this setting is checked." +msgstr "Das Ansichten-Modul verwendet das Erweiterte Hilfe-Modul, um Hilfetexte zu Verfügung zu stellen. Sollte das Modul nicht vorhanden sein, wird das Ansichten-Modul solange darauf hinweisen, bis diese Einstellung aktiviert wurde. " + +#: includes/admin.inc:2670 +msgid "Show query above live preview" +msgstr "Abfrage oberhalb der Live-Vorschau anzeigen" + +#: includes/admin.inc:2671 +msgid "The live preview feature will show you the output of the view you're creating, as well as the view. Check here to show the query and other information above the view; leave this unchecked to show that information below the view." +msgstr "Die Live-Vorschau-Funktion wird die Ausgabe der erstellten Ansicht und auch die Ansicht anzeigen. Aktivieren, um die Abfrage und andere Information oberhalb der Ansicht anzuzeigen. Deaktivieren, um diese Information unterhalb der Ansicht anzuzeigen." + +#: includes/admin.inc:2677 +msgid "Show other queries run during render during live preview" +msgstr "" + +#: includes/admin.inc:2678 +msgid "Drupal has the potential to run many queries while a view is being rendered. Checking this box will display every query run during view render as part of the live preview." +msgstr "" + +# not literally +#: includes/admin.inc:2684 +msgid "Do not show hover links over views" +msgstr "Administrationslinks in den Ansichten nicht anzeigen" + +# not literally +#: includes/admin.inc:2685 +msgid "To make it easier to administrate your views, Views provides 'hover' links to take you to the edit and export screen of a view whenever the view is used. This can be distracting on some themes, though; if it is problematic, you can turn it off here." +msgstr "Um die Verwaltung der Ansichten zu erleichtern, werden Administrationslinks in den Ansichten angezeigt, mit denen man zur Bearbeiten- und Exportieren-Seite einer Ansicht gelangt. Diese können in einigen Themes stören und bei Problemen hiermit abgeschaltet werden." + +#: includes/admin.inc:2691 +msgid "Enable views performance statistics via the Devel module" +msgstr "Performancestatistiken für Ansichten mittels Devel-Modul aktivieren" + +#: includes/admin.inc:2692 +msgid "Check this to enable some Views query and performance statistics if Devel is installed." +msgstr "Aktivieren, damit Abfragen und Leistungsstatistiken der Ansicht bei installiertem Devel-Modul angezeigt werden." + +#: includes/admin.inc:2698 +msgid "Disable javascript with Views" +msgstr "JavaScript mit Ansichten deaktivieren" + +#: includes/admin.inc:2699 +msgid "If you are having problems with the javascript, you can disable it here; the Views UI should degrade and still be usable without javascript, it just not as good." +msgstr "" + +# not literally +#: includes/admin.inc:2707 +msgid "Page region to output performance statistics" +msgstr "Performancestatistiken in folgender Seitenregion ausgegeben" + +#: includes/admin.inc:2720 +msgid "The cache has been cleared." +msgstr "Der Cache wurde geleert." + +#: includes/admin.inc:2886 +msgid "Error: missing @component" +msgstr "Fehler: @component fehlt" + +#: includes/admin.inc:2972 +#: includes/view.inc:1865 +msgid "Field" +msgstr "Feld" + +#: includes/admin.inc:2973 +msgid "Column" +msgstr "Spalte" + +#: includes/admin.inc:2976 +msgid "Sortable" +msgstr "Sortierbar" + +#: includes/admin.inc:2980 +msgid "Default sort" +msgstr "Standardsortierung" + +# not literally +#: includes/ajax.inc:82 +msgid "Server reports invalid input error." +msgstr "Der Server hat eine ungültige Eingabe festgestellt." + +#: includes/ajax.inc:83 +msgid "Error" +msgstr "Fehler" + +# http://drupal.org/node/279073#comment-909822 +#: includes/analyze.inc:38 +msgid "View analysis can find nothing to report." +msgstr "Die Analyse der Ansicht kann nichts berichtenswertes finden." + +#: includes/analyze.inc:104 +msgid "This view has only a default display and therefore will not be placed anywhere on your site; perhaps you want to add a page or a block display." +msgstr "" + +#: includes/convert.inc:14 +msgid "There are no Views 1 views stored in the database to convert." +msgstr "In der Datenbank sind keine Views-1-Ansichten zum konvertieren vorhanden." + +#: includes/convert.inc:22 +msgid "Operations" +msgstr "Operationen" + +#: includes/convert.inc:33 +msgid "Converted" +msgstr "Konvertiert" + +#: includes/convert.inc:68 +msgid "The table below lists Views version 1 views that are stored in the database. You can either convert them to work in Views version 2, or delete them. The views are convertible only if there is no Views 2 view with the same name." +msgstr "" + +#: includes/convert.inc:79 +msgid "Unable to find view." +msgstr "Ansicht konnte nicht gefunden werden." + +#: includes/convert.inc:89 +msgid "Unable to convert view." +msgstr "Ansicht konnte nicht konvertiert werden." + +#: includes/convert.inc:107 +msgid "This action cannot be undone." +msgstr "Dieser Vorgang kann nicht rückgängig gemacht werden." + +#: includes/convert.inc:117 +msgid "The view has been deleted" +msgstr "Die Ansicht wurde gelöscht." + +#: includes/form.inc:249 +msgid "Validation error, please try again. If this error persists, please contact the site administrator." +msgstr "Bei der Gültigkeitsüberprüfung ist ein Fehler aufgetreten, bitte erneut versuchen. Falls der Fehler fortbesteht, wenden Sie sich bitte an den Administrator der Website." + +#: includes/handlers.inc:43 +msgid "Handler @handler include tried to loop infinitely!" +msgstr "Die Behandlungsroutine @handler ist eine Endlosschleife!" + +#: includes/handlers.inc:269 +msgid "!group: !title" +msgstr "!group: !title" + +#: includes/handlers.inc:507 +msgid "Reduce duplicates" +msgstr "Duplikate reduzieren" + +#: includes/handlers.inc:508 +msgid "This filter can cause items that have more than one of the selected options to appear as duplicate results. If this filter causes duplicate results to occur, this checkbox can reduce those duplicates; however, the more terms it has to search for, the less performant the query will be, so use this with caution." +msgstr "" + +#: includes/plugins.inc:26 +msgid "Default settings for this view." +msgstr "Standardeinstellungen für diese Ansicht." + +# not literally +#: includes/plugins.inc:40 +msgid "Display the view as a page, with a URL and menu links." +msgstr "Die Ansicht als Seite mit einer URL und Menüeinträgen anzeigen." + +#: includes/plugins.inc:51;60 +msgid "Block" +msgstr "Block" + +#: includes/plugins.inc:52 +msgid "Display the view as a block." +msgstr "Eine Ansicht als Block anzeigen." + +#: includes/plugins.inc:64 +msgid "Attachment" +msgstr "Anhang" + +#: includes/plugins.inc:65 +msgid "Attachments added to other displays to achieve multiple views in the same view." +msgstr "" + +#: includes/plugins.inc:73 +msgid "Display the view as a feed, such as an RSS feed." +msgstr "Die Ansicht als Newsfeed anzeigen, wie einen RSS-Newsfeed." + +#: includes/plugins.inc:93;144 +msgid "Unformatted" +msgstr "Unformatiert" + +#: includes/plugins.inc:94 +msgid "Displays rows one after another." +msgstr "Zeigt die Zeilen aufeinander folgend an." + +#: includes/plugins.inc:104 +msgid "HTML List" +msgstr "HTML-Liste" + +#: includes/plugins.inc:105 +msgid "Displays rows as an HTML list." +msgstr "Zeigt die Zeilen als HTML-Liste an." + +#: includes/plugins.inc:114 +msgid "Grid" +msgstr "Raster" + +#: includes/plugins.inc:115 +msgid "Displays rows in a grid." +msgstr "Zeilen in einem Gitter anzeigen." + +#: includes/plugins.inc:124 +msgid "Table" +msgstr "Tabelle" + +#: includes/plugins.inc:125 +msgid "Displays rows in a table." +msgstr "Zeilen in einer Tabelle anzeigen." + +#: includes/plugins.inc:136 +msgid "Displays the default summary as a list." +msgstr "Zeigt die standardmäßige Zusammenfassung als Liste an." + +#: includes/plugins.inc:145 +#, fuzzy +msgid "Displays the summary unformatted, with option for one after another or inline." +msgstr "Zeigt die Zusammenfassung unformatiert an, mit der Option eine nach der anderen oder inline." + +#: includes/plugins.inc:154 +msgid "RSS Feed" +msgstr "RSS-Feed" + +#: includes/plugins.inc:155 +msgid "Generates an RSS feed from a view." +msgstr "Generiert einen RSS-Newsfeed aus einer Ansicht." + +#: includes/plugins.inc:173 +#: includes/view.inc:1863 +msgid "Fields" +msgstr "Felder" + +#: includes/plugins.inc:174 +msgid "Displays the fields with an optional template." +msgstr "Die Felder mit einer optionalen Vorlage anzeigen." + +#: includes/plugins.inc:187 +msgid "Fixed entry" +msgstr "Fester Eintrag" + +#: includes/plugins.inc:191;203 +msgid "PHP Code" +msgstr "PHP-Code" + +#: includes/plugins.inc:207 +msgid "Numeric" +msgstr "Numerisch" + +#: includes/plugins.inc:219 +msgid "Will be available to all users." +msgstr "Wird allen Benutzern zu Verfügung stehen." + +#: includes/plugins.inc:224 +#: plugins/views_plugin_access_role.inc:40 +msgid "Role" +msgstr "Rolle" + +#: includes/plugins.inc:225 +msgid "Access will be granted to users with any of the specified roles." +msgstr "" + +#: includes/plugins.inc:231 +#: plugins/views_plugin_access_perm.inc:35 +msgid "Permission" +msgstr "Berechtigung" + +#: includes/plugins.inc:232 +msgid "Access will be granted to users with the specified permission string." +msgstr "" + +#: includes/view.inc:261 +msgid "set_display() called with invalid display id @display." +msgstr "set_display() wurde mit ungültiger Anzeige-ID @display aufgerufen." + +#: includes/view.inc:1063 +msgid "Home" +msgstr "Startseite" + +#: includes/view.inc:1864 +msgid "fields" +msgstr "Felder" + +#: includes/view.inc:1866 +msgid "field" +msgstr "Feld" + +#: includes/view.inc:1871 +msgid "arguments" +msgstr "Argumente" + +#: includes/view.inc:1872;1873 +msgid "Argument" +msgstr "Argument" + +#: includes/view.inc:1877 +msgid "Sort criteria" +msgstr "Sortierkriterium" + +#: includes/view.inc:1878 +msgid "sort criteria" +msgstr "Sortierkriterium" + +#: includes/view.inc:1879 +msgid "Sort criterion" +msgstr "Sortierkriterien" + +#: includes/view.inc:1880 +msgid "sort criterion" +msgstr "Sortierkriterien" + +#: includes/view.inc:1884 +msgid "Filters" +msgstr "Filter" + +#: includes/view.inc:1885 +msgid "filters" +msgstr "Filter" + +#: includes/view.inc:1886 +msgid "Filter" +msgstr "Filter" + +#: includes/view.inc:1887 +msgid "filter" +msgstr "Filter" + +#: includes/view.inc:1892 +msgid "Relationships" +msgstr "Beziehungen" + +#: includes/view.inc:1893 +msgid "relationships" +msgstr "Beziehungen" + +# auf/bei/unter? +#: js/ajax.js:0;0;0;0;0;0;0 +#: js/ajax_view.js:0;0;0 +#, fuzzy +msgid "An error occurred at @path." +msgstr "Ein Fehler ist auf @path aufgetreten." + +#: js/tabs.js:0 +msgid "jQuery UI Tabs: Mismatching fragment identifier." +msgstr "" + +#: js/tabs.js:0 +msgid "jQuery UI Tabs: Not enough arguments to add tab." +msgstr "jQuery UI-Reiter: Nicht genug Argumente, um einen Reiter hinzuzufügen." + +#: modules/book.views.inc:21;36;46;99 +msgid "Book" +msgstr "Buch" + +#: modules/book.views.inc:30 +msgid "Top level book" +msgstr "In Moderation" + +#: modules/book.views.inc:31 +msgid "The book the node is in." +msgstr "Das Buch, indem der Beitrag enthalten ist." + +#: modules/book.views.inc:58 +msgid "The weight of the book page." +msgstr "Die Reihenfolge der Buchseite." + +#: modules/book.views.inc:69 +#: modules/comment.views.inc:202 +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:24 +msgid "Depth" +msgstr "Tiefe" + +#: modules/book.views.inc:70 +msgid "The depth of the book page in the hierarchy; top level books have a depth of 1." +msgstr "Die Tiefe der Buchseite in der Hierarchie. Bücher der obersten Ebene haben eine Tiefe von 1." + +#: modules/book.views.inc:87 +msgid "Hierarchy" +msgstr "Hierarchie" + +#: modules/book.views.inc:88 +msgid "The order of pages in the book hierarchy. Remember to sort by weight too if you want exactly the right order." +msgstr "" + +#: modules/book.views.inc:110 +#: modules/taxonomy.views.inc:259 +msgid "Parent" +msgstr "Übergeordnet" + +#: modules/book.views.inc:111 +msgid "The parent book node." +msgstr "Der übergeordnete Buchbeitrag." + +#: modules/book.views.inc:116 +msgid "Book parent" +msgstr "Übergeordnetes Buch" + +#: modules/comment.views.inc:22;26;384;395 +msgid "Comment" +msgstr "Kommentar" + +#: modules/comment.views.inc:27 +msgid "Comments are responses to node content." +msgstr "Kommentare sind Antworten auf Inhalte von Beiträgen." + +#: modules/comment.views.inc:45 +msgid "The title of the comment." +msgstr "Der Titel des Kommentars." + +#: modules/comment.views.inc:63 +#: modules/node.views.inc:358 +msgid "Body" +msgstr "Textkörper" + +#: modules/comment.views.inc:64 +msgid "The text of the comment." +msgstr "Der Text des Kommentars." + +#: modules/comment.views.inc:76 +msgid "ID" +msgstr "ID" + +#: modules/comment.views.inc:77 +msgid "The comment ID of the field" +msgstr "Die Kommentar-ID des Feldes" + +#: modules/comment.views.inc:95 +msgid "Author" +msgstr "Autor" + +#: modules/comment.views.inc:96 +msgid "The name of the poster." +msgstr "Der Name des Beitragenden." + +#: modules/comment.views.inc:114 +msgid "Author's website" +msgstr "Website des Autors" + +#: modules/comment.views.inc:115 +msgid "The website address of the comment's author. Can be a link. The homepage can also be linked with the Name field. Will be empty if posted by a registered user." +msgstr "" + +#: modules/comment.views.inc:133 +#: modules/node.views.inc:108 +msgid "Post date" +msgstr "Beitragsdatum" + +#: modules/comment.views.inc:134 +msgid "Date and time of when the comment was posted." +msgstr "Zeitpunkt zu dem der Kommentar gespeichert wurde." + +#: modules/comment.views.inc:149 +msgid "In moderation" +msgstr "In Moderation" + +#: modules/comment.views.inc:150 +msgid "Whether or not the comment is currently in moderation." +msgstr "Ob sich der Kommentar derzeit in Moderation befindet oder nicht." + +#: modules/comment.views.inc:157 +#: modules/node.views.inc:204;213 +msgid "Moderated" +msgstr "Moderiert" + +#: modules/comment.views.inc:167 +msgid "View link" +msgstr "‚Anzeigen‘-Link" + +#: modules/comment.views.inc:168 +msgid "Provide a simple link to view the comment." +msgstr "Stellt einen einfachen Link zur Ansicht des Kommentars bereit." + +#: modules/comment.views.inc:176 +#: modules/node.views.inc:250 +#: modules/user.views.inc:202 +msgid "Edit link" +msgstr "‚Bearbeiten‘-Link" + +#: modules/comment.views.inc:177 +msgid "Provide a simple link to edit the comment." +msgstr "Stellt einen einfachen Link zum Bearbeiten des Kommentars bereit." + +#: modules/comment.views.inc:185 +#: modules/node.views.inc:258;472 +#: modules/user.views.inc:210 +msgid "Delete link" +msgstr "‚Löschen‘-Link" + +#: modules/comment.views.inc:186 +msgid "Provide a simple link to delete the comment." +msgstr "Stellt einen einfachen Link zum Löschen des Kommentars bereit." + +#: modules/comment.views.inc:194 +msgid "Reply-to link" +msgstr "‚Antworten‘-Link" + +#: modules/comment.views.inc:195 +msgid "Provide a simple link to reply to the comment." +msgstr "Stellt einen einfachen Link zum Antworten auf den Kommentars bereit." + +#: modules/comment.views.inc:203 +msgid "Display the depth of the comment if it is threaded." +msgstr "Bei gruppierter Ansicht die Verschachtelungstiefe des Kommentars anzeigen." + +#: modules/comment.views.inc:207 +msgid "Thread" +msgstr "Thread" + +#: modules/comment.views.inc:208 +msgid "Sort by the threaded order. This will keep child comments together with their parents." +msgstr "Nach der gruppierten Reihenfolge sortieren. Dies wird die Unterkommentare mit ihren Eltern zusammenlassen." + +#: modules/comment.views.inc:214;220;255 +#: modules/node.views.inc:24;29;90;357;372;484;616;627;639 +#: modules/upload.views.inc:43 +msgid "Node" +msgstr "Beitrag" + +#: modules/comment.views.inc:215 +msgid "The node the comment is a reply to." +msgstr "Der Beitrag auf den sich diese Antwort bezieht." + +#: modules/comment.views.inc:225;231 +#: modules/node.views.inc:345 +#: modules/statistics.views.inc:204 +#: modules/user.views.inc:23;27;219 +msgid "User" +msgstr "Benutzer" + +#: modules/comment.views.inc:226 +msgid "The user who wrote the comment." +msgstr "Der Benutzer, der den Kommentar geschrieben hat." + +#: modules/comment.views.inc:236 +msgid "Parent CID" +msgstr "Übergeordnete Kommentar-ID" + +#: modules/comment.views.inc:237 +msgid "The Comment ID of the parent comment." +msgstr "Die Kommentar-ID dies übergeordneten Kommentars." + +#: modules/comment.views.inc:242;247 +msgid "Parent comment" +msgstr "Übergeordneter Kommentar" + +#: modules/comment.views.inc:243 +msgid "The parent comment." +msgstr "Der übergeordnete Kommentar." + +#: modules/comment.views.inc:268 +msgid "Last comment time" +msgstr "Letzter Kommentarzeitpunkt" + +#: modules/comment.views.inc:269 +msgid "Date and time of when the last comment was posted." +msgstr "Zeitpunkt zu dem der letzte Kommentar gespeichert wurde." + +#: modules/comment.views.inc:284 +msgid "Last comment author" +msgstr "Letzter Kommentarautor" + +#: modules/comment.views.inc:285 +msgid "The name of the author of the last posted comment." +msgstr "Der Name des Autors von dem letzten Kommentar." + +#: modules/comment.views.inc:297 +msgid "Comment count" +msgstr "Anzahl an Kommentaren" + +#: modules/comment.views.inc:298 +msgid "The number of comments a node has." +msgstr "Die Anzahl der Kommentare zu einem Beitrag." + +#: modules/comment.views.inc:316 +msgid "Updated/commented date" +msgstr "Aktualisierungs-/Kommentarzeitpunkt" + +#: modules/comment.views.inc:317 +msgid "The most recent of last comment posted or node updated time." +msgstr "" + +#: modules/comment.views.inc:340 +msgid "New comments" +msgstr "Neue Kommentare" + +#: modules/comment.views.inc:341 +msgid "The number of new comments on the node." +msgstr "Die Anzahl der neuen Kommentare zu dem Beitrag." + +#: modules/comment.views.inc:349 +msgid "Comment status" +msgstr "Kommentarstatus" + +#: modules/comment.views.inc:350 +msgid "Whether comments are enabled or disabled on the node." +msgstr "Ob Kommentare zu dem Beitrag aktiviert oder deaktiviert sind." + +#: modules/comment.views.inc:364 +msgid "User posted or commented" +msgstr "" + +#: modules/comment.views.inc:365 +msgid "Display comments only if a user posted the node or commented on the node." +msgstr "Kommentare nur anzeigen, wenn ein Benutzer den Beitrag gespeichert oder kommentiert hat." + +#: modules/comment.views.inc:385 +msgid "Display the comment with standard comment view." +msgstr "Den Kommentar mit der Standardkommentaransicht anzeigen." + +#: modules/comment.views.inc:396 +msgid "Display the comment as RSS." +msgstr "Zeigt den Kommentar als RSS-Newsfeed an." + +#: modules/node.views.inc:30 +msgid "Nodes are a Drupal site's primary content." +msgstr "Beiträge sind der primäre Inhalt einer Drupal-Website." + +#: modules/node.views.inc:57 +msgid "Nid" +msgstr "Beitrags-ID" + +#: modules/node.views.inc:58 +msgid "The node ID of the node." +msgstr "Die Beitrags-ID des Beitrags." + +#: modules/node.views.inc:86;414 +msgid "The title of the node." +msgstr "Der Titel des Beitrags." + +# ? +#: modules/node.views.inc:109 +msgid "The date the node was posted." +msgstr "Der Zeitpunkt zu dem der Beitrag gespeichert wurde." + +#: modules/node.views.inc:124 +msgid "Updated date" +msgstr "Aktualisierungszeitpunkt" + +#: modules/node.views.inc:125 +msgid "The date the node was last updated." +msgstr "Der Zeitpunkt zu dem der Beitrag das letzte mal aktualisiert wurde." + +#: modules/node.views.inc:141 +msgid "The type of a node (for example, \"blog entry\", \"forum post\", \"story\", etc)." +msgstr "Der Beitragstyp (zum Beispiel: „Blogbeitrag“, „Forumsbeitrag“, „Artikel“, usw)." + +#: modules/node.views.inc:159;167;181 +#: modules/translation.views.inc:106 +#: modules/upload.views.inc:82 +msgid "Published" +msgstr "Veröffentlicht" + +#: modules/node.views.inc:160 +msgid "The published status of the node." +msgstr "Den Veröffentlichungsstatus des Beitrags." + +#: modules/node.views.inc:176 +#, fuzzy +msgid "Published or admin" +msgstr "Veröffentlicht oder Verwalter" + +#: modules/node.views.inc:177 +msgid "Filters out unpublished nodes if the current user cannot view them." +msgstr "Filtert unveröffentlichte Beiträge aus, wenn der aktuelle Benutzer diese nicht sehen kann." + +#: modules/node.views.inc:187;195 +msgid "Promoted to front page" +msgstr "Auf der Startseite" + +#: modules/node.views.inc:188 +msgid "The front page of the node." +msgstr "Die Startseite dieses Beitrags." + +#: modules/node.views.inc:205 +msgid "Whether or not the node is moderated." +msgstr "Ob ein Beitrag moderiert ist oder nicht." + +#: modules/node.views.inc:222;231 +msgid "Sticky" +msgstr "am Anfang von Listen" + +#: modules/node.views.inc:223 +msgid "Whether or not the node is sticky." +msgstr "Ob ein Beitrag am Anfang von Listen angezeigt wird oder nicht." + +#: modules/node.views.inc:242 +msgid "Link" +msgstr "Link" + +#: modules/node.views.inc:243 +msgid "Provide a simple link to the node." +msgstr "Stellt einen einfachen Link zu dem Beitrag bereit." + +#: modules/node.views.inc:251 +msgid "Provide a simple link to edit the node." +msgstr "Stellt einen einfachen Link zum Bearbeiten des Beitrags bereit." + +#: modules/node.views.inc:259 +msgid "Provide a simple link to delete the node." +msgstr "Stellt einen einfachen Link zum Löschen des Beitrags bereit." + +#: modules/node.views.inc:267;448 +#: modules/user.views.inc:123 +msgid "Created date" +msgstr "Erstellungsdatum" + +#: modules/node.views.inc:268 +msgid "In the form of CCYYMMDD." +msgstr "In der Form von JJJJMMTT." + +#: modules/node.views.inc:276 +msgid "Created year + month" +msgstr "Jahr + Monat wurde erstellt" + +#: modules/node.views.inc:277 +msgid "In the form of YYYYMM." +msgstr "In der Form von JJJJMM." + +#: modules/node.views.inc:285 +msgid "Created year" +msgstr "Erstellungsjahr" + +#: modules/node.views.inc:286 +msgid "In the form of YYYY." +msgstr "In der Form von JJJJ." + +#: modules/node.views.inc:294 +msgid "Created month" +msgstr "Erstellungsmonat" + +#: modules/node.views.inc:295 +msgid "In the form of MM (01 - 12)." +msgstr "In der Form von MM (01 - 12)." + +#: modules/node.views.inc:303 +msgid "Created day" +msgstr "Erstellungstag" + +#: modules/node.views.inc:304 +msgid "In the form of DD (01 - 31)." +msgstr "In der Form von TT (01 - 31)." + +#: modules/node.views.inc:312 +msgid "Created week" +msgstr "Erstellungswoche" + +#: modules/node.views.inc:313 +msgid "In the form of WW (01 - 53)." +msgstr "In der Form von WW (01 - 53)." + +#: modules/node.views.inc:325;330 +msgid "Node revision" +msgstr "Beitragsversion" + +#: modules/node.views.inc:331 +msgid "Node revisions are a history of changes to nodes." +msgstr "Beitragsversionen sind eine Historie von Änderungen an Beiträgen." + +#: modules/node.views.inc:346 +msgid "Relate a node revision to the user who created the revision." +msgstr "" + +#: modules/node.views.inc:351 +msgid "user" +msgstr "Benutzer" + +#: modules/node.views.inc:359 +msgid "The actual, full data in the body field; this may not be valid data on all node types." +msgstr "" + +#: modules/node.views.inc:373 +msgid "Teaser" +msgstr "Anrisstext" + +#: modules/node.views.inc:374 +msgid "The stored teaser field. This may not be valid or useful data on all node types." +msgstr "" + +#: modules/node.views.inc:387 +msgid "Vid" +msgstr "Vid" + +#: modules/node.views.inc:388 +msgid "The revision ID of the node revision." +msgstr "Die Versions-ID der Beitragsversion." + +#: modules/node.views.inc:434 +msgid "Log message" +msgstr "Protokollnachricht" + +#: modules/node.views.inc:435 +msgid "The log message entered when the revision was created." +msgstr "Die eingegebene Protokollnachricht, als die Version erstellt wurde." + +#: modules/node.views.inc:449 +msgid "The date the node revision was created." +msgstr "Der Zeitpunkt zu dem die Beitragsversion erstellt wurde." + +#: modules/node.views.inc:464 +msgid "Revert link" +msgstr "‚Zurück‘-Link" + +#: modules/node.views.inc:465 +msgid "Provide a simple link to revert to the revision." +msgstr "Stellt einen einfachen Link bereit, um zu der Version zurückzukehren." + +#: modules/node.views.inc:473 +msgid "Provide a simple link to delete the node revision." +msgstr "Stellt einen einfachen Link zum Löschen der Beitragsversion bereit." + +#: modules/node.views.inc:500 +msgid "Has new content" +msgstr "Neuer Inhalt vorhanden" + +#: modules/node.views.inc:503 +msgid "Show a marker if the node has new or updated content." +msgstr "Eine Markierung anzeigen, wenn der Beitrag neuen oder aktualisierten Inhalt enthält." + +#: modules/node.views.inc:506 +msgid "Show only nodes that have new content." +msgstr "Nur Beiträge mit neuem Inhalt anzeigen." + +#: modules/node.views.inc:617;628 +msgid "Display the node with standard node view." +msgstr "Den Beitrag mit der Standardbeitragsansicht anzeigen." + +#: modules/node.views.inc:646 +msgid "Node ID from URL" +msgstr "Beitrags-ID aus der URL" + +#: modules/node.views.inc:708 +msgid "Display %display has no access control but does not contain a filter for published nodes." +msgstr "Die Anzeige %display hat keine Zugriffskontrolle und enthält keinen Filter für veröffentlichte Beiträge." + +#: modules/poll.views.inc:23 +msgid "Poll" +msgstr "Umfrage" + +#: modules/poll.views.inc:38;47 +#: modules/user.views.inc:171;180 +msgid "Active" +msgstr "Aktiv" + +#: modules/poll.views.inc:39 +msgid "Whether the poll is open for voting." +msgstr "Ob die Umfrage offen für die Stimmabgabe ist." + +#: modules/profile.views.inc:20;40 +msgid "Profile" +msgstr "Profil" + +#: modules/profile.views.inc:100 +msgid "@field-name" +msgstr "@field-name" + +#: modules/profile.views.inc:107 +msgid "Profile textfield" +msgstr "Profiltextfeld" + +#: modules/profile.views.inc:126 +msgid "Profile textarea" +msgstr "Profil-Textfeld" + +#: modules/profile.views.inc:142 +msgid "Profile checkbox" +msgstr "Profil-Ankreuzfeld" + +#: modules/profile.views.inc:159 +msgid "Profile URL" +msgstr "Profil-URL" + +#: modules/profile.views.inc:175 +msgid "Profile selection" +msgstr "Profileauswahl" + +#: modules/profile.views.inc:195 +msgid "Profile freeform list %field-name." +msgstr "" + +#: modules/profile.views.inc:207 +msgid "Profile date %field-name." +msgstr "Profildatum %field-name." + +#: modules/search.views.inc:23;77;88;106;163 +msgid "Search" +msgstr "Suchen" + +#: modules/search.views.inc:72 +msgid "Score" +msgstr "Punktzahl" + +#: modules/search.views.inc:73 +msgid "The score of the search item." +msgstr "Die Punktzahl der Suchebegriffes." + +#: modules/search.views.inc:95 +msgid "Links from" +msgstr "Links von" + +#: modules/search.views.inc:96 +msgid "Nodes that link from the node." +msgstr "Beiträge die von dem Beitrag verlinken." + +#: modules/search.views.inc:113 +msgid "Links to" +msgstr "Links zu" + +#: modules/search.views.inc:114 +msgid "Nodes that link to the node." +msgstr "Beiträge die auf den Beitrag verlinken." + +#: modules/search.views.inc:125 +msgid "Search Terms" +msgstr "Suchbegriffe" + +#: modules/search.views.inc:126 +msgid "The terms to search for." +msgstr "Die Begriffe nach denen gesucht werden soll." + +#: modules/search.views.inc:164 +msgid "Display the results with standard search view." +msgstr "Die Ergebnisse mit der Standard-Suchansicht anzeigen." + +#: modules/statistics.views.inc:24 +msgid "Node statistics" +msgstr "Beitragsstatistiken" + +#: modules/statistics.views.inc:36 +msgid "Total views" +msgstr "Seitenansichten gesamt" + +#: modules/statistics.views.inc:37 +msgid "The total number of times the node has been viewed." +msgstr "Dies zeigt die Anzahl an, wie oft ein Beitrag insgesamt gelesen wurde." + +#: modules/statistics.views.inc:53 +msgid "Views today" +msgstr "Heutige Seitenansichten" + +#: modules/statistics.views.inc:54 +msgid "The total number of times the node has been viewed today." +msgstr "Dies zeigt die Anzahl an, wie oft ein Beitrag heute gelesen wurde." + +#: modules/statistics.views.inc:70 +msgid "Most recent view" +msgstr "Die neuste Seitenansicht" + +#: modules/statistics.views.inc:71 +msgid "The most recent time the node has been viewed." +msgstr "Der letzte Zeitpunkt zu dem der Beitrag gelesen wurde." + +#: modules/statistics.views.inc:89;94 +msgid "Access log" +msgstr "Zugriffsprotokoll" + +#: modules/statistics.views.inc:95 +msgid "Stores site access information." +msgstr "Speichert die Zugriffsinformation auf die Website." + +#: modules/statistics.views.inc:109 +msgid "Session ID" +msgstr "Session-ID" + +#: modules/statistics.views.inc:110 +msgid "Browser session ID of user that visited page." +msgstr "Die Browser-Session-ID des Benutzers, der diese Seite besucht hat." + +#: modules/statistics.views.inc:129 +msgid "Page title" +msgstr "Seitentitel" + +#: modules/statistics.views.inc:130 +msgid "Title of page visited." +msgstr "Titel der besuchten Seite." + +#: modules/statistics.views.inc:150 +msgid "Internal path to page visited (relative to Drupal root.)" +msgstr "Interner Pfad zur besuchten Seite (relativ zum Drupal-Hauptverzeichnis)." + +#: modules/statistics.views.inc:169 +msgid "Referrer" +msgstr "Referrer" + +#: modules/statistics.views.inc:170 +msgid "Referrer URI." +msgstr "Referrer-URI." + +#: modules/statistics.views.inc:185 +msgid "Hostname" +msgstr "Hostadresse" + +#: modules/statistics.views.inc:186 +msgid "Hostname of user that visited the page." +msgstr "Der Hostname des Benutzers, der die Seite besucht hat." + +#: modules/statistics.views.inc:205 +msgid "The user who visited the site." +msgstr "Der Benutzer, der die Website besucht hat." + +#: modules/statistics.views.inc:215 +msgid "Timer" +msgstr "Timer" + +#: modules/statistics.views.inc:216 +msgid "Time in milliseconds that the page took to load." +msgstr "Die benötigte Ladezeit der Seite in Millisekunden." + +#: modules/statistics.views.inc:231 +msgid "Timestamp" +msgstr "Zeitstempel" + +#: modules/statistics.views.inc:232 +msgid "Timestamp of when the page was visited." +msgstr "Zeitstempel zu dem die Seite besucht wurde." + +#: modules/system.views.inc:25;30 +msgid "File" +msgstr "Datei" + +#: modules/system.views.inc:31 +msgid "Files maintained by Drupal and various modules." +msgstr "Dateien werden von Drupal und unterschiedlichen Modulen verwaltet." + +#: modules/system.views.inc:49 +msgid "File ID" +msgstr "Datei-ID" + +#: modules/system.views.inc:50 +msgid "The ID of the file." +msgstr "Die ID der Datei." + +#: modules/system.views.inc:70 +msgid "The name of the file." +msgstr "Der Name der Datei." + +#: modules/system.views.inc:89 +msgid "The path of the file." +msgstr "Der Pfad der Datei." + +#: modules/system.views.inc:107 +msgid "Mime type" +msgstr "MIME-Typ" + +#: modules/system.views.inc:108 +msgid "The mime type of the file." +msgstr "Der MIME-Typ der Datei." + +#: modules/system.views.inc:126 +msgid "Size" +msgstr "Größe" + +#: modules/system.views.inc:127 +msgid "The size of the file." +msgstr "Die Größe der Datei." + +#: modules/system.views.inc:142 +msgid "Status" +msgstr "Status" + +#: modules/system.views.inc:143 +msgid "The status of the file." +msgstr "Der Status der Datei." + +#: modules/system.views.inc:158 +msgid "Upload date" +msgstr "Profilauswahl" + +# ? +#: modules/system.views.inc:159 +msgid "The date the file was uploaded." +msgstr "Der Zeitpunkt zu dem die Datei hochgeladen wurde." + +#: modules/system.views.inc:204 +msgid "Temporary" +msgstr "Temporär" + +#: modules/system.views.inc:205 +msgid "Permanent" +msgstr "Dauerhaft" + +#: modules/taxonomy.views.inc:24;67;152;170;226;266;303;314 +msgid "Taxonomy" +msgstr "Taxonomie" + +#: modules/taxonomy.views.inc:48 +msgid "Vocabulary name" +msgstr "Vokabularname" + +#: modules/taxonomy.views.inc:50 +msgid "Name of the vocabulary a term is a member of. This will be the vocabulary that whichever term the \"Taxonomy: Term\" field is; and can similarly cause duplicates." +msgstr "" + +#: modules/taxonomy.views.inc:56 +msgid "Vocabulary ID" +msgstr "Vokabular-ID" + +#: modules/taxonomy.views.inc:57 +msgid "The taxonomy vocabulary ID" +msgstr "Die Vokabular-ID der Taxonomie" + +#: modules/taxonomy.views.inc:70;116;213 +msgid "Term" +msgstr "Begriff" + +#: modules/taxonomy.views.inc:71 +msgid "Taxonomy terms are attached to nodes." +msgstr "" + +#: modules/taxonomy.views.inc:96;196 +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:35 +msgid "Term ID" +msgstr "Begriff-ID" + +#: modules/taxonomy.views.inc:97;197 +msgid "The taxonomy term ID" +msgstr "Die Taxonomiebegriff-ID" + +#: modules/taxonomy.views.inc:117 +msgid "Taxonomy terms. Note that using this can cause duplicate nodes to appear in views; you must add filters to reduce the result set." +msgstr "" + +#: modules/taxonomy.views.inc:127 +msgid "Taxonomy term name." +msgstr "Name des Taxonomie-Begriffes." + +#: modules/taxonomy.views.inc:136 +msgid "The term weight field" +msgstr "Das Feld für die Begriffsreihenfolge" + +#: modules/taxonomy.views.inc:148 +msgid "Term description" +msgstr "Begriffsbeschreibung" + +#: modules/taxonomy.views.inc:149 +msgid "The description associated with a taxonomy term." +msgstr "Die einem Taxonomiebegriff zugeordnete Beschreibung." + +#: modules/taxonomy.views.inc:160 +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:37 +msgid "Vocabulary" +msgstr "Vokabular" + +#: modules/taxonomy.views.inc:161 +msgid "Filter the results of \"Taxonomy: Term\" to a particular vocabulary." +msgstr "" + +#: modules/taxonomy.views.inc:199 +msgid "All terms" +msgstr "Alle Begriffe" + +#: modules/taxonomy.views.inc:200 +msgid "Display all taxonomy terms associated with a node from specified vocabularies." +msgstr "Alle einem Beitrag zugeordneten Taxonomiebegriffe eines angegebenes Vokabulars anzeigen." + +#: modules/taxonomy.views.inc:254 +msgid "Parent term" +msgstr "Übergeordneter Begriff" + +#: modules/taxonomy.views.inc:255 +msgid "The parent term of the term. This can produce duplicate entries if you are using a vocabulary that allows multiple parents." +msgstr "" + +#: modules/taxonomy.views.inc:287 +msgid "Term synonym" +msgstr "Begriffssynonym" + +#: modules/taxonomy.views.inc:288 +msgid "Term synonyms may be used to find terms by alternate names." +msgstr "" + +#: modules/taxonomy.views.inc:304 +msgid "Term ID (with depth)" +msgstr "Begriffs-ID (mit Verschachtelungstiefe)" + +#: modules/taxonomy.views.inc:305 +msgid "The depth filter is more complex, so provides fewer options." +msgstr "Der Verschachtelungstiefenfilter ist wesentlich komplexer und stellt deshalb weniger Optionen zu Verfügung." + +#: modules/taxonomy.views.inc:315 +msgid "Term ID depth modifier" +msgstr "" + +#: modules/taxonomy.views.inc:316 +msgid "Allows the \"depth\" for Taxonomy: Term ID (with depth) to be modified via an additional argument." +msgstr "Ermöglicht über ein zusätzliches Argument die Anpassung der „Verschachtelungstiefe“ einer Taxonomie-Begriffs-ID (mit Verschachtelungstiefe)." + +#: modules/taxonomy.views.inc:372 +msgid "Taxonomy term" +msgstr "Taxonomie-Begriff" + +#: modules/translation.views.inc:31;48;80;97 +msgid "Node translation" +msgstr "Beitragsübersetzung" + +#: modules/translation.views.inc:32 +#: modules/node/views_handler_filter_node_language.inc:9 +#: modules/translation/views_handler_filter_node_language.inc:9 +msgid "Language" +msgstr "Sprache" + +#: modules/translation.views.inc:33 +msgid "The language the content is in." +msgstr "Die Sprache des Inhalts." + +#: modules/translation.views.inc:49 +msgid "Translation set node ID" +msgstr "Beitrags-ID des Übersetzungssatzes" + +#: modules/translation.views.inc:50 +msgid "The ID of the translation set the content belongs to." +msgstr "Die ID des Übersetzungssatzes, zu dem der Inhalt gehört." + +#: modules/translation.views.inc:69;74 +msgid "Source translation" +msgstr "Quellübersetzung" + +#: modules/translation.views.inc:70 +msgid "The source that this content was translated from." +msgstr "Die Quelle aus der dieser Inhalt übersetzt wird." + +#: modules/translation.views.inc:81;84;91 +msgid "Translations" +msgstr "Übersetzungen" + +#: modules/translation.views.inc:82;85 +msgid "Versions of content in different languages." +msgstr "Versionen von Inhalt in unterschiedlichen Sprachen." + +#: modules/translation.views.inc:98 +msgid "Translation status" +msgstr "Übersetzungsstatus" + +#: modules/translation.views.inc:99 +msgid "The translation status of the node--whether or not the translation needs to be updated." +msgstr "Der Übersetzungsstatus des Beitrags - ob die Übersetzung aktualisiert werden muss oder nicht." + +#: modules/upload.views.inc:25;112 +msgid "Upload" +msgstr "Upload" + +#: modules/upload.views.inc:44 +msgid "The node the uploaded file is attached to" +msgstr "Der Beitrag an dem die hochgeladene Datei angehängt ist." + +#: modules/upload.views.inc:46 +msgid "upload" +msgstr "Upload" + +#: modules/upload.views.inc:57 +msgid "The description of the uploaded file." +msgstr "Die Beschreibung der hochgeladen Datei." + +#: modules/upload.views.inc:74 +msgid "Listed" +msgstr "Aufgelistet" + +#: modules/upload.views.inc:75 +msgid "Whether or not the file is marked to be listed." +msgstr "Ob die Datei zur Auflistung markiert ist oder nicht." + +#: modules/upload.views.inc:91 +msgid "The weight, used for sorting." +msgstr "Die für die Sortierung verwendete Reihenfolge." + +#: modules/upload.views.inc:113;125 +msgid "Attached files" +msgstr "Angehängte Dateien" + +#: modules/upload.views.inc:114 +msgid "All files attached to a node with upload.module." +msgstr "Alle mit dem Upload-Modul an einen Beitrag angehängten Dateien." + +#: modules/upload.views.inc:121 +#: modules/upload/views_handler_filter_upload_fid.inc:10 +msgid "Has attached files" +msgstr "Angehängte Dateien vorhanden" + +#: modules/upload.views.inc:122 +msgid "Only display items with attached files. This can cause duplicates if there are multiple attached files." +msgstr "Nur Einträge mit angehängten Dateien anzeigen. Sollten mehrere angehängte Dateien vorhanden sein, kann dies zu Duplikaten führen." + +#: modules/upload.views.inc:126 +msgid "Add a relationship to gain access to more file data for files uploaded by upload.module. Note that this relationship will cause duplicate nodes if there are multiple files attached to the node." +msgstr "" + +#: modules/upload.views.inc:132 +msgid "Files" +msgstr "Dateien" + +#: modules/user.views.inc:28 +msgid "Users who have created accounts on your site." +msgstr "Benutzer, die Konten auf der Website erstellt haben." + +#: modules/user.views.inc:48 +msgid "Uid" +msgstr "Uid" + +#: modules/user.views.inc:49 +msgid "The user ID" +msgstr "Benutzer-ID" + +#: modules/user.views.inc:70 +msgid "Current" +msgstr "Aktuell" + +#: modules/user.views.inc:71 +msgid "Filter the view to the currently logged in user." +msgstr "Die Ansicht des aktuell angemeldeten Benuters filtern." + +#: modules/user.views.inc:80 +msgid "The user or author name." +msgstr "Der Benutzer oder Name des Autors." + +#: modules/user.views.inc:96 +msgid "E-mail" +msgstr "E-Mail-Adresse" + +#: modules/user.views.inc:97 +msgid "Email address for a given user. This field is not normally shown to users, so be cautious when using it." +msgstr "Die E-Mail-Adresse für einen bestimmten Benutzer. Dieses Feld wird Benutzern normalerweise nicht angezeigt und sollte nur unter Vorsicht verwendet werden." + +#: modules/user.views.inc:112 +msgid "Picture" +msgstr "Bild" + +#: modules/user.views.inc:113 +msgid "The user's picture, if allowed." +msgstr "Das Bild des Benutzers, soweit zulässig." + +#: modules/user.views.inc:124 +msgid "The date the user was created." +msgstr "Der Zeitpunkt zu dem der Benutzer erstellt wurde." + +#: modules/user.views.inc:139 +msgid "Last access" +msgstr "Letzter Zugriff" + +#: modules/user.views.inc:140 +msgid "The user's last access date." +msgstr "Letztes Zugriffsdatum des Benutzers." + +#: modules/user.views.inc:155 +msgid "Last login" +msgstr "Letzte Anmeldung" + +#: modules/user.views.inc:156 +msgid "The user's last login date." +msgstr "Letztes Anmeldedatum des Benutzers." + +#: modules/user.views.inc:172 +msgid "Whether a user is active or blocked." +msgstr "Ob ein Benutzer aktiv oder blockiert ist." + +#: modules/user.views.inc:189 +msgid "Signature" +msgstr "Signatur" + +#: modules/user.views.inc:190 +msgid "The user's signature." +msgstr "Die Signatur des Benutzers." + +#: modules/user.views.inc:203 +msgid "Provide a simple link to edit the user." +msgstr "Stellt einen einfachen Link zum Bearbeiten des Benutzers bereit." + +#: modules/user.views.inc:211 +msgid "Provide a simple link to delete the user." +msgstr "Stellt einen einfachen Link zum Löschen des Benutzers bereit." + +#: modules/user.views.inc:240 +msgid "Roles" +msgstr "Rollen" + +#: modules/user.views.inc:241 +msgid "Roles that a user belongs to." +msgstr "Die Rollen denen ein Benutzer angehört." + +#: modules/user.views.inc:253 +msgid "No role" +msgstr "Keine Rolle" + +#: modules/user.views.inc:296 +msgid "User ID from URL" +msgstr "Benutzer-ID aus der URL" + +#: modules/user.views.inc:302 +msgid "User ID from logged in user" +msgstr "Benutzer-ID des angemeldeten Benutzers" + +#: modules/views.views.inc:18 +msgid "Global" +msgstr "Global" + +#: modules/views.views.inc:23 +msgid "Random" +msgstr "Zufall" + +#: modules/views.views.inc:24 +msgid "Randomize the display order." +msgstr "Die Anzeigereihenfolge zufällig anordnen." + +#: modules/views.views.inc:31 +msgid "Null" +msgstr "Null" + +#: modules/views.views.inc:32 +msgid "Allow an argument to be ignored. The query will not be altered by this argument." +msgstr "Ermöglicht es, dass ein Argument ignoriert wird. Die Abfrage wird durch dieses Argument nicht verändert." + +#: modules/comment/views_handler_argument_comment_user_uid.inc:11 +#: modules/user/views_handler_argument_user_uid.inc:17 +msgid "Anonymous" +msgstr "Gast" + +#: modules/comment/views_handler_argument_comment_user_uid.inc:17 +msgid "No user" +msgstr "Keine Benutzer" + +#: modules/comment/views_handler_field_comment.inc:30 +msgid "Link this field to its comment" +msgstr "Dieses Feld auf seinen Kommentar verlinken" + +#: modules/comment/views_handler_field_comment_link.inc:23 +#: modules/node/views_handler_field_node_link.inc:24 +#: modules/user/views_handler_field_user_link.inc:22 +msgid "Text to display" +msgstr "Anzuzeigender Text" + +#: modules/comment/views_handler_field_comment_link.inc:34 +#: modules/node/views_handler_field_node_link.inc:35 +#: modules/user/views_handler_field_user_link.inc:38 +msgid "view" +msgstr "Anzeigen" + +#: modules/comment/views_handler_field_comment_link_delete.inc:12 +#: modules/node/views_handler_field_node_link_delete.inc:26 +#: modules/node/views_handler_field_node_revision_link_delete.inc:35 +#: modules/user/views_handler_field_user_link_delete.inc:13 +msgid "delete" +msgstr "Löschen" + +#: modules/comment/views_handler_field_comment_link_edit.inc:21 +#: modules/node/views_handler_field_node_link_edit.inc:26 +#: modules/user/views_handler_field_user_link_edit.inc:13 +msgid "edit" +msgstr "Bearbeiten" + +#: modules/comment/views_handler_field_comment_link_reply.inc:13 +msgid "reply" +msgstr "Antwort" + +#: modules/comment/views_handler_field_comment_username.inc:25 +msgid "Link this field to its user or an author's homepage" +msgstr "Mit diesem Feld auf den Benutzer oder die Startseite des Autors verlinken" + +#: modules/comment/views_handler_field_node_comment.inc:12 +#: modules/comment/views_handler_filter_node_comment.inc:10 +msgid "Disabled" +msgstr "Deaktiviert" + +#: modules/comment/views_handler_field_node_comment.inc:14 +#: modules/comment/views_handler_filter_node_comment.inc:11 +msgid "Read only" +msgstr "Nur Leseberechtigung" + +# Translation is context sensitive for comments and may cause incompatibilities. +#: modules/comment/views_handler_field_node_comment.inc:16 +#: modules/comment/views_handler_filter_node_comment.inc:12 +msgid "Read/Write" +msgstr "Kommentare lesen und schreiben" + +#: modules/comment/views_handler_field_node_new_comments.inc:25 +msgid "Link this field to new comments" +msgstr "Dieses Feld mit neuen Kommentaren verknüpfen" + +#: modules/comment/views_handler_field_node_new_comments.inc:30 +msgid "Display nothing if no new comments" +msgstr "Nichts anzeigen, wenn keine neuen Kommentare vorhanden sind" + +#: modules/comment/views_plugin_row_comment_view.inc:21 +#: modules/node/views_plugin_row_node_view.inc:32 +msgid "Display links" +msgstr "Links anzeigen" + +#: modules/node/views_handler_argument_dates_various.inc:167 +#, fuzzy +msgid "Week @week" +msgstr "@week Woche" + +#: modules/node/views_handler_argument_node_language.inc:29 +#: modules/translation/views_handler_argument_node_language.inc:29 +msgid "Unknown language" +msgstr "Unbekannte Sprache" + +#: modules/node/views_handler_argument_node_type.inc:30 +msgid "Unknown node type" +msgstr "Unbekannter Beitragstyp" + +#: modules/node/views_handler_field_history_user_timestamp.inc:32 +msgid "Check for new comments as well" +msgstr "Auch auf neue Kommentare überprüfen." + +#: modules/node/views_handler_field_node.inc:32 +msgid "Link this field to its node" +msgstr "Dieses Feld auf seinen Beitrag verlinken" + +#: modules/node/views_handler_field_node_revision_link_revert.inc:36 +msgid "revert" +msgstr "zurücksetzen" + +#: modules/node/views_handler_filter_node_language.inc:10 +#: modules/translation/views_handler_filter_node_language.inc:10 +msgid "Current user's language" +msgstr "Aktuelle Sprache des Benutzers" + +#: modules/node/views_handler_filter_node_language.inc:10 +#: modules/translation/views_handler_filter_node_language.inc:10 +msgid "No language" +msgstr "Keine Sprache" + +#: modules/node/views_handler_filter_node_type.inc:9 +msgid "Node type" +msgstr "Beitragstyp" + +#: modules/node/views_plugin_argument_validate_node.inc:29 +msgid "Types" +msgstr "Typen" + +#: modules/node/views_plugin_argument_validate_node.inc:32 +msgid "If you wish to validate for specific node types, check them; if none are checked, all nodes will pass." +msgstr "" + +#: modules/node/views_plugin_argument_validate_node.inc:39 +msgid "Validate user has access to the node" +msgstr "Überprüfen, ob der Benutzer Zugriff auf den Beitrag hat" + +#: modules/node/views_plugin_argument_validate_node.inc:47 +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:33 +msgid "Argument type" +msgstr "Argumenttyp" + +#: modules/node/views_plugin_argument_validate_node.inc:49 +msgid "Node ID" +msgstr "Beitrags-ID" + +#: modules/node/views_plugin_argument_validate_node.inc:50 +msgid "Node IDs separated by , or +" +msgstr "Beitrag-IDs getrennt nach , oder +" + +#: modules/node/views_plugin_row_node_rss.inc:26 +msgid "Full text" +msgstr "Vollständiger Text" + +#: modules/node/views_plugin_row_node_rss.inc:27 +msgid "Title plus teaser" +msgstr "Titel mit Anrißtext" + +#: modules/node/views_plugin_row_node_rss.inc:28 +msgid "Title only" +msgstr "Nur Titel" + +#: modules/node/views_plugin_row_node_rss.inc:29 +msgid "Use default RSS settings" +msgstr "Die Standard-RSS-Einstellungen verwenden" + +#: modules/node/views_plugin_row_node_rss.inc:95 +msgid "read more" +msgstr "Weiterlesen" + +#: modules/node/views_plugin_row_node_view.inc:27 +msgid "Display only teaser" +msgstr "Nur den Anrißtext anzeigen" + +#: modules/node/views_plugin_row_node_view.inc:37 +msgid "Display node comments" +msgstr "Beitragskommentare anzeigen" + +#: modules/search/views_handler_filter_search.inc:23 +msgid "On empty input" +msgstr "Bei leerer Eingabe" + +#: modules/search/views_handler_filter_search.inc:26 +msgid "Show All" +msgstr "Alle anzeigen" + +#: modules/search/views_handler_filter_search.inc:27 +msgid "Show None" +msgstr "Keine anzeigen" + +#: modules/search/views_handler_filter_search.inc:42 +msgid "Enter the terms you wish to search for." +msgstr "Die Begriffe eingeben nach denen gesucht werden soll." + +#: modules/search/views_handler_filter_search.inc:62 +msgid "You must include at least one positive keyword with @count characters or more." +msgstr "Es muss mindestens ein gültiges Stichwort in der Suchanfrage verwendet werden, das mindestens @count oder mehr Zeichen enthält." + +#: modules/search/views_handler_filter_search.inc:66 +msgid "Search for either of the two terms with uppercase OR. For example, cats OR dogs." +msgstr "Mit großgeschriebenem OR nach einem von beiden Begriffen suchen. Beispielsweise Katzen OR Hunde." + +#: modules/search/views_plugin_row_search_view.inc:23 +msgid "Display score" +msgstr "Anzeigepunktzahl" + +#: modules/system/views_handler_argument_file_fid.inc:13 +msgid "No title" +msgstr "Kein Titel" + +#: modules/system/views_handler_field_file.inc:29 +#: modules/upload/views_handler_field_upload_description.inc:24 +#: modules/upload/views_handler_field_upload_fid.inc:21 +msgid "Link this field to download the file" +msgstr "" + +#: modules/taxonomy/views_handler_argument_taxonomy.inc:18 +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:125 +msgid "No name" +msgstr "Kein Name" + +# festlegen? +#: modules/taxonomy/views_handler_argument_term_node_tid.inc:17 +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:38 +msgid "Set the breadcrumb for the term parents" +msgstr "Die Pfadnavigation für die übergeordneten Begriffe festlegen" + +#: modules/taxonomy/views_handler_argument_term_node_tid.inc:18 +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:39 +msgid "If selected, the breadcrumb trail will include all parent terms, each one linking to this view. Note that this only works if just one term was received." +msgstr "" + +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:26 +msgid "The depth will match nodes tagged with terms in the hierarchy. For example, if you have the term \"fruit\" and a child term \"apple\", with a depth of 1 (or higher) then filtering for the term \"fruit\" will get nodes that are tagged with \"apple\" as well as \"fruit\". If negative, the reverse is true; searching for \"apple\" will also pick up nodes tagged with \"fruit\" if depth is -1 (or lower)." +msgstr "" + +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:31 +msgid "Allow multiple terms per argument" +msgstr "Ermöglicht mehrere Begriffe pro Argument." + +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:32 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3. Due to the number of JOINs it would require, AND will be treated as OR with this argument." +msgstr "Sobald aktiviert, können Benutzer mehrere Argumente in der Form von 1+2+3 eingeben. Aufgrund der Anzahl der erforderlichen JOINs wird AND mit diesem Argument als OR betrachtet." + +#: modules/taxonomy/views_handler_argument_vocabulary_vid.inc:15 +msgid "No vocabulary" +msgstr "Kein Vokabular" + +# TODO: See: Link this field to its term page +#: modules/taxonomy/views_handler_field_taxonomy.inc:33 +msgid "Link this field to its taxonomy term page" +msgstr "Dieses Feld mit seiner Taxonomie-Begriffseite verlinken" + +# TODO: See: Link this field to its taxonomy term page +#: modules/taxonomy/views_handler_field_term_node_tid.inc:34 +msgid "Link this field to its term page" +msgstr "Dieses Feld mit seiner Begriffseite verlinken" + +#: modules/taxonomy/views_handler_field_term_node_tid.inc:41 +msgid "Limit terms by vocabulary" +msgstr "Begriffe nach Vokabular begrenzen" + +#: modules/taxonomy/views_handler_field_term_node_tid.inc:55 +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:23 +msgid "Vocabularies" +msgstr "Vokabulare" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:39 +msgid "Select which vocabulary to show terms for in the regular options." +msgstr "" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:49 +msgid "Selection type" +msgstr "Auswahltyp" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:50 +msgid "Dropdown" +msgstr "Auswahlliste" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:50 +msgid "Autocomplete" +msgstr "Autovervollständigung" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:56 +msgid "Show hierarchy in dropdown" +msgstr "Hierarchie in Auswahlliste anzeigen" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:73 +msgid "An invalid vocabulary is selected. Please change it in the options." +msgstr "Ein ungültiges Vokabular wurde ausgewählt. Bitte in den Optionen ändern." + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:91;147 +msgid "Select terms from vocabulary @voc" +msgstr "Begriffe aus dem Vokabular @voc wählen." + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:255 +msgid "Unable to find term: @terms" +msgid_plural "Unable to find terms: @terms" +msgstr[0] "Begriff konnte nicht gefunden werden: @terms" +msgstr[1] "Begriffe konnten nicht gefunden werden: @terms" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:26 +msgid "If you wish to validate for specific vocabularies, check them; if none are checked, all terms will pass." +msgstr "" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:36 +msgid "Term IDs separated by , or +" +msgstr "Begriff-IDs getrennt nach , oder +" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:37 +msgid "Term name or synonym" +msgstr "Begriffsname oder Synonym" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:38 +msgid "Term name/synonym converted to Term ID" +msgstr "Begriffname/Synonym wurde zur Begriff-ID konvertiert." + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:41 +msgid "Select the form of this argument; if using term name, it is generally more efficient to convert it to a term ID and use Taxonomy: Term ID rather than Taxonomy: Term Name\" as an argument." +msgstr "" + +#: modules/translation/views_handler_filter_node_language.inc:10 +msgid "Default site language" +msgstr "Standardmäßige Websitesprache" + +#: modules/translation/views_handler_relationship_translation.inc:24 +msgid "Current language" +msgstr "Aktuelle Sprache" + +#: modules/translation/views_handler_relationship_translation.inc:25 +msgid "Default language" +msgstr "Standardsprache" + +#: modules/translation/views_handler_relationship_translation.inc:32 +msgid "Translation option" +msgstr "Übersetzungsoption" + +#: modules/translation/views_handler_relationship_translation.inc:33 +msgid "The translation options allows you to select which translation or translations in a translation set join on. Select \"Current language\" or \"Default language\" to join on the translation in the current or default language respectively. Select a specific language to join on a translation in that language. If you select \"All\", each translation will create a new row, which may appear to cause duplicates." +msgstr "" + +#: modules/upload/views_handler_field_upload_fid.inc:27 +msgid "Only show \"listed\" file attachments" +msgstr "Nur „aufgelistete“ Dateianhänge anzeigen" + +#: modules/user/views_handler_field_user.inc:30 +msgid "Link this field to its user" +msgstr "Dieses Feld mit seinem Benutzer verlinken" + +#: modules/user/views_handler_field_user_mail.inc:16 +msgid "Link this field" +msgstr "Dieses Feld verlinken" + +#: modules/user/views_handler_field_user_mail.inc:19 +msgid "No link" +msgstr "Keine Verlinkung" + +#: modules/user/views_handler_field_user_mail.inc:20 +msgid "To the user" +msgstr "Zu dem Benutzer" + +#: modules/user/views_handler_field_user_mail.inc:21 +msgid "With a mailto:" +msgstr "Mit einem mailto:" + +# TODO: English is not context sensitive +#: modules/user/views_handler_filter_user_current.inc:10 +msgid "Is the logged in user" +msgstr "Ist der angemeldete Benutzer" + +#: modules/user/views_handler_filter_user_name.inc:28 +msgid "Usernames" +msgstr "Benutzernamen" + +#: modules/user/views_handler_filter_user_name.inc:29 +msgid "Enter a comma separated list of user names." +msgstr "Eine kommagetrennte Liste von Benutzernamen." + +#: modules/user/views_handler_filter_user_name.inc:112 +msgid "Unable to find user: @users" +msgid_plural "Unable to find users: @users" +msgstr[0] "Benutzer konnte nicht gefunden werden: @users" +msgstr[1] "Benutzer konnten nicht gefunden werden: @users" + +#: modules/user/views_plugin_argument_default_user.inc:17 +msgid "Also look for a node and use the node author" +msgstr "" + +#: plugins/views_plugin_access_none.inc:9 +msgid "Unrestricted" +msgstr "Unbeschränkt" + +#: plugins/views_plugin_access_perm.inc:37 +msgid "Only users with the selected permission flag will be able to access this display. Note that users with \"access all views\" can see any view, regardless of other permissions." +msgstr "" + +#: plugins/views_plugin_access_role.inc:21 +msgid "No role(s) selected" +msgstr "Keine Rolle(n) ausgewählt" + +#: plugins/views_plugin_access_role.inc:24 +msgid "Multiple roles" +msgstr "Mehrere Rollen" + +#: plugins/views_plugin_access_role.inc:43 +msgid "Only the checked roles will be able to access this display. Note that users with \"access all views\" can see any view, regardless of role." +msgstr "Nur die aktivierten Rollen werden auf diese Anzeige zugreifen können. Beachten, dass Benutzer mit dem „Zugriff auf alle Ansichten“ alle Ansichten unabhängig von ihrer Rolle sehen können." + +#: plugins/views_plugin_access_role.inc:49 +msgid "You must select at least one role if type is \"by role\"" +msgstr "Beim Typ „nach Rolle“ muss mindestens eine Rolle ausgewählt sein." + +#: plugins/views_plugin_argument_default.inc:32 +msgid "Default argument" +msgstr "Standard-Argument" + +#: plugins/views_plugin_argument_default.inc:54 +msgid "Note: you do not have permission to modify this. If you change the default argument type, this setting will be lost and you will NOT be able to get it back." +msgstr "" + +#: plugins/views_plugin_argument_default_php.inc:17 +msgid "PHP argument code" +msgstr "PHP-Argumentcode" + +#: plugins/views_plugin_argument_default_php.inc:20 +msgid "Enter PHP code that returns a value to use for this argument. Do not use <?php ?>. You must return only a single value for just this argument." +msgstr "" + +#: plugins/views_plugin_argument_validate.inc:43 +msgid "Note: you do not have permission to modify this. If you change the validator, this setting will be lost and you will NOT be able to get it back." +msgstr "" + +#: plugins/views_plugin_argument_validate_php.inc:19 +msgid "PHP validate code" +msgstr "" + +#: plugins/views_plugin_argument_validate_php.inc:21 +msgid "Enter PHP code that returns TRUE or FALSE. No return is the same as FALSE, so be SURE to return something if you do not want to declare the argument invalid. Do not use <?php ?>. The argument to validate will be \"$argument\" and the view will be \"$view\". You may change the argument by setting \"$handler->argument\"." +msgstr "" + +#: plugins/views_plugin_display.inc:558 +msgid "Broken field" +msgstr "Beschädigtes Feld" + +#: plugins/views_plugin_display.inc:575 +msgid "Basic settings" +msgstr "Basiseinstellungen" + +#: plugins/views_plugin_display.inc:582 +msgid "Change the name of this display." +msgstr "Den Namen dieser Anzeige ändern." + +#: plugins/views_plugin_display.inc:594 +msgid "Change the title that this display will use." +msgstr "Den von dieser Anzeige verwendeten Titel ändern." + +#: plugins/views_plugin_display.inc:604 +msgid "Style" +msgstr "Design" + +#: plugins/views_plugin_display.inc:606 +msgid "Change the style plugin." +msgstr "Das Design-Plugin ändern." + +#: plugins/views_plugin_display.inc:620 +msgid "Row style" +msgstr "Zeilendesign" + +#: plugins/views_plugin_display.inc:622 +msgid "Change the row plugin." +msgstr "Das Zeilen-Plugin ändern." + +#: plugins/views_plugin_display.inc:632 +msgid "Use AJAX" +msgstr "AJAX verwenden" + +#: plugins/views_plugin_display.inc:634 +msgid "Change whether or not this display will use AJAX." +msgstr "Ändern, ob diese Anzeige AJAX verwenden soll oder nicht." + +#: plugins/views_plugin_display.inc:641 +msgid "Use pager" +msgstr "Seitennavigation verwenden" + +#: plugins/views_plugin_display.inc:642 +msgid "Mini" +msgstr "Mini" + +#: plugins/views_plugin_display.inc:643 +msgid "Change this display's pager setting." +msgstr "Die Seitennavigations-Einstellung dieser Anzeige ändern." + +#: plugins/views_plugin_display.inc:650;822 +msgid "Items per page" +msgstr "Beträge pro Seite" + +#: plugins/views_plugin_display.inc:650;822 +#: plugins/views_plugin_style_summary.inc:43 +msgid "Items to display" +msgstr "Anzuzeigende Einträge" + +#: plugins/views_plugin_display.inc:651 +msgid "Unlimited" +msgstr "Unbegrenzt" + +#: plugins/views_plugin_display.inc:652 +msgid "Change how many items to display." +msgstr "Die Anzahl der anzuzeigenden Beiträge ändern." + +#: plugins/views_plugin_display.inc:658 +msgid "More link" +msgstr "‚Weiter‘-Link" + +#: plugins/views_plugin_display.inc:660 +msgid "Specify whether this display will provide a \"more\" link." +msgstr "Festlegen, ob diese Anzeige einen „Weiter“-Link bereitstellt." + +#: plugins/views_plugin_display.inc:666;849 +msgid "Distinct" +msgstr "Eindeutig" + +#: plugins/views_plugin_display.inc:668;846 +msgid "Display only distinct items, without duplicates." +msgstr "Nur unterschiedliche Einträge ohne Duplikate anzeigen." + +#: plugins/views_plugin_display.inc:681 +msgid "Access" +msgstr "Zugriff" + +#: plugins/views_plugin_display.inc:683 +msgid "Specify access control type for this display." +msgstr "Den Zugriffskontrolltyp für diese Anzeige festlegen." + +#: plugins/views_plugin_display.inc:687 +msgid "Change settings for this access type." +msgstr "Einstellungen für diesen Zugriffstyp ändern." + +#: plugins/views_plugin_display.inc:707 +msgid "Link display" +msgstr "Anzeige verlinken" + +#: plugins/views_plugin_display.inc:709 +msgid "Specify which display this display will link to." +msgstr "Angeben, zu welcher Anzeige diese Anzeige verlinken soll." + +#: plugins/views_plugin_display.inc:716 +msgid "Exposed form in block" +msgstr "Hervorgehobenes Formular in Block" + +#: plugins/views_plugin_display.inc:718 +msgid "Allow the exposed form to appear in a block instead of the view." +msgstr "Ermöglicht das Erscheinen des hervorgehobenen Formulars in einem Block anstatt der Ansicht." + +#: plugins/views_plugin_display.inc:721;897 +msgid "Header" +msgstr "Kopfbereich" + +#: plugins/views_plugin_display.inc:721;913 +msgid "Footer" +msgstr "Fußbereich" + +#: plugins/views_plugin_display.inc:721;929 +msgid "Empty text" +msgstr "Leerer Text" + +#: plugins/views_plugin_display.inc:737 +msgid "Unknown/missing format" +msgstr "Unbekannt/fehlendes Format" + +# May not context sensitive +#: plugins/views_plugin_display.inc:745 +#, fuzzy +msgid "Change this display's !name." +msgstr "Den !name dieser Anzeige ändern." + +#: plugins/views_plugin_display.inc:751 +msgid "Theme" +msgstr "Theme" + +#: plugins/views_plugin_display.inc:752 +msgid "Information" +msgstr "Information" + +# not literally +#: plugins/views_plugin_display.inc:753 +msgid "Get information on how to theme this display" +msgstr "Information abrufen, wie diese Anzeige dargestellt werden soll." + +#: plugins/views_plugin_display.inc:779 +msgid "The name of this display" +msgstr "Der Name dieser Anzeige" + +#: plugins/views_plugin_display.inc:782 +msgid "This title will appear only in the administrative interface for the View." +msgstr "Dieser Titel wird nur in die Verwaltungsoberfläche für die Ansicht angezeigt." + +#: plugins/views_plugin_display.inc:787 +msgid "The title of this view" +msgstr "Der Titel dieser Ansicht." + +#: plugins/views_plugin_display.inc:790 +msgid "This title will be displayed with the view, wherever titles are normally displayed; i.e, as the page title, block title, etc." +msgstr "Dieser Titel wird mit der Ansicht angezeigt, wo in der Regel die Titel angezeigt werden. Beispielsweise als Seitentitel, Blocktitel, etc." + +# not literally +#: plugins/views_plugin_display.inc:795 +msgid "Use AJAX when available to load this view" +msgstr "Soweit möglich, soll diese Ansicht mit AJAX geladen werden." + +#: plugins/views_plugin_display.inc:799 +msgid "If set, this view will use an AJAX mechanism for paging, table sorting and exposed filters. This means the entire page will not refresh. It is not recommended that you use this if this view is the main content of the page as it will prevent deep linking to specific pages, but it is very useful for side content." +msgstr "" + +#: plugins/views_plugin_display.inc:808 +msgid "Use a pager for this view" +msgstr "Eine Seitennavigation für diese Ansicht verwenden" + +#: plugins/views_plugin_display.inc:811 +msgid "Full pager" +msgstr "Vollständige Seitennavigation" + +#: plugins/views_plugin_display.inc:811 +msgid "Mini pager" +msgstr "Kleine Seitennavigation" + +#: plugins/views_plugin_display.inc:816 +msgid "Pager element" +msgstr "Seitennavigationselement" + +#: plugins/views_plugin_display.inc:817 +msgid "Unless you're experiencing problems with pagers related to this view, you should leave this at 0. If using multiple pagers on one page you may need to set this number to a higher value so as not to conflict within the ?page= array. Large values will add a lot of commas to your URLs, so avoid if possible." +msgstr "" + +#: plugins/views_plugin_display.inc:826 +msgid "The number of items to display per page. Enter 0 for no limit." +msgstr "Die Anzahl der anzuzeigenden Einträge pro Seite. 0 für keine Begrenzung." + +#: plugins/views_plugin_display.inc:831 +msgid "Offset" +msgstr "Offset" + +#: plugins/views_plugin_display.inc:832 +msgid "The number of items to skip. For example, if this field is 3, the first 3 items will be skipped and not displayed. Offset can not be used if items to display is 0; instead use a very large number there." +msgstr "Die Anzahl der zu überspringenden Einträge. Sollte das Feld beispielsweise den Wert 3 enthalten, werden die ersten 3 Einträge übersprungen und nicht angezeigt. Der Offset kann nicht verwendet, wenn die anzuzeigenden Einträge 0 betragen. Stattdessen muss eine sehr großen Zahl verwendet werden." + +#: plugins/views_plugin_display.inc:837 +msgid "Add a more link to the bottom of the display." +msgstr "Am unteren Rand der Anzeige einen ‚mehr‘-Link einfügen." + +# TODO: Add more link +#: plugins/views_plugin_display.inc:840 +msgid "Create more link" +msgstr "‚Weiter‘-Link erstellen" + +#: plugins/views_plugin_display.inc:841 +msgid "This will add a more link to the bottom of this view, which will link to the page view. If you have more than one page view, the link will point to the display specified in 'Link display' above." +msgstr "Dies wird am unteren Rand dieser Ansicht einen ‚mehr‘-Link einfügen, der auf die Seitenansicht verlinkt. Sollte mehr wie eine Seitenansicht vorhanden sein, wird der Link auf die unter ‚Link-Anzeige‘ angegebene Anzeige zeigen." + +#: plugins/views_plugin_display.inc:850 +msgid "This will make the view display only distinct items. If there are multiple identical items, each will be displayed only once. You can use this to try and remove duplicates from a view, though it does not always work. Note that this can slow queries down, so use it with caution." +msgstr "" + +#: plugins/views_plugin_display.inc:855 +msgid "Access restrictions" +msgstr "Zugriffsberechtigungen" + +# TODO: not context sensitive +#: plugins/views_plugin_display.inc:874;954 +msgid "You may also adjust the !settings for the currently selected style by clicking on the icon." +msgstr "" + +#: plugins/views_plugin_display.inc:874;954;999 +msgid "settings" +msgstr "Einstellungen" + +#: plugins/views_plugin_display.inc:882 +msgid "Access options" +msgstr "Zugriffsoptionen" + +#: plugins/views_plugin_display.inc:900;916 +msgid "Display even if view has no result" +msgstr "Auch anzeigen, wenn die Ansicht keine Ergebnisse zurückliefert" + +#: plugins/views_plugin_display.inc:907 +msgid "Text to display at the top of the view. May contain an explanation or links or whatever you like. Optional." +msgstr "Am Anfang der Ansicht anzuzeigender Text. Dieser kann eine Erklärung, Links oder beliebige andere Inhalte enthalten. (Optional)" + +#: plugins/views_plugin_display.inc:923 +msgid "Text to display beneath the view. May contain an explanation or links or whatever you like. Optional." +msgstr "Unterhalb der Ansicht anzuzeigender Text. Dieser kann eine Erklärung, Links oder beliebige andere Inhalte enthalten. (Optional)" + +#: plugins/views_plugin_display.inc:934 +msgid "Text to display if the view has no results. Optional." +msgstr "Der anzuzeigende Text, wenn die Ansicht keine Ergebnisse zurückliefert. (Optional)" + +#: plugins/views_plugin_display.inc:940 +msgid "How should this view be styled" +msgstr "Wie soll diese Ansicht designed werden" + +#: plugins/views_plugin_display.inc:946 +msgid "If the style you choose has settings, be sure to click the settings button that will appear next to it in the View summary." +msgstr "" + +#: plugins/views_plugin_display.inc:960 +msgid "Style options" +msgstr "Darstellungsoptionen" + +#: plugins/views_plugin_display.inc:971 +msgid "Row style options" +msgstr "Darstellungsoptionen für Zeilen" + +#: plugins/views_plugin_display.inc:986 +msgid "How should each row in this view be styled" +msgstr "Wie soll jede Zeile in dieser Ansicht designed werden" + +#: plugins/views_plugin_display.inc:999 +msgid "You may also adjust the !settings for the currently selected row style by clicking on the icon." +msgstr "" + +#: plugins/views_plugin_display.inc:1005 +msgid "Which display to use for path" +msgstr "Welche Anzeige für den Pfad verwendet werden soll" + +#: plugins/views_plugin_display.inc:1014 +msgid "Which display to use to get this display's path for things like summary links, rss feed links, more links, etc." +msgstr "" + +#: plugins/views_plugin_display.inc:1019 +msgid "Theming information" +msgstr "Theming-Information" + +#: plugins/views_plugin_display.inc:1027 +msgid "Display output" +msgstr "Anzeigeausgabe" + +#: plugins/views_plugin_display.inc:1031 +msgid "Alternative display output" +msgstr "Alternative Anzeigeausgabe" + +#: plugins/views_plugin_display.inc:1038 +msgid "Style output" +msgstr "Designausgabe" + +#: plugins/views_plugin_display.inc:1042 +msgid "Alternative style" +msgstr "Alternatives Design" + +#: plugins/views_plugin_display.inc:1049 +msgid "Row style output" +msgstr "Ausgabe des Zeilendesign" + +#: plugins/views_plugin_display.inc:1053 +msgid "Alternative row style" +msgstr "Alternatives Zeilendesign" + +#: plugins/views_plugin_display.inc:1061 +msgid "Field @field (ID: @id)" +msgstr "Feld @field (ID: @id)" + +#: plugins/views_plugin_display.inc:1069 +msgid "This section lists all possible templates for the display plugin and for the style plugins, ordered roughly from the least specific to the most specific. The active template for each plugin -- which is the most specific template found on the system -- is highlighted in bold." +msgstr "" + +#: plugins/views_plugin_display.inc:1084 +msgid "Rescan template files" +msgstr "Vorlagendateien erneut einlesen" + +#: plugins/views_plugin_display.inc:1090 +#, fuzzy +msgid "Important! When adding, removing, or renaming template files, it is necessary to make Drupal aware of the changes by making it rescan the files on your system. By clicking this button you clear Drupal's theme registry and thereby trigger this rescanning process. The highlighted templates above will then reflect the new state of your system." +msgstr "Wichtig! Beim Hinzufügen, Entfernen oder Umbennennen von Template-Dateien ist es erforderlich Drupal über die Änderung durch neu Einlesen der Dateien auf dem System in Kenntnis zu setzen. Durch Anklicken dieses Schaltknopfs wird die Drupal-Theme-Registierung gelöscht und damit dieser Neueinleseprozess angestoßen. Die oberhalb hervorgehobenen Templates werden dann den neuen Stand des Systems wiedergeben." + +#: plugins/views_plugin_display.inc:1096 +msgid "Theming information (display)" +msgstr "Theming-Information (Anzeige)" + +#: plugins/views_plugin_display.inc:1097;1124;1153;1182 +msgid "Back to !info." +msgstr "Zurück zu !info." + +#: plugins/views_plugin_display.inc:1097;1124;1153;1182 +msgid "theming information" +msgstr "Theming-Information" + +# theming ? +#: plugins/views_plugin_display.inc:1100 +msgid "This display has no theming information" +msgstr "Für diese Anzeige gibt es keine Theming-Information" + +#: plugins/views_plugin_display.inc:1103 +msgid "This is the default theme template used for this display." +msgstr "Dies ist das standardmäßig verwendete Theme-Template für diese Anzeige." + +#: plugins/views_plugin_display.inc:1109 +msgid "This is an alternative template for this display." +msgstr "Dies ist eine alternative Vorlage für diese Anzeige." + +#: plugins/views_plugin_display.inc:1123 +msgid "Theming information (style)" +msgstr "Theming-Information (Design)" + +#: plugins/views_plugin_display.inc:1129 +msgid "This display has no style theming information" +msgstr "Diese Anzeige enthält keine Theming-Information für das Design" + +#: plugins/views_plugin_display.inc:1132 +msgid "This is the default theme template used for this style." +msgstr "Dies ist das standardmäßig verwendete Theme-Template für dieses Design." + +#: plugins/views_plugin_display.inc:1138 +msgid "This is an alternative template for this style." +msgstr "Dies ist ein alternatives Template für dieses Design." + +#: plugins/views_plugin_display.inc:1152;1181 +msgid "Theming information (row style)" +msgstr "Theming-Information (Zeilendesign)" + +#: plugins/views_plugin_display.inc:1158 +msgid "This display has no row style theming information" +msgstr "Diese Anzeige enthält keine Theming-Information für das Zeilendesign" + +#: plugins/views_plugin_display.inc:1161;1184 +msgid "This is the default theme template used for this row style." +msgstr "Dies ist das standardmäßig verwendete Theme-Template für dieses Zeilendesign." + +#: plugins/views_plugin_display.inc:1167 +msgid "This is an alternative template for this row style." +msgstr "Dies ist ein alternatives Template für dieses Zeilendesign." + +#: plugins/views_plugin_display.inc:1199 +msgid "Put the exposed form in a block" +msgstr "Das hervorgehobene Formular in einen Block legen" + +# not literally +#: plugins/views_plugin_display.inc:1203 +msgid "If set, any exposed widgets will not appear with this view. Instead, a block will be made available to the Drupal block administration system, and the exposed form will appear there. Note that this block must be enabled manually, Views will not enable it for you." +msgstr "Sobald aktiviert, wird jedes hervorgehobenes Steuerelement nicht mit der Ansicht erscheinen. Stattdessen wird dem Drupal-Blockverwaltungssystem ein Block zu Verfügung gestellt, der das hervorgehobene Formular enthält. Hierbei ist zu beachten, dass dieser Block manuell aktiviert werden muss und nicht durch das Ansichten-Modul aktiviert wird." + +#: plugins/views_plugin_display.inc:1238 +msgid "File found in folder @template-path" +msgstr "Datei wurde im Verzeichnis @template-path gefunden" + +#: plugins/views_plugin_display.inc:1242 +msgid "(File not found, in folder @template-path)" +msgstr "(Datei wurde im Verzeichnis @template-path nicht gefunden)" + +#: plugins/views_plugin_display.inc:1399 +msgid "Override" +msgstr "Übersteuern" + +#: plugins/views_plugin_display.inc:1404 +msgid "Status: using default values." +msgstr "Status: Standardwerte werden verwendet." + +#: plugins/views_plugin_display.inc:1408 +msgid "Update default display" +msgstr "Standardanzeige aktualisieren" + +#: plugins/views_plugin_display.inc:1413 +msgid "Use default" +msgstr "Standard verwenden" + +#: plugins/views_plugin_display.inc:1418 +msgid "Status: using overridden values." +msgstr "Status: Übersteuerte Werte werden verwendet." + +#: plugins/views_plugin_display.inc:1633 +msgid "Display \"@display\" uses fields but there are none defined for it or all are excluded." +msgstr "Die Anzeige „@display“ verwendet Felder, aber es sind keine dafür angegeben oder alle ausgeschlossen." + +#: plugins/views_plugin_display.inc:1638 +msgid "Display \"@display\" uses a path but the path is undefined." +msgstr "Die Anzeige „@display“ verwendet einen Pfad, aber der Pfad ist nicht angegeben." + +#: plugins/views_plugin_display.inc:1643 +msgid "Display \"@display\" has an invalid style plugin." +msgstr "Die Anzeige „@display“ verwendet ein ungültiges Design-Plugin." + +#: plugins/views_plugin_display.inc:1659 +msgid "Exposed form: @view-@display_id" +msgstr "Hervorgehobenes Formular: @view-@display_id" + +#: plugins/views_plugin_display_attachment.inc:35 +msgid "Before" +msgstr "Vorher" + +#: plugins/views_plugin_display_attachment.inc:36 +msgid "After" +msgstr "Nachdem" + +#: plugins/views_plugin_display_attachment.inc:37 +msgid "Both" +msgstr "Beide" + +#: plugins/views_plugin_display_attachment.inc:57 +msgid "Attachment settings" +msgstr "Einstellungen für Anhänge" + +#: plugins/views_plugin_display_attachment.inc:62;109 +msgid "Inherit arguments" +msgstr "Vererbte Argumente" + +# übernehmen/vererben? +#: plugins/views_plugin_display_attachment.inc:68;118 +msgid "Inherit exposed filters" +msgstr "Hervorgehobene Filter übernehmen" + +#: plugins/views_plugin_display_attachment.inc:74;127 +msgid "Position" +msgstr "Position" + +#: plugins/views_plugin_display_attachment.inc:80 +#: plugins/views_plugin_display_feed.inc:98 +msgid "Multiple displays" +msgstr "Mehrere Anzeigen" + +#: plugins/views_plugin_display_attachment.inc:95;136 +#: plugins/views_plugin_display_feed.inc:113;140 +msgid "Attach to" +msgstr "Anhängen an" + +#: plugins/views_plugin_display_attachment.inc:112;121 +msgid "Inherit" +msgstr "Vererben" + +#: plugins/views_plugin_display_attachment.inc:113 +msgid "Should this display inherit its arguments from the parent display to which it is attached?" +msgstr "" + +#: plugins/views_plugin_display_attachment.inc:122 +msgid "Should this display inherit its exposed filter values from the parent display to which it is attached?" +msgstr "" + +#: plugins/views_plugin_display_attachment.inc:130 +msgid "Attach before or after the parent display?" +msgstr "Bevor oder nach der übergeordneten Anzeige anhängen?" + +#: plugins/views_plugin_display_attachment.inc:145 +msgid "Select which display or displays this should attach to." +msgstr "" + +#: plugins/views_plugin_display_block.inc:68 +msgid "Block settings" +msgstr "Blockeinstellungen" + +#: plugins/views_plugin_display_block.inc:82 +msgid "Admin" +msgstr "Admin" + +#: plugins/views_plugin_display_block.inc:106 +msgid "Do not cache" +msgstr "Nicht cachen" + +#: plugins/views_plugin_display_block.inc:107 +msgid "Cache once for everything (global)" +msgstr "Einmalig für alles (global) cachen." + +#: plugins/views_plugin_display_block.inc:108 +msgid "Per page" +msgstr "Nach Seite" + +#: plugins/views_plugin_display_block.inc:109 +msgid "Per role" +msgstr "Nach Rolle" + +# ? +#: plugins/views_plugin_display_block.inc:110 +msgid "Per role per page" +msgstr "Nach Rolle und Seite" + +#: plugins/views_plugin_display_block.inc:111 +msgid "Per user" +msgstr "Nach Benutzer" + +# ? +#: plugins/views_plugin_display_block.inc:112 +msgid "Per user per page" +msgstr "Nach Benutzer und Seite" + +#: plugins/views_plugin_display_block.inc:137 +msgid "Block admin description" +msgstr "" + +#: plugins/views_plugin_display_block.inc:140 +msgid "This will appear as the name of this block in administer >> site building >> blocks." +msgstr "Dies wird als der Name dieses Blocks in Verwalten >> Strukturierung >> Blöcke erscheinen." + +#: plugins/views_plugin_display_block.inc:145 +msgid "Block caching type" +msgstr "Cachetyp für Blöcke" + +#: plugins/views_plugin_display_block.inc:149 +msgid "This sets the default status for Drupal's built-in block caching method; this requires that caching be turned on in block administration, and be careful because you have little control over when this cache is flushed." +msgstr "" + +#: plugins/views_plugin_display_feed.inc:86 +msgid "Feed settings" +msgstr "Newsfeed-Einstellungen" + +#: plugins/views_plugin_display_feed.inc:90 +msgid "Using the site name" +msgstr "Der Name der Website wird verwendet" + +#: plugins/views_plugin_display_feed.inc:132 +msgid "Use the site name for the title" +msgstr "Den Namen der Website für den Titel verwenden." + +#: plugins/views_plugin_display_feed.inc:149 +msgid "The feed icon will be available only to the selected displays." +msgstr "Das Feed-Symbol wird nur in den ausgewählten Anzeigen zur Verfügung stehen." + +#: plugins/views_plugin_display_feed.inc:155 +msgid "This view will be displayed by visiting this path on your site. It is recommended that the path be something like \"path/%/%/feed\" or \"path/%/%/rss.xml\", putting one % in the path for each argument you have defined in the view." +msgstr "Diese Ansicht wird durch den Besuch des Pfades auf der Website angezeigt. Es werden Pfade wie „pfad/%/%/feed“ oder „pfad/%/%/rss.xml“ empfohlen, bei dem für jedes in der Ansicht festgelegte Argument ein % in den Pfad eingefügt wird." + +#: plugins/views_plugin_display_page.inc:188 +msgid "Page settings" +msgstr "Seiteneinstellungen" + +#: plugins/views_plugin_display_page.inc:213 +msgid "No menu" +msgstr "Kein Menü" + +#: plugins/views_plugin_display_page.inc:216 +msgid "Normal: @title" +msgstr "Normal: @title" + +#: plugins/views_plugin_display_page.inc:220 +msgid "Tab: @title" +msgstr "Reiter: @title" + +#: plugins/views_plugin_display_page.inc:230;302 +msgid "Menu" +msgstr "Menü" + +#: plugins/views_plugin_display_page.inc:236 +msgid "Change settings for the parent menu" +msgstr "Einstellungen für das übergeordnete Menü ändern" + +#: plugins/views_plugin_display_page.inc:249 +msgid "The menu path or URL of this view" +msgstr "Der Menüpfad oder URL von dieser Ansicht" + +#: plugins/views_plugin_display_page.inc:253 +msgid "This view will be displayed by visiting this path on your site. You may use \"%\" in your URL to represent values that will be used for arguments: For example, \"node/%/feed\"." +msgstr "" + +#: plugins/views_plugin_display_page.inc:259 +msgid "Menu item entry" +msgstr "Menüpunkt" + +#: plugins/views_plugin_display_page.inc:276 +msgid "No menu entry" +msgstr "Kein Menüpunkt" + +#: plugins/views_plugin_display_page.inc:277 +msgid "Normal menu entry" +msgstr "Normaler Menüpunkt" + +#: plugins/views_plugin_display_page.inc:278;343 +msgid "Menu tab" +msgstr "Menü-Reiter" + +#: plugins/views_plugin_display_page.inc:279 +msgid "Default menu tab" +msgstr "Standardmäßiger Menü-Reiter" + +#: plugins/views_plugin_display_page.inc:288 +msgid "If set to normal or tab, enter the text to use for the menu item." +msgstr "Den zu verwendenden Text für den Menüpunkt eingeben, wenn dieser auf Normal oder Reiter eingestellt wird." + +#: plugins/views_plugin_display_page.inc:295 +msgid "Warning: Changing this item's menu will not work reliably in Drupal 6.4 or earlier. Please upgrade your copy of Drupal at !url." +msgstr "" + +#: plugins/views_plugin_display_page.inc:306 +msgid "Insert item into an available menu." +msgstr "Menüeintrag in ein vorhandenes Menü eintragen." + +#: plugins/views_plugin_display_page.inc:315 +msgid "The lower the weight the higher/further left it will appear." +msgstr "Je niedriger die Reihenfolge, umso höher bzw. weiter links wird es erscheinen." + +#: plugins/views_plugin_display_page.inc:321 +msgid "Default tab options" +msgstr "Standardmäßige Reiteroptionen" + +#: plugins/views_plugin_display_page.inc:330 +msgid "When providing a menu item as a tab, Drupal needs to know what the parent menu item of that tab will be. Sometimes the parent will already exist, but other times you will need to have one created. The path of a parent item will always be the same path with the last part left off. i.e, if the path to this view is foo/bar/baz, the parent path would be foo/bar." +msgstr "" + +#: plugins/views_plugin_display_page.inc:341 +msgid "Parent menu item" +msgstr "Übergeordneter Menüpunkt" + +#: plugins/views_plugin_display_page.inc:343 +msgid "Already exists" +msgstr "Schon vorhanden" + +#: plugins/views_plugin_display_page.inc:343 +msgid "Normal menu item" +msgstr "Normaler Menüpunkt" + +#: plugins/views_plugin_display_page.inc:351 +msgid "If creating a parent menu item, enter the title of the item." +msgstr "Einen Titel für den Menüpunkt eingeben, wenn ein übergeordneter Menüpunkt erstellt wird." + +#: plugins/views_plugin_display_page.inc:357 +msgid "Tab weight" +msgstr "Reiterreihenfolge" + +#: plugins/views_plugin_display_page.inc:361 +msgid "If the parent menu item is a tab, enter the weight of the tab. The lower the number, the more to the left it will be." +msgstr "Die Reihenfolge des Reiters eingeben, wenn der übergeordnete Menüpunkt ein Reiter ist. Umso niedriger die Zahl ist, desto weiter links wird er angezeigt." + +#: plugins/views_plugin_display_page.inc:375 +msgid "\"$arg\" is no longer supported. Use % instead." +msgstr "„$arg“ wird nicht mehr unterstützt. Stattdessen kann % verwendet werden." + +#: plugins/views_plugin_display_page.inc:379 +msgid "\"%\" may not be used for the first segment of a path." +msgstr "„%“ darf nicht als erstes Segment eines Pfades verwendet werden." + +#: plugins/views_plugin_display_page.inc:389 +msgid "Views cannot create normal menu items for paths with a % in them." +msgstr "Ansichten können keine normalen Menüpunkt für Pfade mit einem % erstellen." + +#: plugins/views_plugin_display_page.inc:396 +msgid "A display whose path ends with a % cannot be a tab." +msgstr "Eine Anzeige deren Pfad mit einem % abschließt kann kein Reiter sein." + +#: plugins/views_plugin_display_page.inc:401 +msgid "Title is required for this menu type." +msgstr "Ein Titel ist für diesen Menütyp erforderlich." + +#: plugins/views_plugin_display_page.inc:432 +msgid "Display @display is set to use a menu but the menu title is not set." +msgstr "Die Anzeige @display ist konfiguriert ein Menü zu verwenden, aber der Menütitel ist nicht vorhanden." + +#: plugins/views_plugin_display_page.inc:438 +msgid "Display @display is set to use a parent menu but the parent menu title is not set." +msgstr "Die Anzeige @display ist konfiguriert ein übergeordnetes Menü zu verwenden, aber der übergeordnete Menütitel ist nicht vorhanden." + +#: plugins/views_plugin_row_fields.inc:40 +msgid "Inline fields" +msgstr "Inline-Felder" + +#: plugins/views_plugin_row_fields.inc:43 +msgid "Inline fields will be displayed next to each other rather than one after another." +msgstr "" + +#: plugins/views_plugin_row_fields.inc:51 +msgid "The separator may be placed between inline fields to keep them from squishing up next to each other. You can use HTML in this field." +msgstr "" + +#: plugins/views_plugin_style.inc:91 +msgid "Grouping field" +msgstr "Gruppierungsfeld" + +#: plugins/views_plugin_style.inc:94 +msgid "You may optionally specify a field by which to group the records. Leave blank to not group." +msgstr "" + +#: plugins/views_plugin_style.inc:191 +msgid "Style @style requires a row style but the row plugin is invalid." +msgstr "Das Design @style erfordert ein Zeilendesign, aber das Zeilen-Plugin ist ungültig." + +#: plugins/views_plugin_style_grid.inc:33 +msgid "Number of columns" +msgstr "Anzahl der Spalten" + +#: plugins/views_plugin_style_grid.inc:38 +msgid "Alignment" +msgstr "Ausrichtung" + +#: plugins/views_plugin_style_grid.inc:39 +msgid "Horizontal" +msgstr "Horizontal" + +#: plugins/views_plugin_style_grid.inc:39 +msgid "Vertical" +msgstr "Vertikal" + +#: plugins/views_plugin_style_grid.inc:41 +msgid "Horizontal alignment will place items starting in the upper left and moving right. Vertical alignment will place items starting in the upper left and moving down." +msgstr "" + +#: plugins/views_plugin_style_list.inc:32 +msgid "List type" +msgstr "Listentyp" + +#: plugins/views_plugin_style_rss.inc:56 +msgid "Use the site mission for the description" +msgstr "Die Websitebeschreibung für die Beschreibung verwenden." + +#: plugins/views_plugin_style_rss.inc:60 +msgid "RSS description" +msgstr "RSS-Beschreibung" + +# not literally +#: plugins/views_plugin_style_rss.inc:62 +#, fuzzy +msgid "This will appear in the RSS feed itself." +msgstr "Dies wird in dem RSS-Newsfeed erscheinen." + +#: plugins/views_plugin_style_summary.inc:34 +#, fuzzy +msgid "Display record count with link" +msgstr "Anzahl der Ergebnisse mit dem Link anzeigen" + +#: plugins/views_plugin_style_summary.inc:39 +msgid "Override number of items to display" +msgstr "Die Anzahl der anzuzeigenden Einträge übersteuern" + +#: plugins/views_plugin_style_summary_unformatted.inc:26 +#, fuzzy +msgid "Display items inline" +msgstr "Einträge inline anzeigen" + +#: plugins/views_plugin_style_table.inc:126 +msgid "You need at least one field before you can configure your table settings" +msgstr "Mindestens ein Feld ist erforderlich, bevor die Tabelleneinstellungen konfiguriert werden können" + +#: plugins/views_plugin_style_table.inc:135 +msgid "Override normal sorting if click sorting is used" +msgstr "Normale Sortierung übersteuern, wenn die Klick-Sortierung verwendet wird." + +#: plugins/views_plugin_style_table.inc:141 +msgid "Enable Drupal style \"sticky\" table headers (Javascript)" +msgstr "" + +#: plugins/views_plugin_style_table.inc:143 +msgid "(Sticky header effects will not be active for preview below, only on live output.)" +msgstr "" + +#: plugins/views_plugin_style_table.inc:148 +msgid "Default sort order" +msgstr "Standardsortierung" + +#: plugins/views_plugin_style_table.inc:151 +#, fuzzy +msgid "If a default sort order is selected, what order should it use by default." +msgstr "Welche standardmäßige Sortierung bei der standardmäßigen Sortierreihenfolge verwendet werden soll." + +#: plugins/views_plugin_style_table.inc:237 +msgid "Place fields into columns; you may combine multiple fields into the same column. If you do, the separator in the column specified will be used to separate the fields. Check the sortable box to make that column click sortable, and check the default sort radio to determine which column will be sorted by default, if any. You may control column order and field labels in the fields section." +msgstr "" + +#: theme/views-more.tpl.php:15 +msgid "more" +msgstr "Weiter" + +#: theme/views-ui-edit-item.tpl.php:32 +msgid "The style selected does not utilize fields." +msgstr "Das ausgewählte Design verwendet keine Felder." + +#: theme/views-ui-edit-item.tpl.php:34 +msgid "None defined" +msgstr "Nicht definiert" + +#: theme/views-ui-edit-tab.tpl.php:31 +msgid "View settings" +msgstr "Einstellungen der Ansicht" + +#: theme/views-ui-edit-view.tpl.php:11 +msgid "This view is being edited by user !user, and is therefore locked from editing by others. This lock is !age old. Click here to break this lock." +msgstr "Diese Ansicht wird gerade vom Benutzer !user bearbeitet und ist deshalb für die Bearbeitung durch andere gesperrt. Diese Sperre ist !age alt. Hier klicken um die Sperre aufzuheben." + +#: theme/views-ui-edit-view.tpl.php:16 +msgid "New view" +msgstr "Neue Ansicht" + +#: theme/views-ui-edit-view.tpl.php:18 +msgid "Changed view" +msgstr "Ansicht wurde geändert" + +#: theme/views-ui-edit-view.tpl.php:23 +msgid "View %name, displaying items of type @base." +msgstr "Die Ansicht %name zeigt Einträge vom Typ @base an." + +#: theme/views-ui-edit-view.tpl.php:42 +msgid "Live preview" +msgstr "Live-Vorschau" + +#: theme/views-ui-list-views.tpl.php:17 +msgid "@type @base view: @view" +msgstr "@type @base-Ansicht: @view" + +#: theme/views-ui-list-views.tpl.php:27 +msgid "Title: @title" +msgstr "Titel: @title" + +#: theme/views-ui-list-views.tpl.php:30 +msgid "Path: !path" +msgstr "Pfad: !path" + +#: theme/theme.inc:90 +msgid "Edit this view" +msgstr "Diese Ansicht bearbeiten" + +#: theme/theme.inc:307 +msgid "sort by @s" +msgstr "Nach @s sortieren" + +#: theme/theme.inc:559 +msgid "‹‹" +msgstr "‹‹" + +#: theme/theme.inc:560 +msgid "››" +msgstr "››" + +#: theme/theme.inc:570 +msgid "@current of @max" +msgstr "@current von @max" + +#: views_export/views_export.module:76 +msgid "There are no views to be exported at this time." +msgstr "Derzeit gibt es keine zu exportierenden Ansichten." + +# "Tags" als "Tags" belassen? +#: views_export/views_export.module:108 +msgid "Show only these tags" +msgstr "Nur diese Kennzeichnungen anzeigen" + +#: views_export/views_export.module:122 +msgid "Module name" +msgstr "Modulname" + +#: views_export/views_export.module:123 +msgid "Enter the module name to export code to." +msgstr "Den Modulnamen angebenen zu dem Code exportiert wird." + +# TODO: English needs work +#: views_export/views_export.module:190 +msgid "Put this in @module.views_default.inc in your modules/@module directory or modules/@module/includes directory" +msgstr "Diesen Code im Verzeichnis modules/@module oder modules/@module/includes in eine Datei mit dem Namen @module.views_default.inc eingefügen." + +#: views_export/views_export.module:44 +msgid "use views exporter" +msgstr "Ansichten-Export verwenden" + +#: views_export/views_export.module:17 +msgid "Bulk export" +msgstr "Massenexport" + +#: views_export/views_export.module:0 +msgid "views_export" +msgstr "views_export" + +# Name of the views export module +#: views_export/views_export.info:0 +msgid "Views exporter" +msgstr "Ansichten-Export" + +#: views_export/views_export.info:0 +msgid "Allows exporting multiple views at once." +msgstr "Ermöglicht den Export mehrerer Ansichten auf einmal." + +#~ msgid "break this lock" +#~ msgstr "Sperre aufheben" + +#, fuzzy +#~ msgid "exposed>" +#~ msgstr "hervorgehoben" +#~ msgid "By role" +#~ msgstr "Nach Rolle" +#~ msgid "By permission" +#~ msgstr "Nach Berechtigung" +#~ msgid "" +#~ "Email address for a given user. Only accessible to users with " +#~ "administer users permission" +#~ msgstr "" +#~ "E-Mail-Adresse eines angegebenen Benutzers. Nur Benutzer mit der " +#~ "Benutzer verwalten-Berechtigung können darauf zugreifen." +#~ msgid "If by role" +#~ msgstr "Wenn nach Rolle" +#~ msgid "If by permission" +#~ msgstr "Wenn nach Berechtigung" +#~ msgid "Caching" +#~ msgstr "Caching" +#~ msgid "User ID" +#~ msgstr "Benutzer-ID" +#~ msgid "administer views" +#~ msgstr "Ansichten verwalten" +#~ msgid "Shows all new activity on system." +#~ msgstr "Alle neuen Aktivitäten auf dem System anzeigen." +#~ msgid "Replies" +#~ msgstr "Antworten" +#~ msgid "Last Post" +#~ msgstr "Letzter Beitrag" + +#, fuzzy +#~ msgid " new" +#~ msgstr " neu" +#~ msgid "Recent posts for %1" +#~ msgstr "Neueste Beiträge für %1" +#~ msgid "Recent posts" +#~ msgstr "Neue Beiträge" +#~ msgid "Recent comments" +#~ msgstr "Neueste Kommentare" +#~ msgid "Reply to" +#~ msgstr "Antwort an" +#~ msgid "Pages that link to %1" +#~ msgstr "Seiten die zu %1 verweisen" + +# core? +#, fuzzy +#~ msgid "Popular content" +#~ msgstr "Beliebter Inhalt" +#~ msgid "Popular (page)" +#~ msgstr "Beliebt (Seite)" +#~ msgid "Today (page)" +#~ msgstr "Heute (Seite)" +#~ msgid "Today's popular content" +#~ msgstr "Heutiger beliebtester Inhalt" +#~ msgid "Popular (block)" +#~ msgstr "Beliebt (Block)" +#~ msgid "Today (block)" +#~ msgstr "Heute (Block)" +#~ msgid "Core feed" +#~ msgstr "Kern-Newsfeed" + diff --git a/translations/eo.po b/translations/eo.po new file mode 100644 index 0000000000000000000000000000000000000000..f85089c8ffc5fcd82878b76e3ec0069df722bd0d --- /dev/null +++ b/translations/eo.po @@ -0,0 +1,4102 @@ +# $Id$ +# +# Esperanto translation of Drupal (general) +# Copyright 2008 Chuck Smith +# Generated from files: +# views.module,v 1.300 2008/06/25 21:10:10 merlinofchaos +# admin.inc,v 1.123 2008/07/02 18:43:08 merlinofchaos +# views_ui.module,v 1.99 2008/06/04 00:09:53 merlinofchaos +# views_export.module,v 1.2 2008/06/25 21:42:20 merlinofchaos +# views.info,v 1.7 2007/08/12 06:52:14 merlinofchaos +# views_ui.info,v 1.10 2008/01/09 00:05:08 merlinofchaos +# views_export.info,v 1.1 2008/06/12 16:17:25 merlinofchaos +# plugins.inc,v 1.134 2008/07/04 16:47:20 merlinofchaos +# convert.inc,v 1.11 2008/06/26 16:41:01 merlinofchaos +# theme.inc,v 1.53 2008/07/03 15:54:08 merlinofchaos +# views.install,v 1.41 2008/06/03 23:50:44 merlinofchaos +# docs.php,v 1.8 2008/06/18 15:25:46 merlinofchaos +# node.views.inc,v 1.76 2008/07/02 18:14:03 merlinofchaos +# view.inc,v 1.116 2008/07/03 18:01:44 merlinofchaos +# system.views.inc,v 1.6 2008/06/26 00:58:29 merlinofchaos +# user.views.inc,v 1.47 2008/06/26 00:58:29 merlinofchaos +# argument.handlers.inc,v 1.40 2008/07/04 20:43:33 merlinofchaos +# comment.views.inc,v 1.20 2008/07/02 17:42:57 merlinofchaos +# statistics.views.inc,v 1.7 2008/06/26 00:58:29 merlinofchaos +# upload.views.inc,v 1.12 2008/06/30 16:37:14 merlinofchaos +# book.views.inc,v 1.4 2008/07/02 17:42:57 merlinofchaos +# taxonomy.views.inc,v 1.37 2008/07/02 18:53:40 merlinofchaos +# ajax.inc,v 1.15 2008/06/14 17:42:42 merlinofchaos +# field.handlers.inc,v 1.13 2008/06/18 15:25:46 merlinofchaos +# filter.handlers.inc,v 1.25 2008/07/03 05:05:12 merlinofchaos +# relationship.handlers.inc,v 1.7 2008/06/30 16:37:14 merlinofchaos +# sort.handlers.inc,v 1.6 2008/06/18 15:25:46 merlinofchaos +# form.inc,v 1.10 2008/06/25 21:10:10 merlinofchaos +# handlers.inc,v 1.88 2008/06/25 22:20:01 merlinofchaos +# ajax.js,v 1.21 2008/05/27 22:31:59 merlinofchaos +# ajax_view.js,v 1.5 2008/05/27 22:31:59 merlinofchaos +# tabs.js,v 1.3 2008/03/30 15:58:26 merlinofchaos +# poll.views.inc,v 1.2 2008/03/12 04:32:07 merlinofchaos +# profile.views.inc,v 1.7 2008/06/26 00:58:29 merlinofchaos +# search.views.inc,v 1.11 2008/06/27 00:39:07 merlinofchaos +# views.views.inc,v 1.4 2008/06/26 00:58:29 merlinofchaos +# views-more.tpl.php,v 1.2 2008/04/11 08:46:26 merlinofchaos +# views-ui-edit-item.tpl.php,v 1.7 2008/05/09 19:32:12 merlinofchaos +# views-ui-edit-tab.tpl.php,v 1.10 2008/05/14 00:30:25 merlinofchaos +# views-ui-edit-view.tpl.php,v 1.8 2008/05/14 00:52:10 merlinofchaos +# views-ui-list-views.tpl.php,v 1.5 2008/05/08 05:29:30 merlinofchaos +# +#, fuzzy +msgid "" +"" +msgstr "Project-Id-Version: PROJECT VERSION\n" +"POT-Creation-Date: 2008-07-06 13:10+0200\n" +"PO-Revision-Date: 2008-08-12 HH:MM+ZZZZ\n" +"Last-Translator: Chuck Smith \n" +"Language-Team: Esperanto \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: views.module:640 +msgid "Skipping broken view @view" +msgstr "Preterpasi rompitan aspekton @view" + +#: views.module:687 +#: includes/admin.inc:92 +msgid "Overridden" +msgstr "Anstataŭigita" + +#: views.module:690 +#: views_ui.module:284 +#: includes/admin.inc:91 +msgid "Default" +msgstr "Defaŭlta" + +#: views.module:828 +#: includes/admin.inc:286 +#: views_export/views_export.module:116 +msgid "Apply" +msgstr "Apliki" + +#: views.module:109 +#: views_ui.module:23 +#: views.info:0 +#: views_ui.info:0 +#: views_export/views_export.info:0 +msgid "Views" +msgstr "Aspektoj" + +#: views.module:114 +msgid "Ajax callback for view loading." +msgstr "Ajax-revoko por ŝarĝi aspekton." + +#: views.module:0 +msgid "views" +msgstr "aspektoj" + +#: views_ui.module:158 +msgid "The converter will make a best-effort attempt to convert a Views 1 view to Views 2. This conversion is not reliable; you will very likely have to make adjustments to your view to get it to match. You can import Views 1 views through the normal Import tab." +msgstr "La konvertilo klopodos kiel eble plej bone konverti aspekton de Aspektoj 1 al Aspektoj 2. Tiu konvertado ne fidindas; vi plej verŝajne devos ĝustigi vian aspekton por ke ĝi kongruu. Vi povas importi aspektojn de Aspektoj 1 per la normala importa langeto." + +#: views_ui.module:25 +msgid "Views are customized lists of content on your system; they are highly configurable and give you control over how lists of content are presented." +msgstr "Aspektoj estas adapteblaj listoj de enhavo en via sistemo; ili estas tre adapteblaj kaj donos al vi regon super kiel listoj de enhavo prezentiĝos." + +#: views_ui.module:29 +#: includes/plugins.inc:88 +msgid "List" +msgstr "Listo" + +#: views_ui.module:35 +#: includes/admin.inc:1105 +msgid "Add" +msgstr "Aldoni" + +#: views_ui.module:40 +#: includes/admin.inc:715 +msgid "Import" +msgstr "Importi" + +#: views_ui.module:46 +msgid "Tools" +msgstr "Iloj" + +#: views_ui.module:52 +msgid "Basic" +msgstr "Baza" + +#: views_ui.module:60 +#: includes/convert.inc:30 +msgid "Convert" +msgstr "Konverti" + +#: views_ui.module:61 +msgid "Convert stored Views 1 views." +msgstr "Konverti konservitajn aspektojn de Aspektoj 1." + +#: views_ui.module:67 +msgid "Delete view" +msgstr "Forigi aspekton" + +#: views_ui.module:73 +msgid "Convert view" +msgstr "Konverti aspekton" + +#: views_ui.module:110 +#: includes/admin.inc:87 +#: theme/theme.inc:89 +msgid "Edit" +msgstr "Redakti" + +#: views_ui.module:0 +msgid "views_ui" +msgstr "views_ui" + +#: views.install:31 +msgid "Stores the general data for a view." +msgstr "Konservas la ĝeneralajn datumojn por aspekto." + +#: views.install:37 +msgid "The view ID of the field, defined by the database." +msgstr "La aspekta ID de la kampo, difinita de la datumbazo." + +#: views.install:45 +msgid "The unique name of the view. This is the primary field views are loaded from, and is used so that views may be internal and not necessarily in the database. May only be alphanumeric characters plus underscores." +msgstr "La unika nomo de la aspekto. Tio estas la ĉefa kampo de kiu aspektoj estas ŝarĝitaj, kaj estas uzata por ke aspektoj povu esti internaj kaj ne necese en la datumbazo. Povas nur esti alfanumeraj signoj kaj substrekoj." + +#: views.install:51 +msgid "A description of the view for the admin interface." +msgstr "Priskribo de la aspekto por la administra interfaco." + +#: views.install:57 +msgid "A tag used to group/sort views in the admin interface" +msgstr "Etikedo uzata por grupigi/ordigi aspektojn en la administra interfaco" + +#: views.install:61 +msgid "A chunk of PHP code that can be used to provide modifications to the view prior to building." +msgstr "Peco de PHP-kodo kiu povas esti uzata por modifi la aspekton antaŭ ĝia konstruado." + +#: views.install:68 +msgid "What table this view is based on, such as node, user, comment, or term." +msgstr "Sur kiu tabelo ĉi tiu aspekto estas bazita, kiel nodo, uzanto, komento aŭ termino." + +#: views.install:74 +msgid "A boolean to indicate whether or not this view may have its query cached." +msgstr "Buleo por indiki ĉu aŭ ne ĉi tiu aspekto povas kaŝmemorigi sian informpeton." + +#: views.install:82 +msgid "Stores information about each display attached to a view." +msgstr "Konservas informojn pri ĉiu aspekto alkroĉita al aspekto." + +#: views.install:89 +msgid "The view this display is attached to." +msgstr "La aspekto al kiu ĝi estas alkroĉita." + +#: views.install:97 +msgid "An identifier for this display; usually generated from the display_plugin, so should be something like page or page_1 or block_2, etc." +msgstr "Identigilo por ĉi tiu aspekto; kutime generita de la display_plugin, do devas esti io kiel page aŭ page_1 aŭ block_2 ktp." + +#: views.install:104 +msgid "The title of the display, viewable by the administrator." +msgstr "La titolo de la aspekto, videbla de la administranto." + +#: views.install:111 +msgid "The type of the display. Usually page, block or embed, but is pluggable so may be other things." +msgstr "La speco de la aspekto. Kutime paĝo, bloko aŭ enteksta, sed estas kromprogramebla, do povas esti aliaj aferoj." + +#: views.install:116 +msgid "The order in which this display is loaded." +msgstr "La sinsekvo en kiu ĉi tiu aspekto ŝarĝiĝas." + +#: views.install:120 +msgid "A serialized array of options for this display; it contains options that are generally only pertinent to that display plugin type." +msgstr "Serialigita matrico de opcioj por ĉi tiu aspekto; ĝi enhavas opciojn kiuj ĝenerale rilatas al tiu aspekta kromprograma speco. " + +#: views.install:131 +msgid "A special cache used to store objects that are being edited; it serves to save state in an ordinarily stateless environment." +msgstr "Speciala kaŝmemoro uzata por konservi objektojn kiuj estas redaktataj; ĝi servas por konservi staton en ordinare senstata ĉirkaŭaĵo." + +#: views.install:136 +msgid "The session ID this cache object belongs to." +msgstr "La seanca ID al kiu ĉi tiu kaŝmemora objekto apartenas." + +#: views.install:141 +msgid "The name of the view this cache is attached to." +msgstr "La nomo de la aspekto al kiu ĉi tiu kaŝmemoro estas alkroĉita." + +#: views.install:146 +msgid "The name of the object this cache is attached to; this essentially represents the owner so that several sub-systems can use this cache." +msgstr "La nomo de la objekto al kiu ĉi tiu kaŝmemoro estas alkroĉita; tio esence reprezentas la havanto por ke kelkaj subsistemoj povas uzi ĉi tiun kaŝmemoron." + +#: views.install:153 +msgid "The time this cache was created or updated." +msgstr "La tempo kiam ĉi tiu kaŝmemoro estis kreita aŭ ĝisdatigita." + +#: views.install:157 +msgid "Serialized data being stored." +msgstr "Serialigitaj datumoj konserviĝas." + +#: views.info:0 +msgid "Create customized lists and queries from your database." +msgstr "Krei proprajn listojn kaj vicojn el via datumbazo." + +#: views_ui.info:0 +msgid "Views UI" +msgstr "Aspektoj UI" + +#: views_ui.info:0 +msgid "Administrative interface to views. Without this module, you cannot create or edit your views." +msgstr "Administranta interfaco al aspektoj. Sen ĉi tiu modulo, vi ne povas krei aŭ redakti viajn aspektojn." + +#: docs/docs.php:106 +msgid "Emulates the default Drupal front page; you may set the default home page path to this view to make it your front page." +msgstr "Imitas la defaŭltan frontpaĝon de Drupalo; oni povas fiksi la defaŭltan hejmpaĝan vojon al ĉi tiu aspekto por ke ĝi ĉefpaĝiĝu." + +#: docs/docs.php:107 +msgid "default" +msgstr "defaŭlta" + +#: docs/docs.php:116 +#: includes/plugins.inc:18 +msgid "Defaults" +msgstr "Defaŭltoj" + +#: docs/docs.php:205 +#: includes/plugins.inc:32 +msgid "Page" +msgstr "Paĝo" + +#: docs/docs.php:260 +#: includes/plugins.inc:65 +msgid "Feed" +msgstr "Fluo" + +#: docs/docs.php:328 +msgid "Front page feed" +msgstr "Ĉefpaĝa fluo" + +#: includes/admin.inc:34 +msgid "If you install the advanced help module from !href, Views will provide more and better help. Hide this message." +msgstr "Se vi instalas la help-modulo por spertuloj de !href, Aspektoj provizos pli bonan helpon. Kaŝi ĉi tiun mesaĝon." + +#: includes/admin.inc:88 +#: theme/theme.inc:96 +#: views_export/views_export.module:128 +msgid "Export" +msgstr "Eksporti" + +#: includes/admin.inc:89 +#: theme/theme.inc:101 +msgid "Clone" +msgstr "Kloni" + +#: includes/admin.inc:92 +msgid "Revert" +msgstr "Malfari ŝanĝojn" + +#: includes/admin.inc:92 +#: includes/convert.inc:35 +msgid "Delete" +msgstr "Forigi" + +#: includes/admin.inc:97 +msgid "Disable" +msgstr "Malŝalti" + +#: includes/admin.inc:100 +msgid "Enable" +msgstr "Ŝalti" + +#: includes/admin.inc:106 +msgid "Warning! Broken view!" +msgstr "Atentu! Rompita aspekto!" + +#: includes/admin.inc:121 +msgid "Broken" +msgstr "Rompita" + +#: includes/admin.inc:180 +msgid "Install the advanced help module for the getting started" +msgstr "Instalu la help-modulon por spertuloj por komenci" + +#: includes/admin.inc:183 +msgid "Not sure what to do? Try the \"!getting-started\" page." +msgstr "Ne certas kion fari? Provu la paĝon de \"Komenci\"." + +#: includes/admin.inc:197 +msgid "" +msgstr "" + +#: includes/admin.inc:198 +#: includes/plugins.inc:2975 +msgid "" +msgstr "" + +#: includes/admin.inc:213 +#: views_export/views_export.module:146 +msgid "Tag" +msgstr "Etikedo" + +#: includes/admin.inc:229 +msgid "Displays" +msgstr "Aspektoj" + +#: includes/admin.inc:241 +#: includes/plugins.inc:1128 +#: modules/node.views.inc:139 +msgid "Type" +msgstr "Speco" + +#: includes/admin.inc:248 +msgid "Storage" +msgstr "Konservado" + +#: includes/admin.inc:251 +#: includes/view.inc:1097 +msgid "Normal" +msgstr "Normala" + +#: includes/admin.inc:260 +msgid "Sort by" +msgstr "Ordigi laŭ" + +#: includes/admin.inc:262 +#: includes/plugins.inc:831 +#: modules/system.views.inc:69 +#: modules/user.views.inc:59 +msgid "Name" +msgstr "Nomo" + +#: includes/admin.inc:263 +#: includes/argument.handlers.inc:127 +#: includes/plugins.inc:843 +#: modules/comment.views.inc:44 +#: modules/node.views.inc:84 +msgid "Title" +msgstr "Titolo" + +#: includes/admin.inc:265 +#: includes/plugins.inc:2098 +#: modules/statistics.views.inc:146 +#: modules/system.views.inc:88 +msgid "Path" +msgstr "Vojo" + +#: includes/admin.inc:267 +#: includes/convert.inc:21 +#: modules/upload.views.inc:56 +#: views_export/views_export.module:146 +msgid "Description" +msgstr "Priskribo" + +#: includes/admin.inc:274 +msgid "Order" +msgstr "Sinsekvo" + +#: includes/admin.inc:276 +msgid "Up" +msgstr "Supren" + +#: includes/admin.inc:277 +msgid "Down" +msgstr "Malsupren" + +#: includes/admin.inc:361 +msgid "Query" +msgstr "Informpeto" + +#: includes/admin.inc:363 +msgid "These queries were run during view rendering:" +msgstr "Ĉi tiuj informpetoj funkciis dum kreado de aspekto:" + +#: includes/admin.inc:368 +msgid "[@time ms] " +msgstr "[@time ms]" + +#: includes/admin.inc:371 +msgid "Other queries" +msgstr "Aliaj informpetoj" + +#: includes/admin.inc:379 +msgid "This display has no path." +msgstr "Ĉi tiu aspekto ne havas vojon." + +#: includes/admin.inc:384 +msgid "Query build time" +msgstr "Tempo por konstrui informpeton" + +#: includes/admin.inc:384 +msgid "@time ms" +msgstr "@time ms" + +#: includes/admin.inc:385 +msgid "Query execute time" +msgstr "Tempo por plenumi informpeton" + +#: includes/admin.inc:386 +msgid "View render time" +msgstr "Tempo por montri aspekton" + +#: includes/admin.inc:392 +msgid "No query was run" +msgstr "Neniu informpeto funkciis" + +#: includes/admin.inc:399 +msgid "Unable to preview due to validation errors." +msgstr "Ne eblas antaŭvidi pro validigaj eraroj." + +#: includes/admin.inc:450 +msgid "Display" +msgstr "Montri" + +#: includes/admin.inc:458 +#: includes/view.inc:1774 +msgid "Arguments" +msgstr "Argumentoj" + +#: includes/admin.inc:460 +msgid "Separate arguments with a / as though they were a URL path." +msgstr "Disigi argumentojn per / kvazaŭ ili estis URL-vojo." + +#: includes/admin.inc:466 +msgid "Preview" +msgstr "Antaŭvidi" + +#: includes/admin.inc:504 +msgid "Clone view @view" +msgstr "Klona aspekto @view" + +#: includes/admin.inc:517 +#: includes/convert.inc:20 +msgid "View name" +msgstr "Nomo de aspekto" + +#: includes/admin.inc:518 +msgid "This is the unique name of the view. It must contain only alphanumeric characters and underscores; it is used to identify the view internally and to generate unique theming template names for this view. If overriding a module provided view, the name must not be changed or instead a new view will be created." +msgstr "Ĉi tio estas unika nomo de la aspekto. Ĝi devas enhavi nur alfanumerajn signojn kaj substrekojn; ĝi estas uzata por identigi la aspekton interne kaj por generi unikajn haŭtajn ŝablonajn nomojn por ĉi tiu aspekto. Se oni anstataŭigas modulprovitan aspekton, la nomo ne povas esti ŝanĝita aŭ anstataŭe nova aspekto kreiĝos." + +#: includes/admin.inc:526 +msgid "View description" +msgstr "Priskribo de aspekto" + +#: includes/admin.inc:527 +msgid "This description will appear on the Views administrative UI to tell you what the view is about." +msgstr "Ĉi tiu priskribo aperos en la administra UI por Aspektoj por montri al vi pri kio temas la aspekto." + +#: includes/admin.inc:533 +msgid "View tag" +msgstr "Etikedo de aspekto" + +#: includes/admin.inc:534 +msgid "Enter an optional tag for this view; it is used only to help sort views on the administrative page." +msgstr "Enmetu nedevigan etikedon por ĉi tiu aspekto; ĝi estas uzata nur por helpi ordigi aspektojn en la administra paĝo." + +#: includes/admin.inc:546 +msgid "View type" +msgstr "Aspekta speco" + +#: includes/admin.inc:547 +msgid "The view type is the primary table for which information is being retrieved. The view type controls what arguments, fields, sort criteria and filters are available, so once this is set it cannot be changed." +msgstr "La aspekta speco estas la ĉefa tabelo por kiu informoj estas ricevita. La aspekta speco regas kiuj argumentoj, kampoj, ordigaj kriterioj kaj filtriloj alireblas, do kiam tio estas fiksita, ĝi estas neŝanĝebla." + +#: includes/admin.inc:558 +msgid "Next" +msgstr "Sekva" + +#: includes/admin.inc:574 +msgid "View name must be alphanumeric or underscores only." +msgstr "Aspekta nomo devas enhavi nur alfanumerojn aŭ substrekojn." + +#: includes/admin.inc:580 +msgid "You must use a unique name for this view." +msgstr "Vi devas uzi unikan nomon por ĉi tiu aspekto." + +#: includes/admin.inc:613 +msgid "Are you sure you want to revert the view %name?" +msgstr "Ĉu vi certas ke vi volas refari la ŝanĝojn al la aspekto %name?" + +#: includes/admin.inc:614 +msgid "Reverting the view will delete the view that is in the database, reverting it to the original default view. Any changes you have made will be lost and cannot be recovered." +msgstr "Refari la ŝanĝojn de la aspekto forigos la aspekton kiu estas en la datumbazo, revenante al ĝia originala defaŭlta aspekto. Ŝanĝojn kiujn vi faris estos plene perditaj." + +#: includes/admin.inc:617 +#: includes/convert.inc:105 +msgid "Are you sure you want to delete the view %name?" +msgstr "Ĉu vi certas ke vi volas forigi la aspekton %name?" + +#: includes/admin.inc:618 +msgid "Deleting a view cannot be undone." +msgstr "Forigi aspekton ne povas esti malfarata." + +#: includes/admin.inc:626 +#: includes/convert.inc:110 +msgid "Cancel" +msgstr "Nuligi" + +#: includes/admin.inc:635 +msgid "The view has been deleted." +msgstr "La aspekto estis forigita." + +#: includes/admin.inc:647 +msgid "There is no lock on view %view to break." +msgstr "Ne estas ŝlosilo por rompi de aspekto %view." + +#: includes/admin.inc:657 +msgid "Are you sure you want to break the lock on view %name?" +msgstr "Ĉu vi certas ke vi volas rompi la ŝlosilon de aspekto %name?" + +#: includes/admin.inc:660 +msgid "By breaking this lock, any unsaved changes made by !user will be lost!" +msgstr "Rompante ĉi tiun ŝlosilon, nekonservitaj ŝanĝoj de !user estos perdita!" + +#: includes/admin.inc:661 +msgid "Break lock" +msgstr "Rompi ŝlosilon" + +#: includes/admin.inc:678 +msgid "Edit view \"%view\"" +msgstr "Redakti aspekton \"%view\"" + +#: includes/admin.inc:705 +msgid "Enter the name to use for this view if it is different from the source view. Leave blank to use the name of the view." +msgstr "Enmeti la nomon por uzi por ĉi tiu aspekto se ĝi malsamas de la fonta aspekto. Lasu malplena por uzi la nomon de la aspekto." + +#: includes/admin.inc:710 +msgid "Paste view code here" +msgstr "Glui aspektan kodon ĉi tie" + +#: includes/admin.inc:732 +msgid "Unable to interpret view code." +msgstr "Ne eblas interpreti kodon de aspekto." + +#: includes/admin.inc:740 +msgid "You are importing a view created in Views version 1. You may need to adjust some parameters to work correctly in version 2." +msgstr "Vi importas aspekton kreita en versio 1 de Aspektoj. Vi eble devas ĝustigi kelkajn parametrojn por funkcii ĝuste en versio 2." + +#: includes/admin.inc:743 +msgid "That view is not compatible with this version of Views." +msgstr "Tiu aspekto ne kongruas kun ĉi tiu versio de Aspektoj." + +#: includes/admin.inc:758 +msgid "A view by that name already exists; please choose a different name" +msgstr "Aspekto de tiu nomo jam ekzistas; bonvolu elekti alian nomon" + +#: includes/admin.inc:779 +msgid "Save" +msgstr "Konservi" + +#: includes/admin.inc:831 +msgid "The view has been saved." +msgstr "La aspekto estas konservita." + +#: includes/admin.inc:875 +msgid "Unknown or missing table name" +msgstr "Nekonata aŭ mankata tabela nomo" + +#: includes/admin.inc:880 +msgid "Click on an item to edit that item's details." +msgstr "Klaku sur ero por redakti ties detalojn." + +#: includes/admin.inc:883 +msgid "This view has a broken default display and cannot be used." +msgstr "Ĉi tiu aspekto havas rompitan defaŭltan montradon kaj ne povas esti uzata." + +#: includes/admin.inc:919 +msgid "break this lock" +msgstr "rompi ĉi tiun ŝlosilon" + +#: includes/admin.inc:925 +#: theme/theme.inc:97 +msgid "Export this view" +msgstr "Eksporti ĉi tiun aspekton" + +#: includes/admin.inc:930 +#: theme/theme.inc:102 +msgid "Create a copy of this view" +msgstr "Krei kopion de ĉi tiu aspekto" + +#: includes/admin.inc:941 +msgid "View \"!display\"" +msgstr "Vidi \"!display\"" + +#: includes/admin.inc:942 +msgid "Go to the real page for this display" +msgstr "Iri al la vera paĝo por ĉi tiu montro" + +#: includes/admin.inc:1008 +#: includes/plugins.inc:838 +msgid "None" +msgstr "Neniu" + +#: includes/admin.inc:1082 +msgid "Invalid" +msgstr "Nevalida" + +#: includes/admin.inc:1082 +msgid "Error: Display @display refers to a plugin named '@plugin', but that plugin doesn't exist!" +msgstr "Eraro: Montro @display referencas al kromprogramo nomata '@plugin', sed tiu kromprogramo ne ekzistas!" + +#: includes/admin.inc:1103 +msgid "Rearrange" +msgstr "Rearanĝi" + +#: includes/admin.inc:1136 +msgid "Error: handler for @table > @field doesn't exist!" +msgstr "Eraro: traktilo por @table > @field ne ekzistas!" + +#: includes/admin.inc:1155 +msgid "Settings" +msgstr "Agordoj" + +#: includes/admin.inc:1160 +#: includes/plugins.inc:849 +msgid "Missing style plugin" +msgstr "Mankata stila kromprogramo" + +#: includes/admin.inc:1164 +#: includes/plugins.inc:862 +msgid "Change settings for this style" +msgstr "Ŝanĝi agordojn por ĉi tiu stilo" + +#: includes/admin.inc:1167 +msgid "   Style: !style" +msgstr "   Stilo: !style" + +#: includes/admin.inc:1198 +msgid "Invalid display id while regenerating tabs" +msgstr "Nevalida montra id regenerante langetojn" + +#: includes/admin.inc:1231 +msgid "Update" +msgstr "Ĝisdatigo" + +#: includes/admin.inc:1249 +msgid "Ok" +msgstr "Ok" + +#: includes/admin.inc:1518 +msgid "Unable to initialize default display" +msgstr "Ne eblas pravalorizi defaŭltan montron" + +#: includes/admin.inc:1550 +msgid "Add display" +msgstr "Aldoni montron" + +#: includes/admin.inc:1590 +msgid "Remove display" +msgstr "Forigi montron" + +#: includes/admin.inc:1601 +msgid "Restore display" +msgstr "Restarigi montron" + +#: includes/admin.inc:1673 +msgid "Analyze" +msgstr "Analizi" + +#: includes/admin.inc:1693 +msgid "This view has only a default display and therefore will not be placed anywhere on your site; perhaps you want to add a page or a block display." +msgstr "Ĉi tiu aspekto havas nur defaŭltan montron kaj tiel ne povas lokiĝi ie en via retejo; eble vi volas aldoni paĝon aŭ blokan montron." + +#: includes/admin.inc:1705 +msgid "View analysis" +msgstr "Analizo de aspekto" + +#: includes/admin.inc:1714 +msgid "View analysis can find nothing to report." +msgstr "Analizo de aspekto ne povas trovi ion por raporti." + +#: includes/admin.inc:1788 +msgid "View details" +msgstr "Detaloj de aspekto" + +#: includes/admin.inc:1829 +msgid "Invalid display id @display" +msgstr "Nevalida montra id @display" + +#: includes/admin.inc:1887 +msgid "Configure @type" +msgstr "Agordi @type" + +#: includes/admin.inc:1942 +msgid "Rearrange @type" +msgstr "Rearanĝi @type" + +#: includes/admin.inc:1985 +msgid "Broken field @id" +msgstr "Rompita kampo @id" + +#: includes/admin.inc:2025 +msgid "Remove" +msgstr "Forigi" + +#: includes/admin.inc:2025 +msgid "Remove this item" +msgstr "Forigi ĉi tiun eron" + +#: includes/admin.inc:2031 +msgid "No fields available." +msgstr "Neniuj kampoj alireblaj." + +#: includes/admin.inc:2034 +#: includes/plugins.inc:2190 +#: modules/book.views.inc:57 +#: modules/taxonomy.views.inc:115 +#: modules/upload.views.inc:90 +msgid "Weight" +msgstr "Pezo" + +#: includes/admin.inc:2090 +msgid "Add @type" +msgstr "Aldoni @type" + +#: includes/admin.inc:2101 +msgid "Groups" +msgstr "Grupoj" + +#: includes/admin.inc:2120 +msgid "!group: !field" +msgstr "!group: !field" + +#: includes/admin.inc:2129 +msgid "There are no @types available to add." +msgstr "Ne estas @types alireblaj por aldoni." + +#: includes/admin.inc:2226 +msgid "Do not use a relationship" +msgstr "Ne uzu en rilato" + +#: includes/admin.inc:2235 +#: includes/view.inc:1798 +msgid "Relationship" +msgstr "Rilato" + +#: includes/admin.inc:2248 +msgid "Configure @type \"@item\"" +msgstr "Agordi @type \"@item\"" + +#: includes/admin.inc:2361 +msgid "Configure extra settings for @type \"@item\"" +msgstr "Agordi ekstrajn agordojn por @type \"@item\"" + +#: includes/admin.inc:2426 +msgid "Change summary style for @type \"@item\"" +msgstr "Ŝanĝi resuman stilon por @type \"@item\"" + +#: includes/admin.inc:2449 +msgid "Internal error: broken plugin." +msgstr "Interna eraro: rompita kromprogramo." + +#: includes/admin.inc:2513 +msgid "Configure summary style for @type \"@item\"" +msgstr "Agordi resuman stilon por @type \"@item\"" + +#: includes/admin.inc:2605 +msgid "Clear Views' cache" +msgstr "Malplenigi kaŝmemoron de Aspekto" + +#: includes/admin.inc:2611 +msgid "Add Views signature to all SQL queries" +msgstr "Aldoni subskribon de Aspekto al ĉiuj SQL-informpetoj" + +#: includes/admin.inc:2612 +msgid "All Views-generated queries will include a special 'VIEWS' = 'VIEWS' string in the WHERE clause. This makes identifying Views queries in database server logs simpler, but should only be used when troubleshooting." +msgstr "Ĉiuj Aspekto-generitaj informpetoj inkluzivos specialan 'VIEWS' = 'VIEWS' teksto en la WHERE sekcio. Tio simpligas identigi informpetojn de Aspektoj en datumbazaj servilaj protokoloj, sed devas esti uzata nur dum problemsolvado." + +#: includes/admin.inc:2618 +msgid "Disable views data caching" +msgstr "Malŝalti datum-kaŝmemoradon de aspektoj" + +#: includes/admin.inc:2619 +msgid "Views caches data about tables, modules and views available, to increase performance. By checking this box, Views will skip this cache and always rebuild this data when needed. This can have a serious performance impact on your site." +msgstr "Aspektoj kaŝmemorigas datumojn pri alireblaj tabeloj, moduloj kaj aspektoj, por plibonigi rendimenton. Se ŝaltita, Aspektoj preterpasos ĉi tiun kaŝmemoron kaj ĉiam rekonstruas ĉi tiujn datumojn kiam bezonata. Tio povas serioze influi la rendimenton de via retejo." + +#: includes/admin.inc:2625 +msgid "Ignore missing advanced help module" +msgstr "Ignori mankantan help-modulo por spertuloj" + +#: includes/admin.inc:2626 +msgid "Views uses the advanced help module to provide help text; if this module is not present Views will complain, unless this setting is checked." +msgstr "Aspektoj uzas la help-modulon de spertoj por provizi helpan tekston; se tiu modulo ne ekzistas, Aspektoj eble plendos, krom se ĉi tiu agordo estas ŝaltita." + +#: includes/admin.inc:2632 +msgid "Show query above live preview" +msgstr "Montri informpeton super viva antaŭvido" + +#: includes/admin.inc:2633 +msgid "The live preview feature will show you the output of the view you're creating, as well as the view. Check here to show the query and other information above the view; leave this unchecked to show that information below the view." +msgstr "La viva antaŭvida funkcio montros al vi la eligo de la aspekto kiun vi kreas, kune kun la aspekto. Ŝaltu ĝin por montri la informpeton kaj aliajn informojn super la aspekto; lasu ĝin malŝaltita por montri tiujn informojn sub la aspekto." + +#: includes/admin.inc:2639 +msgid "Show other queries run during render during live preview" +msgstr "Montri aliajn informpetojn kiuj funkcias dum montrado de viva antaŭvido" + +#: includes/admin.inc:2640 +msgid "Drupal has the potential to run many queries while a view is being rendered. Checking this box will display every query run during view render as part of the live preview." +msgstr "Drupalo havas potencialon por funkciigi multajn informpetojn dum aspekto montriĝas. Kiam ŝaltita, oni vidos ĉiun informpeton dum la montriĝo kiel parto de la viva antaŭvido." + +#: includes/admin.inc:2646 +msgid "Do not show hover links over views" +msgstr "Ne montri superligilojn super aspektoj" + +#: includes/admin.inc:2647 +msgid "To make it easier to administrate your views, Views provides 'hover' links to take you to the edit and export screen of a view whenever the view is used. This can be distracting on some themes, though; if it is problematic, you can turn it off here." +msgstr "Por faciligi administradon de viaj aspektoj, Aspektoj provizas 'superligilojn' al la redakta kaj eksporta ekrano de aspekto kiam la aspekto estas uzata. Tio povas distri en kelkaj haŭtoj, tamen, se estas problema, vi povas malŝalti ĝin ĉi tie." + +#: includes/admin.inc:2653 +msgid "Enable views performance statistics via the Devel module" +msgstr "Ŝalti rendimentajn statistikon de aspektoj per la Devel-modulo." + +#: includes/admin.inc:2654 +msgid "Check this to enable some Views query and performance statistics if Devel is installed." +msgstr "Ĉi tio ŝaltas kelkajn informpetan kaj rendimentajn statistikojn de Aspektoj se Devel estas instalita. " + +#: includes/admin.inc:2660 +msgid "Disable javascript with Views" +msgstr "Malŝalti JavaSkripton kun Aspektoj" + +#: includes/admin.inc:2661 +msgid "If you are having problems with the javascript, you can disable it here; the Views UI should degrade and still be usable without javascript, it just not as good." +msgstr "Se vi havas problemojn kun la JavaSkripto, vi povas malŝalti ĝin ĉi tie; la Aspektoj UI devas daŭre funkcii kaj uzeblas sen JavaSkripto, ĝi simple ne estas tiel bona." + +#: includes/admin.inc:2669 +msgid "Page region to output performance statistics" +msgstr "Paĝa regiono por eligi rendimentan statistikon" + +#: includes/admin.inc:2682 +msgid "The cache has been cleared." +msgstr "La kaŝmemoro estas malplenigita." + +#: includes/admin.inc:2872 +msgid "Error: missing @component" +msgstr "Eraro: mankas @component" + +#: includes/ajax.inc:73 +msgid "Server reports invalid input error." +msgstr "Servilo raportas nevalidan enmetan eraron." + +#: includes/ajax.inc:74 +msgid "Error" +msgstr "Eraro" + +#: includes/argument.handlers.inc:110 +msgid "All" +msgstr "Ĉiuj" + +#: includes/argument.handlers.inc:129 +msgid "The title to use when this argument is present; it will override the title of the view and titles from previous arguments. You can use percent substitution here to replace with argument titles. Use \"%1\" for the first argument, \"%2\" for the second, etc." +msgstr "La titolo por uzi kiam ĉi tiu argumento ekzistas; ĝi anstataŭigos la titolon de la aspekto kaj titoloj de antaŭaj argumentoj. Vi povas uzi procentan anstataŭigon por anstataŭigi kun argumentaj titoloj. Uzu \"%1\" por la unua argumento, \"%2\" por la dua ktp." + +#: includes/argument.handlers.inc:142 +msgid "Action to take if argument is not present" +msgstr "Ago por fari se argumento ne ekzistas" + +#: includes/argument.handlers.inc:154 +msgid "Wildcard" +msgstr "Ĵokero" + +#: includes/argument.handlers.inc:157 +msgid "If this value is received as an argument, the argument will be ignored; i.e, \"all values\"" +msgstr "Se tiu valoro ne estas ricevita kiel argumento, la argumento estos ignorita; alivorte \"ĉiuj valoroj\"" + +#: includes/argument.handlers.inc:163 +msgid "Wildcard title" +msgstr "Ĵokera titolo" + +#: includes/argument.handlers.inc:166 +msgid "The title to use for the wildcard in substitutions elsewhere." +msgstr "La titolo por uzi por la ĵokero en anstataŭigoj aliloke." + +#: includes/argument.handlers.inc:189 +msgid "Validator options" +msgstr "Validilaj opcioj" + +#: includes/argument.handlers.inc:194 +msgid "Validator" +msgstr "Validilo" + +#: includes/argument.handlers.inc:198 +msgid "" +msgstr "" + +#: includes/argument.handlers.inc:233 +msgid "Action to take if argument does not validate" +msgstr "Ago por fari se argumento ne validiĝas" + +#: includes/argument.handlers.inc:252 +msgid "Display all values" +msgstr "Montri ĉiujn valorojn" + +#: includes/argument.handlers.inc:257 +msgid "Hide view / Page not found (404)" +msgstr "Kaŝi aspekton / Paĝo ne trovita (404)" + +#: includes/argument.handlers.inc:262 +msgid "Display empty text" +msgstr "Montri malplenan tekston" + +#: includes/argument.handlers.inc:267 +msgid "Summary, sorted ascending" +msgstr "Resumo, ordigita kreskante" + +#: includes/argument.handlers.inc:274 +msgid "Summary, sorted descending" +msgstr "Resumo, ordigita malkreskante" + +#: includes/argument.handlers.inc:281 +msgid "Provide default argument" +msgstr "Provizi defaŭltan argumenton" + +#: includes/argument.handlers.inc:314 +msgid "Provide default argument options" +msgstr "Provizi defaŭltan argumentajn opciojn" + +#: includes/argument.handlers.inc:324 +msgid "Default argument type" +msgstr "Defaŭlta argumenta speco" + +#: includes/argument.handlers.inc:710 +#: includes/field.handlers.inc:217 +#: includes/filter.handlers.inc:577 +#: includes/relationship.handlers.inc:132 +#: includes/sort.handlers.inc:71 +msgid "Broken/missing handler" +msgstr "Rompita/mankata traktilo" + +#: includes/argument.handlers.inc:718 +#: includes/field.handlers.inc:225 +#: includes/filter.handlers.inc:585 +#: includes/relationship.handlers.inc:140 +#: includes/sort.handlers.inc:79 +msgid "The handler for this item is broken or missing and cannot be used. If a module provided the handler and was disabled, re-enabling the module may restore it. Otherwise, you should probably delete this item." +msgstr "La traktilo por ĉi tiu ero estas rompita aŭ mankata kaj ne povas esti uzata. Se modulo provizis la traktilon kaj estis malŝaltita, reŝalti la modulon eble restarigos ĝin. Alikaze, vi verŝajne devas forigi la eron." + +#: includes/argument.handlers.inc:804 +msgid "Current date" +msgstr "Aktuala dato" + +#: includes/argument.handlers.inc:859 +msgid "Glossary mode" +msgstr "Glosara reĝimo" + +#: includes/argument.handlers.inc:860 +msgid "Glossary mode applies a limit to the number of characters used in the argument, which allows the summary view to act as a glossary." +msgstr "Glosara reĝimo aplikas limon al nombro da signoj uzitaj en la argumento, kiu ebligas ke la resuma aspekto povu agi kiel glosaro." + +#: includes/argument.handlers.inc:866 +msgid "Character limit" +msgstr "Signa limo" + +#: includes/argument.handlers.inc:867 +msgid "How many characters of the argument to filter against. If set to 1, all fields starting with the letter in the argument would be matched." +msgstr "Kiom da signoj por filtri de la argumento. Se agordita al 1, ĉiuj kampoj komencante kun la litero en la argumento kongruus. " + +#: includes/argument.handlers.inc:875 +msgid "Case" +msgstr "Uskleco" + +#: includes/argument.handlers.inc:876 +msgid "When printing the argument result, how to transform the case." +msgstr "Montrante la argumentan rezulton, kiel transformi la usklecon." + +#: includes/argument.handlers.inc:878 +msgid "No transform" +msgstr "Neniu transformo" + +#: includes/argument.handlers.inc:879 +msgid "Upper case" +msgstr "Majuskla" + +#: includes/argument.handlers.inc:880 +msgid "Lower case" +msgstr "Minuskla" + +#: includes/argument.handlers.inc:881 +msgid "Capitalize first letter" +msgstr "Majuskligi unuan literon" + +#: includes/argument.handlers.inc:882 +msgid "Capitalize each word" +msgstr "Majuskligi ĉiun vorton" + +#: includes/argument.handlers.inc:889 +msgid "Case in path" +msgstr "Uskleco en vojo" + +#: includes/argument.handlers.inc:890 +msgid "When printing url paths, how to transform the of the argument. Do not use this unless with Postgres as it uses case sensitive comparisons." +msgstr "Kiam montrante url-vojojn, kiel transformi la de la argumento. Ne uzu tion krom kun Postgres ĉar ĝi uzas usklecodistingajn komparojn." + +#: includes/argument.handlers.inc:903 +msgid "Transform spaces to dashes in URL" +msgstr "Transformi spacetojn al streketojn en URL" + +#: includes/argument.handlers.inc:910 +msgid "Allow multiple arguments to work together." +msgstr "Ebligi multajn argumentojn por kunfunkcii." + +#: includes/argument.handlers.inc:911 +msgid "If selected, multiple instances of this argument can work together, as though multiple terms were supplied to the same argument. This setting is not compatible with the \"Reduce duplicates\" setting." +msgstr "Se elektita, multaj ekzemploj de ĉi tiu argumento povas kunfunkcii, kvazaŭ multaj terminoj estis donitaj al la sama argumento. Tiu agordo ne kongruas kun la agordo de \"Redukti kopiojn\"." + +#: includes/argument.handlers.inc:917 +msgid "Do not display items with no value in summary" +msgstr "Ne montru erojn kun neniu valoro en resumo." + +#: includes/argument.handlers.inc:1043 +msgid "Allow multiple terms per argument." +msgstr "Ebligi multajn terminojn por argumento." + +#: includes/argument.handlers.inc:1044 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3 or 1,2,3." +msgstr "Se elektita, uzantoj povas enmeti multajn argumentojn en la formo de 1+2+3 aŭ 1,2,3." + +#: includes/argument.handlers.inc:1050 +msgid "Exclude the argument" +msgstr "Ekskludi la argumenton" + +#: includes/argument.handlers.inc:1051 +msgid "If selected, the numbers entered in the argument will be excluded rather than limiting the view." +msgstr "Se elektita, la nombroj enmetitaj en la argumento ekskludiĝos anstataŭ limigi la aspekton." + +#: includes/argument.handlers.inc:1058 +#: modules/taxonomy.views.inc:109 +msgid "Uncategorized" +msgstr "Nekategoriigita" + +#: includes/argument.handlers.inc:1074 +msgid "Invalid input" +msgstr "Nevalida enmeto" + +#: includes/argument.handlers.inc:1150 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3 (for OR) or 1,2,3 (for AND)." +msgstr "Se elektita, uzantoj povas enmeti multajn argumentojn en la formo de 1+2+3 (por OR) aŭ 1,2,3 (por AND)." + +#: includes/convert.inc:14 +msgid "There are no Views 1 views stored in the database to convert." +msgstr "Ne estas aspektoj de Aspektoj 1 en la datumbazo por konverti." + +#: includes/convert.inc:22 +msgid "Operations" +msgstr "Operacioj" + +#: includes/convert.inc:33 +msgid "Converted" +msgstr "Konvertita" + +#: includes/convert.inc:68 +msgid "The table below lists Views version 1 views that are stored in the database. You can either convert them to work in Views version 2, or delete them. The views are convertible only if there is no Views 2 view with the same name." +msgstr "La tabelo sube listigas aspektoj de Aspektoj versio 1 kiuj estas konservitaj en la datumbazo. Vi povas aŭ konverti ilin por funkcii en Aspektoj versio 2, aŭ forigi ilin. La aspektoj estas konverteblaj nur se ne estas aspektoj de Aspektoj 2 kun la sama nomo." + +#: includes/convert.inc:79 +msgid "Unable to find view." +msgstr "Ne eblas trovi aspekton." + +#: includes/convert.inc:89 +msgid "Unable to convert view." +msgstr "Ne eblas konverti aspekton." + +#: includes/convert.inc:108 +msgid "This action cannot be undone." +msgstr "Tiu ago ne povas esti malfarata." + +#: includes/convert.inc:118 +msgid "The view has been deleted" +msgstr "Tiu aspekto estis forigita." + +#: includes/field.handlers.inc:138 +#: includes/filter.handlers.inc:309 +#: includes/relationship.handlers.inc:78 +msgid "Label" +msgstr "Etikedo" + +#: includes/field.handlers.inc:140 +msgid "The label for this field that will be displayed to end users if the style requires it." +msgstr "La etikedo por ĉi tiu kampo montriĝos al uzantoj se la stilo bezonas ĝin." + +#: includes/field.handlers.inc:144 +msgid "Exclude from display" +msgstr "Ekskludu de montrado" + +#: includes/field.handlers.inc:146 +msgid "Check this box to not display this field, but still load it in the view. Use this option to not show a grouping field in each record, or when doing advanced theming." +msgstr "Ŝaltu por ne montri ĉi tiun kampon, sed tamen ŝarĝi ĝin en la montro. Uzu ĉi tiun opcion por ne montri grupigan kampon en ĉiu rikardo, aŭ kiam vi faras haŭtadon por spertuloj." + +#: includes/field.handlers.inc:255 +msgid "Date format" +msgstr "Datoformato" + +#: includes/field.handlers.inc:260 +msgid "Custom" +msgstr "Propra" + +#: includes/field.handlers.inc:261 +msgid "Time ago" +msgstr "Tempo antaŭe" + +#: includes/field.handlers.inc:267 +msgid "Custom date format" +msgstr "Propra datoformato" + +#: includes/field.handlers.inc:268 +msgid "If \"Custom\", see the PHP docs for date formats. If \"Time ago\" this is the the number of different units to display, which defaults to two." +msgstr "Se \"Propra\" vidu la PHP-dokumentojn por datoformatoj. Se \"Tempo antaŭe\", tio estas la nombro da malsamaj unuoj por montri, kiu defaŭltas al du." + +#: includes/field.handlers.inc:284 +msgid "%time ago" +msgstr "%time antaŭe" + +#: includes/field.handlers.inc:312 +msgid "Output format" +msgstr "Eliga formato" + +#: includes/field.handlers.inc:314 +msgid "Yes/No" +msgstr "Jes/Ne" + +#: includes/field.handlers.inc:315 +msgid "True/False" +msgstr "Vera/Malvera" + +#: includes/field.handlers.inc:316 +msgid "On/Off" +msgstr "Ŝaltita/Malŝaltita" + +#: includes/field.handlers.inc:322 +msgid "Reverse" +msgstr "Inversa" + +#: includes/field.handlers.inc:323 +msgid "If checked, true will be displayed as false." +msgstr "Se ŝaltita, vera montriĝos kiel malvera." + +#: includes/field.handlers.inc:337 +#: includes/filter.handlers.inc:929 +#: includes/plugins.inc:884 +msgid "Yes" +msgstr "Jes" + +#: includes/field.handlers.inc:337 +#: includes/filter.handlers.inc:929 +#: includes/plugins.inc:884 +msgid "No" +msgstr "Ne" + +#: includes/field.handlers.inc:339 +#: includes/filter.handlers.inc:898 +msgid "True" +msgstr "Vera" + +#: includes/field.handlers.inc:339 +#: includes/filter.handlers.inc:939 +msgid "False" +msgstr "Malvera" + +#: includes/field.handlers.inc:341 +msgid "On" +msgstr "Ŝaltita" + +#: includes/field.handlers.inc:341 +msgid "Off" +msgstr "Malŝaltita" + +#: includes/field.handlers.inc:404 +#: modules/statistics.views.inc:274 +msgid "Display as link" +msgstr "Montri kiel ligilo" + +#: includes/field.handlers.inc:446 +#: modules/node.views.inc:1259 +msgid "Display type" +msgstr "Montra speco" + +#: includes/field.handlers.inc:448 +#: includes/plugins.inc:3129 +msgid "Unordered list" +msgstr "Neordigita listo" + +#: includes/field.handlers.inc:449 +#: includes/plugins.inc:3129 +msgid "Ordered list" +msgstr "Ordigita listo" + +#: includes/field.handlers.inc:450 +msgid "Simple separator" +msgstr "Simpla disigilo" + +#: includes/field.handlers.inc:457 +#: includes/plugins.inc:3423 +msgid "Separator" +msgstr "Disigilo" + +#: includes/field.handlers.inc:465 +msgid "Empty list text" +msgstr "Malplena lista teksto" + +#: includes/field.handlers.inc:467 +msgid "If the list is empty, you may enter text here that will be displayed." +msgstr "Se la listo estas malplena, vi povas enmeti tekston ĉi tie kiu montriĝos." + +#: includes/field.handlers.inc:524 +msgid "Round" +msgstr "Rondigo" + +#: includes/field.handlers.inc:525 +msgid "If checked, the number will be rounded." +msgstr "Se ŝaltita, la numero rondiĝos." + +#: includes/field.handlers.inc:530 +msgid "Precision" +msgstr "Precizo" + +#: includes/field.handlers.inc:532 +msgid "Specify how many digits to print after the decimal point." +msgstr "Indiki kiom da ciferoj por montri post la dekuma punkto." + +#: includes/field.handlers.inc:539 +msgid "Decimal point" +msgstr "Dekuma punkto" + +#: includes/field.handlers.inc:541 +msgid "What single character to use as a decimal point." +msgstr "Kiu signo por uzi kiel dekuma punkto." + +#: includes/field.handlers.inc:547 +msgid "Thousands separator" +msgstr "Disigilo de miloj" + +#: includes/field.handlers.inc:549 +msgid "What single character to use as the thousands separator." +msgstr "Kiu signo por uzi kiel la disigilo de miloj." + +#: includes/field.handlers.inc:554 +msgid "Prefix" +msgstr "Prefikso" + +#: includes/field.handlers.inc:556 +msgid "Text to put before the number, such as currency symbol." +msgstr "Teksto por meti antaŭ la numero, kiel mona simbolo." + +#: includes/field.handlers.inc:560 +msgid "Suffix" +msgstr "Sufikso" + +#: includes/field.handlers.inc:562 +msgid "Text to put after the number, such as currency symbol." +msgstr "Teksto por meti post la numero, kiel mona simbolo." + +#: includes/filter.handlers.inc:124 +msgid "Operator" +msgstr "Operacio" + +#: includes/filter.handlers.inc:188 +msgid "Expose" +msgstr "Montri" + +#: includes/filter.handlers.inc:193 +msgid "This item is currently not exposed. If you expose it, users will be able to change the filter as they view it." +msgstr "Ĉi tiu ero nun estas kaŝita. Se vi montras ĝin, uzantoj povos ŝanĝi la filtrilon dum ili vidas ĝin." + +#: includes/filter.handlers.inc:200 +msgid "Hide" +msgstr "Kaŝi" + +#: includes/filter.handlers.inc:205 +msgid "This item is currently exposed. If you hide it, users will not able to change the filter as they view it." +msgstr "Ĉi tiu ero estas nun montrata. Se vi kaŝas ĝin, uzantoj ne povos ŝanĝi la filtrilon dum ili vidas ĝin. " + +#: includes/filter.handlers.inc:276 +msgid "Unlock operator" +msgstr "Malŝlosi operatoron" + +#: includes/filter.handlers.inc:277 +msgid "When checked, the operator will be exposed to the user" +msgstr "Kiam ŝaltita, la operatoro montriĝas al la uzanto" + +#: includes/filter.handlers.inc:283 +msgid "Operator identifier" +msgstr "Operatora identigilo" + +#: includes/filter.handlers.inc:285 +msgid "This will appear in the URL after the ? to identify this operator." +msgstr "Ĉi tio aperos en la URL post la ? por identigi ĉi tiun operatoron." + +#: includes/filter.handlers.inc:302 +msgid "Filter identifier" +msgstr "Filtrila identigilo" + +#: includes/filter.handlers.inc:304 +msgid "This will appear in the URL after the ? to identify this filter. Cannot be blank." +msgstr "Ĉi tio aperos en la URL post la ? por identigi ĉi tiun filtrilon. Ne povas esti malplena." + +#: includes/filter.handlers.inc:320 +msgid "Optional" +msgstr "Nedeviga" + +#: includes/filter.handlers.inc:321 +msgid "This exposed filter is optional and will have added options to allow it not to be set." +msgstr "Ĉi tiu montrata filtrilo estas nedeviga kaj havos aldonajn opciojn por ebligi ke ĝi ne estu ŝaltita." + +#: includes/filter.handlers.inc:327 +msgid "Force single" +msgstr "Devigi unuopan" + +#: includes/filter.handlers.inc:328 +msgid "Force this exposed filter to accept only one option." +msgstr "Devigi ke ĉi tiu montrata filtrilo akceptu nur unu opcion." + +#: includes/filter.handlers.inc:334 +msgid "Remember" +msgstr "Memori" + +#: includes/filter.handlers.inc:335 +msgid "Remember the last setting the user gave this filter." +msgstr "Memori la lastan agordon kiun la uzanto donis al ĉi tiu filtrilo." + +#: includes/filter.handlers.inc:346 +msgid "The identifier is required if the filter is\n exposed." +msgstr "La identigilo estas bezonata se la filtrilo estas\n montrata." + +#: includes/filter.handlers.inc:352 +msgid "This identifier is not allowed." +msgstr "Ĉi tiu identigilo ne estas permesata." + +#: includes/filter.handlers.inc:453 +msgid "" +msgstr "" + +#: includes/filter.handlers.inc:607 +msgid "Is equal to" +msgstr "Egalas al" + +#: includes/filter.handlers.inc:608 +msgid "Is not equal to" +msgstr "Ne egalas al" + +#: includes/filter.handlers.inc:618 +msgid "Value" +msgstr "Valoro" + +#: includes/filter.handlers.inc:650 +msgid "=" +msgstr "=" + +#: includes/filter.handlers.inc:661 +msgid "Contains" +msgstr "Enhavas" + +#: includes/filter.handlers.inc:662 +msgid "contains" +msgstr "enhavas" + +#: includes/filter.handlers.inc:667 +msgid "Contains any word" +msgstr "Enhavas iun vorton" + +#: includes/filter.handlers.inc:668 +msgid "has word" +msgstr "havas vorton" + +#: includes/filter.handlers.inc:673 +msgid "Contains all words" +msgstr "Enhavas ĉiujn vortojn" + +#: includes/filter.handlers.inc:674 +msgid "has all" +msgstr "havas ĉiujn" + +#: includes/filter.handlers.inc:679 +msgid "Starts with" +msgstr "Komenciĝas per" + +#: includes/filter.handlers.inc:680 +msgid "begins" +msgstr "komenciĝas" + +#: includes/filter.handlers.inc:685 +msgid "Ends with" +msgstr "Finiĝas per" + +#: includes/filter.handlers.inc:686 +msgid "ends" +msgstr "finiĝas" + +#: includes/filter.handlers.inc:691 +msgid "Does not contain" +msgstr "Ne enhavas" + +#: includes/filter.handlers.inc:692 +msgid "!has" +msgstr "!has" + +#: includes/filter.handlers.inc:701 +msgid "Is empty (NULL)" +msgstr "Malplenas (NULL)" + +#: includes/filter.handlers.inc:703 +msgid "empty" +msgstr "malplena" + +#: includes/filter.handlers.inc:707 +msgid "Is not empty (NULL)" +msgstr "Ne malplenas (NULL)" + +#: includes/filter.handlers.inc:709 +msgid "not empty" +msgstr "ne malplena" + +#: includes/filter.handlers.inc:732 +msgid "exposed>" +msgstr "montrata>" + +#: includes/filter.handlers.inc:739 +msgid "Case sensitive" +msgstr "Usklecodistinga" + +#: includes/filter.handlers.inc:741 +msgid "Case sensitive filters may be faster; MySQL might ignore case sensitivity." +msgstr "Usklecodistingaj filtriloj povas esti pli rapidaj; MySQL eble ignoras usklecodistingeco." + +#: includes/filter.handlers.inc:936 +msgid "exposed" +msgstr "montrita" + +#: includes/filter.handlers.inc:968 +msgid "Options" +msgstr "Opcioj" + +#: includes/filter.handlers.inc:990 +msgid "Limit list to selected items" +msgstr "Limigi liston al elektitaj eroj" + +#: includes/filter.handlers.inc:991 +msgid "If checked, the selected items presented to the user will be the only ones selected here." +msgstr "Se ŝaltita, la elektitaj eroj prezentitaj al la uzanto estos la solaj kiuj estas elektitaj ĉi tie. " + +#: includes/filter.handlers.inc:1010 +msgid "Is one of" +msgstr "Estas unu el" + +#: includes/filter.handlers.inc:1011 +msgid "Is not one of" +msgstr "Ne estas unu el" + +#: includes/filter.handlers.inc:1102 +#: modules/system.views.inc:234 +msgid "Unknown" +msgstr "Nekonata" + +#: includes/filter.handlers.inc:1157 +msgid "Is less than" +msgstr "Estas malpli ol" + +#: includes/filter.handlers.inc:1159 +msgid "<" +msgstr "<" + +#: includes/filter.handlers.inc:1163 +msgid "Is less than or equal to" +msgstr "Estas malpli ol aŭ egala al" + +#: includes/filter.handlers.inc:1165 +msgid "<=" +msgstr "<=" + +#: includes/filter.handlers.inc:1177 +msgid "!=" +msgstr "!=" + +#: includes/filter.handlers.inc:1181 +msgid "Is greater than or equal to" +msgstr "Estas pli granda aŭ egala al" + +#: includes/filter.handlers.inc:1183 +msgid ">=" +msgstr ">=" + +#: includes/filter.handlers.inc:1187 +msgid "Is greater than" +msgstr "Estas pli granda ol" + +#: includes/filter.handlers.inc:1189 +msgid ">" +msgstr ">" + +#: includes/filter.handlers.inc:1193 +msgid "Is between" +msgstr "Estas inter" + +#: includes/filter.handlers.inc:1195 +msgid "between" +msgstr "inter" + +#: includes/filter.handlers.inc:1199 +msgid "Is not between" +msgstr "Ne estas inter" + +#: includes/filter.handlers.inc:1201 +msgid "not between" +msgstr "ne inter" + +#: includes/filter.handlers.inc:1292 +msgid "Min" +msgstr "Min" + +#: includes/filter.handlers.inc:1298 +msgid "And max" +msgstr "Kaj maks" + +#: includes/filter.handlers.inc:1298 +msgid "And" +msgstr "Kaj" + +#: includes/filter.handlers.inc:1355 +msgid "@min and @max" +msgstr "@min kaj @max" + +#: includes/filter.handlers.inc:1381 +msgid "Value type" +msgstr "Valora speco" + +#: includes/filter.handlers.inc:1383 +msgid "A date in any machine readable format. CCYY-MM-DD HH:MM:SS is preferred." +msgstr "Dato en maŝinlegebla formato. CCYY-MM-DD HH:MM:SS estas preferata." + +#: includes/filter.handlers.inc:1384 +msgid "An offset from the current time such as \"+1 day\" or \"-2 hours and 30 minutes\"" +msgstr "Deŝovo de la nuna tempo kiel \"+1 tago\" aŭ \"-2 horoj kaj 30 minutoj\"" + +#: includes/filter.handlers.inc:1434 +msgid "Invalid date format." +msgstr "Nevalida datoformato." + +#: includes/filter.handlers.inc:1540 +msgid "Is all of" +msgstr "Estas ĉio el" + +#: includes/filter.handlers.inc:1541 +msgid "Is none of" +msgstr "Estas nenio el" + +#: includes/form.inc:249 +msgid "Validation error, please try again. If this error persists, please contact the site administrator." +msgstr "Validiga eraro, bonvolu reprovi. Se ĉi tiu eraro daŭras, bonvolu kontakti la retejan administranton." + +#: includes/handlers.inc:154 +msgid "!group: !title" +msgstr "!group: !title" + +#: includes/handlers.inc:380 +msgid "Reduce duplicates" +msgstr "Redukti kopiojn" + +#: includes/handlers.inc:381 +msgid "This filter can cause items that have more than one of the selected options to appear as duplicate results. If this filter causes duplicate results to occur, this checkbox can reduce those duplicates; however, the more terms it has to search for, the less performant the query will be, so use this with caution." +msgstr "Ĉi tiu filtrilo povas kaŭzi ke eroj havu pli ol unu el la elektitaj opcioj por aperi kiel kopiaj rezultoj. Se tiu filtrilo kaŭzas ke kopiaj rezultoj okazu, tiu markobutono povas redukti tiujn kopiojn; tamen, ju pli da terminoj ĝi devas serĉi, des malpli rendimenta la informpeto estos, do uzu tion atente. " + +#: includes/plugins.inc:19 +msgid "Default settings for this view." +msgstr "Defaŭltaj agordoj por ĉi tiu aspekto." + +#: includes/plugins.inc:33 +msgid "Display the view as a page, with a URL and menu links." +msgstr "Montri la aspekton kiel paĝo, kun URL kaj menuligiloj." + +#: includes/plugins.inc:44 +msgid "Block" +msgstr "Bloko" + +#: includes/plugins.inc:45 +msgid "Display the view as a block." +msgstr "Montri la aspekton kiel blokon." + +#: includes/plugins.inc:57 +msgid "Attachment" +msgstr "Alkroĉaĵo" + +#: includes/plugins.inc:58 +msgid "Attachments added to other displays to achieve multiple views in the same view." +msgstr "Alkroĉaĵoj aldonitaj al aliaj montroj por atingi multajn aspektojn en la sama aspekto." + +#: includes/plugins.inc:66 +msgid "Display the view as a feed, such as an RSS feed." +msgstr "Montri la aspekton kiel fluo, ekzemple kiel RSS-fluo." + +#: includes/plugins.inc:78 +msgid "Unformatted" +msgstr "Neformatita" + +#: includes/plugins.inc:79 +msgid "Displays rows one after another." +msgstr "Montras vicojn unu post la alia." + +#: includes/plugins.inc:89 +msgid "Displays rows as an HTML list." +msgstr "Montras vicojn kiel HTML-liston." + +#: includes/plugins.inc:97 +msgid "Grid" +msgstr "Krado" + +#: includes/plugins.inc:98 +msgid "Displays rows in a grid." +msgstr "Montras vicojn en krado." + +#: includes/plugins.inc:106 +msgid "Table" +msgstr "Tabelo" + +#: includes/plugins.inc:107 +msgid "Displays rows in a table." +msgstr "Montras vicojn en tabelo." + +#: includes/plugins.inc:117 +msgid "Displays the default summary summary as a list." +msgstr "Montras la defaŭltan resumon kiel liston." + +#: includes/plugins.inc:125 +msgid "Displays the summary unformatted, with option for one after another or inline." +msgstr "Montras la resumon neformatitan, kun opcio por unu post la alia aŭ enteksta." + +#: includes/plugins.inc:132 +msgid "RSS Feed" +msgstr "RSS-Fluo" + +#: includes/plugins.inc:133 +msgid "Generates an RSS feed from a view." +msgstr "Generas RSS-fluon de aspekto." + +#: includes/plugins.inc:143 +#: includes/view.inc:1767 +msgid "Fields" +msgstr "Kampoj" + +#: includes/plugins.inc:144 +msgid "Displays the fields with an optional template." +msgstr "Montras la kampojn kun nedeviga ŝablono." + +#: includes/plugins.inc:154 +msgid "Fixed entry" +msgstr "Fiksita ero" + +#: includes/plugins.inc:158 +msgid "PHP Code" +msgstr "PHP-Kodo" + +#: includes/plugins.inc:168 +msgid "Numeric" +msgstr "Numera" + +#: includes/plugins.inc:809 +msgid "Broken field" +msgstr "Rompita kampo" + +#: includes/plugins.inc:826 +msgid "Basic settings" +msgstr "Bazaj agordoj" + +#: includes/plugins.inc:833 +msgid "Change the name of this display." +msgstr "Ŝanĝi la nomon de ĉi tiu montro." + +#: includes/plugins.inc:845 +msgid "Change the title that this display will use." +msgstr "Ŝanĝu la titolon kiun ĉi tiu montro uzos." + +#: includes/plugins.inc:855 +msgid "Style" +msgstr "Stilo" + +#: includes/plugins.inc:857 +msgid "Change the style plugin." +msgstr "Ŝanĝi la stilan kromprogramon." + +#: includes/plugins.inc:871 +msgid "Row style" +msgstr "Vica stilo" + +#: includes/plugins.inc:873 +msgid "Change the row plugin." +msgstr "Ŝanĝi la vican kromprogramon." + +#: includes/plugins.inc:883 +msgid "Use AJAX" +msgstr "Uzi AJAX-n" + +#: includes/plugins.inc:885 +msgid "Change whether or not this display will use AJAX." +msgstr "Ŝanĝi ĉu aŭ ne ĉi tiu montro uzos AJAX-n." + +#: includes/plugins.inc:892 +msgid "Use pager" +msgstr "Uzi paĝilon" + +#: includes/plugins.inc:893 +msgid "Mini" +msgstr "Mini" + +#: includes/plugins.inc:894 +msgid "Change this display's pager setting." +msgstr "Ŝanĝi la agordon de ĉi tiu montra paĝilo" + +#: includes/plugins.inc:901 +msgid "Items per page" +msgstr "Eroj de paĝo" + +#: includes/plugins.inc:901 +msgid "Items to display" +msgstr "Eroj por montri" + +#: includes/plugins.inc:902 +msgid "Unlimited" +msgstr "Senlima" + +#: includes/plugins.inc:903 +msgid "Change how many items to display." +msgstr "Ŝanĝi kiom da eroj por montri" + +#: includes/plugins.inc:909 +msgid "More link" +msgstr "Plia ligilo" + +#: includes/plugins.inc:911 +msgid "Specify whether this display will provide a \"more\" link." +msgstr "Elekti ĉu ĉi tiu montro provizos \"plian\" ligilon." + +#: includes/plugins.inc:917 +msgid "Distinct" +msgstr "Distinga" + +#: includes/plugins.inc:919 +msgid "Display only distinct items, without duplicates." +msgstr "Montri nur distinktajn erojn, sen kopioj." + +#: includes/plugins.inc:930 +msgid "Unrestricted" +msgstr "Nelimigita" + +#: includes/plugins.inc:938 +msgid "Multiple roles" +msgstr "Multaj roloj" + +#: includes/plugins.inc:950 +msgid "Access" +msgstr "Aliro" + +#: includes/plugins.inc:952 +msgid "Specify access control settings for this display." +msgstr "Indiki alirajn agordojn por ĉi tiu montro." + +#: includes/plugins.inc:972 +msgid "Link display" +msgstr "Ligila montro" + +#: includes/plugins.inc:974 +msgid "Specify which display this display will link to." +msgstr "Indiki al kiu montro ĉi tiu montro ligos." + +#: includes/plugins.inc:979 +msgid "Header" +msgstr "Kaplinio" + +#: includes/plugins.inc:979 +msgid "Footer" +msgstr "Piedlinio" + +#: includes/plugins.inc:979 +msgid "Empty text" +msgstr "Malplena teksto" + +#: includes/plugins.inc:995 +msgid "Unknown/missing filter" +msgstr "Nekonata/mankata filtrilo" + +#: includes/plugins.inc:1003 +msgid "Change this display's !name." +msgstr "Ŝanĝi la !name de la montro." + +#: includes/plugins.inc:1009 +msgid "Theme" +msgstr "Haŭto" + +#: includes/plugins.inc:1010 +msgid "Information" +msgstr "Informoj" + +#: includes/plugins.inc:1011 +msgid "Get information on how to theme this display" +msgstr "Akiri informojn pri kiel haŭtigi ĉi tiun montron" + +#: includes/plugins.inc:1037 +msgid "The name of this display" +msgstr "La nomo de ĉi tiu montro" + +#: includes/plugins.inc:1040 +msgid "This title will appear only in the administrative interface for the View." +msgstr "Ĉi tiu titolo aperos nur en la administra interfaco por la Aspekto." + +#: includes/plugins.inc:1045 +msgid "The title of this view" +msgstr "La titolo de ĉi tiu aspekto" + +#: includes/plugins.inc:1048 +msgid "This title will be displayed with the view, wherever titles are normally displayed; i.e, as the page title, block title, etc." +msgstr "Ĉi tiu titolo montros kun la aspekto, kie ajn titoloj normale montriĝas; ekzemple, kiel la paĝa titolo, bloka titolo ktp." + +#: includes/plugins.inc:1053 +msgid "Use AJAX when available to load this view" +msgstr "Uzi AJAX-n kiam eblas por ŝarĝi ĉi tiun aspekton" + +#: includes/plugins.inc:1057 +msgid "If set, this view will use an AJAX mechanism for paging, table sorting and exposed filters. This means the entire page will not refresh. It is not recommended that you use this if this view is the main content of the page as it will prevent deep linking to specific pages, but it is very useful for side content." +msgstr "Se ŝaltita, ĉi tiu aspekto uzos AJAX-n mekanismon por paĝado, tabelordigo kaj montrataj filtriloj. Tio signifas ke la tuta paĝo ne refreŝiĝos. Ne estas rekomendita uzi tion se ĉi tiu aspekto estas la ĉefa enhavo de la paĝo ĉar tio malebligos profundajn ligilojn al specifaj paĝoj, sed tre utilas por flanka enhavo." + +#: includes/plugins.inc:1066 +msgid "Use a pager for this view" +msgstr "Uzi paĝilon por ĉi tiu aspekto" + +#: includes/plugins.inc:1069 +msgid "Full pager" +msgstr "Plena paĝilo" + +#: includes/plugins.inc:1069 +msgid "Mini pager" +msgstr "Mini-paĝilo" + +#: includes/plugins.inc:1074 +msgid "Pager element" +msgstr "Paĝila elemento" + +#: includes/plugins.inc:1075 +msgid "Unless you're experiencing problems with pagers related to this view, you should leave this at 0. If using multiple pagers on one page you may need to set this number to a higher value so as not to conflict within the ?page= array. Large values will add a lot of commas to your URLs, so avoid if possible." +msgstr "Krom se vi spertas problemojn kun paĝiloj rilate al ĉi tiu aspekto, indas lasi ĉe 0. Se vi uzas multajn paĝilojn en unu paĝo, vi eble bezonas ke tiu numero estu pli alta valoro por ke ĝi ne konfliktu kun la ?page=array. Grandaj valoroj aldonos multe da komoj al viaj URL-oj, do evitu se eblas." + +#: includes/plugins.inc:1084 +msgid "The number of items to display per page. Enter 0 for no limit." +msgstr "La nombro da eroj por montri en ĉiu paĝo. Enmetu 0 por neniu limo." + +#: includes/plugins.inc:1089 +msgid "Offset" +msgstr "Deŝovo" + +#: includes/plugins.inc:1090 +msgid "The number of items to skip. For example, if this field is 3, the first 3 items will be skipped and not displayed. Offset can not be used if items to display is 0; instead use a very large number there." +msgstr "La nombro da eroj por preterpasi. Ekzemple, se ĉi tiu kampo estas 3, la unuaj 3 eroj preterpasiĝos kaj ne montriĝos. Deŝovo ne povas esti uzata se la montro estas 0; anstataŭe uzu tre grandan numeron tie." + +#: includes/plugins.inc:1095 +msgid "Add a more link to the bottom of the display." +msgstr "Aldonu "pli" ligilon sube de la montro. " + +#: includes/plugins.inc:1098 +msgid "Create more link" +msgstr "Kreu "pli" ligilon" + +#: includes/plugins.inc:1099 +msgid "This will add a more link to the bottom of this view, which will link to the page view. If you have more than one page view, the link will point to the display specified in 'Link display' above." +msgstr "Tio aldonos "pli" ligilon sube de ĉi tiu montro, kiu ligos al la paĝa aspekto. Se vi havas pli ol unu paĝa aspekto, la ligilo iros al la montro indikita en 'Ligila montro' supre." + +#: includes/plugins.inc:1108 +msgid "This will make the view display only distinct items. If there are multiple identical items, each will be displayed only once. You can use this to try and remove duplicates from a view, though it does not always work. Note that this can slow queries down, so use it with caution." +msgstr "Tio kaŭzos ke la aspekto montros nur malsamajn erojn. Se estas multaj samaj eroj, ĉiu montriĝos nur unufoje. Vi povas uzi ĉi tion por provi forigi kopiojn de aspekto, kvankam tio ne ĉiam funkcias. Rimarku ke tio povas malrapidigi informpetojn, do uzu ĝin zorgeme." + +#: includes/plugins.inc:1113 +msgid "Access restrictions" +msgstr "Aliraj limigoj" + +#: includes/plugins.inc:1130 +msgid "By role" +msgstr "De rolo" + +#: includes/plugins.inc:1130 +msgid "By permission" +msgstr "De permeso" + +#: includes/plugins.inc:1139 +msgid "Role" +msgstr "Rolo" + +#: includes/plugins.inc:1142 +msgid "Only the checked roles will be able to access this display. Note that users with \"access all views\" can see any view, regardless of role." +msgstr "Nur la elektitaj roloj eblos aliri ĉi tiun montron. Rimarku ke uzantoj kun \"aliri ĉiujn aspektojn\" povas vidi ĉiujn aspektojn, egale de la rolo." + +#: includes/plugins.inc:1159 +msgid "Permission" +msgstr "Permeso" + +#: includes/plugins.inc:1161 +msgid "Only users with the selected permission flag will be able to access this display. Note that users with \"access all views\" can see any view, regardless of other permissions." +msgstr "Nur uzantoj kun la elektita permeso povos aliri ĉi tiun montron. Rimarku ke uzantoj kun la permeso \"aliri ĉiujn aspektojn\" povas vidi ĉiujn aspektojn, egale de aliaj permesoj." + +#: includes/plugins.inc:1172 +msgid "Display even if view has no result" +msgstr "Montru eĉ se la aspekto ne havas rezulton" + +#: includes/plugins.inc:1179 +msgid "Text to display at the top of the view. May contain an explanation or links or whatever you like. Optional." +msgstr "Teksto por montri supre de la aspekto. Eble enhavas klarigon aŭ ligilojn aŭ kion ajn vi volas. Nedeviga." + +#: includes/plugins.inc:1195 +msgid "Text to display beneath the view. May contain an explanation or links or whatever you like. Optional." +msgstr "Teksto por montri sub la aspekto. Eblas enhavas klarigon aŭ ligiloj aŭ kion ajn vi volas. Nedeviga." + +#: includes/plugins.inc:1206 +msgid "Text to display if the view has no results. Optional." +msgstr "Teksto por montri se la aspekto ne havas rezultojn. Nedeviga." + +#: includes/plugins.inc:1212 +msgid "How should this view be styled" +msgstr "Kiel ĉi tiu aspekto devas esti stilita." + +#: includes/plugins.inc:1218 +msgid "If the style you choose has settings, be sure to click the settings button that will appear next to it in the View summary." +msgstr "Se la stilo vi elektis havas agordojn, certe klaku la butonon de agordoj kiu aperos apud ĝi en la resumo de la Aspekto." + +#: includes/plugins.inc:1226 +msgid "You may also adjust the !settings for the currently selected style by clicking on the icon." +msgstr "Vi ankaŭ povas ŝanĝi la !settings por la nune elektita stilo klakante sur la bildsimbolo." + +#: includes/plugins.inc:1226 +msgid "settings" +msgstr "agordoj" + +#: includes/plugins.inc:1232 +msgid "Style options" +msgstr "Stilaj opcioj" + +#: includes/plugins.inc:1244 +msgid "Row style options" +msgstr "Stilaj opcioj de vico" + +#: includes/plugins.inc:1256 +msgid "How should each row in this view be styled" +msgstr "Kiel ĉiu vico en ĉi tiu aspekto devas esti stilita" + +#: includes/plugins.inc:1269 +msgid "You may also adjust the !settings for the currently selected row style by clicking on the icon." +msgstr "Vi ankaŭ povas ŝanĝi la agordojn por la nune elektita vica stilo klakante la ikonon." + +#: includes/plugins.inc:1275 +msgid "Which display to use for path" +msgstr "Kiun montron por uzi kiel vojo" + +#: includes/plugins.inc:1284 +msgid "Which display to use to get this display's path for things like summary links, rss feed links, more links, etc." +msgstr "Kiun montron por uzi por preni la vojon de la montro por aferoj kiel resumaj ligiloj, rss-fluaj ligiloj, pliaj ligiloj ktp." + +#: includes/plugins.inc:1289 +msgid "Theming information" +msgstr "Haŭtaj informoj" + +#: includes/plugins.inc:1297 +msgid "Display output" +msgstr "Eligo de montro" + +#: includes/plugins.inc:1301 +msgid "Alternative display output" +msgstr "Alternativa eligo de montro" + +#: includes/plugins.inc:1308 +msgid "Style output" +msgstr "Eligo de stilo" + +#: includes/plugins.inc:1312 +msgid "Alternative style" +msgstr "Alternative stilo" + +#: includes/plugins.inc:1319 +msgid "Row style output" +msgstr "Eligo de vica stilo" + +#: includes/plugins.inc:1323 +msgid "Alternative row style" +msgstr "Alternativa vica stilo" + +#: includes/plugins.inc:1331 +msgid "Field @field (ID: @id)" +msgstr "Kampo @field (ID: @id)" + +#: includes/plugins.inc:1339 +msgid "This section lists all possible templates for the display plugin and for the style plugins, ordered roughly from the least specific to the most specific. The active template for each plugin -- which is the most specific template found on the system -- is highlighted in bold." +msgstr "Ĉi tiu sekcio listigas ĉiujn eblajn ŝablonojn por la montra kromprogramo kaj por la stilaj kromprogramoj, ordigitaj pli malpli de la malplej specifaj ĝis la plej specifaj. La aktiva ŝablono por ĉiu kromprogramo -- kiu estas la plej specifa ŝablonon trovita en la sistemo -- estas markita grase." + +#: includes/plugins.inc:1354 +msgid "Rescan template files" +msgstr "Reskani ŝablonajn dosierojn" + +#: includes/plugins.inc:1360 +msgid "Important! When adding, removing, or renaming template files, it is necessary to make Drupal aware of the changes by making it rescan the files on your system. By clicking this button you clear Drupal's theme registry and thereby trigger this rescanning process. The highlighted templates above will then reflect the new state of your system." +msgstr "Grave! Kiam aldonante, forigante, aŭ renomante ŝablonajn dosierojn, necesas atentigi Drupalon de la ŝanĝoj per reskanado de la dosieroj en via sistemo. Klakante ĉi tiun butonon, vi malplenigas la registrejon de la Drupala haŭto kaj tiel ekigas la reskanan procezon. La markitaj ŝablonoj supre tiam reflektos la novan staton de via sistemo." + +#: includes/plugins.inc:1366 +msgid "Theming information (display)" +msgstr "Haŭtaj informoj (montro)" + +#: includes/plugins.inc:1367 +msgid "Back to !info." +msgstr "Reen al !info." + +#: includes/plugins.inc:1367 +msgid "theming information" +msgstr "haŭtaj informoj" + +#: includes/plugins.inc:1370 +msgid "This display has no theming information" +msgstr "Ĉi tiu ŝablono ne havas haŭtajn informojn" + +#: includes/plugins.inc:1373 +msgid "This is the default theme template used for this display." +msgstr "Tio estas la defaŭlta haŭta ŝablono uzata por ĉi tiu montro." + +#: includes/plugins.inc:1379 +msgid "This is an alternative template for this display." +msgstr "Tio estas alternativa ŝablono por ĉi tiu montro." + +#: includes/plugins.inc:1393 +msgid "Theming information (style)" +msgstr "Haŭtaj informoj (stilo)" + +#: includes/plugins.inc:1399 +msgid "This display has no style theming information" +msgstr "Ĉi tiu montro ne havas informojn de stila haŭtado" + +#: includes/plugins.inc:1402 +msgid "This is the default theme template used for this style." +msgstr "Tio estas la defaŭlta haŭta ŝablono uzata por ĉi tiu stilo." + +#: includes/plugins.inc:1408 +msgid "This is an alternative template for this style." +msgstr "Tio estas alternative ŝablono por ĉi tiu stilo." + +#: includes/plugins.inc:1422 +msgid "Theming information (row style)" +msgstr "Haŭtaj informoj (vica stilo)" + +#: includes/plugins.inc:1428 +msgid "This display has no row style theming information" +msgstr "Ĉi tiu montro ne havas informojn de vica stila haŭtado" + +#: includes/plugins.inc:1431 +msgid "This is the default theme template used for this row style." +msgstr "Tio estas la defaŭlta haŭta ŝablono uzata por ĉi tiu vica stilo." + +#: includes/plugins.inc:1437 +msgid "This is an alternative template for this row style." +msgstr "Tio estas alternativa ŝablono por ĉi tiu vica stilo." + +#: includes/plugins.inc:1494 +msgid "File found in folder @template-path" +msgstr "Dosiero trovita en dosierujo @template-path" + +#: includes/plugins.inc:1498 +msgid "(File not found, in folder @template-path)" +msgstr "(Dosiero ne trovita, en dosierujo @template-path)" + +#: includes/plugins.inc:1525 +msgid "You must select at least one role if type is \"by role\"" +msgstr "Vi devas elektia almenaŭ unu rolon se speco estas \"de rolo\"" + +#: includes/plugins.inc:1633 +msgid "Override" +msgstr "Anstataŭigi" + +#: includes/plugins.inc:1638 +msgid "Status: using default values." +msgstr "Stato: uzante defaŭltajn valorojn." + +#: includes/plugins.inc:1642 +msgid "Update default display" +msgstr "Ĝisdatigi defaŭltan montron" + +#: includes/plugins.inc:1647 +msgid "Use default" +msgstr "Uzu defaŭltan" + +#: includes/plugins.inc:1652 +msgid "Status: using overridden values." +msgstr "Stato: uzante anstataŭigitajn valorojn." + +#: includes/plugins.inc:1842 +msgid "Display @display uses fields but there are none defined for it." +msgstr "Montro @display uzas kampojn, sed ne estas iuj difinitaj por ĝi." + +#: includes/plugins.inc:1846 +msgid "Display @display uses path but path is undefined." +msgstr "Montro @display uzas vojon, sed vojo estas nedifinita." + +#: includes/plugins.inc:1851 +msgid "Display @display has an invalid style plugin." +msgstr "Montro @display havas nevalidan stilan kromprogramon." + +#: includes/plugins.inc:2084 +msgid "Page settings" +msgstr "Paĝaj agordoj" + +#: includes/plugins.inc:2109 +msgid "No menu" +msgstr "Neniu menuo" + +#: includes/plugins.inc:2112 +msgid "Normal: @title" +msgstr "Normala: @title" + +#: includes/plugins.inc:2116 +msgid "Tab: @title" +msgstr "Langeto: @title" + +#: includes/plugins.inc:2126 +msgid "Menu" +msgstr "Menuo" + +#: includes/plugins.inc:2132 +msgid "Change settings for the parent menu" +msgstr "Ŝanĝi agordojn por la patra menuo" + +#: includes/plugins.inc:2145 +msgid "The menu path or URL of this view" +msgstr "La menua vojo aŭ URL de ĉi tiu aspekto" + +#: includes/plugins.inc:2149 +msgid "This view will be displayed by visiting this path on your site. You may use \"%\" in your URL to represent values that will be used for arguments: For example, \"node/%/feed\"." +msgstr "Ĉi tiu aspekto montriĝos vizitante ĉi tiun vojon en via retejo. Vi povas uzi \"%\" en via URL por reprezenti valorojn kiuj estos uzataj por argumentoj: Ekzemple, \"node/%f/feed\"." + +#: includes/plugins.inc:2155 +msgid "Menu item entry" +msgstr "Menuera enskribo" + +#: includes/plugins.inc:2172 +msgid "No menu entry" +msgstr "Neniu menua enskribo" + +#: includes/plugins.inc:2173 +msgid "Normal menu entry" +msgstr "Normala menua enskribo" + +#: includes/plugins.inc:2174 +msgid "Menu tab" +msgstr "Menua langeto" + +#: includes/plugins.inc:2175 +msgid "Default menu tab" +msgstr "Defaŭlta menua langeto" + +#: includes/plugins.inc:2184 +msgid "If set to normal or tab, enter the text to use for the menu item." +msgstr "Se agordita al normala aŭ langeto, enmetu la tekston por uzi por la menuero." + +#: includes/plugins.inc:2193 +msgid "If set to tab, enter the weight of the item. The lower the weight the higher/further left it will appear." +msgstr "Se agordita al langeto, enmetu la pezon de la ero. Ju pli malalta la pezo, des pli alta/pli dekstre ĝi aperos." + +#: includes/plugins.inc:2199 +msgid "Default tab options" +msgstr "Defaŭltaj langetaj opcioj" + +#: includes/plugins.inc:2208 +msgid "When providing a menu item as a tab, Drupal needs to know what the parent menu item of that tab will be. Sometimes the parent will already exist, but other times you will need to have one created. The path of a parent item will always be the same path with the last part left off. i.e, if the path to this view is foo/bar/baz, the parent path would be foo/bar." +msgstr "Kiam provizante menueron kiel langeto, Drupalo devas scii kio estos la gepatra menuero de tiu langeto. Kelkfoje la gepatro jam ekzistos, sed alifoje vi devos krei ĝin. La vojo de gepatra ero ĉiam estos la sama vojo kun la lasta parto for. Ekz, se la vojo de ĉi tiu vojo estas foo/bar/baz, la patra vojo estos foo/bar" + +#: includes/plugins.inc:2219 +msgid "Parent menu item" +msgstr "Patra menuero" + +#: includes/plugins.inc:2221 +msgid "Already exists" +msgstr "Jam ekzistas" + +#: includes/plugins.inc:2221 +msgid "Normal menu item" +msgstr "Normala menuero" + +#: includes/plugins.inc:2229 +msgid "If creating a parent menu item, enter the title of the item." +msgstr "Se kreante patran menueron, enmetu la titolon de la ero." + +#: includes/plugins.inc:2235 +msgid "Tab weight" +msgstr "Langeta pezo" + +#: includes/plugins.inc:2239 +msgid "If the parent menu item is a tab, enter the weight of the tab. The lower the number, the more to the left it will be." +msgstr "Se la patra menuero estas langeto, enmetu la pezon de la langeto. Ju pli malalta la numero, des pli dekstre ĝi estos." + +#: includes/plugins.inc:2253 +msgid "\"$arg\" is no longer supported. Use % instead." +msgstr "\"$arg\" ne plu estas subtenata. Anstataŭe uzu %." + +#: includes/plugins.inc:2263 +msgid "Views cannot create normal menu items for paths with a % in them." +msgstr "Aspektoj ne povas krei normalajn menuerojn por vojoj kun % en ili." + +#: includes/plugins.inc:2270 +msgid "A display whose path ends with a % cannot be a tab." +msgstr "Montro kies vojo finiĝas per % ne povas esti langeto." + +#: includes/plugins.inc:2275 +msgid "Title is required for this menu type." +msgstr "Titolo estas bezonata por ĉi tiu speco de menuo." + +#: includes/plugins.inc:2306 +msgid "Display @display is set to use a menu but the menu title is not set." +msgstr "Montro @display estas agordita por uzi menuon, sed ne ekzistas titolo de la menuo." + +#: includes/plugins.inc:2312 +msgid "Display @display is set to use a parent menu but the parent menu title is not set." +msgstr "Montro @display estas agordi por uzi gepatran menuon, sed ne ekzistas gepatra titolo de la menuo." + +#: includes/plugins.inc:2378 +msgid "Block settings" +msgstr "Agordoj de bloko" + +#: includes/plugins.inc:2392 +msgid "Admin" +msgstr "Admin" + +#: includes/plugins.inc:2416 +msgid "Do not cache" +msgstr "Ne kaŝmemorigu" + +#: includes/plugins.inc:2417 +msgid "Cache once for everything (global)" +msgstr "Kaŝmemorigu unufoje por ĉio (globala)" + +#: includes/plugins.inc:2418 +msgid "Per page" +msgstr "Por paĝo" + +#: includes/plugins.inc:2419 +msgid "Per role" +msgstr "Por rolo" + +#: includes/plugins.inc:2420 +msgid "Per role per page" +msgstr "Por rolo por paĝo" + +#: includes/plugins.inc:2421 +msgid "Per user" +msgstr "Por uzanto" + +#: includes/plugins.inc:2422 +msgid "Per user per page" +msgstr "Por uzanto por paĝo" + +#: includes/plugins.inc:2447 +msgid "Block admin description" +msgstr "Priskribo de bloka administranto" + +#: includes/plugins.inc:2450 +msgid "This will appear as the name of this block in administer >> site building >> blocks." +msgstr "Tio aperos kiel la nomo de ĉi tiu bloko en administri >> reteja konstruado >> blokoj." + +#: includes/plugins.inc:2455 +msgid "Block caching type" +msgstr "Bloka speco de kaŝmemorado" + +#: includes/plugins.inc:2459 +msgid "This sets the default status for Drupal's built-in block caching method; this requires that caching be turned on in block administration, and be careful because you have little control over when this cache is flushed." +msgstr "Tio agordas la defaŭltan staton por la enkonstruita blokokaŝada metodo de Drupalo; tio bezonatas ke kaŝmemorado estu ŝaltita en bloka administrado, kaj zorgi ĉar vi havas malmulte da rego super kiam tiu kaŝmemoro estas malplenigita." + +#: includes/plugins.inc:2511 +msgid "Before" +msgstr "Antaŭ" + +#: includes/plugins.inc:2512 +msgid "After" +msgstr "Post" + +#: includes/plugins.inc:2513 +msgid "Both" +msgstr "Ambaŭ" + +#: includes/plugins.inc:2533 +msgid "Attachment settings" +msgstr "Alkroĉaj agordoj" + +#: includes/plugins.inc:2538 +msgid "Inherit arguments" +msgstr "Heredaj argumentoj" + +#: includes/plugins.inc:2544 +msgid "Inherit exposed filters" +msgstr "Heredi montratajn filtrilojn" + +#: includes/plugins.inc:2550 +msgid "Position" +msgstr "Pozicio" + +#: includes/plugins.inc:2556 +msgid "Multiple displays" +msgstr "Multajn montrojn" + +#: includes/plugins.inc:2571 +msgid "Attach to" +msgstr "Alkroĉi al" + +#: includes/plugins.inc:2588 +msgid "Inherit" +msgstr "Heredi" + +#: includes/plugins.inc:2589 +msgid "Should this display inherit its arguments from the parent display to which it is attached?" +msgstr "Ĉu ĉi tiu montro heredu ĝiajn argumentojn de la patra montro al kiu ĝi estas alkroĉita?" + +#: includes/plugins.inc:2598 +msgid "Should this display inherit its exposed filter values from the parent display to which it is attached?" +msgstr "Ĉu ĉi tiu montro heredu ĝiajn montratajn filtrajn valorojn de la patra montro al kiu ĝi estas alkroĉita?" + +#: includes/plugins.inc:2606 +msgid "Attach before or after the parent display?" +msgstr "Alkroĉi antaŭ aŭ post la patra montro?" + +#: includes/plugins.inc:2621 +msgid "Select which display or displays this should attach to." +msgstr "Elektu kiun montron aŭ montrojn al kiu ĝi devas alkroĉi." + +#: includes/plugins.inc:2776 +msgid "Feed settings" +msgstr "Fluaj agordoj" + +#: includes/plugins.inc:2780 +msgid "Using the site name" +msgstr "Uzante la retejan nomon" + +#: includes/plugins.inc:2822 +msgid "Use the site name for the title" +msgstr "Uzi la retejan nomon por la titolo" + +#: includes/plugins.inc:2845 +msgid "This view will be displayed by visiting this path on your site. It is recommended that the path be something like \"path/%/%/feed\" or \"path/%/%/rss.xml\", putting one % in the path for each argument you have defined in the view." +msgstr "Ĉi tiu aspekto montriĝos per vizito de ĉi tiu vojo en via retejo. Estas rekomentia ke la vojo estu kiel \"vojo/%/%/fluo\" aŭ "\vojo/%/%/rss.xml\", metante unu % en la vojo por ĉiu argumento kiun vi difinis en la aspekto. " + +#: includes/plugins.inc:2990 +msgid "Grouping field" +msgstr "Grupigi kampon" + +#: includes/plugins.inc:2993 +msgid "You may optionally specify a field by which to group the records. Leave blank to not group." +msgstr "Vi povas nedevige indiki kampon per kiu grupigi la rikordojn. Lasu malplena por ne grupigi." + +#: includes/plugins.inc:3081 +msgid "Style @style requires a row style but the row plugin is invalid." +msgstr "Stilo @style bezonas vican stilon, sed la vica kromprogramo estas nevalida." + +#: includes/plugins.inc:3128 +msgid "List type" +msgstr "Lista speco" + +#: includes/plugins.inc:3158 +msgid "Number of columns" +msgstr "Nombro da kolumnoj" + +#: includes/plugins.inc:3163 +msgid "Alignment" +msgstr "Ĝisrandigo" + +#: includes/plugins.inc:3164 +msgid "Horizontal" +msgstr "Horizontale" + +#: includes/plugins.inc:3164 +msgid "Vertical" +msgstr "Vertikale" + +#: includes/plugins.inc:3166 +msgid "Horizontal alignment will place items starting in the upper left and moving right. Vertical alignment will place items starting in the upper left and moving down." +msgstr "Horizontala ĝisrandigo lokigos erojn komencante en la supra maldesktra angulo kaj iras dekstren. Vertikala ĝisrandigo lokigos erojn en la supra maldekstra angulo kaj subiras." + +#: includes/plugins.inc:3285 +msgid "You need at least one field before you can configure your table settings" +msgstr "Vi bezonas almenaŭ unu kampon antaŭ ol vi povas agordi vian tabelon." + +#: includes/plugins.inc:3294 +msgid "Override normal sorting if click sorting is used" +msgstr "Anstataŭigi normalan ordigon se klaka ordigo estas uzata" + +#: includes/plugins.inc:3300 +msgid "Enable Drupal style \"sticky\" table headers (Javascript)" +msgstr "Ŝalti Drupal-stilan \"fiksa\" tabelaj kaplinioj (JavaSkripto)" + +#: includes/plugins.inc:3302 +msgid "(Sticky header effects will not be active for preview below, only on live output.)" +msgstr "(Fiksita kapliniaj efikoj ne aktivos por la antaŭvido sube, nur en viva eligo.)" + +#: includes/plugins.inc:3307 +msgid "Default sort order" +msgstr "Defaŭlta ordiga sinsekvo" + +#: includes/plugins.inc:3308 +#: includes/sort.handlers.inc:60 +msgid "Ascending" +msgstr "Kreskante" + +#: includes/plugins.inc:3308 +#: includes/sort.handlers.inc:60 +msgid "Descending" +msgstr "Malkreskante" + +#: includes/plugins.inc:3310 +msgid "If a default sort order is selected, what order should it use by default." +msgstr "Se defaŭlta ordiga sinsekvo estas elektita, kiun ordigon ĝi uzu defaŭlte." + +#: includes/plugins.inc:3396 +msgid "Place fields into columns; you may combine multiple fields into the same column. If you do, the separator in the column specified will be used to separate the fields. Check the sortable box to make that column click sortable, and check the default sort radio to determine which column will be sorted by default, if any. You may control column order and field labels in the fields section." +msgstr "Lokigi kampojn en kolumnojn; vi povas kombini multajn kampojn en la saman kolumnon. Se vi faras, la disigilo en la kolumno indikita estos uzata por disigi la kampojn. Kontrolu la ordigeblan skatolon por certigi ke tiu kolumo ordigeblos, kaj ŝaltu la defaŭltan ordigan radion por determini kiun kolumnon ordiĝos defaŭlte, se iun. Vi povas regi kolumnan sinsekvon kaj kampajn enketojn en la kampa sekcio." + +#: includes/plugins.inc:3421 +#: includes/view.inc:1769 +msgid "Field" +msgstr "Kampo" + +#: includes/plugins.inc:3422 +msgid "Column" +msgstr "Propra" + +#: includes/plugins.inc:3425 +msgid "Sortable" +msgstr "Ordigebla" + +#: includes/plugins.inc:3429 +msgid "Default sort" +msgstr "Defaŭlta ordigo" + +#: includes/plugins.inc:3488 +msgid "Display record count with link" +msgstr "Montri rikordan kalkulon kun ligilo" + +#: includes/plugins.inc:3493 +msgid "Override number of items to display" +msgstr "Anstataŭigi nombron da eroj por montri" + +#: includes/plugins.inc:3530 +msgid "Display items inline" +msgstr "Montri erojn entekste" + +#: includes/plugins.inc:3580 +msgid "Use the site mission for the description" +msgstr "Uzu la retejan mision por la priskribo" + +#: includes/plugins.inc:3584 +msgid "RSS description" +msgstr "RSS-priskribo" + +#: includes/plugins.inc:3586 +msgid "This will appear in the RSS feed itself." +msgstr "Ĉi tio aperos en la RSS-fluo mem." + +#: includes/plugins.inc:3709 +msgid "Inline fields" +msgstr "Entekstaj kampoj" + +#: includes/plugins.inc:3712 +msgid "Inline fields will be displayed next to each other rather than one after another." +msgstr "Entekstaj kampoj montriĝos apud unu la alia anstataŭ unu post la alia." + +#: includes/plugins.inc:3720 +msgid "The separator may be placed between inline fields to keep them from squishing up next to each other. You can use HTML in this field." +msgstr "La disigilo povas lokiĝi inter entekstaj kampoj por certigi ke ili ne aperas tuj apud unu la alia. Vi povas uzi HTML-n en ĉi tiu kampo." + +#: includes/plugins.inc:3770 +msgid "Default argument" +msgstr "Defaŭlta argumento" + +#: includes/plugins.inc:3792 +msgid "Note: you do not have permission to modify this. If you change the default argument type, this setting will be lost and you will NOT be able to get it back." +msgstr "Notu: vi ne havas permeson modifi ĉi tion. Se vi ŝanĝas la defaŭltan argumentan specon, ĉi tiu agordo estos perdita kaj vi NE povos rehavi ĝin." + +#: includes/plugins.inc:3813 +msgid "PHP argument code" +msgstr "Argumenta kodo de PHP" + +#: includes/plugins.inc:3816 +msgid "Enter PHP code that returns a value to use for this argument. Do not use <?php ?>. You must return only a single value for just this argument." +msgstr "Enmetu PHP-kodon kiu revenigas valoron por uzi por ĉi tiu argumento. Ne uzu <?php ?> Vi devas revenigi nur unu valoron por precize ĉi tiu argumento." + +#: includes/plugins.inc:3896 +msgid "Note: you do not have permission to modify this. If you change the validator, this setting will be lost and you will NOT be able to get it back." +msgstr "Rimarku: vi ne havas permeson modifi ĉi tion. Se vi ŝanĝas la validigilon, ĉi tiu agordo estos perdita kaj vi NE povos rehavi ĝin." + +#: includes/plugins.inc:3921 +msgid "PHP validate code" +msgstr "Validigi kodon de PHP" + +#: includes/plugins.inc:3923 +msgid "Enter PHP code that returns TRUE or FALSE. No return is the same as FALSE, so be SURE to return something if you do not want to declare the argument invalid. Do not use <?php ?>. The argument to validate will be \"$argument\" and the view will be \"$view\". You may change the argument by setting \"$handler->argument\"." +msgstr "Enmetu PHP-kodon kiu revenas TRUE aŭ FALSE. Neniu reveno estas la sama kiel FALSE, do CERTE revenigu ion se vi volas volas deklari la argumenton nevalida. Ne uzu <?php ?>. La argumento por validigi estos \"$argument\" kaj la montro estos \"$view\". Vi rajtas ŝanĝi la argumenton agordante \"$handler->argument\"." + +#: includes/relationship.handlers.inc:80 +msgid "The label for this relationship that will be displayed only administratively." +msgstr "La enketo por ĉi tiu rilato kiu montriĝos nur administre." + +#: includes/relationship.handlers.inc:85 +msgid "Require this relationship" +msgstr "Bezoni ĉi tiun rilaton" + +#: includes/relationship.handlers.inc:86 +msgid "If required, items that do not contain this relationship will not appear." +msgstr "Se bezonata, eroj kiuj ne enhavas ĉi tiun rilaton ne aperos." + +#: includes/sort.handlers.inc:43 +msgid "asc" +msgstr "kresk" + +#: includes/sort.handlers.inc:47 +msgid "desc" +msgstr "malkresk" + +#: includes/sort.handlers.inc:59 +msgid "Sort order" +msgstr "Ordiga sinsekvo" + +#: includes/sort.handlers.inc:108 +msgid "views_handler_sort_formula missing default: @formula" +msgstr "views_handler_sort_formula mankante defaŭlto: @formula" + +#: includes/sort.handlers.inc:148 +msgid "Granularity" +msgstr "Granuleco" + +#: includes/sort.handlers.inc:150 +msgid "Second" +msgstr "Sekundo" + +#: includes/sort.handlers.inc:151 +msgid "Minute" +msgstr "Minuto" + +#: includes/sort.handlers.inc:152 +msgid "Hour" +msgstr "Horo" + +#: includes/sort.handlers.inc:153 +msgid "Day" +msgstr "Tago" + +#: includes/sort.handlers.inc:154 +msgid "Month" +msgstr "Monato" + +#: includes/sort.handlers.inc:155 +msgid "Year" +msgstr "Jaro" + +#: includes/sort.handlers.inc:157 +msgid "The granularity is the smallest unit to use when determining whether two dates are the same; for example, if the granularity is \"Year\" then all dates in 1999, regardless of when they fall in 1999, will be considered the same date." +msgstr "La granuleco estas la plej malgranda unuo por uzi kiam determinante ĉu du datoj estas la samaj; ekzemple, se la granuleco estas \"Jaro\" tiam ĉiuj datoj en 1999, egale de kiam ili estas en 1999, estos konsiderataj la sama dato." + +#: includes/view.inc:255 +msgid "set_display called with invalid display id @display" +msgstr "set_display vokita kun nevalida montra id @display" + +#: includes/view.inc:995 +msgid "Home" +msgstr "Hejmo" + +#: includes/view.inc:1768 +msgid "fields" +msgstr "kampoj" + +#: includes/view.inc:1770 +msgid "field" +msgstr "kampo" + +#: includes/view.inc:1775 +msgid "arguments" +msgstr "argumentoj" + +#: includes/view.inc:1776 +msgid "Argument" +msgstr "Argumento" + +#: includes/view.inc:1781 +msgid "Sort criteria" +msgstr "Ordiga kriterioj" + +#: includes/view.inc:1782 +msgid "sort criteria" +msgstr "ordiga kriterioj" + +#: includes/view.inc:1783 +msgid "Sort criterion" +msgstr "Ordiga kriterio" + +#: includes/view.inc:1784 +msgid "sort criterion" +msgstr "ordiga kriterio" + +#: includes/view.inc:1788 +msgid "Filters" +msgstr "Filtriloj" + +#: includes/view.inc:1789 +msgid "filters" +msgstr "filtriloj" + +#: includes/view.inc:1790 +msgid "Filter" +msgstr "Filtrilo" + +#: includes/view.inc:1791 +msgid "filter" +msgstr "filtrilo" + +#: includes/view.inc:1796 +msgid "Relationships" +msgstr "Rilatoj" + +#: includes/view.inc:1797 +msgid "relationships" +msgstr "rilatoj" + +#: js/ajax.js:0 +#: js/ajax_view.js:0 +msgid "An error occurred at " +msgstr "Eraro okazis ĉe" + +#: js/tabs.js:0 +msgid "jQuery UI Tabs: Mismatching fragment identifier." +msgstr "jQuery UI Langetoj: Miskongrua fragmenta identigilo." + +#: js/tabs.js:0 +msgid "jQuery UI Tabs: Not enough arguments to add tab." +msgstr "jQuery UI Langetoj: Ne sufiĉe da argumentoj por aldoni langeton." + +#: modules/book.views.inc:21 +msgid "Book" +msgstr "Libro" + +#: modules/book.views.inc:30 +msgid "Top level book" +msgstr "Plej altnivela libro" + +#: modules/book.views.inc:31 +msgid "The book the node is in." +msgstr "La libro en kiu la nodo estas." + +#: modules/book.views.inc:58 +msgid "The weight of the book page." +msgstr "La pezo de la libra paĝo." + +#: modules/book.views.inc:69 +#: modules/comment.views.inc:202 +#: modules/taxonomy.views.inc:310 +msgid "Depth" +msgstr "Profundeco" + +#: modules/book.views.inc:70 +msgid "The depth of the book page in the hierarchy; top level books have a depth of 1." +msgstr "La profundeco de la libra paĝo en la hierarkio; plej altnivelaj libroj havas profundecon de 1." + +#: modules/book.views.inc:87 +msgid "Hierarchy" +msgstr "Hierarkio" + +#: modules/book.views.inc:88 +msgid "The order of pages in the book hierarchy. Remember to sort by weight too if you want exactly the right order." +msgstr "La sinsekvo de paĝoj en la libra hierarkio. Memoru ordigi ankaŭ laŭ pezo se vi volas precize la ĝustan sinsekvon." + +#: modules/book.views.inc:110 +msgid "Parent" +msgstr "Gepatra" + +#: modules/book.views.inc:111 +msgid "The parent book node." +msgstr "La gepatra libra nodo." + +#: modules/book.views.inc:116 +msgid "Book parent" +msgstr "Libra gepatro" + +#: modules/comment.views.inc:22 +msgid "Comment" +msgstr "Komento" + +#: modules/comment.views.inc:27 +msgid "Comments are responses to node content." +msgstr "Komentoj estas respondoj al noda enhavo." + +#: modules/comment.views.inc:45 +msgid "The title of the comment." +msgstr "La titolo de la komento." + +#: modules/comment.views.inc:63 +#: modules/node.views.inc:366 +msgid "Body" +msgstr "Korpo" + +#: modules/comment.views.inc:64 +msgid "The text of the comment." +msgstr "La teksto de la komento." + +#: modules/comment.views.inc:76 +msgid "ID" +msgstr "ID" + +#: modules/comment.views.inc:77 +msgid "The comment ID of the field" +msgstr "La komenta ID de la kampo" + +#: modules/comment.views.inc:95 +msgid "Author" +msgstr "Aŭtoro" + +#: modules/comment.views.inc:96 +msgid "The name of the poster." +msgstr "La nomo de la afiŝinto." + +#: modules/comment.views.inc:114 +msgid "Author's website" +msgstr "Aŭtora retejo" + +#: modules/comment.views.inc:115 +msgid "The website address of the comment's author. Can be a link. The homepage can also be linked with the Name field. Will be empty if posted by a registered user." +msgstr "La reteja adreso de la komenta aŭtoro. Povas esti ligilo. La hejmpaĝo ankaŭ povas esti ligita kun la Noma kampo. Malplenos se afiŝita de registrita uzanto." + +#: modules/comment.views.inc:133 +#: modules/node.views.inc:107 +msgid "Post date" +msgstr "Afiŝa dato" + +#: modules/comment.views.inc:134 +msgid "Date and time of when the comment was posted." +msgstr "Dato kaj tempo kiam la komento estis afiŝita." + +#: modules/comment.views.inc:149 +msgid "In moderation" +msgstr "Prizorgata" + +#: modules/comment.views.inc:150 +msgid "Whether or not the comment is currently in moderation." +msgstr "Ĉu aŭ ne la komento estas nun en moderado." + +#: modules/comment.views.inc:157 +#: modules/node.views.inc:203 +msgid "Moderated" +msgstr "Prizorgita" + +#: modules/comment.views.inc:167 +msgid "View link" +msgstr "Vidi ligilon" + +#: modules/comment.views.inc:168 +msgid "Provide a simple link to view the comment." +msgstr "Provizi simplan ligilon por vidi la komenton." + +#: modules/comment.views.inc:176 +#: modules/node.views.inc:249 +#: modules/user.views.inc:204 +msgid "Edit link" +msgstr "Redakti ligilon" + +#: modules/comment.views.inc:177 +msgid "Provide a simple link to edit the comment." +msgstr "Provizi simplan ligilon por redakti la komenton." + +#: modules/comment.views.inc:185 +#: modules/node.views.inc:257 +#: modules/user.views.inc:212 +msgid "Delete link" +msgstr "Forigi ligilon" + +#: modules/comment.views.inc:186 +msgid "Provide a simple link to delete the comment." +msgstr "Provizi simplan ligilon por forigi la komenton." + +#: modules/comment.views.inc:194 +msgid "Reply-to link" +msgstr "Respondi-al ligilo" + +#: modules/comment.views.inc:195 +msgid "Provide a simple link to reply to the comment." +msgstr "Provizi simplan ligilon por respondi al la komento." + +#: modules/comment.views.inc:203 +msgid "Display the depth of the comment if it is threaded." +msgstr "Montri la profundecon de la komento se ĝi estas fadenita." + +#: modules/comment.views.inc:207 +msgid "Thread" +msgstr "Fadeno" + +#: modules/comment.views.inc:208 +msgid "Sort by the threaded order. This will keep child comments together with their parents." +msgstr "Ordigi laŭ la fadena sinsekvo. Tio tenos idajn komentojn kune kun siaj patroj." + +#: modules/comment.views.inc:214 +#: modules/node.views.inc:24 +#: modules/upload.views.inc:43 +msgid "Node" +msgstr "Nodo" + +#: modules/comment.views.inc:215 +msgid "The node the comment is a reply to." +msgstr "La nodo al kiu komento estas respondo." + +#: modules/comment.views.inc:225 +#: modules/node.views.inc:353 +#: modules/statistics.views.inc:201 +#: modules/user.views.inc:23 +msgid "User" +msgstr "Uzanto" + +#: modules/comment.views.inc:226 +msgid "The user who wrote the comment." +msgstr "La uzanto kiu skribis la komenton." + +#: modules/comment.views.inc:236 +msgid "Parent CID" +msgstr "Patra CID" + +#: modules/comment.views.inc:237 +msgid "The Comment ID of the parent comment." +msgstr "La komenta ID de la patra komento." + +#: modules/comment.views.inc:242 +msgid "Parent comment" +msgstr "Patra komento" + +#: modules/comment.views.inc:243 +msgid "The parent comment." +msgstr "La gepatra komento." + +#: modules/comment.views.inc:268 +msgid "Last comment time" +msgstr "Lasta komenta tempo" + +#: modules/comment.views.inc:269 +msgid "Date and time of when the last comment was posted." +msgstr "Dato kaj tempo de kiam la lasta komento estis afiŝita." + +#: modules/comment.views.inc:284 +msgid "Last comment author" +msgstr "Lasta komento de aŭtoro" + +#: modules/comment.views.inc:285 +msgid "The name of the author of the last posted comment." +msgstr "La nomo de la aŭtoro de la laste afiŝita komento." + +#: modules/comment.views.inc:297 +msgid "Comment count" +msgstr "Kvanto da komentoj" + +#: modules/comment.views.inc:298 +msgid "The number of comments a node has." +msgstr "La nombro da komentoj kiun nodo havas." + +#: modules/comment.views.inc:316 +msgid "Updated/commented date" +msgstr "Ĝisdatigita/komentita dato" + +#: modules/comment.views.inc:317 +msgid "The most recent of last comment posted or node updated time." +msgstr "La plej lasta de lasta komento afiŝita aŭ nodo ĝisdatigita tempo." + +#: modules/comment.views.inc:340 +msgid "New comments" +msgstr "Novaj komentoj" + +#: modules/comment.views.inc:341 +msgid "The number of new comments on the node." +msgstr "La nombro da novaj komentoj en la nodo." + +#: modules/comment.views.inc:349 +msgid "Comment status" +msgstr "Komenta stato" + +#: modules/comment.views.inc:350 +msgid "Whether comments are enabled or disabled on the node." +msgstr "Ĉu komentoj estas ŝaltitaj aŭ malŝaltitaj en la nodo." + +#: modules/comment.views.inc:364 +msgid "User posted or commented" +msgstr "Uzanto afiŝis aŭ komentis" + +#: modules/comment.views.inc:365 +msgid "Display comments only if a user posted the node or commented on the node." +msgstr "Montri komentojn nur se uzanto afiŝis la nodon aŭ komentis en la nodo." + +#: modules/comment.views.inc:385 +msgid "Display the comment with standard comment view." +msgstr "Montri la komenton kun norma komenta montro." + +#: modules/comment.views.inc:394 +msgid "Display the comment as RSS." +msgstr "Montri la komenton kiel RSS." + +#: modules/comment.views.inc:462 +msgid "Link this field to its comment" +msgstr "Ligi ĉi tiun kampon al ĝia komento" + +#: modules/comment.views.inc:504 +msgid "Link this field to its user or an author's homepage" +msgstr "Ligi ĉi tiun kampon al ĝia uzanto aŭ aŭtora hejmpaĝo" + +#: modules/comment.views.inc:549 +#: modules/node.views.inc:611 +#: modules/user.views.inc:452 +msgid "Text to display" +msgstr "Teksto por montri" + +#: modules/comment.views.inc:560 +#: modules/node.views.inc:622 +#: modules/user.views.inc:468 +msgid "view" +msgstr "vidi" + +#: modules/comment.views.inc:583 +#: modules/node.views.inc:651 +#: modules/user.views.inc:484 +msgid "edit" +msgstr "redakti" + +#: modules/comment.views.inc:597 +#: modules/node.views.inc:679 +#: modules/user.views.inc:500 +msgid "delete" +msgstr "forigi" + +#: modules/comment.views.inc:611 +msgid "reply" +msgstr "respondi" + +#: modules/comment.views.inc:742 +msgid "Link this field to new comments" +msgstr "Ligi ĉi tiun kampon al novaj komentoj" + +#: modules/comment.views.inc:747 +msgid "Display nothing if no new comments" +msgstr "Montri nenion se neniuj novaj komentoj" + +#: modules/comment.views.inc:812 +#: modules/user.views.inc:599 +msgid "Anonymous" +msgstr "Anonima" + +#: modules/comment.views.inc:818 +msgid "No user" +msgstr "Neniu uzanto" + +#: modules/comment.views.inc:852 +msgid "Disabled" +msgstr "Malŝaltita" + +#: modules/comment.views.inc:854 +msgid "Read only" +msgstr "Nur-legi" + +#: modules/comment.views.inc:856 +msgid "Read/Write" +msgstr "Legi/Modifi" + +#: modules/comment.views.inc:887 +#: modules/node.views.inc:1207 +msgid "Display links" +msgstr "Montri ligilojn" + +#: modules/node.views.inc:30 +msgid "Nodes are a Drupal site's primary content." +msgstr "Nodoj estas ĉefa enhavo de Drupala retejo." + +#: modules/node.views.inc:57 +msgid "Nid" +msgstr "Nid" + +#: modules/node.views.inc:58 +msgid "The node ID of the node." +msgstr "La noda ID de la nodo." + +#: modules/node.views.inc:85 +msgid "The title of the node." +msgstr "La titolo de la nodo." + +#: modules/node.views.inc:108 +msgid "The date the node was posted." +msgstr "La dato kiam la nodo estis afiŝita." + +#: modules/node.views.inc:123 +msgid "Updated date" +msgstr "Ĝisdatigita dato" + +#: modules/node.views.inc:124 +msgid "The date the node was last updated." +msgstr "La dato kiam la nodo estis laste ĝisdatigita." + +#: modules/node.views.inc:140 +msgid "The type of a node (for example, \"blog entry\", \"forum post\", \"story\", etc)." +msgstr "La speco de nodo (ekzemple, \"blog-enskribo\", \"forum-afiŝo\", \"rakonto\", ktp)" + +#: modules/node.views.inc:158 +#: modules/upload.views.inc:82 +msgid "Published" +msgstr "Publikigita" + +#: modules/node.views.inc:159 +msgid "The published status of the node." +msgstr "La eldona stato de la nodo." + +#: modules/node.views.inc:175 +msgid "Published or admin" +msgstr "Eldonita aŭ admin" + +#: modules/node.views.inc:176 +msgid "Filters out unpublished nodes if the current user cannot view them." +msgstr "Elfiltras neeldonitajn nodojn se la nuna uzanto ne povas vidi ilin." + +#: modules/node.views.inc:186 +msgid "Promoted to front page" +msgstr "Promociita al ĉefpaĝo" + +#: modules/node.views.inc:187 +msgid "The front page of the node." +msgstr "La ĉefpaĝo de la nodo." + +#: modules/node.views.inc:204 +msgid "Whether or not the node is moderated." +msgstr "Ĉu aŭ ne la nodo estas moderata." + +#: modules/node.views.inc:221 +msgid "Sticky" +msgstr "Fiksita" + +#: modules/node.views.inc:222 +msgid "Whether or not the node is sticky." +msgstr "Ĉu aŭ ne la nodo estas fiksita." + +#: modules/node.views.inc:241 +msgid "Link" +msgstr "Ligilo" + +#: modules/node.views.inc:242 +msgid "Provide a simple link to the node." +msgstr "Provizi simplan ligilon al la nodo." + +#: modules/node.views.inc:250 +msgid "Provide a simple link to edit the node." +msgstr "Provizi simplan ligilon por redakti la nodon." + +#: modules/node.views.inc:258 +msgid "Provide a simple link to delete the node." +msgstr "Provizi simplan ligilon por forigi la nodon." + +#: modules/node.views.inc:266 +msgid "Language" +msgstr "Lingvo" + +#: modules/node.views.inc:267 +msgid "The language the content is in." +msgstr "La lingvo de la enhavo." + +#: modules/node.views.inc:284 +#: modules/user.views.inc:125 +msgid "Created date" +msgstr "Kreita dato" + +#: modules/node.views.inc:285 +msgid "In the form of CCYYMMDD." +msgstr "en la formo de CCYYMMDD." + +#: modules/node.views.inc:293 +msgid "Created year + month" +msgstr "Kreita jaro + monato" + +#: modules/node.views.inc:294 +msgid "In the form of YYYYMM." +msgstr "En la formo de YYYYMM." + +#: modules/node.views.inc:302 +msgid "Created year" +msgstr "Kreita jaro" + +#: modules/node.views.inc:303 +msgid "In the form of YYYY." +msgstr "En la formo de YYYY." + +#: modules/node.views.inc:311 +msgid "Created month" +msgstr "Kreita monato" + +#: modules/node.views.inc:312 +msgid "In the form of MM (01 - 12)." +msgstr "En la formo de MM (01 - 12)." + +#: modules/node.views.inc:320 +msgid "Created week" +msgstr "Kreita semajno" + +#: modules/node.views.inc:321 +msgid "In the form of WW (01 - 53)." +msgstr "En la formo de WW (01 - 53)." + +#: modules/node.views.inc:333 +msgid "Node revision" +msgstr "Noda revizio" + +#: modules/node.views.inc:339 +msgid "Node revisions are a history of changes to nodes." +msgstr "Nodaj revizioj estas historio de ŝanĝoj al nodoj." + +#: modules/node.views.inc:354 +msgid "Relate a node revision to the user who created the revision." +msgstr "Rilatu nodan rivizion al la uzanto kiu kreis la revizion." + +#: modules/node.views.inc:359 +msgid "user" +msgstr "uzanto" + +#: modules/node.views.inc:367 +msgid "The actual, full data in the body field; this may not be valid data on all node types." +msgstr "La veraj, plenaj datumoj en la korpa kampo; tio eble ne estas validaj datumoj por ĉiuj nodaj specoj." + +#: modules/node.views.inc:381 +msgid "Teaser" +msgstr "Resumo" + +#: modules/node.views.inc:382 +msgid "The stored teaser field. This may not be valid or useful data on all node types." +msgstr "La konservita resuma kampo. Tio eble ne estas validaj aŭ utilaj datumoj por ĉiuj nodaj specoj. " + +#: modules/node.views.inc:395 +msgid "Vid" +msgstr "Vid" + +#: modules/node.views.inc:396 +msgid "The revision ID of the node revision." +msgstr "La revizia ID de la noda revizio." + +#: modules/node.views.inc:441 +msgid "Log message" +msgstr "Protokola mesaĝo" + +#: modules/node.views.inc:442 +msgid "The log message entered when the revision was created." +msgstr "La protokola mesaĝo enmetita kiam la revizio estis kreita." + +#: modules/node.views.inc:456 +msgid "The date the node revision was created." +msgstr "La dato kiam la noda revizio estis kreita." + +#: modules/node.views.inc:471 +msgid "Revert link" +msgstr "Ligilo por malfari ŝanĝojn" + +#: modules/node.views.inc:472 +msgid "Provide a simple link to revert to the revision." +msgstr "Provizi simplan ligilon por malfari ŝanĝojn al la revizio." + +#: modules/node.views.inc:480 +msgid "Provide a simple link to delete the node revision." +msgstr "Provizi simplan ligilon por forigi la nodan revizion." + +#: modules/node.views.inc:507 +msgid "Has new content" +msgstr "Havas novan enhavon" + +#: modules/node.views.inc:510 +msgid "Show a marker if the node has new or updated content." +msgstr "Montri markilon se la nodo havas novan aŭ ĝisdatigitan enhavon." + +#: modules/node.views.inc:513 +msgid "Show only nodes that have new content." +msgstr "Montri nur nodojn kiuj havas novan enhavon." + +#: modules/node.views.inc:544 +msgid "Link this field to its node" +msgstr "Ligi ĉi tiun kampon al ĝia nodo" + +#: modules/node.views.inc:717 +msgid "revert" +msgstr "malfari ŝanĝojn" + +#: modules/node.views.inc:788 +msgid "Check for new comments as well" +msgstr "Kontrolu ankaŭ por novaj komentoj" + +#: modules/node.views.inc:858 +msgid "Unknown node type" +msgstr "Nekonata noda speco" + +#: modules/node.views.inc:1027 +msgid "Week @week" +msgstr "Semajno @week" + +#: modules/node.views.inc:1037 +msgid "Node type" +msgstr "Noda speco" + +#: modules/node.views.inc:1094 +msgid "Current user's language" +msgstr "Lingvo de nuna uzanto" + +#: modules/node.views.inc:1094 +msgid "No language" +msgstr "Neniu lingvo" + +#: modules/node.views.inc:1140 +msgid "Unknown language" +msgstr "Nekonata lingvo" + +#: modules/node.views.inc:1153 +msgid "Display the node with standard node view." +msgstr "Montri la nodon kun norma noda montro." + +#: modules/node.views.inc:1177 +msgid "Node ID from URL" +msgstr "Noda ID de URL" + +#: modules/node.views.inc:1202 +msgid "Display only teaser" +msgstr "Montri nur resumon" + +#: modules/node.views.inc:1261 +msgid "Full text" +msgstr "Plena teksto" + +#: modules/node.views.inc:1262 +msgid "Title plus teaser" +msgstr "Titolo plus resumo" + +#: modules/node.views.inc:1263 +msgid "Title only" +msgstr "Nur titolo" + +#: modules/node.views.inc:1264 +msgid "Use default RSS settings" +msgstr "Uzi defaŭltajn RSS-agordojn" + +#: modules/node.views.inc:1330 +msgid "read more" +msgstr "legi pli" + +#: modules/node.views.inc:1363 +msgid "Types" +msgstr "Specoj" + +#: modules/node.views.inc:1366 +msgid "If you wish to validate for specific node types, check them; if none are checked, all nodes will pass." +msgstr "Se vi deziras validigi specifajn nodajn specojn, kontrolu ilin; se neniu estas ŝaltita, ĉiuj nodoj sukcesos." + +#: modules/node.views.inc:1373 +msgid "Validate user has access to the node" +msgstr "Validiga uzanto povas aliri la nodon" + +#: modules/node.views.inc:1381 +#: modules/taxonomy.views.inc:1015 +msgid "Argument type" +msgstr "Argumenta speco" + +#: modules/node.views.inc:1383 +msgid "Node ID" +msgstr "Noda ID" + +#: modules/node.views.inc:1384 +msgid "Node IDs separated by , or +" +msgstr "Nodaj ID-oj disigitaj per , aŭ +" + +#: modules/node.views.inc:1507 +msgid "Display %display has no access control but does not contain a filter for published nodes." +msgstr "Montro %display ne havas aliran regadon, sed ne enhavas filtrilon por eldonitaj nodoj." + +#: modules/poll.views.inc:23 +msgid "Poll" +msgstr "Enketo" + +#: modules/poll.views.inc:38 +#: modules/user.views.inc:173 +msgid "Active" +msgstr "Aktiva" + +#: modules/poll.views.inc:39 +msgid "Whether the poll is open for voting." +msgstr "Ĉu la enketo estas malfermita por voĉdonado." + +#: modules/profile.views.inc:20 +msgid "Profile" +msgstr "Profilo" + +#: modules/profile.views.inc:100 +msgid "@field-name" +msgstr "@field-name" + +#: modules/profile.views.inc:107 +msgid "Profile textfield" +msgstr "Profila tekstkampo" + +#: modules/profile.views.inc:126 +msgid "Profile textarea" +msgstr "Profila tekstareo" + +#: modules/profile.views.inc:142 +msgid "Profile checkbox" +msgstr "Profila markobutono" + +#: modules/profile.views.inc:159 +msgid "Profile URL" +msgstr "Profila URL" + +#: modules/profile.views.inc:175 +msgid "Profile selection" +msgstr "Profila elektado" + +#: modules/profile.views.inc:195 +msgid "Profile freeform list %field-name." +msgstr "Profila liberforma listo %field-name." + +#: modules/profile.views.inc:207 +msgid "Profile date %field-name." +msgstr "Profila dato %field-name." + +#: modules/search.views.inc:23 +msgid "Search" +msgstr "Serĉi" + +#: modules/search.views.inc:72 +msgid "Score" +msgstr "Poentaro" + +#: modules/search.views.inc:73 +msgid "The score of the search item." +msgstr "La poentaro de la serĉero." + +#: modules/search.views.inc:95 +msgid "Links from" +msgstr "Ligiloj de" + +#: modules/search.views.inc:96 +msgid "Nodes that link from the node." +msgstr "Nodoj kiuj ligas de la nodo." + +#: modules/search.views.inc:113 +msgid "Links to" +msgstr "Ligiloj al" + +#: modules/search.views.inc:114 +msgid "Nodes that link to the node." +msgstr "Nodoj kiuj ligas al la nodo." + +#: modules/search.views.inc:125 +msgid "Search Terms" +msgstr "Serĉaj Terminoj" + +#: modules/search.views.inc:126 +msgid "The terms to search for." +msgstr "La terminoj por serĉi." + +#: modules/search.views.inc:155 +msgid "On empty input" +msgstr "Per malplena enmeto" + +#: modules/search.views.inc:158 +msgid "Show All" +msgstr "Montri ĉiujn" + +#: modules/search.views.inc:159 +msgid "Show None" +msgstr "Montri nenion" + +#: modules/search.views.inc:173 +msgid "Enter the terms you wish to search for." +msgstr "Enmetu la terminojn kiujn vi deziras serĉi." + +#: modules/search.views.inc:188 +msgid "You must include at least one positive keyword with @count characters or more." +msgstr "Vi devas inkluzivi almenaŭ unu pozitivan ŝlosilvorton kun @count signoj aŭ pli." + +#: modules/search.views.inc:192 +msgid "Search for either of the two terms with uppercase OR. For example, cats OR dogs." +msgstr "Serĉi por unu el la du terminoj kun majuskla OR. Ekzemple, katoj OR hundoj." + +#: modules/search.views.inc:245 +msgid "Display the results with standard search view." +msgstr "Montri la rezultojn per norma serĉa montro." + +#: modules/search.views.inc:269 +msgid "Display score" +msgstr "Montri poentaron" + +#: modules/statistics.views.inc:24 +msgid "Node statistics" +msgstr "Noda statistiko" + +#: modules/statistics.views.inc:36 +msgid "Total views" +msgstr "Ĉiuj vidoj" + +#: modules/statistics.views.inc:37 +msgid "The total number of times the node has been viewed." +msgstr "La tuta nombro da fojoj la nodo estas vidita." + +#: modules/statistics.views.inc:53 +msgid "Views today" +msgstr "Vidoj hodiaŭ" + +#: modules/statistics.views.inc:54 +msgid "The total number of times the node has been viewed today." +msgstr "La tuta nombro da fojoj la nodo estas vidita hodiaŭ." + +#: modules/statistics.views.inc:70 +msgid "Most recent view" +msgstr "Plej lasta vido" + +#: modules/statistics.views.inc:71 +msgid "The most recent time the node has been viewed." +msgstr "La plej lasta fojo kiam la nodo estas vidita." + +#: modules/statistics.views.inc:86 +msgid "Access log" +msgstr "Alira protokolo" + +#: modules/statistics.views.inc:92 +msgid "Stores site access information." +msgstr "Konservas alirajn informojn de la retejo." + +#: modules/statistics.views.inc:106 +msgid "Session ID" +msgstr "Seanca ID" + +#: modules/statistics.views.inc:107 +msgid "Browser session ID of user that visited page." +msgstr "Retumila seanca ID de uzanto kiu vizitis paĝon." + +#: modules/statistics.views.inc:126 +msgid "Page title" +msgstr "Paĝa titolo" + +#: modules/statistics.views.inc:127 +msgid "Title of page visited." +msgstr "Titolo de paĝo vizitita." + +#: modules/statistics.views.inc:147 +msgid "Internal path to page visited (relative to Drupal root.)" +msgstr "Interna vojo al paĝo vizitita (relativa al Drupala radiko.)" + +#: modules/statistics.views.inc:166 +msgid "Referrer" +msgstr "Referanto" + +#: modules/statistics.views.inc:167 +msgid "Referrer URI." +msgstr "Referanta URI." + +#: modules/statistics.views.inc:182 +msgid "Hostname" +msgstr "Gastiga nomo" + +#: modules/statistics.views.inc:183 +msgid "Hostname of user that visited the page." +msgstr "Gastiga nomo de uzanto kiu vizitis la paĝon." + +#: modules/statistics.views.inc:202 +msgid "The user who visited the site." +msgstr "La uzanto kiu vizitis la retejon." + +#: modules/statistics.views.inc:212 +msgid "Timer" +msgstr "Horloĝo" + +#: modules/statistics.views.inc:213 +msgid "Time in milliseconds that the page took to load." +msgstr "Tempo en milisekundoj dum kiam la paĝo ŝargiĝis." + +#: modules/statistics.views.inc:228 +msgid "Timestamp" +msgstr "Tempindiko" + +#: modules/statistics.views.inc:229 +msgid "Timestamp of when the page was visited." +msgstr "Tempindiko kiam la paĝo estis vizitita." + +#: modules/system.views.inc:25 +msgid "File" +msgstr "Dosiero" + +#: modules/system.views.inc:31 +msgid "Files maintained by Drupal and various modules." +msgstr "Dosieroj administrataj de Drupalo kaj diversaj moduloj." + +#: modules/system.views.inc:49 +msgid "File ID" +msgstr "Dosiera ID" + +#: modules/system.views.inc:50 +msgid "The ID of the file." +msgstr "La ID de la dosiero." + +#: modules/system.views.inc:70 +msgid "The name of the file." +msgstr "La nomo de la dosiero." + +#: modules/system.views.inc:89 +msgid "The path of the file." +msgstr "La vojo de la dosiero." + +#: modules/system.views.inc:107 +msgid "Mime type" +msgstr "MIME-speco" + +#: modules/system.views.inc:108 +msgid "The mime type of the file." +msgstr "La MIME-speco de la dosiero." + +#: modules/system.views.inc:126 +msgid "Size" +msgstr "Grandeco" + +#: modules/system.views.inc:127 +msgid "The size of the file." +msgstr "La grandeco de la dosiero." + +#: modules/system.views.inc:142 +msgid "Status" +msgstr "Stato" + +#: modules/system.views.inc:143 +msgid "The status of the file." +msgstr "La stato de la dosiero." + +#: modules/system.views.inc:158 +msgid "Upload date" +msgstr "Alŝutita dato" + +#: modules/system.views.inc:159 +msgid "The date the file was uploaded." +msgstr "La dato kiam la dosiero estis alŝutita." + +#: modules/system.views.inc:202 +#: modules/upload.views.inc:152 +msgid "Link this field to download the file" +msgstr "Ligu ĉi tiun kampon por elŝuti la dosieron." + +#: modules/system.views.inc:229 +msgid "Temporary" +msgstr "Provizora" + +#: modules/system.views.inc:230 +msgid "Permanent" +msgstr "Daŭra" + +#: modules/system.views.inc:270 +msgid "No title" +msgstr "Neniu titolo" + +#: modules/taxonomy.views.inc:24 +msgid "Taxonomy" +msgstr "Taksonomio" + +#: modules/taxonomy.views.inc:48 +msgid "Vocabulary name" +msgstr "Vortproviza nomo" + +#: modules/taxonomy.views.inc:50 +msgid "Name of the vocabulary a term is a member of. This will be the vocabulary that whichever term the \"Taxonomy: Term\" field is; and can similarly cause duplicates." +msgstr "Nomo de la vortprovizo kiun termino estas membro. Tio estos la vortprovizo kiu ajn termino la \"Taksonomio: Termino\" kampo estas; kaj povas simile kaŭzi kopiojn." + +#: modules/taxonomy.views.inc:56 +msgid "Vocabulary ID" +msgstr "Vortproviza ID" + +#: modules/taxonomy.views.inc:57 +msgid "The taxonomy vocabulary ID" +msgstr "La taksonomia vortproviza ID" + +#: modules/taxonomy.views.inc:70 +msgid "Term" +msgstr "Termino" + +#: modules/taxonomy.views.inc:71 +msgid "Taxonomy terms are attached to nodes." +msgstr "Taksonomiaj terminoj estas alkroĉitaj al nodoj." + +#: modules/taxonomy.views.inc:97 +msgid "Taxonomy terms. Note that using this can cause duplicate nodes to appear in views; you must add filters to reduce the result set." +msgstr "Taksonomiaj terminoj. Rimarku ke uzante ĉi tion povas kaŭzi ke kopiaj nodoj aperu en montroj; vi devas aldoni filtrilojn por redukti la rezultaron. " + +#: modules/taxonomy.views.inc:107 +msgid "Taxonomy term name" +msgstr "Nomo de taksonomia termino" + +#: modules/taxonomy.views.inc:116 +msgid "The term weight field" +msgstr "Peza kampo de la termino" + +#: modules/taxonomy.views.inc:128 +msgid "Term description" +msgstr "Priskribo de la termino" + +#: modules/taxonomy.views.inc:129 +msgid "The description associated with a taxonomy term." +msgstr "La priskribo asociita kun taksonomia termino." + +#: modules/taxonomy.views.inc:140 +msgid "Vocabulary" +msgstr "Vortprovizo" + +#: modules/taxonomy.views.inc:141 +msgid "Filter the results of \"Taxonomy: Term\" to a particular vocabulary." +msgstr "Filtri la rezultojn de \"Taksonomio: Termino\" al specifa vortprovizo." + +#: modules/taxonomy.views.inc:176 +msgid "Term ID" +msgstr "Termina ID" + +#: modules/taxonomy.views.inc:177 +msgid "The taxonomy term ID" +msgstr "La taksonomia termina ID" + +#: modules/taxonomy.views.inc:179 +msgid "All terms" +msgstr "Ĉiuj terminoj" + +#: modules/taxonomy.views.inc:180 +msgid "Display all taxonomy terms associated with a node." +msgstr "Montri ĉiujn taksonomiajn terminojn asociitaj kun nodo." + +#: modules/taxonomy.views.inc:253 +msgid "Term synonym" +msgstr "Sinonimo de termino" + +#: modules/taxonomy.views.inc:254 +msgid "Term synonyms may be used to find terms by alternate names." +msgstr "Sinonimoj de termino povas esti uzata por trovi terminojn per alternativaj nomoj." + +#: modules/taxonomy.views.inc:270 +msgid "Term ID (with depth)" +msgstr "Termina ID (kun profundeco)" + +#: modules/taxonomy.views.inc:271 +msgid "The depth filter is more complex, so provides fewer options." +msgstr "La profunda filtrilo estas pli kompleksa, do provizas malpli da opcioj." + +#: modules/taxonomy.views.inc:281 +msgid "Term ID depth modifier" +msgstr "Profunda modifilo de termina ID" + +#: modules/taxonomy.views.inc:282 +msgid "Allows the \"depth\" for Taxonomy: Term ID (with depth) to be modified via an additional argument." +msgstr "Ebligas ke la \"profundeco\" por Taksonomio: Termina ID (kun profundeco) estu modifebla per aldona argumento." + +#: modules/taxonomy.views.inc:312 +msgid "The depth will match nodes tagged with terms in the hierarchy. For example, if you have the term \"fruit\" and a child term \"apple\", with a depth of 1 (or higher) then filtering for the term \"fruit\" will get nodes that are tagged with \"apple\" as well as \"fruit\". If negative, the reverse is true; searching for \"apple\" will also pick up nodes tagged with \"fruit\" if depth is -1 (or lower)." +msgstr "La profundeco kongruos kun nodoj etikeditaj kun terminoj en la hierarkio. Ekzemple, se oni havas la terminon \"frukto\" kaj ida termino \"pomo\", kun profundeco de 1 (aŭ pli) tiam filtrado por la termino \"frukto\" kongruos kun nodoj kiuj estas etiketitaj kun \"pomo\" kaj \"frukto\". Se negativa, la inverso veras, serĉante por \"pomo\" ankaŭ kongruos kun nodoj etiketitaj kun \"frukto\" se profundeco estas -1 (aŭ malpli)." + +#: modules/taxonomy.views.inc:317 +msgid "Allow multiple terms per argument" +msgstr "Ebligi multajn erojn por ĉiu argumento" + +#: modules/taxonomy.views.inc:318 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3. Due to the number of JOINs it would require, AND will be treated as OR with this argument." +msgstr "Se elektita, uzantoj povas enmeti multajn argumentojn en la formo de 1+2+3. Pro la nombro da JOIN-oj kiujn tiu bezonatus, AND estos traktata kiel OR kun tiu argumento." + +#: modules/taxonomy.views.inc:324 +msgid "Set the breadcrumb for the term parents" +msgstr "Agordu la paĝnivelan navigo por la gepatra termino" + +#: modules/taxonomy.views.inc:325 +msgid "If selected, the breadcrumb trail will include all parent terms, each one linking to this view. Note that this only works if just one term was received." +msgstr "Se elektita, la paĝnivela navigo inkluzivos ĉiujn patrajn terminojn, ĉiu ligante al ĉi tiu montro. Rimarku ke tio funkcias nur se nur unu termino estis ricevita." + +#: modules/taxonomy.views.inc:411 +msgid "No name" +msgstr "Neniu nomo" + +#: modules/taxonomy.views.inc:520 +msgid "Link this field to its term page" +msgstr "Ligi ĉi tiun kampon al ĝia termina paĝo" + +#: modules/taxonomy.views.inc:527 +msgid "Limit terms by vocabulary" +msgstr "Limigi terminojn per vortprovizo" + +#: modules/taxonomy.views.inc:541 +msgid "Vocabularies" +msgstr "Vortprovizoj" + +#: modules/taxonomy.views.inc:612 +msgid "Link this field to its taxonomy term page" +msgstr "Ligi ĉi tiun kampon al ĝia taksonomia termina paĝo" + +#: modules/taxonomy.views.inc:684 +msgid "No vocabulary" +msgstr "Neniu vortprovizo" + +#: modules/taxonomy.views.inc:726 +msgid "Select which vocabulary to show terms for in the regular options." +msgstr "Elekti kiun vortprovizon por montri terminojn en la regulaj opcioj." + +#: modules/taxonomy.views.inc:736 +msgid "Selection type" +msgstr "Elekta speco" + +#: modules/taxonomy.views.inc:737 +msgid "Dropdown" +msgstr "Falmenuo" + +#: modules/taxonomy.views.inc:737 +msgid "Autocomplete" +msgstr "Aŭtokompletigi" + +#: modules/taxonomy.views.inc:743 +msgid "Show hierarchy in dropdown" +msgstr "Montri hierarkion en falmenuo" + +#: modules/taxonomy.views.inc:760 +msgid "An invalid vocabulary is selected. Please change it in the options." +msgstr "Nevalida vortprovizo estis elektita. Bonvolu ŝanĝi ĝin en la opcioj." + +#: modules/taxonomy.views.inc:778 +msgid "Select terms from vocabulary @voc" +msgstr "Elekti terminojn el vortprovizo @voc" + +#: modules/taxonomy.views.inc:983 +msgid "Taxonomy term" +msgstr "Taksonomia termino" + +#: modules/taxonomy.views.inc:1008 +msgid "If you wish to validate for specific vocabularies, check them; if none are checked, all nodes will pass." +msgstr "Se vi deziras validigi speciajn vortprovizojn, kontrolu ilin; se neniu estas ŝaltita, ĉiuj nodoj sukcesos." + +#: modules/taxonomy.views.inc:1018 +msgid "Term IDs separated by , or +" +msgstr "Terminaj ID-oj disigita per , aŭ +" + +#: modules/taxonomy.views.inc:1019 +msgid "Term name or synonym" +msgstr "Termina nomo aŭ sinonimo" + +#: modules/taxonomy.views.inc:1020 +msgid "Term name/synonym converted to Term ID" +msgstr "Termina nomo/sinonimo konvertita al Termina ID" + +#: modules/taxonomy.views.inc:1023 +msgid "Select the form of this argument; if using term name, it is generally more efficient to convert it to a term ID and use Taxonomy: Term ID rather than Taxonomy: Term Name\" as an argument." +msgstr "Elekti la formon de ĉi tiu argumento; se uzante la terminan nomon, estas ĝenerale pli efika konverti ĝin al termina ID kaj uzi Taksonomion; Termina ID anstataŭ ol Taksonomio; Termina Nomo\" kiel argumento." + +#: modules/taxonomy.views.inc:910 +msgid "Unable to find term: @terms" +msgid_plural "Unable to find terms: @terms" +msgstr[0] "Ne eblas trovi terminon: @terms" +msgstr[1] "Ne eblas trovi terminojn: @terms" + +#: modules/upload.views.inc:25 +msgid "Upload" +msgstr "Alŝuti" + +#: modules/upload.views.inc:44 +msgid "The node the uploaded file is attached to" +msgstr "La nodo al kiu la alŝutita dosiero estas alkroĉita" + +#: modules/upload.views.inc:46 +msgid "upload" +msgstr "alŝuti" + +#: modules/upload.views.inc:57 +msgid "The description of the uploaded file." +msgstr "La priskribo de la alŝutita dosiero" + +#: modules/upload.views.inc:74 +msgid "Listed" +msgstr "Listita" + +#: modules/upload.views.inc:75 +msgid "Whether or not the file is marked to be listed." +msgstr "Ĉu aŭ ne la dosiero estas markita kiel listita." + +#: modules/upload.views.inc:91 +msgid "The weight, used for sorting." +msgstr "La pezo, uzita por ordigi." + +#: modules/upload.views.inc:110 +msgid "Attached files" +msgstr "Alkroĉitaj dosieroj" + +#: modules/upload.views.inc:111 +msgid "All files attached to a node with upload.module." +msgstr "Ĉiuj dosieroj alkroĉitaj al nodo kun alŝuta modulo." + +#: modules/upload.views.inc:118 +msgid "Has attached files" +msgstr "Havas alkroĉitajn dosierojn" + +#: modules/upload.views.inc:119 +msgid "Only display items with attached files. This can cause duplicates if there are multiple attached files." +msgstr "Nur montri erojn kun alkroĉitaj dosieroj. Tio povas kaŭzi kopiojn se estas multaj alkroĉitaj dosieroj." + +#: modules/upload.views.inc:123 +msgid "Add a relationship to gain access to more file data for files uploaded by upload.module. Note that this relationship will cause duplicate nodes if there are multiple files attached to the node." +msgstr "Aldoni rilaton por ekaliron pli da dosieraj datumoj por dosieroj alŝutitaj de upload.module. Rimarku ke ĉi tiu rilato kaŭzos kopiitajn nodojn se estas multaj dosieroj alkroĉitaj al la nodo." + +#: modules/upload.views.inc:129 +msgid "Files" +msgstr "Dosieroj" + +#: modules/upload.views.inc:158 +msgid "Only show \"listed\" file attachments" +msgstr "Nur montri \"listitaj\" dosier-alkroĉaĵoj" + +#: modules/user.views.inc:28 +msgid "Users who have created accounts on your site." +msgstr "Uzantoj kiuj kreis konton en via retejo." + +#: modules/user.views.inc:48 +msgid "Uid" +msgstr "Uid" + +#: modules/user.views.inc:49 +msgid "The user ID" +msgstr "La ID de uzanto" + +#: modules/user.views.inc:70 +msgid "Current" +msgstr "Aktuala" + +#: modules/user.views.inc:71 +msgid "Filter the view to the currently logged in user." +msgstr "Filtri la montron al la nune ensalutinta uzanto." + +#: modules/user.views.inc:80 +msgid "The user or author name." +msgstr "La uzanto aŭ aŭtora nomo." + +#: modules/user.views.inc:96 +msgid "E-mail" +msgstr "Retpoŝto" + +#: modules/user.views.inc:97 +msgid "Email address for a given user. Only accessible to users with administer users permission" +msgstr "Retpoŝtadreso por uzanto. Nur alirebla al uzantoj kun permeso de administri uzantoj" + +#: modules/user.views.inc:114 +msgid "Picture" +msgstr "Bildo" + +#: modules/user.views.inc:115 +msgid "The user's picture, if allowed." +msgstr "La bildo de uzanto, se permesata." + +#: modules/user.views.inc:126 +msgid "The date the user was created." +msgstr "La dato kiam la uzanto estis kreita." + +#: modules/user.views.inc:141 +msgid "Last access" +msgstr "Lasta aliro" + +#: modules/user.views.inc:142 +msgid "The user's last access date." +msgstr "Lasta alira dato de la uzanto." + +#: modules/user.views.inc:157 +msgid "Last login" +msgstr "Lasta ensaluto" + +#: modules/user.views.inc:158 +msgid "The user's last login date." +msgstr "Lasta ensaluta dato de la uzanto." + +#: modules/user.views.inc:174 +msgid "Whether a user is active or blocked." +msgstr "Ĉu uzanto estas aktiva aŭ blokita." + +#: modules/user.views.inc:191 +msgid "Signature" +msgstr "Subskribo" + +#: modules/user.views.inc:192 +msgid "The user's signature." +msgstr "Subskribo de la uzanto." + +#: modules/user.views.inc:205 +msgid "Provide a simple link to edit the user." +msgstr "Provizi simplan ligilon por redakti la uzanton." + +#: modules/user.views.inc:213 +msgid "Provide a simple link to delete the user." +msgstr "Provizi simplan ligilon por forigi la uzanton." + +#: modules/user.views.inc:242 +msgid "Roles" +msgstr "Roloj" + +#: modules/user.views.inc:243 +msgid "Roles that a user belongs to." +msgstr "Roloj kiuj apertenas al uzanto." + +#: modules/user.views.inc:255 +msgid "No role" +msgstr "Neniu rolo" + +#: modules/user.views.inc:306 +msgid "User ID from URL" +msgstr "ID de uzanto de URL" + +#: modules/user.views.inc:322 +msgid "Also look for a node and use the node author" +msgstr "Ankaŭ serĉu por nodo kaj uzu la nodan aŭtoron" + +#: modules/user.views.inc:396 +msgid "Link this field to its user" +msgstr "Ligi ĉi tiun kampon al ĝia uzanto" + +#: modules/user.views.inc:519 +msgid "Link this field" +msgstr "Ligi ĉi tiun kampon" + +#: modules/user.views.inc:522 +msgid "No link" +msgstr "Neniu ligilo" + +#: modules/user.views.inc:523 +msgid "To the user" +msgstr "Al la uzanto" + +#: modules/user.views.inc:524 +msgid "With a mailto:" +msgstr "Kun mailto:" + +#: modules/user.views.inc:634 +msgid "Usernames" +msgstr "Uzantnomoj" + +#: modules/user.views.inc:635 +msgid "Enter a comma separated list of user names." +msgstr "Enmetu koman disigitan liston de uzantnomoj." + +#: modules/user.views.inc:754 +msgid "Is the logged in user" +msgstr "Estas la ensalutinta uzanto" + +#: modules/user.views.inc:714 +msgid "Unable to find user: @users" +msgid_plural "Unable to find users: @users" +msgstr[0] "Ne eblas trovi uzanton: @users" +msgstr[1] "Ne eblas trovi uzantojn: @users" + +#: modules/views.views.inc:18 +msgid "Global" +msgstr "Globala" + +#: modules/views.views.inc:23 +msgid "Random" +msgstr "Hazarda" + +#: modules/views.views.inc:24 +msgid "Randomize the display order." +msgstr "Hazardigu la montran sinsekvon." + +#: modules/views.views.inc:31 +msgid "Null" +msgstr "Nulo" + +#: modules/views.views.inc:32 +msgid "Allow an argument to be ignored. The query will not be altered by this argument." +msgstr "Ebligas ke argumento estu ignorata. La informpeto ne ŝanĝiĝos pro ĉi tiu argumento." + +#: modules/views.views.inc:84 +msgid "Fail basic validation if any argument is given" +msgstr "Malsukcesigu bazan validigon se argumento estas donita." + +#: modules/views.views.inc:86 +msgid "By checking this field, you can use this to make sure views with more arguments than necessary fail validation." +msgstr "Ŝaltante ĉi tiun kampon, vi povas uzi ĝin por certigi ke montroj kun pliaj argumentoj ol necese malsukcesas validigon." + +#: theme/views-more.tpl.php:15 +msgid "more" +msgstr "pli" + +#: theme/views-ui-edit-item.tpl.php:18 +msgid "None defined" +msgstr "Neniuj difinitaj" + +#: theme/views-ui-edit-tab.tpl.php:31 +msgid "View settings" +msgstr "Montraj agordoj" + +#: theme/views-ui-edit-view.tpl.php:11 +msgid "This view is being edited by user !user, and is therefore locked from editing by others. This lock is !age old. Click here to !break." +msgstr "Ĉi tiu montro estas redaktata de uzanto !uzanto kaj tiel ŝlosita de redaktado de aliaj. Tiu ŝloso estas !age malnova. Alklaku ĉi tie por !break." + +#: theme/views-ui-edit-view.tpl.php:16 +msgid "New view" +msgstr "Nova montro" + +#: theme/views-ui-edit-view.tpl.php:18 +msgid "Changed view" +msgstr "Ŝanĝita montro" + +#: theme/views-ui-edit-view.tpl.php:23 +msgid "View %name, displaying items of type @base." +msgstr "Montro %name, montrante erojn de speco @base." + +#: theme/views-ui-edit-view.tpl.php:42 +msgid "Live preview" +msgstr "Viva antaŭvido" + +#: theme/views-ui-list-views.tpl.php:17 +msgid "@type @base view: @view" +msgstr "@type @base montro: @view" + +#: theme/views-ui-list-views.tpl.php:27 +msgid "Title: @title" +msgstr "Titolo: @title" + +#: theme/views-ui-list-views.tpl.php:30 +msgid "Path: !path" +msgstr "Vojo: !path" + +#: theme/theme.inc:90 +msgid "Edit this view" +msgstr "Redakti ĉi tiun montron" + +#: theme/theme.inc:290 +msgid "sort by @s" +msgstr "ordigi laŭ @s" + +#: theme/theme.inc:500 +msgid "‹‹" +msgstr "‹‹" + +#: theme/theme.inc:501 +msgid "››" +msgstr "››" + +#: theme/theme.inc:511 +msgid "@current of @max" +msgstr "@current de @max" + +#: views_export/views_export.module:76 +msgid "There are no views to be exported at this time." +msgstr "Estas neniuj montroj por eksporti momente." + +#: views_export/views_export.module:108 +msgid "Show only these tags" +msgstr "Montri nur ĉi tiujn etikedojn" + +#: views_export/views_export.module:122 +msgid "Module name" +msgstr "Modula nomo" + +#: views_export/views_export.module:123 +msgid "Enter the module name to export code to." +msgstr "Enmeti la modulan nomon al kiu vi volas eksporti kodon." + +#: views_export/views_export.module:190 +msgid "Put this in @module.views_default.inc in your modules/@module directory or modules/@module/includes directory" +msgstr "Meti ĉi tion en @module.views_default.inc en via dosierujo de modules/@module aŭ modules/@module/includes." + +#: views_export/views_export.module:44 +msgid "use views exporter" +msgstr "uzi montro-eksportilon" + +#: views_export/views_export.module:17 +msgid "Bulk export" +msgstr "Amas-eksporti" + +#: views_export/views_export.module:0 +msgid "views_export" +msgstr "views_export" + +#: views_export/views_export.info:0 +msgid "Views exporter" +msgstr "Montro-eksportilo" + +#: views_export/views_export.info:0 +msgid "Allows exporting multiple views at once." +msgstr "Ebligas eksportadon de multaj montroj samtempe." diff --git a/translations/fr.po b/translations/fr.po new file mode 100644 index 0000000000000000000000000000000000000000..3204fc6ff7273f019134ab05bba6cc814dd09179 --- /dev/null +++ b/translations/fr.po @@ -0,0 +1,3951 @@ +# translation of SB-views-6.x-2.x-dev.po to +# translation of views-6.x-2.x-dev.po to +msgid "" +msgstr "" +"Project-Id-Version: SB-views-6.x-2.x-dev\n" +"POT-Creation-Date: 2008-07-01 05:39+0200\n" +"PO-Revision-Date: 2008-07-07 02:33+0200\n" +"Last-Translator: sandrine\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: France\n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Generator: KBabel 1.11.4\n" + +#: views.module:625 +msgid "Skipping broken view @view" +msgstr "Vue brisée @view sautée" + +#: views.module:672;712 +#: includes/admin.inc:92;253;253;599 +msgid "Overridden" +msgstr "Supplantée" + +#: views.module:675;708 +#: views_ui.module:284 +#: includes/admin.inc:91;252;252;566;738 +msgid "Default" +msgstr "Par défaut" + +#: views.module:824 +#: includes/admin.inc:286 +#: views_export/views_export.module:116 +msgid "Apply" +msgstr "Appliquer" + +#: views.module:109 +#: views_ui.module:23 +#: views.info:0;0 +#: views_ui.info:0 +#: views_export/views_export.info:0 +msgid "Views" +msgstr "Views" + +#: views.module:114 +msgid "Ajax callback for view loading." +msgstr "Procédure de rappel Ajax pour le chargement de la vue." + +#: views.module:0 +msgid "views" +msgstr "vues" + +#: views_ui.module:158 +msgid "The converter will make a best-effort attempt to convert a Views 1 view to Views 2. This conversion is not reliable; you will very likely have to make adjustments to your view to get it to match. You can import Views 1 views through the normal Import tab." +msgstr "Le convertisseur tente au mieux de convertir une vue Views 1 vers Views 2. Cette conversion n'est pas fiable et vous devrez très probablement ajuster votre vue pour la faire correspondre exactement. Vous pouvez importer les vues Views 1 par le biais de l'onglet habituel Importer." + +#: views_ui.module:25 +msgid "Views are customized lists of content on your system; they are highly configurable and give you control over how lists of content are presented." +msgstr "Les vues sont des listes personnalisées de contenus présents sur votre système. Elles sont hautement configurables et vous donnent le contrôle sur la présentation des listes de contenus." + +#: views_ui.module:29 +#: includes/plugins.inc:88;116 +msgid "List" +msgstr "Liste" + +#: views_ui.module:35 +#: includes/admin.inc:1081;1081;2093 +msgid "Add" +msgstr "Ajouter" + +#: views_ui.module:40 +#: includes/admin.inc:702 +msgid "Import" +msgstr "Importer" + +#: views_ui.module:46 +msgid "Tools" +msgstr "Outils" + +#: views_ui.module:52 +msgid "Basic" +msgstr "Basique" + +#: views_ui.module:60 +#: includes/convert.inc:30 +msgid "Convert" +msgstr "Convertir" + +#: views_ui.module:61 +msgid "Convert stored Views 1 views." +msgstr "Convertir les vues Views 1 enregistrées." + +#: views_ui.module:67;80;85 +msgid "Delete view" +msgstr "Supprimer la vue" + +#: views_ui.module:73 +msgid "Convert view" +msgstr "Convertir la vue" + +#: views_ui.module:110 +#: includes/admin.inc:87 +#: theme/theme.inc:89 +msgid "Edit" +msgstr "Éditer" + +#: views_ui.module:0 +msgid "views_ui" +msgstr "views_ui" + +#: views.install:31 +msgid "Stores the general data for a view." +msgstr "Enregistre les données générales d'une vue." + +#: views.install:37 +msgid "The view ID of the field, defined by the database." +msgstr "Identifiant de vue du champ, défini par la base de données." + +#: views.install:45 +msgid "The unique name of the view. This is the primary field views are loaded from, and is used so that views may be internal and not necessarily in the database. May only be alphanumeric characters plus underscores." +msgstr "Nom unique de la vue. Il s'agit du champ primaire à partir duquel les vues sont chargées et il est utilisé de manière à ce que les vues puissent être internes et non nécessairement dans la base de données. Ne peut contenir que des caractères alphanumériques et des espaces soulignés." + +#: views.install:51 +msgid "A description of the view for the admin interface." +msgstr "Description de la vue pour l'interface d'administration." + +#: views.install:57 +msgid "A tag used to group/sort views in the admin interface" +msgstr "Étiquette utilisée pour grouper/trier les vues dans l'interface d'administration" + +#: views.install:61 +msgid "A chunk of PHP code that can be used to provide modifications to the view prior to building." +msgstr "Extrait de code PHP pouvant être utilisé pour modifier la vue avant sa construction." + +#: views.install:68 +msgid "What table this view is based on, such as node, user, comment, or term." +msgstr "Table sur laquelle est basée la vue, par exemple nœud, utilisateur, commentaire ou terme." + +#: views.install:74 +msgid "A boolean to indicate whether or not this view may have its query cached." +msgstr "Valeur booléenne indiquant si la requête de la vue peut être mise en cache ou non." + +#: views.install:82 +msgid "Stores information about each display attached to a view." +msgstr "Enregistre des informations sur chaque affichage attaché à la vue." + +#: views.install:89 +msgid "The view this display is attached to." +msgstr "La vue à laquelle est attaché cet affichage." + +#: views.install:97 +msgid "An identifier for this display; usually generated from the display_plugin, so should be something like page or page_1 or block_2, etc." +msgstr "Un identifiant pour cet affichage ; habituellement généré par le display_plugin, il devrait donc ressembler à page, page_1, block_2, etc." + +#: views.install:104 +msgid "The title of the display, viewable by the administrator." +msgstr "Le titre de l'affichage, visible par l'administrateur." + +#: views.install:111 +msgid "The type of the display. Usually page, block or embed, but is pluggable so may be other things." +msgstr "Le type d'affichage. Généralement, page, bloc ou embed, mais il peut être greffé et donc prendre d'autres valeurs." + +#: views.install:116 +msgid "The order in which this display is loaded." +msgstr "L'ordre de chargement de cet affichage." + +#: views.install:120 +msgid "A serialized array of options for this display; it contains options that are generally only pertinent to that display plugin type." +msgstr "Tableau sérialisé d'options pour cet affichage ; il contient des options qui ne sont généralement pertinentes que pour le type de plugin de cet affichage." + +#: views.install:131 +msgid "A special cache used to store objects that are being edited; it serves to save state in an ordinarily stateless environment." +msgstr "Cache spécial utilisé pour enregistrer les objets en cours d'édition ; il sert à enregistrer l'état dans un environnement normalement sans état." + +#: views.install:136 +msgid "The session ID this cache object belongs to." +msgstr "L'identifiant de session auquel cet objet de cache appartient." + +#: views.install:141 +msgid "The name of the view this cache is attached to." +msgstr "Le nom de la vue à laquelle ce cache est rattaché." + +#: views.install:146 +msgid "The name of the object this cache is attached to; this essentially represents the owner so that several sub-systems can use this cache." +msgstr "Le nom de l'objet auquel ce cache est rattaché ; il représente essentiellement le propritéaire, de sorte que plusieurs sous-systèmes peuvent utiliser ce cache." + +#: views.install:153 +msgid "The time this cache was created or updated." +msgstr "Date de création ou de mise à jour de ce cache." + +#: views.install:157 +msgid "Serialized data being stored." +msgstr "Données sérialisées en cours d'enregistrement." + +#: views.info:0 +msgid "Create customized lists and queries from your database." +msgstr "Créez des listes et requêtes personnalisées à partir de votre base de données." + +#: views_ui.info:0 +msgid "Views UI" +msgstr "Views UI" + +#: views_ui.info:0 +msgid "Administrative interface to views. Without this module, you cannot create or edit your views." +msgstr "Interface d'administration des vues. Sans ce module, vous ne pouvez pas créer ou éditer de vue." + +#: docs/docs.php:106 +msgid "Emulates the default Drupal front page; you may set the default home page path to this view to make it your front page." +msgstr "Émule la page d'accueil par défaut de Drupal ; vous pouvez faire pointer le chemin de votre page d'accueil par défaut vers cette vue pour en faire votre page d'accueil." + +#: docs/docs.php:107 +msgid "default" +msgstr "par défaut" + +#: docs/docs.php:116 +#: includes/plugins.inc:18 +msgid "Defaults" +msgstr "Paramètres par défaut" + +#: docs/docs.php:205 +#: includes/plugins.inc:32;40 +msgid "Page" +msgstr "Page" + +#: docs/docs.php:260 +#: includes/plugins.inc:65;72 +msgid "Feed" +msgstr "Flux" + +#: docs/docs.php:328 +msgid "Front page feed" +msgstr "Flux de la page d'accueil" + +#: includes/admin.inc:34 +msgid "If you install the advanced help module from !href, Views will provide more and better help. Hide this message." +msgstr "Si vous installez le module d'aide avancé de !href, Views vous proposera une aide plus conséquente et plus détaillée. Cacher ce message." + +#: includes/admin.inc:88;900 +#: theme/theme.inc:96 +#: views_export/views_export.module:128 +msgid "Export" +msgstr "Exporter" + +#: includes/admin.inc:89;905 +#: theme/theme.inc:101 +msgid "Clone" +msgstr "Dupliquer" + +#: includes/admin.inc:92 +msgid "Revert" +msgstr "Revenir" + +#: includes/admin.inc:92;612;774 +#: includes/convert.inc:35;109 +msgid "Delete" +msgstr "Supprimer" + +#: includes/admin.inc:97 +msgid "Disable" +msgstr "Désactiver" + +#: includes/admin.inc:100 +msgid "Enable" +msgstr "Activer" + +#: includes/admin.inc:106 +msgid "Warning! Broken view!" +msgstr "Attention ! Vue brisée !" + +#: includes/admin.inc:121 +msgid "Broken" +msgstr "Brisé" + +#: includes/admin.inc:180 +msgid "Install the advanced help module for the getting started" +msgstr "Installez le module d'aide avancée pour démarrer" + +#: includes/admin.inc:183 +msgid "Not sure what to do? Try the \"!getting-started\" page." +msgstr "Vous n'êtes pas sûr de ce que vous devez faire ? Essayez de commencer par la page \"!getting-started\"." + +#: includes/admin.inc:197;250;2059 +msgid "" +msgstr "" + +#: includes/admin.inc:198 +#: includes/plugins.inc:2820 +msgid "" +msgstr "" + +#: includes/admin.inc:213;264;985 +#: views_export/views_export.module:146 +msgid "Tag" +msgstr "Étiquette" + +#: includes/admin.inc:229 +msgid "Displays" +msgstr "Affichage" + +#: includes/admin.inc:241;266 +#: includes/plugins.inc:1102;2079 +#: modules/node.views.inc:139 +msgid "Type" +msgstr "Type" + +#: includes/admin.inc:248 +msgid "Storage" +msgstr "Enregistrement" + +#: includes/admin.inc:251;251 +#: includes/view.inc:993;1043 +msgid "Normal" +msgstr "Normal" + +#: includes/admin.inc:260 +msgid "Sort by" +msgstr "Trier par" + +#: includes/admin.inc:262 +#: includes/plugins.inc:805 +#: modules/system.views.inc:69 +#: modules/user.views.inc:59;79 +msgid "Name" +msgstr "Nom" + +#: includes/admin.inc:263;361 +#: includes/argument.handlers.inc:111 +#: includes/plugins.inc:817;2091;2136 +#: modules/comment.views.inc:44 +#: modules/node.views.inc:84;402 +msgid "Title" +msgstr "Titre" + +#: includes/admin.inc:265;369 +#: includes/plugins.inc:2008 +#: modules/statistics.views.inc:146 +#: modules/system.views.inc:88 +msgid "Path" +msgstr "Chemin" + +#: includes/admin.inc:267 +#: includes/convert.inc:21 +#: modules/upload.views.inc:48 +#: views_export/views_export.module:146 +msgid "Description" +msgstr "Description" + +#: includes/admin.inc:274 +msgid "Order" +msgstr "Ordre" + +#: includes/admin.inc:276 +msgid "Up" +msgstr "Haut" + +#: includes/admin.inc:277 +msgid "Down" +msgstr "Bas" + +#: includes/admin.inc:360;379 +msgid "Query" +msgstr "Requête" + +#: includes/admin.inc:366 +msgid "This display has no path." +msgstr "Cet affichage n'a pas de chemin" + +#: includes/admin.inc:371 +msgid "Query build time" +msgstr "Durée de construction de la requête" + +#: includes/admin.inc:371;372;373 +msgid "@time ms" +msgstr "@time ms" + +#: includes/admin.inc:372 +msgid "Query execute time" +msgstr "Durée d'exécution de la requête" + +#: includes/admin.inc:373 +msgid "View render time" +msgstr "Durée de rendu de la vue" + +#: includes/admin.inc:379 +msgid "No query was run" +msgstr "Aucune requête n'a été exécutée" + +#: includes/admin.inc:386 +msgid "Unable to preview due to validation errors." +msgstr "Impossible de prévisualiser à cause d'erreurs de validation." + +#: includes/admin.inc:437 +msgid "Display" +msgstr "Affichage" + +#: includes/admin.inc:445 +#: includes/view.inc:1670 +msgid "Arguments" +msgstr "Arguments" + +#: includes/admin.inc:447 +msgid "Separate arguments with a / as though they were a URL path." +msgstr "Séparez les arguments par un / comme s'il s'agissait d'URL." + +#: includes/admin.inc:453 +msgid "Preview" +msgstr "Aperçu" + +#: includes/admin.inc:491 +msgid "Clone view @view" +msgstr "Dupliquer la vue @view" + +#: includes/admin.inc:504;691 +#: includes/convert.inc:20 +msgid "View name" +msgstr "Nom de la vue" + +#: includes/admin.inc:505 +msgid "This is the unique name of the view. It must contain only alphanumeric characters and underscores; it is used to identify the view internally and to generate unique theming template names for this view. If overriding a module provided view, the name must not be changed or instead a new view will be created." +msgstr "Il s'agit du nom unique de la vue. Il ne doit comporter que des caractères alphanumériques et des espaces soulignés. Il sert à identifier la vue en interne et à générer des noms uniques pour les templates de thèmes pour cette vue. Si la vue supplante une vue fournie par un module, le nom ne doit pas être modifié sous peine de créer une nouvelle vue." + +#: includes/admin.inc:513;1769 +msgid "View description" +msgstr "Description de la vue" + +#: includes/admin.inc:514;1770 +msgid "This description will appear on the Views administrative UI to tell you what the view is about." +msgstr "Cette description apparaîtra dans l'interface utilisateur d'administration de Views pour vous indiquer l'objet de cette vue." + +#: includes/admin.inc:520;1776 +msgid "View tag" +msgstr "Étiquette de la vue" + +#: includes/admin.inc:521;1777 +msgid "Enter an optional tag for this view; it is used only to help sort views on the administrative page." +msgstr "Saisissez une étiquette optionnelle pour cette vue ; elle sert uniquement à faciliter le tri des vues sur la page d'administration." + +#: includes/admin.inc:533 +msgid "View type" +msgstr "Type de vue" + +#: includes/admin.inc:534 +msgid "The view type is the primary table for which information is being retrieved. The view type controls what arguments, fields, sort criteria and filters are available, so once this is set it cannot be changed." +msgstr "Le type de vue est la table primaire pour laquelle les informations sont récupérées. Le type de vue contrôle quels arguments, champs, critères de tri et filtres sont disponibles ; par conséquent, une fois qu'il est fixé, il ne peut plus être modifié." + +#: includes/admin.inc:545 +msgid "Next" +msgstr "Suivant" + +#: includes/admin.inc:561 +msgid "View name must be alphanumeric or underscores only." +msgstr "Le nom de la vue n peut contenir que des caractères alphanumériques et des espaces soulignés." + +#: includes/admin.inc:567 +msgid "You must use a unique name for this view." +msgstr "Vous devez utiliser un nom unique pour cette vue." + +#: includes/admin.inc:600 +msgid "Are you sure you want to revert the view %name?" +msgstr "Êtes-vous sûr(e) de vouloir revenir en arrière pour la vue %name ?" + +#: includes/admin.inc:601 +msgid "Reverting the view will delete the view that is in the database, reverting it to the original default view. Any changes you have made will be lost and cannot be recovered." +msgstr "Revenir en arrière pour une vue supprime la vue enregistrée dans la base de données pour revenir à la vue par défaut d'origine. Toutes les modifications que vous aviez apportées seront perdues et ne pourront être récupérées." + +#: includes/admin.inc:604 +#: includes/convert.inc:105 +msgid "Are you sure you want to delete the view %name?" +msgstr "Êtes-vous sûr(e) de vouloir supprimer la vue %name ?" + +#: includes/admin.inc:605 +msgid "Deleting a view cannot be undone." +msgstr "Supprimer une vue est irréversible." + +#: includes/admin.inc:613;649;767;1225 +#: includes/convert.inc:110 +msgid "Cancel" +msgstr "Annuler" + +#: includes/admin.inc:622 +msgid "The view has been deleted." +msgstr "La vue a été supprimée." + +#: includes/admin.inc:634 +msgid "There is no lock on view %view to break." +msgstr "Il n'y a aucun verrou à faire sauter sur la vue %view." + +#: includes/admin.inc:644 +msgid "Are you sure you want to break the lock on view %name?" +msgstr "Êtes-vous sûr(e) de vouloir faire sauter le verrou sur la vue %name ?" + +#: includes/admin.inc:647 +msgid "By breaking this lock, any unsaved changes made by !user will be lost!" +msgstr "En faisant sauter ce verrou, toutes les modifications réalisées par !user et non encore enregistrées seront perdues !" + +#: includes/admin.inc:648 +msgid "Break lock" +msgstr "Faire sauter le verrou" + +#: includes/admin.inc:665 +msgid "Edit view \"%view\"" +msgstr "Éditer la vue \"%view\"" + +#: includes/admin.inc:692 +msgid "Enter the name to use for this view if it is different from the source view. Leave blank to use the name of the view." +msgstr "Saisissez le nom à utiliser pour cette vue s'il diffère de la vue source. Laissez la valeur à blanc pour utiliser le nom de la vue." + +#: includes/admin.inc:697 +msgid "Paste view code here" +msgstr "Copiez le code de la vue ici" + +#: includes/admin.inc:719 +msgid "Unable to interpret view code." +msgstr "Impossible d'interpréter le code de la vue." + +#: includes/admin.inc:726 +msgid "You are importing a view created in Views version 1. You may need to adjust some parameters to work correctly in version 2." +msgstr "Vous importez une vue créée dans Views version 1. Vous pourrez être amené à ajuster certains paramètres pour que la vue fonctionne correctement dans Views version 2." + +#: includes/admin.inc:729 +msgid "That view is not compatible with this version of Views." +msgstr "Cette vue n'est pas compatible avec cette version de Views." + +#: includes/admin.inc:739 +msgid "A view by that name already exists; please choose a different name" +msgstr "Une vue portant ce nom existe déjà ; merci de choisir un nom différent." + +#: includes/admin.inc:760;788 +msgid "Save" +msgstr "Enregistrer" + +#: includes/admin.inc:812 +msgid "The view has been saved." +msgstr "La vue a été enregistrée." + +#: includes/admin.inc:851 +msgid "Unknown or missing table name" +msgstr "Nom de table inconnu ou manquant" + +#: includes/admin.inc:856 +msgid "Click on an item to edit that item's details." +msgstr "Cliquez sur un élément pour modifier ses détails." + +#: includes/admin.inc:859 +msgid "This view has a broken default display and cannot be used." +msgstr "Cette vue possède un affichage par défaut défectueux et ne peut donc être utilisée." + +#: includes/admin.inc:895 +msgid "break this lock" +msgstr "faire sauter ce verrou" + +#: includes/admin.inc:901 +#: theme/theme.inc:97 +msgid "Export this view" +msgstr "Exporter cette vue" + +#: includes/admin.inc:906 +#: theme/theme.inc:102 +msgid "Create a copy of this view" +msgstr "Créer une copie de cette vue" + +#: includes/admin.inc:917 +msgid "View \"!display\"" +msgstr "Voir \"!display\"" + +#: includes/admin.inc:918 +msgid "Go to the real page for this display" +msgstr "Aller à la vraie page de cet affichage" + +#: includes/admin.inc:984 +#: includes/plugins.inc:812;943;955;1999;2293;2467;2659;3299 +msgid "None" +msgstr "Aucun" + +#: includes/admin.inc:1058 +msgid "Invalid" +msgstr "Invalide" + +#: includes/admin.inc:1058 +msgid "Error: Display @display refers to a plugin named '@plugin', but that plugin doesn't exist!" +msgstr "Erreur : l'affichage @display se réfère à un plugin nommé '@plugin', mais ce plugin n'existe pas !" + +#: includes/admin.inc:1079;1079 +msgid "Rearrange" +msgstr "Réordonner" + +#: includes/admin.inc:1112;2144;2323;2391;2476 +msgid "Error: handler for @table > @field doesn't exist!" +msgstr "Erreur : le gestionnaire pour @table > @field n'existe pas !" + +#: includes/admin.inc:1131;1131;1140 +msgid "Settings" +msgstr "Paramètres" + +#: includes/admin.inc:1136 +#: includes/plugins.inc:823;841 +msgid "Missing style plugin" +msgstr "Plugin de style manquant" + +#: includes/admin.inc:1140 +#: includes/plugins.inc:836;851 +msgid "Change settings for this style" +msgstr "Modifier les paramètres pour ce style" + +#: includes/admin.inc:1143 +msgid "   Style: !style" +msgstr "   Style : !style" + +#: includes/admin.inc:1174 +msgid "Invalid display id while regenerating tabs" +msgstr "Identifiant d'affichage invalide à la regénération des onglets" + +#: includes/admin.inc:1207 +msgid "Update" +msgstr "Mise à jour" + +#: includes/admin.inc:1225 +msgid "Ok" +msgstr "Ok" + +#: includes/admin.inc:1494 +msgid "Unable to initialize default display" +msgstr "Impossible d'initialiser l'affichage par défaut" + +#: includes/admin.inc:1526 +msgid "Add display" +msgstr "Nouvel affichage" + +#: includes/admin.inc:1566 +msgid "Remove display" +msgstr "Supprimer un affichage" + +#: includes/admin.inc:1577 +msgid "Restore display" +msgstr "Restaurer un affichage" + +#: includes/admin.inc:1649 +msgid "Analyze" +msgstr "Analyser" + +#: includes/admin.inc:1669 +msgid "This view has only a default display and therefore will not be placed anywhere on your site; perhaps you want to add a page or a block display." +msgstr "Cette vue ne possède qu'un affichage par défaut et, par conséquent, n'apparaîtra nulle part sur votre site ; peut-être devrez-vous ajouter un affichage de page ou de bloc." + +#: includes/admin.inc:1681 +msgid "View analysis" +msgstr "Analyse de la vue" + +#: includes/admin.inc:1690 +msgid "View analysis can find nothing to report." +msgstr "L'analyse de la vue n'a rien trouvé à signaler." + +#: includes/admin.inc:1764 +msgid "View details" +msgstr "Détails de la vue" + +#: includes/admin.inc:1805;1854;1904;2045;2137;2316;2384;2469 +msgid "Invalid display id @display" +msgstr "Identifiant d'affichage @display invalide" + +#: includes/admin.inc:1858 +msgid "Configure @type" +msgstr "Configurer @type" + +#: includes/admin.inc:1908 +msgid "Rearrange @type" +msgstr "Réarranger @type" + +#: includes/admin.inc:1951 +msgid "Broken field @id" +msgstr "Champ brisé @id" + +#: includes/admin.inc:1986;1995;2232;2341 +msgid "Remove" +msgstr "Supprimer" + +#: includes/admin.inc:1986;1986 +msgid "Remove this item" +msgstr "Supprimer cet élément" + +#: includes/admin.inc:1992 +msgid "No fields available." +msgstr "Aucun champ disponible." + +#: includes/admin.inc:1995 +#: includes/plugins.inc:2100 +#: modules/book.views.inc:57 +#: modules/taxonomy.views.inc:126 +#: modules/upload.views.inc:82 +msgid "Weight" +msgstr "Poids" + +#: includes/admin.inc:2051 +msgid "Add @type" +msgstr "Ajouter @type" + +#: includes/admin.inc:2062 +msgid "Groups" +msgstr "Groupes" + +#: includes/admin.inc:2081 +msgid "!group: !field" +msgstr "!group : !field" + +#: includes/admin.inc:2090 +msgid "There are no @types available to add." +msgstr "Il n'y a aucun @types disponible à ajouter." + +#: includes/admin.inc:2155 +#: includes/plugins.inc:1556 +msgid "Status: using default values." +msgstr "Statut : utilisation des valeurs par défaut." + +#: includes/admin.inc:2162 +#: includes/plugins.inc:1568 +msgid "Status: using overridden values." +msgstr "Statut : utilisation des valeurs supplantées." + +#: includes/admin.inc:2200 +msgid "Do not use a relationship" +msgstr "Ne pas utiliser de relation" + +#: includes/admin.inc:2209 +#: includes/view.inc:1694;1695 +msgid "Relationship" +msgstr "Relation" + +#: includes/admin.inc:2222 +msgid "Configure @type \"@item\"" +msgstr "Configurer @type \"@item\"" + +#: includes/admin.inc:2331 +msgid "Configure extra settings for @type \"@item\"" +msgstr "Configurer les paramètres supplémentaires pour @type \"@item\"" + +#: includes/admin.inc:2396 +msgid "Change summary style for @type \"@item\"" +msgstr "Changer le style de résumé pour @type \"@item\"" + +#: includes/admin.inc:2419;2433 +msgid "Internal error: broken plugin." +msgstr "Erreur interne : plugin défectueux." + +#: includes/admin.inc:2483 +msgid "Configure summary style for @type \"@item\"" +msgstr "Configurer le style de résumé pour @type \"@item\"" + +#: includes/admin.inc:2575 +msgid "Clear Views' cache" +msgstr "Vider le cache de Views" + +#: includes/admin.inc:2581 +msgid "Add Views signature to all SQL queries" +msgstr "Ajouter la signature Views à toutes les requêtes SQL" + +#: includes/admin.inc:2582 +msgid "All Views-generated queries will include a special 'VIEWS' = 'VIEWS' string in the WHERE clause. This makes identifying Views queries in database server logs simpler, but should only be used when troubleshooting." +msgstr "Toutes les requêtes générées par Views incluront une chaîne spéciale 'VIEWS' = 'VIEWS' dans la clause WHERE. Ceci facilite grandement l'identification des requêtes Views dans les fichier journaux du serveur de base de données, mais ne devrait être utilisé que pour le dépannage." + +#: includes/admin.inc:2588 +msgid "Disable views data caching" +msgstr "Désactiver la mise en cache des données Views" + +#: includes/admin.inc:2589 +msgid "Views caches data about tables, modules and views available, to increase performance. By checking this box, Views will skip this cache and always rebuild this data when needed. This can have a serious performance impact on your site." +msgstr "Views met en cache des données relatives aux tables, aux modules et aux vues disponibles afin d'améliorer les performances. En cochant cette case, vous obligez Views à sauter cette mise en cache et à reconstruire systématiquement la base de données dès que nécessaire. Cela peut avoir un impact important sur les performances de votre site." + +#: includes/admin.inc:2595 +msgid "Ignore missing advanced help module" +msgstr "Ignorer le module d'aide avancée manquant" + +#: includes/admin.inc:2596 +msgid "Views uses the advanced help module to provide help text; if this module is not present Views will complain, unless this setting is checked." +msgstr "Views utilise le module d'aide avancée pour proposer des textes d'aide ; si ce module est absent, Views le signalera sauf si ce paramètre est coché." + +#: includes/admin.inc:2602 +msgid "Show query above live preview" +msgstr "Afficher la requête au dessus de la prévisualisation en direct" + +#: includes/admin.inc:2603 +msgid "The live preview feature will show you the output of the view you're creating, as well as the view. Check here to show the query and other information above the view; leave this unchecked to show that information below the view." +msgstr "La prévisualisation en direct vous montrera le résultat de la vue que vous êtes en train de créer, ainsi que la vue. Cochez cette case pour voir apparaître la requête et les autres informations au dessus de la vue ; laissez la case non cochée pour conserver ces informations sous la vue." + +#: includes/admin.inc:2609 +msgid "Do not show hover links over views" +msgstr "Ne pas montrer les liens flottants sur les vues" + +#: includes/admin.inc:2610 +msgid "To make it easier to administrate your views, Views provides 'hover' links to take you to the edit and export screen of a view whenever the view is used. This can be distracting on some themes, though; if it is problematic, you can turn it off here." +msgstr "Pour faciliter l'administration de vos vues, Views propose des liens 'flottants' pour vous conduire aux écrans d'édition et d'export d'une vue, lorsque celle-ci est utilisée. Cela peut toutefois se révéler gênant sur certains thèmes ; si ces liens posent des problèmes, vous pouvez les désactiver ici." + +#: includes/admin.inc:2616 +msgid "Enable views performance statistics via the Devel module" +msgstr "Activer les statistiques de performances de Views via le module Devel" + +#: includes/admin.inc:2617 +msgid "Check this to enable some Views query and performance statistics if Devel is installed." +msgstr "Cochez cette case pour activer certaines statistiques sur les performances et requêtes de Views, à condition que Devel soit installé." + +#: includes/admin.inc:2623 +msgid "Disable javascript with Views" +msgstr "Désactiver le JavaScript avec Views" + +#: includes/admin.inc:2624 +msgid "If you are having problems with the javascript, you can disable it here; the Views UI should degrade and still be usable without javascript, it just not as good." +msgstr "Si vous rencontrez des problèmes avec JavaScript, vous pouvez le désactiver ici ; l'interface graphique de Views devrait s'adapter mais rester utilisable sans JavaScript, simplement sa qualité s'en ressentira." + +#: includes/admin.inc:2632 +msgid "Page region to output performance statistics" +msgstr "Région de la page où afficher les statistiques de performance" + +#: includes/admin.inc:2645 +msgid "The cache has been cleared." +msgstr "Le cache a été vidé." + +#: includes/admin.inc:2809 +msgid "Error: missing @component" +msgstr "Erreur : @component manquant" + +#: includes/ajax.inc:73 +msgid "Server reports invalid input error." +msgstr "Le serveur signale une erreur de saisie invalide." + +#: includes/ajax.inc:74 +msgid "Error" +msgstr "Erreur" + +#: includes/argument.handlers.inc:91 +msgid "All" +msgstr "Tous / Toutes" + +#: includes/argument.handlers.inc:113 +msgid "The title to use when this argument is present; it will override the title of the view and titles from previous arguments. You can use percent substitution here to replace with argument titles. Use \"%1\" for the first argument, \"%2\" for the second, etc." +msgstr "Titre à utiliser lorsque cet argument est présent ; il supplante le titre de la vue et les titres des arguments précédents. Vous pouvez utiliser le caractère pourcent pour réaliser des substitutions ici et remplacer par les titres des arguments. Utilisez \"%1\" pour le premier argument, \"%2\" pour le deuxième, etc." + +#: includes/argument.handlers.inc:126 +msgid "Action to take if argument is not present" +msgstr "Action à mener si l'argument est absent" + +# ~fuzzy +#: includes/argument.handlers.inc:138 +msgid "Wildcard" +msgstr "Joker" + +#: includes/argument.handlers.inc:141 +msgid "If this value is received as an argument, the argument will be ignored; i.e, \"all values\"" +msgstr "Si cette valeur est reçue comme argument, l'argument sera ignoré ; correspond à \"toutes les valeurs\"" + +#: includes/argument.handlers.inc:147 +msgid "Wildcard title" +msgstr "Titre joker" + +#: includes/argument.handlers.inc:150 +msgid "The title to use for the wildcard in substitutions elsewhere." +msgstr "Titre à utiliser pour le joker dans les substitutions réalisées ailleurs." + +#: includes/argument.handlers.inc:173 +msgid "Validator" +msgstr "Validateur" + +#: includes/argument.handlers.inc:177 +msgid "" +msgstr "" + +#: includes/argument.handlers.inc:213 +msgid "Action to take if argument does not validate" +msgstr "Actions à mener sur l'argument ne passe pas la validation" + +#: includes/argument.handlers.inc:228 +msgid "Display all values" +msgstr "Afficher toutes les valeurs" + +#: includes/argument.handlers.inc:233 +msgid "Hide view / Page not found (404)" +msgstr "Cacher la vue / Page non trouvée (404)" + +#: includes/argument.handlers.inc:237 +msgid "Display empty text" +msgstr "Afficher le texte vide" + +#: includes/argument.handlers.inc:242 +msgid "Summary, sorted ascending" +msgstr "Sommaire, classement ascendant" + +#: includes/argument.handlers.inc:249 +msgid "Summary, sorted descending" +msgstr "Sommaire, classement descendant" + +#: includes/argument.handlers.inc:256 +msgid "Provide default argument" +msgstr "Fournir l'argument par défaut" + +#: includes/argument.handlers.inc:287 +msgid "Default argument type" +msgstr "Type d'argument par défaut" + +#: includes/argument.handlers.inc:702 +msgid "Current date" +msgstr "Date actuelle" + +#: includes/argument.handlers.inc:757 +msgid "Glossary mode" +msgstr "Mode glossaire" + +#: includes/argument.handlers.inc:758 +msgid "Glossary mode applies a limit to the number of characters used in the argument, which allows the summary view to act as a glossary." +msgstr "Le mode glossaire applique une limite au nombre de caractères utilisés dans l'argument, ce qui permet à la vue sommaire de se comporter comme un glossaire." + +#: includes/argument.handlers.inc:764 +msgid "Character limit" +msgstr "Limite de caractères" + +#: includes/argument.handlers.inc:765 +msgid "How many characters of the argument to filter against. If set to 1, all fields starting with the letter in the argument would be matched." +msgstr "Nombre de caractères de l'argument à utiliser pour le filtrage. Si la valeur est fixée à 1, tous les champs commençant par la lettre saisie en argument correspondront." + +#: includes/argument.handlers.inc:773 +msgid "Case" +msgstr "Casse" + +#: includes/argument.handlers.inc:774 +msgid "When printing the argument result, how to transform the case." +msgstr "À l'affichage du résultat de l'argument, définit la transformation à appliquer à la casse." + +#: includes/argument.handlers.inc:776;790 +msgid "No transform" +msgstr "Aucune transformation" + +#: includes/argument.handlers.inc:777;791 +msgid "Upper case" +msgstr "Majuscules" + +#: includes/argument.handlers.inc:778;792 +msgid "Lower case" +msgstr "Minuscules" + +#: includes/argument.handlers.inc:779;793 +msgid "Capitalize first letter" +msgstr "Mettre la première lettre en majuscule" + +#: includes/argument.handlers.inc:780;794 +msgid "Capitalize each word" +msgstr "Mettre chaque mot en majuscules" + +#: includes/argument.handlers.inc:787 +msgid "Case in path" +msgstr "Casse dans les chemins" + +#: includes/argument.handlers.inc:788 +msgid "When printing url paths, how to transform the of the argument. Do not use this unless with Postgres as it uses case sensitive comparisons." +msgstr "À l'affichage d'URL, indique comment transformer la casse de l'argument. À ne pas utiliser sauf avec Postgres car il y a utilisation de comparaisons sensibles à la casse." + +#: includes/argument.handlers.inc:801 +msgid "Transform spaces to dashes in URL" +msgstr "Dans les URL, transforme les espaces en tirets" + +#: includes/argument.handlers.inc:808;1046 +msgid "Allow multiple arguments to work together." +msgstr "Permettre à plusieurs arguments de collaborer." + +#: includes/argument.handlers.inc:809;1047 +msgid "If selected, multiple instances of this argument can work together, as though multiple terms were supplied to the same argument. This setting is not compatible with the \"Reduce duplicates\" setting." +msgstr "Si cette option est sélectionnée, plusieurs instances de cet argument peuvent collaborer comme si l'on avait fourni plusieurs termes pour le même argument. Ce paramétrage n'est pas compatible avec le paramètre \"Supprimer les doublons\"." + +#: includes/argument.handlers.inc:815;1053 +msgid "Do not display items with no value in summary" +msgstr "Ne pas afficher les éléments sans valeur dans le sommaire" + +#: includes/argument.handlers.inc:936;1038 +msgid "Allow multiple terms per argument." +msgstr "Autoriser plusieurs termes par argument." + +#: includes/argument.handlers.inc:937 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3 or 1,2,3." +msgstr "Si cette option est sélectionnée, les utilisateurs peuvent saisir plusieurs arguments sous la forme 1+2+3 ou 1,2,3." + +#: includes/argument.handlers.inc:943 +msgid "Exclude the argument" +msgstr "Exclure l'argument" + +#: includes/argument.handlers.inc:944 +msgid "If selected, the numbers entered in the argument will be excluded rather than limiting the view." +msgstr "Si cette option est sélectionnée, les nombres saisis dans l'argument seront exclus plutôt que de limiter la vue." + +#: includes/argument.handlers.inc:951;963;1088;1102 +#: modules/taxonomy.views.inc:120;204;287 +msgid "Uncategorized" +msgstr "Sans catégorie" + +#: includes/argument.handlers.inc:967;1106 +msgid "Invalid input" +msgstr "Saisie invalide" + +#: includes/argument.handlers.inc:1039 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3 (for OR) or 1,2,3 (for AND)." +msgstr "Si cette option est sélectionnée, les utilisateurs peuvent saisir plusieurs arguments sous la forme 1+2+3 (pour OU) ou 1,2,3 (pour ET)." + +#: includes/convert.inc:14 +msgid "There are no Views 1 views stored in the database to convert." +msgstr "Il n'y a aucune vue Views 1 enregistrée dans la base de données à convertir." + +#: includes/convert.inc:22 +msgid "Operations" +msgstr "Opérations" + +#: includes/convert.inc:33 +msgid "Converted" +msgstr "Converti" + +#: includes/convert.inc:68 +msgid "The table below lists Views version 1 views that are stored in the database. You can either convert them to work in Views version 2, or delete them. The views are convertible only if there is no Views 2 view with the same name." +msgstr "Le tableau ci-dessous dresse la liste des vues Views version 1 enregistrées dans la base de données. Vous pouvez, soit les convertir pour fonctionner avec Views version 2, soit les supprimer. Les vues ne peuvent être converties que s'il n'existe pas de vue Views 2 possédant le même nom." + +#: includes/convert.inc:79 +msgid "Unable to find view." +msgstr "Impossible de trouver la vue." + +#: includes/convert.inc:89 +msgid "Unable to convert view." +msgstr "Impossible de convertir la vue." + +#: includes/convert.inc:108 +msgid "This action cannot be undone." +msgstr "Cette action est irréversible." + +#: includes/convert.inc:118 +msgid "The view has been deleted" +msgstr "La vue a été supprimée" + +#: includes/field.handlers.inc:130 +#: includes/filter.handlers.inc:304 +#: includes/relationship.handlers.inc:60 +msgid "Label" +msgstr "Étiquette" + +#: includes/field.handlers.inc:132 +msgid "The label for this field that will be displayed to end users if the style requires it." +msgstr "L'étiquette de ce champ, qui sera affichée aux utilisateurs finaux si le style l'exige." + +#: includes/field.handlers.inc:136 +msgid "Exclude from display" +msgstr "Exclure de l'affichage" + +#: includes/field.handlers.inc:138 +msgid "Check this box to not display this field, but still load it in the view. Use this option to not show a grouping field in each record, or when doing advanced theming." +msgstr "Cochez cette case pour ne pas afficher ce champ mais le charger néanmoins dans la vue. Utilisez cette option pour ne pas montrer un champ de groupement dans chaque enregistrement ou lorsque vous travaillez sur des thèmes avancés." + +#: includes/field.handlers.inc:223 +msgid "Date format" +msgstr "Format de date" + +#: includes/field.handlers.inc:228 +msgid "Custom" +msgstr "Personnalisé" + +#: includes/field.handlers.inc:229 +msgid "Time ago" +msgstr "Il y a" + +#: includes/field.handlers.inc:235 +msgid "Custom date format" +msgstr "Format de date personnalisé" + +#: includes/field.handlers.inc:236 +msgid "If \"Custom\", see the PHP docs for date formats. If \"Time ago\" this is the the number of different units to display, which defaults to two." +msgstr "Si \"Personnalisé\", référez-vous à la documentation PHP relative aux formats de dates. Si \"Il y a\", il s'agit du nombre d'unités différentes à afficher, fixé par défaut à deux." + +#: includes/field.handlers.inc:252 +msgid "%time ago" +msgstr "Il y a %time" + +#: includes/field.handlers.inc:280 +msgid "Output format" +msgstr "Format de sortie" + +#: includes/field.handlers.inc:282 +msgid "Yes/No" +msgstr "Oui/Non" + +#: includes/field.handlers.inc:283 +msgid "True/False" +msgstr "Vrai/Faux" + +#: includes/field.handlers.inc:284 +msgid "On/Off" +msgstr "Activé/Désactivé" + +#: includes/field.handlers.inc:290 +msgid "Reverse" +msgstr "Inversé" + +#: includes/field.handlers.inc:291 +msgid "If checked, true will be displayed as false." +msgstr "Si cette option est cochée, Vrai apparaîtra comme Faux." + +#: includes/field.handlers.inc:305 +#: includes/filter.handlers.inc:853;898 +#: includes/plugins.inc:858;867;884;892;1035;2446 +msgid "Yes" +msgstr "Oui" + +#: includes/field.handlers.inc:305 +#: includes/filter.handlers.inc:853;898 +#: includes/plugins.inc:858;867;884;892;1035;1043;2446 +msgid "No" +msgstr "Non" + +#: includes/field.handlers.inc:307 +#: includes/filter.handlers.inc:822;863 +msgid "True" +msgstr "Vrai" + +#: includes/field.handlers.inc:307 +#: includes/filter.handlers.inc:863 +msgid "False" +msgstr "Faux" + +#: includes/field.handlers.inc:309 +msgid "On" +msgstr "Activé" + +#: includes/field.handlers.inc:309 +msgid "Off" +msgstr "Désactivé" + +#: includes/field.handlers.inc:368 +#: modules/statistics.views.inc:276 +msgid "Display as link" +msgstr "Afficher comme lien" + +#: includes/field.handlers.inc:410 +#: modules/node.views.inc:1289 +msgid "Display type" +msgstr "Type d'affichage" + +#: includes/field.handlers.inc:412 +#: includes/plugins.inc:2971 +msgid "Unordered list" +msgstr "Liste non ordonnée" + +#: includes/field.handlers.inc:413 +#: includes/plugins.inc:2971 +msgid "Ordered list" +msgstr "Liste ordonnée" + +#: includes/field.handlers.inc:414 +msgid "Simple separator" +msgstr "Séparateur simple" + +#: includes/field.handlers.inc:421 +#: includes/plugins.inc:3265;3376;3557 +msgid "Separator" +msgstr "Séparateur" + +#: includes/field.handlers.inc:429 +msgid "Empty list text" +msgstr "Texte de liste vide" + +#: includes/field.handlers.inc:431 +msgid "If the list is empty, you may enter text here that will be displayed." +msgstr "Si la liste est vide, vous pouvez saisir ici le texte qui devra être affiché." + +#: includes/field.handlers.inc:480 +msgid "Round" +msgstr "Arrondi" + +#: includes/field.handlers.inc:481 +msgid "If checked, the number will be rounded." +msgstr "Si cette option est coché, le nombre sera arrondi." + +#: includes/field.handlers.inc:486 +msgid "Precision" +msgstr "Précision" + +#: includes/field.handlers.inc:488 +msgid "Specify how many digits to print after the decimal point." +msgstr "Précisez le nombre de chiffres à afficher après le marqueur décimal." + +#: includes/field.handlers.inc:495 +msgid "Decimal point" +msgstr "Marqueur décimal" + +#: includes/field.handlers.inc:497 +msgid "What single character to use as a decimal point." +msgstr "Caractère à utiliser comme marqueur décimal" + +#: includes/field.handlers.inc:503 +msgid "Thousands separator" +msgstr "Séparateur de milliers" + +#: includes/field.handlers.inc:505 +msgid "What single character to use as the thousands separator." +msgstr "Caractère à utiliser pour séparer les milliers." + +#: includes/field.handlers.inc:510 +msgid "Prefix" +msgstr "Préfixe" + +#: includes/field.handlers.inc:512 +msgid "Text to put before the number, such as currency symbol." +msgstr "Texte à faire figurer avant le nombre, par exemple une unité monétaire." + +#: includes/field.handlers.inc:516 +msgid "Suffix" +msgstr "Suffixe" + +#: includes/field.handlers.inc:518 +msgid "Text to put after the number, such as currency symbol." +msgstr "Texte à faire figurer après le nombre, par exemple une unité monétaire." + +#: includes/filter.handlers.inc:119 +msgid "Operator" +msgstr "Opérateur" + +#: includes/filter.handlers.inc:183 +msgid "Expose" +msgstr "Exposer" + +#: includes/filter.handlers.inc:188 +msgid "This item is currently not exposed. If you expose it, users will be able to change the filter as they view it." +msgstr "Cet élément n'est pour le moment pas exposé. Si vous l'exposez, les utilisateurs pourront changer le filtre lorsqu'ils l'affichent." + +#: includes/filter.handlers.inc:195 +msgid "Hide" +msgstr "Cacher" + +#: includes/filter.handlers.inc:200 +msgid "This item is currently exposed. If you hide it, users will not able to change the filter as they view it." +msgstr "Cet élément est actuellement exposé. Si vous le cachez, les utilisateurs ne pourront pas changer le filtre lorsqu'ils l'affichent." + +#: includes/filter.handlers.inc:271 +msgid "Unlock operator" +msgstr "Déverrouiller l'opérateur" + +#: includes/filter.handlers.inc:272 +msgid "When checked, the operator will be exposed to the user" +msgstr "Si cette option est cochée, l'opérateur apparaîtra à l'utilisateur." + +#: includes/filter.handlers.inc:278 +msgid "Operator identifier" +msgstr "Identifiant de l'opérateur" + +#: includes/filter.handlers.inc:280 +msgid "This will appear in the URL after the ? to identify this operator." +msgstr "Ceci apparaîtra dans l'URL après le point d'interrogation ? pour identifier cet opérateur." + +#: includes/filter.handlers.inc:297 +msgid "Filter identifier" +msgstr "Identifiant du filtre" + +#: includes/filter.handlers.inc:299 +msgid "This will appear in the URL after the ? to identify this filter. Cannot be blank." +msgstr "Ceci apparaîtra dans l'URL après le point d'interrogation ? pour identifier ce filtre. Ne peut être laissé à blanc." + +#: includes/filter.handlers.inc:315 +msgid "Optional" +msgstr "Facultatif" + +#: includes/filter.handlers.inc:316 +msgid "This exposed filter is optional and will have added options to allow it not to be set." +msgstr "Ce filtre exposé est facultatif et proposera des options supplémentaires pour permettre de ne pas le paramétrer." + +#: includes/filter.handlers.inc:322 +msgid "Force single" +msgstr "Forcer l'unicité" + +#: includes/filter.handlers.inc:323 +msgid "Force this exposed filter to accept only one option." +msgstr "Forcer ce filtre exposé à n'accepter qu'une seule option." + +#: includes/filter.handlers.inc:329 +msgid "Remember" +msgstr "Mémoriser" + +#: includes/filter.handlers.inc:330 +msgid "Remember the last setting the user gave this filter." +msgstr "Mémoriser le dernier paramétrage utilisé par l'utilisateur pour ce filtre." + +#: includes/filter.handlers.inc:341 +msgid "" +"The identifier is required if the filter is\n" +" exposed." +msgstr "" +"L'identifiant est obligatoire si le filtre est\n" +" exposé." + +#: includes/filter.handlers.inc:347 +msgid "This identifier is not allowed." +msgstr "Cet identifiant n'est pas autorisé." + +#: includes/filter.handlers.inc:448 +msgid "" +msgstr "" + +#: includes/filter.handlers.inc:540;582;1089 +msgid "Is equal to" +msgstr "Est égal à " + +#: includes/filter.handlers.inc:541;588;1095 +msgid "Is not equal to" +msgstr "N'est pas égal à" + +#: includes/filter.handlers.inc:551;714;1197 +msgid "Value" +msgstr "Valeur" + +#: includes/filter.handlers.inc:583;589;1091 +msgid "=" +msgstr "=" + +#: includes/filter.handlers.inc:594 +msgid "Contains" +msgstr "Contient" + +#: includes/filter.handlers.inc:595 +msgid "contains" +msgstr "contient" + +#: includes/filter.handlers.inc:600 +msgid "Contains any word" +msgstr "Contient n'importe quel mot" + +#: includes/filter.handlers.inc:601 +msgid "has word" +msgstr "contient le mot" + +#: includes/filter.handlers.inc:606 +msgid "Contains all words" +msgstr "Contient tous les mots" + +#: includes/filter.handlers.inc:607 +msgid "has all" +msgstr "contient tous" + +#: includes/filter.handlers.inc:612 +msgid "Starts with" +msgstr "Commence par" + +#: includes/filter.handlers.inc:613 +msgid "begins" +msgstr "commence" + +#: includes/filter.handlers.inc:618 +msgid "Ends with" +msgstr "Finit par" + +#: includes/filter.handlers.inc:619 +msgid "ends" +msgstr "finit" + +#: includes/filter.handlers.inc:624 +msgid "Does not contain" +msgstr "Ne contient pas" + +#: includes/filter.handlers.inc:625 +msgid "!has" +msgstr "!has" + +#: includes/filter.handlers.inc:634;1130 +msgid "Is empty (NULL)" +msgstr "Est vide (NULL)" + +#: includes/filter.handlers.inc:636;1132 +msgid "empty" +msgstr "vide" + +#: includes/filter.handlers.inc:640;1136 +msgid "Is not empty (NULL)" +msgstr "N'est pas vide (NULL)" + +#: includes/filter.handlers.inc:642;1138 +msgid "not empty" +msgstr "non vide" + +#: includes/filter.handlers.inc:665 +msgid "exposed>" +msgstr "exposé>" + +#: includes/filter.handlers.inc:672 +msgid "Case sensitive" +msgstr "Sensible à la casse" + +#: includes/filter.handlers.inc:674 +msgid "Case sensitive filters may be faster; MySQL might ignore case sensitivity." +msgstr "Les filtres sensibles à la casse peuvent être plus rapides ; MySQL peut ignorer la sensibilité à la casse." + +#: includes/filter.handlers.inc:860;1009 +msgid "exposed" +msgstr "exposé" + +#: includes/filter.handlers.inc:888 +msgid "Options" +msgstr "Options" + +#: includes/filter.handlers.inc:910 +msgid "Limit list to selected items" +msgstr "Limiter la liste aux éléments sélectionnés" + +#: includes/filter.handlers.inc:911 +msgid "If checked, the selected items presented to the user will be the only ones selected here." +msgstr "Si cette option est cochée, les éléments sélectionnés présentés à l'utilisateur seront uniquement ceux sélectionnés ici." + +#: includes/filter.handlers.inc:930;1459 +msgid "Is one of" +msgstr "Fait partie de" + +#: includes/filter.handlers.inc:931 +msgid "Is not one of" +msgstr "Ne fait pas partie de " + +#: includes/filter.handlers.inc:1022 +#: modules/system.views.inc:236 +msgid "Unknown" +msgstr "Inconnu" + +#: includes/filter.handlers.inc:1077 +msgid "Is less than" +msgstr "Est inférieur à" + +#: includes/filter.handlers.inc:1079 +msgid "<" +msgstr "<" + +#: includes/filter.handlers.inc:1083 +msgid "Is less than or equal to" +msgstr "Est inférieur ou égal à" + +#: includes/filter.handlers.inc:1085 +msgid "<=" +msgstr "<=" + +#: includes/filter.handlers.inc:1097 +msgid "!=" +msgstr "!=" + +#: includes/filter.handlers.inc:1101 +msgid "Is greater than or equal to" +msgstr "Est supérieur ou égal à" + +#: includes/filter.handlers.inc:1103 +msgid ">=" +msgstr ">=" + +#: includes/filter.handlers.inc:1107 +msgid "Is greater than" +msgstr "Est supérieur à" + +#: includes/filter.handlers.inc:1109 +msgid ">" +msgstr ">" + +#: includes/filter.handlers.inc:1113 +msgid "Is between" +msgstr "Est compris entre" + +#: includes/filter.handlers.inc:1115 +msgid "between" +msgstr "entre" + +#: includes/filter.handlers.inc:1119 +msgid "Is not between" +msgstr "N'est pas compris entre" + +#: includes/filter.handlers.inc:1121 +msgid "not between" +msgstr "pas entre" + +#: includes/filter.handlers.inc:1212 +msgid "Min" +msgstr "Min" + +#: includes/filter.handlers.inc:1218 +msgid "And max" +msgstr "Et max" + +#: includes/filter.handlers.inc:1218 +msgid "And" +msgstr "Et" + +#: includes/filter.handlers.inc:1275 +msgid "@min and @max" +msgstr "@min et @max" + +#: includes/filter.handlers.inc:1301 +msgid "Value type" +msgstr "Type de valeur" + +#: includes/filter.handlers.inc:1303 +msgid "A date in any machine readable format. CCYY-MM-DD HH:MM:SS is preferred." +msgstr "Date dans n'importe quel format machine. AAAA-MM-JJ HH:MM:SS est préférable" + +#: includes/filter.handlers.inc:1304 +msgid "An offset from the current time such as \"+1 day\" or \"-2 hours and 30 minutes\"" +msgstr "Décalage à partir de l'heure courante, par exemple \"+1 jour\" ou \"-2 heures et 30 minutes\"" + +#: includes/filter.handlers.inc:1354;1360;1364 +msgid "Invalid date format." +msgstr "Format de date invalide." + +#: includes/filter.handlers.inc:1460 +msgid "Is all of" +msgstr "Tout parmi" + +#: includes/filter.handlers.inc:1461 +msgid "Is none of" +msgstr "Aucun parmi" + +#: includes/handlers.inc:136 +msgid "!group: !title" +msgstr "!group : !title" + +#: includes/handlers.inc:336 +msgid "Broken/missing handler" +msgstr "Gestionnaire défectueux/manquant" + +#: includes/handlers.inc:344 +msgid "The handler for this item is broken or missing and cannot be used. If a module provided the handler and was disabled, re-enabling the module may restore it. Otherwise, you should probably delete this item." +msgstr "Le gestionnaire de cet élément est défectueux ou absent, et ne peut donc être utilisé. Si un module a fourni le gestionnaire puis a été désactivé, réactiver le module peut permettre de le restaurer. Sinon, vous devriez probablement supprimer cet élément." + +#: includes/handlers.inc:380 +msgid "Reduce duplicates" +msgstr "Supprimer les doublons" + +#: includes/handlers.inc:381 +msgid "This filter can cause items that have more than one of the selected options to appear as duplicate results. If this filter causes duplicate results to occur, this checkbox can reduce those duplicates; however, the more terms it has to search for, the less performant the query will be, so use this with caution." +msgstr "Ce filtre peut causer l'apparition de doublons pour les éléments possédant plusieurs des options sélectionnées. Si ce filtre provoque l'apparition de doublons, cette case peut supprimer les doublons en question. Toutefois, plus il y a de termes à rechercher, plus les performances de la requête diminueront : utilisez-la donc avec précautions." + +#: includes/plugins.inc:19 +msgid "Default settings for this view." +msgstr "Paramètres par défaut pour cette vue." + +#: includes/plugins.inc:33 +msgid "Display the view as a page, with a URL and menu links." +msgstr "Afficher la vue en tant que page, avec une URL et des liens de menu." + +#: includes/plugins.inc:44;53 +msgid "Block" +msgstr "Bloc" + +#: includes/plugins.inc:45 +msgid "Display the view as a block." +msgstr "Afficher la vue en tant que bloc." + +#: includes/plugins.inc:57 +msgid "Attachment" +msgstr "Fichier attaché" + +#: includes/plugins.inc:58 +msgid "Attachments added to other displays to achieve multiple views in the same view." +msgstr "Fichiers attachés à d'autres affichages pour parvenir à plusieurs vues à l'intérieur de la même vue." + +#: includes/plugins.inc:66 +msgid "Display the view as a feed, such as an RSS feed." +msgstr "Afficher la vue en tant que flux, par exemple un flux RSS." + +#: includes/plugins.inc:78;124 +msgid "Unformatted" +msgstr "Non mis en forme" + +#: includes/plugins.inc:79 +msgid "Displays rows one after another." +msgstr "Afficher les lignes les unes après les autres." + +#: includes/plugins.inc:89 +msgid "Displays rows as an HTML list." +msgstr "Afficher les lignes dans une liste HTML." + +#: includes/plugins.inc:97 +msgid "Grid" +msgstr "Grille" + +#: includes/plugins.inc:98 +msgid "Displays rows in a grid." +msgstr "Afficher les lignes dans une grille." + +#: includes/plugins.inc:106 +msgid "Table" +msgstr "Tableau" + +#: includes/plugins.inc:107 +msgid "Displays rows in a table." +msgstr "Afficher les lignes dans un tableau." + +#: includes/plugins.inc:117 +msgid "Displays the default summary summary as a list." +msgstr "Afficher le sommaire du sommaire par défaut en tant que liste." + +#: includes/plugins.inc:125 +msgid "Displays the summary unformatted, with option for one after another or inline." +msgstr "Affiche le sommaire sans mise en forme, les informations apparaissant, soit les unes après les autres, soit en ligne." + +#: includes/plugins.inc:132 +msgid "RSS Feed" +msgstr "Flux RSS" + +#: includes/plugins.inc:133 +msgid "Generates an RSS feed from a view." +msgstr "Génère un flux RSS à partir d'une vue." + +#: includes/plugins.inc:143 +#: includes/view.inc:1663 +msgid "Fields" +msgstr "Champs" + +#: includes/plugins.inc:144 +msgid "Displays the fields with an optional template." +msgstr "Affiche les champs avec un template facultatif." + +#: includes/plugins.inc:154 +msgid "Fixed entry" +msgstr "Entrée fixe" + +#: includes/plugins.inc:158;164 +msgid "PHP Code" +msgstr "Code PHP" + +#: includes/plugins.inc:168 +msgid "Numeric" +msgstr "Numérique" + +#: includes/plugins.inc:783 +msgid "Broken field" +msgstr "Champ brisé" + +#: includes/plugins.inc:800 +msgid "Basic settings" +msgstr "Paramètres de base" + +#: includes/plugins.inc:807 +msgid "Change the name of this display." +msgstr "Changer le nom de l'affichage." + +#: includes/plugins.inc:819 +msgid "Change the title that this display will use." +msgstr "Changer le titre que cet affichage utilisera." + +#: includes/plugins.inc:829 +msgid "Style" +msgstr "Style" + +#: includes/plugins.inc:831 +msgid "Change the style plugin." +msgstr "Changer le plugin de style." + +#: includes/plugins.inc:845 +msgid "Row style" +msgstr "Style de ligne" + +#: includes/plugins.inc:847 +msgid "Change the row plugin." +msgstr "Changer le plugin de ligne." + +#: includes/plugins.inc:857 +msgid "Use AJAX" +msgstr "Utiliser AJAX" + +#: includes/plugins.inc:859 +msgid "Change whether or not this display will use AJAX." +msgstr "Modifier si cet affichage utilisera ou non AJAX." + +#: includes/plugins.inc:866 +msgid "Use pager" +msgstr "Utiliser la pagination" + +#: includes/plugins.inc:867 +msgid "Mini" +msgstr "Mini" + +#: includes/plugins.inc:868 +msgid "Change this display's pager setting." +msgstr "Modifier les paramètres de pagination de cet affichage." + +#: includes/plugins.inc:875;1054 +msgid "Items per page" +msgstr "Éléments par page" + +#: includes/plugins.inc:875;1054;3339 +msgid "Items to display" +msgstr "Éléments à afficher" + +#: includes/plugins.inc:876 +msgid "Unlimited" +msgstr "Illimité" + +#: includes/plugins.inc:877 +msgid "Change how many items to display." +msgstr "Changer le nombre d'éléments à afficher." + +#: includes/plugins.inc:883 +msgid "More link" +msgstr "Lien \"plus\"" + +#: includes/plugins.inc:885 +msgid "Specify whether this display will provide a \"more\" link." +msgstr "Spécifie si cet affichage proposera un lien \"plus\"." + +#: includes/plugins.inc:891;1081 +msgid "Distinct" +msgstr "Distinct" + +#: includes/plugins.inc:893;1078 +msgid "Display only distinct items, without duplicates." +msgstr "Afficher uniquement les éléments distincts, sans doublon." + +#: includes/plugins.inc:904;1104 +msgid "Unrestricted" +msgstr "Illimité" + +#: includes/plugins.inc:912 +msgid "Multiple roles" +msgstr "Rôles multiples" + +#: includes/plugins.inc:924 +msgid "Access" +msgstr "Accès" + +#: includes/plugins.inc:926 +msgid "Specify access control settings for this display." +msgstr "Précise les paramètres de contrôle d'accès pour cet affichage." + +#: includes/plugins.inc:946 +msgid "Link display" +msgstr "Affichage de lien" + +#: includes/plugins.inc:948 +msgid "Specify which display this display will link to." +msgstr "Indique vers quel affichage conduit le lien de cet affichage." + +#: includes/plugins.inc:953;1143 +msgid "Header" +msgstr "Entête" + +#: includes/plugins.inc:953;1159 +msgid "Footer" +msgstr "Pied de page" + +#: includes/plugins.inc:953;1175 +msgid "Empty text" +msgstr "Texte de page vide" + +#: includes/plugins.inc:969 +msgid "Unknown/missing filter" +msgstr "Filtre inconnu/manquant" + +#: includes/plugins.inc:977 +msgid "Change this display's !name." +msgstr "Changer le !name de cet affichage." + +#: includes/plugins.inc:983 +msgid "Theme" +msgstr "Thème" + +#: includes/plugins.inc:984 +msgid "Information" +msgstr "Informations" + +#: includes/plugins.inc:985 +msgid "Get information on how to theme this display" +msgstr "Obtenir des informations sur comment créer un thème pour cet affichage" + +#: includes/plugins.inc:1011 +msgid "The name of this display" +msgstr "Nom de cet affichage" + +#: includes/plugins.inc:1014 +msgid "This title will appear only in the administrative interface for the View." +msgstr "Ce titre apparaîtra uniquement dans l'interface d'administration de la vue." + +#: includes/plugins.inc:1019 +msgid "The title of this view" +msgstr "Titre de cette vue" + +#: includes/plugins.inc:1022 +msgid "This title will be displayed with the view, wherever titles are normally displayed; i.e, as the page title, block title, etc." +msgstr "Ce titre sera affiché avec la vue, partout où des titres sont normalement affichés (par exemple titre de page, titre de bloc, etc.)." + +#: includes/plugins.inc:1027 +msgid "Use AJAX when available to load this view" +msgstr "Utiliser AJAX lorsque c'est possible pour charger cette vue" + +#: includes/plugins.inc:1031 +msgid "If set, this view will use an AJAX mechanism for paging, table sorting and exposed filters. This means the entire page will not refresh. It is not recommended that you use this if this view is the main content of the page as it will prevent deep linking to specific pages, but it is very useful for side content." +msgstr "Si cette option est sélectionnée, cette vue utilisera un mécanisme Ajax pour la pagination, le tri des tables et les filtres exposés. Cela signifie que la page n'aura pas à se rafraîchir entièrement. Il n'est pas recommandé d'utiliser cette option si cette vue constitue le contenu principal de la page, car elle empêche les liens profonds vers des pages spécifiques ; c'est toutefois très utile pour les contenus accessoires." + +#: includes/plugins.inc:1040 +msgid "Use a pager for this view" +msgstr "Utiliser une pagination pour cette vue" + +#: includes/plugins.inc:1043 +msgid "Full pager" +msgstr "Pagination complète" + +#: includes/plugins.inc:1043 +msgid "Mini pager" +msgstr "Mini-pagination" + +#: includes/plugins.inc:1048 +msgid "Pager element" +msgstr "Élément de pagination" + +#: includes/plugins.inc:1049 +msgid "Unless you're experiencing problems with pagers related to this view, you should leave this at 0. If using multiple pagers on one page you may need to set this number to a higher value so as not to conflict within the ?page= array. Large values will add a lot of commas to your URLs, so avoid if possible." +msgstr "À moins que vous ne rencontriez des difficultés avec la pagination associée à cette vue, vous devriez laisser cette option à 0. Si vous utilisez plusieurs une pagination sur plusieurs pages, vous pouvez être amené à choisir une valeur plus élevée pour ce nombre afin d'éviter tout conflit avec ?page=array. Les valeurs importantes ajouteront un grand nombre de virgules à vos URL, c'est donc à éviter autant que possible." + +#: includes/plugins.inc:1058 +msgid "The number of items to display per page. Enter 0 for no limit." +msgstr "Nombre d'éléments à afficher par page. Choisissez 0 pour un nombre illimité." + +#: includes/plugins.inc:1063 +msgid "Offset" +msgstr "Décalage" + +#: includes/plugins.inc:1064 +msgid "The number of items to skip. For example, if this field is 3, the first 3 items will be skipped and not displayed. Offset can not be used if items to display is 0; instead use a very large number there." +msgstr "Nombre d'éléments à sauter. Si, par exemple, ce champ vaut 3, les trois premiers éléments seront sautés et non affichés. Le décalage ne peut pas être utilisé si le nombre d'éléments à afficher vaut 0 ; vous devez au contraire utiliser un très grand nombre pour cette dernière valeur." + +#: includes/plugins.inc:1069 +msgid "Add a more link to the bottom of the display." +msgstr "Ajouter un lien \"plus\" en bas de l'affichage." + +#: includes/plugins.inc:1072 +msgid "Create more link" +msgstr "Créer un lien \"plus\"" + +#: includes/plugins.inc:1073 +msgid "This will add a more link to the bottom of this view, which will link to the page view. If you have more than one page view, the link will point to the display specified in 'Link display' above." +msgstr "Ceci ajoute un lien \"plus\" en bas de la vue, qui conduit à la vue de la page. SI vous avez plusieurs vues de la page, le lien pointe vers l'affichage spécifié dans l'option 'Affichage de lien' ci-dessus." + +#: includes/plugins.inc:1082 +msgid "This will make the view display only distinct items. If there are multiple identical items, each will be displayed only once. You can use this to try and remove duplicates from a view, though it does not always work. Note that this can slow queries down, so use it with caution." +msgstr "Ceci contraint la vue à ne présenter que des éléments distincts. S'il existe plusieurs éléments identiques, chacun n'apparaîtra qu'une seule fois. Vous pouvez utiliser cette option pour essayer de supprimer les doublons d'une vue, bien que cela ne fonctionne pas toujours. Notez que cela peut ralentir les requêtes, c'est donc une option à utiliser avec précautions." + +#: includes/plugins.inc:1087 +msgid "Access restrictions" +msgstr "Restrictions d'accès" + +#: includes/plugins.inc:1104 +msgid "By role" +msgstr "Par rôle" + +#: includes/plugins.inc:1104 +msgid "By permission" +msgstr "Par droits d'accès" + +#: includes/plugins.inc:1113 +msgid "If by role" +msgstr "Si par rôle" + +#: includes/plugins.inc:1116 +msgid "Only the checked roles will be able to access this display. Note that users with \"access all views\" can see any view, regardless of role." +msgstr "Seuls les rôles cochés seront en mesure d'accéder à cet affichage. Notez que les utilisateurs disposant des droits \"accéder à toutes les vues\" pourront consulter toutes les vues, quel que soit leur rôle." + +#: includes/plugins.inc:1133 +msgid "If by permission" +msgstr "Si par droits d'accès" + +#: includes/plugins.inc:1135 +msgid "Only users with the selected permission flag will be able to access this display. Note that users with \"access all views\" can see any view, regardless of other permissions." +msgstr "Seuls les utilisateurs disposant du droit d'accès approprié pourront accéder à cet affichage. Notez que les utilisateurs disposant des droits \"accéder à toutes les vues\" pourront consulter toutes les vues, indépendamment des autres droits." + +#: includes/plugins.inc:1146;1162 +msgid "Display even if view has no result" +msgstr "Afficher même si la vue n'a pas de résultat" + +#: includes/plugins.inc:1153 +msgid "Text to display at the top of the view. May contain an explanation or links or whatever you like. Optional." +msgstr "Texte à montrer en haut de la vue. Ceci peut contenir des explications, des liens ou tout ce que vous désirez. Optionnel." + +#: includes/plugins.inc:1169 +msgid "Text to display beneath the view. May contain an explanation or links or whatever you like. Optional." +msgstr "Texte à montrer sous la vue. Ceci peut contenir des explications, des liens ou tout ce que vous désirez. Optionnel." + +#: includes/plugins.inc:1180 +msgid "Text to display if the view has no results. Optional." +msgstr "Texte à afficher si la vue n'a pas de résultat. Optionnel." + +#: includes/plugins.inc:1186 +msgid "How should this view be styled" +msgstr "Style à appliquer à cette vue" + +#: includes/plugins.inc:1192 +msgid "If the style you choose has settings, be sure to click the settings button that will appear next to it in the View summary." +msgstr "Si le style de votre choix possède des paramètres, veillez à cliquer sur le bouton de paramétrage qui apparaîtra à son côté dans le résumé de la vue." + +#: includes/plugins.inc:1200 +msgid "You may also adjust the !settings for the currently selected style by clicking on the icon." +msgstr "Vous pouvez également adapter les !settings pour le style en cours en cliquant sur l'icône." + +#: includes/plugins.inc:1200;1242 +msgid "settings" +msgstr "paramètres" + +#: includes/plugins.inc:1206 +msgid "Style options" +msgstr "Options de style" + +#: includes/plugins.inc:1218 +msgid "Row style options" +msgstr "Options de style de ligne" + +#: includes/plugins.inc:1230 +msgid "How should each row in this view be styled" +msgstr "Comment les lignes de cette vue doivent être stylées" + +#: includes/plugins.inc:1242 +msgid "You may also adjust the !settings for the currently selected row style by clicking on the icon." +msgstr "Vous pouvez également adapter les !settings pour le style de la ligne en cours en cliquant sur l'icône." + +#: includes/plugins.inc:1248 +msgid "Which display to use for path" +msgstr "Affichage à utiliser pour le chemin" + +#: includes/plugins.inc:1257 +msgid "Which display to use to get this display's path for things like summary links, rss feed links, more links, etc." +msgstr "Quel affichage utiliser pour obtenir le chemin de cet affichage pour des éléments du type liens de résumé, liens de flux RSS, liens \"plus\", etc." + +#: includes/plugins.inc:1262 +msgid "Theming information" +msgstr "Informations de thème" + +#: includes/plugins.inc:1270 +msgid "Display output" +msgstr "Sortie de l'affichage" + +#: includes/plugins.inc:1275 +msgid "Style output" +msgstr "Sortie du style" + +#: includes/plugins.inc:1280 +msgid "Row style output" +msgstr "Sortie du style de ligne" + +#: includes/plugins.inc:1286 +msgid "Field @field" +msgstr "Champ @field" + +#: includes/plugins.inc:1294 +msgid "Important! When you add a new template to your theme, be sure to clear the theme registry cache. You can do this by visiting administer >> site building >> themes -- just loading the page should clear the cache." +msgstr "Important ! Lorsque vous ajoutez un nouveau template à votre thème, veillez à bien vider le cache de registre du thème. Vous pouvez procéder en consultant la page administrer >> construction du site >> thèmes : le simple fait de charger la page devrait vider le cache." + +#: includes/plugins.inc:1306 +msgid "Theming information (display)" +msgstr "Informations de thème (affichage)" + +#: includes/plugins.inc:1307;1326;1347;1368 +msgid "Back to !info." +msgstr "Revenir à !info." + +#: includes/plugins.inc:1307;1326;1347;1368 +msgid "theming information" +msgstr "informations de thème" + +#: includes/plugins.inc:1310 +msgid "This display has no theming information" +msgstr "Cet affichage n'a aucune information de thème" + +#: includes/plugins.inc:1313 +msgid "This is the default theme template used for this display." +msgstr "Ceci est le template de thème par défaut utilisé pour cet affichage." + +#: includes/plugins.inc:1325 +msgid "Theming information (style)" +msgstr "Informations de thème (style)" + +#: includes/plugins.inc:1331 +msgid "This display has no style theming information" +msgstr "Cet affichage n'a aucune information de thème de style" + +#: includes/plugins.inc:1334 +msgid "This is the default theme template used for this style." +msgstr "Ceci est le template de thème par défaut utilisé pour ce style." + +#: includes/plugins.inc:1346;1367 +msgid "Theming information (row style)" +msgstr "Informations de thème (style de ligne)" + +#: includes/plugins.inc:1352 +msgid "This display has no row style theming information" +msgstr "Cet affichage n'a aucune information de thème de style de ligne" + +#: includes/plugins.inc:1355;1370 +msgid "This is the default theme template used for this row style." +msgstr "Ceci est le template de thème par défaut utilisé pour ce style de ligne." + +#: includes/plugins.inc:1434 +msgid "You must select at least one role if type is \"by role\"" +msgstr "Vous devez sélectionner au moins un rôle si le type est \"par rôle\"" + +#: includes/plugins.inc:1551 +msgid "Override" +msgstr "Supplanter" + +#: includes/plugins.inc:1563 +msgid "Use default" +msgstr "Utiliser la valeur par défaut" + +#: includes/plugins.inc:1756 +msgid "Display @display uses fields but there are none defined for it." +msgstr "L'affichage @display utilise des champs mais aucun champ n'est défini pour cet affichage." + +#: includes/plugins.inc:1760 +msgid "Display @display uses path but path is undefined." +msgstr "L'affichage @display utilise un chemin mais le chemin n'est pas défini." + +#: includes/plugins.inc:1765 +msgid "Display @display has an invalid style plugin." +msgstr "L'affichage @display présente un plugin de style invalide." + +#: includes/plugins.inc:1994 +msgid "Page settings" +msgstr "Paramètres de la page" + +#: includes/plugins.inc:2019 +msgid "No menu" +msgstr "Pas de menu" + +#: includes/plugins.inc:2022 +msgid "Normal: @title" +msgstr "Normal : @title" + +#: includes/plugins.inc:2026 +msgid "Tab: @title" +msgstr "Onglet : @title" + +#: includes/plugins.inc:2036 +msgid "Menu" +msgstr "Menu" + +#: includes/plugins.inc:2042 +msgid "Change settings for the parent menu" +msgstr "Changer les paramètres pour le menu parent" + +#: includes/plugins.inc:2055 +msgid "The menu path or URL of this view" +msgstr "Le chemin ou l'URL de menu pour cette vue" + +#: includes/plugins.inc:2059 +msgid "This view will be displayed by visiting this path on your site. You may use \"%\" in your URL to represent values that will be used for arguments: For example, \"node/%/feed\"." +msgstr "Cette vue sera affichée en visitant ce chemin sur votre site. Vous pouvez utiliser \"%\" dans votre URL pour représenter les valeurs qui seront utilisées comme arguments : par exemple \"node/%/feed\"." + +#: includes/plugins.inc:2065 +msgid "Menu item entry" +msgstr "Entrée d'élément de menu" + +#: includes/plugins.inc:2082 +msgid "No menu entry" +msgstr "Aucune entrée de menu" + +#: includes/plugins.inc:2083 +msgid "Normal menu entry" +msgstr "Entrée de menu normale" + +#: includes/plugins.inc:2084;2131 +msgid "Menu tab" +msgstr "Onglet de menu" + +#: includes/plugins.inc:2085 +msgid "Default menu tab" +msgstr "Onglet de menu par défaut" + +#: includes/plugins.inc:2094 +msgid "If set to normal or tab, enter the text to use for the menu item." +msgstr "Si positionné à normal ou onglet, saisissez le texte à utiliser pour l'élément de menu." + +#: includes/plugins.inc:2103 +msgid "If set to tab, enter the weight of the item. The lower th weight the higher/further left it will appear." +msgstr "Si positionné à onglet, saisissez le poids de l'élément. Plus le poids est faible, plus il apparaîtra haut ou à gauche." + +#: includes/plugins.inc:2109 +msgid "Default tab options" +msgstr "Options d'onglet par défaut" + +#: includes/plugins.inc:2118 +msgid "When providing a menu item as a tab, Drupal needs to know what the parent menu item of that tab will be. Sometimes the parent will already exist, but other times you will need to have one created. The path of a parent item will always be the same path with the last part left off. i.e, if the path to this view is foo/bar/baz, the parent path would be foo/bar." +msgstr "Lorsque l'on fournit un élément de menu en tant qu'onglet, Drupal a besoin de savoir quel sera l'élément de menu parent de cet onglet. Parfois le parent existe déjà, mais vous pouvez également être amené à en créer un. Le chemin d'un élément parent sera toujours le même chemin, dont la dernière partie est supprimée. Par exemple, si le chemin vers cette vue est foo/bar/baz, le chemin parent sera alors foo/bar." + +#: includes/plugins.inc:2129 +msgid "Parent menu item" +msgstr "Élément de menu parent" + +#: includes/plugins.inc:2131 +msgid "Already exists" +msgstr "Existe déjà" + +#: includes/plugins.inc:2131 +msgid "Normal menu item" +msgstr "Élément de menu normal" + +#: includes/plugins.inc:2139 +msgid "If creating a parent menu item, enter the title of the item." +msgstr "Si vous créez un élément de menu parent, saisissez le titre de l'élément." + +#: includes/plugins.inc:2145 +msgid "Tab weight" +msgstr "Poids de l'onglet" + +#: includes/plugins.inc:2149 +msgid "If the parent menu item is a tab, enter the weight of the tab. The lower the number, the more to the left it will be." +msgstr "Si l'élément de menu parent est un onglet, saisissez le poids de l'onglet. Plus le nombre est faible, plus l'élément apparaîtra à gauche." + +#: includes/plugins.inc:2163 +msgid "\"$arg\" is no longer supported. Use % instead." +msgstr "\"$arg\" n'est plus pris en charge. Utilisez plutôt %." + +#: includes/plugins.inc:2173 +msgid "Views cannot create normal menu items for paths with a % in them." +msgstr "Views ne peut pas créer d'élément de menu normal pour les chemins comportant un %." + +#: includes/plugins.inc:2180 +msgid "A display whose path ends with a % cannot be a tab." +msgstr "Un affichage dont le chemin se termine par un % ne peut être un onglet." + +#: includes/plugins.inc:2185 +msgid "Title is required for this menu type." +msgstr "Le titre est obligatoire pour ce type de menu." + +#: includes/plugins.inc:2216 +msgid "Display @display is set to use a menu but the menu title is not set." +msgstr "L'affichage @display est configuré pour utiliser un menu mais le titre du menu n'est pas renseigné." + +#: includes/plugins.inc:2222 +msgid "Display @display is set to use a parent menu but the parent menu title is not set." +msgstr "L'affichage @display est configuré pour utiliser un menu parent mais le titre du menu parent n'est pas renseigné." + +#: includes/plugins.inc:2288 +msgid "Block settings" +msgstr "Paramètres des blocs" + +#: includes/plugins.inc:2302 +msgid "Admin" +msgstr "Admin" + +#: includes/plugins.inc:2314 +msgid "Caching" +msgstr "Mise en cache" + +#: includes/plugins.inc:2324 +msgid "Do not cache" +msgstr "Ne pas mettre en cache" + +#: includes/plugins.inc:2325 +msgid "Cache once for everything (global)" +msgstr "Mettre en cache une fois pour tout (global)" + +#: includes/plugins.inc:2326 +msgid "Per page" +msgstr "Par page" + +#: includes/plugins.inc:2327 +msgid "Per role" +msgstr "Par rôle" + +#: includes/plugins.inc:2328 +msgid "Per role per page" +msgstr "Par rôle par page" + +#: includes/plugins.inc:2329 +msgid "Per user" +msgstr "Par utilisateur" + +#: includes/plugins.inc:2330 +msgid "Per user per page" +msgstr "Par utilisateur par page" + +#: includes/plugins.inc:2355 +msgid "Block admin description" +msgstr "Description pour l'administration des blocs" + +#: includes/plugins.inc:2358 +msgid "This will appear as the name of this block in administer >> site building >> blocks." +msgstr "Ceci apparaîtra comme le nom de ce bloc dans administrer >> construction du site >> blocs." + +#: includes/plugins.inc:2363 +msgid "Block caching type" +msgstr "Type de mise en cache des blocs" + +#: includes/plugins.inc:2367 +msgid "This sets the default status for Drupal's built-in block caching method; this requires that caching be turned on in block administration, and be careful because you have little control over when this cache is flushed." +msgstr "Ceci positionne l'état par défaut pour la méthode de mise en cache de blocs intégrée à Drupal. Ceci nécessite d'activer la mise en cache dans l'administration des blocs. Attention car vous n'avez que très peu de contrôle sur la fréquence de vidage du cache." + +#: includes/plugins.inc:2418 +msgid "Before" +msgstr "Avant" + +#: includes/plugins.inc:2419 +msgid "After" +msgstr "Après" + +#: includes/plugins.inc:2420 +msgid "Both" +msgstr "Les deux" + +#: includes/plugins.inc:2440 +msgid "Attachment settings" +msgstr "Paramètres de fichiers attachés" + +#: includes/plugins.inc:2445;2486 +msgid "Inherit arguments" +msgstr "Hériter les arguments" + +#: includes/plugins.inc:2451;2495 +msgid "Position" +msgstr "Position" + +#: includes/plugins.inc:2457;2649 +msgid "Multiple displays" +msgstr "Affichages multiples" + +#: includes/plugins.inc:2472;2504;2664;2678 +msgid "Attach to" +msgstr "Attacher à" + +#: includes/plugins.inc:2489 +msgid "Inherit" +msgstr "Hériter" + +#: includes/plugins.inc:2490 +msgid "Should this display inherit its arguments from the parent display to which it is attached?" +msgstr "Cet affichage doit-il hériter ses arguments de l'affichage parent auquel il est attaché ?" + +#: includes/plugins.inc:2498;2687 +msgid "Attach before or after the parent display?" +msgstr "Attacher avant ou après l'affichage parent ?" + +#: includes/plugins.inc:2513 +msgid "Select which display or displays this should attach to." +msgstr "Sélectionnez à quel(s) affichage(s) ceci doit s'attacher." + +#: includes/plugins.inc:2641 +msgid "Feed settings" +msgstr "Paramètres de flux" + +#: includes/plugins.inc:2693 +msgid "This view will be displayed by visiting this path on your site. It is recommended that the path be something like \"path/%/%/feed\" or \"path/%/%/rss.xml\", putting one % in the path for each argument you have defined in the view." +msgstr "Cette vue sera affichée en visitant ce chemin sur votre site. Il est recommandé que le chemin soit du type \"path/%/%/feed\" ou \"path/%/%/rss.xml\" et de placer un caractère % dans le chemin pour chaque argument que vous avez défini dans la vue." + +#: includes/plugins.inc:2835 +msgid "Grouping field" +msgstr "Champ de regroupement" + +#: includes/plugins.inc:2838 +msgid "You may optionally specify a field by which to group the records. Leave blank to not group." +msgstr "Vous pouvez optionnellement spécifier un champ grâce au quel regrouper les enregistrements. Laisser à blanc pour ne rien regrouper." + +#: includes/plugins.inc:2923 +msgid "Style @style requires a row style but the row plugin is invalid." +msgstr "Le style @style nécessite un style de ligne mais le plugin de ligne est invalide." + +#: includes/plugins.inc:2970 +msgid "List type" +msgstr "Type de liste" + +#: includes/plugins.inc:3000 +msgid "Number of columns" +msgstr "Nombre de colonnes" + +#: includes/plugins.inc:3005 +msgid "Alignment" +msgstr "Alignement" + +#: includes/plugins.inc:3006 +msgid "Horizontal" +msgstr "Horizontal" + +#: includes/plugins.inc:3006 +msgid "Vertical" +msgstr "Vertical" + +#: includes/plugins.inc:3008 +msgid "Horizontal alignment will place items starting in the upper left and moving right. Vertical alignment will place items starting in the upper left and moving down." +msgstr "L'alighement horizontal place les éléments depuis le coin supérieur gauche et en allant vers la droite. L'alignement vertical positionne les éléments depuis le coin supérieur gauche et en allant vers le bas." + +#: includes/plugins.inc:3127 +msgid "You need at least one field before you can configure your table settings" +msgstr "Vous avez besoin d'au moins un champ avant de pouvoir configurer vos paramètres de tableau" + +#: includes/plugins.inc:3136 +msgid "Override normal sorting if click sorting is used" +msgstr "Supplanter le tri normal si le tri par clic est utilisé" + +#: includes/plugins.inc:3142 +msgid "Enable Drupal style \"sticky\" table headers (Javascript)" +msgstr "Activer les entêtes de tableau \"collants\" de Drupal (JavaScript)" + +#: includes/plugins.inc:3144 +msgid "(Sticky header effects will not be active for preview below, only on live output.)" +msgstr "(Les effets d'entêtes collants ne seront pas actifs pour la prévisualisation ci-dessous, uniquement pour une sortie réelle)." + +#: includes/plugins.inc:3149 +msgid "Default sort order" +msgstr "Ordre de tri par défaut" + +#: includes/plugins.inc:3150 +#: includes/sort.handlers.inc:60 +msgid "Ascending" +msgstr "Ascendant" + +#: includes/plugins.inc:3150 +#: includes/sort.handlers.inc:60 +msgid "Descending" +msgstr "Descendant" + +#: includes/plugins.inc:3152 +msgid "If a default sort order is selected, what order should it use by default." +msgstr "Si un ordre de tri par défaut est sélectionné, quel ordre celui-ci doit-il utiliser par défaut." + +#: includes/plugins.inc:3238 +msgid "Place fields into columns; you may combine multiple fields into the same column. If you do, the separator in the column specified will be used to separate the fields. Check the sortable box to make that column clicksortable, and check the default sort radio to determine which column will be sorted by default, if any. You may control column order and field labels in the fields section." +msgstr "Placez les champs dans des colonnes. Vous pouvez combiner plusieurs champs dans une même colonne. Si c'est le cas, le séparateur de la colonne spécifiée sera utilisé pour séparer les champs. Cochez la case classable pour rendre cette colonne classable par clic et cochez le bouton radio tri par défaut pour déterminer quelle colonne sera triée par défaut (s'il doit y en avoir une). Vous pouvez contrôler l'ordre des colonnes et les libellés des champs dans la section champs." + +#: includes/plugins.inc:3263 +#: includes/view.inc:1665 +msgid "Field" +msgstr "Champ" + +#: includes/plugins.inc:3264 +msgid "Column" +msgstr "Colonne" + +#: includes/plugins.inc:3267 +msgid "Sortable" +msgstr "Classable" + +#: includes/plugins.inc:3271 +msgid "Default sort" +msgstr "Tri par défaut" + +#: includes/plugins.inc:3330 +msgid "Display record count with link" +msgstr "Afficher le décompte d'enregistrements avec lien" + +#: includes/plugins.inc:3335 +msgid "Override number of items to display" +msgstr "Supplanter le nombre d'éléments à afficher" + +#: includes/plugins.inc:3372 +msgid "Display items inline" +msgstr "Afficher les éléments en ligne" + +#: includes/plugins.inc:3421 +msgid "Use the site mission for the description" +msgstr "Utiliser l'énoncé de mission du site pour la description" + +#: includes/plugins.inc:3425 +msgid "RSS description" +msgstr "Description RSS" + +#: includes/plugins.inc:3427 +msgid "This will appear in the RSS feed itself." +msgstr "Ceci apparaîtra dans le flux RSS lui-même." + +#: includes/plugins.inc:3550 +msgid "Inline fields" +msgstr "Champs en ligne" + +#: includes/plugins.inc:3553 +msgid "Inline fields will be displayed next to each other rather than one after another." +msgstr "Les champs en ligne seront affichés l'un à côté de l'autre plutôt que l'un après l'autre." + +#: includes/plugins.inc:3561 +msgid "The separator may be placed between inline fields to keep them from squishing up next to each other. You can use HTML in this field." +msgstr "Le séparateur peut être placé entre les champs en ligne pour éviter qu'ils ne s'entassent les uns sur les autres. Vous pouvez utiliser du HTML pour ce champ." + +#: includes/plugins.inc:3611 +msgid "Default argument" +msgstr "Argument par défaut" + +#: includes/plugins.inc:3653 +msgid "PHP argument code" +msgstr "Code d'argument PHP" + +#: includes/plugins.inc:3656 +msgid "Enter PHP code that returns a value to use for this argument. Do not use <?php ?>. You must return only a single value for just this argument." +msgstr "Saisissez un code PHP renvoyant la valeur à utiliser pour cet argument. N'utilisez pas <?php ?>. vous ne devez renvoyer qu'une seule valeur pour cet argument seul." + +#: includes/plugins.inc:3760 +msgid "PHP validate code" +msgstr "Code de validation PHP" + +#: includes/plugins.inc:3762 +msgid "Enter PHP code that returns TRUE or FALSE. No return is the same as FALSE, so be SURE to return something if you do not want to declare the argument invalid. Do not use <?php ?>. The argument to validate will be \"$argument\" and the view will be \"$view\". You may change the argument by setting \"$handler->argument\"." +msgstr "Saisissez un code PHP renvoyant TRUE ou FALSE. Si le code ne renvoie aucune valeur, c'est équivalent à FALSE : vous DEVEZ donc vous assurer que le code renvoie quelque chose si vous ne voulez pas déclarer un argument invalide. N'utilisez pas <?php ?>. L'argument à valider sera \"$argument\" et la vue \"$view\". Vous pouvez changer l'argument en positionnant \"$handler->argument\"." + +#: includes/relationship.handlers.inc:62 +msgid "The label for this relationship that will be displayed only administratively." +msgstr "Intitulé pour cette relation, qui ne sera affiché qu'à des fins d'administration." + +#: includes/relationship.handlers.inc:67 +msgid "Require this relationship" +msgstr "Exiger cette relation" + +#: includes/relationship.handlers.inc:68 +msgid "If required, items that do not contain this relationship will not appear." +msgstr "Si la relation est exigée, les éléments qui ne présentent pas cette relation n'apparaîtront pas." + +#: includes/sort.handlers.inc:43 +msgid "asc" +msgstr "asc" + +#: includes/sort.handlers.inc:47 +msgid "desc" +msgstr "desc" + +#: includes/sort.handlers.inc:59 +msgid "Sort order" +msgstr "Ordre de tri" + +#: includes/sort.handlers.inc:76 +msgid "views_handler_sort_formula missing default: @formula" +msgstr "Manque la valeur par défaut pour views_handler_sort_formula : @formula" + +#: includes/sort.handlers.inc:116 +msgid "Granularity" +msgstr "Granularité" + +#: includes/sort.handlers.inc:118 +msgid "Second" +msgstr "Seconde" + +#: includes/sort.handlers.inc:119 +msgid "Minute" +msgstr "Minute" + +#: includes/sort.handlers.inc:120 +msgid "Hour" +msgstr "Heure" + +#: includes/sort.handlers.inc:121 +msgid "Day" +msgstr "Jour" + +#: includes/sort.handlers.inc:122 +msgid "Month" +msgstr "Mois" + +#: includes/sort.handlers.inc:123 +msgid "Year" +msgstr "Année" + +#: includes/sort.handlers.inc:125 +msgid "The granularity is the smallest unit to use when determining whether two dates are the same; for example, if the granularity is \"Year\" then all dates in 1999, regardless of when they fall in 1999, will be considered the same date." +msgstr "La granularité est la plus petite unité à utiliser pour déterminer si deux dates sont identiques ; par exemple, si la granularité est \"Année\", toutes les dates de l'année 1999, indépendamment du mois et du jour, seront considérées comme identiques." + +#: includes/view.inc:224 +msgid "set_display called with invalid display id @display" +msgstr "set_display appelé avec un identifiant d'affichage @display invalide" + +#: includes/view.inc:946 +msgid "Home" +msgstr "Accueil" + +#: includes/view.inc:1664 +msgid "fields" +msgstr "champs" + +#: includes/view.inc:1666 +msgid "field" +msgstr "champ" + +#: includes/view.inc:1671 +msgid "arguments" +msgstr "arguments" + +#: includes/view.inc:1672;1673 +msgid "Argument" +msgstr "Argument" + +#: includes/view.inc:1677 +msgid "Sort criteria" +msgstr "Critères de tri" + +#: includes/view.inc:1678 +msgid "sort criteria" +msgstr "critères de tri" + +#: includes/view.inc:1679 +msgid "Sort criterion" +msgstr "Critère de tri" + +#: includes/view.inc:1680 +msgid "sort criterion" +msgstr "critère de tri" + +#: includes/view.inc:1684 +msgid "Filters" +msgstr "Filtres" + +#: includes/view.inc:1685 +msgid "filters" +msgstr "filtres" + +#: includes/view.inc:1686 +msgid "Filter" +msgstr "Filtre" + +#: includes/view.inc:1687 +msgid "filter" +msgstr "filtre" + +#: includes/view.inc:1692 +msgid "Relationships" +msgstr "Relations" + +#: includes/view.inc:1693 +msgid "relationships" +msgstr "relations" + +#: js/ajax.js:0;0;0;0;0;0;0 +#: js/ajax_view.js:0;0;0 +msgid "An error occurred at " +msgstr "Une erreur s'est produite à" + +#: js/tabs.js:0 +msgid "jQuery UI Tabs: Mismatching fragment identifier." +msgstr "Onglets d'interface jQuery : identifiant de fragment ne correspondant pas." + +#: js/tabs.js:0 +msgid "jQuery UI Tabs: Not enough arguments to add tab." +msgstr "Onglets d'interface jQuery : pas assez d'arguments pour ajouter l'onglet." + +#: modules/book.views.inc:21;36;46;99 +msgid "Book" +msgstr "Livre" + +#: modules/book.views.inc:30 +msgid "Top level book" +msgstr "Livre de plus haut niveau" + +#: modules/book.views.inc:31 +msgid "The book the node is in" +msgstr "Le livre dans lequel se trouve le nœud" + +#: modules/book.views.inc:58 +msgid "The weight of the book page." +msgstr "Le poids de la page de livre." + +#: modules/book.views.inc:69 +#: modules/comment.views.inc:202 +#: modules/taxonomy.views.inc:339 +msgid "Depth" +msgstr "Profondeur" + +#: modules/book.views.inc:70 +msgid "The depth of the book page in the hierarchy; top level books have a depth of 1." +msgstr "La profondeur de la page de livre dans la hiérarchie ; les livres de plus haut niveau ont une profondeur de 1." + +#: modules/book.views.inc:87 +msgid "Hierarchy" +msgstr "Hiérarchie" + +#: modules/book.views.inc:88 +msgid "The order of pages in the book hierarchy. Remember to sort by weight too if you want exactly the right order." +msgstr "L'ordre des pages dans la hiérarchie du livre. N'oubliez pas de trier aussi par poids si vous souhaitez exactement le bon ordre." + +#: modules/book.views.inc:110 +msgid "Parent" +msgstr "Parent" + +#: modules/book.views.inc:111 +msgid "The parent book node" +msgstr "Le nœud de livre parent" + +#: modules/book.views.inc:116 +msgid "Book parent" +msgstr "Parent de livre" + +#: modules/comment.views.inc:22;26;382;391 +msgid "Comment" +msgstr "Commentaire" + +#: modules/comment.views.inc:27 +msgid "Comments are responses to node content." +msgstr "Les commentaires sont des réponses au contenu des nœuds." + +#: modules/comment.views.inc:45 +msgid "The title of the comment." +msgstr "Le titre du commentaire." + +#: modules/comment.views.inc:63 +#: modules/node.views.inc:348 +msgid "Body" +msgstr "Corps" + +#: modules/comment.views.inc:64 +msgid "The text of the comment." +msgstr "Le texte du commentaire." + +#: modules/comment.views.inc:76 +msgid "ID" +msgstr "Identifiant" + +#: modules/comment.views.inc:77 +msgid "The commment ID of the field" +msgstr "L'identifiant de commentaire du champ" + +#: modules/comment.views.inc:95 +msgid "Author" +msgstr "Auteur" + +#: modules/comment.views.inc:96 +msgid "The name of the poster." +msgstr "Le nom du rédacteur." + +#: modules/comment.views.inc:114 +msgid "Author's website" +msgstr "Site web de l'auteur" + +#: modules/comment.views.inc:115 +msgid "The website address of the comment's author. Can be a link. The homepage can also be linked with the Name field. Will be empty if posted by a registered user." +msgstr "L'adresse du site web de l'auteur du commentaire. Peut être un lien. Le champ Name peut également servir à créer le lien vers la page d'accueil. Sera vide si le commentaire est publié par un utilisateur enregistré." + +#: modules/comment.views.inc:133 +#: modules/node.views.inc:107 +msgid "Post date" +msgstr "Date de publication" + +#: modules/comment.views.inc:134 +msgid "Date and time of when the comment was posted." +msgstr "Date et heure de publication du commentaire." + +#: modules/comment.views.inc:149 +msgid "In moderation" +msgstr "En cours de modération" + +#: modules/comment.views.inc:150 +msgid "Whether or not the comment is currently in moderation." +msgstr "Indique si le commentaire est en cours de modération ou non." + +#: modules/comment.views.inc:157 +msgid "Moderated" +msgstr "Modéré" + +#: modules/comment.views.inc:167 +msgid "View link" +msgstr "Lien d'affichage" + +#: modules/comment.views.inc:168 +msgid "Provide a simple link to view the comment." +msgstr "Fournit un lien simple pour afficher le commentaire." + +#: modules/comment.views.inc:176 +#: modules/node.views.inc:231 +#: modules/user.views.inc:204 +msgid "Edit link" +msgstr "Lien d'édition" + +#: modules/comment.views.inc:177 +msgid "Provide a simple link to edit the comment." +msgstr "Fournit un lien simple pour modifier le commentaire." + +#: modules/comment.views.inc:185 +#: modules/node.views.inc:239;461 +#: modules/user.views.inc:212 +msgid "Delete link" +msgstr "Lien de suppression" + +#: modules/comment.views.inc:186 +msgid "Provide a simple link to delete the comment." +msgstr "Fournit un lien simple pour supprimer le commentaire." + +#: modules/comment.views.inc:194 +msgid "Reply-to link" +msgstr "Lien de réponse" + +#: modules/comment.views.inc:195 +msgid "Provide a simple link to reply to the comment." +msgstr "Fournit un lien simple pour répondre au commentaire." + +#: modules/comment.views.inc:203 +msgid "Display the depth of the comment if it is threaded." +msgstr "Afficher la profondeur du commentaire s'il apparaît dans un fil." + +#: modules/comment.views.inc:207 +msgid "Thread" +msgstr "Fil" + +#: modules/comment.views.inc:208 +msgid "Sort by the threaded order. This will keep child comments together with their parents." +msgstr "Trier suivant l'ordre du fil. Ceci maintient les commentaires enfants avec leurs parents." + +#: modules/comment.views.inc:214 +#: modules/node.views.inc:1413 +msgid "Node ID" +msgstr "Identifiant de nœud" + +#: modules/comment.views.inc:215 +msgid "The node the comment is a reply to." +msgstr "Le nœud auquel répond le commentaire." + +#: modules/comment.views.inc:220;253 +#: modules/node.views.inc:24;29;89;347;362;473;1178;1187;1197 +msgid "Node" +msgstr "Node" + +#: modules/comment.views.inc:225 +msgid "User ID" +msgstr "Identifiant utilisateur" + +#: modules/comment.views.inc:226 +msgid "The user who wrote the comment." +msgstr "L'utilisateur ayant rédigé le commentaire." + +#: modules/comment.views.inc:231 +#: modules/node.views.inc:335 +#: modules/statistics.views.inc:201 +#: modules/user.views.inc:23;27;221 +msgid "User" +msgstr "Utilisateur" + +#: modules/comment.views.inc:236 +msgid "Parent CID" +msgstr "Identifiant du commentaire parent" + +#: modules/comment.views.inc:237 +msgid "The Comment ID of the parent comment." +msgstr "L'identifiant du commentaire parent." + +#: modules/comment.views.inc:245 +msgid "Parent comment" +msgstr "Commentaire parent" + +#: modules/comment.views.inc:266 +msgid "Last comment time" +msgstr "Heure du dernier commentaire" + +#: modules/comment.views.inc:267 +msgid "Date and time of when the last comment was posted." +msgstr "Date et heure de publication du dernier commentaire." + +#: modules/comment.views.inc:282 +msgid "Last comment author" +msgstr "Auteur du dernier commentaire" + +#: modules/comment.views.inc:283 +msgid "The name of the author of the last posted comment." +msgstr "Le nom de l'auteur ayant rédigé le dernier commentaire." + +#: modules/comment.views.inc:295 +msgid "Comment count" +msgstr "Décompte de commentaires" + +#: modules/comment.views.inc:296 +msgid "The number of comments a node has." +msgstr "Le nombre de commentaires que présente un nœud." + +#: modules/comment.views.inc:314 +msgid "Updated/commented date" +msgstr "Date de mise à jour/commentaire" + +#: modules/comment.views.inc:315 +msgid "The most recent of last comment posted or node updated time." +msgstr "L'information la plus récente entre le dernier commentaire publié et la date de dernière mise à jour du nœud." + +#: modules/comment.views.inc:338 +msgid "New comments" +msgstr "Nouveau commentaires" + +#: modules/comment.views.inc:339 +msgid "The number of new comments on the node." +msgstr "Le nombre de nouveaux commentaires au sein du nœud." + +#: modules/comment.views.inc:347 +msgid "Comment status" +msgstr "Statut des commentaires" + +#: modules/comment.views.inc:348 +msgid "Whether comments are enabled or disabled on the node." +msgstr "Indique si les commentaires sont activés ou désactivés sur le nœud." + +#: modules/comment.views.inc:362 +msgid "User posted or commented" +msgstr "Publié ou commenté par l'utilisateur" + +#: modules/comment.views.inc:363 +msgid "Display comments only if a user posted the node or commented on the node." +msgstr "Afficher les commentaires uniquement si un utilisateur a publié le nœud ou rédigé des commentaires à son sujet" + +#: modules/comment.views.inc:383 +msgid "Display the comment with standard comment view." +msgstr "Afficher le commentaire avec la vue de commentaire standard." + +#: modules/comment.views.inc:392 +msgid "Display the comment as RSS." +msgstr "Afficher le commentaire en tant que RSS." + +#: modules/comment.views.inc:462 +msgid "Link this field to its comment" +msgstr "Lier ce champ à son commentaire" + +#: modules/comment.views.inc:506 +msgid "Link this field to its user or an author's homepage" +msgstr "Lier ce champ à son utilisateur ou à la page d'accueil d'un auteur" + +#: modules/comment.views.inc:553 +#: modules/node.views.inc:601 +#: modules/user.views.inc:447 +msgid "Text to display" +msgstr "Texte à afficher" + +#: modules/comment.views.inc:564 +#: modules/node.views.inc:612 +#: modules/user.views.inc:463 +msgid "view" +msgstr "voir" + +#: modules/comment.views.inc:589 +#: modules/node.views.inc:643 +#: modules/user.views.inc:481 +msgid "edit" +msgstr "éditer" + +#: modules/comment.views.inc:605 +#: modules/node.views.inc:673;752 +#: modules/user.views.inc:499 +msgid "delete" +msgstr "supprimer" + +#: modules/comment.views.inc:621 +msgid "reply" +msgstr "répondre" + +#: modules/comment.views.inc:764 +msgid "Link this field to new comments" +msgstr "Lier ce champ aux nouveaux commentaires" + +#: modules/comment.views.inc:769 +msgid "Display nothing if no new comments" +msgstr "Ne rien afficher s'il n'y a pas de nouveau commentaire" + +#: modules/comment.views.inc:836 +#: modules/user.views.inc:606 +msgid "Anonymous" +msgstr "Anonyme" + +#: modules/comment.views.inc:842 +msgid "No user" +msgstr "Aucun utilisateur" + +#: modules/comment.views.inc:878;895 +msgid "Disabled" +msgstr "Désactivé" + +#: modules/comment.views.inc:880;896 +msgid "Read only" +msgstr "Lecture uniquement" + +#: modules/comment.views.inc:882;897 +msgid "Read/Write" +msgstr "Lecture/Écriture" + +#: modules/comment.views.inc:917 +#: modules/node.views.inc:1235 +msgid "Display links" +msgstr "Afficher les liens" + +#: modules/node.views.inc:30 +msgid "Nodes are a Drupal site's primary content." +msgstr "Les nœuds constituent le contenu primaire d'un site Drupal." + +#: modules/node.views.inc:57 +msgid "Nid" +msgstr "Nid" + +#: modules/node.views.inc:58 +msgid "The node ID of the node." +msgstr "Identifiant du nœud." + +#: modules/node.views.inc:85;403 +msgid "The title of the node." +msgstr "Titre du nœud." + +#: modules/node.views.inc:108 +msgid "The date the node was posted." +msgstr "Date de publication du nœud." + +#: modules/node.views.inc:123 +msgid "Updated date" +msgstr "Date de mise à jour" + +#: modules/node.views.inc:124 +msgid "The date the node was last updated." +msgstr "Date de dernière mise à jour du nœud." + +#: modules/node.views.inc:140 +msgid "The type of a node (for example, \"blog entry\", \"forum post\", \"story\", etc)." +msgstr "Type d'un nœud (par exemple, \"billet de blog\", \"discussion de forum\", \"article\", etc.)." + +#: modules/node.views.inc:158;166;180 +#: modules/upload.views.inc:74 +msgid "Published" +msgstr "Publié" + +#: modules/node.views.inc:159 +msgid "The published status of the node." +msgstr "Statut de publication du nœud." + +#: modules/node.views.inc:175 +msgid "Published or admin" +msgstr "Publié ou admin" + +#: modules/node.views.inc:176 +msgid "Filters out unpublished nodes if the current user cannot view them." +msgstr "Filtre et exclut les nœuds non publiés si l'utilisateur courant ne peut pas les voir." + +#: modules/node.views.inc:186;194 +msgid "Promoted to front page" +msgstr "Promu en page d'accueil" + +#: modules/node.views.inc:187 +msgid "The front page of the node." +msgstr "Page d'accueil du nœud." + +#: modules/node.views.inc:203;212 +msgid "Sticky" +msgstr "Collant" + +#: modules/node.views.inc:204 +msgid "Whether or not the node is sticky." +msgstr "Indique si le nœud est collant ou non." + +#: modules/node.views.inc:223 +msgid "Link" +msgstr "Lien" + +#: modules/node.views.inc:224 +msgid "Provide a simple link to the node." +msgstr "Fournit un lien simple vers le nœud." + +#: modules/node.views.inc:232 +msgid "Provide a simple link to edit the node." +msgstr "Fournit un lien simple pour éditer le nœud." + +#: modules/node.views.inc:240 +msgid "Provide a simple link to delete the node." +msgstr "Fournit un lien simple pour supprimer le nœud." + +#: modules/node.views.inc:248;1115 +msgid "Language" +msgstr "Langue" + +#: modules/node.views.inc:249 +msgid "The language the content is in." +msgstr "Langue de rédaction du contenu." + +#: modules/node.views.inc:266;437 +#: modules/user.views.inc:125 +msgid "Created date" +msgstr "Date de création" + +#: modules/node.views.inc:267 +msgid "In the form of CCYYMMDD." +msgstr "Sous la forme AAAAMMJJ." + +#: modules/node.views.inc:275 +msgid "Created year + month" +msgstr "Année + mois de création" + +#: modules/node.views.inc:276 +msgid "In the form of YYYYMM." +msgstr "Sous la forme AAAAMM." + +#: modules/node.views.inc:284 +msgid "Created year" +msgstr "Année de création" + +#: modules/node.views.inc:285 +msgid "In the form of YYYY." +msgstr "Sous la forme AAAA." + +#: modules/node.views.inc:293 +msgid "Created month" +msgstr "Mois de création" + +#: modules/node.views.inc:294 +msgid "In the form of MM (01 - 12)." +msgstr "Sous la forme MM (01 - 12)." + +#: modules/node.views.inc:302 +msgid "Created week" +msgstr "Semaine de création" + +#: modules/node.views.inc:303 +msgid "In the form of WW (01 - 53)." +msgstr "Sous la forme SS (01 - 53)." + +#: modules/node.views.inc:315;320 +msgid "Node revision" +msgstr "Révision du nœud" + +#: modules/node.views.inc:321 +msgid "Node revisions are a history of changes to nodes." +msgstr "Les révisions du nœud représente l'historique des modifications de ce nœud." + +#: modules/node.views.inc:336 +msgid "Relate a node revision to the user who created the revision." +msgstr "Associer une révision à l'utilisateur qui en est l'auteur." + +#: modules/node.views.inc:341 +msgid "user" +msgstr "utilisateur" + +#: modules/node.views.inc:349 +msgid "The actual, full data in the body field; this may not be valid data on all node types." +msgstr "Les données effectives et complètes du champ corps ; ces données peuvent n'être pas valides sur tous les types de nœuds." + +#: modules/node.views.inc:363 +msgid "Teaser" +msgstr "Résumé" + +#: modules/node.views.inc:364 +msgid "The stored teaser field. This may not be valid or useful data on all node types." +msgstr "Le champ du résumé enregistré. Ceci peut ne pas être valide ou utile pour tous les types de nœuds." + +#: modules/node.views.inc:377 +msgid "Vid" +msgstr "Vid" + +#: modules/node.views.inc:378 +msgid "The revision ID of the node revision." +msgstr "Identifiant de révision du nœud." + +#: modules/node.views.inc:423 +msgid "Log message" +msgstr "Message de journal" + +#: modules/node.views.inc:424 +msgid "The log message entered when the revision was created." +msgstr "Le message enregistré dans le journal à la création de la révision." + +#: modules/node.views.inc:438 +msgid "The date the node revision was created." +msgstr "La date de création de la révision du nœud." + +#: modules/node.views.inc:453 +msgid "Revert link" +msgstr "Lien de retour arrière" + +#: modules/node.views.inc:454 +msgid "Provide a simple link to revert to the revision." +msgstr "Fournit un lien simple pour revenir à une révision antérieure." + +#: modules/node.views.inc:462 +msgid "Provide a simple link to delete the node revision." +msgstr "Fournit un lien simple pour supprimer la révision du nœud." + +#: modules/node.views.inc:489 +msgid "Has new content" +msgstr "Présente des contenus nouveaux" + +#: modules/node.views.inc:492 +msgid "Show a marker if the node has new or updated content." +msgstr "Affiche un marqueur si le nœud présente des contenus nouveaux ou mis à jour." + +#: modules/node.views.inc:495 +msgid "Show only nodes that have new content." +msgstr "Afficher uniquement les nœuds présentant des contenus nouveaux" + +#: modules/node.views.inc:528 +msgid "Link this field to its node" +msgstr "Lier ce champ à son nœud" + +#: modules/node.views.inc:713 +msgid "revert" +msgstr "revenir" + +#: modules/node.views.inc:788 +msgid "Check for new comments as well" +msgstr "Vérifier aussi la présence de nouveaux commentaires" + +#: modules/node.views.inc:860 +msgid "Unknown node type" +msgstr "Type de nœud inconnu" + +#: modules/node.views.inc:1043 +msgid "Week @week" +msgstr "Semaine @week" + +#: modules/node.views.inc:1055 +msgid "Node type" +msgstr "Type de nœud" + +#: modules/node.views.inc:1116 +msgid "Current user's language" +msgstr "Langue de l'utilisateur courant" + +#: modules/node.views.inc:1116 +msgid "No language" +msgstr "Pas de langue" + +#: modules/node.views.inc:1166 +msgid "Unknown language" +msgstr "Langue inconnue" + +#: modules/node.views.inc:1179;1188 +msgid "Display the node with standard node view." +msgstr "Afficher le nœud avec une vue de nœud standard." + +#: modules/node.views.inc:1203 +msgid "Node ID from URL" +msgstr "Identifiant du nœud à partir de l'URL" + +#: modules/node.views.inc:1230 +msgid "Display only teaser" +msgstr "Afficher uniquement le résumé" + +#: modules/node.views.inc:1291 +msgid "Full text" +msgstr "Texte entier" + +#: modules/node.views.inc:1292 +msgid "Title plus teaser" +msgstr "Titre et résumé" + +#: modules/node.views.inc:1293 +msgid "Title only" +msgstr "Titre seulement" + +#: modules/node.views.inc:1294 +msgid "Use default RSS settings" +msgstr "Utiliser le paramétrage RSS par défaut" + +#: modules/node.views.inc:1360 +msgid "read more" +msgstr "en lire plus" + +#: modules/node.views.inc:1393 +msgid "Types" +msgstr "Types" + +#: modules/node.views.inc:1396 +msgid "If you wish to validate for specific node types, check them; if none are checked, all nodes will pass." +msgstr "Si vous souhaitez une validation pour certains types de nœuds spécifiques, cochez-les ; si aucun nœud n'est coché, tous les nœuds seront acceptés." + +#: modules/node.views.inc:1403 +msgid "Validate user has access to the node" +msgstr "L'utilisateur de validation a accès au nœud" + +#: modules/node.views.inc:1411 +#: modules/taxonomy.views.inc:1044 +msgid "Argument type" +msgstr "Type d'argument" + +#: modules/node.views.inc:1414 +msgid "Node IDs separated by , or +" +msgstr "Identifiants des nœuds séparés par des virgules ou des +" + +#: modules/node.views.inc:1533 +msgid "Display %display has no access control but does not contain a filter for published nodes." +msgstr "L'affichage @display ne présente aucun contrôle d'accès mais il ne contient pas de filtre pour les nœuds publiés." + +#: modules/poll.views.inc:23 +msgid "Poll" +msgstr "Sondage" + +#: modules/poll.views.inc:38;47 +#: modules/user.views.inc:173;182 +msgid "Active" +msgstr "Actif" + +#: modules/poll.views.inc:39 +msgid "Whether the poll is open for voting." +msgstr "Indique si le sondage enregistre toujours les votes." + +#: modules/profile.views.inc:20;40 +msgid "Profile" +msgstr "Profil" + +#: modules/profile.views.inc:100 +msgid "@field-name" +msgstr "@field-name" + +#: modules/profile.views.inc:107 +msgid "Profile textfield" +msgstr "Champ de texte de profil" + +#: modules/profile.views.inc:126 +msgid "Profile textarea" +msgstr "Zone de texte de profil" + +#: modules/profile.views.inc:142 +msgid "Profile checkbox" +msgstr "Case à cocher de profil" + +#: modules/profile.views.inc:159 +msgid "Profile URL" +msgstr "URL de profil" + +#: modules/profile.views.inc:175 +msgid "Profile selection" +msgstr "Sélection de profil" + +#: modules/profile.views.inc:195 +msgid "Profile freeform list %field-name." +msgstr "Liste libre de profil %field-name." + +#: modules/profile.views.inc:207 +msgid "Profile date %field-name." +msgstr "Date de profil %field-name." + +#: modules/search.views.inc:23;77;88;106;172;247 +msgid "Search" +msgstr "Recherche" + +#: modules/search.views.inc:72 +msgid "Score" +msgstr "Score" + +#: modules/search.views.inc:73 +msgid "The score of the search item." +msgstr "Score de l'élément de recherche." + +#: modules/search.views.inc:95 +msgid "Links from" +msgstr "Liens en provenance de" + +#: modules/search.views.inc:96 +msgid "Nodes that link from the node." +msgstr "Nœuds vers lesquels pointe le nœud." + +#: modules/search.views.inc:113 +msgid "Links to" +msgstr "Liens vers" + +#: modules/search.views.inc:114 +msgid "Nodes that link to the node." +msgstr "Nœuds pointant vers le nœud." + +#: modules/search.views.inc:125 +msgid "Search Terms" +msgstr "Termes de recherche" + +#: modules/search.views.inc:126 +msgid "The terms to search for." +msgstr "Termes à rechercher." + +#: modules/search.views.inc:156 +msgid "On empty input" +msgstr "En cas de saisie vide" + +#: modules/search.views.inc:159 +msgid "Show All" +msgstr "Montrer tous" + +#: modules/search.views.inc:160 +msgid "Show None" +msgstr "Montrer aucun" + +#: modules/search.views.inc:175 +msgid "Enter the terms you wish to search for." +msgstr "Entrez les termes que vous voulez rechercher." + +#: modules/search.views.inc:190 +msgid "You must include at least one positive keyword with @count characters or more." +msgstr "Vous devez inclure au moins un mot-clé positif de @count caractères ou plus." + +#: modules/search.views.inc:194 +msgid "Search for either of the two terms with uppercase OR. For example, cats OR dogs." +msgstr "Cherche l'un ou l'autre termes avec OR en majuscule. Par exemple : chats OR chiens." + +#: modules/search.views.inc:248 +msgid "Display the results with standard search view." +msgstr "Afficher les résultats avec la vue de recherche standard." + +#: modules/search.views.inc:274 +msgid "Display score" +msgstr "Afficher le score" + +#: modules/statistics.views.inc:24 +msgid "Node statistics" +msgstr "Statistiques du nœud" + +#: modules/statistics.views.inc:36 +msgid "Total views" +msgstr "Nombre total d'affichages" + +#: modules/statistics.views.inc:37 +msgid "The total number of times the node has been viewed." +msgstr "Le nombre total d'affichages du nœud." + +#: modules/statistics.views.inc:53 +msgid "Views today" +msgstr "Affichages aujourd'hui" + +#: modules/statistics.views.inc:54 +msgid "The total number of times the node has been viewed today." +msgstr "Le nombre total d'affichage du nœud aujourd'hui." + +#: modules/statistics.views.inc:70 +msgid "Most recent view" +msgstr "Dernier affichage" + +#: modules/statistics.views.inc:71 +msgid "The most recent time the node has been viewed." +msgstr "Date de dernier affichage du nœud." + +#: modules/statistics.views.inc:86;91 +msgid "Access log" +msgstr "Journal d'accès" + +#: modules/statistics.views.inc:92 +msgid "Stores site access information." +msgstr "Enregistre les informations relatives à l'accès au site." + +#: modules/statistics.views.inc:106 +msgid "Session ID" +msgstr "Identifiant de session" + +#: modules/statistics.views.inc:107 +msgid "Browser session ID of user that visited page." +msgstr "Identifiant de session du navigateur pour l'utilisateur ayant consulté cette page." + +#: modules/statistics.views.inc:126 +msgid "Page title" +msgstr "Titre de la page" + +#: modules/statistics.views.inc:127 +msgid "Title of page visited." +msgstr "Titre de la page consultée." + +#: modules/statistics.views.inc:147 +msgid "Internal path to page visited (relative to Drupal root.)" +msgstr "Chemin interne vers la page visitée (relatif à la racine de Drupal)." + +#: modules/statistics.views.inc:166 +msgid "Referrer" +msgstr "Référent" + +#: modules/statistics.views.inc:167 +msgid "Referrer URI." +msgstr "URI référent." + +#: modules/statistics.views.inc:182 +msgid "Hostname" +msgstr "Nom d'hôte" + +#: modules/statistics.views.inc:183 +msgid "Hostname of user that visited the page." +msgstr "Nom d'hôte de l'utilisateur ayant consulté la page." + +#: modules/statistics.views.inc:202 +msgid "The user who visited the site." +msgstr "L'utilisateur ayant visité le site." + +#: modules/statistics.views.inc:212 +msgid "Timer" +msgstr "Chronomètre" + +#: modules/statistics.views.inc:213 +msgid "Time in milliseconds that the page took to load." +msgstr "Temps de chargement de la page en millisecondes." + +#: modules/statistics.views.inc:228 +msgid "Timestamp" +msgstr "Horodatage" + +#: modules/statistics.views.inc:229 +msgid "Timestamp of when the page was visited." +msgstr "Tampon d'horodatage de la dernière visite de la page." + +#: modules/system.views.inc:25;30 +msgid "File" +msgstr "Fichier" + +#: modules/system.views.inc:31 +msgid "Files maintained by Drupal and various modules." +msgstr "Fichiers maintenus par Drupal et différents modules." + +#: modules/system.views.inc:49 +msgid "File ID" +msgstr "Identifiant de fichier" + +#: modules/system.views.inc:50 +msgid "The ID of the file." +msgstr "Identifiant du fichier." + +#: modules/system.views.inc:70 +msgid "The name of the file." +msgstr "Nom du fichier." + +#: modules/system.views.inc:89 +msgid "The path of the file." +msgstr "Chemin du fichier." + +#: modules/system.views.inc:107 +msgid "Mime type" +msgstr "Type MIME" + +#: modules/system.views.inc:108 +msgid "The mime type of the file." +msgstr "Le type MIME du fichier." + +#: modules/system.views.inc:126 +msgid "Size" +msgstr "Taille" + +#: modules/system.views.inc:127 +msgid "The size of the file." +msgstr "La taille du fichier." + +#: modules/system.views.inc:142 +msgid "Status" +msgstr "Statut" + +#: modules/system.views.inc:143 +msgid "The status of the file." +msgstr "Le statut du fichier." + +#: modules/system.views.inc:158 +msgid "Upload date" +msgstr "Date de transfert" + +#: modules/system.views.inc:159 +msgid "The date the file was uploaded." +msgstr "La date de transfert du fichier." + +#: modules/system.views.inc:204 +#: modules/upload.views.inc:145;216 +msgid "Link this field to download the file" +msgstr "Liez ce champ pour télécharger le fichier" + +#: modules/system.views.inc:231 +msgid "Temporary" +msgstr "Temporaire" + +#: modules/system.views.inc:232 +msgid "Permanent" +msgstr "Permanent" + +#: modules/system.views.inc:278 +msgid "No title" +msgstr "Sans titre" + +#: modules/taxonomy.views.inc:24;73;143;161;219;255;298;309 +msgid "Taxonomy" +msgstr "Taxonomie" + +#: modules/taxonomy.views.inc:54 +msgid "Vocabulary name" +msgstr "Nom du vocabulaire" + +#: modules/taxonomy.views.inc:56 +msgid "Name of the vocabulary a term is a member of. This will be the vocabulary that whichever term the \"Taxonomy: Term\" field is; and can similarly cause duplicates." +msgstr "Nom du vocabulaire dont le terme fait partie. C'est le vocabulaire correspondant au terme du champ \"Taxonomie : Terme\" et peut, de façon similaire, générer des doublons." + +#: modules/taxonomy.views.inc:62 +msgid "Vocabulary ID" +msgstr "Identifiant de vocabulaire" + +#: modules/taxonomy.views.inc:63 +msgid "The taxonomy vocabulary ID" +msgstr "L'identifiant du vocabulaire taxonomique" + +#: modules/taxonomy.views.inc:76;107 +msgid "Term" +msgstr "Terme" + +#: modules/taxonomy.views.inc:77 +msgid "Taxonomy terms are attached to nodes." +msgstr "Les termes de taxonomie sont rattachés aux nœuds." + +#: modules/taxonomy.views.inc:108 +msgid "Taxonomy terms. Note that using this can cause duplicate nodes to appear in views; you must add filters to reduce the resultset." +msgstr "Termes de taxonomie. Notez que leur utilisation peut causer l'apparition de doublons parmi les nœuds dans les vues, vous devez donc ajouter des filtres pour limiter l'ensemble des résultats." + +#: modules/taxonomy.views.inc:118 +msgid "Taxonomy term name" +msgstr "Nom du terme de classification" + +#: modules/taxonomy.views.inc:127 +msgid "The term weight field" +msgstr "Champ du poids du terme" + +#: modules/taxonomy.views.inc:139 +msgid "Term description" +msgstr "Description du terme" + +#: modules/taxonomy.views.inc:140 +msgid "The description associated with a taxonomy term." +msgstr "La description associée à un terme de classification." + +#: modules/taxonomy.views.inc:151;763 +msgid "Vocabulary" +msgstr "Vocabulaire" + +#: modules/taxonomy.views.inc:152 +msgid "Filter the results of \"Taxonomy: Term\" to a particular vocabulary." +msgstr "Filtrer les résultats de \"Taxonomie : Terme\" dans un vocabulaire spécifique." + +#: modules/taxonomy.views.inc:193;1046 +msgid "Term ID" +msgstr "Identifiant de terme" + +#: modules/taxonomy.views.inc:194 +msgid "The taxonomy term ID" +msgstr "L'identifiant du terme de classification." + +#: modules/taxonomy.views.inc:196 +msgid "All terms" +msgstr "Tous les termes" + +#: modules/taxonomy.views.inc:197 +msgid "Display all taxonomy terms associated with a node." +msgstr "Afficher tous les termes de taxonomie associés à un nœud." + +#: modules/taxonomy.views.inc:282 +msgid "Term synonym" +msgstr "Synonome du terme" + +#: modules/taxonomy.views.inc:283 +msgid "Term synonyms may be used to find terms by alternate names." +msgstr "Les synonymes de termes peuvent être utilisés pour trouver des termes par d'autres appellations." + +#: modules/taxonomy.views.inc:299 +msgid "Term ID (with depth)" +msgstr "Identifiant de terme (avec profondeur)" + +#: modules/taxonomy.views.inc:300 +msgid "The depth filter is more complex, so provides fewer options." +msgstr "Le filtre de profondeur est plus complexe et propose donc moins d'options." + +#: modules/taxonomy.views.inc:310 +msgid "Term ID depth modifier" +msgstr "Modificateur de la profondeur de l'identifiant de terme" + +#: modules/taxonomy.views.inc:311 +msgid "Allows the \"depth\" for Taxonomy: Term ID (with depth) to be modified via an additional argument." +msgstr "Permet de modifier à l'aide d'un argument supplémentaire la \"profondeur\" pour Taxonomie : Identifiant de terme (avec profondeur)." + +#: modules/taxonomy.views.inc:341 +msgid "The depth will match nodes tagged with terms in the hierarchy. For example, if you have the term \"fruit\" and a child term \"apple\", with a depth of 1 (or higher) then filtering for the term \"fruit\" will get nodes that are tagged with \"apple\" as well as \"fruit\". If negative, the reverse is true; searching for \"apple\" will also pick up nodes tagged with \"fruit\" if depth is -1 (or lower)." +msgstr "La profondeur assurera la correspondance avec les nœuds étiquetés par des termes de la hiérarchie. Si, par exemple, vous avez le terme \"fruit\" et le terme enfant \"pomme\", avec une profondeur de 1 ou plus, alors un filtrage sur le terme \"fruit\" renverra des nœuds étiquetés par \"pomme\" aussi bien que par \"fruit\". Si la profondeur est négative, l'inverse est également vrai : rechercher \"pomme\" avec une profondeur de -1 (ou moins) renverra également les nœuds étiquetés par \"fruit\"." + +#: modules/taxonomy.views.inc:346 +msgid "Allow multiple terms per argument" +msgstr "Autoriser plusieurs termes par argument" + +#: modules/taxonomy.views.inc:347 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3. Due to the number of JOINs it would require, AND will be treated as OR with this argument." +msgstr "Si cette option est sélectionnée, les utilisateurs peuvent saisir plusieurs arguments sous la forme 1+2+3. Du fait du nombre de JOIN que cela représenterait, les requêtes AND seront traitées comme des OR avec cet argument." + +#: modules/taxonomy.views.inc:353;978 +msgid "Set the breadcrumb for the term parents" +msgstr "Faire apparaître les parents du terme dans le fil d'Ariane" + +#: modules/taxonomy.views.inc:354;979 +msgid "If selected, the breadcrumb trail will include all parent terms, each one linking to this view. Note that this only works if just one term was received." +msgstr "Si cette option est sélectionnée, le fil d'Ariane inclura tous les termes parents, chacun comportant un lien vers cette vue. Notez que cela fonctionne uniquement si un seul terme a été reçu." + +#: modules/taxonomy.views.inc:440;685 +msgid "No name" +msgstr "Aucun nom" + +#: modules/taxonomy.views.inc:551 +msgid "Link this field to its term page" +msgstr "Lier ce champ vers la page de terme correspondante" + +#: modules/taxonomy.views.inc:558 +msgid "Limit terms by vocabulary" +msgstr "Limiter les termes par vocabulaire" + +#: modules/taxonomy.views.inc:572;1034 +msgid "Vocabularies" +msgstr "Vocabulaires" + +#: modules/taxonomy.views.inc:645 +msgid "Link this field to its taxonomy term page" +msgstr "Lier ce champ vers la page de terme de classification correspondante" + +#: modules/taxonomy.views.inc:721 +msgid "No vocabulary" +msgstr "Aucun vocabulaire" + +#: modules/taxonomy.views.inc:765 +msgid "Select which vocabulary to show terms for in the regular options." +msgstr "Sélectionnez le vocabulaire pour lequel montrer les termes dans les options normales." + +#: modules/taxonomy.views.inc:775 +msgid "Selection type" +msgstr "Type de sélection" + +#: modules/taxonomy.views.inc:776 +msgid "Dropdown" +msgstr "Liste déroulante" + +#: modules/taxonomy.views.inc:776 +msgid "Autocomplete" +msgstr "Auto-complètement" + +#: modules/taxonomy.views.inc:782 +msgid "Show hierarchy in dropdown" +msgstr "Montrer la hiérarchie dans la liste déroulante" + +#: modules/taxonomy.views.inc:799 +msgid "An invalid vocabulary is selected. Please change it in the options." +msgstr "Un vocabulaire invalide a été sélectionné. Merci de le modifier dans les options." + +#: modules/taxonomy.views.inc:817;851 +msgid "Select terms from vocabulary @voc" +msgstr "Sélectionner les termes dans le vocabulaire @voc" + +#: modules/taxonomy.views.inc:1012 +msgid "Taxonomy term" +msgstr "Terme de classification" + +#: modules/taxonomy.views.inc:1037 +msgid "If you wish to validate for specific vocabularies, check them; if none are checked, all nodes will pass." +msgstr "Si vous souhaitez une validation pour certains vocabulaires spécifiques, cochez-les. Si aucun n'est coché, tous les nœuds seront acceptés." + +#: modules/taxonomy.views.inc:1047 +msgid "Term IDs separated by , or +" +msgstr "Identifiants de termes, séparés par des virgules ou des +" + +#: modules/taxonomy.views.inc:1048 +msgid "Term name or synonym" +msgstr "Nom ou synonyme de terme" + +#: modules/taxonomy.views.inc:1049 +msgid "Term name/synonym converted to Term ID" +msgstr "Nom/synonyme du terme converti en identifiant de terme" + +#: modules/taxonomy.views.inc:1052 +msgid "Select the form of this argument; if using term name, it is generally more efficient to convert it to a term ID and use Taxonomy: Term ID rather than Taxonomy: Term Name\" as an argument." +msgstr "Sélectionnez la forme de cet argument ; si l'on utilise le nom du terme, il est généralement plus efficace de le convertir vers un identifiant de terme et d'utiliser \"Taxonomie : Identifiant de terme\" plutôt que \"Taxonomie : Nom du terme\" en tant qu'argument." + +#: modules/taxonomy.views.inc:937 +msgid "Unable to find term: @terms" +msgid_plural "Unable to find terms: @terms" +msgstr[0] "Impossible de trouver le terme @terms" +msgstr[1] "Impossible de trouver les termes @terms" + +#: modules/upload.views.inc:25 +msgid "Upload" +msgstr "Transfert de fichiers" + +#: modules/upload.views.inc:49 +msgid "The description of the uploaded file." +msgstr "La description du fichier transféré." + +#: modules/upload.views.inc:66 +msgid "Listed" +msgstr "Listé" + +#: modules/upload.views.inc:67 +msgid "Whether or not the file is marked to be listed." +msgstr "Indique si le fichier est marqué pour être listé." + +#: modules/upload.views.inc:83 +msgid "The weight, used for sorting." +msgstr "Le poids, utilisé pour le tri." + +#: modules/upload.views.inc:101;113 +msgid "Attached files" +msgstr "Fichiers attachés" + +#: modules/upload.views.inc:102 +msgid "All files attached to a node with upload.module." +msgstr "Tous les fichiers attachés à un nœud avec upload.module." + +#: modules/upload.views.inc:109;274 +msgid "Has attached files" +msgstr "Possède des fichiers attachés" + +#: modules/upload.views.inc:110 +msgid "Only display items with attached files. This can cause duplicates if there are multiple attached files." +msgstr "Affiche uniquement les éléments présentant des fichiers attachés. Ceci peut causer des doublons s'il y a plusieurs fichiers attachés." + +#: modules/upload.views.inc:114 +msgid "Add a relationship to gain access to more file data for files uploaded by upload.module. Note that this relationship will cause duplicate nodes if there are multiple files attached to the node." +msgstr "Ajouter une relation pour accéder à davantage de données fichiers pour les fichiers transférés par upload.module. Notez que cette relation provoquera l'apparition de doublons s'il y a plusieurs fichiers attachés à un nœud." + +#: modules/upload.views.inc:120 +msgid "Files" +msgstr "Fichiers" + +#: modules/upload.views.inc:151 +msgid "Only show \"listed\" file attachments" +msgstr "Montrer uniquement les fichiers attachés \"listés\"" + +#: modules/user.views.inc:28 +msgid "Users who have created accounts on your site." +msgstr "Utilisateurs ayant créé un compte sur votre site." + +#: modules/user.views.inc:48 +msgid "Uid" +msgstr "Uid" + +#: modules/user.views.inc:49 +msgid "The user ID" +msgstr "Identifiant de l'utilisateur" + +#: modules/user.views.inc:70 +msgid "Current" +msgstr "Courant" + +#: modules/user.views.inc:71 +msgid "Filter the view to the currently logged in user." +msgstr "Filtre la vue pour montrer les utilisateurs actuellement connectés." + +#: modules/user.views.inc:80 +msgid "The user or author name." +msgstr "Le nom de l'utilisateur ou de l'auteur." + +#: modules/user.views.inc:96 +msgid "E-mail" +msgstr "E-mail" + +#: modules/user.views.inc:97 +msgid "Email address for a given user. Only accessible to users with administer users permission" +msgstr "Adresse e-mail d'un utilisateur donné. N'est accessible qu'aux utilisateurs ayant le droit d'administrer les utilisateurs" + +#: modules/user.views.inc:114 +msgid "Picture" +msgstr "Portrait" + +#: modules/user.views.inc:115 +msgid "The user's picture, if allowed." +msgstr "Portrait de l'utilisateur, si autorisé." + +#: modules/user.views.inc:126 +msgid "The date the user was created." +msgstr "Date de création de l'utilisateur." + +#: modules/user.views.inc:141 +msgid "Last access" +msgstr "Dernier accès" + +#: modules/user.views.inc:142 +msgid "The user's last access date." +msgstr "La date de dernier accès de l'utilisateur." + +#: modules/user.views.inc:157 +msgid "Last login" +msgstr "Dernière connexion" + +#: modules/user.views.inc:158 +msgid "The user's last login date." +msgstr "La date de dernière connexion de l'utilisateur." + +#: modules/user.views.inc:174 +msgid "Whether a user is active or blocked." +msgstr "Indique si un utilisateur est actif ou bloqué." + +#: modules/user.views.inc:191 +msgid "Signature" +msgstr "Signature" + +#: modules/user.views.inc:192 +msgid "The user's signature." +msgstr "La signature de l'utilisateur." + +#: modules/user.views.inc:205 +msgid "Provide a simple link to edit the user." +msgstr "Fournit un lien simple pour éditer l'utilisateur." + +#: modules/user.views.inc:213 +msgid "Provide a simple link to delete the user." +msgstr "Fournit un lien simple pour supprimer l'utilisateur." + +#: modules/user.views.inc:242 +msgid "Roles" +msgstr "Rôles" + +#: modules/user.views.inc:243 +msgid "Roles that a user belongs to." +msgstr "Rôles auxquels appartient un utilisateur." + +#: modules/user.views.inc:255 +msgid "No role" +msgstr "Aucun rôle" + +#: modules/user.views.inc:306 +msgid "User ID from URL" +msgstr "Identifiant utilisateur dans l'URL" + +#: modules/user.views.inc:322 +msgid "Also look for a node and use the node author" +msgstr "Rechercher aussi un nœud et utiliser l'auteur du nœud" + +#: modules/user.views.inc:387 +msgid "Link this field to its user" +msgstr "Lier ce champ à l'utilisateur correspondant" + +#: modules/user.views.inc:520 +msgid "Link this field" +msgstr "Lier ce champ" + +#: modules/user.views.inc:523 +msgid "No link" +msgstr "Aucun lien" + +#: modules/user.views.inc:524 +msgid "To the user" +msgstr "Vers l'utilisateur" + +#: modules/user.views.inc:525 +msgid "With a mailto:" +msgstr "Avec un mailto:" + +#: modules/user.views.inc:643 +msgid "Usernames" +msgstr "Noms d'utilisateurs" + +#: modules/user.views.inc:644 +msgid "Enter a comma separated list of user names." +msgstr "Saisissez une liste de noms d'utilisateurs séparés par des virgules." + +#: modules/user.views.inc:752 +msgid "Is the logged in user" +msgstr "Est l'utilisateur connecté" + +#: modules/user.views.inc:710 +msgid "Unable to find user: @users" +msgid_plural "Unable to find users: @users" +msgstr[0] "Impossible de trouver l'utilisateur @users" +msgstr[1] "Impossible de trouver les utilisateurs @users" + +#: modules/views.views.inc:18 +msgid "Global" +msgstr "Global" + +#: modules/views.views.inc:23 +msgid "Random" +msgstr "Au hasard" + +#: modules/views.views.inc:24 +msgid "Randomize the display order." +msgstr "Rendre l'ordre d'affichage aléatoire." + +#: modules/views.views.inc:31 +msgid "Null" +msgstr "Vide" + +#: modules/views.views.inc:32 +msgid "Allow an argument to be ignored. The query will not be altered by this argument." +msgstr "Autoriser un argument à être ignoré. La requête ne sera pas modifiée par cet argument." + +#: modules/views.views.inc:88 +msgid "Fail basic validation if any argument is given" +msgstr "Faire échouer la validation de base si un argument est fourni" + +#: modules/views.views.inc:90 +msgid "By checking this field, you can use this to make sure views with more arguments than necessary fail validation." +msgstr "En cochant cette case, vous pouvez utiliser ceci pour vérifier que la validation des vues présentant plus d'arguments que nécessaire échoue." + +#: theme/views-more.tpl.php:15 +msgid "more" +msgstr "plus" + +#: theme/views-ui-edit-item.tpl.php:18 +msgid "None defined" +msgstr "Aucun défini" + +#: theme/views-ui-edit-tab.tpl.php:31 +msgid "View settings" +msgstr "Paramétrage de la vue" + +#: theme/views-ui-edit-view.tpl.php:11 +msgid "This view is being edited by user !user, and is therefore locked from editing by others. This lock is !age old. Click here to !break." +msgstr "Cette vue est en cours de modification par l'utilisateur !user et elle est par conséquent verrouillée en modification pour tout autre utilisateur. Ce verrou dure depuis !age. Cliquez ici pour le !break." + +#: theme/views-ui-edit-view.tpl.php:16 +msgid "New view" +msgstr "Nouvelle vue" + +#: theme/views-ui-edit-view.tpl.php:18 +msgid "Changed view" +msgstr "Vue changée" + +#: theme/views-ui-edit-view.tpl.php:23 +msgid "View %name, displaying items of type @base." +msgstr "Voir %name en affichant les éléments de type @base." + +#: theme/views-ui-edit-view.tpl.php:42 +msgid "Live preview" +msgstr "Prévisualisation en direct" + +#: theme/views-ui-list-views.tpl.php:17 +msgid "@type @base view: @view" +msgstr "Vue @type @base : @view" + +#: theme/views-ui-list-views.tpl.php:27 +msgid "Title: @title" +msgstr "Titre : @title" + +#: theme/views-ui-list-views.tpl.php:30 +msgid "Path: !path" +msgstr "Chemin : !path" + +#: theme/theme.inc:90 +msgid "Edit this view" +msgstr "Éditer cette vue" + +#: theme/theme.inc:289 +msgid "sort by @s" +msgstr "trier par @s" + +#: theme/theme.inc:490 +msgid "‹‹" +msgstr "‹‹" + +#: theme/theme.inc:491 +msgid "››" +msgstr "››" + +#: theme/theme.inc:501 +msgid "@current of @max" +msgstr "@current de @max" + +#: views_export/views_export.module:17 +msgid "Bulk export" +msgstr "Export par lot" + +#: views_export/views_export.module:76 +msgid "There are no views to be exported at this time." +msgstr "Il n'y a pas de vue à exporter pour le moment." + +#: views_export/views_export.module:108 +msgid "Show only these tags" +msgstr "Montrer uniquement ces étiquettes" + +#: views_export/views_export.module:122 +msgid "Module name" +msgstr "Nom du module" + +#: views_export/views_export.module:123 +msgid "Enter the module name to export code to." +msgstr "Saisissez le nom du module vers lequel exporter le code." + +#: views_export/views_export.module:190 +msgid "Put this in @module.views_default.inc in your modules/@module directory or modules/@module/includes directory" +msgstr "Placez ceci dans @module.views_default.inc dans votre répertoire modules/@module ou modules/@module/includes" + +#: views_export/views_export.module:44 +msgid "use views exporter" +msgstr "utiliser l'exportateur de vues" + +#: views_export/views_export.module:0 +msgid "views_export" +msgstr "views_export" + +#: views_export/views_export.info:0 +msgid "Views exporter" +msgstr "Exportateur de vues" + +#: views_export/views_export.info:0 +msgid "Allows exporting multiple views at once." +msgstr "Permet d'exporter plusieurs vues à la fois" + diff --git a/translations/it.po b/translations/it.po new file mode 100644 index 0000000000000000000000000000000000000000..39ce46f37292e579ba9ecd02bfa21d84a0d06fca --- /dev/null +++ b/translations/it.po @@ -0,0 +1,4233 @@ +msgid "" +msgstr "" +"Suggerimento: \n" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: Drupalitalia \n" +"Language-Team: Italian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: modules/upload.views.inc:56; +#: includes/convert.inc:21; +#: includes/admin.inc:273; +#: views_export/views_export.module:146 +msgid "Description" +msgstr "Descrizione" + +#: includes/admin.inc:2346,2113,2104 +msgid "Remove" +msgstr "Elimina" + +#: handlers/views_handler_filter_in_operator.inc:25; +#: handlers/views_handler_filter_boolean_operator.inc:47; +#: handlers/views_handler_field_boolean.inc:49; +#: plugins/views_plugin_display.inc:1207,803,717,667,659,642,633; +#: plugins/views_plugin_display_attachment.inc:69,63 +msgid "Yes" +msgstr "Si" + +#: handlers/views_handler_filter_in_operator.inc:25; +#: handlers/views_handler_filter_boolean_operator.inc:47; +#: handlers/views_handler_field_boolean.inc:49; +#: plugins/views_plugin_display.inc:1207,811,803,717,667,659,642,633; +#: plugins/views_plugin_display_attachment.inc:69,63 +msgid "No" +msgstr "No" + +#: modules/node/views_handler_field_node_link_edit.inc:26; +#: modules/comment/views_handler_field_comment_link_edit.inc:21; +#: modules/user/views_handler_field_user_link_edit.inc:13 +msgid "edit" +msgstr "modifica" + +#: modules/node/views_handler_field_node_revision_link_delete.inc:35; +#: modules/node/views_handler_field_node_link_delete.inc:26; +#: modules/comment/views_handler_field_comment_link_delete.inc:12; +#: modules/user/views_handler_field_user_link_delete.inc:13 +msgid "delete" +msgstr "elimina" + +#: includes/admin.inc:1308 +msgid "Update" +msgstr "Aggiorna" + +#: includes/admin.inc:564 +msgid "Next" +msgstr "Avanti" + +#: modules/user.views.inc:219,27,23; +#: modules/statistics.views.inc:201; +#: modules/node.views.inc:345; +#: modules/comment.views.inc:231,225 +msgid "User" +msgstr "Utente" + +#: includes/view.inc:1212,1162; +#: includes/admin.inc:211 +msgid "Normal" +msgstr "Normale" + +#: modules/comment/views_handler_filter_node_comment.inc:10; +#: modules/comment/views_handler_field_node_comment.inc:12 +msgid "Disabled" +msgstr "Disattivato" + +#: includes/convert.inc:108,35; +#: includes/admin.inc:844,631,98 +msgid "Delete" +msgstr "Elimina" + +#: includes/admin.inc:2211,1175 +msgid "Add" +msgstr "Aggiungi" + +#: handlers/views_handler_filter_in_operator.inc:15 +msgid "Options" +msgstr "Opzioni" + +#: includes/plugins.inc:135,104 +msgid "List" +msgstr "Elenco" + +#: includes/admin.inc:93; +#: theme/theme.inc:89 +msgid "Edit" +msgstr "Modifica" + +#: handlers/views_handler_filter.inc:136 +msgid "Operator" +msgstr "Operatore" + +#: modules/user.views.inc:240 +msgid "Roles" +msgstr "Ruoli" + +#: modules/system.views.inc:142 +msgid "Status" +msgstr "Status" + +#: modules/user.views.inc:79,59; +#: modules/system.views.inc:69; +#: includes/admin.inc:268; +#: plugins/views_plugin_display.inc:580 +msgid "Name" +msgstr "Nome" + +#: includes/convert.inc:22 +msgid "Operations" +msgstr "Operazioni" + +#: modules/node/views_handler_field_node_link.inc:35; +#: modules/comment/views_handler_field_comment_link.inc:34; +#: modules/user/views_handler_field_user_link.inc:38 +msgid "view" +msgstr "mostra" + +#: modules/comment/views_handler_argument_comment_user_uid.inc:11; +#: modules/user/views_handler_argument_user_uid.inc:17 +msgid "Anonymous" +msgstr "Anonimo" + +#: plugins/views_plugin_display.inc:651 +msgid "Unlimited" +msgstr "Nessun limite" + +#: includes/admin.inc:763,585,212,97; +#: views.module:830,797; +#: views_ui.module:289 +msgid "Default" +msgstr "Predefinito" + +#: includes/convert.inc:109; +#: includes/admin.inc:1326,837,668,632 +msgid "Cancel" +msgstr "Annulla" + +#: modules/node.views.inc:351 +msgid "user" +msgstr "utente" + +#: includes/plugins.inc:224; +#: plugins/views_plugin_access_role.inc:40 +msgid "Role" +msgstr "Ruolo" + +#: includes/admin.inc:1241,1232 +msgid "Settings" +msgstr "Impostazioni" + +#: modules/node.views.inc:140; +#: includes/admin.inc:272,225; +#: plugins/views_plugin_display_page.inc:273 +msgid "Type" +msgstr "Tipo" + +#: modules/upload.views.inc:90; +#: modules/taxonomy.views.inc:135; +#: modules/book.views.inc:57; +#: includes/admin.inc:2113; +#: plugins/views_plugin_display_page.inc:312 +msgid "Weight" +msgstr "Peso" + +#: includes/convert.inc:107 +msgid "This action cannot be undone." +msgstr "Questa azione non può essere annullata." + +#: modules/node.views.inc:358; +#: modules/comment.views.inc:63 +msgid "Body" +msgstr "Corpo" + +#: includes/admin.inc:472 +msgid "Preview" +msgstr "Anteprima" + +#: handlers/views_handler_filter.inc:333 +msgid "Optional" +msgstr "Opzionale" + +#: includes/admin.inc:858,830 +msgid "Save" +msgstr "Salva" + +#: handlers/views_handler_field_numeric.inc:55 +msgid "Thousands separator" +msgstr "Separatore delle migliaia" + +#: modules/search.views.inc:163,106,88,77,23 +msgid "Search" +msgstr "Cerca" + +#: modules/node.views.inc:413,85; +#: modules/comment.views.inc:44; +#: includes/admin.inc:380,269; +#: handlers/views_handler_argument.inc:119; +#: plugins/views_plugin_display.inc:592; +#: plugins/views_plugin_display_page.inc:348,285 +msgid "Title" +msgstr "Titolo" + +#: modules/comment.views.inc:76 +msgid "ID" +msgstr "ID" + +#: plugins/views_plugin_style_list.inc:32 +msgid "List type" +msgstr "Tipo di elenco" + +#: modules/system.views.inc:209; +#: handlers/views_handler_filter_in_operator.inc:193; +#: plugins/views_plugin_access.inc:55 +msgid "Unknown" +msgstr "Sconosciuto" + +#: modules/comment.views.inc:395,384,26,22 +msgid "Comment" +msgstr "Commento" + +#: includes/admin.inc:280 +msgid "Order" +msgstr "Ordine" + +#: plugins/views_plugin_display_block.inc:82 +msgid "Admin" +msgstr "Amministrazione" + +#: modules/user.views.inc:189 +msgid "Signature" +msgstr "Firma" + +#: modules/statistics.views.inc:126 +msgid "Page title" +msgstr "Titolo della pagina" + +#: includes/admin.inc:106 +msgid "Enable" +msgstr "Attiva" + +#: modules/user.views.inc:96 +msgid "E-mail" +msgstr "E-mail" + +#: includes/view.inc:1060 +msgid "Home" +msgstr "Home" + +#: includes/view.inc:1870,1869 +msgid "Argument" +msgstr "Argomento" + +#: modules/upload.views.inc:132 +msgid "Files" +msgstr "Files" + +#: modules/system.views.inc:30,25 +msgid "File" +msgstr "File" + +#: modules/upload.views.inc:112,25 +msgid "Upload" +msgstr "Upload" + +#: includes/admin.inc:721 +msgid "Import" +msgstr "Importa" + +#: includes/admin.inc:975,94; +#: theme/theme.inc:96; +#: views_export/views_export.module:128 +msgid "Export" +msgstr "Esporta" + +#: includes/admin.inc:292; +#: views.module:935; +#: views_export/views_export.module:116 +msgid "Apply" +msgstr "Applica" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:37; +#: modules/taxonomy.views.inc:160 +msgid "Vocabulary" +msgstr "Vocabolario" + +#: includes/plugins.inc:218; +#: includes/admin.inc:3054,1059; +#: plugins/views_plugin_display.inc:723,704,587; +#: plugins/views_plugin_display_attachment.inc:90; +#: plugins/views_plugin_display_block.inc:73; +#: plugins/views_plugin_display_feed.inc:108; +#: plugins/views_plugin_display_page.inc:193 +msgid "None" +msgstr "Nessuno" + +#: plugins/views_plugin_display.inc:897,721 +msgid "Header" +msgstr "Intestazione" + +#: handlers/views_handler_field_date.inc:24 +msgid "Date format" +msgstr "Formato data" + +#: includes/view.inc:1862; +#: includes/admin.inc:3018 +msgid "Field" +msgstr "Campo" + +#: handlers/views_handler_sort_date.inc:31 +msgid "Day" +msgstr "Giorno" + +#: handlers/views_handler_sort_date.inc:32 +msgid "Month" +msgstr "Mese" + +#: handlers/views_handler_sort_date.inc:33 +msgid "Year" +msgstr "Anno" + +#: handlers/views_handler_relationship.inc:78; +#: handlers/views_handler_filter.inc:322; +#: handlers/views_handler_field.inc:146 +msgid "Label" +msgstr "Etichetta" + +#: modules/node.views.inc:373 +msgid "Teaser" +msgstr "Anteprima" + +#: includes/view.inc:1860; +#: includes/plugins.inc:173 +msgid "Fields" +msgstr "Campi" + +#: modules/node/views_plugin_argument_validate_node.inc:29 +msgid "Types" +msgstr "Tipi" + +#: includes/admin.inc:2180 +msgid "Groups" +msgstr "Gruppi" + +#: plugins/views_plugin_display.inc:604 +msgid "Style" +msgstr "Stile" + +#: handlers/views_handler_field_numeric.inc:62 +msgid "Prefix" +msgstr "Prefisso" + +#: handlers/views_handler_field_numeric.inc:68 +msgid "Suffix" +msgstr "Suffisso" + +#: modules/translation/views_handler_filter_node_language.inc:9; +#: modules/node/views_handler_filter_node_language.inc:9; +#: modules/translation.views.inc:32 +msgid "Language" +msgstr "Lingua" + +#: includes/ajax.inc:83 +msgid "Error" +msgstr "Errore" + +#: theme/views-more.tpl.php:15 +msgid "more" +msgstr "leggi tutto" + +#: modules/node/views_plugin_row_node_rss.inc:95 +msgid "read more" +msgstr "leggi tutto" + +#: includes/plugins.inc:60,51 +msgid "Block" +msgstr "Blocco" + +#: modules/taxonomy.views.inc:259; +#: modules/book.views.inc:110 +msgid "Parent" +msgstr "Genitore" + +#: modules/node.views.inc:434 +msgid "Log message" +msgstr "Messaggio di log" + +#: modules/book.views.inc:99,46,36,21 +msgid "Book" +msgstr "Book" + +#: handlers/views_handler_field_date.inc:29 +msgid "Custom" +msgstr "Personalizzato" + +#: modules/comment/views_handler_filter_node_comment.inc:11; +#: modules/comment/views_handler_field_node_comment.inc:14 +msgid "Read only" +msgstr "Sola lettura" + +#: modules/comment/views_handler_filter_node_comment.inc:12; +#: modules/comment/views_handler_field_node_comment.inc:16 +msgid "Read/Write" +msgstr "Lettura/Scrittura" + +#: modules/comment/views_handler_field_comment_link_reply.inc:13 +msgid "reply" +msgstr "rispondi" + +#: modules/comment.views.inc:95 +msgid "Author" +msgstr "Autore" + +#: modules/translation.views.inc:106; +#: modules/upload.views.inc:82; +#: modules/node.views.inc:181,167,159 +msgid "Published" +msgstr "Pubblicato" + +#: includes/admin.inc:1173 +msgid "Rearrange" +msgstr "Riorganizza" + +#: includes/plugins.inc:124 +msgid "Table" +msgstr "Tabella" + +#: includes/view.inc:1881 +msgid "Filters" +msgstr "Filtri" + +#: includes/view.inc:1884 +msgid "filter" +msgstr "filtro" + +#: modules/taxonomy.views.inc:314,303,266,226,170,152,67,24 +msgid "Taxonomy" +msgstr "Tassonomia" + +#: modules/system.views.inc:88; +#: modules/statistics.views.inc:146; +#: includes/admin.inc:388,271; +#: plugins/views_plugin_display_page.inc:202 +msgid "Path" +msgstr "Path" + +#: includes/admin.inc:103 +msgid "Disable" +msgstr "Disabilita" + +#: modules/node.views.inc:195,187 +msgid "Promoted to front page" +msgstr "Promosso in prima pagina" + +#: includes/view.inc:1883 +msgid "Filter" +msgstr "Filtra" + +#: modules/node/views_handler_field_node_revision_link_revert.inc:36 +msgid "revert" +msgstr "ripristina" + +#: includes/admin.inc:98 +msgid "Revert" +msgstr "Ripristina" + +#: modules/poll.views.inc:23 +msgid "Poll" +msgstr "Poll" + +#: modules/user.views.inc:180,171; +#: modules/poll.views.inc:47,38 +msgid "Active" +msgstr "Attivo" + +#: modules/search/views_handler_filter_search.inc:62 +msgid "You must include at least one positive keyword with @count characters or more." +msgstr "Devi inserire almeno una parola-chiave con @count caratteri o più." + +#: modules/search/views_handler_filter_search.inc:42 +msgid "Enter the terms you wish to search for." +msgstr "Inserisci i termini da cercare." + +#: modules/statistics.views.inc:166 +msgid "Referrer" +msgstr "Referrer" + +#: modules/statistics.views.inc:182 +msgid "Hostname" +msgstr "Nome host" + +#: modules/statistics.views.inc:228 +msgid "Timestamp" +msgstr "Data e ora" + +#: includes/plugins.inc:47,39; +#: docs/docs.php:226 +msgid "Page" +msgstr "Pagina" + +#: modules/node/views_plugin_row_node_rss.inc:26 +msgid "Full text" +msgstr "Testo completo" + +#: handlers/views_handler_filter_string.inc:170; +#: handlers/views_handler_filter_numeric.inc:163,148; +#: handlers/views_handler_filter_equality.inc:26 +msgid "Value" +msgstr "Valore" + +#: modules/taxonomy.views.inc:372 +msgid "Taxonomy term" +msgstr "Termine della tassonomia" + +#: modules/taxonomy.views.inc:48 +msgid "Vocabulary name" +msgstr "Nome del vocabolario" + +#: modules/book.views.inc:87 +msgid "Hierarchy" +msgstr "Gerarchia" + +#: modules/taxonomy.views.inc:254 +msgid "Parent term" +msgstr "Termine padre" + +#: docs/docs.php:128 +msgid "default" +msgstr "predefinito" + +#: includes/plugins.inc:64 +msgid "Attachment" +msgstr "Allegato" + +#: modules/system.views.inc:126 +msgid "Size" +msgstr "Dimensione" + +#: modules/upload.views.inc:46 +msgid "upload" +msgstr "caricamento" + +#: modules/user.views.inc:112 +msgid "Picture" +msgstr "Ritratto" + +#: includes/plugins.inc:231; +#: plugins/views_plugin_access_perm.inc:35 +msgid "Permission" +msgstr "Permesso" + +#: modules/user.views.inc:139 +msgid "Last access" +msgstr "Ultimo accesso" + +#: includes/admin.inc:2177,210,203 +msgid "" +msgstr "" + +#: handlers/views_handler_field_date.inc:53 +msgid "%time ago" +msgstr "%time fa" + +#: handlers/views_handler_filter_string.inc:40 +msgid "Contains" +msgstr "Contiene" + +#: views_ui.info:0; +#: views.info:0; +#: views_export/views_export.info:0 +msgid "Views" +msgstr "Viste" + +#: plugins/views_plugin_display.inc:1399 +msgid "Override" +msgstr "Sovrascrivi" + +#: includes/admin.inc:980,95; +#: theme/theme.inc:101 +msgid "Clone" +msgstr "Clona" + +#: includes/admin.inc:618,213,98; +#: views.module:834,794 +msgid "Overridden" +msgstr "Modificato (overridden)" + +#: plugins/views_plugin_display_page.inc:302,230 +msgid "Menu" +msgstr "Menu" + +#: handlers/views_handler_argument.inc:263 +msgid "Summary, sorted ascending" +msgstr "Sommario, ordinato in modo crescente" + +#: handlers/views_handler_argument.inc:270 +msgid "Summary, sorted descending" +msgstr "Sommario, ordinato in modo decrescente" + +#: handlers/views_handler_sort.inc:55; +#: plugins/views_plugin_style_table.inc:149 +msgid "Ascending" +msgstr "Crescente" + +#: handlers/views_handler_sort.inc:55; +#: plugins/views_plugin_style_table.inc:149 +msgid "Descending" +msgstr "Decrescente" + +#: plugins/views_plugin_display.inc:681 +msgid "Access" +msgstr "Accesso" + +#: plugins/views_plugin_display.inc:907 +msgid "Text to display at the top of the view. May contain an explanation or links or whatever you like. Optional." +msgstr "Testo da visualizzare in cima alla vista. Può contenere maggiori informazioni, links o altro a tua discrezione. Questo campo è opzionale." + +#: plugins/views_plugin_display.inc:913,721 +msgid "Footer" +msgstr "Piè di pagina" + +#: plugins/views_plugin_display_page.inc:343 +msgid "Normal menu item" +msgstr "Voce del menu (Normal menu item)" + +#: plugins/views_plugin_display.inc:929,721 +msgid "Empty text" +msgstr "Testo vuoto" + +#: handlers/views_handler_filter.inc:201 +msgid "Expose" +msgstr "Visualizza all'utente" + +#: includes/admin.inc:282 +msgid "Up" +msgstr "Su" + +#: includes/admin.inc:283 +msgid "Down" +msgstr "Giù" + +#: includes/admin.inc:3022 +msgid "Sortable" +msgstr "Ordinabile" + +#: handlers/views_handler_argument.inc:146 +msgid "Wildcard" +msgstr "Caratteri jolly" + +#: includes/view.inc:1867; +#: includes/admin.inc:464 +msgid "Arguments" +msgstr "Argomenti" + +#: includes/admin.inc:755,580 +msgid "View name must be alphanumeric or underscores only." +msgstr "Il nome della vista deve contenere caratteri alfabetici o il simbolo \"_\"" + +#: modules/views.views.inc:23 +msgid "Random" +msgstr "Casuale" + +#: modules/taxonomy.views.inc:292,208,129; +#: handlers/views_handler_argument_numeric.inc:57,45; +#: handlers/views_handler_argument_many_to_one.inc:109,95 +msgid "Uncategorized" +msgstr "Non categorizzato" + +#: modules/translation/views_handler_relationship_translation.inc:23; +#: handlers/views_handler_argument.inc:102 +msgid "All" +msgstr "Tutti" + +#: includes/view.inc:1882 +msgid "filters" +msgstr "filtri" + +#: plugins/views_plugin_display.inc:575 +msgid "Basic settings" +msgstr "Impostazioni di base" + +#: modules/profile.views.inc:40,20 +msgid "Profile" +msgstr "Profilo" + +#: handlers/views_handler_filter.inc:213 +msgid "Hide" +msgstr "Nascondi" + +#: modules/node/views_plugin_argument_validate_node.inc:49 +msgid "Node ID" +msgstr "ID nodo" + +#: handlers/views_handler_filter_boolean_operator.inc:61,16; +#: handlers/views_handler_field_boolean.inc:51 +msgid "True" +msgstr "Vero" + +#: handlers/views_handler_filter_boolean_operator.inc:61; +#: handlers/views_handler_field_boolean.inc:51 +msgid "False" +msgstr "Falso" + +#: plugins/views_plugin_style_grid.inc:33 +msgid "Number of columns" +msgstr "Numero di colonne" + +#: modules/node.views.inc:242 +msgid "Link" +msgstr "Link" + +#: includes/admin.inc:204; +#: plugins/views_plugin_style.inc:76 +msgid "" +msgstr "" + +#: includes/admin.inc:3020; +#: handlers/views_handler_field_prerender_list.inc:40; +#: plugins/views_plugin_row_fields.inc:47; +#: plugins/views_plugin_style_summary_unformatted.inc:30 +msgid "Separator" +msgstr "Separatore" + +#: modules/upload.views.inc:43; +#: modules/node.views.inc:639,627,616,484,372,357,90,29,24; +#: modules/comment.views.inc:255,220,214 +msgid "Node" +msgstr "Node" + +#: modules/node.views.inc:213,204; +#: modules/comment.views.inc:157 +msgid "Moderated" +msgstr "Moderato" + +#: plugins/views_plugin_style_grid.inc:38 +msgid "Alignment" +msgstr "Allineamento" + +#: includes/convert.inc:30 +msgid "Convert" +msgstr "Conversione" + +#: includes/admin.inc:456 +msgid "Display" +msgstr "Mostra" + +#: handlers/views_handler_filter_string.inc:35,29; +#: handlers/views_handler_filter_numeric.inc:40 +msgid "=" +msgstr "=" + +#: plugins/views_plugin_display.inc:751 +msgid "Theme" +msgstr "Tema" + +#: modules/node/views_plugin_row_node_rss.inc:28 +msgid "Title only" +msgstr "Solo il titolo" + +#: includes/plugins.inc:114 +msgid "Grid" +msgstr "Griglia" + +#: modules/node.views.inc:231,222 +msgid "Sticky" +msgstr "In rilievo" + +#: plugins/views_plugin_display_attachment.inc:37 +msgid "Both" +msgstr "Entrambi" + +#: includes/plugins.inc:25; +#: docs/docs.php:137 +msgid "Defaults" +msgstr "Predefinite" + +#: includes/plugins.inc:80,72; +#: docs/docs.php:281 +msgid "Feed" +msgstr "Feed" + +#: handlers/views_handler_sort_date.inc:30 +msgid "Hour" +msgstr "Ora" + +#: handlers/views_handler_sort_date.inc:29 +msgid "Minute" +msgstr "Minuto" + +#: handlers/views_handler_sort_date.inc:28 +msgid "Second" +msgstr "Secondo" + +#: handlers/views_handler_sort_date.inc:26 +msgid "Granularity" +msgstr "Granularità" + +#: includes/form.inc:249 +msgid "Validation error, please try again. If this error persists, please contact the site administrator." +msgstr "Errore di validazione, riprovare. Se l'errore persiste, contattare l'amministratore del sito." + +#: theme/theme.inc:307 +msgid "sort by @s" +msgstr "ordina per @s" + +#: views_ui.info:0 +msgid "Views UI" +msgstr "Viste UI" + +#: handlers/views_handler_argument_string.inc:60 +msgid "Case" +msgstr "Maiuscole/minuscole" + +#: modules/comment.views.inc:207 +msgid "Thread" +msgstr "Thread" + +#: plugins/views_plugin_display.inc:999,954,874 +msgid "settings" +msgstr "impostazioni" + +#: modules/translation.views.inc:91,84,81 +msgid "Translations" +msgstr "Traduzioni" + +#: modules/translation.views.inc:98 +msgid "Translation status" +msgstr "Stato della traduzione" + +#: modules/node/views_plugin_row_node_view.inc:32; +#: modules/comment/views_plugin_row_comment_view.inc:21 +msgid "Display links" +msgstr "Link della visualizzazione" + +#: includes/admin.inc:552 +msgid "View type" +msgstr "Tipo di vista" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:33; +#: modules/node/views_plugin_argument_validate_node.inc:47 +msgid "Argument type" +msgstr "Tipo di argomento" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:35; +#: modules/taxonomy.views.inc:196,96 +msgid "Term ID" +msgstr "ID Termine" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:23; +#: modules/taxonomy/views_handler_field_term_node_tid.inc:55 +msgid "Vocabularies" +msgstr "Vocabolari" + +#: modules/taxonomy.views.inc:56 +msgid "Vocabulary ID" +msgstr "ID vocabolario" + +#: plugins/views_plugin_display_block.inc:68 +msgid "Block settings" +msgstr "Impostazioni blocco" + +#: modules/upload.views.inc:125,113 +msgid "Attached files" +msgstr "File allegati" + +#: modules/taxonomy.views.inc:148 +msgid "Term description" +msgstr "Descrizione del termine" + +#: modules/taxonomy.views.inc:213,116,70 +msgid "Term" +msgstr "Termine" + +#: plugins/views_plugin_display.inc:641 +msgid "Use pager" +msgstr "Usa paginatore" + +#: plugins/views_plugin_display.inc:831 +msgid "Offset" +msgstr "Slittamento" + +#: modules/node/views_handler_filter_node_type.inc:9 +msgid "Node type" +msgstr "Tipo di nodo" + +#: includes/view.inc:1889 +msgid "Relationships" +msgstr "Relazioni" + +#: includes/admin.inc:2104 +msgid "Remove this item" +msgstr "Rimuovi questa voce" + +#: modules/system/views_handler_argument_file_fid.inc:13 +msgid "No title" +msgstr "Nessun titolo" + +#: plugins/views_plugin_display_page.inc:188 +msgid "Page settings" +msgstr "Impostazioni pagina" + +#: modules/book.views.inc:116 +msgid "Book parent" +msgstr "Libro genitore" + +#: modules/book.views.inc:30 +msgid "Top level book" +msgstr "Libro top level" + +#: includes/admin.inc:1060,270,243; +#: views_export/views_export.module:146 +msgid "Tag" +msgstr "Etichetta" + +#: handlers/views_handler_filter_string.inc:70 +msgid "Does not contain" +msgstr "Non contiene" + +#: handlers/views_handler_filter_numeric.inc:26 +msgid "Is less than" +msgstr "È meno di" + +#: handlers/views_handler_filter_numeric.inc:32 +msgid "Is less than or equal to" +msgstr "È minore o uguale a" + +#: handlers/views_handler_filter_string.inc:28; +#: handlers/views_handler_filter_numeric.inc:38; +#: handlers/views_handler_filter_equality.inc:15 +msgid "Is equal to" +msgstr "È uguale a" + +#: handlers/views_handler_filter_numeric.inc:50 +msgid "Is greater than or equal to" +msgstr "È maggiore o uguale a" + +#: handlers/views_handler_filter_numeric.inc:56 +msgid "Is greater than" +msgstr "È maggiore di" + +#: handlers/views_handler_filter_string.inc:34; +#: handlers/views_handler_filter_numeric.inc:44; +#: handlers/views_handler_filter_equality.inc:16 +msgid "Is not equal to" +msgstr "Non è uguale a" + +#: includes/view.inc:1892,1891; +#: includes/admin.inc:2319 +msgid "Relationship" +msgstr "Relazione" + +#: modules/search.views.inc:72 +msgid "Score" +msgstr "Punteggio" + +#: includes/admin.inc:398,367 +msgid "Query" +msgstr "Query" + +#: includes/admin.inc:2110 +msgid "No fields available." +msgstr "Nessun campo disponibile." + +#: modules/search/views_handler_filter_search.inc:66 +msgid "Search for either of the two terms with uppercase OR. For example, cats OR dogs." +msgstr "Cerca ognuno dei due termini con OR maiuscolo. Per esempio, gatti OR cani." + +#: modules/statistics.views.inc:107 +msgid "Browser session ID of user that visited page." +msgstr "Sfoglia la sessione ID dell'utente che ha visitato la pagina." + +#: modules/statistics.views.inc:127 +msgid "Title of page visited." +msgstr "Titolo della pagina visitata" + +#: modules/statistics.views.inc:147 +msgid "Internal path to page visited (relative to Drupal root.)" +msgstr "Percorso interno della pagina visitata (relativo al percorso principale di Drupal)." + +#: modules/statistics.views.inc:167 +msgid "Referrer URI." +msgstr "Referrer URI." + +#: modules/statistics.views.inc:183 +msgid "Hostname of user that visited the page." +msgstr "Nome host dell'utente che ha visitato la pagina." + +#: modules/statistics.views.inc:213 +msgid "Time in milliseconds that the page took to load." +msgstr "Tempo (in millisecondi) di caricamento della pagina." + +#: modules/statistics.views.inc:229 +msgid "Timestamp of when the page was visited." +msgstr "Data e ora (timestamp) di quando la pagina è stata visitata." + +#: views.install:31 +msgid "Stores the general data for a view." +msgstr "Memorizza i dati generali di una vista." + +#: views.install:37 +msgid "The view ID of the field, defined by the database." +msgstr "L'ID vista del campo, definito dal database." + +#: views.install:45 +msgid "The unique name of the view. This is the primary field views are loaded from, and is used so that views may be internal and not necessarily in the database. May only be alphanumeric characters plus underscores." +msgstr "Il nome univoco di una vista. Questo è il campo primario dal quale sono caricate le viste e viene usato in modo che le viste possano essere interne e non necessariamente nel database. Può contenere solo caratteri alfanumerici e underscore (_)." + +#: views.install:51 +msgid "A description of the view for the admin interface." +msgstr "Una descrizione della vista nell'interfaccia di amministrazione." + +#: views.install:61 +msgid "A chunk of PHP code that can be used to provide modifications to the view prior to building." +msgstr "Un pezzo di codice PHP che può essere usato per fornire modifiche alla vista prima della costruzione." + +#: views.install:68 +msgid "What table this view is based on, such as node, user, comment, or term." +msgstr "Su quale tabella si basa questa vista, tipo nodo, utente, commento o termine." + +#: views.install:74 +msgid "A boolean to indicate whether or not this view may have its query cached." +msgstr "Un booleano per indicare se questa vista può avere la sua query memorizzata in cache o no." + +#: views.install:82 +msgid "Stores information about each display attached to a view." +msgstr "Memorizza informazioni su ogni visualizzazione allegata a una vista." + +#: views.install:89 +msgid "The view this display is attached to." +msgstr "La vista alla quale è allegata questa visualizzazione." + +#: views.install:111 +msgid "The type of the display. Usually page, block or embed, but is pluggable so may be other things." +msgstr "Il tipo di visualizzazione. In genere pagina, blocco o integrato, ma è inseribile per cui può essere oltre cose." + +#: views.install:97 +msgid "An identifier for this display; usually generated from the display_plugin, so should be something like page or page_1 or block_2, etc." +msgstr "Un identificatore per questa visualizzazione; di solito generato dal display_plugin, quindi dovrebbe essere qualcosa tipo pagina o page_1 o block_2, ecc." + +#: views.install:116 +msgid "The order in which this display is loaded." +msgstr "L'ordine in cui viene caricata questa visualizzazione." + +#: views.install:120 +msgid "A serialized array of options for this display; it contains options that are generally only pertinent to that display plugin type." +msgstr "Un array serializzato di opzioni per questa visualizzazione; contiene opzioni che in genere sono pertinenti solo a quel tipo di visualizzazione." + +#: views.info:0 +msgid "Create customized lists and queries from your database." +msgstr "Crea elenchi personalizzati di query dal tuo database." + +#: handlers/views_handler_field_date.inc:30 +msgid "Time ago" +msgstr "Tempo fa" + +#: handlers/views_handler_field_date.inc:36 +msgid "Custom date format" +msgstr "Formato della data paersonalizzato" + +#: handlers/views_handler_sort_formula.inc:24 +msgid "views_handler_sort_formula missing default: @formula" +msgstr "views_handler_sort_formula manca predefinito: @formula" + +#: handlers/views_handler_argument.inc:248 +msgid "Display all values" +msgstr "Mostra tutti i valori" + +#: handlers/views_handler_argument.inc:258 +msgid "Display empty text" +msgstr "Mostra testo vuoto" + +#: includes/plugins.inc:94 +msgid "Displays rows one after another." +msgstr "Visualizza le righe una dopo l'altra." + +#: includes/plugins.inc:105 +msgid "Displays rows as an HTML list." +msgstr "Visualizza le righe come in una lista HTML." + +#: includes/plugins.inc:125 +msgid "Displays rows in a table." +msgstr "Visualizza le righe in una tabella." + +#: includes/plugins.inc:174 +msgid "Displays the fields with an optional template." +msgstr "Visualizza i campi con un template opzionale." + +#: modules/node.views.inc:628,617 +msgid "Display the node with standard node view." +msgstr "Visualizza il nodo con la standard node view." + +#: modules/node.views.inc:57 +msgid "Nid" +msgstr "Nid" + +#: modules/node.views.inc:108; +#: modules/comment.views.inc:133 +msgid "Post date" +msgstr "Data di inserimento" + +#: modules/node.views.inc:124 +msgid "Updated date" +msgstr "Data di aggiornamento" + +#: modules/node/views_handler_field_node.inc:32 +msgid "Link this field to its node" +msgstr "Collega questo campo al suo nodo" + +#: handlers/views_handler_field_boolean.inc:53 +msgid "On" +msgstr "On" + +#: handlers/views_handler_field_boolean.inc:53 +msgid "Off" +msgstr "Off" + +#: includes/view.inc:1861 +msgid "fields" +msgstr "campi" + +#: modules/system.views.inc:49 +msgid "File ID" +msgstr "ID file" + +#: handlers/views_handler_filter.inc:465 +msgid "" +msgstr "" + +#: modules/node/views_plugin_row_node_rss.inc:24; +#: handlers/views_handler_field_prerender_list.inc:29 +msgid "Display type" +msgstr "Tipo di visualizzazione" + +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:125; +#: modules/taxonomy/views_handler_argument_taxonomy.inc:18 +msgid "No name" +msgstr "Nessun nome" + +#: handlers/views_handler_filter_string.inc:41 +msgid "contains" +msgstr "contiene" + +#: plugins/views_plugin_display.inc:752 +msgid "Information" +msgstr "Informazioni" + +#: includes/admin.inc:266 +msgid "Sort by" +msgstr "Ordina per" + +#: includes/plugins.inc:144,93 +msgid "Unformatted" +msgstr "Non formattato" + +#: modules/user/views_handler_field_user_mail.inc:19 +msgid "No link" +msgstr "Nessun link" + +#: theme/views-ui-edit-tab.tpl.php:31 +msgid "View settings" +msgstr "Impostazioni vista" + +#: handlers/views_handler_field_boolean.inc:24 +msgid "Output format" +msgstr "Formato di output" + +#: handlers/views_handler_filter_string.inc:58 +msgid "Starts with" +msgstr "Inizia con" + +#: handlers/views_handler_field_numeric.inc:38 +msgid "Precision" +msgstr "Precisione" + +#: views.module:629 +msgid "Broken handler @table.@field" +msgstr "Errato gestore @table.@field" + +#: views.module:747 +msgid "Skipping broken view @view" +msgstr "Salta la vista @view errata" + +#: views_ui.module:159 +msgid "The converter will make a best-effort attempt to convert a Views 1 view to Views 2. This conversion is not reliable; you will very likely have to make adjustments to your view to get it to match. You can import Views 1 views through the normal Import tab." +msgstr "Il convertitore farà del suo meglio per convertire una vista Views 1 a Views 2. Tale conversione non è affidabile; molto probabilmente si dovranno apportare degli aggiustamenti alla vista per farla corrispondere. È possibile importare una vista Views 1 tramite la scheda Importa normale." + +#: views_ui.module:265 +msgid "Changes cannot be made to a locked view." +msgstr "Non possono essere fatte modifiche a una vista bloccata." + +#: views.install:57 +msgid "A tag used to group/sort views in the admin interface" +msgstr "Un contrassegno usato per raggruppare/ordinare le viste nell'interfaccia di amministrazione" + +#: views.install:104 +msgid "The title of the display, viewable by the administrator." +msgstr "Il titolo della visualizzazione, visibile dall'amministratore." + +#: views.install:131 +msgid "A special cache used to store objects that are being edited; it serves to save state in an ordinarily stateless environment." +msgstr "Una cache speciale usata per memorizzare gli oggetti che vengono modificati; serve per salvare lo stato in un ambiente generalmente privo di stato." + +#: views.install:136 +msgid "The session ID this cache object belongs to." +msgstr "L'ID di sessione a cui appartiene questo oggetto cache." + +#: views.install:141 +msgid "The name of the view this cache is attached to." +msgstr "Il nome della vista alla quale è allegata questa cache." + +#: views.install:146 +msgid "The name of the object this cache is attached to; this essentially represents the owner so that several sub-systems can use this cache." +msgstr "Il nome dell'oggetto al quale è allegata questa cache; essenzialmente questo rappresenta il proprietario così che diversi sotto-sistemi possono usare questa cache." + +#: views.install:153 +msgid "The time this cache was created or updated." +msgstr "L'ora in cui questa cache è stata creata o aggiornata." + +#: views.install:157 +msgid "Serialized data being stored." +msgstr "I dati serializzati sono in memorizzazione." + +#: views_ui.info:0 +msgid "Administrative interface to views. Without this module, you cannot create or edit your views." +msgstr "Interfaccia di amministrazione delle viste. Senza questo modulo non si possono creare o modificare le viste." + +#: docs/docs.php:127 +msgid "Emulates the default Drupal front page; you may set the default home page path to this view to make it your front page." +msgstr "Emula la prima pagina predefinita di Drupal; si può impostare il percorso della home page predefinita a questa vista per renderla la propria prima pagina." + +#: docs/docs.php:349 +msgid "Front page feed" +msgstr "Feed prima pagina" + +#: handlers/views_handler_argument.inc:121 +msgid "The title to use when this argument is present. It will override the title of the view and titles from previous arguments. You can use percent substitution here to replace with argument titles. Use \"%1\" for the first argument, \"%2\" for the second, etc." +msgstr "Il titolo da usare quando questo argomento è presente. Modificherà il titolo della vista e i titoli degli argomenti precedenti. Qui è possibile usare un simbolo percentuale di sostituzione da rimpiazzare con i titoli degli argomenti. Usare \"%1\" per il primo argomento, \"%2\" per il secondo, ecc." + +#: handlers/views_handler_argument.inc:134 +msgid "Action to take if argument is not present" +msgstr "Azione da intraprendere se l'argomento non è presente" + +#: handlers/views_handler_argument.inc:149 +msgid "If this value is received as an argument, the argument will be ignored; i.e, \"all values\"" +msgstr "Se questo valore viene ricevuto come argomento, l'argomento sarà ignorato; vale a dire, \"tutti i valori\"" + +#: handlers/views_handler_argument.inc:155 +msgid "Wildcard title" +msgstr "Titolo jolly" + +#: handlers/views_handler_argument.inc:158 +msgid "The title to use for the wildcard in substitutions elsewhere." +msgstr "Il titolo da usare come jolly nelle sostituzioni altrove." + +#: handlers/views_handler_argument.inc:181 +msgid "Validator options" +msgstr "Opzioni del validatore" + +#: handlers/views_handler_argument.inc:186 +msgid "Validator" +msgstr "Validatore" + +#: handlers/views_handler_argument.inc:190 +msgid "" +msgstr "" + +#: handlers/views_handler_argument.inc:229 +msgid "Action to take if argument does not validate" +msgstr "Azione da intraprendere se l'argomento non valida" + +#: handlers/views_handler_argument.inc:253 +msgid "Hide view / Page not found (404)" +msgstr "Nascondi vista / Pagina non trovata (404)" + +#: handlers/views_handler_argument.inc:277 +msgid "Provide default argument" +msgstr "Stabilire l'argomento predefinito" + +#: handlers/views_handler_argument.inc:310 +msgid "Provide default argument options" +msgstr "Stabilire le opzioni dell'argomento predefinito" + +#: handlers/views_handler_argument.inc:320 +msgid "Default argument type" +msgstr "Tipo di argomento predefinito" + +#: handlers/views_handler_sort.inc:66; +#: handlers/views_handler_relationship.inc:133; +#: handlers/views_handler_filter.inc:592; +#: handlers/views_handler_field.inc:227; +#: handlers/views_handler_argument.inc:708 +msgid "Broken/missing handler" +msgstr "Gestore rotto/mancante" + +#: handlers/views_handler_sort.inc:74; +#: handlers/views_handler_relationship.inc:141; +#: handlers/views_handler_filter.inc:600; +#: handlers/views_handler_field.inc:235; +#: handlers/views_handler_argument.inc:716 +msgid "The handler for this item is broken or missing and cannot be used. If a module provided the handler and was disabled, re-enabling the module may restore it. Otherwise, you should probably delete this item." +msgstr "Il gestore di questa voce è rotto o mancante e non può essere usato. Se un modulo che ha fornito un gestore viene disattivato, riattivandolo può ripristinarlo. Altrimenti si dovrà probabilmente eliminare questa voce." + +#: handlers/views_handler_argument_date.inc:29 +msgid "Current date" +msgstr "Data corrente" + +#: handlers/views_handler_argument_date.inc:30 +msgid "Current node's creation time" +msgstr "Data di inserimento del nodo corrente" + +#: handlers/views_handler_argument_date.inc:31 +msgid "Current node's update time" +msgstr "Data di aggiornamento del nodo corrente" + +#: handlers/views_handler_argument_numeric.inc:30; +#: handlers/views_handler_argument_many_to_one.inc:45 +msgid "Allow multiple terms per argument." +msgstr "Consente termini multipli per argomento." + +#: handlers/views_handler_argument_many_to_one.inc:46 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3 (for OR) or 1,2,3 (for AND)." +msgstr "Se selezioato, gli utenti possono inserire nel form argomenti multipli nella forma di 1+2+3 (per OR) oppure 1,2,3 (per AND)." + +#: handlers/views_handler_argument_string.inc:95; +#: handlers/views_handler_argument_many_to_one.inc:53 +msgid "Allow multiple arguments to work together." +msgstr "Consenti agli argomenti multipli di funzionare insieme." + +#: handlers/views_handler_argument_string.inc:96; +#: handlers/views_handler_argument_many_to_one.inc:54 +msgid "If selected, multiple instances of this argument can work together, as though multiple terms were supplied to the same argument. This setting is not compatible with the \"Reduce duplicates\" setting." +msgstr "Se selezionato, le istanze multiple di questo argomento possono funzionare insieme, come se dei termini multipli fossero forniti allo stesso argomento. Questa impostazione non è compatibile con l'impostazione \"Riduci i duplicati\"." + +#: handlers/views_handler_argument_string.inc:102; +#: handlers/views_handler_argument_many_to_one.inc:60 +msgid "Do not display items with no value in summary" +msgstr "Non visualizzare le voci che non hanno alcun valore nel sommario" + +#: handlers/views_handler_argument_numeric.inc:61; +#: handlers/views_handler_argument_many_to_one.inc:113 +msgid "Invalid input" +msgstr "Inserimento non valido" + +#: handlers/views_handler_argument_null.inc:21 +msgid "Fail basic validation if any argument is given" +msgstr "Boccia la validazione di base se non viene dato alcun argomento" + +#: handlers/views_handler_argument_null.inc:23 +msgid "By checking this field, you can use this to make sure views with more arguments than necessary fail validation." +msgstr "Selezionando questo campo, lo si può usare per assicurarsi che le viste con più argomenti del necessario non superino la validazione." + +#: handlers/views_handler_argument_numeric.inc:31 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3 or 1,2,3." +msgstr "Se selezionato gli utenti possono inserire argomenti multipli nella forma di 1+2+3 o 1,2,3." + +#: handlers/views_handler_argument_numeric.inc:37 +msgid "Exclude the argument" +msgstr "Escludi l'argomento" + +#: handlers/views_handler_argument_numeric.inc:38 +msgid "If selected, the numbers entered in the argument will be excluded rather than limiting the view." +msgstr "Se selezionato i numeri inseriti nell'argomento saranno esclusi anziché limitare la vista." + +#: handlers/views_handler_argument_string.inc:44 +msgid "Glossary mode" +msgstr "Modalità glossario" + +#: handlers/views_handler_argument_string.inc:45 +msgid "Glossary mode applies a limit to the number of characters used in the argument, which allows the summary view to act as a glossary." +msgstr "La modalitù glossario applica un limite al numero di caratteri usati nell'argomento, il che permette alla vista sommario di agire come un glossario." + +#: handlers/views_handler_argument_string.inc:51 +msgid "Character limit" +msgstr "Limite caratteri" + +#: handlers/views_handler_argument_string.inc:52 +msgid "How many characters of the argument to filter against. If set to 1, all fields starting with the letter in the argument would be matched." +msgstr "Quanti sono i caratteri dell'argomento con cui filtrare. Se impostato a 1, tutti i campi che iniziano con la lettera nell'argomento corrisponderanno." + +#: handlers/views_handler_argument_string.inc:61 +msgid "When printing the argument result, how to transform the case." +msgstr "Nello scrivere il risultato dell'argomento, come trasformare i caratteri." + +#: handlers/views_handler_argument_string.inc:77,63 +msgid "No transform" +msgstr "Nessuna trasformazione" + +#: handlers/views_handler_argument_string.inc:78,64 +msgid "Upper case" +msgstr "Maiuscole" + +#: handlers/views_handler_argument_string.inc:79,65 +msgid "Lower case" +msgstr "Minuscole" + +#: handlers/views_handler_argument_string.inc:80,66 +msgid "Capitalize first letter" +msgstr "Prima lettera maiuscola" + +#: handlers/views_handler_argument_string.inc:81,67 +msgid "Capitalize each word" +msgstr "Ogni parola in maiuscolo" + +#: handlers/views_handler_argument_string.inc:74 +msgid "Case in path" +msgstr "Caratteri nel percorso" + +#: handlers/views_handler_argument_string.inc:75 +msgid "When printing url paths, how to transform the of the argument. Do not use this unless with Postgres as it uses case sensitive comparisons." +msgstr "Nello scrivere i percorsi degli url, come trasformare il \"dell'argomento\". Non usare se non con Postgres, poiché esso utilizza la comparazione delle maiuscole/minuscole." + +#: handlers/views_handler_argument_string.inc:88 +msgid "Transform spaces to dashes in URL" +msgstr "Trasforma gli spazi negli URL in trattini" + +#: handlers/views_handler_field.inc:148 +msgid "The label for this field that will be displayed to end users if the style requires it." +msgstr "L'etichetta per questo campo che sarà mostrata agli utenti finali se lo stile lo richiede." + +#: handlers/views_handler_field.inc:152 +msgid "Exclude from display" +msgstr "Escludi dalla visualizzazione" + +#: handlers/views_handler_field.inc:154 +msgid "Check this box to not display this field, but still load it in the view. Use this option to not show a grouping field in each record, or when doing advanced theming." +msgstr "Selezionare questa casella per non mostrare questo campo, caricandolo comunque nella vista. Usare questa opzione per non mostrare un campo raggruppato in ogni documento, o quando si fa della temizzazione avanzata." + +#: handlers/views_handler_field_boolean.inc:26 +msgid "Yes/No" +msgstr "Sì/No" + +#: handlers/views_handler_field_boolean.inc:27 +msgid "True/False" +msgstr "True/False" + +#: handlers/views_handler_field_boolean.inc:28 +msgid "On/Off" +msgstr "On/Off" + +#: handlers/views_handler_field_boolean.inc:34 +msgid "Reverse" +msgstr "Inverti" + +#: handlers/views_handler_field_boolean.inc:35 +msgid "If checked, true will be displayed as false." +msgstr "Se selezionato, true verrà mostrato come false." + +#: handlers/views_handler_field_date.inc:37 +msgid "If \"Custom\", see the PHP docs for date formats. If \"Time ago\" this is the the number of different units to display, which defaults to two." +msgstr "Se è \"Personalizzato\", consultare i documenti PHP per i formati della data. Se è \"Tempo fa\", questo è il numero di unità differenti da mostrare, che si riduce a due." + +#: handlers/views_handler_field_numeric.inc:32 +msgid "Round" +msgstr "Arrotonda" + +#: handlers/views_handler_field_numeric.inc:33 +msgid "If checked, the number will be rounded." +msgstr "Se selezionato, il numero verrà arrotondato." + +#: handlers/views_handler_field_numeric.inc:40 +msgid "Specify how many digits to print after the decimal point." +msgstr "Specificare quante cifre scrivere dopo la virgola decimale." + +#: handlers/views_handler_field_numeric.inc:47 +msgid "Decimal point" +msgstr "Virgola decimale" + +#: handlers/views_handler_field_numeric.inc:49 +msgid "What single character to use as a decimal point." +msgstr "Il carattere singolo da utilizzare come virgola decimale." + +#: handlers/views_handler_field_numeric.inc:57 +msgid "What single character to use as the thousands separator." +msgstr "Il carattere singolo da utilizzare come separatore delle migliaia." + +#: handlers/views_handler_field_numeric.inc:64 +msgid "Text to put before the number, such as currency symbol." +msgstr "Testo da inserire prima del numero, tipo il simbolo della valuta." + +#: handlers/views_handler_field_numeric.inc:70 +msgid "Text to put after the number, such as currency symbol." +msgstr "Testo da inserire dopo il numero, tipo il simbolo della valuta." + +#: handlers/views_handler_field_prerender_list.inc:31; +#: plugins/views_plugin_style_list.inc:33 +msgid "Unordered list" +msgstr "Elenco non ordinato" + +#: handlers/views_handler_field_prerender_list.inc:32; +#: plugins/views_plugin_style_list.inc:33 +msgid "Ordered list" +msgstr "Elenco ordinato" + +#: handlers/views_handler_field_prerender_list.inc:33 +msgid "Simple separator" +msgstr "Separatore semplice" + +#: handlers/views_handler_field_prerender_list.inc:48 +msgid "Empty list text" +msgstr "Elenco di testo vuoto" + +#: handlers/views_handler_field_prerender_list.inc:50 +msgid "If the list is empty, you may enter text here that will be displayed." +msgstr "Se l'elenco è vuoto, qui si può inserire del testo da visualizzare." + +#: modules/statistics/views_handler_field_accesslog_path.inc:31; +#: handlers/views_handler_field_url.inc:24 +msgid "Display as link" +msgstr "Visualizza come link" + +#: handlers/views_handler_filter.inc:206 +msgid "This item is currently not exposed. If you expose it, users will be able to change the filter as they view it." +msgstr "Questa voce attualmente non è esposta. Se la si espone, gli utenti potranno cambiare il filtro quando la visualizzano." + +#: handlers/views_handler_filter.inc:218 +msgid "This item is currently exposed. If you hide it, users will not be able to change the filter as they view it." +msgstr "Questa voce attualmente è esposta. Se la si nasconde gli utenti non potranno modificare il filtro quando lo vedono." + +#: handlers/views_handler_filter.inc:289 +msgid "Unlock operator" +msgstr "Sblocca operatore" + +#: handlers/views_handler_filter.inc:290 +msgid "When checked, the operator will be exposed to the user" +msgstr "Quando selezionato, l'operatore sarà esposto all'utente" + +#: handlers/views_handler_filter.inc:296 +msgid "Operator identifier" +msgstr "Identificatore operatore" + +#: handlers/views_handler_filter.inc:298 +msgid "This will appear in the URL after the ? to identify this operator." +msgstr "Questo apparirà nell'URL dopo il ? per identificare questo operatore." + +#: handlers/views_handler_filter.inc:315 +msgid "Filter identifier" +msgstr "Identificatore filtro" + +#: handlers/views_handler_filter.inc:317 +msgid "This will appear in the URL after the ? to identify this filter. Cannot be blank." +msgstr "Questo apparirà nell'URL dopo il ? per identificare questo filtro. Non può essere vuoto." + +#: handlers/views_handler_filter.inc:334 +msgid "This exposed filter is optional and will have added options to allow it not to be set." +msgstr "Questo filtro esposto è opzionale e avrà aggiunte delle opzioni per consentirgli di non essere impostato." + +#: handlers/views_handler_filter.inc:340 +msgid "Force single" +msgstr "Forza singolo" + +#: handlers/views_handler_filter.inc:341 +msgid "Force this exposed filter to accept only one option." +msgstr "Forza questo filtro esposta ad accettare solo un'opzione." + +#: handlers/views_handler_filter.inc:347 +msgid "Remember" +msgstr "Ricorda" + +#: handlers/views_handler_filter.inc:348 +msgid "Remember the last setting the user gave this filter." +msgstr "Ricorda l'ultima impostazione data dall'utente a questo filtro." + +#: handlers/views_handler_filter.inc:359 +msgid "The identifier is required if the filter is exposed." +msgstr "Se il filtro è esposto, è richiesto l'identificatore." + +#: handlers/views_handler_filter.inc:364 +msgid "This identifier is not allowed." +msgstr "Questo identificatore non è consentito." + +#: handlers/views_handler_filter_string.inc:111; +#: handlers/views_handler_filter_numeric.inc:251; +#: handlers/views_handler_filter_in_operator.inc:175; +#: handlers/views_handler_filter_boolean_operator.inc:58 +msgid "exposed" +msgstr "esposto" + +#: handlers/views_handler_filter_date.inc:24 +msgid "Value type" +msgstr "Tipo di valore" + +#: handlers/views_handler_filter_date.inc:26 +msgid "A date in any machine readable format. CCYY-MM-DD HH:MM:SS is preferred." +msgstr "Una data in qualsiasi formato leggibile dal computer. È preferibile CCYY-MM-DD HH:MM:SS." + +#: handlers/views_handler_filter_date.inc:27 +msgid "An offset from the current time such as \"+1 day\" or \"-2 hours and 30 minutes\"" +msgstr "Una deviazione dall'ora corrente, tipo \"+1 giorno\" o \"-2 ore e 30 minuti\"" + +#: handlers/views_handler_filter_date.inc:87,83,77 +msgid "Invalid date format." +msgstr "Formato data non corretto." + +#: handlers/views_handler_filter_in_operator.inc:37 +msgid "Limit list to selected items" +msgstr "Limita l'elenco alle voci selezionate" + +#: handlers/views_handler_filter_in_operator.inc:38 +msgid "If checked, the selected items presented to the user will be the only ones selected here." +msgstr "Se attivato, le voci selezionate presentate all'utente saranno solamente quelle selezionate qui." + +#: handlers/views_handler_filter_many_to_one.inc:32; +#: handlers/views_handler_filter_in_operator.inc:57 +msgid "Is one of" +msgstr "È uno di" + +#: handlers/views_handler_filter_in_operator.inc:58 +msgid "Is not one of" +msgstr "Non è uno di" + +#: handlers/views_handler_filter_many_to_one.inc:33 +msgid "Is all of" +msgstr "È tutto di" + +#: handlers/views_handler_filter_many_to_one.inc:34 +msgid "Is none of" +msgstr "Non è nessuno di" + +#: handlers/views_handler_filter_numeric.inc:28 +msgid "<" +msgstr "<" + +#: handlers/views_handler_filter_numeric.inc:34 +msgid "<=" +msgstr "<=" + +#: handlers/views_handler_filter_numeric.inc:46 +msgid "!=" +msgstr "!=" + +#: handlers/views_handler_filter_numeric.inc:52 +msgid ">=" +msgstr ">=" + +#: handlers/views_handler_filter_numeric.inc:58 +msgid ">" +msgstr ">" + +#: handlers/views_handler_filter_numeric.inc:62 +msgid "Is between" +msgstr "È tra" + +#: handlers/views_handler_filter_numeric.inc:64 +msgid "between" +msgstr "tra" + +#: handlers/views_handler_filter_numeric.inc:68 +msgid "Is not between" +msgstr "Non è tra" + +#: handlers/views_handler_filter_numeric.inc:70 +msgid "not between" +msgstr "non tra" + +#: handlers/views_handler_filter_string.inc:80; +#: handlers/views_handler_filter_numeric.inc:79 +msgid "Is empty (NULL)" +msgstr "È vuoto (NULL)" + +#: handlers/views_handler_filter_string.inc:82; +#: handlers/views_handler_filter_numeric.inc:81 +msgid "empty" +msgstr "vuoto" + +#: handlers/views_handler_filter_string.inc:86; +#: handlers/views_handler_filter_numeric.inc:85 +msgid "Is not empty (NULL)" +msgstr "Non è vuoto (NULL)" + +#: handlers/views_handler_filter_string.inc:88; +#: handlers/views_handler_filter_numeric.inc:87 +msgid "not empty" +msgstr "non vuoto" + +#: handlers/views_handler_filter_numeric.inc:175 +msgid "Min" +msgstr "Min" + +#: handlers/views_handler_filter_numeric.inc:181 +msgid "And max" +msgstr "E max" + +#: handlers/views_handler_filter_numeric.inc:181 +msgid "And" +msgstr "E" + +#: handlers/views_handler_filter_numeric.inc:257 +msgid "@min and @max" +msgstr "@min e @max" + +#: handlers/views_handler_filter_string.inc:46 +msgid "Contains any word" +msgstr "Contiene ogni parola" + +#: handlers/views_handler_filter_string.inc:47 +msgid "has word" +msgstr "ha la parola" + +#: handlers/views_handler_filter_string.inc:52 +msgid "Contains all words" +msgstr "Contiene tutte le parole" + +#: handlers/views_handler_filter_string.inc:53 +msgid "has all" +msgstr "ha tutte" + +#: handlers/views_handler_filter_string.inc:59 +msgid "begins" +msgstr "inizia" + +#: handlers/views_handler_filter_string.inc:64 +msgid "Ends with" +msgstr "Termina con" + +#: handlers/views_handler_filter_string.inc:65 +msgid "ends" +msgstr "termina" + +#: handlers/views_handler_filter_string.inc:71 +msgid "!has" +msgstr "!has" + +#: handlers/views_handler_filter_string.inc:126 +msgid "Case sensitive" +msgstr "Maiuscole/minuscole" + +#: handlers/views_handler_filter_string.inc:128 +msgid "Case sensitive filters may be faster. MySQL might ignore case sensitivity." +msgstr "I filtri sensibili a maiuscole/minuscole possono essere più v eloci. MySQL potrebbe ignorare le maiuscole/minuscole." + +#: handlers/views_handler_relationship.inc:80 +msgid "The label for this relationship that will be displayed only administratively." +msgstr "L'etichetta per questa relazione che verrà mostrata solo in amministrazione." + +#: handlers/views_handler_relationship.inc:85 +msgid "Require this relationship" +msgstr "Richiedi questa relazione" + +#: handlers/views_handler_relationship.inc:86 +msgid "If required, items that do not contain this relationship will not appear." +msgstr "Se richiesta, le voci che non contengono questa relazione non compariranno." + +#: handlers/views_handler_sort.inc:38 +msgid "asc" +msgstr "asc" + +#: handlers/views_handler_sort.inc:42 +msgid "desc" +msgstr "disc" + +#: handlers/views_handler_sort.inc:54 +msgid "Sort order" +msgstr "Ordina per" + +#: handlers/views_handler_sort_date.inc:35 +msgid "The granularity is the smallest unit to use when determining whether two dates are the same; for example, if the granularity is \"Year\" then all dates in 1999, regardless of when they fall in 1999, will be considered the same date." +msgstr "La granularità è la più piccola unità usata quando si determina se due date sono uguali; per esempio, se la granularità è \"Anno\" allora tutte le date in 1999, indipendentemente da quando cadono nel 1999, saranno considerate la stessa data." + +#: includes/admin.inc:36 +msgid "If you enable the advanced help module, Views will provide more and better help. Hide this message." +msgstr "Se si attiva il modulo di aiuto avanzato, Views fornirà un aiuto ulteriore e migliore. Nascondi questo messaggio." + +#: includes/admin.inc:39 +msgid "If you install the advanced help module from !href, Views will provide more and better help. Hide this message." +msgstr "Se si installa il modulo advanced help module da !href, Viste fornirà maggior e miglior aiuto. Nascondi questo messaggio." + +#: includes/admin.inc:112 +msgid "Warning! Broken view!" +msgstr "Attenzione! Vista non funzionante!" + +#: includes/view.inc:1663; +#: includes/admin.inc:127 +msgid "Broken" +msgstr "Corrotto" + +#: includes/admin.inc:186 +msgid "Install the advanced help module for the getting started" +msgstr "Installare il modulo advanced help per iniziare" + +#: includes/admin.inc:189 +msgid "Not sure what to do? Try the \"!getting-started\" page." +msgstr "Non sai fare? Consulta la pagina \"!getting-started\"." + +#: includes/admin.inc:208 +msgid "Storage" +msgstr "Memoria" + +#: includes/admin.inc:259 +msgid "Displays" +msgstr "Visualizzazioni" + +#: includes/admin.inc:369 +msgid "These queries were run during view rendering:" +msgstr "Queste query sono state eseguite durante il rendering della vista:" + +#: includes/admin.inc:374 +msgid "[@time ms]" +msgstr "[@time ms]" + +#: includes/admin.inc:377 +msgid "Other queries" +msgstr "Altre query" + +#: includes/admin.inc:385 +msgid "This display has no path." +msgstr "Questa visualizzazione non ha un percorso." + +#: includes/admin.inc:390 +msgid "Query build time" +msgstr "Tempo di costruzione query" + +#: includes/admin.inc:392,391,390 +msgid "@time ms" +msgstr "@time ms" + +#: includes/admin.inc:391 +msgid "Query execute time" +msgstr "Tempo di esecuzione query" + +#: includes/admin.inc:392 +msgid "View render time" +msgstr "Tempo di resa della vista" + +#: includes/admin.inc:398 +msgid "No query was run" +msgstr "Non è stato eseguita alcuna query" + +#: includes/admin.inc:405 +msgid "Unable to preview due to validation errors." +msgstr "Non è possibile creare l'anteprima a causa di un errore di validazione." + +#: includes/admin.inc:466 +msgid "Separate arguments with a / as though they were a URL path." +msgstr "Separare gli argomenti con / come se fossero un percorso URL." + +#: includes/admin.inc:510 +msgid "Clone view %view" +msgstr "Clona la vista %view" + +#: includes/convert.inc:20; +#: includes/admin.inc:710,523 +msgid "View name" +msgstr "Nome della vista" + +#: includes/admin.inc:524 +msgid "This is the unique name of the view. It must contain only alphanumeric characters and underscores; it is used to identify the view internally and to generate unique theming template names for this view. If overriding a module provided view, the name must not be changed or instead a new view will be created." +msgstr "Questo è il nome univoco della vista. Può contenere solo caratteri alfanumerici e underscore (_); viene usato per identificare la vista internamente e per generare nomi di modelli di temi univoci per questa vista. Se si modifica la vista fornita da un modulo, il nome non deve essere cambiato altrimenti verrà creata una nuova vista." + +#: includes/admin.inc:1872,532 +msgid "View description" +msgstr "Descrizione vista" + +#: includes/admin.inc:1873,533 +msgid "This description will appear on the Views administrative UI to tell you what the view is about." +msgstr "La descrizione che comparirà nella UI di amministrazione di Viste per dare informazioni sulla vista." + +#: includes/admin.inc:1879,539 +msgid "View tag" +msgstr "Etichetta vista" + +#: includes/admin.inc:1880,540 +msgid "Enter an optional tag for this view; it is used only to help sort views on the administrative page." +msgstr "Inserire un'etichetta opzionale per questa vista; viene usata solo per ordinare le viste nella pagina di amministrazione." + +#: includes/admin.inc:553 +msgid "The view type is the primary table for which information is being retrieved. The view type controls what arguments, fields, sort criteria and filters are available, so once this is set it cannot be changed." +msgstr "Il tipo di vista è la tabella primaria per la quale l'informazione viene ricuperata. Il tipo di vista regola quali argomenti, campi, criteri di ordinamento sono disponibili, per cui una volta che ciò è impostato non può essere modificato." + +#: includes/admin.inc:586 +msgid "You must use a unique name for this view." +msgstr "Bisogna usare un nome univoco per questa vista." + +#: includes/admin.inc:619 +msgid "Are you sure you want to revert the view %name?" +msgstr "Sicuro di voler tornare alla vista %name?" + +#: includes/admin.inc:620 +msgid "Reverting the view will delete the view that is in the database, reverting it to the original default view. Any changes you have made will be lost and cannot be recovered." +msgstr "Tornando alla vista eliminerà la vista nel database, riportandola alla vista originale predefinita. Qualsiasi modifica fatta sarà persa e non potrà essere recuperata." + +#: includes/convert.inc:105; +#: includes/admin.inc:623 +msgid "Are you sure you want to delete the view %name?" +msgstr "Sicuro di voler eliminare la vista %name?" + +#: includes/admin.inc:624 +msgid "Deleting a view cannot be undone." +msgstr "L'eliminazione di una vista non può essere annullata." + +#: includes/admin.inc:641 +msgid "The view has been deleted." +msgstr "La vista è stata eliminata." + +#: includes/admin.inc:653 +msgid "There is no lock on view %view to break." +msgstr "Non ci sono lock nella vista %view da interrompere." + +#: includes/admin.inc:663 +msgid "Are you sure you want to break the lock on view %name?" +msgstr "Si è sicuri di voler interrompere il blocco sulla vista %name?" + +#: includes/admin.inc:666 +msgid "By breaking this lock, any unsaved changes made by !user will be lost!" +msgstr "Se si interrompe questo blocco, qualsiasi modifica non salvata fatta da !user andrà persa." + +#: includes/admin.inc:667 +msgid "Break lock" +msgstr "Interrompi il blocco" + +#: includes/admin.inc:677 +msgid "The lock has been broken and you may now edit this view." +msgstr "Il blocco è stato rimosso e ora è possibile modificare questa vista." + +#: includes/admin.inc:684 +msgid "Edit view %view" +msgstr "Modifica la vista %view" + +#: includes/admin.inc:711 +msgid "Enter the name to use for this view if it is different from the source view. Leave blank to use the name of the view." +msgstr "Inserire il nome da usare per questa vista, se è diverso dalla vista sorgente. Lasciare vuoto per usare il nome della vista." + +#: includes/admin.inc:716 +msgid "Paste view code here" +msgstr "Incollare qui il codice della vista" + +#: includes/admin.inc:738 +msgid "Unable to interpret view code." +msgstr "Impossibile interpretare il codice della vista." + +#: includes/admin.inc:746 +msgid "You are importing a view created in Views version 1. You may need to adjust some parameters to work correctly in version 2." +msgstr "Si sta importando una vista creata con Views versione 1. Può essere necessario regolare alcuni parametri per funzionare correttamente nella versione 2." + +#: includes/admin.inc:749 +msgid "That view is not compatible with this version of Views." +msgstr "La vista non è compatibile con questa versione di Viste." + +#: includes/admin.inc:764 +msgid "A view by that name already exists; please choose a different name" +msgstr "Una vista con quel nome esiste già; si prega di scegliere un nome differente" + +#: includes/admin.inc:773 +msgid "Display plugin @plugin is not available." +msgstr "Il plugin della visualizzazione @plugin non è disponibile." + +#: includes/admin.inc:780 +msgid "Style plugin @plugin is not available." +msgstr "Il plugin dello stile @plugin non è disponibile." + +#: includes/admin.inc:786 +msgid "Row plugin @plugin is not available." +msgstr "Il plugin della riga @plugin non è disponibile." + +#: includes/admin.inc:796 +msgid "@type handler @table.@field is not available." +msgstr "Il gestore di @type @table.@field non è disponibile." + +#: includes/admin.inc:809 +msgid "Unable to import view." +msgstr "Impossibile importare la vista." + +#: includes/admin.inc:882 +msgid "The view has been saved." +msgstr "La vista è stata salvata." + +#: includes/admin.inc:926 +msgid "Unknown or missing table name" +msgstr "Nome della tabella sconosciuto o mancante" + +#: includes/admin.inc:931 +msgid "Click on an item to edit that item's details." +msgstr "Selezionare una voce per modificarne i dettagli." + +#: includes/admin.inc:934 +msgid "This view has a broken default display and cannot be used." +msgstr "Questa vista ha una visualizzazione predefinita guasta e non può essere usata." + +#: includes/admin.inc:976; +#: theme/theme.inc:97 +msgid "Export this view" +msgstr "Esporta questa vista" + +#: includes/admin.inc:981; +#: theme/theme.inc:102 +msgid "Create a copy of this view" +msgstr "Crea una copia di questa vista" + +#: includes/admin.inc:992 +msgid "View \"!display\"" +msgstr "Visualizza \"!display\"" + +#: includes/admin.inc:993 +msgid "Go to the real page for this display" +msgstr "Vai alla pagina effettiva di questa vista" + +#: includes/admin.inc:1137 +msgid "Invalid" +msgstr "Scorretto" + +#: includes/admin.inc:1138 +msgid "Error: Display @display refers to a plugin named '@plugin', but that plugin doesn't exist!" +msgstr "Errore: La visualizzazione @display fa riferimento a un plugin denominato '@plugin', ma quel plugin non esiste!" + +#: includes/admin.inc:2590,2505,2437,2262,1213 +msgid "Error: handler for @table > @field doesn't exist!" +msgstr "Errore: il gestore per @table > @field non esiste!" + +#: includes/admin.inc:1237; +#: plugins/views_plugin_display.inc:616,598 +msgid "Missing style plugin" +msgstr "Plugin stile mancante" + +#: includes/admin.inc:1241; +#: plugins/views_plugin_display.inc:626,611 +msgid "Change settings for this style" +msgstr "Modifica le impostazioni per questo stile" + +#: includes/admin.inc:1244 +msgid "  Style: !style" +msgstr "  Stile: !style" + +#: includes/admin.inc:1275 +msgid "Invalid display id found while regenerating tabs" +msgstr "Trovato id visualizzazione non corretto mentre le schede venivano rigenerate" + +#: includes/admin.inc:1326 +msgid "Ok" +msgstr "Ok" + +#: includes/admin.inc:1597 +msgid "Unable to initialize default display" +msgstr "Impossibile inizializzare la visualizzazione predefinita" + +#: includes/admin.inc:1629 +msgid "Add display" +msgstr "Aggiungi" + +#: includes/admin.inc:1669 +msgid "Remove display" +msgstr "Rimuovi visualizzazione" + +#: includes/admin.inc:1680 +msgid "Restore display" +msgstr "Ripristina visualizzazione" + +#: includes/admin.inc:1752 +msgid "Analyze" +msgstr "Analizza" + +#: includes/admin.inc:1772 +msgid "This view has only a default display and therefore will not be placed anywhere on your site; perhaps you want to add a page or a block display." +msgstr "Questa vista ha solamente una visualizzazione predefinita per cui non sarà collocata da nessuna parte nel sito; si consiglia di aggiungere una visualizzazione pagina o blocco." + +#: includes/admin.inc:1784 +msgid "View analysis" +msgstr "Analisi vista" + +#: includes/admin.inc:1793 +msgid "View analysis can find nothing to report." +msgstr "L'analisi vista non ha trovato niente da riferire." + +#: includes/admin.inc:1867 +msgid "View details" +msgstr "Dettagli vista" + +#: includes/admin.inc:2583,2498,2430,2255,2163,2017,1962,1908 +msgid "Invalid display id @display" +msgstr "Scorretto id visualizzazione @display" + +#: includes/admin.inc:1966 +msgid "Configure @type" +msgstr "Configura @type" + +#: includes/admin.inc:2021 +msgid "Rearrange @type" +msgstr "Riordina @type" + +#: includes/admin.inc:2064 +msgid "Broken field @id" +msgstr "field @id guasto" + +#: includes/admin.inc:2169 +msgid "Add @type" +msgstr "Aggiungi @type" + +#: includes/admin.inc:2199 +msgid "!group: !field" +msgstr "!group: !field" + +#: includes/admin.inc:2208 +msgid "There are no @types available to add." +msgstr "Non ci sono @types disponibili da aggiungere." + +#: includes/admin.inc:2305 +msgid "Do not use a relationship" +msgstr "Non usare una relazione" + +#: includes/admin.inc:2332 +msgid "Configure @type %item" +msgstr "Configura @type %item" + +#: includes/admin.inc:2445 +msgid "Configure extra settings for @type %item" +msgstr "Configurare le impostazioni extra per @type %item" + +#: includes/admin.inc:2510 +msgid "Change summary style for @type %item" +msgstr "Modificare lo stile dommario per @type %item" + +#: includes/admin.inc:2547,2533 +msgid "Internal error: broken plugin." +msgstr "Errore interno: plugin guasto." + +#: includes/admin.inc:2597 +msgid "Configure summary style for @type %item" +msgstr "Configurare lo stile sommario per @type %item" + +#: includes/admin.inc:2689 +msgid "Clear Views' cache" +msgstr "Azzera la cache di Viste" + +#: includes/admin.inc:2695 +msgid "Add Views signature to all SQL queries" +msgstr "Aggiungere la firma di Viste a tutte le query SQL" + +#: includes/admin.inc:2696 +msgid "All Views-generated queries will include a special 'VIEWS' = 'VIEWS' string in the WHERE clause. This makes identifying Views queries in database server logs simpler, but should only be used when troubleshooting." +msgstr "Tutte le query generate da Viste includeranno una stringa speciale 'VIEWS' = 'VIEWS' nella clausola WHERE. Ciò rende semplice l'identificazione delle query di Viste nei registri del database del server, ma dovrebbe essere usata solo nella risoluzione di problemi." + +#: includes/admin.inc:2702 +msgid "Disable views data caching" +msgstr "Disattiva il caching dei dati delle viste" + +#: includes/admin.inc:2703 +msgid "Views caches data about tables, modules and views available, to increase performance. By checking this box, Views will skip this cache and always rebuild this data when needed. This can have a serious performance impact on your site." +msgstr "Viste memorizza in cache i dati sulle tabelle, sui moduli e sulle viste disponibili per incrementare le prestazioni. Selezionando questa casella, Viste salterà questa cache e ricostruirà sempre questi dati quando necessario. Ciò può avere un forte impatto sulle prestazioni del sito." + +#: includes/admin.inc:2709 +msgid "Ignore missing advanced help module" +msgstr "Ignora il modulo mancante advanced help" + +#: includes/admin.inc:2710 +msgid "Views uses the advanced help module to provide help text; if this module is not present Views will complain, unless this setting is checked." +msgstr "Viste usa il modulo advanced help per fornire un testo di aiuto; se questo modulo non è presente Viste protesterà, a meno che questa impostazione sia selezionata." + +#: includes/admin.inc:2716 +msgid "Show query above live preview" +msgstr "Mostra la query sopra l'anteprima in diretta" + +#: includes/admin.inc:2717 +msgid "The live preview feature will show you the output of the view you're creating, as well as the view. Check here to show the query and other information above the view; leave this unchecked to show that information below the view." +msgstr "La funzione anteprima in diretta mostrerà il risultato della vista che si sta creando, come pure la vista. Selezionare qui per mostrare la query e altre informazioni sopra la vista; lasciare deselezionato per mostrare quelle informazioni sotto la vista." + +#: includes/admin.inc:2723 +msgid "Show other queries run during render during live preview" +msgstr "Mostra altre esecuzioni di query durante il rendering dell'anteprima in diretta" + +#: includes/admin.inc:2724 +msgid "Drupal has the potential to run many queries while a view is being rendered. Checking this box will display every query run during view render as part of the live preview." +msgstr "Drupal ha la capacità di eseguire molte query mentre viene fatto il rendering di una vista. Selezionando questa casella si visualizzeranno tutte le query durante il rendering della vista come parte dell'anteprima in diretta." + +#: includes/admin.inc:2730 +msgid "Do not show hover links over views" +msgstr "Non mostrare i link hover nelle viste." + +#: includes/admin.inc:2731 +msgid "To make it easier to administrate your views, Views provides 'hover' links to take you to the edit and export screen of a view whenever the view is used. This can be distracting on some themes, though; if it is problematic, you can turn it off here." +msgstr "Per facilitare l'amministrazione delle viste, Viste fornisce i link 'hover' per andare alle videate di modifica ed esportazione di una vista ogniqualvolta essa viene usata. In alcuni temi ciò può distrarre; se è un problema si possono si può disattivare l'hover." + +#: includes/admin.inc:2737 +msgid "Enable views performance statistics via the Devel module" +msgstr "Attiva le statistiche delle prestazioni delle viste tramite il modulo Devel" + +#: includes/admin.inc:2738 +msgid "Check this to enable some Views query and performance statistics if Devel is installed." +msgstr "Selezionarlo per attivare alcune statistiche delle query e delle prestazioni di Viste, nel caso sia installato Devel." + +#: includes/admin.inc:2744 +msgid "Disable javascript with Views" +msgstr "Disattiva javascript con Viste" + +#: includes/admin.inc:2745 +msgid "If you are having problems with the javascript, you can disable it here; the Views UI should degrade and still be usable without javascript, it just not as good." +msgstr "Se si hanno problemi con javascript, è possibile disattivarlo qui; L'interfaccia Views UI dovrebbe degradare ed essere ancora funzionante senza javascript, semplicemente non è altrettanto bella." + +#: includes/admin.inc:2753 +msgid "Page region to output performance statistics" +msgstr "Area della pagina in cui riprodurre le statistiche delle prestazioni" + +#: includes/admin.inc:2766 +msgid "The cache has been cleared." +msgstr "La memoria cache è stata azzerata." + +#: includes/admin.inc:2932 +msgid "Error: missing @component" +msgstr "Errore: @component mancante" + +#: includes/admin.inc:3019 +msgid "Column" +msgstr "Colonna" + +#: includes/admin.inc:3026 +msgid "Default sort" +msgstr "Ordine predefinito" + +#: includes/ajax.inc:82 +msgid "Server reports invalid input error." +msgstr "Il server riporta un errore di inserimento scorretto." + +#: includes/convert.inc:14 +msgid "There are no Views 1 views stored in the database to convert." +msgstr "Nel database non ci sono viste Views 1 da convertire." + +#: includes/convert.inc:33 +msgid "Converted" +msgstr "Convertita" + +#: includes/convert.inc:68 +msgid "The table below lists Views version 1 views that are stored in the database. You can either convert them to work in Views version 2, or delete them. The views are convertible only if there is no Views 2 view with the same name." +msgstr "La tabella seguente elenca le viste di Views versione 1 memorizzatre nel database. È possibile sia convertirle per funzionare con Views versione 2, sia eliminarle. Le viste sono convertibili solo se non ci sono viste Views 2 con lo stesso nome." + +#: includes/convert.inc:79 +msgid "Unable to find view." +msgstr "Impossibile trovare la vista." + +#: includes/convert.inc:89 +msgid "Unable to convert view." +msgstr "Impossibile convertire la vista" + +#: includes/convert.inc:117 +msgid "The view has been deleted" +msgstr "La vista è stata eliminata" + +#: includes/handlers.inc:43 +msgid "Handler @handler include tried to loop infinitely!" +msgstr "Il gestore incluso @handler ha provato troppi loop all'infinito!" + +#: includes/handlers.inc:269 +msgid "!group: !title" +msgstr "!group: !title" + +#: includes/handlers.inc:507 +msgid "Reduce duplicates" +msgstr "Riduci duplicati" + +#: includes/handlers.inc:508 +msgid "This filter can cause items that have more than one of the selected options to appear as duplicate results. If this filter causes duplicate results to occur, this checkbox can reduce those duplicates; however, the more terms it has to search for, the less performant the query will be, so use this with caution." +msgstr "Questo filtro può causare che le voci con più di un'opzione selezionata compaiano come risultati duplicati. Se con questo filtro si verificano dei risultati duplicati, selezionando questa casella si possono ridurre quei duplicati; tuttavia, con più termini la query deve cercare, minore sarà la sua prestazione, quindi usare il filtro con cautela." + +#: includes/plugins.inc:26 +msgid "Default settings for this view." +msgstr "Impostazioni predefinite per questa vista." + +#: includes/plugins.inc:40 +msgid "Display the view as a page, with a URL and menu links." +msgstr "Visualizza la vista come una pagina, con un URL e i link del menu." + +#: includes/plugins.inc:52 +msgid "Display the view as a block." +msgstr "Visualizza la vista come blocco." + +#: includes/plugins.inc:65 +msgid "Attachments added to other displays to achieve multiple views in the same view." +msgstr "Allegati aggiunti ad altre visualizzazione per ottenere viste multiple nella stessa vista." + +#: includes/plugins.inc:73 +msgid "Display the view as a feed, such as an RSS feed." +msgstr "Visualizza la vista come feed, tipo un feed RSS." + +#: includes/plugins.inc:115 +msgid "Displays rows in a grid." +msgstr "Visualizza le righe in una griglia." + +#: includes/plugins.inc:136 +msgid "Displays the default summary as a list." +msgstr "Visualizza il sommario predefinito come un elenco." + +#: includes/plugins.inc:145 +msgid "Displays the summary unformatted, with option for one after another or inline." +msgstr "Visualizza il sommario non formattato, con le opzioni una dopo l'altra o allineate." + +#: includes/plugins.inc:154 +msgid "RSS Feed" +msgstr "Feed RSS" + +#: includes/plugins.inc:155 +msgid "Generates an RSS feed from a view." +msgstr "Genera un feed RSS da una vista." + +#: includes/plugins.inc:187 +msgid "Fixed entry" +msgstr "Voce fissa" + +#: includes/plugins.inc:203,191 +msgid "PHP Code" +msgstr "Codice PHP" + +#: includes/plugins.inc:207 +msgid "Numeric" +msgstr "Numerico" + +#: includes/plugins.inc:219 +msgid "Will be available to all users." +msgstr "Sarà disponibile a tutti gli utenti." + +#: includes/plugins.inc:225 +msgid "Access will be granted to users with any of the specified roles." +msgstr "L'accesso sarà garantito agli utenti con uno dei ruoli specificati." + +#: includes/plugins.inc:232 +msgid "Access will be granted to users with the specified permission string." +msgstr "L'accesso sarà garantito agli utenti con la stringa di permesso specificata." + +#: includes/view.inc:261 +msgid "set_display() called with invalid display id @display." +msgstr "set_display() chiamato con l'id di visualizzazione @display non corretto." + +#: includes/view.inc:1863 +msgid "field" +msgstr "campo" + +#: includes/view.inc:1868 +msgid "arguments" +msgstr "argomenti" + +#: includes/view.inc:1874 +msgid "Sort criteria" +msgstr "Criteri di ordinamento" + +#: includes/view.inc:1875 +msgid "sort criteria" +msgstr "criteri di ordinamento" + +#: includes/view.inc:1876 +msgid "Sort criterion" +msgstr "Criterio di ordinamento" + +#: includes/view.inc:1877 +msgid "sort criterion" +msgstr "criterio di ordinamento" + +#: includes/view.inc:1890 +msgid "relationships" +msgstr "relazioni" + +#: js/ajax_view.js:0; +#: js/ajax.js:0 +msgid "An error occurred at @path." +msgstr "Si è verificato un errore in @path." + +#: js/tabs.js:0 +msgid "jQuery UI Tabs: Mismatching fragment identifier." +msgstr "UI Schede jQuery: indentificatore frammenti discrepanti." + +#: js/tabs.js:0 +msgid "jQuery UI Tabs: Not enough arguments to add tab." +msgstr "UI Schede jQuery: non ci sono argomenti a sufficienza per aggiungere una scheda." + +#: modules/book.views.inc:31 +msgid "The book the node is in." +msgstr "Il libro in cui si trova il nodo." + +#: modules/book.views.inc:58 +msgid "The weight of the book page." +msgstr "Il peso della pagina del libro." + +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:24; +#: modules/comment.views.inc:202; +#: modules/book.views.inc:69 +msgid "Depth" +msgstr "Profondità" + +#: modules/book.views.inc:70 +msgid "The depth of the book page in the hierarchy; top level books have a depth of 1." +msgstr "La profondità della pagina del libro nella gerarchia; i libri top level hanno una profondità 1." + +#: modules/book.views.inc:88 +msgid "The order of pages in the book hierarchy. Remember to sort by weight too if you want exactly the right order." +msgstr "L'ordine delle pagine nella gerarchia del libro. Ricordarsi di ordinare anche per peso se si vuole proprio l'ordine corretto." + +#: modules/book.views.inc:111 +msgid "The parent book node." +msgstr "Il nodo del libro genitore." + +#: modules/comment.views.inc:27 +msgid "Comments are responses to node content." +msgstr "I commenti sono risposte al contenuto del nodo." + +#: modules/comment.views.inc:45 +msgid "The title of the comment." +msgstr "Il titolo del commento." + +#: modules/comment.views.inc:64 +msgid "The text of the comment." +msgstr "Il testo del commento." + +#: modules/comment.views.inc:77 +msgid "The comment ID of the field" +msgstr "L'ID commento del campo" + +#: modules/comment.views.inc:96 +msgid "The name of the poster." +msgstr "Il nome dell'autore." + +#: modules/comment.views.inc:114 +msgid "Author's website" +msgstr "Sito web dell'autore" + +#: modules/comment.views.inc:115 +msgid "The website address of the comment's author. Can be a link. The homepage can also be linked with the Name field. Will be empty if posted by a registered user." +msgstr "L'indirizzo del sito web dell'autore del commento. Può essere un link. Anche la homepage può essere collegata con il campo Nome. Sarà vuoto se inserito da un utente registrato." + +#: modules/comment.views.inc:134 +msgid "Date and time of when the comment was posted." +msgstr "Data e ora di quando è stato inserito il commento." + +#: modules/comment.views.inc:149 +msgid "In moderation" +msgstr "In moderazione" + +#: modules/comment.views.inc:150 +msgid "Whether or not the comment is currently in moderation." +msgstr "Se al momento il commento è o non è in moderazione." + +#: modules/comment.views.inc:167 +msgid "View link" +msgstr "Link guarda" + +#: modules/comment.views.inc:168 +msgid "Provide a simple link to view the comment." +msgstr "Fornisce un link semplice per vedere il commento." + +#: modules/user.views.inc:202; +#: modules/node.views.inc:250; +#: modules/comment.views.inc:176 +msgid "Edit link" +msgstr "Link modifica" + +#: modules/comment.views.inc:177 +msgid "Provide a simple link to edit the comment." +msgstr "Fornisce un link semplice per modificare il commento." + +#: modules/user.views.inc:210; +#: modules/node.views.inc:472,258; +#: modules/comment.views.inc:185 +msgid "Delete link" +msgstr "Link elimina" + +#: modules/comment.views.inc:186 +msgid "Provide a simple link to delete the comment." +msgstr "Fornisce un link semplice per eliminare il commento." + +#: modules/comment.views.inc:194 +msgid "Reply-to link" +msgstr "Link rispondi" + +#: modules/comment.views.inc:195 +msgid "Provide a simple link to reply to the comment." +msgstr "Fornisce un link semplice per rispondere al commento." + +#: modules/comment.views.inc:203 +msgid "Display the depth of the comment if it is threaded." +msgstr "Visualizza la profondità del commento se questo è in una sequenza (thread)." + +#: modules/comment.views.inc:208 +msgid "Sort by the threaded order. This will keep child comments together with their parents." +msgstr "Ordina per sequenza (thread). Ciò terrà i commenti figli assieme ai loro genitori." + +#: modules/comment.views.inc:215 +msgid "The node the comment is a reply to." +msgstr "Il nodo del quale il commento è una risposta." + +#: modules/comment.views.inc:226 +msgid "The user who wrote the comment." +msgstr "L'utente che ha scritto il commento." + +#: modules/comment.views.inc:236 +msgid "Parent CID" +msgstr "CID genitore" + +#: modules/comment.views.inc:237 +msgid "The Comment ID of the parent comment." +msgstr "Il Comment ID del commento genitore." + +#: modules/comment.views.inc:247,242 +msgid "Parent comment" +msgstr "Commento genitore" + +#: modules/comment.views.inc:243 +msgid "The parent comment." +msgstr "Il commento genitore." + +#: modules/comment.views.inc:268 +msgid "Last comment time" +msgstr "Ora dell'ultimo commento" + +#: modules/comment.views.inc:269 +msgid "Date and time of when the last comment was posted." +msgstr "Data e ora di quando è stato inserito l'ultimo commento." + +#: modules/comment.views.inc:284 +msgid "Last comment author" +msgstr "L'autore dell'ultimo commento" + +#: modules/comment.views.inc:285 +msgid "The name of the author of the last posted comment." +msgstr "Il nome dell'autore che ha inserito l'ultimo commento." + +#: modules/comment.views.inc:297 +msgid "Comment count" +msgstr "Numero commenti" + +#: modules/comment.views.inc:298 +msgid "The number of comments a node has." +msgstr "Il numero dei commenti di un nodo." + +#: modules/comment.views.inc:316 +msgid "Updated/commented date" +msgstr "Data di aggiornamento/inserimento commento" + +#: modules/comment.views.inc:317 +msgid "The most recent of last comment posted or node updated time." +msgstr "L'ora del più recente degli ultimi commenti inseriti o dell'ultimo aggiornamento del nodo." + +#: modules/comment.views.inc:340 +msgid "New comments" +msgstr "Nuovi commenti" + +#: modules/comment.views.inc:341 +msgid "The number of new comments on the node." +msgstr "Il numero di nuovi commenti al nodo." + +#: modules/comment.views.inc:349 +msgid "Comment status" +msgstr "Stato commenti" + +#: modules/comment.views.inc:350 +msgid "Whether comments are enabled or disabled on the node." +msgstr "Se i commenti sono attivati o disattivati per il nodo." + +#: modules/comment.views.inc:364 +msgid "User posted or commented" +msgstr "Utente che ha inserito o commentato" + +#: modules/comment.views.inc:365 +msgid "Display comments only if a user posted the node or commented on the node." +msgstr "Visualizza i commenti solo se un utente ha inserito il nodo o ha commentato il nodo." + +#: modules/comment.views.inc:385 +msgid "Display the comment with standard comment view." +msgstr "Visualizza il commento con una vista commento standard." + +#: modules/comment.views.inc:396 +msgid "Display the comment as RSS." +msgstr "Visualizza il commento come RSS." + +#: modules/node.views.inc:30 +msgid "Nodes are a Drupal site's primary content." +msgstr "I nodi sono i contenuti principali dei siti Drupal." + +#: modules/node.views.inc:58 +msgid "The node ID of the node." +msgstr "L'ID del nodo." + +#: modules/node.views.inc:414,86 +msgid "The title of the node." +msgstr "Il titolo del nodo." + +#: modules/node.views.inc:109 +msgid "The date the node was posted." +msgstr "La data in cui il nodo è stato inserito." + +#: modules/node.views.inc:125 +msgid "The date the node was last updated." +msgstr "La data in cui il nodo è stato aggiornato l'ultima volta." + +#: modules/node.views.inc:141 +msgid "The type of a node (for example, \"blog entry\", \"forum post\", \"story\", etc)." +msgstr "Il tipo di nodo (per esempio \"voce blog\", \"messaggio forum\", \"storia\", ecc)." + +#: modules/node.views.inc:160 +msgid "The published status of the node." +msgstr "Lo stato di pubblicazione del nodo." + +#: modules/node.views.inc:176 +msgid "Published or admin" +msgstr "Pubblicato o in amministrazione" + +#: modules/node.views.inc:177 +msgid "Filters out unpublished nodes if the current user cannot view them." +msgstr "Filtra i nodi nascosti se l'utente corrente non può vederli." + +#: modules/node.views.inc:188 +msgid "The front page of the node." +msgstr "La prima pagina del nodo." + +#: modules/node.views.inc:205 +msgid "Whether or not the node is moderated." +msgstr "Se il nodo è o no moderato." + +#: modules/node.views.inc:223 +msgid "Whether or not the node is sticky." +msgstr "Se il nodo debba essere fisso in cima." + +#: modules/node.views.inc:243 +msgid "Provide a simple link to the node." +msgstr "Fornire un link semplice al nodo." + +#: modules/node.views.inc:251 +msgid "Provide a simple link to edit the node." +msgstr "Fornire un link semplice per modificare il nodo." + +#: modules/node.views.inc:259 +msgid "Provide a simple link to delete the node." +msgstr "Fornire un link semplice per eliminare il nodo." + +#: modules/user.views.inc:123; +#: modules/node.views.inc:448,267 +msgid "Created date" +msgstr "Data di creazione" + +#: modules/node.views.inc:268 +msgid "In the form of CCYYMMDD." +msgstr "Nella forma di CCYYMMDD." + +#: modules/node.views.inc:276 +msgid "Created year + month" +msgstr "Creato anno + mese" + +#: modules/node.views.inc:277 +msgid "In the form of YYYYMM." +msgstr "Nella forma di YYYYMM." + +#: modules/node.views.inc:285 +msgid "Created year" +msgstr "Creato anno" + +#: modules/node.views.inc:286 +msgid "In the form of YYYY." +msgstr "Nella forma di YYYY." + +#: modules/node.views.inc:294 +msgid "Created month" +msgstr "Creato mese" + +#: modules/node.views.inc:295 +msgid "In the form of MM (01 - 12)." +msgstr "Nella forma di MM(01 - 12)" + +#: modules/node.views.inc:303 +msgid "Created day" +msgstr "Creato giorno" + +#: modules/node.views.inc:304 +msgid "In the form of DD (01 - 31)." +msgstr "Nella forma di DD(01 - 31)." + +#: modules/node.views.inc:312 +msgid "Created week" +msgstr "Creato settimana" + +#: modules/node.views.inc:313 +msgid "In the form of WW (01 - 53)." +msgstr "Nella forma di WW(01 - 53)." + +#: modules/node.views.inc:330,325 +msgid "Node revision" +msgstr "Revisione nodo" + +#: modules/node.views.inc:331 +msgid "Node revisions are a history of changes to nodes." +msgstr "Le revisioni del nodo sono una cronologia di modifiche ai nodi." + +#: modules/node.views.inc:346 +msgid "Relate a node revision to the user who created the revision." +msgstr "Collega la revisione di un nodo all'utente che ha creato la revisione." + +#: modules/node.views.inc:359 +msgid "The actual, full data in the body field; this may not be valid data on all node types." +msgstr "Gli effettivi dati completi nel campo corpo (o testo); ciò potrebbero non essere dei dati validi per tutti i tipi di nodo." + +#: modules/node.views.inc:374 +msgid "The stored teaser field. This may not be valid or useful data on all node types." +msgstr "Il campo anteprima memorizzato. Potrebbero non essere dei dati validi o utili per tutti i tipi di nodo." + +#: modules/node.views.inc:387 +msgid "Vid" +msgstr "Vid" + +#: modules/node.views.inc:388 +msgid "The revision ID of the node revision." +msgstr "L'ID revisione della revisione del nodo." + +#: modules/node.views.inc:435 +msgid "The log message entered when the revision was created." +msgstr "Il messaggio di log inserito quando la revisione è stata creata." + +#: modules/node.views.inc:449 +msgid "The date the node revision was created." +msgstr "Il data in cui la revisione del nodo è stata creata." + +#: modules/node.views.inc:464 +msgid "Revert link" +msgstr "Link Versione precedente" + +#: modules/node.views.inc:465 +msgid "Provide a simple link to revert to the revision." +msgstr "Fornisce un link semplice per tornare alla revisione." + +#: modules/node.views.inc:473 +msgid "Provide a simple link to delete the node revision." +msgstr "Fornisce un link semplice per eliminare la revisione del nodo." + +#: modules/node.views.inc:500 +msgid "Has new content" +msgstr "Ha nuovo contenuto" + +#: modules/node.views.inc:503 +msgid "Show a marker if the node has new or updated content." +msgstr "Mostra un segnale se il nodo ha un contenuto nuovo o aggiornato." + +#: modules/node.views.inc:506 +msgid "Show only nodes that have new content." +msgstr "Mostra solo i nodi che hanno del nuovo contenuto." + +#: modules/node.views.inc:646 +msgid "Node ID from URL" +msgstr "ID nodo dall'URL" + +#: modules/node.views.inc:708 +msgid "Display %display has no access control but does not contain a filter for published nodes." +msgstr "La visualizzazione %display non ha un controllo di accesso e non contiene filtri per i nodi pubblicati." + +#: modules/poll.views.inc:39 +msgid "Whether the poll is open for voting." +msgstr "Se il sondaggio è aperto alla votazione." + +#: modules/profile.views.inc:100 +msgid "@field-name" +msgstr "@field-name" + +#: modules/profile.views.inc:107 +msgid "Profile textfield" +msgstr "Campo di testo profilo" + +#: modules/profile.views.inc:126 +msgid "Profile textarea" +msgstr "Area di testo del profilo" + +#: modules/profile.views.inc:142 +msgid "Profile checkbox" +msgstr "Casella del profilo" + +#: modules/profile.views.inc:159 +msgid "Profile URL" +msgstr "URL del profilo" + +#: modules/profile.views.inc:175 +msgid "Profile selection" +msgstr "Selezione del profilo" + +#: modules/profile.views.inc:195 +msgid "Profile freeform list %field-name." +msgstr "Elenco libero %field-name del profilo." + +#: modules/profile.views.inc:207 +msgid "Profile date %field-name." +msgstr "Data del %field-name del profilo." + +#: modules/search.views.inc:73 +msgid "The score of the search item." +msgstr "Il punteggio della voce cerca." + +#: modules/search.views.inc:95 +msgid "Links from" +msgstr "Link da" + +#: modules/search.views.inc:96 +msgid "Nodes that link from the node." +msgstr "Nodi con link dal nodo." + +#: modules/search.views.inc:113 +msgid "Links to" +msgstr "Link a" + +#: modules/search.views.inc:114 +msgid "Nodes that link to the node." +msgstr "Nodi con link al nodo" + +#: modules/search.views.inc:125 +msgid "Search Terms" +msgstr "Termini per la ricerca" + +#: modules/search.views.inc:126 +msgid "The terms to search for." +msgstr "I termini da cercare." + +#: modules/search.views.inc:164 +msgid "Display the results with standard search view." +msgstr "Visualizza i risultati con una vista ricerca standard." + +#: modules/statistics.views.inc:24 +msgid "Node statistics" +msgstr "Statistiche nodo" + +#: modules/statistics.views.inc:36 +msgid "Total views" +msgstr "Visualizzazioni totali" + +#: modules/statistics.views.inc:37 +msgid "The total number of times the node has been viewed." +msgstr "Il numero totale di volte in cui il nodo è stato visualizzato." + +#: modules/statistics.views.inc:53 +msgid "Views today" +msgstr "Visualizzazioni oggi" + +#: modules/statistics.views.inc:54 +msgid "The total number of times the node has been viewed today." +msgstr "Il numero totale di volte in cui il nodo è stato visualizzato oggi." + +#: modules/statistics.views.inc:70 +msgid "Most recent view" +msgstr "Ultima visualizzazione" + +#: modules/statistics.views.inc:71 +msgid "The most recent time the node has been viewed." +msgstr "L'ultima volta che il nodo è stato visualizzato." + +#: modules/statistics.views.inc:91,86 +msgid "Access log" +msgstr "Registro degli accessi" + +#: modules/statistics.views.inc:92 +msgid "Stores site access information." +msgstr "Memorizza le informazioni sugli accessi al sito." + +#: modules/statistics.views.inc:106 +msgid "Session ID" +msgstr "ID sessione" + +#: modules/statistics.views.inc:202 +msgid "The user who visited the site." +msgstr "L'utente che ha visitato il sito." + +#: modules/statistics.views.inc:212 +msgid "Timer" +msgstr "Cronometro" + +#: modules/system.views.inc:31 +msgid "Files maintained by Drupal and various modules." +msgstr "File mantenuti da Drupal e da moduli vari." + +#: modules/system.views.inc:50 +msgid "The ID of the file." +msgstr "L'ID del file." + +#: modules/system.views.inc:70 +msgid "The name of the file." +msgstr "Il nome del file." + +#: modules/system.views.inc:89 +msgid "The path of the file." +msgstr "Il percorso del file." + +#: modules/system.views.inc:107 +msgid "Mime type" +msgstr "Tipo di mime" + +#: modules/system.views.inc:108 +msgid "The mime type of the file." +msgstr "Il tipo di mime del file." + +#: modules/system.views.inc:127 +msgid "The size of the file." +msgstr "La dimensione del file." + +#: modules/system.views.inc:143 +msgid "The status of the file." +msgstr "Lo stato del file." + +#: modules/system.views.inc:158 +msgid "Upload date" +msgstr "Data di caricamento" + +#: modules/system.views.inc:159 +msgid "The date the file was uploaded." +msgstr "La data in cui il file è stato caricato." + +#: modules/system.views.inc:204 +msgid "Temporary" +msgstr "Temporaneo" + +#: modules/system.views.inc:205 +msgid "Permanent" +msgstr "Permanente" + +#: modules/taxonomy.views.inc:50 +msgid "Name of the vocabulary a term is a member of. This will be the vocabulary that whichever term the \"Taxonomy: Term\" field is; and can similarly cause duplicates." +msgstr "Il nome del vocabolario di cui fa parte un termine. Questo sarà il vocabolario che conterrà qualsiasi termine del campo \"Tassonomia: Termine\"; allo stesso modo può creare duplicati." + +#: modules/taxonomy.views.inc:57 +msgid "The taxonomy vocabulary ID" +msgstr "L'ID del vocabolario della tassonomia" + +#: modules/taxonomy.views.inc:71 +msgid "Taxonomy terms are attached to nodes." +msgstr "I termini della tassonomia sono allegati ai nodi." + +#: modules/taxonomy.views.inc:197,97 +msgid "The taxonomy term ID" +msgstr "L'ID del termine della tassonomia" + +#: modules/taxonomy.views.inc:117 +msgid "Taxonomy terms. Note that using this can cause duplicate nodes to appear in views; you must add filters to reduce the result set." +msgstr "Termini della tassonomia. Notare che usandoli può dar luogo alla comparsa di nodi duplicati nelle viste; è necessario aggiungere dei filtri per ridurre i duplicati." + +#: modules/taxonomy.views.inc:127 +msgid "Taxonomy term name." +msgstr "Nome del termine della tassonomia." + +#: modules/taxonomy.views.inc:136 +msgid "The term weight field" +msgstr "Campo del peso del termine della tassonomia" + +#: modules/taxonomy.views.inc:149 +msgid "The description associated with a taxonomy term." +msgstr "La descrizione associata con un termine della tassonomia." + +#: modules/taxonomy.views.inc:161 +msgid "Filter the results of \"Taxonomy: Term\" to a particular vocabulary." +msgstr "Filtra i risultati di \"Tassonomia: Termine\" di un vocabolario particolare." + +#: modules/taxonomy.views.inc:199 +msgid "All terms" +msgstr "Tutti i termini" + +#: modules/taxonomy.views.inc:200 +msgid "Display all taxonomy terms associated with a node from specified vocabularies." +msgstr "Visualizzare tutti i termini della tassonomia associati con un nodo da vocabolari specifici." + +#: modules/taxonomy.views.inc:255 +msgid "The parent term of the term. This can produce duplicate entries if you are using a vocabulary that allows multiple parents." +msgstr "Il termine genitore del termine. Può produrre voci duplicate nel caso si stia usando un vocabolario che contente genitori multipli." + +#: modules/taxonomy.views.inc:287 +msgid "Term synonym" +msgstr "Sinonimo termine" + +#: modules/taxonomy.views.inc:288 +msgid "Term synonyms may be used to find terms by alternate names." +msgstr "I sinonimi dei termini possono essere usati per trovare i termini tramite nomi alternativi." + +#: modules/taxonomy.views.inc:304 +msgid "Term ID (with depth)" +msgstr "ID termine (con profondità)" + +#: modules/taxonomy.views.inc:305 +msgid "The depth filter is more complex, so provides fewer options." +msgstr "Il filtro profondità è più complesso, per cui fornisce meno opzioni." + +#: modules/taxonomy.views.inc:315 +msgid "Term ID depth modifier" +msgstr "Modificatore della profondità dell'ID termine" + +#: modules/taxonomy.views.inc:316 +msgid "Allows the \"depth\" for Taxonomy: Term ID (with depth) to be modified via an additional argument." +msgstr "Permette che la \"profondità\" della Tassonomia: ID termine (con profondità) sia modificata tramite un argomento aggiunto." + +#: modules/translation.views.inc:97,80,48,31 +msgid "Node translation" +msgstr "Traduzione nodo" + +#: modules/translation.views.inc:33 +msgid "The language the content is in." +msgstr "La lingua del contenuto." + +#: modules/translation.views.inc:49 +msgid "Translation set node ID" +msgstr "ID del gruppo di traduzione del nodo" + +#: modules/translation.views.inc:50 +msgid "The ID of the translation set the content belongs to." +msgstr "L'ID del gruppo di traduzione al quale appartiene il contenuto." + +#: modules/translation.views.inc:74,69 +msgid "Source translation" +msgstr "Sorgente della traduzione" + +#: modules/translation.views.inc:70 +msgid "The source that this content was translated from." +msgstr "La sorgente dalloa quale è stato tradotto questo contenuto." + +#: modules/translation.views.inc:85,82 +msgid "Versions of content in different languages." +msgstr "Versioni del contenuto in lingue differenti." + +#: modules/translation.views.inc:99 +msgid "The translation status of the node--whether or not the translation needs to be updated." +msgstr "Lo stato della traduzione del nodo - Se la traduzione deve essere tradotta o meno." + +#: modules/upload.views.inc:44 +msgid "The node the uploaded file is attached to" +msgstr "Il nodo a cui è allegato il file caricato" + +#: modules/upload.views.inc:57 +msgid "The description of the uploaded file." +msgstr "La descrizione del file allegato." + +#: modules/upload.views.inc:74 +msgid "Listed" +msgstr "Elencato" + +#: modules/upload.views.inc:75 +msgid "Whether or not the file is marked to be listed." +msgstr "Se il file deve essere elencato o meno." + +#: modules/upload.views.inc:91 +msgid "The weight, used for sorting." +msgstr "Il peso, usato nell'ordinamento." + +#: modules/upload.views.inc:114 +msgid "All files attached to a node with upload.module." +msgstr "Tutti i file allegati a un nodo con il modulo upload.module." + +#: modules/upload.views.inc:121; +#: modules/upload/views_handler_filter_upload_fid.inc:10 +msgid "Has attached files" +msgstr "Ha file allegati" + +#: modules/upload.views.inc:122 +msgid "Only display items with attached files. This can cause duplicates if there are multiple attached files." +msgstr "Visualizza solo le voci con file allegati. Questo può creare duplicati se ci sono file allegati multipli." + +#: modules/upload.views.inc:126 +msgid "Add a relationship to gain access to more file data for files uploaded by upload.module. Note that this relationship will cause duplicate nodes if there are multiple files attached to the node." +msgstr "Aggiungi una relazione per avere accesso a più file di dati caricati con il modulo upload.module. Notare che questa relazione creerà nodi duplicati se ci sono file multipli allegati al nodo." + +#: modules/user.views.inc:28 +msgid "Users who have created accounts on your site." +msgstr "Utenti che hanno creato un profilo nel sito." + +#: modules/user.views.inc:48 +msgid "Uid" +msgstr "Uid" + +#: modules/user.views.inc:49 +msgid "The user ID" +msgstr "L'ID dell'utente" + +#: modules/user.views.inc:70 +msgid "Current" +msgstr "Corrente" + +#: modules/user.views.inc:71 +msgid "Filter the view to the currently logged in user." +msgstr "Filtra la vista con l'utente attualmente autenticato." + +#: modules/user.views.inc:80 +msgid "The user or author name." +msgstr "Il nome dell'utente o dell'autore." + +#: modules/user.views.inc:97 +msgid "Email address for a given user. This field is not normally shown to users, so be cautious when using it." +msgstr "Indirizzo email di un dato utente. Questo campo normalmente non viene mostrato agli utenti, quindi usarlo con cautela." + +#: modules/user.views.inc:113 +msgid "The user's picture, if allowed." +msgstr "Il ritratto dell'utente, se consentito." + +#: modules/user.views.inc:124 +msgid "The date the user was created." +msgstr "Il data in cui è stato creato l'utente." + +#: modules/user.views.inc:140 +msgid "The user's last access date." +msgstr "La data dell'ultima accesso dell'utente." + +#: modules/user.views.inc:155 +msgid "Last login" +msgstr "Ultimo login" + +#: modules/user.views.inc:156 +msgid "The user's last login date." +msgstr "La data dell'ultimo login dell'utente." + +#: modules/user.views.inc:172 +msgid "Whether a user is active or blocked." +msgstr "Se un utente è attivo o bloccato." + +#: modules/user.views.inc:190 +msgid "The user's signature." +msgstr "La firma dell'utente." + +#: modules/user.views.inc:203 +msgid "Provide a simple link to edit the user." +msgstr "Fornisci un link semplice per modificare l'utente." + +#: modules/user.views.inc:211 +msgid "Provide a simple link to delete the user." +msgstr "Fornisci un link semplice per eliminare l'utente." + +#: modules/user.views.inc:241 +msgid "Roles that a user belongs to." +msgstr "I ruoli a cui l'utente appartiene." + +#: modules/user.views.inc:253 +msgid "No role" +msgstr "Nessun ruolo" + +#: modules/user.views.inc:296 +msgid "User ID from URL" +msgstr "ID utente dall'URL" + +#: modules/user.views.inc:302 +msgid "User ID from logged in user" +msgstr "ID Utente degli utenti autenticati" + +#: modules/views.views.inc:18 +msgid "Global" +msgstr "Globale" + +#: modules/views.views.inc:24 +msgid "Randomize the display order." +msgstr "Randomizzare l'ordine di visualizzazione." + +#: modules/views.views.inc:31 +msgid "Null" +msgstr "Null" + +#: modules/views.views.inc:32 +msgid "Allow an argument to be ignored. The query will not be altered by this argument." +msgstr "Consenti che l'argomento sia ignorato. La query non sarà alterata da questo argomento." + +#: modules/comment/views_handler_argument_comment_user_uid.inc:17 +msgid "No user" +msgstr "Nessun utente" + +#: modules/comment/views_handler_field_comment.inc:30 +msgid "Link this field to its comment" +msgstr "Collega questo campo al suo commento" + +#: modules/node/views_handler_field_node_link.inc:24; +#: modules/comment/views_handler_field_comment_link.inc:23; +#: modules/user/views_handler_field_user_link.inc:22 +msgid "Text to display" +msgstr "Testo da visualizzare" + +#: modules/comment/views_handler_field_comment_username.inc:25 +msgid "Link this field to its user or an author's homepage" +msgstr "Collega questo campo al suo utente o a una homepage dell'autore" + +#: modules/comment/views_handler_field_node_new_comments.inc:25 +msgid "Link this field to new comments" +msgstr "Collega questo campo ai nuovi commenti" + +#: modules/comment/views_handler_field_node_new_comments.inc:30 +msgid "Display nothing if no new comments" +msgstr "Non visualizzare nient'altro che i nuovi commenti" + +#: modules/node/views_handler_argument_dates_various.inc:167 +msgid "Week @week" +msgstr "Settimana @week" + +#: modules/translation/views_handler_argument_node_language.inc:29; +#: modules/node/views_handler_argument_node_language.inc:29 +msgid "Unknown language" +msgstr "Lingua sconosciuta" + +#: modules/node/views_handler_argument_node_type.inc:30 +msgid "Unknown node type" +msgstr "Tipo di nodo sconosciuto" + +#: modules/node/views_handler_field_history_user_timestamp.inc:32 +msgid "Check for new comments as well" +msgstr "Verifica anche per nuovi commenti" + +#: modules/translation/views_handler_filter_node_language.inc:10; +#: modules/node/views_handler_filter_node_language.inc:10 +msgid "Current user's language" +msgstr "Lingua corrente dell'utente" + +#: modules/translation/views_handler_filter_node_language.inc:10; +#: modules/node/views_handler_filter_node_language.inc:10 +msgid "No language" +msgstr "Nessuna lingua" + +#: modules/node/views_plugin_argument_validate_node.inc:32 +msgid "If you wish to validate for specific node types, check them; if none are checked, all nodes will pass." +msgstr "Se si desidera convalidare tipi di nodo specifici, selezionarli; se non ne viene selezionato alcuno, tutti i nodi passeranno." + +#: modules/node/views_plugin_argument_validate_node.inc:39 +msgid "Validate user has access to the node" +msgstr "L'utente convalidato ha accesso al nodo" + +#: modules/node/views_plugin_argument_validate_node.inc:50 +msgid "Node IDs separated by , or +" +msgstr "ID dei nodi separati da , o +" + +#: modules/node/views_plugin_row_node_rss.inc:27 +msgid "Title plus teaser" +msgstr "Titolo più anteprima" + +#: modules/node/views_plugin_row_node_rss.inc:29 +msgid "Use default RSS settings" +msgstr "Usa le impostazioni RSS predefinite" + +#: modules/node/views_plugin_row_node_view.inc:27 +msgid "Display only teaser" +msgstr "Visualizza solo l'anteprima" + +#: modules/node/views_plugin_row_node_view.inc:37 +msgid "Display node comments" +msgstr "Visualizza i commenti del nodo" + +#: modules/search/views_handler_filter_search.inc:23 +msgid "On empty input" +msgstr "Su inserimento vuoto" + +#: modules/search/views_handler_filter_search.inc:26 +msgid "Show All" +msgstr "Mostra tutto" + +#: modules/search/views_handler_filter_search.inc:27 +msgid "Show None" +msgstr "Non mostrare nulla" + +#: modules/search/views_plugin_row_search_view.inc:23 +msgid "Display score" +msgstr "Mostra punteggio" + +#: modules/system/views_handler_field_file.inc:29; +#: modules/upload/views_handler_field_upload_description.inc:24; +#: modules/upload/views_handler_field_upload_fid.inc:21 +msgid "Link this field to download the file" +msgstr "Collega questo campo per download il file" + +#: modules/taxonomy/views_handler_argument_term_node_tid.inc:17; +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:38 +msgid "Set the breadcrumb for the term parents" +msgstr "Imposta il breadcrumb dei termini genitori" + +#: modules/taxonomy/views_handler_argument_term_node_tid.inc:18; +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:39 +msgid "If selected, the breadcrumb trail will include all parent terms, each one linking to this view. Note that this only works if just one term was received." +msgstr "Se selezionato, il breadcrumb includerà i termini genitori, ognuno collegato alla propria vista. Nota che questo funziona solo se è stato ricevuto solo un termine." + +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:26 +msgid "The depth will match nodes tagged with terms in the hierarchy. For example, if you have the term \"fruit\" and a child term \"apple\", with a depth of 1 (or higher) then filtering for the term \"fruit\" will get nodes that are tagged with \"apple\" as well as \"fruit\". If negative, the reverse is true; searching for \"apple\" will also pick up nodes tagged with \"fruit\" if depth is -1 (or lower)." +msgstr "La profondità combacerà con i nodi etichettati con i termini nella gerarchia. Per esempio, se si ha il termine \"frutta\" e un termine figlio \"mela\", con una profondità di 1 (o maggiore) allora il filtraggio del termine \"frutta\" otterrà i nodi etichettati con \"mela\" come pure quelli etichettati con \"frutta\". Se negativo, è vero il contrario; se la profondità è -1 (o inferiore) cercando \"mela\" si troveranno anche i nodi etichettati con \"frutta\"." + +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:31 +msgid "Allow multiple terms per argument" +msgstr "Consenti termini multipli per argomento" + +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:32 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3. Due to the number of JOINs it would require, AND will be treated as OR with this argument." +msgstr "Se selezionato, gli utenti possono inserire argomenti multipli nel formato 1+2+3. A causa del numero di JOIN che ciò richiede, con questo argomento AND verrà trattato come OR." + +#: modules/taxonomy/views_handler_argument_vocabulary_vid.inc:15 +msgid "No vocabulary" +msgstr "Nessun vocabolario" + +#: modules/taxonomy/views_handler_field_taxonomy.inc:33 +msgid "Link this field to its taxonomy term page" +msgstr "Collega questo campo alla pagina del suo termine tassonomico" + +#: modules/taxonomy/views_handler_field_term_node_tid.inc:34 +msgid "Link this field to its term page" +msgstr "Collega questo termine alla pagina del suo termine" + +#: modules/taxonomy/views_handler_field_term_node_tid.inc:41 +msgid "Limit terms by vocabulary" +msgstr "Limita i termini nel vocabolario" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:39 +msgid "Select which vocabulary to show terms for in the regular options." +msgstr "Selezionare per quale vocabolario mostrare i termini nelle opzioni regolari." + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:49 +msgid "Selection type" +msgstr "Tipo di selezione" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:50 +msgid "Dropdown" +msgstr "Menu a discesa" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:50 +msgid "Autocomplete" +msgstr "Autocompletamento" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:56 +msgid "Show hierarchy in dropdown" +msgstr "Mostra la gerarchia nel menu a discesa" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:73 +msgid "An invalid vocabulary is selected. Please change it in the options." +msgstr "È stato selezionato un vocabolario non valido. Si prega di modificarlo nelle opzioni." + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:147,91 +msgid "Select terms from vocabulary @voc" +msgstr "Selezionare i termini dal vocabolario @voc" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:255 +msgid "Unable to find term: @terms" +msgid_plural "Unable to find terms: @terms" +msgstr[0] "Impossibile trovare il termine: @terms" +msgstr[1] "Impossibile trovare i termini: @terms" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:26 +msgid "If you wish to validate for specific vocabularies, check them; if none are checked, all terms will pass." +msgstr "Se si desidera validare vocabolari specifici, selezionarli; se nessuno viene selezionato, tutti i termini passeranno." + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:36 +msgid "Term IDs separated by , or +" +msgstr "ID dei termini separati da , o +" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:37 +msgid "Term name or synonym" +msgstr "Nome del termine o sinonimo" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:38 +msgid "Term name/synonym converted to Term ID" +msgstr "Nome/sinonimo del termine convertito in ID del termine" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:41 +msgid "Select the form of this argument; if using term name, it is generally more efficient to convert it to a term ID and use Taxonomy: Term ID rather than Taxonomy: Term Name\" as an argument." +msgstr "Selezionare la forma di questo argomento; se si usa il nome del termine, in genere è più efficace convertirlo in ID del termine e usare come argomento \"Tassonomia: ID del Termine\" anziché \"Tassonomia: Nome del Termine\"." + +#: modules/translation/views_handler_filter_node_language.inc:10 +msgid "Default site language" +msgstr "Lingua predefinita del sito" + +#: modules/translation/views_handler_relationship_translation.inc:24 +msgid "Current language" +msgstr "Lingua attuale" + +#: modules/translation/views_handler_relationship_translation.inc:25 +msgid "Default language" +msgstr "Lingua predefinita" + +#: modules/translation/views_handler_relationship_translation.inc:32 +msgid "Translation option" +msgstr "Opzioni di traduzione" + +#: modules/translation/views_handler_relationship_translation.inc:33 +msgid "The translation options allows you to select which translation or translations in a translation set join on. Select \"Current language\" or \"Default language\" to join on the translation in the current or default language respectively. Select a specific language to join on a translation in that language. If you select \"All\", each translation will create a new row, which may appear to cause duplicates." +msgstr "Le opzioni di traduzione consentono di selezionare a quale traduzione o traduzioni unirsi in un gruppo di traduzione. Selezionare \"Lingua attuale\" per unirsi alla traduzione nella lingua attuale oppure o \"Lingua predefinita\" per unirsi alla lingua predefinita. Selezionare una lingua specifica per unirsi alla traduzione in quella lingua. Se si seleziona \"Tutte\", ogni traduzione creerà una nuova riga, che può sembrare essere la causa di duplicati." + +#: modules/upload/views_handler_field_upload_fid.inc:27 +msgid "Only show \"listed\" file attachments" +msgstr "Mostra solo i file allegati \"elencati\"" + +#: modules/user/views_handler_field_user.inc:30 +msgid "Link this field to its user" +msgstr "Collega questo campo al suo utente" + +#: modules/user/views_handler_field_user_mail.inc:16 +msgid "Link this field" +msgstr "Collega questo campo" + +#: modules/user/views_handler_field_user_mail.inc:20 +msgid "To the user" +msgstr "All'utente" + +#: modules/user/views_handler_field_user_mail.inc:21 +msgid "With a mailto:" +msgstr "Con un mailto:" + +#: modules/user/views_handler_filter_user_current.inc:10 +msgid "Is the logged in user" +msgstr "È l'utente autenticato" + +#: modules/user/views_handler_filter_user_name.inc:28 +msgid "Usernames" +msgstr "Nomi utente" + +#: modules/user/views_handler_filter_user_name.inc:29 +msgid "Enter a comma separated list of user names." +msgstr "Inserire un elenco di nome utente separati da una virgola." + +#: modules/user/views_handler_filter_user_name.inc:112 +msgid "Unable to find user: @users" +msgid_plural "Unable to find users: @users" +msgstr[0] "Impossibile trovare l'utente: @users" +msgstr[1] "Impossibile trovare gli utenti: @users" + +#: modules/user/views_plugin_argument_default_user.inc:17 +msgid "Also look for a node and use the node author" +msgstr "Cercare anche un nodo e usare l'autore del nodo" + +#: plugins/views_plugin_access_none.inc:9 +msgid "Unrestricted" +msgstr "Senza restrizioni" + +#: plugins/views_plugin_access_perm.inc:37 +msgid "Only users with the selected permission flag will be able to access this display. Note that users with \"access all views\" can see any view, regardless of other permissions." +msgstr "Solo gli utenti con l'indicatore del permesso selezionato potranno accedere a questa visualizzazione. Notare che gli utenti con il permesso \"accesso a tutte le viste\" possono vedere qualsiasi vista, indipendentemente dagli altri permessi." + +#: plugins/views_plugin_access_role.inc:21 +msgid "No role(s) selected" +msgstr "Nessun ruolo selezionato" + +#: plugins/views_plugin_access_role.inc:24 +msgid "Multiple roles" +msgstr "Ruoli multipli" + +#: plugins/views_plugin_access_role.inc:43 +msgid "Only the checked roles will be able to access this display. Note that users with \"access all views\" can see any view, regardless of role." +msgstr "Solo i ruoli selezionati potranno accedere a questa visualizzazione. Notare che gli utenti con il permesso \"accesso a tutte le viste\" possono vedere qualsiasi vista, a dispetto del ruolo." + +#: plugins/views_plugin_access_role.inc:49 +msgid "You must select at least one role if type is \"by role\"" +msgstr "Se il tipo è \"per ruolo\", bisogna selezionare almeno un ruolo" + +#: plugins/views_plugin_argument_default.inc:32 +msgid "Default argument" +msgstr "Argomento predefinito" + +#: plugins/views_plugin_argument_default.inc:54 +msgid "Note: you do not have permission to modify this. If you change the default argument type, this setting will be lost and you will NOT be able to get it back." +msgstr "Nota: non hai il permesso per modificarlo. Se modifichi il tipo di argomento predefinito, questa impostazione andrà persa e NON potrai tornare indietro." + +#: plugins/views_plugin_argument_default_php.inc:17 +msgid "PHP argument code" +msgstr "Codice PHP dell'argomento" + +#: plugins/views_plugin_argument_default_php.inc:20 +msgid "Enter PHP code that returns a value to use for this argument. Do not use <?php ?>. You must return only a single value for just this argument." +msgstr "Inserire il codice PHP che restituisce un valore da usare per questo argomento" + +#: plugins/views_plugin_argument_validate.inc:43 +msgid "Note: you do not have permission to modify this. If you change the validator, this setting will be lost and you will NOT be able to get it back." +msgstr "Nota: non hai il permesso per modificarlo. Se modifichi il validatore, questa impostazione andrà persa e NON potrai tornare indietro." + +#: plugins/views_plugin_argument_validate_php.inc:19 +msgid "PHP validate code" +msgstr "Codice PHP di validazione" + +#: plugins/views_plugin_argument_validate_php.inc:21 +msgid "Enter PHP code that returns TRUE or FALSE. No return is the same as FALSE, so be SURE to return something if you do not want to declare the argument invalid. Do not use <?php ?>. The argument to validate will be \"$argument\" and the view will be \"$view\". You may change the argument by setting \"$handler->argument\"." +msgstr "Inserire il codice PHP che restituisce TRUE o FALSE. Nessuna restituzione corrisponde a FALSE, per cui assicurarsi che qualcosa venga restituito se non si vuole dichiarare invalido l'argomento. Non usare <?php ?>. L'argomento da validre sarà \"$argument\" e la vista sarà \"$view\". Si può modificare l'argomento impostando \"$handler->argument\"." + +#: plugins/views_plugin_display.inc:558 +msgid "Broken field" +msgstr "Campo guasto" + +#: plugins/views_plugin_display.inc:582 +msgid "Change the name of this display." +msgstr "Cambia il nome di questa vista." + +#: plugins/views_plugin_display.inc:594 +msgid "Change the title that this display will use." +msgstr "Cambia il titolo che questa vista userà." + +#: plugins/views_plugin_display.inc:606 +msgid "Change the style plugin." +msgstr "Cambia il plugin stile." + +#: plugins/views_plugin_display.inc:620 +msgid "Row style" +msgstr "Stile riga" + +#: plugins/views_plugin_display.inc:622 +msgid "Change the row plugin." +msgstr "Cambia il plugin riga." + +#: plugins/views_plugin_display.inc:632 +msgid "Use AJAX" +msgstr "Usa AJAX" + +#: plugins/views_plugin_display.inc:634 +msgid "Change whether or not this display will use AJAX." +msgstr "Modifica se questa visualizzazione userà o meno AJAX." + +#: plugins/views_plugin_display.inc:642 +msgid "Mini" +msgstr "Mini" + +#: plugins/views_plugin_display.inc:643 +msgid "Change this display's pager setting." +msgstr "Modifica le impostazioni del paginatore di questa visualizzazione." + +#: plugins/views_plugin_display.inc:822,650 +msgid "Items per page" +msgstr "Voci per pagina" + +#: plugins/views_plugin_display.inc:822,650; +#: plugins/views_plugin_style_summary.inc:43 +msgid "Items to display" +msgstr "Voci da visualizzare" + +#: plugins/views_plugin_display.inc:652 +msgid "Change how many items to display." +msgstr "Modifica quante voci visualizzare." + +#: plugins/views_plugin_display.inc:658 +msgid "More link" +msgstr "Link altro" + +#: plugins/views_plugin_display.inc:660 +msgid "Specify whether this display will provide a \"more\" link." +msgstr "Specificare se questa visualizzazione deve fornire un link \"altro\"." + +#: plugins/views_plugin_display.inc:849,666 +msgid "Distinct" +msgstr "Distinta" + +#: plugins/views_plugin_display.inc:846,668 +msgid "Display only distinct items, without duplicates." +msgstr "Visualizza solo voci distinte, senza duplicati." + +#: plugins/views_plugin_display.inc:683 +msgid "Specify access control type for this display." +msgstr "Specifica il tipo di controllo di accesso per questa visualizzazione." + +#: plugins/views_plugin_display.inc:687 +msgid "Change settings for this access type." +msgstr "Modifica le impostazioni per questo tipo di accesso." + +#: plugins/views_plugin_display.inc:707 +msgid "Link display" +msgstr "Collega visualizzazione" + +#: plugins/views_plugin_display.inc:709 +msgid "Specify which display this display will link to." +msgstr "Specifica a quale visualizzazione questa visualizzazione sarà collegata." + +#: plugins/views_plugin_display.inc:716 +msgid "Exposed form in block" +msgstr "Form esposto nel blocco" + +#: plugins/views_plugin_display.inc:718 +msgid "Allow the exposed form to appear in a block instead of the view." +msgstr "Consente al form esposto di apparire in un blocco anziché nella vista." + +#: plugins/views_plugin_display.inc:737 +msgid "Unknown/missing format" +msgstr "Formato sconosciuto/mancante" + +#: plugins/views_plugin_display.inc:745 +msgid "Change this display's !name." +msgstr "Cambiare !name di questa visualizzazione." + +#: plugins/views_plugin_display.inc:753 +msgid "Get information on how to theme this display" +msgstr "Informazioni su come temizzare questa visualizzazione" + +#: plugins/views_plugin_display.inc:779 +msgid "The name of this display" +msgstr "Il nome di questa visualizzazione" + +#: plugins/views_plugin_display.inc:782 +msgid "This title will appear only in the administrative interface for the View." +msgstr "Questo titolo comparirà nell'interfaccia di amministrazione di Viste." + +#: plugins/views_plugin_display.inc:787 +msgid "The title of this view" +msgstr "Il titolo di questa vista" + +#: plugins/views_plugin_display.inc:790 +msgid "This title will be displayed with the view, wherever titles are normally displayed; i.e, as the page title, block title, etc." +msgstr "Questo titolo sarà visualizzato con la vista, dovunque vengono visualizzati normalmente i titoli; cioè, come il titolo della pagina, titolo del blocco, ecc." + +#: plugins/views_plugin_display.inc:795 +msgid "Use AJAX when available to load this view" +msgstr "Quando disponibile, usare AJAX per caricare questa vista" + +#: plugins/views_plugin_display.inc:799 +msgid "If set, this view will use an AJAX mechanism for paging, table sorting and exposed filters. This means the entire page will not refresh. It is not recommended that you use this if this view is the main content of the page as it will prevent deep linking to specific pages, but it is very useful for side content." +msgstr "Se impostato, questa vista userà un meccanismo AJAX per la paginazione, l'ordinamento della tabella e i filtri esposti. Ciò significa che la pagina intera non si aggiornerà. Non ne è raccomandato l'uso se questa vista è il contenuto principale della pagina poiché impedirà il collegamento diretto (deep linking) a pagine specifiche, ma è molto utile per i contenuti laterali." + +#: plugins/views_plugin_display.inc:808 +msgid "Use a pager for this view" +msgstr "Usa un paginatore per questa vista" + +#: plugins/views_plugin_display.inc:811 +msgid "Full pager" +msgstr "Paginatore completo" + +#: plugins/views_plugin_display.inc:811 +msgid "Mini pager" +msgstr "Mini paginatore" + +#: plugins/views_plugin_display.inc:816 +msgid "Pager element" +msgstr "Elemento paginatore" + +#: plugins/views_plugin_display.inc:817 +msgid "Unless you're experiencing problems with pagers related to this view, you should leave this at 0. If using multiple pagers on one page you may need to set this number to a higher value so as not to conflict within the ?page= array. Large values will add a lot of commas to your URLs, so avoid if possible." +msgstr "A meno che non si stia sperimentando problemi con i paginatori collegati a questa vista, si dovrebbe lasciarlo a 0. Se si stanno usando dei multi-paginatori su una pagina potrebbe essere necessario impostare questo numero a un valore maggiore in modo che non vada in conflitto con ?page= array. I valori ampi aggiungeranno molte virgole agli URL, per cui evitarli se possibile." + +#: plugins/views_plugin_display.inc:826 +msgid "The number of items to display per page. Enter 0 for no limit." +msgstr "Il numero di voci da mostrare per pagina. Inserire 0 per nessun limite." + +#: plugins/views_plugin_display.inc:832 +msgid "The number of items to skip. For example, if this field is 3, the first 3 items will be skipped and not displayed. Offset can not be used if items to display is 0; instead use a very large number there." +msgstr "Il numero di voci da saltare. Per esempio, se questo campo è 3, le prime 3 voci verranno saltate e non mostrate. Lo slittamento (offset) non può essere usato se le voci da mostrare sono 0; in questo caso usare invece un numero molto grande." + +#: plugins/views_plugin_display.inc:837 +msgid "Add a more link to the bottom of the display." +msgstr "Aggiungere un link altro in fondo alla visualizzazione." + +#: plugins/views_plugin_display.inc:840 +msgid "Create more link" +msgstr "Crea un link altro" + +#: plugins/views_plugin_display.inc:841 +msgid "This will add a more link to the bottom of this view, which will link to the page view. If you have more than one page view, the link will point to the display specified in 'Link display' above." +msgstr "Aggiungerà un link altro in fondo a questa vista, che si collegherà alla vista pagina. Se ci sono più di una vista pagina, il link punterà alla visualizzazione specificata in 'Link display' sopra" + +#: plugins/views_plugin_display.inc:850 +msgid "This will make the view display only distinct items. If there are multiple identical items, each will be displayed only once. You can use this to try and remove duplicates from a view, though it does not always work. Note that this can slow queries down, so use it with caution." +msgstr "Questo farà sì che la vista visualizzi solo voci distinte. Se ci sono voci multiple identiche, ognuna verrà visualizzata solo una volta. Si può usare questo per cercare e rimuovere i duplicati da una vista, sebbene non sempre funzioni. Notare che questo può rallentare le query, quindi usarlo con cautela." + +#: plugins/views_plugin_display.inc:855 +msgid "Access restrictions" +msgstr "Restrizioni accesso" + +#: plugins/views_plugin_display.inc:954,874 +msgid "You may also adjust the !settings for the currently selected style by clicking on the icon." +msgstr "È anche possibile regolare le !settings dello stile attualmente selezionato cliccando sull'icona." + +#: plugins/views_plugin_display.inc:882 +msgid "Access options" +msgstr "Opzioni accesso" + +#: plugins/views_plugin_display.inc:916,900 +msgid "Display even if view has no result" +msgstr "Visualizza anche se la vista non da risultati" + +#: plugins/views_plugin_display.inc:923 +msgid "Text to display beneath the view. May contain an explanation or links or whatever you like. Optional." +msgstr "Testo da visualizzare sotto la vista. Può contenere una spiegazione o dei link o qualsiasi cosa si desidera. Opzionale." + +#: plugins/views_plugin_display.inc:934 +msgid "Text to display if the view has no results. Optional." +msgstr "Testo da visualizzare se la vista non ha risultati. Opzionale." + +#: plugins/views_plugin_display.inc:940 +msgid "How should this view be styled" +msgstr "Come deve essere stilizzata questa vista" + +#: plugins/views_plugin_display.inc:946 +msgid "If the style you choose has settings, be sure to click the settings button that will appear next to it in the View summary." +msgstr "Se lo stile scelto ha delle impostazioni, assicurarsi di selezionare il pulsante impostazioni che comparirà vicino ad esso nel sommario Vista." + +#: plugins/views_plugin_display.inc:960 +msgid "Style options" +msgstr "Opzioni stile" + +#: plugins/views_plugin_display.inc:971 +msgid "Row style options" +msgstr "Opzioni stile riga" + +#: plugins/views_plugin_display.inc:986 +msgid "How should each row in this view be styled" +msgstr "Come deve essere stilizzata ogni riga di questa vista" + +#: plugins/views_plugin_display.inc:999 +msgid "You may also adjust the !settings for the currently selected row style by clicking on the icon." +msgstr "Si possono anche regolare le !settings della riga correntemente selezionata cliccando sull'icona." + +#: plugins/views_plugin_display.inc:1005 +msgid "Which display to use for path" +msgstr "Quale visualizzazione usare per il percorso" + +#: plugins/views_plugin_display.inc:1014 +msgid "Which display to use to get this display's path for things like summary links, rss feed links, more links, etc." +msgstr "Quale visualizzazione usare per avere il percorso di questa visualizzazione in cose come link del sommario, link dei feed rss, link altro, ecc." + +#: plugins/views_plugin_display.inc:1019 +msgid "Theming information" +msgstr "Informazioni sul tema" + +#: plugins/views_plugin_display.inc:1027 +msgid "Display output" +msgstr "Output della visualizzazione" + +#: plugins/views_plugin_display.inc:1031 +msgid "Alternative display output" +msgstr "Output alternativo della visualizzazione" + +#: plugins/views_plugin_display.inc:1038 +msgid "Style output" +msgstr "Output dello stile" + +#: plugins/views_plugin_display.inc:1042 +msgid "Alternative style" +msgstr "Output alternativo dello stile" + +#: plugins/views_plugin_display.inc:1049 +msgid "Row style output" +msgstr "Output dello stile di riga" + +#: plugins/views_plugin_display.inc:1053 +msgid "Alternative row style" +msgstr "Output alternativo dello stile di riga" + +#: plugins/views_plugin_display.inc:1061 +msgid "Field @field (ID: @id)" +msgstr "Campo @field (ID: @id)" + +#: plugins/views_plugin_display.inc:1069 +msgid "This section lists all possible templates for the display plugin and for the style plugins, ordered roughly from the least specific to the most specific. The active template for each plugin -- which is the most specific template found on the system -- is highlighted in bold." +msgstr "Questa sezione elenca tutti i possibili modelli per il plugin visualizzazione e per i plugin stile, ordinati grosso modo dal meno specifico al più specifico. Il modello attivo per ciascun plugin -- che è il modello più specifico trovato nel sistema -- è evidenziato in grassetto." + +#: plugins/views_plugin_display.inc:1084 +msgid "Rescan template files" +msgstr "Rianalizza i file modello" + +#: plugins/views_plugin_display.inc:1090 +msgid "Important! When adding, removing, or renaming template files, it is necessary to make Drupal aware of the changes by making it rescan the files on your system. By clicking this button you clear Drupal's theme registry and thereby trigger this rescanning process. The highlighted templates above will then reflect the new state of your system." +msgstr "Importante! Quando si aggiungono, rimuovono o rinominano i file modello, è necessario rendere Drupal consapevole delle modifiche facendogli rianalizzare i file del sistema. Cliccando questo pulsante si azzera il registro del tema di Drupal avviando perciò il processo di rianalisi. I modelli evidenziati sopra rifletteranno quindi il nuovo stato del sistema." + +#: plugins/views_plugin_display.inc:1096 +msgid "Theming information (display)" +msgstr "Informazioni sulla temizzazione (visualizzazione)" + +#: plugins/views_plugin_display.inc:1182,1153,1124,1097 +msgid "Back to !info." +msgstr "Torna a !info." + +#: plugins/views_plugin_display.inc:1182,1153,1124,1097 +msgid "theming information" +msgstr "informazioni sulla temizzazione" + +#: plugins/views_plugin_display.inc:1100 +msgid "This display has no theming information" +msgstr "La visualizzazione non ha informazioni sulla temizzazione" + +#: plugins/views_plugin_display.inc:1103 +msgid "This is the default theme template used for this display." +msgstr "Questo è il modello di tema predefinito usato per questa visualizzazione." + +#: plugins/views_plugin_display.inc:1109 +msgid "This is an alternative template for this display." +msgstr "Questo è un modello alternativo per questa visualizzazione." + +#: plugins/views_plugin_display.inc:1123 +msgid "Theming information (style)" +msgstr "Informazioni temizzazione (stile)" + +#: plugins/views_plugin_display.inc:1129 +msgid "This display has no style theming information" +msgstr "Questa visualizzazione non ha informazioni sulla temizzazione dello stile" + +#: plugins/views_plugin_display.inc:1132 +msgid "This is the default theme template used for this style." +msgstr "Questo è il modello di tema predefinito usato per questo stile." + +#: plugins/views_plugin_display.inc:1138 +msgid "This is an alternative template for this style." +msgstr "Questo è un modello alternativo per questo stile." + +#: plugins/views_plugin_display.inc:1181,1152 +msgid "Theming information (row style)" +msgstr "Informazioni temizzazione (stile riga)" + +#: plugins/views_plugin_display.inc:1158 +msgid "This display has no row style theming information" +msgstr "Questa visualizzazione non ha informazioni sulla temizzazione dello stile riga" + +#: plugins/views_plugin_display.inc:1184,1161 +msgid "This is the default theme template used for this row style." +msgstr "Questo è il modello del tema predefinito usato per questo stile riga." + +#: plugins/views_plugin_display.inc:1167 +msgid "This is an alternative template for this row style." +msgstr "Questo è un modello alternativo per questo stile riga." + +#: plugins/views_plugin_display.inc:1199 +msgid "Put the exposed form in a block" +msgstr "Metti il form esposto in un blocco" + +#: plugins/views_plugin_display.inc:1203 +msgid "If set, any exposed widgets will not appear with this view. Instead, a block will be made available to the Drupal block administration system, and the exposed form will appear there. Note that this block must be enabled manually, Views will not enable it for you." +msgstr "Se impostato, qualsiasi widget esposto non apparirà in questa vista. Sarà invece reso disponibile un blocco nel sistema di amministrazione blocchi di Drupal e il form esposto comparirà lì. Notare che questo blocco deve essere attivato manualmente, Viste non lo attiverà in automatico." + +#: plugins/views_plugin_display.inc:1238 +msgid "File found in folder @template-path" +msgstr "(File trovato nella cartella @template-path)" + +#: plugins/views_plugin_display.inc:1242 +msgid "(File not found, in folder @template-path)" +msgstr "(File non trovato nella cartella @template-path)" + +#: plugins/views_plugin_display.inc:1404 +msgid "Status: using default values." +msgstr "Stato: utilizzazione valori predefiniti." + +#: plugins/views_plugin_display.inc:1408 +msgid "Update default display" +msgstr "Aggiorna visualizzazione predefinita" + +#: plugins/views_plugin_display.inc:1413 +msgid "Use default" +msgstr "Usa predefinito" + +#: plugins/views_plugin_display.inc:1418 +msgid "Status: using overridden values." +msgstr "Stato: utilizzo di valori modificati." + +#: plugins/views_plugin_display.inc:1633 +msgid "Display @display uses fields but there are none defined for it or all are excluded." +msgstr "La visualizzazione @display usa dei campi ma non ci sono campi definiti per essa oppure sono tutti esclusi." + +#: plugins/views_plugin_display.inc:1638 +msgid "Display @display uses path but path is undefined." +msgstr "La visualizzazione @display usa il percorso ma il percorso non è definito." + +#: plugins/views_plugin_display.inc:1643 +msgid "Display @display has an invalid style plugin." +msgstr "La visualizzazione @display ha un plugin stile non valido." + +#: plugins/views_plugin_display.inc:1659 +msgid "Exposed form: @view-@display_id" +msgstr "Form esposto: @view-@display_id" + +#: plugins/views_plugin_display_attachment.inc:35 +msgid "Before" +msgstr "Prima" + +#: plugins/views_plugin_display_attachment.inc:36 +msgid "After" +msgstr "Dopo" + +#: plugins/views_plugin_display_attachment.inc:57 +msgid "Attachment settings" +msgstr "Impostazioni allegati" + +#: plugins/views_plugin_display_attachment.inc:109,62 +msgid "Inherit arguments" +msgstr "Eredita argomenti" + +#: plugins/views_plugin_display_attachment.inc:118,68 +msgid "Inherit exposed filters" +msgstr "Eredita filtri esposti" + +#: plugins/views_plugin_display_attachment.inc:127,74 +msgid "Position" +msgstr "Posizione" + +#: plugins/views_plugin_display_attachment.inc:80; +#: plugins/views_plugin_display_feed.inc:98 +msgid "Multiple displays" +msgstr "Visualizzazioni multiple" + +#: plugins/views_plugin_display_attachment.inc:136,95; +#: plugins/views_plugin_display_feed.inc:140,113 +msgid "Attach to" +msgstr "Allega a" + +#: plugins/views_plugin_display_attachment.inc:121,112 +msgid "Inherit" +msgstr "Eredita" + +#: plugins/views_plugin_display_attachment.inc:113 +msgid "Should this display inherit its arguments from the parent display to which it is attached?" +msgstr "Questa visualizzazione deve ereditare i propri argomenti dalla visualizzazione genitore a cui è allegata?" + +#: plugins/views_plugin_display_attachment.inc:122 +msgid "Should this display inherit its exposed filter values from the parent display to which it is attached?" +msgstr "Questa visualizzazione deve ereditare i valori dei filtri esposti nella visualizzazione genitore a cui è allegata?" + +#: plugins/views_plugin_display_attachment.inc:130 +msgid "Attach before or after the parent display?" +msgstr "Allegare prima o dopo la visualizzazione genitore?" + +#: plugins/views_plugin_display_attachment.inc:145 +msgid "Select which display or displays this should attach to." +msgstr "Selezionare la visualizzazione / le visualizzazioni a cui questa deve essere allegata." + +#: plugins/views_plugin_display_block.inc:106 +msgid "Do not cache" +msgstr "Non mettere i cache" + +#: plugins/views_plugin_display_block.inc:107 +msgid "Cache once for everything (global)" +msgstr "Metti in cache una volta per tutto (globale)" + +#: plugins/views_plugin_display_block.inc:108 +msgid "Per page" +msgstr "Per pagina" + +#: plugins/views_plugin_display_block.inc:109 +msgid "Per role" +msgstr "Per ruolo" + +#: plugins/views_plugin_display_block.inc:110 +msgid "Per role per page" +msgstr "Per ruolo per pagina" + +#: plugins/views_plugin_display_block.inc:111 +msgid "Per user" +msgstr "Per utente" + +#: plugins/views_plugin_display_block.inc:112 +msgid "Per user per page" +msgstr "Per utente per pagina" + +#: plugins/views_plugin_display_block.inc:137 +msgid "Block admin description" +msgstr "Descrizione amministrazione blocco" + +#: plugins/views_plugin_display_block.inc:140 +msgid "This will appear as the name of this block in administer >> site building >> blocks." +msgstr "Verrà mostrato come nome di questo blocco in amministrazione >> struttura del sito >> blocchi." + +#: plugins/views_plugin_display_block.inc:145 +msgid "Block caching type" +msgstr "Tipo di cache del blocco" + +#: plugins/views_plugin_display_block.inc:149 +msgid "This sets the default status for Drupal's built-in block caching method; this requires that caching be turned on in block administration, and be careful because you have little control over when this cache is flushed." +msgstr "Questo imposta lo stato predefinito del metodo integrato di caching del blocco in Drupal; richiede che il caching sia attivato in amministrazione blocchi. Prestare attenzione poiché si ha poco controllo quando questa cache viene svuotata." + +#: plugins/views_plugin_display_feed.inc:86 +msgid "Feed settings" +msgstr "Impostazioni feed" + +#: plugins/views_plugin_display_feed.inc:90 +msgid "Using the site name" +msgstr "Usa il nome del sito" + +#: plugins/views_plugin_display_feed.inc:132 +msgid "Use the site name for the title" +msgstr "Per il titolo usa il nome del sito" + +#: plugins/views_plugin_display_feed.inc:149 +msgid "The feed icon will be available only to the selected displays." +msgstr "L'icona feed sarà disponibile solo nella visualizzazione selezionata." + +#: plugins/views_plugin_display_feed.inc:155 +msgid "This view will be displayed by visiting this path on your site. It is recommended that the path be something like \"path/%/%/feed\" or \"path/%/%/rss.xml\", putting one % in the path for each argument you have defined in the view." +msgstr "Questa vista sarà visualizzata visitando questo percorso sul sito. Si raccomanda che il percorso sia qualcosa del tipo \"percorso/%/%/feed\" oppure \"percorso/%/%/rss.xml\", mettendo un % nel percorso per ogni argomento definito nella vista." + +#: plugins/views_plugin_display_page.inc:213 +msgid "No menu" +msgstr "Nessun menu" + +#: plugins/views_plugin_display_page.inc:216 +msgid "Normal: @title" +msgstr "Normale: @title" + +#: plugins/views_plugin_display_page.inc:220 +msgid "Tab: @title" +msgstr "Scheda: @title" + +#: plugins/views_plugin_display_page.inc:236 +msgid "Change settings for the parent menu" +msgstr "Impostazioni cache per il menu genitore" + +#: plugins/views_plugin_display_page.inc:249 +msgid "The menu path or URL of this view" +msgstr "Il percorso del menu o URL di questa vista" + +#: plugins/views_plugin_display_page.inc:253 +msgid "This view will be displayed by visiting this path on your site. You may use \"%\" in your URL to represent values that will be used for arguments: For example, \"node/%/feed\"." +msgstr "Questa vista verrà visualizzata visitando questo percorso del sito. Negli URL si può usare \"%\" per rappresentare i valori che saranno utilizzati come argomenti. Per esempio, \"node/%/feed\"." + +#: plugins/views_plugin_display_page.inc:259 +msgid "Menu item entry" +msgstr "Inserimento voce di menu" + +#: plugins/views_plugin_display_page.inc:276 +msgid "No menu entry" +msgstr "Nessuna voce di menu" + +#: plugins/views_plugin_display_page.inc:277 +msgid "Normal menu entry" +msgstr "Voce di menu normale" + +#: plugins/views_plugin_display_page.inc:343,278 +msgid "Menu tab" +msgstr "Scheda menu" + +#: plugins/views_plugin_display_page.inc:279 +msgid "Default menu tab" +msgstr "Scheda menu predefinita" + +#: plugins/views_plugin_display_page.inc:288 +msgid "If set to normal or tab, enter the text to use for the menu item." +msgstr "Se impostato a normale o scheda, inserire il testo da usare per la voce del menu." + +#: plugins/views_plugin_display_page.inc:295 +msgid "Warning: Changing this item's menu will not work reliably in Drupal 6.4 or earlier. Please upgrade your copy of Drupal at !url." +msgstr "Attenzione: La modifica di questa voce del menu non funzionarà con attendibilità in Drupal 6.4 o precedente. Aggiornare Drupal a !url." + +#: plugins/views_plugin_display_page.inc:306 +msgid "Insert item into an available menu." +msgstr "Inserire la voce in un menu disponibile." + +#: plugins/views_plugin_display_page.inc:315 +msgid "The lower the weight the higher/further left it will appear." +msgstr "Minore è il peso, più in alto o più a sinistra sarà mostrato." + +#: plugins/views_plugin_display_page.inc:321 +msgid "Default tab options" +msgstr "Opzioni predefinite scheda" + +#: plugins/views_plugin_display_page.inc:330 +msgid "When providing a menu item as a tab, Drupal needs to know what the parent menu item of that tab will be. Sometimes the parent will already exist, but other times you will need to have one created. The path of a parent item will always be the same path with the last part left off. i.e, if the path to this view is foo/bar/baz, the parent path would be foo/bar." +msgstr "Quando si crea una voce di menu come scheda, Drupal ha bisogno di sapere quale sarà la voce di menu genitore di quella scheda. Alcune volte il genitore esiste già, mentre altre volte si deve crearne uno. Il percorso di una voce genitore sarà sempre lo stesso percorso con l'esclusione dell'ultima parte, cioè, se il percorso di questa vista è foo/bar/baz, il percorso genitore sarà foo/bar." + +#: plugins/views_plugin_display_page.inc:341 +msgid "Parent menu item" +msgstr "Voce genitore del menu" + +#: plugins/views_plugin_display_page.inc:343 +msgid "Already exists" +msgstr "Esiste già" + +#: plugins/views_plugin_display_page.inc:351 +msgid "If creating a parent menu item, enter the title of the item." +msgstr "Se si crea una voce genitore del menu, inserire il titolo della voce." + +#: plugins/views_plugin_display_page.inc:357 +msgid "Tab weight" +msgstr "Peso della scheda" + +#: plugins/views_plugin_display_page.inc:361 +msgid "If the parent menu item is a tab, enter the weight of the tab. The lower the number, the more to the left it will be." +msgstr "Se la voce genitore del menu è una scheda, inserire il peso della scheda. più basso è il numero, più a sinistra sarà la scheda." + +#: plugins/views_plugin_display_page.inc:375 +msgid "\"$arg\" is no longer supported. Use % instead." +msgstr "\"$arg\" non è più supportato. Usare invece %." + +#: plugins/views_plugin_display_page.inc:379 +msgid "\"%\" may not be used for the first segment of a path." +msgstr "\"%\" non può essere usato nel primo segmento di un percorso." + +#: plugins/views_plugin_display_page.inc:389 +msgid "Views cannot create normal menu items for paths with a % in them." +msgstr "Le viste non possono creare voci di menu normali per i percorsi che contengono un %." + +#: plugins/views_plugin_display_page.inc:396 +msgid "A display whose path ends with a % cannot be a tab." +msgstr "Una visualizzazione il cui percorso termina con un % non può essere una scheda." + +#: plugins/views_plugin_display_page.inc:401 +msgid "Title is required for this menu type." +msgstr "È richiesto il titolo per questo tipo di menu." + +#: plugins/views_plugin_display_page.inc:432 +msgid "Display @display is set to use a menu but the menu title is not set." +msgstr "La visualizzazione @display è impostata per usare un menu ma il titolo del menu non è specificato." + +#: plugins/views_plugin_display_page.inc:438 +msgid "Display @display is set to use a parent menu but the parent menu title is not set." +msgstr "La visualizzazione @display è impostata per usare un menu genitore ma il titolo del menu genitore non è specificato." + +#: plugins/views_plugin_row_fields.inc:40 +msgid "Inline fields" +msgstr "Campi allineati" + +#: plugins/views_plugin_row_fields.inc:43 +msgid "Inline fields will be displayed next to each other rather than one after another." +msgstr "I campi allineati saranno visualizzati uno in fianco all'altro anziché uno dopo l'altro." + +#: plugins/views_plugin_row_fields.inc:51 +msgid "The separator may be placed between inline fields to keep them from squishing up next to each other. You can use HTML in this field." +msgstr "Il separatore può essere posizionato tra i campi allineati per impedirgli di schiacciarsi uno sull'altro. In questo campo si può usare l'HTML." + +#: plugins/views_plugin_style.inc:91 +msgid "Grouping field" +msgstr "Raggruppamento campi" + +#: plugins/views_plugin_style.inc:94 +msgid "You may optionally specify a field by which to group the records. Leave blank to not group." +msgstr "Si può specificare in via facoltativa un campo tramite il quale raggruppare le registrazioni. Lasciare vuoto per non raggruppare." + +#: plugins/views_plugin_style.inc:191 +msgid "Style @style requires a row style but the row plugin is invalid." +msgstr "Lo stile @style richiede uno stile riga ma il plugin riga non è valido." + +#: plugins/views_plugin_style_grid.inc:39 +msgid "Horizontal" +msgstr "Orizzontale" + +#: plugins/views_plugin_style_grid.inc:39 +msgid "Vertical" +msgstr "Verticale" + +#: plugins/views_plugin_style_grid.inc:41 +msgid "Horizontal alignment will place items starting in the upper left and moving right. Vertical alignment will place items starting in the upper left and moving down." +msgstr "L'allineamento orizzontale posizionerà le voci iniziando dalla parte superiore sinistra e spostandosi a destra. L'allineamento verticale posizionerà le voci iniziando dalla parte superiore sinistra e spostandosi in giù." + +#: plugins/views_plugin_style_rss.inc:56 +msgid "Use the site mission for the description" +msgstr "Usare la mission del sito per la descrizione" + +#: plugins/views_plugin_style_rss.inc:60 +msgid "RSS description" +msgstr "Descrizione RSS" + +#: plugins/views_plugin_style_rss.inc:62 +msgid "This will appear in the RSS feed itself." +msgstr "Comparirà nel feed RSS." + +#: plugins/views_plugin_style_summary.inc:34 +msgid "Display record count with link" +msgstr "Visualizza il conteggio dei record con un link" + +#: plugins/views_plugin_style_summary.inc:39 +msgid "Override number of items to display" +msgstr "Modifica il numero di voci da visualizzare" + +#: plugins/views_plugin_style_summary_unformatted.inc:26 +msgid "Display items inline" +msgstr "Visualizza le voci allineate" + +#: plugins/views_plugin_style_table.inc:126 +msgid "You need at least one field before you can configure your table settings" +msgstr "È necessario almeno un campo prima di poter configurare le impostazioni della tabella" + +#: plugins/views_plugin_style_table.inc:135 +msgid "Override normal sorting if click sorting is used" +msgstr "Modifica l'ordinamento normale se viene usato l'ordinamento tramite click" + +#: plugins/views_plugin_style_table.inc:141 +msgid "Enable Drupal style \"sticky\" table headers (Javascript)" +msgstr "Attiva lo stile di Drupal intestazioni tabelle \"fisse in cima\" (Javascript)" + +#: plugins/views_plugin_style_table.inc:143 +msgid "(Sticky header effects will not be active for preview below, only on live output.)" +msgstr "(L'effetto intestazioni fisse in cima non sarà attivo per l'anteprima sotto, ma solo nell'output vero e prorio.)" + +#: plugins/views_plugin_style_table.inc:148 +msgid "Default sort order" +msgstr "Ordinamento predefinito" + +#: plugins/views_plugin_style_table.inc:151 +msgid "If a default sort order is selected, what order should it use by default." +msgstr "Se viene selezionato un ordinamento predefinito, quale ordine deve essere usato in modo predefinito" + +#: plugins/views_plugin_style_table.inc:237 +msgid "Place fields into columns; you may combine multiple fields into the same column. If you do, the separator in the column specified will be used to separate the fields. Check the sortable box to make that column click sortable, and check the default sort radio to determine which column will be sorted by default, if any. You may control column order and field labels in the fields section." +msgstr "Inserire i campi nelle colonne; si possono combinare campi multipli nella stessa colonna. Se lo si fa, il separatore nella colonna specificata sarà usato per separare i campi. Selezionare la casella ordinabile per rendere la colonna ordinabile tramite click e selezionare il bottone radio predefinito ordina per determinare quale colonna verrà ordinata in modo predefinito. È possibile gestire l'ordine delle colonne e le etichette dei campi nella sezione campi." + +#: theme/views-ui-edit-item.tpl.php:32 +msgid "The style selected does not utilize fields." +msgstr "Lo stile selezionato non utilizza i campi." + +#: theme/views-ui-edit-item.tpl.php:34 +msgid "None defined" +msgstr "Non definito" + +#: theme/views-ui-edit-view.tpl.php:11 +msgid "This view is being edited by user !user, and is therefore locked from editing by others. This lock is !age old. Click here to break this lock." +msgstr "Questa vista sta venendo modificata dall'utente !user ed è perciò bloccata alle modifiche di altri. Questo blocco è vecchio di !age. Cliccare qui per interrompere il blocco." + +#: theme/views-ui-edit-view.tpl.php:16 +msgid "New view" +msgstr "Nuova vista" + +#: theme/views-ui-edit-view.tpl.php:18 +msgid "Changed view" +msgstr "Vista modificata" + +#: theme/views-ui-edit-view.tpl.php:23 +msgid "View %name, displaying items of type @base." +msgstr "Vista %name, visualizza voci del tipo @base." + +#: theme/views-ui-edit-view.tpl.php:42 +msgid "Live preview" +msgstr "Anteprima in diretta" + +#: theme/views-ui-list-views.tpl.php:17 +msgid "@type @base view: @view" +msgstr "@type @base vista: @view" + +#: theme/views-ui-list-views.tpl.php:27 +msgid "Title: @title" +msgstr "Titolo: @title" + +#: theme/views-ui-list-views.tpl.php:30 +msgid "Path: !path" +msgstr "Percorso: !path" + +#: theme/theme.inc:90 +msgid "Edit this view" +msgstr "Modifica questa vista" + +#: theme/theme.inc:559 +msgid "‹‹" +msgstr "‹‹" + +#: theme/theme.inc:560 +msgid "››" +msgstr "››" + +#: theme/theme.inc:570 +msgid "@current of @max" +msgstr "@current di @max" + +#: views_export/views_export.module:76 +msgid "There are no views to be exported at this time." +msgstr "Al momento non ci sono viste da esportare." + +#: views_export/views_export.module:108 +msgid "Show only these tags" +msgstr "Mostra solo questi tag" + +#: views_export/views_export.module:122 +msgid "Module name" +msgstr "Nome modulo" + +#: views_export/views_export.module:123 +msgid "Enter the module name to export code to." +msgstr "Inserire il nome del modulo per il quale si esporta il codice." + +#: views_export/views_export.module:190 +msgid "Put this in @module.views_default.inc in your modules/@module directory or modules/@module/includes directory" +msgstr "Metterlo in @module.views_default.inc nella cartella modules/@module oppure nella cartella modules/@module/includes" + +#: views_export/views_export.info:0 +msgid "Views exporter" +msgstr "Esportatore Viste" + diff --git a/translations/pl.po b/translations/pl.po new file mode 100644 index 0000000000000000000000000000000000000000..1bc68b2cf7470cf61ed209fd64f911b75e47de03 --- /dev/null +++ b/translations/pl.po @@ -0,0 +1,3994 @@ +# $Id$ +# +# LANGUAGE translation of Drupal (general) +# Copyright YEAR NAME +# Generated from files: +# views.module,v 1.294 2008/06/11 19:32:46 merlinofchaos +# admin.inc,v 1.115 2008/06/11 19:32:47 merlinofchaos +# views_ui.module,v 1.99 2008/06/04 00:09:53 merlinofchaos +# views_export.module,v 1.1 2008/06/12 16:17:25 merlinofchaos +# views.info,v 1.7 2007/08/12 06:52:14 merlinofchaos +# views_ui.info,v 1.10 2008/01/09 00:05:08 merlinofchaos +# views_export.info,v 1.1 2008/06/12 16:17:25 merlinofchaos +# plugins.inc,v 1.118 2008/06/13 15:50:00 merlinofchaos +# convert.inc,v 1.9 2008/06/11 18:42:11 merlinofchaos +# theme.inc,v 1.50 2008/06/10 22:10:20 merlinofchaos +# views.install,v 1.41 2008/06/03 23:50:44 merlinofchaos +# docs.php,v 1.7 2008/06/07 00:12:11 merlinofchaos +# node.views.inc,v 1.72 2008/06/11 01:22:03 merlinofchaos +# view.inc,v 1.108 2008/06/10 22:10:20 merlinofchaos +# system.views.inc,v 1.5 2008/06/03 22:34:46 merlinofchaos +# user.views.inc,v 1.44 2008/06/03 22:34:46 merlinofchaos +# argument.handlers.inc,v 1.25 2008/06/03 22:36:55 merlinofchaos +# comment.views.inc,v 1.16 2008/06/03 22:34:46 merlinofchaos +# statistics.views.inc,v 1.6 2008/06/03 22:34:46 merlinofchaos +# upload.views.inc,v 1.8 2008/06/03 22:34:46 merlinofchaos +# book.views.inc,v 1.3 2008/04/10 20:23:30 merlinofchaos +# taxonomy.views.inc,v 1.31 2008/06/10 18:35:26 merlinofchaos +# ajax.inc,v 1.14 2008/06/03 22:34:46 merlinofchaos +# field.handlers.inc,v 1.12 2008/06/03 22:34:46 merlinofchaos +# filter.handlers.inc,v 1.20 2008/06/03 23:34:39 merlinofchaos +# relationship.handlers.inc,v 1.5 2008/06/03 22:34:46 merlinofchaos +# handlers.inc,v 1.84 2008/06/10 18:35:26 merlinofchaos +# sort.handlers.inc,v 1.5 2008/06/03 22:34:46 merlinofchaos +# ajax.js,v 1.21 2008/05/27 22:31:59 merlinofchaos +# ajax_view.js,v 1.5 2008/05/27 22:31:59 merlinofchaos +# tabs.js,v 1.3 2008/03/30 15:58:26 merlinofchaos +# poll.views.inc,v 1.2 2008/03/12 04:32:07 merlinofchaos +# profile.views.inc,v 1.6 2008/04/21 17:52:10 merlinofchaos +# search.views.inc,v 1.7 2008/06/03 23:53:05 merlinofchaos +# views.views.inc,v 1.3 2008/06/03 22:34:46 merlinofchaos +# views-more.tpl.php,v 1.2 2008/04/11 08:46:26 merlinofchaos +# views-ui-edit-item.tpl.php,v 1.7 2008/05/09 19:32:12 merlinofchaos +# views-ui-edit-tab.tpl.php,v 1.10 2008/05/14 00:30:25 merlinofchaos +# views-ui-edit-view.tpl.php,v 1.8 2008/05/14 00:52:10 merlinofchaos +# views-ui-list-views.tpl.php,v 1.5 2008/05/08 05:29:30 merlinofchaos +# +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"POT-Creation-Date: 2008-06-15 10:44+0200\n" +"PO-Revision-Date: 2008-10-07 13:02+0100\n" +"Last-Translator: Bartlomiej Opajdowski \n" +"Language-Team: Polish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Poedit-Language: Polish\n" +"X-Poedit-Country: POLAND\n" + +#: views.module:625 +msgid "Skipping broken view @view" +msgstr "Pomiń uszkodzony widok @view" + +#: views.module:672;712 +#: includes/admin.inc:92;253;253;599 +msgid "Overridden" +msgstr "Nadpisany" + +#: views.module:675;708 +#: views_ui.module:284 +#: includes/admin.inc:91;252;252;566;738 +msgid "Default" +msgstr "Domyślny" + +#: views.module:824 +#: includes/admin.inc:286 +#: views_export/views_export.module:116 +msgid "Apply" +msgstr "Zastosuj" + +#: views.module:109 +#: views_ui.module:23 +#: views.info:0;0 +#: views_ui.info:0 +#: views_export/views_export.info:0 +msgid "Views" +msgstr "Widoki" + +#: views.module:114 +msgid "Ajax callback for view loading." +msgstr "funkcja zwrotna dla asynchronicznego ładowania widoku." + +#: views.module:0 +msgid "views" +msgstr "widoki" + +#: views_ui.module:158 +msgid "The converter will make a best-effort attempt to convert a Views 1 view to Views 2. This conversion is not reliable; you will very likely have to make adjustments to your view to get it to match. You can import Views 1 views through the normal Import tab." +msgstr "Konwerter próbuje przetworzyć widoki Views 1 na Views 2. Konwersja nie jest niezawodna; Być może będzie trzeba coś dopasować. Możesz importować widoki Views 1 używając zakładki Import." + +#: views_ui.module:25 +msgid "Views are customized lists of content on your system; they are highly configurable and give you control over how lists of content are presented." +msgstr "Widoki są spersonalizowaną listą zawartości; Są wysoce konfigurowywalne i dają kontrolę nad prezentowaną listą zawartości." + +#: views_ui.module:29 +#: includes/plugins.inc:88;116 +msgid "List" +msgstr "Lista" + +#: views_ui.module:35 +#: includes/admin.inc:1081;1081;2093 +msgid "Add" +msgstr "Dodaj" + +#: views_ui.module:40 +#: includes/admin.inc:702 +msgid "Import" +msgstr "Importuj" + +#: views_ui.module:46 +msgid "Tools" +msgstr "Narzędzia" + +#: views_ui.module:52 +msgid "Basic" +msgstr "Podstawowy" + +#: views_ui.module:60 +#: includes/convert.inc:30 +msgid "Convert" +msgstr "Konweruj" + +#: views_ui.module:61 +msgid "Convert stored Views 1 views." +msgstr "Konwertuj widok Views 1" + +#: views_ui.module:67;80;85 +msgid "Delete view" +msgstr "Usuń widok" + +#: views_ui.module:73 +msgid "Convert view" +msgstr "Konwertuj widok" + +#: views_ui.module:110 +#: includes/admin.inc:87 +#: theme/theme.inc:89 +msgid "Edit" +msgstr "Edytuj" + +#: views_ui.module:0 +msgid "views_ui" +msgstr "views_ui" + +#: views.install:31 +msgid "Stores the general data for a view." +msgstr "Przechowuje główne dane dla widoku." + +#: views.install:37 +msgid "The view ID of the field, defined by the database." +msgstr "ID widoku definiowane przez bazę danych." + +#: views.install:45 +msgid "The unique name of the view. This is the primary field views are loaded from, and is used so that views may be internal and not necessarily in the database. May only be alphanumeric characters plus underscores." +msgstr "Unikalna nazwa widoku. To " + +#: views.install:51 +msgid "A description of the view for the admin interface." +msgstr "Opis widoku dla interfejsu administracyjnego." + +#: views.install:57 +msgid "A tag used to group/sort views in the admin interface" +msgstr "Tag używany do grupowania/sortowania interfejsu administracyjnego" + +#: views.install:61 +msgid "A chunk of PHP code that can be used to provide modifications to the view prior to building." +msgstr "Kawałek kodu PHP do modyfikacjimodyfikacji widoku zanim ten zostanie zbudowany." + +#: views.install:68 +msgid "What table this view is based on, such as node, user, comment, or term." +msgstr "Na jakiej tabeli bazuje widok: segment, użytkownik, komentarz, wyrażenie." + +#: views.install:74 +msgid "A boolean to indicate whether or not this view may have its query cached." +msgstr "Wartość boolean oznaczająca czy zapytania powinny używać pamięci podręcznej czy też nie." + +#: views.install:82 +msgid "Stores information about each display attached to a view." +msgstr "Przechowuje informację o każdym podglądzie dołączonym do widoku." + +#: views.install:89 +msgid "The view this display is attached to." +msgstr "Widok dołączonego podglądu." + +#: views.install:97 +msgid "An identifier for this display; usually generated from the display_plugin, so should be something like page or page_1 or block_2, etc." +msgstr "Identyfikator tego podglądu; zwykle generowany z display_plugin, więc powinien wyglądać mniej sięcej jak: page_1 albo block_2 itp." + +#: views.install:104 +msgid "The title of the display, viewable by the administrator." +msgstr "Tytuł podglądu, widoczny dla administratora." + +#: views.install:111 +msgid "The type of the display. Usually page, block or embed, but is pluggable so may be other things." +msgstr "Typ podglądu. Zwykle strona, blok lub osadzony fragment, ma charakter pluginu, więc może być czymkolwiek." + +#: views.install:116 +msgid "The order in which this display is loaded." +msgstr "Kolejność ładowania podglądów." + +#: views.install:120 +msgid "A serialized array of options for this display; it contains options that are generally only pertinent to that display plugin type." +msgstr "Zserializowana tablica opcji dla tego podglądu; zawiera tylko opcje które są właściwe do wyświetlania typu plugina." + +#: views.install:131 +msgid "A special cache used to store objects that are being edited; it serves to save state in an ordinarily stateless environment." +msgstr "Specjalna pamięć podręczna używana do przechowywania obiektów będących w trakcie edycji; " + +#: views.install:136 +msgid "The session ID this cache object belongs to." +msgstr "ID sesji do której należy obiekt pamięci podręcznej." + +#: views.install:141 +msgid "The name of the view this cache is attached to." +msgstr "Nazwa widoku do którego dołączona jest ta pamięć podręczna." + +#: views.install:146 +msgid "The name of the object this cache is attached to; this essentially represents the owner so that several sub-systems can use this cache." +msgstr "Nazwa obiektu do którego dołączona jest ta pamięć podręczna. Określa dokładnie właścicela, tak więc klika podsystemów może jej używać." + +#: views.install:153 +msgid "The time this cache was created or updated." +msgstr "Czas utworzenia lub uaktualnienia pamięci podręcznej." + +#: views.install:157 +msgid "Serialized data being stored." +msgstr "Zserializowane dane będą zachowane." + +#: views.info:0 +msgid "Create customized lists and queries from your database." +msgstr "Tworzy własną listę zapytań z Twojej bazy danych." + +#: views_ui.info:0 +msgid "Views UI" +msgstr "Panel administracyjny widoków" + +#: views_ui.info:0 +msgid "Administrative interface to views. Without this module, you cannot create or edit your views." +msgstr "Administrowalny interfejs widoków. Bez tego modułu nie będzie możliwe tworzenie i edytowanie własnych widoków." + +#: docs/docs.php:106 +msgid "Emulates the default Drupal front page; you may set the default home page path to this view to make it your front page." +msgstr "Emuluje domyślną główną strone Drupala; możesz ustawić ścieżkę domyślnej strony domowej na ten widok aby była stroną główną" + +#: docs/docs.php:107 +msgid "default" +msgstr "domyślny" + +#: docs/docs.php:116 +#: includes/plugins.inc:18 +msgid "Defaults" +msgstr "Ustawienia domyślne" + +#: docs/docs.php:205 +#: includes/plugins.inc:32;40 +msgid "Page" +msgstr "Strona" + +#: docs/docs.php:260 +#: includes/plugins.inc:65;72 +msgid "Feed" +msgstr "Kanał" + +#: docs/docs.php:328 +msgid "Front page feed" +msgstr "Kanał strony głównej" + +#: includes/admin.inc:34 +msgid "If you install the advanced help module from !href, Views will provide more and better help. Hide this message." +msgstr "Obszerniejsza pomoc dla modułu widoków znajduje się tutaj: !href . Ukryj tą wiadomość." + +#: includes/admin.inc:88;900 +#: theme/theme.inc:96 +#: views_export/views_export.module:128 +msgid "Export" +msgstr "Eksportuj" + +#: includes/admin.inc:89;905 +#: theme/theme.inc:101 +msgid "Clone" +msgstr "Klonuj" + +#: includes/admin.inc:92 +msgid "Revert" +msgstr "Odwróć" + +#: includes/admin.inc:92;612;774 +#: includes/convert.inc:35;109 +msgid "Delete" +msgstr "Usuń" + +#: includes/admin.inc:97 +msgid "Disable" +msgstr "Wyłącz" + +#: includes/admin.inc:100 +msgid "Enable" +msgstr "Włącz" + +#: includes/admin.inc:106 +msgid "Warning! Broken view!" +msgstr "Ostrzeżenie! Uszkodzony widok!" + +#: includes/admin.inc:121 +msgid "Broken" +msgstr "Uszkodzony" + +#: includes/admin.inc:180 +msgid "Install the advanced help module for the getting started" +msgstr "Instalacja dodatkowego modułu pomocy" + +#: includes/admin.inc:183 +msgid "Not sure what to do? Try the \"!getting-started\" page." +msgstr "Nie jesteś pewien co zrobić? Spróbuj na stronie \"!getting-started\"." + +#: includes/admin.inc:197;250;2059 +msgid "" +msgstr "" + +#: includes/admin.inc:198 +#: includes/plugins.inc:2820 +msgid "" +msgstr "" + +#: includes/admin.inc:213;264;985 +#: views_export/views_export.module:146 +msgid "Tag" +msgstr "Tag" + +#: includes/admin.inc:229 +msgid "Displays" +msgstr "Podglądy" + +#: includes/admin.inc:241;266 +#: includes/plugins.inc:1102;2079 +#: modules/node.views.inc:139 +msgid "Type" +msgstr "Typ" + +#: includes/admin.inc:248 +msgid "Storage" +msgstr "Magazyn(storage)" + +#: includes/admin.inc:251;251 +#: includes/view.inc:993;1043 +msgid "Normal" +msgstr "Normalny" + +#: includes/admin.inc:260 +msgid "Sort by" +msgstr "Sortuj po" + +#: includes/admin.inc:262 +#: includes/plugins.inc:805 +#: modules/system.views.inc:69 +#: modules/user.views.inc:59;79 +msgid "Name" +msgstr "Nazwa" + +#: includes/admin.inc:263;361 +#: includes/argument.handlers.inc:111 +#: includes/plugins.inc:817;2091;2136 +#: modules/comment.views.inc:44 +#: modules/node.views.inc:84;402 +msgid "Title" +msgstr "Tytuł" + +#: includes/admin.inc:265;369 +#: includes/plugins.inc:2008 +#: modules/statistics.views.inc:146 +#: modules/system.views.inc:88 +msgid "Path" +msgstr "Ścieżka" + +#: includes/admin.inc:267 +#: includes/convert.inc:21 +#: modules/upload.views.inc:48 +#: views_export/views_export.module:146 +msgid "Description" +msgstr "Opis" + +#: includes/admin.inc:274 +msgid "Order" +msgstr "Kolejność" + +#: includes/admin.inc:276 +msgid "Up" +msgstr "Rosnąco" + +#: includes/admin.inc:277 +msgid "Down" +msgstr "Malejąco" + +#: includes/admin.inc:360;379 +msgid "Query" +msgstr "Zapytanie(query)" + +#: includes/admin.inc:366 +msgid "This display has no path." +msgstr "Ten podgląd nie ma podanej ścieżki." + +#: includes/admin.inc:371 +msgid "Query build time" +msgstr "Czas budowania zapytania" + +#: includes/admin.inc:371;372;373 +msgid "@time ms" +msgstr "@time ms" + +#: includes/admin.inc:372 +msgid "Query execute time" +msgstr "Czas wykonywania zapytania" + +#: includes/admin.inc:373 +msgid "View render time" +msgstr "Czas tworzenia widoku" + +#: includes/admin.inc:379 +msgid "No query was run" +msgstr "Żadne zapytanie nie zostało wykonane" + +#: includes/admin.inc:386 +msgid "Unable to preview due to validation errors." +msgstr "Nie mogę podejrzeć prawidłowego sprawdzania błędów." + +#: includes/admin.inc:437 +msgid "Display" +msgstr "Podgląd" + +#: includes/admin.inc:445 +#: includes/view.inc:1670 +msgid "Arguments" +msgstr "Argumenty" + +#: includes/admin.inc:447 +msgid "Separate arguments with a / as though they were a URL path." +msgstr "Argumenty oddzielamy / tak jak by były ścieżką w URLu." + +#: includes/admin.inc:453 +msgid "Preview" +msgstr "Podgląd" + +#: includes/admin.inc:491 +msgid "Clone view @view" +msgstr "Sklonuj widok @view" + +#: includes/admin.inc:504;691 +#: includes/convert.inc:20 +msgid "View name" +msgstr "Nazwa widoku" + +#: includes/admin.inc:505 +msgid "This is the unique name of the view. It must contain only alphanumeric characters and underscores; it is used to identify the view internally and to generate unique theming template names for this view. If overriding a module provided view, the name must not be changed or instead a new view will be created." +msgstr "To jest unikalna nazwa widoku. Może zawierać tylko znaki alfanumeryczne i podkreślenia; używana jest do identyfikowania widoku wewnętrznie i do generowania unikalnych nazw wzorów dla tego widoku. Jeśli nadpisujemy dostarczony wraz z modułem widok, nazwa nie może zostać zmieniona albo zostanie utworzony nowy widok." + +#: includes/admin.inc:513;1769 +msgid "View description" +msgstr "Opis widoku" + +#: includes/admin.inc:514;1770 +msgid "This description will appear on the Views administrative UI to tell you what the view is about." +msgstr "Ten opis ukaże się w panelu administracyjnym użytkownika, abyś wiedział do czego ten widok służy" + +#: includes/admin.inc:520;1776 +msgid "View tag" +msgstr "Tag widoku" + +#: includes/admin.inc:521;1777 +msgid "Enter an optional tag for this view; it is used only to help sort views on the administrative page." +msgstr "Wprowadź opcjonalny tag dla tego widoku; Będzie on używany by pomóc w ich sortowaniu na stronie administracyjnej." + +#: includes/admin.inc:533 +msgid "View type" +msgstr "Typ widoku" + +#: includes/admin.inc:534 +msgid "The view type is the primary table for which information is being retrieved. The view type controls what arguments, fields, sort criteria and filters are available, so once this is set it cannot be changed." +msgstr "Typ widoku jest pierwszą tabelą dla której informacje zostaną odzyskane. Typ widoku kontroluje jakie argumenty, pola, kryteria sortowania i filtry są dostępne, więc raz ustawione nie mogą być zmieniane." + +#: includes/admin.inc:545 +msgid "Next" +msgstr "Następne" + +#: includes/admin.inc:561 +msgid "View name must be alphanumeric or underscores only." +msgstr "Nazwa widoku może zawierać tylko znaki alfanumeryczne albo podkreślenia." + +#: includes/admin.inc:567 +msgid "You must use a unique name for this view." +msgstr "Musisz użyć unikalnej nazwy dla tego widoku." + +#: includes/admin.inc:600 +msgid "Are you sure you want to revert the view %name?" +msgstr "Jesteś pewny że chcesz powrócić do nazwy widoku %name?" + +#: includes/admin.inc:601 +msgid "Reverting the view will delete the view that is in the database, reverting it to the original default view. Any changes you have made will be lost and cannot be recovered." +msgstr "Przywracanie widoku spowoduje skasowanie widoku z bazy danych i przywrócenie oryginalnie dostarczonego widoku. Wszystkie zmiany które zrobiłeś będą utracone i nie będą mogły być odtworzone." + +#: includes/admin.inc:604 +#: includes/convert.inc:105 +msgid "Are you sure you want to delete the view %name?" +msgstr "Jesteś pewien że chcesz skasować widok %name?" + +#: includes/admin.inc:605 +msgid "Deleting a view cannot be undone." +msgstr "Kasowanie nie może być cofnięte." + +#: includes/admin.inc:613;649;767;1225 +#: includes/convert.inc:110 +msgid "Cancel" +msgstr "Anuluj" + +#: includes/admin.inc:622 +msgid "The view has been deleted." +msgstr "Widok został skasowany." + +#: includes/admin.inc:634 +msgid "There is no lock on view %view to break." +msgstr "Nie ma blokad do złamania na widoku %view." + +#: includes/admin.inc:644 +msgid "Are you sure you want to break the lock on view %name?" +msgstr "Jesteś pewien, że chcesz złamać blokadę na widoku %name?" + +#: includes/admin.inc:647 +msgid "By breaking this lock, any unsaved changes made by !user will be lost!" +msgstr "Przez złamanie tej blokady wszystkie niezapisane zmiany zrobione przez !user będą utracone!" + +#: includes/admin.inc:648 +msgid "Break lock" +msgstr "Złam blokadę" + +#: includes/admin.inc:665 +msgid "Edit view \"%view\"" +msgstr "Edytuj widok \"%view\"" + +#: includes/admin.inc:692 +msgid "Enter the name to use for this view if it is different from the source view. Leave blank to use the name of the view." +msgstr "Wprowadź nazwę używaną dla tego widoku jeśli jest inna niż źródłowa. Pozostaw puste aby użyć oryginalnej nazwy widoku." + +#: includes/admin.inc:697 +msgid "Paste view code here" +msgstr "Wklej kod widoku tutaj" + +#: includes/admin.inc:719 +msgid "Unable to interpret view code." +msgstr "Nie można zinterpretować kodu widoku." + +#: includes/admin.inc:726 +msgid "You are importing a view created in Views version 1. You may need to adjust some parameters to work correctly in version 2." +msgstr "Importujesz widok utworzony w Views 1. Prawdopodobnie trzeba będzie poprawić część parametrów aby widok działał z wersją widoków View 2." + +#: includes/admin.inc:729 +msgid "That view is not compatible with this version of Views." +msgstr "Ten widok nie jest kompatybilny z tą wersją Widoków." + +#: includes/admin.inc:739 +msgid "A view by that name already exists; please choose a different name" +msgstr "Widok o takiej nazwie juz istnieje; nazwij go inaczej" + +#: includes/admin.inc:760;788 +msgid "Save" +msgstr "Zachowaj" + +#: includes/admin.inc:812 +msgid "The view has been saved." +msgstr "Widok został zachowany." + +#: includes/admin.inc:851 +msgid "Unknown or missing table name" +msgstr "Nieznana lub utracona nazwa tabeli" + +#: includes/admin.inc:856 +msgid "Click on an item to edit that item's details." +msgstr "Kliknij na pozycję aby edytować jej szczegóły." + +#: includes/admin.inc:859 +msgid "This view has a broken default display and cannot be used." +msgstr "Ten widok nie może być użyty, gdyż został uszkodzony podgląd domyślny." + +#: includes/admin.inc:895 +msgid "break this lock" +msgstr "złam tą blokadę" + +#: includes/admin.inc:901 +#: theme/theme.inc:97 +msgid "Export this view" +msgstr "Eksportuj ten widok" + +#: includes/admin.inc:906 +#: theme/theme.inc:102 +msgid "Create a copy of this view" +msgstr "Stwórz kopię tych widoków" + +#: includes/admin.inc:917 +msgid "View \"!display\"" +msgstr "Podgląd \"!display\"" + +#: includes/admin.inc:918 +msgid "Go to the real page for this display" +msgstr "Idź do właściwej strony podglądu." + +#: includes/admin.inc:984 +#: includes/plugins.inc:812;943;955;1999;2293;2467;2659;3299 +msgid "None" +msgstr "Nic" + +#: includes/admin.inc:1058 +msgid "Invalid" +msgstr "Nieprawidłowy" + +#: includes/admin.inc:1058 +msgid "Error: Display @display refers to a plugin named '@plugin', but that plugin doesn't exist!" +msgstr "Błąd: Podgląd @display odwołuje się do nieistniejącego pluginu '@plugin'" + +#: includes/admin.inc:1079;1079 +msgid "Rearrange" +msgstr "Popraw" + +#: includes/admin.inc:1112;2144;2323;2391;2476 +msgid "Error: handler for @table > @field doesn't exist!" +msgstr "Błąd: uchwyt dla @table > @field nie istnieje!" + +#: includes/admin.inc:1131;1131;1140 +msgid "Settings" +msgstr "Ustawienia" + +#: includes/admin.inc:1136 +#: includes/plugins.inc:823;841 +msgid "Missing style plugin" +msgstr "Utracony styl pluginu" + +#: includes/admin.inc:1140 +#: includes/plugins.inc:836;851 +msgid "Change settings for this style" +msgstr "Zmień ustawienia dla tego stylu" + +#: includes/admin.inc:1143 +msgid "   Style: !style" +msgstr "   Styl: !style" + +#: includes/admin.inc:1174 +msgid "Invalid display id while regenerating tabs" +msgstr "Niepoprawne ID podglądu przy odtwarzaniu zakładek" + +#: includes/admin.inc:1207 +msgid "Update" +msgstr "Uaktualnij" + +#: includes/admin.inc:1225 +msgid "Ok" +msgstr "Ok" + +#: includes/admin.inc:1494 +msgid "Unable to initialize default display" +msgstr "Nie można zainicjować domyślnego podglądu" + +#: includes/admin.inc:1526 +msgid "Add display" +msgstr "Dodaj podgląd" + +#: includes/admin.inc:1566 +msgid "Remove display" +msgstr "Usuń podgląd" + +#: includes/admin.inc:1577 +msgid "Restore display" +msgstr "Odtwórz podgląd" + +#: includes/admin.inc:1649 +msgid "Analyze" +msgstr "Analizuj" + +#: includes/admin.inc:1669 +msgid "This view has only a default display and therefore will not be placed anywhere on your site; perhaps you want to add a page or a block display." +msgstr "Ten widok posiada tylko podgląd domyślny dlatego nie będzie umieszczony nigdzie na Twojej stronie; prawdopodobnie chcesz dodać stronę albo blok podglądu." + +#: includes/admin.inc:1681 +msgid "View analysis" +msgstr "Analiza widoku" + +#: includes/admin.inc:1690 +msgid "View analysis can find nothing to report." +msgstr "Analiza widoku przebiegła poprawnie." + +#: includes/admin.inc:1764 +msgid "View details" +msgstr "Szczegóły widoku" + +#: includes/admin.inc:1805;1854;1904;2045;2137;2316;2384;2469 +msgid "Invalid display id @display" +msgstr "Niewłąsciwe ID podglądu @display" + +#: includes/admin.inc:1858 +msgid "Configure @type" +msgstr "Konfiguruj @type" + +#: includes/admin.inc:1908 +msgid "Rearrange @type" +msgstr "Popraw @type" + +#: includes/admin.inc:1951 +msgid "Broken field @id" +msgstr "Uszkodzone pole @id" + +#: includes/admin.inc:1986;1995;2232;2341 +msgid "Remove" +msgstr "Usuń" + +#: includes/admin.inc:1986;1986 +msgid "Remove this item" +msgstr "Usuń tą pozycję" + +#: includes/admin.inc:1992 +msgid "No fields available." +msgstr "Brak dostępnych pól" + +#: includes/admin.inc:1995 +#: includes/plugins.inc:2100 +#: modules/book.views.inc:57 +#: modules/taxonomy.views.inc:126 +#: modules/upload.views.inc:82 +msgid "Weight" +msgstr "Waga" + +#: includes/admin.inc:2051 +msgid "Add @type" +msgstr "Dodaj @type" + +#: includes/admin.inc:2062 +msgid "Groups" +msgstr "Grupy" + +#: includes/admin.inc:2081 +msgid "!group: !field" +msgstr "!group: !field" + +#: includes/admin.inc:2090 +msgid "There are no @types available to add." +msgstr "Brak dostępnych @types do dodania." + +#: includes/admin.inc:2155 +#: includes/plugins.inc:1556 +msgid "Status: using default values." +msgstr "Status: użyto domyślnych wartości." + +#: includes/admin.inc:2162 +#: includes/plugins.inc:1568 +msgid "Status: using overridden values." +msgstr "Status: nadpisano wartości." + +#: includes/admin.inc:2200 +msgid "Do not use a relationship" +msgstr "Nie używaj zależności" + +#: includes/admin.inc:2209 +#: includes/view.inc:1694;1695 +msgid "Relationship" +msgstr "Zależność" + +#: includes/admin.inc:2222 +msgid "Configure @type \"@item\"" +msgstr "Konfiguruj @type\"@item\"" + +#: includes/admin.inc:2331 +msgid "Configure extra settings for @type \"@item\"" +msgstr "Konfiuruj dodatkowe ustawienia dla @type \"@item\"" + +#: includes/admin.inc:2396 +msgid "Change summary style for @type \"@item\"" +msgstr "Zmien zbiorczy styl dla @type \"@item\"" + +#: includes/admin.inc:2419;2433 +msgid "Internal error: broken plugin." +msgstr "Wewnętrzny błąd: uszkodzony plugin." + +#: includes/admin.inc:2483 +msgid "Configure summary style for @type \"@item\"" +msgstr "Konfiguruj zmiorczy styl dla @type \"@item\"" + +#: includes/admin.inc:2575 +msgid "Clear Views' cache" +msgstr "Wyczyść pamięć podręczną widoków." + +#: includes/admin.inc:2581 +msgid "Add Views signature to all SQL queries" +msgstr "Dodaj sygnature widoku dla wszystkich zapytań SQL" + +#: includes/admin.inc:2582 +msgid "All Views-generated queries will include a special 'VIEWS' = 'VIEWS' string in the WHERE clause. This makes identifying Views queries in database server logs simpler, but should only be used when troubleshooting." +msgstr "Wszystkie wygenerowane zapytania będą zawierały 'VIEWS' = 'VIEWS' w sekcji WHERE. Pomoże to w identyfikacji zapytań wysyłanych przez widoki w logach ale powinno być używane tylko w momencie gdy szukamy błędów." + +#: includes/admin.inc:2588 +msgid "Disable views data caching" +msgstr "Wyłącz pamięć podręczną dla danych zawartych w widokach" + +#: includes/admin.inc:2589 +msgid "Views caches data about tables, modules and views available, to increase performance. By checking this box, Views will skip this cache and always rebuild this data when needed. This can have a serious performance impact on your site." +msgstr "Pamięć podręczna widoków przechowuje w pamięci podręcznej dane o tabelach, modułach i dostępności widoków aby zwiększyć wydajność. Zaznaczając to pole, widoki będą pomijać przechowywanie danych i będą zawsze odbudowywać dane kiedy zajdzie taka potrzeba. To może spowodować poważny spadek wydajności twojej witryny." + +#: includes/admin.inc:2595 +msgid "Ignore missing advanced help module" +msgstr "Ignoruj brak dodatkowy modułów pomocy" + +#: includes/admin.inc:2596 +msgid "Views uses the advanced help module to provide help text; if this module is not present Views will complain, unless this setting is checked." +msgstr "Widoki używają dodatkowych modułów pomocy; jeśli brak tego modułu Widoki będą to zgłaszały do momentu zaznaczenia." + +#: includes/admin.inc:2602 +msgid "Show query above live preview" +msgstr "Wyświetl zapytanie powyżej podglądu na żywo" + +#: includes/admin.inc:2603 +msgid "The live preview feature will show you the output of the view you're creating, as well as the view. Check here to show the query and other information above the view; leave this unchecked to show that information below the view." +msgstr "Podgląd na żywo pokazuje jak będzie wyglądał widok nad którym właśnie pracujesz. Zaznacz aby wyświetlać zapytania i inne informację powyżej widoku; gdy niezaznaczone, informację będą pojawiać się poniżej widoku." + +#: includes/admin.inc:2609 +msgid "Do not show hover links over views" +msgstr "Nie wyświetlaj \"fruwających\" odnośników do widoków" + +#: includes/admin.inc:2610 +msgid "To make it easier to administrate your views, Views provides 'hover' links to take you to the edit and export screen of a view whenever the view is used. This can be distracting on some themes, though; if it is problematic, you can turn it off here." +msgstr "Aby ułatwić administrowanie widokami, widoki dostarczają \"fruwające\" odnośniki aby dać możliwość edytowania czy eksportowania kiedy widok jest używany. Może to wprowadząć bałagan w niektórych skórkach, Jeśli tak się dzieje, można to wyłączyć własnie tutaj." + +#: includes/admin.inc:2616 +msgid "Enable views performance statistics via the Devel module" +msgstr "Włącz wydajność statystyk widoków przez moduł Devel" + +#: includes/admin.inc:2617 +msgid "Check this to enable some Views query and performance statistics if Devel is installed." +msgstr "Zaznacz by włączyć zapytania Widoków i statystyki wydajności gdy moduł Devel jest zainstalowany." + +#: includes/admin.inc:2623 +msgid "Disable javascript with Views" +msgstr "Wyłącz JavaStript w Widokach" + +#: includes/admin.inc:2624 +msgid "If you are having problems with the javascript, you can disable it here; the Views UI should degrade and still be usable without javascript, it just not as good." +msgstr "Jeśli masz problem z JavaScript, możesz wyłączyćto tutaj; Panel administracyjny Widoków powinien zachować funkcjonalność bez JavaScript, lecz nie pełną." + +#: includes/admin.inc:2632 +msgid "Page region to output performance statistics" +msgstr "Obszar strony do umieszczania statystyk wydajności" + +#: includes/admin.inc:2645 +msgid "The cache has been cleared." +msgstr "Pamięć podręczna została wyczyszczona." + +#: includes/admin.inc:2809 +msgid "Error: missing @component" +msgstr "Error: brak @component" + +#: includes/ajax.inc:73 +msgid "Server reports invalid input error." +msgstr "Serwer zwrócił błąd wejścia." + +#: includes/ajax.inc:74 +msgid "Error" +msgstr "Błąd" + +#: includes/argument.handlers.inc:91 +msgid "All" +msgstr "Wszystko" + +#: includes/argument.handlers.inc:113 +msgid "The title to use when this argument is present; it will override the title of the view and titles from previous arguments. You can use percent substitution here to replace with argument titles. Use \"%1\" for the first argument, \"%2\" for the second, etc." +msgstr "Tytuł używany kiedy argument istnieje; Nadpisze tytuł widoku obecnego i poprzednich argumentów. Możesz użyć '%n' aby zastąpić argument w tytule. Na przykład \"%1\" dla pierwszego argumentu itd." + +#: includes/argument.handlers.inc:126 +msgid "Action to take if argument is not present" +msgstr "Działanie podjęte gdy brak argumentu" + +#: includes/argument.handlers.inc:138 +msgid "Wildcard" +msgstr "Wildcard" + +#: includes/argument.handlers.inc:141 +msgid "If this value is received as an argument, the argument will be ignored; i.e, \"all values\"" +msgstr "Jeśli wartośc została otrzymana jako argument, argument zostanie zignorowany; Na przykład \"all values\" (wszystkie wartości)" + +#: includes/argument.handlers.inc:147 +msgid "Wildcard title" +msgstr "Tytuł dla Wildcard" + +#: includes/argument.handlers.inc:150 +msgid "The title to use for the wildcard in substitutions elsewhere." +msgstr "Tytuł używny dla zastąpienia gdzie indziej." + +#: includes/argument.handlers.inc:173 +msgid "Validator" +msgstr "Validator" + +#: includes/argument.handlers.inc:177 +msgid "" +msgstr "" + +#: includes/argument.handlers.inc:213 +msgid "Action to take if argument does not validate" +msgstr "Działanie podjęte gdy sprawdzanie nie powiodło się" + +#: includes/argument.handlers.inc:228 +msgid "Display all values" +msgstr "Wyświetl wszystkie wartości" + +#: includes/argument.handlers.inc:233 +msgid "Hide view / Page not found (404)" +msgstr "Ukryj widok / Nie odnaleziono strony (404)" + +#: includes/argument.handlers.inc:237 +msgid "Display empty text" +msgstr "Wyświetl pusty tekst" + +#: includes/argument.handlers.inc:242 +msgid "Summary, sorted ascending" +msgstr "Podsumowanie, posortowane rosnąco" + +#: includes/argument.handlers.inc:249 +msgid "Summary, sorted descending" +msgstr "Podsumowanie, posortowane malejąco" + +#: includes/argument.handlers.inc:256 +msgid "Provide default argument" +msgstr "Dostarcz domyślny argument" + +#: includes/argument.handlers.inc:287 +msgid "Default argument type" +msgstr "Domyślny typ argumentu" + +#: includes/argument.handlers.inc:702 +msgid "Current date" +msgstr "Dzisiejsza data" + +#: includes/argument.handlers.inc:757 +msgid "Glossary mode" +msgstr "Tryb Słownika" + +#: includes/argument.handlers.inc:758 +msgid "Glossary mode applies a limit to the number of characters used in the argument, which allows the summary view to act as a glossary." +msgstr "Ten tryb ustawia limit znaków użytych w argumencie w podsumowaniach Słownika." + +#: includes/argument.handlers.inc:764 +msgid "Character limit" +msgstr "Limit znaków" + +#: includes/argument.handlers.inc:765 +msgid "How many characters of the argument to filter against. If set to 1, all fields starting with the letter in the argument would be matched." +msgstr "Ile znaków w argumencie ma być filtrowanych. Jeśli ustawimy to na 1, wszystkie pola zaczynające się na 1 literę dostarczona w argumencie będą pasować" + +#: includes/argument.handlers.inc:773 +msgid "Case" +msgstr "w przypadku" + +#: includes/argument.handlers.inc:774 +msgid "When printing the argument result, how to transform the case." +msgstr "Jak przekształcić w przypadku kiedy wyświetlamy wynik dla argumentu." + +#: includes/argument.handlers.inc:776;790 +msgid "No transform" +msgstr "Nie przekształcaj" + +#: includes/argument.handlers.inc:777;791 +msgid "Upper case" +msgstr "Dużymi literami" + +#: includes/argument.handlers.inc:778;792 +msgid "Lower case" +msgstr "Małymi literami" + +#: includes/argument.handlers.inc:779;793 +msgid "Capitalize first letter" +msgstr "Pierwsza litera duża" + +#: includes/argument.handlers.inc:780;794 +msgid "Capitalize each word" +msgstr "Każde słowo zaczynaj wielką literą" + +#: includes/argument.handlers.inc:787 +msgid "Case in path" +msgstr "Przypadki w ścieżkach" + +#: includes/argument.handlers.inc:788 +msgid "When printing url paths, how to transform the of the argument. Do not use this unless with Postgres as it uses case sensitive comparisons." +msgstr "Jak przekształcić argument w URLu. Nie używaj dopóki Postgres jest wrażliwy na porównywanie wielkości znaków." + +#: includes/argument.handlers.inc:801 +msgid "Transform spaces to dashes in URL" +msgstr "Zmieniaj znaki spacji na _ w URL" + +#: includes/argument.handlers.inc:808;1046 +msgid "Allow multiple arguments to work together." +msgstr "Pozwól na pracę wielu argumentów razem." + +#: includes/argument.handlers.inc:809;1047 +msgid "If selected, multiple instances of this argument can work together, as though multiple terms were supplied to the same argument. This setting is not compatible with the \"Reduce duplicates\" setting." +msgstr "Jeśli pole jest zaznaczone wiele instancji argumentu może pracować razem, jak gdyby wiele wyrażeń było dostarczonych dla jednego argumentu. To ustawienie nie jest kompatybilne z \"Reduce duplicates\"(redukuj duplikaty)" + +#: includes/argument.handlers.inc:815;1053 +msgid "Do not display items with no value in summary" +msgstr "Nie wyświetlaj pozycji bez wartości w podsumowaniu" + +#: includes/argument.handlers.inc:936;1038 +msgid "Allow multiple terms per argument." +msgstr "Pozwól na wiele wyrażeń dla argumentu." + +#: includes/argument.handlers.inc:937 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3 or 1,2,3." +msgstr "Jeśli pole jest zaznaczone, użytkownik może wprowadzić wiele argumentów w postaci 1+2+3 lub 1,2,3." + +#: includes/argument.handlers.inc:943 +msgid "Exclude the argument" +msgstr "Wyklucz argument" + +#: includes/argument.handlers.inc:944 +msgid "If selected, the numbers entered in the argument will be excluded rather than limiting the view." +msgstr "Jeśli pole jest zaznaczone, wartości argumentów zostaną wykluczone." + +#: includes/argument.handlers.inc:951;963;1088;1102 +#: modules/taxonomy.views.inc:120;204;287 +msgid "Uncategorized" +msgstr "Nieskategoryzowany" + +#: includes/argument.handlers.inc:967;1106 +msgid "Invalid input" +msgstr "Nieprawidłowe wejscie" + +#: includes/argument.handlers.inc:1039 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3 (for OR) or 1,2,3 (for AND)." +msgstr "Jeśli pole jest zaznaczone, użytkownik może wprowadzić wiele argumentów 1+2+3 (dla OR) albo 1,2,3 (dla AND)." + +#: includes/convert.inc:14 +msgid "There are no Views 1 views stored in the database to convert." +msgstr "Brak widoków typu Views 1 do konwersji w bazie." + +#: includes/convert.inc:22 +msgid "Operations" +msgstr "Operacje" + +#: includes/convert.inc:33 +msgid "Converted" +msgstr "Skonwertowano" + +#: includes/convert.inc:68 +msgid "The table below lists Views version 1 views that are stored in the database. You can either convert them to work in Views version 2, or delete them. The views are convertible only if there is no Views 2 view with the same name." +msgstr "Tabela poniżej jest listą widoków Views 1 przechowywanych w bazie. Możesz je skonwertować do Views 2 lub je skasować. Widoki te są konwertowalne tylko jeśli nie istnieją widoki w wersji 2 o takiej samej nazwie." + +#: includes/convert.inc:79 +msgid "Unable to find view." +msgstr "Nie można znaleźć widoku." + +#: includes/convert.inc:89 +msgid "Unable to convert view." +msgstr "Nie można skonwertować widoku." + +#: includes/convert.inc:108 +msgid "This action cannot be undone." +msgstr "Tej akcji nie można cofnąć." + +#: includes/convert.inc:118 +msgid "The view has been deleted" +msgstr "Widok został skasowany" + +#: includes/field.handlers.inc:130 +#: includes/filter.handlers.inc:304 +#: includes/relationship.handlers.inc:60 +msgid "Label" +msgstr "Etykieta" + +#: includes/field.handlers.inc:132 +msgid "The label for this field that will be displayed to end users if the style requires it." +msgstr " Jeśli styl tego wymaga, etykieta dla tego pola zostanie wyświetlona użytkownikowi końcowemu." + +#: includes/field.handlers.inc:136 +msgid "Exclude from display" +msgstr "Wyklucz z podglądu" + +#: includes/field.handlers.inc:138 +msgid "Check this box to not display this field, but still load it in the view. Use this option to not show a grouping field in each record, or when doing advanced theming." +msgstr "Zaznacz jeśli nie chcesz aby podgląd był wyświetlany, ale wciąż ładowany do widoku. Użyj tej opcji aby nie pokazywać grup pól w każdym rekordzie, lub kiedy tworzysz zaawansowane motywy." + +#: includes/field.handlers.inc:223 +msgid "Date format" +msgstr "Format daty" + +#: includes/field.handlers.inc:228 +msgid "Custom" +msgstr "Własny" + +#: includes/field.handlers.inc:229 +msgid "Time ago" +msgstr "Time ago" + +#: includes/field.handlers.inc:235 +msgid "Custom date format" +msgstr "Własny format daty" + +#: includes/field.handlers.inc:236 +msgid "If \"Custom\", see the PHP docs for date formats. If \"Time ago\" this is the the number of different units to display, which defaults to two." +msgstr "Gdy chcesz użyć własnego formatu daty przeczytaj dokumentacje PHP. Jeżeli \"Time ago\" jest liczbą w innych jednostkach, domyślnie - dwa." + +#: includes/field.handlers.inc:252 +msgid "%time ago" +msgstr "%time ago" + +#: includes/field.handlers.inc:280 +msgid "Output format" +msgstr "Format wyjściowy" + +#: includes/field.handlers.inc:282 +msgid "Yes/No" +msgstr "Tak/Nie" + +#: includes/field.handlers.inc:283 +msgid "True/False" +msgstr "Prawda/Fałsz" + +#: includes/field.handlers.inc:284 +msgid "On/Off" +msgstr "Włącz/Wyłącz" + +#: includes/field.handlers.inc:290 +msgid "Reverse" +msgstr "Odwrotnie" + +#: includes/field.handlers.inc:291 +msgid "If checked, true will be displayed as false." +msgstr "Gdy zaznaczone, Prawda wyświetlana jest jako Fałsz." + +#: includes/field.handlers.inc:305 +#: includes/filter.handlers.inc:853;898 +#: includes/plugins.inc:858;867;884;892;1035;2446 +msgid "Yes" +msgstr "Tak" + +#: includes/field.handlers.inc:305 +#: includes/filter.handlers.inc:853;898 +#: includes/plugins.inc:858;867;884;892;1035;1043;2446 +msgid "No" +msgstr "Nie" + +#: includes/field.handlers.inc:307 +#: includes/filter.handlers.inc:822;863 +msgid "True" +msgstr "Prawda" + +#: includes/field.handlers.inc:307 +#: includes/filter.handlers.inc:863 +msgid "False" +msgstr "Fałsz" + +#: includes/field.handlers.inc:309 +msgid "On" +msgstr "Włącz" + +#: includes/field.handlers.inc:309 +msgid "Off" +msgstr "Wyłącz" + +#: includes/field.handlers.inc:368 +#: modules/statistics.views.inc:276 +msgid "Display as link" +msgstr "Wyświetlaj jako odnośnik" + +#: includes/field.handlers.inc:410 +#: modules/node.views.inc:1289 +msgid "Display type" +msgstr "Wyświetl typ" + +#: includes/field.handlers.inc:412 +#: includes/plugins.inc:2971 +msgid "Unordered list" +msgstr "Nieuporządkowana lista" + +#: includes/field.handlers.inc:413 +#: includes/plugins.inc:2971 +msgid "Ordered list" +msgstr "Uporządkowana lista" + +#: includes/field.handlers.inc:414 +msgid "Simple separator" +msgstr "Prosty separator" + +#: includes/field.handlers.inc:421 +#: includes/plugins.inc:3265;3376;3557 +msgid "Separator" +msgstr "Separator" + +#: includes/field.handlers.inc:429 +msgid "Empty list text" +msgstr "Puste pole tekstowe" + +#: includes/field.handlers.inc:431 +msgid "If the list is empty, you may enter text here that will be displayed." +msgstr "Jeśli lista jest pusta, możesz wprowadzić tekst który będzie wyświetlony." + +#: includes/field.handlers.inc:480 +msgid "Round" +msgstr "Zaokrąglaj" + +#: includes/field.handlers.inc:481 +msgid "If checked, the number will be rounded." +msgstr "Jesli pole jest zaznaczone, liczby będą zaokrąglane." + +#: includes/field.handlers.inc:486 +msgid "Precision" +msgstr "Dokładność" + +#: includes/field.handlers.inc:488 +msgid "Specify how many digits to print after the decimal point." +msgstr "Określa dokładnośc z jaka będą wyświetlane liczby po przecinku." + +#: includes/field.handlers.inc:495 +msgid "Decimal point" +msgstr "Separator dziesiętny" + +#: includes/field.handlers.inc:497 +msgid "What single character to use as a decimal point." +msgstr "Znak oddzielający liczbę od jej częsci dziesiętnej." + +#: includes/field.handlers.inc:503 +msgid "Thousands separator" +msgstr "Separator setek" + +#: includes/field.handlers.inc:505 +msgid "What single character to use as the thousands separator." +msgstr "Znak oddzielający setki w liczbie. np. 1000 ze spacją jako separatorem będzie wyglądać tak: 1 000" + +#: includes/field.handlers.inc:510 +msgid "Prefix" +msgstr "Prefix" + +#: includes/field.handlers.inc:512 +msgid "Text to put before the number, such as currency symbol." +msgstr "Tekst poprzedzający liczbę, taki jak na przykład $." + +#: includes/field.handlers.inc:516 +msgid "Suffix" +msgstr "Suffix" + +#: includes/field.handlers.inc:518 +msgid "Text to put after the number, such as currency symbol." +msgstr "Tekst dołączany na końcu liczby np. zł" + +#: includes/filter.handlers.inc:119 +msgid "Operator" +msgstr "Operator" + +#: includes/filter.handlers.inc:183 +msgid "Expose" +msgstr "Ujawnij" + +#: includes/filter.handlers.inc:188 +msgid "This item is currently not exposed. If you expose it, users will be able to change the filter as they view it." +msgstr "Ta pozycja nie jest obecnie pokazywana. Gdy wybierzesz Ujawnij użytkownik będzie w stanie zmieniać filtr." + +#: includes/filter.handlers.inc:195 +msgid "Hide" +msgstr "Ukryj" + +#: includes/filter.handlers.inc:200 +msgid "This item is currently exposed. If you hide it, users will not able to change the filter as they view it." +msgstr "Ta pozycja jest obecnie pokazywana. Gdy wybierzesz Ukryj użytkownik nie będzie w stanie zmienić filtra." + +#: includes/filter.handlers.inc:271 +msgid "Unlock operator" +msgstr "Odblokuj operator" + +#: includes/filter.handlers.inc:272 +msgid "When checked, the operator will be exposed to the user" +msgstr "Gdy zaznaczone, operator będzie widoczny dla użytkownika" + +#: includes/filter.handlers.inc:278 +msgid "Operator identifier" +msgstr "Identyfikator operatora" + +#: includes/filter.handlers.inc:280 +msgid "This will appear in the URL after the ? to identify this operator." +msgstr "Włącza ukazywanie się identyfikatora operatora po ? w URLu." + +#: includes/filter.handlers.inc:297 +msgid "Filter identifier" +msgstr "Identyfikator filtra" + +#: includes/filter.handlers.inc:299 +msgid "This will appear in the URL after the ? to identify this filter. Cannot be blank." +msgstr "Włącza ukazywanie się identyfikatora filtra po ? w URLu. Nie może być puste." + +#: includes/filter.handlers.inc:315 +msgid "Optional" +msgstr "Opcjonalnie" + +#: includes/filter.handlers.inc:316 +msgid "This exposed filter is optional and will have added options to allow it not to be set." +msgstr "Ujawnienie filtra jest opcjonalne." + +#: includes/filter.handlers.inc:322 +msgid "Force single" +msgstr "Wymuś pojedyncze" + +#: includes/filter.handlers.inc:323 +msgid "Force this exposed filter to accept only one option." +msgstr "Pozwala filtrowi na akceptowanie tylko jednej opcji." + +#: includes/filter.handlers.inc:329 +msgid "Remember" +msgstr "Pamiętaj" + +#: includes/filter.handlers.inc:330 +msgid "Remember the last setting the user gave this filter." +msgstr "Pamięta ostatnie ustawienienie filtra użytkownika." + +#: includes/filter.handlers.inc:341 +msgid "" +"The identifier is required if the filter is\n" +" exposed." +msgstr "" +"Identyfikator jest wymagany jesli filtr jest\n" +" ujawniony." + +#: includes/filter.handlers.inc:347 +msgid "This identifier is not allowed." +msgstr "Ten identyfikator nie jest dozwolony" + +#: includes/filter.handlers.inc:448 +msgid "" +msgstr "" + +#: includes/filter.handlers.inc:540;582;1089 +msgid "Is equal to" +msgstr "Jest równy" + +#: includes/filter.handlers.inc:541;588;1095 +msgid "Is not equal to" +msgstr "Nie jest równy" + +#: includes/filter.handlers.inc:551;714;1197 +msgid "Value" +msgstr "Wartość" + +#: includes/filter.handlers.inc:583;589;1091 +msgid "=" +msgstr "=" + +#: includes/filter.handlers.inc:594 +msgid "Contains" +msgstr "Zawiera" + +#: includes/filter.handlers.inc:595 +msgid "contains" +msgstr "zawiera" + +#: includes/filter.handlers.inc:600 +msgid "Contains any word" +msgstr "Zawiera tylko słowo" + +#: includes/filter.handlers.inc:601 +msgid "has word" +msgstr "ma słowo" + +#: includes/filter.handlers.inc:606 +msgid "Contains all words" +msgstr "Zawiera wszystkie słowa" + +#: includes/filter.handlers.inc:607 +msgid "has all" +msgstr "ma wszystkie" + +#: includes/filter.handlers.inc:612 +msgid "Starts with" +msgstr "Rozpoczyna się od" + +#: includes/filter.handlers.inc:613 +msgid "begins" +msgstr "rozpoczyna" + +#: includes/filter.handlers.inc:618 +msgid "Ends with" +msgstr "Kończy sie na" + +#: includes/filter.handlers.inc:619 +msgid "ends" +msgstr "kończy" + +#: includes/filter.handlers.inc:624 +msgid "Does not contain" +msgstr "Nie zawiera" + +#: includes/filter.handlers.inc:625 +msgid "!has" +msgstr "!has" + +#: includes/filter.handlers.inc:634;1130 +msgid "Is empty (NULL)" +msgstr "Jest pusty (NULL)" + +#: includes/filter.handlers.inc:636;1132 +msgid "empty" +msgstr "pusty" + +#: includes/filter.handlers.inc:640;1136 +msgid "Is not empty (NULL)" +msgstr "Nie jest pusty (NULL)" + +#: includes/filter.handlers.inc:642;1138 +msgid "not empty" +msgstr "nie pusty" + +#: includes/filter.handlers.inc:665 +msgid "exposed>" +msgstr "ujawniony>" + +#: includes/filter.handlers.inc:672 +msgid "Case sensitive" +msgstr "Wrażliwy na wielkość liter" + +#: includes/filter.handlers.inc:674 +msgid "Case sensitive filters may be faster; MySQL might ignore case sensitivity." +msgstr "Filtry wrażliwe na wielkość liter mogą być szybsze; MySQL moze ignorować rozróżnianie wielkości liter." + +#: includes/filter.handlers.inc:860;1009 +msgid "exposed" +msgstr "ujawniony" + +#: includes/filter.handlers.inc:888 +msgid "Options" +msgstr "Opcje" + +#: includes/filter.handlers.inc:910 +msgid "Limit list to selected items" +msgstr "Ogranicz listę do wybranych elementów" + +#: includes/filter.handlers.inc:911 +msgid "If checked, the selected items presented to the user will be the only ones selected here." +msgstr "Jeśli zaznaczysz to pole, wybrane elementy prezentowane użytkownikowi będą tylko raz zaznaczone tutaj." + +#: includes/filter.handlers.inc:930;1459 +msgid "Is one of" +msgstr "Jeden z" + +#: includes/filter.handlers.inc:931 +msgid "Is not one of" +msgstr "Żaden z" + +#: includes/filter.handlers.inc:1022 +#: modules/system.views.inc:236 +msgid "Unknown" +msgstr "Nieznany" + +#: includes/filter.handlers.inc:1077 +msgid "Is less than" +msgstr "Mniej niż" + +#: includes/filter.handlers.inc:1079 +msgid "<" +msgstr "<" + +#: includes/filter.handlers.inc:1083 +msgid "Is less than or equal to" +msgstr "Mniejszy bądź równy" + +#: includes/filter.handlers.inc:1085 +msgid "<=" +msgstr "<=" + +#: includes/filter.handlers.inc:1097 +msgid "!=" +msgstr "!=" + +#: includes/filter.handlers.inc:1101 +msgid "Is greater than or equal to" +msgstr "Większy bądź równy" + +#: includes/filter.handlers.inc:1103 +msgid ">=" +msgstr ">=" + +#: includes/filter.handlers.inc:1107 +msgid "Is greater than" +msgstr "Większy niż" + +#: includes/filter.handlers.inc:1109 +msgid ">" +msgstr ">" + +#: includes/filter.handlers.inc:1113 +msgid "Is between" +msgstr "W przedziale" + +#: includes/filter.handlers.inc:1115 +msgid "between" +msgstr "pomiędzy" + +#: includes/filter.handlers.inc:1119 +msgid "Is not between" +msgstr "Poza przedziałem" + +#: includes/filter.handlers.inc:1121 +msgid "not between" +msgstr "poza" + +#: includes/filter.handlers.inc:1212 +msgid "Min" +msgstr "Min" + +#: includes/filter.handlers.inc:1218 +msgid "And max" +msgstr "i max" + +#: includes/filter.handlers.inc:1218 +msgid "And" +msgstr "i" + +#: includes/filter.handlers.inc:1275 +msgid "@min and @max" +msgstr "@min and @max" + +#: includes/filter.handlers.inc:1301 +msgid "Value type" +msgstr "Typ wartości" + +#: includes/filter.handlers.inc:1303 +msgid "A date in any machine readable format. CCYY-MM-DD HH:MM:SS is preferred." +msgstr "Data w formacie maszynowym (machine redable format). Preferowana CCYY-MM-DD HH:MM:SS ." + +#: includes/filter.handlers.inc:1304 +msgid "An offset from the current time such as \"+1 day\" or \"-2 hours and 30 minutes\"" +msgstr "Przesunięcie od obecnego czasu takie jak \"+1 dzień\" albo \"-2 godziny i 30 minut\"" + +#: includes/filter.handlers.inc:1354;1360;1364 +msgid "Invalid date format." +msgstr "Niewłaściwy format daty." + +#: includes/filter.handlers.inc:1460 +msgid "Is all of" +msgstr "Należy do" + +#: includes/filter.handlers.inc:1461 +msgid "Is none of" +msgstr "Nie należy do" + +#: includes/handlers.inc:136 +msgid "!group: !title" +msgstr "!group: !title" + +#: includes/handlers.inc:336 +msgid "Broken/missing handler" +msgstr "Uszkodzony/utracony uchwyt(handler)" + +#: includes/handlers.inc:344 +msgid "The handler for this item is broken or missing and cannot be used. If a module provided the handler and was disabled, re-enabling the module may restore it. Otherwise, you should probably delete this item." +msgstr "Uchwyt do tego elementu jest uszkodzony lub nie istnieje i nie może zostać użyty. Jeśli moduł dostarcza uchwyt i został wyłączony ponowne włączenie modułu może pomóc. Jeśli nie pomoże prawdopodobnie trzeba skasować ten element." + +#: includes/handlers.inc:380 +msgid "Reduce duplicates" +msgstr "Usuń duplikaty" + +#: includes/handlers.inc:381 +msgid "This filter can cause items that have more than one of the selected options to appear as duplicate results. If this filter causes duplicate results to occur, this checkbox can reduce those duplicates; however, the more terms it has to search for, the less performant the query will be, so use this with caution." +msgstr "Zaznaczenie więcej niż jednej opcji w tym filtrze może powodować pojawienie się duplikatów w wynikach. Jeśli wystąpią duplikaty, zaznaczenie tej opcji wyeliminuje je; Czym więcej wyrażeń szukamy, tym mniej wydajne będą zapytania więc należy używać z rozwagą." + +#: includes/plugins.inc:19 +msgid "Default settings for this view." +msgstr "Domyślne ustawienia dla tego widoku." + +#: includes/plugins.inc:33 +msgid "Display the view as a page, with a URL and menu links." +msgstr "Wyświetl widok jako stronę, z URLem i menu." + +#: includes/plugins.inc:44;53 +msgid "Block" +msgstr "Blok" + +#: includes/plugins.inc:45 +msgid "Display the view as a block." +msgstr "Wyświetl widok jako blok." + +#: includes/plugins.inc:57 +msgid "Attachment" +msgstr "Załącznik" + +#: includes/plugins.inc:58 +msgid "Attachments added to other displays to achieve multiple views in the same view." +msgstr "Załączniki dołączone do tego podglądu tworzą wiele widoków w jednym." + +#: includes/plugins.inc:66 +msgid "Display the view as a feed, such as an RSS feed." +msgstr "Wyświetl widok jako kanał, np. RSS." + +#: includes/plugins.inc:78;124 +msgid "Unformatted" +msgstr "Niesformatowany" + +#: includes/plugins.inc:79 +msgid "Displays rows one after another." +msgstr "Wyświetl rzędy jeden po drugim." + +#: includes/plugins.inc:89 +msgid "Displays rows as an HTML list." +msgstr "Wyświetl rzędy jako liste HTML." + +#: includes/plugins.inc:97 +msgid "Grid" +msgstr "Siatka" + +#: includes/plugins.inc:98 +msgid "Displays rows in a grid." +msgstr "Wyświetl rzędy na siatce." + +#: includes/plugins.inc:106 +msgid "Table" +msgstr "Tabela" + +#: includes/plugins.inc:107 +msgid "Displays rows in a table." +msgstr "Wyświetl rzędy w tabeli." + +#: includes/plugins.inc:117 +msgid "Displays the default summary summary as a list." +msgstr "Wyświetl domyślnie podumowanie jako listę." + +#: includes/plugins.inc:125 +msgid "Displays the summary unformatted, with option for one after another or inline." +msgstr "Wyświetl podsumowanie nie formatując, z opcją \"jeden po drugim\" lub wyrównane." + +#: includes/plugins.inc:132 +msgid "RSS Feed" +msgstr "Kanał RSS" + +#: includes/plugins.inc:133 +msgid "Generates an RSS feed from a view." +msgstr "Generuje kanały RSS z widoku." + +#: includes/plugins.inc:143 +#: includes/view.inc:1663 +msgid "Fields" +msgstr "Pola" + +#: includes/plugins.inc:144 +msgid "Displays the fields with an optional template." +msgstr "Wyświetl pola w opcjonalnym szablonie." + +#: includes/plugins.inc:154 +msgid "Fixed entry" +msgstr "Stały wpis" + +#: includes/plugins.inc:158;164 +msgid "PHP Code" +msgstr "Kod PHP" + +#: includes/plugins.inc:168 +msgid "Numeric" +msgstr "Numeryczny" + +#: includes/plugins.inc:783 +msgid "Broken field" +msgstr "Uszkodzone pole" + +#: includes/plugins.inc:800 +msgid "Basic settings" +msgstr "Ustawienia podstawowe" + +#: includes/plugins.inc:807 +msgid "Change the name of this display." +msgstr "Zmień nazwę podglądu." + +#: includes/plugins.inc:819 +msgid "Change the title that this display will use." +msgstr "Zmień na tytuł którego podgląd będzie używał." + +#: includes/plugins.inc:829 +msgid "Style" +msgstr "Styl" + +#: includes/plugins.inc:831 +msgid "Change the style plugin." +msgstr "Zmień plugin stylu." + +#: includes/plugins.inc:845 +msgid "Row style" +msgstr "Styl rzędu" + +#: includes/plugins.inc:847 +msgid "Change the row plugin." +msgstr "Zmień plugin rzędu." + +#: includes/plugins.inc:857 +msgid "Use AJAX" +msgstr "Użyj AJAXa" + +#: includes/plugins.inc:859 +msgid "Change whether or not this display will use AJAX." +msgstr "Wybierz czy podgląd ma używać AJAXa czy nie." + +#: includes/plugins.inc:866 +msgid "Use pager" +msgstr "Użyj podziału na strony" + +#: includes/plugins.inc:867 +msgid "Mini" +msgstr "Mini" + +#: includes/plugins.inc:868 +msgid "Change this display's pager setting." +msgstr "Zmień ustawienia podziału na strony dla podglądu." + +#: includes/plugins.inc:875;1054 +msgid "Items per page" +msgstr "Elementów na stronę" + +#: includes/plugins.inc:875;1054;3339 +msgid "Items to display" +msgstr "Elementy do wyświetlenia" + +#: includes/plugins.inc:876 +msgid "Unlimited" +msgstr "Nieograniczone" + +#: includes/plugins.inc:877 +msgid "Change how many items to display." +msgstr "Zmień ile elementów wyświetlać." + +#: includes/plugins.inc:883 +msgid "More link" +msgstr "Więcej odnosników" + +#: includes/plugins.inc:885 +msgid "Specify whether this display will provide a \"more\" link." +msgstr "Określa, czy podgląd ma wyświetlać \"więcej...\" odnośników" + +#: includes/plugins.inc:891;1081 +msgid "Distinct" +msgstr "Niepowtarzalne" + +#: includes/plugins.inc:893;1078 +msgid "Display only distinct items, without duplicates." +msgstr "Wyświetla liste elementów bez duplikatów." + +#: includes/plugins.inc:904;1104 +msgid "Unrestricted" +msgstr "Nieograniczone" + +#: includes/plugins.inc:912 +msgid "Multiple roles" +msgstr "Wiele ról" + +#: includes/plugins.inc:924 +msgid "Access" +msgstr "Dostęp" + +#: includes/plugins.inc:926 +msgid "Specify access control settings for this display." +msgstr "Określa, sposób dostępu do ustawień dla tego podglądu." + +#: includes/plugins.inc:946 +msgid "Link display" +msgstr "Powiąż z podglądem" + +#: includes/plugins.inc:948 +msgid "Specify which display this display will link to." +msgstr "Określa, który podgląd odnosi się do tego podglądu." + +#: includes/plugins.inc:953;1143 +msgid "Header" +msgstr "Nagłówek" + +#: includes/plugins.inc:953;1159 +msgid "Footer" +msgstr "Stopka" + +#: includes/plugins.inc:953;1175 +msgid "Empty text" +msgstr "Pusty tekst" + +#: includes/plugins.inc:969 +msgid "Unknown/missing filter" +msgstr "Nieznany/Utracony filtr" + +#: includes/plugins.inc:977 +msgid "Change this display's !name." +msgstr "Zmień nazwe podglądu !name." + +#: includes/plugins.inc:983 +msgid "Theme" +msgstr "Skórka" + +#: includes/plugins.inc:984 +msgid "Information" +msgstr "Informacja" + +#: includes/plugins.inc:985 +msgid "Get information on how to theme this display" +msgstr "Pobiera informację jak skórka ma wyświetlać ten podgląd" + +#: includes/plugins.inc:1011 +msgid "The name of this display" +msgstr "Nazwa podglądu" + +#: includes/plugins.inc:1014 +msgid "This title will appear only in the administrative interface for the View." +msgstr "Ten tytuł ukaże się tylko w panelu administracyjnym Widoków." + +#: includes/plugins.inc:1019 +msgid "The title of this view" +msgstr "Tytuł tego widoku" + +#: includes/plugins.inc:1022 +msgid "This title will be displayed with the view, wherever titles are normally displayed; i.e, as the page title, block title, etc." +msgstr "Ten tytuł będzie wyświetlany z widokiem wszędzie tam, gdzie tytuły sa normalnie wyświetlane; Na przykład Tytuł strony czy Tytuł bloku." + +#: includes/plugins.inc:1027 +msgid "Use AJAX when available to load this view" +msgstr "Użyj AJAXa do ładowania tego widoku jeśli dostępny" + +#: includes/plugins.inc:1031 +msgid "If set, this view will use an AJAX mechanism for paging, table sorting and exposed filters. This means the entire page will not refresh. It is not recommended that you use this if this view is the main content of the page as it will prevent deep linking to specific pages, but it is very useful for side content." +msgstr "Jeśli zaznaczysz to pole, widok będzie używał AJAXa do dzielenia widoku na strony, sortowania tabel i pokazywania filtrów. Oznacza to, że strona nie będzie kompletnie odświeżana. Nie poleca się używania dla głównej treści strony, może zapobiegać głębokiemu linkowaniu specyficznych stron, ale jest bardzo użyteczne dla zawartości strony." + +#: includes/plugins.inc:1040 +msgid "Use a pager for this view" +msgstr "Użyj podziału na strony dla tego widoku" + +#: includes/plugins.inc:1043 +msgid "Full pager" +msgstr "Wszystkie opcje" + +#: includes/plugins.inc:1043 +msgid "Mini pager" +msgstr "Podstawowe opcje" + +#: includes/plugins.inc:1048 +msgid "Pager element" +msgstr "Pager element" + +#: includes/plugins.inc:1049 +msgid "Unless you're experiencing problems with pagers related to this view, you should leave this at 0. If using multiple pagers on one page you may need to set this number to a higher value so as not to conflict within the ?page= array. Large values will add a lot of commas to your URLs, so avoid if possible." +msgstr "Dopóki podział na strony działa, powinieneś ustawić wartośc na 0. Jeśli używasz wielu podziałów stron na jednej stronie, powinienes ustawić wartość na większą nie kolidującą z ?page= array. Duża wartośc doda wiele przecinków w Twoim URLu, więc unikaj takiego rozwiązania jeśli to możliwe." + +#: includes/plugins.inc:1058 +msgid "The number of items to display per page. Enter 0 for no limit." +msgstr "Liczba elementów wyświetlanych na stronie. 0 - bez limitu." + +#: includes/plugins.inc:1063 +msgid "Offset" +msgstr "Przesunięcie" + +#: includes/plugins.inc:1064 +msgid "The number of items to skip. For example, if this field is 3, the first 3 items will be skipped and not displayed. Offset can not be used if items to display is 0; instead use a very large number there." +msgstr "Liczba elementów do pominięcia. Dla przykładu jeśli pole jest ustawione na 3, to 3 pierwsze elementy będa pominięte i nie będą wyświetlone. Przesunięcie nie może byc użyte jeżeli elementów nie ma; zamiast używania wielkich liczb tutaj. " + +#: includes/plugins.inc:1069 +msgid "Add a more link to the bottom of the display." +msgstr "Dodaj więcej odnośników w dolnej częsci podglądu." + +#: includes/plugins.inc:1072 +msgid "Create more link" +msgstr "Utwórz więcej odnosników" + +#: includes/plugins.inc:1073 +msgid "This will add a more link to the bottom of this view, which will link to the page view. If you have more than one page view, the link will point to the display specified in 'Link display' above." +msgstr "Dodaje więcej odnosników w dolnej częsci widoku, które odnoszą się do strony widoku. Jeśli masz więcej niż jedną stronę widoków, odnośnik będzie się odnosił do podglądu określonego w 'Powiąż z podglądem' powyżej." + +#: includes/plugins.inc:1082 +msgid "This will make the view display only distinct items. If there are multiple identical items, each will be displayed only once. You can use this to try and remove duplicates from a view, though it does not always work. Note that this can slow queries down, so use it with caution." +msgstr "Tworzy widok podglądu elementów niepowtarzających się. Jeśli masz wiele elementów identycznych, każdy zostanie wyświetlony tylko raz. Możesz tego użyć do usuwania powtarzających się widoków jednakże nie zawsze sie udaje. Uwaga operacja może spowolnić wykonywanie się zapytań, proszę używać ostrożnie." + +#: includes/plugins.inc:1087 +msgid "Access restrictions" +msgstr "Ograniczenie dostępu" + +#: includes/plugins.inc:1104 +msgid "By role" +msgstr "Przez rolę" + +#: includes/plugins.inc:1104 +msgid "By permission" +msgstr "Przez uprawnienia" + +#: includes/plugins.inc:1113 +msgid "If by role" +msgstr "Jeśli przez role" + +#: includes/plugins.inc:1116 +msgid "Only the checked roles will be able to access this display. Note that users with \"access all views\" can see any view, regardless of role." +msgstr "Tylko zaznaczone rolę będą miały dostęp do podglądu. Uwaga, użytkownicy z \"dostępem do wszystkich widoków\" będą mogli zobaczyć dowolny widok bez względu na rolę." + +#: includes/plugins.inc:1133 +msgid "If by permission" +msgstr "Jeśli przez uprzenienia" + +#: includes/plugins.inc:1135 +msgid "Only users with the selected permission flag will be able to access this display. Note that users with \"access all views\" can see any view, regardless of other permissions." +msgstr "Dostęp do podglądu będą mieć tylko użytkownicy z zaznaczonym dostępem. Uwaga, użytkownicy z \"Dostęp do wszystkich widoków\" będą widzieć wszystkie widoki bez względu na inne ustawienia dostępu. " + +#: includes/plugins.inc:1146;1162 +msgid "Display even if view has no result" +msgstr "Wyświetl nawet gdy widok nie zawiera danych" + +#: includes/plugins.inc:1153 +msgid "Text to display at the top of the view. May contain an explanation or links or whatever you like. Optional." +msgstr "Tekst wyświetlany na górze widoku. Może zawierać opis albo odnośniki, co tylko chcesz. Ustawienie opcjonalne." + +#: includes/plugins.inc:1169 +msgid "Text to display beneath the view. May contain an explanation or links or whatever you like. Optional." +msgstr "Tekst wyświetlany poniżej widoku. Może zawierać opis albo odnośniki, co tylko chcesz. Ustawienie opcjonalne." + +#: includes/plugins.inc:1180 +msgid "Text to display if the view has no results. Optional." +msgstr "Tekst wyświetlany w przypadku braku danych w widoku. Ustawienie opcjonalne." + +#: includes/plugins.inc:1186 +msgid "How should this view be styled" +msgstr "Jakiego stylu powinieneś użyć dla tego widoku" + +#: includes/plugins.inc:1192 +msgid "If the style you choose has settings, be sure to click the settings button that will appear next to it in the View summary." +msgstr "Jeśli styl który wybrałes ma ustawienia, upewnij się że przycisk ustawień pojawił się obok Widoku podsumowań." + +#: includes/plugins.inc:1200 +msgid "You may also adjust the !settings for the currently selected style by clicking on the icon." +msgstr "Powinieneś również dostosować !settings obecnie wybrany styl poprzez klinięcie na ikonkę." + +#: includes/plugins.inc:1200;1242 +msgid "settings" +msgstr "ustawienia" + +#: includes/plugins.inc:1206 +msgid "Style options" +msgstr "Opcje stylów" + +#: includes/plugins.inc:1218 +msgid "Row style options" +msgstr "Opcje stylu rzędów" + +#: includes/plugins.inc:1230 +msgid "How should each row in this view be styled" +msgstr "Jakiego stylu każdy rząd danych ma używać" + +#: includes/plugins.inc:1242 +msgid "You may also adjust the !settings for the currently selected row style by clicking on the icon." +msgstr "Powinieneś również dostosować !settings obecnie wybrany styl rzędu danych poprzez klinięcie na ikonkę." + +#: includes/plugins.inc:1248 +msgid "Which display to use for path" +msgstr "Którego podglądu użyć dla ściezki" + +#: includes/plugins.inc:1257 +msgid "Which display to use to get this display's path for things like summary links, rss feed links, more links, etc." +msgstr "Którego podglądu użyć aby otrzymać scieżkę podglądu dla odnośników do danych takich jak : podsumowanie, kanały RSS, więcej odnośników itd." + +#: includes/plugins.inc:1262 +msgid "Theming information" +msgstr "Informacje o skórkach" + +#: includes/plugins.inc:1270 +msgid "Display output" +msgstr "Wygląd podglądu" + +#: includes/plugins.inc:1275 +msgid "Style output" +msgstr "Wygląd stylu" + +#: includes/plugins.inc:1280 +msgid "Row style output" +msgstr "Wygląd lini tekstu" + +#: includes/plugins.inc:1286 +msgid "Field @field" +msgstr "Pole @field" + +#: includes/plugins.inc:1294 +msgid "Important! When you add a new template to your theme, be sure to clear the theme registry cache. You can do this by visiting administer >> site building >> themes -- just loading the page should clear the cache." +msgstr "Ważne! Kiedy dodajesz nowy szablon do skórki, upewnij się że wyczyściłes pamięć podręczną skórki. Możesz tego dokonać wchodząć w ustawienia >> Zarządzaj >> Budowa witryny >> Skórki -- właściwe łądowanie strony powinno oczyścić pamięć podręczną." + +#: includes/plugins.inc:1306 +msgid "Theming information (display)" +msgstr "Informacje o skórce (podgląd)" + +#: includes/plugins.inc:1307;1326;1347;1368 +msgid "Back to !info." +msgstr "Wróć do !info" + +#: includes/plugins.inc:1307;1326;1347;1368 +msgid "theming information" +msgstr "informacje o tworzeniu skórek" + +#: includes/plugins.inc:1310 +msgid "This display has no theming information" +msgstr "Ten podgląd nie posiada informacji o tworzeniu skórek" + +#: includes/plugins.inc:1313 +msgid "This is the default theme template used for this display." +msgstr "To jest domyslny szablon skórki używanej w tym podglądzie." + +#: includes/plugins.inc:1325 +msgid "Theming information (style)" +msgstr "Informację o tworzeniu skórki (styl)" + +#: includes/plugins.inc:1331 +msgid "This display has no style theming information" +msgstr "Ten podgląd nie posiada informacji o stylach skórek" + +#: includes/plugins.inc:1334 +msgid "This is the default theme template used for this style." +msgstr "Domyslna skórka używana w tym szablonie dla tego stylu." + +#: includes/plugins.inc:1346;1367 +msgid "Theming information (row style)" +msgstr "Informacje o tworzeniu skórki (styl lini tekstu)" + +#: includes/plugins.inc:1352 +msgid "This display has no row style theming information" +msgstr "Ten podgląd nie ma informacji o tworzeniu skórek dla wierszy tabel" + +#: includes/plugins.inc:1355;1370 +msgid "This is the default theme template used for this row style." +msgstr "To jest domyślny szablon skórki dla tego stylu lini danych" + +#: includes/plugins.inc:1434 +msgid "You must select at least one role if type is \"by role\"" +msgstr "Musisz wybrać przynajmniej jedną rolę gdy typ jest \"przez rolę\"" + +#: includes/plugins.inc:1551 +msgid "Override" +msgstr "Nadpisz" + +#: includes/plugins.inc:1563 +msgid "Use default" +msgstr "Użyj domślnych" + +#: includes/plugins.inc:1756 +msgid "Display @display uses fields but there are none defined for it." +msgstr "Podgląd @display używa pól, ale żadne nie jest zdefiniowane." + +#: includes/plugins.inc:1760 +msgid "Display @display uses path but path is undefined." +msgstr "Podgląd @display używa ścieżki ale żadna nie jest zdefiniowana." + +#: includes/plugins.inc:1765 +msgid "Display @display has an invalid style plugin." +msgstr "Podgląd @display ma nieprawidłowy plugin stylu." + +#: includes/plugins.inc:1994 +msgid "Page settings" +msgstr "Ustawienia strony" + +#: includes/plugins.inc:2019 +msgid "No menu" +msgstr "Brak menu" + +#: includes/plugins.inc:2022 +msgid "Normal: @title" +msgstr "Zwykły: @title" + +#: includes/plugins.inc:2026 +msgid "Tab: @title" +msgstr "Zakładka: @tab" + +#: includes/plugins.inc:2036 +msgid "Menu" +msgstr "Menu" + +#: includes/plugins.inc:2042 +msgid "Change settings for the parent menu" +msgstr "Zmień ustawienia dla nadrzędnego menu" + +#: includes/plugins.inc:2055 +msgid "The menu path or URL of this view" +msgstr "Ścieżka menu albo URL tego widoku" + +#: includes/plugins.inc:2059 +msgid "This view will be displayed by visiting this path on your site. You may use \"%\" in your URL to represent values that will be used for arguments: For example, \"node/%/feed\"." +msgstr "Widok będzie wyświetlony przez odwiedzenie tej ścieżki na Twojej stronie. Możesz użyć \"%\" w URLu reprezentując wartości użyte dla argumentów: Na przykład, \"node/%/feed\"." + +#: includes/plugins.inc:2065 +msgid "Menu item entry" +msgstr "Lista elementów menu" + +#: includes/plugins.inc:2082 +msgid "No menu entry" +msgstr "Brak listy elementów menu" + +#: includes/plugins.inc:2083 +msgid "Normal menu entry" +msgstr "Zwykły wpis w menu" + +#: includes/plugins.inc:2084;2131 +msgid "Menu tab" +msgstr "Zakładka menu" + +#: includes/plugins.inc:2085 +msgid "Default menu tab" +msgstr "Domyslna zakładka menu" + +#: includes/plugins.inc:2094 +msgid "If set to normal or tab, enter the text to use for the menu item." +msgstr "Wprowadź tekst by użyć elementu menu, gdy menu jest zwykłe lub gdy jest zakładką." + +#: includes/plugins.inc:2103 +msgid "If set to tab, enter the weight of the item. The lower th weight the higher/further left it will appear." +msgstr "Wpisz wagę elementu gdy przypisujesz zakładce. Im mniejsza waga tym zakładka pojawi się bardziej z lewej strony." + +#: includes/plugins.inc:2109 +msgid "Default tab options" +msgstr "Domyślne opcje zakładek" + +#: includes/plugins.inc:2118 +msgid "When providing a menu item as a tab, Drupal needs to know what the parent menu item of that tab will be. Sometimes the parent will already exist, but other times you will need to have one created. The path of a parent item will always be the same path with the last part left off. i.e, if the path to this view is foo/bar/baz, the parent path would be foo/bar." +msgstr "Kiedy dostarczamy menu jako zakłądki, Drupal musi wiedzieć jaki będzie element nadrzędny menu zakładki. Czasami element nadrzędny istnieje, ale czasami będzie trzeba go utworzyć. Ścieżką elementu nadrzędnego zawsze będzie częścią powstałą przez odłączenie ostatniego fragmentu ścieżki podrzędnej. Na przykład ścieżka do widoku jest: foo/bar/baz nadrzędną ścieżka będzie foo/bar." + +#: includes/plugins.inc:2129 +msgid "Parent menu item" +msgstr "Nadrzędny element menu" + +#: includes/plugins.inc:2131 +msgid "Already exists" +msgstr "Już istnieje" + +#: includes/plugins.inc:2131 +msgid "Normal menu item" +msgstr "Standardowy element menu" + +#: includes/plugins.inc:2139 +msgid "If creating a parent menu item, enter the title of the item." +msgstr "Gdy dodajesz element nadrzędny menu, wprowadź jego tytuł." + +#: includes/plugins.inc:2145 +msgid "Tab weight" +msgstr "Waga zakładki" + +#: includes/plugins.inc:2149 +msgid "If the parent menu item is a tab, enter the weight of the tab. The lower the number, the more to the left it will be." +msgstr "Gdy element nadrzędny menu jest zakładką, wprowadź jej wagę. Im mniejszy numer, tym bardziej będzie z lewej." + +#: includes/plugins.inc:2163 +msgid "\"$arg\" is no longer supported. Use % instead." +msgstr "\"$arg\" już nie używamy. Użyj w zamian %. " + +#: includes/plugins.inc:2173 +msgid "Views cannot create normal menu items for paths with a % in them." +msgstr "Widok nie może tworzyć standardowych elementów menu dla ścieżek z % w nich." + +#: includes/plugins.inc:2180 +msgid "A display whose path ends with a % cannot be a tab." +msgstr "Wyświetla które ścieżki kończące się % nie mogą być zakładką." + +#: includes/plugins.inc:2185 +msgid "Title is required for this menu type." +msgstr "Tytuł jest wymagany dla tego typu menu" + +#: includes/plugins.inc:2216 +msgid "Display @display is set to use a menu but the menu title is not set." +msgstr "Podgląd @display jest ustawiony tak, by używać tytułu menu ale tytuł nie został ustawiony." + +#: includes/plugins.inc:2222 +msgid "Display @display is set to use a parent menu but the parent menu title is not set." +msgstr "Podgląd @display jest ustawiony by używać nadrzędnego menu, ale tytuł elementu menu nie został ustawiony." + +#: includes/plugins.inc:2288 +msgid "Block settings" +msgstr "Ustawienia Bloków" + +#: includes/plugins.inc:2302 +msgid "Admin" +msgstr "Admin" + +#: includes/plugins.inc:2314 +msgid "Caching" +msgstr "Zapis do pamięci podręcznej" + +#: includes/plugins.inc:2324 +msgid "Do not cache" +msgstr "Nie zapisuj w pamięci podręcznej" + +#: includes/plugins.inc:2325 +msgid "Cache once for everything (global)" +msgstr "Jedna pamięć podręczna dla wszystkiego (globalna)" + +#: includes/plugins.inc:2326 +msgid "Per page" +msgstr "Na stronę" + +#: includes/plugins.inc:2327 +msgid "Per role" +msgstr "Na rolę" + +#: includes/plugins.inc:2328 +msgid "Per role per page" +msgstr "Na rolę na stronę" + +#: includes/plugins.inc:2329 +msgid "Per user" +msgstr "Na użytkownika" + +#: includes/plugins.inc:2330 +msgid "Per user per page" +msgstr "Na użytkownika na stronę" + +#: includes/plugins.inc:2355 +msgid "Block admin description" +msgstr "Opis bloku administracyjnego" + +#: includes/plugins.inc:2358 +msgid "This will appear as the name of this block in administer >> site building >> blocks." +msgstr "To ukaże się jako nazwa bloku w Zarządzaj >> Konfiguracja witryny >> Bloki." + +#: includes/plugins.inc:2363 +msgid "Block caching type" +msgstr "Typ pamięci podręcznej dla bloku" + +#: includes/plugins.inc:2367 +msgid "This sets the default status for Drupal's built-in block caching method; this requires that caching be turned on in block administration, and be careful because you have little control over when this cache is flushed." +msgstr "To ustawia domyslny status dla wbudowanej metody blokowego cache'owania; to wymaga by cache'owanie bylo wlaczone w bloku administracyjnym, i badz ostrozny poniewaz masz mala kontrole na tym kiedy cache jest opróżniany." + +#: includes/plugins.inc:2418 +msgid "Before" +msgstr "Przed" + +#: includes/plugins.inc:2419 +msgid "After" +msgstr "Po" + +#: includes/plugins.inc:2420 +msgid "Both" +msgstr "Oba" + +#: includes/plugins.inc:2440 +msgid "Attachment settings" +msgstr "Ustawienia załączników" + +#: includes/plugins.inc:2445;2486 +msgid "Inherit arguments" +msgstr "Dziedziczenie argumentów" + +#: includes/plugins.inc:2451;2495 +msgid "Position" +msgstr "Pozycja" + +#: includes/plugins.inc:2457;2649 +msgid "Multiple displays" +msgstr "Wiele podglądów" + +#: includes/plugins.inc:2472;2504;2664;2678 +msgid "Attach to" +msgstr "Dołącz do" + +#: includes/plugins.inc:2489 +msgid "Inherit" +msgstr "Dziedzicz" + +#: includes/plugins.inc:2490 +msgid "Should this display inherit its arguments from the parent display to which it is attached?" +msgstr "Czy podgląd ma dziedziczyć argumenty z nadrzędnego podglądu do którego jest dołączony?" + +#: includes/plugins.inc:2498;2687 +msgid "Attach before or after the parent display?" +msgstr "Dołączyć przed czy po nadrzędnym podglądzie?" + +#: includes/plugins.inc:2513 +msgid "Select which display or displays this should attach to." +msgstr "Wybierz, który lub które podglądy powinny być dołączone." + +#: includes/plugins.inc:2641 +msgid "Feed settings" +msgstr "Ustawienia kanału" + +#: includes/plugins.inc:2693 +msgid "This view will be displayed by visiting this path on your site. It is recommended that the path be something like \"path/%/%/feed\" or \"path/%/%/rss.xml\", putting one % in the path for each argument you have defined in the view." +msgstr "Ten widok będzie wyświetlany odwiedzającym tą ścieżkę w adresie Twojej strony. Poleca się by ścieżka wyglądała \"path/%/%/feed\" albo \"path/%/%/rss.xml\", umieszczamy JEDEN % w ścieżce dla każdego ze zdefiniowanych argumentów w widoku." + +#: includes/plugins.inc:2835 +msgid "Grouping field" +msgstr "Pole grupujące" + +#: includes/plugins.inc:2838 +msgid "You may optionally specify a field by which to group the records. Leave blank to not group." +msgstr "Opcjonalnie możesz okreslić pole grupujące dane. Pozostaw puste by nie grupować. " + +#: includes/plugins.inc:2923 +msgid "Style @style requires a row style but the row plugin is invalid." +msgstr "Styl @style wymaga stylu wiersza tabeli, a plugin wiersza tabeli jest niewłaściwy." + +#: includes/plugins.inc:2970 +msgid "List type" +msgstr "Typ listy" + +#: includes/plugins.inc:3000 +msgid "Number of columns" +msgstr "Liczba kolumn" + +#: includes/plugins.inc:3005 +msgid "Alignment" +msgstr "Wyrównanie" + +#: includes/plugins.inc:3006 +msgid "Horizontal" +msgstr "Poziomo" + +#: includes/plugins.inc:3006 +msgid "Vertical" +msgstr "Pionowo" + +#: includes/plugins.inc:3008 +msgid "Horizontal alignment will place items starting in the upper left and moving right. Vertical alignment will place items starting in the upper left and moving down." +msgstr "Wyrównanie poziome umieści elementy zaczynając od części lewej górnej w strone prawej. Pionowe zaś umieśi je od części lewej górnej w dół." + +#: includes/plugins.inc:3127 +msgid "You need at least one field before you can configure your table settings" +msgstr "Potrzebujesz przynajmniej jednego pola zanim zaczniesz konfigurować ustawienia tabel" + +#: includes/plugins.inc:3136 +msgid "Override normal sorting if click sorting is used" +msgstr "Nadpisz normalne sortowanie jeśli ktoś kliknął \"sortuj\"" + +#: includes/plugins.inc:3142 +msgid "Enable Drupal style \"sticky\" table headers (Javascript)" +msgstr "Włącz styl \"przyklejony\" do nagłówków tabel (JavaScript)" + +#: includes/plugins.inc:3144 +msgid "(Sticky header effects will not be active for preview below, only on live output.)" +msgstr "(Przyklejone nagłówki nie będą aktywne przy podglądzie poniżej tylko w podglądzie na żywo.)" + +#: includes/plugins.inc:3149 +msgid "Default sort order" +msgstr "Domyślne sortowanie" + +#: includes/plugins.inc:3150 +#: includes/sort.handlers.inc:60 +msgid "Ascending" +msgstr "Rosnąco" + +#: includes/plugins.inc:3150 +#: includes/sort.handlers.inc:60 +msgid "Descending" +msgstr "Malejąco" + +#: includes/plugins.inc:3152 +msgid "If a default sort order is selected, what order should it use by default." +msgstr "Jakie sortowanie ma być stosowane domyślnie gdy zaznaczymy sorotwanie domyślne." + +#: includes/plugins.inc:3238 +msgid "Place fields into columns; you may combine multiple fields into the same column. If you do, the separator in the column specified will be used to separate the fields. Check the sortable box to make that column clicksortable, and check the default sort radio to determine which column will be sorted by default, if any. You may control column order and field labels in the fields section." +msgstr "Umieść pola w kolumnach; możesz ustawić wiele pól w tej samej kolumnie. Separator w wybranych kolumnach będzie oddzielał pola. Zaznacz pole sortowania, aby wybrać jak domyślnie dana kolumna ma być sortowana. Porządek sortowania i opisy etykiet pól możesz kontrolować w sekcji pól." + +#: includes/plugins.inc:3263 +#: includes/view.inc:1665 +msgid "Field" +msgstr "Pole" + +#: includes/plugins.inc:3264 +msgid "Column" +msgstr "Kolumna" + +#: includes/plugins.inc:3267 +msgid "Sortable" +msgstr "Sortowalny" + +#: includes/plugins.inc:3271 +msgid "Default sort" +msgstr "Standardowe sortowanie" + +#: includes/plugins.inc:3330 +msgid "Display record count with link" +msgstr "Wyświetl ilośc rekordów z odnośnikiem" + +#: includes/plugins.inc:3335 +msgid "Override number of items to display" +msgstr "Nadpisz liczbę elementów do wyświetlenia" + +#: includes/plugins.inc:3372 +msgid "Display items inline" +msgstr "Wyświetl elementy \"inline\"" + +#: includes/plugins.inc:3421 +msgid "Use the site mission for the description" +msgstr "Używaj misji strony do opisu" + +#: includes/plugins.inc:3425 +msgid "RSS description" +msgstr "Opis kanału RSS" + +#: includes/plugins.inc:3427 +msgid "This will appear in the RSS feed itself." +msgstr "To pojawi się samo w kanale RSS." + +#: includes/plugins.inc:3550 +msgid "Inline fields" +msgstr "Pola \"inline\"" + +#: includes/plugins.inc:3553 +msgid "Inline fields will be displayed next to each other rather than one after another." +msgstr "Pola \"inline\" będą wyświetlone obok siebie względnie jedno pod drugim." + +#: includes/plugins.inc:3561 +msgid "The separator may be placed between inline fields to keep them from squishing up next to each other. You can use HTML in this field." +msgstr "Separator może być umiejscowiony pomiędzy polami \"inline\" by trzymać je ściśnięte razem. W tym polu możesz użyć HTMLa." + +#: includes/plugins.inc:3611 +msgid "Default argument" +msgstr "Domyślny argument" + +#: includes/plugins.inc:3653 +msgid "PHP argument code" +msgstr "Kod argumentu PHP (PHP argument code)" + +#: includes/plugins.inc:3656 +msgid "Enter PHP code that returns a value to use for this argument. Do not use <?php ?>. You must return only a single value for just this argument." +msgstr "Wprowadź kod PHP który zwróci wartość użytą dla tego argumentu. Nie używaj <?php ?>. Musisz zwrócić tylko jedną wartość dla jednego argumentu." + +#: includes/plugins.inc:3760 +msgid "PHP validate code" +msgstr "Kod poprawności PHP" + +#: includes/plugins.inc:3762 +msgid "Enter PHP code that returns TRUE or FALSE. No return is the same as FALSE, so be SURE to return something if you do not want to declare the argument invalid. Do not use <?php ?>. The argument to validate will be \"$argument\" and the view will be \"$view\". You may change the argument by setting \"$handler->argument\"." +msgstr "Ten kod zwraca PRAWDĘ (true) lub FAŁSZ(false). Brak zwróconej wartości jest równoznaczny z FAŁSZem więć upewnij się że zwracasz coś by deklarować argument właściwie. Nie używaj <?php ?>. Argument mozna sprawdzić wpisując \"$argument\" , widok \"$view\". Możesz zmienić argument poprzez ustawienie \"$handler->argument\"." + +#: includes/relationship.handlers.inc:62 +msgid "The label for this relationship that will be displayed only administratively." +msgstr "Etykieta dla tego powiązania, która będzie wyświetlana tylko w trybie administracji." + +#: includes/relationship.handlers.inc:67 +msgid "Require this relationship" +msgstr "Wymaga zalezności" + +#: includes/relationship.handlers.inc:68 +msgid "If required, items that do not contain this relationship will not appear." +msgstr "Gdy wymagane, elementy niezawierające tej relacji nie ukażą się." + +#: includes/sort.handlers.inc:43 +msgid "asc" +msgstr "asc" + +#: includes/sort.handlers.inc:47 +msgid "desc" +msgstr "desc" + +#: includes/sort.handlers.inc:59 +msgid "Sort order" +msgstr "Kolejność sortowania" + +#: includes/sort.handlers.inc:76 +msgid "views_handler_sort_formula missing default: @formula" +msgstr "views_handler_sort_formula utracona domyślnie: @formula" + +#: includes/sort.handlers.inc:116 +msgid "Granularity" +msgstr "Ziarnistość" + +#: includes/sort.handlers.inc:118 +msgid "Second" +msgstr "Drugi" + +#: includes/sort.handlers.inc:119 +msgid "Minute" +msgstr "Minuta" + +#: includes/sort.handlers.inc:120 +msgid "Hour" +msgstr "Godzina" + +#: includes/sort.handlers.inc:121 +msgid "Day" +msgstr "Dzień" + +#: includes/sort.handlers.inc:122 +msgid "Month" +msgstr "Miesiąc" + +#: includes/sort.handlers.inc:123 +msgid "Year" +msgstr "Rok" + +#: includes/sort.handlers.inc:125 +msgid "The granularity is the smallest unit to use when determining whether two dates are the same; for example, if the granularity is \"Year\" then all dates in 1999, regardless of when they fall in 1999, will be considered the same date." +msgstr "Ziarnistość jest najmniejszą jednostką używaną do określenia czy dwie daty są takie same; na przykład gdy ziarnistością jest \"Rok\" to wszystkie daty zawierające 1999 będą traktowane jako jedna data." + +#: includes/view.inc:224 +msgid "set_display called with invalid display id @display" +msgstr "set_display wołany z nieprawidłowym ID Podglądu @display" + +#: includes/view.inc:946 +msgid "Home" +msgstr "Start" + +#: includes/view.inc:1664 +msgid "fields" +msgstr "pola" + +#: includes/view.inc:1666 +msgid "field" +msgstr "pole" + +#: includes/view.inc:1671 +msgid "arguments" +msgstr "argumenty" + +#: includes/view.inc:1672;1673 +msgid "Argument" +msgstr "Argument" + +#: includes/view.inc:1677 +msgid "Sort criteria" +msgstr "Kryteria sortowania" + +#: includes/view.inc:1678 +msgid "sort criteria" +msgstr "kryteria sortowania" + +#: includes/view.inc:1679 +msgid "Sort criterion" +msgstr "Kryterium sortowania" + +#: includes/view.inc:1680 +msgid "sort criterion" +msgstr "kryterium sortowania" + +#: includes/view.inc:1684 +msgid "Filters" +msgstr "Filtry" + +#: includes/view.inc:1685 +msgid "filters" +msgstr "filtry" + +#: includes/view.inc:1686 +msgid "Filter" +msgstr "Filtr" + +#: includes/view.inc:1687 +msgid "filter" +msgstr "filtr" + +#: includes/view.inc:1692 +msgid "Relationships" +msgstr "Zależności" + +#: includes/view.inc:1693 +msgid "relationships" +msgstr "zależności" + +#: js/ajax.js:0;0;0;0;0;0;0 +#: js/ajax_view.js:0;0;0 +msgid "An error occurred at " +msgstr "Błąd wystąpił w " + +#: js/tabs.js:0 +msgid "jQuery UI Tabs: Mismatching fragment identifier." +msgstr "jQuery UI Tabs: Niepasujący fragment identyfikatora." + +#: js/tabs.js:0 +msgid "jQuery UI Tabs: Not enough arguments to add tab." +msgstr "jQuery UI Tabs: Za mało argumentów by dodać zakładkę." + +#: modules/book.views.inc:21;36;46;99 +msgid "Book" +msgstr "Książka" + +#: modules/book.views.inc:30 +msgid "Top level book" +msgstr "Najwyższy poziom książki" + +#: modules/book.views.inc:31 +msgid "The book the node is in" +msgstr "Książka w której jest segment" + +#: modules/book.views.inc:58 +msgid "The weight of the book page." +msgstr "Waga strony książki" + +#: modules/book.views.inc:69 +#: modules/comment.views.inc:202 +#: modules/taxonomy.views.inc:339 +msgid "Depth" +msgstr "Głębokość" + +#: modules/book.views.inc:70 +msgid "The depth of the book page in the hierarchy; top level books have a depth of 1." +msgstr "Głębokość strony książki w hierarchi; książki najwyższego poziomu mają głębokość 1." + +#: modules/book.views.inc:87 +msgid "Hierarchy" +msgstr "Hierarchia" + +#: modules/book.views.inc:88 +msgid "The order of pages in the book hierarchy. Remember to sort by weight too if you want exactly the right order." +msgstr "Kolejność stron w hierarchi książki. Pamiętaj by sortować po wadze również jeśli chcesz mieć właściwie posortowane." + +#: modules/book.views.inc:110 +msgid "Parent" +msgstr "Nadrzędny" + +#: modules/book.views.inc:111 +msgid "The parent book node" +msgstr "Nadrzędny segment książki" + +#: modules/book.views.inc:116 +msgid "Book parent" +msgstr "Rodzic książki" + +#: modules/comment.views.inc:22;26;382;391 +msgid "Comment" +msgstr "Komentarz" + +#: modules/comment.views.inc:27 +msgid "Comments are responses to node content." +msgstr "Komentarze są odpowiedziami na zawartość segmentów." + +#: modules/comment.views.inc:45 +msgid "The title of the comment." +msgstr "Tytuł komentarza" + +#: modules/comment.views.inc:63 +#: modules/node.views.inc:348 +msgid "Body" +msgstr "Treść" + +#: modules/comment.views.inc:64 +msgid "The text of the comment." +msgstr "Tekst komentarza" + +#: modules/comment.views.inc:76 +msgid "ID" +msgstr "ID" + +#: modules/comment.views.inc:77 +msgid "The commment ID of the field" +msgstr "ID komentarza pola" + +#: modules/comment.views.inc:95 +msgid "Author" +msgstr "Autor" + +#: modules/comment.views.inc:96 +msgid "The name of the poster." +msgstr "Imie nadsyłającego." + +#: modules/comment.views.inc:114 +msgid "Author's website" +msgstr "Adres strony nadsyłającego" + +#: modules/comment.views.inc:115 +msgid "The website address of the comment's author. Can be a link. The homepage can also be linked with the Name field. Will be empty if posted by a registered user." +msgstr "Adres strony domowej autora. Może być odnośnikiem. Pole nazwy użytkownika również może być odnośnikiem do strony domowej. Pozostanie puste w przypadku gdy nadsyłającym jest użytkownik zarejestrowany." + +#: modules/comment.views.inc:133 +#: modules/node.views.inc:107 +msgid "Post date" +msgstr "Data nadesłania" + +#: modules/comment.views.inc:134 +msgid "Date and time of when the comment was posted." +msgstr "Data i czas wysłania komentarza." + +#: modules/comment.views.inc:149 +msgid "In moderation" +msgstr "W moderacji" + +#: modules/comment.views.inc:150 +msgid "Whether or not the comment is currently in moderation." +msgstr "Czy ten komentarz jest obecnie moderowany czy nie." + +#: modules/comment.views.inc:157 +msgid "Moderated" +msgstr "Moderowane" + +#: modules/comment.views.inc:167 +msgid "View link" +msgstr "Podgląd" + +#: modules/comment.views.inc:168 +msgid "Provide a simple link to view the comment." +msgstr "Dostarcza prosty odnośnik do podglądania komentarzy." + +#: modules/comment.views.inc:176 +#: modules/node.views.inc:231 +#: modules/user.views.inc:204 +msgid "Edit link" +msgstr "Edytuj" + +#: modules/comment.views.inc:177 +msgid "Provide a simple link to edit the comment." +msgstr "Dostarcza prosty odnośnik do edycji komentarzy" + +#: modules/comment.views.inc:185 +#: modules/node.views.inc:239;461 +#: modules/user.views.inc:212 +msgid "Delete link" +msgstr "Usuń" + +#: modules/comment.views.inc:186 +msgid "Provide a simple link to delete the comment." +msgstr "Dostarcza prosty odnośnik do usuwania komentarzy." + +#: modules/comment.views.inc:194 +msgid "Reply-to link" +msgstr "link Odpowiedz" + +#: modules/comment.views.inc:195 +msgid "Provide a simple link to reply to the comment." +msgstr "Dostarcza prosty odnośnik do odpowiedzi na komentarze." + +#: modules/comment.views.inc:203 +msgid "Display the depth of the comment if it is threaded." +msgstr "Wyświetl głebokość komentarzy gdy są w wątku." + +#: modules/comment.views.inc:207 +msgid "Thread" +msgstr "Wątek" + +#: modules/comment.views.inc:208 +msgid "Sort by the threaded order. This will keep child comments together with their parents." +msgstr "Sortuj w kolejności wątków. To pomoże trzymać podrzędne komentarze wraz z nadrzędnymi razem." + +#: modules/comment.views.inc:214 +#: modules/node.views.inc:1413 +msgid "Node ID" +msgstr "ID segmentu (Node ID)" + +#: modules/comment.views.inc:215 +msgid "The node the comment is a reply to." +msgstr "Segment do którego ten komentarz jest odpowiedzią." + +#: modules/comment.views.inc:220;253 +#: modules/node.views.inc:24;29;89;347;362;473;1178;1187;1197 +msgid "Node" +msgstr "Segment" + +#: modules/comment.views.inc:225 +msgid "User ID" +msgstr "ID użytkownika (User ID)" + +#: modules/comment.views.inc:226 +msgid "The user who wrote the comment." +msgstr "Użytkownik który napisał komentarz." + +#: modules/comment.views.inc:231 +#: modules/node.views.inc:335 +#: modules/statistics.views.inc:201 +#: modules/user.views.inc:23;27;221 +msgid "User" +msgstr "Użytkownik" + +#: modules/comment.views.inc:236 +msgid "Parent CID" +msgstr "CID rodzica (Parent CID)" + +#: modules/comment.views.inc:237 +msgid "The Comment ID of the parent comment." +msgstr "ID komentarza (Comment ID) nadrzędnego komentarza." + +#: modules/comment.views.inc:245 +msgid "Parent comment" +msgstr "Poprzednia odpowiedź" + +#: modules/comment.views.inc:266 +msgid "Last comment time" +msgstr "Ostatnio komentowane" + +#: modules/comment.views.inc:267 +msgid "Date and time of when the last comment was posted." +msgstr "Data i czas ostatniego komentarza." + +#: modules/comment.views.inc:282 +msgid "Last comment author" +msgstr "Autor ostatniego komentarza" + +#: modules/comment.views.inc:283 +msgid "The name of the author of the last posted comment." +msgstr "Dane autora ostatniego komentarza." + +#: modules/comment.views.inc:295 +msgid "Comment count" +msgstr "Liczba komentarzy" + +#: modules/comment.views.inc:296 +msgid "The number of comments a node has." +msgstr "Liczba komentarzy dla segmentu." + +#: modules/comment.views.inc:314 +msgid "Updated/commented date" +msgstr "Data aktualizacji/komentarza" + +#: modules/comment.views.inc:315 +msgid "The most recent of last comment posted or node updated time." +msgstr "Ostatni czas modyfikacji segmentu lub nadesłania komentarza." + +#: modules/comment.views.inc:338 +msgid "New comments" +msgstr "Nowe komentarze" + +#: modules/comment.views.inc:339 +msgid "The number of new comments on the node." +msgstr "Liczba nowych komentarzy w segmencie." + +#: modules/comment.views.inc:347 +msgid "Comment status" +msgstr "Status komentarza" + +#: modules/comment.views.inc:348 +msgid "Whether comments are enabled or disabled on the node." +msgstr "Czy komentarze w segmencie mają być włączone czy też nie." + +#: modules/comment.views.inc:362 +msgid "User posted or commented" +msgstr "Użytkownik nadesłał lub komentował" + +#: modules/comment.views.inc:363 +msgid "Display comments only if a user posted the node or commented on the node." +msgstr "Wyświetl komentarze jedynie gdy użytkownik wysłał lub komentował segment." + +#: modules/comment.views.inc:383 +msgid "Display the comment with standard comment view." +msgstr "Wyświetl komentarz w standardowym widoku komentarza." + +#: modules/comment.views.inc:392 +msgid "Display the comment as RSS." +msgstr "Wyświetl komentarz jako kanał RSS." + +#: modules/comment.views.inc:462 +msgid "Link this field to its comment" +msgstr "Podlinkuj to pole do jego komentarza" + +#: modules/comment.views.inc:506 +msgid "Link this field to its user or an author's homepage" +msgstr "Podlinkuj to pole do jego użytkownika lub strony domowej autora" + +#: modules/comment.views.inc:553 +#: modules/node.views.inc:601 +#: modules/user.views.inc:447 +msgid "Text to display" +msgstr "Tekst do wyświetlenia" + +#: modules/comment.views.inc:564 +#: modules/node.views.inc:612 +#: modules/user.views.inc:463 +msgid "view" +msgstr "przeglądaj" + +#: modules/comment.views.inc:589 +#: modules/node.views.inc:643 +#: modules/user.views.inc:481 +msgid "edit" +msgstr "edytuj" + +#: modules/comment.views.inc:605 +#: modules/node.views.inc:673;752 +#: modules/user.views.inc:499 +msgid "delete" +msgstr "usuń" + +#: modules/comment.views.inc:621 +msgid "reply" +msgstr "powtórz" + +#: modules/comment.views.inc:764 +msgid "Link this field to new comments" +msgstr "Podlinkuj to pole do \"nowe komentarze\"" + +#: modules/comment.views.inc:769 +msgid "Display nothing if no new comments" +msgstr "Nie wyświetlaj nic, gdy nie ma odpowiedzi" + +#: modules/comment.views.inc:836 +#: modules/user.views.inc:606 +msgid "Anonymous" +msgstr "Anonimowy" + +#: modules/comment.views.inc:842 +msgid "No user" +msgstr "Brak użytkownika" + +#: modules/comment.views.inc:878;895 +msgid "Disabled" +msgstr "Wyłączone" + +#: modules/comment.views.inc:880;896 +msgid "Read only" +msgstr "Tylko do odczytu" + +#: modules/comment.views.inc:882;897 +msgid "Read/Write" +msgstr "Odczyt/Zapis" + +#: modules/comment.views.inc:917 +#: modules/node.views.inc:1235 +msgid "Display links" +msgstr "Wyświetlaj odnosniki" + +#: modules/node.views.inc:30 +msgid "Nodes are a Drupal site's primary content." +msgstr "Segmenty są główną zawartością stron w Drupalu." + +#: modules/node.views.inc:57 +msgid "Nid" +msgstr "Nid" + +#: modules/node.views.inc:58 +msgid "The node ID of the node." +msgstr "ID segmentu" + +#: modules/node.views.inc:85;403 +msgid "The title of the node." +msgstr "Tytuł segmentu." + +#: modules/node.views.inc:108 +msgid "The date the node was posted." +msgstr "Data wysłania segmentu." + +#: modules/node.views.inc:123 +msgid "Updated date" +msgstr "Data uaktualnienia" + +#: modules/node.views.inc:124 +msgid "The date the node was last updated." +msgstr "Data ostatniej aktualizacji segmentu." + +#: modules/node.views.inc:140 +msgid "The type of a node (for example, \"blog entry\", \"forum post\", \"story\", etc)." +msgstr "Typ segmentu (np. \"blog entry\", \"forum post\", \"story\", etc)." + +#: modules/node.views.inc:158;166;180 +#: modules/upload.views.inc:74 +msgid "Published" +msgstr "Opublikowany" + +#: modules/node.views.inc:159 +msgid "The published status of the node." +msgstr "Opublikowany status segmentu." + +#: modules/node.views.inc:175 +msgid "Published or admin" +msgstr "Opublikowany albo tryb administracji" + +#: modules/node.views.inc:176 +msgid "Filters out unpublished nodes if the current user cannot view them." +msgstr "Filtruje nieopublikowane segmenty jeśli dany użytkownik nie może ich przeglądać." + +#: modules/node.views.inc:186;194 +msgid "Promoted to front page" +msgstr "Promowany na stronie głównej" + +#: modules/node.views.inc:187 +msgid "The front page of the node." +msgstr "Strona główna segmentu." + +#: modules/node.views.inc:203;212 +msgid "Sticky" +msgstr "Przyklejony" + +#: modules/node.views.inc:204 +msgid "Whether or not the node is sticky." +msgstr "Czy segment ma być przyklejony czy nie." + +#: modules/node.views.inc:223 +msgid "Link" +msgstr "Odnośnik" + +#: modules/node.views.inc:224 +msgid "Provide a simple link to the node." +msgstr "Dostarcza prosty odnosnik do segmentu." + +#: modules/node.views.inc:232 +msgid "Provide a simple link to edit the node." +msgstr "Dostarcza prosty odnośnik do edytowania segmentu." + +#: modules/node.views.inc:240 +msgid "Provide a simple link to delete the node." +msgstr "Dostarcza prosty odnosnik do kasowania segmentu." + +#: modules/node.views.inc:248;1115 +msgid "Language" +msgstr "Język" + +#: modules/node.views.inc:249 +msgid "The language the content is in." +msgstr "Język w jakim jest treść." + +#: modules/node.views.inc:266;437 +#: modules/user.views.inc:125 +msgid "Created date" +msgstr "Data utworzenia" + +#: modules/node.views.inc:267 +msgid "In the form of CCYYMMDD." +msgstr "Format danych: CCYYMMDD" + +#: modules/node.views.inc:275 +msgid "Created year + month" +msgstr "Rok i miesiąc utworzenia" + +#: modules/node.views.inc:276 +msgid "In the form of YYYYMM." +msgstr "Format danych: YYYYMM." + +#: modules/node.views.inc:284 +msgid "Created year" +msgstr "Rok utworzenia" + +#: modules/node.views.inc:285 +msgid "In the form of YYYY." +msgstr "Format danych YYYY" + +#: modules/node.views.inc:293 +msgid "Created month" +msgstr "Miesiąc utworzenia" + +#: modules/node.views.inc:294 +msgid "In the form of MM (01 - 12)." +msgstr "Format danych MM (01 - 12)." + +#: modules/node.views.inc:302 +msgid "Created week" +msgstr "Tydzień utworzenia" + +#: modules/node.views.inc:303 +msgid "In the form of WW (01 - 53)." +msgstr "Format danych WW(01 - 53)." + +#: modules/node.views.inc:315;320 +msgid "Node revision" +msgstr "Wersja segmentu" + +#: modules/node.views.inc:321 +msgid "Node revisions are a history of changes to nodes." +msgstr "Wersje segmentu są historią zmian w nich." + +#: modules/node.views.inc:336 +msgid "Relate a node revision to the user who created the revision." +msgstr "Powiązuje wersje segmentu z użytkownikiem który stworzył wersje." + +#: modules/node.views.inc:341 +msgid "user" +msgstr "użytkownik" + +#: modules/node.views.inc:349 +msgid "The actual, full data in the body field; this may not be valid data on all node types." +msgstr "Faktyczna, pełne dane w polu treści; Mogą nie być właściwe dla wszystkich segmentów." + +#: modules/node.views.inc:363 +msgid "Teaser" +msgstr "Skrót" + +#: modules/node.views.inc:364 +msgid "The stored teaser field. This may not be valid or useful data on all node types." +msgstr "Pole przechowywania skrótu. Nie poleca się przechowywania pożytecznych danych we wszystkich segmentach." + +#: modules/node.views.inc:377 +msgid "Vid" +msgstr "Vid" + +#: modules/node.views.inc:378 +msgid "The revision ID of the node revision." +msgstr "ID wersji wersji segmentu." + +#: modules/node.views.inc:423 +msgid "Log message" +msgstr "Dziennik wiadomości" + +#: modules/node.views.inc:424 +msgid "The log message entered when the revision was created." +msgstr "Wiadomość wprowadzona do dziennika w momencie utworzenia wersji." + +#: modules/node.views.inc:438 +msgid "The date the node revision was created." +msgstr "Data stworzenia wersji dla segmentu." + +#: modules/node.views.inc:453 +msgid "Revert link" +msgstr "Powrót" + +#: modules/node.views.inc:454 +msgid "Provide a simple link to revert to the revision." +msgstr "Dostarcza prosty odnośnik do powrotu do poprzedniej wersji." + +#: modules/node.views.inc:462 +msgid "Provide a simple link to delete the node revision." +msgstr "Dostarcza prosty odnośnik do kasowania wersji segmentu." + +#: modules/node.views.inc:489 +msgid "Has new content" +msgstr "Ma nową zawartość" + +#: modules/node.views.inc:492 +msgid "Show a marker if the node has new or updated content." +msgstr "Oznacza, jeśli segment jest nowy lub zawiera nową treść." + +#: modules/node.views.inc:495 +msgid "Show only nodes that have new content." +msgstr "Pokazuj tylko te segmenty, które maja nową zawartość." + +#: modules/node.views.inc:528 +msgid "Link this field to its node" +msgstr "Odnieś to pole do segmentu" + +#: modules/node.views.inc:713 +msgid "revert" +msgstr "powrót" + +#: modules/node.views.inc:788 +msgid "Check for new comments as well" +msgstr "Sprawdzaj również dla nowych odpowiedzi" + +#: modules/node.views.inc:860 +msgid "Unknown node type" +msgstr "Nieznany typ segmentu" + +#: modules/node.views.inc:1043 +msgid "Week @week" +msgstr "Tydzień @week" + +#: modules/node.views.inc:1055 +msgid "Node type" +msgstr "Typ segmentu" + +#: modules/node.views.inc:1116 +msgid "Current user's language" +msgstr "Bieżący język użytkownika." + +#: modules/node.views.inc:1116 +msgid "No language" +msgstr "Brak języka" + +#: modules/node.views.inc:1166 +msgid "Unknown language" +msgstr "Nieznany język" + +#: modules/node.views.inc:1179;1188 +msgid "Display the node with standard node view." +msgstr "Wyświetlaj segment widokiem standardowym." + +#: modules/node.views.inc:1203 +msgid "Node ID from URL" +msgstr "ID segmentu z URLa" + +#: modules/node.views.inc:1230 +msgid "Display only teaser" +msgstr "Wyświetlaj tylko skrót" + +#: modules/node.views.inc:1291 +msgid "Full text" +msgstr "Pełen tekst" + +#: modules/node.views.inc:1292 +msgid "Title plus teaser" +msgstr "Tytuł i skrót" + +#: modules/node.views.inc:1293 +msgid "Title only" +msgstr "Tylko tytuł" + +#: modules/node.views.inc:1294 +msgid "Use default RSS settings" +msgstr "Użyj domyślnych ustawień RSS" + +#: modules/node.views.inc:1360 +msgid "read more" +msgstr "czytaj więcej" + +#: modules/node.views.inc:1393 +msgid "Types" +msgstr "Typy" + +#: modules/node.views.inc:1396 +msgid "If you wish to validate for specific node types, check them; if none are checked, all nodes will pass." +msgstr "Zaznacz, jeśli chcesz sprawdzać poprawność dla konkretnego typu segmentu. Gdy nie znaznaczysz - wszystkie segmenty będą sprawdzane." + +#: modules/node.views.inc:1403 +msgid "Validate user has access to the node" +msgstr "Sprawdza czy użytkownik ma dostęp do segmentu" + +#: modules/node.views.inc:1411 +#: modules/taxonomy.views.inc:1044 +msgid "Argument type" +msgstr "Typ argumentu" + +#: modules/node.views.inc:1414 +msgid "Node IDs separated by , or +" +msgstr "ID Segmentów oddzielone przez , lub + " + +#: modules/node.views.inc:1533 +msgid "Display %display has no access control but does not contain a filter for published nodes." +msgstr "Podgląd %display nie ma dostępu ale i nie zawiera filtrów do publikacji segmentów." + +#: modules/poll.views.inc:23 +msgid "Poll" +msgstr "Ankieta" + +#: modules/poll.views.inc:38;47 +#: modules/user.views.inc:173;182 +msgid "Active" +msgstr "Aktywny/e" + +#: modules/poll.views.inc:39 +msgid "Whether the poll is open for voting." +msgstr "Czy ankieta jest otwarta do głosowania." + +#: modules/profile.views.inc:20;40 +msgid "Profile" +msgstr "Profil" + +#: modules/profile.views.inc:100 +msgid "@field-name" +msgstr "@firld-name" + +#: modules/profile.views.inc:107 +msgid "Profile textfield" +msgstr "Profil pola tekstowego" + +#: modules/profile.views.inc:126 +msgid "Profile textarea" +msgstr "Profil obszaru tekstowego" + +#: modules/profile.views.inc:142 +msgid "Profile checkbox" +msgstr "Profil checkboxa" + +#: modules/profile.views.inc:159 +msgid "Profile URL" +msgstr "Profil URLa" + +#: modules/profile.views.inc:175 +msgid "Profile selection" +msgstr "Profil wyboru" + +#: modules/profile.views.inc:195 +msgid "Profile freeform list %field-name." +msgstr "Lista profilu %field-name." + +#: modules/profile.views.inc:207 +msgid "Profile date %field-name." +msgstr "Data profilu %field-name." + +#: modules/search.views.inc:23;77;88;106;172;247 +msgid "Search" +msgstr "Szukaj" + +#: modules/search.views.inc:72 +msgid "Score" +msgstr "Punkty" + +#: modules/search.views.inc:73 +msgid "The score of the search item." +msgstr "Ilość trafień " + +#: modules/search.views.inc:95 +msgid "Links from" +msgstr "Odnośniki z" + +#: modules/search.views.inc:96 +msgid "Nodes that link from the node." +msgstr "segmenty odnoszące z segmentu." + +#: modules/search.views.inc:113 +msgid "Links to" +msgstr "Odnosniki do" + +#: modules/search.views.inc:114 +msgid "Nodes that link to the node." +msgstr "segmenty odnoszące się do segmentu." + +#: modules/search.views.inc:125 +msgid "Search Terms" +msgstr "Szukane wyrażenia" + +#: modules/search.views.inc:126 +msgid "The terms to search for." +msgstr "Lista szukanych wyrażeń" + +#: modules/search.views.inc:156 +msgid "On empty input" +msgstr "Na puste wejście" + +#: modules/search.views.inc:159 +msgid "Show All" +msgstr "Pokaż wszystko" + +#: modules/search.views.inc:160 +msgid "Show None" +msgstr "Nic nie pokazuj" + +#: modules/search.views.inc:175 +msgid "Enter the terms you wish to search for." +msgstr "Wpisz terminy których szukasz." + +#: modules/search.views.inc:190 +msgid "You must include at least one positive keyword with @count characters or more." +msgstr "Musisz wstawić przynajmniej jedno właściwe słowo z @count znakami lub więcej. " + +#: modules/search.views.inc:194 +msgid "Search for either of the two terms with uppercase OR. For example, cats OR dogs." +msgstr "Wyszukiwanie dla obu wyrażeń wpisujemy wielkimi literami OR. Na przykład, koty OR psy." + +#: modules/search.views.inc:248 +msgid "Display the results with standard search view." +msgstr "Wyświetl wyniki za pomocą widoku standardowego wyszukiwania." + +#: modules/search.views.inc:274 +msgid "Display score" +msgstr "Wyświetl wynik" + +#: modules/statistics.views.inc:24 +msgid "Node statistics" +msgstr "Statystyki segmentu" + +#: modules/statistics.views.inc:36 +msgid "Total views" +msgstr "Wszystkie odwiedziny" + +#: modules/statistics.views.inc:37 +msgid "The total number of times the node has been viewed." +msgstr "Ogolna liczba wizyt dla segmentu." + +#: modules/statistics.views.inc:53 +msgid "Views today" +msgstr "Wizyt dzisiaj" + +#: modules/statistics.views.inc:54 +msgid "The total number of times the node has been viewed today." +msgstr "Całkowita liczba wyświetleń segmentu dzisiaj." + +#: modules/statistics.views.inc:70 +msgid "Most recent view" +msgstr "Najczęściej odwiedzane" + +#: modules/statistics.views.inc:71 +msgid "The most recent time the node has been viewed." +msgstr "Ostatni czas kiedy segment był przeglądany." + +#: modules/statistics.views.inc:86;91 +msgid "Access log" +msgstr "Dziennik dostępu" + +#: modules/statistics.views.inc:92 +msgid "Stores site access information." +msgstr "Przechowuje informacje o dostępie do strony." + +#: modules/statistics.views.inc:106 +msgid "Session ID" +msgstr "ID Sesji (Session ID)" + +#: modules/statistics.views.inc:107 +msgid "Browser session ID of user that visited page." +msgstr "ID Sesji przeglądarki użytkownika odwiedzającego stronę." + +#: modules/statistics.views.inc:126 +msgid "Page title" +msgstr "Tytuł strony" + +#: modules/statistics.views.inc:127 +msgid "Title of page visited." +msgstr "Tytuł odwiedzonej strony." + +#: modules/statistics.views.inc:147 +msgid "Internal path to page visited (relative to Drupal root.)" +msgstr "Wewnetrzna scieżka strony (relatywna do głównej Drupala)." + +#: modules/statistics.views.inc:166 +msgid "Referrer" +msgstr "Odwołuje się" + +#: modules/statistics.views.inc:167 +msgid "Referrer URI." +msgstr "Odwołuje się do URLa" + +#: modules/statistics.views.inc:182 +msgid "Hostname" +msgstr "Hostname" + +#: modules/statistics.views.inc:183 +msgid "Hostname of user that visited the page." +msgstr "Nazwy hostów użytkowników którzy odwiedzili stronę." + +#: modules/statistics.views.inc:202 +msgid "The user who visited the site." +msgstr "Użytkownik który odwiedził witrynę." + +#: modules/statistics.views.inc:212 +msgid "Timer" +msgstr "Czasomierz (Timer)" + +#: modules/statistics.views.inc:213 +msgid "Time in milliseconds that the page took to load." +msgstr "Czas ładowania strony w milisekundach." + +#: modules/statistics.views.inc:228 +msgid "Timestamp" +msgstr "Timestamp" + +#: modules/statistics.views.inc:229 +msgid "Timestamp of when the page was visited." +msgstr "Znacznik czasu wizyty strony." + +#: modules/system.views.inc:25;30 +msgid "File" +msgstr "Plik" + +#: modules/system.views.inc:31 +msgid "Files maintained by Drupal and various modules." +msgstr "Pliki zarządzane przez Drupala i różne moduły." + +#: modules/system.views.inc:49 +msgid "File ID" +msgstr "ID pliku (File ID)" + +#: modules/system.views.inc:50 +msgid "The ID of the file." +msgstr "ID pliku" + +#: modules/system.views.inc:70 +msgid "The name of the file." +msgstr "Nazwa pliku." + +#: modules/system.views.inc:89 +msgid "The path of the file." +msgstr "Ścieżka pliku." + +#: modules/system.views.inc:107 +msgid "Mime type" +msgstr "Mime type" + +#: modules/system.views.inc:108 +msgid "The mime type of the file." +msgstr "\"mime type\" pliku." + +#: modules/system.views.inc:126 +msgid "Size" +msgstr "Rozmiar" + +#: modules/system.views.inc:127 +msgid "The size of the file." +msgstr "Rozmiar pliku." + +#: modules/system.views.inc:142 +msgid "Status" +msgstr "Status" + +#: modules/system.views.inc:143 +msgid "The status of the file." +msgstr "Status pliku." + +#: modules/system.views.inc:158 +msgid "Upload date" +msgstr "Data dodania" + +#: modules/system.views.inc:159 +msgid "The date the file was uploaded." +msgstr "Data dodania pliku." + +#: modules/system.views.inc:204 +#: modules/upload.views.inc:145;216 +msgid "Link this field to download the file" +msgstr "Podlinkuj to pole do \"pobierz plik\"" + +#: modules/system.views.inc:231 +msgid "Temporary" +msgstr "Stały/e" + +#: modules/system.views.inc:232 +msgid "Permanent" +msgstr "Stały/e" + +#: modules/system.views.inc:278 +msgid "No title" +msgstr "Brak tytułu" + +#: modules/taxonomy.views.inc:24;73;143;161;219;255;298;309 +msgid "Taxonomy" +msgstr "Taxonomia" + +#: modules/taxonomy.views.inc:54 +msgid "Vocabulary name" +msgstr "Nazwa słownika" + +#: modules/taxonomy.views.inc:56 +msgid "Name of the vocabulary a term is a member of. This will be the vocabulary that whichever term the \"Taxonomy: Term\" field is; and can similarly cause duplicates." +msgstr "Nazwa słownika w którym znajduje się wyrażenie. To będzie słownik dla któregokolwiek wyrażenia pola \"Taksonomia: wyrażenie\"; i może powodować powstawanie duplikatów." + +#: modules/taxonomy.views.inc:62 +msgid "Vocabulary ID" +msgstr "ID Słownika (Vocabluary ID)" + +#: modules/taxonomy.views.inc:63 +msgid "The taxonomy vocabulary ID" +msgstr "ID słownika w taksonomi" + +#: modules/taxonomy.views.inc:76;107 +msgid "Term" +msgstr "Wyrażenie" + +#: modules/taxonomy.views.inc:77 +msgid "Taxonomy terms are attached to nodes." +msgstr "Wyrażenia Taxonomi dołączone do segmentów." + +#: modules/taxonomy.views.inc:108 +msgid "Taxonomy terms. Note that using this can cause duplicate nodes to appear in views; you must add filters to reduce the resultset." +msgstr "Wyrażenia z taksonomi. Uwaga może to powodować duplikaty segmentów pojawiające się w widokach; Musisz dodać filtry by zredukować ilość wyników tamże." + +#: modules/taxonomy.views.inc:118 +msgid "Taxonomy term name" +msgstr "Nazwa wyrażenia w taxonomi" + +#: modules/taxonomy.views.inc:127 +msgid "The term weight field" +msgstr "Pole wagi wyrażenia" + +#: modules/taxonomy.views.inc:139 +msgid "Term description" +msgstr "Opis wyrażenia" + +#: modules/taxonomy.views.inc:140 +msgid "The description associated with a taxonomy term." +msgstr "Opis powiązany z wyrażeniem taxonomi." + +#: modules/taxonomy.views.inc:151;763 +msgid "Vocabulary" +msgstr "Słownik" + +#: modules/taxonomy.views.inc:152 +msgid "Filter the results of \"Taxonomy: Term\" to a particular vocabulary." +msgstr "Ogranicza wyniki \"Taksonomia: wyrażenie\" do konkretnego słownika." + +#: modules/taxonomy.views.inc:193;1046 +msgid "Term ID" +msgstr "ID Wyrażenia" + +#: modules/taxonomy.views.inc:194 +msgid "The taxonomy term ID" +msgstr "ID wyrażenia w taxonomi" + +#: modules/taxonomy.views.inc:196 +msgid "All terms" +msgstr "Wszystkie wyrażenia" + +#: modules/taxonomy.views.inc:197 +msgid "Display all taxonomy terms associated with a node." +msgstr "Wyświetl wszystkie wyrażenia Taxonomi powiązane z segmentem." + +#: modules/taxonomy.views.inc:282 +msgid "Term synonym" +msgstr "Synonim wyrażenia" + +#: modules/taxonomy.views.inc:283 +msgid "Term synonyms may be used to find terms by alternate names." +msgstr "Synonimy mogą być używane do znajdowania wyrażenia jako alternatywa." + +#: modules/taxonomy.views.inc:299 +msgid "Term ID (with depth)" +msgstr "ID Wyrażenia (z głębokością)" + +#: modules/taxonomy.views.inc:300 +msgid "The depth filter is more complex, so provides fewer options." +msgstr "Filtr głębokości jest bardziej kompleksowy (complex), dlatego udostępnia mniej opcji." + +#: modules/taxonomy.views.inc:310 +msgid "Term ID depth modifier" +msgstr "Modyfikator głębokości Identyfikatora wyrażenia" + +#: modules/taxonomy.views.inc:311 +msgid "Allows the \"depth\" for Taxonomy: Term ID (with depth) to be modified via an additional argument." +msgstr "Zezwala na modyfikowanie \"głębokość\" dla Taksonomi: ID wyrażenia (z głębokością) poprzez dodatkowy argument." + +#: modules/taxonomy.views.inc:341 +msgid "The depth will match nodes tagged with terms in the hierarchy. For example, if you have the term \"fruit\" and a child term \"apple\", with a depth of 1 (or higher) then filtering for the term \"fruit\" will get nodes that are tagged with \"apple\" as well as \"fruit\". If negative, the reverse is true; searching for \"apple\" will also pick up nodes tagged with \"fruit\" if depth is -1 (or lower)." +msgstr "Głębokość dopasuje segmenty oznaczone w hierarchi. Na przykład, jeśli masz wyrażenie \"owoc\" i jego dziecko - wyrażenie \"jabłko\", z głębokością 1 (lub wyższą) wtedy filtrowanie dla wyrażenia \"owoc\" zbierze razem segmenty oznaczone zarówno jako \"jabłko\" jak i \"owoc\". Działa to również w drugą stronę; jeśli głębokość jest -1 (lub niższa) szukając \"jabłko\" zbierzemy razem segmenty oznaczone jako \"owoc\" " + +#: modules/taxonomy.views.inc:346 +msgid "Allow multiple terms per argument" +msgstr "Pozwól na wiele wyrażeń przypadających na argument" + +#: modules/taxonomy.views.inc:347 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3. Due to the number of JOINs it would require, AND will be treated as OR with this argument." +msgstr "Gdy zaznaczone, użytkownicy będą mogli wprowadzać wiele argumentów w postaci 1+2+3. W związku z wymaganą przez to liczbą złączeń (JOINs), \"'oraz\" (AND) będą traktowane jako \"lub\" (OR)." + +#: modules/taxonomy.views.inc:353;978 +msgid "Set the breadcrumb for the term parents" +msgstr " Ustaw trop dla wyrażeń nadrzędnych" + +#: modules/taxonomy.views.inc:354;979 +msgid "If selected, the breadcrumb trail will include all parent terms, each one linking to this view. Note that this only works if just one term was received." +msgstr "Jeśli zaznaczone, trop będzie zawierał wszystkie wyrażenia nadrzędne (parents), każde odnoszące się do tego widoku. Uwaga, działa gdy otrzymano tylko jedno wyrażenie." + +#: modules/taxonomy.views.inc:440;685 +msgid "No name" +msgstr "Brak nazwy" + +#: modules/taxonomy.views.inc:551 +msgid "Link this field to its term page" +msgstr "Podlinkuj to pole do jego strony wyrażeń" + +#: modules/taxonomy.views.inc:558 +msgid "Limit terms by vocabulary" +msgstr "Ogranicz wyrażenia do słownika" + +#: modules/taxonomy.views.inc:572;1034 +msgid "Vocabularies" +msgstr "Słowniki" + +#: modules/taxonomy.views.inc:645 +msgid "Link this field to its taxonomy term page" +msgstr "Odnosnik do strony z listą wyrażeń taksonomi" + +#: modules/taxonomy.views.inc:721 +msgid "No vocabulary" +msgstr "Brak słownika" + +#: modules/taxonomy.views.inc:765 +msgid "Select which vocabulary to show terms for in the regular options." +msgstr "Wybierz, który ze słowników ma wyświetlać wyrażenia" + +#: modules/taxonomy.views.inc:775 +msgid "Selection type" +msgstr "Typ wyboru" + +#: modules/taxonomy.views.inc:776 +msgid "Dropdown" +msgstr "Rozwiń" + +#: modules/taxonomy.views.inc:776 +msgid "Autocomplete" +msgstr "Autouzupełnianie" + +#: modules/taxonomy.views.inc:782 +msgid "Show hierarchy in dropdown" +msgstr "Pokaż hierarchie jako menu rozwijane." + +#: modules/taxonomy.views.inc:799 +msgid "An invalid vocabulary is selected. Please change it in the options." +msgstr "Wybrano niewłaściwy słownik. Wybierz inny." + +#: modules/taxonomy.views.inc:817;851 +msgid "Select terms from vocabulary @voc" +msgstr "Wybierz wyrażenia ze słownika @voc " + +#: modules/taxonomy.views.inc:1012 +msgid "Taxonomy term" +msgstr "Wyrażenia taksonomi" + +#: modules/taxonomy.views.inc:1037 +msgid "If you wish to validate for specific vocabularies, check them; if none are checked, all nodes will pass." +msgstr "Jeśli chcesz sprawdzać poprawność dla określonych słowników - zaznacz; jeśli nie, nie zaznaczaj, wtedy wszystkie segmenty będą sprawdzane." + +#: modules/taxonomy.views.inc:1047 +msgid "Term IDs separated by , or +" +msgstr "ID wrażeń oddzielone , lub +" + +#: modules/taxonomy.views.inc:1048 +msgid "Term name or synonym" +msgstr "Nazwa wyrazenia lub synonim" + +#: modules/taxonomy.views.inc:1049 +msgid "Term name/synonym converted to Term ID" +msgstr "Wyrażenie/synonim skonwertowany do ID Wyrażenia (Term ID)" + +#: modules/taxonomy.views.inc:1052 +msgid "Select the form of this argument; if using term name, it is generally more efficient to convert it to a term ID and use Taxonomy: Term ID rather than Taxonomy: Term Name\" as an argument." +msgstr " " + +#: modules/taxonomy.views.inc:937 +msgid "Unable to find term: @terms" +msgid_plural "Unable to find terms: @terms" +msgstr[0] "Nie znaleziono wyrażenia: @terms" +msgstr[1] "Nie znaleziono wyrażeń: @terms" +msgstr[2] "Nie znaleziono wyrażeń: @terms" + +#: modules/upload.views.inc:25 +msgid "Upload" +msgstr "Dodaj plik" + +#: modules/upload.views.inc:49 +msgid "The description of the uploaded file." +msgstr "Opis wgranego pliku." + +#: modules/upload.views.inc:66 +msgid "Listed" +msgstr "Wylistowany" + +#: modules/upload.views.inc:67 +msgid "Whether or not the file is marked to be listed." +msgstr "Czy pliki mają być wylistowane czy też nie." + +#: modules/upload.views.inc:83 +msgid "The weight, used for sorting." +msgstr "Waga użytego sortowania." + +#: modules/upload.views.inc:101;113 +msgid "Attached files" +msgstr "Dołączone pliki" + +#: modules/upload.views.inc:102 +msgid "All files attached to a node with upload.module." +msgstr "Wszystkie pliki dołączone do segmentu z upload.module." + +#: modules/upload.views.inc:109;274 +msgid "Has attached files" +msgstr "Ma dołączone pliki" + +#: modules/upload.views.inc:110 +msgid "Only display items with attached files. This can cause duplicates if there are multiple attached files." +msgstr "Wyświetla tylko elementy z dołączonymi plikami. To może powodować powstawanie duplikatów jeśli jest wiele dołączonych plików." + +#: modules/upload.views.inc:114 +msgid "Add a relationship to gain access to more file data for files uploaded by upload.module. Note that this relationship will cause duplicate nodes if there are multiple files attached to the node." +msgstr "Dodaj zależności zyskujące dostęp do plików danych załadowanych przez upload.module. Uwaga, ta zalezność może spowodować pojawienie się duplikatów wielu plików dołączonych do segmentu." + +#: modules/upload.views.inc:120 +msgid "Files" +msgstr "Pliki" + +#: modules/upload.views.inc:151 +msgid "Only show \"listed\" file attachments" +msgstr "Pokazuj tylko załączniki \"listed\"" + +#: modules/user.views.inc:28 +msgid "Users who have created accounts on your site." +msgstr "Użytkownicy którzy założyli konto na Twojej witrynie." + +#: modules/user.views.inc:48 +msgid "Uid" +msgstr "Uid" + +#: modules/user.views.inc:49 +msgid "The user ID" +msgstr "ID użytkownika" + +#: modules/user.views.inc:70 +msgid "Current" +msgstr "Bieżący" + +#: modules/user.views.inc:71 +msgid "Filter the view to the currently logged in user." +msgstr "Filtr do przeglądania obecnie zalogowanych użytkowników." + +#: modules/user.views.inc:80 +msgid "The user or author name." +msgstr "Użytkownik lub dane autora" + +#: modules/user.views.inc:96 +msgid "E-mail" +msgstr "E-mail" + +#: modules/user.views.inc:97 +msgid "Email address for a given user. Only accessible to users with administer users permission" +msgstr "Adres e-mail dla danego użytkownika. Dostępne tylko dla użytkowników z prawami administratora." + +#: modules/user.views.inc:114 +msgid "Picture" +msgstr "Obraz" + +#: modules/user.views.inc:115 +msgid "The user's picture, if allowed." +msgstr "Obrzy użytkownika, jeśli dozwolone." + +#: modules/user.views.inc:126 +msgid "The date the user was created." +msgstr "Data stworzenia użytkownika." + +#: modules/user.views.inc:141 +msgid "Last access" +msgstr "Ostatni dostęp" + +#: modules/user.views.inc:142 +msgid "The user's last access date." +msgstr "Data ostatniego dostępu użytkownika." + +#: modules/user.views.inc:157 +msgid "Last login" +msgstr "Ostatni login" + +#: modules/user.views.inc:158 +msgid "The user's last login date." +msgstr "Data ostatniego loginu użytkownika." + +#: modules/user.views.inc:174 +msgid "Whether a user is active or blocked." +msgstr "Czy użytkownik jest aktywny, czy zablokowany." + +#: modules/user.views.inc:191 +msgid "Signature" +msgstr "Podpis" + +#: modules/user.views.inc:192 +msgid "The user's signature." +msgstr "Podpis użytkownika" + +#: modules/user.views.inc:205 +msgid "Provide a simple link to edit the user." +msgstr "Dostarcza prosty odnośnik do edycji użytkownika." + +#: modules/user.views.inc:213 +msgid "Provide a simple link to delete the user." +msgstr "Dostarcza prosty odnośnik do usunięcia użytkownika." + +#: modules/user.views.inc:242 +msgid "Roles" +msgstr "Role" + +#: modules/user.views.inc:243 +msgid "Roles that a user belongs to." +msgstr "Role do których należy użytkownik" + +#: modules/user.views.inc:255 +msgid "No role" +msgstr "Brak roli" + +#: modules/user.views.inc:306 +msgid "User ID from URL" +msgstr "ID użytkownika z URL" + +#: modules/user.views.inc:322 +msgid "Also look for a node and use the node author" +msgstr "Patrz również na segment i użyj jego autora." + +#: modules/user.views.inc:387 +msgid "Link this field to its user" +msgstr "Podlinkuj to pole do użytkownika" + +#: modules/user.views.inc:520 +msgid "Link this field" +msgstr "Podlinkuj to pole" + +#: modules/user.views.inc:523 +msgid "No link" +msgstr "Brak odnośnika" + +#: modules/user.views.inc:524 +msgid "To the user" +msgstr "Dla użytkownika" + +#: modules/user.views.inc:525 +msgid "With a mailto:" +msgstr "Z \"wyślij do:\" (mailto:)" + +#: modules/user.views.inc:643 +msgid "Usernames" +msgstr "Lista użytkowników" + +#: modules/user.views.inc:644 +msgid "Enter a comma separated list of user names." +msgstr "Wprowadź liste użytkowników oddzieloną przecinkami." + +#: modules/user.views.inc:752 +msgid "Is the logged in user" +msgstr "Zalogowany użytkownik" + +#: modules/user.views.inc:710 +msgid "Unable to find user: @users" +msgid_plural "Unable to find users: @users" +msgstr[0] "Nie mogę znaleźć użytkownika: @users" +msgstr[1] "Nie mogę znaleźć użytkowników: @users" +msgstr[2] "Nie mogę znaleźć użytkowników: @users" + +#: modules/views.views.inc:18 +msgid "Global" +msgstr "Globalne" + +#: modules/views.views.inc:23 +msgid "Random" +msgstr "Losowy" + +#: modules/views.views.inc:24 +msgid "Randomize the display order." +msgstr "Losowa kolejność wyświetlania." + +#: modules/views.views.inc:31 +msgid "Null" +msgstr "Null" + +#: modules/views.views.inc:32 +msgid "Allow an argument to be ignored. The query will not be altered by this argument." +msgstr "Zezwól na ignorowanie argumentu. Ten argument nie będzie miał wpływu na zapytanie." + +#: modules/views.views.inc:88 +msgid "Fail basic validation if any argument is given" +msgstr "Zawodzi podstawowe sprawdzanie poprawności jeśli podamy jakikolwiek argument." + +#: modules/views.views.inc:90 +msgid "By checking this field, you can use this to make sure views with more arguments than necessary fail validation." +msgstr "Zaznaczając to pole, używając tego możesz wymusić błąd poprawności dla widoków z większą niż wymaganą liczbą argumentów." + +#: theme/views-more.tpl.php:15 +msgid "more" +msgstr "więcej" + +#: theme/views-ui-edit-item.tpl.php:18 +msgid "None defined" +msgstr "Niezdefiniowane" + +#: theme/views-ui-edit-tab.tpl.php:31 +msgid "View settings" +msgstr "Ustawienia widoków" + +#: theme/views-ui-edit-view.tpl.php:11 +msgid "This view is being edited by user !user, and is therefore locked from editing by others. This lock is !age old. Click here to !break." +msgstr "Ten widok jest edytowany przez !user, dlatego nikt inny w tej chwili nie może go edytować. Blokadę założono !age temu. Kliknij !break aby zlikwidować blokadę." + +#: theme/views-ui-edit-view.tpl.php:16 +msgid "New view" +msgstr "Nowy widok" + +#: theme/views-ui-edit-view.tpl.php:18 +msgid "Changed view" +msgstr "Zmień widok" + +#: theme/views-ui-edit-view.tpl.php:23 +msgid "View %name, displaying items of type @base." +msgstr "Widok %name, wyświetlający typy elementów @base." + +#: theme/views-ui-edit-view.tpl.php:42 +msgid "Live preview" +msgstr "Podgląd" + +#: theme/views-ui-list-views.tpl.php:17 +msgid "@type @base view: @view" +msgstr "@type @base widok: @view" + +#: theme/views-ui-list-views.tpl.php:27 +msgid "Title: @title" +msgstr "Tytuł: @title" + +#: theme/views-ui-list-views.tpl.php:30 +msgid "Path: !path" +msgstr "Śćiezka: !path" + +#: theme/theme.inc:90 +msgid "Edit this view" +msgstr "Edytuj widok" + +#: theme/theme.inc:289 +msgid "sort by @s" +msgstr "Sortuj po @s" + +#: theme/theme.inc:490 +msgid "‹‹" +msgstr "‹‹" + +#: theme/theme.inc:491 +msgid "››" +msgstr "››" + +#: theme/theme.inc:501 +msgid "@current of @max" +msgstr "@current z @max" + +#: views_export/views_export.module:76 +msgid "There are no views to be exported at this time." +msgstr "W tym momencie nie ma widoków do eksportu." + +#: views_export/views_export.module:108 +msgid "Show only these tags" +msgstr "Pokazuj tylko te tagi" + +#: views_export/views_export.module:122 +msgid "Module name" +msgstr "Nazwa modułu" + +#: views_export/views_export.module:123 +msgid "Enter the module name to export code to." +msgstr "Wprowadź nazwe modułu dla którego kod ma byś wyeksportowany." + +#: views_export/views_export.module:190 +msgid "Put this in @module.views_default.inc in your modules/@module directory or modules/@module/includes directory" +msgstr "Umieść @module.views_default.inc w swoim katalogu modules/@module lub modules/@module/includes" + +#: views_export/views_export.module:44 +msgid "use views exporter" +msgstr "Użyj eksportera widoków" + +#: views_export/views_export.module:17 +msgid "Bulk export" +msgstr "Hurtowy eksport" + +#: views_export/views_export.module:0 +msgid "views_export" +msgstr "views_export" + +#: views_export/views_export.info:0 +msgid "Views exporter" +msgstr "Eksporter Widoków" + +#: views_export/views_export.info:0 +msgid "Allows exporting multiple views at once." +msgstr "Zezwala na eksportowanie wielu widoków na raz" + diff --git a/translations/sv.po b/translations/sv.po new file mode 100644 index 0000000000000000000000000000000000000000..bd8aa2b7953171efe44c5ea9754ec12d7daccfbc --- /dev/null +++ b/translations/sv.po @@ -0,0 +1,4901 @@ +# $Id$ +# +# Swedish translation of Drupal (views) +# Generated from files: +# views.module,v 1.317 2008/10/16 17:21:36 merlinofchaos +# admin.inc,v 1.146 2008/10/28 22:50:00 merlinofchaos +# views_ui.module,v 1.106 2008/10/07 22:05:28 merlinofchaos +# views_export.module,v 1.2 2008/06/25 21:42:20 merlinofchaos +# views.info,v 1.7 2007/08/12 06:52:14 merlinofchaos +# views_ui.info,v 1.10 2008/01/09 00:05:08 merlinofchaos +# views_export.info,v 1.1 2008/06/12 16:17:25 merlinofchaos +# plugins.inc,v 1.151 2008/10/28 19:23:50 merlinofchaos +# convert.inc,v 1.12 2008/10/08 00:14:01 merlinofchaos +# theme.inc,v 1.63 2008/10/28 17:46:14 merlinofchaos +# views.install,v 1.42 2008/10/14 19:51:55 merlinofchaos +# docs.php,v 1.10 2008/10/02 22:54:56 merlinofchaos +# views_handler_argument.inc,v 1.4 2008/10/08 00:14:00 merlinofchaos +# views_handler_relationship_translation.inc,v 1.1 2008/09/30 22:07:15 merlinofchaos +# comment.views.inc,v 1.25 2008/10/16 17:21:36 merlinofchaos +# node.views.inc,v 1.87 2008/10/16 17:09:52 merlinofchaos +# views_plugin_display.inc,v 1.16 2008/10/28 20:28:56 merlinofchaos +# views_plugin_display_page.inc,v 1.3 2008/10/08 22:59:59 merlinofchaos +# views_handler_field.inc,v 1.5 2008/10/16 19:38:52 merlinofchaos +# views_handler_filter.inc,v 1.4 2008/10/20 19:35:53 merlinofchaos +# views_handler_relationship.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_sort.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_argument_date.inc,v 1.2 2008/10/07 21:26:23 merlinofchaos +# views_handler_argument_many_to_one.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_argument_numeric.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_argument_string.inc,v 1.2 2008/09/25 00:09:08 merlinofchaos +# taxonomy.views.inc,v 1.49 2008/10/01 17:20:58 merlinofchaos +# views_handler_argument_null.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_field_boolean.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_filter_boolean_operator.inc,v 1.2 2008/09/10 01:08:06 merlinofchaos +# views_handler_filter_in_operator.inc,v 1.4 2008/09/24 22:28:06 merlinofchaos +# views_plugin_display_attachment.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_date.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_field_numeric.inc,v 1.4 2008/10/23 01:04:24 merlinofchaos +# views_handler_field_prerender_list.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_plugin_row_node_rss.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_plugin_style_list.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_row_fields.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_style_summary_unformatted.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_url.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_field_accesslog_path.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_filter_numeric.inc,v 1.6 2008/10/28 20:11:20 merlinofchaos +# views_handler_filter_string.inc,v 1.6 2008/10/28 20:13:34 merlinofchaos +# views_handler_filter_date.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_filter_equality.inc,v 1.2 2008/09/10 01:08:06 merlinofchaos +# views_handler_filter_many_to_one.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# system.views.inc,v 1.7 2008/09/03 19:21:29 merlinofchaos +# views_plugin_access.inc,v 1.1 2008/09/08 22:50:17 merlinofchaos +# views_plugin_style_table.inc,v 1.5 2008/10/15 22:25:36 merlinofchaos +# views_handler_sort_date.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_sort_formula.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# view.inc,v 1.138 2008/10/29 19:09:49 merlinofchaos +# views_plugin_style.inc,v 1.4 2008/10/08 00:14:01 merlinofchaos +# user.views.inc,v 1.52 2008/10/08 20:56:02 merlinofchaos +# statistics.views.inc,v 1.9 2008/10/28 20:21:37 merlinofchaos +# upload.views.inc,v 1.14 2008/09/10 21:29:15 merlinofchaos +# views_plugin_display_block.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_display_feed.inc,v 1.3 2008/09/30 18:52:15 merlinofchaos +# book.views.inc,v 1.4 2008/07/02 17:42:57 merlinofchaos +# ajax.inc,v 1.19 2008/09/22 20:50:58 merlinofchaos +# analyze.inc,v 1.1 2008/10/28 22:50:00 merlinofchaos +# form.inc,v 1.10 2008/06/25 21:10:10 merlinofchaos +# handlers.inc,v 1.98 2008/10/28 17:47:49 merlinofchaos +# views_plugin_access_role.inc,v 1.1 2008/09/08 22:50:17 merlinofchaos +# views_plugin_access_perm.inc,v 1.2 2008/09/17 22:26:55 merlinofchaos +# ajax.js,v 1.23 2008/10/08 00:14:01 merlinofchaos +# ajax_view.js,v 1.12 2008/10/15 22:09:19 merlinofchaos +# tabs.js,v 1.3 2008/03/30 15:58:26 merlinofchaos +# views_handler_argument_term_node_tid_depth.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# translation.views.inc,v 1.2 2008/10/01 17:20:58 merlinofchaos +# poll.views.inc,v 1.2 2008/03/12 04:32:07 merlinofchaos +# profile.views.inc,v 1.9 2008/09/24 21:21:21 merlinofchaos +# search.views.inc,v 1.14 2008/09/25 00:39:18 merlinofchaos +# views_plugin_argument_validate_taxonomy_term.inc,v 1.2 2008/09/10 16:17:54 merlinofchaos +# views_handler_filter_term_node_tid.inc,v 1.5 2008/10/20 21:32:28 merlinofchaos +# views_handler_filter_node_language.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_filter_node_language.inc,v 1.1 2008/09/30 22:07:15 merlinofchaos +# views_handler_filter_upload_fid.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views.views.inc,v 1.5 2008/09/03 19:21:29 merlinofchaos +# views_handler_argument_comment_user_uid.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_argument_user_uid.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_comment.inc,v 1.2 2008/09/10 00:16:14 merlinofchaos +# views_handler_field_comment_link.inc,v 1.2 2008/09/10 00:16:14 merlinofchaos +# views_handler_field_node_link.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_user_link.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_comment_link_delete.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_node_link_delete.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_node_revision_link_delete.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_user_link_delete.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_comment_link_edit.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_node_link_edit.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_user_link_edit.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_comment_link_reply.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_comment_username.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_node_comment.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_filter_node_comment.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_node_new_comments.inc,v 1.2 2008/09/22 21:59:39 merlinofchaos +# views_plugin_row_comment_view.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_plugin_row_node_view.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_argument_dates_various.inc,v 1.2 2008/09/30 21:30:16 merlinofchaos +# views_handler_argument_node_language.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_argument_node_language.inc,v 1.1 2008/09/30 22:07:15 merlinofchaos +# views_handler_argument_node_type.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_history_user_timestamp.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_node.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_node_revision_link_revert.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_filter_node_type.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_plugin_argument_validate_node.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_filter_search.inc,v 1.2 2008/09/10 20:15:50 merlinofchaos +# views_plugin_row_search_view.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_argument_file_fid.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_file.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_upload_description.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_upload_fid.inc,v 1.2 2008/09/10 21:02:57 merlinofchaos +# views_handler_argument_taxonomy.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_argument_term_node_tid.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_argument_vocabulary_vid.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_taxonomy.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_term_node_tid.inc,v 1.2 2008/09/22 18:13:51 merlinofchaos +# views_handler_field_user.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_user_mail.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_filter_user_current.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_filter_user_name.inc,v 1.2 2008/09/22 23:41:14 merlinofchaos +# views_plugin_argument_default_user.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_access_none.inc,v 1.1 2008/09/08 22:50:17 merlinofchaos +# views_plugin_argument_default.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_argument_default_php.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_argument_validate.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_argument_validate_php.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_style_summary.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_style_grid.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_style_rss.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views-more.tpl.php,v 1.2 2008/04/11 08:46:26 merlinofchaos +# views-ui-edit-item.tpl.php,v 1.9 2008/08/08 16:57:44 merlinofchaos +# views-ui-edit-tab.tpl.php,v 1.11 2008/08/08 16:57:44 merlinofchaos +# views-ui-edit-view.tpl.php,v 1.9 2008/10/08 00:14:01 merlinofchaos +# views-ui-list-views.tpl.php,v 1.6 2008/10/28 18:11:43 merlinofchaos +# +msgid "" +msgstr "" +"Project-Id-Version: Views 6.x-2.x\n" +"POT-Creation-Date: 2009-05-27 15:41+0200\n" +"PO-Revision-Date: 2009-05-27 15:55+0100\n" +"Last-Translator: Magnus Gunnarsson \n" +"Language-Team: drupalsverige.se\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" +"X-Poedit-Language: Swedish\n" +"X-Poedit-Country: SWEDEN\n" +"X-Poedit-SourceCharset: utf-8\n" + +#: views.module:644 +msgid "Broken handler @table.@field" +msgstr "Trasig hanterare @table.@field" + +#: views.module:762 +msgid "Skipping broken view @view" +msgstr "Hoppar över trasig vy @view" + +#: views.module:814;854 +#: includes/admin.inc:114;232;232;646 +msgid "Overridden" +msgstr "Åsidosatt" + +#: views.module:817;850 +#: views_ui.module:282 +#: includes/admin.inc:113;231;231;613;794 +msgid "Default" +msgstr "Förvald" + +#: views.module:964 +#: includes/admin.inc:311 +#: views_export/views_export.module:117 +msgid "Apply" +msgstr "Verkställ" + +#: views.module:146 +msgid "access all views" +msgstr "åtkomst till alla vyer" + +#: views.module:146 +msgid "administer views" +msgstr "administrera views" + +#: views.module:158 +#: views_ui.module:26 +#: views.info:0;0 +#: views_ui.info:0 +#: views_export/views_export.info:0 +msgid "Views" +msgstr "Views" + +#: views.module:162 +msgid "Ajax callback for view loading." +msgstr "Ajax callback för laddning av vyer." + +#: views.module:0 +msgid "views" +msgstr "views" + +#: views_ui.module:159 +msgid "The converter will make a best-effort attempt to convert a Views 1 view to Views 2. This conversion is not reliable; you will very likely have to make adjustments to your view to get it to match. You can import Views 1 views through the normal Import tab." +msgstr "Konverteraren kommer göra ett så bra försök som möjligt att försök konvertera vyer av typen Views 1 till Views 2. Denna konverteringen är inte tillförlitlig. Du kommer mycket troligtvis att behöva göra justeringar i din vy för att få den att passa. Du kan importera vyer i Views 1 genom den vanliga importfliken." + +#: views_ui.module:258 +msgid "Changes cannot be made to a locked view." +msgstr "Ändringar kan inte göras till en låst vy." + +#: views_ui.module:28 +msgid "Views are customized lists of content on your system; they are highly configurable and give you control over how lists of content are presented." +msgstr "Views är anpassade listor av innehåll i ditt system. De är mycket anpassningsbara och ger dig kontroll över hur listor av innehåll presenteras." + +#: views_ui.module:32 +#: includes/plugins.inc:135 +msgid "List" +msgstr "Visa" + +#: views_ui.module:38 +#: includes/admin.inc:1206;1206;2193 +msgid "Add" +msgstr "Lägg till" + +#: views_ui.module:43 +#: includes/admin.inc:752 +msgid "Import" +msgstr "Importera" + +#: views_ui.module:49 +msgid "Tools" +msgstr "Verktyg" + +#: views_ui.module:55 +msgid "Basic" +msgstr "Grundläggande" + +#: views_ui.module:63 +#: includes/convert.inc:30 +msgid "Convert" +msgstr "Konvertera" + +#: views_ui.module:64 +msgid "Convert stored Views 1 views." +msgstr "Konvertera lagrade vyer av typen Views 1." + +#: views_ui.module:70;83;88 +msgid "Delete view" +msgstr "Ta bort vy" + +#: views_ui.module:76 +msgid "Convert view" +msgstr "Konvertera vy" + +#: views_ui.module:113 +#: includes/admin.inc:109 +#: theme/theme.inc:91 +msgid "Edit" +msgstr "Redigera" + +#: views_ui.module:0 +msgid "views_ui" +msgstr "views_ui" + +#: views.info:0 +msgid "Create customized lists and queries from your database." +msgstr "Skapa anpassade listor och frågor från din databas." + +#: views_ui.info:0 +msgid "Views UI" +msgstr "Views UI" + +#: views_ui.info:0 +msgid "Administrative interface to views. Without this module, you cannot create or edit your views." +msgstr "Administrativt gränssnitt till modulen Views. Utan denna modul kan du inte skapa eller redigera dina vyer." + +#: docs/docs.php:90;97 +msgid "Example table" +msgstr "Exempel på tabell" + +#: docs/docs.php:98 +msgid "Example table contains example content and can be related to nodes." +msgstr "Exempeltabellen innehåller exempel på innehåll och kan relateras till noder." + +#: docs/docs.php:122 +msgid "Example content" +msgstr "Exempel på innehåll" + +#: docs/docs.php:123 +msgid "Some example content that references a node." +msgstr "Några exempel på innehåll som refererar till en nod." + +#: docs/docs.php:131 +msgid "Example node" +msgstr "Exempel på nod" + +#: docs/docs.php:137 +msgid "Plain text field" +msgstr "Enkelt textfält" + +#: docs/docs.php:138 +msgid "Just a plain text field." +msgstr "Helt enkelt ett textfält." + +#: docs/docs.php:156 +msgid "Numeric field" +msgstr "Numeriskt fält" + +#: docs/docs.php:157 +msgid "Just a numeric field." +msgstr "Helt enkelt ett numeriskt fält." + +#: docs/docs.php:172 +msgid "Boolean field" +msgstr "Booleskt fält" + +#: docs/docs.php:173 +msgid "Just an on/off field." +msgstr "Helt enkelt ett fält för på/av." + +#: docs/docs.php:180 +#: modules/node.views.inc:159;167 +#: modules/upload.views.inc:82 +msgid "Published" +msgstr "Publicerad" + +#: docs/docs.php:190 +msgid "Timestamp field" +msgstr "Fält för tidsstämpel" + +#: docs/docs.php:191 +msgid "Just a timestamp field." +msgstr "Helt enkelt ett fält för tidsstämpel." + +#: docs/docs.php:262 +msgid "Emulates the default Drupal front page; you may set the default home page path to this view to make it your front page." +msgstr "Emulerar den förvalda framsidan i Drupan. Du kan ange den förvalda startsidan till denna vy för att göra den till din framsida." + +#: docs/docs.php:263 +msgid "default" +msgstr "förvald" + +#: docs/docs.php:272 +#: includes/plugins.inc:25 +msgid "Defaults" +msgstr "Förvalt" + +#: docs/docs.php:361 +#: includes/plugins.inc:39;47 +msgid "Page" +msgstr "Sida" + +#: docs/docs.php:416 +#: includes/plugins.inc:72;80 +msgid "Feed" +msgstr "Innehållsflöde" + +#: docs/docs.php:484 +msgid "Front page feed" +msgstr "Framsidans innehållsflöde" + +#: handlers/views_handler_argument.inc:102 +#: modules/translation/views_handler_relationship_translation.inc:23 +msgid "All" +msgstr "Alla" + +#: handlers/views_handler_argument.inc:119 +#: includes/admin.inc:288;407 +#: modules/aggregator.views.inc:40;172 +#: modules/comment.views.inc:44 +#: modules/node.views.inc:85;417 +#: plugins/views_plugin_display.inc:592 +#: plugins/views_plugin_display_page.inc:291;375 +msgid "Title" +msgstr "Titel" + +#: handlers/views_handler_argument.inc:121 +msgid "The title to use when this argument is present. It will override the title of the view and titles from previous arguments. You can use percent substitution here to replace with argument titles. Use \"%1\" for the first argument, \"%2\" for the second, etc." +msgstr "Titel att använda när detta argumentet framförs. Den kommer åsidosätta titeln på denna vy och titlar från tidigare argument. Du kan använda procentsersättning här för att ersätta med argumenttitlar. Använd \"%1\" för det första argumentet, \"%2\" för det andra argumentet o.s.v." + +#: handlers/views_handler_argument.inc:134 +msgid "Action to take if argument is not present" +msgstr "Åtgärd att ta till då det inte framförs något argument." + +#: handlers/views_handler_argument.inc:146 +msgid "Wildcard" +msgstr "Jokertecken" + +#: handlers/views_handler_argument.inc:149 +msgid "If this value is received as an argument, the argument will be ignored; i.e, \"all values\"" +msgstr "Om detta värdet är mottaget som ett argument kommer det bli ignorerat. Det vill säga. \"alla värden\"" + +#: handlers/views_handler_argument.inc:155 +msgid "Wildcard title" +msgstr "Titel för jokertecken" + +#: handlers/views_handler_argument.inc:158 +msgid "The title to use for the wildcard in substitutions elsewhere." +msgstr "Titeln att använda för jokertecknet i ersättandet på andra ställen." + +#: handlers/views_handler_argument.inc:181 +msgid "Validator options" +msgstr "Alternativ för bekräftare" + +#: handlers/views_handler_argument.inc:186 +msgid "Validator" +msgstr "Bekräftare" + +#: handlers/views_handler_argument.inc:190 +msgid "" +msgstr "" + +#: handlers/views_handler_argument.inc:229 +msgid "Action to take if argument does not validate" +msgstr "Åtgärd att ta till om argumentet inte bekräftas" + +#: handlers/views_handler_argument.inc:248 +msgid "Display all values" +msgstr "Visa alla värden" + +#: handlers/views_handler_argument.inc:253 +msgid "Hide view / Page not found (404)" +msgstr "Dölj vy / Sidan hittades inte (404)" + +#: handlers/views_handler_argument.inc:258 +msgid "Display empty text" +msgstr "Visa tom text" + +#: handlers/views_handler_argument.inc:263 +msgid "Summary, sorted ascending" +msgstr "Sammanfattning, stigande sortering" + +#: handlers/views_handler_argument.inc:270 +msgid "Summary, sorted descending" +msgstr "Sammanfattning, fallande sortering" + +#: handlers/views_handler_argument.inc:277 +msgid "Provide default argument" +msgstr "Tillhandahåll förvalt argument" + +#: handlers/views_handler_argument.inc:310 +msgid "Provide default argument options" +msgstr "Tillhandahåll standardalternativ för argument" + +#: handlers/views_handler_argument.inc:320 +msgid "Default argument type" +msgstr "Förvald argumentstyp" + +#: handlers/views_handler_argument.inc:744 +#: handlers/views_handler_field.inc:599 +#: handlers/views_handler_filter.inc:593 +#: handlers/views_handler_relationship.inc:133 +#: handlers/views_handler_sort.inc:66 +msgid "Broken/missing handler" +msgstr "Trasig/saknad hanterare" + +#: handlers/views_handler_argument.inc:752 +#: handlers/views_handler_field.inc:607 +#: handlers/views_handler_filter.inc:601 +#: handlers/views_handler_relationship.inc:141 +#: handlers/views_handler_sort.inc:74 +msgid "The handler for this item is broken or missing and cannot be used. If a module provided the handler and was disabled, re-enabling the module may restore it. Otherwise, you should probably delete this item." +msgstr "Hanteraren för detta alternativ är trasig eller saknas och kan inte användas. Om en modul tillhandahöll hanteraren och blev inaktiverad kan den återställas genom att aktivera modulen igen. Annars bör du troligen ta bort detta alternativ." + +#: handlers/views_handler_argument_date.inc:29 +msgid "Current date" +msgstr "Nuvarande datum" + +#: handlers/views_handler_argument_date.inc:30 +msgid "Current node's creation time" +msgstr "Tid då aktuell nod skapades" + +#: handlers/views_handler_argument_date.inc:31 +msgid "Current node's update time" +msgstr "Tid då aktuell nod uppdaterades" + +#: handlers/views_handler_argument_many_to_one.inc:45 +#: handlers/views_handler_argument_numeric.inc:30 +msgid "Allow multiple terms per argument." +msgstr "Tillåt flera termer per argument." + +#: handlers/views_handler_argument_many_to_one.inc:46 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3 (for OR) or 1,2,3 (for AND)." +msgstr "Om valt, kan användare ange flera argument på formen 1+2+3 (for OR) eller 1,2,3 (for AND)." + +#: handlers/views_handler_argument_many_to_one.inc:53 +#: handlers/views_handler_argument_string.inc:95 +msgid "Allow multiple arguments to work together." +msgstr "Tillåt flera argument att samarbeta." + +#: handlers/views_handler_argument_many_to_one.inc:54 +#: handlers/views_handler_argument_string.inc:96 +msgid "If selected, multiple instances of this argument can work together, as though multiple terms were supplied to the same argument. This setting is not compatible with the \"Reduce duplicates\" setting." +msgstr "Om valt, kan flera instanser av detta argumentet samarbeta, som om flera termer var tillförda till samma argument. Denna inställningen är inte kompatibel med inställningen \"Reducera dubletter\"." + +#: handlers/views_handler_argument_many_to_one.inc:60 +#: handlers/views_handler_argument_string.inc:102 +msgid "Do not display items with no value in summary" +msgstr "Visa inte alternativ utan innehåll i sammanfattningen" + +#: handlers/views_handler_argument_many_to_one.inc:95;109 +#: handlers/views_handler_argument_numeric.inc:45;57 +#: modules/taxonomy.views.inc:133;212;296 +msgid "Uncategorized" +msgstr "Ej kategoriserad" + +#: handlers/views_handler_argument_many_to_one.inc:113 +#: handlers/views_handler_argument_numeric.inc:61 +msgid "Invalid input" +msgstr "Ogiltig inmatning" + +#: handlers/views_handler_argument_null.inc:21 +msgid "Fail basic validation if any argument is given" +msgstr "Misslyckas med grundläggande godkännande om ett argument är givet." + +#: handlers/views_handler_argument_null.inc:23 +msgid "By checking this field, you can use this to make sure views with more arguments than necessary fail validation." +msgstr "Genom att kryssa för detta fält kan du använda detta för att säkerställa att vyer med fler argument än nödvändigt misslyckas med validering." + +#: handlers/views_handler_argument_numeric.inc:31 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3 or 1,2,3." +msgstr "Om valt, kan användare ange flera argument på formen 1+2+3 eller 1,2,3." + +#: handlers/views_handler_argument_numeric.inc:37 +msgid "Exclude the argument" +msgstr "Exkludera argumentet" + +#: handlers/views_handler_argument_numeric.inc:38 +msgid "If selected, the numbers entered in the argument will be excluded rather than limiting the view." +msgstr "Om valt, kommer de angivna numren i argumentet att exkluderas istället för att begränsa denna vy." + +#: handlers/views_handler_argument_string.inc:44 +msgid "Glossary mode" +msgstr "Tillstånd som ordlista" + +#: handlers/views_handler_argument_string.inc:45 +msgid "Glossary mode applies a limit to the number of characters used in the argument, which allows the summary view to act as a glossary." +msgstr "Tillståndet som ordlista anger en gräns för antalet tecken att använda i argumentet, vilket möjliggör att en sammanfattningsvy kan agera som en ordlista." + +#: handlers/views_handler_argument_string.inc:51 +msgid "Character limit" +msgstr "Teckenbegränsning" + +#: handlers/views_handler_argument_string.inc:52 +msgid "How many characters of the argument to filter against. If set to 1, all fields starting with the letter in the argument would be matched." +msgstr "Hur många tecken av argumentet att filtrera mot. Om satt till 1 skulle alla fält som börjar med bokstaven i argumentet matchas." + +#: handlers/views_handler_argument_string.inc:60 +msgid "Case" +msgstr "Skiftläge" + +#: handlers/views_handler_argument_string.inc:61 +msgid "When printing the argument result, how to transform the case." +msgstr "Hur bokstävers skiftläge skall ändras när argumentets resultat skriv ut." + +#: handlers/views_handler_argument_string.inc:63;77 +msgid "No transform" +msgstr "Ingen förändring" + +#: handlers/views_handler_argument_string.inc:64;78 +msgid "Upper case" +msgstr "Stora bokstäver" + +#: handlers/views_handler_argument_string.inc:65;79 +msgid "Lower case" +msgstr "Små bokstäver" + +#: handlers/views_handler_argument_string.inc:66;80 +msgid "Capitalize first letter" +msgstr "Omvandla första bokstaven till stor" + +#: handlers/views_handler_argument_string.inc:67;81 +msgid "Capitalize each word" +msgstr "Omvandla varje ord till stora bokstäver" + +#: handlers/views_handler_argument_string.inc:74 +msgid "Case in path" +msgstr "skiftläge i sökväg" + +#: handlers/views_handler_argument_string.inc:75 +msgid "When printing url paths, how to transform the of the argument. Do not use this unless with Postgres as it uses case sensitive comparisons." +msgstr "Hur bokstävers skiftläge ändras när URL-sökvägar för argumentet skrivs ut. Använd inte detta förutom med Postgres eftersom den använder skifteslägeskänslig jämförelse." + +#: handlers/views_handler_argument_string.inc:88 +msgid "Transform spaces to dashes in URL" +msgstr "Ändra mellanslag till bindestreck i URL:er" + +#: handlers/views_handler_field.inc:173 +#: handlers/views_handler_filter.inc:322 +#: handlers/views_handler_relationship.inc:78 +msgid "Label" +msgstr "Etikett" + +#: handlers/views_handler_field.inc:175 +msgid "The label for this field that will be displayed to end users if the style requires it." +msgstr "Etiketten för detta fält som visas för slutanvändare om stilen kräver det." + +#: handlers/views_handler_field.inc:179 +msgid "Exclude from display" +msgstr "Exkludera från visning." + +#: handlers/views_handler_field.inc:181 +msgid "Check this box to not display this field, but still load it in the view. Use this option to not show a grouping field in each record, or when doing advanced theming." +msgstr "Kryssa i denna ruta för att inte visa detta fält, men ändå ladda det i din vy. Använd detta alternativ för att inte visa ett grupperande fält i varje resultat, eller när du håller på med avancerade anpassningar av teman." + +#: handlers/views_handler_field.inc:188 +msgid "Rewrite the output of this field" +msgstr "Återskapa utmatningen av detta fält" + +#: handlers/views_handler_field.inc:189 +msgid "If checked, you can alter the output of this field by specifying a string of text with replacement tokens that can use any existing field output." +msgstr "Om ikryssat, så kan du påverka utmatningen för detta fält genom att specificera en textsträng med ersättningssymboler som kan använda vilket existerande utmatningsformat som helst." + +#: handlers/views_handler_field.inc:194 +msgid "Text" +msgstr "Text" + +#: handlers/views_handler_field.inc:197 +msgid "The text to display for this field. You may include HTML. You may enter data from this view as per the \"Replacement patterns\" below." +msgstr "Texten som visas för detta fält. Du kan använda HTML. Du kan ange data från denna vy som enligt \"Mönster för ersättning\" nedan." + +#: handlers/views_handler_field.inc:206 +msgid "Output this field as a link" +msgstr "Mata ut detta fält som en länk" + +#: handlers/views_handler_field.inc:207 +msgid "If checked, this field will be made into a link. The destination must be given below." +msgstr "Om ikryssat, detta fält kommer att göras till en länk. Destinationen måste anges nedan." + +#: handlers/views_handler_field.inc:211 +msgid "Link path" +msgstr "Sökväg för länk" + +#: handlers/views_handler_field.inc:214 +msgid "The Drupal path or absolute URL for this link. You may enter data from this view as per the \"Replacement patterns\" below." +msgstr "Drupals sökväg eller fullständig URL för denna länk. Du kan ange data från denna vyn som enligt \"Mönster för ersättning\" nedan." + +#: handlers/views_handler_field.inc:221 +msgid "Alt text" +msgstr "Alternativ text" + +#: handlers/views_handler_field.inc:224 +msgid "Text to place as \"alt\" text which most browsers display as a tooltip when hovering over the link." +msgstr "Text att placeras som \"alternativ\" text, som de flesta webbläsare visar som ett verktygstips när man svävar över länken." + +#: handlers/views_handler_field.inc:231 +msgid "Prefix text" +msgstr "Text för prefix" + +#: handlers/views_handler_field.inc:234 +msgid "Any text to display before this link. You may include HTML." +msgstr "En text att visas före denna länk. Du kan använda HTML." + +#: handlers/views_handler_field.inc:241 +msgid "Suffix text" +msgstr "Text för suffix" + +#: handlers/views_handler_field.inc:244 +msgid "Any text to display after this link. You may include HTML." +msgstr "En text att visas efter denna länk. Du kan använda HTML." + +#: handlers/views_handler_field.inc:254 +#: includes/plugins.inc:173 +#: includes/view.inc:1923 +msgid "Fields" +msgstr "Fält" + +#: handlers/views_handler_field.inc:262 +#: includes/admin.inc:491 +#: includes/view.inc:1930 +msgid "Arguments" +msgstr "Argument" + +#: handlers/views_handler_field.inc:266 +msgid "

    You must add some additional fields to this display before using this field. These fields may be marked as Exclude from display if you prefer. Note that due to rendering order, you cannot use fields that come after this field; if you need a field not listed here, rearrange your fields.

    " +msgstr "

    Du måste lägga till några ytterligare fält till denna visning innan du kan använda fältet. Detta fält kan markeras som Exkludera från visning om du föredrar det. Observera att i på grund av ordningen för renderingen kan du inte använda fält som kommer efter detta fält. Om du behöver ett fält som inte visas här kan du omorganisera fälten.

    " + +#: handlers/views_handler_field.inc:269 +msgid "

    The following substitution patterns are available for this display. Use the pattern shown on the left to display the value indicated on the right. Note that due to rendering order, you cannot use fields that come after this field; if you need a field not listed here, rearrange your fields.

    " +msgstr "

    Följande ersättningsmönster finns tillgängliga för denna visning. Använd mönstret som visas till vänster för att visa värdet som indikeras till höger. Observera att på grund av ordningen för renderingen kan du inte använda fält som kommer efter detta fält. Om du vill använda ett fält som inte visas här kan du omorganisera dina fält.

    " + +#: handlers/views_handler_field.inc:288 +msgid "Replacement patterns" +msgstr "Mönster för ersättning" + +#: handlers/views_handler_field.inc:298 +msgid "Trim this field to a maximum length" +msgstr "Korta ned detta fält till en maximal storlek" + +#: handlers/views_handler_field.inc:299 +msgid "If checked, this field be trimmed to a maximum length in characters." +msgstr "Om ikryssat kommer detta fält att kortas ned till en maximal längd av bokstäver." + +#: handlers/views_handler_field.inc:304 +msgid "Maximum length" +msgstr "Maximal längd" + +#: handlers/views_handler_field.inc:307 +msgid "The maximum number of characters his field can be." +msgstr "Maximalt antal bokstäver som detta fält får vara." + +#: handlers/views_handler_field.inc:316 +msgid "Trim only on a word boundary" +msgstr "Korta endast ned beroende på ordgräns" + +#: handlers/views_handler_field.inc:317 +msgid "If checked, this field be trimmed only on a word boundary. This is guaranteed to be the maximum characters stated or less. If there are no word boundaries this could trim a field to nothing." +msgstr "Om ikryssat kommer detta fält att kortas ned enbart beroende på en ordgräns. Detta är garanterat att vara maximalt antal bokstäver eller färre. Om det inte finns några ordgränser kan detta korta ned fältet till ingentin." + +#: handlers/views_handler_field.inc:327 +msgid "Add an ellipsis" +msgstr "Lägg till en ellips" + +#: handlers/views_handler_field.inc:328 +msgid "If checked, a \"...\" will be added if a field was trimmed." +msgstr "Om ikryssat, kommer \"...\" att läggas till om ett fält kortades ned." + +#: handlers/views_handler_field.inc:338 +msgid "Strip HTML tags" +msgstr "Ta bort HTML-taggar" + +#: handlers/views_handler_field.inc:339 +msgid "If checked, all HTML tags will be stripped." +msgstr "Om ikryssad, kommer alla HTML-taggar att tas bort." + +#: handlers/views_handler_field.inc:349 +msgid "Field can contain HTML" +msgstr "Fält kan innehålla HTML" + +#: handlers/views_handler_field.inc:350 +msgid "If checked, HTML corrector will be run to ensure tags are properly closed after trimming." +msgstr "Om ikryssat kommer korrigeraren för HTML att köras för att säkerställa att alla taggar är stängda på ett riktigt sätt efter att de kortats ned." + +#: handlers/views_handler_field_boolean.inc:25 +msgid "Output format" +msgstr "Utmatningsformat" + +#: handlers/views_handler_field_boolean.inc:27 +msgid "Yes/No" +msgstr "Ja/Nej" + +#: handlers/views_handler_field_boolean.inc:28 +msgid "True/False" +msgstr "Sant/Falskt" + +#: handlers/views_handler_field_boolean.inc:29 +msgid "On/Off" +msgstr "På/Av" + +#: handlers/views_handler_field_boolean.inc:35 +msgid "Reverse" +msgstr "Omvänd" + +#: handlers/views_handler_field_boolean.inc:36 +msgid "If checked, true will be displayed as false." +msgstr "Om ikryssad, kommer sant att visas som falskt." + +#: handlers/views_handler_field_boolean.inc:50 +#: handlers/views_handler_filter_boolean_operator.inc:43 +#: handlers/views_handler_filter_in_operator.inc:25 +#: modules/translation/views_handler_filter_node_tnid.inc:25 +#: plugins/views_plugin_display.inc:633;642;659;667;717;803;1207 +#: plugins/views_plugin_display_attachment.inc:63;69 +msgid "Yes" +msgstr "Ja" + +#: handlers/views_handler_field_boolean.inc:50 +#: handlers/views_handler_filter_boolean_operator.inc:43 +#: handlers/views_handler_filter_in_operator.inc:25 +#: modules/translation/views_handler_filter_node_tnid.inc:26 +#: plugins/views_plugin_display.inc:633;642;659;667;717;803;811;1207 +#: plugins/views_plugin_display_attachment.inc:63;69 +msgid "No" +msgstr "Nej" + +#: handlers/views_handler_field_boolean.inc:52 +#: handlers/views_handler_filter_boolean_operator.inc:20;52 +msgid "True" +msgstr "Sant" + +#: handlers/views_handler_field_boolean.inc:52 +#: handlers/views_handler_filter_boolean_operator.inc:52 +msgid "False" +msgstr "Falskt" + +#: handlers/views_handler_field_boolean.inc:54 +#: handlers/views_handler_filter_boolean_operator.inc:46 +msgid "On" +msgstr "På" + +#: handlers/views_handler_field_boolean.inc:54 +#: handlers/views_handler_filter_boolean_operator.inc:46 +msgid "Off" +msgstr "Av" + +#: handlers/views_handler_field_date.inc:24 +msgid "Date format" +msgstr "Format på datum" + +#: handlers/views_handler_field_date.inc:29 +msgid "Custom" +msgstr "Anpassat" + +#: handlers/views_handler_field_date.inc:30 +msgid "Time ago" +msgstr "Tid sedan" + +#: handlers/views_handler_field_date.inc:31 +msgid "Time ago (with \"ago\" appended)" +msgstr "Tid sedan (med \"sedan\" bifogat)" + +#: handlers/views_handler_field_date.inc:37 +msgid "Custom date format" +msgstr "Anpassat datumformat" + +#: handlers/views_handler_field_date.inc:38 +msgid "If \"Custom\", see the PHP docs for date formats. If \"Time ago\" this is the the number of different units to display, which defaults to two." +msgstr "Om \"Anpassad\", se dokumentationen om PHP för datumformat. Om \"Tid sedan\" blir detta antalet olika enheter att visa, där två är standard." + +#: handlers/views_handler_field_date.inc:56 +msgid "%time ago" +msgstr "%time sedan" + +#: handlers/views_handler_field_numeric.inc:32 +msgid "Round" +msgstr "Avrundning" + +#: handlers/views_handler_field_numeric.inc:33 +msgid "If checked, the number will be rounded." +msgstr "Om ikryssad, kommer talet att avrundas." + +#: handlers/views_handler_field_numeric.inc:38 +msgid "Precision" +msgstr "Precision" + +#: handlers/views_handler_field_numeric.inc:40 +msgid "Specify how many digits to print after the decimal point." +msgstr "Specificera hur många siffror att skriva ut efter decimalkommat." + +#: handlers/views_handler_field_numeric.inc:47 +msgid "Decimal point" +msgstr "Decimalkomma" + +#: handlers/views_handler_field_numeric.inc:49 +msgid "What single character to use as a decimal point." +msgstr "Vilket enskilt tecken att använda som decimalkomma." + +#: handlers/views_handler_field_numeric.inc:55 +msgid "Thousands separator" +msgstr "Avskiljare för tusental" + +#: handlers/views_handler_field_numeric.inc:57 +msgid "What single character to use as the thousands separator." +msgstr "Vilket enskilt tecken att använda som avskiljare för tusental." + +#: handlers/views_handler_field_numeric.inc:62 +msgid "Prefix" +msgstr "Prefix" + +#: handlers/views_handler_field_numeric.inc:64 +msgid "Text to put before the number, such as currency symbol." +msgstr "Text att sätta framför numret, såsom en valutasymbol." + +#: handlers/views_handler_field_numeric.inc:68 +msgid "Suffix" +msgstr "Suffix" + +#: handlers/views_handler_field_numeric.inc:70 +msgid "Text to put after the number, such as currency symbol." +msgstr "Text att sätta efter numret, såsom en valutasymbol." + +#: handlers/views_handler_field_prerender_list.inc:29 +#: modules/aggregator/views_plugin_row_aggregator_rss.inc:23 +#: modules/node/views_plugin_row_node_rss.inc:30 +msgid "Display type" +msgstr "Typ av visning" + +#: handlers/views_handler_field_prerender_list.inc:31 +#: plugins/views_plugin_style_list.inc:33 +msgid "Unordered list" +msgstr "Oordnad lista" + +#: handlers/views_handler_field_prerender_list.inc:32 +#: plugins/views_plugin_style_list.inc:33 +msgid "Ordered list" +msgstr "Ordnad lista" + +#: handlers/views_handler_field_prerender_list.inc:33 +msgid "Simple separator" +msgstr "Enkel avskiljare" + +#: handlers/views_handler_field_prerender_list.inc:40 +#: includes/admin.inc:3010 +#: plugins/views_plugin_row_fields.inc:47 +#: plugins/views_plugin_style_summary_unformatted.inc:30 +msgid "Separator" +msgstr "Avskiljare" + +#: handlers/views_handler_field_prerender_list.inc:48 +msgid "Empty list text" +msgstr "Text vid tom lista" + +#: handlers/views_handler_field_prerender_list.inc:50 +msgid "If the list is empty, you may enter text here that will be displayed." +msgstr "Här kan du skriva in text som visas om listan är tom." + +#: handlers/views_handler_field_url.inc:24 +#: modules/aggregator/views_handler_field_aggregator_title_link.inc:28 +#: modules/statistics/views_handler_field_accesslog_path.inc:31 +msgid "Display as link" +msgstr "Visa som länk" + +#: handlers/views_handler_filter.inc:136 +msgid "Operator" +msgstr "Operator" + +#: handlers/views_handler_filter.inc:201 +msgid "Expose" +msgstr "Exponera" + +#: handlers/views_handler_filter.inc:206 +msgid "This item is currently not exposed. If you expose it, users will be able to change the filter as they view it." +msgstr "Detta alternativ är inte exponerat. Om du exponerar det kommer användarna kunna ändra på filtret när visar det." + +#: handlers/views_handler_filter.inc:213 +msgid "Hide" +msgstr "Göm" + +#: handlers/views_handler_filter.inc:218 +msgid "This item is currently exposed. If you hide it, users will not be able to change the filter as they view it." +msgstr "Detta alternativ är exponerat. Om du gömmer det kommer användarna inte kunna ändra på filtret när de visar det." + +#: handlers/views_handler_filter.inc:289 +msgid "Unlock operator" +msgstr "Lås upp operatorn" + +#: handlers/views_handler_filter.inc:290 +msgid "When checked, the operator will be exposed to the user" +msgstr "Om ikryssad kommer operatorn exponeras för användaren" + +#: handlers/views_handler_filter.inc:296 +msgid "Operator identifier" +msgstr "Identifierare för operator" + +#: handlers/views_handler_filter.inc:298 +msgid "This will appear in the URL after the ? to identify this operator." +msgstr "Detta kommer synas i URL:en efter tecknet \"?\" för att identifiera denna operator." + +#: handlers/views_handler_filter.inc:315 +msgid "Filter identifier" +msgstr "Identifierare för filter" + +#: handlers/views_handler_filter.inc:317 +msgid "This will appear in the URL after the ? to identify this filter. Cannot be blank." +msgstr "Detta kommer synas i URL:en efter tecknet \"?\" för att identifiera detta filter. Får inte vara tom." + +#: handlers/views_handler_filter.inc:333 +msgid "Optional" +msgstr "Valfritt" + +#: handlers/views_handler_filter.inc:334 +msgid "This exposed filter is optional and will have added options to allow it not to be set." +msgstr "Detta exponerade filter är ej obligatoriskt, och kommer ha tillagda alternativ som tillåter att det inte behöver anges." + +#: handlers/views_handler_filter.inc:340 +msgid "Force single" +msgstr "Tvinga enkelval" + +#: handlers/views_handler_filter.inc:341 +msgid "Force this exposed filter to accept only one option." +msgstr "Tvinga detta exponerade filter att endast acceptera ett alternativ." + +#: handlers/views_handler_filter.inc:347 +msgid "Remember" +msgstr "Kom ihåg" + +#: handlers/views_handler_filter.inc:348 +msgid "Remember the last setting the user gave this filter." +msgstr "Kom ihåg den senaste inställningen användaren gjorde för detta filter." + +#: handlers/views_handler_filter.inc:359 +msgid "The identifier is required if the filter is exposed." +msgstr "Identifieraren krävs om filtret är exponerat." + +#: handlers/views_handler_filter.inc:364 +msgid "This identifier is not allowed." +msgstr "Denna identifierare är inte tillåten." + +#: handlers/views_handler_filter.inc:465 +#: includes/admin.inc:2744 +msgid "" +msgstr "" + +#: handlers/views_handler_filter.inc:465 +#: includes/admin.inc:2744 +msgid "- Any -" +msgstr "- Valfri -" + +#: handlers/views_handler_filter_boolean_operator.inc:97 +#: handlers/views_handler_filter_in_operator.inc:175 +#: handlers/views_handler_filter_numeric.inc:247 +#: handlers/views_handler_filter_string.inc:111 +msgid "exposed" +msgstr "exponerad" + +#: handlers/views_handler_filter_date.inc:24 +msgid "Value type" +msgstr "Typ av värde" + +#: handlers/views_handler_filter_date.inc:26 +msgid "A date in any machine readable format. CCYY-MM-DD HH:MM:SS is preferred." +msgstr "Ett datum i ett maskinläsbart format. CCYY-MM-DD HH:MM:SS är att föredra." + +#: handlers/views_handler_filter_date.inc:27 +msgid "An offset from the current time such as \"+1 day\" or \"-2 hours and 30 minutes\"" +msgstr "En kompensation av aktuell tid såsom \"+1 dag\" eller \"-2 timmar och 30 minuter\"" + +#: handlers/views_handler_filter_date.inc:77;83;87 +msgid "Invalid date format." +msgstr "Ej godkänt datumformat." + +#: handlers/views_handler_filter_equality.inc:15 +#: handlers/views_handler_filter_numeric.inc:38 +#: handlers/views_handler_filter_string.inc:28 +msgid "Is equal to" +msgstr "Är lika med" + +#: handlers/views_handler_filter_equality.inc:16 +#: handlers/views_handler_filter_numeric.inc:44 +#: handlers/views_handler_filter_string.inc:34 +msgid "Is not equal to" +msgstr "Är inte lika med" + +#: handlers/views_handler_filter_equality.inc:26 +#: handlers/views_handler_filter_numeric.inc:148;163 +#: handlers/views_handler_filter_string.inc:170 +msgid "Value" +msgstr "Värde" + +#: handlers/views_handler_filter_in_operator.inc:15 +msgid "Options" +msgstr "Alternativ" + +#: handlers/views_handler_filter_in_operator.inc:37 +msgid "Limit list to selected items" +msgstr "Begränsa listan till valda alternativ" + +#: handlers/views_handler_filter_in_operator.inc:38 +msgid "If checked, the only items presented to the user will be the ones selected here." +msgstr "Om ikryssat, kommer endast de valda alternativen att visas för användaren." + +#: handlers/views_handler_filter_in_operator.inc:57 +#: handlers/views_handler_filter_many_to_one.inc:32 +msgid "Is one of" +msgstr "Är en av" + +#: handlers/views_handler_filter_in_operator.inc:58 +msgid "Is not one of" +msgstr "Är inte en av" + +#: handlers/views_handler_filter_in_operator.inc:193 +#: modules/system.views.inc:209 +#: plugins/views_plugin_access.inc:55 +msgid "Unknown" +msgstr "Okänd" + +#: handlers/views_handler_filter_many_to_one.inc:33 +msgid "Is all of" +msgstr "Är alla av" + +#: handlers/views_handler_filter_many_to_one.inc:34 +msgid "Is none of" +msgstr "Är ingen av" + +#: handlers/views_handler_filter_numeric.inc:26 +msgid "Is less than" +msgstr "Är mindre än" + +#: handlers/views_handler_filter_numeric.inc:28 +msgid "<" +msgstr "<" + +#: handlers/views_handler_filter_numeric.inc:32 +msgid "Is less than or equal to" +msgstr "Är mindre än eller lika med" + +#: handlers/views_handler_filter_numeric.inc:34 +msgid "<=" +msgstr "<=" + +#: handlers/views_handler_filter_numeric.inc:40 +#: handlers/views_handler_filter_string.inc:29 +msgid "=" +msgstr "=" + +#: handlers/views_handler_filter_numeric.inc:46 +#: handlers/views_handler_filter_string.inc:35 +msgid "!=" +msgstr "!=" + +#: handlers/views_handler_filter_numeric.inc:50 +msgid "Is greater than or equal to" +msgstr "Är större än eller lika med" + +#: handlers/views_handler_filter_numeric.inc:52 +msgid ">=" +msgstr ">=" + +#: handlers/views_handler_filter_numeric.inc:56 +msgid "Is greater than" +msgstr "Är större än" + +#: handlers/views_handler_filter_numeric.inc:58 +msgid ">" +msgstr ">" + +#: handlers/views_handler_filter_numeric.inc:62 +msgid "Is between" +msgstr "Är mellan" + +#: handlers/views_handler_filter_numeric.inc:64 +msgid "between" +msgstr "mellan" + +#: handlers/views_handler_filter_numeric.inc:68 +msgid "Is not between" +msgstr "Är inte mellan" + +#: handlers/views_handler_filter_numeric.inc:70 +msgid "not between" +msgstr "inte mellan" + +#: handlers/views_handler_filter_numeric.inc:79 +#: handlers/views_handler_filter_string.inc:80 +msgid "Is empty (NULL)" +msgstr "Är tom (NULL)" + +#: handlers/views_handler_filter_numeric.inc:81 +#: handlers/views_handler_filter_string.inc:82 +msgid "empty" +msgstr "tom" + +#: handlers/views_handler_filter_numeric.inc:85 +#: handlers/views_handler_filter_string.inc:86 +msgid "Is not empty (NULL)" +msgstr "Är inte tom (NULL)" + +#: handlers/views_handler_filter_numeric.inc:87 +#: handlers/views_handler_filter_string.inc:88 +msgid "not empty" +msgstr "inte tom" + +#: handlers/views_handler_filter_numeric.inc:175 +msgid "Min" +msgstr "Min" + +#: handlers/views_handler_filter_numeric.inc:181 +msgid "And max" +msgstr "Och max" + +#: handlers/views_handler_filter_numeric.inc:181 +msgid "And" +msgstr "Och" + +#: handlers/views_handler_filter_numeric.inc:253 +msgid "@min and @max" +msgstr "@min och @max" + +#: handlers/views_handler_filter_string.inc:40 +msgid "Contains" +msgstr "Innehåller" + +#: handlers/views_handler_filter_string.inc:41 +msgid "contains" +msgstr "innehåller" + +#: handlers/views_handler_filter_string.inc:46 +msgid "Contains any word" +msgstr "Innehåller vilket ord som helst" + +#: handlers/views_handler_filter_string.inc:47 +msgid "has word" +msgstr "har ord" + +#: handlers/views_handler_filter_string.inc:52 +msgid "Contains all words" +msgstr "Innehåller alla ord" + +#: handlers/views_handler_filter_string.inc:53 +msgid "has all" +msgstr "har alla" + +#: handlers/views_handler_filter_string.inc:58 +msgid "Starts with" +msgstr "Börjar med" + +#: handlers/views_handler_filter_string.inc:59 +msgid "begins" +msgstr "börjar" + +#: handlers/views_handler_filter_string.inc:64 +msgid "Ends with" +msgstr "Slutar med" + +#: handlers/views_handler_filter_string.inc:65 +msgid "ends" +msgstr "slutar" + +#: handlers/views_handler_filter_string.inc:70 +msgid "Does not contain" +msgstr "Innehåller inte" + +#: handlers/views_handler_filter_string.inc:71 +msgid "!has" +msgstr "!has" + +#: handlers/views_handler_filter_string.inc:126 +msgid "Case sensitive" +msgstr "Skiftlägeskänslig" + +#: handlers/views_handler_filter_string.inc:128 +msgid "Case sensitive filters may be faster. MySQL might ignore case sensitivity." +msgstr "Skiftlägeskänsliga filter kan vara snabbare. MySQL kan ignorera skiftlägeskänslighet." + +#: handlers/views_handler_relationship.inc:80 +msgid "The label for this relationship that will be displayed only administratively." +msgstr "Etiketten för detta släktskap som endast visas i administrationsläge." + +#: handlers/views_handler_relationship.inc:85 +msgid "Require this relationship" +msgstr "Kräv detta släktskap" + +#: handlers/views_handler_relationship.inc:86 +msgid "If required, items that do not contain this relationship will not appear." +msgstr "Alternativ som inte innehåller detta släktskap kommer inte att visas om detta krävs." + +#: handlers/views_handler_sort.inc:38 +msgid "asc" +msgstr "stigande" + +#: handlers/views_handler_sort.inc:42 +msgid "desc" +msgstr "fallande" + +#: handlers/views_handler_sort.inc:54 +msgid "Sort order" +msgstr "Sorteringsordning" + +#: handlers/views_handler_sort.inc:55 +#: modules/search/views_handler_field_search_score.inc:37 +#: plugins/views_plugin_style_table.inc:149 +msgid "Ascending" +msgstr "Stigande" + +#: handlers/views_handler_sort.inc:55 +#: modules/search/views_handler_field_search_score.inc:37 +#: plugins/views_plugin_style_table.inc:149 +msgid "Descending" +msgstr "Fallande" + +#: handlers/views_handler_sort_date.inc:26 +msgid "Granularity" +msgstr "Finkornighet" + +#: handlers/views_handler_sort_date.inc:28 +msgid "Second" +msgstr "Sekund" + +#: handlers/views_handler_sort_date.inc:29 +msgid "Minute" +msgstr "Minut" + +#: handlers/views_handler_sort_date.inc:30 +msgid "Hour" +msgstr "Timma" + +#: handlers/views_handler_sort_date.inc:31 +msgid "Day" +msgstr "Dag" + +#: handlers/views_handler_sort_date.inc:32 +msgid "Month" +msgstr "Månad" + +#: handlers/views_handler_sort_date.inc:33 +msgid "Year" +msgstr "År" + +#: handlers/views_handler_sort_date.inc:35 +msgid "The granularity is the smallest unit to use when determining whether two dates are the same; for example, if the granularity is \"Year\" then all dates in 1999, regardless of when they fall in 1999, will be considered the same date." +msgstr "Finkornigheten är den minsta enheten att använda när man ska avgöra om två datum är samma. Exempelvis om finkornigheten är \"År\" kommer alla datum för 1999, oavsett när de uppträder under 1999, att anses vara samma datum. " + +#: handlers/views_handler_sort_formula.inc:24 +msgid "views_handler_sort_formula missing default: @formula" +msgstr "views_handler_sort_formula saknar förvalt: @formula" + +#: includes/admin.inc:36 +msgid "If you enable the advanced help module, Views will provide more and better help. Hide this message." +msgstr "Om du aktiverar den avancerade hjälpmodulen, kan Views erbjuda mer och bättre hjälp. Dölj detta meddelande." + +#: includes/admin.inc:39 +msgid "If you install the advanced help module from !href, Views will provide more and better help. Hide this message." +msgstr "Om du installerar modulen Advanced Help från !href, kan Views erbjuda mer och bättre hjälp. Dölj detta meddelande." + +#: includes/admin.inc:55;318 +msgid "Reset" +msgstr "Återställ" + +#: includes/admin.inc:110;1006 +#: theme/theme.inc:98 +#: views_export/views_export.module:129 +msgid "Export" +msgstr "Exportera" + +#: includes/admin.inc:111;1011 +#: theme/theme.inc:103 +msgid "Clone" +msgstr "Klona" + +#: includes/admin.inc:114;649 +msgid "Revert" +msgstr "Återställ" + +#: includes/admin.inc:114;654;875 +#: includes/convert.inc:35;108 +msgid "Delete" +msgstr "Ta bort" + +#: includes/admin.inc:119 +msgid "Disable" +msgstr "Avaktivera" + +#: includes/admin.inc:122 +msgid "Enable" +msgstr "Aktivera" + +#: includes/admin.inc:128 +msgid "Warning! Broken view!" +msgstr "Varning! Trasig vy!" + +#: includes/admin.inc:143 +#: includes/view.inc:1726 +msgid "Broken" +msgstr "Trasig" + +#: includes/admin.inc:205 +msgid "Install the advanced help module for the getting started" +msgstr "Installera modulen Advanced Help för starthjälp" + +#: includes/admin.inc:208 +msgid "Not sure what to do? Try the \"!getting-started\" page." +msgstr "Osäker på vad du ska göra? Testa sidan \"!getting-started\"." + +#: includes/admin.inc:222;229;2159 +msgid "" +msgstr "" + +#: includes/admin.inc:223 +#: plugins/views_plugin_style.inc:76 +msgid "" +msgstr "" + +#: includes/admin.inc:227 +msgid "Storage" +msgstr "Lager" + +#: includes/admin.inc:230;230 +#: includes/view.inc:1220;1270 +msgid "Normal" +msgstr "Normal" + +#: includes/admin.inc:244;291 +#: modules/node.views.inc:140 +#: plugins/views_plugin_display_page.inc:279 +msgid "Type" +msgstr "Typ" + +#: includes/admin.inc:262;289;1091 +#: views_export/views_export.module:147 +msgid "Tag" +msgstr "Märke" + +#: includes/admin.inc:278 +msgid "Displays" +msgstr "Visningar" + +#: includes/admin.inc:285 +msgid "Sort by" +msgstr "Sortera efter" + +#: includes/admin.inc:287 +#: modules/system.views.inc:69 +#: modules/user.views.inc:59;80 +#: plugins/views_plugin_display.inc:580 +msgid "Name" +msgstr "Namn" + +#: includes/admin.inc:290;415 +#: modules/statistics.views.inc:149 +#: modules/system.views.inc:88 +#: plugins/views_plugin_display_page.inc:208 +msgid "Path" +msgstr "Sökväg" + +#: includes/admin.inc:292 +#: includes/convert.inc:21 +#: modules/aggregator.views.inc:230 +#: modules/upload.views.inc:56 +#: plugins/views_plugin_display_page.inc:299;383 +#: views_export/views_export.module:147 +msgid "Description" +msgstr "Beskrivning" + +#: includes/admin.inc:299 +msgid "Order" +msgstr "Ordning" + +#: includes/admin.inc:301 +msgid "Up" +msgstr "Upp" + +#: includes/admin.inc:302 +msgid "Down" +msgstr "Ned" + +#: includes/admin.inc:394;425 +msgid "Query" +msgstr "Databasfråga" + +#: includes/admin.inc:396 +msgid "These queries were run during view rendering:" +msgstr "Dessa frågor kördes under vyns rendering:" + +#: includes/admin.inc:401 +msgid "[@time ms]" +msgstr "[@time ms]" + +#: includes/admin.inc:404 +msgid "Other queries" +msgstr "Andra frågor" + +#: includes/admin.inc:412 +msgid "This display has no path." +msgstr "Denna visning har ingen sökväg." + +#: includes/admin.inc:417 +msgid "Query build time" +msgstr "Tid för att bygga databasfrågan" + +#: includes/admin.inc:417;418;419 +msgid "@time ms" +msgstr "@time ms" + +#: includes/admin.inc:418 +msgid "Query execute time" +msgstr "Tid för att köra databasfrågan" + +#: includes/admin.inc:419 +msgid "View render time" +msgstr "Tolkningstid för vyn" + +#: includes/admin.inc:425 +msgid "No query was run" +msgstr "Ingen databasfråga kördes" + +#: includes/admin.inc:432 +msgid "Unable to preview due to validation errors." +msgstr "Kan inte förhandsvisa på grund av valideringsfel." + +#: includes/admin.inc:483 +msgid "Display" +msgstr "Visa" + +#: includes/admin.inc:493 +msgid "Separate arguments with a / as though they were a URL path." +msgstr "Separera argument med en / som om de vore sökvägar." + +#: includes/admin.inc:499 +msgid "Preview" +msgstr "Förhandsvisa" + +#: includes/admin.inc:537 +msgid "Clone view %view" +msgstr "Klona vyn %view" + +#: includes/admin.inc:550;741 +#: includes/convert.inc:20 +msgid "View name" +msgstr "Namn på vyn" + +#: includes/admin.inc:551 +msgid "This is the unique name of the view. It must contain only alphanumeric characters and underscores; it is used to identify the view internally and to generate unique theming template names for this view. If overriding a module provided view, the name must not be changed or instead a new view will be created." +msgstr "Detta är det unika namnet på vyn. Det måste bestå av alfanumeriska tecken och understreck. Det används för att indentifiera vyn internt och för att generera unika namn på temamallar för den här vyn. Om du åsidosätter en av modulen tillhandahållen vy så får du inte ändra namnet annars kommer en ny vy att skapas." + +#: includes/admin.inc:560;1854 +msgid "View description" +msgstr "Beskrivning av vyn" + +#: includes/admin.inc:561;1855 +msgid "This description will appear on the Views administrative UI to tell you what the view is about." +msgstr "Den här beskrivningen kommer att visas på vyns administrativa UI för att beskriva vad vyn handlar om." + +#: includes/admin.inc:567;1861 +msgid "View tag" +msgstr "Märke för vyn" + +#: includes/admin.inc:568;1862 +msgid "Enter an optional tag for this view; it is used only to help sort views on the administrative page." +msgstr "Skriv in ett valfritt märke för den här vyn. Den används endast som hjälp vid sortering av vyer på administrationssidan." + +#: includes/admin.inc:580 +msgid "View type" +msgstr "Typ av vy" + +#: includes/admin.inc:581 +msgid "The view type is the primary table for which information is being retrieved. The view type controls what arguments, fields, sort criteria and filters are available, so once this is set it cannot be changed." +msgstr "Typen av vy är den primära tabellen för vilken information hämtas. Den kontrollerar vilka argument, fält, sorteringskriterier och filter som finns tillgängliga. Så när du ställt in detta kan den inte ändras." + +#: includes/admin.inc:592 +msgid "Next" +msgstr "Nästa" + +#: includes/admin.inc:608;786 +msgid "View name must be alphanumeric or underscores only." +msgstr "Namnet på vyn får enbart bestå av vara alfanumeriskt tecken eller understreck." + +#: includes/admin.inc:614 +msgid "You must use a unique name for this view." +msgstr "Du måste använda ett unikt namn för denna vy." + +#: includes/admin.inc:647 +msgid "Are you sure you want to revert the view %name?" +msgstr "Är du säker på att du vill återställa vyn %name?" + +#: includes/admin.inc:648 +msgid "Reverting the view will delete the view that is in the database, reverting it to the original default view. Any changes you have made will be lost and cannot be recovered." +msgstr "Att återställa vyn kommer att ta bort vyn som finns i databasen, och återgå den till den ursprungliga standardvyn. Alla ändringar du har gjort kommer att försvinna och kan inte återskapas." + +#: includes/admin.inc:652 +#: includes/convert.inc:105 +msgid "Are you sure you want to delete the view %name?" +msgstr "Är du säker på att du vill radera vyn %name?" + +#: includes/admin.inc:653 +msgid "Deleting a view cannot be undone." +msgstr "Raderingen av en vy kan inte ångras." + +#: includes/admin.inc:662;698;868;1357 +#: includes/convert.inc:109 +msgid "Cancel" +msgstr "Avbryt" + +#: includes/admin.inc:671 +msgid "The view has been deleted." +msgstr "Vyn har raderats" + +#: includes/admin.inc:683 +msgid "There is no lock on view %view to break." +msgstr "Det finns inget lås på vyn %view att öppna." + +#: includes/admin.inc:693 +msgid "Are you sure you want to break the lock on view %name?" +msgstr "Är du säker på att du vill öppna låset på vyn %name?" + +#: includes/admin.inc:696 +msgid "By breaking this lock, any unsaved changes made by !user will be lost!" +msgstr "Genom att öppna låset, kommer alla osparade ändringar gjord av !user att förloras!" + +#: includes/admin.inc:697 +msgid "Break lock" +msgstr "Öppna lås" + +#: includes/admin.inc:707 +msgid "The lock has been broken and you may now edit this view." +msgstr "Låsningen har öppnats och du kan nu redigera den här vyn." + +#: includes/admin.inc:714 +msgid "Edit view %view" +msgstr "Redigera vyn %view" + +#: includes/admin.inc:742 +msgid "Enter the name to use for this view if it is different from the source view. Leave blank to use the name of the view." +msgstr "Ange namnet som skall användas för denna vy om det är annorlunda mot källvyn. Lämna blankt för att använda namnet på vyn." + +#: includes/admin.inc:747 +msgid "Paste view code here" +msgstr "Klistra in vykod här" + +#: includes/admin.inc:769 +msgid "Unable to interpret view code." +msgstr "Kunde inte tolka vykoden." + +#: includes/admin.inc:777 +msgid "You are importing a view created in Views version 1. You may need to adjust some parameters to work correctly in version 2." +msgstr "Du importerar en vy som skapade i version 1 av Views. Du kan behöva justera några parametrar för att de ska fungera korrekt i version 2." + +#: includes/admin.inc:780 +msgid "That view is not compatible with this version of Views." +msgstr "Denna vy är inte kompatibel med denna version av Views." + +#: includes/admin.inc:795 +msgid "A view by that name already exists; please choose a different name" +msgstr "En vy med det namn finns redan. Välj ett annat namn." + +#: includes/admin.inc:804 +msgid "Display plugin @plugin is not available." +msgstr "Visningsplugin @plugin är inte tillgängligt." + +#: includes/admin.inc:811 +msgid "Style plugin @plugin is not available." +msgstr "Stilplugin @plugin är inte tillgängligt." + +#: includes/admin.inc:817 +msgid "Row plugin @plugin is not available." +msgstr "Radplugin @plugin är inte tillgängligt." + +#: includes/admin.inc:827 +msgid "@type handler @table.@field is not available." +msgstr "@type hanterare @table.@field är inte tillgänglig." + +#: includes/admin.inc:840 +msgid "Unable to import view." +msgstr "Kunde inte importera vy." + +#: includes/admin.inc:861;889 +msgid "Save" +msgstr "Spara" + +#: includes/admin.inc:913 +msgid "The view has been saved." +msgstr "Vyn har sparats." + +#: includes/admin.inc:957 +msgid "Unknown or missing table name" +msgstr "Okänt eller saknat tabellnamn" + +#: includes/admin.inc:962 +msgid "Click on an item to edit that item's details." +msgstr "Klicka på ett alternativ för att redigera dess detaljer." + +#: includes/admin.inc:965 +msgid "This view has a broken default display and cannot be used." +msgstr "Denna vy har en trasig standardvisning och kan inte användas." + +#: includes/admin.inc:1007 +#: theme/theme.inc:99 +msgid "Export this view" +msgstr "Exportera denna vy" + +#: includes/admin.inc:1012 +#: theme/theme.inc:104 +msgid "Create a copy of this view" +msgstr "Skapa en kopia av denna vy" + +#: includes/admin.inc:1023 +msgid "View \"@display\"" +msgstr "Visa \"@display\"" + +#: includes/admin.inc:1024 +msgid "Go to the real page for this display" +msgstr "Gå till den riktiga sidan för denna visning" + +#: includes/admin.inc:1090;3044 +#: includes/plugins.inc:218 +#: plugins/views_plugin_display.inc:587;704;723 +#: plugins/views_plugin_display_attachment.inc:90 +#: plugins/views_plugin_display_block.inc:73 +#: plugins/views_plugin_display_feed.inc:108 +#: plugins/views_plugin_display_page.inc:199 +msgid "None" +msgstr "Ingen" + +#: includes/admin.inc:1168 +msgid "Invalid" +msgstr "Ogiltig" + +#: includes/admin.inc:1169 +msgid "Error: Display @display refers to a plugin named '@plugin', but that plugin doesn't exist!" +msgstr "Fel: Visningen @display refererar till ett plugin som heter \"@plugin\", men det pluginet existerar inte!" + +#: includes/admin.inc:1204;1204 +msgid "Rearrange" +msgstr "Ordna om" + +#: includes/admin.inc:1244;2244;2420;2488;2573 +msgid "Error: handler for @table > @field doesn't exist!" +msgstr "Fel: hanteraren för @table > @field existerar inte!" + +#: includes/admin.inc:1263;1263;1272 +msgid "Settings" +msgstr "Inställningar" + +#: includes/admin.inc:1268 +#: plugins/views_plugin_display.inc:598;616 +msgid "Missing style plugin" +msgstr "Stilplugin saknas" + +#: includes/admin.inc:1272 +#: plugins/views_plugin_display.inc:611;626 +msgid "Change settings for this style" +msgstr "Ändra inställningar för denna stil" + +#: includes/admin.inc:1275 +msgid "  Style: !style" +msgstr "  Style: !style" + +#: includes/admin.inc:1306 +msgid "Invalid display id found while regenerating tabs" +msgstr "Ogiltigt ID för visning hittades när flikar regenerades" + +#: includes/admin.inc:1339 +msgid "Update" +msgstr "Uppdatera" + +#: includes/admin.inc:1357 +msgid "Ok" +msgstr "Ok" + +#: includes/admin.inc:1628 +msgid "Unable to initialize default display" +msgstr "Kunde inte initialisera den förvalda visningen" + +#: includes/admin.inc:1660 +msgid "Add display" +msgstr "Lägg till visning" + +#: includes/admin.inc:1700 +msgid "Remove display" +msgstr "Ta bort visning" + +#: includes/admin.inc:1711 +msgid "Restore display" +msgstr "Återställ visning" + +#: includes/admin.inc:1783 +msgid "Analyze" +msgstr "Analysera" + +#: includes/admin.inc:1795 +msgid "View analysis" +msgstr "Visa analyser" + +#: includes/admin.inc:1849 +msgid "View details" +msgstr "Visa detaljer" + +#: includes/admin.inc:1890;1944;1999;2145;2237;2413;2481;2566 +msgid "Invalid display id @display" +msgstr "Ogiltig ID för visningen @display" + +#: includes/admin.inc:1948 +msgid "Configure @type" +msgstr "Konfigurera @type" + +#: includes/admin.inc:2003 +msgid "Rearrange @type" +msgstr "Arrangera om @type" + +#: includes/admin.inc:2046 +msgid "Broken field @id" +msgstr "Trasigt fält @id" + +#: includes/admin.inc:2086;2095;2329 +msgid "Remove" +msgstr "Ta bort" + +#: includes/admin.inc:2086;2086 +msgid "Remove this item" +msgstr "Ta bort detta alternativ" + +#: includes/admin.inc:2092 +msgid "No fields available." +msgstr "Inga fält tillgängliga." + +#: includes/admin.inc:2095 +#: modules/book.views.inc:57 +#: modules/taxonomy.views.inc:139 +#: modules/upload.views.inc:91 +#: plugins/views_plugin_display_page.inc:339 +msgid "Weight" +msgstr "Vikt" + +#: includes/admin.inc:2151 +msgid "Add @type" +msgstr "Lägg till @type" + +#: includes/admin.inc:2162 +msgid "Groups" +msgstr "Grupper" + +#: includes/admin.inc:2181 +msgid "!group: !field" +msgstr "!group: !field" + +#: includes/admin.inc:2190 +msgid "There are no @types available to add." +msgstr "Det finns inga @types tillgängliga att lägga till." + +#: includes/admin.inc:2287 +#: plugins/views_plugin_row.inc:65 +msgid "Do not use a relationship" +msgstr "Använd inte en relation" + +#: includes/admin.inc:2302 +#: includes/view.inc:1954;1955 +#: plugins/views_plugin_row.inc:74 +msgid "Relationship" +msgstr "Relationer" + +#: includes/admin.inc:2315 +msgid "Configure @type %item" +msgstr "Konfigurera @type %item" + +#: includes/admin.inc:2428 +msgid "Configure extra settings for @type %item" +msgstr "Konfigurera extra inställningar för @type %item" + +#: includes/admin.inc:2493 +msgid "Change summary style for @type %item" +msgstr "Ändra stil för summering av @type %item" + +#: includes/admin.inc:2516;2530 +msgid "Internal error: broken plugin." +msgstr "Internt fel: trasig plugin." + +#: includes/admin.inc:2580 +msgid "Configure summary style for @type %item" +msgstr "Konfigurera stil för summering av @type %item" + +#: includes/admin.inc:2672 +msgid "Clear Views' cache" +msgstr "Töm Views cache" + +#: includes/admin.inc:2678 +msgid "Add Views signature to all SQL queries" +msgstr "Lägg till Views signatur till alla SQL-frågor" + +#: includes/admin.inc:2679 +msgid "All Views-generated queries will include a special 'VIEWS' = 'VIEWS' string in the WHERE clause. This makes identifying Views queries in database server logs simpler, but should only be used when troubleshooting." +msgstr "Alla Viewsgenererade frågor kommer inkludera en speciell 'VIEWS' = 'VIEWS'-sträng i WHERE-satsen. Detta gör det lättare att identifiera Views frågor i databasens loggar, men bör endast användas vid felsökning." + +#: includes/admin.inc:2685 +msgid "Disable views data caching" +msgstr "Inaktivera views cachning av data" + +#: includes/admin.inc:2686 +msgid "Views caches data about tables, modules and views available, to increase performance. By checking this box, Views will skip this cache and always rebuild this data when needed. This can have a serious performance impact on your site." +msgstr "Views cachar data om tillgängliga tabeller, moduler och vyer, för att öka prestanda. Genom att kryssa i denna ruta kommer Views hoppa över denna cache och alltid bygga om sin data vid behov. Detta kan allvarligt påverka din webbplats prestanda." + +#: includes/admin.inc:2692 +msgid "Ignore missing advanced help module" +msgstr "Ignorera avsaknad av modulen Advanced Help" + +#: includes/admin.inc:2693 +msgid "Views uses the advanced help module to provide help text; if this module is not present Views will complain, unless this setting is checked." +msgstr "Views använder modulen Advanced Help för att erhålla hjälptext. Om denna modul inte finns närvarande kommer Views att klaga, såvida inte denna inställning är ikryssad." + +#: includes/admin.inc:2699 +msgid "Show query above live preview" +msgstr "Visa databasfråga ovanför den direkta förhandsgranskningen" + +#: includes/admin.inc:2700 +msgid "The live preview feature will show you the output of the view you're creating, as well as the view. Check here to show the query and other information above the view; leave this unchecked to show that information below the view." +msgstr "Funktionen för den direkta förhandsgranskningen kommer att visa dig utmatningen för vyn som du skapar, och även vyn. Klicka här för att visa databasfrågan och annan information ovanför vyn. Lämna detta ej ikryssat för att visa den informationen nedanför vyn." + +#: includes/admin.inc:2706 +msgid "Show other queries run during render during live preview" +msgstr "Visa andra databasfrågor som körs under renderingen vid direkta förhandstitten" + +#: includes/admin.inc:2707 +msgid "Drupal has the potential to run many queries while a view is being rendered. Checking this box will display every query run during view render as part of the live preview." +msgstr "Drupal har potentialen att köra många databasfrågor under tiden som en vy renderas. Kryssas denna ruta för visas varje databasfråga som körs under renderingen av vyn som en del av den direkta förhandstidden." + +#: includes/admin.inc:2713 +msgid "Do not show hover links over views" +msgstr "Visa inte hovrande länkar över vyer" + +#: includes/admin.inc:2714 +msgid "To make it easier to administrate your views, Views provides 'hover' links to take you to the edit and export screen of a view whenever the view is used. This can be distracting on some themes, though; if it is problematic, you can turn it off here." +msgstr "För att göra det enklare att administrera din vy så erbjuder Views \"hovrande\" länkar för att ta dig till redigerings- och exportskärmen för en vy när den används. Detta kan vara distraherande på några teman. Om detta ställer till med problem kan du stänga av det här." + +#: includes/admin.inc:2720 +msgid "Enable views performance statistics via the Devel module" +msgstr "Aktivera views statitistik för prestanda via modulen Devel" + +#: includes/admin.inc:2721 +msgid "Check this to enable some Views query and performance statistics if Devel is installed." +msgstr "Kryssa i detta för att aktivera några databasfrågor i Views och statistik över prestanda om modulen Devel är installerad." + +#: includes/admin.inc:2727 +msgid "Disable javascript with Views" +msgstr "Avaktivera JavaScript för Views" + +#: includes/admin.inc:2728 +msgid "If you are having problems with the javascript, you can disable it here; the Views UI should degrade and still be usable without javascript, it just not as good." +msgstr "Om du upplever problem med JavaScript kan du avaktivera det här. Views UI bör nedgraderas och fortfarande fungera utan JavasScript, dock inte lika bra." + +#: includes/admin.inc:2736 +msgid "Page region to output performance statistics" +msgstr "Sidområde att skriva ut prestandastatistik till" + +#: includes/admin.inc:2743 +msgid "Label for \"Any\" value on optional single-select exposed filters" +msgstr "Etikett för värdet \"Valfri\" på valfria exponerade filter för enskilda val" + +#: includes/admin.inc:2756 +msgid "The cache has been cleared." +msgstr "Cachen har tömts." + +#: includes/admin.inc:2922 +msgid "Error: missing @component" +msgstr "Fel: saknad @component" + +#: includes/admin.inc:3008 +#: includes/view.inc:1925 +msgid "Field" +msgstr "Fält" + +#: includes/admin.inc:3009 +msgid "Column" +msgstr "Kolumn" + +#: includes/admin.inc:3012 +msgid "Sortable" +msgstr "Sorteringsbar" + +#: includes/admin.inc:3016 +msgid "Default sort" +msgstr "Förvald sortering" + +#: includes/ajax.inc:82 +msgid "Server reports invalid input error." +msgstr "Servern rapporterar om fel för ogiltig inmatning." + +#: includes/ajax.inc:83 +msgid "Error" +msgstr "Fel" + +#: includes/analyze.inc:38 +msgid "View analysis can find nothing to report." +msgstr "Analys för vyn kan inte hitta något att rapportera." + +#: includes/analyze.inc:104 +msgid "This view has only a default display and therefore will not be placed anywhere on your site; perhaps you want to add a page or a block display." +msgstr "Denna vy har enbart en förvald visning och kommer därför inte att placeras någonstans på din webbplats. Kanske vill du lägga till en visning av typen sida eller block." + +#: includes/convert.inc:14 +msgid "There are no Views 1 views stored in the database to convert." +msgstr "Det finns inga visningar av typen Views 1 lagrade i databasen att konvertera." + +#: includes/convert.inc:22 +msgid "Operations" +msgstr "Alternativ" + +#: includes/convert.inc:33 +msgid "Converted" +msgstr "Konverterad" + +#: includes/convert.inc:68 +msgid "The table below lists Views version 1 views that are stored in the database. You can either convert them to work in Views version 2, or delete them. The views are convertible only if there is no Views 2 view with the same name." +msgstr "Tabellen nedan listar visningar för Views version 1 som är lagrade i databasen. Du kan antingen konvertera dem så att de fungerar i Views version 2, eller radera dem. Vyerna konverteras enbart om det inte finns en visning av typen Views 2 med samma namn." + +#: includes/convert.inc:79 +msgid "Unable to find view." +msgstr "Kunde inte hitta vyn." + +#: includes/convert.inc:89 +msgid "Unable to convert view." +msgstr "Kunde inte konvertera vyn." + +#: includes/convert.inc:107 +msgid "This action cannot be undone." +msgstr "Denna åtgärd kan inte ångras." + +#: includes/convert.inc:117 +msgid "The view has been deleted" +msgstr "Vyn har raderats" + +#: includes/form.inc:249 +msgid "Validation error, please try again. If this error persists, please contact the site administrator." +msgstr "Valideringsfel. Försök igen. Om felet kvarstår, kontakta webbplatsadministratören." + +#: includes/handlers.inc:43 +msgid "Handler @handler include tried to loop infinitely!" +msgstr "Inkluderade hanterare @handler försökta loopa i all oändlighet!" + +#: includes/handlers.inc:270 +msgid "!group: !title" +msgstr "!group: !title" + +#: includes/handlers.inc:521 +msgid "Reduce duplicates" +msgstr "Reducera dubletter" + +#: includes/handlers.inc:522 +msgid "This filter can cause items that have more than one of the selected options to appear as duplicate results. If this filter causes duplicate results to occur, this checkbox can reduce those duplicates; however, the more terms it has to search for, the less performant the query will be, so use this with caution." +msgstr "Detta filter kan göra att poster som innehåller mer är ett av de valda alternativen visas fler gånger. Om detta filter gör att dubletter visas, kan man reducera dessa dubletter genom att kryssa i denna ruta, men kom ihåg, ju fler termer det måste sökas efter, desto sämre prestanda kommer databasfrågan att ha, så använd detta med tillförsikt." + +#: includes/plugins.inc:26 +msgid "Default settings for this view." +msgstr "Standardinställning för denna vy." + +#: includes/plugins.inc:40 +msgid "Display the view as a page, with a URL and menu links." +msgstr "Visa vyn som en sida, med en URL och menlänk." + +#: includes/plugins.inc:51;60 +msgid "Block" +msgstr "Block" + +#: includes/plugins.inc:52 +msgid "Display the view as a block." +msgstr "Visa vyn som ett block." + +#: includes/plugins.inc:64 +msgid "Attachment" +msgstr "Bilaga" + +#: includes/plugins.inc:65 +msgid "Attachments added to other displays to achieve multiple views in the same view." +msgstr "Bilagor tillagda till andra visningar för att erhålla flera visningar i samma vy." + +#: includes/plugins.inc:73 +msgid "Display the view as a feed, such as an RSS feed." +msgstr "Visa vyn som ett flöde, t.ex. ett RSS-flöde." + +#: includes/plugins.inc:93;144 +msgid "Unformatted" +msgstr "Oformatterad" + +#: includes/plugins.inc:94 +msgid "Displays rows one after another." +msgstr "Visar rader efter varandra." + +#: includes/plugins.inc:104 +msgid "HTML List" +msgstr "HTML-lista" + +#: includes/plugins.inc:105 +msgid "Displays rows as an HTML list." +msgstr "Visar rader som en HTML-lista." + +#: includes/plugins.inc:114 +msgid "Grid" +msgstr "Rutnät" + +#: includes/plugins.inc:115 +msgid "Displays rows in a grid." +msgstr "Visa rader i ett rutnät." + +#: includes/plugins.inc:124 +msgid "Table" +msgstr "Tabell" + +#: includes/plugins.inc:125 +msgid "Displays rows in a table." +msgstr "Visa rader i en tabell." + +#: includes/plugins.inc:136 +msgid "Displays the default summary as a list." +msgstr "Visar den förvalda summeringen som en lista." + +#: includes/plugins.inc:145 +msgid "Displays the summary unformatted, with option for one after another or inline." +msgstr "Visar summeringen oformaterad, med alternativ för en efter en annan eller på samma rad." + +#: includes/plugins.inc:154 +msgid "RSS Feed" +msgstr "RSS-flöde" + +#: includes/plugins.inc:155 +msgid "Generates an RSS feed from a view." +msgstr "Genererar ett RSS-flöde från en vy." + +#: includes/plugins.inc:174 +msgid "Displays the fields with an optional template." +msgstr "Visar fältet med en valfri mall." + +#: includes/plugins.inc:187 +msgid "Fixed entry" +msgstr "Bestämt inlägg" + +#: includes/plugins.inc:191;203 +msgid "PHP Code" +msgstr "PHP-kod" + +#: includes/plugins.inc:207 +msgid "Numeric" +msgstr "Numerisk" + +#: includes/plugins.inc:219 +msgid "Will be available to all users." +msgstr "Kommer att vara tillgängligt för alla användare." + +#: includes/plugins.inc:224 +#: plugins/views_plugin_access_role.inc:40 +msgid "Role" +msgstr "Roll" + +#: includes/plugins.inc:225 +msgid "Access will be granted to users with any of the specified roles." +msgstr "Åtkomst kommer att ges till användare med någon av de specificerade rollerna." + +#: includes/plugins.inc:231 +#: plugins/views_plugin_access_perm.inc:35 +msgid "Permission" +msgstr "Rättighet" + +#: includes/plugins.inc:232 +msgid "Access will be granted to users with the specified permission string." +msgstr "Åtkomst kommer att ges till användare med den specificerade strängen för rättighet." + +#: includes/view.inc:266 +msgid "set_display() called with invalid display id @display." +msgstr "set_display() anropad med ogiltigt ID för visningen @display." + +#: includes/view.inc:1116 +msgid "Home" +msgstr "Hem" + +#: includes/view.inc:1924 +msgid "fields" +msgstr "fält" + +#: includes/view.inc:1926 +msgid "field" +msgstr "fält" + +#: includes/view.inc:1931 +msgid "arguments" +msgstr "argument" + +#: includes/view.inc:1932;1933 +msgid "Argument" +msgstr "Argument" + +#: includes/view.inc:1937 +msgid "Sort criteria" +msgstr "Sorteringskriterier" + +#: includes/view.inc:1938 +msgid "sort criteria" +msgstr "sorteringskriterier" + +#: includes/view.inc:1939 +msgid "Sort criterion" +msgstr "Sorteringskriterium" + +#: includes/view.inc:1940 +msgid "sort criterion" +msgstr "sorteringskriterium" + +#: includes/view.inc:1944 +msgid "Filters" +msgstr "Filtrering" + +#: includes/view.inc:1945 +msgid "filters" +msgstr "filter" + +#: includes/view.inc:1946 +msgid "Filter" +msgstr "Filter" + +#: includes/view.inc:1947 +msgid "filter" +msgstr "filter" + +#: includes/view.inc:1952 +msgid "Relationships" +msgstr "Relationer" + +#: includes/view.inc:1953 +msgid "relationships" +msgstr "relationer" + +#: js/ajax.js:0;0;0;0;0;0;0 +#: js/ajax_view.js:0;0 +msgid "An error occurred at @path." +msgstr "Ett fel har uppstått på @path." + +#: js/tabs.js:0 +msgid "jQuery UI Tabs: Mismatching fragment identifier." +msgstr "jQuery UI Tabs: Identifieraren för fragment stämmer inte överens." + +#: js/tabs.js:0 +msgid "jQuery UI Tabs: Not enough arguments to add tab." +msgstr "jQuery UI Tabs: Inte tillräckligt med argument för att lägga till flik." + +#: modules/aggregator.views.inc:26 +msgid "Aggregator" +msgstr "Nyhetssamlare" + +#: modules/aggregator.views.inc:31;299 +msgid "Aggregator item" +msgstr "Nyhetssamlarens post" + +#: modules/aggregator.views.inc:32 +msgid "Aggregator items are imported from external RSS and Atom news feeds." +msgstr "Nyhetssamlarens poster importeras från externa flöden av typen RSS och Atom." + +#: modules/aggregator.views.inc:41 +msgid "The title of the aggregator item." +msgstr "Titeln på nyhetssamlarens alternativ." + +#: modules/aggregator.views.inc:59;191 +#: modules/node.views.inc:246 +msgid "Link" +msgstr "Länk" + +#: modules/aggregator.views.inc:60 +msgid "The link to the original source URL of the item." +msgstr "Länken till den ursprungliga URL:en för källan åt posten." + +#: modules/aggregator.views.inc:76 +#: modules/comment.views.inc:95 +msgid "Author" +msgstr "Författare" + +#: modules/aggregator.views.inc:77 +msgid "The author of the original imported item." +msgstr "Författaren till den ursprungliga importerade posten." + +#: modules/aggregator.views.inc:97 +#: modules/comment.views.inc:63 +#: modules/node.views.inc:362 +msgid "Body" +msgstr "Brödtext" + +#: modules/aggregator.views.inc:98 +msgid "The actual content of the imported item." +msgstr "Det faktiska innehållet på det importerade alternativet." + +#: modules/aggregator.views.inc:112 +#: modules/statistics.views.inc:231 +msgid "Timestamp" +msgstr "Tidsstämpel" + +#: modules/aggregator.views.inc:113 +msgid "The date the original feed item was posted. (With some feeds, this will be the date it was imported.)" +msgstr "Datumet som det ursprungliga nyhetsflödets post lades in. (Med några flöden kommer detta vara datumet som det importerades.)" + +#: modules/aggregator.views.inc:135 +msgid "Aggregator feed" +msgstr "Flöde för nyhetssamlare" + +#: modules/aggregator.views.inc:147 +msgid "Feed ID" +msgstr "ID på flödet" + +#: modules/aggregator.views.inc:148 +msgid "The unique ID of the aggregator feed." +msgstr "Unikt ID på nyhetssamlarens flöde." + +#: modules/aggregator.views.inc:173 +msgid "The title of the aggregator feed." +msgstr "Titeln på nyhetssamlarens flöde." + +#: modules/aggregator.views.inc:192 +msgid "The link to the source URL of the feed." +msgstr "Länken till källans URL för flödet." + +#: modules/aggregator.views.inc:209 +msgid "Last checked" +msgstr "Senast kontrollerad" + +#: modules/aggregator.views.inc:210 +msgid "The date the feed was last checked for new content." +msgstr "Datumet då flödet senast kontrollerades för nytt innehåll." + +#: modules/aggregator.views.inc:231 +msgid "The description of the aggregator feed." +msgstr "Beskrivningen för nyhetssamlarens flöde." + +#: modules/aggregator.views.inc:245 +msgid "Last modified" +msgstr "Senast ändrad" + +#: modules/aggregator.views.inc:246 +msgid "The date of the most recent new content onf the feed." +msgstr "Datumet för det nyaste innehållet på innehållsflödet." + +#: modules/aggregator.views.inc:300 +msgid "Display the aggregator item using the data from the original source." +msgstr "Visa innehållssamlarens post genom att använda data från den ursprungliga källan." + +#: modules/book.views.inc:21;36;46;99 +msgid "Book" +msgstr "Bok" + +#: modules/book.views.inc:30 +msgid "Top level book" +msgstr "Bok på översta nivån" + +#: modules/book.views.inc:31 +msgid "The book the node is in." +msgstr "Boken som noden är i." + +#: modules/book.views.inc:58 +msgid "The weight of the book page." +msgstr "Vikten på boksidan." + +#: modules/book.views.inc:69 +#: modules/comment.views.inc:211 +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:24 +msgid "Depth" +msgstr "Djup" + +#: modules/book.views.inc:70 +msgid "The depth of the book page in the hierarchy; top level books have a depth of 1." +msgstr "Djupet på boksidan i hierarkin. Böcker på den översta nivån har ett djup på 1." + +#: modules/book.views.inc:87 +msgid "Hierarchy" +msgstr "Hierarki" + +#: modules/book.views.inc:88 +msgid "The order of pages in the book hierarchy. If you want the exactly right order, remember to sort by weight, too." +msgstr "Ordningen av sidor i en bokhierarki. Kom ihåg att sortera på vikt också om du vill ha exakt rätt ordning." + +#: modules/book.views.inc:110 +#: modules/taxonomy.views.inc:263 +msgid "Parent" +msgstr "Ovanliggande" + +#: modules/book.views.inc:111 +msgid "The parent book node." +msgstr "Överliggande nod för boken." + +#: modules/book.views.inc:116 +msgid "Book parent" +msgstr "Överliggande bok" + +#: modules/comment.views.inc:22;26;400;411 +msgid "Comment" +msgstr "Kommentar" + +#: modules/comment.views.inc:27 +msgid "Comments are responses to node content." +msgstr "Kommentarer är svar till innehåll av noder." + +#: modules/comment.views.inc:45 +msgid "The title of the comment." +msgstr "Kommentarens titel." + +#: modules/comment.views.inc:64 +msgid "The text of the comment." +msgstr "Kommentarens text." + +#: modules/comment.views.inc:76 +msgid "ID" +msgstr "ID" + +#: modules/comment.views.inc:77 +msgid "The comment ID of the field" +msgstr "Kommentarens ID för fältet" + +#: modules/comment.views.inc:96 +msgid "The name of the comment's author. Can be rendered as a link to the author's homepage." +msgstr "Namnet på kommentarens författare. Kan renderas som en länk till författarens hemsida." + +#: modules/comment.views.inc:114 +msgid "Author's website" +msgstr "Författarens hemsida" + +#: modules/comment.views.inc:115 +msgid "The website address of the comment's author. Can be rendered as a link. Will be empty if the author is a registered user." +msgstr "Webbadress för kommentarens författare. Kan renderas som en länk. Kommer att vara tom om författaren är en registrerad användare." + +#: modules/comment.views.inc:133 +#: modules/node.views.inc:108 +msgid "Post date" +msgstr "Datum för inlägg" + +#: modules/comment.views.inc:134 +msgid "Date and time of when the comment was posted." +msgstr "Datum och tid för när kommentaren lades in." + +#: modules/comment.views.inc:149 +msgid "In moderation" +msgstr "Under moderering" + +#: modules/comment.views.inc:150 +msgid "Whether or not the comment is currently in moderation." +msgstr "Huruvida kommentaren för närvarande är under moderering eller inte." + +#: modules/comment.views.inc:157 +#: modules/node.views.inc:206;215 +msgid "Moderated" +msgstr "Modererad" + +#: modules/comment.views.inc:168 +msgid "View link" +msgstr "Visa länk" + +#: modules/comment.views.inc:169 +msgid "Provide a simple link to view the comment." +msgstr "Tillhandahåll en enkel länk för att visa kommentaren." + +#: modules/comment.views.inc:177 +#: modules/locale.views.inc:123 +#: modules/node.views.inc:254 +#: modules/user.views.inc:209 +msgid "Edit link" +msgstr "Redigera länk" + +#: modules/comment.views.inc:178 +msgid "Provide a simple link to edit the comment." +msgstr "Tillhandahåll en enkel länk för att redigera kommentaren." + +#: modules/comment.views.inc:186 +#: modules/node.views.inc:262;476 +#: modules/user.views.inc:217 +msgid "Delete link" +msgstr "Radera länk" + +#: modules/comment.views.inc:187 +msgid "Provide a simple link to delete the comment." +msgstr "Tillhandahåll en enkel länk för att radera kommentaren." + +#: modules/comment.views.inc:195 +msgid "Reply-to link" +msgstr "Länk för att svara till" + +#: modules/comment.views.inc:196 +msgid "Provide a simple link to reply to the comment." +msgstr "Tillhandahåll en enkel länk för att besvara kommentaren." + +#: modules/comment.views.inc:203 +msgid "Node link" +msgstr "Länk för noden" + +#: modules/comment.views.inc:204 +msgid "Display the standard comment link used on regular nodes." +msgstr "Visa förvald kommentarslänk som används på vanliga noder." + +#: modules/comment.views.inc:212 +msgid "Display the depth of the comment if it is threaded." +msgstr "Visa djupet på kommentaren om den är trådad." + +#: modules/comment.views.inc:216 +msgid "Thread" +msgstr "Tråd" + +#: modules/comment.views.inc:217 +msgid "Sort by the threaded order. This will keep child comments together with their parents." +msgstr "Sortera baserat på trådad ordning. Detta upprätthåller underliggande kommentarer tillsammans med överliggande." + +#: modules/comment.views.inc:223;229;264 +#: modules/node.views.inc:24;29;90;361;376;488;620;631;644 +#: modules/upload.views.inc:43 +msgid "Node" +msgstr "Nod" + +#: modules/comment.views.inc:224 +msgid "The node the comment is a reply to." +msgstr "Noden som kommentaren är ett svar på." + +#: modules/comment.views.inc:234;240 +#: modules/node.views.inc:349 +#: modules/statistics.views.inc:204 +#: modules/user.views.inc:23;27;226;317 +msgid "User" +msgstr "Användare" + +#: modules/comment.views.inc:235 +msgid "The User ID of the comment's author." +msgstr "Användarens ID för författaren till kommentaren." + +#: modules/comment.views.inc:245 +msgid "Parent CID" +msgstr "Överliggande CID" + +#: modules/comment.views.inc:246 +msgid "The Comment ID of the parent comment." +msgstr "Den överliggande kommentarens ID." + +#: modules/comment.views.inc:251;256 +msgid "Parent comment" +msgstr "Överliggande kommentar" + +#: modules/comment.views.inc:252 +msgid "The parent comment." +msgstr "Den överliggande kommentaren." + +#: modules/comment.views.inc:278 +msgid "Last comment time" +msgstr "Tid för senaste kommentar" + +#: modules/comment.views.inc:279 +msgid "Date and time of when the last comment was posted." +msgstr "Datum och tid för när den senaste kommentaren lades in." + +#: modules/comment.views.inc:294 +msgid "Last comment author" +msgstr "Senaste kommentarens författare" + +#: modules/comment.views.inc:295 +msgid "The name of the author of the last posted comment." +msgstr "Namnet på författaren för den senast inlagda kommentaren." + +#: modules/comment.views.inc:307 +msgid "Comment count" +msgstr "Antal kommentarer" + +#: modules/comment.views.inc:308 +msgid "The number of comments a node has." +msgstr "Antal kommentarer en nod har." + +#: modules/comment.views.inc:326 +msgid "Updated/commented date" +msgstr "Datum för uppdaterad/kommenterad" + +#: modules/comment.views.inc:327 +msgid "The most recent of last comment posted or node updated time." +msgstr "Den senast inlagda kommentaren eller tid för uppdatering av noden." + +#: modules/comment.views.inc:350 +msgid "New comments" +msgstr "Nya kommentarer" + +#: modules/comment.views.inc:351 +msgid "The number of new comments on the node." +msgstr "Antalet nya kommentarer till noden." + +#: modules/comment.views.inc:359 +msgid "Comment status" +msgstr "Status för kommenterar" + +#: modules/comment.views.inc:360 +msgid "Whether comments are enabled or disabled on the node." +msgstr "Huruvida kommentarer är aktiverade på noden eller ej." + +#: modules/comment.views.inc:374 +msgid "User posted or commented" +msgstr "Användare skrev eller kommenterade" + +#: modules/comment.views.inc:375 +msgid "Display nodes only if a user posted the node or commented on the node." +msgstr "Visar noder enbart om en användare lagt in en nod eller kommenterat på den." + +#: modules/comment.views.inc:401 +msgid "Display the comment with standard comment view." +msgstr "Visa kommentarer med standardvy för kommentarer." + +#: modules/comment.views.inc:412 +msgid "Display the comment as RSS." +msgstr "Visa kommentarer som RSS." + +#: modules/locale.views.inc:23;28;55;75;92;105;121 +msgid "Locale source" +msgstr "Källa för språk" + +#: modules/locale.views.inc:29 +msgid "A source string for translation, in English or the default site language." +msgstr "En källsträng för översättning, på engelska eller åt det förvalda språket för webbplatsen." + +#: modules/locale.views.inc:34 +msgid "LID" +msgstr "LID" + +#: modules/locale.views.inc:35 +msgid "The ID of the source string." +msgstr "ID för källsträngen." + +#: modules/locale.views.inc:56 +msgid "Location" +msgstr "Plats" + +#: modules/locale.views.inc:57 +msgid "A description of the location or context of the string." +msgstr "En beskrivning av lokaliseringen eller innehållet av strängen." + +#: modules/locale.views.inc:76 +#: modules/locale/views_handler_filter_locale_group.inc:10 +msgid "Group" +msgstr "Grupp" + +#: modules/locale.views.inc:77 +msgid "The group the translation is in." +msgstr "Gruppen som översättningen finns i." + +#: modules/locale.views.inc:93 +msgid "Source" +msgstr "Källa" + +#: modules/locale.views.inc:94 +msgid "The full original string." +msgstr "Den fullständiga originalsträngen." + +#: modules/locale.views.inc:106 +#: modules/locale/views_handler_filter_locale_version.inc:10 +msgid "Version" +msgstr "Version" + +#: modules/locale.views.inc:107 +msgid "The version of Drupal core that this string is for." +msgstr "Version av Drupals kärna som denna sträng tillhör." + +#: modules/locale.views.inc:124 +msgid "Provide a simple link to edit the translations." +msgstr "Tillhandahåll en enkel länk för att redigera översättningarna." + +#: modules/locale.views.inc:134;146;159;175;185 +#, fuzzy +msgid "Locale target" +msgstr "Källa för lokalisering" + +#: modules/locale.views.inc:147 +msgid "Translation" +msgstr "Översättning" + +#: modules/locale.views.inc:148 +msgid "The full translation string." +msgstr "Den fullständiga strängen strängen för översättning." + +#: modules/locale.views.inc:160 +#: modules/translation.views.inc:32 +#: modules/locale/views_handler_filter_locale_language.inc:10 +#: modules/translation/views_handler_filter_node_language.inc:9 +msgid "Language" +msgstr "Språk" + +#: modules/locale.views.inc:161 +msgid "The language this translation is in." +msgstr "Språket denna översättning finns i." + +#: modules/locale.views.inc:176 +msgid "Singular LID" +msgstr "Singular LID" + +#: modules/locale.views.inc:177 +msgid "The ID of the parent translation." +msgstr "Den överliggande översättningens ID." + +#: modules/locale.views.inc:186;194 +msgid "Plural" +msgstr "Plural" + +#: modules/locale.views.inc:187 +msgid "Whether or not the translation is plural." +msgstr "Huruvida noden är översättningen är plural eller ej." + +#: modules/node.views.inc:30 +msgid "Nodes are a Drupal site's primary content." +msgstr "Noder är en webbplats byggd på Drupals primära innehåll." + +#: modules/node.views.inc:57 +msgid "Nid" +msgstr "Nid" + +#: modules/node.views.inc:58 +msgid "The node ID of the node." +msgstr "Nodens ID för noden." + +#: modules/node.views.inc:86;418 +msgid "The title of the node." +msgstr "Nodens titel." + +#: modules/node.views.inc:109 +msgid "The date the node was posted." +msgstr "Datum då noden skapades." + +#: modules/node.views.inc:124 +msgid "Updated date" +msgstr "Datum för uppdatering" + +#: modules/node.views.inc:125 +msgid "The date the node was last updated." +msgstr "Datum då noden senast uppdaterades." + +#: modules/node.views.inc:141 +msgid "The type of a node (for example, \"blog entry\", \"forum post\", \"story\", etc)." +msgstr "Typen av nod (t.ex. \"blogginlägg\", \"foruminlägg\", \"artikel\" etc.)." + +#: modules/node.views.inc:160 +msgid "Whether or not the node is published." +msgstr "Huruvida noden är publicerad eller ej." + +#: modules/node.views.inc:177;182 +msgid "Published or admin" +msgstr "Publicerad eller administrerad" + +#: modules/node.views.inc:178 +msgid "Filters out unpublished nodes if the current user cannot view them." +msgstr "Filtrerar bort opublicerade noder om den aktuella användaren inte kan se dem." + +#: modules/node.views.inc:188;196 +msgid "Promoted to front page" +msgstr "Publicerad på första sidan" + +#: modules/node.views.inc:189 +msgid "Whether or not the node is promoted to the front page." +msgstr "Huruvida noden är lanserad på framsidan eller ej." + +#: modules/node.views.inc:207 +msgid "Whether or not the node is moderated." +msgstr "Om noden är modererad eller ej." + +#: modules/node.views.inc:225;234 +msgid "Sticky" +msgstr "Klistrad" + +#: modules/node.views.inc:226 +msgid "Whether or not the node is sticky." +msgstr "Om noden är klistrad eller ej." + +#: modules/node.views.inc:247 +msgid "Provide a simple link to the node." +msgstr "Tillhandahåll en enkel länk till noden." + +#: modules/node.views.inc:255 +msgid "Provide a simple link to edit the node." +msgstr "Tillhandahåll en enkel länk för att redigera noden." + +#: modules/node.views.inc:263 +msgid "Provide a simple link to delete the node." +msgstr "Tillhandahåll en enkel länk för att radera noden." + +#: modules/node.views.inc:271;452 +#: modules/user.views.inc:129 +msgid "Created date" +msgstr "Skapad datum" + +#: modules/node.views.inc:272 +msgid "In the form of CCYYMMDD." +msgstr "På formen CCYYMMDD." + +#: modules/node.views.inc:280 +msgid "Created year + month" +msgstr "Skapad år + månad" + +#: modules/node.views.inc:281 +msgid "In the form of YYYYMM." +msgstr "På formen YYYYMM." + +#: modules/node.views.inc:289 +msgid "Created year" +msgstr "Skapad år" + +#: modules/node.views.inc:290 +msgid "In the form of YYYY." +msgstr "På formen YYYY." + +#: modules/node.views.inc:298 +msgid "Created month" +msgstr "Skapad månad" + +#: modules/node.views.inc:299 +msgid "In the form of MM (01 - 12)." +msgstr "På formen MM (01 - 12)." + +#: modules/node.views.inc:307 +msgid "Created day" +msgstr "Skapad dag" + +#: modules/node.views.inc:308 +msgid "In the form of DD (01 - 31)." +msgstr "På formen DD (01 - 31)." + +#: modules/node.views.inc:316 +msgid "Created week" +msgstr "Skapad vecka" + +#: modules/node.views.inc:317 +msgid "In the form of WW (01 - 53)." +msgstr "På formen WW (01 - 53)." + +#: modules/node.views.inc:329;334 +msgid "Node revision" +msgstr "Nodrevision" + +#: modules/node.views.inc:335 +msgid "Node revisions are a history of changes to nodes." +msgstr "Nodrevisioner är en historik över ändringar av noder." + +#: modules/node.views.inc:350 +msgid "Relate a node revision to the user who created the revision." +msgstr "Relatera en nodrevision till användaren som skapade revisionen." + +#: modules/node.views.inc:355 +msgid "user" +msgstr "användare" + +#: modules/node.views.inc:363 +msgid "The actual, full data in the body field; this may not be valid data on all node types." +msgstr "Den aktuella, fullständiga datan i brödtextens fält. Detta behöver inte vara giltig data för alla nodtyper." + +#: modules/node.views.inc:377 +#: modules/node/views_plugin_row_node_view.inc:52 +msgid "Teaser" +msgstr "Förhandstitt" + +#: modules/node.views.inc:378 +msgid "The stored teaser field. This may not be valid or useful data on all node types." +msgstr "Det lagrade fältet för förhandstitt. Detta behöver inte vara giltig eller användbar data för alla nodtyper." + +#: modules/node.views.inc:391 +msgid "Vid" +msgstr "Vid" + +#: modules/node.views.inc:392 +msgid "The revision ID of the node revision." +msgstr "Revisionens ID för nodens revision." + +#: modules/node.views.inc:438 +msgid "Log message" +msgstr "Loggmeddelande" + +#: modules/node.views.inc:439 +msgid "The log message entered when the revision was created." +msgstr "Loggmeddelandet som antecknades när revisionen skapades." + +#: modules/node.views.inc:453 +msgid "The date the node revision was created." +msgstr "Datumet som revisionen för noden skapades." + +#: modules/node.views.inc:468 +msgid "Revert link" +msgstr "Länk för att återgå" + +#: modules/node.views.inc:469 +msgid "Provide a simple link to revert to the revision." +msgstr "Tillhandahåll en enkel länk för att återgå till revisionen." + +#: modules/node.views.inc:477 +msgid "Provide a simple link to delete the node revision." +msgstr "Tillhandahåll en enkel länk för att radera revisionen för noden." + +#: modules/node.views.inc:504 +msgid "Has new content" +msgstr "Har nytt innehåll." + +#: modules/node.views.inc:507 +msgid "Show a marker if the node has new or updated content." +msgstr "Visa en markering om noden har nytt eller uppdaterat innehåll." + +#: modules/node.views.inc:510 +msgid "Show only nodes that have new content." +msgstr "Visa endast noder som har nytt innehåll." + +#: modules/node.views.inc:621;632 +msgid "Display the node with standard node view." +msgstr "Visa noden med förvalda nodvisningen." + +#: modules/node.views.inc:651 +msgid "Node ID from URL" +msgstr "Nodens ID från URL" + +#: modules/node.views.inc:718 +msgid "Display %display has no access control but does not contain a filter for published nodes." +msgstr "Visningen %display har inte någon åtkomstkontroll, men innehåller inte något filter för publicerade noder." + +#: modules/poll.views.inc:20 +msgid "Poll" +msgstr "Omröstning" + +#: modules/poll.views.inc:35;43 +#: modules/user.views.inc:177;186 +msgid "Active" +msgstr "Aktiv" + +#: modules/poll.views.inc:36 +msgid "Whether the poll is open for voting." +msgstr "Huruvida omrösningen är öppen för röster eller inte." + +#: modules/profile.views.inc:20;40 +msgid "Profile" +msgstr "Profil" + +#: modules/profile.views.inc:100 +msgid "@field-name" +msgstr "@field-name" + +#: modules/profile.views.inc:107 +msgid "Profile textfield" +msgstr "Textfält för profil" + +#: modules/profile.views.inc:126 +msgid "Profile textarea" +msgstr "Textområde för profil" + +#: modules/profile.views.inc:142 +msgid "Profile checkbox" +msgstr "Kryssruta för profil" + +#: modules/profile.views.inc:159 +msgid "Profile URL" +msgstr "URL för profil" + +#: modules/profile.views.inc:175 +msgid "Profile selection" +msgstr "Listval för profil" + +#: modules/profile.views.inc:195 +msgid "Profile freeform list %field-name." +msgstr "Fri formulärslista %field-name för profil." + +#: modules/profile.views.inc:207 +msgid "Profile date %field-name." +msgstr "Datum %field-name för profil." + +#: modules/search.views.inc:23;86;104;167 +msgid "Search" +msgstr "Sök" + +#: modules/search.views.inc:72 +msgid "Score" +msgstr "Poäng" + +#: modules/search.views.inc:73 +msgid "The score of the search item. This will not be used if the search filter is not also present." +msgstr "Poängen för sökalternativet. Detta kommer inte att användas om inte sökfiltret används." + +#: modules/search.views.inc:93 +msgid "Links from" +msgstr "Länkar från" + +#: modules/search.views.inc:94 +msgid "Other nodes that are linked from the node." +msgstr "Andra noder som är länkade från noden." + +#: modules/search.views.inc:111 +msgid "Links to" +msgstr "Länkar till" + +#: modules/search.views.inc:112 +msgid "Other nodes that link to the node." +msgstr "Andra noder som länkar till noden." + +#: modules/search.views.inc:123 +msgid "Search Terms" +msgstr "Termer för sökning" + +#: modules/search.views.inc:124 +msgid "The terms to search for." +msgstr "Termer att söka efter." + +#: modules/search.views.inc:168 +msgid "Display the results with standard search view." +msgstr "Visa resultat med en förvald visning för sökning." + +#: modules/statistics.views.inc:24 +msgid "Node statistics" +msgstr "Statistik för nod" + +#: modules/statistics.views.inc:36 +msgid "Total views" +msgstr "Totala visningar" + +#: modules/statistics.views.inc:37 +msgid "The total number of times the node has been viewed." +msgstr "Det totala antalet gånger som noden har visats." + +#: modules/statistics.views.inc:53 +msgid "Views today" +msgstr "Visningar idag" + +#: modules/statistics.views.inc:54 +msgid "The total number of times the node has been viewed today." +msgstr "Det totala antalet gånger som noden har visats idag." + +#: modules/statistics.views.inc:70 +msgid "Most recent view" +msgstr "Den senaste visningen" + +#: modules/statistics.views.inc:71 +msgid "The most recent time the node has been viewed." +msgstr "Den senaste tiden som noden har visats." + +#: modules/statistics.views.inc:89;94 +msgid "Access log" +msgstr "Åtkomstlogg" + +#: modules/statistics.views.inc:95 +msgid "Stores site access information." +msgstr "Lagrar webbplatsen åtkomstinformation." + +#: modules/statistics.views.inc:109 +msgid "Session ID" +msgstr "Sessionens ID" + +#: modules/statistics.views.inc:110 +msgid "Browser session ID of user that visited page." +msgstr "Webbläsarens sessions-ID för användaren som besökte sidan." + +#: modules/statistics.views.inc:129 +msgid "Page title" +msgstr "Sidrubrik" + +#: modules/statistics.views.inc:130 +msgid "Title of page visited." +msgstr "Rubrik på besökt sida." + +#: modules/statistics.views.inc:150 +msgid "Internal path to page visited (relative to Drupal root.)" +msgstr "Intern sökväg till sidan som besöktes (i förhållande till Drupals rotkatalog)." + +#: modules/statistics.views.inc:169 +msgid "Referrer" +msgstr "Hänvisad från" + +#: modules/statistics.views.inc:170 +msgid "Referrer URI." +msgstr "Hänvisares URI." + +#: modules/statistics.views.inc:185 +msgid "Hostname" +msgstr "Värdnamn" + +#: modules/statistics.views.inc:186 +msgid "Hostname of user that visited the page." +msgstr "Värdnamn på användaren som besökte sidan." + +#: modules/statistics.views.inc:205 +msgid "The user who visited the site." +msgstr "Användaren som besökte webbplatsen." + +#: modules/statistics.views.inc:215 +msgid "Timer" +msgstr "Tidur" + +#: modules/statistics.views.inc:216 +msgid "Time in milliseconds that the page took to load." +msgstr "Tid i millisekunder som sidan tog att laddas." + +#: modules/statistics.views.inc:232 +msgid "Timestamp of when the page was visited." +msgstr "Tidsstämpel då sidan besöktes." + +#: modules/system.views.inc:25;30 +msgid "File" +msgstr "Fil" + +#: modules/system.views.inc:31 +msgid "Files maintained by Drupal and various modules." +msgstr "Filer som upprätthålls av Drupal och diverse moduler." + +#: modules/system.views.inc:49 +msgid "File ID" +msgstr "Filens ID" + +#: modules/system.views.inc:50 +msgid "The ID of the file." +msgstr "ID för filen." + +#: modules/system.views.inc:70 +msgid "The name of the file." +msgstr "Namnet på filen." + +#: modules/system.views.inc:89 +msgid "The path of the file." +msgstr "Sökväg till filen." + +#: modules/system.views.inc:107 +msgid "Mime type" +msgstr "Typ av MIME" + +#: modules/system.views.inc:108 +msgid "The mime type of the file." +msgstr "Typ av MIME för filen." + +#: modules/system.views.inc:126 +msgid "Size" +msgstr "Storlek" + +#: modules/system.views.inc:127 +msgid "The size of the file." +msgstr "Storlek på filen." + +#: modules/system.views.inc:142 +msgid "Status" +msgstr "Status" + +#: modules/system.views.inc:143 +msgid "The status of the file." +msgstr "Status för filen." + +#: modules/system.views.inc:158 +msgid "Upload date" +msgstr "Datum för uppladdning" + +#: modules/system.views.inc:159 +msgid "The date the file was uploaded." +msgstr "Datumet som filen laddades upp." + +#: modules/system.views.inc:204 +msgid "Temporary" +msgstr "Temporär" + +#: modules/system.views.inc:205 +msgid "Permanent" +msgstr "Permanent" + +#: modules/taxonomy.views.inc:24;67;156;174;230;270;307;318 +msgid "Taxonomy" +msgstr "Taxonomi" + +#: modules/taxonomy.views.inc:48 +msgid "Vocabulary name" +msgstr "Namn på vokabulär" + +#: modules/taxonomy.views.inc:50 +msgid "Name of the vocabulary a term is a member of. This will be the vocabulary that whichever term the \"Taxonomy: Term\" field is; and can similarly cause duplicates." +msgstr "Namnet på vokabuläret som en term är medlem av. Detta kommer att vara vokabuläret för vilken som helst term som fältet \"Taxonomi: Term\" är. Och kan på samma sätt skapa dubletter." + +#: modules/taxonomy.views.inc:56 +msgid "Vocabulary ID" +msgstr "Vokabulärets ID" + +#: modules/taxonomy.views.inc:57 +msgid "The taxonomy vocabulary ID" +msgstr "Taxonomins ID för vokabuläret" + +#: modules/taxonomy.views.inc:70;120;217 +msgid "Term" +msgstr "Term" + +#: modules/taxonomy.views.inc:71 +msgid "Taxonomy terms are attached to nodes." +msgstr "Taxonomitermer bifogas till noder." + +#: modules/taxonomy.views.inc:96;200 +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:35 +msgid "Term ID" +msgstr "Termens ID" + +#: modules/taxonomy.views.inc:97;201 +msgid "The taxonomy term ID" +msgstr "Taxonomins ID för termen" + +#: modules/taxonomy.views.inc:121 +msgid "Taxonomy terms. Note that using this can cause duplicate nodes to appear in views; you must add filters to reduce the result set." +msgstr "Taxonomitermer. Observera: genom att använda detta kan dubletter av noder uppstå i vyer. Du måste ange filter för att reducera det fastställda resultatet." + +#: modules/taxonomy.views.inc:131 +msgid "Taxonomy term name." +msgstr "Namn på taxonomiterm." + +#: modules/taxonomy.views.inc:140 +msgid "The term weight field" +msgstr "Termens viktfält" + +#: modules/taxonomy.views.inc:152 +msgid "Term description" +msgstr "Termens beskrivning" + +#: modules/taxonomy.views.inc:153 +msgid "The description associated with a taxonomy term." +msgstr "Beskrivningen som associeras med en taxonomiterm." + +#: modules/taxonomy.views.inc:164 +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:39 +msgid "Vocabulary" +msgstr "Vokabulär" + +#: modules/taxonomy.views.inc:165 +msgid "Filter the results of \"Taxonomy: Term\" to a particular vocabulary." +msgstr "Filtrera resultatet för \"Taxonomi: Term\" till ett speciellt vokabulär." + +#: modules/taxonomy.views.inc:203 +msgid "All terms" +msgstr "Alla termer" + +#: modules/taxonomy.views.inc:204 +msgid "Display all taxonomy terms associated with a node from specified vocabularies." +msgstr "Visa alla taxonomitermer som associerats med en nod från specifika vokabulärer." + +#: modules/taxonomy.views.inc:258 +msgid "Parent term" +msgstr "Överliggande term" + +#: modules/taxonomy.views.inc:259 +msgid "The parent term of the term. This can produce duplicate entries if you are using a vocabulary that allows multiple parents." +msgstr "Överliggande term för termen. Detta kan producera dubbla inlägg om du använder ett vokabulär som tillåter multipla ovanliggande släktskap." + +#: modules/taxonomy.views.inc:291 +msgid "Term synonym" +msgstr "Synonym för term" + +#: modules/taxonomy.views.inc:292 +msgid "Term synonyms may be used to find terms by alternate names." +msgstr "Synonymer till termer kan användas för att hitta termer genom alternativa namn." + +#: modules/taxonomy.views.inc:308 +msgid "Term ID (with depth)" +msgstr "Termens ID (med djup)" + +#: modules/taxonomy.views.inc:309 +#, fuzzy +msgid "The depth filter is more complex, so provides fewer options." +msgstr "Filtret djup är mer komplext så det tillhandahåller färre alternativ." + +#: modules/taxonomy.views.inc:319 +msgid "Term ID depth modifier" +msgstr "Modifierar djupet på termens ID" + +#: modules/taxonomy.views.inc:320 +msgid "Allows the \"depth\" for Taxonomy: Term ID (with depth) to be modified via an additional argument." +msgstr "Låter \"djupet\" för Taxonomi: Termens ID (med djup) att modifieras via ett ytterligare argument." + +#: modules/taxonomy.views.inc:376 +msgid "Taxonomy term" +msgstr "Term för taxonomi" + +#: modules/translation.views.inc:31;48;80;97;107;117 +msgid "Node translation" +msgstr "Översättning av nod" + +#: modules/translation.views.inc:33 +msgid "The language the content is in." +msgstr "Språket som innehållet är i." + +#: modules/translation.views.inc:49 +msgid "Translation set node ID" +msgstr "Nodens ID för uppsättningen av översättningen" + +#: modules/translation.views.inc:50 +msgid "The ID of the translation set the content belongs to." +msgstr "ID för översättningens uppsättning som innehållet hör till." + +#: modules/translation.views.inc:69;74;98 +msgid "Source translation" +msgstr "Källöversättning" + +#: modules/translation.views.inc:70 +msgid "The source that this content was translated from." +msgstr "Källan som det här innehållet var översatt från." + +#: modules/translation.views.inc:81;84;91 +msgid "Translations" +msgstr "Översättningar" + +#: modules/translation.views.inc:82;85 +msgid "Versions of content in different languages." +msgstr "Versioner av innehåll i olika språk." + +#: modules/translation.views.inc:99 +msgid "Nodes that are either untranslated or are the original versions of a translation set." +msgstr "Noder som antingen inte är översatta eller som är originalversionen av en översättning." + +#: modules/translation.views.inc:108 +msgid "Child translation" +msgstr "Underliggande översättning" + +#: modules/translation.views.inc:109 +msgid "Nodes that are translations of a source translation." +msgstr "Noder som är översättningar av en källöversättning." + +#: modules/translation.views.inc:118 +msgid "Translation status" +msgstr "Status på översättning" + +#: modules/translation.views.inc:119 +msgid "The translation status of the node--whether or not the translation needs to be updated." +msgstr "Status på översättningen för noden. Huruvida översättningen behöver uppdateras eller ej." + +#: modules/translation.views.inc:126 +msgid "Outdated" +msgstr "Förlegad" + +#: modules/upload.views.inc:25;113 +msgid "Upload" +msgstr "Ladda upp" + +#: modules/upload.views.inc:44 +msgid "The node the uploaded file is attached to" +msgstr "Nod som den uppladdade filen är bifogad till" + +#: modules/upload.views.inc:46 +msgid "upload" +msgstr "ladda upp" + +#: modules/upload.views.inc:57 +msgid "The description of the uploaded file." +msgstr "Beskrivningen för den uppladdade filen." + +#: modules/upload.views.inc:74 +msgid "Listed" +msgstr "Listad" + +#: modules/upload.views.inc:75 +msgid "Whether or not the file is marked to be listed." +msgstr "Huruvida filen är markerad att vara listad eller inte." + +#: modules/upload.views.inc:92 +msgid "The weight, used for sorting." +msgstr "Vikt, används för sortering." + +#: modules/upload.views.inc:114;127 +msgid "Attached files" +msgstr "Bifogade filer" + +#: modules/upload.views.inc:115 +msgid "All files attached to a node with upload.module." +msgstr "Alla filer bifogade till en nod med upload.module." + +#: modules/upload.views.inc:122 +#: modules/upload/views_handler_filter_upload_fid.inc:10 +msgid "Has attached files" +msgstr "Har bifogade filer" + +#: modules/upload.views.inc:124 +msgid "Only display items with attached files. This can cause duplicates if there are multiple attached files." +msgstr "Visa enbart alternativ med bifogade filer. Detta kan orsaka dubletter om det finns flera bifogade filer." + +#: modules/upload.views.inc:128 +msgid "Add a relationship to gain access to more file data for files uploaded by upload.module. Note that this relationship will cause duplicate nodes if there are multiple files attached to the node." +msgstr "Lägg till ett släktskap för att erhålla tillgång till ytterligare fildata för filer uppladdade med upload.module. Observera att detta släktskap kommer att orsaka dubletter av noder om det finns flera filer bifogade till noden." + +#: modules/upload.views.inc:134 +msgid "Files" +msgstr "Filer" + +#: modules/user.views.inc:28 +msgid "Users who have created accounts on your site." +msgstr "Användare som har skapat konton på din webbplats." + +#: modules/user.views.inc:48 +msgid "Uid" +msgstr "Uid" + +#: modules/user.views.inc:49 +msgid "The user ID" +msgstr "Användarens ID" + +#: modules/user.views.inc:70 +msgid "Current" +msgstr "Nuvarande" + +#: modules/user.views.inc:71 +msgid "Filter the view to the currently logged in user." +msgstr "Filtrera vyn till den nuvarande inloggade användaren." + +#: modules/user.views.inc:81 +msgid "The user or author name." +msgstr "Användar- eller författarenamnet." + +#: modules/user.views.inc:97 +msgid "E-mail" +msgstr "E-post" + +#: modules/user.views.inc:98 +msgid "Email address for a given user. This field is normally not shown to users, so be cautious when using it." +msgstr "E-postadress för en given användare. Detta fält visas normalt inte för användare, så var försiktig när du använder det." + +#: modules/user.views.inc:113 +msgid "Picture" +msgstr "Bild" + +#: modules/user.views.inc:114 +msgid "The user's picture, if allowed." +msgstr "Användarens bild, om tillåten." + +#: modules/user.views.inc:122 +msgid "Has Avatar" +msgstr "Har \"Avatar\"" + +#: modules/user.views.inc:130 +msgid "The date the user was created." +msgstr "Datum som användaren skapades." + +#: modules/user.views.inc:145 +msgid "Last access" +msgstr "Senast åtkomst" + +#: modules/user.views.inc:146 +msgid "The user's last access date." +msgstr "Användarens senaste åtkomstdatum." + +#: modules/user.views.inc:161 +msgid "Last login" +msgstr "Senaste inloggning" + +#: modules/user.views.inc:162 +msgid "The user's last login date." +msgstr "Användarens senaste inloggningsdatum." + +#: modules/user.views.inc:178 +msgid "Whether a user is active or blocked." +msgstr "Huruvida en användare är aktiv eller blockerad." + +#: modules/user.views.inc:196 +msgid "Signature" +msgstr "Signatur" + +#: modules/user.views.inc:197 +msgid "The user's signature." +msgstr "Användarens signatur." + +#: modules/user.views.inc:210 +msgid "Provide a simple link to edit the user." +msgstr "Tillhandahåll en enkel länk för att redigera användaren." + +#: modules/user.views.inc:218 +msgid "Provide a simple link to delete the user." +msgstr "Tillhandahåll en enkel länk för att radera användaren." + +#: modules/user.views.inc:247 +msgid "Roles" +msgstr "Roller" + +#: modules/user.views.inc:248 +msgid "Roles that a user belongs to." +msgstr "Roller som användare tillhör." + +#: modules/user.views.inc:260 +msgid "No role" +msgstr "Ingen roll" + +#: modules/user.views.inc:303 +msgid "User ID from URL" +msgstr "ID för användaren från URL" + +#: modules/user.views.inc:309 +msgid "User ID from logged in user" +msgstr "Användarens ID från inloggade användare" + +#: modules/views.views.inc:18 +msgid "Global" +msgstr "Total" + +#: modules/views.views.inc:24 +msgid "Random" +msgstr "Slumpvis" + +#: modules/views.views.inc:25 +msgid "Randomize the display order." +msgstr "Slumpa ordningen för visning." + +#: modules/views.views.inc:32 +msgid "Null" +msgstr "Ogiltig" + +#: modules/views.views.inc:33 +msgid "Allow an argument to be ignored. The query will not be altered by this argument." +msgstr "Tillåt ett argument att bli ignorerat. Databasfrågan kommer inte att förändrad genom detta argument." + +#: modules/views.views.inc:40 +msgid "Custom text" +msgstr "Anpassad text" + +#: modules/views.views.inc:41 +msgid "Provide custom text or link." +msgstr "Tillhandahåll en anpassad text eller länk." + +#: modules/aggregator/views_plugin_row_aggregator_rss.inc:25 +#: modules/node/views_plugin_row_node_rss.inc:32 +msgid "Full text" +msgstr "Hela texten" + +#: modules/aggregator/views_plugin_row_aggregator_rss.inc:26 +#: modules/node/views_plugin_row_node_rss.inc:33 +msgid "Title plus teaser" +msgstr "Titel plus förhandstitt" + +#: modules/aggregator/views_plugin_row_aggregator_rss.inc:27 +#: modules/node/views_plugin_row_node_rss.inc:34 +msgid "Title only" +msgstr "Enbart titel" + +#: modules/aggregator/views_plugin_row_aggregator_rss.inc:28 +#: modules/node/views_plugin_row_node_rss.inc:35 +msgid "Use default RSS settings" +msgstr "Använd standardinställningar för RSS" + +#: modules/comment/views_handler_argument_comment_user_uid.inc:11 +#: modules/user/views_handler_argument_user_uid.inc:17 +msgid "Anonymous" +msgstr "Gäst" + +#: modules/comment/views_handler_argument_comment_user_uid.inc:17 +msgid "No user" +msgstr "Ingen användare" + +#: modules/comment/views_handler_field_comment.inc:30 +msgid "Link this field to its comment" +msgstr "Länka detta fält till dess kommentar" + +#: modules/comment/views_handler_field_comment.inc:31 +#: modules/comment/views_handler_field_node_new_comments.inc:26 +#: modules/node/views_handler_field_node.inc:33 +#: modules/system/views_handler_field_file.inc:30 +#: modules/taxonomy/views_handler_field_taxonomy.inc:34 +#: modules/user/views_handler_field_user.inc:31 +msgid "This will override any other link you have set." +msgstr "Detta kommer att åsidosätta alla andra länkar som du har angett." + +#: modules/comment/views_handler_field_comment_link.inc:23 +#: modules/locale/views_handler_field_locale_link_edit.inc:25 +#: modules/node/views_handler_field_node_link.inc:24 +#: modules/user/views_handler_field_user_link.inc:22 +msgid "Text to display" +msgstr "Text att visa" + +#: modules/comment/views_handler_field_comment_link.inc:34 +#: modules/node/views_handler_field_node_link.inc:35 +#: modules/user/views_handler_field_user_link.inc:38 +msgid "view" +msgstr "visa" + +#: modules/comment/views_handler_field_comment_link_delete.inc:12 +#: modules/node/views_handler_field_node_link_delete.inc:26 +#: modules/node/views_handler_field_node_revision_link_delete.inc:35 +#: modules/user/views_handler_field_user_link_delete.inc:13 +msgid "delete" +msgstr "radera" + +#: modules/comment/views_handler_field_comment_link_edit.inc:21 +#: modules/locale/views_handler_field_locale_link_edit.inc:41 +#: modules/node/views_handler_field_node_link_edit.inc:26 +#: modules/user/views_handler_field_user_link_edit.inc:13 +msgid "edit" +msgstr "redigera" + +#: modules/comment/views_handler_field_comment_link_reply.inc:13 +msgid "reply" +msgstr "besvara" + +#: modules/comment/views_handler_field_comment_node_link.inc:36 +msgid "Show teaser-style link" +msgstr "Visa länk med som förhandsvisning" + +#: modules/comment/views_handler_field_comment_username.inc:25 +msgid "Link this field to its user or an author's homepage" +msgstr "Länka detta fält till dess användare eller en författares hemsida" + +#: modules/comment/views_handler_field_node_comment.inc:12 +#: modules/comment/views_handler_filter_node_comment.inc:10 +msgid "Disabled" +msgstr "Ej aktiverad" + +#: modules/comment/views_handler_field_node_comment.inc:14 +#: modules/comment/views_handler_filter_node_comment.inc:11 +msgid "Read only" +msgstr "Endast läsa" + +#: modules/comment/views_handler_field_node_comment.inc:16 +#: modules/comment/views_handler_filter_node_comment.inc:12 +msgid "Read/Write" +msgstr "Läsa/Skriva" + +#: modules/comment/views_handler_field_node_new_comments.inc:25 +msgid "Link this field to new comments" +msgstr "Länka detta fält till nya kommentarer" + +#: modules/comment/views_handler_field_node_new_comments.inc:31 +msgid "Display nothing if no new comments" +msgstr "Visa ingenting, om inga nya kommentarer" + +#: modules/comment/views_plugin_row_comment_view.inc:21 +#: modules/node/views_plugin_row_node_view.inc:64 +msgid "Display links" +msgstr "Visa länkar" + +#: modules/locale/views_handler_argument_locale_group.inc:32 +msgid "Unknown group" +msgstr "Okänd grupp" + +#: modules/locale/views_handler_argument_locale_language.inc:30 +#: modules/node/views_handler_argument_node_language.inc:29 +#: modules/translation/views_handler_argument_node_language.inc:29 +msgid "Unknown language" +msgstr "Okänt språk" + +#: modules/locale/views_handler_filter_locale_language.inc:11 +#: modules/translation/views_handler_filter_node_language.inc:10 +msgid "Current user's language" +msgstr "Språk för nuvarande användare" + +#: modules/locale/views_handler_filter_locale_language.inc:11 +#: modules/translation/views_handler_filter_node_language.inc:10 +msgid "Default site language" +msgstr "Förvalt språk för webbplatsen" + +#: modules/locale/views_handler_filter_locale_language.inc:11 +#: modules/translation/views_handler_filter_node_language.inc:10 +msgid "No language" +msgstr "Inget språk" + +#: modules/locale/views_handler_filter_locale_version.inc:12 +msgid "Current installed version" +msgstr "Nuvarande installerad version" + +#: modules/node/views_handler_argument_dates_various.inc:167 +msgid "Week @week" +msgstr "Vecka @week" + +#: modules/node/views_handler_argument_node_type.inc:30 +msgid "Unknown node type" +msgstr "Okänd typ av nod" + +#: modules/node/views_handler_field_history_user_timestamp.inc:32 +msgid "Check for new comments as well" +msgstr "Kontrollera även för nya kommentarer" + +#: modules/node/views_handler_field_node.inc:32 +msgid "Link this field to its node" +msgstr "Länka detta fält till dess nod" + +#: modules/node/views_handler_field_node_revision_link_revert.inc:36 +msgid "revert" +msgstr "återställ" + +#: modules/node/views_handler_filter_node_type.inc:9 +msgid "Node type" +msgstr "Typ av nod" + +#: modules/node/views_plugin_argument_validate_node.inc:29 +msgid "Types" +msgstr "Typer" + +#: modules/node/views_plugin_argument_validate_node.inc:32 +msgid "If you wish to validate for specific node types, check them; if none are checked, all nodes will pass." +msgstr "Kryssa för dem om du vill bekräfta för specifika typer av noder. Om ingen är ikryssad så kommer alla noder att godkännas." + +#: modules/node/views_plugin_argument_validate_node.inc:39 +msgid "Validate user has access to the node" +msgstr "Bekräfta användare har åtkomst till noden" + +#: modules/node/views_plugin_argument_validate_node.inc:47 +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:33 +msgid "Argument type" +msgstr "Typ av argument" + +#: modules/node/views_plugin_argument_validate_node.inc:49 +msgid "Node ID" +msgstr "ID för noden" + +#: modules/node/views_plugin_argument_validate_node.inc:50 +msgid "Node IDs separated by , or +" +msgstr "ID för noderna separerade med , eller +" + +#: modules/node/views_plugin_row_node_rss.inc:129 +msgid "read more" +msgstr "läs mer" + +#: modules/node/views_plugin_row_node_view.inc:53 +msgid "Full node" +msgstr "Fullständig nod" + +#: modules/node/views_plugin_row_node_view.inc:59 +msgid "Build mode" +msgstr "Metod för uppbyggnad" + +#: modules/node/views_plugin_row_node_view.inc:69 +msgid "Display node comments" +msgstr "Visa kommentarer till noder" + +#: modules/search/views_handler_field_search_score.inc:21 +msgid "No alternate" +msgstr "Inget alternativ" + +#: modules/search/views_handler_field_search_score.inc:28 +msgid "Alternative sort" +msgstr "Alternativ sorteringsordning" + +#: modules/search/views_handler_field_search_score.inc:29 +msgid "If no search is performed and this field does not appear, pick an alternative default table sort field." +msgstr "Om ingen sökning är genomförd och detta fält inte visas, välj ett alternativt förvalt sorteringsfält." + +#: modules/search/views_handler_field_search_score.inc:36 +msgid "Alternate sort order" +msgstr "Byt sorteringsordning" + +#: modules/search/views_handler_filter_search.inc:23 +msgid "On empty input" +msgstr "Vid tom inmatning" + +#: modules/search/views_handler_filter_search.inc:26 +msgid "Show All" +msgstr "Visa allt" + +#: modules/search/views_handler_filter_search.inc:27 +msgid "Show None" +msgstr "Visa inget" + +#: modules/search/views_handler_filter_search.inc:42 +msgid "Enter the terms you wish to search for." +msgstr "Ange de termer du vill söka efter." + +#: modules/search/views_handler_filter_search.inc:60 +msgid "You must include at least one positive keyword with @count characters or more." +msgstr "Du måste ha med minst ett positivt sökord med @count bokstäver eller mer." + +#: modules/search/views_handler_filter_search.inc:64 +msgid "Search for either of the two terms with uppercase OR. For example, cats OR dogs." +msgstr "Sök efter vilket som av de två termerna med stora bokstäver OR. Exempel: katter OR hundar." + +#: modules/search/views_plugin_row_search_view.inc:23 +msgid "Display score" +msgstr "Visa poäng" + +#: modules/system/views_handler_argument_file_fid.inc:13 +msgid "No title" +msgstr "Ingen titel" + +#: modules/system/views_handler_field_file.inc:29 +#: modules/upload/views_handler_field_upload_description.inc:24 +#: modules/upload/views_handler_field_upload_fid.inc:25 +msgid "Link this field to download the file" +msgstr "Länka detta fält för att ladda ned filen " + +#: modules/taxonomy/views_handler_argument_taxonomy.inc:18 +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:125 +msgid "No name" +msgstr "Inget namn" + +#: modules/taxonomy/views_handler_argument_term_node_tid.inc:17 +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:38 +msgid "Set the breadcrumb for the term parents" +msgstr "Ange länkstig för de överliggande termerna" + +#: modules/taxonomy/views_handler_argument_term_node_tid.inc:18 +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:39 +msgid "If selected, the breadcrumb trail will include all parent terms, each one linking to this view. Note that this only works if just one term was received." +msgstr "Om detta är valt kommer länkstigen att inkludera alla överliggande termer, var och en länkad till denna vy. Observera att detta fungerar enbart om en term togs emot." + +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:26 +msgid "The depth will match nodes tagged with terms in the hierarchy. For example, if you have the term \"fruit\" and a child term \"apple\", with a depth of 1 (or higher) then filtering for the term \"fruit\" will get nodes that are tagged with \"apple\" as well as \"fruit\". If negative, the reverse is true; searching for \"apple\" will also pick up nodes tagged with \"fruit\" if depth is -1 (or lower)." +msgstr "Djupet kommer att passa ihop noder märkta med termer i hierarkin. Till exempel: Du har termen \"frukt\" och en underliggande term \"äpple\", med ett djup av 1 (eller högre). Filtrerar man då efter termen \"frukt\" kommer man att få noder som är märkta med \"äpple\" såväl som \"frukt\". Är djupet negativt så gäller det omvända. Söker man efter \"äpple\" får man även upp noder märkta med \"frukt\" om djupet är -1 (eller lägre)." + +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:31 +msgid "Allow multiple terms per argument" +msgstr "Tillåt flera termer per argument" + +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:32 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3. Due to the number of JOINs it would require, AND will be treated as OR with this argument." +msgstr "Om detta är valt kan användare ange flera argument på formen 1+2+3. på grund av antalet JOIN detta skulle kräva så kommer AND att behandlas som OR med detta argument." + +#: modules/taxonomy/views_handler_argument_vocabulary_vid.inc:15 +msgid "No vocabulary" +msgstr "Inget vokabulär" + +#: modules/taxonomy/views_handler_field_taxonomy.inc:33 +msgid "Link this field to its taxonomy term page" +msgstr "Länka detta fält till dess sida för termen i taxonomin" + +#: modules/taxonomy/views_handler_field_term_node_tid.inc:34 +msgid "Link this field to its term page" +msgstr "Länka detta fält till dess sida för termen" + +#: modules/taxonomy/views_handler_field_term_node_tid.inc:41 +msgid "Limit terms by vocabulary" +msgstr "Begränsa termer genom vokabulär" + +#: modules/taxonomy/views_handler_field_term_node_tid.inc:55 +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:23 +msgid "Vocabularies" +msgstr "Vokabulärer" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:41 +msgid "Select which vocabulary to show terms for in the regular options." +msgstr "Välj vilket vokabulär som termer skall visas i, under de allmäna alternativen." + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:52 +msgid "Selection type" +msgstr "Typ av urval" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:53 +msgid "Dropdown" +msgstr "Rullgardinsmeny" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:53 +msgid "Autocomplete" +msgstr "Automatiskt kompletterande" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:59 +msgid "Show hierarchy in dropdown" +msgstr "Visa hierarki i rullgardinsmeny" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:76 +msgid "An invalid vocabulary is selected. Please change it in the options." +msgstr "Ett ogiltigt vokabulär är valt. Var vänlig ändra det i alternativen." + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:94;158 +msgid "Select terms from vocabulary @voc" +msgstr "Välj termer från vokabulär @voc" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:94;158 +msgid "Select terms" +msgstr "Välj termer" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:273 +msgid "Unable to find term: @terms" +msgid_plural "Unable to find terms: @terms" +msgstr[0] "Kunde inte hitta termen: @terms" +msgstr[1] "Kunde inte hitta termerna: @terms" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:26 +msgid "If you wish to validate for specific vocabularies, check them; if none are checked, all terms will pass." +msgstr "Kryssa för dem om du vill bekräfta för specifika vokabulär. Om ingen är ikryssad så kommer alla termer att godkännas." + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:36 +msgid "Term IDs separated by , or +" +msgstr "ID för termer separerade med , eller +" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:37 +msgid "Term name or synonym" +msgstr "Namn för term eller synonym" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:38 +msgid "Term name/synonym converted to Term ID" +msgstr "Namn för term eller synonym konverterad till ID för termen" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:41 +#, fuzzy +msgid "Select the form of this argument; if using term name, it is generally more efficient to convert it to a term ID and use Taxonomy: Term ID rather than Taxonomy: Term Name\" as an argument." +msgstr "Välj formen på detta argument. Om namnet på termen används är det generellt mer effektivt att konvertera det till ett ID för termen och använda taxonomi: Hellre ID för termen än taxonomi: Namn för termen som ett argument." + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:48 +msgid "Transform dashes in URL to spaces in term name arguments" +msgstr "Gör om snedstreck i URL till mellanslag i arguments namn på termer" + +#: modules/translation/views_handler_filter_node_tnid.inc:22 +msgid "Include untranslated nodes" +msgstr "Inkludera noder som inte är översatta" + +#: modules/translation/views_handler_relationship_translation.inc:24 +msgid "Current language" +msgstr "Nuvarande språk" + +#: modules/translation/views_handler_relationship_translation.inc:25 +msgid "Default language" +msgstr "Förvalt språk" + +#: modules/translation/views_handler_relationship_translation.inc:32 +msgid "Translation option" +msgstr "Alternativ för översättning" + +#: modules/translation/views_handler_relationship_translation.inc:33 +msgid "The translation options allows you to select which translation or translations in a translation set join on. Select \"Current language\" or \"Default language\" to join on the translation in the current or default language respectively. Select a specific language to join on a translation in that language. If you select \"All\", each translation will create a new row, which may appear to cause duplicates." +msgstr "Alternativen för översättningen låter dig välja vilken översättning eller uppsättning av översättningar att ansluta till. Välj \"Nuvarande språk\" eller \"Förvalt språk\" för att ansluta till översättningen av det nuvarande språket, eller enbart det förvalda språket. Välj ett specifikt språk att ansluta till på översättningen för det språket. Väljer du \"Alla\" kommer varje översättning att skapa en ny rad, vilket kan orsaka dubletter." + +#: modules/upload/views_handler_field_upload_fid.inc:31 +msgid "Only show \"listed\" file attachments" +msgstr "Visa enbart \"listade\" bifogade filer" + +#: modules/user/views_handler_field_user.inc:30 +msgid "Link this field to its user" +msgstr "Länka detta fält till dess användare" + +#: modules/user/views_handler_field_user_mail.inc:16 +msgid "Link this field" +msgstr "Länka detta fält" + +#: modules/user/views_handler_field_user_mail.inc:19 +msgid "No link" +msgstr "Ingen länk" + +#: modules/user/views_handler_field_user_mail.inc:20 +msgid "To the user" +msgstr "Till användaren" + +#: modules/user/views_handler_field_user_mail.inc:21 +msgid "With a mailto:" +msgstr "Med en mailto:" + +#: modules/user/views_handler_field_user_name.inc:30 +msgid "Overwrite the value to display for anonymous users" +msgstr "Skriv över värdet som visas för gäster" + +#: modules/user/views_handler_field_user_name.inc:33 +msgid "If selected, you will see a field to enter the text to use for anonymous users." +msgstr "Om detta är ikryssat kommer du att få se ett fält att ange text som används för gäster." + +#: modules/user/views_handler_field_user_name.inc:36 +msgid "Text to display for anonymous users" +msgstr "Text att visa för gäster" + +#: modules/user/views_handler_filter_user_current.inc:10 +msgid "Is the logged in user" +msgstr "Är den inloggade användaren" + +#: modules/user/views_handler_filter_user_name.inc:28 +msgid "Usernames" +msgstr "Användarnamn" + +#: modules/user/views_handler_filter_user_name.inc:29 +msgid "Enter a comma separated list of user names." +msgstr "Ange en kommaseparerad lista med användarnamn." + +#: modules/user/views_handler_filter_user_name.inc:112 +msgid "Unable to find user: @users" +msgid_plural "Unable to find users: @users" +msgstr[0] "Kunde inte hitta användaren: @users" +msgstr[1] "Kunde inte hitta användarna: @users" + +#: modules/user/views_plugin_argument_default_user.inc:17 +msgid "Also look for a node and use the node author" +msgstr "Leta även efter en nod och använd nodens författare" + +#: modules/user/views_plugin_argument_validate_user.inc:22 +msgid "Type of user argument to allow" +msgstr "Typ av argument för användare att tillåta" + +#: modules/user/views_plugin_argument_validate_user.inc:24 +msgid "Only allow numeric UIDs" +msgstr "Tillåt enbart numeriska UID" + +#: modules/user/views_plugin_argument_validate_user.inc:25 +msgid "Only allow string usernames" +msgstr "Tillåt enbart användarnamn som strängar" + +#: modules/user/views_plugin_argument_validate_user.inc:26 +msgid "Allow both numeric UIDs and string usernames" +msgstr "Tillåt både numeriska UID och användarnamn som strängar" + +#: modules/user/views_plugin_argument_validate_user.inc:37 +msgid "Restrict user based on role" +msgstr "Begränsa användare baserat på roll" + +#: modules/user/views_plugin_argument_validate_user.inc:47 +msgid "Restrict to the selected roles" +msgstr "Begränsa till valda roller" + +#: modules/user/views_plugin_argument_validate_user.inc:50 +msgid "If no roles are selected, users from any role will be allowed." +msgstr "Om ingen roll är vald kommer användare från vilken roll som helst att tillåtas." + +#: plugins/views_plugin_access_none.inc:9 +msgid "Unrestricted" +msgstr "Obegränsad" + +#: plugins/views_plugin_access_perm.inc:37 +msgid "Only users with the selected permission flag will be able to access this display. Note that users with \"access all views\" can see any view, regardless of other permissions." +msgstr "Enbart användare med den valda rättigheten kommer att kunna få tillgång till denna vy. Observera att användare med \"åtkomst till alla vyer\" kan se alla vyer, oavsett andra rättigheter." + +#: plugins/views_plugin_access_role.inc:21 +msgid "No role(s) selected" +msgstr "Inga roller valda" + +#: plugins/views_plugin_access_role.inc:24 +msgid "Multiple roles" +msgstr "Flera roller" + +#: plugins/views_plugin_access_role.inc:43 +msgid "Only the checked roles will be able to access this display. Note that users with \"access all views\" can see any view, regardless of role." +msgstr "Enbart förkryssade roller kommer att kunna få tillgång till denna vy. Observera att användare med \"åtkomst till alla vyer\" kan se alla vyer, oavsett roll." + +#: plugins/views_plugin_access_role.inc:49 +msgid "You must select at least one role if type is \"by role\"" +msgstr "Du måste välja åtminstone en roll om typen är \"per roll\"" + +#: plugins/views_plugin_argument_default.inc:32 +msgid "Default argument" +msgstr "Argument som standard" + +#: plugins/views_plugin_argument_default.inc:54 +msgid "Note: you do not have permission to modify this. If you change the default argument type, this setting will be lost and you will NOT be able to get it back." +msgstr "Observera: du har inte rättighet att redigera detta. Om du ändrar standardtypen av argument kommer denna inställning att försvinna och du kommer INTE att kunna få tillbaka den." + +#: plugins/views_plugin_argument_default_php.inc:17 +msgid "PHP argument code" +msgstr "PHP-kod för argument" + +#: plugins/views_plugin_argument_default_php.inc:20 +msgid "Enter PHP code that returns a value to use for this argument. Do not use <?php ?>. You must return only a single value for just this argument." +msgstr "Ange PHP-kod som returnerar ett värde att använda för detta argument. Använd inte <?php ?>. Du måste returnera enbart ett enskilt värde för just detta argument." + +#: plugins/views_plugin_argument_validate.inc:43 +msgid "Note: you do not have permission to modify this. If you change the validator, this setting will be lost and you will NOT be able to get it back." +msgstr "Observera: du har inte rättighet att redigera detta. Om du ändrar valideraren kommer denna inställning att försvinna och du kommer INTE att kunna få tillbaka den." + +#: plugins/views_plugin_argument_validate_php.inc:19 +msgid "PHP validate code" +msgstr "PHP-kod för validering" + +#: plugins/views_plugin_argument_validate_php.inc:21 +msgid "Enter PHP code that returns TRUE or FALSE. No return is the same as FALSE, so be SURE to return something if you do not want to declare the argument invalid. Do not use <?php ?>. The argument to validate will be \"$argument\" and the view will be \"$view\". You may change the argument by setting \"$handler->argument\"." +msgstr "Ante PHP-kod som returnerar TRUE eller FALSE. Ingen returnering är detsamma som FALSE, så var SÄKER på att returnera något om du inte vill deklarera argumentet som ogiltigt. Använd inte <?php ?>. Argumentet att validera kommer att vara \"$argument\" och vyn kommer att vara \"$view\". Du kan ändra detta argument genom att ange \"$handler->argument\"." + +#: plugins/views_plugin_display.inc:558 +msgid "Broken field" +msgstr "Brutet fält" + +#: plugins/views_plugin_display.inc:575 +msgid "Basic settings" +msgstr "Grundläggande inställningar" + +#: plugins/views_plugin_display.inc:582 +msgid "Change the name of this display." +msgstr "Ändra namnet på denna visning." + +#: plugins/views_plugin_display.inc:594 +msgid "Change the title that this display will use." +msgstr "Ändra titeln som denna visning kommer att använda." + +#: plugins/views_plugin_display.inc:604 +msgid "Style" +msgstr "Stil" + +#: plugins/views_plugin_display.inc:606 +msgid "Change the style plugin." +msgstr "Ändra plugin för stilen." + +#: plugins/views_plugin_display.inc:620 +msgid "Row style" +msgstr "Radutformning" + +#: plugins/views_plugin_display.inc:622 +msgid "Change the row plugin." +msgstr "Ändra plugin för raden." + +#: plugins/views_plugin_display.inc:632 +msgid "Use AJAX" +msgstr "Använd AJAX" + +#: plugins/views_plugin_display.inc:634 +msgid "Change whether or not this display will use AJAX." +msgstr "Ändra huruvida denna visning kommer att använda AJAX." + +#: plugins/views_plugin_display.inc:641 +msgid "Use pager" +msgstr "Använd paginering" + +#: plugins/views_plugin_display.inc:642 +msgid "Mini" +msgstr "Mini" + +#: plugins/views_plugin_display.inc:643 +msgid "Change this display's pager setting." +msgstr "Ändra denna vys inställning för paginerare." + +#: plugins/views_plugin_display.inc:650;822 +msgid "Items per page" +msgstr "Inlägg per sida" + +#: plugins/views_plugin_display.inc:650;822 +#: plugins/views_plugin_style_summary.inc:43 +msgid "Items to display" +msgstr "Inlägg att visa" + +#: plugins/views_plugin_display.inc:651 +msgid "Unlimited" +msgstr "Obegränsad" + +#: plugins/views_plugin_display.inc:652 +msgid "Change how many items to display." +msgstr "Ändra hur många alternativ som visas." + +#: plugins/views_plugin_display.inc:658 +msgid "More link" +msgstr "Länk \"läs mer\"" + +#: plugins/views_plugin_display.inc:660 +msgid "Specify whether this display will provide a \"more\" link." +msgstr "Ange om denna visning skall innehålla en länk \"läs mer\"." + +#: plugins/views_plugin_display.inc:666;849 +msgid "Distinct" +msgstr "Distinkt" + +#: plugins/views_plugin_display.inc:668;846 +msgid "Display only distinct items, without duplicates." +msgstr "Visa endast distinkta inlägg, utan dubletter." + +#: plugins/views_plugin_display.inc:681 +msgid "Access" +msgstr "Åtkomst" + +#: plugins/views_plugin_display.inc:683 +msgid "Specify access control type for this display." +msgstr "Ange typ av behörighet för denna visning." + +#: plugins/views_plugin_display.inc:687 +msgid "Change settings for this access type." +msgstr "Ändra inställningar för denna behörighetstyp." + +#: plugins/views_plugin_display.inc:707 +msgid "Link display" +msgstr "Länka visning" + +#: plugins/views_plugin_display.inc:709 +msgid "Specify which display this display will link to." +msgstr "Specificera vilken visning som den skall länka till." + +#: plugins/views_plugin_display.inc:716 +msgid "Exposed form in block" +msgstr "Exponerat formulär i block" + +#: plugins/views_plugin_display.inc:718 +msgid "Allow the exposed form to appear in a block instead of the view." +msgstr "Låter ett exponerat formulär visas i ett block istället för i vyn." + +# This causes an unavoidable error on the filter help page. See http://drupal.org/node/253706 +#: plugins/views_plugin_display.inc:721;897 +msgid "Header" +msgstr "Sidhuvud" + +#: plugins/views_plugin_display.inc:721;913 +msgid "Footer" +msgstr "Sidfot" + +#: plugins/views_plugin_display.inc:721;929 +msgid "Empty text" +msgstr "Tom text" + +#: plugins/views_plugin_display.inc:737 +msgid "Unknown/missing format" +msgstr "Okänt/saknat format" + +#: plugins/views_plugin_display.inc:745 +msgid "Change this display's !name." +msgstr "Ändra denna visnings !name." + +#: plugins/views_plugin_display.inc:751 +msgid "Theme" +msgstr "Tema" + +#: plugins/views_plugin_display.inc:752 +msgid "Information" +msgstr "Information" + +#: plugins/views_plugin_display.inc:753 +msgid "Get information on how to theme this display" +msgstr "Få information om hur du kan anpassa denna visning med tema" + +#: plugins/views_plugin_display.inc:779 +msgid "The name of this display" +msgstr "Namnet på denna visning" + +#: plugins/views_plugin_display.inc:782 +msgid "This title will appear only in the administrative interface for the View." +msgstr "Denna titel visas endast i det administrativa gränssnittet för vyn." + +#: plugins/views_plugin_display.inc:787 +msgid "The title of this view" +msgstr "Titeln på denna vy" + +#: plugins/views_plugin_display.inc:790 +msgid "This title will be displayed with the view, wherever titles are normally displayed; i.e, as the page title, block title, etc." +msgstr "Denna titel visas tillsammans med vyn där titlar normalt visas, t.ex. som sid- och blocktitel etc." + +#: plugins/views_plugin_display.inc:795 +msgid "Use AJAX when available to load this view" +msgstr "Använd AJAX om möjligt för att ladda denna vy" + +#: plugins/views_plugin_display.inc:799 +msgid "If set, this view will use an AJAX mechanism for paging, table sorting and exposed filters. This means the entire page will not refresh. It is not recommended that you use this if this view is the main content of the page as it will prevent deep linking to specific pages, but it is very useful for side content." +msgstr "Om angett kommer denna vy använda en mekanism av typen AJAX för paginering, tabellsortering och exponerade filter. Detta innebär att hela sidan inte laddas om. Detta är inte rekommenderat om denna vy är huvudinnehåll för sidan eftersom det förhindrar djupgående länkning till specifika sidor, men kan vara väldigt användbart för sidinnehåll." + +#: plugins/views_plugin_display.inc:808 +msgid "Use a pager for this view" +msgstr "Använd en paginerare för denna vy" + +#: plugins/views_plugin_display.inc:811 +msgid "Full pager" +msgstr "Fullständig paginerare" + +#: plugins/views_plugin_display.inc:811 +msgid "Mini pager" +msgstr "Minipaginerare" + +#: plugins/views_plugin_display.inc:816 +msgid "Pager element" +msgstr "Element för paginerare" + +#: plugins/views_plugin_display.inc:817 +msgid "Unless you're experiencing problems with pagers related to this view, you should leave this at 0. If using multiple pagers on one page you may need to set this number to a higher value so as not to conflict within the ?page= array. Large values will add a lot of commas to your URLs, so avoid if possible." +msgstr "Så länge du inte upplever problem med paginerare relaterade till denna vy bör du lämna detta som 0. Om flera pagineringar används på en sida kan du behöva ange ett högre värde så det inte uppstår en konflikt i ?page= array. Höga värden kommer lägga till många kommatecken till dina URL:er, så undvik detta om möjligt." + +#: plugins/views_plugin_display.inc:826 +msgid "The number of items to display per page. Enter 0 for no limit." +msgstr "Antalet inlägg att visa per sida. Ange 0 för ingen begränsning." + +#: plugins/views_plugin_display.inc:831 +msgid "Offset" +msgstr "Kompensera" + +#: plugins/views_plugin_display.inc:832 +msgid "The number of items to skip. For example, if this field is 3, the first 3 items will be skipped and not displayed. Offset can not be used if items to display is 0; instead use a very large number there." +msgstr "Antal alternativ att hoppa över. Till exempel: om detta fält är 3 så kommer de 3 första alternativen att hoppas över och inte visas. Kompensering kan inte användas om antal alternativ att visa är 0. Använd i såna fall ett stort nummer där." + +#: plugins/views_plugin_display.inc:837 +msgid "Add a more link to the bottom of the display." +msgstr "Lägg till en länk \"läs mer\" i botten av visningen." + +#: plugins/views_plugin_display.inc:840 +msgid "Create more link" +msgstr "Skapa en länk \"läs mer\"" + +#: plugins/views_plugin_display.inc:841 +msgid "This will add a more link to the bottom of this view, which will link to the page view. If you have more than one page view, the link will point to the display specified in 'Link display' above." +msgstr "Detta lägger till en länk \"läs mer\" i botten av denna vy som länkar till sidvisningen. Om du har mer än en sidvisning pekar länken till visningen specificerad i \"Länkvisning\" ovan." + +#: plugins/views_plugin_display.inc:850 +msgid "This will make the view display only distinct items. If there are multiple identical items, each will be displayed only once. You can use this to try and remove duplicates from a view, though it does not always work. Note that this can slow queries down, so use it with caution." +msgstr "Detta kommer göra att vyn visar enbart distinkta alternativ. Om det finns flera identiska alternativ så kommer var och en enbart att visas en gång. Du kan använda detta för att försöka ta bort dubletter från en vy, däremot fungerar det inte alltid. Observera att detta kan slöa ned databasfrågor så använd det med tillförsikt." + +#: plugins/views_plugin_display.inc:855 +msgid "Access restrictions" +msgstr "Begränsningar av åtkomst" + +#: plugins/views_plugin_display.inc:874;954 +msgid "You may also adjust the !settings for the currently selected style by clicking on the icon." +msgstr "Du kan också ändra !settings för den nuvarande valda stilen genom att klicka på ikonen." + +#: plugins/views_plugin_display.inc:874;954;999 +msgid "settings" +msgstr "inställningar" + +#: plugins/views_plugin_display.inc:882 +msgid "Access options" +msgstr "Alternativ för åtkomst" + +#: plugins/views_plugin_display.inc:900;916 +msgid "Display even if view has no result" +msgstr "Visa även om vyn inte har något resultat" + +#: plugins/views_plugin_display.inc:907 +msgid "Text to display at the top of the view. May contain an explanation or links or whatever you like. Optional." +msgstr "Text att visa överst i vyn. Får innehålla en förklaring, länk eller vad som helst. Valfritt." + +#: plugins/views_plugin_display.inc:923 +msgid "Text to display beneath the view. May contain an explanation or links or whatever you like. Optional." +msgstr "Text att visas under vyn. Får innehålla en förklaring, länk eller vad som helst. Valfritt." + +#: plugins/views_plugin_display.inc:934 +msgid "Text to display if the view has no results. Optional." +msgstr "Text att visa om vyn inte har något resultat. Valfritt." + +#: plugins/views_plugin_display.inc:940 +msgid "How should this view be styled" +msgstr "Hur skall denna vy utformas." + +#: plugins/views_plugin_display.inc:946 +msgid "If the style you choose has settings, be sure to click the settings button that will appear next to it in the View summary." +msgstr "Om stilen du väljer har inställningar, se till att klicka på inställningsknappen som kommer att visas bredvid den i vyns summering." + +#: plugins/views_plugin_display.inc:960 +msgid "Style options" +msgstr "Alternativ för stil" + +#: plugins/views_plugin_display.inc:971 +msgid "Row style options" +msgstr "Alternativ för radutformning" + +#: plugins/views_plugin_display.inc:986 +msgid "How should each row in this view be styled" +msgstr "Hur skall varje rad i denna vy vara utformad" + +#: plugins/views_plugin_display.inc:999 +msgid "You may also adjust the !settings for the currently selected row style by clicking on the icon." +msgstr "Du kan också ändra !settings för den nuvarande valda radutformningen genom att klicka på ikonen." + +#: plugins/views_plugin_display.inc:1005 +msgid "Which display to use for path" +msgstr "Vilken visning att använda för sökvägen" + +#: plugins/views_plugin_display.inc:1014 +msgid "Which display to use to get this display's path for things like summary links, rss feed links, more links, etc." +msgstr "Vilken visning att använda för denna visnings sökväg för saker såsom länk för summering, rss, läs mer, etcetera." + +#: plugins/views_plugin_display.inc:1019 +msgid "Theming information" +msgstr "Information om att använda tema" + +#: plugins/views_plugin_display.inc:1027 +msgid "Display output" +msgstr "Utmatning för visning" + +#: plugins/views_plugin_display.inc:1031 +msgid "Alternative display output" +msgstr "Alternativ utmatning för visning" + +#: plugins/views_plugin_display.inc:1038 +msgid "Style output" +msgstr "Utmatning för stil" + +#: plugins/views_plugin_display.inc:1042 +msgid "Alternative style" +msgstr "Alternativ stil" + +#: plugins/views_plugin_display.inc:1049 +msgid "Row style output" +msgstr "Utmatning för radutformning" + +#: plugins/views_plugin_display.inc:1053 +msgid "Alternative row style" +msgstr "Alternativ radutformning" + +#: plugins/views_plugin_display.inc:1061 +msgid "Field @field (ID: @id)" +msgstr "Fält @field (ID: @id)" + +#: plugins/views_plugin_display.inc:1069 +msgid "This section lists all possible templates for the display plugin and for the style plugins, ordered roughly from the least specific to the most specific. The active template for each plugin -- which is the most specific template found on the system -- is highlighted in bold." +msgstr "Denna avdelning visar alla möjliga mallar för insticksprogrammen visning och stil. De är ordnade från den minst, till den mest specifika - på ett ungefär. Den aktiva mallen för varje insticksprogram, som är den mest specifika mallen funnen i systemet, är markerad med fet text." + +#: plugins/views_plugin_display.inc:1084 +msgid "Rescan template files" +msgstr "Avsök filmallar igen" + +#: plugins/views_plugin_display.inc:1090 +msgid "Important! When adding, removing, or renaming template files, it is necessary to make Drupal aware of the changes by making it rescan the files on your system. By clicking this button you clear Drupal's theme registry and thereby trigger this rescanning process. The highlighted templates above will then reflect the new state of your system." +msgstr "Viktigt! När du lägger till, tar bort, eller byter namn på filmallar är det viktigt att göra Drupal uppmärksam på ändringarna genom att låta den avsöka filerna på ditt system igen. Genom att klicka på denna knapp så rensar du registret för temat och därigenom aktiverar du denna avsökningsprocess igen. Den markerade mallen ovan kommer sen att återge det nya tillståndet för ditt system." + +#: plugins/views_plugin_display.inc:1096 +msgid "Theming information (display)" +msgstr "Information om att använda tema (visning)" + +#: plugins/views_plugin_display.inc:1097;1124;1153;1182 +msgid "Back to !info." +msgstr "Tillbaka till !info." + +#: plugins/views_plugin_display.inc:1097;1124;1153;1182 +msgid "theming information" +msgstr "information om att använda tema" + +#: plugins/views_plugin_display.inc:1100 +msgid "This display has no theming information" +msgstr "Denna visning har ingen information om att använda tema" + +#: plugins/views_plugin_display.inc:1103 +msgid "This is the default theme template used for this display." +msgstr "Detta är den standardmall för temat som används för denna visning." + +#: plugins/views_plugin_display.inc:1109 +msgid "This is an alternative template for this display." +msgstr "Detta är en alternativ mall för denna visning." + +#: plugins/views_plugin_display.inc:1123 +msgid "Theming information (style)" +msgstr "Information om att använda tema (stil)" + +#: plugins/views_plugin_display.inc:1129 +msgid "This display has no style theming information" +msgstr "Denna visning har ingen information om att ange stil för tema" + +#: plugins/views_plugin_display.inc:1132 +msgid "This is the default theme template used for this style." +msgstr "Detta är den standardmall för temat som används för denna stil." + +#: plugins/views_plugin_display.inc:1138 +msgid "This is an alternative template for this style." +msgstr "Detta är en alternativ mall för denna stil." + +#: plugins/views_plugin_display.inc:1152;1181 +msgid "Theming information (row style)" +msgstr "Information om att använda tema (radutformning)" + +#: plugins/views_plugin_display.inc:1158 +msgid "This display has no row style theming information" +msgstr "Denna visning har ingen information om att använda radutforming på tema" + +#: plugins/views_plugin_display.inc:1161;1184 +msgid "This is the default theme template used for this row style." +msgstr "Detta är temats standardmall som används för denna radutformning." + +#: plugins/views_plugin_display.inc:1167 +msgid "This is an alternative template for this row style." +msgstr "Detta är en alternativ mall för denna radutformning." + +#: plugins/views_plugin_display.inc:1199 +msgid "Put the exposed form in a block" +msgstr "Sätt det exponerade formuläret i ett block" + +#: plugins/views_plugin_display.inc:1203 +msgid "If set, any exposed widgets will not appear with this view. Instead, a block will be made available to the Drupal block administration system, and the exposed form will appear there. Note that this block must be enabled manually, Views will not enable it for you." +msgstr "Om angett så kommer exponerade widgets inte att uppenbaras med denna vy. Istället kommer ett block att göras tillgängligt till Drupals system för administration av block, och exponerade formulär kommer att uppenbara sig där. Observera att detta block måste aktiveras manuell, Views kommer inte aktivera det åt dig." + +#: plugins/views_plugin_display.inc:1238 +msgid "File found in folder @template-path" +msgstr "Fil funnen i mappen @template-path" + +#: plugins/views_plugin_display.inc:1242 +msgid "(File not found, in folder @template-path)" +msgstr "(Fil inte funnen i mapp @template-path)" + +#: plugins/views_plugin_display.inc:1399 +msgid "Override" +msgstr "Åsidosätt" + +#: plugins/views_plugin_display.inc:1404 +msgid "Status: using default values." +msgstr "Status: använder standarvärden." + +#: plugins/views_plugin_display.inc:1408 +msgid "Update default display" +msgstr "Uppdatera standardvisning" + +#: plugins/views_plugin_display.inc:1413 +msgid "Use default" +msgstr "Använd standard" + +#: plugins/views_plugin_display.inc:1418 +msgid "Status: using overridden values." +msgstr "Status: använder åsidosättande värden." + +#: plugins/views_plugin_display.inc:1639 +msgid "Display \"@display\" uses fields but there are none defined for it or all are excluded." +msgstr "Visning \"@display\" använder fält, men det finns inga definierade för den eller så är alla spärrade." + +#: plugins/views_plugin_display.inc:1644 +msgid "Display \"@display\" uses a path but the path is undefined." +msgstr "Visning \"@display\" använder en sökväg, men den är inte definierad." + +#: plugins/views_plugin_display.inc:1650 +msgid "Display \"@display\" has an invalid style plugin." +msgstr "Visning \"@display\" har ett ogiltigt stilplugin." + +#: plugins/views_plugin_display.inc:1682 +#, fuzzy +msgid "Exposed form: @view-@display_id" +msgstr "Synlig form: @view-@display_id" + +#: plugins/views_plugin_display_attachment.inc:35 +msgid "Before" +msgstr "Före" + +#: plugins/views_plugin_display_attachment.inc:36 +msgid "After" +msgstr "Efter" + +#: plugins/views_plugin_display_attachment.inc:37 +msgid "Both" +msgstr "Båda" + +#: plugins/views_plugin_display_attachment.inc:57 +msgid "Attachment settings" +msgstr "Inställningar för bifogning" + +#: plugins/views_plugin_display_attachment.inc:62;109 +msgid "Inherit arguments" +msgstr "Ärv argument" + +#: plugins/views_plugin_display_attachment.inc:68;118 +msgid "Inherit exposed filters" +msgstr "Ärv exponerade filter" + +#: plugins/views_plugin_display_attachment.inc:74;127 +msgid "Position" +msgstr "Position" + +#: plugins/views_plugin_display_attachment.inc:80 +#: plugins/views_plugin_display_feed.inc:98 +msgid "Multiple displays" +msgstr "Multipla visningar" + +#: plugins/views_plugin_display_attachment.inc:95;136 +#: plugins/views_plugin_display_feed.inc:113;140 +msgid "Attach to" +msgstr "Bifoga till" + +#: plugins/views_plugin_display_attachment.inc:112;121 +msgid "Inherit" +msgstr "Ärv" + +#: plugins/views_plugin_display_attachment.inc:113 +msgid "Should this display inherit its arguments from the parent display to which it is attached?" +msgstr "Ska denna visning ärva sina argument från den överliggande visningen som den är bifogad till?" + +#: plugins/views_plugin_display_attachment.inc:122 +msgid "Should this display inherit its exposed filter values from the parent display to which it is attached?" +msgstr "Skall denna visning ärva sina exponerade filtervärden från den överliggande visningen som den är bifogad till?" + +#: plugins/views_plugin_display_attachment.inc:130 +msgid "Attach before or after the parent display?" +msgstr "Bifoga före eller efter den överliggande visningen?" + +#: plugins/views_plugin_display_attachment.inc:145 +msgid "Select which display or displays this should attach to." +msgstr "Välj vilken eller vilka visningar denna skall bifogas till." + +#: plugins/views_plugin_display_block.inc:34 +msgid "@view: @display" +msgstr "@view: @display" + +#: plugins/views_plugin_display_block.inc:68 +msgid "Block settings" +msgstr "Inställningar för block" + +#: plugins/views_plugin_display_block.inc:82 +msgid "Admin" +msgstr "Administrera" + +#: plugins/views_plugin_display_block.inc:106 +msgid "Do not cache" +msgstr "Cacha inte" + +#: plugins/views_plugin_display_block.inc:107 +msgid "Cache once for everything (global)" +msgstr "Cacha en gång för alltihop (global)" + +#: plugins/views_plugin_display_block.inc:108 +msgid "Per page" +msgstr "Per sida" + +#: plugins/views_plugin_display_block.inc:109 +msgid "Per role" +msgstr "Per roll" + +#: plugins/views_plugin_display_block.inc:110 +msgid "Per role per page" +msgstr "Per roll per sida" + +#: plugins/views_plugin_display_block.inc:111 +msgid "Per user" +msgstr "Per användare" + +#: plugins/views_plugin_display_block.inc:112 +msgid "Per user per page" +msgstr "Per användare per sida" + +#: plugins/views_plugin_display_block.inc:137 +msgid "Block admin description" +msgstr "Beskrivning för administrering av block" + +#: plugins/views_plugin_display_block.inc:140 +msgid "This will appear as the name of this block in administer >> site building >> blocks." +msgstr "Detta kommer att synas som namnet på detta block under Administrera >> Uppbyggnad >> Block." + +#: plugins/views_plugin_display_block.inc:145 +msgid "Block caching type" +msgstr "Typ av cachning för block" + +#: plugins/views_plugin_display_block.inc:149 +msgid "This sets the default status for Drupal's built-in block caching method; this requires that caching be turned on in block administration, and be careful because you have little control over when this cache is flushed." +msgstr "Detta anger förvald status på Drupals inbyggda metod för att cacha block. Detta kräver att cachning är påslaget i administreringen av block. Var försiktig eftersom du har liten kontroll över när denna cache rensas." + +#: plugins/views_plugin_display_feed.inc:86 +msgid "Feed settings" +msgstr "Inställningar för flöde" + +#: plugins/views_plugin_display_feed.inc:90 +msgid "Using the site name" +msgstr "Använder webbplatsens namn" + +#: plugins/views_plugin_display_feed.inc:132 +msgid "Use the site name for the title" +msgstr "Använd webbplatsens namn som titel" + +#: plugins/views_plugin_display_feed.inc:149 +msgid "The feed icon will be available only to the selected displays." +msgstr "Ikonen för nyhetsflöde kommer enbart att vara tillgänglig för valda visningar." + +#: plugins/views_plugin_display_feed.inc:155 +msgid "This view will be displayed by visiting this path on your site. It is recommended that the path be something like \"path/%/%/feed\" or \"path/%/%/rss.xml\", putting one % in the path for each argument you have defined in the view." +msgstr "Denna vy kommer att visas genom att besöka dess sökväg på din webbplats. Det rekommenderas att sökvägen är något liknande \"path/%/%/feed\" eller \"path/%/%/rss.xml\". Genom att sätta ett % i sökvägen för varje argument så har du definierat en vy." + +#: plugins/views_plugin_display_page.inc:194 +msgid "Page settings" +msgstr "Inställningar för sida" + +#: plugins/views_plugin_display_page.inc:219 +msgid "No menu" +msgstr "Ingen meny" + +#: plugins/views_plugin_display_page.inc:222 +msgid "Normal: @title" +msgstr "Normal: @title" + +#: plugins/views_plugin_display_page.inc:226 +msgid "Tab: @title" +msgstr "Flik: @title" + +#: plugins/views_plugin_display_page.inc:236;319 +msgid "Menu" +msgstr "Meny" + +#: plugins/views_plugin_display_page.inc:242 +msgid "Change settings for the parent menu" +msgstr "Ändra inställningar för ovanliggande menyval" + +#: plugins/views_plugin_display_page.inc:255 +msgid "The menu path or URL of this view" +msgstr "Menyns sökväg eller URL för denna vy" + +#: plugins/views_plugin_display_page.inc:259 +msgid "This view will be displayed by visiting this path on your site. You may use \"%\" in your URL to represent values that will be used for arguments: For example, \"node/%/feed\"." +msgstr "Denna vy kommer att visas genom att besöka dess sökväg på din webbplats. Du kan använda \"%\" i din URL för att repressentera värden som kommer att användas som argument. Till exempel \"node/%/feed\"." + +#: plugins/views_plugin_display_page.inc:265 +msgid "Menu item entry" +msgstr "Inlägg i menyval" + +#: plugins/views_plugin_display_page.inc:282 +msgid "No menu entry" +msgstr "Inga inlägg i meny" + +#: plugins/views_plugin_display_page.inc:283 +msgid "Normal menu entry" +msgstr "Vanliga inlägg i meny" + +#: plugins/views_plugin_display_page.inc:284;370 +msgid "Menu tab" +msgstr "Menyflik" + +#: plugins/views_plugin_display_page.inc:285 +msgid "Default menu tab" +msgstr "Förvald menyflik" + +#: plugins/views_plugin_display_page.inc:294 +msgid "If set to normal or tab, enter the text to use for the menu item." +msgstr "Om satt till normal eller flik, ange texten att användas för menyvalet" + +#: plugins/views_plugin_display_page.inc:302 +msgid "If set to normal or tab, enter the text to use for the menu item's description." +msgstr "Om satt till normal eller flik, ange texten som skall användas för menyvalets beskrivning." + +#: plugins/views_plugin_display_page.inc:309 +msgid "Warning: Changing this item's menu will not work reliably in Drupal 6.4 or earlier. Please upgrade your copy of Drupal at !url." +msgstr "Varning: Att ändra denna posts meny kommer inte att fungera tillfredställande i Drupal 6.4 eller tidigare. Var vänlig uppgradera din kopia av Drupal på !url." + +#: plugins/views_plugin_display_page.inc:323 +msgid "Insert item into an available menu." +msgstr "Infoga post i en tillgänglig meny." + +#: plugins/views_plugin_display_page.inc:334 +msgid "Menu selection requires the activation of menu module." +msgstr "Urvalet meny kräver aktivering av modulen menu." + +#: plugins/views_plugin_display_page.inc:342 +msgid "The lower the weight the higher/further left it will appear." +msgstr "Ju lägre vikt, desto högre upp/längre till vänster, kommer den att visas." + +#: plugins/views_plugin_display_page.inc:348 +msgid "Default tab options" +msgstr "Inställningar för standardflik" + +#: plugins/views_plugin_display_page.inc:357 +msgid "When providing a menu item as a tab, Drupal needs to know what the parent menu item of that tab will be. Sometimes the parent will already exist, but other times you will need to have one created. The path of a parent item will always be the same path with the last part left off. i.e, if the path to this view is foo/bar/baz, the parent path would be foo/bar." +msgstr "När man tillhandahåller menyvalet som en flik måste Drupal veta vad det överliggande menyvalet på fliken skall vara. Ibland existerare redan ett överliggande menyval, men andra gånger måste du låta skapa ett. Sökvägen för ett överliggande alternativ kommer alltid att vara sökväg med den sista delen lämnad. T.ex. om sökvägen till denna vy är foo/bar/baz, så är den överliggande sökvägen foo/bar>/em>." + +#: plugins/views_plugin_display_page.inc:368 +msgid "Parent menu item" +msgstr "Överliggande menyval" + +#: plugins/views_plugin_display_page.inc:370 +msgid "Already exists" +msgstr "Existerar redan" + +#: plugins/views_plugin_display_page.inc:370 +msgid "Normal menu item" +msgstr "Vanligt menyval" + +#: plugins/views_plugin_display_page.inc:378 +msgid "If creating a parent menu item, enter the title of the item." +msgstr "Om du skapar ett överliggande menyval, ange titeln för posten." + +#: plugins/views_plugin_display_page.inc:386 +msgid "If creating a parent menu item, enter the description of the item." +msgstr "Om du skapar ett överliggande menyval, ange beskrivningen för posten." + +#: plugins/views_plugin_display_page.inc:392 +msgid "Tab weight" +msgstr "Vikt på flik" + +#: plugins/views_plugin_display_page.inc:396 +msgid "If the parent menu item is a tab, enter the weight of the tab. The lower the number, the more to the left it will be." +msgstr "Om det överliggande menyvalet är en flik, ange vikten på fliken. Ju lägre nummer, desto längre till vänster kommer det att vara." + +#: plugins/views_plugin_display_page.inc:410 +msgid "\"$arg\" is no longer supported. Use % instead." +msgstr "\"$arg\" stöds inte längre. Använd % istället." + +#: plugins/views_plugin_display_page.inc:414 +msgid "\"%\" may not be used for the first segment of a path." +msgstr "\"%\" får inte användas för det första segmentet av en sökväg." + +#: plugins/views_plugin_display_page.inc:424 +msgid "Views cannot create normal menu items for paths with a % in them." +msgstr "Views kan inte skapa ett vanligt menyval för sökvägar med en % i dem." + +#: plugins/views_plugin_display_page.inc:431 +msgid "A display whose path ends with a % cannot be a tab." +msgstr "En visning vars sökväg slutar med % kan inte vara en flik." + +#: plugins/views_plugin_display_page.inc:436 +msgid "Title is required for this menu type." +msgstr "Titel krävs för denna typ av meny." + +#: plugins/views_plugin_display_page.inc:467 +msgid "Display @display is set to use a menu but the menu title is not set." +msgstr "Visningen @display är satt till att använda en meny, men titeln på menyn är inte angiven." + +#: plugins/views_plugin_display_page.inc:473 +msgid "Display @display is set to use a parent menu but the parent menu title is not set." +msgstr "Visningen @display är satt till att använda en överliggande meny, men den överliggande menyns titel är inte angiven." + +#: plugins/views_plugin_row_fields.inc:40 +#, fuzzy +msgid "Inline fields" +msgstr "Radvisa fält" + +#: plugins/views_plugin_row_fields.inc:43 +#, fuzzy +msgid "Inline fields will be displayed next to each other rather than one after another." +msgstr "Radvisa fält kommer att visas bredvid varandra istället för en i taget." + +#: plugins/views_plugin_row_fields.inc:51 +msgid "The separator may be placed between inline fields to keep them from squishing up next to each other. You can use HTML in this field." +msgstr "Avskiljaren kan placeras mellan fält av typen inline för att hindra dem från att klämmas ihop bredvid varandra. Du får använda HTML i detta fält." + +#: plugins/views_plugin_style.inc:91 +msgid "Grouping field" +msgstr "Grupperingsfält" + +#: plugins/views_plugin_style.inc:94 +msgid "You may optionally specify a field by which to group the records. Leave blank to not group." +msgstr "Du kan ange ett fält att gruppera raderna med. Lämna tomt för att inte gruppera." + +#: plugins/views_plugin_style.inc:191 +msgid "Style @style requires a row style but the row plugin is invalid." +msgstr "Stilen @style kräver en radutforming, men radpluginet är inte giltigt." + +#: plugins/views_plugin_style_grid.inc:33 +msgid "Number of columns" +msgstr "Antal kolumner" + +#: plugins/views_plugin_style_grid.inc:38 +msgid "Alignment" +msgstr "Placering" + +#: plugins/views_plugin_style_grid.inc:39 +msgid "Horizontal" +msgstr "Horisontell" + +#: plugins/views_plugin_style_grid.inc:39 +msgid "Vertical" +msgstr "Vertikal" + +#: plugins/views_plugin_style_grid.inc:41 +msgid "Horizontal alignment will place items starting in the upper left and moving right. Vertical alignment will place items starting in the upper left and moving down." +msgstr "Horisontell justering kommer att placera poster med början längst uppe till vänster och sen röra sig åt höger. Vertikal justering kommer att placera poster med början längst upp till vänster och sen röra sig nedåt." + +#: plugins/views_plugin_style_list.inc:32 +msgid "List type" +msgstr "Typ av lista" + +#: plugins/views_plugin_style_rss.inc:56 +msgid "Use the site mission for the description" +msgstr "Använder webbplatsens syfte som beskrivning" + +#: plugins/views_plugin_style_rss.inc:60 +msgid "RSS description" +msgstr "RSS-beskrivning" + +#: plugins/views_plugin_style_rss.inc:62 +msgid "This will appear in the RSS feed itself." +msgstr "Detta kommer synas i RSS-flödet." + +#: plugins/views_plugin_style_summary.inc:34 +#, fuzzy +msgid "Display record count with link" +msgstr "Visa antal poster med länken" + +#: plugins/views_plugin_style_summary.inc:39 +msgid "Override number of items to display" +msgstr "Åsidosätt antalet inlägg att visa" + +#: plugins/views_plugin_style_summary_unformatted.inc:26 +#, fuzzy +msgid "Display items inline" +msgstr "Visa poster i rad" + +#: plugins/views_plugin_style_table.inc:126 +msgid "You need at least one field before you can configure your table settings" +msgstr "Du behöver åtminstone ett fält innan du kan konfigurera dina inställningar för tabellen" + +#: plugins/views_plugin_style_table.inc:135 +msgid "Override normal sorting if click sorting is used" +msgstr "Åsidosätt normal sortering om klickvis sortering används" + +#: plugins/views_plugin_style_table.inc:141 +msgid "Enable Drupal style \"sticky\" table headers (Javascript)" +msgstr "Aktivera Drupals stil \"klistrad\" tabellsidhuvud (JavaScript)" + +#: plugins/views_plugin_style_table.inc:143 +msgid "(Sticky header effects will not be active for preview below, only on live output.)" +msgstr "(Effekten klistrat sidhuvud kommer inte att vara aktiverat för förhandstitt nedan, endast på den riktiga utmatningen.)" + +#: plugins/views_plugin_style_table.inc:148 +msgid "Default sort order" +msgstr "Förvald sorteringsordning" + +#: plugins/views_plugin_style_table.inc:151 +msgid "If a default sort order is selected, what order should it use by default." +msgstr "Om en förvald sorteringsordning är vald, vilken skall den använda som standard." + +#: plugins/views_plugin_style_table.inc:237 +msgid "Place fields into columns; you may combine multiple fields into the same column. If you do, the separator in the column specified will be used to separate the fields. Check the sortable box to make that column click sortable, and check the default sort radio to determine which column will be sorted by default, if any. You may control column order and field labels in the fields section." +msgstr "Placera fält i kolumner. Du kan kombinera flera fält till samma kolumn. Om du gör det kommer avskiljaren i den specifierade kolumnen att användas för att separera fälten. Kryssa för sorteringsruta för att göra kolumnen sorteringsbar genom klickning, och kryssa för radioknappen för vilken kolumn som skall sorteras som standard (om någon skall sorteras). Du kan kontrollera ordningen på kolumner och fältnamn i fältsektionen." + +#: theme/views-more.tpl.php:15 +msgid "more" +msgstr "mer" + +#: theme/views-ui-edit-item.tpl.php:32 +msgid "The style selected does not utilize fields." +msgstr "Den valda stilen använder sig inte av fält." + +#: theme/views-ui-edit-item.tpl.php:34 +msgid "None defined" +msgstr "Inga definierade" + +#: theme/views-ui-edit-tab.tpl.php:31 +msgid "View settings" +msgstr "Inställningar för vy" + +#: theme/views-ui-edit-view.tpl.php:11 +msgid "This view is being edited by user !user, and is therefore locked from editing by others. This lock is !age old. Click here to break this lock." +msgstr "Denna vy redigeras av användaren !user, och är därför låst för redigering av andra. Denna låsning är !age gammal. Klicka här öppna detta lås." + +#: theme/views-ui-edit-view.tpl.php:16 +msgid "New view" +msgstr "Ny vy" + +#: theme/views-ui-edit-view.tpl.php:18 +msgid "Changed view" +msgstr "Ändrad vy" + +#: theme/views-ui-edit-view.tpl.php:23 +msgid "View %name, displaying items of type @base." +msgstr "Vy %name, visar alternativ av typen @base." + +#: theme/views-ui-edit-view.tpl.php:42 +msgid "Live preview" +msgstr "Direkt förhandsgranskning" + +#: theme/views-ui-list-views.tpl.php:17 +msgid "@type @base view: @view" +msgstr "@type @base vy: @view" + +#: theme/views-ui-list-views.tpl.php:27 +msgid "Title: @title" +msgstr "Titel: @title" + +#: theme/views-ui-list-views.tpl.php:30 +msgid "Path: !path" +msgstr "Sökväg: !path" + +#: theme/theme.inc:92 +msgid "Edit this view" +msgstr "Redigera denna vy" + +#: theme/theme.inc:324 +msgid "sort by @s" +msgstr "sortera efter @s" + +#: theme/theme.inc:601 +msgid "‹‹" +msgstr "‹‹" + +#: theme/theme.inc:606 +msgid "››" +msgstr "››" + +#: theme/theme.inc:619 +msgid "@current of @max" +msgstr "@current av @max" + +#: views_export/views_export.module:77 +msgid "There are no views to be exported at this time." +msgstr "Det finns inga vyer att exportera för tillfället." + +#: views_export/views_export.module:109 +msgid "Show only these tags" +msgstr "Visa endast dessa märken" + +#: views_export/views_export.module:123 +msgid "Module name" +msgstr "Namn på modul" + +#: views_export/views_export.module:124 +msgid "Enter the module name to export code to." +msgstr "Ange modulens namn att exportera koden till." + +#: views_export/views_export.module:205 +msgid "Put this in @module.module in your modules/@module directory" +msgstr "Stoppa in detta i @module.module i din katalog modules/@module" + +#: views_export/views_export.module:218 +msgid "Put this in @module.views_default.inc in your modules/@module directory or modules/@module/includes directory" +msgstr "Stoppa indetta i @module.views_default.inc i din katalog modules/@module eller katalogen modules/@module/includes" + +#: views_export/views_export.module:44 +msgid "use views exporter" +msgstr "använd exporteraren för views" + +#: views_export/views_export.module:17 +msgid "Bulk export" +msgstr "Massexport" + +#: views_export/views_export.module:0 +msgid "views_export" +msgstr "views_export" + +#: views_export/views_export.info:0 +msgid "Views exporter" +msgstr "Exporterare för Views" + +#: views_export/views_export.info:0 +msgid "Allows exporting multiple views at once." +msgstr "Tillåter exportering av flera vyer samtidigt." + diff --git a/translations/views.pot b/translations/views.pot new file mode 100644 index 0000000000000000000000000000000000000000..30118be256301e56c6153bbefb51f2bc47ca32d7 --- /dev/null +++ b/translations/views.pot @@ -0,0 +1,4268 @@ +# $Id$ +# +# LANGUAGE translation of Drupal (general) +# Copyright YEAR NAME +# Generated from files: +# views.module,v 1.317 2008/10/16 17:21:36 merlinofchaos +# admin.inc,v 1.146 2008/10/28 22:50:00 merlinofchaos +# views_ui.module,v 1.106 2008/10/07 22:05:28 merlinofchaos +# views_export.module,v 1.2 2008/06/25 21:42:20 merlinofchaos +# views.info,v 1.7 2007/08/12 06:52:14 merlinofchaos +# views_ui.info,v 1.10 2008/01/09 00:05:08 merlinofchaos +# views_export.info,v 1.1 2008/06/12 16:17:25 merlinofchaos +# plugins.inc,v 1.151 2008/10/28 19:23:50 merlinofchaos +# convert.inc,v 1.12 2008/10/08 00:14:01 merlinofchaos +# theme.inc,v 1.63 2008/10/28 17:46:14 merlinofchaos +# views.install,v 1.42 2008/10/14 19:51:55 merlinofchaos +# docs.php,v 1.10 2008/10/02 22:54:56 merlinofchaos +# views_handler_argument.inc,v 1.4 2008/10/08 00:14:00 merlinofchaos +# views_handler_relationship_translation.inc,v 1.1 2008/09/30 22:07:15 merlinofchaos +# comment.views.inc,v 1.25 2008/10/16 17:21:36 merlinofchaos +# node.views.inc,v 1.87 2008/10/16 17:09:52 merlinofchaos +# views_plugin_display.inc,v 1.16 2008/10/28 20:28:56 merlinofchaos +# views_plugin_display_page.inc,v 1.3 2008/10/08 22:59:59 merlinofchaos +# views_handler_field.inc,v 1.5 2008/10/16 19:38:52 merlinofchaos +# views_handler_filter.inc,v 1.4 2008/10/20 19:35:53 merlinofchaos +# views_handler_relationship.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_sort.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_argument_date.inc,v 1.2 2008/10/07 21:26:23 merlinofchaos +# views_handler_argument_many_to_one.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_argument_numeric.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_argument_string.inc,v 1.2 2008/09/25 00:09:08 merlinofchaos +# taxonomy.views.inc,v 1.49 2008/10/01 17:20:58 merlinofchaos +# views_handler_argument_null.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_field_boolean.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_filter_boolean_operator.inc,v 1.2 2008/09/10 01:08:06 merlinofchaos +# views_handler_filter_in_operator.inc,v 1.4 2008/09/24 22:28:06 merlinofchaos +# views_plugin_display_attachment.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_date.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_field_numeric.inc,v 1.4 2008/10/23 01:04:24 merlinofchaos +# views_handler_field_prerender_list.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_plugin_row_node_rss.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_plugin_style_list.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_row_fields.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_style_summary_unformatted.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_url.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_field_accesslog_path.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_filter_numeric.inc,v 1.6 2008/10/28 20:11:20 merlinofchaos +# views_handler_filter_string.inc,v 1.6 2008/10/28 20:13:34 merlinofchaos +# views_handler_filter_date.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_filter_equality.inc,v 1.2 2008/09/10 01:08:06 merlinofchaos +# views_handler_filter_many_to_one.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# system.views.inc,v 1.7 2008/09/03 19:21:29 merlinofchaos +# views_plugin_access.inc,v 1.1 2008/09/08 22:50:17 merlinofchaos +# views_plugin_style_table.inc,v 1.5 2008/10/15 22:25:36 merlinofchaos +# views_handler_sort_date.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# views_handler_sort_formula.inc,v 1.1 2008/09/03 19:21:28 merlinofchaos +# view.inc,v 1.138 2008/10/29 19:09:49 merlinofchaos +# views_plugin_style.inc,v 1.4 2008/10/08 00:14:01 merlinofchaos +# user.views.inc,v 1.52 2008/10/08 20:56:02 merlinofchaos +# statistics.views.inc,v 1.9 2008/10/28 20:21:37 merlinofchaos +# upload.views.inc,v 1.14 2008/09/10 21:29:15 merlinofchaos +# views_plugin_display_block.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_display_feed.inc,v 1.3 2008/09/30 18:52:15 merlinofchaos +# book.views.inc,v 1.4 2008/07/02 17:42:57 merlinofchaos +# ajax.inc,v 1.19 2008/09/22 20:50:58 merlinofchaos +# analyze.inc,v 1.1 2008/10/28 22:50:00 merlinofchaos +# form.inc,v 1.10 2008/06/25 21:10:10 merlinofchaos +# handlers.inc,v 1.98 2008/10/28 17:47:49 merlinofchaos +# views_plugin_access_role.inc,v 1.1 2008/09/08 22:50:17 merlinofchaos +# views_plugin_access_perm.inc,v 1.2 2008/09/17 22:26:55 merlinofchaos +# ajax.js,v 1.23 2008/10/08 00:14:01 merlinofchaos +# ajax_view.js,v 1.12 2008/10/15 22:09:19 merlinofchaos +# tabs.js,v 1.3 2008/03/30 15:58:26 merlinofchaos +# views_handler_argument_term_node_tid_depth.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# translation.views.inc,v 1.2 2008/10/01 17:20:58 merlinofchaos +# poll.views.inc,v 1.2 2008/03/12 04:32:07 merlinofchaos +# profile.views.inc,v 1.9 2008/09/24 21:21:21 merlinofchaos +# search.views.inc,v 1.14 2008/09/25 00:39:18 merlinofchaos +# views_plugin_argument_validate_taxonomy_term.inc,v 1.2 2008/09/10 16:17:54 merlinofchaos +# views_handler_filter_term_node_tid.inc,v 1.5 2008/10/20 21:32:28 merlinofchaos +# views_handler_filter_node_language.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_filter_node_language.inc,v 1.1 2008/09/30 22:07:15 merlinofchaos +# views_handler_filter_upload_fid.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views.views.inc,v 1.5 2008/09/03 19:21:29 merlinofchaos +# views_handler_argument_comment_user_uid.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_argument_user_uid.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_comment.inc,v 1.2 2008/09/10 00:16:14 merlinofchaos +# views_handler_field_comment_link.inc,v 1.2 2008/09/10 00:16:14 merlinofchaos +# views_handler_field_node_link.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_user_link.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_comment_link_delete.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_node_link_delete.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_node_revision_link_delete.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_user_link_delete.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_comment_link_edit.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_node_link_edit.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_user_link_edit.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_comment_link_reply.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_comment_username.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_node_comment.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_filter_node_comment.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_node_new_comments.inc,v 1.2 2008/09/22 21:59:39 merlinofchaos +# views_plugin_row_comment_view.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_plugin_row_node_view.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_argument_dates_various.inc,v 1.2 2008/09/30 21:30:16 merlinofchaos +# views_handler_argument_node_language.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_argument_node_language.inc,v 1.1 2008/09/30 22:07:15 merlinofchaos +# views_handler_argument_node_type.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_history_user_timestamp.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_node.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_field_node_revision_link_revert.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_filter_node_type.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_plugin_argument_validate_node.inc,v 1.1 2008/09/03 19:21:29 merlinofchaos +# views_handler_filter_search.inc,v 1.2 2008/09/10 20:15:50 merlinofchaos +# views_plugin_row_search_view.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_argument_file_fid.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_file.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_upload_description.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_upload_fid.inc,v 1.2 2008/09/10 21:02:57 merlinofchaos +# views_handler_argument_taxonomy.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_argument_term_node_tid.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_argument_vocabulary_vid.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_taxonomy.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_term_node_tid.inc,v 1.2 2008/09/22 18:13:51 merlinofchaos +# views_handler_field_user.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_field_user_mail.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_filter_user_current.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_handler_filter_user_name.inc,v 1.2 2008/09/22 23:41:14 merlinofchaos +# views_plugin_argument_default_user.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_access_none.inc,v 1.1 2008/09/08 22:50:17 merlinofchaos +# views_plugin_argument_default.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_argument_default_php.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_argument_validate.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_argument_validate_php.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_style_summary.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_style_grid.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views_plugin_style_rss.inc,v 1.1 2008/09/03 19:21:30 merlinofchaos +# views-more.tpl.php,v 1.2 2008/04/11 08:46:26 merlinofchaos +# views-ui-edit-item.tpl.php,v 1.9 2008/08/08 16:57:44 merlinofchaos +# views-ui-edit-tab.tpl.php,v 1.11 2008/08/08 16:57:44 merlinofchaos +# views-ui-edit-view.tpl.php,v 1.9 2008/10/08 00:14:01 merlinofchaos +# views-ui-list-views.tpl.php,v 1.6 2008/10/28 18:11:43 merlinofchaos +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"POT-Creation-Date: 2008-11-06 21:18+0100\n" +"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n" +"Last-Translator: NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: views.module:629 +msgid "Broken handler @table.@field" +msgstr "" + +#: views.module:747 +msgid "Skipping broken view @view" +msgstr "" + +#: views.module:794;834 includes/admin.inc:98;216;216;621 +msgid "Overridden" +msgstr "" + +#: views.module:797;830 views_ui.module:289 includes/admin.inc:97;215;215;588;766 +msgid "Default" +msgstr "" + +#: views.module:935 includes/admin.inc:295 views_export/views_export.module:116 +msgid "Apply" +msgstr "" + +#: views.module:151 views_ui.module:26 views.info:0;0 views_ui.info:0 views_export/views_export.info:0 +msgid "Views" +msgstr "" + +#: views.module:155 +msgid "Ajax callback for view loading." +msgstr "" + +#: views.module:0 +msgid "views" +msgstr "" + +#: views_ui.module:159 +msgid "The converter will make a best-effort attempt to convert a Views 1 view to Views 2. This conversion is not reliable; you will very likely have to make adjustments to your view to get it to match. You can import Views 1 views through the normal Import tab." +msgstr "" + +#: views_ui.module:265 +msgid "Changes cannot be made to a locked view." +msgstr "" + +#: views_ui.module:28 +msgid "Views are customized lists of content on your system; they are highly configurable and give you control over how lists of content are presented." +msgstr "" + +#: views_ui.module:32 includes/plugins.inc:135 +msgid "List" +msgstr "" + +#: views_ui.module:38 includes/admin.inc:1178;1178;2165 +msgid "Add" +msgstr "" + +#: views_ui.module:43 includes/admin.inc:724 +msgid "Import" +msgstr "" + +#: views_ui.module:49 +msgid "Tools" +msgstr "" + +#: views_ui.module:55 +msgid "Basic" +msgstr "" + +#: views_ui.module:63 includes/convert.inc:30 +msgid "Convert" +msgstr "" + +#: views_ui.module:64 +msgid "Convert stored Views 1 views." +msgstr "" + +#: views_ui.module:70;83;88 +msgid "Delete view" +msgstr "" + +#: views_ui.module:76 +msgid "Convert view" +msgstr "" + +#: views_ui.module:113 includes/admin.inc:93 theme/theme.inc:89 +msgid "Edit" +msgstr "" + +#: views_ui.module:0 +msgid "views_ui" +msgstr "" + +#: views.install:31 +msgid "Stores the general data for a view." +msgstr "" + +#: views.install:37 +msgid "The view ID of the field, defined by the database." +msgstr "" + +#: views.install:45 +msgid "The unique name of the view. This is the primary field views are loaded from, and is used so that views may be internal and not necessarily in the database. May only be alphanumeric characters plus underscores." +msgstr "" + +#: views.install:51 +msgid "A description of the view for the admin interface." +msgstr "" + +#: views.install:57 +msgid "A tag used to group/sort views in the admin interface" +msgstr "" + +#: views.install:61 +msgid "A chunk of PHP code that can be used to provide modifications to the view prior to building." +msgstr "" + +#: views.install:68 +msgid "What table this view is based on, such as node, user, comment, or term." +msgstr "" + +#: views.install:74 +msgid "A boolean to indicate whether or not this view may have its query cached." +msgstr "" + +#: views.install:82 +msgid "Stores information about each display attached to a view." +msgstr "" + +#: views.install:89 +msgid "The view this display is attached to." +msgstr "" + +#: views.install:97 +msgid "An identifier for this display; usually generated from the display_plugin, so should be something like page or page_1 or block_2, etc." +msgstr "" + +#: views.install:104 +msgid "The title of the display, viewable by the administrator." +msgstr "" + +#: views.install:111 +msgid "The type of the display. Usually page, block or embed, but is pluggable so may be other things." +msgstr "" + +#: views.install:116 +msgid "The order in which this display is loaded." +msgstr "" + +#: views.install:120 +msgid "A serialized array of options for this display; it contains options that are generally only pertinent to that display plugin type." +msgstr "" + +#: views.install:131 +msgid "A special cache used to store objects that are being edited; it serves to save state in an ordinarily stateless environment." +msgstr "" + +#: views.install:136 +msgid "The session ID this cache object belongs to." +msgstr "" + +#: views.install:141 +msgid "The name of the view this cache is attached to." +msgstr "" + +#: views.install:146 +msgid "The name of the object this cache is attached to; this essentially represents the owner so that several sub-systems can use this cache." +msgstr "" + +#: views.install:153 +msgid "The time this cache was created or updated." +msgstr "" + +#: views.install:157 +msgid "Serialized data being stored." +msgstr "" + +#: views.info:0 +msgid "Create customized lists and queries from your database." +msgstr "" + +#: views_ui.info:0 +msgid "Views UI" +msgstr "" + +#: views_ui.info:0 +msgid "Administrative interface to views. Without this module, you cannot create or edit your views." +msgstr "" + +#: docs/docs.php:127 +msgid "Emulates the default Drupal front page; you may set the default home page path to this view to make it your front page." +msgstr "" + +#: docs/docs.php:128 +msgid "default" +msgstr "" + +#: docs/docs.php:137 includes/plugins.inc:25 +msgid "Defaults" +msgstr "" + +#: docs/docs.php:226 includes/plugins.inc:39;47 +msgid "Page" +msgstr "" + +#: docs/docs.php:281 includes/plugins.inc:72;80 +msgid "Feed" +msgstr "" + +#: docs/docs.php:349 +msgid "Front page feed" +msgstr "" + +#: handlers/views_handler_argument.inc:102 modules/translation/views_handler_relationship_translation.inc:23 +msgid "All" +msgstr "" + +#: handlers/views_handler_argument.inc:119 includes/admin.inc:272;383 modules/comment.views.inc:44 modules/node.views.inc:85;413 plugins/views_plugin_display.inc:592 plugins/views_plugin_display_page.inc:285;348 +msgid "Title" +msgstr "" + +#: handlers/views_handler_argument.inc:121 +msgid "The title to use when this argument is present. It will override the title of the view and titles from previous arguments. You can use percent substitution here to replace with argument titles. Use \"%1\" for the first argument, \"%2\" for the second, etc." +msgstr "" + +#: handlers/views_handler_argument.inc:134 +msgid "Action to take if argument is not present" +msgstr "" + +#: handlers/views_handler_argument.inc:146 +msgid "Wildcard" +msgstr "" + +#: handlers/views_handler_argument.inc:149 +msgid "If this value is received as an argument, the argument will be ignored; i.e, \"all values\"" +msgstr "" + +#: handlers/views_handler_argument.inc:155 +msgid "Wildcard title" +msgstr "" + +#: handlers/views_handler_argument.inc:158 +msgid "The title to use for the wildcard in substitutions elsewhere." +msgstr "" + +#: handlers/views_handler_argument.inc:181 +msgid "Validator options" +msgstr "" + +#: handlers/views_handler_argument.inc:186 +msgid "Validator" +msgstr "" + +#: handlers/views_handler_argument.inc:190 +msgid "" +msgstr "" + +#: handlers/views_handler_argument.inc:229 +msgid "Action to take if argument does not validate" +msgstr "" + +#: handlers/views_handler_argument.inc:248 +msgid "Display all values" +msgstr "" + +#: handlers/views_handler_argument.inc:253 +msgid "Hide view / Page not found (404)" +msgstr "" + +#: handlers/views_handler_argument.inc:258 +msgid "Display empty text" +msgstr "" + +#: handlers/views_handler_argument.inc:263 +msgid "Summary, sorted ascending" +msgstr "" + +#: handlers/views_handler_argument.inc:270 +msgid "Summary, sorted descending" +msgstr "" + +#: handlers/views_handler_argument.inc:277 +msgid "Provide default argument" +msgstr "" + +#: handlers/views_handler_argument.inc:310 +msgid "Provide default argument options" +msgstr "" + +#: handlers/views_handler_argument.inc:320 +msgid "Default argument type" +msgstr "" + +#: handlers/views_handler_argument.inc:708 handlers/views_handler_field.inc:227 handlers/views_handler_filter.inc:592 handlers/views_handler_relationship.inc:133 handlers/views_handler_sort.inc:66 +msgid "Broken/missing handler" +msgstr "" + +#: handlers/views_handler_argument.inc:716 handlers/views_handler_field.inc:235 handlers/views_handler_filter.inc:600 handlers/views_handler_relationship.inc:141 handlers/views_handler_sort.inc:74 +msgid "The handler for this item is broken or missing and cannot be used. If a module provided the handler and was disabled, re-enabling the module may restore it. Otherwise, you should probably delete this item." +msgstr "" + +#: handlers/views_handler_argument_date.inc:29 +msgid "Current date" +msgstr "" + +#: handlers/views_handler_argument_date.inc:30 +msgid "Current node's creation time" +msgstr "" + +#: handlers/views_handler_argument_date.inc:31 +msgid "Current node's update time" +msgstr "" + +#: handlers/views_handler_argument_many_to_one.inc:45 handlers/views_handler_argument_numeric.inc:30 +msgid "Allow multiple terms per argument." +msgstr "" + +#: handlers/views_handler_argument_many_to_one.inc:46 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3 (for OR) or 1,2,3 (for AND)." +msgstr "" + +#: handlers/views_handler_argument_many_to_one.inc:53 handlers/views_handler_argument_string.inc:95 +msgid "Allow multiple arguments to work together." +msgstr "" + +#: handlers/views_handler_argument_many_to_one.inc:54 handlers/views_handler_argument_string.inc:96 +msgid "If selected, multiple instances of this argument can work together, as though multiple terms were supplied to the same argument. This setting is not compatible with the \"Reduce duplicates\" setting." +msgstr "" + +#: handlers/views_handler_argument_many_to_one.inc:60 handlers/views_handler_argument_string.inc:102 +msgid "Do not display items with no value in summary" +msgstr "" + +#: handlers/views_handler_argument_many_to_one.inc:95;109 handlers/views_handler_argument_numeric.inc:45;57 modules/taxonomy.views.inc:129;208;292 +msgid "Uncategorized" +msgstr "" + +#: handlers/views_handler_argument_many_to_one.inc:113 handlers/views_handler_argument_numeric.inc:61 +msgid "Invalid input" +msgstr "" + +#: handlers/views_handler_argument_null.inc:21 +msgid "Fail basic validation if any argument is given" +msgstr "" + +#: handlers/views_handler_argument_null.inc:23 +msgid "By checking this field, you can use this to make sure views with more arguments than necessary fail validation." +msgstr "" + +#: handlers/views_handler_argument_numeric.inc:31 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3 or 1,2,3." +msgstr "" + +#: handlers/views_handler_argument_numeric.inc:37 +msgid "Exclude the argument" +msgstr "" + +#: handlers/views_handler_argument_numeric.inc:38 +msgid "If selected, the numbers entered in the argument will be excluded rather than limiting the view." +msgstr "" + +#: handlers/views_handler_argument_string.inc:44 +msgid "Glossary mode" +msgstr "" + +#: handlers/views_handler_argument_string.inc:45 +msgid "Glossary mode applies a limit to the number of characters used in the argument, which allows the summary view to act as a glossary." +msgstr "" + +#: handlers/views_handler_argument_string.inc:51 +msgid "Character limit" +msgstr "" + +#: handlers/views_handler_argument_string.inc:52 +msgid "How many characters of the argument to filter against. If set to 1, all fields starting with the letter in the argument would be matched." +msgstr "" + +#: handlers/views_handler_argument_string.inc:60 +msgid "Case" +msgstr "" + +#: handlers/views_handler_argument_string.inc:61 +msgid "When printing the argument result, how to transform the case." +msgstr "" + +#: handlers/views_handler_argument_string.inc:63;77 +msgid "No transform" +msgstr "" + +#: handlers/views_handler_argument_string.inc:64;78 +msgid "Upper case" +msgstr "" + +#: handlers/views_handler_argument_string.inc:65;79 +msgid "Lower case" +msgstr "" + +#: handlers/views_handler_argument_string.inc:66;80 +msgid "Capitalize first letter" +msgstr "" + +#: handlers/views_handler_argument_string.inc:67;81 +msgid "Capitalize each word" +msgstr "" + +#: handlers/views_handler_argument_string.inc:74 +msgid "Case in path" +msgstr "" + +#: handlers/views_handler_argument_string.inc:75 +msgid "When printing url paths, how to transform the of the argument. Do not use this unless with Postgres as it uses case sensitive comparisons." +msgstr "" + +#: handlers/views_handler_argument_string.inc:88 +msgid "Transform spaces to dashes in URL" +msgstr "" + +#: handlers/views_handler_field.inc:146 handlers/views_handler_filter.inc:322 handlers/views_handler_relationship.inc:78 +msgid "Label" +msgstr "" + +#: handlers/views_handler_field.inc:148 +msgid "The label for this field that will be displayed to end users if the style requires it." +msgstr "" + +#: handlers/views_handler_field.inc:152 +msgid "Exclude from display" +msgstr "" + +#: handlers/views_handler_field.inc:154 +msgid "Check this box to not display this field, but still load it in the view. Use this option to not show a grouping field in each record, or when doing advanced theming." +msgstr "" + +#: handlers/views_handler_field_boolean.inc:24 +msgid "Output format" +msgstr "" + +#: handlers/views_handler_field_boolean.inc:26 +msgid "Yes/No" +msgstr "" + +#: handlers/views_handler_field_boolean.inc:27 +msgid "True/False" +msgstr "" + +#: handlers/views_handler_field_boolean.inc:28 +msgid "On/Off" +msgstr "" + +#: handlers/views_handler_field_boolean.inc:34 +msgid "Reverse" +msgstr "" + +#: handlers/views_handler_field_boolean.inc:35 +msgid "If checked, true will be displayed as false." +msgstr "" + +#: handlers/views_handler_field_boolean.inc:49 handlers/views_handler_filter_boolean_operator.inc:47 handlers/views_handler_filter_in_operator.inc:25 plugins/views_plugin_display.inc:633;642;659;667;717;803;1207 plugins/views_plugin_display_attachment.inc:63;69 +msgid "Yes" +msgstr "" + +#: handlers/views_handler_field_boolean.inc:49 handlers/views_handler_filter_boolean_operator.inc:47 handlers/views_handler_filter_in_operator.inc:25 plugins/views_plugin_display.inc:633;642;659;667;717;803;811;1207 plugins/views_plugin_display_attachment.inc:63;69 +msgid "No" +msgstr "" + +#: handlers/views_handler_field_boolean.inc:51 handlers/views_handler_filter_boolean_operator.inc:16;61 +msgid "True" +msgstr "" + +#: handlers/views_handler_field_boolean.inc:51 handlers/views_handler_filter_boolean_operator.inc:61 +msgid "False" +msgstr "" + +#: handlers/views_handler_field_boolean.inc:53 +msgid "On" +msgstr "" + +#: handlers/views_handler_field_boolean.inc:53 +msgid "Off" +msgstr "" + +#: handlers/views_handler_field_date.inc:24 +msgid "Date format" +msgstr "" + +#: handlers/views_handler_field_date.inc:29 +msgid "Custom" +msgstr "" + +#: handlers/views_handler_field_date.inc:30 +msgid "Time ago" +msgstr "" + +#: handlers/views_handler_field_date.inc:36 +msgid "Custom date format" +msgstr "" + +#: handlers/views_handler_field_date.inc:37 +msgid "If \"Custom\", see the PHP docs for date formats. If \"Time ago\" this is the the number of different units to display, which defaults to two." +msgstr "" + +#: handlers/views_handler_field_date.inc:53 +msgid "%time ago" +msgstr "" + +#: handlers/views_handler_field_numeric.inc:32 +msgid "Round" +msgstr "" + +#: handlers/views_handler_field_numeric.inc:33 +msgid "If checked, the number will be rounded." +msgstr "" + +#: handlers/views_handler_field_numeric.inc:38 +msgid "Precision" +msgstr "" + +#: handlers/views_handler_field_numeric.inc:40 +msgid "Specify how many digits to print after the decimal point." +msgstr "" + +#: handlers/views_handler_field_numeric.inc:47 +msgid "Decimal point" +msgstr "" + +#: handlers/views_handler_field_numeric.inc:49 +msgid "What single character to use as a decimal point." +msgstr "" + +#: handlers/views_handler_field_numeric.inc:55 +msgid "Thousands separator" +msgstr "" + +#: handlers/views_handler_field_numeric.inc:57 +msgid "What single character to use as the thousands separator." +msgstr "" + +#: handlers/views_handler_field_numeric.inc:62 +msgid "Prefix" +msgstr "" + +#: handlers/views_handler_field_numeric.inc:64 +msgid "Text to put before the number, such as currency symbol." +msgstr "" + +#: handlers/views_handler_field_numeric.inc:68 +msgid "Suffix" +msgstr "" + +#: handlers/views_handler_field_numeric.inc:70 +msgid "Text to put after the number, such as currency symbol." +msgstr "" + +#: handlers/views_handler_field_prerender_list.inc:29 modules/node/views_plugin_row_node_rss.inc:24 +msgid "Display type" +msgstr "" + +#: handlers/views_handler_field_prerender_list.inc:31 plugins/views_plugin_style_list.inc:33 +msgid "Unordered list" +msgstr "" + +#: handlers/views_handler_field_prerender_list.inc:32 plugins/views_plugin_style_list.inc:33 +msgid "Ordered list" +msgstr "" + +#: handlers/views_handler_field_prerender_list.inc:33 +msgid "Simple separator" +msgstr "" + +#: handlers/views_handler_field_prerender_list.inc:40 includes/admin.inc:2974 plugins/views_plugin_row_fields.inc:47 plugins/views_plugin_style_summary_unformatted.inc:30 +msgid "Separator" +msgstr "" + +#: handlers/views_handler_field_prerender_list.inc:48 +msgid "Empty list text" +msgstr "" + +#: handlers/views_handler_field_prerender_list.inc:50 +msgid "If the list is empty, you may enter text here that will be displayed." +msgstr "" + +#: handlers/views_handler_field_url.inc:24 modules/statistics/views_handler_field_accesslog_path.inc:31 +msgid "Display as link" +msgstr "" + +#: handlers/views_handler_filter.inc:136 +msgid "Operator" +msgstr "" + +#: handlers/views_handler_filter.inc:201 +msgid "Expose" +msgstr "" + +#: handlers/views_handler_filter.inc:206 +msgid "This item is currently not exposed. If you expose it, users will be able to change the filter as they view it." +msgstr "" + +#: handlers/views_handler_filter.inc:213 +msgid "Hide" +msgstr "" + +#: handlers/views_handler_filter.inc:218 +msgid "This item is currently exposed. If you hide it, users will not be able to change the filter as they view it." +msgstr "" + +#: handlers/views_handler_filter.inc:289 +msgid "Unlock operator" +msgstr "" + +#: handlers/views_handler_filter.inc:290 +msgid "When checked, the operator will be exposed to the user" +msgstr "" + +#: handlers/views_handler_filter.inc:296 +msgid "Operator identifier" +msgstr "" + +#: handlers/views_handler_filter.inc:298 +msgid "This will appear in the URL after the ? to identify this operator." +msgstr "" + +#: handlers/views_handler_filter.inc:315 +msgid "Filter identifier" +msgstr "" + +#: handlers/views_handler_filter.inc:317 +msgid "This will appear in the URL after the ? to identify this filter. Cannot be blank." +msgstr "" + +#: handlers/views_handler_filter.inc:333 +msgid "Optional" +msgstr "" + +#: handlers/views_handler_filter.inc:334 +msgid "This exposed filter is optional and will have added options to allow it not to be set." +msgstr "" + +#: handlers/views_handler_filter.inc:340 +msgid "Force single" +msgstr "" + +#: handlers/views_handler_filter.inc:341 +msgid "Force this exposed filter to accept only one option." +msgstr "" + +#: handlers/views_handler_filter.inc:347 +msgid "Remember" +msgstr "" + +#: handlers/views_handler_filter.inc:348 +msgid "Remember the last setting the user gave this filter." +msgstr "" + +#: handlers/views_handler_filter.inc:359 +msgid "The identifier is required if the filter is exposed." +msgstr "" + +#: handlers/views_handler_filter.inc:364 +msgid "This identifier is not allowed." +msgstr "" + +#: handlers/views_handler_filter.inc:465 +msgid "" +msgstr "" + +#: handlers/views_handler_filter_boolean_operator.inc:58 handlers/views_handler_filter_in_operator.inc:175 handlers/views_handler_filter_numeric.inc:247 handlers/views_handler_filter_string.inc:111 +msgid "exposed" +msgstr "" + +#: handlers/views_handler_filter_date.inc:24 +msgid "Value type" +msgstr "" + +#: handlers/views_handler_filter_date.inc:26 +msgid "A date in any machine readable format. CCYY-MM-DD HH:MM:SS is preferred." +msgstr "" + +#: handlers/views_handler_filter_date.inc:27 +msgid "An offset from the current time such as \"+1 day\" or \"-2 hours and 30 minutes\"" +msgstr "" + +#: handlers/views_handler_filter_date.inc:77;83;87 +msgid "Invalid date format." +msgstr "" + +#: handlers/views_handler_filter_equality.inc:15 handlers/views_handler_filter_numeric.inc:38 handlers/views_handler_filter_string.inc:28 +msgid "Is equal to" +msgstr "" + +#: handlers/views_handler_filter_equality.inc:16 handlers/views_handler_filter_numeric.inc:44 handlers/views_handler_filter_string.inc:34 +msgid "Is not equal to" +msgstr "" + +#: handlers/views_handler_filter_equality.inc:26 handlers/views_handler_filter_numeric.inc:148;163 handlers/views_handler_filter_string.inc:170 +msgid "Value" +msgstr "" + +#: handlers/views_handler_filter_in_operator.inc:15 +msgid "Options" +msgstr "" + +#: handlers/views_handler_filter_in_operator.inc:37 +msgid "Limit list to selected items" +msgstr "" + +#: handlers/views_handler_filter_in_operator.inc:38 +msgid "If checked, the selected items presented to the user will be the only ones selected here." +msgstr "" + +#: handlers/views_handler_filter_in_operator.inc:57 handlers/views_handler_filter_many_to_one.inc:32 +msgid "Is one of" +msgstr "" + +#: handlers/views_handler_filter_in_operator.inc:58 +msgid "Is not one of" +msgstr "" + +#: handlers/views_handler_filter_in_operator.inc:193 modules/system.views.inc:209 plugins/views_plugin_access.inc:55 +msgid "Unknown" +msgstr "" + +#: handlers/views_handler_filter_many_to_one.inc:33 +msgid "Is all of" +msgstr "" + +#: handlers/views_handler_filter_many_to_one.inc:34 +msgid "Is none of" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:26 +msgid "Is less than" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:28 +msgid "<" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:32 +msgid "Is less than or equal to" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:34 +msgid "<=" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:40 handlers/views_handler_filter_string.inc:29 +msgid "=" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:46 handlers/views_handler_filter_string.inc:35 +msgid "!=" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:50 +msgid "Is greater than or equal to" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:52 +msgid ">=" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:56 +msgid "Is greater than" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:58 +msgid ">" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:62 +msgid "Is between" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:64 +msgid "between" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:68 +msgid "Is not between" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:70 +msgid "not between" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:79 handlers/views_handler_filter_string.inc:80 +msgid "Is empty (NULL)" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:81 handlers/views_handler_filter_string.inc:82 +msgid "empty" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:85 handlers/views_handler_filter_string.inc:86 +msgid "Is not empty (NULL)" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:87 handlers/views_handler_filter_string.inc:88 +msgid "not empty" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:175 +msgid "Min" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:181 +msgid "And max" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:181 +msgid "And" +msgstr "" + +#: handlers/views_handler_filter_numeric.inc:253 +msgid "@min and @max" +msgstr "" + +#: handlers/views_handler_filter_string.inc:40 +msgid "Contains" +msgstr "" + +#: handlers/views_handler_filter_string.inc:41 +msgid "contains" +msgstr "" + +#: handlers/views_handler_filter_string.inc:46 +msgid "Contains any word" +msgstr "" + +#: handlers/views_handler_filter_string.inc:47 +msgid "has word" +msgstr "" + +#: handlers/views_handler_filter_string.inc:52 +msgid "Contains all words" +msgstr "" + +#: handlers/views_handler_filter_string.inc:53 +msgid "has all" +msgstr "" + +#: handlers/views_handler_filter_string.inc:58 +msgid "Starts with" +msgstr "" + +#: handlers/views_handler_filter_string.inc:59 +msgid "begins" +msgstr "" + +#: handlers/views_handler_filter_string.inc:64 +msgid "Ends with" +msgstr "" + +#: handlers/views_handler_filter_string.inc:65 +msgid "ends" +msgstr "" + +#: handlers/views_handler_filter_string.inc:70 +msgid "Does not contain" +msgstr "" + +#: handlers/views_handler_filter_string.inc:71 +msgid "!has" +msgstr "" + +#: handlers/views_handler_filter_string.inc:126 +msgid "Case sensitive" +msgstr "" + +#: handlers/views_handler_filter_string.inc:128 +msgid "Case sensitive filters may be faster. MySQL might ignore case sensitivity." +msgstr "" + +#: handlers/views_handler_relationship.inc:80 +msgid "The label for this relationship that will be displayed only administratively." +msgstr "" + +#: handlers/views_handler_relationship.inc:85 +msgid "Require this relationship" +msgstr "" + +#: handlers/views_handler_relationship.inc:86 +msgid "If required, items that do not contain this relationship will not appear." +msgstr "" + +#: handlers/views_handler_sort.inc:38 +msgid "asc" +msgstr "" + +#: handlers/views_handler_sort.inc:42 +msgid "desc" +msgstr "" + +#: handlers/views_handler_sort.inc:54 +msgid "Sort order" +msgstr "" + +#: handlers/views_handler_sort.inc:55 plugins/views_plugin_style_table.inc:149 +msgid "Ascending" +msgstr "" + +#: handlers/views_handler_sort.inc:55 plugins/views_plugin_style_table.inc:149 +msgid "Descending" +msgstr "" + +#: handlers/views_handler_sort_date.inc:26 +msgid "Granularity" +msgstr "" + +#: handlers/views_handler_sort_date.inc:28 +msgid "Second" +msgstr "" + +#: handlers/views_handler_sort_date.inc:29 +msgid "Minute" +msgstr "" + +#: handlers/views_handler_sort_date.inc:30 +msgid "Hour" +msgstr "" + +#: handlers/views_handler_sort_date.inc:31 +msgid "Day" +msgstr "" + +#: handlers/views_handler_sort_date.inc:32 +msgid "Month" +msgstr "" + +#: handlers/views_handler_sort_date.inc:33 +msgid "Year" +msgstr "" + +#: handlers/views_handler_sort_date.inc:35 +msgid "The granularity is the smallest unit to use when determining whether two dates are the same; for example, if the granularity is \"Year\" then all dates in 1999, regardless of when they fall in 1999, will be considered the same date." +msgstr "" + +#: handlers/views_handler_sort_formula.inc:24 +msgid "views_handler_sort_formula missing default: @formula" +msgstr "" + +#: includes/admin.inc:36 +msgid "If you enable the advanced help module, Views will provide more and better help. Hide this message." +msgstr "" + +#: includes/admin.inc:39 +msgid "If you install the advanced help module from !href, Views will provide more and better help. Hide this message." +msgstr "" + +#: includes/admin.inc:94;978 theme/theme.inc:96 views_export/views_export.module:128 +msgid "Export" +msgstr "" + +#: includes/admin.inc:95;983 theme/theme.inc:101 +msgid "Clone" +msgstr "" + +#: includes/admin.inc:98 +msgid "Revert" +msgstr "" + +#: includes/admin.inc:98;634;847 includes/convert.inc:35;108 +msgid "Delete" +msgstr "" + +#: includes/admin.inc:103 +msgid "Disable" +msgstr "" + +#: includes/admin.inc:106 +msgid "Enable" +msgstr "" + +#: includes/admin.inc:112 +msgid "Warning! Broken view!" +msgstr "" + +#: includes/admin.inc:127 includes/view.inc:1666 +msgid "Broken" +msgstr "" + +#: includes/admin.inc:189 +msgid "Install the advanced help module for the getting started" +msgstr "" + +#: includes/admin.inc:192 +msgid "Not sure what to do? Try the \"!getting-started\" page." +msgstr "" + +#: includes/admin.inc:206;213;2131 +msgid "" +msgstr "" + +#: includes/admin.inc:207 plugins/views_plugin_style.inc:76 +msgid "" +msgstr "" + +#: includes/admin.inc:211 +msgid "Storage" +msgstr "" + +#: includes/admin.inc:214;214 includes/view.inc:1165;1215 +msgid "Normal" +msgstr "" + +#: includes/admin.inc:228;275 modules/node.views.inc:140 plugins/views_plugin_display_page.inc:273 +msgid "Type" +msgstr "" + +#: includes/admin.inc:246;273;1063 views_export/views_export.module:146 +msgid "Tag" +msgstr "" + +#: includes/admin.inc:262 +msgid "Displays" +msgstr "" + +#: includes/admin.inc:269 +msgid "Sort by" +msgstr "" + +#: includes/admin.inc:271 modules/system.views.inc:69 modules/user.views.inc:59;79 plugins/views_plugin_display.inc:580 +msgid "Name" +msgstr "" + +#: includes/admin.inc:274;391 modules/statistics.views.inc:149 modules/system.views.inc:88 plugins/views_plugin_display_page.inc:202 +msgid "Path" +msgstr "" + +#: includes/admin.inc:276 includes/convert.inc:21 modules/upload.views.inc:56 views_export/views_export.module:146 +msgid "Description" +msgstr "" + +#: includes/admin.inc:283 +msgid "Order" +msgstr "" + +#: includes/admin.inc:285 +msgid "Up" +msgstr "" + +#: includes/admin.inc:286 +msgid "Down" +msgstr "" + +#: includes/admin.inc:370;401 +msgid "Query" +msgstr "" + +#: includes/admin.inc:372 +msgid "These queries were run during view rendering:" +msgstr "" + +#: includes/admin.inc:377 +msgid "[@time ms]" +msgstr "" + +#: includes/admin.inc:380 +msgid "Other queries" +msgstr "" + +#: includes/admin.inc:388 +msgid "This display has no path." +msgstr "" + +#: includes/admin.inc:393 +msgid "Query build time" +msgstr "" + +#: includes/admin.inc:393;394;395 +msgid "@time ms" +msgstr "" + +#: includes/admin.inc:394 +msgid "Query execute time" +msgstr "" + +#: includes/admin.inc:395 +msgid "View render time" +msgstr "" + +#: includes/admin.inc:401 +msgid "No query was run" +msgstr "" + +#: includes/admin.inc:408 +msgid "Unable to preview due to validation errors." +msgstr "" + +#: includes/admin.inc:459 +msgid "Display" +msgstr "" + +#: includes/admin.inc:467 includes/view.inc:1870 +msgid "Arguments" +msgstr "" + +#: includes/admin.inc:469 +msgid "Separate arguments with a / as though they were a URL path." +msgstr "" + +#: includes/admin.inc:475 +msgid "Preview" +msgstr "" + +#: includes/admin.inc:513 +msgid "Clone view %view" +msgstr "" + +#: includes/admin.inc:526;713 includes/convert.inc:20 +msgid "View name" +msgstr "" + +#: includes/admin.inc:527 +msgid "This is the unique name of the view. It must contain only alphanumeric characters and underscores; it is used to identify the view internally and to generate unique theming template names for this view. If overriding a module provided view, the name must not be changed or instead a new view will be created." +msgstr "" + +#: includes/admin.inc:535;1826 +msgid "View description" +msgstr "" + +#: includes/admin.inc:536;1827 +msgid "This description will appear on the Views administrative UI to tell you what the view is about." +msgstr "" + +#: includes/admin.inc:542;1833 +msgid "View tag" +msgstr "" + +#: includes/admin.inc:543;1834 +msgid "Enter an optional tag for this view; it is used only to help sort views on the administrative page." +msgstr "" + +#: includes/admin.inc:555 +msgid "View type" +msgstr "" + +#: includes/admin.inc:556 +msgid "The view type is the primary table for which information is being retrieved. The view type controls what arguments, fields, sort criteria and filters are available, so once this is set it cannot be changed." +msgstr "" + +#: includes/admin.inc:567 +msgid "Next" +msgstr "" + +#: includes/admin.inc:583;758 +msgid "View name must be alphanumeric or underscores only." +msgstr "" + +#: includes/admin.inc:589 +msgid "You must use a unique name for this view." +msgstr "" + +#: includes/admin.inc:622 +msgid "Are you sure you want to revert the view %name?" +msgstr "" + +#: includes/admin.inc:623 +msgid "Reverting the view will delete the view that is in the database, reverting it to the original default view. Any changes you have made will be lost and cannot be recovered." +msgstr "" + +#: includes/admin.inc:626 includes/convert.inc:105 +msgid "Are you sure you want to delete the view %name?" +msgstr "" + +#: includes/admin.inc:627 +msgid "Deleting a view cannot be undone." +msgstr "" + +#: includes/admin.inc:635;671;840;1329 includes/convert.inc:109 +msgid "Cancel" +msgstr "" + +#: includes/admin.inc:644 +msgid "The view has been deleted." +msgstr "" + +#: includes/admin.inc:656 +msgid "There is no lock on view %view to break." +msgstr "" + +#: includes/admin.inc:666 +msgid "Are you sure you want to break the lock on view %name?" +msgstr "" + +#: includes/admin.inc:669 +msgid "By breaking this lock, any unsaved changes made by !user will be lost!" +msgstr "" + +#: includes/admin.inc:670 +msgid "Break lock" +msgstr "" + +#: includes/admin.inc:680 +msgid "The lock has been broken and you may now edit this view." +msgstr "" + +#: includes/admin.inc:687 +msgid "Edit view %view" +msgstr "" + +#: includes/admin.inc:714 +msgid "Enter the name to use for this view if it is different from the source view. Leave blank to use the name of the view." +msgstr "" + +#: includes/admin.inc:719 +msgid "Paste view code here" +msgstr "" + +#: includes/admin.inc:741 +msgid "Unable to interpret view code." +msgstr "" + +#: includes/admin.inc:749 +msgid "You are importing a view created in Views version 1. You may need to adjust some parameters to work correctly in version 2." +msgstr "" + +#: includes/admin.inc:752 +msgid "That view is not compatible with this version of Views." +msgstr "" + +#: includes/admin.inc:767 +msgid "A view by that name already exists; please choose a different name" +msgstr "" + +#: includes/admin.inc:776 +msgid "Display plugin @plugin is not available." +msgstr "" + +#: includes/admin.inc:783 +msgid "Style plugin @plugin is not available." +msgstr "" + +#: includes/admin.inc:789 +msgid "Row plugin @plugin is not available." +msgstr "" + +#: includes/admin.inc:799 +msgid "@type handler @table.@field is not available." +msgstr "" + +#: includes/admin.inc:812 +msgid "Unable to import view." +msgstr "" + +#: includes/admin.inc:833;861 +msgid "Save" +msgstr "" + +#: includes/admin.inc:885 +msgid "The view has been saved." +msgstr "" + +#: includes/admin.inc:929 +msgid "Unknown or missing table name" +msgstr "" + +#: includes/admin.inc:934 +msgid "Click on an item to edit that item's details." +msgstr "" + +#: includes/admin.inc:937 +msgid "This view has a broken default display and cannot be used." +msgstr "" + +#: includes/admin.inc:979 theme/theme.inc:97 +msgid "Export this view" +msgstr "" + +#: includes/admin.inc:984 theme/theme.inc:102 +msgid "Create a copy of this view" +msgstr "" + +#: includes/admin.inc:995 +msgid "View \"!display\"" +msgstr "" + +#: includes/admin.inc:996 +msgid "Go to the real page for this display" +msgstr "" + +#: includes/admin.inc:1062;3008 includes/plugins.inc:218 plugins/views_plugin_display.inc:587;704;723 plugins/views_plugin_display_attachment.inc:90 plugins/views_plugin_display_block.inc:73 plugins/views_plugin_display_feed.inc:108 plugins/views_plugin_display_page.inc:193 +msgid "None" +msgstr "" + +#: includes/admin.inc:1140 +msgid "Invalid" +msgstr "" + +#: includes/admin.inc:1141 +msgid "Error: Display @display refers to a plugin named '@plugin', but that plugin doesn't exist!" +msgstr "" + +#: includes/admin.inc:1176;1176 +msgid "Rearrange" +msgstr "" + +#: includes/admin.inc:1216;2216;2391;2459;2544 +msgid "Error: handler for @table > @field doesn't exist!" +msgstr "" + +#: includes/admin.inc:1235;1235;1244 +msgid "Settings" +msgstr "" + +#: includes/admin.inc:1240 plugins/views_plugin_display.inc:598;616 +msgid "Missing style plugin" +msgstr "" + +#: includes/admin.inc:1244 plugins/views_plugin_display.inc:611;626 +msgid "Change settings for this style" +msgstr "" + +#: includes/admin.inc:1247 +msgid "  Style: !style" +msgstr "" + +#: includes/admin.inc:1278 +msgid "Invalid display id found while regenerating tabs" +msgstr "" + +#: includes/admin.inc:1311 +msgid "Update" +msgstr "" + +#: includes/admin.inc:1329 +msgid "Ok" +msgstr "" + +#: includes/admin.inc:1600 +msgid "Unable to initialize default display" +msgstr "" + +#: includes/admin.inc:1632 +msgid "Add display" +msgstr "" + +#: includes/admin.inc:1672 +msgid "Remove display" +msgstr "" + +#: includes/admin.inc:1683 +msgid "Restore display" +msgstr "" + +#: includes/admin.inc:1755 +msgid "Analyze" +msgstr "" + +#: includes/admin.inc:1767 +msgid "View analysis" +msgstr "" + +#: includes/admin.inc:1821 +msgid "View details" +msgstr "" + +#: includes/admin.inc:1862;1916;1971;2117;2209;2384;2452;2537 +msgid "Invalid display id @display" +msgstr "" + +#: includes/admin.inc:1920 +msgid "Configure @type" +msgstr "" + +#: includes/admin.inc:1975 +msgid "Rearrange @type" +msgstr "" + +#: includes/admin.inc:2018 +msgid "Broken field @id" +msgstr "" + +#: includes/admin.inc:2058;2067;2300 +msgid "Remove" +msgstr "" + +#: includes/admin.inc:2058;2058 +msgid "Remove this item" +msgstr "" + +#: includes/admin.inc:2064 +msgid "No fields available." +msgstr "" + +#: includes/admin.inc:2067 modules/book.views.inc:57 modules/taxonomy.views.inc:135 modules/upload.views.inc:90 plugins/views_plugin_display_page.inc:312 +msgid "Weight" +msgstr "" + +#: includes/admin.inc:2123 +msgid "Add @type" +msgstr "" + +#: includes/admin.inc:2134 +msgid "Groups" +msgstr "" + +#: includes/admin.inc:2153 +msgid "!group: !field" +msgstr "" + +#: includes/admin.inc:2162 +msgid "There are no @types available to add." +msgstr "" + +#: includes/admin.inc:2259 +msgid "Do not use a relationship" +msgstr "" + +#: includes/admin.inc:2273 includes/view.inc:1894;1895 +msgid "Relationship" +msgstr "" + +#: includes/admin.inc:2286 +msgid "Configure @type %item" +msgstr "" + +#: includes/admin.inc:2399 +msgid "Configure extra settings for @type %item" +msgstr "" + +#: includes/admin.inc:2464 +msgid "Change summary style for @type %item" +msgstr "" + +#: includes/admin.inc:2487;2501 +msgid "Internal error: broken plugin." +msgstr "" + +#: includes/admin.inc:2551 +msgid "Configure summary style for @type %item" +msgstr "" + +#: includes/admin.inc:2643 +msgid "Clear Views' cache" +msgstr "" + +#: includes/admin.inc:2649 +msgid "Add Views signature to all SQL queries" +msgstr "" + +#: includes/admin.inc:2650 +msgid "All Views-generated queries will include a special 'VIEWS' = 'VIEWS' string in the WHERE clause. This makes identifying Views queries in database server logs simpler, but should only be used when troubleshooting." +msgstr "" + +#: includes/admin.inc:2656 +msgid "Disable views data caching" +msgstr "" + +#: includes/admin.inc:2657 +msgid "Views caches data about tables, modules and views available, to increase performance. By checking this box, Views will skip this cache and always rebuild this data when needed. This can have a serious performance impact on your site." +msgstr "" + +#: includes/admin.inc:2663 +msgid "Ignore missing advanced help module" +msgstr "" + +#: includes/admin.inc:2664 +msgid "Views uses the advanced help module to provide help text; if this module is not present Views will complain, unless this setting is checked." +msgstr "" + +#: includes/admin.inc:2670 +msgid "Show query above live preview" +msgstr "" + +#: includes/admin.inc:2671 +msgid "The live preview feature will show you the output of the view you're creating, as well as the view. Check here to show the query and other information above the view; leave this unchecked to show that information below the view." +msgstr "" + +#: includes/admin.inc:2677 +msgid "Show other queries run during render during live preview" +msgstr "" + +#: includes/admin.inc:2678 +msgid "Drupal has the potential to run many queries while a view is being rendered. Checking this box will display every query run during view render as part of the live preview." +msgstr "" + +#: includes/admin.inc:2684 +msgid "Do not show hover links over views" +msgstr "" + +#: includes/admin.inc:2685 +msgid "To make it easier to administrate your views, Views provides 'hover' links to take you to the edit and export screen of a view whenever the view is used. This can be distracting on some themes, though; if it is problematic, you can turn it off here." +msgstr "" + +#: includes/admin.inc:2691 +msgid "Enable views performance statistics via the Devel module" +msgstr "" + +#: includes/admin.inc:2692 +msgid "Check this to enable some Views query and performance statistics if Devel is installed." +msgstr "" + +#: includes/admin.inc:2698 +msgid "Disable javascript with Views" +msgstr "" + +#: includes/admin.inc:2699 +msgid "If you are having problems with the javascript, you can disable it here; the Views UI should degrade and still be usable without javascript, it just not as good." +msgstr "" + +#: includes/admin.inc:2707 +msgid "Page region to output performance statistics" +msgstr "" + +#: includes/admin.inc:2720 +msgid "The cache has been cleared." +msgstr "" + +#: includes/admin.inc:2886 +msgid "Error: missing @component" +msgstr "" + +#: includes/admin.inc:2972 includes/view.inc:1865 +msgid "Field" +msgstr "" + +#: includes/admin.inc:2973 +msgid "Column" +msgstr "" + +#: includes/admin.inc:2976 +msgid "Sortable" +msgstr "" + +#: includes/admin.inc:2980 +msgid "Default sort" +msgstr "" + +#: includes/ajax.inc:82 +msgid "Server reports invalid input error." +msgstr "" + +#: includes/ajax.inc:83 +msgid "Error" +msgstr "" + +#: includes/analyze.inc:38 +msgid "View analysis can find nothing to report." +msgstr "" + +#: includes/analyze.inc:104 +msgid "This view has only a default display and therefore will not be placed anywhere on your site; perhaps you want to add a page or a block display." +msgstr "" + +#: includes/convert.inc:14 +msgid "There are no Views 1 views stored in the database to convert." +msgstr "" + +#: includes/convert.inc:22 +msgid "Operations" +msgstr "" + +#: includes/convert.inc:33 +msgid "Converted" +msgstr "" + +#: includes/convert.inc:68 +msgid "The table below lists Views version 1 views that are stored in the database. You can either convert them to work in Views version 2, or delete them. The views are convertible only if there is no Views 2 view with the same name." +msgstr "" + +#: includes/convert.inc:79 +msgid "Unable to find view." +msgstr "" + +#: includes/convert.inc:89 +msgid "Unable to convert view." +msgstr "" + +#: includes/convert.inc:107 +msgid "This action cannot be undone." +msgstr "" + +#: includes/convert.inc:117 +msgid "The view has been deleted" +msgstr "" + +#: includes/form.inc:249 +msgid "Validation error, please try again. If this error persists, please contact the site administrator." +msgstr "" + +#: includes/handlers.inc:43 +msgid "Handler @handler include tried to loop infinitely!" +msgstr "" + +#: includes/handlers.inc:269 +msgid "!group: !title" +msgstr "" + +#: includes/handlers.inc:507 +msgid "Reduce duplicates" +msgstr "" + +#: includes/handlers.inc:508 +msgid "This filter can cause items that have more than one of the selected options to appear as duplicate results. If this filter causes duplicate results to occur, this checkbox can reduce those duplicates; however, the more terms it has to search for, the less performant the query will be, so use this with caution." +msgstr "" + +#: includes/plugins.inc:26 +msgid "Default settings for this view." +msgstr "" + +#: includes/plugins.inc:40 +msgid "Display the view as a page, with a URL and menu links." +msgstr "" + +#: includes/plugins.inc:51;60 +msgid "Block" +msgstr "" + +#: includes/plugins.inc:52 +msgid "Display the view as a block." +msgstr "" + +#: includes/plugins.inc:64 +msgid "Attachment" +msgstr "" + +#: includes/plugins.inc:65 +msgid "Attachments added to other displays to achieve multiple views in the same view." +msgstr "" + +#: includes/plugins.inc:73 +msgid "Display the view as a feed, such as an RSS feed." +msgstr "" + +#: includes/plugins.inc:93;144 +msgid "Unformatted" +msgstr "" + +#: includes/plugins.inc:94 +msgid "Displays rows one after another." +msgstr "" + +#: includes/plugins.inc:104 +msgid "HTML List" +msgstr "" + +#: includes/plugins.inc:105 +msgid "Displays rows as an HTML list." +msgstr "" + +#: includes/plugins.inc:114 +msgid "Grid" +msgstr "" + +#: includes/plugins.inc:115 +msgid "Displays rows in a grid." +msgstr "" + +#: includes/plugins.inc:124 +msgid "Table" +msgstr "" + +#: includes/plugins.inc:125 +msgid "Displays rows in a table." +msgstr "" + +#: includes/plugins.inc:136 +msgid "Displays the default summary as a list." +msgstr "" + +#: includes/plugins.inc:145 +msgid "Displays the summary unformatted, with option for one after another or inline." +msgstr "" + +#: includes/plugins.inc:154 +msgid "RSS Feed" +msgstr "" + +#: includes/plugins.inc:155 +msgid "Generates an RSS feed from a view." +msgstr "" + +#: includes/plugins.inc:173 includes/view.inc:1863 +msgid "Fields" +msgstr "" + +#: includes/plugins.inc:174 +msgid "Displays the fields with an optional template." +msgstr "" + +#: includes/plugins.inc:187 +msgid "Fixed entry" +msgstr "" + +#: includes/plugins.inc:191;203 +msgid "PHP Code" +msgstr "" + +#: includes/plugins.inc:207 +msgid "Numeric" +msgstr "" + +#: includes/plugins.inc:219 +msgid "Will be available to all users." +msgstr "" + +#: includes/plugins.inc:224 plugins/views_plugin_access_role.inc:40 +msgid "Role" +msgstr "" + +#: includes/plugins.inc:225 +msgid "Access will be granted to users with any of the specified roles." +msgstr "" + +#: includes/plugins.inc:231 plugins/views_plugin_access_perm.inc:35 +msgid "Permission" +msgstr "" + +#: includes/plugins.inc:232 +msgid "Access will be granted to users with the specified permission string." +msgstr "" + +#: includes/view.inc:261 +msgid "set_display() called with invalid display id @display." +msgstr "" + +#: includes/view.inc:1063 +msgid "Home" +msgstr "" + +#: includes/view.inc:1864 +msgid "fields" +msgstr "" + +#: includes/view.inc:1866 +msgid "field" +msgstr "" + +#: includes/view.inc:1871 +msgid "arguments" +msgstr "" + +#: includes/view.inc:1872;1873 +msgid "Argument" +msgstr "" + +#: includes/view.inc:1877 +msgid "Sort criteria" +msgstr "" + +#: includes/view.inc:1878 +msgid "sort criteria" +msgstr "" + +#: includes/view.inc:1879 +msgid "Sort criterion" +msgstr "" + +#: includes/view.inc:1880 +msgid "sort criterion" +msgstr "" + +#: includes/view.inc:1884 +msgid "Filters" +msgstr "" + +#: includes/view.inc:1885 +msgid "filters" +msgstr "" + +#: includes/view.inc:1886 +msgid "Filter" +msgstr "" + +#: includes/view.inc:1887 +msgid "filter" +msgstr "" + +#: includes/view.inc:1892 +msgid "Relationships" +msgstr "" + +#: includes/view.inc:1893 +msgid "relationships" +msgstr "" + +#: js/ajax.js:0;0;0;0;0;0;0 js/ajax_view.js:0;0;0 +msgid "An error occurred at @path." +msgstr "" + +#: js/tabs.js:0 +msgid "jQuery UI Tabs: Mismatching fragment identifier." +msgstr "" + +#: js/tabs.js:0 +msgid "jQuery UI Tabs: Not enough arguments to add tab." +msgstr "" + +#: modules/book.views.inc:21;36;46;99 +msgid "Book" +msgstr "" + +#: modules/book.views.inc:30 +msgid "Top level book" +msgstr "" + +#: modules/book.views.inc:31 +msgid "The book the node is in." +msgstr "" + +#: modules/book.views.inc:58 +msgid "The weight of the book page." +msgstr "" + +#: modules/book.views.inc:69 modules/comment.views.inc:202 modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:24 +msgid "Depth" +msgstr "" + +#: modules/book.views.inc:70 +msgid "The depth of the book page in the hierarchy; top level books have a depth of 1." +msgstr "" + +#: modules/book.views.inc:87 +msgid "Hierarchy" +msgstr "" + +#: modules/book.views.inc:88 +msgid "The order of pages in the book hierarchy. Remember to sort by weight too if you want exactly the right order." +msgstr "" + +#: modules/book.views.inc:110 modules/taxonomy.views.inc:259 +msgid "Parent" +msgstr "" + +#: modules/book.views.inc:111 +msgid "The parent book node." +msgstr "" + +#: modules/book.views.inc:116 +msgid "Book parent" +msgstr "" + +#: modules/comment.views.inc:22;26;384;395 +msgid "Comment" +msgstr "" + +#: modules/comment.views.inc:27 +msgid "Comments are responses to node content." +msgstr "" + +#: modules/comment.views.inc:45 +msgid "The title of the comment." +msgstr "" + +#: modules/comment.views.inc:63 modules/node.views.inc:358 +msgid "Body" +msgstr "" + +#: modules/comment.views.inc:64 +msgid "The text of the comment." +msgstr "" + +#: modules/comment.views.inc:76 +msgid "ID" +msgstr "" + +#: modules/comment.views.inc:77 +msgid "The comment ID of the field" +msgstr "" + +#: modules/comment.views.inc:95 +msgid "Author" +msgstr "" + +#: modules/comment.views.inc:96 +msgid "The name of the poster." +msgstr "" + +#: modules/comment.views.inc:114 +msgid "Author's website" +msgstr "" + +#: modules/comment.views.inc:115 +msgid "The website address of the comment's author. Can be a link. The homepage can also be linked with the Name field. Will be empty if posted by a registered user." +msgstr "" + +#: modules/comment.views.inc:133 modules/node.views.inc:108 +msgid "Post date" +msgstr "" + +#: modules/comment.views.inc:134 +msgid "Date and time of when the comment was posted." +msgstr "" + +#: modules/comment.views.inc:149 +msgid "In moderation" +msgstr "" + +#: modules/comment.views.inc:150 +msgid "Whether or not the comment is currently in moderation." +msgstr "" + +#: modules/comment.views.inc:157 modules/node.views.inc:204;213 +msgid "Moderated" +msgstr "" + +#: modules/comment.views.inc:167 +msgid "View link" +msgstr "" + +#: modules/comment.views.inc:168 +msgid "Provide a simple link to view the comment." +msgstr "" + +#: modules/comment.views.inc:176 modules/node.views.inc:250 modules/user.views.inc:202 +msgid "Edit link" +msgstr "" + +#: modules/comment.views.inc:177 +msgid "Provide a simple link to edit the comment." +msgstr "" + +#: modules/comment.views.inc:185 modules/node.views.inc:258;472 modules/user.views.inc:210 +msgid "Delete link" +msgstr "" + +#: modules/comment.views.inc:186 +msgid "Provide a simple link to delete the comment." +msgstr "" + +#: modules/comment.views.inc:194 +msgid "Reply-to link" +msgstr "" + +#: modules/comment.views.inc:195 +msgid "Provide a simple link to reply to the comment." +msgstr "" + +#: modules/comment.views.inc:203 +msgid "Display the depth of the comment if it is threaded." +msgstr "" + +#: modules/comment.views.inc:207 +msgid "Thread" +msgstr "" + +#: modules/comment.views.inc:208 +msgid "Sort by the threaded order. This will keep child comments together with their parents." +msgstr "" + +#: modules/comment.views.inc:214;220;255 modules/node.views.inc:24;29;90;357;372;484;616;627;639 modules/upload.views.inc:43 +msgid "Node" +msgstr "" + +#: modules/comment.views.inc:215 +msgid "The node the comment is a reply to." +msgstr "" + +#: modules/comment.views.inc:225;231 modules/node.views.inc:345 modules/statistics.views.inc:204 modules/user.views.inc:23;27;219 +msgid "User" +msgstr "" + +#: modules/comment.views.inc:226 +msgid "The user who wrote the comment." +msgstr "" + +#: modules/comment.views.inc:236 +msgid "Parent CID" +msgstr "" + +#: modules/comment.views.inc:237 +msgid "The Comment ID of the parent comment." +msgstr "" + +#: modules/comment.views.inc:242;247 +msgid "Parent comment" +msgstr "" + +#: modules/comment.views.inc:243 +msgid "The parent comment." +msgstr "" + +#: modules/comment.views.inc:268 +msgid "Last comment time" +msgstr "" + +#: modules/comment.views.inc:269 +msgid "Date and time of when the last comment was posted." +msgstr "" + +#: modules/comment.views.inc:284 +msgid "Last comment author" +msgstr "" + +#: modules/comment.views.inc:285 +msgid "The name of the author of the last posted comment." +msgstr "" + +#: modules/comment.views.inc:297 +msgid "Comment count" +msgstr "" + +#: modules/comment.views.inc:298 +msgid "The number of comments a node has." +msgstr "" + +#: modules/comment.views.inc:316 +msgid "Updated/commented date" +msgstr "" + +#: modules/comment.views.inc:317 +msgid "The most recent of last comment posted or node updated time." +msgstr "" + +#: modules/comment.views.inc:340 +msgid "New comments" +msgstr "" + +#: modules/comment.views.inc:341 +msgid "The number of new comments on the node." +msgstr "" + +#: modules/comment.views.inc:349 +msgid "Comment status" +msgstr "" + +#: modules/comment.views.inc:350 +msgid "Whether comments are enabled or disabled on the node." +msgstr "" + +#: modules/comment.views.inc:364 +msgid "User posted or commented" +msgstr "" + +#: modules/comment.views.inc:365 +msgid "Display comments only if a user posted the node or commented on the node." +msgstr "" + +#: modules/comment.views.inc:385 +msgid "Display the comment with standard comment view." +msgstr "" + +#: modules/comment.views.inc:396 +msgid "Display the comment as RSS." +msgstr "" + +#: modules/node.views.inc:30 +msgid "Nodes are a Drupal site's primary content." +msgstr "" + +#: modules/node.views.inc:57 +msgid "Nid" +msgstr "" + +#: modules/node.views.inc:58 +msgid "The node ID of the node." +msgstr "" + +#: modules/node.views.inc:86;414 +msgid "The title of the node." +msgstr "" + +#: modules/node.views.inc:109 +msgid "The date the node was posted." +msgstr "" + +#: modules/node.views.inc:124 +msgid "Updated date" +msgstr "" + +#: modules/node.views.inc:125 +msgid "The date the node was last updated." +msgstr "" + +#: modules/node.views.inc:141 +msgid "The type of a node (for example, \"blog entry\", \"forum post\", \"story\", etc)." +msgstr "" + +#: modules/node.views.inc:159;167;181 modules/translation.views.inc:106 modules/upload.views.inc:82 +msgid "Published" +msgstr "" + +#: modules/node.views.inc:160 +msgid "The published status of the node." +msgstr "" + +#: modules/node.views.inc:176 +msgid "Published or admin" +msgstr "" + +#: modules/node.views.inc:177 +msgid "Filters out unpublished nodes if the current user cannot view them." +msgstr "" + +#: modules/node.views.inc:187;195 +msgid "Promoted to front page" +msgstr "" + +#: modules/node.views.inc:188 +msgid "The front page of the node." +msgstr "" + +#: modules/node.views.inc:205 +msgid "Whether or not the node is moderated." +msgstr "" + +#: modules/node.views.inc:222;231 +msgid "Sticky" +msgstr "" + +#: modules/node.views.inc:223 +msgid "Whether or not the node is sticky." +msgstr "" + +#: modules/node.views.inc:242 +msgid "Link" +msgstr "" + +#: modules/node.views.inc:243 +msgid "Provide a simple link to the node." +msgstr "" + +#: modules/node.views.inc:251 +msgid "Provide a simple link to edit the node." +msgstr "" + +#: modules/node.views.inc:259 +msgid "Provide a simple link to delete the node." +msgstr "" + +#: modules/node.views.inc:267;448 modules/user.views.inc:123 +msgid "Created date" +msgstr "" + +#: modules/node.views.inc:268 +msgid "In the form of CCYYMMDD." +msgstr "" + +#: modules/node.views.inc:276 +msgid "Created year + month" +msgstr "" + +#: modules/node.views.inc:277 +msgid "In the form of YYYYMM." +msgstr "" + +#: modules/node.views.inc:285 +msgid "Created year" +msgstr "" + +#: modules/node.views.inc:286 +msgid "In the form of YYYY." +msgstr "" + +#: modules/node.views.inc:294 +msgid "Created month" +msgstr "" + +#: modules/node.views.inc:295 +msgid "In the form of MM (01 - 12)." +msgstr "" + +#: modules/node.views.inc:303 +msgid "Created day" +msgstr "" + +#: modules/node.views.inc:304 +msgid "In the form of DD (01 - 31)." +msgstr "" + +#: modules/node.views.inc:312 +msgid "Created week" +msgstr "" + +#: modules/node.views.inc:313 +msgid "In the form of WW (01 - 53)." +msgstr "" + +#: modules/node.views.inc:325;330 +msgid "Node revision" +msgstr "" + +#: modules/node.views.inc:331 +msgid "Node revisions are a history of changes to nodes." +msgstr "" + +#: modules/node.views.inc:346 +msgid "Relate a node revision to the user who created the revision." +msgstr "" + +#: modules/node.views.inc:351 +msgid "user" +msgstr "" + +#: modules/node.views.inc:359 +msgid "The actual, full data in the body field; this may not be valid data on all node types." +msgstr "" + +#: modules/node.views.inc:373 +msgid "Teaser" +msgstr "" + +#: modules/node.views.inc:374 +msgid "The stored teaser field. This may not be valid or useful data on all node types." +msgstr "" + +#: modules/node.views.inc:387 +msgid "Vid" +msgstr "" + +#: modules/node.views.inc:388 +msgid "The revision ID of the node revision." +msgstr "" + +#: modules/node.views.inc:434 +msgid "Log message" +msgstr "" + +#: modules/node.views.inc:435 +msgid "The log message entered when the revision was created." +msgstr "" + +#: modules/node.views.inc:449 +msgid "The date the node revision was created." +msgstr "" + +#: modules/node.views.inc:464 +msgid "Revert link" +msgstr "" + +#: modules/node.views.inc:465 +msgid "Provide a simple link to revert to the revision." +msgstr "" + +#: modules/node.views.inc:473 +msgid "Provide a simple link to delete the node revision." +msgstr "" + +#: modules/node.views.inc:500 +msgid "Has new content" +msgstr "" + +#: modules/node.views.inc:503 +msgid "Show a marker if the node has new or updated content." +msgstr "" + +#: modules/node.views.inc:506 +msgid "Show only nodes that have new content." +msgstr "" + +#: modules/node.views.inc:617;628 +msgid "Display the node with standard node view." +msgstr "" + +#: modules/node.views.inc:646 +msgid "Node ID from URL" +msgstr "" + +#: modules/node.views.inc:708 +msgid "Display %display has no access control but does not contain a filter for published nodes." +msgstr "" + +#: modules/poll.views.inc:23 +msgid "Poll" +msgstr "" + +#: modules/poll.views.inc:38;47 modules/user.views.inc:171;180 +msgid "Active" +msgstr "" + +#: modules/poll.views.inc:39 +msgid "Whether the poll is open for voting." +msgstr "" + +#: modules/profile.views.inc:20;40 +msgid "Profile" +msgstr "" + +#: modules/profile.views.inc:100 +msgid "@field-name" +msgstr "" + +#: modules/profile.views.inc:107 +msgid "Profile textfield" +msgstr "" + +#: modules/profile.views.inc:126 +msgid "Profile textarea" +msgstr "" + +#: modules/profile.views.inc:142 +msgid "Profile checkbox" +msgstr "" + +#: modules/profile.views.inc:159 +msgid "Profile URL" +msgstr "" + +#: modules/profile.views.inc:175 +msgid "Profile selection" +msgstr "" + +#: modules/profile.views.inc:195 +msgid "Profile freeform list %field-name." +msgstr "" + +#: modules/profile.views.inc:207 +msgid "Profile date %field-name." +msgstr "" + +#: modules/search.views.inc:23;77;88;106;163 +msgid "Search" +msgstr "" + +#: modules/search.views.inc:72 +msgid "Score" +msgstr "" + +#: modules/search.views.inc:73 +msgid "The score of the search item." +msgstr "" + +#: modules/search.views.inc:95 +msgid "Links from" +msgstr "" + +#: modules/search.views.inc:96 +msgid "Nodes that link from the node." +msgstr "" + +#: modules/search.views.inc:113 +msgid "Links to" +msgstr "" + +#: modules/search.views.inc:114 +msgid "Nodes that link to the node." +msgstr "" + +#: modules/search.views.inc:125 +msgid "Search Terms" +msgstr "" + +#: modules/search.views.inc:126 +msgid "The terms to search for." +msgstr "" + +#: modules/search.views.inc:164 +msgid "Display the results with standard search view." +msgstr "" + +#: modules/statistics.views.inc:24 +msgid "Node statistics" +msgstr "" + +#: modules/statistics.views.inc:36 +msgid "Total views" +msgstr "" + +#: modules/statistics.views.inc:37 +msgid "The total number of times the node has been viewed." +msgstr "" + +#: modules/statistics.views.inc:53 +msgid "Views today" +msgstr "" + +#: modules/statistics.views.inc:54 +msgid "The total number of times the node has been viewed today." +msgstr "" + +#: modules/statistics.views.inc:70 +msgid "Most recent view" +msgstr "" + +#: modules/statistics.views.inc:71 +msgid "The most recent time the node has been viewed." +msgstr "" + +#: modules/statistics.views.inc:89;94 +msgid "Access log" +msgstr "" + +#: modules/statistics.views.inc:95 +msgid "Stores site access information." +msgstr "" + +#: modules/statistics.views.inc:109 +msgid "Session ID" +msgstr "" + +#: modules/statistics.views.inc:110 +msgid "Browser session ID of user that visited page." +msgstr "" + +#: modules/statistics.views.inc:129 +msgid "Page title" +msgstr "" + +#: modules/statistics.views.inc:130 +msgid "Title of page visited." +msgstr "" + +#: modules/statistics.views.inc:150 +msgid "Internal path to page visited (relative to Drupal root.)" +msgstr "" + +#: modules/statistics.views.inc:169 +msgid "Referrer" +msgstr "" + +#: modules/statistics.views.inc:170 +msgid "Referrer URI." +msgstr "" + +#: modules/statistics.views.inc:185 +msgid "Hostname" +msgstr "" + +#: modules/statistics.views.inc:186 +msgid "Hostname of user that visited the page." +msgstr "" + +#: modules/statistics.views.inc:205 +msgid "The user who visited the site." +msgstr "" + +#: modules/statistics.views.inc:215 +msgid "Timer" +msgstr "" + +#: modules/statistics.views.inc:216 +msgid "Time in milliseconds that the page took to load." +msgstr "" + +#: modules/statistics.views.inc:231 +msgid "Timestamp" +msgstr "" + +#: modules/statistics.views.inc:232 +msgid "Timestamp of when the page was visited." +msgstr "" + +#: modules/system.views.inc:25;30 +msgid "File" +msgstr "" + +#: modules/system.views.inc:31 +msgid "Files maintained by Drupal and various modules." +msgstr "" + +#: modules/system.views.inc:49 +msgid "File ID" +msgstr "" + +#: modules/system.views.inc:50 +msgid "The ID of the file." +msgstr "" + +#: modules/system.views.inc:70 +msgid "The name of the file." +msgstr "" + +#: modules/system.views.inc:89 +msgid "The path of the file." +msgstr "" + +#: modules/system.views.inc:107 +msgid "Mime type" +msgstr "" + +#: modules/system.views.inc:108 +msgid "The mime type of the file." +msgstr "" + +#: modules/system.views.inc:126 +msgid "Size" +msgstr "" + +#: modules/system.views.inc:127 +msgid "The size of the file." +msgstr "" + +#: modules/system.views.inc:142 +msgid "Status" +msgstr "" + +#: modules/system.views.inc:143 +msgid "The status of the file." +msgstr "" + +#: modules/system.views.inc:158 +msgid "Upload date" +msgstr "" + +#: modules/system.views.inc:159 +msgid "The date the file was uploaded." +msgstr "" + +#: modules/system.views.inc:204 +msgid "Temporary" +msgstr "" + +#: modules/system.views.inc:205 +msgid "Permanent" +msgstr "" + +#: modules/taxonomy.views.inc:24;67;152;170;226;266;303;314 +msgid "Taxonomy" +msgstr "" + +#: modules/taxonomy.views.inc:48 +msgid "Vocabulary name" +msgstr "" + +#: modules/taxonomy.views.inc:50 +msgid "Name of the vocabulary a term is a member of. This will be the vocabulary that whichever term the \"Taxonomy: Term\" field is; and can similarly cause duplicates." +msgstr "" + +#: modules/taxonomy.views.inc:56 +msgid "Vocabulary ID" +msgstr "" + +#: modules/taxonomy.views.inc:57 +msgid "The taxonomy vocabulary ID" +msgstr "" + +#: modules/taxonomy.views.inc:70;116;213 +msgid "Term" +msgstr "" + +#: modules/taxonomy.views.inc:71 +msgid "Taxonomy terms are attached to nodes." +msgstr "" + +#: modules/taxonomy.views.inc:96;196 modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:35 +msgid "Term ID" +msgstr "" + +#: modules/taxonomy.views.inc:97;197 +msgid "The taxonomy term ID" +msgstr "" + +#: modules/taxonomy.views.inc:117 +msgid "Taxonomy terms. Note that using this can cause duplicate nodes to appear in views; you must add filters to reduce the result set." +msgstr "" + +#: modules/taxonomy.views.inc:127 +msgid "Taxonomy term name." +msgstr "" + +#: modules/taxonomy.views.inc:136 +msgid "The term weight field" +msgstr "" + +#: modules/taxonomy.views.inc:148 +msgid "Term description" +msgstr "" + +#: modules/taxonomy.views.inc:149 +msgid "The description associated with a taxonomy term." +msgstr "" + +#: modules/taxonomy.views.inc:160 modules/taxonomy/views_handler_filter_term_node_tid.inc:37 +msgid "Vocabulary" +msgstr "" + +#: modules/taxonomy.views.inc:161 +msgid "Filter the results of \"Taxonomy: Term\" to a particular vocabulary." +msgstr "" + +#: modules/taxonomy.views.inc:199 +msgid "All terms" +msgstr "" + +#: modules/taxonomy.views.inc:200 +msgid "Display all taxonomy terms associated with a node from specified vocabularies." +msgstr "" + +#: modules/taxonomy.views.inc:254 +msgid "Parent term" +msgstr "" + +#: modules/taxonomy.views.inc:255 +msgid "The parent term of the term. This can produce duplicate entries if you are using a vocabulary that allows multiple parents." +msgstr "" + +#: modules/taxonomy.views.inc:287 +msgid "Term synonym" +msgstr "" + +#: modules/taxonomy.views.inc:288 +msgid "Term synonyms may be used to find terms by alternate names." +msgstr "" + +#: modules/taxonomy.views.inc:304 +msgid "Term ID (with depth)" +msgstr "" + +#: modules/taxonomy.views.inc:305 +msgid "The depth filter is more complex, so provides fewer options." +msgstr "" + +#: modules/taxonomy.views.inc:315 +msgid "Term ID depth modifier" +msgstr "" + +#: modules/taxonomy.views.inc:316 +msgid "Allows the \"depth\" for Taxonomy: Term ID (with depth) to be modified via an additional argument." +msgstr "" + +#: modules/taxonomy.views.inc:372 +msgid "Taxonomy term" +msgstr "" + +#: modules/translation.views.inc:31;48;80;97 +msgid "Node translation" +msgstr "" + +#: modules/translation.views.inc:32 modules/node/views_handler_filter_node_language.inc:9 modules/translation/views_handler_filter_node_language.inc:9 +msgid "Language" +msgstr "" + +#: modules/translation.views.inc:33 +msgid "The language the content is in." +msgstr "" + +#: modules/translation.views.inc:49 +msgid "Translation set node ID" +msgstr "" + +#: modules/translation.views.inc:50 +msgid "The ID of the translation set the content belongs to." +msgstr "" + +#: modules/translation.views.inc:69;74 +msgid "Source translation" +msgstr "" + +#: modules/translation.views.inc:70 +msgid "The source that this content was translated from." +msgstr "" + +#: modules/translation.views.inc:81;84;91 +msgid "Translations" +msgstr "" + +#: modules/translation.views.inc:82;85 +msgid "Versions of content in different languages." +msgstr "" + +#: modules/translation.views.inc:98 +msgid "Translation status" +msgstr "" + +#: modules/translation.views.inc:99 +msgid "The translation status of the node--whether or not the translation needs to be updated." +msgstr "" + +#: modules/upload.views.inc:25;112 +msgid "Upload" +msgstr "" + +#: modules/upload.views.inc:44 +msgid "The node the uploaded file is attached to" +msgstr "" + +#: modules/upload.views.inc:46 +msgid "upload" +msgstr "" + +#: modules/upload.views.inc:57 +msgid "The description of the uploaded file." +msgstr "" + +#: modules/upload.views.inc:74 +msgid "Listed" +msgstr "" + +#: modules/upload.views.inc:75 +msgid "Whether or not the file is marked to be listed." +msgstr "" + +#: modules/upload.views.inc:91 +msgid "The weight, used for sorting." +msgstr "" + +#: modules/upload.views.inc:113;125 +msgid "Attached files" +msgstr "" + +#: modules/upload.views.inc:114 +msgid "All files attached to a node with upload.module." +msgstr "" + +#: modules/upload.views.inc:121 modules/upload/views_handler_filter_upload_fid.inc:10 +msgid "Has attached files" +msgstr "" + +#: modules/upload.views.inc:122 +msgid "Only display items with attached files. This can cause duplicates if there are multiple attached files." +msgstr "" + +#: modules/upload.views.inc:126 +msgid "Add a relationship to gain access to more file data for files uploaded by upload.module. Note that this relationship will cause duplicate nodes if there are multiple files attached to the node." +msgstr "" + +#: modules/upload.views.inc:132 +msgid "Files" +msgstr "" + +#: modules/user.views.inc:28 +msgid "Users who have created accounts on your site." +msgstr "" + +#: modules/user.views.inc:48 +msgid "Uid" +msgstr "" + +#: modules/user.views.inc:49 +msgid "The user ID" +msgstr "" + +#: modules/user.views.inc:70 +msgid "Current" +msgstr "" + +#: modules/user.views.inc:71 +msgid "Filter the view to the currently logged in user." +msgstr "" + +#: modules/user.views.inc:80 +msgid "The user or author name." +msgstr "" + +#: modules/user.views.inc:96 +msgid "E-mail" +msgstr "" + +#: modules/user.views.inc:97 +msgid "Email address for a given user. This field is not normally shown to users, so be cautious when using it." +msgstr "" + +#: modules/user.views.inc:112 +msgid "Picture" +msgstr "" + +#: modules/user.views.inc:113 +msgid "The user's picture, if allowed." +msgstr "" + +#: modules/user.views.inc:124 +msgid "The date the user was created." +msgstr "" + +#: modules/user.views.inc:139 +msgid "Last access" +msgstr "" + +#: modules/user.views.inc:140 +msgid "The user's last access date." +msgstr "" + +#: modules/user.views.inc:155 +msgid "Last login" +msgstr "" + +#: modules/user.views.inc:156 +msgid "The user's last login date." +msgstr "" + +#: modules/user.views.inc:172 +msgid "Whether a user is active or blocked." +msgstr "" + +#: modules/user.views.inc:189 +msgid "Signature" +msgstr "" + +#: modules/user.views.inc:190 +msgid "The user's signature." +msgstr "" + +#: modules/user.views.inc:203 +msgid "Provide a simple link to edit the user." +msgstr "" + +#: modules/user.views.inc:211 +msgid "Provide a simple link to delete the user." +msgstr "" + +#: modules/user.views.inc:240 +msgid "Roles" +msgstr "" + +#: modules/user.views.inc:241 +msgid "Roles that a user belongs to." +msgstr "" + +#: modules/user.views.inc:253 +msgid "No role" +msgstr "" + +#: modules/user.views.inc:296 +msgid "User ID from URL" +msgstr "" + +#: modules/user.views.inc:302 +msgid "User ID from logged in user" +msgstr "" + +#: modules/views.views.inc:18 +msgid "Global" +msgstr "" + +#: modules/views.views.inc:23 +msgid "Random" +msgstr "" + +#: modules/views.views.inc:24 +msgid "Randomize the display order." +msgstr "" + +#: modules/views.views.inc:31 +msgid "Null" +msgstr "" + +#: modules/views.views.inc:32 +msgid "Allow an argument to be ignored. The query will not be altered by this argument." +msgstr "" + +#: modules/comment/views_handler_argument_comment_user_uid.inc:11 modules/user/views_handler_argument_user_uid.inc:17 +msgid "Anonymous" +msgstr "" + +#: modules/comment/views_handler_argument_comment_user_uid.inc:17 +msgid "No user" +msgstr "" + +#: modules/comment/views_handler_field_comment.inc:30 +msgid "Link this field to its comment" +msgstr "" + +#: modules/comment/views_handler_field_comment_link.inc:23 modules/node/views_handler_field_node_link.inc:24 modules/user/views_handler_field_user_link.inc:22 +msgid "Text to display" +msgstr "" + +#: modules/comment/views_handler_field_comment_link.inc:34 modules/node/views_handler_field_node_link.inc:35 modules/user/views_handler_field_user_link.inc:38 +msgid "view" +msgstr "" + +#: modules/comment/views_handler_field_comment_link_delete.inc:12 modules/node/views_handler_field_node_link_delete.inc:26 modules/node/views_handler_field_node_revision_link_delete.inc:35 modules/user/views_handler_field_user_link_delete.inc:13 +msgid "delete" +msgstr "" + +#: modules/comment/views_handler_field_comment_link_edit.inc:21 modules/node/views_handler_field_node_link_edit.inc:26 modules/user/views_handler_field_user_link_edit.inc:13 +msgid "edit" +msgstr "" + +#: modules/comment/views_handler_field_comment_link_reply.inc:13 +msgid "reply" +msgstr "" + +#: modules/comment/views_handler_field_comment_username.inc:25 +msgid "Link this field to its user or an author's homepage" +msgstr "" + +#: modules/comment/views_handler_field_node_comment.inc:12 modules/comment/views_handler_filter_node_comment.inc:10 +msgid "Disabled" +msgstr "" + +#: modules/comment/views_handler_field_node_comment.inc:14 modules/comment/views_handler_filter_node_comment.inc:11 +msgid "Read only" +msgstr "" + +#: modules/comment/views_handler_field_node_comment.inc:16 modules/comment/views_handler_filter_node_comment.inc:12 +msgid "Read/Write" +msgstr "" + +#: modules/comment/views_handler_field_node_new_comments.inc:25 +msgid "Link this field to new comments" +msgstr "" + +#: modules/comment/views_handler_field_node_new_comments.inc:30 +msgid "Display nothing if no new comments" +msgstr "" + +#: modules/comment/views_plugin_row_comment_view.inc:21 modules/node/views_plugin_row_node_view.inc:32 +msgid "Display links" +msgstr "" + +#: modules/node/views_handler_argument_dates_various.inc:167 +msgid "Week @week" +msgstr "" + +#: modules/node/views_handler_argument_node_language.inc:29 modules/translation/views_handler_argument_node_language.inc:29 +msgid "Unknown language" +msgstr "" + +#: modules/node/views_handler_argument_node_type.inc:30 +msgid "Unknown node type" +msgstr "" + +#: modules/node/views_handler_field_history_user_timestamp.inc:32 +msgid "Check for new comments as well" +msgstr "" + +#: modules/node/views_handler_field_node.inc:32 +msgid "Link this field to its node" +msgstr "" + +#: modules/node/views_handler_field_node_revision_link_revert.inc:36 +msgid "revert" +msgstr "" + +#: modules/node/views_handler_filter_node_language.inc:10 modules/translation/views_handler_filter_node_language.inc:10 +msgid "Current user's language" +msgstr "" + +#: modules/node/views_handler_filter_node_language.inc:10 modules/translation/views_handler_filter_node_language.inc:10 +msgid "No language" +msgstr "" + +#: modules/node/views_handler_filter_node_type.inc:9 +msgid "Node type" +msgstr "" + +#: modules/node/views_plugin_argument_validate_node.inc:29 +msgid "Types" +msgstr "" + +#: modules/node/views_plugin_argument_validate_node.inc:32 +msgid "If you wish to validate for specific node types, check them; if none are checked, all nodes will pass." +msgstr "" + +#: modules/node/views_plugin_argument_validate_node.inc:39 +msgid "Validate user has access to the node" +msgstr "" + +#: modules/node/views_plugin_argument_validate_node.inc:47 modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:33 +msgid "Argument type" +msgstr "" + +#: modules/node/views_plugin_argument_validate_node.inc:49 +msgid "Node ID" +msgstr "" + +#: modules/node/views_plugin_argument_validate_node.inc:50 +msgid "Node IDs separated by , or +" +msgstr "" + +#: modules/node/views_plugin_row_node_rss.inc:26 +msgid "Full text" +msgstr "" + +#: modules/node/views_plugin_row_node_rss.inc:27 +msgid "Title plus teaser" +msgstr "" + +#: modules/node/views_plugin_row_node_rss.inc:28 +msgid "Title only" +msgstr "" + +#: modules/node/views_plugin_row_node_rss.inc:29 +msgid "Use default RSS settings" +msgstr "" + +#: modules/node/views_plugin_row_node_rss.inc:95 +msgid "read more" +msgstr "" + +#: modules/node/views_plugin_row_node_view.inc:27 +msgid "Display only teaser" +msgstr "" + +#: modules/node/views_plugin_row_node_view.inc:37 +msgid "Display node comments" +msgstr "" + +#: modules/search/views_handler_filter_search.inc:23 +msgid "On empty input" +msgstr "" + +#: modules/search/views_handler_filter_search.inc:26 +msgid "Show All" +msgstr "" + +#: modules/search/views_handler_filter_search.inc:27 +msgid "Show None" +msgstr "" + +#: modules/search/views_handler_filter_search.inc:42 +msgid "Enter the terms you wish to search for." +msgstr "" + +#: modules/search/views_handler_filter_search.inc:62 +msgid "You must include at least one positive keyword with @count characters or more." +msgstr "" + +#: modules/search/views_handler_filter_search.inc:66 +msgid "Search for either of the two terms with uppercase OR. For example, cats OR dogs." +msgstr "" + +#: modules/search/views_plugin_row_search_view.inc:23 +msgid "Display score" +msgstr "" + +#: modules/system/views_handler_argument_file_fid.inc:13 +msgid "No title" +msgstr "" + +#: modules/system/views_handler_field_file.inc:29 modules/upload/views_handler_field_upload_description.inc:24 modules/upload/views_handler_field_upload_fid.inc:21 +msgid "Link this field to download the file" +msgstr "" + +#: modules/taxonomy/views_handler_argument_taxonomy.inc:18 modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:125 +msgid "No name" +msgstr "" + +#: modules/taxonomy/views_handler_argument_term_node_tid.inc:17 modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:38 +msgid "Set the breadcrumb for the term parents" +msgstr "" + +#: modules/taxonomy/views_handler_argument_term_node_tid.inc:18 modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:39 +msgid "If selected, the breadcrumb trail will include all parent terms, each one linking to this view. Note that this only works if just one term was received." +msgstr "" + +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:26 +msgid "The depth will match nodes tagged with terms in the hierarchy. For example, if you have the term \"fruit\" and a child term \"apple\", with a depth of 1 (or higher) then filtering for the term \"fruit\" will get nodes that are tagged with \"apple\" as well as \"fruit\". If negative, the reverse is true; searching for \"apple\" will also pick up nodes tagged with \"fruit\" if depth is -1 (or lower)." +msgstr "" + +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:31 +msgid "Allow multiple terms per argument" +msgstr "" + +#: modules/taxonomy/views_handler_argument_term_node_tid_depth.inc:32 +msgid "If selected, users can enter multiple arguments in the form of 1+2+3. Due to the number of JOINs it would require, AND will be treated as OR with this argument." +msgstr "" + +#: modules/taxonomy/views_handler_argument_vocabulary_vid.inc:15 +msgid "No vocabulary" +msgstr "" + +#: modules/taxonomy/views_handler_field_taxonomy.inc:33 +msgid "Link this field to its taxonomy term page" +msgstr "" + +#: modules/taxonomy/views_handler_field_term_node_tid.inc:34 +msgid "Link this field to its term page" +msgstr "" + +#: modules/taxonomy/views_handler_field_term_node_tid.inc:41 +msgid "Limit terms by vocabulary" +msgstr "" + +#: modules/taxonomy/views_handler_field_term_node_tid.inc:55 modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:23 +msgid "Vocabularies" +msgstr "" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:39 +msgid "Select which vocabulary to show terms for in the regular options." +msgstr "" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:49 +msgid "Selection type" +msgstr "" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:50 +msgid "Dropdown" +msgstr "" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:50 +msgid "Autocomplete" +msgstr "" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:56 +msgid "Show hierarchy in dropdown" +msgstr "" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:73 +msgid "An invalid vocabulary is selected. Please change it in the options." +msgstr "" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:91;147 +msgid "Select terms from vocabulary @voc" +msgstr "" + +#: modules/taxonomy/views_handler_filter_term_node_tid.inc:255 +msgid "Unable to find term: @terms" +msgid_plural "Unable to find terms: @terms" +msgstr[0] "" +msgstr[1] "" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:26 +msgid "If you wish to validate for specific vocabularies, check them; if none are checked, all terms will pass." +msgstr "" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:36 +msgid "Term IDs separated by , or +" +msgstr "" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:37 +msgid "Term name or synonym" +msgstr "" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:38 +msgid "Term name/synonym converted to Term ID" +msgstr "" + +#: modules/taxonomy/views_plugin_argument_validate_taxonomy_term.inc:41 +msgid "Select the form of this argument; if using term name, it is generally more efficient to convert it to a term ID and use Taxonomy: Term ID rather than Taxonomy: Term Name\" as an argument." +msgstr "" + +#: modules/translation/views_handler_filter_node_language.inc:10 +msgid "Default site language" +msgstr "" + +#: modules/translation/views_handler_relationship_translation.inc:24 +msgid "Current language" +msgstr "" + +#: modules/translation/views_handler_relationship_translation.inc:25 +msgid "Default language" +msgstr "" + +#: modules/translation/views_handler_relationship_translation.inc:32 +msgid "Translation option" +msgstr "" + +#: modules/translation/views_handler_relationship_translation.inc:33 +msgid "The translation options allows you to select which translation or translations in a translation set join on. Select \"Current language\" or \"Default language\" to join on the translation in the current or default language respectively. Select a specific language to join on a translation in that language. If you select \"All\", each translation will create a new row, which may appear to cause duplicates." +msgstr "" + +#: modules/upload/views_handler_field_upload_fid.inc:27 +msgid "Only show \"listed\" file attachments" +msgstr "" + +#: modules/user/views_handler_field_user.inc:30 +msgid "Link this field to its user" +msgstr "" + +#: modules/user/views_handler_field_user_mail.inc:16 +msgid "Link this field" +msgstr "" + +#: modules/user/views_handler_field_user_mail.inc:19 +msgid "No link" +msgstr "" + +#: modules/user/views_handler_field_user_mail.inc:20 +msgid "To the user" +msgstr "" + +#: modules/user/views_handler_field_user_mail.inc:21 +msgid "With a mailto:" +msgstr "" + +#: modules/user/views_handler_filter_user_current.inc:10 +msgid "Is the logged in user" +msgstr "" + +#: modules/user/views_handler_filter_user_name.inc:28 +msgid "Usernames" +msgstr "" + +#: modules/user/views_handler_filter_user_name.inc:29 +msgid "Enter a comma separated list of user names." +msgstr "" + +#: modules/user/views_handler_filter_user_name.inc:112 +msgid "Unable to find user: @users" +msgid_plural "Unable to find users: @users" +msgstr[0] "" +msgstr[1] "" + +#: modules/user/views_plugin_argument_default_user.inc:17 +msgid "Also look for a node and use the node author" +msgstr "" + +#: plugins/views_plugin_access_none.inc:9 +msgid "Unrestricted" +msgstr "" + +#: plugins/views_plugin_access_perm.inc:37 +msgid "Only users with the selected permission flag will be able to access this display. Note that users with \"access all views\" can see any view, regardless of other permissions." +msgstr "" + +#: plugins/views_plugin_access_role.inc:21 +msgid "No role(s) selected" +msgstr "" + +#: plugins/views_plugin_access_role.inc:24 +msgid "Multiple roles" +msgstr "" + +#: plugins/views_plugin_access_role.inc:43 +msgid "Only the checked roles will be able to access this display. Note that users with \"access all views\" can see any view, regardless of role." +msgstr "" + +#: plugins/views_plugin_access_role.inc:49 +msgid "You must select at least one role if type is \"by role\"" +msgstr "" + +#: plugins/views_plugin_argument_default.inc:32 +msgid "Default argument" +msgstr "" + +#: plugins/views_plugin_argument_default.inc:54 +msgid "Note: you do not have permission to modify this. If you change the default argument type, this setting will be lost and you will NOT be able to get it back." +msgstr "" + +#: plugins/views_plugin_argument_default_php.inc:17 +msgid "PHP argument code" +msgstr "" + +#: plugins/views_plugin_argument_default_php.inc:20 +msgid "Enter PHP code that returns a value to use for this argument. Do not use <?php ?>. You must return only a single value for just this argument." +msgstr "" + +#: plugins/views_plugin_argument_validate.inc:43 +msgid "Note: you do not have permission to modify this. If you change the validator, this setting will be lost and you will NOT be able to get it back." +msgstr "" + +#: plugins/views_plugin_argument_validate_php.inc:19 +msgid "PHP validate code" +msgstr "" + +#: plugins/views_plugin_argument_validate_php.inc:21 +msgid "Enter PHP code that returns TRUE or FALSE. No return is the same as FALSE, so be SURE to return something if you do not want to declare the argument invalid. Do not use <?php ?>. The argument to validate will be \"$argument\" and the view will be \"$view\". You may change the argument by setting \"$handler->argument\"." +msgstr "" + +#: plugins/views_plugin_display.inc:558 +msgid "Broken field" +msgstr "" + +#: plugins/views_plugin_display.inc:575 +msgid "Basic settings" +msgstr "" + +#: plugins/views_plugin_display.inc:582 +msgid "Change the name of this display." +msgstr "" + +#: plugins/views_plugin_display.inc:594 +msgid "Change the title that this display will use." +msgstr "" + +#: plugins/views_plugin_display.inc:604 +msgid "Style" +msgstr "" + +#: plugins/views_plugin_display.inc:606 +msgid "Change the style plugin." +msgstr "" + +#: plugins/views_plugin_display.inc:620 +msgid "Row style" +msgstr "" + +#: plugins/views_plugin_display.inc:622 +msgid "Change the row plugin." +msgstr "" + +#: plugins/views_plugin_display.inc:632 +msgid "Use AJAX" +msgstr "" + +#: plugins/views_plugin_display.inc:634 +msgid "Change whether or not this display will use AJAX." +msgstr "" + +#: plugins/views_plugin_display.inc:641 +msgid "Use pager" +msgstr "" + +#: plugins/views_plugin_display.inc:642 +msgid "Mini" +msgstr "" + +#: plugins/views_plugin_display.inc:643 +msgid "Change this display's pager setting." +msgstr "" + +#: plugins/views_plugin_display.inc:650;822 +msgid "Items per page" +msgstr "" + +#: plugins/views_plugin_display.inc:650;822 plugins/views_plugin_style_summary.inc:43 +msgid "Items to display" +msgstr "" + +#: plugins/views_plugin_display.inc:651 +msgid "Unlimited" +msgstr "" + +#: plugins/views_plugin_display.inc:652 +msgid "Change how many items to display." +msgstr "" + +#: plugins/views_plugin_display.inc:658 +msgid "More link" +msgstr "" + +#: plugins/views_plugin_display.inc:660 +msgid "Specify whether this display will provide a \"more\" link." +msgstr "" + +#: plugins/views_plugin_display.inc:666;849 +msgid "Distinct" +msgstr "" + +#: plugins/views_plugin_display.inc:668;846 +msgid "Display only distinct items, without duplicates." +msgstr "" + +#: plugins/views_plugin_display.inc:681 +msgid "Access" +msgstr "" + +#: plugins/views_plugin_display.inc:683 +msgid "Specify access control type for this display." +msgstr "" + +#: plugins/views_plugin_display.inc:687 +msgid "Change settings for this access type." +msgstr "" + +#: plugins/views_plugin_display.inc:707 +msgid "Link display" +msgstr "" + +#: plugins/views_plugin_display.inc:709 +msgid "Specify which display this display will link to." +msgstr "" + +#: plugins/views_plugin_display.inc:716 +msgid "Exposed form in block" +msgstr "" + +#: plugins/views_plugin_display.inc:718 +msgid "Allow the exposed form to appear in a block instead of the view." +msgstr "" + +#: plugins/views_plugin_display.inc:721;897 +msgid "Header" +msgstr "" + +#: plugins/views_plugin_display.inc:721;913 +msgid "Footer" +msgstr "" + +#: plugins/views_plugin_display.inc:721;929 +msgid "Empty text" +msgstr "" + +#: plugins/views_plugin_display.inc:737 +msgid "Unknown/missing format" +msgstr "" + +#: plugins/views_plugin_display.inc:745 +msgid "Change this display's !name." +msgstr "" + +#: plugins/views_plugin_display.inc:751 +msgid "Theme" +msgstr "" + +#: plugins/views_plugin_display.inc:752 +msgid "Information" +msgstr "" + +#: plugins/views_plugin_display.inc:753 +msgid "Get information on how to theme this display" +msgstr "" + +#: plugins/views_plugin_display.inc:779 +msgid "The name of this display" +msgstr "" + +#: plugins/views_plugin_display.inc:782 +msgid "This title will appear only in the administrative interface for the View." +msgstr "" + +#: plugins/views_plugin_display.inc:787 +msgid "The title of this view" +msgstr "" + +#: plugins/views_plugin_display.inc:790 +msgid "This title will be displayed with the view, wherever titles are normally displayed; i.e, as the page title, block title, etc." +msgstr "" + +#: plugins/views_plugin_display.inc:795 +msgid "Use AJAX when available to load this view" +msgstr "" + +#: plugins/views_plugin_display.inc:799 +msgid "If set, this view will use an AJAX mechanism for paging, table sorting and exposed filters. This means the entire page will not refresh. It is not recommended that you use this if this view is the main content of the page as it will prevent deep linking to specific pages, but it is very useful for side content." +msgstr "" + +#: plugins/views_plugin_display.inc:808 +msgid "Use a pager for this view" +msgstr "" + +#: plugins/views_plugin_display.inc:811 +msgid "Full pager" +msgstr "" + +#: plugins/views_plugin_display.inc:811 +msgid "Mini pager" +msgstr "" + +#: plugins/views_plugin_display.inc:816 +msgid "Pager element" +msgstr "" + +#: plugins/views_plugin_display.inc:817 +msgid "Unless you're experiencing problems with pagers related to this view, you should leave this at 0. If using multiple pagers on one page you may need to set this number to a higher value so as not to conflict within the ?page= array. Large values will add a lot of commas to your URLs, so avoid if possible." +msgstr "" + +#: plugins/views_plugin_display.inc:826 +msgid "The number of items to display per page. Enter 0 for no limit." +msgstr "" + +#: plugins/views_plugin_display.inc:831 +msgid "Offset" +msgstr "" + +#: plugins/views_plugin_display.inc:832 +msgid "The number of items to skip. For example, if this field is 3, the first 3 items will be skipped and not displayed. Offset can not be used if items to display is 0; instead use a very large number there." +msgstr "" + +#: plugins/views_plugin_display.inc:837 +msgid "Add a more link to the bottom of the display." +msgstr "" + +#: plugins/views_plugin_display.inc:840 +msgid "Create more link" +msgstr "" + +#: plugins/views_plugin_display.inc:841 +msgid "This will add a more link to the bottom of this view, which will link to the page view. If you have more than one page view, the link will point to the display specified in 'Link display' above." +msgstr "" + +#: plugins/views_plugin_display.inc:850 +msgid "This will make the view display only distinct items. If there are multiple identical items, each will be displayed only once. You can use this to try and remove duplicates from a view, though it does not always work. Note that this can slow queries down, so use it with caution." +msgstr "" + +#: plugins/views_plugin_display.inc:855 +msgid "Access restrictions" +msgstr "" + +#: plugins/views_plugin_display.inc:874;954 +msgid "You may also adjust the !settings for the currently selected style by clicking on the icon." +msgstr "" + +#: plugins/views_plugin_display.inc:874;954;999 +msgid "settings" +msgstr "" + +#: plugins/views_plugin_display.inc:882 +msgid "Access options" +msgstr "" + +#: plugins/views_plugin_display.inc:900;916 +msgid "Display even if view has no result" +msgstr "" + +#: plugins/views_plugin_display.inc:907 +msgid "Text to display at the top of the view. May contain an explanation or links or whatever you like. Optional." +msgstr "" + +#: plugins/views_plugin_display.inc:923 +msgid "Text to display beneath the view. May contain an explanation or links or whatever you like. Optional." +msgstr "" + +#: plugins/views_plugin_display.inc:934 +msgid "Text to display if the view has no results. Optional." +msgstr "" + +#: plugins/views_plugin_display.inc:940 +msgid "How should this view be styled" +msgstr "" + +#: plugins/views_plugin_display.inc:946 +msgid "If the style you choose has settings, be sure to click the settings button that will appear next to it in the View summary." +msgstr "" + +#: plugins/views_plugin_display.inc:960 +msgid "Style options" +msgstr "" + +#: plugins/views_plugin_display.inc:971 +msgid "Row style options" +msgstr "" + +#: plugins/views_plugin_display.inc:986 +msgid "How should each row in this view be styled" +msgstr "" + +#: plugins/views_plugin_display.inc:999 +msgid "You may also adjust the !settings for the currently selected row style by clicking on the icon." +msgstr "" + +#: plugins/views_plugin_display.inc:1005 +msgid "Which display to use for path" +msgstr "" + +#: plugins/views_plugin_display.inc:1014 +msgid "Which display to use to get this display's path for things like summary links, rss feed links, more links, etc." +msgstr "" + +#: plugins/views_plugin_display.inc:1019 +msgid "Theming information" +msgstr "" + +#: plugins/views_plugin_display.inc:1027 +msgid "Display output" +msgstr "" + +#: plugins/views_plugin_display.inc:1031 +msgid "Alternative display output" +msgstr "" + +#: plugins/views_plugin_display.inc:1038 +msgid "Style output" +msgstr "" + +#: plugins/views_plugin_display.inc:1042 +msgid "Alternative style" +msgstr "" + +#: plugins/views_plugin_display.inc:1049 +msgid "Row style output" +msgstr "" + +#: plugins/views_plugin_display.inc:1053 +msgid "Alternative row style" +msgstr "" + +#: plugins/views_plugin_display.inc:1061 +msgid "Field @field (ID: @id)" +msgstr "" + +#: plugins/views_plugin_display.inc:1069 +msgid "This section lists all possible templates for the display plugin and for the style plugins, ordered roughly from the least specific to the most specific. The active template for each plugin -- which is the most specific template found on the system -- is highlighted in bold." +msgstr "" + +#: plugins/views_plugin_display.inc:1084 +msgid "Rescan template files" +msgstr "" + +#: plugins/views_plugin_display.inc:1090 +msgid "Important! When adding, removing, or renaming template files, it is necessary to make Drupal aware of the changes by making it rescan the files on your system. By clicking this button you clear Drupal's theme registry and thereby trigger this rescanning process. The highlighted templates above will then reflect the new state of your system." +msgstr "" + +#: plugins/views_plugin_display.inc:1096 +msgid "Theming information (display)" +msgstr "" + +#: plugins/views_plugin_display.inc:1097;1124;1153;1182 +msgid "Back to !info." +msgstr "" + +#: plugins/views_plugin_display.inc:1097;1124;1153;1182 +msgid "theming information" +msgstr "" + +#: plugins/views_plugin_display.inc:1100 +msgid "This display has no theming information" +msgstr "" + +#: plugins/views_plugin_display.inc:1103 +msgid "This is the default theme template used for this display." +msgstr "" + +#: plugins/views_plugin_display.inc:1109 +msgid "This is an alternative template for this display." +msgstr "" + +#: plugins/views_plugin_display.inc:1123 +msgid "Theming information (style)" +msgstr "" + +#: plugins/views_plugin_display.inc:1129 +msgid "This display has no style theming information" +msgstr "" + +#: plugins/views_plugin_display.inc:1132 +msgid "This is the default theme template used for this style." +msgstr "" + +#: plugins/views_plugin_display.inc:1138 +msgid "This is an alternative template for this style." +msgstr "" + +#: plugins/views_plugin_display.inc:1152;1181 +msgid "Theming information (row style)" +msgstr "" + +#: plugins/views_plugin_display.inc:1158 +msgid "This display has no row style theming information" +msgstr "" + +#: plugins/views_plugin_display.inc:1161;1184 +msgid "This is the default theme template used for this row style." +msgstr "" + +#: plugins/views_plugin_display.inc:1167 +msgid "This is an alternative template for this row style." +msgstr "" + +#: plugins/views_plugin_display.inc:1199 +msgid "Put the exposed form in a block" +msgstr "" + +#: plugins/views_plugin_display.inc:1203 +msgid "If set, any exposed widgets will not appear with this view. Instead, a block will be made available to the Drupal block administration system, and the exposed form will appear there. Note that this block must be enabled manually, Views will not enable it for you." +msgstr "" + +#: plugins/views_plugin_display.inc:1238 +msgid "File found in folder @template-path" +msgstr "" + +#: plugins/views_plugin_display.inc:1242 +msgid "(File not found, in folder @template-path)" +msgstr "" + +#: plugins/views_plugin_display.inc:1399 +msgid "Override" +msgstr "" + +#: plugins/views_plugin_display.inc:1404 +msgid "Status: using default values." +msgstr "" + +#: plugins/views_plugin_display.inc:1408 +msgid "Update default display" +msgstr "" + +#: plugins/views_plugin_display.inc:1413 +msgid "Use default" +msgstr "" + +#: plugins/views_plugin_display.inc:1418 +msgid "Status: using overridden values." +msgstr "" + +#: plugins/views_plugin_display.inc:1633 +msgid "Display \"@display\" uses fields but there are none defined for it or all are excluded." +msgstr "" + +#: plugins/views_plugin_display.inc:1638 +msgid "Display \"@display\" uses a path but the path is undefined." +msgstr "" + +#: plugins/views_plugin_display.inc:1643 +msgid "Display \"@display\" has an invalid style plugin." +msgstr "" + +#: plugins/views_plugin_display.inc:1659 +msgid "Exposed form: @view-@display_id" +msgstr "" + +#: plugins/views_plugin_display_attachment.inc:35 +msgid "Before" +msgstr "" + +#: plugins/views_plugin_display_attachment.inc:36 +msgid "After" +msgstr "" + +#: plugins/views_plugin_display_attachment.inc:37 +msgid "Both" +msgstr "" + +#: plugins/views_plugin_display_attachment.inc:57 +msgid "Attachment settings" +msgstr "" + +#: plugins/views_plugin_display_attachment.inc:62;109 +msgid "Inherit arguments" +msgstr "" + +#: plugins/views_plugin_display_attachment.inc:68;118 +msgid "Inherit exposed filters" +msgstr "" + +#: plugins/views_plugin_display_attachment.inc:74;127 +msgid "Position" +msgstr "" + +#: plugins/views_plugin_display_attachment.inc:80 plugins/views_plugin_display_feed.inc:98 +msgid "Multiple displays" +msgstr "" + +#: plugins/views_plugin_display_attachment.inc:95;136 plugins/views_plugin_display_feed.inc:113;140 +msgid "Attach to" +msgstr "" + +#: plugins/views_plugin_display_attachment.inc:112;121 +msgid "Inherit" +msgstr "" + +#: plugins/views_plugin_display_attachment.inc:113 +msgid "Should this display inherit its arguments from the parent display to which it is attached?" +msgstr "" + +#: plugins/views_plugin_display_attachment.inc:122 +msgid "Should this display inherit its exposed filter values from the parent display to which it is attached?" +msgstr "" + +#: plugins/views_plugin_display_attachment.inc:130 +msgid "Attach before or after the parent display?" +msgstr "" + +#: plugins/views_plugin_display_attachment.inc:145 +msgid "Select which display or displays this should attach to." +msgstr "" + +#: plugins/views_plugin_display_block.inc:68 +msgid "Block settings" +msgstr "" + +#: plugins/views_plugin_display_block.inc:82 +msgid "Admin" +msgstr "" + +#: plugins/views_plugin_display_block.inc:106 +msgid "Do not cache" +msgstr "" + +#: plugins/views_plugin_display_block.inc:107 +msgid "Cache once for everything (global)" +msgstr "" + +#: plugins/views_plugin_display_block.inc:108 +msgid "Per page" +msgstr "" + +#: plugins/views_plugin_display_block.inc:109 +msgid "Per role" +msgstr "" + +#: plugins/views_plugin_display_block.inc:110 +msgid "Per role per page" +msgstr "" + +#: plugins/views_plugin_display_block.inc:111 +msgid "Per user" +msgstr "" + +#: plugins/views_plugin_display_block.inc:112 +msgid "Per user per page" +msgstr "" + +#: plugins/views_plugin_display_block.inc:137 +msgid "Block admin description" +msgstr "" + +#: plugins/views_plugin_display_block.inc:140 +msgid "This will appear as the name of this block in administer >> site building >> blocks." +msgstr "" + +#: plugins/views_plugin_display_block.inc:145 +msgid "Block caching type" +msgstr "" + +#: plugins/views_plugin_display_block.inc:149 +msgid "This sets the default status for Drupal's built-in block caching method; this requires that caching be turned on in block administration, and be careful because you have little control over when this cache is flushed." +msgstr "" + +#: plugins/views_plugin_display_feed.inc:86 +msgid "Feed settings" +msgstr "" + +#: plugins/views_plugin_display_feed.inc:90 +msgid "Using the site name" +msgstr "" + +#: plugins/views_plugin_display_feed.inc:132 +msgid "Use the site name for the title" +msgstr "" + +#: plugins/views_plugin_display_feed.inc:149 +msgid "The feed icon will be available only to the selected displays." +msgstr "" + +#: plugins/views_plugin_display_feed.inc:155 +msgid "This view will be displayed by visiting this path on your site. It is recommended that the path be something like \"path/%/%/feed\" or \"path/%/%/rss.xml\", putting one % in the path for each argument you have defined in the view." +msgstr "" + +#: plugins/views_plugin_display_page.inc:188 +msgid "Page settings" +msgstr "" + +#: plugins/views_plugin_display_page.inc:213 +msgid "No menu" +msgstr "" + +#: plugins/views_plugin_display_page.inc:216 +msgid "Normal: @title" +msgstr "" + +#: plugins/views_plugin_display_page.inc:220 +msgid "Tab: @title" +msgstr "" + +#: plugins/views_plugin_display_page.inc:230;302 +msgid "Menu" +msgstr "" + +#: plugins/views_plugin_display_page.inc:236 +msgid "Change settings for the parent menu" +msgstr "" + +#: plugins/views_plugin_display_page.inc:249 +msgid "The menu path or URL of this view" +msgstr "" + +#: plugins/views_plugin_display_page.inc:253 +msgid "This view will be displayed by visiting this path on your site. You may use \"%\" in your URL to represent values that will be used for arguments: For example, \"node/%/feed\"." +msgstr "" + +#: plugins/views_plugin_display_page.inc:259 +msgid "Menu item entry" +msgstr "" + +#: plugins/views_plugin_display_page.inc:276 +msgid "No menu entry" +msgstr "" + +#: plugins/views_plugin_display_page.inc:277 +msgid "Normal menu entry" +msgstr "" + +#: plugins/views_plugin_display_page.inc:278;343 +msgid "Menu tab" +msgstr "" + +#: plugins/views_plugin_display_page.inc:279 +msgid "Default menu tab" +msgstr "" + +#: plugins/views_plugin_display_page.inc:288 +msgid "If set to normal or tab, enter the text to use for the menu item." +msgstr "" + +#: plugins/views_plugin_display_page.inc:295 +msgid "Warning: Changing this item's menu will not work reliably in Drupal 6.4 or earlier. Please upgrade your copy of Drupal at !url." +msgstr "" + +#: plugins/views_plugin_display_page.inc:306 +msgid "Insert item into an available menu." +msgstr "" + +#: plugins/views_plugin_display_page.inc:315 +msgid "The lower the weight the higher/further left it will appear." +msgstr "" + +#: plugins/views_plugin_display_page.inc:321 +msgid "Default tab options" +msgstr "" + +#: plugins/views_plugin_display_page.inc:330 +msgid "When providing a menu item as a tab, Drupal needs to know what the parent menu item of that tab will be. Sometimes the parent will already exist, but other times you will need to have one created. The path of a parent item will always be the same path with the last part left off. i.e, if the path to this view is foo/bar/baz, the parent path would be foo/bar." +msgstr "" + +#: plugins/views_plugin_display_page.inc:341 +msgid "Parent menu item" +msgstr "" + +#: plugins/views_plugin_display_page.inc:343 +msgid "Already exists" +msgstr "" + +#: plugins/views_plugin_display_page.inc:343 +msgid "Normal menu item" +msgstr "" + +#: plugins/views_plugin_display_page.inc:351 +msgid "If creating a parent menu item, enter the title of the item." +msgstr "" + +#: plugins/views_plugin_display_page.inc:357 +msgid "Tab weight" +msgstr "" + +#: plugins/views_plugin_display_page.inc:361 +msgid "If the parent menu item is a tab, enter the weight of the tab. The lower the number, the more to the left it will be." +msgstr "" + +#: plugins/views_plugin_display_page.inc:375 +msgid "\"$arg\" is no longer supported. Use % instead." +msgstr "" + +#: plugins/views_plugin_display_page.inc:379 +msgid "\"%\" may not be used for the first segment of a path." +msgstr "" + +#: plugins/views_plugin_display_page.inc:389 +msgid "Views cannot create normal menu items for paths with a % in them." +msgstr "" + +#: plugins/views_plugin_display_page.inc:396 +msgid "A display whose path ends with a % cannot be a tab." +msgstr "" + +#: plugins/views_plugin_display_page.inc:401 +msgid "Title is required for this menu type." +msgstr "" + +#: plugins/views_plugin_display_page.inc:432 +msgid "Display @display is set to use a menu but the menu title is not set." +msgstr "" + +#: plugins/views_plugin_display_page.inc:438 +msgid "Display @display is set to use a parent menu but the parent menu title is not set." +msgstr "" + +#: plugins/views_plugin_row_fields.inc:40 +msgid "Inline fields" +msgstr "" + +#: plugins/views_plugin_row_fields.inc:43 +msgid "Inline fields will be displayed next to each other rather than one after another." +msgstr "" + +#: plugins/views_plugin_row_fields.inc:51 +msgid "The separator may be placed between inline fields to keep them from squishing up next to each other. You can use HTML in this field." +msgstr "" + +#: plugins/views_plugin_style.inc:91 +msgid "Grouping field" +msgstr "" + +#: plugins/views_plugin_style.inc:94 +msgid "You may optionally specify a field by which to group the records. Leave blank to not group." +msgstr "" + +#: plugins/views_plugin_style.inc:191 +msgid "Style @style requires a row style but the row plugin is invalid." +msgstr "" + +#: plugins/views_plugin_style_grid.inc:33 +msgid "Number of columns" +msgstr "" + +#: plugins/views_plugin_style_grid.inc:38 +msgid "Alignment" +msgstr "" + +#: plugins/views_plugin_style_grid.inc:39 +msgid "Horizontal" +msgstr "" + +#: plugins/views_plugin_style_grid.inc:39 +msgid "Vertical" +msgstr "" + +#: plugins/views_plugin_style_grid.inc:41 +msgid "Horizontal alignment will place items starting in the upper left and moving right. Vertical alignment will place items starting in the upper left and moving down." +msgstr "" + +#: plugins/views_plugin_style_list.inc:32 +msgid "List type" +msgstr "" + +#: plugins/views_plugin_style_rss.inc:56 +msgid "Use the site mission for the description" +msgstr "" + +#: plugins/views_plugin_style_rss.inc:60 +msgid "RSS description" +msgstr "" + +#: plugins/views_plugin_style_rss.inc:62 +msgid "This will appear in the RSS feed itself." +msgstr "" + +#: plugins/views_plugin_style_summary.inc:34 +msgid "Display record count with link" +msgstr "" + +#: plugins/views_plugin_style_summary.inc:39 +msgid "Override number of items to display" +msgstr "" + +#: plugins/views_plugin_style_summary_unformatted.inc:26 +msgid "Display items inline" +msgstr "" + +#: plugins/views_plugin_style_table.inc:126 +msgid "You need at least one field before you can configure your table settings" +msgstr "" + +#: plugins/views_plugin_style_table.inc:135 +msgid "Override normal sorting if click sorting is used" +msgstr "" + +#: plugins/views_plugin_style_table.inc:141 +msgid "Enable Drupal style \"sticky\" table headers (Javascript)" +msgstr "" + +#: plugins/views_plugin_style_table.inc:143 +msgid "(Sticky header effects will not be active for preview below, only on live output.)" +msgstr "" + +#: plugins/views_plugin_style_table.inc:148 +msgid "Default sort order" +msgstr "" + +#: plugins/views_plugin_style_table.inc:151 +msgid "If a default sort order is selected, what order should it use by default." +msgstr "" + +#: plugins/views_plugin_style_table.inc:237 +msgid "Place fields into columns; you may combine multiple fields into the same column. If you do, the separator in the column specified will be used to separate the fields. Check the sortable box to make that column click sortable, and check the default sort radio to determine which column will be sorted by default, if any. You may control column order and field labels in the fields section." +msgstr "" + +#: theme/views-more.tpl.php:15 +msgid "more" +msgstr "" + +#: theme/views-ui-edit-item.tpl.php:32 +msgid "The style selected does not utilize fields." +msgstr "" + +#: theme/views-ui-edit-item.tpl.php:34 +msgid "None defined" +msgstr "" + +#: theme/views-ui-edit-tab.tpl.php:31 +msgid "View settings" +msgstr "" + +#: theme/views-ui-edit-view.tpl.php:11 +msgid "This view is being edited by user !user, and is therefore locked from editing by others. This lock is !age old. Click here to break this lock." +msgstr "" + +#: theme/views-ui-edit-view.tpl.php:16 +msgid "New view" +msgstr "" + +#: theme/views-ui-edit-view.tpl.php:18 +msgid "Changed view" +msgstr "" + +#: theme/views-ui-edit-view.tpl.php:23 +msgid "View %name, displaying items of type @base." +msgstr "" + +#: theme/views-ui-edit-view.tpl.php:42 +msgid "Live preview" +msgstr "" + +#: theme/views-ui-list-views.tpl.php:17 +msgid "@type @base view: @view" +msgstr "" + +#: theme/views-ui-list-views.tpl.php:27 +msgid "Title: @title" +msgstr "" + +#: theme/views-ui-list-views.tpl.php:30 +msgid "Path: !path" +msgstr "" + +#: theme/theme.inc:90 +msgid "Edit this view" +msgstr "" + +#: theme/theme.inc:307 +msgid "sort by @s" +msgstr "" + +#: theme/theme.inc:559 +msgid "‹‹" +msgstr "" + +#: theme/theme.inc:560 +msgid "››" +msgstr "" + +#: theme/theme.inc:570 +msgid "@current of @max" +msgstr "" + +#: views_export/views_export.module:76 +msgid "There are no views to be exported at this time." +msgstr "" + +#: views_export/views_export.module:108 +msgid "Show only these tags" +msgstr "" + +#: views_export/views_export.module:122 +msgid "Module name" +msgstr "" + +#: views_export/views_export.module:123 +msgid "Enter the module name to export code to." +msgstr "" + +#: views_export/views_export.module:190 +msgid "Put this in @module.views_default.inc in your modules/@module directory or modules/@module/includes directory" +msgstr "" + +#: views_export/views_export.module:44 +msgid "use views exporter" +msgstr "" + +#: views_export/views_export.module:17 +msgid "Bulk export" +msgstr "" + +#: views_export/views_export.module:0 +msgid "views_export" +msgstr "" + +#: views_export/views_export.info:0 +msgid "Views exporter" +msgstr "" + +#: views_export/views_export.info:0 +msgid "Allows exporting multiple views at once." +msgstr "" + diff --git a/views.info b/views.info new file mode 100644 index 0000000000000000000000000000000000000000..430c895bdced57dd7a0a261e53e201815b53d9e4 --- /dev/null +++ b/views.info @@ -0,0 +1,5 @@ +; $Id$ +name = Views +description = Create customized lists and queries from your database. +package = Views +core = 6.x diff --git a/views.install b/views.install new file mode 100644 index 0000000000000000000000000000000000000000..422ee464769929416747bf7a0979da67a6e8a70b --- /dev/null +++ b/views.install @@ -0,0 +1,298 @@ + 'Stores the general data for a view.', + 'fields' => array( + 'vid' => array( + 'type' => 'serial', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'description' => 'The view ID of the field, defined by the database.', + 'no export' => TRUE, + ), + 'name' => array( + 'type' => 'varchar', + 'length' => '32', + 'default' => '', + 'not null' => TRUE, + 'description' => 'The unique name of the view. This is the primary field views are loaded from, and is used so that views may be internal and not necessarily in the database. May only be alphanumeric characters plus underscores.', + ), + 'description' => array( + 'type' => 'varchar', + 'length' => '255', + 'default' => '', + 'description' => 'A description of the view for the admin interface.', + ), + 'tag' => array( + 'type' => 'varchar', + 'length' => '255', + 'default' => '', + 'description' => 'A tag used to group/sort views in the admin interface', + ), + 'view_php' => array( + 'type' => 'blob', + 'description' => 'A chunk of PHP code that can be used to provide modifications to the view prior to building.', + ), + 'base_table' => array( + 'type' => 'varchar', + 'length' => '64', + 'default' => '', + 'not null' => TRUE, + 'description' => 'What table this view is based on, such as node, user, comment, or term.', + ), + 'is_cacheable' => array( + 'type' => 'int', + 'default' => 0, + 'size' => 'tiny', + 'description' => 'A boolean to indicate whether or not this view may have its query cached.', + ), + ), + 'primary key' => array('vid'), + 'unique keys' => array('name' => array('name')), + ); + + $schema['views_display'] = array( + 'description' => 'Stores information about each display attached to a view.', + 'fields' => array( + 'vid' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + 'description' => 'The view this display is attached to.', + 'no export' => TRUE, + ), + 'id' => array( + 'type' => 'varchar', + 'length' => '64', + 'default' => '', + 'not null' => TRUE, + 'description' => 'An identifier for this display; usually generated from the display_plugin, so should be something like page or page_1 or block_2, etc.', + ), + 'display_title' => array( + 'type' => 'varchar', + 'length' => '64', + 'default' => '', + 'not null' => TRUE, + 'description' => 'The title of the display, viewable by the administrator.', + ), + 'display_plugin' => array( + 'type' => 'varchar', + 'length' => '64', + 'default' => '', + 'not null' => TRUE, + 'description' => 'The type of the display. Usually page, block or embed, but is pluggable so may be other things.', + ), + 'position' => array( + 'type' => 'int', + 'default' => 0, + 'description' => 'The order in which this display is loaded.', + ), + 'display_options' => array( + 'type' => 'blob', + 'description' => 'A serialized array of options for this display; it contains options that are generally only pertinent to that display plugin type.', + 'serialize' => TRUE, + 'serialized default' => 'a:0:{}', + ), + ), + 'indexes' => array('vid' => array('vid', 'position')), + ); + + $schema['cache_views'] = drupal_get_schema_unprocessed('system', 'cache'); + + $schema['cache_views_data'] = drupal_get_schema_unprocessed('system', 'cache'); + $schema['cache_views_data']['description'] = 'Cache table for views to store pre-rendered queries, results, and display output.'; + $schema['cache_views_data']['fields']['serialized']['default'] = 1; + + + $schema['views_object_cache'] = array( + 'description' => 'A special cache used to store objects that are being edited; it serves to save state in an ordinarily stateless environment.', + 'fields' => array( + 'sid' => array( + 'type' => 'varchar', + 'length' => '64', + 'description' => 'The session ID this cache object belongs to.', + ), + 'name' => array( + 'type' => 'varchar', + 'length' => '32', + 'description' => 'The name of the view this cache is attached to.', + ), + 'obj' => array( + 'type' => 'varchar', + 'length' => '32', + 'description' => 'The name of the object this cache is attached to; this essentially represents the owner so that several sub-systems can use this cache.', + ), + 'updated' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + 'description' => 'The time this cache was created or updated.', + ), + 'data' => array( + 'type' => 'text', + 'size' => 'big', + 'description' => 'Serialized data being stored.', + 'serialize' => TRUE, + ), + ), + 'indexes' => array( + 'sid_obj_name' => array('sid', 'obj', 'name'), + 'updated' => array('updated'), + ), + ); + return $schema; +} + +/** + * Update a site to Drupal 6! Contains a bit of special code to detect + * if you've been running a beta version or something. + */ +function views_update_6000() { + $ret = array(); + if (db_table_exists('views_view')) { + return $ret; + } + + // This has the beneficial effect of wiping out any Views 1 cache at the + // same time; not wiping that cache could easily cause problems with Views 2. + if (db_table_exists('cache_views')) { + db_drop_table($ret, 'cache_views'); + } + + // This is mostly the same as drupal_install_schema, but it forces + // views_schema_1 rather than the default schema. This will be important + // if we have table updates. + $schema = views_schema_1(); + _drupal_initialize_schema('views', $schema); + + foreach ($schema as $name => $table) { + db_create_table($ret, $name, $table); + } + return $ret; +} + +function views_update_6001() { + $ret = array(); + $result = db_query("SELECT * FROM {blocks} WHERE module = 'views' AND delta LIKE '\$exp%'"); + while ($block = db_fetch_object($result)) { + $new = strtr($block->delta, '$', '-'); + $ret[] = update_sql("UPDATE {blocks} SET delta = '" . db_escape_string($new) . "' WHERE module = 'views' AND delta = '" . db_escape_string($block->delta) . "'"); + } + $ret[] = update_sql("UPDATE {blocks} SET delta = CONCAT(delta, '-block_1') WHERE module = 'views'"); + + return $ret; +} + +// NOTE: Update 6002 removed because it did not always work. +/** + * Add missing unique key. + */ +function views_update_6003() { + $ret = array(); + + db_add_unique_key($ret, 'views_view', 'name', array('name')); + + return $ret; +} + +/** + * Enlarge the views_object_cache.data column to prevent truncation and JS + * errors. + */ +function views_update_6004() { + $ret = array(); + + $new_field = array( + 'type' => 'text', + 'size' => 'big', + 'description' => 'Serialized data being stored.', + 'serialize' => TRUE, + ); + + // Drop and re-add this field because there is a bug in + // db_change_field that causes this to fail when trying to cast the data. + db_drop_field($ret, 'views_object_cache', 'data'); + db_add_field($ret, 'views_object_cache', 'data', $new_field); + + return $ret; +} + +/** + * Enlarge the base_table column + */ +function views_update_6005() { + $ret = array(); + + $new_field = array( + 'type' => 'varchar', + 'length' => '64', + 'default' => '', + 'not null' => TRUE, + 'description' => 'What table this view is based on, such as node, user, comment, or term.', + ); + db_change_field($ret, 'views_view', 'base_table', 'base_table', $new_field); + return $ret; +} + +/** + * Add the cache_views_data table to support standard caching. + */ +function views_update_6006() { + $ret = array(); + + $table = drupal_get_schema_unprocessed('system', 'cache'); + $table['description'] = 'Cache table for views to store pre-rendered queries, results, and display output.'; + $table['fields']['serialized']['default'] = 1; + + db_create_table($ret, 'cache_views_data', $table); + + return $ret; +} + +/** + * Add aggregate function to PostgreSQL so GROUP BY can be used to force only + * one result to be returned for each item. + */ +function views_update_6007() { + $ret = array(); + if ($GLOBALS['db_type'] == 'pgsql') { + $ret[] = update_sql('CREATE OR REPLACE FUNCTION first(anyelement, anyelement) RETURNS anyelement AS \'SELECT COALESCE($1, $2);\' LANGUAGE \'sql\';'); + $ret[] = update_sql("DROP AGGREGATE IF EXISTS first(anyelement)"); + $ret[] = update_sql("CREATE AGGREGATE first(sfunc = first, basetype = anyelement, stype = anyelement);"); + } + return $ret; +} diff --git a/views.module b/views.module new file mode 100644 index 0000000000000000000000000000000000000000..0993c2f8b62331f46c535df154e7c758c15a4a60 --- /dev/null +++ b/views.module @@ -0,0 +1,1220 @@ + 'theme.inc', + 'path' => "$path/theme", + ); + + // Our extra version of pager from pager.inc + $hooks['views_mini_pager'] = $base + array( + 'arguments' => array('tags' => array(), 'limit' => 10, 'element' => 0, 'parameters' => array()), + 'pattern' => 'views_mini_pager__', + ); + + $arguments = array( + 'display' => array('view' => NULL), + 'style' => array('view' => NULL, 'options' => NULL, 'rows' => NULL, 'title' => NULL), + 'row' => array('view' => NULL, 'options' => NULL, 'row' => NULL, 'field_alias' => NULL), + ); + + // Default view themes + $hooks['views_view_field'] = $base + array( + 'pattern' => 'views_view_field__', + 'arguments' => array('view' => NULL, 'field' => NULL, 'row' => NULL), + ); + + $plugins = views_fetch_plugin_data(); + + // Register theme functions for all style plugins + foreach ($plugins as $type => $info) { + foreach ($info as $plugin => $def) { + if (isset($def['theme'])) { + $hooks[$def['theme']] = array( + 'pattern' => $def['theme'] . '__', + 'file' => $def['theme file'], + 'path' => $def['theme path'], + 'arguments' => $arguments[$type], + ); + + $include = './' . $def['theme path'] . '/' . $def['theme file']; + if (file_exists($include)) { + require_once $include; + } + + if (!function_exists('theme_' . $def['theme'])) { + $hooks[$def['theme']]['template'] = views_css_safe($def['theme']); + } + } + if (isset($def['additional themes'])) { + foreach ($def['additional themes'] as $theme => $theme_type) { + if (empty($theme_type)) { + $theme = $theme_type; + $theme_type = $type; + } + + $hooks[$theme] = array( + 'pattern' => $theme . '__', + 'file' => $def['theme file'], + 'path' => $def['theme path'], + 'arguments' => $arguments[$theme_type], + ); + + if (!function_exists('theme_' . $theme)) { + $hooks[$theme]['template'] = views_css_safe($theme); + } + } + } + } + } + + $hooks['views_exposed_form'] = $base + array( + 'template' => 'views-exposed-form', + 'pattern' => 'views_exposed_form__', + 'arguments' => array('form' => NULL), + ); + + $hooks['views_more'] = $base + array( + 'template' => 'views-more', + 'pattern' => 'views_more__', + 'arguments' => array('more_url' => NULL, 'link_text' => 'more'), + ); + return $hooks; +} + +/** + * A theme preprocess function to automatically allow view-based node + * templates if called from a view. + * + * The 'modules/node.views.inc' file is a better place for this, but + * we haven't got a chance to load that file before Drupal builds the + * node portion of the theme registry. + */ +function views_preprocess_node(&$vars) { + // The 'view' attribute of the node is added in template_preprocess_views_view_row_node() + if (!empty($vars['node']->view) && !empty($vars['node']->view->name)) { + $vars['view'] = &$vars['node']->view; + $vars['template_files'][] = 'node-view-' . $vars['node']->view->name; + if(!empty($vars['node']->view->current_display)) { + $vars['template_files'][] = 'node-view-' . $vars['node']->view->name . '-' . $vars['node']->view->current_display; + } + } +} + +/** + * A theme preprocess function to automatically allow view-based node + * templates if called from a view. + */ +function views_preprocess_comment(&$vars) { + // The 'view' attribute of the node is added in template_preprocess_views_view_row_comment() + if (!empty($vars['node']->view) && !empty($vars['node']->view->name)) { + $vars['view'] = &$vars['node']->view; + $vars['template_files'][] = 'comment-view-' . $vars['node']->view->name; + if(!empty($vars['node']->view->current_display)) { + $vars['template_files'][] = 'comment-view-' . $vars['node']->view->name . '-' . $vars['node']->view->current_display; + } + } +} + +/* + * Implementation of hook_perm() + */ +function views_perm() { + return array('access all views', 'administer views'); +} + +/** + * Implementation of hook_menu(). + */ +function views_menu() { + // Any event which causes a menu_rebuild could potentially mean that the + // Views data is updated -- module changes, profile changes, etc. + views_invalidate_cache(); + $items = array(); + $items['views/ajax'] = array( + 'title' => 'Views', + 'page callback' => 'views_ajax', + 'access callback' => TRUE, + 'description' => 'Ajax callback for view loading.', + 'file' => 'includes/ajax.inc', + 'type' => MENU_CALLBACK, + ); + // Path is not admin/build/views due to menu complications with the wildcards from + // the generic ajax callback. + $items['admin/views/ajax/autocomplete/user'] = array( + 'page callback' => 'views_ajax_autocomplete_user', + 'access callback' => 'user_access', + 'access arguments' => array('access content'), + 'file' => 'includes/ajax.inc', + 'type' => MENU_CALLBACK, + ); + return $items; +} + +/** + * Implementation of hook_menu_alter(). + */ +function views_menu_alter(&$callbacks) { + $our_paths = array(); + $views = views_get_applicable_views('uses hook menu'); + foreach ($views as $data) { + list($view, $display_id) = $data; + $result = $view->execute_hook_menu($display_id); + if (is_array($result)) { + // The menu system doesn't support having two otherwise + // identical paths with different placeholders. So we + // want to remove the existing items from the menu whose + // paths would conflict with ours. + + // First, we must find any existing menu items that may + // conflict. We use a regular expression because we don't + // know what placeholders they might use. Note that we + // first construct the regex itself by replacing %views_arg + // in the display path, then we use this constructed regex + // (which will be something like '#^(foo/%[^/]*/bar)$#') to + // search through the existing paths. + $regex = '#^(' . preg_replace('#%views_arg#', '%[^/]*', implode('|', array_keys($result))) . ')$#'; + $matches = preg_grep($regex, array_keys($callbacks)); + + // Remove any conflicting items that were found. + foreach ($matches as $path) { + // Don't remove the paths we just added! + if (!isset($our_paths[$path])) { + unset($callbacks[$path]); + } + } + foreach ($result as $path => $item) { + if (!isset($callbacks[$path])) { + // Add a new item, possibly replacing (and thus effectively + // overriding) one that we removed above. + $callbacks[$path] = $item; + } + else { + // This item already exists, so it must be one that we added. + // We change the various callback arguments to pass an array + // of possible display IDs instead of a single ID. + $callbacks[$path]['page arguments'][1] = (array)$callbacks[$path]['page arguments'][1]; + $callbacks[$path]['page arguments'][1][] = $display_id; + $callbacks[$path]['access arguments'][] = $item['access arguments'][0]; + $callbacks[$path]['load arguments'][1] = (array)$callbacks[$path]['load arguments'][1]; + $callbacks[$path]['load arguments'][1][] = $display_id; + } + $our_paths[$path] = TRUE; + } + } + } + + // Save memory: Destroy those views. + foreach ($views as $data) { + list($view, $display_id) = $data; + $view->destroy(); + } +} + +/** + * Helper function for menu loading. This will automatically be + * called in order to 'load' a views argument; primarily it + * will be used to perform validation. + * + * @param $value + * The actual value passed. + * @param $name + * The name of the view. This needs to be specified in the 'load function' + * of the menu entry. + * @param $index + * The menu argument index. This counts from 1. + */ +function views_arg_load($value, $name, $display_id, $index) { + if ($view = views_get_view($name)) { + $view->set_display($display_id); + $view->init_handlers(); + + $ids = array_keys($view->argument); + + $indexes = array(); + $path = explode('/', $view->get_path()); + + foreach ($path as $id => $piece) { + if ($piece == '%' && !empty($ids)) { + $indexes[$id] = array_shift($ids); + } + } + + if (isset($indexes[$index])) { + if (isset($view->argument[$indexes[$index]])) { + $arg = $view->argument[$indexes[$index]]->validate_argument($value) ? $value : FALSE; + $view->destroy(); + return $arg; + } + } + $view->destroy(); + } +} + +/** + * Page callback entry point; requires a view and a display id, then + * passes control to the display handler. + */ +function views_page() { + $args = func_get_args(); + $name = array_shift($args); + $display_id = array_shift($args); + + // Load the view + if ($view = views_get_view($name)) { + return $view->execute_display($display_id, $args); + } + + // Fallback; if we get here no view was found or handler was not valid. + return drupal_not_found(); +} + +/** + * Implementation of hook_block + */ +function views_block($op = 'list', $delta = 0, $edit = array()) { + switch ($op) { + case 'list': + $items = array(); + $views = views_get_all_views(); + foreach ($views as $view) { + // disabled views get nothing. + if (!empty($view->disabled)) { + continue; + } + + $view->init_display(); + foreach ($view->display as $display_id => $display) { + + if (isset($display->handler) && !empty($display->handler->definition['uses hook block'])) { + $result = $display->handler->execute_hook_block(); + if (is_array($result)) { + $items = array_merge($items, $result); + } + } + + if (isset($display->handler) && $display->handler->get_option('exposed_block')) { + $result = $display->handler->get_special_blocks(); + if (is_array($result)) { + $items = array_merge($items, $result); + } + } + } + } + + // block.module has a delta length limit of 32, but our deltas can + // unfortunately be longer because view names can be 32 and display IDs + // can also be 32. So for very long deltas, change to md5 hashes. + $hashes = array(); + + // get the keys because we're modifying the array and we don't want to + // confuse PHP too much. + $keys = array_keys($items); + foreach ($keys as $delta) { + if (strlen($delta) >= 32) { + $hash = md5($delta); + $hashes[$hash] = $delta; + $items[$hash] = $items[$delta]; + unset($items[$delta]); + } + } + + variable_set('views_block_hashes', $hashes); + // Save memory: Destroy those views. + foreach ($views as $view) { + $view->destroy(); + } + + return $items; + case 'view': + $start = views_microtime(); + // if this is 32, this should be an md5 hash. + if (strlen($delta) == 32) { + $hashes = variable_get('views_block_hashes', array()); + if (!empty($hashes[$delta])) { + $delta = $hashes[$delta]; + } + } + + // This indicates it's a special one. + if (substr($delta, 0, 1) == '-') { + list($nothing, $type, $name, $display_id) = explode('-', $delta); + // Put the - back on. + $type = '-' . $type; + if ($view = views_get_view($name)) { + if ($view->access($display_id)) { + $view->set_display($display_id); + if (isset($view->display_handler)) { + $output = $view->display_handler->view_special_blocks($type); + $view->destroy(); + return $output; + } + } + $view->destroy(); + } + } + + list($name, $display_id) = explode('-', $delta); + // Load the view + if ($view = views_get_view($name)) { + if ($view->access($display_id)) { + $output = $view->execute_display($display_id); + vpr("Block $view->name execute time: " . (views_microtime() - $start) * 1000 . "ms"); + $view->destroy(); + return $output; + } + $view->destroy(); + } + break; + } +} + +/** + * Implementation of hook_flush_caches(). + */ +function views_flush_caches() { + return array('cache_views', 'cache_views_data'); +} + +/** + * Invalidate the views cache, forcing a rebuild on the next grab of table data. + */ +function views_invalidate_cache() { + cache_clear_all('*', 'cache_views', true); +} + +/** + * Determine if the logged in user has access to a view. + * + * This function should only be called from a menu hook or some other + * embedded source. Each argument is the result of a call to + * views_plugin_access::get_access_callback() which is then used + * to determine if that display is accessible. If *any* argument + * is accessible, then the view is accessible. + */ +function views_access() { + if (user_access('access all views')) { + return TRUE; + } + + $args = func_get_args(); + foreach ($args as $arg) { + if ($arg === TRUE) { + return TRUE; + } + + if (!is_array($arg)) { + continue; + } + + list($callback, $arguments) = $arg; + if (function_exists($callback) && call_user_func_array($callback, $arguments)) { + return TRUE; + } + } + + return FALSE; +} + +/** + * Access callback to determine if the logged in user has any of the + * requested roles. + * + * This must be in views.module as it is called by menu access callback + * and can be called often. + */ +function views_check_roles($rids) { + global $user; + $roles = array_keys($user->roles); + $roles[] = $user->uid ? DRUPAL_AUTHENTICATED_RID : DRUPAL_ANONYMOUS_RID; + return array_intersect(array_filter($rids), $roles); +} +// ------------------------------------------------------------------ +// Functions to help identify views that are running or ran + +/** + * Set the current 'page view' that is being displayed so that it is easy + * for other modules or the theme to identify. + */ +function &views_set_page_view($view = NULL) { + static $cache = NULL; + if (isset($view)) { + $cache = $view; + } + + return $cache; +} + +/** + * Find out what, if any, page view is currently in use. Please note that + * this returns a reference, so be careful! You can unintentionally modify the + * $view object. + */ +function &views_get_page_view() { + return views_set_page_view(); +} + +/** + * Set the current 'current view' that is being built/rendered so that it is + * easy for other modules or items in drupal_eval to identify + */ +function &views_set_current_view($view = NULL) { + static $cache = NULL; + if (isset($view)) { + $cache = $view; + } + + return $cache; +} + +/** + * Find out what, if any, current view is currently in use. Please note that + * this returns a reference, so be careful! You can unintentionally modify the + * $view object. + */ +function &views_get_current_view() { + return views_set_current_view(); +} + +// ------------------------------------------------------------------ +// Include file helpers + +/** + * Include views .inc files as necessary. + */ +function views_include($file) { + static $used = array(); + if (!isset($used[$file])) { + require_once './' . drupal_get_path('module', 'views') . "/includes/$file.inc"; + } + + $used[$file] = TRUE; +} + +/** + * Load views files on behalf of modules. + */ +function views_module_include($file) { + foreach (views_get_module_apis() as $module => $info) { + if (file_exists("./$info[path]/$module.$file")) { + require_once "./$info[path]/$module.$file"; + } + } +} + +/** + * Get a list of modules that support the current views API. + */ +function views_get_module_apis() { + static $cache = NULL; + if (!isset($cache)) { + $cache = array(); + foreach (module_implements('views_api') as $module) { + $function = $module . '_views_api'; + $info = $function(); + if (isset($info['api']) && $info['api'] == 2.000) { + if (!isset($info['path'])) { + $info['path'] = drupal_get_path('module', $module); + } + $cache[$module] = $info; + } + } + } + + return $cache; +} + +/** + * Include views .css files. + */ +function views_add_css($file) { + // We set preprocess to FALSE because we are adding the files conditionally, + // and we don't want to generate duplicate cache files. + // TODO: at some point investigate adding some files unconditionally and + // allowing preprocess. + drupal_add_css(drupal_get_path('module', 'views') . "/css/$file.css", 'module', 'all', FALSE); +} + +/** + * Include views .js files. + */ +function views_add_js($file) { + // If javascript has been disabled by the user, never add js files. + if (variable_get('views_no_javascript', FALSE)) { + return; + } + + static $base = TRUE; + if ($base) { + drupal_add_js(drupal_get_path('module', 'views') . "/js/base.js"); + $base = FALSE; + } + drupal_add_js(drupal_get_path('module', 'views') . "/js/$file.js"); +} + +/** + * Load views files on behalf of modules. + */ +function views_include_handlers() { + static $finished = FALSE; + // Ensure this only gets run once. + if ($finished) { + return; + } + + views_include('base'); + views_include('handlers'); + views_include('cache'); + views_include('plugins'); + _views_include_handlers(); + $finished = TRUE; +} + +/** + * Load default views files on behalf of modules. + */ +function views_include_default_views() { + static $finished = FALSE; + // Ensure this only gets run once. + if ($finished) { + return; + } + + // Default views hooks may be in the normal handler file, + // or in a separate views_default file at the discretion of + // the module author. + views_include_handlers(); + + _views_include_default_views(); + $finished = TRUE; +} + +// ----------------------------------------------------------------------- +// Views handler functions + +/** + * Fetch a handler from the data cache. + * + * @param $table + * The name of the table this handler is from. + * @param $field + * The name of the field this handler is from. + * @param $key + * The type of handler. i.e, sort, field, argument, filter, relationship + * + * @return + * An instance of a handler object. May be views_handler_broken. + */ +function views_get_handler($table, $field, $key) { + $data = views_fetch_data($table); + if (isset($data[$field][$key])) { + // Set up a default handler: + if (empty($data[$field][$key]['handler'])) { + $data[$field][$key]['handler'] = 'views_handler_' . $key; + } + return _views_prepare_handler($data[$field][$key], $data, $field); + } + // DEBUG -- identify missing handlers + vpr("Missing handler: $table $field $key"); + $broken = array( + 'title' => t('Broken handler @table.@field', array('@table' => $table, '@field' => $field)), + 'handler' => 'views_handler_' . $key . '_broken', + 'table' => $table, + 'field' => $field, + ); + return _views_create_handler($broken); +} + +/** + * Fetch Views' data from the cache + */ +function views_fetch_data($table = NULL) { + views_include('cache'); + return _views_fetch_data($table); +} + +// ----------------------------------------------------------------------- +// Views plugin functions + +/** + * Fetch the plugin data from cache. + */ +function views_fetch_plugin_data($type = NULL, $plugin = NULL) { + views_include('cache'); + return _views_fetch_plugin_data($type, $plugin); +} + +/** + * Get a handler for a plugin + */ +function views_get_plugin($type, $plugin) { + $definition = views_fetch_plugin_data($type, $plugin); + if (!empty($definition)) { + return _views_create_handler($definition, $type); + } +} + +// ----------------------------------------------------------------------- +// Views database functions + +/** + * Get a view from the default views defined by modules. + * + * Default views are cached per-language. This function will rescan the + * default_views hook if necessary. + * + * @param $view_name + * The name of the view to load. + * @return + * A view object or NULL if it is not available. + */ +function &views_get_default_view($view_name) { + $null = NULL; + $cache = views_discover_default_views(); + + if (isset($cache[$view_name])) { + return $cache[$view_name]; + } + return $null; +} + +/** + * Create an empty view to work with. + * + * @return + * A fully formed, empty $view object. This object must be populated before + * it can be successfully saved. + */ +function views_new_view() { + views_include('view'); + $view = new view(); + $view->vid = 'new'; + $view->add_display('default'); + + return $view; +} + +/** + * Scan all modules for default views and rebuild the default views cache. + * + * @return An associative array of all known default views. + */ +function views_discover_default_views() { + static $cache = array(); + + if (empty($cache)) { + views_include('cache'); + $cache = _views_discover_default_views(); + } + return $cache; +} + +/** + * Return a list of all views and display IDs that have a particular + * setting in their display's plugin settings. + * + * @return + * @code + * array( + * array($view, $display_id), + * array($view, $display_id), + * ); + * @endcode + */ +function views_get_applicable_views($type) { + // @todo: Use a smarter flagging system so that we don't have to + // load every view for this. + $result = array(); + $views = views_get_all_views(); + + foreach ($views as $view) { + // Skip disabled views. + if (!empty($view->disabled)) { + continue; + } + + if (empty($view->display)) { + // Skip this view as it is broken. + vsm(t("Skipping broken view @view", array('@view' => $view->name))); + continue; + } + + // Loop on array keys because something seems to muck with $view->display + // a bit in PHP4. + foreach (array_keys($view->display) as $id) { + $plugin = views_fetch_plugin_data('display', $view->display[$id]->display_plugin); + if (!empty($plugin[$type])) { + // This view uses hook menu. Clone it so that different handlers + // don't trip over each other, and add it to the list. + $v = $view->clone_view(); + if ($v->set_display($id)) { + $result[] = array($v, $id); + } + // In PHP 4.4.7 and presumably earlier, if we do not unset $v + // here, we will find that it actually overwrites references + // possibly due to shallow copying issues. + unset($v); + } + } + } + return $result; +} + +/** + * Return an array of all views as fully loaded $view objects. + * + * @param $reset + * If TRUE, reset the static cache forcing views to be reloaded. + */ +function views_get_all_views($reset = FALSE) { + static $views = array(); + + if (empty($views) || $reset) { + $views = array(); + + // First, get all applicable views. + views_include('view'); + $views = view::load_views(); + + // Get all default views. + $status = variable_get('views_defaults', array()); + + foreach (views_discover_default_views() as $view) { + // Determine if default view is enabled or disabled. + if (isset($status[$view->name])) { + $view->disabled = $status[$view->name]; + } + + // If overridden, also say so. + if (!empty($views[$view->name])) { + $views[$view->name]->type = t('Overridden'); + } + else { + $view->type = t('Default'); + $views[$view->name] = $view; + } + } + + } + return $views; +} + +/** + * Get a view from the database or from default views. + * + * This function is just a static wrapper around views::load(). This function + * isn't called 'views_load()' primarily because it might get a view + * from the default views which aren't technically loaded from the database. + * + * @param $name + * The name of the view. + * @param $reset + * If TRUE, reset this entry in the load cache. + * @return $view + * A reference to the $view object. Use $reset if you're sure you want + * a fresh one. + */ +function views_get_view($name, $reset = FALSE) { + views_include('view'); + $view = view::load($name, $reset); + $default_view = views_get_default_view($name); + + if (empty($view) && empty($default_view)) { + return; + } + elseif (empty($view) && !empty($default_view)) { + $default_view->type = t('Default'); + return $default_view->clone_view(); + } + elseif (!empty($view) && !empty($default_view)) { + $view->type = t('Overridden'); + } + + return $view->clone_view(); +} + + +// ------------------------------------------------------------------ +// Views debug helper functions + +/** + * Provide debug output for Views. This relies on devel.module + */ +function views_debug($message) { + if (module_exists('devel') && variable_get('views_devel_output', FALSE) && user_access('access devel information')) { + if (is_string($message)) { + $output = $message; + } + else { + $output = var_export($message, TRUE); + } + if (variable_get('views_devel_region', 'footer') != 'watchdog') { + drupal_set_content(variable_get('views_devel_region', 'footer'), '
    ' . $output . '
    '); + } + else { + watchdog('views_logging', '
    ' . $output . '
    '); + } + } +} + +/** + * Shortcut to views_debug() + */ +function vpr($message) { + views_debug($message); +} + +/** + * Debug messages + */ +function vsm($message) { + if (module_exists('devel')) { + dsm($message); + } +} + +function views_trace() { + $message = ''; + foreach (debug_backtrace() as $item) { + if (!empty($item['file']) && !in_array($item['function'], array('vsm_trace', 'vpr_trace', 'views_trace'))) { + $message .= basename($item['file']) . ": " . (empty($item['class']) ? '' : ($item['class'] . '->')) . "$item[function] line $item[line]" . "\n"; + } + } + return $message; +} + +function vsm_trace() { + vsm(views_trace()); +} + +function vpr_trace() { + dpr(views_trace()); +} + +// ------------------------------------------------------------------ +// Exposed widgets form + +/** + * Form builder for the exposed widgets form. + * + * Be sure that $view and $display are references. + */ +function views_exposed_form(&$form_state) { + // Don't show the form when batch operations are in progress. + $batch =& batch_get(); + if (!empty($batch)) { + return array( + // Set the theme callback to be nothing to avoid errors in template_preprocess_views_exposed_form(). + '#theme' => '', + ); + } + + // Make sure that we validate because this form might be submitted + // multiple times per page. + $form_state['must_validate'] = TRUE; + $view = &$form_state['view']; + $display = &$form_state['display']; + + $form_state['input'] = $view->get_exposed_input(); + + // Let form plugins know this is for exposed widgets. + $form_state['exposed'] = TRUE; + // Check if the form was already created + if ($cache = views_exposed_form_cache($view->name, $view->current_display)) { + return $cache; + } + + $form['#info'] = array(); + + if (!variable_get('clean_url', FALSE)) { + $form['q'] = array( + '#type' => 'hidden', + '#value' => $view->get_url(), + ); + } + + // Go through each filter and let it generate its info. + foreach ($view->filter as $id => $filter) { + $view->filter[$id]->exposed_form($form, $form_state); + if ($info = $view->filter[$id]->exposed_info()) { + $form['#info']['filter-' . $id] = $info; + } + } + + // @todo deal with exposed sorts + + $form['submit'] = array( + '#name' => '', // prevent from showing up in $_GET. + '#type' => 'submit', + '#value' => t('Apply'), + '#id' => form_clean_id('edit-submit-' . $view->name), + ); + + $form['#action'] = url($view->get_url()); + $form['#theme'] = views_theme_functions('views_exposed_form', $view, $display); + $form['#id'] = views_css_safe('views_exposed_form-' . check_plain($view->name) . '-' . check_plain($display->id)); +// $form['#attributes']['class'] = array('views-exposed-form'); + + // If using AJAX, we need the form plugin. + if ($view->use_ajax) { + drupal_add_js('misc/jquery.form.js'); + } + views_add_js('dependent'); + + // Save the form + views_exposed_form_cache($view->name, $view->current_display, $form); + + return $form; +} + +/** + * Validate handler for exposed filters + */ +function views_exposed_form_validate(&$form, &$form_state) { + foreach (array('field', 'filter') as $type) { + $handlers = &$form_state['view']->$type; + foreach ($handlers as $key => $handler) { + $handlers[$key]->exposed_validate($form, $form_state); + } + } +} + +/** + * Submit handler for exposed filters + */ +function views_exposed_form_submit(&$form, &$form_state) { + foreach (array('field', 'filter') as $type) { + $handlers = &$form_state['view']->$type; + foreach ($handlers as $key => $info) { + $handlers[$key]->exposed_submit($form, $form_state); + } + } + $form_state['view']->exposed_data = $form_state['values']; + $form_state['view']->exposed_raw_input = array(); + + foreach ($form_state['values'] as $key => $value) { + if (!in_array($key, array('q', 'submit', 'form_build_id', 'form_id', 'form_token', ''))) { + $form_state['view']->exposed_raw_input[$key] = $value; + } + } +} + +/** + * Save the Views exposed form for later use. + * + * @param $views_name + * String. The views name. + * @param $display_name + * String. The current view display name. + * @param $form_output + * Array (optional). The form structure. Only needed when inserting the value. + * @return + * Array. The form structure, if any. Otherwise, return FALSE. + */ +function views_exposed_form_cache($views_name, $display_name, $form_output = NULL) { + static $views_exposed; + + // Save the form output + if (!empty($form_output)) { + $views_exposed[$views_name][$display_name] = $form_output; + return; + } + + // Return the form output, if any + return empty($views_exposed[$views_name][$display_name]) ? FALSE : $views_exposed[$views_name][$display_name]; +} + +// ------------------------------------------------------------------ +// Misc helpers + +/** + * Build a list of theme function names for use most everywhere. + */ +function views_theme_functions($hook, $view, $display = NULL) { + require_once './' . drupal_get_path('module', 'views') . "/theme/theme.inc"; + return _views_theme_functions($hook, $view, $display); +} + +/** + * Views' replacement for drupal_get_form so that we can do more with + * less. + * + * Items that can be set on the form_state include: + * - input: The source of input. If unset this will be $_POST. + * - no_redirect: Absolutely do not redirect the form even if instructed + * to do so. + * - rerender: If no_redirect is set and the form was successfully submitted, + * rerender the form. Otherwise it will just return. + * + */ +function drupal_build_form($form_id, &$form_state) { + views_include('form'); + return _drupal_build_form($form_id, $form_state); +} + +/** + * Substitute current time; this works with cached queries. + */ +function views_views_query_substitutions($view) { + global $language; + return array( + '***CURRENT_VERSION***' => VERSION, + '***CURRENT_TIME***' => time(), + '***CURRENT_LANGUAGE***' => $language->language, + '***DEFAULT_LANGUAGE***' => language_default('language'), + '***NO_LANGUAGE***' => '', + ); +} + +/** + * Embed a view using a PHP snippet. + * + * This function is meant to be called from PHP snippets, should one wish to + * embed a view in a node or something. It's meant to provide the simplest + * solution and doesn't really offer a lot of options, but breaking the function + * apart is pretty easy, and this provides a worthwhile guide to doing so. + * + * Note that this function does NOT display the title of the view. If you want + * to do that, you will need to do what this function does manually, by + * loading the view, getting the preview and then getting $view->get_title(). + * + * @param $name + * The name of the view to embed. + * @param $display_id + * The display id to embed. If unsure, use 'default', as it will always be + * valid. But things like 'page' or 'block' should work here. + * @param ... + * Any additional parameters will be passed as arguments. + */ +function views_embed_view($name, $display_id = 'default') { + $args = func_get_args(); + array_shift($args); // remove $name + if (count($args)) { + array_shift($args); // remove $display_id + } + + $view = views_get_view($name); + if (!$view || !$view->access($display_id)) { + return; + } + + return $view->preview($display_id, $args); +} + +/** + * Export a field. + */ +function views_var_export($var, $prefix = '', $init = TRUE) { + if (is_array($var)) { + if (empty($var)) { + $output = 'array()'; + } + else { + $output = "array(\n"; + foreach ($var as $key => $value) { + $output .= " '$key' => " . views_var_export($value, ' ', FALSE) . ",\n"; + } + $output .= ')'; + } + } + else if (is_bool($var)) { + $output = $var ? 'TRUE' : 'FALSE'; + } + else if (is_string($var) && strpos($var, "\n") !== FALSE) { + // Replace line breaks in strings with a token for replacement + // at the very end. This protects multi-line strings from + // unintentional indentation. + $var = str_replace("\n", "***BREAK***", $var); + $output = var_export($var, TRUE); + } + else { + $output = var_export($var, TRUE); + } + + if ($prefix) { + $output = str_replace("\n", "\n$prefix", $output); + } + + if ($init) { + $output = str_replace("***BREAK***", "\n", $output); + } + + return $output; +} + +/** + * Prepare the specified string for use as a CSS identifier. + */ +function views_css_safe($string) { + return str_replace('_', '-', $string); +} + +/** + * Implementation of hook_views_exportables(). + */ +function views_views_exportables($op = 'list', $views = NULL, $name = 'foo') { + $all_views = views_get_all_views(); + if ($op == 'list') { + + foreach ($all_views as $name => $view) { + // in list, $views is a list of tags. + if (empty($views) || in_array($view->tag, $views)) { + $return[$name] = array( + 'name' => check_plain($name), + 'desc' => check_plain($view->description), + 'tag' => check_plain($view->tag) + ); + } + } + return $return; + } + + if ($op == 'export') { + $code = "/**\n"; + $code .= " * Implementation of hook_views_default_views().\n"; + $code .= " */\n"; + $code .= "function " . $name . "_views_default_views() {\n"; + foreach ($views as $view => $truth) { + $code .= " /*\n"; + $code .= " * View ". var_export($all_views[$view]->name, TRUE) ."\n"; + $code .= " */\n"; + $code .= $all_views[$view]->export(' '); + $code .= ' $views[$view->name] = $view;' . "\n\n"; + } + $code .= " return \$views;\n"; + $code .= "}\n"; + + return $code; + } +} + +/** + * Microtime helper function to return a float time value (php4 & php5 safe). + */ +function views_microtime() { + list($usec, $sec) = explode(' ', microtime()); + return (float)$sec + (float)$usec; +} diff --git a/views2.doxy b/views2.doxy new file mode 100644 index 0000000000000000000000000000000000000000..7d95c1a0e524bed3e10dd8b1ef1f8f9bdc1f1a30 --- /dev/null +++ b/views2.doxy @@ -0,0 +1,1252 @@ +# Doxyfile 1.4.7 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = Views + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 2.0 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, +# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, +# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, +# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, +# Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# This tag can be used to specify the encoding used in the generated output. +# The encoding is not always determined by the language that is chosen, +# but also whether or not the output is meant for Windows or non-Windows users. +# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES +# forces the Windows encoding (this is the default for the Windows binary), +# whereas setting the tag to NO uses a Unix-style encoding (the default for +# all platforms other than Windows). + +USE_WINDOWS_ENCODING = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = YES + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = YES + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explicit @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the DETAILS_AT_TOP tag is set to YES then Doxygen +# will output the detailed description near the top, like JavaDoc. +# If set to NO, the detailed description appears after the member +# documentation. + +DETAILS_AT_TOP = YES + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 2 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for Java. +# For instance, namespaces will be presented as packages, qualified scopes +# will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to +# include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from the +# version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = NO + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py + +FILE_PATTERNS = *.module *.inc *.php + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = YES + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES (the default) +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES (the default) +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentstion. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. + +GENERATE_TREEVIEW = YES + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = NO + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a call dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# generate a caller dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that a graph may be further truncated if the graph's +# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH +# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), +# the graph is not depth-constrained. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, which results in a white background. +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO diff --git a/views_export/views_export.css b/views_export/views_export.css new file mode 100644 index 0000000000000000000000000000000000000000..ffd8b5c65f28e6e77acfa7e867aa61cd0ecab909 --- /dev/null +++ b/views_export/views_export.css @@ -0,0 +1,13 @@ +/* $Id$ */ + +div.export-container table input, +div.export-container table th, +div.export-container table td { + padding: 0 0 0 .5em; + margin: 0; + vertical-align: top; +} + +div.export-container table td input { + margin-top: .25em; +} diff --git a/views_export/views_export.info b/views_export/views_export.info new file mode 100644 index 0000000000000000000000000000000000000000..c429ce1b601a6cfdc0a1f69b5300abacda9073f6 --- /dev/null +++ b/views_export/views_export.info @@ -0,0 +1,7 @@ +; $Id$ + +name = Views exporter +description = Allows exporting multiple views at once. +package = "Views" +dependencies[] = views +core = 6.x diff --git a/views_export/views_export.module b/views_export/views_export.module new file mode 100644 index 0000000000000000000000000000000000000000..0e3effcc8b05f88a562c7dd440172aa0a99bb33c --- /dev/null +++ b/views_export/views_export.module @@ -0,0 +1,256 @@ + 'Bulk export', + 'access arguments' => array('use views exporter'), + 'page callback' => 'views_export_export', + 'type' => MENU_LOCAL_TASK, + ); + + $items['admin/build/views/tools/export/results'] = array( + 'access arguments' => array('use views exporter'), + 'page callback' => 'views_export_export', + 'type' => MENU_CALLBACK, + ); + + return $items; +} + +function views_export_theme() { + return array( + 'views_export_export_form' => array( + 'args' => array('form' => NULL), + ), + ); +} + +/** + * Implementation of hook_perm(). + */ +function views_export_perm() { + return array('use views exporter'); +} + +/** + * Page callback to export views in bulk. + */ +function views_export_export() { + $tags = array(); + if (!empty($_GET['tags'])) { + $tags = explode(',', $_GET['tags']); + } + + $exportables = array(); + foreach (module_implements('views_exportables') as $module) { + $function = $module . '_views_exportables'; + $exportables[$module] = $function('list', $tags); + asort($exportables[$module]); + } + + if ($exportables) { + $form_state = array( + 'no_redirect' => TRUE, + 'exportables' => $exportables, + 'tags' => $tags, + ); + + $output = drupal_build_form('views_export_export_form', $form_state); + if (!$output) { + $output = $form_state['output']; + } + return $output; + } + else { + return t('There are no views to be exported at this time.'); + } +} + +/** + * Form to choose a group of views to export. + */ +function views_export_export_form(&$form_state) { + foreach ($form_state['exportables'] as $module => $views) { + foreach ($views as $name => $data) { + $options[$name] = $data['name']; + } + + $form['modules']['#tree'] = TRUE; + $form['modules'][$module] = array( + '#type' => 'checkboxes', + '#options' => $options, + '#default_value' => array(), + ); + } + + $tags = array(); + foreach (views_get_all_views() as $name => $view) { + if (!empty($view->tag)) { + $tags[$view->tag] = $view->tag; + } + } + + asort($tags); + + $form['tags'] = array( + '#type' => 'select', + '#title' => t('Show only these tags'), + '#options' => $tags, + '#default_value' => $form_state['tags'], + '#multiple' => TRUE, + ); + + $form['apply'] = array( + '#type' => 'submit', + '#value' => t('Apply'), + '#submit' => array('views_export_export_form_apply'), + ); + + $form['name'] = array( + '#type' => 'textfield', + '#title' => t('Module name'), + '#description' => t('Enter the module name to export code to.'), + ); + + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Export'), + ); + + $form['#action'] = url('admin/build/views/tools/export/results'); + $form['#redirect'] = FALSE; + $form['#exportables'] = $form_state['exportables']; + return $form; +} + +function theme_views_export_export_form($form) { + $output = ''; + $files = module_rebuild_cache(); + $exportables = $form['#exportables']; + $output .= drupal_render($form['tags']); + $output .= drupal_render($form['apply']); + $output .= '
    '; + + foreach ($exportables as $module => $views) { + $header = array(theme('table_select_header_cell'), $files[$module]->info['name'], t('Tag'), t('Description')); + $rows = array(); + foreach ($views as $name => $view) { + $title = $form['modules'][$module][$name]['#title']; + unset($form['modules'][$module][$name]['#title']); + $rows[] = array(drupal_render($form['modules'][$module][$name]), $title, $view['tag'], '
    ' . $view['desc'] . '
    '); + } + $output .= '
    '; + $output .= theme('table', $header, $rows); + $output .= "
    \n"; + } + $output .= '
    '; + drupal_add_css(drupal_get_path('module', 'views_export') . '/views_export.css'); + $output .= drupal_render($form); + return $output; +} + +function views_export_export_form_apply(&$form, &$form_state) { + $tags = $form_state['values']['tags']; + if ($tags) { + drupal_goto('admin/build/views/tools/export', array('tags' => implode(',', $tags))); + } + else { + drupal_goto('admin/build/views/tools/export'); + } +} + +function views_export_export_form_submit(&$form, &$form_state) { + $code = ''; + if (empty($form_state['values']['name'])) { + $form_state['values']['name'] = 'foo'; + } + + foreach ($form_state['values']['modules'] as $module => $views) { + $views = array_filter($views); + asort($views); + if ($views) { + $code .= module_invoke($module, 'views_exportables', 'export', $views, $form_state['values']['name']) . "\n\n"; + } + } + + $lines = substr_count($code, "\n"); + + $types = system_elements(); + + $info = "; \$Id" . ": $\n"; // The break in the string prevents CVS. + $info .= "\n"; + $info .= strtr("name = @module Export Module\n", array('@module' => $form_state['values']['name'])); + $info .= strtr("description = Exports some views of @module\n", array('@module' => $form_state['values']['name'])); + $info .= "dependencies[] = views\n"; + $info .= "core = 6.x\n"; + + + $element_info = array( + '#title' => t('Put this in @module.info in your modules/@module directory', array('@module' => $form_state['values']['name'])), + '#type' => 'textarea', + '#id' => 'export-info-textarea', + '#name' => 'export-info-textarea', + '#attributes' => array(), + '#rows' => 9, + '#cols' => 60, + '#value' => $info, + '#parents' => array('dummy'), + '#required' => FALSE, + ) + $types['textarea']; + + $api = "/**\n"; + $api .= " * Implementation of hook_views_api().\n"; + $api .= " */\n"; + $api .= "function @module_views_api() {\n"; + $api .= " return array(\n"; + $api .= " 'api' => 2,\n"; + $api .= " 'path' => drupal_get_path('module', '@module'),\n"; + $api .= " //'path' => drupal_get_path('module', '@module') . '/includes',\n"; + $api .= " );\n"; + $api .= "}"; + + $api = strtr($api, array('@module' => check_plain($form_state['values']['name']))); + + $element_api = array( + '#title' => t('Put this in @module.module in your modules/@module directory', array('@module' => $form_state['values']['name'])), + '#type' => 'textarea', + '#id' => 'export-api-textarea', + '#name' => 'export-api-textarea', + '#attributes' => array( 'dir' => 'ltr' ), + '#rows' => 9, + '#cols' => 60, + '#value' => $api, + '#parents' => array('dummy'), + '#required' => FALSE, + ) + $types['textarea']; + + $element_hook = array( + '#title' => t('Put this in @module.views_default.inc in your modules/@module directory or modules/@module/includes directory', array('@module' => $form_state['values']['name'])), + '#type' => 'textarea', + '#id' => 'export-textarea', + '#name' => 'export-textarea', + '#attributes' => array( 'dir' => 'ltr' ), + '#rows' => min($lines, 150), + '#value' => $code, + '#parents' => array('dummy'), + '#required' => FALSE, + ) + $types['textarea']; + + + $form_state['output'] = theme('textarea', $element_info); + $form_state['output'] .= theme('textarea', $element_api); + $form_state['output'] .= theme('textarea', $element_hook); +} + diff --git a/views_ui.info b/views_ui.info new file mode 100644 index 0000000000000000000000000000000000000000..c3a2dcb7e96047eb84b15c7953461219281e30de --- /dev/null +++ b/views_ui.info @@ -0,0 +1,6 @@ +; $Id$ +name = Views UI +description = Administrative interface to views. Without this module, you cannot create or edit your views. +package = Views +core = 6.x +dependencies[] = views diff --git a/views_ui.module b/views_ui.module new file mode 100644 index 0000000000000000000000000000000000000000..49fe6138be179e88ab77216d8c7aefdb790e1a33 --- /dev/null +++ b/views_ui.module @@ -0,0 +1,297 @@ + 'user_access', + 'access arguments' => array('administer views'), + 'file' => 'includes/admin.inc', + ); + + $callback = $base + array('type' => MENU_CALLBACK); + + $convert = array('file' => 'includes/convert.inc') + $base; + + $items['admin/build/views'] = $base + array( + 'title' => 'Views', + 'page callback' => 'views_ui_list_views', + 'description' => 'Views are customized lists of content on your system; they are highly configurable and give you control over how lists of content are presented.', + 'type' => MENU_NORMAL_ITEM + ); + $items['admin/build/views/list'] = $base + array( + 'title' => 'List', + 'page callback' => 'views_ui_list_views', + 'type' => MENU_DEFAULT_LOCAL_TASK, + 'weight' => '-1' + ); + $items['admin/build/views/add'] = $base + array( + 'title' => 'Add', + 'page callback' => 'views_ui_add_page', + 'type' => MENU_LOCAL_TASK + ); + $items['admin/build/views/import'] = $base + array( + 'title' => 'Import', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('views_ui_import_page'), + 'type' => MENU_LOCAL_TASK + ); + $items['admin/build/views/tools'] = $base + array( + 'title' => 'Tools', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('views_ui_admin_tools'), + 'type' => MENU_LOCAL_TASK + ); + $items['admin/build/views/tools/basic'] = $base + array( + 'title' => 'Basic', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('views_ui_admin_tools'), + 'type' => MENU_DEFAULT_LOCAL_TASK, + 'weight' => -10, + ); + + $items['admin/build/views/tools/convert'] = $convert + array( + 'title' => 'Convert', + 'description' => 'Convert stored Views 1 views.', + 'page callback' => 'views_ui_admin_convert', + 'type' => MENU_LOCAL_TASK, + 'weight' => 1, + ); + $items['admin/build/views1/delete'] = $convert + array( + 'title' => 'Delete view', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('views_ui_delete1_confirm', 4), + 'type' => MENU_CALLBACK, + ); + $items['admin/build/views1/convert'] = $convert + array( + 'title' => 'Convert view', + 'page callback' => 'views_ui_convert1', + 'page arguments' => array(4), + 'type' => MENU_CALLBACK, + ); + + $items['admin/build/views/delete/%views_ui_cache'] = $callback + array( + 'title' => 'Delete view', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('views_ui_delete_confirm', 4), + ); + $items['admin/build/views/break-lock/%views_ui_cache'] = $callback + array( + 'title' => 'Delete view', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('views_ui_break_lock_confirm', 4), + ); + $items['admin/build/views/export/%views_ui_cache'] = $callback + array( + 'page callback' => 'drupal_get_form', + 'page arguments' => array('views_ui_export_page', 4), + 'type' => MENU_LOCAL_TASK + ); + $items['admin/build/views/clone/%views_ui_cache'] = $callback + array( + 'page callback' => 'views_ui_clone_page', + 'page arguments' => array(4), + 'type' => MENU_LOCAL_TASK + ); + $items['admin/build/views/enable/%views_ui_default'] = $callback + array( + 'page callback' => 'views_ui_enable_page', + 'page arguments' => array(4), + ); + $items['admin/build/views/disable/%views_ui_default'] = $callback + array( + 'page callback' => 'views_ui_disable_page', + 'page arguments' => array(4), + ); + + // Many line items for editing a view. + $items['admin/build/views/edit/%views_ui_cache'] = $base + array( + 'title' => 'Edit', + 'page callback' => 'views_ui_edit_page', + 'page arguments' => array(4), + 'type' => MENU_LOCAL_TASK + ); + // lots of little edit form pieces. + $items['admin/build/views/%views_ui_js/analyze/%views_ui_cache'] = $callback + array( + 'page callback' => 'views_ui_analyze_view', + 'page arguments' => array(3, 5), + ); + $items['admin/build/views/%views_ui_js/details/%views_ui_cache'] = $callback + array( + 'page callback' => 'views_ui_edit_details', + 'page arguments' => array(3, 5), + ); + $items['admin/build/views/%views_ui_js/add-display/%views_ui_cache'] = $callback + array( + 'page callback' => 'views_ui_add_display', + 'page arguments' => array(3, 5), + ); + // Live preview + $items['admin/build/views/%views_ui_js/preview/%views_ui_cache'] = $callback + array( + 'page callback' => 'views_ui_preview', + 'page arguments' => array(3, 5), + ); + + // autocompletes for handlers and such + $items['admin/views/ajax/autocomplete/tag'] = $callback + array( + 'page callback' => 'views_ui_autocomplete_tag', + ); + + + // Generic ajax callback + // display specific parameters + $items['admin/build/views/%views_ui_js/%/%views_ui_cache'] = $callback + array( + 'page callback' => 'views_ui_ajax_form', + 'page arguments' => array(3, 4, 5), + ); + + return $items; +} + +/* + * Implementation of hook_help() + */ +function views_ui_help($path, $arg = '') { + switch ($path) { + case 'admin/build/views/tools/convert': + return '

    ' . t('The converter will make a best-effort attempt to convert a Views 1 view to Views 2. This conversion is not reliable; you will very likely have to make adjustments to your view to get it to match. You can import Views 1 views through the normal Import tab.') . '

    '; + } +} + +/* + * Implementation of hook_theme() + */ +function views_ui_theme() { + $path = drupal_get_path('module', 'views'); + require_once "./$path/includes/admin.inc"; + + return array( + // edit a view + 'views_ui_edit_view' => array( + 'arguments' => array('view' => NULL), + 'template' => 'views-ui-edit-view', + 'path' => "$path/theme", + ), + 'views_ui_edit_tab' => array( + 'arguments' => array('view' => NULL, 'display' => NULL), + 'template' => 'views-ui-edit-tab', + 'path' => "$path/theme", + ), + 'views_ui_edit_item' => array( + 'arguments' => array('type' => NULL, 'view' => NULL, 'display' => NULL, 'no_fields' => FALSE), + 'template' => 'views-ui-edit-item', + 'path' => "$path/theme", + ), + 'views_ui_rearrange_form' => array( + 'arguments' => array('form' => NULL), + 'file' => 'includes/admin.inc', + ), + + // list views + 'views_ui_list_views' => array( + 'template' => 'views-ui-list-views', + 'path' => "$path/theme", + ), + 'views_ui_list_views_form' => array( + 'file' => 'includes/admin.inc', + 'arguments' => array('form' => NULL), + ), + + // tab themes + 'views_tabset' => array( + 'arguments' => array('tabs' => NULL), + 'file' => 'includes/tabs.inc', + ), + 'views_tab' => array( + 'arguments' => array('body' => NULL), + 'file' => 'includes/tabs.inc', + ), + + // On behalf of a plugin + 'views_ui_style_plugin_table' => array( + 'arguments' => array('form' => NULL), + 'file' => 'includes/admin.inc', + ), + ); +} + +/** + * Specialized menu callback to load a view either out of the cache or just + * load it. + */ +function views_ui_cache_load($name) { + views_include('cache'); + views_include('view'); + $view = views_object_cache_get('view', $name); + + if (empty($view)) { + $view = views_get_view($name); + + if (!empty($view)) { + // Check to see if someone else is already editing this view. + global $user; + $view->locked = db_fetch_object(db_query("SELECT s.uid, v.updated FROM {views_object_cache} v INNER JOIN {sessions} s ON v.sid = s.sid WHERE s.sid != '%s' and v.name = '%s' and v.obj = 'view' ORDER BY v.updated ASC", session_id(), $view->name)); + } + } + + if (empty($view)) { + return FALSE; + } + + else { + return $view; + } +} + +function views_ui_check_lock($view) { + +} + +/** + * Specialized cache function to add a flag to our view, include an appropriate + * include, and cache more easily. + */ +function views_ui_cache_set(&$view) { + if (!empty($view->locked)) { + drupal_set_message(t('Changes cannot be made to a locked view.'), 'error'); + return; + } + views_include('cache'); + $view->changed = TRUE; // let any future object know that this view has changed. + + // Unset handlers; we don't want to write these into the cache + unset($view->display_handler); + unset($view->current_display); + unset($view->default_display); + foreach (array_keys($view->display) as $id) { + unset($view->display[$id]->handler); + unset($view->display[$id]->default_display); + } + views_object_cache_set('view', $view->name, $view); +} + + +/** + * Specialized menu callback to load a view that is only a default + * view. + */ +function views_ui_default_load($name) { + $view = views_get_view($name); + if ($view->type == t('Default')) { + return $view; + } + + return FALSE; +} + +/** + * Check to see if the incoming menu item is js capable or not. + */ +function views_ui_js_load($js) { + if ($js == 'ajax') { + return TRUE; + } + return 0; +}