Tu sei qui

La validazione del codice HTML5 dei siti Drupal

  • Sharebar

Lorem ipsum dolor sic amet

Alla prima validazione della home page gli errori riscontrati erano quelli che potete vedere nell'allegato "Risultato prima validazione ".

La prima incongruenza che salta agli occhi è a riga 2

Error: Unexpected doctype. Expected, e.g., <!DOCTYPE html> .
From line 1, column 1; to line 1, column 54
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML+RDFa 1.1//EN">֒ <html

Ciò in quanto il doctype generato da Drupal 7:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML+RDFa 1.1//EN">

non è corretto per il validatore e dovrebbe essere invece

<!DOCTYPE html> .

Il doctype viene generato nel template.php del tema utilizzato, che era

/**
 * Implements hook_preprocess_html().
 */
function simplecorp_preprocess_html(&$vars) {
	$vars['rdf'] = new stdClass;

	if (module_exists('rdf')) {
	$vars['doctype'] = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML+RDFa 1.1//EN">' . "\n";
	$vars['rdf']->version = ' version="HTML+RDFa 1.1"';
	$vars['rdf']->namespaces = $vars['rdf_namespaces'];
	$vars['rdf']->profile = ' profile="' . $vars['grddl_profile'] . '"';
	}
	else {
	$vars['doctype'] = '<!DOCTYPE html>' . "\n";
	$vars['rdf']->version = '';
	$vars['rdf']->namespaces = '';
	$vars['rdf']->profile = '';
	}
}

che ho cambiato in

/**
 * Implements hook_preprocess_html().
 */
 function simplecorp_preprocess_html(&$vars) {
  $vars['doctype'] = '<!DOCTYPE html>' . "\n";
   $vars['rdf'] = new stdClass;

  $vars['rdf']->version = '';
  $vars['rdf']->namespaces = '';
  $vars['rdf']->profile = '';

  // Serialize RDF Namespaces into an RDFa 1.1 prefix attribute.
  if (function_exists('rdf_get_namespaces')) {
    foreach (rdf_get_namespaces() as $prefix => $uri) {
      $prefixes[] = $prefix . ': ' . $uri;
    }
    $vars['rdf']->namespaces = ' prefix="' . implode(' ', $prefixes) . '"';
  }
}

Validando ancora la home page dopo le modifiche al template si vede che gli errori sono notevolmente diminuiti.

Per quanto riguarda le segnalazioni alle righe 4 e 5 riguardano entrambe l'elemento hgroup che attualmente è stato deprecato.


4.Error: Element hgroup not allowed as child of element div in this context. (Suppressing further errors from this subtree.)

From line 86, column 25; to line 86, column 53

          <hgroup id="name-and-slogan">↩					
Content model for element div:Flow content.

5.Error: The hgroup element is obsolete. To mark up subheadings, consider either just putting the subheading into a p element after the h1-h6 element containing the main heading, or else putting the subheading directly within the h1-h6 element containing the main heading, but separated from the main heading by punctuation and/or within, for example, a span class="subheading" element with differentiated styling. To group headings and subheadings, alternative titles, or taglines, consider using the header or div elements.

From line 86, column 25; to line 86, column 53

          <hgroup id="name-and-slogan">↩					

Per correggere ho eliminato hgroup dal page.tpl.php che era

                    <?php if ($site_name || $site_slogan): ?>
                        <!-- #name-and-slogan -->
                        <header id="name-and-slogan">
							<?php if ($site_name):?>
                            <h1 id="site-name"><a href="<?php print $front_page; ?>" title="<?php print t('Home'); ?>"><?php print $site_name; ?></a></h1>
                            <?php endif; ?>
    
                            <?php if ($site_slogan):?>
                            <h2 id="site-slogan"><?php print $site_slogan; ?></h2>
                            <?php endif; ?>
                        </header> 
                        <!-- EOF:#name-and-slogan -->
                    <?php endif; ?>

e l'ho sostituito con un semplice DIV:

                    <?php if ($site_name || $site_slogan): ?>
                        <!-- #name-and-slogan -->
                        <div id="name-and-slogan">
							<?php if ($site_name):?>
                            <h1 id="site-name"><a href="<?php print $front_page; ?>" title="<?php print t('Home'); ?>"><?php print $site_name; ?></a></h1>
                            <?php endif; ?>
    
                            <?php if ($site_slogan):?>
                            <h2 id="site-slogan"><?php print $site_slogan; ?></h2>
                            <?php endif; ?>
                        </div> 
                        <!-- EOF:#name-and-slogan -->
                    <?php endif; ?>

Per quanto riguarda l'errore:

3.Error: Bad value header for attribute role on element header.

From line 50, column 9; to line 50, column 57

>↩        <header role="header" class="container clearfix">↩     

E' dovuto al fatto che non esiste alcun role header per cui l'ho semplicemente eliminato. Mi riservo di chiedere a chi ha preparato il tema che cosa volesse fare...

Per quanto riguarda l'errore:

3.Error: The text content of element time was not in the required format: The literal did not satisfy the time-datetime format.

From line 299, column 13; to line 299, column 19

          </time>↩↩    
Syntax of time-datetime:One of the following: month, date, yearless date, time, local date and time, time-zone offset, global date and time, week, non-negative integer, or duration. For more information and examples, see the section on the datetime value in the HTML specification. 

è dovuto al fatto che anche in questo caso non viene seguito quanto previsto dalle specifiche per quanto riguarda l'elemento "time". Se la data racchiusa dall'elemento non è in formato standard allora si deve usare l'attributo datetime. Il codice incriminato si trova nel node.tpl.php ed è

            <time class="date">
                <span class="month">
                <?php print $submitted_month; ?>                
                </span>
                <strong class="day">
                <?php print $submitted_day; ?>              
                </strong>  
                <span class="year">
                <?php print $submitted_year; ?>              
                </span>
            </time>

che quindi per quanto riguarda la prima riga è stato cambiato in

<time class="date" datetime="<?php print format_date($node->created, 'custom', 'Y-m-d H:i:s');?>">

Per quanto riguarda la segnalazione

Error: When the attribute xml:lang in no namespace is specified, the element must also have the attribute lang present with the same 
value.
From line 316, column 46; to line 316, column 171
_creator"><span class="username" xml:lang="" about="/it/users/pietro-cappai" typeof="sioc:UserAccount" 
property="foaf:name" datatype="">Pietro

si riferisce al fatto che l'attributo xml:lang dovrebbe essere valorizzato (es.: it, en). Qui la questione diventa complessa. Ci sono diversi post sull'argomento nei quali l'errore di validazione veniva segnalato e secondo alcuni è corretto così nel caso di RDF. Però non era all'interno di un documento HTML5 per cui incollo qui sotto i link e mi riservo di postare per chiedere delucidazioni.

RDF xml language attribute has null value (drupal.org)

Empty xml:lang attributes validation (mailing list del W3C)

Per chi volesse documentarsi su RDF consiglio un aticolo di Lullabot How Does RDF Work in Drupal 7?

 

Ritratto di Pietro Cappai

About the author

Vivo in Sardegna a Carloforte (CI) sull'Isola di San Pietro. Realizzo siti web dinamici, principalmente utilizzando il cms open source Drupal.