Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Znalezienie wg wzorca i uruchomienie funkcji na tych elementach
Forum PHP.pl > Forum > PHP
activestate
Czesc !

Chciałbym prosić o pomoc w pewnym zagadnieniu.

Mam z bazie tekst. Potrzebuję z tego tekstu wyciągnąć konkretny wzór, powiedzmy: "/[LICENSE]/" i zamienić go na akcję konkretnej funckcji.

Doszedłem do tego:

  1. private function replace($matches) {
  2. $da = $this->Photo->find('all');
  3. return 'test';
  4. }


  1. $da = preg_replace_callback("/[LICENSE]/" ,"self::replace", $data['Page']['body']);
  2. $this->set('data', $da);


funkcja replace() robi to co powinna, w tekscie zmienia license na test, ale to nie tak ma być.
funkcja replace powinna mi zrobić coś bardziej konkretnego - podczas wystąpienia [license] ma uruchomic funckja która, wydobędzie cos z bazy i wyświetli w pętli.

Właściwie, to potrzebuję czegoś jak na tym forum, zaznaczasz tekst, bierzesz PHP i masz znaczniki
  1. które formatują tekst.
  2.  
  3. Mnie jest potrzebne coś takiego, ale mam znaleźć np [license] i zmienić to na np:
  4.  
  5.  
  6. [php]$x = $this->set('pages', $this->Page->find('all');
  7. print $x['Page']['body'];


Dzięki za help.
SmokAnalog
A trochę jaśniej?

Masz błąd w swoim wyrażeniu regularnym - wzorzec /[LICENSE]/ zamieni każdą literę L, I, C itd., a nie ciąg [LICENSE]. Powinieneś użyć wzorca /\[LICENSE\]/.

Ale wytłumacz o co dokładnie chodzi. W funkcji przekazywanej do preg_replace_callback możesz robić co Ci się żywnie podoba.
activestate
Dzięki za zainteresowanie,

Do bazy zapisuję jakiś LONGTEXT. Potem w kontrolerze, tekst ten pobieram z bazy. Chcę, przed wyświetleniem tego tekstu w widoku, sprawdzić czy w takim tekscie jest znacznik ['license']. Jeśli jest, znacznik chcę zmienić na akcję jakiejś funkcji, np: wybarć z bazy zdjęcia i je wyswietlić .

W wordpressie widziałem plugin - robiłeś galerię, galeria otrzymała jakieś ID.
Potem podczas pisania np. artykuły, mogłeś napisać [gallery=1] i po zapisaniu artykułu, otrzymałeś artykuł z galerią z ID 1.



Piszę własnego cmsa.
Jest ukonczony prawie, mam tylko problem z np: galeriami.

W Tinymce chcę napisać np: ['galeria1'] i chcę w widoku otrzymać galerię z id 1 .
ctom
Cytat(activestate @ 23.11.2013, 16:43:10 ) *
W Tinymce chcę napisać np: ['galeria1'] i chcę w widoku otrzymać galerię z id 1 .


to może te załóż, że będziesz ID galerii oddzielał ":" np.

Kod
$longtext = "Jakim tam tekst [galeria:1] i to tego druga galeria [galeria:2] ..... ";

$newText = preg_replace_callback( '/\[galeria:(\d+)\]/',
    function($match){         
        return generuj-kod-galeri-z-id($match[1]);    
    }, $longtext  );
activestate
return generuj-kod-galeri-z-id($match[1]);

Może zwrócić to:
  1. foreach ($cos as $c) {
  2. print '<img src... />'
questionmark.gif
activestate
return generuj-kod-galeri-z-id($match[1]);

Może zwrócić to:
  1. foreach ($cos as $c) {
  2. print '<img src... />'
questionmark.gif
ctom
Ty pytasz czy ... ?

jak już to :

Kod
$text = '';
foreach ($cos as $c) {
$text .= '<img src... />'
}
return $text
activestate
po modyfikacji dla CakePHP ( może komuś się przyda ):

  1. // funkcja wyswietli zdjęcia z bazy na podstawie Id
  2. function callbackFunction($matches) {
  3. $this->loadModel('Photo');
  4. $a = $this->Photo->findById($matches[1]);
  5. foreach ($a as $b) {
  6. return '<img src="files/' .$b['name'] . '" >' ;
  7. }
  8. }



  1. public function index($name = null) {
  2. $this->loadModel('Page');
  3. if ($name) {
  4. $this->Page->Subpage->recursive = -1;
  5. $this->Page->recursive = -1;
  6. if (($data = $this->Page->findBySlug($name)) OR ($data = $this->Page->Subpage->findBySlug($name))) {
  7.  
  8. // obsluga 'slugów'
  9. $pattern = '/\\[galeria:(\\d+)\\]/';
  10. $d = preg_replace_callback($pattern, "self::callbackFunction", $data['Page']['body']);
  11.  
  12. $this->set('data', $data);
  13. $this->set('test',$d) ;
  14.  
  15. } else {
  16. throw new NotFoundException('Nie ma takiej strony');
  17. }
  18. }
  19. }


W edytorze WYSIWYG wpisuję np:
[galeria:142]

Dzięki.
ctom
Cytat(activestate @ 23.11.2013, 23:51:48 ) *
po modyfikacji dla CakePHP ( może komuś się przyda ):

  1. // funkcja wyswietli zdjęcia z bazy na podstawie Id
  2. function callbackFunction($matches) {
  3. $this->loadModel('Photo');
  4. $a = $this->Photo->findById($matches[1]);
  5. foreach ($a as $b) {
  6. return '<img src="files/' .$b['name'] . '" >' ;
  7. }
  8. }


1/ zdjęcie czy zdjęcia ?
2/ kod html "zaczytuj" z widoku a nie generujesz w kontrolerze/module
activestate
1.zdjęcie - na razei, potem przerabiam na galerie
2. nie wiem co masz na mysli "zaczytuj" - print jest własnie w widoku.
ctom
ad1. no właśe, bo nie wiem co Ci to $a zwraca, ale raczej array a robisz return po pierwszym elemencie
ad2. nie robię nic w CakePHP więc nie podam Ci składni , ale chodzi to byś to: "...<img src="files/..." miał w widokach/szablonach. Jak później będziesz (Ty/ktoś) chciał ostylować galerię to gdzie będzie tego szukał ?
activestate
Masz rację, ale img src muszę robić w kontrolerze, bo w widoku nie mam dostępu do modelu który moze wybrać z tabeli dane.


Cytat(ctom @ 24.11.2013, 14:15:18 ) *
ad1. no właśe, bo nie wiem co Ci to $a zwraca, ale raczej array a robisz return po pierwszym elemencie
ad2. nie robię nic w CakePHP więc nie podam Ci składni , ale chodzi to byś to: "...<img src="files/..." miał w widokach/szablonach. Jak później będziesz (Ty/ktoś) chciał ostylować galerię to gdzie będzie tego szukał ?


Poza tym dam image potem w diva z klasą i ostuluje się bez problemu w css, bez potrzeby grzebania w kontrolerze.

Pozdrawiam.
ctom
Cytat(activestate @ 24.11.2013, 16:44:04 ) *
Masz rację, ale img src muszę robić w kontrolerze, bo w widoku nie mam dostępu do modelu który moze wybrać z tabeli dane.


jak pisałem nie znam CakePHP, ale idea MVC jest pewnie podobna ;-) , że dane przekazujesz do VIEW a nie ma ta pobierasz cokolwiek

Kod
function callbackFunction($matches) {
    $this->loadModel('Photo');
    $a = $this->Photo->findById($matches[1]);
    
   /*
      1. przekazujesz $a do View
      2. w View robisz to FOREACH na przygotowanym szablonie
      3. pobierasz View jako zmienną , a nie wyświetlasz go !
    
   */
    return $zwrócony-kod-z-View;

}


Pyton_000
renderowanie widoku i zwracanie jako HTML do zmiennej:
  1. $view = new View($this, false);
  2. $view->set(compact('foo', 'bar')); // set variables
  3. $view->viewPath = 'elements'; // render an element
  4. $html = $view->render('message'); // get the rendered markup
activestate
NIe komam za bardzo.

Skoro mam zrobić to w widoku, to napisałem, że nie da rady, bo do modelu mam dostęp z kontrolera.
ctom
przecież @Pyton_000 napisał Ci jak przekazać dane z modelu/kontrolera do konkretnego widoku i pobrać go jako zmienną a nie wyświetlać.
Później ... $html to $zwrócony-kod-z-View
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.