Тэг ‘cms’

Расположение конфигурационных файлов в популярных CMS

Иногда, имея ftp-доступ требуется найти доступ к БД.

Места хранения паролей для доступа к базам данных для различных CMS собраны в таблице:

CMS Конфигурационный файл с паролем к базе MySQL
bitrix /bitrix/php_interface/dbconn.php
Joomla /configuration.php
MODx /manager/includes/config.inc.php
Wordpress /wp-config.php
OsCommerce /includes/configuration.php /admin_area/includes/configuration.php

Наверняка, список далеко не полный - дополняйте в комментариях

Опубликовано Январь 27, 2011 | автор: levik  |  Нет комментариев »

Joomla делаем из абсолютных ссылок относительные

Сайт, работающий на Joomla выводит все ссылки, которые генерируются при помощи mod_mainmenu (upd. и не только) как абсолютные, то есть с http://:

http://joomla.site/link.htm

Насколько это корректно, хорошо или плохо - не скажу.. однако, я считаю, что внутренние ссылки должны быть именно внутренними, а точнее, относительными (т.е. без http:// ).

Итак делаем относительные ссылки на Joomla.

В файле /includes/sef.php следует внести исправление в двух местах:

(делаем SEF-ссылки относительными)
return $mosConfig_live_site .'/'. $string . $fragment;
(~ строка 520) заменяем на
return '/'. $string . $fragment;

(делаем обычные не SEF-ссылки относительными)
$string = $mosConfig_live_site .'/'. $string;
(~ строка 550) заменяем на
$string = '/'. $string;

Вот и всё - теперь все ссылки, которые генерируются автоматически будут без http. Ссылки в содержимом не обрабатываются - они так и останутся абсолютными (ну, или относительными - зависит от того, как вставляли ссылку)

На заметку: Мамбот NoFollow добавляет в абсолютные внешние ссылки… действительно Nofollow.

UPD для превращения вообще всех абсолютных внутренних ссылок в относительные можно написать собственный мамбот, который в зависимости от значения $_SERVER[’HTTP_HOST’] будет “вырезать” все лишние “внутренние” http: href=”http://(www\.)?joomla.site”

Опубликовано Сентябрь 21, 2010 | автор: levik  |  Нет комментариев »

Программирование для joomla

Подборка полезных ссылок

Создаем свой модуль для Joomla!

http://blog.boxdox.ru/2009/08/modul_for-joomla/ - собственный модуль для joomla

http://joomla-book.ru/development/creating-module/ - более подробная информация по созданию модулей для Joomla

Как вставить php-скрипт в Joomla
вставка php-скрипта в joomla - rdaddphp

Rdaddphp выводит пустую страницу.

Столкнулся с тем, что Rdaddphp выдает “пустую” страницу (там, где должно быть содержимое его просто нет, однако шаблон страницы выводится) . Получилось при добавлении строки :

$row = mysql_fetch_row ();

Причина была в использовании нужных для Joomla имен внутри файла. (в данном случае $row). Следите за уникальностью.

Опубликовано Июль 12, 2010 | автор: levik  |  Нет комментариев »

Drupal - подборка модулей, ссылок, полезностей

Drupal (капля) - CMS (система управления контентом). Большое сообщество, неплохая документация (в том числе и на русском) - неплохая подмога в решении практически любой задачи на drupal. Множество готовых модулей как на официальном англоязычном сайте (drupal.org), так и “менее официальных” в русскоязычном сообществе (drupal.ru).

Подборка модулей для Drupal

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

CCK - позволяет изменять типы данных (node), добавлять дополнительные поля.

Views - настройки отображения списков-таблиц элементов.

http://drupal.ru/
http://habrahabr.ru/blogs/about_cms/18078/
http://habrahabr.ru/blogs/drupal/18114/

Из менее популярного, но полезного:

Yandex Maps - позволяет привязать Яндекс-карту к ноде
http://www.drupal.ru/node/39766

Simple Gmaps - Google-карты
http://drupal.ru/node/24680

http://ann.sabonim.ru/module2

Опубликовано Июль 2, 2010 | автор: levik  |  Комментарий (1) »

Хранение паролей сайта или восстанавливаем пароль, имея доступ к базе

В целях безопасности многие сайты не хранят в открытом виде пароли пользователей. Функция восстановления пароля в таких случаях не “восстанавливает” старый пароль, а генерирует новый. При авторизации в этом случае присланный пароль шифруется (обычно хеш-функцией), а результат сравнивается с тем, что хранится в базе. Если совпадают - все в порядке. Если нет - ошибка авторизации.

Однако, довольно часто, требуется войти в панель управления или администрирования (админку), доступ к которой потерян (или вообще неизвестен). Восстановление тоже может не работать. Как быть?

Если имеется доступ к базе - можно попробовать задать новый пароль “ручками”, непосредственно в таблице пользователей. У каждой системы управления может быть свой метод хранения хешированных паролей, однако, наиболее распространенных способов не так много.

  • Хранение пароля в открытом виде

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

  • Хранение результата хеш-функции (хеш-суммы) пароля.

При задании (или генерации) пароля производится вычисление хеш-функции от строки пароля, и это значение записывается в таблицу. Наиболее распространенные функции для хранения паролей к сайтам - md5() , sha1(). Распознать хеш-функцию можно по характеным признакам:

md5-хеш содержит 128 бит (16 байт) и обычно представляется как последовательность из 32 шестнадцатеричных цифр. Например, MD5(”md5″) = 1bc29b36f623ba82aaf6724fd3b16718

sha1-хеш содержит 160 бит (20 байт) и представляется в виде последовательности 40 шестнадцатеричных цифр (5 групп по 8 символов). sha1(”sha”)   = d8f45903 20e1343a 915b6394 170650a8 f35d6926

  • Хранение хеш-суммы пароля и соль (salt)

Этот вариант имеет ещё более высокую степень защиты. В базе хранится хеш сумма и соль в виде hash:salt. (символ двоеточия приведен для примера, однако, именно его использование распространено)

salt - (соль) обычно строка из нескольких символов.  Используется для генерации хеш суммы. функция вычисляется не от значения пароля, а от значения “пароль”+”соль” ( “соль”+”пароль”, md5(md5(”пароль”)+”соль”)).

Хранение паролей в некоторых CMS

MD5 c4ca4238a0b923820dcc509a6f75849b Используется в phpBB v2.x, Joomla версии ниже 1.0.13, а также во многих других форумах и CMS.Длина: 16 байт. shugarcrm (поле user_hash)
md5($pass.$salt) 6f04f0d75f6870858bae14ac0b6d9f73:1234 Используется в WB News, Joomla версии 1.0.13 и выше.Длина: 16 байт.
md5($salt.$pass) f190ce9ac8445d249747cab7be43f7d5:12 Используется в osCommerce, AEF, Gallery и других CMS.Длина: 16 байт.
md5(md5($pass)) 28c8edde3d61a0411511d3b1866f0636 Используется в e107, DLE, Koobi .Длина: 16 байт.
md5(md5($pass).$salt) 6011527690eddca23580955c216b1fd2:wQ6 Используется в vBulletin, IceBB.Длина: 16 байт.
md5(md5($salt).md5($pass)) 81f87275dd805aa018df8befe09fe9f8:wH6_S Используется в IPB.Длина: 16 байт.
md5(md5($salt).$pass) 816a14db44578f516cbaef25bd8d8296:1234 Используется в MyBB.Длина: 16 байт.
SHA-1 356a192b7913b04c54574d18c28d46e6395428ab Используется во многих форумах и CMS.Длина: 20 байт.Алгоритм: соответствует функции sha1() языка PHP.
sha1(strtolower($username).$pass) Admin:6c7ca345f63f835cb353ff15bd6c5e052ec08e7a Используется в SMF.Длина: 20 байт.
base64_encode($pass) * Используется в Shop Script .

Cбрасываем пароль для JOOMLA
update `jos_users` set password = CONCAT(MD5(CONCAT('123','123')),':123') where id=1
пароль, как несложно догадаться - 123

Сброс пароля для Bitrix
http://www.vladsun.com/cms/bitrix_password_change.php
* с версии 7.1 checkword = (md5(salt+pass))

http://www.insidepro.com/hashes.php?lang=eng

Опубликовано Июнь 25, 2010 | автор: levik  |  Нет комментариев »

Вывод даты в modx - форматируем дату по-русски в php

Modx - система управления контентом (CMS). Иногда можно услышать о ней как о CMF.

В общем, форматируем дату в стиле “1 июня 2010 года”.

На php даже при установленной русской локали вывод даты в формате  ‘d B Y’ выведет что-то вроде “1 Июнь 2010″. Родительный падеж придется делать самостоятельно.

<?php
function rus_date($d) { //$d - timestamp
$month = array(1=>'января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря');
return date('d ',$d).$month[(int)date('m',$d)].date(' Y года',$d);
}
?>

Как прикрутить вывод даты к modx? Как обычно - через одно место. Через сниппет. (вариант с  phx тоже будет работать.. Если подключить PHx).

Создаем сниппет [[rus_date]] , в который помещаем очень похожий код:

<?php
$month = array(1=>'января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря');
$d = isset($d)?$d:$modx->documentObject['pub_date'];
return date('d ',$d).$month[(int)date('m',$d)].date(' Y года',$d);
?>

Вызов сниппета в документе - просто [[rus_date]]
Для форматирования даты по-русски при выводе в сниппете Ditto: в созданный чанк-шаблон в том месте, где нужно вывести дату вставляем
<p class="date">[[rus_date?&d=[+pub_date+]]]</p>

Ditto будет выводить уже отформатированную дату по-русски.

Опубликовано Июнь 1, 2010 | автор: levik  |  Комментарии (4) »

joomla размещаем баннер после статьи - frontpagebanner мамбот

Наткнулся на интересный мамбот для Joomla! - (кто-то может называть его плагином) FrontpageBanner .

Мамбот FrontpageBanner позволяет разместить на главной странице сразу после первой статьи баннер. То есть баннер (модуль баннеры) выводится в основной части сайта сразу после статьи. Возможности по настройке баннеров (какого выбрать рекламодателя или баннер) и более подробную информацию можно откопать на форуме мамбота.

Кстати, если плагин frontpagebanner обрабатывает информацию в колонках (right, left) - выводит “ненужный” баннер в блоке одного из модулей,  следует для модуля отключить мамботы…

Мамбот FrontpageBanner  выводит баннер после первой новости на главной странице… никакого другого функционала в нем не запланировано…

http://joomlaforum.ru/index.php/topic,7409.html - тут можно поближе познакомиться с мамботом-плагином FrontpageBanner.

Что самое интересное, о существовании сего плагина узнал по результатам его работы - наблюдался “непонятный” вывод баннеров на статических страницах . (не только на главной! :)) Чтобы модуль выводил баннеры на всех страницах после контента следует подправить файл bot_frontpagebanner.php
if ($view == ‘frontpage’) заменить на if (1)
именно так и выглядел “непонятный” вызов баннера.

Его можно использовать для вывода любого другого модуля (возможно, более уместен будет контекст, хотя, для его отображения, пожалуй целесообразно использовать специфические модули - Google Adsense Mambot, например ) - достаточно слегка подправить файл bot_frontpagebanner.php - следует найти строку
include($mosConfig_absolute_path . ‘/modules/mod_banners.php’);
и заменить её на вызов требуемого модуля:
mosLoadModules ( ‘position_name’, -1 );

Вообще, код плагина можно использовать как основу для написания мамботов для joomla.

Удачи в использовании плагина frontpagebanner на собственных joomla-сайтах! Если вы придумали оригинальное использование - сообщите в комментариях.. Возможно, оно окажется полезным или интересным кому-нибудь ещё…

Опубликовано Февраль 24, 2010 | автор: levik  |  Нет комментариев »

Virtuemart - скрываем пустые категории

При работе с интернет-магазином на базе Virtuemart после импорта из csv возможно появление пустых категорий, которые virtuemart не скрывает автоматически. Т.е. отображаются категории, в которых нет ни одного опубликованного товара (или вообще ни одного товара) - при заходе в такую категорию, естественно,  “ощущается пустота”.

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

В настройках Virtuemart (ни в глобальной конфигурации, ни в настройках категорий) пункта-галочки “скрывать пустые категории” (или отображать) я не нашел. Может плохо искал?

Как настроить virtuemart  чтобы он не показывал пустые категории?

Ничего более простого, как “опубликовывать только категории с товаром” я не придумал. Итак, проходим по категориям “снизу”, начиная с товаров, и .. опубликовываем их. Предварительно все категории распубликовываем. Если в магазине имеются умышленно скрытые категории (своеобразный склад временно неиспользуемых товаров), их можно просто добавить в исключения

Ближе к практике:

CREATE TEMPORARY TABLE `jos_tmp_category` (
`category_id` int(11) NOT NULL,
`lvl` int (2) not null,
PRIMARY KEY (`category_id`)
);

insert into `jos_tmp_category`
select distinct c.category_id, 1
FROM jos_vm_category c
INNER JOIN jos_vm_product_category_xref pc ON c.category_id = pc.category_id
INNER JOIN jos_vm_product p ON pc.product_id = p.product_id
WHERE p.product_publish = 'Y';

replace into `jos_tmp_category`
select distinct cc.category_parent_id, 2
FROM jos_vm_category_xref cc
inner join `jos_tmp_category` t
on t.category_id = cc.category_child_id and t.lvl=1;

replace into `jos_tmp_category`
select distinct cc.category_parent_id, 3
FROM jos_vm_category_xref cc
inner join `jos_tmp_category` t
on t.category_id = cc.category_child_id and t.lvl=2;

– …
– пока количество “затронутых” рядов перестанет изменяться

update jos_vm_category set category_publish='N';
update jos_vm_category set category_publish='Y'
where category_id in (select `category_id` from jos_tmp_category);

После таких запросов к базе virtuemart не будет отображать пустые категории (а если точнее, то пустые категории станут скрытыми). В универсальный хак-мод все это не переросло, а вот после “зашивания” в simple csv import сайт стал “скрывать категории” сразу после обновления товаров.

Опубликовано Ноябрь 4, 2009 | автор: levik  |  Комментарии (2) »

Импорт csv в virtuemart - Simple CSV (часть 2)

Не так давно публиковал заметку о реализации импорта csv в virtuemart

Когда потребовалось повторить установку “мода” Simple CSV - пока читал форум, забыл зачем пошел. :) На десяти страницах форума слишком много “воды” и повторяющихся вопросов. Решил собрать краткий ман-faq по мод-хаку  в одном месте. Может кому-нибудь окажется полезным.

Хак для версии virtuemart 1.0.*
Для более новых версий - см. CSVImproved http://joomlaforum.ru/index.php/topic,42648.msg407103.html#msg407103

http://joomlaforum.ru/index.php/topic,8340.msg87750.html#msg87750 - тут последняя (на дату написания поста) версия Simple CSV. Попутно стоит скачать примеры (на первой странице ветки), и учесть, что в файле параметров параметры надо называть не “Иглы;Размер иглы в СИ”, а просто “Размер иглы в СИ” - возможна ошибка при импорте. В секции товаров (!) в первой строке (заголовок) параметр должен называться  “Иглы;Размер иглы в СИ”.

В файле ps_simple_csv_aliases.php соответствия между заголовками импортируемого файла и полями в базе. Дополнительные поля могут не загружаться, так как в базу пишет функция Virtuemart’a - подправлять следует её.

Модифицировал галочку “проверять товары” (при включенной галочке - все товары, отсутствующие в загрузке “распубликовываются”) - сделал распубликование всех товаров перед загрузкой - запрос из нескольких тысяч in (,,,) почему-то не срабатывал..

Импорт атрибутов
В ps_simple_csv_aliases.php строчки
‘Атрибут’ => ‘attribute’,
‘Атрибут определенный нами’ => custom_attribute’,
на самом деле должны быть
‘Атрибут’ => ‘product_advanced_attribute’,
‘Атрибут определенный нами’ => ‘product_custom_attribute’,
Теперь буду мучать картинки =)

А как залить товар в несколько категорий?
Указать путь к категориям через запятую, или точку с запятой или палку. Смотря какой у вас разделитель данных. Стоит быть внимательным - добавляйте категории без пробелов - возможно “дублирование”/создание “лишних” категорий.

Категории, содержащие запятую (точку с запятой или вертикальную черту) могут грузиться как несколько категорий. Для того, чтобы избежать подобного “разделения одной категории”, в строке ~805 файла ps_simple_csv.php следует убрать или закомментировать ненужный разделитель..
if( !is_array($paths) ) $paths = explode(’,', $paths);

  Разделяем превьюшки и основные изображения по разным папкам: создаем нужный каталог (например resized) для и в csv пишем “resized/image1.jpg” и т.д.

Разные цены, в зависимости от количества товара:
А можно ли сделать чтобы отображалось 3 цены товара? При этом магазин у меня работает как каталог, т.е указать например, что при покупке 100 игл цена 600р, а при покупке 500 игл цена 580р, а при покупке 1000 игл цена 550р. Как это мне можно сделать думаю, что это можэно сделать через “Параметры товара”, я прав???
В версии 4 и ниже - если нужны именно цены, то сделать это можно через цены, а если просто для информаци, то через параметры можно. Через цены пока можно лишь разом загружать цены для разных групп, для возможности загружать цены и для разного количества товара - проверить в файле ps_simple_csv_aliases.php строку №123 заменить на:

'/Цена для группы "(.+?)"(?:(?:.*?)(\d+)(?:.*?)(\d+))?/' =>
'product_prices|shopper_group_name|price_quantity_start|price_quantity_end',

Для версии бета-5 добавлена возможность добавлять “сложные цены” в следующем формате

Цена для группы “<название группы покупателей, сначала это обычно -default->”[[что угодно]<число от>[что угодно]<число до>]

Правильно: Цена для группы “-default-” количество от 3 до 7
Неправильно: Цена для группы “-default-” количество от 3
Правильно: Цена для группы “-default-” 3 - 7
Правильно: Цена для группы “-default-”, 3 7
Правильно: Цена для группы “-default-
Если до много - пишем что-то вроде 3-99999 - http://joomlaforum.ru/index.php/topic,8340.msg89584.html#msg89584 - тут с примером разбора.

При загрузке двух колонок  (артикул, цена) - т.е. выгрузка используется только для обновления цен на сайте, следует подправить 883 строку файла на

if( $csv_data['manufacturer_id'] ) {

Fatal error: Allowed memory size of … bytes exhausted (tried to allocate … bytes) in - ошибка возникает при нехватке памяти скрипту. Следует уменьшать либо количество товаров в файле, либо по возможности убрать “лишнее” - описания, которые не меняются и подобное.

При длительной загрузке прайса, возможно, поможет

define( 'RG_EMULATION', 0 ); в файле globals.php

Несколько изображений в virtuemart - http://forum.virtuemart.net/index.php?topic=18473

Настройка разделителей по умолчанию - в product.simple_csv_upload.php
<input type="radio" name="csv_delimiter" checked="checked" value=";" />

Замеченные глюки с ценой:
- указание цены с пробелами;
- в меню “Информация о магазине” не выставлена валюта “валюта = рубль” - может повлиять на импорт цен;
- добавить в файл импорта поле product_currency с содержимым руб. (видимо, альтернатива предыдущему решению)

Сохраняем связанные товары  http://joomlaforum.ru/index.php/topic,8340.msg170587.html#msg170587

        // Присваиваем значения выборке из базы
        foreach( $csv_data as $key => $value ) {
          //if($db_data[$key]) $db_data[$key] = $value;
          $db_data[$key] = $value;
        }
		/*##my Додаю для того, аби супутні товари не затирались. Старт ##200802281852*/
		$q  = "SELECT related_products FROM #__{vm}_product_relations ";
		$q .= " WHERE product_id='".$db_data['product_id']."'";
		$db->query($q);
		if( $db->num_rows() ) {$db_data_related_products[] = $db->loadResult();}
		$db_data["related_products"]=$db_data_related_products;
		/* Кінець ##200802281852 */

Если у Вас возникли проблемы с установкой Simple CSV и вы их решили (или не решили) - отписывайтесь в комментариях или на форуме. При появлении новой информации пост по возможности (и желанию) буду обновлять.

Опубликовано Сентябрь 25, 2009 | автор: levik  |  Комментарии (5) »

оптимизация Oscommerce - уменьшаем нагрузку на сервер

OsCommerce - довольно известный движок для создания интернет-магазина. Широкие возможности, большое количество модулей-патчей - несомненный плюс. Однако, как и у всего, у Oscommerce имеются и минусы.

Одним из существенных недостатков, который зачастую оказывает решающее влияние при выборе движка для магазина является высокая требовательность к ресурсам (”громоздкость”, низкая производительность или “тормознутость” - термины не совсем корректные, однако, понятные каждому).

Похоже, что при разработке OScommerce вопросам производительности уделялось не так уж много внимания… Полностью переписывать OScommerce - решение далеко не оптимальное. Попробую собрать некоторые приемы, которые позволяют существенно снизить нагрузку на сервер со стороны OSCommerce.

Продолжение статьи про оптимизацию OsCommerce

Опубликовано Июнь 27, 2008 | автор: levik  |  Комментарий (1) »