Problem ze skryptem newsów


(adam9870) #1

Witam!

W KŚ Eksper 5/2004 znalazłem całkiem fajny skrypt newsów:

<?php

$katlog = "art";

$kat = opendir($katalog);

while ($plik = readdir($kat)){

  $rozszerzenie=substr($plik,strrpos($plik,'.'));

  if ($rozszerzenie==".txt"){

    $baza["$katalog/$plik"]= date("y-m-j h:i",

	       filemtime($katalog."/".$plik));

  }

}

closedir($kat);


if ($baza<>null){

  arsort($baza);

  while (list($nazwa,$data)=each($baza)){

    $linia=0;

	$nius=file($nazwa);

	foreach ($nius as $wartosc){

	  if ($linia==0){

	    echo "".$wartosc."(";

		echo $data . ")";

	  }

	  else echo $wartosc;


	  echo "
";

	  $linia++;

	}

  echo "
";

  }

}

else echo "brak artykulow";

?> [/code]

Zrobłem katalog art i umiescilem w nim plik news1.txt. Na serwerze utworzylem katalog skrypt_newsy i umiescilem w nim plik z tym skryptem oraz katalog art w ktorym jest plik news1.txt. I po otworzeniu tego pliku pokazuje Mi się komunikat "brak artykulow ". Ale czemu :? Przeciez umiescilem w katalogu art plik txt z jednym newsem.

A i jeszcze da sie jakoś ten skrypt tak przerobic aby działał na serwerze z Safe Mode ?? Bo po wniesieniu pliku na serwer wyswietla sie:

Jeżeli ktos może wskazac błąd to prosilbym o poprawienie go na skrypcie bo jestem zielony w php i nie umialbym tego wykorzystac. :frowning:

Z góry dzięki.

[color=darkblue][size=75]Złączono Posta: 24.03.2006 (Pią) 16:15[/size][/color]

Oczywiście samo "brak artykulow" wyświetla się na serwerze na ktorym nie jest wlaczone safe mode.

[color=darkblue][size=75]Złączono Posta: 24.03.2006 (Pią) 16:18[/size][/color]

A i jeszcze chcialbym ustawic tak aby newsy byly dzielone na strony. Np. 3 albo 4 newsy na jednej stronie...


(Balon) #2
<?php

$katalog = "art";

$kat = opendir($katalog);

while ($plik = readdir($kat)){

  $rozszerzenie=substr($plik,strrpos($plik,'.'));

  if ($rozszerzenie==".txt"){

    $baza["$katalog/$plik"]= date("y-m-j h:i",

          filemtime($katalog."/".$plik));

  }

}

closedir($kat);


if ($baza<>null){

  arsort($baza);

  while (list($nazwa,$data)=each($baza)){

    $linia=0;

   $nius=file($nazwa);

   foreach ($nius as $wartosc){

     if ($linia==0){

       echo "".$wartosc."(";

      echo $data . ")";

     }

     else echo $wartosc;


     echo "
";

     $linia++;

   }

  echo "
";

  }

}

else echo "brak artykulow";

?> [/code]

?

a numerki stron to sam juz sobie zrob...


(adam9870) #3

BalonPL Dzięki. Skrypt działa, nawet na serwerze z Safe mode :slight_smile:

A mógłbys zrobic numery stron bo ja nie wiem jak.

edit:

i czy da się zrobić aby nie wyświetlało daty dodania newsa. tylko jeżeli bym chciał to bym sam ją w newsie pisał.


(Balon) #4

dam Ci tylko pomysl na zrobienie tego (bo ten skrypt nie przypadl mi do gustu i sam bym go wolal napisac)

laduj dane z pliku, rozbij je explode() a separator ustaw \n... potem za pomoca count() oblicz ilosc elementow po rozbiciu w tablicy i podziel to przez ilosc newsow na strone i zaokroglij do gory za pomoca ceil() ;] potem po prostu generujesz linki sobie tak zeby byly wyswietlane elementy tablicy tylko od np 10-19, 20-29 itd ;] koncowka jest tylko najgorsza :wink: ogolnie to musisz posiedziec troche w php a takie skrypty to nie beda CI sprawialy problemu :wink:

Złączono Posta : 24.03.2006 (Pią) 17:19

ps to zaokraglanie do gory z obliczonego counta i podzielonego przez max newsow na strone to sluzy do obliczenia na ile stron musisz podzielic te newsy ;]


(Lisek) #5

Jeśli to pomoże, to w tym wątku http://forum.dobreprogramy.pl/viewtopic.php?t=60942 opisałe ideę dzielenie na strony. Wprawdzie na podstawie bazy danych ale zaadaptowanie to pod pliki nie jest już problemem.


(adam9870) #6

BalonPL , lisek Fajnie tak pisać dla kompletnego laika w php który nie wie kompletnie nic w php (no tylko wiem znak otwierający skrypt i zamykający skrypt). :frowning:

Mógłby ktoś to co radził lisek oraz BalonPL wstawic w ten skrypt ??

Złączono Posta : 26.03.2006 (Nie) 11:48

help

Złączono Posta : 02.04.2006 (Nie) 17:47

nikt nie wie ??

To bardzo Mi potrzebne.

Złączono Posta : 06.04.2006 (Czw) 16:03

Czyżby nikt na forum nie umiał PHP i nie zmieni Mi tego skrypciku :? :frowning:


(Balon) #7
<?php

$ile = 10; #ile newsow na strone

$dir = 'newsy/';

$dw = opendir( $dir );

if( isset( $_GET['p'] ) )

{

	$p = $_GET['p'];

}

else 

{

	$p = 0;

}

/**

 * Tu sobie zapisujemy nazwy plików w tablicy zeby bylo nam potem latwiej

 * dzielic to wszystko na strony

 */

$i = 0;

while( $file = readdir( $dw ) )

{

    $roz = array_pop( explode( '.', $file ) );

    if( $roz == 'txt' && $file !== '..' && $file !== '.' )

    {

        $pliki[$i] = $file;

        $i++;

    }    

}

/**

 * Teraz robimy sobie licznik stron

 */

$pager = 'Strony: Poczatek';

$strony = ceil( count( $pliki ) / $ile );

for( $i = 0; $i < $strony; $i++ )

{

    if( $p == $i * $ile )

    {

		$pager .= ' '.( $i ).' ';

    }	

}

/**

 * wyswietlamy

 */

for( $i = $p; $i < $p + $ile; $i++ )

{

    if( $i < count( $pliki ) )

    {

    	$fw = fopen( $dir.$pliki[$i], r);

    	echo fread( $fw, filesize( $dir.$pliki[$i] ) ).'

';

		fclose( $fw );

    }		

}

echo '

';

echo $pager;

?>[/code]


napisalem cos takiego... to dziala ale linki do podstron sa zle wyswietlane... nie wiem dlaczego 



na przyszlosc to nie licz ze ktos Ci to zrobi a jesli chcesz cos takiego to musisz sie udac na strony gdzie mozesz zlecac cos takiego za $$ (polecam sie :P) 



[color=darkblue][size=75][i][b]Złączono Posta[/b]: 07.04.2006 (Pią) 8:48[/i][/size][/color]

chcialem dodac ze to nie wina zadnego Safe Mode... jakbys wiedzial co to jest to wcale nie ma to wplywu na te funkcje ;] [color=darkblue][size=75]Złączono Posta: 07.04.2006 (Pią) 8:52[/size][/color] tak sobie pomyslalem ze na przyszlosc prosze probowac samemu... dolaczam tutaj klase ktora napisalem - tez stronnicowanie ale bardziej zaawansowane z mozliwoscia poruszania sie po pagerze... :wink:
[code]<?php /** * Klasa pagera * @author Krzysztof 'Balon' Jagiełło * */ class pager { var $totalPages; # jest to mysql_num_rows var $ile; # ile danych na strone var $pagerMax; # ile linkow max w pagerze var $actPage; # aktualna strona ( $p ) var $pager; # Pager function _setPager( $actPage, $pagerMax, $totalPages, $ile) { $this->actPage = $actPage; $this->pagerMax = ceil( ( $pagerMax - 1 ) / 2 ); $this->totalPages = $totalPages; $this->ile = $ile; } function showPager() { $this->pager = 'Strony: << '; if( $this->actPage > 10 ) { $this->pager .= '[\<](main,'.(%20%24this-) '; } for( $i = ( ( $this->actPage / 10 ) - $this->pagerMax ); $i <= ( $this->actPage / 10 ) + $this->pagerMax; $i++ ) { if ( $i > 0 && $i < $this->totalPages ) { if( ( $i*10 ) == $this->actPage ) { $this->pager .= '['.($i).'](main,'.(%24i%20*%2010).'.html)  '; } else { $this->pager .= '['.($i).'](main,'.(%24i%20*%2010).'.html)  '; } } } if( $this->actPage < ( ( $this->totalPages * 10 ) - 10 ) ) { $this->pager .= '[\>](main,'.(%20%24this-) '; } $this->pager .= ' [>>](main,'.(%20(%20%24this-)'; return $this->pager; } } ?>


(adam9870) #8

(Balon) #9
<?php

$ile = 3; #ile newsow na strone

$dir = 'art/';

$dw = opendir( $dir );

if( isset( $_GET['p'] ) )

{

	$p = $_GET['p'];

}

else 

{

	$p = 0;

}

/**

 * Tu sobie zapisujemy nazwy plików w tablicy zeby bylo nam potem latwiej

 * dzielic to wszystko na strony

 */

$i = 0;

while( $file = readdir( $dw ) )

{

    $roz = array_pop( explode( '.', $file ) );

    if( $roz == 'txt' && $file !== '..' && $file !== '.' )

    {

        $pliki[$i] = $file;

        $i++;

    }    

}

/**

 * Teraz robimy sobie licznik stron

 */

$pager = 'Strony: Poczatek';

$strony = ceil( count( $pliki ) / $ile );

for( $i = 0; $i < $strony; $i++ )

{

    if( $p == $i * $ile )

    {

		$pager .= ' '.( $i ).' ';

    }	

}

/**

 * wyswietlamy

 */

$s = 0;

for( $i = $p; $i < $p + $ile; $i++ )

{

    if( $i < count( $pliki ) )

    {

    	$fw = fopen( $dir.$pliki[$i], r);

    	$dane[$s]['tresc'] = fread( $fw, filesize( $dir.$pliki[$i] ) );

		fclose( $fw );

		$s++;

    }		

}

echo '

';


/**

 * Smarty

 */

$smarty->assign( 'NEWSY', $dane ); # {NEWSY}

$smarty->assign( 'PAGER', $pager ); # {PAGER}

?>[/code]

wiecej juz nie bede CI pomagal tutaj bo widze ze zamiast pomyslec to wolisz sie wyreczyc innymi :stuck_out_tongue: :evil:


(adam9870) #10

No umiescilem ten skrypcik w index.php i do katalogu art umiescilem plik news1.txt (w nim jest news) i patrze i po wejściu na stronie pokazuje się:

Fatal error: Call to a member function assign() on a non-object in /home/a/d/a/adam9870/www/skrypt_newsy/index.php on line 67

Czemu ??

Kod jest taki (nic nie zmienialem) co podal Balon.

Tu ten plik jest

http://adam9870.ovh.org/skrypt_newsy/index.php


(Balon) #11

no wlasnie masz zmienic... gdzie utworzyles egzemplarz klasy smarty ?

$smarty = new smarty;

i jeszcze potem musisz dodac wskazanie tpl

$smarty->display( 'jakistemplate.tpl' );

:wink:

wlasnie pracuje u siebie nad obiektowym i lepszym rozwiazaniem w ktorym bedzie dzialal ten caly pager... bo w tym co zrobilem to cos nie dizala to do konca bo pierwszy link jest zle wyswietlany...


(adam9870) #12

BalonPL Nic nie utwarzałem. Wkleilem gotowy skrypt i tyle.

A jakie tpl ?? Co to woogle jest i do czego ?? Mam coś stworzyć ??

Proszę o rady... :frowning:


(Balon) #13

zrozumialem ze masz system szablonowy smarty :stuck_out_tongue: no ale nie masz wiec

<?php

$ile = 3; #ile newsow na strone

$dir = 'art/';

$dw = opendir( $dir );

if( isset( $_GET['p'] ) )

{

   $p = $_GET['p'];

}

else

{

   $p = 0;

}

/**

 * Tu sobie zapisujemy nazwy plików w tablicy zeby bylo nam potem latwiej

 * dzielic to wszystko na strony

 */

$i = 0;

while( $file = readdir( $dw ) )

{

    $roz = array_pop( explode( '.', $file ) );

    if( $roz == 'txt' && $file !== '..' && $file !== '.' )

    {

        $pliki[$i] = $file;

        $i++;

    }   

}

/**

 * Teraz robimy sobie licznik stron

 */

$pager = 'Strony: Poczatek';

$strony = ceil( count( $pliki ) / $ile );

for( $i = 0; $i < $strony; $i++ )

{

    if( $p == $i * $ile )

    {

      $pager .= ' '.( $i ).' ';

    }   

}

/**

 * wyswietlamy

 */

for( $i = $p; $i < $p + $ile; $i++ )

{

    if( $i < count( $pliki ) )

    {

       $fw = fopen( $dir.$pliki[$i], r);

       echo fread( $fw, filesize( $dir.$pliki[$i] ) ).'

';

      fclose( $fw );

    }      

}

echo '

';

echo $pager;

?>

[/code]

ta zmienil sie bo napisalem ten skrypt od nowa i zupelnie inaczej bo ten z komputer swiat mial za duzo zbednych bzdur...

a ten co tutaj jest bedzie dzialal... nazwe katalogu w ktorym sa pliki masz w zmiennej $dir na poczatku pliku


(adam9870) #14

BalonPL Wielkie dzięki :slight_smile: Skrypt działa.

Tylko czy mógłbyś zrobić aby newsy były wyświetlane w odwrotnej kolejności ?? Bo teraz są starsze na górze a nowsze na dole. A powinno być odwrotnie.

:roll:


(Balon) #15
<?php

$ile = 10; #ile newsow na strone

$dir = 'newsy/';

$dw = opendir( $dir );

require_once 'pager.class.php';

if( isset( $_GET['p'] ) )

{

	$p = $_GET['p'];

}

else 

{

	$p = 0;

}

/**

 * Tu sobie zapisujemy nazwy plików w tablicy zeby bylo nam potem latwiej

 * dzielic to wszystko na strony

 */

$i = 0;

while( $file = readdir( $dw ) )

{

    $roz = array_pop( explode( '.', $file ) );

    if( $roz == 'txt' && $file !== '..' && $file !== '.' )

    {

        $pliki[$i] = $file;

        $i++;

    }    

}

$pliki = array_reverse( $pliki );

/**

 * Teraz robimy sobie licznik stron

 */

$pager = 'Strony: Poczatek';

$strony = ceil( count( $pliki ) / $ile );

for( $i = 0; $i < $strony; $i++ )

{

    if( $p == $i * $ile )

    {

		$pager .= ' '.( $i ).' ';

    }	

}

/**

 * wyswietlamy

 */

for( $i = $p; $i < $p + $ile; $i++ )

{

    if( $i < count( $pliki ) )

    {

    	$fw = fopen( $dir.$pliki[$i], r);

    	echo fread( $fw, filesize( $dir.$pliki[$i] ) ).'

';

		fclose( $fw );

    }		

}

echo '

';

echo $pager;

$pg = new pager( $p, count( $pliki ) );

echo $pg->showPager();

?>[/code]

zeby dzialalo poprawnie musisz jako nazwy plikow ustawiac kolejne liczby naturalne ;] bo w ten sposob czytana jest zawartosc folderu... a do odwrocenia newsow wystarczyło uzyc array_reverse :wink: juz powinno smigac


(adam9870) #16

Tylko, że ja jestem kompletnie zielony w php i nie wiem jak :frowning:

Pojawia się:

Warning: opendir(newsy/) [function.opendir]: failed to open dir: No such file or directory in /home/a/d/a/adam9870/www/skrypt_newsy/index.php on line 9


Warning: require_once(pager.class.php) [function.require-once]: failed to open stream: No such file or directory in /home/a/d/a/adam9870/www/skrypt_newsy/index.php on line 10


Fatal error: require_once() [function.require]: Failed opening required 'pager.class.php' (include_path='.:/usr/local/php5/lib/php') in /home/a/d/a/adam9870/www/skrypt_newsy/index.php on line 10

PS. W poprzednim kodzie skryptu co mi podawales zrobiłem 4 newsy i jak klikne na 1 (numer strony) to pojawił sie taki odsylacz:

57x8tel21ogixqnhm.png

to chyba błędzik :roll:

Złączono Posta : 07.04.2006 (Pią) 17:10

Proszę o pomoc.

Jak wcześniej napisałem to jest Mi to bardzo potrzebne...


(Balon) #17

a nie zauwazylem ze napisales ;p heh masz bledy bo Ci podalem kod skryptu jak go przerabialem wlasnie... xD teraz juz mam calkowicie gotowy skrypcik elegancko oparty na klasie pagera ktora przed chwila skonczylem :slight_smile: krotka instrukcja

tworzysz plik pager.class.php o takiej zawartosci

<?php

/**

 * Klasa ksiegi kosci

 *

 */

class pager

{

	var $ileMax; # ileMax na strone

	var $actPage; # aktualna strona

	var $ilePages; # ile stron (wynik guestbook::ileStron)

	var $pagerMax = 3; # maxymalna ilosc linkow po lewej stronie aktywnego i prawej

	var $text = array( 'PREV' => '<<< Poprzednia', 'NEXT' => 'Następna >>>', 'T_PREV' => 'Poprzednia strona', 'T_NEXT' => 'Następna strona' );


	/**

	 * Konstruktor klasy

	 *

	 * @param integer $actPage aktualny numer strony

	 * @param integer $num ilosc wynikow (mysql_num_rows)

	 * @param inteher $ileMax ilosc newsow na strone

	 * @return guestbook

	 */

	function pager( $actPage, $num, $ileMax )

	{

		$this->actPage = $actPage;

		$this->ileMax = $ileMax;

		$this->ilePages = $this->ileStron( $num );		

	}

	/**

	 * Pager

	 *

	 */

	function showPager()

	{

		$this->prev();

		for( $i = ( $this->actPage / $this->ileMax ) - ($this->pagerMax - 1); $i <= ( $this->actPage / $this->ileMax ) + ( $this->pagerMax + 1 ); $i++ )

		{

			if( $i > 0 && $i <= $this->ilePages )

			{

				$this->page( ( $i-1 ) * $this->ileMax );

			}

		}

		$this->next();

		return $this->pager;

	}

	/**

	 * Poprzednia strona

	 *

	 */

	function prev()

	{

		if( ceil( $this->actPage/$this->ileMax ) <= 0 )

		{

			$this->pager = $this->text['PREV'];

		}

		else 

		{

			$this->pager = ''.$this->text['PREV'].'';

		}

	}

	/**

	 * Nastepna strona

	 *

	 */

	function next()

	{

		if( ceil( ( $this->actPage/$this->ileMax ) + 1 ) >= $this->ilePages )

		{

			$this->pager .= ' '.$this->text['NEXT'];

		}

		else 

		{

			$this->pager .= ' '.$this->text['NEXT'].'';

		}

	}

	/**

	 * wyswietlanie linku do strony

	 *

	 * @param integer $i numer strony

	 */

	function page( $i )

	{

		if( $this->actPage == $i )

		{

			$this->pager .= ' '.( ( $i/$this->ileMax ) + 1).'';

		}

		else 

		{

			$this->pager .= ' '.( ( $i/$this->ileMax ) + 1).'';

		}

	}

	/**

	 * Obliczanie ilosci stron

	 *

	 * @param integer $num liczba wpisow(mysql_num_rows)

	 * @return $ilePages

	 */

	function ileStron( $num )

	{

		return ceil( $num / $this->ileMax );

	}

}[/code]




i plik [b]newsy.php[/b] o takiej zawartosci

[code]<?php $ile = 4; #ile newsow na strone $dir = 'newsy/'; # katalog z newsami $dw = opendir( $dir ); require_once 'pager.class.php'; if( isset( $_GET['p'] ) ) { $p = $_GET['p']; } else { $p = 0; } /** * Tu sobie zapisujemy nazwy plików w tablicy zeby bylo nam potem latwiej * dzielic to wszystko na strony */ $i = 0; while( $file = readdir( $dw ) ) { $roz = array_pop( explode( '.', $file ) ); if( $roz == 'txt' && $file !== '..' && $file !== '.' ) { $pliki[$i] = $file; $i++; } } $pliki = array_reverse( $pliki ); /** * wyswietlamy */ for( $i = $p; $i < $p + $ile; $i++ ) { if( $i < count( $pliki ) ) { $fw = fopen( $dir.$pliki[$i], r); echo fread( $fw, filesize( $dir.$pliki[$i] ) ).'


i pliki z newsami ktore tworzysz powinny miec nazwy bedace kolejnymi liczbami naturalnymi

1.txt

2.txt

3.txt

4.txt

(...)

pozdrawiam :stuck_out_tongue:


(adam9870) #18

(Balon) #19

po pierwsze klasa nie jest w ogole wyswietlana.. wiec po co tam jakies heady ? pager.class.php ma wygladac tak

<?php

/**

 * Klasa ksiegi kosci

 *

 */

class pager

{

   var $ileMax; # ileMax na strone

   var $actPage; # aktualna strona

   var $ilePages; # ile stron (wynik guestbook::ileStron)

   var $pagerMax = 3; # maxymalna ilosc linkow po lewej stronie aktywnego i prawej

   var $text = array( 'PREV' => '<<< Poprzednia', 'NEXT' => 'Następna >>>', 'T_PREV' => 'Poprzednia strona', 'T_NEXT' => 'Następna strona' );


   /**

    * Konstruktor klasy

    *

    * @param integer $actPage aktualny numer strony

    * @param integer $num ilosc wynikow (mysql_num_rows)

    * @param inteher $ileMax ilosc newsow na strone

    * @return guestbook

    */

   function pager( $actPage, $num, $ileMax )

   {

      $this->actPage = $actPage;

      $this->ileMax = $ileMax;

      $this->ilePages = $this->ileStron( $num );      

   }

   /**

    * Pager

    *

    */

   function showPager()

   {

      $this->prev();

      for( $i = ( $this->actPage / $this->ileMax ) - ($this->pagerMax - 1); $i <= ( $this->actPage / $this->ileMax ) + ( $this->pagerMax + 1 ); $i++ )

      {

         if( $i > 0 && $i <= $this->ilePages )

         {

            $this->page( ( $i-1 ) * $this->ileMax );

         }

      }

      $this->next();

      return $this->pager;

   }

   /**

    * Poprzednia strona

    *

    */

   function prev()

   {

      if( ceil( $this->actPage/$this->ileMax ) <= 0 )

      {

         $this->pager = $this->text['PREV'];

      }

      else

      {

         $this->pager = ''.$this->text['PREV'].'';

      }

   }

   /**

    * Nastepna strona

    *

    */

   function next()

   {

      if( ceil( ( $this->actPage/$this->ileMax ) + 1 ) >= $this->ilePages )

      {

         $this->pager .= ' '.$this->text['NEXT'];

      }

      else

      {

         $this->pager .= ' '.$this->text['NEXT'].'';

      }

   }

   /**

    * wyswietlanie linku do strony

    *

    * @param integer $i numer strony

    */

   function page( $i )

   {

      if( $this->actPage == $i )

      {

         $this->pager .= ' '.( ( $i/$this->ileMax ) + 1).'';

      }

      else

      {

         $this->pager .= ' '.( ( $i/$this->ileMax ) + 1).'';

      }

   }

   /**

    * Obliczanie ilosci stron

    *

    * @param integer $num liczba wpisow(mysql_num_rows)

    * @return $ilePages

    */

   function ileStron( $num )

   {

      return ceil( $num / $this->ileMax );

   }

}

?>[/code]

(adam9870) #20