Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [KOHANA]zebranie wszystkich rekordów w tablicy i odpowiednie wyświetlenie.
Forum PHP.pl > Forum > PHP > Frameworki
Stron: 1, 2
dominick
Witam, chciałbym aby email wysyłał wszystkie opcje, które spełniają warunek. Teraz wysyła każdą opcję osobno.
oto kod:
  1. public function action_expiring()
  2. {
  3.  
  4.  
  5. $announcements = ORM::factory('Announcement')
  6. ->with('user')
  7. ->where(Db::expr('DATEDIFF(announcement.annoucement_availability, NOW())'), '=', 7)
  8. ->find_all();
  9.  
  10. $i = 0;
  11.  
  12. foreach ($announcements as $a)
  13. {
  14.  
  15. $email = Model_Email::email_by_alias('annoucements_expiring_registered');
  16.  
  17. $renew_url = Route::url('site_announcements/profile/announcements/renew', array(
  18. 'id' => $a->annoucement_id,
  19. ), 'http');
  20.  
  21. $email->set_tags(array(
  22. '%renew_url%' => $renew_url,
  23. '%renew_link%' => HTML::anchor(
  24. $renew_url,
  25. ___('announcements.expiring.registered.renew_btn')
  26. ),
  27. '%annoucement_link%' => HTML::anchor(announcements::url($a, 'http'), $a->annoucement_title),
  28. ));
  29. $email->send($a->user->user_email);
  30. }
  31. $i++;
  32.  
  33. }

Nie mam pomysłu jak do tego podejść.
Pyton_000
Normalnie, w pętli zbierasz informacje, a poza pętlą wysyłasz mejla...
dominick
hmm.. tylko muszę jakoś zebrać te informacje i zapisać je w tablicy i tutaj nie wiem jak to ugryźć.
wystarczy wysyłanie wystawić poza pętle?? czy to byłoby aż takie proste?
Pyton_000
Coś takiego:
  1. $annoucments = =array();
  2. foreach ($announcements as $a) {
  3. $renew_url = Route::url('site_announcements/profile/announcements/renew', array('id' => $a->annoucement_id,), 'http');
  4.  
  5. $annoucments[] = array(
  6. '%renew_url%' => $renew_url,
  7. '%renew_link%' => HTML::anchor($renew_url, ___('announcements.expiring.registered.renew_btn')), '%annoucement_link%' => HTML::anchor(announcements::url($a, 'http'), $a->annoucement_title),
  8. );
  9. }
  10.  
  11.  
  12. $email = Model_Email::email_by_alias('annoucements_expiring_registered');
  13. $email->set_tags($annoucments);
  14. $email->send($a->user->user_email);


Tylko musisz tą tablicę w szablonie wyrenderować odpowiednio.
dominick
Chciałbym pominąć odświeżanie każdej pozycji oddzielnie a przenieść na podstronę wszystkich pozycji. Bardziej mi zależy aby wyświetlić %announcement_link% każdej pozycji czyli odnośnik do każdej pozycji, która spełnia wymagania. Nie wiem czy spójnie logicznie to napisałem.
Pyton_000
To ja już nie wiem co Ty chcesz smile.gif
dominick
%announcement_link% to link do ogłoszenia, które należy odświeżyć
wpadłem na pomysł aby zebrać to w 1 email a nie spamować
chciałbym aby w 1 emailu przychodziła lista wszystkich %announcement_link% a nie tak jak teraz każdy email osobno.
Teraz chyba jaśniej napisałem albo mi się tylko tak wydaje wink.gif
Pyton_000
No to przecież dałem Ci rozwiązanie i powiedziałem co musisz jeszcze sam zrobić... blink.gif
dominick
możesz mi przybliżyć jak odpowiednio wyświetlić tą tablice? Męczę się i nic

podbijam proszę o pomoc. w szablonie nie mam możliwości aby wyświetlić tablice muszę zrobić to w tagu %announcement_link%
Pyton_000
Jak to kurna nie masz możliwości... To Kochana nie obsługuje iteracji po tablicach w szablonie questionmark.gif
dominick
zależy mi na tym aby pozostawić funkcjonalność dla ewentualnych moderatorów. Chciałbym aby edycja była prosta poprzed dodanie tagu.

Proszę bardzo o pomoc bo już mi mózg siada.
Pyton_000
Ja nie rozumiem o co Ci chodzi...
dominick
Czy da się do tagu %announcement_link% przypisać tablice ze wszystkimi tytułami ogłoszeń. Tak aby po wpisaniu tego tagu pojawiły się wszystkie tytuły oddzielone enterem czyli jeden pod drugim ?
phpion
Tak, przypisz do tagu %announcement_link% "wszystkie tytuły oddzielone enterem czyli jeden pod drugim".
Pyton_000
W tym co Ci dałem

  1. $annoucments['%annoucement_link%'] = implode('<br>',$annoucments['%annoucement_link%']);
dominick
Wrzucam cały kontroler przetwarzany przez crona czy tak to powinno wyglądać? (nie mam możliwości sprawdzenia bo cron działa raz dziennie o 00:00)
  1. class Controller_Cron_Announcements extends Controller_Cron_Main {
  2.  
  3. public function action_expiring()
  4. {
  5.  
  6.  
  7. $announcements = ORM::factory('Announcement')
  8. ->with('user')
  9. ->where(Db::expr('DATEDIFF(announcement.annoucement_availability, NOW())'), '=', 7)
  10. ->find_all();
  11.  
  12.  
  13.  
  14. foreach ($announcements as $a)
  15. {
  16.  
  17. $renew_url = Route::url('site_announcements/profile/announcements/renew', array('id' => $a->annoucement_id,), 'http');
  18.  
  19. $annoucments[] = array(
  20. '%renew_url%' => $renew_url,
  21. '%renew_link%' => HTML::anchor($renew_url, ___('announcements.expiring.registered.renew_btn')),
  22. '%annoucement_link%' => HTML::anchor(announcements::url($a, 'http'), $a->annoucement_title),
  23.  
  24. );
  25. $annoucments['%annoucement_link%'] = implode('<br>',$annoucments['%annoucement_link%']);
  26. $email = Model_Email::email_by_alias('annoucements_expiring_registered');
  27. $email->set_tags($annoucments);
  28. $email->send($a->user->user_email);
  29. }
  30. }
phpion
Na pewno nie tak. Maila wysyłasz przy każdym przebiegu pętli więc nie będziesz miał wszystkie linków w tablicy. Poza tym fragment z implode (podany przez ~Pyton_000) nie zadziała ($annoucments jest przecież tablicą tablic). Co do niemożności testowania - przecież możesz sobie ręcznie sam wywołać tą akcję kontrolera w taki sam sposób, w jaki robi to cron. Nie musisz czekać do jego automatycznego uruchomienia.
dominick
przerobiłbyś mi ten kontroler? nie mam zielonego pojęcia jak do tego podejść
phpion
Sam kontroler to jedno, ale widok to drugie. Do widoku powinieneś przekazać całą tablicę $announcements i wyświetlić jej zawartość w pętli (np. foreach). Jak to zrobić w Twoim przypadku? Nie wiem, wygląda na to, że masz jakiś własny system szablonów, albo po prostu robiony jest str_replace na %placeholderach%.
dominick
edytowanie email'u mam poprzez zaplecze edytorem cke_editor gdzie używa się tagów ale nie składni php. Masz może jakiś pomysł jak to zrobić?
Pyton_000
Przecież ten szablon jest później parsowany przez system szablonów, więc jaki problem napisać jakiegoś foreach po tablicy dookoła tego co już masz?
Przecież to dodanie 2 linijek do szablonu.
phpion
O ile to jest system szablonów z jakąś bardziej rozbudowaną funkcjonalnością (warunki, pętle), a nie zwykłe str_replace.
dominick
to odpowiada za edytowanie treści email:
  1. class Form_Admin_Email_Edit extends Bform_Form {
  2.  
  3. public function create(array $params = array())
  4. {
  5. $this->form_data($params);
  6.  
  7. $this->add_input_text('email_subject');
  8.  
  9. $this->add_editor('email_content');
  10.  
  11. $this->add_input_submit(___('form.save'));
  12. }
  13. }


Dlatego chciałem to przypisać w tamtym kontrolerze bo w edytorze nie zadziała kod php
Pyton_000
Pokaż kurna szablon w końcu
dominick
szablon wygląda tak:
  1. <h2><?php echo ___('emails.edit.title') ?></h2>
  2.  
  3. <div class="box">
  4. <?php echo $form ?>
  5. </div>


jeszcze jest taki główny szablon i nic więcej.
  1. <h2><?php echo ___('emails.title') ?></h2>
  2.  
  3. <div class="box">
  4.  
  5. <div class="table_filters clearfix">
  6. <?php echo Form::open(NULL, array('method' => 'GET', 'id' => 'show_emails_form', 'class' => 'pull-right bform form-horizontal')) ?>
  7. <div class="control-group">
  8. <?php echo Form::label('type', ___('emails.filters.types').': ') ?>
  9. <div class="controls">
  10. <?php echo Form::select('type', Arr::unshift($types, NULL, ''), Arr::get($filters, 'type')); ?>
  11. </div>
  12. </div>
  13. <?php echo Form::submit(NULL, ___('form.show'), array('class' => 'btn')) ?>
  14. <?php echo Form::close() ?>
  15. </div>
  16.  
  17. <hr/>
  18.  
  19. <table class="table tablesorter">
  20. <thead>
  21. <tr>
  22. <th><?php echo ___('email_alias') ?></th>
  23. <th><?php echo ___('email_description') ?></th>
  24. <th><?php echo ___('admin.table.actions') ?></th>
  25. </tr>
  26. </thead>
  27. <tbody>
  28. <?php foreach ($emails as $e): ?>
  29. <tr>
  30. <td><?php echo $e->email_alias ?></td>
  31. <td><?php echo $e->email_description ?></td>
  32. <td>
  33. <a href="<?php echo url::site('/admin/emails/edit/' . $e->email_id) ?>"><?php echo ___('admin.table.edit') ?></a>
  34. </td>
  35. </tr>
  36. <?php endforeach ?>
  37. </tbody>
  38. </table>
  39. </div>

Nie wiem jak to działa ale w emailu wysyła się tylko to co wpiszę w cke_editor

proszę o pomoc jak to ugryźć.
Pyton_000
Szablon mejla + ew. kontroler który obsługuje tą wysyłkę.
dominick
kontroler podałem na samym początku a szablon to chyba to co jest wyżej bo więcej nic nie mam.
Pyton_000
Czyli to co podłeś wpisujesz w CKEditor ?
dominick
w ck_editor wpisuję tylko treść meila i email tag czyli np %renew_url% lub %announcement_link%
masz może jakiś pomysł jak to zrobić?

Proszę o pomoc zanim zniknę w milionie tematów.
Pyton_000
dawaj jeszcze Model_Email
dominick
  1. public function send_email_message($subject, $message = NULL, $params = NULL)
  2. {
  3. if($subject instanceof Model_Email)
  4. {
  5. return $subject->send($this->get_email_address(), $params);
  6.  
  7. }
  8.  
  9. return email::send($this->get_email_address(), $subject, $message, $params);
  10. }
Pyton_000
To jest cała klasa ?
dominick
nie tylko metoda odpowiedzialna za email. cała klasa jest większa ale dotyczy czego innego.
phpion
I pewnie w tej klasie masz też podstawianie parametrów do %placeholderów%. Ale skoro uważasz, że to co podajesz jest wystarczające to może lepiej od razu zamknąć wątek, bo w końcu ktoś nie wytrzyma i wybuchnie, a Ty i tak pomocy nie uzyskasz.
dominick
Tak masz racje tylko w innej metodzie to było
  1. public function approve()
  2. {
  3. $this->annoucement_is_approved = 1;
  4. $this->save();
  5.  
  6. $email = ORM::factory('Email')
  7. ->where('email_alias', '=', 'annoucement_approved')
  8. ->find();
  9.  
  10. $url = announcements::url($this, 'http');
  11.  
  12. $email->set_tags(array(
  13. '%link%' => ('<a href="' . $url . '">' . $url . '</a>'),
  14. ));
  15.  
  16. if ($this->user->user_id)
  17. {
  18. $email->send($this->user->user_email);
  19. }
  20. else
  21. {
  22. $email->send($this->annoucement_email);
  23. }
  24. }

Słuchaj przepraszam jeżeli komuś podniosłem ciśnienie.

  1. class Controller_Cron_Announcements extends Controller_Cron_Main {
  2.  
  3. public function action_expiring()
  4. {
  5.  
  6.  
  7. $announcements = ORM::factory('Announcement')
  8. ->with('user')
  9. ->where(Db::expr('DATEDIFF(announcement.annoucement_availability, NOW())'), '=', 7)
  10. ->find_all();
  11.  
  12. $i = 0;
  13.  
  14. foreach ($announcements as $a)
  15. {
  16. if ($a->user_id)
  17. {
  18. $email = Model_Email::email_by_alias('annoucements_expiring_registered');
  19.  
  20. $renew_url = Route::url('site_announcements/profile/announcements/renew', array(
  21. 'id' => $a->annoucement_id,
  22. ), 'http');
  23.  
  24. $email->set_tags(array(
  25. '%renew_url%' => $renew_url,
  26. '%renew_link%' => HTML::anchor(
  27. $renew_url,
  28. $a->annoucement_title
  29. ),
  30. '%annoucement_link%' => HTML::anchor(announcements::url($a, 'http'), $a->annoucement_title),
  31. ));
  32. $email->send($a->user->user_email);
  33. }
  34. elseif ($a->annoucement_email)
  35. {
  36. $email = Model_Email::email_by_alias('annoucements_expiring_not_registered');
  37.  
  38. $renew_url = Route::url('site_announcements/frontend/announcements/renew', array(
  39. 'id' => $a->annoucement_id,
  40. 'token' => $a->annoucement_hash,
  41. ), 'http');
  42.  
  43. $email->set_tags(array(
  44. '%renew_url%' => $renew_url,
  45. '%renew_link%' => HTML::anchor(
  46. $renew_url,
  47. ___('announcements.expiring.not_registered.renew_btn')
  48. ),
  49. '%add_link%' => HTML::anchor(
  50. Route::url('site_announcements/frontend/announcements/add', NULL, 'http'),
  51. ___('announcements.expiring.not_registered.add_btn')
  52. ),
  53. '%annoucement_link%' => HTML::anchor(announcements::url($a, 'http'), $a->annoucement_title),
  54. ));
  55. $email->send($a->annoucement_email);
  56. }
  57. $i++;
  58. }
  59. }
  60.  
  61. }
  62.  
Pyton_000
@dominick wybacz że to powiem, ale idź do domu i nie wracaj.

Ja Cię prosiłem o kod Klasy, a Ty swoje. Nie chcesz pomocy to trzeba było powiedzieć że masz w 4 literach to co ktoś do Ciebie mówi. Ja Ci nie pomogę, straciłem cierpliwość, nie ma co się wysilać jeśli i tak tego nie rozumiesz. Ulżyło mi...
dominick
Ok nawrzucałeś mi to teraz może zaczniemy od początku wrzucę całą klasę.
  1. class Model_Email extends ORM {
  2.  
  3. protected $_table_name = 'emails';
  4. protected $_primary_key = 'email_id';
  5.  
  6. public function find_by_alias($alias)
  7. {
  8. return $this->where('email_alias', '=', $alias)->find();
  9. }
  10.  
  11. public function set_tags(array $tags = array())
  12. {
  13. foreach ($tags as $pattern => $replacement)
  14. {
  15. $this->email_subject = str_replace($pattern, $replacement, $this->email_subject);
  16. $this->email_content = str_replace($pattern, $replacement, $this->email_content);
  17. }
  18. return $this;
  19. }
  20.  
  21. public function send($to, $params = array())
  22. {
  23. return email::send($to, $this->email_subject, $this->email_content, $params);
  24. }
  25.  
  26. public static function email_by_alias($alias)
  27. {
  28. $self = new self();
  29. $self->where('email_alias', '=', $alias)
  30. ->find();
  31.  
  32. if(!$self->loaded())
  33. {
  34. throw new Kohana_Exception('Cannot find e-mail alias :alias', array(':alias' => $alias));
  35. }
  36.  
  37. return $self;
  38. }
  39. }


niestety zwykłe str_replece.
Słuchajcie przepraszam, że tak ciężko było mi dotrzeć do tego. Problem z czytaniem ze zrozumieniem ale pracuje nad tym.

Proszę o pomoc nadal
Pyton_000
Pokaż treść mejla którą wpisujesz
dominick
  1. Witaj,
  2. twoje ogłoszenia wymagają odświeżenia:
  3. %renew_link%
  4.  
  5.  
  6. Aby to zrobić kliknij na link poniżej, który przeniesie Cie do Twoich ogłoszeń.
  7. %renew_url%


To wszystko co wpisuje w email


proszę o pomoc

Nikt nie wiem co z tym zrobić?
untorched
  1. public function set_tags(array $tags = array())
  2. {
  3. foreach ($tags as $pattern => $replacement)
  4. {
  5. if(is_array($replacement)) $replacement = implode(', ', $replacement);
  6.  
  7. $this->email_subject = str_replace($pattern, $replacement, $this->email_subject);
  8. $this->email_content = str_replace($pattern, $replacement, $this->email_content);
  9. }
  10. return $this;
  11. }


I teraz pseudokod:
  1. $ogloszenia = pobierz_te_ktore_wymagaja_odswierzenia();
  2.  
  3. $links = array();
  4.  
  5. foreach($ogloszenia as $ogloszenie) {
  6. $links[] = HTML::anchor($ogloszenie['link], $ogloszenie['nazwa']);
  7. }
  8.  
  9. $mail = new Model_Mail('ktos@cos.com', 'jakis-szablon', 'etc');
  10. $mail->setTags('%renew_link%', $links);
  11. $mail->send();


Chodzi o sam sens, po skopiowaniu nie zadziała smile.gif
dominick
Dziękuje biore się za to bo już mi czaszka zadymiła ; )

Skleiłem coś takiego:
  1. class Controller_Cron_Announcements extends Controller_Cron_Main {
  2.  
  3. public function action_expiring()
  4. {
  5.  
  6.  
  7. $announcements = ORM::factory('Announcement')
  8. ->with('user')
  9. ->where(Db::expr('DATEDIFF(announcement.annoucement_availability, NOW())'), '=', 7)
  10. ->find_all();
  11.  
  12. $links = array();
  13. foreach ($announcements as $a)
  14. {
  15. $renew_url = Route::url('site_announcements/profile/announcements/renew', array('id' => $a->annoucement_id,), 'http');
  16. $links[] = HTML::anchor($renew_url, ___('announcements.expiring.registered.renew_btn')),$a->annoucement_title);
  17. }
  18.  
  19.  
  20. $email = Model_Email::email_by_alias('annoucements_expiring_registered');
  21. $email->set_tags('%renew_link%',$links);
  22. $email->send($a->user->user_email);
  23. }
  24. }
  25.  
  26.  

Czy jest ok? niestety serwer na którym mam stronę odpala cron raz dziennie o 00:00

Udało mi się skontaktować z serwerownią i uruchomić cron co 5 minut jednak skrypt nie działa

proszę o pomoc
Pyton_000
A jaki masz problem żeby odpalić polecenie ręcznie to które masz zapisane w cronie ?

I nie działa bo??
dominick
Już cron zrobiłem jednak nie wysyła meila wogóle.

Jak mam dojść do rozwiązania problemu?


Nikt już nic nie wymyśli?

wchodze tu codziennie i czekam na odpowiedź bo sam wiem, że nie dam rady gdyz męczyłem się z miesiąc. Niestety chyba na marne.
Pyton_000
Wiesz że jesteś upierdliwy?

Co do problemu:
Cytat
$links[] = HTML::anchor($renew_url, ___('announcements.expiring.registered.renew_btn')),$a->annoucement_title);

Za dużo o 1 )
  1. $email->send($a->user->user_email);

Jest poza foreach więc nie ma zmiennej $a więc nie ma gdzie wysłać...
dominick
Nie wiem czy dobrze myślę:
mam przypisać w pętli foreach do zmiennej np. $email_user = $a->user->user_email
a potem poza pętlą użyć zmiennej $email_user?
Pyton_000
Powiedzmy że tak.
Tylko że wtedy jeżeli wygasające ogłoszenia są różnych użytkowników to wszystkie pójdą do tego który miał ostatnie na liście.

dominick
czyli zapisać do tabilcy? Tylko nie wiem jak z wysyłaniem tego email'u gdy wszystkie będą w tablicy


dobrze kombinuje?
Pyton_000
Musisz:
- Pobrać wszystkie ogłoszenia (to już masz)
- Pogrupować ogłoszenia wg. adresu email
- dla każdej grupy email wygenerować zbiorowy link
- Wysłać ten link dla adresu grupy.
dominick
To mnie teraz zaskoczyłeś... Nie wiem jak się zabrać i co znaczy pogrupować
Pyton_000
A znasz Ty się w ogóle na PHP czy tylko udajesz że coś umiesz?
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.