dominick
16.01.2015, 09:44:58
Witam, chciałbym aby email wysyłał wszystkie opcje, które spełniają warunek. Teraz wysyła każdą opcję osobno.
oto kod:
public function action_expiring()
{
$announcements = ORM::factory('Announcement')
->with('user')
->where(Db::expr('DATEDIFF(announcement.annoucement_availability, NOW())'), '=', 7)
->find_all();
$i = 0;
foreach ($announcements as $a)
{
$email = Model_Email::email_by_alias('annoucements_expiring_registered');
$renew_url = Route
::url('site_announcements/profile/announcements/renew', array( 'id' => $a->annoucement_id,
), 'http');
'%renew_url%' => $renew_url,
'%renew_link%' => HTML::anchor(
$renew_url,
___('announcements.expiring.registered.renew_btn')
),
'%annoucement_link%' => HTML::anchor(announcements::url($a, 'http'), $a->annoucement_title),
));
$email->send($a->user->user_email);
}
$i++;
}
Nie mam pomysłu jak do tego podejść.
Pyton_000
16.01.2015, 12:39:36
Normalnie, w pętli zbierasz informacje, a poza pętlą wysyłasz mejla...
dominick
16.01.2015, 12:49:30
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
16.01.2015, 13:32:34
Coś takiego:
foreach ($announcements as $a) {
$renew_url = Route
::url('site_announcements/profile/announcements/renew', array('id' => $a->annoucement_id,), 'http');
'%renew_url%' => $renew_url,
'%renew_link%' => HTML::anchor($renew_url, ___('announcements.expiring.registered.renew_btn')), '%annoucement_link%' => HTML::anchor(announcements::url($a, 'http'), $a->annoucement_title),
);
}
$email = Model_Email::email_by_alias('annoucements_expiring_registered');
$email->set_tags($annoucments);
$email->send($a->user->user_email);
Tylko musisz tą tablicę w szablonie wyrenderować odpowiednio.
dominick
16.01.2015, 13:42:25
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
16.01.2015, 14:03:15
To ja już nie wiem co Ty chcesz
dominick
16.01.2015, 14:06:14
%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
Pyton_000
16.01.2015, 14:07:22
No to przecież dałem Ci rozwiązanie i powiedziałem co musisz jeszcze sam zrobić...
dominick
19.01.2015, 18:06:32
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
19.01.2015, 23:32:45
Jak to kurna nie masz możliwości... To Kochana nie obsługuje iteracji po tablicach w szablonie
dominick
22.01.2015, 22:31:16
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
23.01.2015, 08:22:32
Ja nie rozumiem o co Ci chodzi...
dominick
23.01.2015, 09:31:40
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
23.01.2015, 10:25:55
Tak, przypisz do tagu %announcement_link% "wszystkie tytuły oddzielone enterem czyli jeden pod drugim".
Pyton_000
23.01.2015, 10:31:54
W tym co Ci dałem
$annoucments['%annoucement_link%'] = implode('<br>',$annoucments['%annoucement_link%']);
dominick
23.01.2015, 10:50:42
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)
class Controller_Cron_Announcements extends Controller_Cron_Main {
public function action_expiring()
{
$announcements = ORM::factory('Announcement')
->with('user')
->where(Db::expr('DATEDIFF(announcement.annoucement_availability, NOW())'), '=', 7)
->find_all();
foreach ($announcements as $a)
{
$renew_url = Route
::url('site_announcements/profile/announcements/renew', array('id' => $a->annoucement_id,), 'http');
'%renew_url%' => $renew_url,
'%renew_link%' => HTML::anchor($renew_url, ___('announcements.expiring.registered.renew_btn')),
'%annoucement_link%' => HTML::anchor(announcements::url($a, 'http'), $a->annoucement_title),
);
$annoucments['%annoucement_link%'] = implode('<br>',$annoucments['%annoucement_link%']); $email = Model_Email::email_by_alias('annoucements_expiring_registered');
$email->set_tags($annoucments);
$email->send($a->user->user_email);
}
}
phpion
23.01.2015, 11:18:17
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
23.01.2015, 11:32:45
przerobiłbyś mi ten kontroler? nie mam zielonego pojęcia jak do tego podejść
phpion
23.01.2015, 11:36:22
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
23.01.2015, 11:45:51
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
23.01.2015, 12:10:04
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
23.01.2015, 12:40:23
O ile to jest system szablonów z jakąś bardziej rozbudowaną funkcjonalnością (warunki, pętle), a nie zwykłe str_replace.
dominick
23.01.2015, 15:07:09
to odpowiada za edytowanie treści email:
class Form_Admin_Email_Edit extends Bform_Form {
{
$this->form_data($params);
$this->add_input_text('email_subject');
$this->add_editor('email_content');
$this->add_input_submit(___('form.save'));
}
}
Dlatego chciałem to przypisać w tamtym kontrolerze bo w edytorze nie zadziała kod php
Pyton_000
23.01.2015, 15:27:17
Pokaż kurna szablon w końcu
dominick
24.01.2015, 21:51:44
szablon wygląda tak:
<h2>
<?php echo ___
('emails.edit.title') ?></h2>
<div class="box">
</div>
jeszcze jest taki główny szablon i nic więcej.
<h2>
<?php echo ___
('emails.title') ?></h2>
<div class="box">
<div class="table_filters clearfix">
<?php echo Form
::open(NULL, array('method' => 'GET', 'id' => 'show_emails_form', 'class' => 'pull-right bform form-horizontal')) ?> <div class="control-group">
<?php echo Form
::label('type', ___
('emails.filters.types').': ') ?> <div class="controls">
<?php echo Form
::select('type', Arr
::unshift($types, NULL, ''), Arr
::get($filters, 'type')); ?> </div>
</div>
<?php echo Form
::submit(NULL, ___
('form.show'), array('class' => 'btn')) ?> <?php echo Form
::close() ?> </div>
<hr/>
<table class="table tablesorter">
<thead>
<tr>
<th>
<?php echo ___
('email_alias') ?></th>
<th>
<?php echo ___
('email_description') ?></th>
<th>
<?php echo ___
('admin.table.actions') ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($emails as $e): ?>
<tr>
<td>
<?php echo $e->email_alias ?></td>
<td>
<?php echo $e->email_description ?></td>
<td>
<a href="
<?php echo url
::site('/admin/emails/edit/' . $e->email_id) ?>">
<?php echo ___
('admin.table.edit') ?></a>
</td>
</tr>
<?php endforeach ?>
</tbody>
</table>
</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
25.01.2015, 00:22:29
Szablon mejla + ew. kontroler który obsługuje tą wysyłkę.
dominick
25.01.2015, 15:24:27
kontroler podałem na samym początku a szablon to chyba to co jest wyżej bo więcej nic nie mam.
Pyton_000
25.01.2015, 22:22:33
Czyli to co podłeś wpisujesz w CKEditor ?
dominick
27.01.2015, 12:29:17
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
27.01.2015, 13:05:29
dawaj jeszcze Model_Email
dominick
29.01.2015, 09:48:58
public function send_email_message($subject, $message = NULL, $params = NULL)
{
if($subject instanceof Model_Email)
{
return $subject->send($this->get_email_address(), $params);
}
return email::send($this->get_email_address(), $subject, $message, $params);
}
Pyton_000
29.01.2015, 10:53:52
To jest cała klasa ?
dominick
29.01.2015, 13:57:08
nie tylko metoda odpowiedzialna za email. cała klasa jest większa ale dotyczy czego innego.
phpion
29.01.2015, 14:07:04
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
29.01.2015, 14:22:12
Tak masz racje tylko w innej metodzie to było
public function approve()
{
$this->annoucement_is_approved = 1;
$this->save();
$email = ORM::factory('Email')
->where('email_alias', '=', 'annoucement_approved')
->find();
$url = announcements::url($this, 'http');
'%link%' => ('<a href="' . $url . '">' . $url . '</a>'),
));
if ($this->user->user_id)
{
$email->send($this->user->user_email);
}
else
{
$email->send($this->annoucement_email);
}
}
Słuchaj przepraszam jeżeli komuś podniosłem ciśnienie.
class Controller_Cron_Announcements extends Controller_Cron_Main {
public function action_expiring()
{
$announcements = ORM::factory('Announcement')
->with('user')
->where(Db::expr('DATEDIFF(announcement.annoucement_availability, NOW())'), '=', 7)
->find_all();
$i = 0;
foreach ($announcements as $a)
{
if ($a->user_id)
{
$email = Model_Email::email_by_alias('annoucements_expiring_registered');
$renew_url = Route
::url('site_announcements/profile/announcements/renew', array( 'id' => $a->annoucement_id,
), 'http');
'%renew_url%' => $renew_url,
'%renew_link%' => HTML::anchor(
$renew_url,
$a->annoucement_title
),
'%annoucement_link%' => HTML::anchor(announcements::url($a, 'http'), $a->annoucement_title),
));
$email->send($a->user->user_email);
}
elseif ($a->annoucement_email)
{
$email = Model_Email::email_by_alias('annoucements_expiring_not_registered');
$renew_url = Route
::url('site_announcements/frontend/announcements/renew', array( 'id' => $a->annoucement_id,
'token' => $a->annoucement_hash,
), 'http');
'%renew_url%' => $renew_url,
'%renew_link%' => HTML::anchor(
$renew_url,
___('announcements.expiring.not_registered.renew_btn')
),
'%add_link%' => HTML::anchor(
Route::url('site_announcements/frontend/announcements/add', NULL, 'http'),
___('announcements.expiring.not_registered.add_btn')
),
'%annoucement_link%' => HTML::anchor(announcements::url($a, 'http'), $a->annoucement_title),
));
$email->send($a->annoucement_email);
}
$i++;
}
}
}
Pyton_000
29.01.2015, 15:13:02
@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
30.01.2015, 17:30:19
Ok nawrzucałeś mi to teraz może zaczniemy od początku wrzucę całą klasę.
class Model_Email extends ORM {
protected $_table_name = 'emails';
protected $_primary_key = 'email_id';
public function find_by_alias($alias)
{
return $this->where('email_alias', '=', $alias)->find();
}
{
foreach ($tags as $pattern => $replacement)
{
$this->email_subject = str_replace($pattern, $replacement, $this->email_subject); $this->email_content = str_replace($pattern, $replacement, $this->email_content); }
return $this;
}
public function send
($to, $params = array()) {
return email::send($to, $this->email_subject, $this->email_content, $params);
}
public static function email_by_alias
($alias) {
$self = new self();
$self->where('email_alias', '=', $alias)
->find();
if(!$self->loaded())
{
throw
new Kohana_Exception
('Cannot find e-mail alias :alias', array(':alias' => $alias)); }
return $self;
}
}
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
30.01.2015, 18:19:21
Pokaż treść mejla którą wpisujesz
dominick
2.02.2015, 15:31:13
Witaj,
twoje ogłoszenia wymagają odświeżenia:
%renew_link%
Aby to zrobić kliknij na link poniżej, który przeniesie Cie do Twoich ogłoszeń.
%renew_url%
To wszystko co wpisuje w email
proszę o pomoc
Nikt nie wiem co z tym zrobić?
untorched
2.02.2015, 15:55:36
{
foreach ($tags as $pattern => $replacement)
{
$this->email_subject = str_replace($pattern, $replacement, $this->email_subject); $this->email_content = str_replace($pattern, $replacement, $this->email_content); }
return $this;
}
I teraz pseudokod:
$ogloszenia = pobierz_te_ktore_wymagaja_odswierzenia();
foreach($ogloszenia as $ogloszenie) {
$links[] = HTML::anchor($ogloszenie['link], $ogloszenie['nazwa']);
}
$mail = new Model_Mail('ktos@cos.com', 'jakis-szablon', 'etc');
$mail->setTags('%renew_link%', $links);
$mail->send();
Chodzi o sam sens, po skopiowaniu nie zadziała
dominick
3.02.2015, 11:28:15
Dziękuje biore się za to bo już mi czaszka zadymiła ; )
Skleiłem coś takiego:
class Controller_Cron_Announcements extends Controller_Cron_Main {
public function action_expiring()
{
$announcements = ORM::factory('Announcement')
->with('user')
->where(Db::expr('DATEDIFF(announcement.annoucement_availability, NOW())'), '=', 7)
->find_all();
foreach ($announcements as $a)
{
$renew_url = Route
::url('site_announcements/profile/announcements/renew', array('id' => $a->annoucement_id,), 'http'); $links[] = HTML::anchor($renew_url, ___('announcements.expiring.registered.renew_btn')),$a->annoucement_title);
}
$email = Model_Email::email_by_alias('annoucements_expiring_registered');
$email->set_tags('%renew_link%',$links);
$email->send($a->user->user_email);
}
}
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
3.02.2015, 11:37:48
A jaki masz problem żeby odpalić polecenie ręcznie to które masz zapisane w cronie ?
I nie działa bo??
dominick
4.02.2015, 09:43:54
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
4.02.2015, 09:54:37
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 )
$email->send($a->user->user_email);
Jest poza foreach więc nie ma zmiennej $a więc nie ma gdzie wysłać...
dominick
4.02.2015, 10:04:54
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
4.02.2015, 10:06:52
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
4.02.2015, 10:55:19
czyli zapisać do tabilcy? Tylko nie wiem jak z wysyłaniem tego email'u gdy wszystkie będą w tablicy
dobrze kombinuje?
Pyton_000
4.02.2015, 11:12:15
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
4.02.2015, 11:19:07
To mnie teraz zaskoczyłeś... Nie wiem jak się zabrać i co znaczy pogrupować
Pyton_000
4.02.2015, 11:21:53
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.