Рассылка в smarty

KK
На сайте с 25.07.2006
Offline
138
862

Подскажите плиз как изменить порядок новостей, которые я отправляю через рассылку. Т.е. пользователям приходит письмо, в котором последняя(самая свежая) новость написана в самом низу письма, а нужно чтоб в самом верху. Сайт сделан на платформе smarty. Рассылка новостей происходит в 3 этапа. На 2 этапе выбираются новости. Я так думаю именно во 2 этапе и заключается проблема - т.к. список, в котором выбираются нужные для отправки новости, отсортирован сверху вниз - т.е. самая свежая новость в самом низу. Вот код этого второго этапа:

{{if !empty($error)}}

<p style="color: red">
{{$error}}
</p>
{{/if}}
<form method="POST">
<p>
{{#Which_block_use_for_news#}} <select name="d[news_block_num]">
{{html_options options=$blocks

selected=$smarty.post.d.news_block_num}}
</select>
</p>
<p>
{{#What_news_put_in_block#}} <select

name="d[news_ids][]" multiple>
{{html_options options=$news selected=$smarty.post.d.news_ids}}
</select>
</p>
<p><button type="submit">{{#Continue#}}</button></p>
</form>

Подскажите что нужно изменить и где копать..

topy
На сайте с 28.03.2006
Offline
142
#1

Вы уверены, что именно этот кусок кода надо править?

Новости коротко и ясно (https://subnews.ru)
KK
На сайте с 25.07.2006
Offline
138
#2

Нет, не уверен. Но я так думаю что если изменить сортировку списка во втором шаге, то и при отправке новости будут в нужном порядке. А это весь код, который был в step2.tpl

Знач копать нужно отсюда, но вот куда.. не силен я в смарте.

topy
На сайте с 28.03.2006
Offline
142
#3

я думаю что Смарти отправлять почту не умеет.

Надо выяснить - существует ли почтовый шаблон, если нет, то отправка осуществляется совсем в другом месте....

PS понапридумывали всяких смарти - люди теперь голову ломают... Нафига шаблонизатор шаблонизатору. (я про смарти и php)

KK
На сайте с 25.07.2006
Offline
138
#4

topy, да, действительно, дело не в этом куске. Вот здесь собака зарыта:

<?php
define("FROM_NEWSLETTER", "no-reply@site.com.ua");

function thanks() {
$t = new S;
$t->template_dir = realpath(dirname(__FILE__).'/../tpl');
$t->compile_id = "newsletter_thanks";
$t->display('sended.tpl');
}


function preview_letter(){
die($_POST['d']['body']);
}

function step3() {
$template = '';

$db = DB::instance();
if (isset($_POST['d'])) {
$data = $_POST['d'];
$q = "SELECT * FROM subscribers WHERE s_active = 1";

$emails = $db -> GetAll($q);

//$emails = array(0=>array('s_id'=>666, 's_email'=>'sddsg@gmail.com', 's_active'=>1));

foreach ($emails as $e) {
$body = str_replace('##UNSUBSCRIBE_ID##', md5($e['s_email'] . $e['s_id'] . AUTH_SALT), $data['body']);
$m = new CMail();
$m -> to($e['s_email']);
$m -> From(FROM_NEWSLETTER);
$m -> Subject($data['subject']);
$m -> body($body, 'html');
$m -> Send();
}
PATH::Location(PATH::BuildGet(array('action' => 'thanks')));
}


$ids = $_SESSION['_NEWSLETTER_NEWS'];
$ids[] = 0;
$news = $db -> GetAll("SELECT * FROM news WHERE n_id in (" . join(',', $ids) . ")");

$b = new S;
$b->template_dir = realpath(dirname(__FILE__).'/../tpl');
$b->compile_id = "newsletter_body";
$b -> assign(array(
'blocks' => $_SESSION['_NEWSLETTER_BLOCKS'],
'news' => $news,
'news_block_num' => $_SESSION['_NEWSLETTER_NEWS_BLOCK']
));
$body = $b->fetch('body.tpl');


$t = new S;
$t->template_dir = realpath(dirname(__FILE__).'/../tpl');
$t->compile_id = "newsletter_step3";
$t -> assign(array(
'body' => $body,
));
$t->display('step3.tpl');
}

function step2(){
$error = "";
if (isset($_POST['d'])){
$data = $_POST['d'];
$news_block_num = $data['news_block_num'];
if (empty($data['news_ids'])){
$error = T("You must choose news for news block");
}

if (empty($error)){
$_SESSION['_NEWSLETTER_NEWS'] = $data['news_ids'];
$_SESSION['_NEWSLETTER_NEWS_BLOCK'] = $news_block_num;
PATH::Location(PATH::BuildGet(array('action' => 'step3')));
}
}

$db = DB::instance();
$news = $db -> GetAssoc("SELECT n_id, CONCAT(n_view_date, ' - ', n_title) FROM news ORDER BY n_view_date DESC LIMIT 0,10");
$blocks = $_SESSION['_NEWSLETTER_BLOCKS'];
$t = new S;
$t->template_dir = realpath(dirname(__FILE__).'/../tpl');
$t->compile_id = "newsletter_step2";
$t -> assign(array(
'news' => $news,
'blocks' => $blocks,
'error' => $error,
));
$t->display('step2.tpl');
}

function step1(){
$error = "";
if (isset($_POST['d'])){
$data = $_POST['d'];
$blocks = (isset($data['titles']) ? $data['titles'] : array() );
foreach($blocks as $k => $v){
if (strlen(trim($v)) <= 0){
unset($blocks[$k]);
}
}



if (empty($blocks)){
$error = T("Please define at list one block");
} else {
$_SESSION['_NEWSLETTER_BLOCKS'] = $blocks;
}

if (empty($error)){
if ($data['use_news_block'] != 0){
PATH::Location(PATH::BuildGet(array('action' => 'step2')));
} else {
$_SESSION['_NEWSLETTER_NEWS'] = array();
$_SESSION['_NEWSLETTER_NEWS_BLOCK'] = -1;
PATH::Location(PATH::BuildGet(array('action' => 'step3')));
}
}
}

$t = new S;
$t->template_dir = realpath(dirname(__FILE__).'/../tpl');
$t->compile_id = "newsletter_step1";
$t -> assign(array(
'error' => $error,
));
$t->display('step1.tpl');
}

////////////////////////////////////////////////////////////////////////////////////////////////
$path[] = array('url' => 'index.php?section=newsletter', 'title' => T('Newsletter'));

switch (init($_GET['action']))
{
case 'thanks':
$path[] = array('url' => '', 'title' => T('Thanks'));
$content = catch_output("thanks");
break;
case 'preview_letter':
preview_letter();
break;
case 'step3':
$path[] = array('url' => PATH::BuildGet(array('section' => 'newsletter', 'action' => 'step3')), 'title' => T('Step 3'));
$content = catch_output("step3");
break;
case 'step2':
$path[] = array('url' => PATH::BuildGet(array('section' => 'newsletter', 'action' => 'step2')), 'title' => T('Step 2'));
$content = catch_output("step2");
break;
default:
$path[] = array('url' => PATH::BuildGet(array('section' => 'newsletter', 'action' => 'step1')), 'title' => T('Step 1'));
$content = catch_output("step1");
}

return array(
'content' => $content,
'path' => $path,
);

?>

На втором шаге изменить порядок новостей удалось. Третий шаг - предпросмотр получившегося письма - всеравно выдает новости в неправильном порядке. Step3 в самом начале файла находится. Тут наверно надо исправлять.

Shtogrin
На сайте с 02.11.2006
Offline
95
#5

Может просто сюда добавить ORDER BY нужное поле

$news = $db -> GetAll("SELECT * FROM news WHERE n_id in (" . join(',', $ids) . ")");

www.shtogrin.com (http://www.shtogrin.com/). Канцтовары (http://www.invit.com.ua/). 1С Бухгалтерия (http://account.kiev.ua/).
KK
На сайте с 25.07.2006
Offline
138
#6

Shtogrin, пробовал писать $news = $db -> GetAll("SELECT * FROM news WHERE n_id in (" . join(',', $ids) . ") ORDER BY DESC"); - матюкается. фатал эррор пишет..

хотя во втором шаге ведь DESC помог

$news = $db -> GetAssoc("SELECT n_id, CONCAT(n_view_date, ' - ', n_title) FROM news ORDER BY n_view_date DESC LIMIT 0,10");

добавил только DESC LIMIT 0,10 (лимит для того чтоб только последние 10 новостей в списке можно было выбрать. больше просто не нужно)

Shtogrin
На сайте с 02.11.2006
Offline
95
#7

поле надо указать

ORDER BY n_view_date DESC

KK
На сайте с 25.07.2006
Offline
138
#8
Shtogrin:
поле надо указать
ORDER BY n_view_date DESC

Огромнейшее спасибо! Получилось :)

KK
На сайте с 25.07.2006
Offline
138
#9

Еще одна проблема, которую никак не получается решить. В разделе "заказы" выводятся все заказы за всю историю интернет-магазина. Их можно только удалять либо сортировать по дате и т.п.

Как сделать так, чтоб выводились только последние 25 заказов? Вот код этого дела:

<?php


$content = '';
$path[] = array('url' => PATH::BuildGet(array('action' => 'view')), 'title' => T('Orders'));

switch (init($_GET['action'])) {
case 'detailed_order':
$path[] = array('url' => PATH::BuildGet(array('action' => 'detailed_order')), 'title' => T('Detailed order'));
$content = catch_output('detailed_order');
break;
case 'delete':
delete_order();
break;
case 'view':
case '':
$content = catch_output('view');
break;

}

return array(
'content' => $content,
'path' => $path,
);

///////////////////////////////////////////////////////////////////////////////

function delete_order(){
if(isset($_GET['o_id']) && !empty($_GET['o_id']) && is_numeric($_GET['o_id'])){
$o_id = $_GET['o_id'];
}else{
PATH::Location(PATH::PrevURI(1));
}

$db = DB::instance();

$db->Execute("DELETE FROM orders WHERE o_id = ".$o_id);

PATH::Location(PATH::PrevURI(1));
}


function detailed_order() {
$grid = new CGrid("grid");
$users_headers = array(
'oi_title' => T('Title'),
'oi_price' => T('Price') . " / USD",
'oi_quantity' => T('Quantity'),
'total' => T('Total') . " / USD",
);
$grid->SetHeaders($users_headers);

$o_id = intval($_GET['o_id']);
$order_info = ORDERS::getOrderById($o_id);
$data = ORDERS::getOrderItems($o_id);
$l = LANG::getCurrentLang();

$total_sum = 0;
if (!empty($data))
foreach($data as $k => $v) {
$total_sum += $v['oi_price'] * $v['oi_quantity'];
$data[$k]['total'] = sprintf("%.2f", $total_sum);
$data[$k]['oi_price'] = sprintf("%.2f", $v['oi_price']);
$data[$k]['oi_quantity'] = intval($v['oi_quantity']);
}
$grid->SetRows($data);
$grid->SetPrimaryKey('oi_id');

$t = new S;
$t->template_dir = realpath(dirname(__FILE__).'/../tpl');
$t -> register_function('build_std_url', 'build_pager_url');
$t -> compile_id = "order_details_admin";
$t -> assign(array(
'order' => $order_info,
'grid' => $grid -> Build(),
'total_sum' => $total_sum,
));
$t->display('details.tpl');
}

function view()
{
$grid = new CGrid("grid");
$grid->actions_template = 'file:' . realpath(dirname(__FILE__) . '/../tpl/actions.tpl');

$users_headers = array(
'o_id' => T('ID'),
'o_creation_date' => T('Date'),
'o_track_id' => T('Trackid'),
'o_buyer_id' => T('Buyer'),
'total_items' => T('Items'),
'total_sum' => T('Sum'),
);

$grid->SetHeaders($users_headers);
$grid->SetSortFields(array_keys($users_headers));

$addsql = "";
if (isset($_GET['buyer_id']) && !empty($_GET['buyer_id'])){
$addsql = " WHERE o_buyer_id = " . intval($_GET['buyer_id']);
}

$db = DB::instance();
$rs = $db->PageExecute("SELECT * FROM orders {$addsql} " . $grid->GetOrderByString(), PAGER_MAX_ON_PAGE, $grid->PagerCurrent());
$data = $rs->getAll();

if (!empty($data))
foreach($data as $k => $v) {
$data[$k]['o_buyer_id'] = $db -> getOne("SELECT u_login FROM users_auth_users WHERE u_id = {$v['o_buyer_id']}");

$items = $db -> GetAll("SELECT * FROM orders_items WHERE oi_order_id = {$v['o_id']}");
$count_items = 0;
$sum = 0;
foreach($items as $item){
$count_items += $item['oi_quantity'];
$sum += $item['oi_quantity'] * $item['oi_price'];
}
$data[$k]['total_items']= $count_items;
$data[$k]['total_sum'] = $sum;
}

$grid->SetRows($data);

$grid->SetCellOptionsToCol("_actions", array(
'detailed' => PATH::BuildGet(array("action" => "detailed_order", "o_id" => "[key]")),
"delete" => PATH::BuildGet(array("action" => "delete", "o_id" => "[key]")),
));

$grid->SetPrimaryKey('o_id');
$grid->SetPager($rs->MaxRecordCount(), PAGER_MAX_ON_PAGE);

$users = $db -> GetAssoc("SELECT u_id, CONCAT(u_full_name, ' ', u_last_name, ' ', u_patronymic_name ) as name FROM users_auth_users ORDER BY name");
$t = new S;
$t -> compile_id = "list_orders";
$t->template_dir = realpath(dirname(__FILE__).'/../tpl');
$t->assign(array(
'grid' => $grid->Build(),
'users' => $users,
));
$t->display('view.tpl');
}
?>

За сам список заказов я так понимаю отвечает вот эта часть:

function view()

{
$grid = new CGrid("grid");
$grid->actions_template = 'file:' . realpath(dirname(__FILE__) . '/../tpl/actions.tpl');

$users_headers = array(
'o_id' => T('ID'),
'o_creation_date' => T('Date'),
'o_track_id' => T('Trackid'),
'o_buyer_id' => T('Buyer'),
'total_items' => T('Items'),
'total_sum' => T('Sum'),
);

$grid->SetHeaders($users_headers);
$grid->SetSortFields(array_keys($users_headers));

$addsql = "";
if (isset($_GET['buyer_id']) && !empty($_GET['buyer_id'])){
$addsql = " WHERE o_buyer_id = " . intval($_GET['buyer_id']);
}

$db = DB::instance();
$rs = $db->PageExecute("SELECT * FROM orders {$addsql} " . $grid->GetOrderByString(), PAGER_MAX_ON_PAGE, $grid->PagerCurrent());
$data = $rs->getAll();

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий