Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyświetlanie artykułów co stronę
Forum PHP.pl > Forum > PHP
petrusbr
Robię właśnie system publikacji artykułów w serwisie. Wszystko szło pięknie ładnie, az do pewnego momentu - jak zwykle :-)

Artykuł pobierany jest z jednego pola w tabeli i wrzucany w zmienną $tresc. Ta treść ląduje na stronie. Ale niektóre artykuły sa b. długie i chciałbym aby były wyświetlane w kawałkach np. co ileś akapitów a po kliknięciu "kolejna strona" wyświetlała by się kolejna sekwencja tekstu

Akapity czystego tekstu rozdzielam <BR>. Wygląda to tak:

tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst <BR>
<BR>
tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst tekst <BR>
<BR>

itd.

Może ktoś ma jakiś pomysł jak to ugryźć lub może mnie odesłać do podobnego skryptu do analizy :-) Z góry dzięki!
AnoniM_MC
Ja mam pewien skrpyt, ale musisz sobie go przerobic.


Kod
<?php



$limit=20; // iloć wierszy która ma zostać ?ć

$connection = mysql_connect(HOST , USER , PASSWORD);

$db = mysql_select_db(DB, $connection);

$numresults=mysql_query("select * from TABLE order by SOMETHING", $connection);

$numrows=mysql_num_rows($numresults);



// jeżeli skrypt został już wywołany to zmienna $offset=1 inaczej $offset=0

if (empty($offset)) {

$offset=0;

}



// pobranie zbioru wyników

$result=mysql_query("select * from TABLE order by SOMETHING limit $offset,$limit");



// teraz można wywietlić zbiór wynikóna

while ($data=mysql_fetch_array($result)) {

// tutaj powinien znale?ć się kod który wy?wietli dane np. na ekranie

}



// następnie musimy zrobić linki do pozostałych wyników

if ($offset!=0) { // ominięcie POPRZEDNI jeżeli offset=0

$prevoffset=$offset-$limit;

print "<a href="$PHP_SELF?offset=$prevoffset">POPRZEDNI</a> &nbsp; n";

}



// obliczenie liczby stron które potrzebują linki

$pages=intval($numrows/$limit);



// zmienna $pages zawiera teraz całkowitą liczbę potrzebnych stron

if ($numrows%$limit) {

// jeżeli występuje reszta z dzielenia to dodajemy jeszcze jedną stronę

$pages++;

}



for ($i=1;$i<=$pages;$i++) { // wyswietlenie 1 2 3 4 ...

$newoffset=$limit*($i-1);

print "<a href="$PHP_SELF?offset=$newoffset">$i</a> &nbsp; n";

}



// sprawdzenie czy bieżąca strona nie jest ostatnią

if (!((($offset/$limit)+1)==$pages) && $pages!=1) {

// niejest ostatnią stroną więc wywietl NASTĘc

$newoffset=$offset+$limit;

print "<a href="$PHP_SELF?offset=$newoffset">NASTĘPNY</a><p>n";

}



?>  


No, a teraz ladnie podziekowac winksmiley.jpg)
petrusbr
No z linkami to ja tez tak umiem ;-) Mam tylko problem z tekstem ciągłym. Nie wiem jak go rozbić...

Coś mi się kojarzy że może rozbić go wyrażeniami regularnymi (?) i wrzucić w tablicę. Chyba tędy droga, ale jeszcze sporo przede mną ;-)

Czas na kaffkę :-)
AnoniM_MC
No to zrob tak....
Jeden tekst sie sklada z dwoch: 1 czesci i 2 (np.: rozwiniecie). I potem Wyswietlasz 1 czesc i dajesz Czytaj wiecej i sie druga czesc pokazuje...
GeoS
Cytat
No to zrob tak....  
Jeden tekst sie sklada z dwoch: 1 czesci i 2 (np.: rozwiniecie). I  potem Wyswietlasz 1 czesc i dajesz Czytaj wiecej i sie druga czesc pokazuje...


AnoniM_MC: Mam male pytanie - umiesz czytac ze zrozumieniem :?: Czlowiek chce wyswietlic tekst w czesciach (ma jakis duzy string i chce go sortowac w CZESCIACH) :!: Tu naprawde nie chodzi o nabijanie cyferek pod emblematem :!:

Najprosciej to zrobic (jesli opierasz aplikacje o SQL) dzielac go z pomoca wyrazen regularnych na mniejsze fragmenty i tak wrzucac do bazy. Dalej juz chyba wiesz jak sie tym zajac :?: biggrin.gif
AnoniM_MC
Za bardzo czasu nie mialem i nie przeczytalem calego. smile.gif
petrusbr
Cytat
Najprosciej to zrobic (jesli opierasz aplikacje o SQL) dzielac go z pomoca wyrazen regularnych na mniejsze fragmenty i tak wrzucac do bazy. Dalej juz chyba wiesz jak sie tym zajac :?:  :D


W tym jest właśnie problem. Teksty - całe archiwum - jest już w bazie w takiej postaci na podałem wyżej. Mogę więc jedynie pobrac całość tekstu z rekordu.
Seth
swojego czasu napisalem cos takiego:
Kod
$content = substr( $text, 0, $max_len );

$content = substr( $text, 0, strrpos( $content, " " ) );

nie jest to jakis "piekny" kod winksmiley.jpg ale ma on na celu po odpowiedniej dlugosci ($max_len) wyswietlic tylko text do tej liczby znakow nie obcinajac jej np w srodku slowa ale obciac do najblizszej "spacji" od $max_len.
$text - przykladowo artykul z bazy d.
$content - zwroci kawalek textu

Wystarczy teraz tylko to przerobic i powinno byc ok
dragossani
Jeśli zależy Ci na podzieleniu tekstu na fragmenty, a podział ma być przeprowadzany zgodnie z podziałem na akapity to problem jest sądze niewielki. Ja bym to zrobił w ten sposób:
Kod
<?php

$text='Młoda, ciemnowłosa, starannie umalowana dziewczyna w stroju wieczorowym jedzie elegancką limuzyną. Limuzyna zatrzymuje się na poboczu. Nie taki był jednak cel podróży, dziewczyna, zaniepokojona, protestuje. Kierowca mierzy do niej z pistoletu i każe jej wysiadać. W tym momencie w limuzynę uderza samochód pełen rozbawionych młodych ludzi.<BR>Dziewczynie udaje się wyjść cało z wypadku. Słaniając się na nogach idzie przed siebie, schodząc w dół na Sunset Blv. Zasypia w krzakach. Jest wyraźnie zdenerwowana, zdezorientowana i zagubiona. Budzą ją głosy. Starsza zadbana kobieta o pysznych rudych włosach dyryguje szoferem znoszącym bagaże do samochodu. Korzystając z chwili nieuwagi właścicielki, dziewczyna wślizguje się do domu, gdzie kuli się na podłodze po stołem.<BR>Dwaj mężczyźni rozmawiają w barze. Jeden jest młodszy, przejęty i nerwowy, drugi starszy i trzymający trochę dystans. Młodszy opowiada mu o swoim śnie, w którym obaj się znajdują - miejsce jest to samo, bar Winkiego, a atmosfera jest przepełniona irracjonalnym, niesamowitym strachem. "Nagle" opowiada chłopak "zdaję sobie sprawę co jest przyczyną tego strachu". Na zapleczu baru jest jakiś mężczyzna. Ma straszną twarz - twarz taką, że chciałoby się już nigdy więcej nie oglądać. Ale przecież to tylko sen - wystarczy pójść na zaplecze i przekonać się na własne oczy że niczego tam nie ma. Tak też robią. I rzeczywiście zza węgła wyłania się o obszarpany człowiek o strasznej twarzy, ni to indiańskiego szamana, ni to demona...ten, który to wyśnił, krzyczy i mdleje.<BR>Lotnisko. Słodka blondynka, z gatunku takich, co to zawsze zostają gwiazdami szkoły i umawiają się z kapitanem drużyny footballowej, żegna się na lotnisku z towarzyszami podróży - parą miłych staruszków. Życzą jej szczęście w tym mieście snów, żeby jej marzenie o byciu gwiazdą - a przynajmniej dobrą aktorką - się spełniło. Jak za dotknięciem czarodziejskiej różdżki zjawia się taksówkarz, zanosi jej bagaże do samochodu, po prostu - wielki świat!<BR>My zaś widzimy parę staruszków w taksówce. Śmieją się do rozpuku, wyglądają jak ludzie, którym się udał świetny kawał. Śmieją się...ale z kogo? Z Betty - tak ma na imię jasnowłosa dziewczyna - czy może... z nas?';



function split_to_paragraphs($text='', $regexp='/<br>/i')

/*

** Funkcja zwraca tekst podzielony na paragrafy, opisany

** dodatkowo pozycją w tekście i długością paragrafu.

** Zwracana tablica ma postać:

**

** Array

** (

**     [0] => Array

**         (

**             [content] => treść akapitu pierwszego

**             [offset] => pozycja akapitu

**             [length] => długość akapitu

**         )

**

**     [1] => Array

**         (

**             [content] => treść akapitu drugiego

**             [offset] => pozycja akapitu

**             [length] => długość akapitu

**         )

** itd.  

** )

**

** Drugi parametr może posłużyć do podzielenia paragrafu

** według innych kryteriów niż znacznik <BR>

*/

{



    function describe_array($element)

    //podfunkcja opisująca paragraf

    {

  $element_length=strlen($element);

  $element=array('content' => $element, 'offset' =>$GLOBALS['offset'], 'length' => $element_length);

  $GLOBALS['offset']+=$element_length;

  return $element;

    }

    

    $GLOBALS['offset']=0;

    return array_map('describe_array',preg_split($regexp, $text));

};



function group_paragraphs($paragraphs, $packet_size, $packet_type='GP_BY_SIZE')

/*

** Funkcja grupuje paragrafy w pakiety wielkości $packet_size.

** Każdy pakiet zawiera co najmniej jeden paragraf. Jeśli wielkość

** pakietu przekroczy dopuszczalny rozmiar, następny paragraf

** zostanie przydzielony do kolejnego pakietu.

** Trzeci parametr określa kryterium grupowania. Mogą być to:

** GP_BY_SIZE   - według długości pakietu w znakach

**                (np. pakiet wielkości 1000 znaków)

** GP_BY_AMOUNT - według ilości paragrafów w pakiecie

**                (np. nie więcej niż 3 paragrafy w pakiecie)

** Tablica pakietów zwracana przez funkcję posiada następujące klucze:

** 'content' => tablica zawierająca paragrafy danego pakietu

** 'length' => łączna długość paragrafu w znakach

** 'offset' => pozycja początku pakietu

** 'amount' => liczba paragrafów w pakiecie

*/

{

    if (is_array($paragraphs))

    {

  $local_size=$amount=$length=$offset=0;

  foreach ($paragraphs as $para)

  {

     $amount++;

     $length+=$para['length'];

     if ($packet_type=='GP_BY_AMOUNT')

    {$local_size=$amount;}

     else

    {$local_size=$length;};

     $packet_content[]=$para;    

     if ($local_size>=$packet_size)

     {

    $packet['content']=$packet_content;

    $packet['length']=$length;

    $packet['offset']=$packet_content[0]['offset'];

    $packet['amount']=$amount;

    $packets[]=$packet;

    $local_size=$amount=$length=$offset=0;

    $packet_content=array();

     };

  };

  //wrzucenie ewentualnych resztek do ostatniego pakietu:

  if (!empty($packet_content))

  {

    $packet['content']=$packet_content;

    $packet['length']=$length;

    $packet['offset']=$packet_content[0]['offset'];

    $packet['amount']=$amount;

    $packets[]=$packet;

  };

    

  return $packets;

    } else return NULL;

}



//dzielimy sobie tekst na paragrafy:

$paragraphs=split_to_paragraphs($text);



//grupujemy paragrafy po 2 na stronę

$pages_by_amount=group_paragraphs($paragraphs, 2, 'GP_BY_AMOUNT');



//albo po przynajmniej 500 znaków na stronę

$pages_by_length=group_paragraphs($paragraphs, 500);



//cztery linijki poniżej wyświetlają wyniki kolejnych kroków

//print($text);

//print('<HR><PRE>'); print_r($paragraphs); print('</PRE>');

//print('<HR><PRE>'); print_r($pages_by_amount); print('</PRE>');

//print('<HR><PRE>'); print_r($pages_by_length); print('</PRE>');

?>

Funkcję do wyświetlania kolejnych stron zostawiam Twojej inwencji. smile.gif Mając gotową tablicę nie powinieneś mieć z tym problemu. Jeśli trzebaby pociąć akapity w połowie ich długości to wystarczy odpowiednio zmodyfikować funkcję split_to_paragraphs. Z resztą Seth już napisał Ci jak można to zrobić. 8)
hADeSik
No i objawił nam się wielbiciel Davida Lyncha winksmiley.jpg A rozumiem, że filmik oglądałeś X razy winksmiley.jpg
dragossani
:oops: to mnie przyłapaliście
kina zlynchowanego nigdy za wiele
hADeSik
Ale za Mulholland Drive powinni chyba David'a zlinczować rolleyes.gif
dragossani
Nie do końca rozumiem tą uwagę. Mulholland Drive to IMO jedna z lepszych pozycji w jego dorobku. Wyjątkowo intrygująca i konsekwentnie realizowana wizja. O ile np. "Lost Highway" pracuje na swoją klasę głównie klimatem, to "Mulholland Drive" jest dopracowane we wszystkich detalach. Pamiętam, że po obejrzeniu filmu przesiedziałem potem dobre parę dni na pewnym forum, dyskutując z różnymi ludzimi nad interpretacją zdarzeń i symboli z filmu.
hADeSik
No właśnie winksmiley.jpg
W zasadzie każdy może interpretować po swojemu...
Ale wyszliśmy ostro poza temat, EOT...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.