За последние 24 часа нас посетили 15877 программистов и 1665 роботов. Сейчас ищут 799 программистов ...

Движок для сайта.

Тема в разделе "Прочие вопросы по PHP", создана пользователем Hawk, 10 мар 2008.

Статус темы:
Закрыта.
  1. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Горбунов Олег
    Спасибо, убедил :)
     
  2. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    зря убедил ))
     
  3. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Горбунов Олег правильно убедил. Есть логика приложения, но бывает ещё и логика шаблона когда к примеру надо сделать черезстрочные background в таблице или отображать кнопку при определённых условиях. Такие вещи меняются в шаблонах а не в самом приложении. Так легче и сильно упрощается логика приложения.
     
  4. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    да. но не так как в смарти.
    Где начать холивар?
     
  5. tmanager

    tmanager Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    Меня никогда не подводил.

    Мне ли бояться своего кода?

    Что же касается заказчика... Здесь +Sten+ уже спрашивал: а сможет ли "не программист" правильно переделать шаблон?
    Проверено многократно: нет, не сможет.

    Поэтому пусть управляет содержанием (контентом) -- что и отражает термин CMS.

    Честно говоря, в моём CMS шаблонов нет вообще.
     
  6. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    а также нет модели и контроллеров :) В моей CMS ни одного бага!

    tmanager
    А если серьезно, то расскажи как у тебя структура построена. Уж очень заинтересовал подход без шаблонов. А то я дурак мучаюсь всю жизнь шаблоны рисую, вдруг зря :)
     
  7. tmanager

    tmanager Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    Есть класс page. Он занимается составлением HTML-кода страницы, сохранением его на диск, сохранением параметров страницы в базе данных и извлечением этих параметров из базы данных.

    "Дети" этого класса могут переопределять частично или полностью логику построения HTML-кода страницы.

    Т.е. появились страницы, для которых нужна особая логика -- пишешь подкласс и записываешь его в папку для классов. "Пропишется" он в моём CMS автоматически.

    Работа с CMS строится так: создаётся структура меню для каждой языковой версии. К пунктам меню подкючаются страницы -- указывается класс создаваемой страницы (в списке, понятно, человеческие названия, типа "статья" и т.п.) -- и выводятся все поня, которые для данного типа надо заполнить.

    Мой CMS не исключает шаблоны. Соотв. метод может принять параметр ИмяШаблона и склепать по нему страничку.
    Ни разу не пригодилось.

    Ну если так удобней -- то не зря. Был бы результат хороший.

    А мне, признаться, неудобно. Поддержку шаблонов я вообще-то для заказчиков делал. Думал, вдруг на них нападёт блажь шаблоны редактировать. Пока Бог миловал.
     
  8. Hawk

    Hawk Активный пользователь

    С нами с:
    30 авг 2007
    Сообщения:
    201
    Симпатии:
    0
    Адрес:
    Беларусь
    Код, код господа выкладываем, а то разговор в тупик заходит...
     
  9. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    tmanager сделай для васи пупкина аналог сайта с другим дизайном.
     
  10. tmanager

    tmanager Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    Пусть Вася Пупкин со мной свяжется. Сойдёмся с ним в цене -- будет сайтик с классным CMS
     
  11. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Спасибо за развернутый ответ, но вопросы конечно остались.
    Т.е. у тебя в классе Page логика отобображения страницы + HTML-код?

    Приведи пожалуйста пример одного из своих классов Page
     
  12. tmanager

    tmanager Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    Класс page для tmanager.ru

    Синтаксис ещё 4-го php, так как класс древний. Всё не соберусь переписать.

    PHP:
    1.  
    2. <?php
    3. require_once dirname(__FILE__)."/../inc/conn.php";  //Подключение к MySQL
    4. require_once dirname(__FILE__)."/menu.class.php";   //Формирование меню
    5. require_once dirname(__FILE__)."/select.class.php"; //Простроение <select>
    6. require_once dirname(__FILE__).'/area.class.php';   //"шапки" и нижние части
    7. require_once dirname(__FILE__).'/banner.class.php'; //Для кого-то делал баннерную рулетку
    8.  
    9. //Базовый класс для всех страниц.
    10.  
    11. class page
    12. {
    13.     //Определяем свойства
    14.     var $id;                //  id страницы в таблице pages
    15.     var $itemID;        //  id пункта меню (таблица items)
    16.     var $title;  
    17.     var $keywords;  
    18.     var $description;  
    19.     var $css;
    20.     var $jsFile;
    21.     var $js;//Не надо в базу
    22.     var $content;          //Текст, который метод content() дочерних классов может быть использован как параметр
    23.     var $contentName; //название текста в $this->content
    24.     var $classID;          // Класс страницы
    25.     var $className;   // Класс страницы
    26.     var $lng;                   //Язык страницы (int)
    27.     var $language;      //Язык страницы (string)
    28.     var $filename;  //Имя файла страницы
    29.     var $left;
    30.     var $base;// относительный путь к корневой папке -- для меню
    31.     var $menu_prefix; //
    32.  
    33.     var $textarea_h_mm;// Высота текстареа для ввода контента. Для разных классов -- может быть разной
    34.  
    35.     //----------------------------
    36.  
    37.     //Получение свойств (не всех -- а только "абстрактных")
    38.     // страницы из базы данных
    39.     function get()
    40.     {
    41.         //echo "Началсь get(".$this->id.")";
    42.         global $conn;
    43.        
    44.         //Установим значения свойств по умолчанию
    45.         if (!isset($this->itemID))
    46.             $this->itemID=0;
    47.         $this->title="ТурМенеджер";
    48.         $this->css="../default.css";
    49.         $this->jsFile="";
    50.         $this->js="";//Не надо в базу
    51.  
    52.         $this->keywords="туризм автоматизация ТурМенеджер Максименко Кашаев";  
    53.         $this->description="Сайт программы ТурМенеджер";  
    54.  
    55.         $this->content="";
    56.         $this->lng=1;
    57.         $this->language="russian";
    58.         $this->left="";
    59.         if ($this->id!=null)
    60.         {
    61.  
    62.             $query="select * from pages where id=" .$this->id;
    63.             $res=mysql_query($query,$conn) or die(mysql_error());
    64.  
    65.             while ($row=mysql_fetch_assoc($res))
    66.             {
    67.                 $this->title=stripslashes($row["title"]);
    68.                 $this->css=stripslashes($row["css"]);
    69.                 $this->jsFile=stripslashes($row["jsFile"]);
    70.  
    71.                 $this->content=stripslashes($row["content"]);
    72.                 $this->lng=(int)$row["lng"];
    73.  
    74.                 if ($this->lng!=1)
    75.                     $this->get_language();
    76.                 $this->classID=(int)$row["classID"];
    77.                 //$this->className=$row["className"];
    78.                 $this->itemID=(int)$row["itemID"];
    79.                 $this->filename=$row["filename"];
    80.                 $this->keywords=str_replace(""","",stripslashes($row["keywords"]));
    81.                 $this->description=str_replace(""","",stripslashes($row["description"]));
    82.             }
    83.             mysql_free_result($res);
    84.         }
    85.  
    86.     }
    87.  
    88. //---------------------------------------------------------------------------------------
    89. function get_language()
    90.     {
    91.     global $conn;
    92.         global $_SERVER;
    93.  
    94.         $query="select language from languages where id=". $this->lng;
    95.         $result2=mysql_query($query,$conn);
    96.         while ($row2=mysql_fetch_array($result2,MYSQL_ASSOC))
    97.         {
    98.             $this->language=strtolower ($row2["languageName"]);
    99.         }
    100.         mysql_free_result($result2);
    101.     }
    102.  
    103.  
    104. //---------------------------------------------------------------------------------------
    105.  
    106. //получение класса по ID
    107. function page_class($id)
    108.     {
    109.         global $conn;
    110.         $classID=null;
    111.         if ($id==null)
    112.             {
    113.             $query="select id as classID from classes limit 0,1";
    114.             }
    115.         else
    116.             {
    117.             $query="select classID from pages where id=$id";
    118.             }
    119.         $result=mysql_query($query,$conn);
    120.         while($row=mysql_fetch_array($result,MYSQL_ASSOC))
    121.             {
    122.             $classID=$row["classID"];
    123.             }
    124.         mysql_free_result($result);
    125.        
    126.         //Проверим
    127.         $query="select count(id) as n from classes where id=$classID";
    128.         $result=mysql_query($query,$conn);
    129.         $n=mysql_result($result,0,0);
    130.         mysql_free_result($result);
    131.  
    132.         if ($n==0)
    133.              $classID=null;
    134.  
    135.         if (($id!=null)&&($classID==null))
    136.             {
    137.             $className="";
    138.             $query="select className from pages where id=$id";  
    139.             $result=mysql_query($query,$conn);
    140.             while($row=mysql_fetch_array($result,MYSQL_ASSOC))
    141.                 {
    142.                 $className=$row["className"];
    143.                 }
    144.             mysql_free_result($result);
    145.             if ($className!="")
    146.                 {
    147.                 $query="select id as classID from classes where className='$className'";
    148.                 $result=mysql_query($query,$conn);
    149.                 while($row=mysql_fetch_array($result,MYSQL_ASSOC))
    150.                         {
    151.                         $classID=$row["classID"];
    152.                         }
    153.                 }
    154.             }
    155.  
    156.  
    157.         return $classID;   
    158.  
    159.     }
    160.  
    161. //---------------------------------------------------------------------------------------
    162. function get_classID()
    163.     {
    164.         global $conn;
    165.         global $_SERVER;
    166.  
    167.                 $query="select id as classID from classes where className='".$this->className."'";
    168.                 $result=mysql_query($query,$conn);
    169.                 while($row=mysql_fetch_array($result,MYSQL_ASSOC))
    170.                         {
    171.                         $this->classID=$row["classID"];
    172.                         }
    173.     }
    174.  
    175. //---------------------------------------------------------------------------------------
    176.  
    177. function get_parent()
    178.     {
    179.         global $conn;
    180.                 $parentID=-1;
    181.                 $query="select parentID  from items where id=".$this->itemID;
    182.                 $result=mysql_query($query,$conn);
    183.                 while($row=mysql_fetch_array($result,MYSQL_ASSOC))
    184.                         {
    185.                         $parentID=$row["parentID"];
    186.                         }
    187.                 return $parentID;
    188.     }
    189.  
    190. //--------------------------------------------------------------------------------------
    191.  
    192. //Форма редактирования  свойств страницы
    193. function form($action, $method="post")
    194.     {
    195.     global $conn;
    196.  
    197.     global $_SERVER;
    198.     if ($_SERVER["SERVER_NAME"]=="nav")
    199.                 mysql_query("SET NAMES cp1251",$conn);
    200.  
    201.     $html="<script type="text/javascript">
    202.     <!--
    203.     function resize(delta)
    204.         {
    205.         var textarea=document.pageform.content;
    206.         var hh=textarea.style.height;
    207.         var h=parseInt(hh.substr(0,hh.length-2));
    208.         h+=delta;
    209.         textarea.style.height=h+'mm';
    210.  
    211.         }
    212.     //-->
    213.     </script>";
    214.  
    215.     $html.="<script type="text/javascript" src="toolbar.js"></script>";
    216.  
    217.     $html.="\n<form id="pageform" name="pageform" action="$action" method="$method">\n";
    218.  
    219.     if ($this->id!=null)
    220.         $html.="<input type="hidden" name="id" value="".$this->id."">\n";
    221.  
    222.        
    223.     $html.="<table>";
    224.  
    225.     $html.="\n<tr><td>Пункт меню</td><td>";
    226.     $m=new menu($this->lng,0);
    227.     $html.=$m->select_items($this->itemID,"itemID");
    228.     $html.="</td></tr>\n"; 
    229.  
    230.     $html.="\n<tr><td>&lt;title&gt;</td><td>";
    231.     $html.="<input type="text" style="width:120mm" name="title" value="".$this->title."">";
    232.     $html.="</td></tr>";   
    233.  
    234.     $html.="\n<tr><td>&lt;meta name="Keywords" &gt;</td><td>";
    235.     $html.="<textarea name="keywords" style="width:120mm;height:15mm" >";
    236.     $html.=$this->keywords;
    237.     $html.="</textarea>";
    238.     $html.="</td></tr>";   
    239.  
    240.     $html.="\n<tr><td>&lt;meta name="description" &gt;</td><td>";
    241.     $html.="<textarea name="description" style="width:120mm;height:15mm" >";
    242.     $html.=$this->description;
    243.     $html.="</textarea>";
    244.     $html.="</td></tr>";   
    245.  
    246.     $html.="\n<tr><td>Файл css</td><td>";
    247.     $html.="<input type="text" style="width:50mm"  name="css" value="".$this->css."">";
    248.     $html.="</td></tr>";   
    249.  
    250.     $html.="\n<tr><td>Файл JavaScript</td><td>";
    251.     $html.="<input type="text" style="width:50mm"  name="jsFile" value="".$this->jsFile."">";
    252.     $html.="</td></tr>";   
    253.  
    254.     $html.="\n<tr><td>". $this->contentName. "</td><td>";
    255.  
    256.     $toolbar=array("Ж","К","Маркер","Маркер","Ч","Параграф с кр. строкой","Параграф без кр. строки","Ссылка","&laquo;&raquo;");
    257.  
    258.             $html.="\n<script type="text/javascript">\n document.write('<input type="button" value="".$toolbar[0]."" onclick="tag(0,document.pageform.content);"  class="toolbar"  title="Помечает выделенный текст для показа его жирным" style="font-weight:bold;width:7mm">&nbsp;');";
    259.  
    260.             $html.="\n document.write('<input type="button" value="".$toolbar[1]."" onclick="tag(2,document.pageform.content);" class="toolbar" title="Помечает выделенный текст для показа его курсивом" style="font-style:italic;width:7mm">&nbsp;');";
    261.  
    262.             $html.="\n document.write('<input type="button" value="".$toolbar[4]."" onclick="tag(10,document.pageform.content);" class="toolbar" title="Помечает выделенный текст для показа его подчёркнутым" style="text-decoration:underline;width:7mm">&nbsp;');";
    263.            
    264.             $html.="\n document.write('<input type="button" value="".$toolbar[2]."" onclick="tag(6,document.pageform.content);" style="background-color:yellow;color:blue;font-weight:bold"class="toolbar" title="Помечает  текст для выделения его жёлтым маркером">&nbsp;');";
    265.  
    266.             $html.="\n document.write('<input type="button" value="".$toolbar[3]."" onclick="tag(8,document.pageform.content);" style="background-color:red;color:white;font-weight:bold" class="toolbar" title="Помечает выделенный текст для выделения его красным маркером">&nbsp;');";
    267.  
    268.             $html.="\n document.write('<input type="button" value="".$toolbar[5]."" onclick="tag(12,document.pageform.content);" class="toolbar" title="Выделите участок текста для того, чтоб отметить его как параграф">&nbsp;');";
    269.  
    270.             $html.="\n document.write('<input type="button" value="".$toolbar[6]."" onclick="tag(14,document.pageform.content);"  class="toolbar" title="Выделите участок текста для того, чтоб отметить его как параграф">&nbsp;');";
    271.  
    272.             $html.="\n document.write('<input type="button" value="".$toolbar[7]."" onclick="tag(16,document.pageform.content);"  class="toolbar" title="Выделите участок текста для того, чтоб отметить его как ссылку">&nbsp;');";
    273.  
    274.             $html.="\n document.write('<input type="button" value="".$toolbar[8]."" onclick="tag(18,document.pageform.content);"  class="toolbar" title="Выделите участок текста для того, чтоб заключить его в кавычки">&nbsp;');";
    275.  
    276.             $html.="</script>\n<br />";
    277.  
    278.             $content=$this->content;
    279.  
    280.             $content=str_replace("textarea","textarea",$content);
    281.  
    282.     $html.="<textarea style="width:180mm;height:".$this->textarea_h_mm."mm;font-size:12pt"  name="content">".$content."</textarea>";
    283.     $html.="\n<br /><input type="button" name="plus" value="+" onclick="resize(30);">";
    284.     $html.="<input type="button" name="minus" value="-" onclick="resize(-30);">";
    285.     $html.="</td></tr>";   
    286.  
    287.  
    288.     $html.="\n<tr><td>Класс страницы</td><td>";
    289.    
    290.     $query="select id,friendlyName from classes order by friendlyName";
    291.     $result=mysql_query($query,$conn);
    292.     $classes=array();
    293.     while($row=mysql_fetch_array($result,MYSQL_ASSOC))
    294.         {
    295.         $key=$row["id"];
    296.         $classes[$key]=stripslashes($row["friendlyName"]);
    297.         }
    298.     mysql_free_result($result);
    299.     $select=new select("classID",$classes,$this->classID);
    300.     $html.=$select->html();
    301.  
    302.     $html.="</td></tr>";   
    303.  
    304.     $html.="\n<tr><td>Язык страницы</td><td>";
    305.  
    306.     $query="select id,language from languages order by language";
    307.     $result=mysql_query($query,$conn);
    308.     $lngs=array();
    309.     while($row=mysql_fetch_array($result,MYSQL_ASSOC))
    310.         {
    311.         $key=$row["id"];
    312.         $lngs[$key]=stripslashes($row["language"]);
    313.         }
    314.     mysql_free_result($result);
    315.     $select=new select("lng",$lngs,$this->lng);
    316.     $html.=$select->html();
    317.  
    318.     $html.="</td></tr>";   
    319.  
    320.     $html.="\n<tr><td>Имя файла страницы</td><td>";
    321.     $html.="<input type="text" style="width:50mm"  name="filename" value="".$this->filename."">";
    322.     $html.="</td></tr>";
    323.  
    324.     $fields=$this->special_fields(); //абстрактный метод -- на откуп подклассам
    325.  
    326.     if ($fields!="")
    327.         {
    328.         $html.=$fields;
    329.         }
    330.    
    331.     $html.="\n<tr><td colspan="2" style="text-align:center">";
    332.     $html.="<input type="submit"  name="save" value="Сохранить!">";
    333.     $html.="&nbsp;&nbsp;&nbsp;<input type="submit"  name="save_and_refresh" value="Сохранить и обновить сайт!">";
    334.  
    335. /*
    336.     $query="select content from backup where pageID=".$this->id;
    337.     $result=mysql_query($query,$conn);
    338.     $content="";
    339.     while($row=mysql_fetch_array($result,MYSQL_ASSOC))
    340.         {
    341.         $content=stripslashes($row["content"]);
    342.         }
    343.     mysql_free_result($result);
    344.  
    345. */
    346.  
    347.     if ($content!="")
    348.         {
    349.         $html.="<script type="text/javascript">";
    350.         $html.="<!--";
    351.  
    352.         $content=preg_replace("/\r?\n/","###",$content);
    353.         $array = explode("###", $content);
    354.  
    355.  
    356.         $html.="\nfunction from_backup()
    357.             {
    358.                 var f=document.getElementById('pageform');
    359.                 var textarea=f.elements['content'];
    360.                 textarea.value='';\n";
    361.  
    362.                 foreach ($array as $s)
    363.                     $html.="textarea.value+='".addslashes($s)."'+'\\n';\n";
    364.  
    365.                
    366.             $html.="}\n";
    367.            
    368.         $html.="//-->";
    369.         $html.="</script>\n";
    370.  
    371.         $html.="&nbsp;&nbsp;&nbsp;<input type="button"  name="backup" value="Восстановить ".$this->contentName." из резервной копии " onclick="from_backup()" />";
    372.         }
    373.     else
    374.         $html.="&nbsp;&nbsp;&nbsp;<span style="color:red">Резервной копии нет</span>";
    375.  
    376.  
    377.     $html.="</td></tr>";   
    378.  
    379.     $html.="</table>";
    380.  
    381.     $html.="\n</form>\n";
    382.  
    383.     return $html;
    384.     }
    385.  
    386. //---------------------------------------------------------------------------------------
    387. //Получение данных Формы редактирования
    388.  
    389. function submit($method_array)
    390.     {
    391.  
    392.     if (!isset($method_array["save"]) && !isset($method_array["save_and_refresh"]))
    393.         return "no_submit";
    394.  
    395.     foreach ($method_array as $propertyName=>$propertyValue)
    396.             {
    397.             if (($propertyName!="save") && ($propertyName!="save_and_refresh"))
    398.                 {
    399.                 $value=$propertyValue;
    400.                 if ($propertyName=="content")
    401.                     $value=str_replace("textarea","textarea",$value);
    402.  
    403.                 if (get_magic_quotes_gpc())
    404.                     $value=stripslashes($value);
    405.  
    406.                 $this->$propertyName=$value;
    407.                 }
    408.             }
    409.  
    410.     $this->special_submit($method_array); //абстрактный метод
    411.  
    412.     return "Ok";
    413.  
    414.     }
    415.  
    416. //---------------------------------------------------------------------------------------
    417.  
    418.     //Возвращает html-код страницы
    419.     function html($step=1) //В php4 нельзя "спрятать" метод от вызова извне
    420.         {
    421.             $htm=$this->headers();
    422.             $htm.="\n<body>";
    423.             $htm.=$this->table();
    424.             $htm.="</body>\n</html>";
    425.             return $htm;
    426.         }
    427.  
    428.     //-------------------------------------------------
    429.     function headers()
    430.     {
    431.  
    432.         $html="<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">";
    433.         $html.="\n<html  xmlns="http://www.w3.org/1999/xhtml">\n<head>\n";
    434.  
    435.         $html.="<title>".$this->title."</title>";
    436.  
    437.         $html.="\n<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"/> ";
    438.         $html.="\n<meta name="Keywords" content="".quotemeta($this->keywords).""/>";
    439.         $html.="\n<meta name="Description" content="".quotemeta($this->description).""/>";
    440.  
    441.         $html.="\n<link href="".$this->css."" rel="stylesheet" type="text/css"/>\n";
    442.  
    443.         $html.="\n<script src="../menu.js" type="text/javascript" ></script>";
    444.         $html.=$this->js;
    445.         $html.="\n</head>\n\n";
    446.  
    447.         return $html;
    448.     }
    449.  
    450.     //-------------------------------------------------
    451.  
    452.     function table()
    453.     {
    454.             $htm="<table border="0" align="center" cellpadding="0" cellspacing="3" class="global">";
    455.        
    456.             $htm.="\n<tr><!-- Строка шапки -->\n<td class="title" colspan="2">" . $this->top() ."</td></tr>";
    457.             $htm.="\n<tr><!-- Строка главного меню -->\n<td class="mainmenu" align="center" colspan="2">" . $this->mainmenu() ."</td></tr>";
    458.  
    459.             $htm.="<!-- Строка  подменю и содержания -->";
    460.             $htm.="\n<tr>\n";
    461.            
    462.             $htm.="\n<!-- Столбец содержания -->\n";
    463.             $htm.="\n<td class="content" onclick="hide();"  onmouseover="div_out();">\n\n" ;
    464.             $htm.=$this->content();
    465.             $htm.="\n\n</td>";
    466.  
    467.             $htm.="\n<td class="submenu" align="left" valign="top">" ;
    468.             $htm.=$this->submenu();
    469.             $htm.="</td>";
    470.            
    471.             $htm.="</tr>";
    472.  
    473.             $htm.="\n<tr><td class="bottom" colspan="2">" . $this->bottom() ."</td></tr>";
    474.  
    475.             $htm.="\n</table> <!--Закончилась таблица, содержащая всю страницу -->\n";
    476.             return $htm;
    477.  
    478.     }
    479.  
    480. //----------------------------------------------------
    481.  
    482.     function top()
    483.     {
    484.        
    485.         $area=new area($this->lng,$this->classID);
    486.         $top=$area->top;
    487.  
    488.         if ($top=="")
    489.             {
    490.             $area=new area($this->lng,0);
    491.             $top=$area->top;
    492.             }
    493.        
    494.         return $top;
    495.     }
    496.     //-------------------------------------------------
    497.  
    498.     function mainmenu()
    499.     {
    500.         $parentID=$this->get_parent();
    501.         $m=new menu($this->lng,$parentID,$this->itemID);
    502.         $html=$m->main_menu();
    503.         return $html;
    504.     }
    505.  
    506.     function submenu()
    507.     {
    508.         $parentID=$this->get_parent();
    509.         $submenu=new menu($this->lng,$parentID);
    510.         $html=$submenu->sub_menu($this->itemID,$this->menu_prefix);
    511.         return $html;
    512.                
    513.  
    514.     }
    515.     //-------------------------------------------------
    516.  
    517.     function bottom()
    518.     {
    519.         $area=new area($this->lng,$this->classID);
    520.         $bottom=$area->bottom;
    521.  
    522.         if ($bottom=="")
    523.             {
    524.             $area=new area($this->lng,0);
    525.             $bottom=$area->bottom;
    526.             }
    527.        
    528.         return $bottom;
    529.     }
    530.     //-------------------------------------------------
    531.  
    532.     function folder()
    533.     {
    534.     $folder=dirname(__FILE__)."/../".$this->language;
    535.     return $folder;
    536.     }
    537.  
    538.     //------------------------------------------------
    539.  
    540.     //Сохраняем страницу на диске
    541.     function toHDD()
    542.     {
    543.  
    544.         if ($this->filename=="")
    545.             return "Файл не имеет имени";
    546.  
    547.         $folder=$this->folder();
    548.  
    549.         if(!file_exists($folder))
    550.             mkdir($folder);
    551.  
    552.         $f=fopen($folder."/".$this->filename,"w");
    553.         if ($f===false)
    554.             {
    555.             $result ="не смогли открыть файл на запись";
    556.             return $result;
    557.             }
    558.  
    559.         $z=$this->html();
    560.  
    561.         $i=fwrite($f,$z);
    562.  
    563.         if ($i===false)
    564.             {
    565.             $result ="не смогли записать в открытый файл";
    566.             fclose($f);
    567.             return $result;
    568.             }
    569.         elseif ($i==0)
    570.             {
    571.             $result ="пустой файл!";
    572.             fclose($f);
    573.             return $result;
    574.             }
    575.  
    576.         $i=fclose($f);
    577.  
    578.         if ($i===false)
    579.             {
    580.             $result ="не смогли сохранить файл";
    581.             return $result;
    582.             }
    583.        
    584.         return "Ok";
    585.         }
    586.  
    587. //-------------------------------
    588.  
    589.  
    590. //------------------------------
    591. //Сохранение свойств страницы в базе данных
    592. function save()
    593.     {
    594.         global $conn;
    595.              global $_SERVER;
    596.     if ($this->id==null)
    597.         {
    598.         $query="insert into pages( itemID,lng,title,keywords,description,css,jsFile,content,classID,className,filename,createdAt)  values(";
    599.         $query.=$this->itemID.",";
    600.         $query.=$this->lng.",";
    601.         $title=$this->title;
    602.             $title=addslashes($title);
    603.         $query.="'".$title."',";
    604.         $query.="'".addslashes($this->keywords)."',";
    605.         $query.="'".addslashes($this->description)."',";
    606.         $query.="'".$this->css."',";
    607.         $query.="'".$this->jsFile."',";
    608.  
    609.         $content=$this->content;
    610.         $content=addslashes($content);
    611.         $query.="'".$content."',";
    612.  
    613.         $query.=$this->classID.",";
    614.         $query.="'".$this->className."',";
    615.         $query.="'".$this->filename."',";
    616.         $query.="Now()";
    617.         $query.=")";
    618.  
    619.         mysql_query($query,$conn);
    620.         $this->id=mysql_insert_id($conn);
    621.         }
    622.     else
    623.         {
    624.         $query="update pages set  ";
    625.         $query.="itemID=".$this->itemID.",";
    626.         $query.="lng=".$this->lng.",";
    627.  
    628.         $title=$this->title;
    629.             $title=addslashes($title);
    630.         $query.="title='".$title."',";
    631.         $query.="keywords='".addslashes($this->keywords)."',";
    632.         $query.="description='".addslashes($this->description)."',";
    633.         $query.="css='".$this->css."',";
    634.         $query.="jsFile='".$this->jsFile."',";
    635.         $content=$this->content;
    636.             $content=addslashes($content);
    637.         $query.="content='".$content."',";
    638.         $query.="classID=".$this->classID.",";
    639.         $query.="className='".$this->className."',";
    640.         $query.="filename='".$this->filename."' where id=".$this->id;
    641.         mysql_query($query,$conn);
    642.         }
    643. //echo $query."<br>";
    644.  
    645. $this->write_backup($content);
    646.  
    647. //Дети пусть сами сохраняют свои параметры
    648. $this->saveParms();
    649.     }
    650.  
    651. //------------------------------
    652.  
    653. function banners()
    654.     {
    655.         $banner=new banner($this->lng);
    656.         return $banner->html();
    657.     }
    658.  
    659. //----------------------------------
    660.  
    661.  
    662. function write_backup($content)
    663.     {
    664.     global $conn;
    665.     if ($this->id!=null)
    666.         {
    667.         global $conn;
    668.         $query="delete from backup where pageID=".$this->id;
    669.         mysql_query($query,$conn);
    670.         $query="insert into backup(pageID,content)  values(".$this->id.",'".stripslashes($content)."')";
    671.         mysql_query($query,$conn);
    672.         }
    673.     }
    674.  
    675. } //end class
    676. ?>
    677.  
     
  13. Anonymous

    Anonymous Guest

    Хм. Неплохая, в принципе, идея (сам делал в похожую сторону в свое время) испоганена реализацией.
     
  14. tmanager

    tmanager Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    Прекрасно работает. А придраться, как гласит старый анекдот, можно и к столбу. Не говоря о реально работающем проекте. А Вы и придраться-то не смогли.
     
  15. Clone

    Clone Guest

    О боооги.. HTML перемешан с PHP, местами запросы вообще не экранированы... Я даже боюсь спрашивать про производительность...
     
  16. tmanager

    tmanager Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    А Вы не бойтесь. Прекрасная производительность -- за счёт того, что почти все страницы сохраняются в виде HTML-страниц. И меняются только при изменении содержания пользователем.

    Заради той самой производительности. Скажем, в именах классов не бывает апострофов.
     
  17. +Sten+

    +Sten+ Активный пользователь

    С нами с:
    27 авг 2007
    Сообщения:
    978
    Симпатии:
    0
    Clone +1.
    А если нужно будет постороннему человеку изменить цвет 1 гребаной ячейки. А если захочется добавить еще 1 поле в базе? Сколько времени у него займёт на то, чтобы понять где что менять + проверить, не рухнет ли всё после изменений.

    Даже дети понимают пользу трафаретов - зарисовал пустое пространство в виде каракули и готово. А не будь трафарета, пришлось бы самому выводить контур, потом аккуратно зарисовывать, чтобы не было торчащих заусениц.

    Сейчас любая моя система держится на 2х классах: класс работы с базой данных и смарти. В результате получается ну очень удобно - в PHP коде:

    PHP:
    1.  
    2. <?
    3.    //Подключене классов...
    4.    //Проверки, проверки.....
    5.     $user = array('id'=>$id, 'name'=>$DATA['name'], 'pas'=>$DATA['pas'], 'email'=>$DATA['email'], 'home'=>$DATA['home'], 'isq'=>$DATA['isq'], 'date'=>$date, 'signat'=>$DATA['sign'], 'avatar'=>$FileName, 'count'=>0);
    6.     $DB->BuildInsert($user);
    7.     $TPL->assign(array('message'=>"Спасибо за регистрацию, <b>$DATA[name]</b>!"));
    8.     $TPL->display('redirect.tpl');
    9.  
    В redirect.tpl:
    Код (Text):
    1.  
    2. {include
    3.     file="header.tpl"
    4.     title="Идёт перенаправление..."
    5. }
    6. <p>&nbsp;</p>
    7. <p>&nbsp;</p>
    8. <p>&nbsp;</p>
    9. <div align="center">{message}</div>
    10. <script language="javascript">
    11. setTimeout("window.location = '{location}'", 5000000);
    12. </script>
    13. {include file="footer.tpl"}
    Всё по полочкам, всё понятно...
     
  18. Anonymous

    Anonymous Guest

    Да я и не собираюсь. Мне все равно )
     
  19. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    +1

    tmanager
    Хотелось бы увидеть производный класс от Page. Может просто один класс Page выглядит как монстр, а его наследники все причесанные :)

    В любом случае не понимаю, почему методы типа Page::form() не реализовать так:
    PHP:
    1. <?php
    2. function form()
    3. {
    4.     requiry_once('form_add_tur.tpl');
    5. }
    6.  
     
  20. tmanager

    tmanager Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    Посторонних -- в сад.

    А заказчики -- пусть редактируют содержание и посылают пожелания по дизайну.

    Не проблема. Хуже, если надумает удалить.

    Столько, сколько требуется для написания письма с вопросом ( ну или чтения руководства -- но его ж никто не читает...)

    Столько, сколько требуется для написания письма с вопросом (ну или чтения руководства -- но его ж никто не читает...)

    Но мы-то не дети.

    За это и платятся гонорары -- за эксклюзив. За креатив...
     
  21. Clone

    Clone Guest

    Да, ещё методы, имхо, очень туманно названы... Да и жёсткая система "Шапка+контент+футер" не есть гут, имхо... Что если мне захочется что-нить из контента переместить в шапку? Придётся код из одного метода в другой двигать... А там ещё поди разберись будет ли всё также гладко. Может, конечно, создавать классы на базе будет и удобно, но я предпочту кеширование данных + смарти(который, кстати, тоже поддерживает кеширование HTML).
     
  22. tmanager

    tmanager Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    Вам-то всё понятно, что Вы написали.
    Как сказали бы образованные, Stercus cuique suum bene olet

    Вопрос в том, поймёт ли "посторонние люди", как в этой теме выражаются.
     
  23. tmanager

    tmanager Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    Вы хочете песен? Их есть у меня.
    PHP:
    1.  
    2. <?php
    3. /*==Простая HTML-страница==*/
    4.  
    5. require_once dirname(__FILE__)."/page.class.php";
    6.  
    7. //Страницы с заданным и постоянным HTML-кодом.
    8.  
    9. class simple extends page
    10. {
    11.     function simple($id=null,$filename="",$content="",$lng=1)
    12.         {
    13.         $this->lng=$lng;
    14.         $this->className="simple";
    15.         $this->contentName="Текст страницы";
    16.         $this->textarea_h_mm=70;
    17.         $this->id=$id;
    18.         $this->get(); //Получение "абстрактных" свойств страницы
    19.         if ($id==null)
    20.             {
    21.             if ($filename!="")
    22.                 $this->filename=$filename;
    23.             if ($content!="")
    24.                 $this->content=$content;
    25.             }
    26.         $this->base="../";
    27.         $this->menu_prefix="";
    28.         }
    29.     //-------------------------------------------------
    30. function /*override*/ content()
    31.         {
    32.         return $this->content;
    33.         }
    34.     //-------------------------------------------------
    35.  
    36.    
    37. } //end class
    38. ?>
     
  24. Anonymous

    Anonymous Guest

    Clone, а это не классы и ООП. Это называется по умному "эмулирование пространства имен функций".
    Я не образованный, но скажу - Argumenta ponderantur, non numerantur. ;)
     
  25. tmanager

    tmanager Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    Совершенно с Вами согласен. Поэтому она и не жётская.

    Переопределяй соотв. методы в "ребёнке"

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

    Только замечание. "Постороннему человеку" легче не станет.
     
Статус темы:
Закрыта.