Jump to content

Weird XHTML validation errors


joemamahunt

Recommended Posts

 

2 weird errors, 1 weird warning.

 



 

1. In the part of a code below, XHTML validator gives me error:

document type does not allow element "select" here; missing one of "p", "h1", "h2", "h3", "h4", "h5", "h6", "div", "pre", "address", "fieldset", "ins", "del" start-tag.

But not just for the select tab, for the input tags, span, and br tags also.

 

Here:

					<td valign="top" align="left" class="smalltext" style="font-family: verdana, arial, sans-serif;">';

echo '					<script type="text/javascript" src="', $settings['default_theme_url'], '/sha1.js"></script>

							<form action="', $scripturl, '?action=login2" method="post" accept-charset="', $context['character_set'], '" class="middletext" style="margin: 3px 1ex 1px 0;"', empty($context['disable_login_hashing']) ? ' onsubmit="hashLoginPassword(this, \'' . $context['session_id'] . '\');"' : '', '>
								<input type="text" name="user" size="10" /> <input type="password" name="passwrd" size="10" />
								<select name="cookielength">
									<option value="60">', $txt['smf53'], '</option>
									<option value="1440">', $txt['smf47'], '</option>
									<option value="10080">', $txt['smf48'], '</option>
									<option value="43200">', $txt['smf49'], '</option>
									<option value="-1" selected="selected">', $txt['smf50'], '</option>
								</select>
								<input type="submit" value="', $txt[34], '" /><br />
								<span class="middletext">', $txt['smf52'], '</span>
								<input type="hidden" name="hash_passwrd" value="" />
							</form><br />';
}
						echo '</td>

 

 



 

 

2. For each outcome ('a' tag), it gives me:

document type does not allow element "a" here; missing one of "object", "ins", "del", "span", "bdo", "tt", "i", "b", "big", "small", "em", "strong", "dfn", "code", "q", "samp", "kbd", "var", "cite", "abbr", "acronym", "sub", "sup", "label" start-tag.

 

The code is this:

                       	<td class="lat" style="font-size: x-small; padding: 4px;" valign="top" align="left">';
                             	$what=ssi_recentTopicsT('5', NULL, 'array');  
                             	foreach ($what as $topic) {
                             	echo'<span style="font-size: 80%;">-</span> 
			       <a href="', $topic['href'], '">', $topic['link'], '</a><br />'; 
                             	} 
                             	echo '
                       	</td>

 

Which refers to another file, this is the code from it:

// Recent topic list:   [board] Subject by Poster	Date
function ssi_recentTopicsT($num_recent = 8, $exclude_boards = null, $output_method = 'echo')
{
global $context, $settings, $scripturl, $txt, $db_prefix, $ID_MEMBER;
global $user_info, $modSettings, $func;

if ($exclude_boards === null && !empty($modSettings['recycle_enable']) && $modSettings['recycle_board'] > 0)
	$exclude_boards = array($modSettings['recycle_board']);
else
	$exclude_boards = empty($exclude_boards) ? array() : $exclude_boards;

$stable_icons = array('xx', 'thumbup', 'thumbdown', 'exclamation', 'question', 'lamp', 'smiley', 'angry', 'cheesy', 'grin', 'sad', 'wink', 'moved', 'recycled', 'wireless');
$icon_sources = array();
foreach ($stable_icons as $icon)
	$icon_sources[$icon] = 'images_url';

// Find all the posts in distinct topics.  Newer ones will have higher IDs.
$request = db_query("
	SELECT
		m.posterTime, ms.subject, m.ID_TOPIC, m.ID_MEMBER, m.ID_MSG, b.ID_BOARD, b.name AS bName,
		IFNULL(mem.realName, m.posterName) AS posterName, " . ($user_info['is_guest'] ? '1 AS isRead, 0 AS new_from' : '
		IFNULL(lt.ID_MSG, IFNULL(lmr.ID_MSG, 0)) >= m.ID_MSG_MODIFIED AS isRead,
		IFNULL(lt.ID_MSG, IFNULL(lmr.ID_MSG, -1)) + 1 AS new_from') . ", LEFT(m.body, 384) AS body, m.smileysEnabled, m.icon
	FROM ({$db_prefix}messages AS m, {$db_prefix}topics AS t, {$db_prefix}boards AS b, {$db_prefix}messages AS ms)
		LEFT JOIN {$db_prefix}members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER)" . (!$user_info['is_guest'] ? "
		LEFT JOIN {$db_prefix}log_topics AS lt ON (lt.ID_TOPIC = t.ID_TOPIC AND lt.ID_MEMBER = $ID_MEMBER)
		LEFT JOIN {$db_prefix}log_mark_read AS lmr ON (lmr.ID_BOARD = b.ID_BOARD AND lmr.ID_MEMBER = $ID_MEMBER)" : '') . "
	WHERE t.ID_LAST_MSG >= " . ($modSettings['maxMsgID'] - 35 * min($num_recent, 5)) . "
		AND t.ID_LAST_MSG = m.ID_MSG
		AND b.ID_BOARD = t.ID_BOARD" . (empty($exclude_boards) ? '' : "
		AND b.ID_BOARD NOT IN (" . implode(', ', $exclude_boards) . ")") . "
		AND $user_info[query_see_board]
		AND ms.ID_MSG = t.ID_FIRST_MSG
	ORDER BY t.ID_FIRST_MSG DESC
	LIMIT $num_recent", __FILE__, __LINE__);
$posts = array();
while ($row = mysql_fetch_assoc($request))
{
	$row['body'] = strip_tags(strtr(parse_bbc($row['body'], $row['smileysEnabled'], $row['ID_MSG']), array('<br />' => '&#10;')));
	if ($func['strlen']($row['body']) > 128)
		$row['body'] = $func['substr']($row['body'], 0, 128) . '...';

	// Censor the subject.
	censorText($row['subject']);
	censorText($row['body']);

	if (empty($modSettings['messageIconChecks_disable']) && !isset($icon_sources[$row['icon']]))
		$icon_sources[$row['icon']] = file_exists($settings['theme_dir'] . '/images/post/' . $row['icon'] . '.gif') ? 'images_url' : 'default_images_url';

	// Build the array.
	$posts[] = array(
		'board' => array(
			'id' => $row['ID_BOARD'],
			'name' => $row['bName'],
			'href' => $scripturl . '?board=' . $row['ID_BOARD'] . '.0',
			'link' => '<a href="' . $scripturl . '?board=' . $row['ID_BOARD'] . '.0">' . $row['bName'] . '</a>'
		),
		'topic' => $row['ID_TOPIC'],
		'poster' => array(
			'id' => $row['ID_MEMBER'],
			'name' => $row['posterName'],
			'href' => empty($row['ID_MEMBER']) ? '' : $scripturl . '?action=profile;u=' . $row['ID_MEMBER'],
			'link' => empty($row['ID_MEMBER']) ? $row['posterName'] : '<a href="' . $scripturl . '?action=profile;u=' . $row['ID_MEMBER'] . '">' . $row['posterName'] . '</a>'
		),
		'subject' => $row['subject'],
		'short_subject' => shorten_subject($row['subject'], 25),
		'preview' => $row['body'],
		'time' => timeformat($row['posterTime']),
		'timestamp' => forum_time(true, $row['posterTime']),
		'href' => $scripturl . '?topic=' . $row['ID_TOPIC'] . '.msg' . $row['ID_MSG'] . ';topicseen#new',
		'link' => '<a href="' . $scripturl . '?topic=' . $row['ID_TOPIC'] . '.msg' . $row['ID_MSG'] . '#new">' . (strlen($row['subject']) > 36 ? substr($row['subject'],0,36) . "..." : $row['subject']) . '</a>',
		'new' => !empty($row['isRead']),
		'new_from' => $row['new_from'],
		'icon' => '<img src="' . $settings[$icon_sources[$row['icon']]] . '/post/' . $row['icon'] . '.gif" align="middle" alt="' . $row['icon'] . '" border="0" />',
	);
}
mysql_free_result($request);

// Just return it.
if ($output_method != 'echo' || empty($posts))
	return $posts;

echo '
	<table border="0" class="ssi_table">';
foreach ($posts as $post)
	echo '
		<tr>
			<td align="right" valign="top" nowrap="nowrap">
				[', $post['board']['link'], ']
			</td>
			<td valign="top">
				<a href="', $post['href'], '">', $post['subject'], '</a>
				', $txt[525], ' ', $post['poster']['link'], '
				', $post['new'] ? '' : '<a href="' . $scripturl . '?topic=' . $post['topic'] . '.msg' . $post['new_from'] . ';topicseen#new"><img src="' . $settings['images_url'] . '/' . $context['user']['language'] . '/new.gif" alt="' . $txt[302] . '" border="0" /></a>', '
			</td>
			<td align="right" nowrap="nowrap">
				', $post['time'], '
			</td>
		</tr>';
echo '
	</table>';
}

 

 

 



 

 

3. Then it gives me this warning:

character "<" is the first character of a delimiter but occurred as data

 

For each of the "<"s in this code:

				      <td valign="top" align="right" class="mnu">
                                        <div id="clock"></div>
				<script type="text/javascript">
					var months=new Array(13);
						months[1]="January";
						months[2]="February";
						months[3]="March";
						months[4]="April";
						months[5]="May";
						months[6]="June";
						months[7]="July";
						months[8]="August";
						months[9]="September";
						months[10]="October";
						months[11]="November";
						months[12]="December";
					var time=new Date();
					var lmonth=months[time.getMonth() + 1];
					var date=time.getDate();
					var year=time.getYear();

				if (year < 2000)    // Y2K Fix, Isaac Powell
					year = year + 1900; // http://onyx.idbsu.edu/~ipowell

					var timerID = null;
					var timerRunning = false;

					function showtime () {
						var now = new Date();
						var hours = now.getHours();
						var minutes = now.getMinutes();
						var seconds = now.getSeconds()
						var timeValue = "" + ((hours >12) ? hours -12 :hours)
						if (timeValue == "0") timeValue = 12;
						timeValue += ((minutes < 10) ? ":0" : ":") + minutes
						timeValue += ((seconds < 10) ? ":0" : ":") + seconds
						timeValue += (hours >= 12) ? " P.M." : " A.M."
						document.getElementById("clock").innerHTML = lmonth + " " + date + ", " + year + "  |  " + timeValue;
						timerID = setTimeout("showtime()",1000);
						timerRunning = true;
					}

					showtime();
				</script>
			      </td>

 

 




 

 

Any help is greatly appreciated.  I've been into PHP and XHTML for some time now, have never came across errors this weird.

Link to comment
Share on other sites

I believe strict XHTML doesn't allow input and select outside of particular elements.  It's given you a list of elements it is allowed inside.  Check the source of http://validator.w3.org/ for a valid example.

 

But seriously, I would rather relax your doctype than make all your html strict.  It'll drive you bonkers :P

 

Your warning is probably from the "<" in your javascript (which is "data").  I'm not sure what the "strict" way to do it is.

Link to comment
Share on other sites

Oh yeah, I forgot to mention it's XHTML Strict.

 

Actually I've done quite a number of XHTML Strict sites, this is the first that spit out such errors that I don't know how to fix. It was hard with Strict at first, but gets pretty easy once you ran into all the problems it gives. :P And the funny thing is, all the other sites were not for me, but this one is. Hah.

 

You're right about the warning, "<" being as "data". I don't know either, but XHTML 1.0 Transitional also gives the warning.

 

*edit

I fixed error #1 by putting the input in a paragraph as the XHTML validator site has. Thanks. :)

 

Error #2 is still an error in Transitional. So it's not just the Strict.

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.