ВУЗ: Не указан

Категория: Реферат

Дисциплина: Не указана

Добавлен: 07.11.2023

Просмотров: 169

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Введение

1. Аналитическая часть

1.1.2 Роль веб-сайта в работе медицинской клиники

1.2 Обоснование выбора средств создания веб-сайта

1.3 Обзор систем управления базами данных

2.Технологическая часть

2.1 Постановка задачи

2.1.1 Актуальность

2.1.2 Назначение веб-сайта

2.1.3 Характеристики оборудования

2.2 Реализация проекта

2.3 Средства для разработки и проектирование сайта

2.3.1 Анализ средств для разработки и создания Web-сайта

2.3.2 Фреймворки, используемые при разработке Web-сайтов: сравнительный анализ

2.3.4 Разработка веб-сайта в CMS WordPress

3. Тестирование веб-сайта и руководство пользователя

3.1. Тестирование веб-сайта

3.2. Руководство пользователя

Заключение

Список использованной литературы

Приложение

Archive config file not found in dup-installer folder. '; return $error; } }$is_https = $this->isHttps(); if($is_https) { $current_url = 'https://'; } else { $current_url = 'http://'; } if(($_SERVER['SERVER_PORT'] == 80) && ($is_https)) { // Fixing what appears to be a bad server setting $server_port = 443; } else { $server_port = $_SERVER['SERVER_PORT']; } // for ngrok url and Local by Flywheel Live URL if (isset($_SERVER['HTTP_X_ORIGINAL_HOST'])) { $host = $_SERVER['HTTP_X_ORIGINAL_HOST']; } else { $host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];//WAS SERVER_NAME and caused problems on some boxes } $current_url .= $host; if(strpos($current_url,':') === false) {$current_url = $current_url.':'.$server_port;}$current_url .= $_SERVER['REQUEST_URI']; $uri_start = dirname($current_url);$encoded_archive_path = urlencode($archive_filepath); if ($error === null) {$error = $this->postExtractProcessing();if($error == null) {$bootloader_name = basename(__FILE__);$this->mainInstallerURL = $uri_start.'/'.self::INSTALLER_DIR_NAME.'/main.installer.php';$this->fixInstallerPerms($this->mainInstallerURL); $this->archive = $archive_filepath; $this->bootloader = $bootloader_name;if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) {$this->mainInstallerURL .= '?'.$_SERVER['QUERY_STRING'];}self::log("DONE: No detected errors so redirecting to the main installer. Main Installer URI = {$this->mainInstallerURL}");}} return $error; } public function postExtractProcessing() { $dproInstallerDir = dirname(__FILE__) . '/dup-installer'; $libDir = $dproInstallerDir . '/lib'; $fileopsDir = $libDir . '/fileops';if(!file_exists($dproInstallerDir)) {return 'Can\'t extract installer directory. See this FAQ item for details on how to resolve.';} $sourceFilepath = "{$fileopsDir}/fileops.ppp"; $destFilepath = "{$fileopsDir}/fileops.php"; if(file_exists($sourceFilepath) && (!file_exists($destFilepath))) { if(@rename($sourceFilepath, $destFilepath) === false) { return "Error renaming {$sourceFilepath}"; } } }/*** Indicates if site is running https or not** @return bool Returns true if https, false if not*/ public function isHttps() { $retVal = true;if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {$_SERVER ['HTTPS'] = 'on';} if (isset($_SERVER['HTTPS'])) { $retVal = ($_SERVER['HTTPS'] !== 'off'); } else { $retVal = ($_SERVER['SERVER_PORT'] == 443);} return $retVal; }/*** Fetches current URL via php** @param bool $queryString If true the query string will also be returned.* @param int $getParentDirLevel if 0 get current script name or parent folder, if 1 parent folder if 2 parent of parent folder ... ** @returns The current page url*/public static function getCurrentUrl($queryString = true, $requestUri = false, $getParentDirLevel = 0){// *** HOSTif (isset($_SERVER['HTTP_X_ORIGINAL_HOST'])) {$host = $_SERVER['HTTP_X_ORIGINAL_HOST'];} else {$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']; //WAS SERVER_NAME and caused problems on some boxes}// *** PROTOCOLif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {$_SERVER ['HTTPS'] = 'on';}if (isset($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] === 'https') {$_SERVER ['HTTPS'] = 'on';}if (isset($_SERVER['HTTP_CF_VISITOR'])) {$visitor = json_decode($_SERVER['HTTP_CF_VISITOR']);if ($visitor->scheme == 'https') {$_SERVER ['HTTPS'] = 'on';}}$protocol = 'http'.((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on') ? 's' : '');if ($requestUri) {$serverUrlSelf = preg_replace('/\?.*$/', '', $_SERVER['REQUEST_URI']);} else {// *** SCRIPT NAME$serverUrlSelf = $_SERVER['SCRIPT_NAME'];for ($i = 0; $i < $getParentDirLevel; $i++) {$serverUrlSelf = preg_match('/^[\\\\\/]?$/', dirname($serverUrlSelf)) ? '' : dirname($serverUrlSelf);}}// *** QUERY STRING $query = ($queryString && isset($_SERVER['QUERY_STRING']) && strlen($_SERVER['QUERY_STRING']) > 0 ) ? '?'.$_SERVER['QUERY_STRING'] : '';return $protocol.'://'.$host.$serverUrlSelf.$query;} /*** Attempts to set the 'dup-installer' directory permissions** @return null*/ private function fixInstallerPerms() { $file_perms = 'u+rw'; $dir_perms = 'u+rwx'; $installer_dir_path = $this->installerContentsPath; $this->setPerms($installer_dir_path, $dir_perms, false); $this->setPerms($installer_dir_path, $file_perms, true); } /*** Set the permissions of a given directory and optionally all files** @param string $directory The full path to the directory where perms will be set* @param string $perms The given permission sets to use such as '0755' or 'u+rw' * @param string $do_files Also set the permissions of all the files in the directory** @return null*/ private function setPerms($directory, $perms, $do_files) { if (!$do_files) { // If setting a directory hiearchy be sure to include the base directory $this->setPermsOnItem($directory, $perms); } $item_names = array_diff(scandir($directory), array('.', '..')); foreach ($item_names as $item_name) { $path = "$directory/$item_name"; if (($do_files && is_file($path)) || (!$do_files && !is_file($path))) { $this->setPermsOnItem($path, $perms); } } } /*** Set the permissions of a single directory or file** @param string $path The full path to the directory or file where perms will be set* @param string $perms The given permission sets to use such as '0755' or 'u+rw'** @return bool Returns true if the permission was properly set*/ private function setPermsOnItem($path, $perms) { if (($result = self::chmod($path, $perms)) === false) {self::log("ERROR: Couldn't set permissions of $path");} else {self::log("Set permissions of $path");}return $result; }/*** Compare two strings and return html text which represts diff** @param string $oldString* @param string $newString** @return string Returns html text*/private function compareStrings($oldString, $newString) { $ret = ''; for($i=0; isset($oldString[$i]) || isset($newString[$i]); $i++) { if(!isset($oldString[$i])) { $ret .= '' . $newString[$i] . ''; continue; } for($char=0; isset($oldString[$i][$char]) || isset($newString[$i][$char]); $char++) {if(!isset($oldString[$i][$char])) { $ret .= '' . substr($newString[$i], $char) . ''; break; } elseif(!isset($newString[$i][$char])) { break; }if(ord($oldString[$i][$char]) != ord($newString[$i][$char])) $ret .= '' . $newString[$i][$char] . ''; else $ret .= $newString[$i][$char]; } } return $ret; }/*** Logs a string to the dup-installer-bootlog__[HASH].txt file** @param string $s The string to log to the log file** @return boog|int // This function returns the number of bytes that were written to the file, or FALSE on failure. */ public static function log($s, $deleteOld = false) {static $logfile = null;if (is_null($logfile)) {$logfile = self::getBootLogFilePath();}if ($deleteOld && file_exists($logfile)) {@unlink($logfile);}$timestamp = date('M j H:i:s'); return @file_put_contents($logfile, '['.$timestamp.'] '.self::postprocessLog($s)."\n", FILE_APPEND); }/*** get boot log file name the dup-installer-bootlog__[HASH].txt file** @return string */public static function getBootLogFilePath() {return dirname(__FILE__).'/dup-installer-bootlog__'.self::SECONDARY_PACKAGE_HASH.'.txt';}protected static function postprocessLog($str) {return str_replace(array(self::getArchiveFileHash(),self::PACKAGE_HASH, self::SECONDARY_PACKAGE_HASH), '[HASH]' , $str);}public static function getArchiveFileHash(){static $fileHash = null;if (is_null($fileHash)) {$fileHash = preg_replace('/^.+_([a-z0-9]+)_[0-9]{14}_archive\.(?:daf|zip)$/', '$1', self::ARCHIVE_FILENAME);}return $fileHash;}/*** Extracts only the 'dup-installer' files using ZipArchive** @param string $archive_filepath The path to the archive file.** @return bool Returns true if the data was properly extracted*/ private function extractInstallerZipArchive($archive_filepath, $checkSubFolder = false) { $success = true; $zipArchive = new ZipArchive(); $subFolderArchiveList = array(); if (($zipOpenRes = $zipArchive->open($archive_filepath)) === true) {self::log("Successfully opened archive file."); $destination = dirname(__FILE__); $folder_prefix = self::INSTALLER_DIR_NAME.'/'; self::log("Extracting all files from archive within ".self::INSTALLER_DIR_NAME); $this->installer_files_found = 0; for ($i = 0; $i < $zipArchive->numFiles; $i++) { $stat = $zipArchive->statIndex($i); if ($checkSubFolder == false) { $filenameCheck = $stat['name']; $filename = $stat['name'];$tmpSubFolder = null; } else {$safePath = rtrim(self::setSafePath($stat['name']) , '/'); $tmpArray = explode('/' , $safePath);if (count($tmpArray) < 2) { continue; } $tmpSubFolder = $tmpArray[0]; array_shift($tmpArray); $filenameCheck = implode('/' , $tmpArray); $filename = $stat['name']; } if ($this->startsWith($filenameCheck , $folder_prefix)) { $this->installer_files_found++; if (!empty($tmpSubFolder) && !in_array($tmpSubFolder , $subFolderArchiveList)) { $subFolderArchiveList[] = $tmpSubFolder; } if ($zipArchive->extractTo($destination, $filename) === true) { self::log("Success: {$filename} >>> {$destination}"); } else { self::log("[ERROR] Error extracting {$filename} from archive archive file"); $success = false; break; } } } if ($checkSubFolder && count($subFolderArchiveList) !== 1) { self::log("Error: Multiple dup subfolder archive"); $success = false; } else { if ($checkSubFolder) { $this->moveUpfromSubFolder(dirname(__FILE__).'/'.$subFolderArchiveList[0] , true); } $lib_directory = dirname(__FILE__).'/'.self::INSTALLER_DIR_NAME.'/lib'; $snaplib_directory = $lib_directory.'/snaplib'; // If snaplib files aren't present attempt to extract and copy those if(!file_exists($snaplib_directory)) { $folder_prefix = 'snaplib/'; $destination = $lib_directory; for ($i = 0; $i < $zipArchive->numFiles; $i++) { $stat = $zipArchive->statIndex($i); $filename = $stat['name']; if ($this->startsWith($filename, $folder_prefix)) { $this->installer_files_found++; if ($zipArchive->extractTo($destination, $filename) === true) { self::log("Success: {$filename} >>> {$destination}"); } else { self::log("[ERROR] Error extracting {$filename} from archive archive file"); $success = false; break; } } } } } if ($zipArchive->close() === true) { self::log("Successfully closed archive file"); } else { self::log("[ERROR] Problem closing archive file"); $success = false; }if ($success != false && $this->installer_files_found < 10) { if ($checkSubFolder) { self::log("[ERROR] Couldn't find the installer directory in the archive!"); $success = false; } else { self::log("[ERROR] Couldn't find the installer directory in archive root! Check subfolder"); $this->extractInstallerZipArchive($archive_filepath, true); } } } else { self::log("[ERROR] Couldn't open archive archive file with ZipArchive CODE[".$zipOpenRes."]"); $success = false; } return $success; }/*** return true if current SO is windows* * @staticvar bool $isWindows* @return bool*/public static function isWindows(){static $isWindows = null;if (is_null($isWindows)) {$isWindows = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN');}return $isWindows;}/*** return current SO path path len* @staticvar int $maxPath* @return int*/public static function maxPathLen(){static $maxPath = null;if (is_null($maxPath)) {if (defined('PHP_MAXPATHLEN')) {$maxPath = PHP_MAXPATHLEN;} else {// for PHP < 5.3.0$maxPath = self::isWindows() ? 260 : 4096;}}return $maxPath;}/*** this function make a chmod only if the are different from perms input and if chmod function is enabled** this function handles the variable MODE in a way similar to the chmod of lunux* So the MODE variable can be* 1) an octal number (0755)* 2) a string that defines an octal number ("644")* 3) a string with the following format [ugoa]*([-+=]([rwx]*)+** examples* u+rw add read and write at the user* u+rw,uo-wx add read and write ad the user and remove wx at groupd and other* a=rw is equal at 666* u=rwx,go-rwx is equal at 700** @param string $file* @param int|string $mode* @return boolean*/public static function chmod($file, $mode){if (!file_exists($file)) {return false;}$octalMode = 0;if (is_int($mode)) {$octalMode = $mode;} else if (is_string($mode)) {$mode = trim($mode);if (preg_match('/([0-7]{1,3})/', $mode)) {$octalMode = intval(('0'.$mode), 8);} else if (preg_match_all('/(a|[ugo]{1,3})([-=+])([rwx]{1,3})/', $mode, $gMatch, PREG_SET_ORDER)) {if (!function_exists('fileperms')) {return false;}// start by file permission$octalMode = (fileperms($file) & 0777);foreach ($gMatch as $matches) {// [ugo] or a = ugo$group = $matches[1];if ($group === 'a') {$group = 'ugo';}// can be + - =$action = $matches[2];// [rwx]$gPerms = $matches[3];// reset octal group perms$octalGroupMode = 0;// Init sub perms$subPerm = 0;$subPerm += strpos($gPerms, 'x') !== false ? 1 : 0; // mask 001$subPerm += strpos($gPerms, 'w') !== false ? 2 : 0; // mask 010$subPerm += strpos($gPerms, 'r') !== false ? 4 : 0; // mask 100$ugoLen = strlen($group);if ($action === '=') {// generate octal group permsissions and ugo mask invert$ugoMaskInvert = 0777;for ($i = 0; $i < $ugoLen; $i++) {switch ($group[$i]) {case 'u':$octalGroupMode = $octalGroupMode | $subPerm << 6; // mask xxx000000$ugoMaskInvert = $ugoMaskInvert & 077;break;case 'g':$octalGroupMode = $octalGroupMode | $subPerm << 3; // mask 000xxx000$ugoMaskInvert = $ugoMaskInvert & 0707;break;case 'o':$octalGroupMode = $octalGroupMode | $subPerm; // mask 000000xxx$ugoMaskInvert = $ugoMaskInvert & 0770;break;}}// apply = action$octalMode = $octalMode & ($ugoMaskInvert | $octalGroupMode);} else {// generate octal group permsissionsfor ($i = 0; $i < $ugoLen; $i++) {switch ($group[$i]) {case 'u':$octalGroupMode = $octalGroupMode | $subPerm << 6; // mask xxx000000break;case 'g':$octalGroupMode = $octalGroupMode | $subPerm << 3; // mask 000xxx000break;case 'o':$octalGroupMode = $octalGroupMode | $subPerm; // mask 000000xxxbreak;}}// apply + or - actionswitch ($action) {case '+':$octalMode = $octalMode | $octalGroupMode;break;case '-':$octalMode = $octalMode &


Автоматизированная система работы поликлиники

СОДЕРЖАНИЕ



Введение 5

1. Аналитическая часть 7

1.1Виды и характеристика веб-сайтов, роль в работе поликлиник 7

1.1.2 Роль веб-сайта в работе медицинской клиники 8

1.2 Обоснование выбора средств создания веб-сайта 9

1.3 Обзор систем управления базами данных 15

2.Технологическая часть 18

2.1 Постановка задачи 18

2.1.1 Актуальность 18

2.1.2 Назначение веб-сайта 19

2.1.3 Характеристики оборудования 19

2.2 Реализация проекта 20

2.3 Средства для разработки и проектирование сайта 20

2.3.1 Анализ средств для разработки и создания Web-сайта 20

2.3.2 Фреймворки, используемые при разработке Web-сайтов: сравнительный анализ 27

2.3.4 Разработка веб-сайта в CMS WordPress 35

3. Тестирование веб-сайта и руководство пользователя 44

3.1. Тестирование веб-сайта 44

3.2. Руководство пользователя 46

Заключение 49

Список использованной литературы 50

Приложение 52



Введение


С каждым днем ​​все больше и больше людей осваивают возможности Интернета для поиска информации о тех или иных услугах, Интернет стал необходимостью для человека. Путешествуя по сети, вы сталкиваетесь с большим количеством рекламы всех видов. Часто встречаются интересные сервисы, информация и ресурсы.

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


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

Грамотно созданный сайт будет способствовать его дальнейшему развитию и продвижению, а также повысит эффективность взаимодействия основного корпуса медицинской клиники (пациентов и клиентов). Сайт – это визитная карточка медицинской клиники, неотъемлемая часть медицинской отрасли, используемая для взаимодействия с людьми и создания новых возможностей для взаимодействия с клиентами. Сайт медицинской клиники – это инструмент коммуникации менеджеров, пациентов и клиентов. Объект исследования дипломной работы — деятельность поликлиники.

Предмет исследования выпускной квалификационной работы — процесс создания веб-сайта поликлиники с помощью системы управления контентом WordPress.

Цель дипломной работы — разработать веб-сайт поликлиники.

В соответствии с поставленной целью в работе определены следующие задачи:

• провести анализ предметной области;

• проанализировать средства разработки веб-сайта;

• разработать модель веб-сайта;

• реализовать разработанную модель веб-сайта средствами веб-технологий;

• наполнить веб-сайт контентом.

1. Аналитическая часть



    1. Виды и характеристика веб-сайтов, роль в работе поликлиник


Сайты поликлиник относятся к группе медицинских сайтов. Под медицинским веб-сайтом подразумевается объединение веб-страниц с повторяющимся дизайном, несущих в себе целенаправленную информацию о мед учреждении и другую информацию.

1.1.1 Виды медицинских веб-сайтов

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



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



  1. Сайты научных исследований. Сайты исследовательских работ в области медицины, врачей, преподавателей медицинских ВУЗов, научных работников.

  2. Сайты справочного характера. Сайты, содержащие справочную информацию о проводимых конференциях, конкурсах, семинарах научного и медицинского направления, о предоставляемых грантах, статьи, ссылки.

  1. Сайты информационных Интернет-проектов. Сайты обществ и ассоциаций, предназначены для проведения медицинских конкурсов и предоставление информационно-развлекательных проектов медицинской тематики.

  2. Сайты типа виртуальных методических объединений. Сайты методического объединения врачей по специализациям, методам лечения, сайты для тематических врачебных конференций и чатов в online режиме по вопросам лечения пациентов.

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



1.1.2 Роль веб-сайта в работе медицинской клиники


Веб-сайт, представляющий организацию, называется корпоративным или официальным веб-сайтом организации. Официальный сайт предъявляет более строгие требования к информативности, графическому оформлению и навигации.

Официальный сайт обычно имеет следующие разделы:

  • новостная информация;



  • нормативные документы, положения;



  • направления деятельности;



  • структура учреждения;



  • кадровый состав;

  • контактная информация (список ответственных лиц, их должности, координаты и часы приема).

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

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

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

1.2 Обоснование выбора средств создания веб-сайта



Система управления контентом — это компьютерная программа, предназначенная для упрощения управления контентом веб-сайта. Эта система позволяет веб-мастерам не использовать программный код напрямую, а использовать админ-панель со всеми необходимыми функциями для редактирования контента и создания новых материалов.

Наиболее популярные и распространенные системы управления контентом:

Joomla — вторая по популярности Content Management System (CMS),

более гибкая и простая. Joomla прекрасно подходит для разработки веб-сайта

с нестандартной структурой, например, корпоративного портала.

Данная система управления контентом производная ветвь от широко

известного проекта Mambo. В системе Joomla самые разнообразные инструменты для создания сайта.


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

Обычные инструменты администрирования устанавливают каталог расширений, который включает ряд языковых пакетов. Это дает возможность перевести интерфейс фронтенда и админки практически на любой язык. К минусам можно отнести то, что это, так сказать, упрощенная CMS, поэтому она слаба функционалом. Многие плагины и дополнения для CMS Joomla платные. В целом Joomla отличная платформа, которая обладает простым интерфейсом, приятным дизайном и большим набором шаблонов.

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

Преимущества:

• поддержка ленты новостей, веб-статистики, подписок;

• платформа дает возможность осуществлять контроль над всеми элементами страницы (от платежной системы до документооборота и чата).

При хороших навыках владения языком программирования можно легко «переписать» администрирование под себя.

Возможности:

• создание разнообразных сайтов на стандартах, адаптирующихся под различные браузеры;

• настройка ключевых слов, дружественных Uniform Resource Locator(URL).

Недостатки:

• маленькое количество готовых шаблонов, но разработчики обещают увеличить коллекцию;

• чтобы восстанавливать удаленные объекты, необходимо установить специальные плагины.

Drupal — это система управления веб-сайтом, написанная на языке PHP и использующая в качестве хранилища содержания реляционную базу данных (поддерживаются MySQL, PostgreSQL, а также любые базы данных, поддерживаемые библиотекой PEAR). За счет открытого кода доступа, она удобна в использовании, настройке. Drupal является свободным программным обеспечением, защищенным лицензией GPL и создается усилиями энтузиастов со всего мира. Начал разработку голландец DriesBuytaert, который и поныне является руководителем проекта. Архитектура Drupal позволяет применять его для построения различных типов веб-сайтов — от блогов и форумов