Вы не зашли.
Главная »
PHP » Smarty на примере модификации форума PunBB
#1.
tipsun
Off
(19)
Moderator
2012.02.17 10:10
Код:
span style="color: #0000BB"><?php$posts = $pids = array();while ($cur_post = $db->fetch_assoc($result)) { $posts[] = $cur_post; $pids[] = $cur_post['id'];}$db->free_result($result);//Trololo//Я бы все заменил на $smarty->assign('posts', $db->fetchAll());//Но там везде $posts и $pids используются$smarty->assign('posts', $posts); |
Отредактировано tipsun (2012.02.17 12:12)
#2.
tipsun
Off
(19)
Moderator
2012.02.17 11:11
Что делать, если ключ массива задан с пробелом?
Код:
{if $quickpost} |
<div> |
<strong>{$lang_topic['Quick post']}</strong> |
</div> |
Добавлено спустя 9 минут 7 секунд: Что-то типа такого можно?
Код:
<input type="hidden" name="form_user" value="{$pun_user.username ? $pun_user.username : 'Guest'}" /> |
Или так надо?
Код:
<input type="hidden" name="form_user" value="{if $pun_user.username} {$pun_user.username} {else} Guest {/if}" /> |
Отредактировано tipsun (2012.02.17 11:11)
#3.
tipsun
Off
(19)
Moderator
2012.02.17 12:12
В файле viewtopic я почти всю разметку занес в шаблон. То, что в гигантском цикле foreach осталось. Все остальное не трогаю.
Отредактировано tipsun (2012.02.17 12:12)
я не помню уже. на счет тернарного оператора.
#5.
tipsun
Off
(19)
Moderator
2012.02.17 12:12
Карма
Не лучше ли сразу?
Код:
span style="color: #0000BB"><?php$posts = $pids = array();while ($cur_post = $db->fetch_assoc($result)) { $cur_post['karma'] = $db->fetch_row($db->query('SELECT SUM(`vote`), (SELECT 1 FROM `'.$db->prefix.'karma` WHERE `id`='.$pun_user['id'].' AND `to`='.$cur_post['poster_id'].' LIMIT 1) FROM `'.$db->prefix.'karma` WHERE `to` = '.$cur_post['poster_id'], false));; $posts[] = $cur_post;} $db->free_result($result);//tpl: posts[i].karma[0]//tpl: posts[i].karma[1] |
Отредактировано tipsun (2012.02.17 12:12)
#6.
tipsun
Off
(19)
Moderator
2012.02.17 16:04
У меня руки кривые?
Или это проделки самописного MySQLi?
Там посмотрел, видимо сбивает предыдущий запрос.
Код:
span style="color: #0000BB"><?php$posts = $pids = array();while ($cur_post = $db->fetch_assoc($result)) { $karma = $db->query('SELECT SUM(`vote`), (SELECT 1 FROM `'.$db->prefix.'karma` WHERE `id`='.$pun_user['id'].' AND `to`='.$cur_post['poster_id'].' LIMIT 1) FROM `'.$db->prefix.'karma` WHERE `to` = '.$cur_post['poster_id'], false) $cur_post['karma'] = $db->fetch_row($karma); $posts[] = $cur_post; $pids[] = $cur_post['id'];}$db->free_result($result); |
Отредактировано tipsun (2012.02.18 06:06)
#7.
tipsun
Off
(19)
Moderator
2012.02.17 17:05
Просто я думал в один массив все слить, потом его в смарти загнать и уже в шаблоне через фореач все допилить.
#8.
tipsun
Off
(19)
Moderator
2012.02.17 18:06
Вот за сегодня чего получилось.
Не добил пока еще

Там еще запутанно с выводом для Пользователя и Гостя
Код:
span style="color: #0000BB"><?php<!-- viewtopic template --><div class="con"><a href="index.php">{$lang_common.Index}</a> / <a href="viewforum.php?id={$cur_topic.forum_id}">{$cur_topic.forum_name}</a> / {$cur_topic.subject}</div><!-- +FOREACH -->{foreach from=$posts item=$cur_post}<!-- <a href="profile.php?id={$cur_post.poster_id}">{$cur_post.username}</a> --><table class="msg2"> <tr> <td> <div id="p{$cur_post.id}"> <a href="viewtopic.php?pid={$cur_post.id}#p{$cur_post.id}">#{$start_from + $post_count}</a><br/> {format_time($cur_post['posted'])}<br/> <strong>{$username}</strong> {if $pun_config.o_show_post_karma == 1 || $pun_user.g_id < {PUN_GUEST}} {if $pun_user.is_guest || $karma[1]} {$karma[0]} {else} (<a href="karma.php?to={$cur_post.poster_id}&vote=-1&pid={$cur_post.id}">-</a> {$cur_post.karma[0]} <a href="karma.php?to={$cur_post.poster_id}&vote=1&pid={$cur_post.id}">+</a>) {/if} {/if} {if $cur_post.poster_id > 1 && $cur_post.is_online == $cur_post.poster_id} <br/> <span class="green">{$lang_topic.Online}</span> {/if} </div> </td> <!-- user avatar --> {if $cur_post.poster_id > 1 && $pun_config.o_avatars == 1 && $cur_post.use_avatar == 1 && $pun_user.show_avatars} <td> <img src="../{$pun_config.o_avatars_dir}/{$cur_post.poster_id}.gif" alt="*" /> </td> {else} {/if} </tr></table>{/foreach}<!-- -FOREACH --><p class="con">{$paging_links}</p>{if $pun_user.g_post_replies}<div class="blocktable"> <strong><a class="in" href="post.php?tid={$id}">{$lang_topic.`Post reply`}</a></strong></div>{/if}{if $quickpost}<div> <strong>{$lang_topic.`Quick post`}</strong></div><div class="input"> <form method="post" action="post.php?tid={$id}"> <div> <fieldset> <legend>{$lang_common.`Write message legend`}</legend> {if $pun_config.o_antiflood} <input type="hidden" name="form_t" value="{$smarty.server.REQUEST_TIME}" /> <input type="hidden" name="form_sent" value="1" /> <input type="hidden" name="form_user" value="{if $pun_user.username}{$pun_user.username}{else}Guest{/if}" /> {/if} <!-- Ввод имени для гостей --> {if $pun_user.is_guest} {$lang_common.Username}<br/> <input type="text" name="req_username" tabindex="1" /><br/> {/if} <textarea name="req_message" rows="4" cols="24" tabindex="1"></textarea><br/> {if $is_admmod} <input type="checkbox" name="merge" value="1" checked="checked" /> {$lang_post.`Merge posts`} {/if} </fieldset><br/><input type="submit" name="submit" tabindex="2" value="{$lang_common.Submit}" accesskey="s" /> </div> </form></div>{/if} |
Отредактировано tipsun (2012.02.17 18:06)
tipsun, я не понял на счет кармы. Покажи как сейчас и что тебе не нравится. Я на память весь код не помню.
Вообще не переживай если код в шаблонах громоздкий получается. Само то, что верстка будет вынесена уже само по себе очень большой плюс.
По поводу разных шаблонов для пользователя и гостя - есть смысл. Но еще же есть модераторы и админы. Там тоже немного отличается внешний вид.
Неправильно я там сделал.
Забыл про условие {if $cur_post.poster_id > 1} надо во все остальные условия подставлять, где эти условия в само условие входили

- - - -
Сейчас карму покажу
Код:
span style="color: #0000BB"><?php<!-- template -->{foreach from=$posts item=$cur_post}<table class="msg2"> <tr> <td> <div id="p{$cur_post.id}"> <a href="viewtopic.php?pid={$cur_post.id}#p{$cur_post.id}">#{$start_from + $post_count}</a><br/> {$cur_post.posted|date:%d/%m/%y %h:%i:%s}<br/> <!-- User or Guest --> <strong>{if $cur_post.poster_id > 1}<a href="profile.php?id={$cur_post.poster_id}">{$cur_post.username}</a>{else}{$cur_post.username}{/if}</strong> {if $cur_post['poster_id'] > 1 && $pun_config.o_show_post_karma == 1 || $pun_user.g_id < {PUN_GUEST}} {if $pun_user.is_guest || $karma[1]} {$cur_post.karma[0]} {else} (<a href="karma.php?to={$cur_post.poster_id}&vote=-1&pid={$cur_post.id}">-</a> {$cur_post.karma[0]} <a href="karma.php?to={$cur_post.poster_id}&vote=1&pid={$cur_post.id}">+</a>) {/if} {/if} |
* * * *
Чтоб её узнать, надо запрос из шаблона делать или в логике пройтись по готовому массиву с сообщениями и определить карму.
Код:
span style="color: #0000BB"><?phpforeach ($posts as $cur_post) { $post_count++; $signature = $is_online = $user_avatar = ''; $post_actions = $user_contacts = $user_info = array(); // If the poster is a registered user. $karma = ''; if ($cur_post['poster_id'] > 1) { if ($pun_config['o_show_post_karma'] == 1 || $pun_user['g_id'] < PUN_GUEST) { $karma = $db->fetch_row($db->query('SELECT SUM(`vote`), (SELECT 1 FROM `'.$db->prefix.'karma` WHERE `id`='.$pun_user['id'].' AND `to`='.$cur_post['poster_id'].' LIMIT 1) FROM `'.$db->prefix.'karma` WHERE `to` = '.$cur_post['poster_id'], false)); $karma[0] = intval($karma[0]); if ($pun_user['is_guest'] || $karma[1]) { $karma = ' ('.$karma[0].')'; } else { $karma = ' ('.$karma[0].') <a href="karma.php?to='.$cur_post['poster_id'].'&vote=1&pid='.$cur_post['id'].'">+</a>/<a href="karma.php?to='.$cur_post['poster_id'].'&vote=-1&pid='.$cur_post['id'].'">-</a>'; } } |
Добавлено спустя 6 минут 45 секунд: У меня пока там ошибки и т.д. Потом когда полностью готов шаблон будет, уже можно будет отладить.
Вообщем насчет кармы:
Там сначала посты через цикл вытаскиваются, потом через второй цикл определяется карма каждого постера.
Удобней было бы сразу в одном цикле это сделать и потом в шаблоне через цикл вывести без всяко запросов.
Отредактировано tipsun (2012.02.18 08:08)
Не хочет ничего показывать, почему?
Код:
span style="color: #0000BB"><?phpdefine('SMARTY_DIR', PUN_ROOT . 'plugins/Smarty/');require_once(SMARTY_DIR . 'Smarty.class.php');$smarty = new Smarty();$smarty->template_dir = PUN_ROOT . 'themes/wap/templates/';$smarty->compile_dir = PUN_ROOT . 'themes/wap/compile/';$smarty->config_dir = PUN_ROOT . 'themes/wap/configs/';$smarty->cache_dir = PUN_ROOT . 'themes/wap/cache/';$smarty->assign('paging_links', $paging_links);$smarty->assign('posts', $paging_links);$smarty->assign('pun_config', $pun_config);$smarty->assign('pun_user', $pun_user);$smarty->assign('posts', $posts);//$smarty->debugging = true;$smarty->display('viewtopic.tpl'); |
Отредактировано tipsun (2012.02.18 11:11)
Так видно что класс загрузился.
Код:
span style="color: #0000BB"><?phpvar_dump($smarty); |
Добавлено спустя 6 минут 33 секунды: А, шаблон битый. Неправильно что-то написал.
Другой, простой-тестовый, загрузило-показало.
Отредактировано tipsun (2012.02.18 13:01)
Короче массивы с ключами, содержащими пробелы надо писать как обычно, видимо.
Код:
{$lang_topic['Quick post']} |
Отредактировано tipsun (2012.02.18 15:03)
Ну сейчас совсем другое дело. Вживую собирать (смотреть на результат) гораздо приятнее

Хоть видно, что вроде получается.
Отредактировано tipsun (2012.02.18 14:02)
Я вот подумал, зачем я тогда время трачу на обработку этих $cur_post['edit'] -> $cur_post.edit
Может как есть оставлять?
Отредактировано tipsun (2012.02.18 15:03)
За сегодня.
Ошибок в компиляции нет.
Пропустил некоторые функции типа антиспам, счетчик сообщений, сигнатура итд.
Код:
span style="color: #0000BB"><?php{include file='header.tpl'}<div class="con"> <a href="index.php">{$lang_common.Index}</a> / <a href="viewforum.php?id={$cur_topic.forum_id}">{$cur_topic.forum_name}</a> / {$cur_topic.subject}</div>{foreach from=$posts item=cur_post}<table class="msg2"> <tr> <td> <div id="p{$cur_post.id}"> <a href="viewtopic.php?pid={$cur_post.id}#p{$cur_post.id}">#{$start_from + $post_count}</a><br/> {$cur_post.posted|date_format:"%d/%m/%y %H:%I:%S"}<br/> <strong> <!-- Name --> {if $cur_post.poster_id > 1} <a href="profile.php?id={$cur_post.poster_id}">{$cur_post.username}</a> {else} {$cur_post.username} {/if} {if $cur_post.poster_id > 1} {if $pun_config.o_show_post_karma == 1 || $pun_user.g_id < $smarty.const.PUN_GUEST} {if $pun_user.is_guest || $cur_post.karma[1]} {$cur_post.karma[0]} {else} (<a href="karma.php?to={$cur_post.poster_id}&vote=-1&pid={$cur_post.id}">-</a> {$cur_post.karma[0]} <a href="karma.php?to={$cur_post.poster_id}&vote=1&pid={$cur_post.id}">+</a>) {/if} {/if} {/if} </strong> {if $cur_post.poster_id > 1 && $cur_post.is_online == $cur_post.poster_id} <b>On</b> {else} Off {/if} </div> </td> {if $cur_post.poster_id > 1 && ($pun_config.o_avatars == 1 && $cur_post.use_avatar == 1 && $pun_user.show_avatars)} <td> <img src="../{$pun_config['o_avatars_dir']}/{$cur_post.poster_id}.gif" alt="Avatar" /> </td> {/if} </tr></table><table class="msg"> <tr> <td>{$cur_post.message}</td> </tr> <tr> <td> <!-- Antispam missing --> {if $cur_post.edited} <div> <em>{$lang_topic['Last edit']} {$cur_post.edited_by} ({$cur_post.edited|date_format:"%d/%m/%y %H:%I:%S"})</em> </div> {/if} {if $signature} <div> <hr />{$signature} </div> {/if} </td> </tr></table><div class="con">{if ! $is_admmod} {if ! $cur_topic.closed} {if $cur_post.poster_id == $pun_user.id} {if (($start_from + $post_count) == 1 && $pun_user.g_delete_topics == 1) || (($start_from + $post_count) > 1 && $pun_user.g_delete_posts == 1)} <a href="delete.php?id={$cur_post.id}">{$lang_topic.Delete}</a> {/if} {if $pun_user.g_edit_posts == 1} <a href="edit.php?id={$cur_post.id}">{$lang_topic.Edit}</a> {/if} {/if} {if (! $cur_topic.post_replies && $pun_user.g_post_replies == 1) || $cur_topic.post_replies == 1} <a href="post.php?tid={$id}&qid={$cur_post.id}">{$lang_topic['Post reply']}</a> {/if} {/if}{else} <a href="delete.php?id={$cur_post.id}">{$lang_topic.Delete}</a><br/> <a href="edit.php?id={$cur_post.id}">{$lang_topic.Edit}</a><br/> <a href="post.php?tid={$id}&qid={$cur_post.id}">{$lang_topic['Post reply']}</a>{/if}</div>{/foreach}<p class="con">{$paging_links}</p>{if $pun_user.g_post_replies}<div class="blocktable"> <strong><a class="in" href="post.php?tid={$id}">{$lang_topic['Post reply']}</a></strong></div>{/if}{if $quickpost}<div> <strong>{$lang_topic['Quick post']}</strong></div><div class="input"> <form method="post" action="post.php?tid={$id}"> <div> <fieldset> <legend>{$lang_common['Write message legend']}</legend> {if $pun_config.o_antiflood} <input type="hidden" name="form_t" value="{$smarty.server.REQUEST_TIME}" /> <input type="hidden" name="form_sent" value="1" /> <input type="hidden" name="form_user" value="{if ! $pun_user.is_guest}{$pun_user.username}{else}Guest{/if}" /> {/if} <!-- +Guest name --> {if $pun_user.is_guest} {$lang_common.Username}<br/> <input type="text" name="req_username" tabindex="1" /><br/> {/if} <!-- -Guest name --> <textarea name="req_message" rows="4" cols="24" tabindex="1"></textarea><br/> {if $is_admmod} <input type="checkbox" name="merge" value="1" checked="checked" /> {$lang_post['Merge posts']} {/if} </fieldset><br/> <input type="submit" name="submit" tabindex="2" value="{$lang_common.Submit}" accesskey="s" /> </div> </form></div>{/if}{include file='footer.tpl'} |
Отредактировано tipsun (2012.02.18 17:05)
tipsun, а ты откуда форум брал-то...? что-то у меня подозрение что ты его не из свн брал?
Нет. На свн ссылки нет. Я отсюда (вапинет-скрипты) взял.
Добавлено спустя 1 минуту 13 секунд: Я вообще думал присоединиться туда, но чет не разобрался как.
$pun_user.g_id - такой синтаксис ведь не обязателен?
$pun_user['g_id'] - можно же как обычно?
Отредактировано tipsun (2012.02.19 07:07)
на сколько я помню, желателен именно $pun_user.g_id
Ок. Но с пробелами ключи придется писать так: $lang_pack['tro lolo']
Отредактировано tipsun (2012.02.19 07:07)
погуглил. действительно частая проблема.
реашают заданием временной переменной в шаблоне.
Код:
{assign var=index value="tro lolo"} |
$lang_pack.$index |
Скачал форум.
Добавлено спустя 4 минуты 13 секунд: Код:
span style="color: #0000BB"><?php if ($cur_post['poster_id'] > 1) { if ($pun_config['o_avatars'] == 1 && $cur_post['use_avatar'] == 1 && $pun_user['show_avatars']) { if ($img_size = @getimagesize('../'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.gif')) { $user_avatar = '<img src="../'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.gif" alt="*" />'; } else if ($img_size = @getimagesize('../'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.jpg')) { $user_avatar = '<img src="../'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.jpg" alt="*" />'; } else if ($img_size = @getimagesize('../'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.png')) { $user_avatar = '<img src="../'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.png" alt="*" />'; } } else { $user_avatar = ''; } } |
Код:
<!-- +Avatar --> |
{if $cur_post.poster_id > 1 and $pun_config.o_avatars == 1 && $cur_post.use_avatar == 1 && $pun_user.show_avatars} |
<img src="../{$pun_config.o_avatars_dir}/{$cur_post.poster_id}.gif" alt="*" /> |
{/if} |
<!-- -Avatar --> |
Отредактировано tipsun (2012.02.19 09:09)
Фух. Там только интимные места остались.
расскажи вообще про структуру, как ты смарти прикручиваешь
Я пока просто шаблоны делаю.
Я только вчера со smarty познакомился, а тут уже структура итд
Отредактировано tipsun (2012.02.19 14:02)
Gemorroj, Если я выложу код на SVN, то могу случайно что-то заменить? После чего невозможно будет это восстановить?
Отредактировано tipsun (2012.02.20 09:09)
можно откатить будет. но сейчас у тебя нет прав на заливку кода в свн. только на скачивание.
расскажи про архитектуру, как ты прикручиваешь смарти.
В архиве все.
Отредактировано tipsun (2012.02.20 10:10)
эм нет. в папке include/template есть уже несколько шаблонов, нужно развивать их там дальше.
сам Smarty тоже стоит положить в includes. themes положить в include/template
Это получится так типа:
- include/template/themes/
THEME_NAME/templates/
TPL_NAME.tpl- include/template/themes/
THEME_NAME/compiled/~
- include/template/themes/
THEME_NAME/cache/~
- include/template/themes/
THEME_NAME/configs/~
- include/template/themes/
THEME_NAME/style.css
Отредактировано tipsun (2012.02.20 11:11)
еще даже можно, наверн в themes 2 подпапки добавить wap и web и в них ложить темы для того и другого отдельно
Ок.
Я в dcms видел, что они просто префикс добавляли: "wap_", "pda_", "web_".
Поэтому думал, может так и сделать.
Добавлено спустя 6 минут 26 секунд: Еще надо будет в верстке указывать (через переменную можно):
Код:
span style="color: #0000BB"><?php$smarty->template_dir = PUN_ROOT . 'include/template/themes/wap/' . $pun_user['style_wap'] . '/tpls/';$smarty->compile_dir = PUN_ROOT . 'include/template/themes/wap/' . $pun_user['style_wap'] . '/compiled/';$smarty->config_dir = PUN_ROOT . 'include/template/themes/wap/' . $pun_user['style_wap'] . '/configs/';$smarty->cache_dir = PUN_ROOT . 'include/template/themes/wap/' . $pun_user['style_wap'] . '/cache/';/*$smarty->template_dir = PUN_ROOT . 'include/template/themes/' . $pun_user['style_wap'] . '/tpls/';$smarty->compile_dir = PUN_ROOT . 'include/template/themes/' . $pun_user['style_wap'] . '/compiled/';$smarty->config_dir = PUN_ROOT . 'include/template/themes/' . $pun_user['style_wap'] . '/configs/';$smarty->cache_dir = PUN_ROOT . 'include/template/themes/' . $pun_user['style_wap'] . '/cache/';*///<!-- +TEMPLATE --> <head> <title>{$page_title|escape}</title> <link rel="stylesheet" type="text/css" href="/include/template/themes/wap/{$pun_user.style_wap}/style.css" /> //<!-- <link rel="stylesheet" type="text/css" href="/include/template/themes/{$pun_user.style_wap}/style.css" /> --> </head>//<!-- -TEMPLATE --> |
Отредактировано tipsun (2012.02.20 12:12)
А если включить мозги, то так можно:
Код:
span style="color: #0000BB"><?php//без слеша впереди, потом можно добавить в "подключении" css.define('THEME_DIR', 'include/template/themes/wap/' . $pun_user['style_wap'] . '/');$smarty->template_dir = PUN_ROOT . THEME_DIR . '/tpls/';$smarty->compile_dir = PUN_ROOT . THEME_DIR . '/compiled/';$smarty->config_dir = PUN_ROOT . THEME_DIR . '/configs/';$smarty->cache_dir = PUN_ROOT . THEME_DIR . '/cache/';/* HTML<link rel="stylesheet" type="text/css" href="/{$smarty.const.THEME_DIR}/style.css" />*/ |
Отредактировано tipsun (2012.02.20 12:12)
Не знаю как тут с запросом быть.
Просто сделал, что типа карма уже будет готовая выводиться в массиве.
Код:
span style="color: #0000BB"><?php//Пост должен содержать типа такого.$cur_post['karma']['val'] = 'integer karma'; if ($pun_config['o_show_post_karma'] == 1 || $pun_user['g_id'] < PUN_GUEST) { $q = $db->fetch_row($db->query(' SELECT COUNT(1), (SELECT COUNT(1) FROM `' . $db->prefix . 'karma` WHERE `vote` = "-1" AND `to` = ' . $cur_post['poster_id'] . ') FROM `' . $db->prefix . 'karma` WHERE `vote` = "1" AND `to` = ' . $cur_post['poster_id'] )); $karma['plus'] = intval($q[0]); $karma['minus'] = intval($q[1]); $karma['karma'] = $karma['plus'] - $karma['minus']; unset($q); if ($pun_user['is_guest']) { $karma = ' (' . $karma['karma'] . ')'; } else if ($db->num_rows($db->query('SELECT 1 FROM `' . $db->prefix . 'karma` WHERE `id`=' . $pun_user['id'] . ' AND `to`=' . $cur_post['poster_id'] . ' LIMIT 1'))) { $karma = ' (' . $karma['karma'] . ')'; } else { $karma = ' (' . $karma['karma'] . ') <a href="karma.php?to=' . $cur_post['poster_id'] . '&vote=1&pid=' . $cur_post['id'] . '">+</a>/<a href="karma.php?to=' . $cur_post['poster_id'] . '&vote=-1&pid=' . $cur_post['id'] . '">-</a>'; } } //Template //<!-- +Karma --> {if $cur_post.karma.val and $pun_config.o_show_post_karma == 1 || $pun_user.g_id < $smarty.const.PUN_GUEST}  ({$cur_post.karma.val}) {if ! $pun_user.is_guest}  <a href="karma.php?to={$cur_post.poster_id}&vote=1&pid={$cur_post.id}">+</a>/<a href="karma.php?to={$cur_post.poster_id}&vote=-1&pid={$cur_post.id}">-</a> {/if} {/if} //<!-- -Karma --> |
Отредактировано tipsun (2012.02.20 12:12)
Нет, надо было оставить "used".
$cur_post['karma']['val'] - значение кармы
$cur_post['karma']['used'] - уже ставил этому пользователю, если ставил, то задать
true.
Вот короче:
Код:
//Template |
//<!-- +Karma --> |
{if $pun_config.o_show_post_karma == 1 || $pun_user.g_id < $smarty.const.PUN_GUEST} |
({$cur_post.karma.val}) |
{if ! $pun_user.is_guest and ! $cur_post.karma.used} |
<a href="karma.php?to={$cur_post.poster_id}&vote=1&pid={$cur_post.id}">+</a>/<a href="karma.php?to={$cur_post.poster_id}&vote=-1&pid={$cur_post.id}">-</a> |
{/if} |
{/if} |
//<!-- -Karma --> |
Отредактировано tipsun (2012.02.20 13:01)
Сейчас еще вытащу все assign с цикла шаблона

Я сначала даже и не подумал.
Добавлено спустя 6 минут 30 секунд: Осталось: карма, аватарка и еще
Код:
span style="color: #0000BB"><?php// Can we or can we not post replies?if (!$cur_topic['closed']) { if ((!$cur_topic['post_replies'] && ($pun_user['g_post_replies'] == 1 || $pun_user['g_post_replies'] == 2)) || $cur_topic['post_replies'] == 1 || $is_admmod) { $post_link = '<a href="post.php?tid='.$id.'">'.$lang_topic['Post reply'].'</a>'; } else { $post_link = ' '; }} else { $post_link = $lang_topic['Topic closed']; if ($is_admmod) { $post_link .= ' / <a href="post.php?tid='.$id.'">'.$lang_topic['Post reply'].'</a>'; }}if (!$pun_user['is_guest'] && $pun_config['o_subscriptions'] == 1) { if ($cur_topic['is_subscribed']) { // I apologize for the variable naming here. It's a mix of subscription and action I guess :-) $subscraction = '<div class="con">'.$lang_topic['Is subscribed'].' - <a href="misc.php?unsubscribe='.$id.'">'.$lang_topic['Unsubscribe'].'</a></div>'; } else { $subscraction = '<div class="con"><a href="misc.php?subscribe='.$id.'">'.$lang_topic['Subscribe'].'</a></div>'; }} else { $subscraction = null;} // Switch the background color for every message. $bg_switch = !$bg_switch; $vtbg = ($bg_switch) ? ' roweven' : ' rowodd'; // Perform the main parsing of the message (BBCode, smilies, censor words etc) $cur_post['message'] = parse_message($cur_post['message'], $cur_post['hide_smilies'], $cur_post['id']); // Do signature parsing/caching if ($cur_post['signature'] && $pun_user['show_sig']) { if (isset($signature_cache[$cur_post['poster_id']])) { $signature = $signature_cache[$cur_post['poster_id']]; } else { $signature = parse_signature($cur_post['signature']); $signature_cache[$cur_post['poster_id']] = $signature; } } $save_attachments = $attachments; $attachments = array_filter($attachments, 'filter_attachments_of_post'); if ($attachments) { include PUN_ROOT.'include/attach/wap_view_attachments.php'; } $attachments = $save_attachments; if ($is_admmod) { if (isset($cur_post['spam_id'])) { include_once PUN_ROOT . 'lang/' . $pun_user['language'] . '/misc.php'; echo '<br/>'.$lang_misc['Antispam pattern'].' - '.pun_htmlspecialchars($cur_post['pattern']).'<br /><a href="./antispam_misc.php?action=allow&id='.$cur_post['spam_id'].'">'.$lang_misc['Antispam tread'].'</a> | <a href="./antispam_misc.php?action=deny&id='.$cur_post['spam_id'].'">'.$lang_misc['Antispam del'].'</a><br />'; } }if ($cur_post['signature'] && $pun_user['show_sig']) { if (isset($signature_cache[$cur_post['poster_id']])) { $signature = $signature_cache[$cur_post['poster_id']]; } else { $signature = parse_signature($cur_post['signature']); $signature_cache[$cur_post['poster_id']] = $signature; } } |
Отредактировано tipsun (2012.02.20 13:01)
Пойду отдыхать, а то глаза уже болят...
Добавлено спустя 8 минут 41 секунду: tipsun написал:А если включить мозги, то так можно:
Код:
span style="color: #0000BB"><?php//без слеша впереди, потом можно добавить в "подключении" css.define('THEME_DIR', 'include/template/themes/wap/' . $pun_user['style_wap'] . '/');$smarty->template_dir = PUN_ROOT . THEME_DIR . '/tpls/';$smarty->compile_dir = PUN_ROOT . THEME_DIR . '/compiled/';$smarty->config_dir = PUN_ROOT . THEME_DIR . '/configs/';$smarty->cache_dir = PUN_ROOT . THEME_DIR . '/cache/';/* HTML<link rel="stylesheet" type="text/css" href="/{$smarty.const.THEME_DIR}/style.css" />*/ |
А если этими мозгами еще подумать, то:Код:
span style="color: #0000BB"><?phpdefine('THEME_DIR', PUN_ROOT . 'include/template/themes/wap/' . $pun_user['style_wap'] . '/');$smarty->template_dir = THEME_DIR . '/tpls/';$smarty->compile_dir = THEME_DIR . '/compiled/';$smarty->config_dir = THEME_DIR . '/configs/';$smarty->cache_dir = THEME_DIR . '/cache/';////<link rel="stylesheet" type="text/css" href="{$smarty.const.THEME_DIR}/style.css" />// |
Отредактировано tipsun (2012.02.20 13:01)
Где-то я видел регистрация_функции() в смарти.
Еще чего подумал.
Ну допустим есть у нас некоторые исключения, при которых надо перенаправить пользователя, или оборвать выполнение скрипта.
Если в самом начале запускать смарти, то оно как бы лишний раз запускается.
А если все будет нормально, + кеш-смарти. То наоборот выигрышный запуск в самом начале, не?
Правда там еще этот смарти проверить должен, изменились ли данные или нет, чтоб выдать кеш-шаблон или вновь компилируемый, не?
Или при компиляции смарти приводит шаблон в нативный вид?
* А из нативного в статичный уже.
Отредактировано tipsun (2012.02.20 17:05)
tipsun, ну диагноз ясен.
Так же наблюдается синдром Флудераста.
Принимайте google 3 раза в день. И все пройдет.
Отредактировано tipsun (2012.02.20 18:06)
Там она все параметры в массив складывает, как я понял.
Это значит саму функцию тоже менять придется?
Код:
span style="color: #0000BB"><?php$smarty->register_function("date_now", "print_current_date");function print_current_date($params){ if(empty($params['format'])) { $format = "%b %e, %Y"; } else { $format = $params['format']; return strftime($format,time()); }}// теперь вы можете использовать ее в Smarty чтобы вывести текущую дату: {date_now}// или {date_now format="%Y/%m/%d"} чтобы задать формат. |
Отредактировано tipsun (2012.02.20 18:06)
tipsun, про скорость пока не задумывайся, доделаем.
на счет твоей функции, у смарти уже вроде есть готовые функции для работы с датой. почитай мануал по этому поводу. и желательно по 3 версии
Я не про дату, про дату я читал

Код:
{$var|date_format:'%d/%m/%y %H:%I:%S'} |
|
еще про default посмотрел (когда переменная не содержит значения, то выводится по умол.) |
Ну, по ситуации, заглядываю в мануал, бывает =) |
{$var|default:'no value'} |
. . . .
Я про $smarty->
register_function();
. . . .
Отредактировано tipsun (2012.02.21 11:11)
я по моему такой штукой даже и не пользовался.
А как быть с пользовательскими функциями и инклудами?
Если я ничего не упустил, то остался в файле wap/viewtopic.php только этот код:
#39.Там вроде случайно повторился.
Еще посмотрел стандартные шаблоны: include/template/
Там как бы совсем общее.
Ну я несколько раз смотрел, пытался собрать верх header.tpl и низ footer.tpl
Там например была ссылка на rss новости, указание кодировки, я сразу подставлял то, что по default идет из массива-источника.
Есть немного, но в правильности не уверен, еще раз буду смотреть, искать что упустил.
Отредактировано tipsun (2012.02.21 18:06)
главное чтобы архитектура правильно выстроена была)
Добавлено спустя 1 минуту 6 секунд: кстати, сегодня Smarty 3.1.8 вышел
Надо наверно все-таки мануал 3 на англ. смотреть и переводить. Пользоваться 3, а мануал за 2 смотреть - не логично
Добавлено спустя 5 минут 9 секунд: tipsun написал:
Там как бы совсем общее.
И там для вап только wap_main.tpl
Остальное для веб вроде.
Добавлено спустя 7 минут 57 секунд: Код:
<html> |
<head> |
<meta http-equiv="Content-Type" content="text/html; charset={$lang_common.lang_encoding}" /> |
<title>{$page_title|escape}</title> |
<link rel="stylesheet" type="text/css" href="{$smarty.const.THEME_DIR}/style.css" /> |
<link rel="alternate" type="application/rss+xml" title="{$pun_config.o_board_title}" href="{$smarty.const.PUN_ROOT}rss.xml" /> |
</head> |
<body> |
|
<div class="hd"> |
<img src="{$smarty.const.THEME_DIR}/imgs/logo.gif" title="{$lang_common.Forum} {$smarty.server.HTTP_HOST}" alt="{$lang_common.Forum} {$smarty.server.HTTP_HOST}" /> |
</div> |
|
<div class="hd_bott"> |
{$pun_config.o_board_desc} |
</div> |
|
<div class="in"> |
<div> |
-<a href="/rss.xml">RSS</a> |
<a href="{$smarty.const.PUN_ROOT}rss.xml">RSS</a> |
</div> |
</div> |
|
<div class="incqbox"> |
{$lang_common.Announcement} |
</div> |
|
<div class="msg"> |
{$pun_config.o_announcement_message} |
</div> |
Отредактировано tipsun (2012.02.21 19:07)
Ну это просто набросок. Там еще условия итд.
Код:
span style="color: #0000BB"><?php//<!-- TPL -->/*<?xml version="1.0" encoding="UTF-8"?>*/<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru"> <head> <meta http-equiv="Expires" content="Thu, 21 Jul 1977 07:30:00 GMT" /> <meta http-equiv="Last-Modified" content="{$smarty.now|date_format:'r'} GMT" /> <meta http-equiv="Cache-Control" content="post-check=0, pre-check=0" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Content-Type" content="text/html; charset={$lang_common.lang_encoding}" /> <title>{$page_title|escape}</title> <link rel="stylesheet" type="text/css" href="{$smarty.const.THEME_DIR}style.css" /> <link rel="alternate" type="application/rss+xml" title="{$pun_config.o_board_title}" href="{$smarty.const.PUN_ROOT}rss.xml" /> </head> <body> {if $basename == 'index.php'} <div class="hd"> <img src="{$smarty.const.THEME_DIR}/imgs/logo.gif" title="{$lang_common.Forum} {$smarty.server.HTTP_HOST}" alt="{$lang_common.Forum} {$smarty.server.HTTP_HOST}" /> </div> {if $pun_config.o_board_desc} <div class="hd_bott"> {$pun_config.o_board_desc} </div> {/if} {if $pun_user.is_guest} {assign var='Not_logged_in' value='Not logged in'} <div class="con"> {$lang_common.$Not_logged_in} </div> {/if} {if $pun_user.g_id < $smarty.const.PUN_GUEST} {* $result_header = $db->query('SELECT COUNT(1) FROM `' . $db->prefix . 'reports` WHERE `zapped` IS NULL') or error('Unable to fetch reports info', __FILE__, __LINE__, $db->error()); if ($db->result($result_header)) { $tpl_temp .= '<div class="con"><a href="' . PUN_ROOT . 'admin_reports.php">' . $lang_admin['New reports'] . '</a></div>'; } *} {if $pun_config.o_maintenance == 1} <div class="con"> <a href="{$smarty.const.PUN_ROOT}admin_options.php#maintenance">{$lang_admin.maintenance}</a> </div> {/if} {/if} {/if} <div class="in"> <div> <a href="{$smarty.const.PUN_ROOT}rss.xml">RSS</a> </div> </div> {if $basename == 'index.php' && $pun_config.o_announcement == 1} <div class="incqbox"> {$lang_common.Announcement} </div> <div class="msg"> {$pun_config.o_announcement_message} </div> {/if} {if $basename == 'profile.php' || $basename == 'search.php' || $basename == 'userlist.php' || $basename == 'message_list.php' || $basename == 'message_send.php' || $basename == 'message_delete.php' || $basename == 'misc.php' || $basename == 'filemap.php' || $basename == 'karma.php'} <div class="inbox"> <a href="index.php">{$lang_common.Index}</a> </div> {/if} |
Добавлено спустя 8 минут 48 секунд: Вроде есть в самой смарти: $smarty.server.PHP_SELF
Отредактировано tipsun (2012.02.21 20:08)
Можно задать $basename с логики, в принципе. baseName($_SERVER['PHP_SELF']);
Еще там если определена переменная PUN_HELP то грузиться шаблон include/template/help.tpl - я пока пропустил.
И еще там были интимные места, я пропустил.
Код:
span style="color: #0000BB"><?php// Load the templateif (defined('PUN_HELP')) { $tpl_main = file_get_contents(PUN_ROOT . 'include/template/help.tpl');} else { $tpl_main = file_get_contents(PUN_ROOT . 'include/template/wap_main.tpl');}// START SUBST - <pun_include "*">while (preg_match('#<pun_include "([^/\\\\]*?)\.(php[45]?|inc|html?|txt)">#', $tpl_main, $cur_include)) { if (!file_exists(PUN_ROOT . 'include/user/' . $cur_include[1] . '.' . $cur_include[2])) { error('Unable to process user include ' . htmlspecialchars($cur_include[0]) . ' from template main.tpl. There is no such file in folder /include/user/', __FILE__, __LINE__); } ob_start(); include_once PUN_ROOT . 'include/user/' . $cur_include[1] . '.' . $cur_include[2]; $tpl_temp = ob_get_contents(); $tpl_main = str_replace($cur_include[0], $tpl_temp, $tpl_main); ob_end_clean();}// END SUBST - <body>if (isset($hint_box)) { $tpl_temp = $hint_box;} else { $tpl_temp = null;}if ($pun_user['g_id'] < PUN_GUEST) { $result_header = $db->query('SELECT COUNT(1) FROM `' . $db->prefix . 'reports` WHERE `zapped` IS NULL') or error('Unable to fetch reports info', __FILE__, __LINE__, $db->error()); if ($db->result($result_header)) { $tpl_temp .= '<div class="con"><a href="' . PUN_ROOT . 'admin_reports.php">' . $lang_admin['New reports'] . '</a></div>'; } //это условие не пропустил + в начале if ($pun_user['g_id'] < PUN_GUEST) { if ($pun_config['o_maintenance'] == 1) { $tpl_temp .= '<div class="con"><a href="' . PUN_ROOT . 'admin_options.php#maintenance">' . $lang_admin['maintenance'] . '</a></div>'; }}// PMS MOD BEGINrequire PUN_ROOT . 'include/pms/wap_header_new_messages.php';// PMS MOD END |
Отредактировано tipsun (2012.02.21 20:08)
Я спать валю.

Код:
span style="color: #0000BB"><?php{assign var='Moderate_forum' value='Moderate forum'}{assign var='Delete_posts' value='Delete posts'}{assign var='Move_topic' value='Move topic'}{assign var='Open_topic' value='Open topic'}{assign var='Close_topic' value='Close topic'}{assign var='Unstick_topic' value='Unstick topic'}{assign var='Stick_topic' value='Stick topic'}{assign var='Link_separator_m' value='Link separator_m'}{*if ($basename == 'profile.php' || $basename == 'search.php' || $basename == 'userlist.php' || $basename == 'uploads.php' || $basename == 'message_list.php' || $basename == 'message_send.php' || $basename == 'help.php' || $basename == 'misc.php' || $basename == 'filemap.php' || $basename == 'karma.php') { echo '<div class="navlinks">'.generate_wap_navlinks().'</div>';}} else if ($footer_style == 'viewforum' || $footer_style == 'viewtopic') { // Display the "Jump to" drop list if ($pun_config['o_quickjump'] == 1) { // Load cached quickjump // included quickjump @include PUN_ROOT . 'cache/cache_wap_quickjump_' . $forum_id . '.php'; if (!defined('PUN_QJ_LOADED')) { include PUN_ROOT . 'include/cache.php'; generate_wap_quickjump_cache($forum_id); include PUN_ROOT.'cache/cache_wap_quickjump_' . $forum_id . '.php'; } }*}{if $is_admmod} {if $footer_style == 'viewforum'} <div class="con"> <a class="but" href="moderate.php?fid={$forum_id}&p={$p}">{$lang_common.$Moderate_forum}</a> </div> {elseif $footer_style == 'viewtopic'} <div class="con"> <span class="sub"> <a href="moderate.php?fid={$forum_id}&tid={$id}&p={$p}">{$lang_common.$Delete_posts}</a>{$lang_topic.$Link_separator_m} <a href="moderate.php?fid={$forum_id}&move_topics={$id}">{$lang_common.$Move_topic}</a> {if $cur_topic.closed == 1} {$lang_topic.$Link_separator_m}<a href="moderate.php?fid={$forum_id}&open={$id}">{$lang_common.$Open_topic}</a> {else} {$lang_topic.$Link_separator_m}<a href="moderate.php?fid={$forum_id}&close={$id}">{$lang_common.$Close_topic}</a> {/if} {if $cur_topic.sticky == 1} {$lang_topic.$Link_separator_m}<a href="moderate.php?fid={$forum_id}&unstick={$id}">{$lang_common.$Unstick_topic}</a> {else} {$lang_topic.$Link_separator_m}<a href="moderate.php?fid={$forum_id}&stick={$id}">{$lang_common.$Stick_topic}</a> {/if} </span> </div> {/if}{/if}<div class="foot"> <a href="/">{$smarty.server.HTTP_HOST}</a><br/> <a class="red" href="{$smarty.const.PUN_ROOT}">WEB</a></div><div class="copy"> <a href="http://wapinet.ru/forum/wap/">PunBB Mod Gemorroj</a><br/> <span class="red">{sprintf('%.3f', microtime(true) - $pun_start)} s</span></div></body></html> |
Еще про подпись юзера забыл.
Исключительно слово "лес" полностью описывает ситуацию, сложившуюся в данном коде.
Куда бы ты не ходил, возвращаешься на тоже место.
generate_wap_navlinks()Код:
span style="color: #0000BB"><?php // Index and Userlist should always be displayed $links['userlist.php'] = $lang_common['User list']; if ($pun_config['o_rules'] == 1) { $links['misc.php?action=rules'] = $lang_common['Rules']; } if ($pun_user['is_guest']) { if ($pun_user['g_search'] == 1) { $links['search.php'] = $lang_common['Search']; } if ($pun_config['uploads_conf'][$pun_user['group_id']]) { $links['uploads.php'] = $lang_common['Uploader']; } $info = $lang_common['Not logged in']; } else { if ($pun_user['g_id'] > PUN_MOD) { if ($pun_user['g_search'] == 1) { $links['search.php'] = $lang_common['Search']; } if ($pun_config['uploads_conf'][$pun_user['group_id']]) { $links['uploads.php'] = $lang_common['Uploader']; } $links['filemap.php'] = $lang_common['Attachments']; } else { $links['search.php'] = $lang_common['Search']; $links['uploads.php'] = $lang_common['Uploader']; $links['filemap.php'] = $lang_common['Attachments']; } // PMS MOD END } |
Код:
span style="color: #0000BB"><?php//Я не разобрался, сделал так.//<!-- TPL --> <div class="navlinks"> {* // Index and Userlist should always be displayed *} <a href="userlist.php">{$lang_common.$User_list}</a> {if $pun_config.o_rules == 1} {$lang_topic.$Link_separator_m}<a href="misc.php?action=rules">{$lang_common.Rules}</a> {/if} {if $pun_user.g_search == 1 and $pun_user.g_id > $smarty.const.PUN_MOD} {$lang_topic.$Link_separator_m}<a href="search.php">{$lang_common.Search}</a> {/if} {if ! $pun_user.is_guest} {$lang_topic.$Link_separator_m}<a href="uploads.php">{$lang_common.Uploader}</a> {$lang_topic.$Link_separator_m}<a href="filemap.php">{$lang_common.Attachments}</a> {/if} </div> |
Отредактировано tipsun (2012.02.22 12:12)
Вид: "Пользователи |Поиск |Загрузки |Вложения "
Если так не нравится, можно переделать как было (в форме)
Отредактировано tipsun (2012.02.22 12:12)
Мдэ
$att_infoИ таких моментов не мало.
Код:
span style="color: #0000BB"><?php if ($can_download) { echo $check . '<a href="' . $pun_config['o_base_url'] . '/download.php?aid=' . $aid . '">' . $title . '</a> ' . $att_info; } else { echo '<span class="red">' . $title . '</span> ' . $att_info; } |
Чет я не понял, как система вложений работает.
Вроде все прозрачно. Но не пашет, когда //$attachments = $save_attachments.
Код:
span style="color: #0000BB"><?php//TEMPLATE{if $attachments}<div class="attach_list"> <strong>{$lang_fu.Attachments}</strong><br/> {* foreach from=$attachments item=attachment *} {if $can_download} {if $basename == 'edit.php'} <input type="checkbox" name="delete_image[]" value="{$attachment.id}" /> {$lang_fu.$Mark_to_Delete} {/if} <a href="{$pun_config.o_base_url}/download.php?aid={$attachment.id}">{$attachment.filename|escape}</a> {else} <span class="red">{$attachment.filename|escape}</span> {/if} {if $attachment.size >= 1048576} {round($attachment.size / 1048576, 0)} mb {else} {round($attachment.size / 1024, 0)} kb {/if} {if 'image' == strTok($attachment.mime, '/')} , {strtok('/')} {$attachment.image_dim} {/if} [<strong>{$lang_fu.Downloads}: {$attachment.downloads}</strong>]<br/> {* /foreach *}</div>{/if} |
Отредактировано tipsun (2012.02.22 18:06)
wap/viewtopic.php
include 'include/attach/fetch.php';
вроде как инфа должна находиться в $attachments
еще там нашел в файле
include 'include/file_upload.php'; - вроде
есть функция в самом конце, чет типа attach_filter_of_post
...
Или это все вообще не с аттачмента берется, а с самого cur_post тогда, что-ли может.
А вообще, потихоньку, чище становится там
А епт. Я же файл свой переименовал, вот и не работало.
Код:
span style="color: #0000BB"><?php//dir: 'include/attach/fetch.php'// there are different sources to include fetch.phpswitch (baseName($_SERVER['PHP_SELF'])) { case 'viewforum.php': // not implemented yet break; //case 'mod.viewtopic.php': case 'viewtopic.php': $att_sql = 'SELECT * FROM ' . $db->prefix . 'attachments WHERE topic_id=' . intval($id) . ' AND post_id in (' . implode(',', $pids) . ')'; break; case 'edit.php': $att_sql = 'SELECT * FROM ' . $db->prefix . 'attachments WHERE post_id=' . intval($id); break;} |
Отредактировано tipsun (2012.02.22 20:08)
А, извиняюсь.
Да я больше для себя болтаю. Сам пишу, сам читаю

Вот еще че, сейчас ссылки дам.
Добавлено спустя 2 минуты 51 секунду: http://code.google.com/p/punbb-mod/sour … tch.php#37Вот то, что я с файла-функции вытащил и в шаблон засунул
http://code.google.com/p/punbb-mod/sour … hments.phpЯ бы попробовал сделать так:
Код:
span style="color: #0000BB"><?php$attachments[$attachment['post_id']][] = $attachment;//Ибо... сейчас напишу{if $attachments[$cur_post.id]}<div class="attach_list"> <strong>{$lang_fu.Attachments}</strong><br/> {foreach from=$attachments[$cur_post.id] item=attachment} {if $can_download} {if $basename == 'edit.php'} <input type="checkbox" name="delete_image[]" value="{$attachment.id}" /> {$lang_fu.$Mark_to_Delete} {/if} <a href="{$pun_config.o_base_url}/download.php?aid={$attachment.id}">{$attachment.filename|escape}</a> {else} <span class="red">{$attachment.filename|escape}</span> {/if} {if $attachment.size >= 1048576} {round($attachment.size / 1048576, 0)} mb {else} {round($attachment.size / 1024, 0)} kb {/if} //я позволил себе изменить: preg_match('/^image\/(.*)$/i', $attachment['mime'], $regs) {if 'image' == strTok($attachment.mime, '/')} , {strtok('/')} {$attachment.image_dim} {/if} [<strong>{$lang_fu.Downloads}: {$attachment.downloads}</strong>]<br/> {/foreach}</div>{/if} |
Добавлено спустя 9 минут 59 секунд: И у меня вроде все нормально отобразилось.
Отредактировано tipsun (2012.02.22 20:08)
http://code.google.com/p/punbb-mod/sour … ic.php#266Может так или в шаблоне запускать парсер?
Ну например там может антиспам или чего еще я не прикрутил, может должен работать с исходным текстом
Код:
span style="color: #0000BB"><?php$posts = $pids = array();while ($cur_post = $db->fetch_assoc($result)) { $cur_post['message'] = parse_message($cur_post['message'], $cur_post['hide_smilies'], $cur_post['id']); $posts[] = $cur_post; $pids[] = $cur_post['id'];}$db->free_result($result); |
Добавлено спустя 8 минут 18 секунд: Эх, наверно зря я переносил условия полностью в шаблон.
Лучше бы оставил, чтоб потом через логику можно было сразу поменять.
Вот пример?
Код:
span style="color: #0000BB"><?php$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_id'] == PUN_MOD && array_key_exists($pun_user['username'], $mods_array))) ? true : false;$can_download = (!$cur_topic['file_download'] && $pun_user['g_file_download'] == 1) || $cur_topic['file_download'] == 1 || $is_admmod;$smarty->assign('is_admmod', $is_admmod);$smarty->assign('can_download', $can_download);{if $is_admmod}Ololo{/if}{if $can_download}Thx :){/if} |
Отредактировано tipsun (2012.02.22 21:09)
Вот, если будет время + желание то:
Отредактировано tipsun (2012.02.22 21:09)
ммм, я что-то не догоняю..
что за attach?
папку themes удали, она там лишняя.
аа, ясн.
еще, пользуйся Smarty комментами {* коммент *} а не html в шаблонах.
Код:
span style="color: #0000BB"><?php//До{if ! $pun_user.is_guest}{$pun_user.username|escape}{else}Guest{/if}//После{$pun_user.username|escape|default:'Guest'} |
Отредактировано tipsun (2012.02.24 09:09)
Может быть или не быть.
Код:
span style="color: #0000BB"><?php/*Можно было бы при загрузке сразу1 раз определить тип аватарки изанести в базу в таблицу с юзерамив отдельное поле, типа 'avatar_type'.В шаблоне просто потом вывести:- - - -<img src="{$smarty.const.PUN_ROOT}{$pun_config.o_avatars_dir}/{$cur_post.poster_id}.{$cur_post.avatar_type}" alt="*" />- - - -*/if ($pun_config['o_avatars'] == 1 && $cur_post['use_avatar'] == 1 && $pun_user['show_avatars']) { if ($img_size = @getimagesize('../'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.gif')) { $user_avatar = '<img src="../'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.gif" alt="*" />'; } else if ($img_size = @getimagesize('../'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.jpg')) { $user_avatar = '<img src="../'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.jpg" alt="*" />'; } else if ($img_size = @getimagesize('../'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.png')) { $user_avatar = '<img src="../'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.png" alt="*" />'; }} else { $user_avatar = '';} |
Отредактировано tipsun (2012.02.24 10:10)
Не хочется начинать новые файлы переводить из-за того, что потом забудешь, что тут было.
А тут еще остались моменты.
Или сделать как получится и потом переделать?
Добавлено спустя 2 минуты 59 секунд: user_title осталось, например.
Сейчас буду его искать.
Эта переменная нагде не выводится, чудеса епт.
- - - -
Или это $signature переменная...
Ибо <div class="hr">моя подпись высветилась</div>
Отредактировано tipsun (2012.02.24 10:10)
» Get posts
» Do signature parsing/caching
» echo Signature
Сделал так:
/+
Наверно не зря фиксируется $signature_cache[$cur_post['poster_id']]
Видимо где-то заново фиксируется все это дело.
После цикла с постами, именно там все это происходит вроде.
А может и нет.
+/
<?php
// Get posts
$posts = $pids = array();
while ($cur_post = $db->fetch_assoc($result)) {
// Do signature parsing/caching
if ($cur_post['signature'] && $pun_user['show_sig']) {
if (! isset($signature_cache[$cur_post['poster_id']])) {
$signature_cache[$cur_post['poster_id']] = parse_signature($cur_post['signature']);
}
}
$posts[] = $cur_post;
$pids[] = $cur_post['id']; // Need to fetch attachments from db.
}
$db->free_result($result);
// Trololo 
$smarty->assign('signature_cache', $signature_cache);
// TEMPLATE
/*
Промазал
<div class="hr">
{* Подпись пользователя *}
{if $cur_post.signature && $pun_user.show_sig}
{$signature_cache[$cur_post.poster_id]}
{/if}
</div>
*/
{* Подпись пользователя *}
{if $cur_post.signature && $pun_user.show_sig}
<div class="hr">{$signature_cache[$cur_post.poster_id]}</div>
{/if}Добавлено спустя 8 минут 57 секунд: А елки, или это просто во время цикла вывода фиксируется 1 раз пользователь с подписью.
И потом если он встретиться еще раз, то не надо еще раз парсить, а просто вытащить готовое из массива, где ключ=идЗверя, значение=егоЗапарсервированная

Подпись.
Мдэ, сразу не догадался.
Отредактировано tipsun (2012.02.24 14:02)
Код:
span style="color: #0000BB"><?php{* Вне цикла надо, нет? *}{assign var='signature_cache' value=''}{* или *}{assign var='signature_cache' value=array()}{if $cur_post.signature && $pun_user.show_sig} {if ! isset($signature_cache[$cur_post.poster_id])} {$signature_cache[$cur_post.poster_id] = parse_signature($cur_post.signature)} {/if}<div class="hr">{$signature_cache[$cur_post.poster_id]}</div>{/if} |
Отредактировано tipsun (2012.02.24 14:02)
а кстати, вполне возможно что в вап версии некоторые переменные и не используются.
Ну наверно. Я ни в header.php, ни в footer.php не нашел таких переменных.
Я сейчас их буду подробней рассматривать. Наброски то уже есть.
Отредактировано tipsun (2012.02.24 19:07)
wap/footer.php#9 :: include/functions.php#289Еще другой в другой функции есть кусок этот.
Код:
span style="color: #0000BB"><?php// Are there any additional navlinks we should insert into the array before imploding it?if ($pun_config['o_additional_navlinks']) { if (preg_match_all('#([0-9]+)\s*=\s*(.*?)\n#s', $pun_config['o_additional_navlinks'], $extra_links)) { // Insert any additional links into the $links array (at the correct index) for ($i = 0, $all = sizeof($extra_links[1]); $i < $all; ++$i) { if (preg_match('!<a[^>]+href="?\'?([^ "\'>]+)"?\'?[^>]*>([^<>]*?)</a>!is', $extra_links[2][$i], $row)) { array_splice($out, $extra_links[1][$i], 0, array('<option value="' . $row[1] . '">' . $row[2] . '</option>')); } } }} |
Интимные места, как всегда.
- Выкинул запрос в базу.
* Проигнорировал инклуд.
- Не обратил внимание на развилку wap_main и help.
Код:
span style="color: #0000BB"><?php{assign var='Not_logged_in' value='Not logged in'}{assign var='New_reports' value='New reports'}{assign var='Full_inbox' value='Full inbox'}{assign var='New_messages' value='Почта'}{* assign var='New_messages' value='New messages' *}<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru"> <head> <meta http-equiv="Expires" content="Thu, 21 Jul 1977 07:30:00 GMT" /> <meta http-equiv="Last-Modified" content="{$smarty.now|date_format:'r'} GMT" /> <meta http-equiv="Cache-Control" content="post-check=0, pre-check=0" /> <meta http-equiv="Pragma" content="no-cache" /> {* <pun_char_encoding> *} <meta http-equiv="Content-Type" content="text/html; charset={$lang_common.lang_encoding}" /> {*+ <pun_head> *} <title>{$page_title|escape}</title> <link rel="stylesheet" type="text/css" href="{$smarty.const.THEME_DIR}style.css" /> {*- <pun_head> *} {* <pun_rssname> *} {* <pun_rss> *} <link rel="alternate" type="application/rss+xml" title="{$pun_config.o_board_title}" href="{$smarty.const.PUN_ROOT}rss.xml" /> </head> <body> {if $basename == 'index.php'} {* <pun_hd> *} <div class="hd"> <img src="{$smarty.const.THEME_DIR}imgs/logo.gif" title="{$lang_common.Forum} {$smarty.server.HTTP_HOST}" alt="{$lang_common.Forum} {$smarty.server.HTTP_HOST}" /> </div> {if $pun_config.o_board_desc} {* <pun_desc> *} <div class="hd_bott"> {$pun_config.o_board_desc} </div> {/if} {*+ <pun_status> *} {if $pun_user.is_guest} <div class="con"> {$lang_common.$Not_logged_in} </div> {/if} {if $pun_user.g_id < $smarty.const.PUN_GUEST} {if $result_header} {* Query to db *} <div class="con"> <a href="{$smarty.const.PUN_ROOT}admin_reports.php">{$lang_admin.$New_reports}</a> </div> {/if} {if $pun_config.o_maintenance == 1} <div class="con"> <a href="{$smarty.const.PUN_ROOT}admin_options.php#maintenance">{$lang_admin.maintenance}</a> </div> {/if} {/if} {* require PUN_ROOT . 'include/pms/wap_header_new_messages.php'; *} {* ЛС *} {if $isset_new_message} <div class="info"> <a href="message_list.php"> {$New_messages} {* $lang_pms.$New_messages *} </a> </div> {if $count[0] >= $pun_user.g_pm_limit} <div class="red"> <a href="message_list.php">{$lang_pms.$Full_inbox}</a> </div> {/if} {/if} {*- <pun_status> *} {/if} <div class="in"> <div> <a href="{$smarty.const.PUN_ROOT}rss.xml">RSS</a> </div> </div> {if $basename == 'index.php' && $pun_config.o_announcement == 1} {* <pun_announcement> *} <div class="incqbox"> {$lang_common.Announcement} </div> <div class="msg"> {$pun_config.o_announcement_message} </div> {/if} {if $basename == 'profile.php' || $basename == 'search.php' || $basename == 'userlist.php' || $basename == 'message_list.php' || $basename == 'message_send.php' || $basename == 'message_delete.php' || $basename == 'misc.php' || $basename == 'filemap.php' || $basename == 'karma.php'} <div class="inbox"> <a href="index.php">{$lang_common.Index}</a> </div> {/if} |
Отредактировано tipsun (2012.02.25 16:04)
По-моему все эти условия тоже не стоит переносить в шаблон.
Только самое нужное.
Все условия скорее всего надо держать в логике, потом только передать типа:
В шаблоне уже элементарные условия, определяющие показать или нет.
Код:
span style="color: #0000BB"><?phpif (/* условия */) {$smarty->assign('isset_new_message', true);}{if $isset_new_message}<div class="mail">{$check_mail_box}</div>{/if} |
Отредактировано tipsun (2012.02.25 17:05)
»
include/pms/wap_header_new_messages.php используется в wap/header.php
Код:
span style="color: #0000BB"><?phpif (! $pun_user['is_guest'] && $pun_user['g_pm'] == 1 && $pun_config['o_pms_enabled'] && $pun_user['messages_enable'] == 1) { // Check for new messages $result_messages = $db->query('SELECT COUNT(1) FROM '.$db->prefix.'messages WHERE showed=0 AND owner='.$pun_user['id']) or error('Unable to check for new messages', __FILE__, __LINE__, $db->error()); $new_msg = $db->fetch_row($result_messages); if ($new_msg[0] > 0) { $condition['count_new_msgs'] = $new_msg[0]; } // Check if the inbox is full $result = $db->query('SELECT COUNT(1) FROM '.$db->prefix.'messages WHERE owner='.$pun_user['id']) or error('Unable to test if the message-box is full', __FILE__, __LINE__, $db->error()); $count = $db->fetch_row($result); if ($count[0] >= $pun_user['g_pm_limit']) { $condition['full_inbox'] = true; }} |
Отредактировано tipsun (2012.02.28 19:07)
Может что-то типа такого, или лучше можно сделать.
Или, как в мануале, сделать класс загрузки Smarty
»
wap/header.phpКод:
span style="color: #0000BB"><?phpif (! defined('PUN') or ! defined('PUN_ROOT')) exit(); define('PUN_HEADER', 1);if (defined('SMARTY')) { define('SMARTY_DIR', PUN_ROOT . 'include/Smarty/'); require_once SMARTY_DIR . 'Smarty.class.php'; $smarty = new Smarty(); define('THEME_DIR', PUN_ROOT . 'include/template/wap/' . $pun_user['style_wap'] . '/'); $smarty->template_dir = THEME_DIR . 'tpls/'; $smarty->compile_dir = THEME_DIR . 'compiled/'; $smarty->config_dir = THEME_DIR . 'configs/'; $smarty->cache_dir = THEME_DIR . 'cache/';}if ($pun_user['g_id'] < PUN_GUEST) { $result_header = $db->query('SELECT COUNT(1) FROM `' . $db->prefix . 'reports` WHERE `zapped` IS NULL') or error('Unable to fetch reports info', __FILE__, __LINE__, $db->error()); if ($db->result($result_header)) { $condition['reports'] = true; }}require PUN_ROOT . 'include/pms/wap_header_new_messages.php';//Уже в конце://$smarty->assign('conditions', $conditions);$smarty->assign('condition', $condition);$smarty->display('some.tpl'); |
Отредактировано tipsun (2012.02.28 19:07)
а как в мануале? я давненько со смарти не работал. вообще по логике да, нужно делать класс обертку.
типа PunTemplate extends Smarty {}
ну так да, об этом и речь)
Хотя в принципе так тоже удобно запускать Smarty, не?
Код:
span style="color: #0000BB"><?php//define('SMARTY', 1);define('PUN_TEMPLATE', 1);require_once PUN_ROOT . 'wap/header.php'; |
. . . .
Есть такое в footer.php
Как с этим быть я не знаю.
Генерирует файл, который потом инклудится в footer.php.
Код:
span style="color: #0000BB"><?php//// Generate WAP quickjump cache PHP scripts//function generate_wap_quickjump_cache($group_id = false){ global $db, $lang_common, $pun_config; // If a group_id was supplied, we generate the quickjump cache for that group only if ($group_id !== false) { $groups[0] = $group_id; } else { // A group_id was now supplied, so we generate the quickjump cache for all groups $result = $db->query('SELECT g_id FROM ' . $db->prefix . 'groups') or error('Unable to fetch user group list', __FILE__, __LINE__, $db->error()); $num_groups = $db->num_rows($result); for ($i = 0; $i < $num_groups; ++$i) { $groups[] = $db->result($result, $i); } } // Loop through the groups in $groups and output the cache for each of them while (list(, $group_id) = @each($groups)) { // Output wap quickjump as PHP code $fh = @fopen(PUN_ROOT . 'cache/cache_wap_quickjump_' . $group_id . '.php', 'wb'); if (!$fh) { error('Unable to write quickjump cache file to cache directory. Please make sure PHP has write access to the directory "cache"', __FILE__, __LINE__); } $output = '<?php if (! defined(\'PUN\')) exit(); define(\'PUN_QJ_LOADED\', 1); ?>' . '<form id="qjump" method="get" action="viewforum.php">' . '<div class="inbox">' . '<label>' . $lang_common['Jump to'] . '<br />' . '<select name="id" onchange="window.location.href=\\\'' . $pun_config['o_base_url'] . '/wap/viewforum.php?id=\\\'+this.options[this.selectedIndex].value;">'; $result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.redirect_url FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$group_id.') WHERE fp.read_forum IS NULL OR fp.read_forum=1 ORDER BY c.disp_position, c.id, f.disp_position', true) or error('Unable to fetch category/forum list', __FILE__, __LINE__, $db->error()); $cur_category = 0; while ($cur_forum = $db->fetch_assoc($result)) { // A new category since last iteration? if ($cur_forum['cid'] != $cur_category) { if ($cur_category) { $output .= '</optgroup>'; } $output .= '<optgroup label="' . pun_htmlspecialchars($cur_forum['cat_name']) . '">'; $cur_category = $cur_forum['cid']; } $redirect_tag = ($cur_forum['redirect_url']) ? ' >>>' : ''; $output .= '<option value="' . $cur_forum['fid'] . '"'; if ($group_id == $cur_forum['fid']) { $output .= ' selected="selected"'; } $output .= '>' . pun_htmlspecialchars($cur_forum['forum_name']) . $redirect_tag . '</option>'; } $output .= '</optgroup>' . '</select>' . '<input type="submit" value="' . $lang_common['Go'] . '" accesskey="g" />' . '</label>' . '</div>' . '</form>'; fputs($fh, $output); fclose($fh); }} |
Отредактировано tipsun (2012.02.29 12:12)
tipsun написал:
Хотя в принципе так тоже удобно запускать Smarty, не?
как так? я не понял.
насчет статичного файла - наверное, просто {include file='cache/cache_wap_quickjump_' . $group_id . '.php'} пока делай. $group_id должна быть в шаблоне
Сначала
#83 в шапке или где удобно, что обычно в любом случае инклудится, расположить.
Потом вызывать так типа:
Код:
span style="color: #0000BB"><?php define('SMARTY', 1);require_once PUN_ROOT . 'wap/header.php'; |
Короче. Дальше потихоньку пойду.
Отредактировано tipsun (2012.02.29 16:04)
не-не-не, класс прослойка над Smarty должен быть обязательно.
Да что такое, только вроде начал запускаться Smarty, теперь шаблоны не выводятся.
Хотя в них нет ошибок. Без скорлупы или как там, работало.
Добавлено спустя 7 минут 42 секунды: wap/viewtopic.phpКод:
span style="color: #0000BB"><?php define('PUN_ROOT', '../');require_once(PUN_ROOT . 'include/common.php');require_once(PUN_ROOT . 'include/file_upload.php');require_once(PUN_ROOT . 'lang/' . $pun_user['language'] . '/post.php');//require_once(PUN_ROOT . 'wap/header.php');//require_once('header.php');require_once(PUN_ROOT . 'include/Smarty/Smarty.class.php');$smarty = new Smarty();$dir = PUN_ROOT . 'include/template/wap/' . $pun_user['style_wap'] . '/';$smarty->template_dir = $dir . 'tpls/';$smarty->compile_dir = $dir . 'compiled/';$smarty->config_dir = $dir . 'configs/';$smarty->cache_dir = $dir . 'cache/';//$this->caching = true;$smarty->assign('punDesignDir', $dir); |
wap/header.phpКод:
span style="color: #0000BB"><?php if (! defined('PUN') or ! defined('PUN_ROOT')) exit(); define('PUN_HEADER', 1);require_once(PUN_ROOT . 'include/template.php');$smarty = new Pun_Template(PUN_ROOT . 'include/template/wap/' . $pun_user['style_wap'] . '/');if ($pun_user['g_id'] < PUN_GUEST) { $result_header = $db->query('SELECT COUNT(1) FROM `' . $db->prefix . 'reports` WHERE `zapped` IS NULL') or error('Unable to fetch reports info', __FILE__, __LINE__, $db->error()); if ($db->result($result_header)) { $conditions['reports'] = true; }}require PUN_ROOT . 'include/pms/wap_header_new_messages.php'; |
include/template.phpКод:
span style="color: #0000BB"><?php if (! defined('PUN')) exit(); define('PUN_TEMPLATE', 1);require_once('Smarty/Smarty.class.php');class Pun_Template extends Smarty{ public function __construct($dir) { $this->template_dir = $dir . 'tpls/'; $this->compile_dir = $dir . 'compiled/'; $this->config_dir = $dir . 'configs/'; $this->cache_dir = $dir . 'cache/'; //$this->caching = true; $this->assign('punDesignDir', $dir); }} |
Отредактировано tipsun (2012.02.29 20:08)
Без прослойки работает, проверил. Ну шаблон собранный показывает.
Добавлено спустя 1 минуту 27 секунд: Где-то я туплю, видимо.
Добавлено спустя 6 минут 48 секунд: Пойду спать.
Отредактировано tipsun (2012.02.29 20:08)
Итак...
С прослойкой так и не разобрался.
Отредактировано tipsun (2012.03.02 10:10)
Pun_Template - так не называй. такое название говорит о том, что этот класс должен быть в папке Pun и файл называться Template.php
какой код вызывается когда ты получаешь эту ошибку?
»
#92 - вот там я все показал.
Без прослойки работает.
Хорошо, как назвать тогда? "include_template" = include/template.php
Отредактировано tipsun (2012.03.02 11:11)
класс PunTemplate назови.
файл include/PunTemplate.php
Ой бле! Вот я тормоз.
Метод надо так же как класс назвать, видимо. Сейчас попробую.
Код:
span style="color: #0000BB"><?phpclass Smarty_GuestBook extends Smarty { function Smarty_GuestBook() { // Конструктор класса. // Он автоматически вызывается при создании нового экземпляра. $this->Smarty(); $this->template_dir = '/web/www.example.com/guestbook/templates/'; $this->compile_dir = '/web/www.example.com/guestbook/templates_c/'; $this->config_dir = '/web/www.example.com/guestbook/configs/'; $this->cache_dir = '/web/www.example.com/guestbook/cache/'; $this->caching = true; $this->assign('app_name', 'Guest Book'); }}$smarty = new Smarty_GuestBook(); |
Отредактировано tipsun (2012.03.02 17:05)
нее, это из времен php4. в php5 кошерно коструктор называть __construct
Нет. Вот так получилось норм.
Код:
span style="color: #0000BB"><?php// include/template.phpif (! defined('PUN')) exit(); define('PUN_TEMPLATE', 1);require_once('Smarty/Smarty.class.php');class PunTemplate extends Smarty{ function PunTemplate($dir) { $this->__construct(); $this->template_dir = $dir . 'tpls/'; $this->compile_dir = $dir . 'compiled/'; $this->config_dir = $dir . 'configs/'; $this->cache_dir = $dir . 'cache/'; $this->assign('punDesignDir', $dir); }}// wap/header.phprequire_once(PUN_ROOT . 'include/template.php');$smarty = new PunTemplate(PUN_ROOT . 'include/template/wap/' . $pun_user['style_wap'] . '/');// wap/viewtopic.phprequire_once(PUN_ROOT . 'wap/header.php'); |
Добавлено спустя 3 минуты : Gemorroj написал:
нее, это из времен php4. в php5 кошерно коструктор называть __construct
Да.

Нет - я говорил сам себе
Добавлено спустя 5 минут 35 секунд: Ладно. Сейчас чуть по коду погуляю. Может че получится.
Отредактировано tipsun (2012.03.02 17:05)
файл назови не template.php, а PunTemplate.php т.е. так же как и класс называется
и в конструктор передавай только название темы, класс прослойка должен сам понимать какие пути нужно установить основываясь только на названии темы.
Добавлено спустя 30 секунд: ну и блин конструктор все-таки __construct назови
Если метод PunTemplate переименовать в "__construct", то перестает работать.
Добавлено спустя 3 минуты 3 секунды: Про пути, сейчас попробую.
tipsun, ты на php4 чтоли сидишь?)
Нет вроде. Денвер же содержит PHP v5.2
Отредактировано tipsun (2012.03.02 18:06)
у денвера есть разные версии
phpVersion() = 5.2.12
Отредактировано tipsun (2012.03.02 19:07)
ну проблема в любом случае не в названии конструктора.
Вроде так должно сработать.
Просто сегодня баловался со своим говноКодом и случайно получилось.
Код:
span style="color: #0000BB"><?phpclass PunTemplate extends Smarty{ function __construct($dir) { parent::__construct(); //etс. }} |
.
.
Добавлено спустя 4 минуты 24 секунды: Да, вроде как работает.
А вот с путями чет не разобрался.
.
.
Отредактировано tipsun (2012.03.03 07:07)
аааа, епт. я невнимательно смотрел. ты пытался вызвать родительский конструктор!)
да, так будет корректно.
Я сам не знаю, чего я пытался, но работает
Добавлено спустя 9 минут 14 секунд: Вообщем с путями:
1) Надо чтоб смарти шаблоны увидел.
2) Надо чтоб в шаблоне при указании положения CSS, тоже было все норм. Ну если форум не в корне сайта.
Код:
span style="color: #0000BB"><?phpclass PunTemplate extends Smarty{ function __construct($punDesignName) { parent::__construct(); //$root = str_replace($_SERVER['DOCUMENT_ROOT'], null, str_replace('\\', '/', dirName(__FILE__))) . '/template/wap/' . $punDesignName . '/'; $punDesignDir = dirName(__FILE__) . '/template/wap/' . $punDesignName; $this->template_dir = $punDesignDir . '/tpls/'; $this->compile_dir = $punDesignDir . '/compiled/'; $this->config_dir = $punDesignDir . '/configs/'; $this->cache_dir = $punDesignDir . '/cache/'; //$this->assign('punDesignDir', $root); }} |
Отредактировано tipsun (2012.03.03 08:08)
Можно в самом шаблоне header.tpl указывать: {$smarty.const.PUN_ROOT}{$cssDir}style.css
- где PUN_ROOT задается изначально, в логике.
Отредактировано tipsun (2012.03.03 08:08)
не надо. это работа прослойки.
#112. закомментированное работает, в принципе.
Но у форума есть web и wap версии.
Отредактировано tipsun (2012.03.03 08:08)
Сейчас вот подумал, что условия логики в переменную наверно лучше загонять и только те условия, которые контролируют вывод в шаблоне никуда не денутся.
Начал с header.tpl (еще есть footer.tpl и viewtopic.tpl)
Добавлено спустя 3 минуты 22 секунды: Вот пример:
Загнал сразу в smarty, т.к. скорее всего больше нигде не используется результат выполнения.
Код:
span style="color: #0000BB"><?php// include/pms/wap_header_new_messages.phpif (! $pun_user['is_guest'] && $pun_user['g_pm'] == 1 && $pun_config['o_pms_enabled'] && $pun_user['messages_enable'] == 1) { require_once PUN_ROOT . 'lang/' . $pun_user['language'] . '/pms.php'; // Check for new messages $result_messages = $db->query('SELECT COUNT(1) FROM '.$db->prefix.'messages WHERE showed=0 AND owner='.$pun_user['id']) or error('Unable to check for new messages', __FILE__, __LINE__, $db->error()); $new_msg = $db->fetch_row($result_messages); if ($new_msg[0] > 0) { $smarty->append('conditions', array('count_new_msgs' => $new_msg[0])); } // Check if the inbox is full $result = $db->query('SELECT COUNT(1) FROM '.$db->prefix.'messages WHERE owner='.$pun_user['id']) or error('Unable to test if the message-box is full', __FILE__, __LINE__, $db->error()); $count = $db->fetch_row($result); if ($count[0] >= $pun_user['g_pm_limit']) { $smarty->append('conditions', array('full_inbox' => true)); }}// tpl {if $conditions.count_new_msgs} <div class="info"> <a href="message_list.php"> {$lang_pms.$New_messages} ({$conditions.count_new_msgs}) </a> </div> {/if} |
Отредактировано tipsun (2012.03.03 20:08)
ну, тут логика отображения идет, а она должна быть в шаблоне. хотя, тут не принципиально. как проще, так и лучше.
Не могу справиться.
Код:
span style="color: #0000BB"><?php // Display the "Jump to" drop list if ($pun_config['o_quickjump'] == 1) { // Load cached quickjump // included quickjump @include PUN_ROOT . 'cache/cache_wap_quickjump_' . $forum_id . '.php'; if (!defined('PUN_QJ_LOADED')) { include PUN_ROOT . 'include/cache.php'; generate_wap_quickjump_cache($forum_id); include PUN_ROOT.'cache/cache_wap_quickjump_' . $forum_id . '.php'; } } |
.
.
Добавлено спустя 4 минуты 20 секунд: Быстрый переход по форумам.
Отредактировано tipsun (2012.03.03 21:09)
Оказывается $forum_id это в файле viewtopic.php есть $id
Добавлено спустя 5 минут 45 секунд: .
.
Короче. Чет не получается аккуратно в шаблоне разместить. Вот логический костыль
wap/footer.phpКод:
span style="color: #0000BB"><?php if (! defined('PUN') or ! defined('PUN_ROOT')) exit();if ($pun_config['o_quickjump'] == 1) { // Load cached quickjump // included quickjump ob_start(); @include PUN_ROOT . 'cache/cache_wap_quickjump_' . $id . '.php'; ob_end_clean(); if (! defined('PUN_QJ_LOADED')) { include PUN_ROOT . 'include/cache.php'; generate_wap_quickjump_cache($id); //include PUN_ROOT.'cache/cache_wap_quickjump_' . $forum_id . '.php'; }} |
.
.
footer.tplКод:
span style="color: #0000BB"><?php{if $pun_config.o_quickjump == 1 and $basename == 'viewforum.php' || $basename == 'viewtopic.php'} {fetch file="{$smarty.const.PUN_ROOT}cache/cache_wap_quickjump_{$forum_id}.php"}{/if} |
Отредактировано tipsun (2012.03.03 21:09)
Код:
span style="color: #0000BB"><?php {* Дополнительные ссылки // Are there any additional navlinks we should insert into the array before imploding it? if ($pun_config['o_additional_navlinks']) { if (preg_match_all('#([0-9]+)\s*=\s*(.*?)\n#s', $pun_config['o_additional_navlinks'], $extra_links)) { // Insert any additional links into the $links array (at the correct index) for ($i = 0, $all = sizeof($extra_links[1]); $i < $all; ++$i) { if (preg_match('!<a[^>]+href="?\'?([^ "\'>]+)"?\'?[^>]*>([^<>]*?)</a>!is', $extra_links[2][$i], $row)) { array_splice($out, $extra_links[1][$i], 0, array('<option value="' . $row[1] . '">' . $row[2] . '</option>')); } } } } *} |
пойдет, по любому главное вынести слой отображения, а вылизывать потом будем.
Сейчас viewforum.tpl буду собирать.
Добавлено спустя 1 минуту 7 секунд: Вроде интимных мест нет, но заросли еще те.
Мозайка, епт! 
Код:
span style="color: #0000BB"><?php{include file='header.tpl'}{* Навигация: Главная / Форум / Тема *}<div class="inbox"> <a href="index.php">{$lang_common.Index}</a> » {$cur_forum.forum_name|escape}</div>{assign var='date_format' value='%d/%m/%y %H:%I:%S'}{assign var='Post_topic' value='Post topic'}{assign var='Empty_forum' value='Empty forum'}{assign var='Closed_icon_m' value='Closed icon_m'}{assign var='j' value='false'}{foreach from=$topics item=cur_topic}<div class="{if ($j = ! $j)}msg{else}msg2{/if}">{* +SUBJECT *}<strong>{if $cur_topic.moved_to} {$lang_forum.Moved_m}{elseif $cur_topic.closed} {$lang_common.$Closed_icon_m}{/if} {if $pun_config.poll_enabled == 1 && $cur_topic.has_poll} {$lang_forum.poll_m}{/if}{if $cur_topic.sticky == 1} {$lang_forum.Sticky_m}{/if}</strong><a href="viewtopic.php?id={$cur_topic.moved_to|default:$cur_topic.id}">{$cur_topic.subject|escape}</a> {$lang_common.by} {$cur_topic.poster|escape}{* -SUBJECT *}{if ! $cur_topic.moved_to} ({$cur_topic.num_replies}/{$cur_topic.num_views}){$icon_new_text}<br/><span class="sub">» <a href="viewtopic.php?pid={$cur_topic.last_post_id}#p{$cur_topic.last_post_id}">{$cur_topic.last_post|date_format:$date_format}</a> {$lang_common.by} {$cur_topic.last_poster|escape};</span>{/if}</div>{foreachelse}<div class="in">{$lang_forum.$Empty_forum}</div>{/foreach}<div class="con">{$paging_links}</div>{if (! $cur_forum.post_topics && $pun_user.g_post_topics == 1) || $cur_forum.post_topics == 1 || $is_admmod}<div class="go_to"> <a class="but" href="post.php?fid={$id}">{$lang_forum.$Post_topic}</a></div>{/if}{include file='footer.tpl'} |
Отредактировано tipsun (2012.03.04 12:12)
Это не все, прилично еще осталось.
Отредактировано tipsun (2012.03.04 12:12)
Вроде тоже все.
Ну на 100% не уверен, может чего пропустил.
Вроде как с иконками лишнее там.
Код:
span style="color: #0000BB"><?php $icon_text = $lang_common['Normal icon']; // используется $item_status = ''; // нет $icon_type = 'icon'; // нет{include file='header.tpl'}{* Навигация: Главная / Форум *}<div class="inbox"> <a href="index.php">{$lang_common.Index}</a> » {$cur_forum.forum_name|escape}</div>{assign var='date_format' value='%d/%m/%y %H:%I:%S'}{assign var='Post_topic' value='Post topic'}{assign var='Empty_forum' value='Empty forum'}{assign var='Closed_icon_m' value='Closed icon_m'}{assign var='New_icon_m' value='New icon_m'}{assign var='Normal_icon' value='Normal icon'}{assign var='j' value='false'}{foreach from=$topics item=cur_topic}<div class="{if ($j = ! $j)}msg{else}msg2{/if}">{* +SUBJECT *}<strong>{if $cur_topic.moved_to} {$lang_forum.Moved_m}{elseif $cur_topic.closed} {$lang_common.$Closed_icon_m}{else} {$lang_common.$Normal_icon}{/if} {if $pun_config.poll_enabled == 1 && $cur_topic.has_poll} {$lang_forum.poll_m}{/if}{if $cur_topic.sticky == 1} {$lang_forum.Sticky_m}{/if}</strong>{* // Should we display the dot or not? :) *}{if ! $pun_user.is_guest && $pun_config.o_show_dot == 1 and $cur_topic.has_posted == $pun_user.id}<strong>·</strong>{/if}<a href="viewtopic.php?id={$cur_topic.moved_to|default:$cur_topic.id}">{if $pun_config.o_censoring == 1} {censor_words($cur_topic.subject)|escape}{else} {$cur_topic.subject|escape}{/if}</a>{* assign var='num_pages_topic' value=ceil(($cur_topic.num_replies + 1) / $pun_user.disp_posts) *}{*/*// If there are topics in this forum.if ($db->num_rows($result)) { while ($cur_topic = $db->fetch_assoc($result)) { $cur_topic['num_pages_topic'] = ceil(($cur_topic['num_replies'] + 1) / $pun_user['disp_posts']); $topics[] = $cur_topic; }}*/*}{if $cur_topic.num_pages_topic > 1}[{paginate($cur_topic.num_pages_topic, -1, "viewtopic.php?id={$cur_topic.id}")}]{/if} {$lang_common.by} {$cur_topic.poster|escape}{* -SUBJECT *}{if ! $cur_topic.moved_to} ({$cur_topic.num_replies}/{$cur_topic.num_views}){* ! $cur_topic.moved_to &&*}{if ! $pun_user.is_guest && $cur_topic.last_poster != $pun_user.username && ! is_reading($cur_topic.log_time, $cur_topic.last_post) && $cur_topic.last_post > $cur_topic.mark_read && ($cur_topic.last_post > $pun_user.last_visit || ($smarty.server.REQUEST_TIME - $cur_topic.last_post < $pun_user.mark_after) )} <span class="red">{$lang_common.$New_icon_m}</span>{/if}<br/><span class="sub">» <a href="viewtopic.php?pid={$cur_topic.last_post_id}#p{$cur_topic.last_post_id}">{$cur_topic.last_post|date_format:$date_format}</a> {$lang_common.by} {$cur_topic.last_poster|escape};</span>{/if}</div>{foreachelse}<div class="in">{$lang_forum.$Empty_forum}</div>{/foreach}<div class="con">{$paging_links}</div>{if (! $cur_forum.post_topics && $pun_user.g_post_topics == 1) || $cur_forum.post_topics == 1 || $is_admmod}<div class="go_to"> <a class="but" href="post.php?fid={$id}">{$lang_forum.$Post_topic}</a></div>{/if}{include file='footer.tpl'} |
Отредактировано tipsun (2012.03.06 13:01)
wap/userlist.php - пока не работает!Код:
span style="color: #0000BB"><?php{assign var='User_search' value='User search'}{assign var='User_find_legend' value='User find legend'}{assign var='User_group' value='User group'}{assign var='All_users' value='All users'}{assign var='Sort_by' value='Sort by'}{assign var='No_of_posts' value='No of posts'}{assign var='Sort_order' value='Sort order'}{assign var='User_search_info' value='User search info'}{assign var='User_list' value='User list'}{assign var='No_hits' value='No hits'}{* Образец показа даты/времени *}{assign var='date_format' value='%d/%m/%y %H:%I:%S'}<div class="con"> <strong>{$lang_search.$User_search}</strong></div><form method="get" action="userlist.php?"><div class="input"><strong>{$lang_ul.$User_find_legend}</strong><br/>{if $pun_user['g_search_users'] == 1} {$lang_common.Username}<br/> <input type="text" name="username" value="{$username|escape}" maxlength="25" /><br/>{/if}{$lang_ul.$User_group}<br/><select name="show_group"><option value="-1"{if $show_group == -1} selected="selected"{/if}>{$lang_ul.$All_users}</option>{foreach from=$groups item=cur_group} <option value="{$cur_group.g_id}"{if $cur_group.g_id == $show_group} selected="selected"{/if}>{$cur_group.g_title|escape}</option>{/if}</select><br/>{$lang_search.$Sort_by}<br/><select name="sort_by"><option value="username"{if $sort_by == 'username'} selected="selected"{/if}>{$lang_common.Username}</option><option value="registered"{if $sort_by == 'registered'} selected="selected"{/if}>{$lang_common.Registered}</option>{if $show_post_count}<option value="num_posts"{if $sort_by == 'num_posts'} selected="selected"{/if}>{$lang_ul$No_of_posts}</option>{/if}</select><br/>{$lang_search.$Sort_order}<br/><select name="sort_dir"><option value="ASC"{if $sort_dir == 'ASC'} selected="selected"{/if}>{$lang_search.Ascending}</option><option value="DESC"{if $sort_dir == 'DESC'} selected="selected"{/if}>{$lang_search.Descending}</option></select></div><div class="input2">{$lang_ul.$User_search_info}</div><div class="go_to"> <input type="submit" name="search" value="{$lang_common.Submit}" accesskey="s" /></div></form><div class="con"><strong>{$lang_common.$User_list}</strong></div><div class="navlinks">{$lang_common.Username}{if $show_post_count} | {$lang_common.Posts}{/if} | {$lang_common.Title} | {$lang_common.Registered}</div>{foreach from=$users item=user_data}<div class="{if $j = ! $j}in{else}in2{/if}"><strong><a href="profile.php?id={$user_data.id}">{$user_data.username|escape}</a></strong> {if $show_post_count}[{$user_data.num_posts}]{/if}{$user_title_field} ({$user_data.registered|date_format:$date_format})</div>{foreachelse}<div class="msg">{$lang_search.$No_hits}</div>{/foreach}<div class="con">{$paging_links}</div> |
Отредактировано tipsun (2012.03.07 21:09)
Line 198: include/cache.php
Получается ноги из wap/footer.php - который я сам делал
Добавлено спустя 3 минуты 55 секунд: Код:
span style="color: #0000BB"><?php if (! defined('PUN') or ! defined('PUN_ROOT')) exit();//if ($pun_config['o_quickjump'] == 1) {//if ('viewtopic.php' == $basename and $pun_config['o_quickjump'] == 1) {if ($pun_config['o_quickjump'] == 1 and ('viewtopic.php' == $basename or 'viewforum.php' == $basename)) { // Load cached quickjump // included quickjump ob_start(); @include PUN_ROOT . 'cache/cache_wap_quickjump_' . $id . '.php'; ob_end_clean(); if (! defined('PUN_QJ_LOADED')) { include PUN_ROOT . 'include/cache.php'; generate_wap_quickjump_cache($id); //include PUN_ROOT.'cache/cache_wap_quickjump_' . $forum_id . '.php'; }} |
Отредактировано tipsun (2012.03.08 05:05)
Из-за одной точки не работал шаблон.

Сейчас вроде в шаблоне нет ошибок.
А вот смарти чет при assign не отображает шаблон.
Отредактировано tipsun (2012.03.08 06:06)
Исправил.
Наконец работает.
Сейчас занесу необходимые переменные в $smarty.
Получите и распишитесь

Код:
span style="color: #0000BB"><?php{include file='header.tpl'}{* Образец показа даты/времени *}{assign var='date_format' value='%d/%m/%y %H:%I:%S'}{assign var='User_search' value='User search'}{assign var='User_find_legend' value='User find legend'}{assign var='User_group' value='User group'}{assign var='All_users' value='All users'}{assign var='Sort_by' value='Sort by'}{assign var='No_of_posts' value='No of posts'}{assign var='Sort_order' value='Sort order'}{assign var='User_search_info' value='User search info'}{assign var='User_list' value='User list'}{assign var='No_hits' value='No hits'}<div class="con"> <strong>{$lang_search.$User_search}</strong></div><form method="get" action="userlist.php?"><div class="input"><strong>{$lang_ul.$User_find_legend}</strong><br/>{if $pun_user.g_search_users == 1} {$lang_common.Username}<br/> <input type="text" name="username" value="{$username|escape}" maxlength="25" /><br/>{/if}{$lang_ul.$User_group}<br/><select name="show_group"><option value="-1"{if $show_group == -1} selected="selected"{/if}>{$lang_ul.$All_users}</option>{foreach from=$groups item=cur_group} <option value="{$cur_group.g_id}"{if $cur_group.g_id == $show_group} selected="selected"{/if}>{$cur_group.g_title|escape}</option>{/foreach}</select><br/>{$lang_search.$Sort_by}<br/><select name="sort_by"><option value="username"{if $sort_by == 'username'} selected="selected"{/if}>{$lang_common.Username}</option><option value="registered"{if $sort_by == 'registered'} selected="selected"{/if}>{$lang_common.Registered}</option>{if $show_post_count}<option value="num_posts"{if $sort_by == 'num_posts'} selected="selected"{/if}>{$lang_ul.$No_of_posts}</option>{/if}</select><br/>{$lang_search.$Sort_order}<br/><select name="sort_dir"><option value="ASC"{if $sort_dir == 'ASC'} selected="selected"{/if}>{$lang_search.Ascending}</option><option value="DESC"{if $sort_dir == 'DESC'} selected="selected"{/if}>{$lang_search.Descending}</option></select></div><div class="input2">{$lang_ul.$User_search_info}</div><div class="go_to"> <input type="submit" name="search" value="{$lang_common.Submit}" accesskey="s" /></div></form><div class="con"><strong>{$lang_common.$User_list}</strong></div><div class="navlinks">{$lang_common.Username}{if $show_post_count} | {$lang_common.Posts}{/if} | {$lang_common.Title} | {$lang_common.Registered}</div>{foreach from=$users item=user_data}<div class="{if $j = ! $j}in{else}in2{/if}"><strong><a href="profile.php?id={$user_data.id}">{$user_data.username|escape}</a></strong> {if $show_post_count}[{$user_data.num_posts}]{/if}{get_title($user_data)} ({$user_data.registered|date_format:$date_format})</div>{foreachelse}<div class="msg">{$lang_search.$No_hits}</div>{/foreach}<div class="con">{$paging_links}</div>{include file='footer.tpl'} |
Добавлено спустя 1 минуту 3 секунды: быдлоШаблон. В смарти вроде есть спец. функции для работы с select и прочее.
Добавлено спустя 6 минут 17 секунд: get_title($cur_post) в wap/viewtopic.php оказывается показывает ранг пользователя. Admin/Mod/Member etc.
Хоть он нигде не выводился, я прикрутил суда.
Код:
span style="color: #0000BB"><?php{* Должность *}{get_title($cur_post)}<br/>{* Когда было размещено сообщение *}{$cur_post.posted|date_format:$date_format}<br/> |
Отредактировано tipsun (2012.03.08 08:08)
Это был шаблон для файла: wap/userlist.php
Отредактировано tipsun (2012.03.08 08:08)
блин. на гитхаб что ли переезжать. охота уже в целом на код посмотреть.
Загадками "говоришь"

Или я не выспался
Добавлено спустя 4 минуты : быдлоКод, он и на шаблонах быдлоКод

Я еще от себя добавил

Ну в принципе легче будет разобраться потом, мне кажется.
Добавлено спустя 5 минут 55 секунд: Я могу свою папку punbb.mod/www/ упаковать. Так сможешь посмотреть.
Отредактировано tipsun (2012.03.08 09:09)
а что это за комментарий {* Дополнительные ссылки в футере?
Сейчас посмотрю.
Добавлено спустя 3 минуты 51 секунду: Вот откуда ноги растут.
Еще есть тот же кусок и в другой функции
generate_wap_1_navlinks()include/functions.php#336
Отредактировано tipsun (2012.03.08 14:02)
это я понимаю, я не понимаю что оно делает в шаблоне)
Хороший вопрос
Добавлено спустя 2 минуты 33 секунды: Самый страшный файл, видимо wap/profile.php - 101 kB (1.6k строк).
Отредактировано tipsun (2012.03.08 18:06)
В принципе ошибки можно наверно так отпустить:
Код:
span style="color: #0000BB"><?php// ошибка$smaty->assign('errors', $errors);$smarty->display('template.tpl');// exit();//+ template.tpl{include file='errors.tpl'}{* Etc. *}//- template.tpl |
Отредактировано tipsun (2012.03.09 08:08)
Не знаю почему, но я думал про exit(); ошибки.
не понимаю, - exit - языковая конструкция, а не ошибка.
"wap/index.php" потихоньку собираю.
Индексная вроде тоже готова.
Найдите 1 отличие

(оно есть)

Код:
span style="color: #0000BB"><?php{include file='header.tpl'}{assign var='date_format' value='%d/%m/%y %H:%I:%S'}{assign var='Show_new_posts' value='Show new posts'}{assign var='Mark_all_as_read' value='Mark all as read'}{assign var='Empty_board' value='Empty board'}{assign var='Link_separator_m' value='|'}<div class="navlinks"> {if $pun_user.is_guest} <a href="login.php">{$lang_common.Login}</a>{$Link_separator_m}<a href="register.php">{$lang_common.Register}</a> {else} {if $pun_user.g_id > $smarty.const.PUN_MOD} <a href="profile.php?id={$pun_user.id}">{$lang_common.Profile} (<span style="font-weight: bold">{$pun_user.username|escape}</span>)</a> {if $pun_config.o_pms_enabled && $pun_user.g_pm == 1} {$Link_separator_m}<a href="message_list.php">{$lang_pms.Private}</a> {/if} {$Link_separator_m}<a href="login.php?action=out&id={$pun_user.id}&csrf_token=">{$lang_common.Logout}</a> {/if} {if $pun_user.g_id < $smarty.const.PUN_MOD} <a href="{$smarty.const.PUN_ROOT}admin_index.php">{$lang_common.Admin_m}</a> {/if} {/if}</div>{assign var='j' value=false}{assign var='cur_category' value=''}{foreach from=$forums item=cur_forum} {if $cur_forum.cid != $cur_category} {assign var='cur_category' value={$cur_forum.cid}} {* assign var='cat_count' value=($cat_count + 1) *} <div class="cat"> <span class="sp_cat">{$cur_forum.cat_name|escape}</span> </div> {/if} <div class="{if $j = ! $j}in{else}in2{/if}"> {if $cur_forum.redirect_url} <a href="{$cur_forum.redirect_url|escape}">{$cur_forum.forum_name|escape}</a> {else} <a href="viewforum.php?id={$cur_forum.fid}">{$cur_forum.forum_name|escape}</a> ({$cur_forum.num_topics}/{$cur_forum.num_posts}) {/if} {if $cur_forum.last_post} <br/> <span class="sub"> » <a href="viewtopic.php?pid={$cur_forum.last_post_id}#p{$cur_forum.last_post_id}">{$cur_forum.subject|escape}</a> ({$cur_forum.last_post|date_format:$date_format} {$lang_common.by} {$cur_forum.last_poster|escape}) </span> {/if} </div>{foreachelse}<div class="in">{$lang_index.$Empty_board}</div>{/foreach}{if ! $pun_user.is_guest}<div class="go_to"><a class="but" href="search.php?action=show_new">{$lang_common.$Show_new_posts}</a><a class="but" href="misc.php?action=markread">{$lang_common.$Mark_all_as_read}</a></div>{/if}{assign var='No_of_users' value='No of users'}{assign var='No_of_topics' value='No of topics'}{assign var='No_of_posts' value='No of posts'}{assign var='Users_online' value='Users online'}{assign var='Guests_online' value='Guests online'}<div class="incqbox">{$lang_index.$No_of_users}: {$stats.total_users}<br/>{$lang_index.$No_of_topics}: {$stats.total_topics}<br/>{$lang_index.$No_of_posts}: {$stats.total_posts}<br/>{if $pun_config.o_users_online == 1}{$lang_index.$Users_online}: {$num_users|default:'0'}<br/>{$lang_index.$Guests_online}: {$num_guests|default:'0'}{if $num_users}</div><div class="act">{$lang_index.Online}:{foreach from=$users item=pun_user_online}<a href="profile.php?id={$pun_user_online.user_id}">{$pun_user_online.ident|escape}</a>{/foreach}{/if}{/if}</div>{include file='footer.tpl'} |
Отредактировано tipsun (2012.03.12 08:08)
wap/post.php
Код:
span style="color: #0000BB"><?php{include file='header.tpl'}<div class="inbox"><a href="index.php">{$lang_common.Index}</a> »{if $tip}<a href="viewforum.php?id={$cur_posting.id}">{$cur_posting.forum_name|escape}</a>{elseif $fid}{$cur_posting.forum_name|escape}{/if}{if isset($cur_posting.subject)}» {$cur_posting.subject|escape}{/if}</div>{if $errors}{assign var='Post_errors' value='Post errors'}<div class="red">{$lang_post.$Post_errors}</div><div class="msg">{foreach from=$errors item=cur_error}» {$cur_error}<br/>{/foreach}</div>{elseif isset($smarty.post.preview)}{assign var='Post_preview' value='Post preview'}<div class="info">{$lang_post.$Post_preview}</div><div class="msg">{* parse_message($message, $hide_smilies) *}</div>{/if}{assign var='Post_a_reply' value='Post a reply'}{assign var='Post_new_topic' value='Post new topic'}<div class="con">{if $tid} {$lang_post.$Post_a_reply}{elseif $fid} {$lang_post.$Post_new_topic}{/if}</div>{if $tid}<form method="post" action="post.php?action=post&tid={$tid}" {if $file_limit}enctype="multipart/form-data"{/if}>{elseif $fid}<form method="post" action="post.php?action=post&fid={$fid}" enctype="multipart/form-data">{/if}<div class="input">{*if ($pun_config['poll_enabled'] == 1 && $fid) { if (!$_GET['poll']) { include PUN_ROOT.'lang/'.$pun_user['language'].'/poll.php'; echo '<a href="post.php?fid='.$fid.'&poll=1">'.$lang_poll['poll'].'</a><br/>'; } else { include_once PUN_ROOT.'include/poll/poll.inc.php'; $Poll->wap_showContainer(); $cur_index = 8; }}*}<input type="hidden" name="form_sent" value="1" /><input type="hidden" name="form_user" value="{$pun_user.username|escape|default:'Guest'}" />{if $pun_user.is_guest} {assign var='Guest_name' value='Guest name'} <strong>{$lang_post.$Guest_name}</strong><br /> <input type="text" name="req_username" value="{$username|escape}" tabindex="{assign var='cur_index' value=$cur_index+1}" /><br /> {if $pun_config.p_force_guest_email == 1}<strong>{$lang_common.E-mail}</strong>{else}{$lang_common.E-mail}{/if}<br /> <input type="text" name="{if $pun_config.p_force_guest_email == 1}req_email{else}email{/if}" value="{$email|escape}" tabindex="{assign var='cur_index' value=$cur_index+1}" /><br />{/if}{if $fid} <strong>{$lang_common.Subject}</strong><br /> <input type="text" name="req_subject" value="{$subject|escape}" maxlength="70" tabindex="{assign var='cur_index' value=$cur_index+1}" /><br />{/if}<textarea name="req_message" rows="4" cols="24" tabindex="{assign var='cur_index' value=$cur_index+1}">{if $smarty.post.req_message}{$message|escape}{elseif $quote}{$quote}{/if}</textarea><br /><a href="help.php?id=3">{$lang_common.Smilies}</a>{if $pun_config.o_smilies == 1}<span class="green">{$lang_common.on_m}</span>{else}<span class="grey">{$lang_common.off_m}</span>{/if}<a href="help.php?id=1">{$lang_common.BBCode}</a>{if $pun_config.p_message_bbcode == 1}<span class="green">{$lang_common.on_m}</span>{else}<span class="grey">{$lang_common.off_m}</span>{/if}{assign var='img_tag' value='img tag'}<a href="help.php?id=4">{$lang_common.$img_tag}</a>{if $pun_config.p_message_img_tag == 1}<span class="green">{$lang_common.on_m}</span>{else}<span class="grey">{$lang_common.off_m}</span>{/if}</div><div class="input2">{if $pun_user.g_post_replies == 2}<img src="{$pun_config.o_base_url}/include/captcha/captcha.php?{session_name()}={session_id()}" alt="" /><br />{assign var='Image_text' value='Image text'}{$lang_post.$Image_text}<br /><input type="text" name="req_image_" size="16" maxlength="16" /><br />{/if}{assign var='num_to_upload' value=min($file_limit, 20)}{if $can_upload && $num_to_upload > 0} {$lang_fu.Attachments}<br/> {include file='{$smarty.const.PUN_ROOT}include/attach/wap_post_input.php'}{/if}{assign var='Hide_smilies' value='Hide smilies'}{assign var='Merge_posts' value='Merge posts'}{if ! $pun_user.is_guest} {if $pun_config.o_smilies == 1} <input type="checkbox" name="hide_smilies" value="1" tabindex="{assign var='cur_index' value=$cur_index+1}" {if isset($smarty.post.hide_smilies)}checked="checked"{/if} />{$lang_post.$Hide_smilies}<br/> {/if} {if $is_admmod} <input type="checkbox" name="merge" value="1" checked="checked" />{$lang_post.$Merge_posts}<br/> {/if} {if $pun_config.o_subscriptions == 1} <input type="checkbox" name="subscribe" value="1" tabindex="{assign var='cur_index' value=$cur_index+1}" {if isset($smarty.post.subscribe)}checked="checked"{/if} />{$lang_post.Subscribe}<br/> {/if}{elseif $pun_config.o_smilies == 1}<input type="checkbox" name="hide_smilies" value="1" tabindex="{assign var='cur_index' value=$cur_index+1}" {if isset($smary.post.hide_smilies)}checked="checked"{/if} />{$lang_post.$Hide_smilies}{/if}</div><div class="go_to"><input type="hidden" name="form_t" value="{$smarty.server.REQUEST_TIME}" /><input type="submit" name="submit" value="{$lang_common.Submit}" tabindex="{assign var='cur_index' value=$cur_index+1}" accesskey="s" /><input type="submit" name="preview" value="{$lang_post.Preview}" tabindex="{assign var='cur_index' value=$cur_index+1}" accesskey="p" /></div></form>{include file='footer.tpl'} |
Отредактировано tipsun (2012.03.19 13:01)
wap/edit.php
Код:
span style="color: #0000BB"><?php<div class="inbox"><a href="index.php">{$lang_common.Index}</a> » <a href="viewforum.php?id={$cur_post.fid}">{$cur_post.forum_name|escape}</a> » {$cur_post.subject|escape}</div>{if $errors}<div class="red">{assign var='Post_errors' value='Post errors'}{$lang_post.$Post_errors}</div>{assign var='Post_errors_info' value='Post errors info'}<div class="msg">{$lang_post.$Post_errors_info}{foreach from=$errors item=cur_error}» {$cur_error}<br/>{/foreach}</div>{elseif $smarty.post.preview}{include file='{$smarty.const.PUN_ROOT}include/parser.php'}{assign var='Post_preview' value='Post preview'}<div class="info">{$lang_post.$Post_preview}</div><div class="msg">{* parse_message($message, $hide_smilies) *}</div>{/if}{assign var='Edit_post' value='Edit post'}<div class="con">{$lang_post.$Edit_post}</div><form method="post" action="edit.php?id={$id}&action=edit" enctype="multipart/form-data"><div class="input"><input type="hidden" name="form_sent" value="1" />{if $can_edit_subject}{$lang_common.Subject}<br/><input type="text" name="req_subject" tabindex="{assign var='cur_index' value=$cur_index+1}" value="{{$smarty.post.req_subject|define:$cur_post.subject}|escape}" /><br/><!-- /label -->{/if}{* include file='{$smarty.const.PUN_ROOT}include/attach/fetch.php' *}{$lang_common.Message}:<br/><textarea name="req_message" rows="4" cols="24" tabindex="{assign var='cur_index' value=$cur_index+1}">{{$message|define:$cur_post.message}|escape}</textarea><br/><a href="help.php?id=3">{$lang_common.Smilies}</a>{if $pun_config.o_smilies == 1}<span class="green">{$lang_common.on_m}</span>;{else}<span class="grey">{$lang_common.off_m}</span>;{/if}<a href="help.php?id=1">{$lang_common.BBCode}</a>{if $pun_config.p_message_bbcode == 1}<span class="green">{$lang_common.on_m}</span>;{else}<span class="grey">{$lang_common.off_m}</span>;{/if}{assign var='img_tag' value='img tag'}<a href="help.php?id=4">{$lang_common.$img_tag}</a>{if $pun_config.p_message_img_tag == 1}<span class="green">{$lang_common.on_m}</span>{else}<span class="grey">{$lang_common.off_m}</span>;{/if}<br/>{*$num_to_upload = $file_limit;$num_to_upload = min($num_to_upload, 20);if ($uploaded_to_post || ($can_upload && $num_to_upload > 0)) { //Attachments include PUN_ROOT.'include/attach/wap_view_attachments.php'; if ($can_upload && $num_to_upload > 0) { echo '</div><div class="input2">'.$lang_fu['Choose a file'].'<br/>'; } include PUN_ROOT.'include/attach/wap_post_input.php';}*}{if $pun_config.o_smilies == 1}{assign var='Hide_smilies' value='Hide smilies'}<input type="checkbox" name="hide_smilies" value="1" {if isset($smarty.post.hide_smilies) || $cur_post.hide_smilies == 1}checked="checked"{/if} tabindex="{assign var='cur_index' value=$cur_index+1}" /> {$lang_post.$Hide_smilies}<br/>{/if}{if $is_admmod}<input type="checkbox" name="silent" value="1" tabindex="{assign var='cur_index' value=$cur_index+1}" {if (isset($smarty.post.form_sent) && isset($smarty.post.silent)) || ! isset($smarty.post.form_sent)}checked="checked"{/if} /> {$lang_post.$Silent_edit}<br/>{/if}</div><div class="go_to"><input type="submit" name="submit" value="{$lang_common.Submit}" tabindex="{assign var='cur_index' value=$cur_index+1}" accesskey="s" /><input type="submit" name="preview" value="{$lang_post.Preview}" tabindex="{assign var='cur_index' value=$cur_index+1}" accesskey="p" /></div></form> |
tipsun написал:Индексная вроде тоже готова.
Найдите
1 отличие

(оно есть)
1. Нет фоновых изображений
2. Добавлена ссылка "
RSS"
3. Перед ссылкой "
Админ панель" отсутствуют 2 ссылки, а после - еще одна.
4. Жоская генерация. (
1331538677.555 s)
На код приятно посмотреть. Круууть
да, шаблонизация рулит. код намного чище
LEXIN,

Еще есть, где активных показывает форум, там еще строка с ссылками. Это было поле с выбором, оно было выше.
- - - -
Еще я пропускал интимные места, может где забыл "htmlSpecialChars()"/"|escape"
Можно было все в массив занести, и получилось бы что мы 1 раз заносим все переменные, т.е.
Код:
span style="color: #0000BB"><?php$allVars = array($title, $users, $trololo);$smarty->assign($allVars); |
Отредактировано tipsun (2012.03.27 07:07)
А как с кешированием дела обстоят? Будет функция кеширования шаблона и очистки кеша?
И очень хочется узнать, какие-нибудь еще "плюшки" в задумке имеются?
Вот оптимизация запросов к БД - отлично.
LEXIN, такими вещами нужно заниматься уже после перевода форума на шаблонную структуру.
Взялся за moderate.php
Решил разбивать на moderate.show_delete_topic.tpl; moderate.delete_topic.tpl; итд
Отредактировано tipsun (2012.04.01 14:02)
сколько еще файлов не переведенных на шаблонизатор примерно?
Ух много. Сейчас посмотрю.
Добавлено спустя 2 минуты 52 секунды: Легче сказать, сколько переведено:
viewtopic.tpl
viewforum.tpl
userlist.tpl
post.tpl
index.tpl
header.tpl
footer.tpl
edit.tpl
+
moderate
- show_delete_topic.tpl
- move_topic.tpl
- delete_topic.tpl
Отредактировано tipsun (2012.04.01 15:03)
Как надоел этот срач.

Пока время есть заставляю себя "копать".
Добавлено спустя 5 минут 99 секунд: Вроде как viewforum кусок такой был, он опять попался.
Может просто получится все скопировать...
Отредактировано tipsun (2012.04.02 17:05)
я тебя предупреждал))
поэтому я и не брался, т.к. трудоемко очень)
Да, еще тестить надо. Уф.
Ну по клавишам тыкать, не мешки тоскать. Пофиг.
Тем более вроде как viewforum.tpl вроде как с куском из moderate совпадает, почти.
А viewforum.tpl я сделал четко.
Отредактировано tipsun (2012.04.02 17:05)
Почему-то не могу назначить пользователя модером, вроде все форумы отметил.
P.S. хочу наглядно редачить файл: moderate.php (Шаблоны есть)
В веб-версии нет ссылки "модерировать форум", как у Админа.
Отредактировано tipsun (2012.04.07 07:07)
Обновился.
Добавлено спустя 6 минут 3 секунды: Проблема с инклудом файла из кеша.
Код:
span style="color: #0000BB"><?php{if $pun_config.o_quickjump == 1 and $basename == 'viewforum.php' || $basename == 'viewtopic.php'} {fetch file="{$smarty.const.PUN_ROOT}cache/cache_wap_quickjump_{$forum_id}.php"}{/if} |
.
В конце остается это:
'; ?>
Отредактировано tipsun (2012.04.07 10:10)
Вроде синкаксических ошибок в новом шаблоне moderate.tpl нет.
Отредактировано tipsun (2012.04.07 11:11)
moderate.tpl
Код:
span style="color: #0000BB"><?php{include file='header.tpl'}{* Навигация: Главная / Форум / Тема *}<div class="inbox"> <a href="index.php">{$lang_common.Index}</a> » {$cur_forum.forum_name|escape}</div><form method="post" action="moderate.php?fid={$fid}">{assign var='date_format' value='%d/%m/%y %H:%I:%S'}{assign var='Post_topic' value='Post topic'}{assign var='Empty_forum' value='Empty forum'}{assign var='Closed_icon_m' value='Closed icon_m'}{assign var='New_icon_m' value='New icon_m'}{assign var='Normal_icon' value='Normal icon'}{assign var='j' value='false'}{foreach from=$topics item=cur_topic}<div class="{if ($j = ! $j)}msg{else}msg2{/if}"><input type="checkbox" name="topics[{$cur_topic.id}]" value="1" />{* +SUBJECT *}<strong>{if $cur_topic.moved_to} {$lang_forum.Moved_m}{elseif $cur_topic.closed} {$lang_common.$Closed_icon_m}{else} {$lang_common.$Normal_icon}{/if} {if $pun_config.poll_enabled == 1 && $cur_topic.has_poll} {$lang_forum.poll_m}{/if}{if $cur_topic.sticky == 1} {$lang_forum.Sticky_m}{/if}</strong>{* // Should we display the dot or not? :) *}{if ! $pun_user.is_guest && $pun_config.o_show_dot == 1 and $cur_topic.has_posted == $pun_user.id}<strong>·</strong>{/if}<a href="viewtopic.php?id={$cur_topic.moved_to|default:$cur_topic.id}">{if $pun_config.o_censoring == 1} {censor_words($cur_topic.subject)|escape}{else} {$cur_topic.subject|escape}{/if}</a>{if $cur_topic.num_pages_topic > 1}[{paginate($cur_topic.num_pages_topic, -1, "viewtopic.php?id={$cur_topic.id}")}]{/if} {$lang_common.by} {$cur_topic.poster|escape}{* -SUBJECT *}{if ! $cur_topic.moved_to} ({$cur_topic.num_replies}/{$cur_topic.num_views}){* ! $cur_topic.moved_to &&*}{if $cur_topic.last_post > $pun_user.last_visit} <span class="red">{$lang_common.$New_icon_m}</span>{/if}<br/><span class="sub">» <a href="viewtopic.php?pid={$cur_topic.last_post_id}#p{$cur_topic.last_post_id}">{$cur_topic.last_post|date_format:$date_format}</a> {$lang_common.by} {$cur_topic.last_poster|escape};</span>{/if}</div>{foreachelse}{assign var='button_status' value='1'}<div class="in">{$lang_forum.$Empty_forum}</div>{/foreach}<div class="con">{$paging_links}</div>{if (! $cur_forum.post_topics && $pun_user.g_post_topics == 1) || $cur_forum.post_topics == 1 || $is_admmod}<div class="go_to"><input type="submit" name="move_topics" value="{$lang_misc.Move}" {if $button_status}disabled="disabled"{/if} /><input type="submit" name="delete_topics" value="{$lang_misc.Delete}" {if $button_status}disabled="disabled"{/if} /><input type="submit" name="open" value="{$lang_misc.Open}" {if $button_status}disabled="disabled"{/if} /><input type="submit" name="close" value="{$lang_misc.Close}" {if $button_status}disabled="disabled"{/if} /></div></form>{/if}{include file='footer.tpl'} |
Отредактировано tipsun (2012.04.07 15:03)
эээ, так через fetch не выйдет. думаю, нужно сам кэш генерить не в виде php файла, а статичной html-ки уже.
Тогда
сюда надо смотреть.
Добавлено спустя 6 минут 32 секунды: А, у меня оказывается уже все сделано. Просто файл 1 раз сгенерился и остался.
Вот вроде:
Код:
span style="color: #0000BB"><?php//// Generate WAP quickjump cache PHP scripts//function generate_wap_quickjump_cache($group_id = false){ global $db, $lang_common, $pun_config; // If a group_id was supplied, we generate the quickjump cache for that group only if ($group_id !== false) { $groups[0] = $group_id; } else { // A group_id was now supplied, so we generate the quickjump cache for all groups $result = $db->query('SELECT g_id FROM ' . $db->prefix . 'groups') or error('Unable to fetch user group list', __FILE__, __LINE__, $db->error()); $num_groups = $db->num_rows($result); for ($i = 0; $i < $num_groups; ++$i) { $groups[] = $db->result($result, $i); } } // Loop through the groups in $groups and output the cache for each of them while (list(, $group_id) = @each($groups)) { // Output wap quickjump as PHP code $fh = @fopen(PUN_ROOT . 'cache/cache_wap_quickjump_' . $group_id . '.php', 'wb'); if (! $fh) { error('Unable to write quickjump cache file to cache directory. Please make sure PHP has write access to the directory "cache"', __FILE__, __LINE__); }//тут..............v....................................................................v $output = '<?php if (! defined(\'PUN\')) exit(); define(\'PUN_QJ_LOADED\', 1); ?>' . '<form id="qjump" method="get" action="viewforum.php">' . '<div class="inbox">' . '<label>' . $lang_common['Jump to'] . '<br />' . '<select name="id" onchange="window.location.href=\\\'' . $pun_config['o_base_url'] . '/wap/viewforum.php?id=\\\'+this.options[this.selectedIndex].value;">'; $result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.redirect_url FROM ' . $db->prefix . 'categories AS c INNER JOIN ' . $db->prefix . 'forums AS f ON c.id=f.cat_id LEFT JOIN ' . $db->prefix . 'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=' . $group_id . ') WHERE fp.read_forum IS NULL OR fp.read_forum=1 ORDER BY c.disp_position, c.id, f.disp_position', true) or error('Unable to fetch category/forum list', __FILE__, __LINE__, $db->error()); $cur_category = 0; while ($cur_forum = $db->fetch_assoc($result)) { // A new category since last iteration? if ($cur_forum['cid'] != $cur_category) { if ($cur_category) { $output .= '</optgroup>'; } $output .= '<optgroup label="' . pun_htmlspecialchars($cur_forum['cat_name']) . '">'; $cur_category = $cur_forum['cid']; } $redirect_tag = ($cur_forum['redirect_url']) ? ' >>>' : ''; $output .= '<option value="' . $cur_forum['fid'] . '"'; if ($group_id == $cur_forum['fid']) { $output .= ' selected="selected"'; } $output .= '>' . pun_htmlspecialchars($cur_forum['forum_name']) . $redirect_tag . '</option>'; } $output .= '</optgroup>' . '</select>' . '<input type="submit" value="' . $lang_common['Go'] . '" accesskey="g" />' . '</label>' . '</div>' . '</form>'; fputs($fh, $output); fclose($fh); }} |
ну так да, метод нужно менять
[Ошибка: этот матюк невозможно отобразить буквами]
Ну никак не работала система cache_quickjump.
И так пробовал и сяк.
Я думаю ну что такое же.
Потом уже потеряв надежду поменял require_once на include и заработало. o(o_O)o
Еще поправил условие.
wap/footer.phpКод:
span style="color: #0000BB"><?php if (! defined('PUN') or ! defined('PUN_ROOT')) exit();//...................................vif ('viewtopic.php' == $basename or 'viewforum.php' == $basename and $pun_config['o_quickjump'] == 1) { // Load cached quickjump // included quickjump ob_start(); @include PUN_ROOT . 'cache/cache_wap_quickjump_' . $id . '.php'; ob_end_clean(); if (! defined('PUN_QJ_LOADED')) { include PUN_ROOT . 'include/quickjump.php'; }} |
Новый файл вроде, я его раньше не замечал.
include/quickjump.phpКод:
span style="color: #0000BB"><?php$group_id = $id;if ($group_id !== false) { $groups[0] = $group_id;}else { // A group_id was now supplied, so we generate the quickjump cache for all groups $result = $db->query('SELECT g_id FROM ' . $db->prefix . 'groups') or error('Unable to fetch user group list', __FILE__, __LINE__, $db->error()); $num_groups = $db->num_rows($result); for ($i = 0; $i < $num_groups; ++$i) { $groups[] = $db->result($result, $i); }}// Loop through the groups in $groups and output the cache for each of themwhile (list(, $group_id) = each($groups)) { // Output wap quickjump as PHP code $fh = fopen(PUN_ROOT . 'cache/cache_wap_quickjump_' . $group_id . '.php', 'wb'); if (! $fh) { error('Unable to write quickjump cache file to cache directory. Please make sure PHP has write access to the directory "cache"', __FILE__, __LINE__); } $output = '<?php if (! defined(\'PUN\')) exit(); define(\'PUN_QJ_LOADED\', 1); ?>' . '<form id="qjump" method="get" action="viewforum.php">' . '<div class="inbox">' . '<label>' . $lang_common['Jump to'] . '<br />' . '<select name="id" onchange="window.location.href=\\\'' . $pun_config['o_base_url'] . '/wap/viewforum.php?id=\\\'+this.options[this.selectedIndex].value;">'; $result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.redirect_url FROM ' . $db->prefix . 'categories AS c INNER JOIN ' . $db->prefix . 'forums AS f ON c.id=f.cat_id LEFT JOIN ' . $db->prefix . 'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=' . $group_id . ') WHERE fp.read_forum IS NULL OR fp.read_forum=1 ORDER BY c.disp_position, c.id, f.disp_position', true) or error('Unable to fetch category/forum list', __FILE__, __LINE__, $db->error()); $cur_category = 0; while ($cur_forum = $db->fetch_assoc($result)) { // A new category since last iteration? if ($cur_forum['cid'] != $cur_category) { if ($cur_category) { $output .= '</optgroup>'; } $output .= '<optgroup label="' . pun_htmlspecialchars($cur_forum['cat_name']) . '">'; $cur_category = $cur_forum['cid']; } $redirect_tag = ($cur_forum['redirect_url']) ? ' >>>' : ''; $output .= '<option value="' . $cur_forum['fid'] . '"'; if ($group_id == $cur_forum['fid']) { $output .= ' selected="selected"'; } $output .= '>' . pun_htmlspecialchars($cur_forum['forum_name']) . $redirect_tag . '</option>'; } $output .= '</optgroup>' . '</select>' . '<input type="submit" value="' . $lang_common['Go'] . '" accesskey="g" />' . '</label>' . '</div>' . '</form>'; fputs($fh, $output); fclose($fh);} |
Отредактировано tipsun (2012.04.10 13:01)
Получается, что require_once при отсутствии файла останавливает работу а include нет?
Отредактировано tipsun (2012.04.10 15:03)
Вывод списка форумов, в которые можно переместить тему, не работает.
Добавлено спустя 1 минуту 1 секунду: Нашел.
Код:
span style="color: #0000BB"><?php while ($forum = $db->fetch_assoc($result)) { //$forums = $forum; $forums[] = $forum; } |
Отредактировано tipsun (2012.04.10 16:04)
Не работают ссылки (админа/модера: переместить, удалить, закрыть, открыть) внизу, в футере, в moderate.php все норм.
Там разграничил exit(); после вывода шаблона.
Добавлено спустя 2 минуты 4 секунды: Т.к. там сразу 2 шаблона выводилось.
Отредактировано tipsun (2012.04.11 09:09)
наверное, нужно бранч сделать для всей этой фичи...
Commit
Commit failed (details follow):
Server sent unexpected return value (405 Method Not Allowed) in response to
MKACTIVITY request for '/svn/!svn/act/ea721f03-b86c-ee4d-93d9-1fd0cd6c2550'
Отредактировано tipsun (2012.04.15 15:03)
url вводи с http
s
Отредактировано Gemorroj (2012.04.15 16:04)
1) У меня скачивает с svn.
2) Удаляю то, что скачалось.
3) Закидываю целиком форум, как ты показал, выделил все, кроме [.svn].
4) Жму на папку smarty [commit]
5) Ошибка выходит, которую я запостил.
Добавлено спустя 1 минуту 56 секунд: Сейчас попробую с http
sДобавлено спустя 4 минуты 8 секунд: Во. Логин и Пароль запросила.
Добавлено спустя 6 минут 9 секунд: Все, сгенерил пароль.
Добавлено спустя 7 минут 30 секунд: Commit...
Отредактировано tipsun (2012.04.15 16:04)
Весит много, надо было смарти-двиг не грузить.
Ну да ладно. Главное грузит.
Отредактировано tipsun (2012.04.15 16:04)
что значит не надо было? а как без него форум работать-то будет?
Залил, все.
Отредактировано tipsun (2012.04.15 16:04)
ок, я кое-чего там тоже уже накомитил тебе. обновляйся теперь переодически.
есть еще такие правила:
1) комментарии к коммитам обязательны. хотябы минимально описывай что менялось в сделанном коммите.
2) различные кэши и кастомные настройки не должны попадать в репозитарий.
Да, увидел.
Показывает как было и как стало
Елки, у меня __DIR__ нет.
И разве нужно для __DIR__ dirName() обработка?
Отредактировано tipsun (2012.04.15 17:05)
а где там __DIR__ ?
для __DIR__ не надо, надо для __FILE__, я затупил где-то?
Добавлено спустя 1 минуту 2 секунды: да, увидел, это я уже на ночь глядя уже торможу.
Опять этот cache quickjump не работает. >_<
Cache-файл не сохраняется.
Отредактировано tipsun (2012.04.16 10:10)
Переменная
$basename не была задана. >_<
Отредактировано tipsun (2012.04.16 11:11)
ты это в каментах пиши в свн-е)
Есть коммент мой там, проверял.

Там в changes есть коммент. Если есть еще куда коммент, то как?
Отредактировано tipsun (2012.04.16 16:04)
Все равно костыльно и наверно можно изящно сделать все при помощи смарти и кеши(а).
Ну по крайней мере мне так кажется.
Отредактировано tipsun (2012.04.16 16:04)
посмотрел коммиты. да все ок, так и пиши.
и еще, нет функции baseName, есть basename.
Хотя там такие же условия будут, просто в шаблоне.

Получается не лучше.
- - - -
basename - ok. Буду знать.
Отредактировано tipsun (2012.04.16 16:04)
Немного наCommitал.
Виден конец кода в файле... profile.php
Отредактировано tipsun (2012.04.30 06:06)
наCommitал.
Недоделан выбор языка. (Забыл че там было).
- - - -
Елки и коммент забыл.
Отредактировано tipsun (2012.05.03 11:11)
Заблудился, где какой шаблон. Вот туман.
Отредактировано tipsun (2012.05.08 07:07)
С языками разобрался.
Commit.
- - - -
БЛЯ!!! Коммент забыл.
Уй, и изменить его целая война.
Отредактировано tipsun (2012.05.08 08:08)
Ы!, эта аватарка меня доведет.
Каждый раз с этой ерундой сталкиваюсь.
Код:
{*$avatar_field |
<a href="profile.php?action=upload_avatar&id={$id}">{$lang_profile.$Change_avatar}</a> | |
{if $img_size = @getimagesize(PUN_ROOT . $pun_config['o_avatars_dir'] . '/' . $id . '.gif')) { |
$avatar_format = 'gif'; |
} else |
if ($img_size = @getimagesize(PUN_ROOT . $pun_config['o_avatars_dir'] . '/' . $id . '.jpg')) { |
$avatar_format = 'jpg'; |
} else |
if ($img_size = @getimagesize(PUN_ROOT . $pun_config['o_avatars_dir'] . '/' . $id . '.png')) { |
$avatar_format = 'png'; |
} else { |
$avatar_field = '<a class="but" href="profile.php?action=upload_avatar&id=' . $id . '">' . $lang_profile['Upload avatar'] . '</a>'; |
} |
|
// Display the delete avatar link? |
if ($img_size) { |
$avatar_field .= ' <a href="profile.php?action=delete_avatar&id=' . $id . '">' . $lang_profile['Delete avatar'] . '</a>'; |
} |
|
</div> |
*} |
Добавлено спустя 4 минуты 32 секунды: А вот готовое решение нашел.
Код:
span style="color: #0000BB"><?php{if $pun_config.o_avatars} {if $user.use_avatar == 1} {if is_file("{$smarty.const.PUN_ROOT}{$pun_config.o_avatars_dir}/{$id}.gif")} <img src="{$smarty.const.PUN_ROOT}{$pun_config.o_avatars_dir}/{$id}.gif" alt="" /> {else} {if is_file("{$smarty.const.PUN_ROOT}{$pun_config.o_avatars_dir}/{$id}.jpg")} <img src="{$smarty.const.PUN_ROOT}{$pun_config.o_avatars_dir}/{$id}.jpg" alt="" /> {else} {if is_file("{$smarty.const.PUN_ROOT}{$pun_config.o_avatars_dir}/{$id}.png")} <img src="{$smarty.const.PUN_ROOT}{$pun_config.o_avatars_dir}/{$id}.png" alt="" /> {else} {$lang_profile.$No_avatar} {/if} {/if} {/if} {else} {$lang_profile.$No_avatar} {/if}<br/>{/if} |
Отредактировано tipsun (2012.06.05 08:08)
Немного commit.
Отредактировано tipsun (2012.06.05 10:10)
Еще commit.
Остался раздел "Администрирование".
- - - -
Чет когда переходишь в профиле с вкладки "основной" на другие, то ссылка администрирование пропадает.
- - - -
А, просто не добавил нужные переменные в smarty.
Отредактировано tipsun (2012.06.06 08:08)
администрирование можно на потом оставить.
все по публичной части сделано уже?? круто. позже посмотрю.
Я имел ввиду файл profile.php
Отчет
Отредактировано tipsun (2012.06.23 09:09)
Еще 2 файла: login.php + register.php
ну, самое сложное переведено

отлишна
wap/help.php не смог с 3 отреком нормально разобраться, ну оригинальную идею не смог перенести на шаблон.
Добавлено спустя 1 минуту 11 секунд: Там как бы на 1 изображение если есть еще коды-ключи, то показывать в одном диве.
Файл
wap/hide.php маразм.
Так как этот маразм почти полностью совпадает с
wap/viewtopic.php, то решил этим воспоьзоватсья. Шаблон взял от viewtopic.tpl
Еще, как приду домой, wap/message_delete.php сделаю и отправлю...
Commit. Бле! Комментарий забыл.
Добавлено спустя 5 минут 43 секунды: Что за память. >_<
Добавлено спустя 7 минут 37 секунд: Если ничего не упустил, остались:
message_list.php
message_send.php
misc.php
search.php
uploads.php
viewprintable.php
viewspam.php
Отредактировано tipsun (2012.06.25 17:05)
Вот message_list.php меня потерял! @_@
Вот это (_Y_)
"настройки", "подтв. удаления" отсеки только сделал.
"Входящие", "Исходящие" надо разгребать.
Почти готово.
Ошибки надо поправить.
Можно как-то чтоб смарти отображал, где я облажал?
Код:
span style="color: #0000BB"><?php$smarty->debugging = true; |
Сделано.
Хоть и коряво <_<
Добавлено спустя 2 минуты 50 секунд: Commit.
Отредактировано tipsun (2012.07.04 15:03)
Говоря грубо 4 файла/мягко 6 файлов осталось.
Добавлено спустя 1 минуту 1 секунду: Сегодня еще 1 попробую сделать: message_send.php
Отредактировано tipsun (2012.07.04 15:03)
+ upload.php
Сейчас интернет будет (через брата телефон), выложу.
search.php заставляет напрягать мой мозг.

уф.
у меня отпуск скоро) как раз к этому времени, закончишь думаю. и я подтянусь
Умно
Commit.
Добавлено спустя 51 секунду: Вроде только
wap/viewspam.php остался.
супер) постараюсь занятся
Ну как там, просто хоть посмотрел, кошмар?
обнови свн. там, вобщем, есть еще что подшлифовать в целом. будем пока этим заниматься.
когда подшлифуем из бранча переедем в транк.
да так. проверяй все ли работает. не работали, например, все сообщения об ошибках. может еще что-то я пропустил.
Я тут подумал, может сделать адрес для стиля.css проще:
"../style.css"
Смарти компилирует в известную папку (compile, cache, template, config). Стиль находится выше на 1 директорию.
так то да, но сейчас там по дефолту вроде некорректно стиль ставится
А, там уже по-другому.
Добавлено спустя 35 секунд: Да, я вот запостил и увидел.
Сейчас commit случится.
Добавлено спустя 1 минуту 12 секунд: Опять коммент забыл.
Еще 1 в догонку.
Кое-что еще от себя добавил.

- - - -
В профиле, при предпросмотре, панель навигации вверху пропадать не будет.
Поправка навигации (вверху страницы) в некоторых файлах.
Как-то странно получатся. Файлы стилей в одном месте, разметка в другом.
Добавлено спустя 8 минут 54 секунды: Может надо было в style_wap держать шаблоны, тогда ничего переделывать не придется, чтоб показывать варианты стилей.
style_wap/styleName.css
style_wap/styleName/tpls/
Тем более там поиск идет так:
Код:
span style="color: #0000BB"><?php $styles = array(); $d = dir(PUN_ROOT . 'style_wap'); while (($entry = $d->read()) !== false) { if (substr($entry, strlen($entry) - 4) == '.css') { $styles[] = substr($entry, 0, strlen($entry) - 4); } } $d->close(); |
Надо было значение формата даты не в переменную, а в константу занунуть.

Ладно исправлюсь.
Или переделать везде поиск стиля.css на нынешнее расположение дизайна в виде папок?
не знаю. расскажи подробнее. я не помню архитектуру.
: раньше
/style/
/style_wap/
/style_wap/wap.css
/style_wap/xwab.css
- - - -
: сейчас
/include/template/web/
/include/template/wap/
/include/template/wap/wap/
/include/template/wap/wap/style.css
/include/template/wap/wap/style2.css
/include/template/wap/wap/tpls/
/include/template/wap/xwab/
- - - -
вроде везде повторяется, код который я написал выше.
он показывает возможные варианты выбора.
tipsun, нет. в template не должно быть файлов доступных для браузеря напрямую.
Не обязательно конечно поддержка одной разметкой несколько стилей, но было бы экономней

чтоб одну и ту же разметку не копировать для разных стилей.
Добавлено спустя 2 минуты 38 секунд: Вообщем все как есть оставить, и везде переделать показ вариантов стилей?
tipsun, об экономии лишнего мегабайта на жестком диске думай в последнюю очередь. разметка будет разной.
tipsun написал:
В moderate не могли ссылки действовать из viewtopic.php (уд./пер./закр./сн.)
Fixed
Gemorroj, когда находишься непосредственно в теме форума и видишь ссылки:
Удалить сообщения|Перенести тему|Закрыть тему|Выделить тему
Переходишь по: Удалить сообщения
И тщательно проверяешь

Его поправил (он вообще не работал, из-за
кривизны моих рук половина кода отсутствовала

), но мало ли.
o(o_O)o WTF?!
В файле wap/post.php тоже целый кусок кода отсутствовал.
Чем я смотрел?!
- - - -
Так, это вроде тоже начало работать...
Gemorroj, в wap/edit.php не вижу проблем, вроде редактируемое сообщение показывает. Что не так?
Добавлено спустя 2 минуты 20 секунд: Предпросмотр? - Поправил.
Добавлено спустя 2 минуты 54 секунды: Пойду отдыхать
tipsun, да, отсутствовали куски кода. в edit тоже да, вроде бы.
я в отпуск, буду с gprs или как там его, так что хз как смогу програмить.
Ну я поправил, посмотрел. Все что видно, работает.
tipsun написал:Тут есть отметка новые посты.
Вот интересно стало, может плагин сделать, чтоб для каждого поста показывало кто прочитал.

ну отдельно ссылка будет и при переходе на нее (пост +) список прочитавших.
Что плохо, есть кнопка "отметить все как прочитанное", это всю фишку портит.
Вот я сначала не подумал:
Код:
SELECT |
`p`.`topic_id`, |
`p`.`posted` |
FROM |
`posts` AS `p` |
WHERE |
`p`.`id` = 31 |
LIMIT 1; |
|
SELECT |
COUNT(1) |
FROM |
`log_topics` AS `lt` |
WHERE |
`lt`.`log_time` >= 1344284943 AND |
`lt`.`topic_id` = 1 |
LIMIT 1; |
|
SELECT |
`lt`.`user_id`, |
`lt`.`topic_id`, |
`lt`.`log_time`, |
`u`.`username` |
FROM |
`log_topics` AS `lt` |
LEFT JOIN |
`users` AS `u` |
ON (`lt`.`user_id` = `u`.`id`) |
WHERE |
`lt`.`log_time` >= 1344284943 AND |
`lt`.`topic_id` = 1 |
LIMIT 0, 10; |
Потом подумал:
Код:
SELECT |
COUNT(`u`.`id`) |
FROM |
`log_topics` AS `lt`, |
`posts` AS `p`, |
`users` AS `u` |
WHERE |
`lt`.`log_time` >= `p`.`posted` AND |
`lt`.`topic_id` = `p`.`topic_id` AND |
`lt`.`user_id` = `u`.`id` AND |
`p`.`id` = 31 |
LIMIT 1; |
|
SELECT |
`u`.`username` |
FROM |
`log_topics` AS `lt`, |
`posts` AS `p`, |
`users` AS `u` |
WHERE |
`lt`.`log_time` >= `p`.`posted` AND |
`lt`.`topic_id` = `p`.`topic_id` AND |
`lt`.`user_id` = `u`.`id` AND |
`p`.`id` = 31 |
LIMIT 0, 10; |
Как правильней?
- - - -
Итог должен быть в виде списка пользователей, которые прочитали пост.
Но моим, как обычно, недалеким соображениям при прочтении нового сообщения ставится куда-то `log_forums` или `log_topics` временная метка нового сообщения.
Надо пойти найти, пошел искать.
Может вообще не делать эту ерунду?
tipsun, попозже можно. сейчас главное основной функционал допилить.
Можно только для последнего сообщения темы делать список прочитавших, потому что метка захватит все предыдущие сообщения темы.
Но пользователи не всегда же в одинаковое время читают сообщения.
Отредактировано tipsun (2012.08.07 07:07)
с аватарками проблемы. нельзя прикреплять файлы в ответе и редактировании.
Gemorroj написал:
с аватарками проблемы. нельзя прикреплять файлы в ответе и редактировании.
Попробую исправить.
собсно, удаление постов не работает. "Неверный запрос. Ссылка, по которой вы пришли неверная или устаревшая." при клике на "Удалить сообщения".
Сегодня исправил, обновлялся?
Код:
// from |
else exit(); |
// to |
else (! $fid) exit(); |
tipsun, да. там не правильно fid передается. сейчас это исправлю.
нет пагинации в модерировании форума.
Gemorroj написал:
нельзя прикреплять файлы в ответе и редактировании.
Можно
Добавлено спустя 3 минуты 14 секунд: Пока я 1 коммитнул ты уже 6 раз. Скорострел
edit теперь не работает. проверяй перед комитами.
Добавлено спустя 3 минуты 25 секунд: я сейчас уезжаю, буду вечером только. посмотри как выглядят edit и post. они отличаются. вероятно, что-то не так.
Gemorroj написал:
нет пагинации в модерировании форума.
Есть.
Добавлено спустя 57 секунд: Gemorroj написал:
edit теперь не работает. проверяй перед комитами.
Добавлено спустя 3 минуты 25 секунд:
я сейчас уезжаю, буду вечером только. посмотри как выглядят edit и post. они отличаются. вероятно, что-то не так.
Ок
Gemorroj написал:
edit теперь не работает.
Вроде сейчас работает. 1 условие добавил.
да. думаю еще много. как минимум сейчас зашел сразу вижу - нет заголовка в "Удалить сообщения". В модерировании топиков, топики всегда помечены как новые.
По самим шаблонам - в них многовато логики, которой в шаблонах быть не должно. Нужно будет вынести все parse_message, если еще остались где-то из шаблонов в php код. Да и все остальные php функции нужно будет убрать из шаблонов. Либо сделать отдельный класс с вспомогательными php методами только для шаблонов.
Отредактировано Gemorroj (2012.08.08 09:09)
Под логикой ты подразумеваешь if?
Типа шаблон решает что отображать?
tipsun, нет. я имею ввиду parse_message, get_title и прочие функции форума, которые используются в шаблонах.
message_popup еще сделать надо.
посмотри сколько кидается нотисов. не передано много переменных в шаблоны. походи по страницам, поисправляй. если переменная передается часто в шаблон, то есть смысл передавать ее в хедере всегда. о производительности не думай вообще.
Commit "Fix navigation".
Знаю, сам не доволен, халтура.

Потом поподробней посмотрю.
Сделаю проверку в подключаемом шаблоне (profile.navi.tpl) - показывать ссылки или нет и как.
- - - -
Или оставить как есть?
Код:
span style="color: #0000BB"><?php{if $id == $pun_user.id or $pun_user.g_id == $smarty.const.PUN_MOD || $pun_user.g_id == $smarty.const.PUN_ADMIN}{include file='profile.navi.tpl'}{/if} |
Добавлено спустя 3 минуты 53 секунды: Просто в одном месте у меня получилось так:
Код:
span style="color: #0000BB"><?php{if $id == $pun_user.id or $pun_user.g_id == $smarty.const.PUN_MOD || $pun_user.g_id == $smarty.const.PUN_ADMIN}{include file='profile.navi.tpl'} {* Уже содержит навигацию, то что ниже + ссылки. *}{else} {assign var='Profile_menu' value='Profile menu'} {* Навигация: Главная / Профиль *} <div class="inbox"> <a href="index.php">{$lang_common.Index}</a> » {$lang_profile.$Profile_menu} </div>{/if} |
Gemorroj написал:
посмотри сколько кидается нотисов.
Как и где?
- - - -
Я включил в wap/header.php отладку
Нет нигде ошибок или я не туда смотрю.
Код:
span style="color: #0000BB"><?php$smarty->error_reporting = true;$smarty->debugging = true; |
Вот /wap/misc.php не работает. Fixed.
Отредактировано tipsun (2012.08.09 16:04)
в шаблоне не сокращай navi.
smarty дебаг не трогай. в .htaccess error_reporting -1 и error_log куда тебе нравится.
Gemorroj написал:
в шаблоне не сокращай navi.
в смысле? Полностью писать *.navigation.tpl?
Gemorroj написал:
в .htaccess error_reporting -1 и error_log куда тебе нравится.
Круто
Добавлено спустя 6 минут 51 секунду: Ну в footer.tpl понятное дело. Он везде, но не везде нужные данные.
Commit. Совсем чуть поправок.
Еще остались непроверенные файлы.
не пиши нанофикс и т.п. пиши развернутые комментарии) а так ок все. выберусь из гомеля займусь тоже
Commit + Comment.
Этой работой я доболен, практически на 90%.
Индексный шаблон большой.
Все переменные не посмотрел.
Вдруг лишние есть, надо досмотреть...
Отредактировано tipsun (2012.08.10 21:09)
Надо чтоб шаблоны без лишних "\s" and "\n" компилировались.
Оповещение о новых личных сообщениях должно по всему сайту быть или толко на главной?
Помоему я ошибся с последним commit.
Что-то должно быть в header, что-то в index.
Еще есть исправления, там conditions не работает. Я его поправил, но не залил.
147, 148 коммиты хорошие)
Gemorroj, не убегай от вопросов

Как там располагаются оповещения?
Оповещение о:
- новом сообщении: везде, но на главной надо пропустить вперед логотип и еще что-то, я не могу в исходнике ничего понять, запутанно.
Вообщем commit.
В отдельном шалоне все оповещения, если я лишние внес, легче найти и исправить будет
Отредактировано tipsun (2012.08.11 17:05)
Функция показа аватарки не совсем подходит под раздел профиль. Либо там приспосабливать, что я сделал, либо функцию сделать более гибкой.
Добавлено спустя 1 минуту 8 секунд: Сейчас посмотрю, если есть что commit - сделаю.
А так нельзя сделать?:
Код:
span style="color: #0000BB"><?php//{censor_words($cur_topic.subject)|escape}{$cur_topic.subject|censor_words|escape} |
Или делать как до этого ты показал, ну в логике.
НаCommitал чуть.
Остальное не хочу, не закончил полностью файл.
Потом забуду, где ковырял.
Шаблон viewforum.tpl не отметил на commit.
// Гость записанный в таблице пользователей (`users`) имеет id = 1. Зачем тогда его учитывать?
if (1 > $id) {
wap/karma.php
аналогичную проверку нужно сделать и в web версии. они должны иметь одинаковую логику же.
и еще, в форуме вроде бы есть константа идентифицирующая группы пользователей, нужно использовать ее. а не цифру 1.
Так?
Добавлено спустя 3 минуты 40 секунд: Я еще кое-что от себя добавил. Можно и убрать.
Если ссылки на пост нет, редирект не выполняется, следует показ истории кармы.
wap/karma.php
$id =& $to;
зачем ссылка?
Не знаю. Эээксперименты.
Добавлено спустя 3 минуты 38 секунд: Неправильно?
не нужна она там. вообще, ссылки не используй без явной необходимости.
Я не знаю как там с ограничениями, ну если нельзя вдруг вытащить результат с запроса и т.д.
Я сделал вывод сообщения об ошибке.
Отредактировано tipsun (2012.08.23 09:09)
Надо либо часто коммиты делать, либо записывать все, либо память тренировать. Все забываю.
Все залил.
Добавлено спустя 1 минуту 10 секунд: Догадался таки слить оригинал с репозитария, чтоб по нему ориентироваться, смотреть может где не так условие поставил.
Удалил бред с karma.
Просто скопировал лишнее.
И все равно во всем wap-форуме нет конкретных действий к $db->fetch() при возвращении значения false.
Только к $db->query(); [error()]
#309.
Dark Gemorroj
Гость
2013.01.27 16:04
Что за волшебный код в include/quickjump.php?
Что за return без функции? Что за include в переменную?
Dark Gemorroj написал:
Что за волшебный код в include/quickjump.php?
Что за return без функции? Что за include в переменную?
include. Вот так оно работает. Очень удобно, иногда.
У меня не работает.
Добавлено спустя 47 секунд: И, кстати, спасибо за инфу.
зайди в админку и перегенери кэш.
Волшебник, такой волшебник.
Она все-таки попалась:
Добавлено спустя 1 минуту 56 секунд: Эдак раз 818
tipsun, это не трогай. ошибки в сторонних либах не трогай.
Больше 3х категорий в форуме не отображается. Ни в web, ни в wap.
Страниц:
1 …
30 31 32 Все