joemamahunt Posted June 29, 2007 Share Posted June 29, 2007 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 />' => ' '))); 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. Quote Link to comment Share on other sites More sharing options...
btherl Posted June 29, 2007 Share Posted June 29, 2007 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 Your warning is probably from the "<" in your javascript (which is "data"). I'm not sure what the "strict" way to do it is. Quote Link to comment Share on other sites More sharing options...
joemamahunt Posted June 29, 2007 Author Share Posted June 29, 2007 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. 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. Quote Link to comment Share on other sites More sharing options...
joemamahunt Posted June 29, 2007 Author Share Posted June 29, 2007 Fixed warning by adding "<!--" after script tag and "//-->" before closing script tag. Now to fix the biggest problem of the 3... error #2. Help please. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.