Раньше задавал вопросы о написании галлереи, но потом немного подумал, что уж лучше сразу CMS сделать. В связи с этим возникло несколько вопросов. Все "общие" модули отправил в cgi-bin. (работа с базами данных, чтение настроек, работа с подкатегиями и т.д.) Для каждой из новых категорий я создаю папку, в которую помещаю imdex.htm и специфические модули, заточенные для даной категории. Так как категорий не так уж и много, думаю можно создавать их вручную. В этих папках (в каждой) тежит "главный класс" данной категории. Шаблоны лежат в своей папке в корне сайта PHP: <?php<div class="post"> <div class="post_title"><h1><?= $cl_name->eTitle ?></h1></div> <div class="post_body"> <p><?= $cl_name->eDescr ?></p> </div> </div>?> Вот таким образом осуществялется вывод в шаблоны. Отюда возникает вопрос. Если шаблоны одни для всех разделов. (а это, по-моему, правильней, чем кидать всои в каждый раздел, ведь много общего) Приходится для всех разделов создавать класс с тем же именем? В фотогалерее: PHP: <?php $cl_name=New fotogallery(); ?> Муpыкальмый раздел PHP: <?php $cl_name=New musiklist(); ?> ведь в случае разного имени для каждого раздела шаблон это "не увидит" Как такое решение?
А какой смысл держать несколько копий одного и того же модуля? Может есть какой-то, но я не вижу. :roll:
В смысле cgi-bin не трогать? Тогда можно создать какую-нить другую скажем php_api прописать в хотексе как инклуде_пат и сбросить общие модули туда?
Возник следующий вопрос: Есть класс для чтения настроек PHP: <?php class ekCfg implements arrayAccess { protected $dba; protected $dba_local; public static function getInstance() { static $instance; if(!is_object($instance)) $instance = new ekCfg(); return $instance; } protected function __construct() { $this->dba = dba_popen(GLOBAL_CONFIG, "r", "inifile"); $this->dba_local = dba_popen(LOCAL_CONFIG, "r", "inifile"); } function __get($key) { if (dba_exists($key, $this->dba_local)) { return dba_fetch($key, $this->dba_local); } else { return dba_fetch($key, $this->dba); } } function offsetGet($key) { return $this->$key; } .... } ?> Сначала настройки ищутся в "локальном" файле типа "user.ini admin.ini" если они не будут найдены то будут искаться в файле глобальных настроек. К локальным настройкам относяться такие, например, как количество выводимых на страницу елементов (пейджерный вывод), шаблон, максимальный размер загружаемого файла. К глобальным -- база даных и т.д. Сами файлы лежат в папке каждого раздела (foto mp3 и т.д.) Понятно, что для каждого раздела своя б. д. и пути, куда будут закачиваться файлы. Теперь вопрос, стоит так: ведь для всех разделов есть и общие параметры. Хотя же тот самый путь к шаблонам. Получается нужно сделать еще один (или даже 2 файла) настроек, которые будут применимы ко всем разделам. И получается очень таки запутано. (Переходить к сохраненимя настроек в бд не очень бы хотелось) так как в случае ини все редактируется при помощи ТР и ну нужно писать дополнительный модуль для редактирование настроек.
Да не не плохо. ИМХО: 1. .ini => .php 2. Куда удобнее создать директорию, например, ./config в котором будут лежать: а) Файл общих настроек. б) Файлы настроек для конкретного модуля. 3. Статический(по вкусу) класс, в котором есть функция: PHP: <?php /** * Получаем параметр * * string $nameParam название параметра * string $nameGroup название группы * boolean $globalFind искать ли в глобальных при отсутствии параметра в группе */ public static getParam($nameParam, $nameGroup = null, $globalFind = null){ // Волшебная уличная магия } ?> В таком случае, если мы не указываем название группы, мы грузим его из общего файла настроек. Если, например, мы хотим получить кол-во выводимых на страницу элементов, но для данного модуля оно не указано, при $globalFind = true; мы получаем общее значение. Как то так.
Сам не использовал, про хранение конфигов в dbm не слышал. Знаю только что для кеширования их используют и хвалят ибо очень быстры + в отличии от "плоских" файлов сразу же одновременный доступ для чтения/записи. Плохо про dbm не слышал, разве что многие его называют "БД для нищих" У Вас вообще сколько настроек планируется держать? Быть может проще в массив вставить и не парится?
Ну настроек в принципе не так уж и много (около 20). Класс сам получился не сложный, с ваших слов dbm довольно быстрый. (кстати, не пойму есть ли отличия dba и dba в принцыпе формат один и тот же, обработчики те же, тогда зачем, не пойму, было вводить разные функции). Просто подумал, неплохо бы было, подвесить поиск "нужной" настройки какому-нить общему классу. Если учесть вопрос о SSI можно поступить так: если в файле встречаются несколько параметров с одинаковыми ключами к сведению принимается только первый. Так ведь?
Возник такой вопрос. В классе есть некоторая функция создания подкатегории PHP: <?php function createFolder() { $cId=$this->folders->cId; $deskr=$this->escape_post('descr'); $name=$this->escape_post('name'); $path=translit($_POST['name']); if (empty($path)) { $this->err='<span style="color:red;font-weight:bold">Не введено имя папки.</span>'; $this->incfile='addfolder'; return false; } $added=$this->escape_post('added'); $visible=$this->escape_post('visible'); $date=date('y-m-d'); if ($this->folders->existsFolder($path)) { $this->err='<span style="color:red;font-weight:bold">Папка «<span style="color:blue">'.$name.'</span>» уже существует. Невозможно создать.</span>'; $this->incfile='folder'; return false; } if ($this->escape_post('addnew')) { if (!$this->canCreateFolder()) { $this->err='<span style="color:red;font-weight:bold">Превышен уровень допустимой вложености папок. Действие отменено.</span>'; $this->incfile='addfolder'; return false; } $query="INSERT INTO folders VALUES (NULL, '$cId', '$path', '$name', '$deskr', 'on', 'on', '$date', NULL)"; $loc=$this->get_url($this->folders->fullpath, 'view'); } else { $query="UPDATE folders SET f_name='$name', f_deskr='$deskr', f_path='$path' WHERE f_id='".$this->folders->cId."'"; $loc=$this->get_url($this->folders->parentpath, 'view'); //Это мы редактировали } $this->dbio->exec($query); header ("location: " . $loc); } ?> Нужно, чтобы один из потомков данного класса после создания подкотегории выполнил дополнительное действие, а именно -- создал папку с именем $path (или хешем) Но только в случае создания, а не редактирования.
Неужели ни у кого нет никаких идей? Может лучше разбить эту функцию на несколько частей и в дочернем классе сначала вызвать parent::createPart а потом создать папку?
Уважаемые профессионалы, скажите, для написания своей ЦМС обязательно применять классы и ООП. Возможно ли обойтись процедурным стилем. Или же стоит всё же ООП учить, спасибо. Выслушаю Ваши советы
Я не совсем понимаю, вот есть у нас два действия редактирование и создание. Так зачем же все это слеплять в методе createFolder, все равно ведь в 80% случаев в конце концов они значительно начнут расходиться в логике и появится условие "если редактирование то иначе". Почему сразу не сделать createFolder и editFolder? Если уж так хочется единого интерфейса, почему бы не сделать что-то вроде PHP: <?php public function save(){ if($this->id){ $this->editFolder(); } else{ $this->createFolder(); } } ?> Ну да можно как-то так переопределить: PHP: <?php class a{ public function yoyo(){ echo 'мы тут кучу всего делаем для addFolder!'; } } class b extends a{ public function yoyo(){ parent::yoyo(); echo 'А тут еще и папку создаем!'; } } ?> P.S. Если тут у нас все красиво и ООП-шно почему не стоит рядом с методом public/proteсted/private?[/quote]
akrinel Все ясно. Но не все так красиво PHP: <?php class a{ public function yoyo(){ echo 'мы тут кучу всего делаем для addFolder!'; } } class b extends a{ public function yoyo(){ parent::yoyo(); echo 'А тут еще и папку создаем!'; } } ?> Допустим yoyo НЕ сделало, то чно нужно (ввели недопустимое имя папки, папка уже существует) получается, что yoyo с класса b все-равно создаст папку. А это в данном случае было бы лишним. Разве что так: PHP: <?php class b extends a{ public function yoyo(){ if parent::yoyo() { echo 'А тут еще и папку создаем!'; return true; //Все создано } else return false; //вызвававший должен знать что функция провалилась } ?> но напрашивается еще такой вопрос: как дочерний класс должен узнать имя папки, которую он создать должен? Родительський класс, допустим, генерирует случайное уникальное имя $realpath = sha1($this->exArr['path'].microtime(true)); И помещает его в таблицу (БД)
PHP: <?php class b extends a{ public function anotherFunction(){ if ($this->yoyo()) { // do smth } } } ?>
PHP: <?php class a{ protected $path; protected function create(){ $this->path = rand(0, 147); return true; } } class b extends a{ public function create(){ if(parent::create()){ echo 'Создаем папку с названием: '.$this->path; } } } $test = new b(); $test->create(); ?>
Ігор, ну вообще по многим стандартам кодирования все функции/методы должны возвращать true в случае успешного разруливания, т.к. в таком случае куда легче отлаживать и т.д.
По разумным стандартам, многие методы обьекта должны вовращать ссылку на сам обьект или новый обьект. )