maxsite
Подписаться на эту метку по RSS
И вновь 404 заголовки, а я же говорил!
Пятница, 24 июня 2011 г.Рубрика: Сайтостроительство
Метки: maxsite | php | seo
Вновь всплыла на форуме Макса тема о некорректной отдаче HTTP-заголовков. Видимо в прошлый раз я недостаточно рассмотрел проблему и, как следствие, она не была решена.
Цитирую:
У нас уже был случай, когда на странице пишется 404,Как выяснилось, существует загвоздка:
а в заголовке 200. По идее нужен контроль над отдачей заголовка.
На уровне системы нет такого контроля - она лишь послушно раскладываетЯ вижу такой выход: по умолчанию система отдаёт 404. При подключении типов, если есть материал для отображения переопределяем на 200. Потом нужна проверка на лишние сегменты. И нужно в тех плагинах, где идёт подключение на сегмент сделать переопределение заголовка на 200.
адрес на сегменты. В других CMS этот процесс практически аналогичен -
можно добавить произвольные get-параметры в адрес и получить эту же
страницу.
Максим предложил такое решение:
Админ задаёт некий шаблон адреса, который считается верным, например:Нулевая тестовая версия плагина была реализована мной.
category/*где / - разделитель сегментов, а * - произвольная часть сегмента. В этом примере адрес category/news будет валидным, а category/news/23 - нет.
category/*/next/*
/next/*
page/*То есть плагин при инициализации системы (хук init) проверяет текущий адрес на один из разрешенных шаблонов и если он соответствует любому варианту, то ничего не делает. Если же соответствия нет, переделывает type на page_404.
На мой взгляд данные меры недостаточны и следует ввести ещё ряд проверок на правильность сегмента. Нужно обсудить и обдумать предложения по совершенствованию плагина.
Критика Maxsite. Заблуждения
Среда, 14 июля 2010 г.Рубрика: Сайтостроительство
Метки: cms | maxsite | неприятное
Данная заметка несколько не отвечает моим требованиям к собственным материалам, она родилась из темы на официальном форуме Maxsite CMS и переписывать поэтому я её не буду. Тема форума безосновательно критикует систему управления. Сделаю то, что умею делать достаточно хорошо - покажу в чём автор заблуждается. Давно работаю с ЦМС в том числе Макса. Тем более это кто-то сделать должен.
Быстрое создание сайта корпоративного уровня
Среда, 26 мая 2010 г.Рубрика: Веб-мастерство
Метки: maxsite | php | rss | sql | время
Динамично развивающийся рынок диктует необходимость создания сайта как средства информирования и удержания целевой аудитории любой организации. Это также может быть собственный учёт, документооборот, иные Интернет-ресурсы. Для молодёжных организаций и общественных объединений сайт ещё более актуален, поскольку молодые люди привыкли получать всю информацию через Интернет.
В рамках настоящей работы создан и запущен в эксплуатацию сайт «Открой свои возможности», в настоящее время доступный в Интернете по адресу UrSSA.ru. Заказчиком данного проекта является Министерство по делам молодёжи УР и Республиканский совет студентов и аспирантов. Необходимо было получить работоспособный программный продукт в максимально короткие сроки. Ввиду того, что требования заказчика часто менялись и дополнялись, сформировать сводное техническое задание было практически невозможно.
В результате работы программиста, дизайнера и верстальщика был разработан удобный в использовании сайт со следующей функциональностью: центральное место занимает лента новостей с возможностью поиска по всем записям; пользователю дана возможность оставить своё мнение о новостях, проголосовать по предложенным вопросам и связаться с администрацией; материалы сайта доступны в виде ленты RSS.
Рассматривая техническую сторону вопроса, следует выделить систему управления содержанием сайта от отечественного разработчика – MaxSite CMS, как основное средство реализации проекта. Система реализована на CodeIgniter с поддержкой PHP и использует для хранения информации базу данных MySQL. Выбранная платформа позволяет использовать и другие решения, например, MS SQL, Postgre, Oracle, SQLite. Необходимо добавить, что использовалось много сторонних расширений, автором написаны собственные.
Также требовалось учесть, что система управления сайтом «Открой свои возможности» должна быть простой. Обслуживание и развитие сайта предполагается силами студентов, обычно ещё не имеющих опыта работы с подобными системами.
Оценим временные затраты на создание описанного выше продукта. Наиболее ответственная часть работы – установка и настройка системы управления на сервере. Этот процесс занял около двух часов. Далее возникла создания графического шаблона будущего сайта. Дизайнеру потребовалось на это около пяти часов. Для оценки работы дизайнера необходимы специальные знания. Творческий процесс трудно лимитировать. Было решено считать такой результат вполне удовлетворительным в плане быстроты. Завершающий этап разработки сайта – вёрстка, программирование и «подгонка» шаблона под систему управления. В рамках этого этапа был создан графический вывод данных, всё было «увязано» с системой управления. На это потребовалось приблизительно семь часов. В результате было выяснено, что в нашем случае создать нужный заказчику сайт при использовании типовых решений можно приблизительно за неделю. Данный подход позволяет заметно сократить время разработки. Следует отметить, что при использовании типовых свободно распространяемых решений профессиональному разработчику будет достаточно одних суток.
В настоящее время сайт полностью функционирует. Заказчик начал наполнять его необходимыми материалами. В перспективе предполагается увеличение сервисов сайта и продвижение его в поисковых системах. Также необходимо обратить внимание молодых разработчиков на необходимость утверждения точного технического задания при взаимоотношениях с заказчиком.
Столкнулся с тем, что не всегда понятно как и для чего создан данный хак. Это вообще свойственно разработчикам да и не только - для себя очевидно, расписать для людей лень. Каюсь и исправляю ошибку.
Итак. Для чего? Допустим мы хотим установить много копий MaxSite CMS. Разумеется хотим обойтись одной базой данных и одной копией самой системы, домены привязываются к одной папке. Это удешевляет хостинг в принципе, но не снимает ограничений по нагрузке на него.
Устанавливая данный хак мы получаем: только одну копию Maxsite CMS на диске у хостера. Все домены линкуются к одной папке. В зависимости от доменного имени, идёт обращение к определённым таблицам в базе данных. Так как делается это на этапе до запуска самого движка, ни пользователь, ни администратор даже не заметят разницы работая с многосайтовой или обычной версией системы.
Что получается в базе данных? Макссайт создаёт около десятка таблиц для хранения данных одного сайта вида mso_table. Многосайтовая версия в рамках одной же базы данных создаст n помноженное на дюжину таблиц, где n это количество сайтов. небольшое захламление получается, зато великая экономия... Опыт показывает, что одиннадцать сайтов нормально работают. Правда у них небольшая посещаемость...
По привязке доменов - можно использовать парковку к главному домену. Можно также привязывать и субдомены, проблем не будет.
Структура базы данных - используются префиксы вида railway$club_org_ru, если ваш домен это railway-club.org.ru. Такие косяки, позволяют добиться однозначного соответствия. У людей были проблемы, когда просто удалялись точки и тире из домена.
После запуска, нужно также создать папку для сайта в категории site, а в ней каталоги uploads, cache. Файл sitemap.xml для карты сайта. Права выставляются так же как и у стандартных каталогов. Это как правило (777).
Для работы в панели администратора переключить шаблон с дефалтного.
Проверка регистрационных данных
Воскресенье, 6 декабря 2009 г.Рубрика: Сайтостроительство
Метки: cms | maxsite | php
Часть функций, их основа честно откуда-то спёрта. Мне не удалось разыскать источник поэтому выложу в открытый доступ. Функции для проверки регистрационных данных комъюзеров.
Функция проверки на существование мыла в таблице пользователей.
function is_email_exists($email)
{
$ret = false;
$CI = &get_instance();
$CI->db->from('users');
$CI->db->select('users_email');
$CI->db->limit(1);
$CI->db->where( array('users_email' => $email));
$query = $CI->db->get();
if( $query->num_rows() )
{
$row = $query->row();
if( $row->users_email == $email ) $ret = true;
}
return $ret;
}
Получение ИДа пользователя по его нику.
function get_id_by_nik($name)Проверка на существование логина юзера
{
$ret = true;
$id = 0;
$CI = &get_instance();
$CI->db->from('comusers');
$CI->db->select('comusers_id');
$CI->db->limit(1);
$CI->db->where( array('comusers_nik' => $name));
$query = $CI->db->get();
if( $query->num_rows() )
{
$row = $query->row();
$id = $row->comusers_id;
}
return (int) $id;
}
function is_users_login($login)Проверка на существование ника пользователя
{
$ret = true;
$CI = &get_instance();
$CI->db->from('users');
$CI->db->select('users_login');
$CI->db->limit(1);
$CI->db->where( array('users_login' => $login));
$query = $CI->db->get();
if( $query->num_rows() )
{
$row = $query->row();
if( $row->users_login == $login )
{
$ret = false;
}
else
{
$ret = true;
}
}
return $ret;
}
function is_users_nik($login)Проверка на существование ника комъюзера
{
$ret = true;
$CI = &get_instance();
$CI->db->from('users');
$CI->db->select('users_nik');
$CI->db->limit(1);
$CI->db->where( array('users_nik' => $login) );
$query = $CI->db->get();
if( $query->num_rows() )
{
$row = $query->row();
if( $row->users_nik == $login )
{
$ret = false;
}
else
{
$ret = true;
}
}
return $ret;
}
function is_comusers_nik($login, $userid)
{
$ret = true;
$CI = &get_instance();
$CI->db->from('comusers');
$CI->db->select('comusers_nik');
$CI->db->limit(1);
$CI->db->where( array('comusers_nik' => $login) );
$query = $CI->db->get();
if( $query->num_rows() )
{
$row = $query->row();
if ( ( $row->comusers_nik == $login ) and
( get_id_by_nik($row->comusers_nik) != $userid ) and ( $row->comusers_nik!='' ) )
{
$ret = false;
}
else
{
$ret = true;
}
}
return $ret;
}
Функция, которую нужно вызывать в файле your-template/type/users-form.php вместо стандартной $res_post=mso_comuser_edit(); нужно выполнить присваивание $res_post=russ_mso_comuser_edit();
function russ_mso_comuser_edit($args = array())Изменений минимум, но они касаются именно проверок. При обновлении Максом данной функции следует вносить изменения и в эту. На данный момент она предназначена для версии 0.34. Хотя не думаю, что будут изменения в будущем.
{
global $MSO;
if ( !isset($args['css_ok']) ) $args['css_ok'] = 'comment-ok';
if ( !isset($args['css_error']) ) $args['css_error'] = 'comment-error';
# id комюзера, который в сессии
if ( isset($MSO->data['session']['comuser']) and $MSO->data['session']['comuser'] )
$id_session = $MSO->data['session']['comuser']['comusers_id'];
else $id_session = false;
if ( $post = mso_check_post(array('f_session_id', 'f_submit', 'f_comusers_activate_key')) ) // это активация
{
# защита рефера
mso_checkreferer();
# защита сессии - если не нужно закомментировать строчку!
if ($MSO->data['session']['session_id'] != $post['f_session_id']) mso_redirect();
// получаем номер юзера id из f_submit[]
$id = (int) mso_array_get_key($post['f_submit']);
if (!$id) return ''. t('Ошибочный номер пользователя'). '';
# проверяем id в сессии с сабмитом
if ($id != $id_session)
return ''. t('Ошибочный номер пользователя'). '';
$f_comusers_activate_key = trim($post['f_comusers_activate_key']);
if (!$f_comusers_activate_key) return ''. t('Неверный (пустой) ключ'). '';
// нужно проверить если у указанного комюзера не равные ключи
// если они равны, то ничего не делаем
$CI = & get_instance();
$CI->db->select('comusers_activate_string, comusers_activate_key');
$CI->db->from('comusers');
$CI->db->where('comusers_id', $id);
$CI->db->limit(1);
$query = $CI->db->get();
if ($query->num_rows() > 0)
{
$comuser = $query->result_array(); // данные комюзера
if ($comuser[0]['comusers_activate_string'] == $comuser[0]['comusers_activate_key'])
{
// уже равны, активация не требуется
return ''. t('Активация уже выполнена'). '';
}
else
{
// ключи в базе не равны
// сверяем с переданным ключом из формы
if ($f_comusers_activate_key == $comuser[0]['comusers_activate_key'])
{
// верный ключ - обновляем в базе
$CI->db->where('comusers_id', $id);
$res = ($CI->db->update('comusers',
array ('comusers_activate_string' => $f_comusers_activate_key ) )) ? '1' : '0';
$CI->db->cache_delete_all();
if ($res)
return ''. t('Активация выполнена!'). '';
else
return ''. t('Ошибка БД при добавления ключа активации'). '';
}
else
{
return ''. t('Ошибочный ключ активации'). '';
}
}
}
else // вообще нет такого комюзера
return ''. t('Ошибочный номер пользователя'). '';
}
elseif ( $post = mso_check_post(array('flogin_session_id', 'flogin_submit', 'flogin_user', 'flogin_password',
'flogin_redirect')) )
{
// логинимся через стандартную _mso_login()
_mso_login();
return;
}
// это форма?
elseif ( $post = mso_check_post(array('f_session_id', 'f_submit', 'f_comusers_email', 'f_comusers_password',
'f_comusers_nik', 'f_comusers_url', 'f_comusers_icq', 'f_comusers_msn', 'f_comusers_jaber',
'f_comusers_date_birth', 'f_comusers_description', 'f_comusers_avatar_url')) ) // это обновление формы
{
if (!is_login_comuser())
return ''. t('Ошибочные данные пользователя'). '';
# защита рефера
mso_checkreferer();
# защита сессии - если не нужно закомментировать строчку!
if ($MSO->data['session']['session_id'] != $post['f_session_id']) mso_redirect();
// получаем номер юзера id из f_submit[]
$id = (int) mso_array_get_key($post['f_submit']);
if (!$id) return ''. t('Ошибочный номер пользователя'). '';
# проверяем id в сессии с сабмитом
if ($id != $id_session)
return ''. t('Ошибочный номер пользователя'). '';
$f_comusers_email = trim($post['f_comusers_email']);
$f_comusers_password = trim($post['f_comusers_password']);
if (!$f_comusers_email or !$f_comusers_password)
return ''. t('Необходимо указать email и пароль'). '';
// проверим есть ли такой комюзер
$CI = & get_instance();
$CI->db->select('*');
$CI->db->from('comusers');
# CodeIgniter экранирует where, даже когда только условия в полях
$CI->db->where('comusers_activate_string=comusers_activate_key', '', false); // активация должна уже быть
$CI->db->where(array('comusers_id'=>$id,
'comusers_email'=>$f_comusers_email,
'comusers_password'=>$f_comusers_password
));
$CI->db->limit(1);
$query = $CI->db->get();
if ($query->num_rows() > 0)
{
// все ок - логин пароль верные
$comuser = $query->result_array(); // данные комюзера
$f_comusers_avatar_url = mso_strip($post['f_comusers_avatar_url'], false,
array('\\', '|', '?', '%', '*', '`'));
$allowed_ext = array('gif', 'jpg', 'jpeg', 'png'); // разрешенные типы
$ext = strtolower(str_replace('.', '', strrchr($f_comusers_avatar_url, '.'))); // расширение файла
if ( !in_array($ext, $allowed_ext) ) $f_comusers_avatar_url = ''; // запрещенный тип файла
if (!isset($post['f_comusers_notify'])) $post['f_comusers_notify'] = 0;
if ( !( is_users_login($post['f_comusers_nik']) and is_comusers_nik($post['f_comusers_nik'], $id) and is_users_nik($post['f_comusers_nik']) ) )
return ''. t('Необходимо указать правильный ник'). '';
$upd_date = array (
'comusers_nik' => strip_tags($post['f_comusers_nik']),
'comusers_url' => strip_tags($post['f_comusers_url']),
'comusers_icq' => strip_tags($post['f_comusers_icq']),
'comusers_msn' => strip_tags($post['f_comusers_msn']),
'comusers_jaber' => strip_tags($post['f_comusers_jaber']),
'comusers_date_birth' => strip_tags($post['f_comusers_date_birth']),
'comusers_description' => strip_tags($post['f_comusers_description']),
'comusers_avatar_url' => $f_comusers_avatar_url,
'comusers_notify' => $post['f_comusers_notify'],
);
# pr($upd_date );
$CI->db->where('comusers_id', $id);
$res = ($CI->db->update('comusers', $upd_date )) ? '1' : '0';
$CI->db->cache_delete_all();
// mso_flush_cache(); // сбросим кэш
if ($res)
return ''. t('Обновление выполнено!'). '';
else
return ''. t('Ошибка БД при обновлении'). '';
}
else return ''. t('Ошибочный email и пароль'). '';
} // обновление формы
}
МаксМногосайт v. 0.2
Четверг, 19 ноября 2009 г.Рубрика: Сайтостроительство
Метки: cms | maxsite | время
Приветствую! Много времени прошло с публикации первой части многосайтового расширения для MaxSite CMS. Думаю интересно оно осталось только мне, что в принципе неудивительно. В любом случае решил выложить следующую версию. Основные изменения связаны с изменениями самой MaxSite. Кроме того, перенёс папки с сайтами (шаблонами) в отдельную директорию в корне.
Для установки:
- Изменить настройки в /application/config/database.php - настройки базы данных.
- Изменить настройки в /application/maxsite/mso-config.php - секретная фраза.
- В папке (папках) вида /site/domain_ru/ поставить разрешения на запись в каталогах uploads, cache и файле sitemap.xml
- По необходимости добавить из последней сборки шаблон default.
- Устанавливать всегда поверх сборки. Перезаписывается плагин xml_sitemap (что плохо, не спорю)
- Совсем забыл! Хотя из исходников всё очевидно, но всё же. Структура базы данных - используются префиксы вида railway$club_org_ru, если ваш домен это railway-club.org.ru. Такие косяки, позволяют добиться однозначного соответствия. У людей были проблемы, когда просто удалялись точки и тире из домена.
Прямая ссылка на скачивание multi_maxsite_0_2.zip 0
Закладочник на Jquery для MaxSite CMS
Понедельник, 17 августа 2009 г.Рубрика: Сайтостроительство
Метки: cms | maxsite | seo
Приветствую! Создал свой первый плагин для MaxSite CMS. Он генерирует список ссылок для добавления страницы в социальные сервисы, закладки. К слову для MaxSite уже создано два подобных плагина. Это стандартный addzakl и недавно представленный плагин от Алексея (http://driverlab.ru). Собственно очень даже неплохие и даже отличные простые решения. Чем они меня не устраивают? Да ничем. Но есть красивое решение для создания таких кнопок от dimox'a (http://dimox.name). Дмитрий использует библиотеку Jquery. Я взял за основу данный скрипт, адаптировал его к MaxSite и добавил администраторские возможности из скрипта Алексея. То что получилось можно взять по нижеследующей ссылке, а также оценить в работе на этом сайте.
Сегодня, 22 августа случайно обнаружил несовместимость данного плагина с lightbox'ом и colorbox'ом. Выглядит таким образом: меню плагина не раскрывается, галерея не выводит окна с картинкой. В общем если поставить разом - убивают друг друга.:) Решил найти проблему. Отключал по очереди вызовы некоторых процедур в этом плагине. Помогает только полное удаление файла jqsocial.js. Ошибка нашлась неожиданно и совершенно случайно. Файрбаг зафиксировал такое вот дело:
При включённом lightbox'e: $ is not a function $('div.gallery a').lightBox({
При включённом colorbox'e: $ is not a function $(".gallery,.slideshow").find("a[href$='.jpg'],a[href$='.jpeg'],a[href$='.png']...
Что с этим счастьем делать не знаю, по идее ошибка у разработчиков lightbox'ов, без них ошибок не наблюдается.
В любом случае разбираться самостоятельно не буду... Толку не будет. Даже не могу понять где искать ошибки. Однако если добрые люди подскажут, что нужно сделать и переделать, чтобы ошибки не возникали - всегда готов.
А вот и обещанная ссылка на скачивание.
Ни в коем случае не ставьте сразу на рабочий сайт! Я конечно всё протестировал, но лучше проверьте как заработает.
Наипервейшая и наипростейшая версия. Надеюсь будет развиваться... Есть к чему стремиться! Качайте! Ах да - на винде не тестировал.
Приветствую друзья!
Вот наконец дошли руки собрать воедино то, о чём я давно уже рассказывал. А именно многосайтовую модификацию для MaxSite CMS. В следующей заметке будет дана ссылка на скачивание, а сейчас хочу рассказать о некоторых особенностях модификации.
- Первое, оно же главное: всё сделано в наиболее упрощённом виде. Как уже говорил, для того, чтобы обновления самой системы, по возможности, не затрагивали модификацию.
- Второе: небольшое количество файлов в скачанном архиве. Следует из первого пункта. Разброс по папкам для наиболее простой установки. Вы просто копируете файлы в корень сайта и наслаждаетесь эффектом.
- Третье: в файлах по паре строк добавленного кода. Истина в простоте ;-) Действительно, всё очень просто!
Из недостатков:
- База данных засоряется! Многовато записей, дублируется кое-что. Да и не уверен что даже 20+ сайтов оно потянет... хотя кто знает?
- Изменены файлы плагина xml-sitemap. Теперь карта сайта расположена не в корне, а в шаблоне. Соответственно права на запись надо выставить вручную...
- Общий доступ к upload
- Общие ушки. Даже не знаю недостаток ли...
- Распаковываем на сервер MaxSite CMS
- Качаем самый новый архив с модификацией.
- Распаковываем в корень сайта с заменой существующих файлов.
- Прописываем логин-пароль к базе в соответствующем файле. (application\config\database.php)
- Берём нужный шаблон для сайта. Папку переименовываем так: наш сайт site.ru, папка site_ru
- В папку копируем sitemap.xml. Ставим права на запись.
Приветствую! Вчера под конец дня у меня родилась идея. Всё по теме MaxSite МногоСайт. А именно о вынесении в папку шаблона файла sitemap.xml. Как это было реализовано я сейчас и напишу.
Я решил воспользоваться уже известной мне схемой: через наш любимый Mod Rewrite ;-) - прописываем в .htaccess такую строчку:
- RewriteRule ^sitemap.xml$ http://%{HTTP_HOST}/sitemap.php
- RewriteRule ^sitemap.xml$ /sitemap.php
- RewriteCond $1 !^(index\.php|uploads|robots\.txt|favicon\.ico)
- RewriteCond $1 !^(index\.php|uploads|robots\.txt|sitemap\.xml|favicon\.ico)
Сам файл выглядит похитрее, чем robots.php:
- <?php
- $hostway=str_replace('.','_',$_SERVER['HTTP_HOST']);
- $hostway='./application/maxsite/templates/'.$hostway.'/sitemap.xml';
- header("Content-type: application/xml");
- echo file_get_contents($hostway);
- ?>
Итак, основная часть готова и нам нужно лишь слегка подправить плагин формирования карты сайта, чтобы файл сливался куда нам нужно. Собственно я сделал так:
- $hostway=str_replace('.','_',$_SERVER['HTTP_HOST']);
- $hostway='/application/maxsite/templates/'.$hostway.'/sitemap.xml';
- $fn = realpath(dirname(FCPATH)).$hostway;
Ну вот пожалуй и всё. Хочу так же обрадовать: скоро выпущу дополнение для преобразования в многосайтовую систему. Думаю это нужно сделать, по структуре будет примерно так: ставите MaxSite, поверх льёте мои труды и на выходе у вас многосайтовая система. Наверное за выходные сделаю пробную бету ;-)