8768 sujets

Développement web côté serveur, CMS

Bonjour,

J'aimerai avoir un petit peu d'aide pour avancer dans mon travail.
L'objectif est d'afficher des liens depuis un fichier <!DOCTYPE NETSCAPE-Bookmark-file-1> (c'est un export de Shaarli). En gros, j'essaie d'intégrer les données de Shaarli dans mon site.

Jusque là j'arrive à retrouver le contenu (j'ai repris le code pour l'import de Shaarli). Maintenant, je souhaiterai générer un pagination et limiter le nombre de résultats par page.
C'est la que je bloque, je ne sais pas trop comment ajouter des contraintes a ma boucle foreach.

<?php 

$files="data/medias/bookmarks_shaarli.html";
$data=file_get_contents($files);


// Tells if a string start with a substring or not.
function startsWith($haystack,$needle,$case=true)
{
    if($case){return (strcmp(substr($haystack, 0, strlen($needle)),$needle)===0);}
    return (strcasecmp(substr($haystack, 0, strlen($needle)),$needle)===0);
}

// Tells if a string ends with a substring or not.
function endsWith($haystack,$needle,$case=true)
{
    if($case){return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);}
    return (strcasecmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);
}



$type='unknown';
if (startsWith($data,'<!DOCTYPE NETSCAPE-Bookmark-file-1>'))  $type='netscape'; // Netscape bookmark file (aka Firefox).

// Then import the bookmarks.
if ($type=='netscape') // le format est OK et on peut importer
{     

		// This format is supported by all browsers (except IE, of course), also delicious, diigo and others.
		foreach(explode('<DT>',$data) as $html) // explode is very fast
		{

				$link = array('linkdate'=>'','title'=>'','url'=>'','description'=>'','tags'=>'','private'=>0);
				$d = explode('<DD>',$html);
				if (startswith($d[0],'<A '))
						{
									$link['description'] = (isset($d[1]) ? nl2br (html_entity_decode(trim($d[1]),ENT_QUOTES,'UTF-8')) : '');  // Get description (optional)

									preg_match('!<A .*?>(.*?)</A>!i',$d[0],$matches); 

									$link['title'] = (isset($matches[1]) ? trim($matches[1]) : '');  // Get title
								    $link['title'] = html_entity_decode($link['title'],ENT_QUOTES,'UTF-8');

									preg_match_all('! ([A-Z_]+)=\"(.*?)"!i',$html,$matches,PREG_SET_ORDER);  // Get all other attributes
									
									$raw_add_date=0;
									
									
									foreach($matches as $m) 
												{ 
													$attr=$m[1]; $value=$m[2];
													if ($attr=='HREF')  $link['url']=html_entity_decode($value,ENT_QUOTES,'UTF-8');
													elseif ($attr=='TAGS')   $link['tags']=html_entity_decode(str_replace(',',' ',$value),ENT_QUOTES,'UTF-8');
													elseif ($attr=='PRIVATE')  $link['private']=($value=='0'?0:1);
													elseif ($attr=='ADD_DATE')         $raw_add_date=intval($value); $link['linkdate']=date('d/m/Y',$raw_add_date);
												}

											echo "<br><span style=\"color:brown\">Title : ".$link['title']." </span>";  // affiche le titre de l'item
											echo "<br>Description : ".$link['description']; // affiche la description de l'item
											echo "<br><span style=\"color:green\">url : ".$link['url']." </span>";
											echo "<br><span style=\"color:red\">tags : ".$link['tags']." </span>";
											echo "<br><span style=\"color:blue\">private : ".$link['private']." </span>";
											echo "<br><span style=\"color:silver\">linkdate : ".$link['linkdate']." </span><hr />";



					}	$i++;
			}
}

else { echo " has an unknown file format. Nothing was imported."; }
?>


J'ai cherché mais je bloque, je manque encore d'habitude avec PHP et pas facile de trouver de l'aide tant les résultats sont nombreux et les explications parfois succinctes pour moi.
Modifié par le-noob (11 Aug 2015 - 10:57)
avec un peu de chance je suis tombé sur https://stackoverflow.com/questions/22145259/simple-pagination-for-foreach-loop
du coup j'ai modifié
<?php 

// nom du fichier a lire >> A MODIFIER
$files="data/medias/bookmarks_shaarli.html";
$data=file_get_contents($files);
// echo $data; // affiche le contenu du fichier


// Tells if a string start with a substring or not.
function startsWith($haystack,$needle,$case=true)
{
    if($case){return (strcmp(substr($haystack, 0, strlen($needle)),$needle)===0);}
    return (strcasecmp(substr($haystack, 0, strlen($needle)),$needle)===0);
}

// Tells if a string ends with a substring or not.
function endsWith($haystack,$needle,$case=true)
{
    if($case){return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);}
    return (strcasecmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);
}



$type='unknown';
if (startsWith($data,'<!DOCTYPE NETSCAPE-Bookmark-file-1>'))  $type='netscape'; // Netscape bookmark file (aka Firefox).

// Then import the bookmarks.
if ($type=='netscape') // le format est OK et on peut importer
{      //  echo "Le format est OK (type=netscape) et on peut importer.";

$url="static4/shaarli?page"; 
 $nb_elem_per_page = 3;
 $page = isset($_GET['static4/shaarli?page'])?intval($_GET['static4/shaarli?page']-1):0;
  $data =  (explode('<DT>',$data)) ;
  $number_of_pages = intval(count($data)/$nb_elem_per_page)+1;

		// This format is supported by all browsers (except IE, of course), also delicious, diigo and others.
		// foreach(explode('<DT>',$data) as $html) // explode is very fast

 foreach (array_slice ($data, $page*$nb_elem_per_page, $nb_elem_per_page) as $html)
		{
				// echo "$html  <hr />";
				//       if (startswith($html,'<A '))  { echo "$html  <hr />"; }

				$link = array('linkdate'=>'','title'=>'','url'=>'','description'=>'','tags'=>'','private'=>0);
				$d = explode('<DD>',$html);
				if (startswith($d[0],'<A '))
						{
									$link['description'] = (isset($d[1]) ? nl2br (html_entity_decode(trim($d[1]),ENT_QUOTES,'UTF-8')) : '');  // Get description (optional)
									// echo "Description : ".$link['description']; // affiche la description de l'item

									preg_match('!<A .*?>(.*?)</A>!i',$d[0],$matches); 

									$link['title'] = (isset($matches[1]) ? trim($matches[1]) : '');  // Get title
									// echo "Title : ".$link['title']." <hr />";  // affiche le titre de l'item
								    $link['title'] = html_entity_decode($link['title'],ENT_QUOTES,'UTF-8');
									// echo "<br><span style=\"color:brown\">Title : ".$link['title']." </span>";  // affiche le titre de l'item

									preg_match_all('! ([A-Z_]+)=\"(.*?)"!i',$html,$matches,PREG_SET_ORDER);  // Get all other attributes
									// echo "matches : "; var_dump ($matches) ; echo " <hr />";
									
									$raw_add_date=0;
									
									
									foreach($matches as $m) 
												{ 
													$attr=$m[1]; $value=$m[2];
													if ($attr=='HREF')  $link['url']=html_entity_decode($value,ENT_QUOTES,'UTF-8');
													// echo 'url : '.$link['url'].'<hr />';

													elseif ($attr=='TAGS')   $link['tags']=html_entity_decode(str_replace(',',' ',$value),ENT_QUOTES,'UTF-8');
													//  echo "tags : ".$link['tags']." <hr />";
													elseif ($attr=='PRIVATE')  $link['private']=($value=='0'?0:1);
													//  echo "private : ".$link['private']." <hr />";
													elseif ($attr=='ADD_DATE')         $raw_add_date=intval($value); $link['linkdate']=date('d/m/Y',$raw_add_date);
													//  echo "linkdate : ".$link['linkdate']." <hr />";
											
												}

											echo "<br><span style=\"color:brown\">Title : ".$link['title']." </span>";  // affiche le titre de l'item
											echo "<br>Description : ".$link['description']; // affiche la description de l'item
											echo "<br><span style=\"color:green\">url : ".$link['url']." </span>";
											echo "<br><span style=\"color:red\">tags : ".$link['tags']." </span>";
											echo "<br><span style=\"color:blue\">private : ".$link['private']." </span>";
											echo "<br><span style=\"color:silver\">linkdate : ".$link['linkdate']." </span><hr />";



					}	$i++;
			}
}

else { echo " has an unknown file format. Nothing was imported."; }
?>

<ul id='paginator'>
<?php
for($i=1;$i<$number_of_pages;$i++){ ?>
    <li><a href="index.php?<?php echo $url.'='.$i ; ?>"><?php echo $i ; ?></a></li>
<?php } ?>
</ul>