Реализуем панель настроек нашего движка. Часть 5

 

Всем доброго времени суток! Спасибо что не покидаете и продолжаете читать страницы данного блога Краснею. Сегодня я напишу последний пост касающийся глобального цикла статей "Создать блог с нуля". В последней заметке мы доделаем панель настроек нашего небольшого движка. Нам осталось совсем ничего, а именно вывести опции управления переменными которые мы создали в прошлой заметке.

Нам сегодня понадобится:

  • Дополнить шаблон нашей панели
  • Немного по колдовать с модулем настроек
  • Ну и наконец дополнить обработчик для вставки необходимой строчки с значениями в колонку configblog таблицы page.

Давайте поговорим об этом чуть (прям самую малость Улыбаюсь) подробнее...

 

 

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

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

Для генерации всплывающего списка будем использовать знакомую нам функцию queCFG(). В шаблоне пропишем знакомый нам код (а именно тег select с выдуманными код-словами). А в обработчике приделаем к переменной newCFGpage еще несколько значений.

В общем то на этом заканчивается реализация настроек Улыбаюсь Даже как то не по себе писать об этом отдельный пост Хмурюсь

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

 

Для тех кто на блоге в первый раз

 

Если Вы попали на данную страницу по слово сочетанию "Свой движок" или "Блог с нуля" (ну или что-то типа этого Улыбаюсь) то Вы должны знать, Вы попали туда куда нужно! Данный материал является частью глобального цикла статей "Создать блог с нуля". Данный цикл повествует о том как создать свой движок персонального блога на великом и могучем php.

Полученный результат конечно не ворд пресс, но движок вполне пригодный для ведение своего блога в сити. К тому же знание устройства данного движка поможет Вам переделать его в нечто иное. Я например совсем недавно заточил его под небольшой интернет магазин.

В общем если Вам интересна данная тематика, то переходите по вот этой ссылке (или той что чуть выше) и приступайте к изучению.

Так же, я совсем скоро, буквально на днях, опубликую уже готовую и протестированную копию разрабатываемого нами проекта. Если Вы не хотите пропустить данное событие (ну и естественно другой, возможно, полезный материал), то обязательно подпишитесь на RSS ленту блога через ридер, или же по почте.

 

Новые строчки в шаблоне

 

Давайте откроем наш шаблон configblog.html и пропишем в нем несколько новых строчек. Предупреждаю сразу, все код-слова и имена атрибутов name придуманы, то есть взяты из головы.

Я дам Вам полный код шаблона, там ничего сложного нет:

<form action="index.php?page=configblog" method="post" name="form">
<table width="700px" cellpadding="5" cellspacing="0" border="0" align="center">
    <tr>
        <td style="border-bottom:1px solid #dcdcdc;font-weight:bold;" valign="top" align="left">Общие настройки</td>
        <td style="border-bottom:1px solid #dcdcdc;"></td>
    </tr>
    <tr>
        <td style="border-bottom:1px solid #dcdcdc;" valign="top" align="left">Заголовок блога</td>
        <td style="border-bottom:1px solid #dcdcdc;" valign="top" align="right">
        <input style="width:200px;font-weight:100;font-size:11px;" name="cfgtitleBLOG" type="text" value="[_title]">
    </td>
    </tr>
    <tr>
        <td style="border-bottom:1px solid #dcdcdc;" valign="top" align="left">Описание блога</td>
        <td style="border-bottom:1px solid #dcdcdc;" valign="top" align="right">
        <input style="width:200px;font-weight:100;font-size:11px;" name="cfgmetaDBLOG" type="text" value="[_metaD]">
    </td>
    </tr>
    <tr>
        <td style="border-bottom:1px solid #dcdcdc;" valign="top" align="left">Ключевые слова блога</td>
        <td style="border-bottom:1px solid #dcdcdc;" valign="top" align="right">
        <input style="width:200px;font-weight:100;font-size:11px;" name="cfgmetaKBLOG" type="text" value="[_metaK]">
    </td>
    </tr>
    <tr>
        <td style="border-bottom:1px solid #dcdcdc;font-weight:bold;" valign="top" align="left">Настройки администратора</td>
        <td style="border-bottom:1px solid #dcdcdc;"></td>
    </tr>
    <tr>
        <td style="border-bottom:1px solid #dcdcdc;" valign="top" align="left">Логин</td>
        <td style="border-bottom:1px solid #dcdcdc;" valign="top" align="right">
        <input style="width:200px;font-weight:100;font-size:11px;" name="cfgloginBLOG" type="text" value="[_login]">
    </td>
    </tr>
    <tr>
        <td style="border-bottom:1px solid #dcdcdc;" valign="top" align="left">Пароль (новый)</td>
        <td style="border-bottom:1px solid #dcdcdc;" valign="top" align="right">
        <input style="width:200px;font-weight:100;font-size:11px;" name="cfgpassDBLOG" type="password" value="">
    </td>
    </tr>
    <tr>
        <td style="border-bottom:1px solid #dcdcdc;font-weight:bold;" valign="top" align="left">Режимы работы блога</td>
        <td style="border-bottom:1px solid #dcdcdc;"></td>
    </tr>
    <tr>
        <td style="border-bottom:1px solid #dcdcdc;" valign="top" align="left">Премодерация комм.</td>
        <td style="border-bottom:1px solid #dcdcdc;" valign="top" align="right">
            <select style="font-family:Verdana;font-weight:100;font-size:11px;" name="viewwl">
                [_cfgvwl]
            </select>
        </td>
    </tr>
    <tr>
        <td style="border-bottom:1px solid #dcdcdc;" valign="top" align="left">Человеко-Понятный Урл</td>
        <td style="border-bottom:1px solid #dcdcdc;" valign="top" align="right">
            <select style="font-family:Verdana;font-weight:100;font-size:11px;" name="viewchpu">
                [_cfgvchp]
            </select>
        </td>
    </tr>
    <tr>
        <td style="border-bottom:1px solid #dcdcdc;font-weight:bold;" valign="top" align="left">Настройки модулей</td>
        <td style="border-bottom:1px solid #dcdcdc;"></td>
    </tr>
    <tr>
        <td style="border-bottom:1px solid #dcdcdc;padding:5px;" valign="top" align="left">Топ статьи</td>
        <td style="border-bottom:1px solid #dcdcdc;padding:5px;" valign="top" align="right">
            <select style="font-family:Verdana;font-weight:100;font-size:11px;" name="viewtd">
                [_cfgvtd]
            </select>
        </td>
    </tr>
    <tr>
        <td style="border-bottom:1px solid #dcdcdc;padding:5px;" valign="top" align="left">Опрос</td>
        <td style="border-bottom:1px solid #dcdcdc;padding:5px;" valign="top" align="right">
            <select style="font-family:Verdana;font-weight:100;font-size:11px;" name="viewpoll">
                [_cfgvp]
            </select>
        </td>
    </tr>
    <tr>
        <td style="border-bottom:1px solid #dcdcdc;padding:5px;" valign="top" align="left">Подписчики</td>
        <td style="border-bottom:1px solid #dcdcdc;padding:5px;" valign="top" align="right">
            <select style="font-family:Verdana;font-weight:100;font-size:11px;" name="viewread">
                [_cfgvrd]
            </select>
        </td>
    </tr>
    <tr>
        <td style="border-bottom:1px solid #dcdcdc;padding:5px;padding-left:20px;" valign="top" align="left">Имя в feedburner</td>
        <td style="border-bottom:1px solid #dcdcdc;padding:5px;" valign="top" align="right">
            <input style="width:200px;font-weight:100;font-size:11px;" name="cfgrssKBLOG" type="text" value="[_rssacc]">
        </td>
    </tr>
    <tr>
        <td style="border-bottom:1px solid #dcdcdc;padding:5px;padding-left:20px;" valign="top" align="left">Имя в twitter</td>
        <td style="border-bottom:1px solid #dcdcdc;padding:5px;" valign="top" align="right">
            <input style="width:200px;font-weight:100;font-size:11px;" name="cfgetwKBLOG" type="text" value="[_twacc]">
        </td>
    </tr>
    <tr>
        <td style="border-bottom:1px solid #dcdcdc;padding:5px;" valign="top" align="left">Последние комм.</td>
        <td style="border-bottom:1px solid #dcdcdc;padding:5px;" valign="top" align="right">
            <select style="font-family:Verdana;font-weight:100;font-size:11px;" name="viewlastcomm">
                [_cfgvlc]
            </select>
        </td>
    </tr>
    <tr>
        <td style="border-bottom:1px solid #dcdcdc;padding:5px;" valign="top" align="left">Похожие посты</td>
        <td style="border-bottom:1px solid #dcdcdc;padding:5px;" valign="top" align="right">
            <select style="font-family:Verdana;font-weight:100;font-size:11px;" name="viewmorepost">
                [_cfgvmp]
            </select>
        </td>
    </tr>
    <tr>
        <td valign="top" colspan="2" align="center">
            <br/><br/><input type="submit" value="Сохранить настройки">
        </td>
    </tr>
</table>
</form>
<br/><br/>

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

Теперь у нас есть приблизительно вот такой лист с настройками:

 

список настроек нашего движка

 

Опции пока что пустые, но это не удивительно ведь там непонятные для браузера код-слова Улыбаюсь

 

Редактируем модуль листа настроек

 

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

 

Редактируем функцию configblog()

Думаю стоит начать именно с этого. Что нам необходимо? Нам необходимо с генерировать списки используя функцию queCFG() (очень сильно надеюсь что Вы помните как ей пользоваться Улыбаюсь)

Напомню, что результатом данной функции будет набор тегов option. Данные теги мы в клеем в шаблон вместо код-слов. Тут очень важно быть внимательным, так как код однообразный, очень легко что-то напутать. Я Вам выложу полный код функции configblog(), там все за комментировано, так что не сложно будет разобраться:

function configblog()//Функция вывода списка настроек блога
{
    $result_page = mysql_query("SELECT * FROM page WHERE id='1'");//выводим все поля из таблицы page
    $myrow_page = mysql_fetch_array($result_page);
    
    $result_user = mysql_query("SELECT login FROM user WHERE id='1'");//вытаскиваем логин админа из базы данных
    $myrow_user = mysql_fetch_array($result_user);
        
    $sm_read = file("templates/configblog.html");//...подключаем шаблон
    $sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его

    $configMODULS = explode("|",$myrow_page['configblog']);//Выводим настройки

    //-----ЧПУ----
    $vchpQUEtxt = array("Отключен","Включен");//Вариант для человека
    $vchpQUEint = array(0,1);//Вариант для скрипта
    $vchp = queCFG($configMODULS[0],$vchpQUEtxt,$vchpQUEint);//формируем option для пункта "ЧПУ"
    //-----ЧПУ----

    //-----премодерация комментариев----
    $vwlQUEtxt = array("Отключена","Включена");//Вариант для человека
    $vwlQUEint = array(0,1);//Вариант для скрипта
    $vwl = queCFG($configMODULS[1],$vwlQUEtxt,$vwlQUEint);//формируем option для пункта "премодерация комментариев"
    //-----премодерация комментариев----
    
    //-----Топ статьи----
    $vtdQUEtxt = array("Отключен","Включен");//Вариант для человека
    $vtdQUEint = array(0,1);//Вариант для скрипта
    $vtd = queCFG($configMODULS[2],$vtdQUEtxt,$vtdQUEint);//формируем option для пункта "Топ статьи"
    //-----Топ статьи----
    
    //-----опрос----
    $vpQUEtxt = array("Отключен","Включен");//Вариант для человека
    $vpQUEint = array(0,1);//Вариант для скрипта
    $vp = queCFG($configMODULS[3],$vpQUEtxt,$vpQUEint);//формируем option для пункта "опрос"
    //-----опрос----
    
    //-----подписчики----
    $vrdQUEtxt = array("Отключен","Включен");//Вариант для человека
    $vrdQUEint = array(0,1);//Вариант для скрипта
    $vrd = queCFG($configMODULS[4],$vrdQUEtxt,$vrdQUEint);//формируем option для пункта "подписчики"
    //-----подписчики----
    
    //-----Последние комм.----
    $lcQUEtxt = array("Отключены","Включены");//Вариант для человека
    $lcQUEint = array(0,1);//Вариант для скрипта
    $lc = queCFG($configMODULS[7],$lcQUEtxt,$lcQUEint);//формируем option для пункта "Последние комм."
    //-----Последние комм.----
    
    //-----Похожие посты----
    $mpQUEtxt = array("Отключены","Включены");//Вариант для человека
    $mpQUEint = array(0,1);//Вариант для скрипта
    $mp = queCFG($configMODULS[8],$mpQUEtxt,$mpQUEint);//формируем option для пункта "Похожие посты"
    //-----Похожие посты.----
    
    //Замена код-слов
    $sm_read = str_replace("[_title]",$myrow_page['title'],$sm_read);//заголовок
    $sm_read = str_replace("[_metaD]",$myrow_page['meta_d'],$sm_read);//описание
    $sm_read = str_replace("[_metaK]",$myrow_page['meta_k'],$sm_read);//ключевые слова
    $sm_read = str_replace("[_login]",$myrow_user['login'],$sm_read);//логин
    
    $sm_read = str_replace("[_cfgvchp]",$vchp,$sm_read);//ЧПУ
    $sm_read = str_replace("[_cfgvwl]",$vwl,$sm_read);//модерация
    
    $sm_read = str_replace("[_cfgvtd]",$vtd,$sm_read);//топ посты
    $sm_read = str_replace("[_cfgvp]",$vp,$sm_read);//опрос
    $sm_read = str_replace("[_cfgvrd]",$vrd,$sm_read);//подписчики
    $sm_read = str_replace("[_rssacc]",$configMODULS[5],$sm_read);//акк rss
    $sm_read = str_replace("[_twacc]",$configMODULS[6],$sm_read);//акк твитера
    $sm_read = str_replace("[_cfgvlc]",$lc,$sm_read);//последние комм
    $sm_read = str_replace("[_cfgvmp]",$mp,$sm_read);//похожие посты
    
    return $sm_read;//Выводим с генерированный html код
}

Каждый вызов функции queCFG() я выделил в блоки. Что касается замены код-слов, то новые строчки кода находятся в последним абзаце.

Теперь при запуске листа с настройками мы должны увидеть вот такую картину

 

Список настроек после редактирования модуля

 

Редактируем обработчик

Нам осталось отредактировать обработчик. Давайте я опубликую полностью обработчик, потом поясню некоторые особенности. Вот код обработчика:

//ОБРАБОТЧИК
//определяем переменные
if(isset($_POST['cfgtitleBLOG']))$cfgtitleBLOG = $_POST['cfgtitleBLOG'];
if(isset($_POST['cfgmetaDBLOG']))$cfgmetaDBLOG = $_POST['cfgmetaDBLOG'];
if(isset($_POST['cfgmetaKBLOG']))$cfgmetaKBLOG = $_POST['cfgmetaKBLOG'];
if(isset($_POST['cfgloginBLOG']))$cfgloginBLOG = $_POST['cfgloginBLOG'];
if(isset($_POST['cfgpassDBLOG']))$cfgpassDBLOG = $_POST['cfgpassDBLOG'];

if(isset($_POST['viewwl']))$viewwl = $_POST['viewwl'];
if(isset($_POST['viewchpu']))$viewchpu = $_POST['viewchpu'];

if(isset($_POST['viewtd']))$viewtd = $_POST['viewtd'];
if(isset($_POST['viewpoll']))$viewpoll = $_POST['viewpoll'];
if(isset($_POST['viewread']))$viewread = $_POST['viewread'];
if(isset($_POST['cfgrssKBLOG']))$cfgrssKBLOG = $_POST['cfgrssKBLOG'];
if(isset($_POST['cfgetwKBLOG']))$cfgetwKBLOG = $_POST['cfgetwKBLOG'];
if(isset($_POST['viewlastcomm']))$viewlastcomm = $_POST['viewlastcomm'];
if(isset($_POST['viewmorepost']))$viewmorepost = $_POST['viewmorepost'];

//обращение к БД
if(isset($viewtd) AND isset($viewpoll) AND isset($viewread) AND isset($cfgrssKBLOG) AND isset($cfgetwKBLOG) AND isset($viewlastcomm) AND isset($viewmorepost) AND isset($viewwl) AND isset($viewchpu) AND isset($cfgloginBLOG) AND $cfgloginBLOG != "" AND isset($cfgpassDBLOG) AND isset($cfgtitleBLOG) AND isset($cfgmetaDBLOG) AND isset($cfgmetaKBLOG))//если переменная форма была заполнена и отправлена
{
    //Код сбора значений настроек в строчку типа - 0|0|1|0|0|1
    $newCFGpage = $viewchpu."|".$viewwl."|".$viewtd."|".$viewpoll."|".$viewread."|".$cfgrssKBLOG."|".$cfgetwKBLOG."|".$viewlastcomm."|".$viewmorepost;
    
    //КОД ОБНОВЛЕНИЕ НАСТРОЕК
    $newCONFIGpage = mysql_query ("UPDATE page SET title='$cfgtitleBLOG', meta_d='$cfgmetaDBLOG', meta_k='$cfgmetaKBLOG', configblog='$newCFGpage' WHERE id='1'");//обнавляем настройки
    //КОД ОБНОВЛЕНИЕ НАСТРОЕК
    
    //КОД ОБНОВЛЕНИЕ ЛОГИНА И ПАРОЛЯ
    if($cfgpassDBLOG != "")//Если поле пароль не пустое
    {        
        $newpass = md5($cfgpassDBLOG);//шифруем новый пароль
        $sql = "UPDATE user SET login='$cfgloginBLOG',pass='$newpass' WHERE id='1'";//создаем запрос на обновления логина и пароля
    }
    else $sql = "UPDATE user SET login='$cfgloginBLOG' WHERE id='1'";//если пароль пустой, то обновляем только логин.
                                    //данный запрос на обновление может показаться лишним (в общем то так оно и есть),
                                    //но лучше обновить нежели выводить из базы данных логин и пытаться
                                    //определеить поменялся ли он (сравнивать занчение в базе данных
                                    //с значением присланным из формы).
    
    $newCONFIGuser = mysql_query ($sql);//обнавляем поля логина и/или пароля
    //КОД ОБНОВЛЕНИЕ ЛОГИНА И ПАРОЛЯ
    
    header("location: index.php?page=configblog");//Переносим пользовотеля на страницу с списком настроек
    exit;
}
//ОБРАБОТЧИК

 Что же тут появилось нового? Ну во-первых я объявил переменные которые должны придти из формы. Вот этот блок кода:

if(isset($_POST['viewtd']))$viewtd = $_POST['viewtd'];
if(isset($_POST['viewpoll']))$viewpoll = $_POST['viewpoll'];
if(isset($_POST['viewread']))$viewread = $_POST['viewread'];
if(isset($_POST['cfgrssKBLOG']))$cfgrssKBLOG = $_POST['cfgrssKBLOG'];
if(isset($_POST['cfgetwKBLOG']))$cfgetwKBLOG = $_POST['cfgetwKBLOG'];
if(isset($_POST['viewlastcomm']))$viewlastcomm = $_POST['viewlastcomm'];
if(isset($_POST['viewmorepost']))$viewmorepost = $_POST['viewmorepost'];

Условие привычное. Далее необязательный шаг, но все же я его выполняю. Я говорю про условие с кучей AND и переменных Смеюсь. Вот этот блок кода:

if(isset($viewtd) AND isset($viewpoll) AND isset($viewread) AND isset($cfgrssKBLOG) AND isset($cfgetwKBLOG) AND isset($viewlastcomm) AND isset($viewmorepost) AND isset($viewwl) AND isset($viewchpu) AND isset($cfgloginBLOG) AND $cfgloginBLOG != "" AND isset($cfgpassDBLOG) AND isset($cfgtitleBLOG) AND isset($cfgmetaDBLOG) AND isset($cfgmetaKBLOG))//если переменная форма была заполнена и отправлена
{
...
}

Тут я проверяю существование совершенно всех переменных которые может прислать форма. В случае если все переменные присутствую, то выполняется сам код обработчика.

Далее, пожалуй самое главное, это склеивание переменной $newCFGpage. Почему самое главное? Потому что очень важно соблюдать порядок (очередь) приклеивание переменных. Если нарушить очередь значений в строчке типа:

1|0|0|0|1|0

то подключение и отключение модулей будет производится не корректно, ведь движок распределяет значения для каждого из модулей по очереди, и ни как иначе. Я надеюсь что Вы поняли о чем я Улыбаюсь Так или иначе, для нашего движка правильная очередь склеивание переменных вот такая:

$newCFGpage = $viewchpu."|".$viewwl."|".$viewtd."|".$viewpoll."|".$viewread."|".$cfgrssKBLOG."|".$cfgetwKBLOG."|".$viewlastcomm."|".$viewmorepost;

На этом в общем то все. Вы теперь можете зайти в лист настроек, включить нужные Вам модули. После сохранения, в базе данных, в таблице page колонка configblog, появится с генерированная нами строчка, которая позволит воздействовать на подключение и отключение кода модулей. Все это выглядит приблизительно вот так:

 

результат работы

 

Заключение

 

Ну что же... Вот и подошел к концу наш цикл статей "Создать блог с нуля", с чем я Вас всех и поздравляю Улыбаюсь. Движок конечно еще сыроват, но описывать все отловленные глюки мне жизни не хватит Смеюсь, именно поэтому, совсем скоро (через пару, тройку дней), для своих читателей я опубликую актуальную на сегодняшний день версию данного движка (2.8.0).

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

Ладно, о нововведениях движка поговорим чуть позже, а на сегодня все, удачи Вам! Улыбаюсь

Исходник

________

P.S.: Являетесь обладателем iMac? Если у Вас, не дай бог, с данной аппаратурой что-то случилось, то могу посоветовать один сервисный центр apple. mac-profi.ru предлагает услуги  ремонта imac на дому. Как описано на их сайте они специализируются на ремонте apple, ремонте моноблоков, и многом другом. В общем если Вам нужна помощь данного рода, то заходите, Вам там помогут.

 

Возможно Вам будут интересны следующие заметки

Комментарии (6)

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
Вы не подтвердили условия политики конфиденциальности.
Andrew, 06 Октября 2012 г. 01:10 пишет:
Читатель
Подскажите целесообразно ли, если отдать конкретном пользователя вести определенные рубрики в блоге. И как это можно реализовать допустим на вашем проекте.
Rio-Shaman, 06 Октября 2012 г. 11:32 пишет:
Автор
К сожалению движок приписан к категории "Персональный блог", то есть зарегистрированный пользователь с доступом в админ панель может быть только один. Код авторизации заточен на распознание только одной строки в базе данных (строки которая содержит данные администратора). Внутри самой админ панели нет никаких ограничений по доступу. Таким образом если вводить новую возможность коллективного ведения блога, то придется переписать большую часть движка. Я не говорю что это не реально, скорее это довольно долго и нудно =)))
Ответ для пользователя: Andrew
CoopeR, 12 Июня 2013 г. 13:58 пишет:
Читатель
Сколько времени хотел иметь свою CMS-ку и вот она)) Закончились статьи по улучшению, сложно было в некоторых моментах но всё позади)) старался понять как работает каждая строчка php благо (спасибо Вам) вы комментили каждый шаг)) Раньше занимался в основном вёрсткой страничек, ну а теперь самое интересное начнётся - подгонять шаблон под админку))

PS. хотелось бы увидеть ещё одну статейку - по оптимизации и обезопасивании кода админки, я в этом не силён просто читал комменты бывалых прогеров в некоторых статьях, которые ругались на примитивность кода. Знаю что это было сделано специально для лёгкого понимания новичков, но как бы, всё что было дано уже пройдено и из лёгкого к сложному хотелось бы перейти, типа: новый уровень))
Сергей, 07 Декабря 2013 г. 02:19 пишет:
Читатель
Rio-Shaman, вы не могли бы скинуть полный исходник проекта на почту. не могу сообразить структуру читал читал статью, не выходит. Хочу с полного исходника изучить.
Ответ для пользователя: Rio-Shaman
Denis, 27 Марта 2015 г. 23:35 пишет:
Читатель
А модуль поиска по блогу как то реализован? Или лучше использовать стороние скрипты - гугл поиск и тд? И еще интерисует подписка на комментарии она както осуществима?
Алексей, 28 Марта 2015 г. 12:20 пишет:
Автор
А модуль поиска по блогу как то реализован?
Нет не реализован. Самое лучше конечно подключить уже готовый сервис от гугла или яндекса.
Ответ для пользователя: Denis