Как написать ядро CMS?

hammet

Новичок
Как написать ядро CMS?

Добрый день! Мне нужен совет разработчиков с опытом.
Я сделал уже около 20 сайтов, но никогда не прибегал к проектированию собственной CMS. Т.е. под каждый сайт делал админ-панель, под которую у меня имелись готовые модули (напр. новости, гостевая, галерея, загрузка файлов и пр) которые я при необходимости "прикручивал".
И всегда я делил разделы сайта на статику и динамику, что оговаривалось в ТЗ.
Теперь стал вопрос о создании сайта под ключ. Т.е. редактироваться должно все:
количество и название разделов, возможность добавлять текст разделов, статьи, ссылки, картинки и прочее. Т.е. нужна автоматическая генерация HTML.
Я решил что пришло время сделать собственную CMS и постепенно ее совершенствовать.

Подскажи каков принцип построения архитектуры ядра? Каков принцип генерации несуществующих разделов, и, тем более, файлов html?

Заранее спасибо!
 

Sanchez

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

hammet

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

Alexandre

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

hammet

Новичок
bools - ну приблизительно, да.

Alexandre - причем тут MVC? Я пишу приложения, базирующиеся на модели MVC, объектная модель - контроллер - смарти...


не пойму как генерируется НЕСУЩЕСТВУЮЩАЯ страница с предопределенными пользователем стилями, контентом, заголовком, и пр...
 

Dovg

Продвинутый новичок
hammet
Тебе в первом ответе сказали про mod_rewrite
поиск по "чпу" даст еще много интересного

нет никакой ложки (с)
 

Vallar_ultra

Любитель выпить :)
>объектная модель - контроллер - смарти

Гы ))) Т.е. отображение и шаблонны смарти вещи эквивалентные.... мдя.
 

hammet

Новичок
Автор оригинала: Vallar_ultra
>объектная модель - контроллер - смарти

Гы ))) Т.е. отображение и шаблонны смарти вещи эквивалентные.... мдя.
ыыы???

View отвечает за отображение информации (пользовательский интерфейс). Я использую smarty для отделения View, чтобы его изменение оказывало минимальное воздействие на другие компоненты. Не есть ли это основной принцип MVC?
 

Alexandre

PHPПенсионер
hammet
тут пара идей http://www.phpclub.ru/talk/showthread.php?s=&postid=712600

еще можно найти больше в поиске по форуму, тема поднималась сотни раз.
 

hammet

Новичок
Кое что сделал....
Вот собственно сама идея:
Есть что-то вроде диспетчера, который парсит урл, подгружает нужный модуль и передает управление нужному методу. При этом методу должны передаваться параметры. Каждому свои.
Например:
code]
$url = 'http://example.com/index.php?module=news&method=edit&id=15';
[/code]
Подгружаем модуль News
Передаем управление методу Edit
параметр метода $id = 15

PHP:
<?php
  require_once('URL.php');

  class Kernel extends Net_URL {
  
    private $start_time;
    private $end_time;
    private $lib_path;
    private $default_module;
    private $params;
    
    /**
    * PHP5 Constructor
    *
    * Parses the given url, load module, 
    * and call to a given method
    *
    */
    public function __construct() {
      
      parent::__construct($_SERVER['REQUEST_URI']);
      
      $this->start_time = array_sum(explode(' ',microtime()));
      $this->lib_path = $_SERVER['DOCUMENT_ROOT'] . '/src/';
      $this->default_module = $this->lib_path . 'CMS.class.php';
      
      $module_obj = $this->Load_module();
      $this->Load_method($module_obj, $this->Load_params());
    }
    
    /**
    * Get module name from parsed uri and 
    * create an object 
    * 
    * @return obj module object
    * @access private
    */
    
    private function Load_module() {
      if (isset($this->querystring['module'])) {
      	$module = $this->lib_path . $this->querystring['module'] . '/' . $this->querystring['module'] . '.class.php';
      	if(file_exists($module)) {
      		require_once($module);
      		$module_obj = new $this->querystring['module'];
      		return $module_obj;
      	} else {
      		require_once($this->default_module);
      		$class = basename($this->default_module, '.class.php');
      		$module_obj = new $class;
      		return $module_obj;
      	}
      }
      else {
      	require_once($this->default_module);
      	$class = basename($this->default_module, '.class.php');
      	$module_obj = new $class;
      	return $module_obj;
      }
    }
    
    /**
    * Get method name from parsed uri
    * and call to this method
    * @param  obj $module_obj
    * @param  array $params
    * @return bool $success
    * @access private
    */
    private function Load_method($module_obj, $params = array()) {
      if (isset($this->querystring['method'])) {
      	if(method_exists($module_obj, $this->querystring['method'])) {
      		$method = $this->querystring['method'];
      		$module_obj->$method($params);
      	}
      	else {
      		echo 'method not found!';
      	}
      }
      else {
      	echo 'default';
      }
    }
    
    /**
    * Get params from parsed uri
    * 
    * @return array $params
    * @access private
    */
    private function Load_params() {
      if(count($this->querystring > 2)) {
      	$params = array_slice($this->querystring, 2);
      	return $params;
      }
    }
    
    public function __destruct() {
      $this->end_time = array_sum(explode(' ',microtime()));
      $runtime = $this->end_time - $this->start_time;
      return substr($runtime,0,6);
    }
  }
  
?>

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

Может кто-то предложит способ? Или есть советы/мнения/мысли по поводу самой идеи?
Спасибо...
 

Alexandre

PHPПенсионер
Может кто-то предложит способ?
предлагали способ,
смотри тот пост, на который я давал ссылку

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

hammet

Новичок
Alexandre
да, я смотрел ссылку, я так и делаю.

Vallar_ultra
Спасибо - очень помогло!
 
Сверху