• User Attivo

    [TUTORIAL] Inserire sitemap XML in pagina XHTML

    Oggi mi alambiccavo per trovare il modo di incapsulare un sitemap.xml all'interno di un DIV da rendere visibile al click sul link della mappa del sito...

    Mi sono subito trovato nell'impossibilità di applicare uno stylesheet di tipo .xls e poi incapsulare l'xml nel file xhtml...

    Allora ho ravanato un po' e dal momento che il mio server non ha PHP5 e quindi non posso usare simplexml_load_file() ho trovato un modo con SAX

    Procedo ad illustrare:

    Ipotizziamo il nostro file xml:

    [php]<?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="sitemap.xsl"?>

    <urlset>

    <url id="1">
    <loc>http://sito.it/</loc>
    <link>Home page</link>
    <priority>1.00</priority>
    <lastmod>2008-07-16T01:23:11+00:00</lastmod>
    <changefreq>daily</changefreq>
    </url>
    <url id="2">
    <loc>http://sito.it/pagina_2.php</loc>
    <link>Pagina 2</link>
    <priority>0.80</priority>
    <lastmod>2008-07-16T01:23:11+00:00</lastmod>
    <changefreq>daily</changefreq>
    </url>
    <url id="3">
    <loc>http://sito.it/pagina_3.php</loc>
    <link>Pagina 3</link>
    <priority>0.64</priority>
    <lastmod>2008-07-16T01:23:11+00:00</lastmod>
    <changefreq>daily</changefreq>
    </url>[/php]Adesso creiamo il nostro file .php che poi includeremo nel div nascosto:

    [php]<?php
    echo '<img src="http://logo.it/logo.png" alt="Un logo" />';
    echo '<p style="text-align:right;float:right;font-weight:bold;">Mappa del sito</p>';
    echo '<span style="font-size:x-small;">parte pubblica</span></p><ul style="list-style:none">';
    function start_element
    ($parser, $element_name, $element_attrs) {
    switch ($element_name) {
    case 'URL':
    echo '';
    break;
    case 'LOC':
    echo '<li><a onclick="window.open(this);return false" href="';
    break;
    case 'LINK':
    echo '';
    break;
    case 'PRIORITY':
    echo '<div style="display:none;">';
    break;
    case 'LASTMOD':
    echo '<div style="display:none;">';
    break;
    case 'CHANGEFREQ':
    echo '<div style="display:none;">';
    break;
    }
    }
    function end_element($parser, $element_name) {
    switch ($element_name) {
    case 'URL':
    echo '';
    break;
    case 'LOC':
    echo '">';
    break;
    case 'LINK':
    echo '</a></li>';
    break;
    case 'PRIORITY':
    echo '</div>';
    break;
    case 'LASTMOD':
    echo '</div>';
    break;
    case 'CHANGEFREQ':
    echo '</div><hr />';
    break;
    }
    }
    function character_data($parser, $data) {
    echo htmlentities($data);
    }
    $parser = xml_parser_create();
    xml_set_element_handler
    ($parser, 'start_element', 'end_element');
    xml_set_character_data_handler
    ($parser, 'character_data');
    $fp = fopen('sitemap.xml', 'r')
    or die ("Cannot open sitemap.xml!");
    while ($data = fread($fp, 4096)) {
    xml_parse($parser, $data, feof($fp))
    or die(sprintf('XML ERROR: %s at line %d',
    xml_error_string(xml_get_error_code($parser)),
    xml_get_current_line_number($parser)));
    }
    xml_parser_free($parser);
    echo "</ul>";
    echo '<p style="float:right;font-size:x-small"><a href="#" onclick="document.getElementById('sitemap').style.cssText = 'visibility:hidden';return false">chiudi</a></p>';
    ?>[/php]Con questo codice apriamo il file sitemap.xml e leggiamo il contenuto. Usiamo due funzioni per aprire e chiudere un elemento. Con switch e case scorriamo le voci e ad ogni occorrenza decidiamo cosa mettere "prima" della voce estratta e "dopo" la voce, corrispondentemente nelle due funzioni create a inizio testo

    Poi c'è il codice che crea il parsing e alla fine, dopo xml_parser_free($parser); andremo a mettere il codice di chiusura, compreso un link testuale per nascondere il div

    Ora vediamo il css:

    [php]#sitemap {

    height: 380px;
    width:450px;
    padding:10px;
    background-color: #FFFFFF;
    position:fixed !important;
    top:100px;
    left:200px;
    border:solid 1px #AFDA00;
    visibility:hidden;
    line-height:20px;
    filter:alpha(opacity=85);   /* Internet Explorer       */
    -moz-opacity:0.85;           /*  Mozilla 1.6 and below   */
    opacity: 0.85;               /* newer Mozilla and CSS-3 */
    z-index:100;
    

    }[/php]Impostiamo la grandezza, la posizione, il padding e altre amenità. Io anche se non è proprio standard ho impostato una trasparenza a 0.85 per fare intravvedere sotto la pagina standard. Infine ho impostato position:fixed, così resta dov'è anche se scrollo la pagina principale in giù.

    Da ultimo vediamo cosa mettere nella pagina xhtml dove volevamo incapsulare il div:

    [php]<div id="sitemap">
    <?php require "sitemap.php";?>
    </div>[/php]Ovviamente il link per mostrarlo:

    [php]<a href="#" onclick="document.getElementById('sitemap').style.cssText = 'visibility:visible';return false">Mappa del sito</a>[/php]Lo mettete dove volete nella pagina.

    Quindi abbiamo un file sitemap.xml che abbiamo dato in pasto a google e che possiamo aggiornare quando vogliamo, un file sitemap.php che formatta il file xml anche se aggiungiamo o modifichiamo delle voci, il file css che dà lo stile al div e il div inserito nel file xhtml richiamato dal link sempre nel file xhtml.

    Non sarà chiarissimo, se avete dubbi sul codice del file .php che può tornare utile modificare per il proprio gusto, commentate pure 😄

    keiske

    Potete usare include o require a scelta. Io di solito uso sempre require cercando di considerare ogni possibile malfunzionamento.

    L'effetto è un link


  • User Attivo

    Mi sa che parte del messaggio si è tagliata O_o

    keiske


  • User

    Grazie, e molto interessante!