За последние 24 часа нас посетили 35300 программистов и 1742 робота. Сейчас ищут 1092 программиста ...

Несколько вопросов о написании CMS

Тема в разделе "PHP для новичков", создана пользователем Ігор, 3 фев 2009.

  1. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    Раньше задавал вопросы о написании галлереи, но потом немного подумал, что уж лучше сразу CMS сделать.
    В связи с этим возникло несколько вопросов.
    Все "общие" модули отправил в cgi-bin. (работа с базами данных, чтение настроек, работа с подкатегиями и т.д.)
    Для каждой из новых категорий я создаю папку, в которую помещаю imdex.htm и специфические модули, заточенные для даной категории.
    Так как категорий не так уж и много, думаю можно создавать их вручную.
    В этих папках (в каждой) тежит "главный класс" данной категории.
    Шаблоны лежат в своей папке в корне сайта
    PHP:
    1.  
    2. <?php<div class="post">
    3.  
    4.   <div class="post_title"><h1><?= $cl_name->eTitle ?></h1></div>
    5.  
    6.   <div class="post_body">
    7.     <p><?= $cl_name->eDescr ?></p>
    8.   </div>
    9. </div>?>
    Вот таким образом осуществялется вывод в шаблоны.
    Отюда возникает вопрос. Если шаблоны одни для всех разделов. (а это, по-моему, правильней, чем кидать всои в каждый раздел, ведь много общего) Приходится для всех разделов создавать класс с тем же именем?
    В фотогалерее:
    PHP:
    1. <?php
    2. $cl_name=New fotogallery();
    3. ?>
    Муpыкальмый раздел
    PHP:
    1. <?php
    2. $cl_name=New musiklist();
    3. ?>
    ведь в случае разного имени для каждого раздела шаблон это "не увидит"
    Как такое решение?
     
  2. зачем?
     
  3. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    А какой смысл держать несколько копий одного и того же модуля?
    Может есть какой-то, но я не вижу. :roll:
     
  4. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Эту папку не трогай и все. )
     
  5. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    В смысле cgi-bin не трогать?
    Тогда можно создать какую-нить другую скажем php_api прописать в хотексе как инклуде_пат и сбросить общие модули туда?
     
  6. именно.
     
  7. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    Возник следующий вопрос:
    Есть класс для чтения настроек
    PHP:
    1.  
    2. <?php
    3. class ekCfg  implements arrayAccess
    4.  
    5.  {
    6.  
    7. protected $dba;
    8.  
    9. protected $dba_local;
    10.  
    11. public static function getInstance()
    12.   {
    13.     static $instance;
    14.     if(!is_object($instance))
    15.       $instance = new ekCfg();
    16.     return $instance;
    17.   }
    18.  
    19. protected function __construct()
    20.   {
    21.  
    22.     $this->dba = dba_popen(GLOBAL_CONFIG, "r", "inifile");
    23.     $this->dba_local = dba_popen(LOCAL_CONFIG, "r", "inifile");
    24.   }
    25.  
    26.  
    27.  function __get($key)
    28. {
    29.     if (dba_exists($key, $this->dba_local))
    30.      {
    31.         return dba_fetch($key, $this->dba_local);
    32.      }
    33.      else
    34.      {
    35.         return dba_fetch($key, $this->dba);
    36.      }
    37.  
    38.  }
    39.  
    40. function offsetGet($key)
    41. {
    42.     return $this->$key;
    43. }
    44. ....
    45.  }
    46. ?>
    47.  
    Сначала настройки ищутся в "локальном" файле типа "user.ini admin.ini" если они не будут найдены то будут искаться в файле глобальных настроек.
    К локальным настройкам относяться такие, например, как количество выводимых на страницу елементов (пейджерный вывод), шаблон, максимальный размер загружаемого файла. К глобальным -- база даных и т.д.
    Сами файлы лежат в папке каждого раздела
    (foto mp3 и т.д.) Понятно, что для каждого раздела своя б. д. и пути, куда будут закачиваться файлы.
    Теперь вопрос, стоит так: ведь для всех разделов есть и общие параметры. Хотя же тот самый путь к шаблонам.
    Получается нужно сделать еще один (или даже 2 файла) настроек, которые будут применимы ко всем разделам.
    И получается очень таки запутано.
    (Переходить к сохраненимя настроек в бд не очень бы хотелось) так как в случае ини все редактируется при помощи ТР и ну нужно писать дополнительный модуль для редактирование настроек.
     
  8. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    Неужели так совсем плохо? :(
     
  9. akrinel

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

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    Да не не плохо.

    ИМХО:

    1. .ini => .php

    2. Куда удобнее создать директорию, например, ./config в котором будут лежать:
    а) Файл общих настроек.
    б) Файлы настроек для конкретного модуля.

    3. Статический(по вкусу) класс, в котором есть функция:

    PHP:
    1.  
    2. <?php
    3. /**
    4.  * Получаем параметр
    5.  *
    6.  *  string $nameParam  название параметра
    7.  *  string $nameGroup   название группы
    8.  *  boolean $globalFind  искать ли в глобальных при отсутствии параметра в группе
    9.  */
    10. public  static  getParam($nameParam, $nameGroup = null, $globalFind = null){
    11. // Волшебная уличная магия
    12. }
    13. ?>
    14.  
    В таком случае, если мы не указываем название группы, мы грузим его из общего файла настроек.
    Если, например, мы хотим получить кол-во выводимых на страницу элементов, но для данного модуля оно не указано, при $globalFind = true; мы получаем общее значение.

    Как то так.
     
  10. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    А вообще использование dba нормальный подход?
     
  11. akrinel

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

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    Сам не использовал, про хранение конфигов в dbm не слышал.
    Знаю только что для кеширования их используют и хвалят ибо очень быстры + в отличии от "плоских" файлов сразу же одновременный доступ для чтения/записи.

    Плохо про dbm не слышал, разве что многие его называют "БД для нищих" :)

    У Вас вообще сколько настроек планируется держать? Быть может проще в массив вставить и не парится?
     
  12. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    Ну настроек в принципе не так уж и много (около 20). Класс сам получился не сложный, с ваших слов dbm довольно быстрый. (кстати, не пойму есть ли отличия dba и dba в принцыпе формат один и тот же, обработчики те же, тогда зачем, не пойму, было вводить разные функции).
    Просто подумал, неплохо бы было, подвесить поиск "нужной" настройки какому-нить общему классу.

    Если учесть вопрос о SSI можно поступить так:
    если в файле встречаются несколько параметров с одинаковыми ключами к сведению принимается только первый. Так ведь?
     
  13. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    Возник такой вопрос.
    В классе есть некоторая функция создания подкатегории
    PHP:
    1.  
    2. <?php
    3. function createFolder()
    4. {
    5.  
    6.  $cId=$this->folders->cId;
    7.  $deskr=$this->escape_post('descr');
    8.  $name=$this->escape_post('name');
    9.  $path=translit($_POST['name']);
    10.  if (empty($path))
    11.  {
    12.     $this->err='<span style="color:red;font-weight:bold">Не введено имя папки.</span>';
    13.     $this->incfile='addfolder';
    14.     return false;
    15.  }
    16.  
    17.  $added=$this->escape_post('added');
    18.  $visible=$this->escape_post('visible');
    19.  $date=date('y-m-d');
    20.  
    21.  if ($this->folders->existsFolder($path))
    22.      {
    23.     $this->err='<span style="color:red;font-weight:bold">Папка &laquo;<span style="color:blue">'.$name.'</span>&raquo; уже существует. Невозможно создать.</span>';
    24.     $this->incfile='folder';
    25.     return false;
    26.  }
    27.  if ($this->escape_post('addnew'))
    28.  {
    29.     if (!$this->canCreateFolder())
    30.  {
    31.     $this->err='<span style="color:red;font-weight:bold">Превышен уровень допустимой вложености папок. Действие отменено.</span>';
    32.     $this->incfile='addfolder';
    33.     return false;
    34.  }
    35.     $query="INSERT INTO folders VALUES (NULL,
    36.                                      '$cId',
    37.                                      '$path',
    38.                                      '$name',
    39.                                      '$deskr',
    40.                                      'on',
    41.                                      'on',
    42.                                      '$date',
    43.                                      NULL)";
    44.    $loc=$this->get_url($this->folders->fullpath, 'view');
    45.  }
    46.  
    47.  else
    48.  {
    49.     $query="UPDATE folders SET f_name='$name',
    50.                               f_deskr='$deskr',
    51.                               f_path='$path'
    52.                           WHERE f_id='".$this->folders->cId."'";
    53.     $loc=$this->get_url($this->folders->parentpath, 'view');  //Это мы редактировали
    54.   }
    55.  
    56.     $this->dbio->exec($query);
    57.     header ("location: " . $loc);
    58. }
    59. ?>
    60.  
    Нужно, чтобы один из потомков данного класса после создания подкотегории выполнил дополнительное действие, а именно -- создал папку с именем $path (или хешем) Но только в случае создания, а не редактирования.
     
  14. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    Неужели ни у кого нет никаких идей?
    Может лучше разбить эту функцию на несколько частей и в дочернем классе сначала вызвать parent::createPart а потом создать папку?
     
  15. V1T

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

    С нами с:
    7 окт 2008
    Сообщения:
    311
    Симпатии:
    0
    Адрес:
    Крым
    Уважаемые профессионалы, скажите, для написания своей ЦМС обязательно применять классы и ООП. Возможно ли обойтись процедурным стилем. Или же стоит всё же ООП учить, спасибо. Выслушаю Ваши советы
     
  16. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    V1T
    лучше комбинировать
    ну и в чём проблема дать ему команду создать эиу папку?
     
  17. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    Но для этого нужно переопределить эту функцию в потомке. Или я ошибаюсь?
     
  18. akrinel

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

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    Я не совсем понимаю, вот есть у нас два действия редактирование и создание.
    Так зачем же все это слеплять в методе createFolder, все равно ведь в 80% случаев в конце концов они значительно начнут расходиться в логике и появится условие "если редактирование то иначе".
    Почему сразу не сделать createFolder и editFolder? Если уж так хочется единого интерфейса, почему бы не сделать что-то вроде
    PHP:
    1. <?php
    2. public  function  save(){
    3.     if($this->id){
    4.           $this->editFolder();
    5.     }
    6.     else{
    7.           $this->createFolder();
    8.     }
    9. }
    10. ?>
    Ну да можно как-то так переопределить:

    PHP:
    1. <?php
    2. class a{
    3.     public  function  yoyo(){
    4.         echo  'мы тут кучу всего делаем для addFolder!';
    5.     }
    6. }
    7.  
    8. class b extends a{
    9.     public  function  yoyo(){
    10.         parent::yoyo();
    11.         echo  'А тут еще и папку создаем!';
    12.     }
    13. }
    14. ?>
    P.S. Если тут у нас все красиво и ООП-шно почему не стоит рядом с методом public/proteсted/private?[/quote]
     
  19. V1T

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

    С нами с:
    7 окт 2008
    Сообщения:
    311
    Симпатии:
    0
    Адрес:
    Крым
    Понял,Mr.M.I.T., будет время , обязательно займусь ООП
     
  20. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    akrinel
    Все ясно. Но не все так красиво :(
    PHP:
    1. <?php
    2.  class a{
    3.      public  function  yoyo(){
    4.          echo  'мы тут кучу всего делаем для addFolder!';
    5.      }
    6.  }
    7.  
    8.  class b extends a{
    9.      public  function  yoyo(){
    10.          parent::yoyo();
    11.          echo  'А тут еще и папку создаем!';
    12.      }
    13.  }
    14.  ?>
    Допустим yoyo НЕ сделало, то чно нужно (ввели недопустимое имя папки, папка уже существует) получается, что yoyo с класса b все-равно создаст папку. А это в данном случае было бы лишним.
    Разве что так:
    PHP:
    1.  
    2. <?php
    3.  class b extends a{
    4.      public  function  yoyo(){
    5.          if parent::yoyo()
    6.          {
    7.               echo  'А тут еще и папку создаем!';
    8.               return true;        //Все создано
    9.           }
    10.           else return false;    //вызвававший должен знать что функция провалилась
    11.      } ?>
    12.  
    но напрашивается еще такой вопрос: как дочерний класс должен узнать имя папки, которую он создать должен?
    Родительський класс, допустим, генерирует случайное уникальное имя
    $realpath = sha1($this->exArr['path'].microtime(true));
    И помещает его в таблицу (БД)
     
  21. Frozen

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

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    PHP:
    1.  
    2.  <?php
    3.   class b extends a{
    4.      public  function  anotherFunction(){
    5.          if ($this->yoyo()) {
    6.              // do smth
    7.          }
    8.      }
    9. } ?>
    10.  
     
  22. akrinel

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

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    PHP:
    1.  
    2.         <?php
    3.             class  a{
    4.            
    5.                 protected  $path;
    6.                
    7.                 protected  function  create(){
    8.                     $this->path  =  rand(0, 147);
    9.                     return  true;
    10.                 }
    11.             }
    12.            
    13.             class  b extends a{
    14.                 public  function create(){
    15.                
    16.                     if(parent::create()){
    17.                         echo  'Создаем папку с названием:&nbsp;'.$this->path;
    18.                     }
    19.                 }
    20.             }
    21.            
    22.             $test  =  new  b();
    23.            
    24.             $test->create();
    25.         ?>
    26.  
     
  23. Ігор

    Ігор Активный пользователь

    С нами с:
    7 апр 2008
    Сообщения:
    195
    Симпатии:
    0
    А не нужно в конце добавть return true Именно это меня и беспокоит
     
  24. akrinel

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

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    Ігор, ну вообще по многим стандартам кодирования все функции/методы должны возвращать true в случае успешного разруливания, т.к. в таком случае куда легче отлаживать и т.д.
     
  25. По разумным стандартам, многие методы обьекта должны вовращать ссылку на сам обьект или новый обьект. )