--- misc/teaser.js.1.10 Sun Dec 16 01:19:26 2007 +++ misc/teaser.js Wed Dec 26 19:45:35 2007 @@ -17,6 +17,7 @@ Drupal.behaviors.teaser = function(conte // Move teaser textarea before body, and remove its form-item wrapper. var body = $('#'+ Drupal.settings.teaser[this.id]); var checkbox = $('#'+ Drupal.settings.teaserCheckbox[this.id]).parent(); + var checked = $(checkbox).children('input').attr('checked') ? true : false; var parent = teaser[0].parentNode; $(body).before(teaser); $(parent).remove(); @@ -30,13 +31,19 @@ Drupal.behaviors.teaser = function(conte if (teaser.val()) { body.val(trim(teaser.val()) +'\r\n\r\n'+ trim(body.val())); } - // Hide and disable teaser + // Empty, hide and disable teaser. + teaser[0].value = ''; $(teaser).attr('disabled', 'disabled'); $(teaser).parent().slideUp('fast'); - // Change label + // Change label. $(this).val(Drupal.t('Split summary at cursor')); - // Show separate teaser checkbox + // Hide separate teaser checkbox. $(checkbox).hide(); + // Force a hidden checkbox to be checked (to ensure that the body is + // correctly processed on form submit when teaser/body are in joined + // state), and remember the current checked status. + checked = $(checkbox).children('input').attr('checked') ? true : false; + $(checkbox).children('input').attr('checked', true); } // Split the teaser from the body. @@ -54,8 +61,8 @@ Drupal.behaviors.teaser = function(conte $(teaser).parent().slideDown('fast'); // Change label $(this).val(Drupal.t('Join summary')); - // Show separate teaser checkbox - $(checkbox).show(); + // Show separate teaser checkbox, restore checked value. + $(checkbox).show().children('input').attr('checked', checked); } // Add split/join button. @@ -75,7 +82,7 @@ Drupal.behaviors.teaser = function(conte else { $(teaser).hide(); $('input', button).val(Drupal.t('Split summary at cursor')).toggle(split_teaser, join_teaser); - $(checkbox).hide(); + $(checkbox).hide().children('input').attr('checked', true); } }); Index: modules/system/system.css =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.css,v retrieving revision 1.45 diff -u -r1.45 system.css --- modules/system/system.css 13 Dec 2007 10:14:18 -0000 1.45 +++ modules/system/system.css 21 Dec 2007 01:47:13 -0000 @@ -397,6 +397,9 @@ padding-right: 5%; /* LTR */ margin: 0; } +.teaser-checkbox { + padding-top: 1px; +} .teaser-checkbox div.form-item { float: right; /* LTR */ margin: 0 5% 0 0; /* LTR */ --- modules/node/node.module.1.935 Fri Jan 04 00:55:30 2008 +++ modules/node/node.module Sat Jan 05 21:35:58 2008 @@ -212,8 +212,8 @@ function node_mark($nid, $timestamp) { * See if the user used JS to submit a teaser. */ function node_teaser_js(&$form, &$form_state) { - // Glue the teaser to the body. if (isset($form['#post']['teaser_js'])) { + // Glue the teaser to the body. if (trim($form_state['values']['teaser_js'])) { // Space the teaser from the body $body = trim($form_state['values']['teaser_js']) ."\r\n\r\n". trim($form_state['values']['body']); @@ -222,20 +222,62 @@ function node_teaser_js(&$form, &$form_s // Empty teaser, no spaces. $body = ''. $form_state['values']['body']; } - // Pass value onto preview/submit + // Pass updated body value on to preview/submit form processing. form_set_value($form['body'], $body, $form_state); - // Pass value back onto form + // Pass updated body value back onto form for those cases + // in which the form is redisplayed. $form['body']['#value'] = $body; } return $form; } /** - * Automatically generate a teaser for a node body. + * Ensure value of "teaser_include" checkbox is consistent with other form data + * + * This handles 2 situations in which an unchecked checkbox is rejected: + * 1. The user defines a teaser (summary) but it is empty; + * 2. The user does not define a teaser (summary) (in this case an + * unchecked checkbox would cause the body to be empty, or missing + * the auto-generated teaser). + * If JS is active then it is used to force the checkbox to be checked when + * hidden, and so case 2. will not arise. + * + * In either case a warning message is output. + */ +function node_teaser_include_verify(&$form, &$form_state) { + // N.B. $form['#post'] is set only when the form is built for preview/submit. + if (isset($form['#post']['body']) && isset($form_state['values']['teaser_include']) && !$form_state['values']['teaser_include']) { + // "teaser_include" checkbox is present and unchecked. + if (strpos($form_state['values']['body'], '') === 0) { + // Teaser is empty string + $msg = t('You specified that the summary should not be shown when this post is displayed in full view. This setting is ignored when the summary is empty.'); + } + elseif (strpos($form_state['values']['body'], '') === FALSE) { + // Teaser delimiter is not present in the body. + $msg = t('You specified that the summary should not be shown when this post is displayed in full view. This setting has been ignored since you have not defined a summary for the post. (To define a summary, insert the delimiter "<!--break-->" (without the quotes) in the Body of the post to indicate the end of the summary and the start of the main content.)'); + } + + if (isset($msg)) { + drupal_set_message($msg, 'warning'); + + // Pass new checkbox value on to preview/submit form processing. + form_set_value($form['teaser_include'], 1, $form_state); + // Pass new checkbox value back onto form for those cases + // in which form is redisplayed. + $form['teaser_include']['#value'] = 1; + } + } + + return $form; +} + +/** + * Generate a teaser for a node body. * * If the end of the teaser is not indicated using the delimiter - * then we try to end it at a sensible place, such as the end of a paragraph, - * a line break, or the end of a sentence (in that order of preference). + * then we generate the teaser automatically, trying to end it at a sensible + * place such as the end of a paragraph, a line break, or the end of a + * sentence (in that order of preference). * * @param $body * The content for which a teaser will be generated. @@ -770,7 +812,7 @@ function node_submit($node) { // Convert the node to an object, if necessary. $node = (object)$node; - // Auto-generate the teaser, but only if it hasn't been set (e.g. by a + // Generate the teaser, but only if it hasn't been set (e.g. by a // module-provided 'teaser' form item). if (!isset($node->teaser)) { if (isset($node->body)) { --- modules/node/node.pages.inc.1.23 Fri Jan 04 00:55:30 2008 +++ modules/node/node.pages.inc Sat Jan 05 16:39:33 2008 @@ -262,7 +262,7 @@ function node_body_field(&$node, $label, $include = !isset($node->teaser) || ($node->teaser == substr($node->body, 0, strlen($node->teaser))); $form = array( - '#after_build' => array('node_teaser_js')); + '#after_build' => array('node_teaser_js', 'node_teaser_include_verify')); $form['#prefix'] = '