Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Funkcja add_file - problem
Forum PHP.pl > Forum > Przedszkole
Yazzie
Witam

Utworzyłem plik index.php o następującej budowie:

  1. <?php
  2. $key_path = "./";
  3. include ($key_path . "db_config.php");
  4. include ($key_path . "modules/functions.php");
  5.  
  6. $style = new Style ();
  7. $style-> file_html('index.html');
  8.  
  9. @include ($key_path . "language/polish.php");
  10.  
  11. foreach( $lang["header"] as $key => $value ) {
  12. $style-> add_file("LANG_" . $key, $value);
  13. }
  14. ?>


Jak widać, znajduje się tam odwołanie do pliku polish.php, który wygląda tak:

  1. <?php
  2. $lang["header"] = array(
  3. "POWERED_INFO" => "Forum oparte o skrypt ***",
  4. );
  5. ?>


Następnie utworzyłem plik index.html i funkcję file_html.

Plik:
  1. <head>
  2. <meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
  3. <title><{BOARD_TITLE}> &bull; <{LANG_POWERED_INFO}></title>
  4. </head>
  5. <body>
  6.  
  7. </body>
  8. </html>


Funkcja:

  1. <?php
  2. public function file_html($file)
  3. {
  4. if (file_exists ("styles/KeyStyle/$file")) include ("styles/KeyStyle/$file");
  5.  
  6. else echo ('<span style="color:red;"><b>Brak pliku ' . $file . ' w szablonie ' . $this->style_name . '</b></span>');
  7.  
  8. }
  9. ?>


Teraz chciałbym stworzyć funkcję add_file. Polegałaby ona na tym, że LANG_ znajdujący się w pętli foreach łączył się z $key i zamieniał się na $value. Normalnie użyłbym funkcji str_replace, ale chodzi o to, że LANG_ połączone z $key w pliku index.html wyglądało tak:

  1. <{LANG_$key}>


I to zamieniało się po wejściu na stronę na odpowiedni kod, który jest załączony w pliku polish.php, np. dam w pliku index.html kod:

  1. <{LANG_POWERED_INFO}>


A na stronie ma się wyświetlić napis "Forum oparte o skrypt ***"

Mam nadzieję, że zrozumieliście o co chodzi. Jest mi to bardzo potrzebne, gdyż nie chcę mieszać kodu PHP z kodem HTML w jednym pliku.

Pozdrawiam

P.S. Jeżeli nie zrozumieliście, o co mi chodzi, ściągnijcie EKINboard lub phpBB, tam jest coś podobnego.
kresh
A nie lepiej i wygodniej poprostu użyć SMARTY ?
Yazzie
Ale czy ten Smarty nie ma takiej budowy:

  1. <?php
  2. $tpl->funkcja(array(
  3. 'LANG_COS' => $lang['cos'],
  4. ));
  5. ?>


Bo jeżeli tak, to nie, dziękuję, bo ja chcę mieć w index.php taką budowę:

  1. <?php
  2. foreach( $lang["header"] as $key => $value ) {
  3. $style-> add_file("LANG_" . $key, $value);
  4. }
  5. ?>
kresh
Smarty daje bardzo duże możliwości. Możesz używać w szablonach zarówno pętli jak i instrukcji warunkowych.

Wszystko masz bardzo jasno opisane w dokumentacji.
Opis dotyczący funkcji foreach w SMARTY masz pod tym adresem
Yazzie
kresh, ale ja nie chcę właśnie gotowych rozwiązań smile.gif Wiecie, nie chcę was obrazić, ale skoro forum jest o PHP, to nie powinniście odsyłać ludzi do gotowych skryptów, no chyba, że to, o co prosi użytkownik, to naprawdę rozległy i dużym stopniu złożoności skrypt. Proszę Was o utworzenie tej funkcji smile.gif Jeżeli powiecie na to, że wy nie jesteście od tego, to naprawdę Was przepraszam, jednak sam próbowałem i nic smile.gif

Bardzo proszę o pomoc
kresh
Cytat(Yazzie @ 21.04.2007, 08:08:47 ) *
Normalnie użyłbym funkcji str_replace, ale chodzi o to, że LANG_ połączone z $key w pliku index.html wyglądało tak:

  1. <{LANG_$key}>


I to zamieniało się po wejściu na stronę na odpowiedni kod, który jest załączony w pliku polish.php, np. dam w pliku index.html kod:

  1. <{LANG_POWERED_INFO}>


Nie wiem czy dobrze zrozumiałem.
  1. <?php
  2. function addFile( $key, $value ){
  3.  
  4. return str_replace( '{' . $key . '}', $value, $content );
  5.  
  6. }
  7. ?>

Tyle, że trzeba pobrać zawartość pliku i załadować go do $content

a w html dajesz sobie
  1. {LANG_POWERED_INFO}
Yazzie
Cytat(kresh @ 23.04.2007, 20:13:27 ) *
Tyle, że trzeba pobrać zawartość pliku i załadować go do $content


A jak to zrobić? smile.gif

P.S. A mogę dać <{LANG_POWERED_INFO}> i w tym co mi dałeś zastąpić { KOD } na <{ KOD }>?
kresh
Cytat(Yazzie @ 23.04.2007, 18:14:42 ) *
A jak to zrobić? smile.gif

P.S. A mogę dać <{LANG_POWERED_INFO}> i w tym co mi dałeś zastąpić { KOD } na <{ KOD }>?


Jasne, że możesz.

A pobrać treść pliku możesz przy użyciu file_get_contents

  1. <?php
  2. $content = file_get_contents( $file );
  3. ?>
Yazzie
No dobrze, mam tylko pewien problem, czy jako zmienna $file mam podstawić nazwę danego pliku?

I jeszcze jedno, mam taki plik:

Kod
class Style {

  private $style_dir = 'styles';
  private $style_name = 'KeyStyle';
  private $style_content = '';
  private $vars = array ();

function file_html($file)

  {
  
    if (file_exists ("styles/KeyStyle/$file"))  include ("styles/KeyStyle/$file");

    else echo ('<span style="color:red;"><b>Brak pliku ' . $file . ' w szablonie ' .  $this->style_name . '</b></span>');
    
  }
  
function add_file( $key, $value ){

    return str_replace( '<{' . $key . '}>', $value, $content );

}

}


Gdzie wstawić to:

Kod
$content = file_get_contents( $file );
kresh
  1. <?php
  2. class Style {
  3.  
  4. private $style_dir = 'styles';
  5. private $style_name = 'KeyStyle';
  6. private $style_content = '';
  7. private $vars = array ();
  8.  
  9. function file_html( $file ){
  10.  
  11. if ( file_exists ( "styles/KeyStyle/$file" ) ){
  12. //ładujemy content do składowej "style_content";
  13. $this->style_content = file_get_contents( "styles/KeyStyle/$file" );
  14. } else {
  15. echo ('<span style="color:red;"><b>Brak pliku ' . $file . ' w szablonie ' . $this->style_name . '</b></span>');
  16. }
  17. }
  18.  
  19. function add_file( $key, $value ){
  20.  
  21. $this->style_content = str_replace( '<{' . $key . '}>', $value, $this->style_content );
  22.  
  23. }
  24.  
  25. function getContent(){
  26. return $this->$style_content;
  27. }
  28.  
  29. } 
  30.  
  31. //i teraz
  32. $style = new Style();
  33. $style->file_html( 'nazwa_pliku' );
  34.  
  35. /*
  36. ...
  37. zainicjowanie $lang['header']
  38. ...
  39. */
  40. foreach( $lang["header"] as $key => $value ) {
  41. $style-> add_file("LANG_" . $key, $value);
  42. }
  43.  
  44. echo $style->getContent();
  45. ?>


PS. Nazwy metod trochę mało intuicyjne, zwłaszcza add_file
Yazzie
Dwa problemy smile.gif

Jeden:

  1. <?php
  2. $style = new Style();
  3. $style->file_html( 'nazwa_pliku' );
  4.  
  5. foreach( $lang["header"] as $key => $value ) {
  6. $style-> add_file("LANG_" . $key, $value);
  7. }
  8.  
  9. echo $style->getContent();
  10. ?>


To ma być w pliku index.php

Drugi:

Jeżeli dam tak, jak ty mi dałeś, mam błąd:

Kod
Warning: Invalid argument supplied for foreach() in C:\usr\www\keybb\modules\functions.php on line 45

Fatal error: Cannot access empty property in C:\usr\www\keybb\modules\functions.php on line 36
kresh
1. A to jakiś problem?
2. zapomniałeś zainicjować $lang;
Yazzie
1. Może żaden smile.gif
2. Zainicjować to jest zaincludować plik, w którym ten lang["header"] się znajduje?

Dobra, problem rozwiązany, wszystko działa, senk ju biggrin.gif
kresh
1. Napewno żaden winksmiley.jpg
2. No na przykład. Chodzi o to, że w tej chwili $lang jest puste
Yazzie
Okazało się, że jest jeszcze jeden problem, oto on.

Ponieważ nie chcę mi się zmieniać headera w każdym pliku, zrobiłem plik o nazwie header.html. Tam wstawiłem kod loga, menu itp. Dodałem nad linijką:

  1. <?php
  2. $style->file_html ("index.html");
  3. ?>


Ten oto kod:

  1. <?php
  2. $style->file_html ("header.html");
  3. ?>


I gucio :| Wyświetla tylko index.html, bez header.html. HELP sad.gif
kresh
  1. <?php
  2. function file_html( $file ){
  3.  
  4. if ( file_exists ( "styles/KeyStyle/$file" ) ){
  5. //ładujemy content do składowej "style_content";
  6. $this->style_content = file_get_contents( "styles/KeyStyle/$file" );
  7. } else {
  8. echo ('<span style="color:red;"><b>Brak pliku ' . $file . ' w szablonie ' . $this->style_name . '</b></span>');
  9. }
  10. ?>

ta funkcja pozwala na załadowanie tylko jednego pliku. Jeśli chcesz mieć ich więcej daj:

  1. <?php
  2. function file_html( $file ){
  3.  
  4. if ( file_exists ( "styles/KeyStyle/$file" ) ){
  5. //ładujemy content do składowej "style_content";
  6. $this->style_content[] = file_get_contents( "styles/KeyStyle/$file" ); //tutaj zmieniamy zmienną w tablicę
  7. } else {
  8. echo ('<span style="color:red;"><b>Brak pliku ' . $file . ' w szablonie ' . $this->style_name . '</b></span>');
  9. }
  10. ?>


dalej zmiany wymaga także
  1. <?php
  2. private $style_content = '';
  3. //na
  4. private $style_content = array();
  5. ?>


i na końcu wyświetlanie załadowanych plików

  1. <?php
  2. function getContent(){
  3. return $this->style_content;
  4. }
  5. //zaminiłbym na
  6. function render(){
  7. foreach( $this->style_content as $content ){
  8. echo $content;
  9. }
  10. }
  11. ?>


>> EDIT: A innym prostszym rozwiązaniem jest utworzenie nowego obiektu Style
Yazzie
I teraz działa jak należy smile.gif Bardzo ci dziękuję, kresh tongue.gif
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.