1

(14 ответов, оставленных в Дополнения: готовые)

Скрипт чистки папки с альтернативным кэшем:
Создаете какой-нить "destroy.mdu", пихаете в папку /inc/mod со следующим содержанием:

<? echoheader('question', t('Удаление временных файлов')); ?>

<?
  $dir = opendir ("../temp");
  while (( $file = readdir ($dir)))
  {
    if (( $file != ".") && ($file != ".."))
    {
      unlink ("../temp/$file");
    }
  }
  closedir ($dir);
?>

<h1>Временные файлы были удалены!</h1>

<? echofooter(); ?>

Вызывать, как: http://ВАШСАЙТ/АДМИНКА/?mod=destroy (ссылку можно куда-нибудь в меню, или на "главную" админки вывести).

Можно сделать так.

3

(1 ответов, оставленных в Мастерская)

Сегодня встала задача реализовать поиск на сайте с возможностью поиска в разных категориях, выбираемых пользователем. т.е. в 2 и 4, 6 и 7... и т.д. smile
Поиск на сайте работает через GET.

Вот как сделал (может пригодится кому-то):

show_search.php (изменения в форме)

...
В категориях: (Используйте Ctrl+клик для выбора нескольких категорий)<br />
<select size="5" multiple name="category"><option value="">во всех</option><?=category_get_tree('&nbsp;', '<option value="{id}"[php]search_this_cat({id})[/php]>{prefix}{name}</option>'); ?></select>
...

- изменения в том, что в выпадающем списке для категорий был добавлен параметр " multiple " и установлен размер на 5 строк.

В скрипте вывода:

<?
$string = $_SERVER['REQUEST_URI'];
$patterns  = array ("/\/search.php(.*?)/", "/&category=(.*?)/");
$replacement  = array ("", "\$1,");
$rep1 = preg_replace($patterns, $replacement, $string);
$rep2 = preg_replace("/,(.*)/", "\$1", $rep1);
$rep3 = preg_replace("#&skip=(.*)#i", "", $rep2);

$static['number'] = '15';
if($_GET['skip']) {$static['skip'] = $_GET['skip'];}
$static['template'] = 'Search';
$static['category'] = $rep3;
?>

- может немного коряво написал, но у меня работает))
Смысл такой...
$rep1 - удаляет всё лишнее, оставляет только номера категорий через запятые.
$rep2 - удаляет первую запятую
$rep3 - удаляет возможный skip.

P.S. сейчас пишу и вижу, что можно упростить, просто на "быструю руку" делал)))
Надеюсь, что кому-нибудь это пригодится... smile

Категории из списка выбираются при помощи Ctrl и клика мыши.

А можешь выложить коды для двух кейвордов?
Интересная тема!

5

(14 ответов, оставленных в Дополнения: готовые)

Скажу на практике о методе, нагрузка на хостинг уменьшилась раз в 7, но возникают проблемы с задержкой в появлении на сайте новых материалов, а также папку с кешем раз в месяц стоит почистить)) wink

А двойной кеш использовать не стоит т.к. нагрузка от этого явно не уменьшится...

6

(74 ответов, оставленных в Тестируем новые версии)

1. Пытаюсь добить кейворды... пока что-то не работает... sad

2. Поддержка XML-RPC задумывалась ранее, но потом стала глючить.
Прежде всего данные по этому протоколу должны работать в UTF8 (стандарт)...

3. show_search.php -

<!-- КОД ПОИСКА / НАЧАЛО  -->
<form method="get" action="<?=$PHP_SELF; ?>">
<input name="mod" type="hidden" value="search">

<table width="99%" border="0" cellspacing="1" cellpadding="1" class="text" align="center">
<tr>
<td width="40%" colspan="2"><nobr><?=t("Поиск"); ?> (<?=t("не менее 3-х символов"); ?>)</nobr></td>
<td width="60%" colspan="2"><input class="regtext" type="text" name="search" size="20" value="<?=$search; ?>"></td>
</tr>
<tr>
<td><nobr><?=t("В категории"); ?></nobr></td>
<td><select class="regtext" size="1" name="category"><option value="0"><?=t('во всех'); ?></option><?=category_get_tree('&nbsp;', '<option value="{id}"[php]search_this_cat({id})[/php]>{prefix}{name}</option>'); ?></select></td>
<td><nobr><?=t("За дату"); ?> (<?=t("год"); ?>/<?=t("месяц"); ?>/<?=t("день"); ?>)</nobr></td>
<td><?=makeDropDown($syear, 'year', $year); ?>/<?=makeDropDown($smonth, 'month', $month); ?>/<?=makeDropDown($sday, 'day', $day); ?></td>
</tr>
<tr>
<td colspan="4" align="center"><input class="regok" type="submit" value=" <?=t("ИСКАТЬ"); ?> "></td>
</tr>
</table>
</form>
<!-- КОД ПОИСКА / КОНЕЦ -->

- я то её давно вынес... просто какой смысл её в общем скрипте держать, когда можно в tpl перенести...

4. Проверят пользователи, после переезда... smile по-другому, нагрузку сложно предсказать...

5. На счет кеширования, пока не разбирался... Главное, чтобы оно работало! smile

6. Имхо, текстовая база уже не катит из-за неимоверной нагрузки на хостинг...
да и хостинг без mysql ушел в прошлое... smile

7. Сайтовая кодировка для RSS не устраивает тем, что 70% ридеров её некорректно воспринимают в 1251-й кодировке... Яндекс.блоги, гугл.ридер и другие любят ленты в UTF8...

8. А сортировка - вещь нужная! smile

Miksar, плагины твои чуть подправленные для 1.1.1 для работы с MySQL.

8

(14 ответов, оставленных в Дополнения: готовые)

Miksar, сорри, в твоей сборке реально этого не видел...
Метод использую давно и брал от сюда...

В этой статье вкратце расскажу о том, как перевести основные доп.поля Strawberry 1.1.1 в MySQLную версию при помощи хирургического вмешательства. smile

! Для тех, кто не хочет сильного вмешательства в систему, смотрите решение от ANT-Soft !

А также не забывайте делать резервные копии базы и скриптов на разных этапах переезда!
Для начала переведем дополнительные поля. Можно воспользоваться моим хаком, либо следующим методом:

1. В зависимости от количества используемых доп.полей добавляем поля в базу cute_news. Для примера возьмем 4 дополнительных поля с названием dop1, dop2, dop3, dop4.
Названия и количество дополнительных полей можно изменить под себя, как угодно!

И так, зайдем в phpmyadmin и дадим запрос для создания 4 полей:

ALTER TABLE  `cute_news` 
    ADD  `dop1` text NOT NULL,
    ADD  `dop2` text NOT NULL,
    ADD  `dop3` text NOT NULL,
    ADD  `dop4` text NOT NULL

т.е. после таблицы cute_news мы создаем новые поля с нужным нам текстом.
В итоге, работать с ними можно будет также, как с любыми другими значениями в таблице cute_news.

Далее, нам надо внести изменения в файл, отвечающий за соединение с базой, а именно:
\inc\db\database.inc.php

Находим:

// news
'news'     => array(

И добавляем:

'dop1'    => array('type' => 'string'),
'dop2'    => array('type' => 'string'),
'dop3'    => array('type' => 'string'),
'dop4'    => array('type' => 'string'),

Затем приступим к редактированию админки, а именно: \inc\mod\addnews.mdu ; \inc\mod\editnews.mdu

Форма addnews (вставляется в желаемом месте):

<!-- дополнительное поле -->
<fieldset id="dop1"><legend><?=t('Дополнительное поле1'); ?></legend>
<input type="text" name="dop1">
</fieldset>

<!-- дополнительное поле -->
<fieldset id="dop2"><legend><?=t('Дополнительное поле2'); ?></legend>
<input type="text" name="dop2">
</fieldset>

<!-- дополнительное поле -->
<fieldset id="dop3"><legend><?=t('Дополнительное поле3'); ?></legend>
<input type="text" name="dop3">
</fieldset>

<!-- дополнительное поле -->
<fieldset id="dop4"><legend><?=t('Дополнительное поле4'); ?></legend>
<input type="text" name="dop4">
</fieldset>

Далее находим:

  run_actions('new-save-entry');

    $sql->insert(array(
    'table'  => 'news',
    'values' => array(
                'date'     => $added_time,
                'author'   => $member['username'],
                'title'    => replace_news('add', $title),

И дописываем информацию о подключении к базе:

'dop1'    => replace_news('add', $dop1),
'dop2'    => replace_news('add', $dop2),
'dop3'    => replace_news('add', $dop3),
'dop4'    => replace_news('add', $dop4),

Теперь editnews форма:

<!-- дополнительное поле -->
<fieldset id="dop1"><legend><?=t('Дополнительное поле1'); ?></legend>
<input type="text" name="dop1" value="<?=htmlspecialchars(replace_news('admin', $row['dop1'])); ?>">
</fieldset>

<!-- дополнительное поле -->
<fieldset id="dop2"><legend><?=t('Дополнительное поле2'); ?></legend>
<input type="text" name="dop2" value="<?=htmlspecialchars(replace_news('admin', $row['dop2'])); ?>">
</fieldset>

<!-- дополнительное поле -->
<fieldset id="dop3"><legend><?=t('Дополнительное поле3'); ?></legend>
<input type="text" name="dop3" value="<?=htmlspecialchars(replace_news('admin', $row['dop3'])); ?>">
</fieldset>

<!-- дополнительное поле -->
<fieldset id="dop4"><legend><?=t('Дополнительное поле4'); ?></legend>
<input type="text" name="dop4" value="<?=htmlspecialchars(replace_news('admin', $row['dop4'])); ?>">
</fieldset>

И подключение к базе, аналогичное addnews:

'dop1'    => replace_news('add', $dop1),
'dop2'    => replace_news('add', $dop2),
'dop3'    => replace_news('add', $dop3),
'dop4'    => replace_news('add', $dop4),

Одну задачу по установке дополнительных полей мы выполнили!
Теперь осталось перевести ключевые поля из текстовой базы в Mysql`ную.

Для этого копируем файл xfields-data.txt в папку "для опытов" и начинаем его переделывать любым

текстовым редактором, который понимает регулярные выражения для автозамены.

Содержимое файла примерно такое:

1|>|
32|>|
33|>|pole1|5000||pole2|dhe543||year|2027||dop|n029
34|>|pole1|3000||pole2|rewywe||year|2001||dop|n027
28|>|
36|>|
37|>|pole1|1000||pole2|shehe||year|2200||dop|n025

Вначале удалим пустые строки при помощи выражения:

*[0-9]|>|$

Затем даем запрос замены:

*[0-9]|>|pole1|*[]||pole2|*[]||year|*[]||dop|*[]$

C заменой на (вместо "наша база" прописать название mysql базы):

UPDATE `Наша-база`.`cute_news` SET `dop1` = '%2',
`dop2` = '%3',
`dop3` = '%4',
`dop4` = '%5' WHERE `cute_news`.`id` =%1 LIMIT 1 ;

В итоге получаем:

UPDATE `Наша-база`.`cute_news` SET `dop1` = '5000',
`dop2` = 'dhe543',
`dop3` = '2027',
`dop4` = 'n029' WHERE `cute_news`.`id` =33 LIMIT 1 ;

UPDATE `Наша-база`.`cute_news` SET `dop1` = '3000',
`dop2` = 'rewywe',
`dop3` = '2001',
`dop4` = 'n027' WHERE `cute_news`.`id` =34 LIMIT 1 ;

UPDATE `Наша-база`.`cute_news` SET `dop1` = '1000',
`dop2` = 'shehe',
`dop3` = '2200',
`dop4` = 'n025' WHERE `cute_news`.`id` =37 LIMIT 1 ;

Полученный код через phpmyadmin заносим в базу...
И наши ключевые слова перенесены!

Теперь надо настроить их вывод в шаблоне.

Открываем шаблон и там где у нас было, к примеру:

<?=$tpl['post']['xfields']['year']; ?>

Ставим:

<?=$tpl['post']['dop3']; ?>

Либо даже так:

<? if ($tpl['post']['dop3']){ ?>
Дополнительное поле3: 
<?=$tpl['post']['dop3']; ?>
<? } ?>

C этим разобрались!
Дополнительные поля у нас перенесены в базу, добавляются и отображаются.
Теперь перейдем к плагинам (можете сами решить, какие из них вам нужны)...

Вначале возьмем format-post.php из сборки Miksar`a:

<?php
/**
 * @package Plugins
 * @access private
 */

/*
Plugin Name:    Формат поста
Plugin URI:      http://miksar.mirahost.ru/strawberry/
Description:            Выбор разных форматов вывода новостей при публикации/редактировании. MySQL 

база. Исправлены некоторые ошибки при ВакоТегах.
Version:         1.3
Application:     Strawberry
Author:         David Carrington, Mr.Miksar
Author URI:        http://www.brandedthoughts.co.uk
*/


define('FS_FORMAT_XFIELD', 'fs_format');
define('FS_DEFAULT_FORMAT', 'html_with_br');

add_action('edit-advanced-options', 'fs_FormatSelectBox');
add_action('new-advanced-options', 'fs_FormatSelectBox');

add_filter('news-entry-content', 'fs_ApplyFormat', 1000);
add_filter('news-comment-content', 'fs_ApplyFormat', 1000);


function fs_FormatDropDownOptions(){
global $sql, $fs_formats, $item_db, $id, $_POST, $story;

$format = ($story['format'] ? $story['format'] : FS_DEFAULT_FORMAT);

    if ($fs_formats){
        $desc['text']         = t('Текст');
        $desc['text_with_br'] = t('Текст с переносом строк');
        $desc['html']         = t('HTML');
        $desc['html_with_br'] = t('HTML с переносом строк');

        foreach ($fs_formats as $fs_name => $fs_function){
        $buffer .= '<option value="'.$fs_name.'"'.($format == $fs_name ? ' 

selected="selected"' : '').'>'.$desc[$fs_name].'</option>';
        }
    }

return $buffer;
}

function fs_FormatSelectBox($hook){
$buffer = '<fieldset id="news_format"><legend>'.t('Формат').'</legend><select name="fs_format" 

id="cboFS_Format" style="width:210px;">'.fs_FormatDropDownOptions().'</select></fieldset>';
return $buffer;
}

function fs_ApplyFormat($content, $hook){
global $row, $fs_formats, $sql;

    if ($_POST['fs_format']){
        $format = $_POST['fs_format'];
    } else {
$format = $row['format'];
    }

    // Get the function name
    $format_function = $fs_formats[$format];

    if (!$format_function or !function_exists($format_function)){
        $format_function = $fs_formats[FS_DEFAULT_FORMAT];
    }

    // Run the formatting function
    $content = $format_function($content);

return $content;
}

/* Default formats */

$GLOBALS['fs_formats']['text']         = 'fs_Plain';
$GLOBALS['fs_formats']['text_with_br'] = 'fs_Plain_br';
$GLOBALS['fs_formats']['html']         = 'fs_HTML';
$GLOBALS['fs_formats']['html_with_br'] = 'fs_HTML_br';


function fs_Plain($content){
    $content = htmlspecialchars($content);
    $content = str_replace('{nl}', '', $content);
return $content;
}

function fs_Plain_br($content){
    $content = htmlspecialchars($content);
    $content = str_replace('{nl}', '<br>', $content);
return $content;
}

function fs_HTML($content){
    $content = str_replace('{nl}', '', $content);
return $content;
}

function fs_HTML_br($content) {
$active_plugins = loadarray(active_plugins_file);
$content = str_replace('{nl}', '<br />', $content);
if ($active_plugins['wacko.php']) {
$content = str_replace('><br><table', '><table', $content);
$content = str_replace('><br><tr', '><tr', $content);
$content = str_replace('><br><td', '><td', $content);
$content = str_replace('><br></tr', '></tr', $content);
$content = str_replace('><br></td', '></td', $content);
$content = str_replace('><br></table', '></table', $content);
$content = str_replace('table><br>', 'table>', $content);
}
return $content.$g;
}
?>

Затем второй полезный плагин post-type.php

<?php
/**
 * @package Plugins
 * @access private
 */

/*
Plugin Name:    Тип поста
Plugin URI:     http://cutenews.ru/
Description:      Позволяет выбрать тип сообщения: опрос (<code>$type = 'poll';</code>), страница 

(<code>$type = 'page';</code>)(отличается от обычной новости многоуровневостью), чистый PHP, 

запароленный пост.
Version:         0.2
Application:     Strawberry
Author:         Лёха zloy и красивый
Author URI:     http://lexa.cutenews.ru
*/

add_action('edit-advanced-options', 'postType_AddEdit', 18);
add_action('new-advanced-options', 'postType_AddEdit', 18);

function postType_AddEdit(){
global $sql, $id, $row;

    $sql->altertable(array(
    'table'  => 'news',
    'action' => 'insert',
    'name'   => 'type',
    'values' => array('type' => 'string')
    ));

    $sql->altertable(array(
    'table'  => 'news',
    'action' => 'insert',
    'name'   => 'parent',
    'values' => array('type' => 'int', 'default' => 0)
    ));

    $sql->altertable(array(
    'table'  => 'news',
    'action' => 'insert',
    'name'   => 'level',
    'values' => array('type' => 'int', 'default' => 0)
    ));

    $sql->altertable(array(
    'table'  => 'news',
    'action' => 'insert',
    'name'   => 'password',
    'values' => array('type' => 'string')
    ));

    $types = array('' => '...', 'poll' => t('Опрос'), 'page' => t('Страница'), 'private' => 

t('Запароленый'));

    if (straw_get_rights('full')){
        $types['php'] = t('PHP');
    }

    $buffer  = '<fieldset id="post_type"><legend>'.t('Тип поста').'</legend>';
    $buffer .= makeDropDown($types, 'type"  onChange="this.value == \'page\' ? 

_getElementById(\'postparent\').style.display = \'\' : _getElementById(\'postparent\').style.display 

= \'none\'; this.value == \'private\' ? _getElementById(\'postpassword\').style.display = \'\' : 

_getElementById(\'postpassword\').style.display = \'none\';', $row['type']);
    $buffer .= '<br /><select size="1" id="postparent" name="postparent" style="display: 

'.($row['type'] != 'page' ? 'none' : '').';" title="'.t('Родитель').'"><option 

value="0">...</option>';

    if ($row['parent']){
        $buffer .= page_get_tree('-&nbsp;', '<option 

value="{id}"[php]tmp_page_selected({id}, '.$row['parent'].')[/php]>{prefix}{title}</option>', 

false);
    } else {
        $buffer .= page_get_tree('-&nbsp;', '<option value="{id}">{prefix}{title}</option>', 

false);
    }

    $buffer .= '</select>';

    if ($row['type'] == 'private'){
        $buffer .= '<input id="password" name="postpassword" type="text" 

value="'.$row['password'].'" style="display: ;" title="'.t('Пароль').'">';
    } else {
        $buffer .= '<input id="password" name="postpassword" type="text" value="" style="display: 

none;" title="'.t('Пароль').'">';
    }

    $buffer .= '</fieldset>';

return $buffer;
}

add_action('new-save-entry', 'postType_saveType', 18);
add_action('edit-save-entry', 'postType_saveType', 18);

function postType_saveType(){
global $sql, $id;

    $values = array('type' => $_POST['type'], 'password' => '', 'parent' => '', 'level' => '');

    if ($_POST['type'] == 'page'){
        $query = end($sql->select(array('table' => 'news', 'where' => array('id = 

'.$_POST['postparent']))));
        $values['parent'] = $_POST['postparent'];
        $values['level']  = ($query['level'] + 1);
    } elseif ($_POST['type'] == 'private'){
        $values['password'] = $_POST['postpassword'];
    }

    $sql->update(array(
    'table'  => 'news',
    'where'  => array("id = $id"),
    'values' => $values
    ));
}

add_filter('news-where', 'postType_where', 18);

function postType_where($where){
global $type;

    if ($type == 'page'){
        $where[] = 'type = page';
        $where[] = 'and';
    } elseif ($type == 'poll'){
        $where[] = 'type = poll';
        $where[] = 'and';
    } elseif ($type == 'news'){
        $where[] = 'type != page';
        $where[] = 'and';
        $where[] = 'type != poll';
        $where[] = 'and';
    } else {
        $where[] = 'type != page';
        $where[] = 'and';
    }

return $where;
}

add_filter('constructor-variables', 'postType_constructor', 18);

function postType_constructor($variables){

    $variables['type'] = array('string', makeDropDown(array(t('новости и опросы'), 'news' => 

t('новости'), 'poll' => t('опросы'), 'page' => t('страницы')), 'type'));

return $variables;
}

add_action('head', 'postType_define', 18);

function postType_define(){
global $cache, $type, $_pages, $sql;

    if (!$_pages = $cache->unserialize('_pages')){
        if ($query = $sql->select(array('table' => 'news', 'where' => array('type = page')))){
            foreach ($query as $row){
                $_pages[$row['id']] = $row;
            }
        }

        $_pages = $cache->serialize($_pages);
    }

    unset($type, $_GET['type']);
}

add_filter('unset', 'postType_typeUnset', 18);

function postType_typeUnset($unset){

    $unset[] = 'type';

return $unset;
}

add_filter('cute-get-link', 'postType_put_link', 18);

function postType_put_link($output){

    if ($output['arr']['parent']){
        $output['link'] = str_replace('{title}', page_get_link($output['arr']['id']), 

$output['link']);
    }

return $output;
}

add_filter('htaccess-rules-replace', 'postType_rules_replace', 18);

function postType_rules_replace($output){
global $config, $_pages;

    if ($config['mod_rewrite'] and $_pages){
        foreach ($_pages as $row){
            if ($row['parent']){
                $page[] = page_get_link($row['id']);
            }
        }

        if ($page){
            $output = str_replace('{title}', '('.join('|', $page).'|[_0-9a-z-]+)', $output);
        }
    }

return $output;
}

add_action('head', 'postType_idClean', 18);

function postType_idClean(){
global $id;

    if (!is_numeric($id) and chicken_dick(strstr($id, '/'))){
        $id = $_GET['id'] = end($id = explode('/', chicken_dick($id)));
    }
}

add_action('head', 'postType_updatePoll', 18);

function postType_updatePoll(){
global $sql;

    if ($_POST['poll']){
        foreach ($_POST['poll'] as $pid => $vid){
            if (!$_COOKIE['cnpostpoll'.$pid]){
                straw_setcookie('cnpostpoll'.$pid, 'voted', (time() + 3600 * 24), '/');

                $row = reset($sql->select(array('table' => 'story', 'where' => array("post_id = 

$pid"))));

                foreach (explode('{nl}', $row['short']) as $k => $v){
                    $v_arr    = explode('{', $v);
                    $vote[$k] = (int)$v_arr[1];
                    $poll[$k] = $v_arr[0];
                }

                foreach ($poll as $k => $v){
                    if ($k == $vid){
                        $vote[$k] = ($vote[$k] + 1);
                    }

                    $story[] = $poll[$k].'{'.$vote[$k].'}';
                }

                $sql->update(array(
                'table'  => 'story',
                'where'  => array("post_id = $pid"),
                'values' => array('short' => join('{nl}', $story))
                ));
            }
        }

        header('Location: '.$_SERVER['REQUEST_URI']);
        exit;
    }
}

add_filter('news-show-generic', 'postType_makePoll', 18);

function postType_makePoll($tpl){

    if ($tpl['_']['type'] == 'poll'){
        foreach (explode('{nl}', $tpl['_']['short']) as $k => $v){
            $v_arr     = explode('{', $v);
            $vote[$k]  = (int)$v_arr[1];
            $poll[$k]  = $v_arr[0];
            $votes    += $vote[$k];
        }

        foreach ($poll as $k => $v){
            $short .= '<label for="poll['.$tpl['id'].']['.$k.']"><input 

name="poll['.$tpl['id'].']" type="radio" id="poll['.$tpl['id'].']['.$k.']" 

value="'.$k.'">'.$poll[$k].'</label><br />';
            $full  .= '<div><b>'.$poll[$k].'</b></div><div style="width: 

'.@round($vote[$k] / ($votes / 100)).'%;" class="straw_poll">'.@round($vote[$k] / ($votes / 

100)).'%</div>';
        }

        $tpl['short-story'] = ($_COOKIE['cnpostpoll'.$tpl['id']] ? $full : '<form name="cnpostpoll" 

method="post">'.$short.'<input type="submit" value="  ok  "></form>');
        $tpl['full-story']  = $full;
    }

return $tpl;
}

add_filter('news-show-generic', 'postType_parsePHP', 18);

function postType_parsePHP($tpl){

    if ($tpl['_']['type'] == 'php'){
        $evalshort = replace_news('admin', str_replace('<br />', '', $tpl['_']['short']));
        $evalfull  = replace_news('admin', str_replace('<br />', '', $tpl['_']['full']));

        if ($evalshort){
            ob_start();
            eval($evalshort);
            $tpl['short-story'] = ob_get_clean();
        }

        if ($evalfull){
            ob_start();
            eval($evalfull);
            $tpl['full-story'] = ob_get_clean();
        }
    }

return $tpl;
}

add_action('head', 'postType_updatePrivate', 18);

function postType_updatePrivate(){

    if ($_POST['cnpostpassword']){
        straw_setcookie('cnpostpassword'.$_POST['passtopost'], $_POST['cnpostpassword'], (time() + 

3600 * 24 * 365), '/');
        header('Location: '.$_SERVER['REQUEST_URI']);
        exit;
    }
}

add_filter('news-show-generic', 'postType_makePrivate', 18);

function postType_makePrivate($tpl){

    if ($tpl['_']['type'] == 'private' and $_COOKIE['cnpostpassword'.$tpl['id']] != 

$tpl['_']['password']){
        $tpl['short-story'] = '<form method="post"><input name="cnpostpassword" type="password" 

value=""><input name="passtopost" type="hidden" value="'.$tpl['id'].'"><input type="submit" value="  

ok  "></form>';
        $tpl['full-story']  =  ($tpl['full-story'] ? $tpl['short-story'] : '');
    }

return $tpl;
}

#-------------------------------------------------------------------------------

function page_get_link($id, $link = ''){
global $_pages;

    if ($_pages[$id]['url']){
        $link = $_pages[$id]['url'].($link ? '/'.$link : '');
    }

    if ($_pages[$id]['parent']){
        $link = page_get_link($_pages[$id]['parent'], $link);
    }

return chicken_dick($link);
}

function page_get_title($id, $separator = ' &raquo; ', $title = ''){
global $_pages;

    if ($_pages[$id]['title']){
        $title = $_pages[$id]['title'].($title ? $separator.$title : '');
    }

    if ($_pages[$id]['parent']){
        $title = page_get_title($_pages[$id]['parent'], $separator, $title);
    }

return chicken_dick($title);
}

function page_get_tree($prefix = '', $tpl = '{name}', $no_prefix = true, $id = 0, $level = 0, 

$johnny_left_teat = ''){
global $sql;

    $level++;

    foreach ($sql->select(array('table' => 'news', 'where' => array("parent = $id", 'and', 'type 

= page'), 'orderby' => array('id', 'DESC'))) as $row){
        $pref = ($prefix ? ($no_prefix ? preg_replace('/('.preg_quote($prefix, 

'/').'{1})$/i', '', str_repeat($prefix, $level)) : str_repeat($prefix, $level)) : '');
        $find = array('/{id}/i', '/{title}/i', '/{parent}/i', '/{url}/i', '/{prefix}/i', 

'/\[php\](.*?)\[\/php\]/ie');
        $repl = array($row['id'], $row['title'], $row['parent'], $row['url'], $pref, '\\1');
        $johnny_left_teat .= $pref.preg_replace($find, $repl, $tpl);
        $johnny_left_teat  = page_get_tree($prefix, $tpl, $no_prefix, $row['id'], $level, 

$johnny_left_teat);
    }

return $johnny_left_teat;
}

function tmp_page_selected($id, $parent){

    if ($id == $parent){
        return ' selected';
    }
}
?>

И на последок tepmplate-for-news.php

<?php
/**
 * @package Plugins
 * @access private
 */

/*
Plugin Name:    Индивидуальный шаблон
Plugin URI:     http://cutenews.ru
Description:    Новость может быть с любым шаблоном. MySQL
Version:        1.2
Application:     Strawberry
Author:            Лёха zloy и красивый
Author URI:        http://lexa.cutenews.ru
*/

// Cartman find you and kill you!

add_action('new-advanced-options', 'change_template', 24);
add_action('edit-advanced-options', 'change_template', 24);

function change_template(){
global $id, $post;
$result  = array('' => '...');
$handle  = opendir(templates_directory);
while ($file = readdir($handle)){
 if (file_exists(templates_directory.'/'.$file.'/active.tpl') and 

file_exists(templates_directory.'/'.$file.'/full.tpl')){
$result[$file] = $file;
 }
}
$result  = '<fieldset id="news_template"><legend>'.t('Шаблон').'</legend>'.makeDropDown($result, 

'template', $post['template']).'</fieldset>';
return $result;
}


add_filter('news-show-generic', 'apply_template', 24);

function apply_template($array){
global $tpl, $row, $static, $post;
$template = $row['template'];

    if (
    $template and
    !$static and
    !strstr($_SERVER['PHP_SELF'], 'rss.php')
    and
    !strstr($_SERVER['PHP_SELF'], 'print.php')
    and
    !is_file(templates_directory.'/'.$template)
    and
    is_dir(templates_directory.'/'.$template)
    ) {
$tpl['template'] = $template;
}
return $array;
}
?>

Для их работы опять обращаемся к файлу \inc\db\database.inc.php

Находим:

// news
'news'   => array(

И добавляем:

'type' => array('type' => 'string'),
'parent'   => array('type' => 'int'),
'level' => array('type' => 'int'),
'password' => array('type' => 'string'),
'template' => array('type' => 'string'),

Находим:

story
'story'   => array(

И добавляем:

'format'    => array('type' => 'string'),

Теперь заходим в phpmyadmin и добавляем нужные поля:

ALTER TABLE  `cute_news` 
    ADD  `type` text NOT NULL,
    ADD  `password` text NOT NULL,
    ADD  `parent` int(11) NOT NULL,
    ADD  `level` int(11) NOT NULL,
    ADD  `template` text NOT NULL;

ALTER TABLE  `cute_story` 
    ADD  `format` text NOT NULL

Порядок!
Теперь в админке проверяем, чтобы плагины были включены и переносим данные из файла xfields-data.php

в базу.
Поскольку этот файл может быть индивидуальным у каждого, то приведу краткий пример на двух шаблонах.
* если ваш файл содержит дополнительные данные, мета-теги, комментарии и т.д...
То переносите данные и информацию из плагинов по аналогии! *

  1 => 
  array (
    'template' => '',
    'fs_format' => 'html_with_br',
  ),
  3 => 
  array (
    'template' => 'Default',
    'fs_format' => 'html_with_br',
  ),
  25 => 
  array (
    'template' => 'page',
    'fs_format' => 'html',
  ),
  27 => 
  array (
    'template' => 'page',
    'fs_format' => 'html',
  ),

Удаляем все "array (" и "),"

Код поиска:

*[0-9] => 
    'template' => '*[]',
    'fs_format' => '*[]',

Код замены:

UPDATE `Наша-база`.`cute_news` SET `template` = '%2' WHERE `cute_news`.`id` =%1 LIMIT 1 ;
UPDATE `Наша-база`.`cute_story` SET `format` = '%3' WHERE `cute_story`.`post_id` =%1 LIMIT 1 ;

Получаем и вводим в phpmyadmin:

  UPDATE `Наша-база`.`cute_news` SET `template` = '' WHERE `cute_news`.`id` =1 LIMIT 1 ;
UPDATE `Наша-база`.`cute_story` SET `format` = 'html_with_br' WHERE `cute_story`.`id` =1 LIMIT 1 ;
  UPDATE `Наша-база`.`cute_news` SET `template` = 'Default' WHERE `cute_news`.`id` =3 LIMIT 1 ;
UPDATE `Наша-база`.`cute_story` SET `format` = 'html_with_br' WHERE `cute_story`.`id` =3 LIMIT 1 ;
  UPDATE `Наша-база`.`cute_news` SET `template` = 'page' WHERE `cute_news`.`id` =25 LIMIT 1 ;
UPDATE `Наша-база`.`cute_story` SET `format` = 'html' WHERE `cute_story`.`id` =25 LIMIT 1 ;
  UPDATE `Наша-база`.`cute_news` SET `template` = 'page' WHERE `cute_news`.`id` =27 LIMIT 1 ;
UPDATE `Наша-база`.`cute_story` SET `format` = 'html' WHERE `cute_story`.`id` =27 LIMIT 1 ;

Ну и теперь осталось только внести изменения в addnews и editnews:
В addnews и editnews после:

    run_actions('new-save-entry');

    $sql->insert(array(
    'table'  => 'news',
    'values' => array(

Добавляем:

'template' => $template,

После:

    $sql->insert(array(
    'table'  => 'story',
    'values' => array(

Добавляем:

              'format' => $fs_format,

Всё! smile Заходим в админку и радуемся жизни с MySQL`ной базой!
...и если все данные из текстовой базы перенесли, то можем смело удалить файлы "xfield".
Главное не забудьте убрать (физически) все старые плагины, дабы избежать конфликта с новыми.

хм... странно... категории выводятся, а кейворды не хотят... sad roll

попробовал с перестановкой значений, тоже не работает:

<?=($_GET['keywords'] ? $_keywords['name'][$_GET['keywords']] : '');?>
<?=($_GET['keywords'] ? $_keywords[$_GET['name']['keywords']] : '');?>
<?=($_GET['keywords'] ? $_keywords[$_GET['keywords']['name']] : '');?>

<?=($_GET['name']['keywords'] ? $_keywords['name'][$_GET['keywords']] : '');?>
<?=($_GET['name']['keywords'] ? $_keywords[$_GET['name']['keywords']] : '');?>
<?=($_GET['name']['keywords'] ? $_keywords[$_GET['keywords']['name']] : '');?>

<?=($_GET['keywords']['name'] ? $_keywords['name'][$_GET['keywords']] : '');?>
<?=($_GET['keywords']['name'] ? $_keywords[$_GET['name']['keywords']] : '');?>
<?=($_GET['keywords']['name'] ? $_keywords[$_GET['keywords']['name']] : '');?>

11

(4 ответов, оставленных в Проблемы и их решения)

ANT-Soft, там поиск, который по mysql ищет?
Если так, то он у меня и стоит... smile

А на счет "set_time_limit", спасибо за подсказку, попробую! smile

Поисковая система Strawberry 1.1.1 MySQL позволяет искать в нескольких категорий, но когда их становится слишком много, то поиск не справляется.

При поиске в 80+ категориях, скрипт "обрывает" процесс где-то на половине (при этом работает и выдает результаты), но данные "последних каталогов" поиском не обрабатываются...

Быть может, есть способ искать по принципу "во всех каталогах, кроме: ..., ..., ..."?

Код поиска, чтобы ужаснуться! smile

// выводим поиск (аддон)
// show search (add-on)
$static['number'] = '50';
if($_GET['skip']) {$static['skip'] = $_GET['skip'];}
$static['template'] = 'Search';
$static['category'] = '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86';
include rootpath.'/show_search.php';

P.S. Всего на сайте 90 категорий, просто последние хочется отключить от поиска, однако шаблон краткой новости у них важен...

13

(14 ответов, оставленных в Дополнения: готовые)

Система альтернативного кеширования для Strawberry 1.1.1

Иногда стандартная система кеширования дает сбои, либо грузит сервер.
По этому, для снижения нагрузки предлагаю вариант альтернативного кеширования.

Всё достаточно просто. На сайте создаете временную папку, к примеру temp с правами 777, далее в нужных php файлах прописываете следующее:

<?
$url=$_SERVER['REQUEST_URI'];
$crc=md5($url);

$modif=time()-@filemtime ("temp/$crc");

if ($modif<7200)
{ 
include ("temp/$crc");
exit();
}

ob_start ();

 // код выше идет до подключения к движку!

include_once 'strawberry/head.php'; // ваш путь к клубничке и далее ваш код...

...Тут идет код... сайта!
А в самом низу под драг энд дропом...

$cache = ob_get_contents();
ob_end_clean ();
echo $cache;

$fp = @fopen ("temp/$crc", "w");
@fwrite ($fp, $cache);
@fclose ($fp);
?>

- в данном примере время кеширования 7200 секунд.
Скрипт позволяет закешировать страницу целиком и в течении 7200 секунд показывать её из кеша.

Единственно, блоки "только для администратора" при данном кешировании придется отключить.

14

(13 ответов, оставленных в Вопросы связаные с форумом)

На самом деле, он не такой уж и страшный... smile))
Даже где-то на офф.сайте есть типа "конструктор шаблона"...

Недавно прописывал его в стиль сайта, получилось вот так... smile

15

(74 ответов, оставленных в Тестируем новые версии)

Вообще, хотелось бы видеть в новой версии от мелочей, до радикальных исправлений... smile
Самая мелочь: При добавлении новости диалог "Ваша новость успешно добавлена! Посмотреть её на сайте! (ссылка на новость на сайте)"

Далее, улучшить плагин "keywords" чтобы можно было в нём прописать url для кейворда, а также чтобы хоть можно было вывести название открытого кейворда (одного).
Также шаблоны для категорий (шаблоны не для вывода краткой - полной новости, а для самих категорий (и кейвордов)).

Наладить поддержку XML-RPC, чтобы новости можно было бы добавлять и через программный интерфейс, а не только через админку.

В идеале, также нереализованный кросспостинг в ЖЖ, а также другие блог-сервисы.

В поисковой форме отделить "мух от котлет" и вывести шаблон поисковой формы отдельно от скрипта.

Снизить нагрузку на сервер при большом посещении.

Наладить кеширование.

Убрать все возможные текстовые доп.поля.

RSS лента и карта сайта Sitemaps в UTF8 кодировке, вне зависимости от того, какая кодировка на сайте.

Сортировка с поддержкой ЧПУ.

А самое главное - добавить поддержку "безболезненного" перехода с версии 1.1.1 и наверное более ранних тоже... smile


P.S. Может что-либо уже полностью готово, решил навсякий случай перечислить основные косяки предыдущей версии и пожелания к будущей! wink

16

(3 ответов, оставленных в Форум для чайников)

nyesi, молодец, т.к. обновление вещь не простая!
единственное, я бы посоветовал дождаться версии 1.2. т.к. в ней обещают устанить кучу известных глюков.

17

(4 ответов, оставленных в Проблемы и их решения)

Благодарю! smile
Всё дело было в статике и POST запросах.
Изменил на get, убрал ЧПУ и всё заработало! smile

Хорошо, так можно вывести кейворд в открытой новости...
А как можно вывести название кейворда при списке всех новостей с этим кейвордом?
т.е. Новости по теме "Политика" (кейворд политика), далее список кратких новостей...

Решение выше не работает... sad

Для вывода названия категории, использую следующее решение:

<?PHP
$catID = category_get_id($_GET['category']); // получаем id
$catArray = $categories[$catID]; // получаем весь массив категории (название, id, описание, etc)
$catName = $catArray['name']; // берём название
echo ($catName ? 'Категория: '.$catName : ''); // выводим если оно есть
?>

Но при переписании скрипта под "[$_GET['keywords']" чего-то не работает... roll

19

(4 ответов, оставленных в Проблемы и их решения)

В смысле того, что выше по иерархии .htacces`а стоят?
Пробовал, менял...
Также ЧПУ категории search нет... smile
Проблему пока временно решил тем, что показываю только первые 100 результатов... smile

20

(4 ответов, оставленных в Проблемы и их решения)

Strawberry 1.1.1
MySQL, ЧПУ

Переехал на другой хостинг (хотя может и чуть ранее) и в поиске по сайту перестали открываться 2-3 страницы со "скипом".
т.е., к примеру ссылка оканчивается на: ?do=search&search=test&skip=60
А в результатах поиска стоит первая страница...

Но странно в это то, что для ключевых слов и категорий значение skip`а работает без глюков...

Вот и думаю, что-то здесь не так... smile

21

(106 ответов, оставленных в Проблемы и их решения)

дык... smile
Я не камикадзе, чтобы роботов отрубать)))
Я их люблю и всегда рад видеть)) big_smile

Оптимизация и нужна, чтобы сайт роботами хорошо индексировался... wink
А вот как _еще_ нагрузку сбить ума не приложу... roll
На сайте кешируется всё, что можно, в секретные директории роботы не лезут, поиском не пользуются)
НТхостом пользовался, скажу "нет, спасибо!" - после заражения всех php скриптов и html файлов на аккаунте по вине хостинга, больше на него в жизни не перейду...
Остается МастерХост, видимо... Официальный сайт Клубнички на нем и работает... smile

22

(106 ответов, оставленных в Проблемы и их решения)

Хостинг: mchost.ru, сайт посещаемостью 1500 уников, 2200 посещений, кеширование включено и работает.
Информация по нагрузке за последние сутки:

16.02.2010 23:50 51% 
16.02.2010 23:40 479% 
16.02.2010 23:30 469% 
16.02.2010 23:20 109% 
16.02.2010 23:10 43% 
16.02.2010 23:00 66% 
16.02.2010 22:50 68% 
16.02.2010 22:40 128% 
16.02.2010 22:30 124% 
16.02.2010 22:20 50% 
16.02.2010 22:10 81% 
16.02.2010 22:00 79% 
16.02.2010 21:50 102% 
16.02.2010 21:40 61% 
16.02.2010 21:30 107% 
16.02.2010 21:20 156% 
16.02.2010 21:10 88% 
16.02.2010 21:00 96% 
16.02.2010 20:50 164% 
16.02.2010 20:40 163% 
16.02.2010 20:30 122% 
16.02.2010 20:20 86% 
16.02.2010 20:10 149% 
16.02.2010 20:00 120% 
16.02.2010 19:50 122% 
16.02.2010 19:40 106% 
16.02.2010 19:30 132% 
16.02.2010 19:20 110% 
16.02.2010 19:10 132% 
16.02.2010 19:00 151% 
16.02.2010 18:50 195% 
16.02.2010 18:40 133% 
16.02.2010 18:30 151% 
16.02.2010 18:20 138% 
16.02.2010 18:10 146% 
16.02.2010 18:00 129% 
16.02.2010 17:50 122% 
16.02.2010 17:40 134% 
16.02.2010 17:30 148% 
16.02.2010 17:20 109% 
16.02.2010 17:10 191% 
16.02.2010 17:00 126% 
16.02.2010 16:50 152% 
16.02.2010 16:40 111% 
16.02.2010 16:30 120% 
16.02.2010 16:20 98% 
16.02.2010 16:10 111% 
16.02.2010 16:00 95% 
16.02.2010 15:50 139% 
16.02.2010 15:40 130% 
16.02.2010 15:30 125% 
16.02.2010 15:20 113% 
16.02.2010 15:10 152% 
16.02.2010 15:00 87% 
16.02.2010 14:50 107% 
16.02.2010 14:40 92% 
16.02.2010 14:30 143% 
16.02.2010 14:20 119% 
16.02.2010 14:10 135% 
16.02.2010 14:00 115% 
16.02.2010 13:50 138% 
16.02.2010 13:40 106% 
16.02.2010 13:30 166% 
16.02.2010 13:20 95% 
16.02.2010 13:10 138% 
16.02.2010 13:00 158% 
16.02.2010 12:50 102% 
16.02.2010 12:40 89% 
16.02.2010 12:30 109% 
16.02.2010 12:20 116% 
16.02.2010 12:10 121% 
16.02.2010 12:00 107% 
16.02.2010 11:50 99% 
16.02.2010 11:40 102% 
16.02.2010 11:30 76% 
16.02.2010 11:20 114% 
16.02.2010 11:10 74% 
16.02.2010 11:00 68% 
16.02.2010 10:50 87% 
16.02.2010 10:40 107% 
16.02.2010 10:30 96% 
16.02.2010 10:20 108% 
16.02.2010 10:10 87% 
16.02.2010 10:00 107% 
16.02.2010 09:50 122% 
16.02.2010 09:40 78% 
16.02.2010 09:30 111% 
16.02.2010 09:20 90% 
16.02.2010 09:10 109% 
16.02.2010 09:00 183% 
16.02.2010 08:50 107% 

Кроме клубнички других скриптов не используется, комментарии на сайте отключены и не используются...

23

(11 ответов, оставленных в Флуд)

Проверенно, mchost плохо держит нагрузку (как с кешированием, так и без него)...
Предлагают перейти на vpn...

А можно ли сделать какой-то фильтр, чтобы "$tpl['post']['dateheader']" выводился только один раз? roll

UPD big_smile
Можно!
Привязав функцию вместо даты к категории:

    if ($config['date_header'] and $dateheader != langdate($config['date_headerformat'], $row['category'])){
        $tpl['post']['dateheader'] = $dateheader = langdate($config['date_headerformat'], $row['category']);
    } else {
        $tpl['post']['dateheader'] = '';
    }

500-тую ошибку выдает при длительном ожидании?
Если да, то глючит функция namespace(totranslit($title)).
Попробуйте на время тестирования в addnews:
вместо:

 'url'      => ($url ? namespace($url) : namespace(totranslit($title))),

поставить:

'url'      => ($url ? $id),

тоже самое делаем в editnews, кроме этого в editnews комментирует этот фрагмент:

    run_actions('new-save-entry');

    foreach($sql->select(array('table' => 'users')) as $row){
        $sql->update(array(
        'table'  => 'users',
        'where'  => array("username = $member[username]"),
        'values' => array('publications' => sizeof($sql->select(array('table' => 'news', 'where' => array("author = $member[username]")))))
        ));
    }


    if ($config['send_mail_upon_new'] and $config['admin_mail']){
        ob_start();
        include mails_directory.'/new_post.tpl';
        $tpl['body'] = ob_get_clean();

        preg_match('/Subject:(.*)/i', $tpl['body'], $tpl['subject']);
        preg_match('/Attachment:(.*)/i', $tpl['body'], $tpl['attachment']);

        $tpl['body']       = preg_replace('/Subject:(.*)/i', '', $tpl['body']);
        $tpl['body']       = preg_replace('/Attachment:(.*)/i', '', $tpl['body']);
        $tpl['body']       = trim($tpl['body']);
        $tpl['subject']    = trim($tpl['subject'][1]);
        $tpl['attachment'] = trim($tpl['attachment'][1]);

        cute_mail($config['admin_mail'], $tpl['subject'], $tpl['body'], $tpl['attachment']);
    }