Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zliczanie wystąpień wywołania metody w kodzie...
Forum PHP.pl > Forum > PHP
kreatiff
  1. <p>Tutaj? <?php echo $a->wstaw(); ?></p>
  2. <p>Może tutaj? <?php echo $a->wstaw(); ?></p>
  3. <p>Ewentualnie tutaj? <?php echo $a->wstaw(); ?></p>
  4. <p>Czy tu? <?php echo $a->wstaw(); ?></p>

Tylko w jednym z tych miejsc, gdzie znajduje się kod PHP ma się pojawić TAK. Losowo, przy odświeżeniu strony. Metoda wstaw() zwraca tylko raz "TAK" (inaczej zwraca pusty string), w zależności od tego, ile będzie miała możliwych miejsc do losowania.

Czy przed wykonaniem takiego kodu jest jakaś możliwość, by najpierw zliczyć w ilu miejscach metoda wstaw() będzie wywołana?
Bo problem jest taki, że nigdy nie znam ilości tych <?php echo $a->wstaw(); ?> w danym tekście bo jest ona zmienna, zależnie od tekstu. Tutaj występuje 4 razy, gdzieś indziej 1, albo 10.

Obejściem byłoby wstawienie tam jakiegoś unikalnego ciągu znaków i str_replace w buforze po zainicjowaniu ob_start. Ale to taka brzydka metoda i do tego nie chciałbym zmieniać treści tekstu.
PrinceOfPersia
a jakbys dwa razy przechodził, najpierw testowo, pózniej naprawdę?

tekst.php:
  1. <p>Tutaj? <?php echo $a->wstaw(); ?></p>
  2. <p>Może tutaj? <?php echo $a->wstaw(); ?></p>
  3. <p>Ewentualnie tutaj? <?php echo $a->wstaw(); ?></p>
  4. <p>Czy tu? <?php echo $a->wstaw(); ?></p>
  5.  
  6. <p>Czy tu? <?php echo $a->wstaw(); ?></p>


główny plik:

  1. class DummyObject {
  2. public $counter = 0;
  3.  
  4. public function wstaw() {
  5. $this->counter++;
  6. }
  7. }
  8.  
  9. class RealObject {
  10. private $whenToShow;
  11. private $counter = 0;
  12. function __construct ($number) {
  13. $this->whenToShow = rand(1, $number);
  14. }
  15.  
  16. public function wstaw() {
  17. $this->counter++;
  18. return ($this->counter == $this->whenToShow)? 'TAK' : '';
  19. }
  20. }
  21.  
  22. $a = new DummyObject; // tworzymy udawany obiekt, ktory bedzie zliczal wystapienia
  23. require('tekst.php'); // "wyswietlamy", ale tylko w buforze
  24. ob_clean(); //czyscimy bufor
  25.  
  26. $a = new RealObject($a->counter); // tworzymy prawdziwy obiekt
  27. require('tekst.php');
kreatiff
Sprytne. Po południu się pobawię.
A jest wg Ciebie jakiś lepszy sposób rozwiązania tego, nawet ze zmianą kodu php w miejscach, gdzie ma losowo wstawić to nieszczęsne "TAK"?

Mi niestety nic na myśl nie przychodzi. Na logikę muszę tekst wczytać dwukrotnie, ale jak jest jakieś inne rozwiązanie temu zapobiegające to warto byłoby spróbować.
nospor
Wyglada na to, ze masz poprostu zle zaprojektowaną aplikacje. No raczej nie powinno byc takich problemow. Moze napisz dokladnie co to bedzie robic i dlaczego tak, to moze uda sie wymyslic cos sensownego
kreatiff
Kod html ze wstawkami php to jest gotowa podstrona w jednym pliku. W uproszczeniu:
  1. <title><?php echo $a->title; ?></title>
  2. </head>
  3. <section>
  4. <?php foreach ( $a->get_arts() as $art ) : ?>
  5. <article>
  6. <h1><?php echo $art['h1']; ?></h1>
  7. <?php echo $a['txt']; ?>
  8. </article>
  9. <?php endforeach; ?>
  10. </section>
  11. <section>
  12. <p>Jakieś statyczne zdanie</p>
  13. <?php echo $a->wstaw(); ?>
  14. </section>
  15. <footer>
  16. <p>Copyright... <?php echo $a->wstaw(); ?></p>
  17. </footer>
  18. </body>
  19. </html>

Taki plik jest przez mechanizm strony includowany i drukowany oraz uzupełniany o elementy pobrane z bazy.
Dla pojedynczego pliku szablonu ilość wywołań metody wstaw() jest stała, ale chciałem uniknąć liczenia tego na sztywno z góry, bo ilość ta będzie różna w zależności od użytego szablonu i prawdopodobnie będzie się zmieniać wedle własnego "widzimisię". I to jest tutaj słabym punktem, bo po przemysleniach chyba jednak najrozsądniejszym rozwiązaniem będzie na sztywno określać ilość potencjajnych miejsc do wstawiania.
W każdym takim szablonie wstawiam sobie dowolną ilość tych wstaw() i chciałem, by mechanizm aplikacji jakoś sobie sam to zliczał i wybierał jedno miejsce, gdzie wstawi kod generowany przez wstaw().
wstaw() to po prostu krótka treść reklamy.
nospor
Widze dwa rozwiazania:
1) Skoro dany szablon ma te liczbe na sztywno, to zapisuj info jaki szablon jaka liczba. Wowczas ladujac strone z danym szablonem bedziesz wiedzial co i jak

2) Druga metoda jest gorsza, ale bardziej uniwersalna:
Funkcja wstaw powinna zwracac zawsze jakis staly tekst powiekszony o 1, np: #REKLAMA_1#, #REKLAMA_2#,.... #REKLAMA_15#
Efekt wykonania szablonu od razu nie wyswietlaj. Wpierw zapisz go do zmiennej. Wiesz juz ile razy wykonalo się wstaw() - mozesz to zapisywac w jakiejs zmiennej globalnej. Losujesz teraz dla jakiej liczby masz wstawic tresc reklamy. Wylosowales np. 5. Czyli podmiieniasz #REKLAMA_5# na tresc reklamy, a pozostale #REKLAMA_x# podmieniasz na "nic". I dopiero teraz wyswietlasz efekt wykonania szablonu
kreatiff
Dziękuję za podsunięte pomysły i sugestie.
Pozostanie mi liczenie z góry tych wstawek na etapie ich wstawiania do szablonu, gdyż metoda druga to w zasadzie to czego chciałem uniknąć (podwójne podstawianie).

Czasem takie nadmierne dążenie do uniwersalności potrafi zapędzić mnie w kozi róg. smile.gif
nospor
Cytat
gdyż metoda druga to w zasadzie to czego chciałem uniknąć (podwójne podstawianie).
Tam nie ma podwojnego podstawiania. Tam jest wykonanie szablonu raz i tylko podmiana w nim danych.
W metodzie co podal Prince, tam masz podwoje podstawianie i podwojne wykonywanie szablonu
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.