Лента блогов InstantCMS

Инструментарий web-разработчика

Приветсвую сообщество! Хочу рассказать здесь какими инструментами пользуюсь для разработки.
Первым делом это Aptana Studio, изначально это плагин для Eclipse, сейчас доступна как плагин и как самостоятельная среда, мощи этой IDE мне хватает для HTML вёрстки, написания CSS кода, JavaScript  c PHP тоже неплохо справляется(мне хватает по крайней мере, в пшп не силён). Её плюсы это автозакрытие тегов, хорошая подсветка, CSS код писать вообще шикарно, само оформление среды радует глаз, всё интуитивно понятно, наличие FTP клиента, SVN, расширяется до безумия, под неё написана куча всевозможных расширений. И ещё один большой плюс этой среды - наличие jQuery шпаргалки. В общем всем кто всё ещё пишет в Notepad, дримвивере, PHP эксперт эдишне и т.п., переходите на эту систему не пожалеете. Из минусов лично для меня там только один, русские кодировки она не поддерживает, т.е. коментарий или какую нибудь запись на русском не получится написать, будут кракозябры) По этому у меня установлен ещё и Notepad++, использую его например, когда надо быстро подправить пару строк кода, ну или когда в HTML код вкрадывается русский язык, описывать его думаю не стоит это классика)

Для работы с графикой использую Gimp 2.6.7 с расширением Save For Web, для него есть куча различных расширений, но у меня стоит только это, ибо мне достаточно и этого. С моей точки зрения это очень хорошая альтернатива фотошопу, с моей точки зрения его аналог на 80%, только есть неоспоримый плюс, это его бесплатность)

Ну и естественно у меня стоит великий и ужасный денвер с расширением mbstring. на денвер перешёл недавно, раньше у меня просто стоял Апач+PHP+MSQL, но у этой связки есть один минус по сравнению с денвером, нет автоматического создания хостов, поэтому собственно и использую денвер.

И забыл написать про самый главный инструмент - Mozilla Firefox + Firebug + Web Developer и ColorZilla, про первые два дополнения думаю все знают а вот ColorZilla заслуживает отдельной записи, тоже очень и очень полезная вещь.

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

Исходный шаблон для вёстки под Instant

Так как я занимаюсь вёрсткой, то соответственно у меня есть некоторые свои наработки, которые позволяют мне ускорять процесс разработки. Меня не особо радует процесс изменения дефолтного шаблона, я верстаю с нуля(почти)glasses, пользуюсь исходником специально сделанным для инстант, что бы заново не прописывать пути , создавать файлы и т.п. Скачать архив с ним можно здесь. Структура файлов и папок в нём почти такая же как и  дефолном шаблоне, добавлен файл reset.css который обеспечивает глобальный сброс стилей, что требуется для обеспечения кроссбраузерности. Описание структуры остальных папок и рекомендации по офорлению кода описаны в slicer_recommendations.txt, следование этим рекомендациям позволяет привести CSS код к определённой структуре, что облегчает дольнейшую поддержку и взаимодействие между верстальщиками.
Все что вам надо сделать, это распаковать архив в папку с шаблонами, переименовать и в файле template.php прописать корректные пути и начинать верстать свой новенький шаблон)

Шаблон Instantoo

AntonIO подбросил тут парочку шаблонов от джумлы, один сверстал, не портировал, а просто заново сверстал, там PSD исходник был. Вот его скриншот:

Посмотреть поближе , а так же скачать его можно на демо сайте, он здесь)
Изменению так же подвергся компонет регистрации(не понравилось то что он на таблицах свёрстан, сделал на списках) и профиль пользователя (теперь он выглядит так как хотел widik). Так же изменена структура некоторых модулей. Небольшой ридми по установке шаблона находится в архиве.
Забыл подметить, что шаблон резиновый, тянется от 1000px до 1400px , в интернет экспрорерах от 6 до 8 отображается корректно)

Описания файлов пользователей.

Доброго времени суток.

Выкладываю простое решение (в смысле без заморочек) задачи.
После внесения изменений Ваш профиль - Файлы пользователя смогут показывать описания для файлов.
Итак, скачиваем архив отсюда: http://sverdlovsk.net.ua/users/files/download.html?fileid=33 (files_with_description.zip) - это для версии 1.5.1
Заливаем в корень сайта файл .htaccess и папку components. В папке один файл больше ничего.
Выполняем запрос к базе данных (phpmyadmin в помощь).
И все.
Принцип дальнейшей работы.
На вкладке файлы появляется еще один значек - редактирование описания.
Щелкаем по нему - открывается форма для заполнения.
Заполняем описание и сохраняем.
Все просто.
Заморачиваться с md5 не стал, хотя и хотелось. Однако нету времени sad
Если кто подскажет, как по простому отсоединить тип файла от имени - с радостью доделаю.

Модернизируем баннеролисталку

Здравствуйте! Сегодня покажу как улучшить баннеролисталку!
Задача - возможность вставлять код от любых баннерообменников, а также кол-во дней показа баннера!

Итак начнем!

Открываем файл admin\components\banners\backend.php
После строк
Код PHP:
if ($opt == 'submit'){

			if (!empty($_REQUEST['title'])) { $title = $_REQUEST['title']; } else { error("Укажите название баннера!"); }
			$link = $_REQUEST['link'];

			$typeimg = $_REQUEST['typeimg'];
			$maxhits = $_REQUEST['maxhits'];
			$maxuser = 0;

			$published = $_REQUEST['published'];

			$position = $_REQUEST['position'];
Добавляем:
Код PHP:
$maxday =  date('Y-m-d H-i',mktime(23, 59, 59, date('m'), date('d')+$_REQUEST['maxday'], date('Y')));

			$html = $_REQUEST['html'];
Далее после:
Код PHP:
if ($opt == 'update'){
		if(isset($_REQUEST['item_id'])) {
			$id = $_REQUEST['item_id'];

			if (!empty($_REQUEST['title'])) { $title = $_REQUEST['title']; } else { error("Укажите название баннера!"); }
			$link = $_REQUEST['link'];

			$typeimg = $_REQUEST['typeimg'];
			$maxhits = $_REQUEST['maxhits'];
			$maxuser = 0;

			$published = $_REQUEST['published'];

			$position = $_REQUEST['position'];
Добавить:
Код PHP:
$maxday =  date('Y-m-d H-i',mktime(23, 59, 59, date('m'), date('d')+$_REQUEST['maxday'], date('Y')));

			$html = $_REQUEST['html'];
Потом примерно на 168 строке
Код PHP:
$sql = "UPDATE cms_banners
					SET position = '$position',
						title = '$title',
						published = '$published',
						maxhits = '$maxhits',
						maxuser = '$maxuser',
						typeimg = '$typeimg',
						link = '$link'
					WHERE id = '$id'";
Заменяем на
Код PHP:
$sql = "UPDATE cms_banners
					SET position = '$position',
						title = '$title',
						published = '$published',
						maxhits = '$maxhits',
						maxuser = '$maxuser',
						typeimg = '$typeimg',
						link = '$link',
						maxday = '$maxday',
						html = '$html'
					WHERE id = '$id'";
На строках 301-303 заменяем
Код PHP:
 <td><strong>Ссылка баннера: </strong><br />
						<span class="hinttext">Не забывайте "http://" для внешних ссылок!</span>					</td>
				    <td><input name="link" type="text" id="link" size="45" value="<?php echo @$mod['link'];?>"/></td>
			      
На следующее
Код PHP:
 <td><strong>Тип баннера: </strong></td>
				    <td><select name="typeimg" id="typeimg" onchange="chantype(this.value);">
                      <option value="image" <?php if(@$mod['typeimg']=='image') { echo 'selected'; } ?>>Изображение (gif, jpg)</option>
                      <option value="swf" <?php if(@$mod['typeimg']=='swf') { echo 'selected'; } ?>>Flash (swf) (468x60)</option>
                      <option value="html" <?php if(@$mod['typeimg']=='html') { echo 'selected'; } ?>>HTML текст</option>
                      <option value="code" <?php if(@$mod['typeimg']=='code') { echo 'selected'; } ?>>Баннер-код</option>
                    </select></td>

                    <script type="text/javascript">

					function chantype (type) {
						if (type=='image'||type=='swf')
						{
							htmlval = $('#html').val();
							$('#html').attr('disabled','disabled').val('');
							$('#link').attr('disabled','').val(linkval);
							$('#picture').attr('disabled','').val();
						} else {
							linkval = $('#link').val();
							$('#link').attr('disabled','disabled').val('');
							$('#picture').attr('disabled','disabled').val('');
							$('#html').attr('disabled','').val(htmlval);
						};
					}
                    </script>


			      
Строки 321-325
Код PHP:
 <td><strong>Тип баннера: </strong></td>
				    <td><select name="typeimg" id="typeimg">
                      <option value="image" <?php if(@$mod['typeimg']=='image') { echo 'selected'; } ?>>Изображение (gif, jpg)</option>
                      <option value="swf">Flash (swf) (468x60)</option>
                    </select></td>
Меняем на
Код PHP:
 <td><strong>Ссылка баннера: </strong><br />
						<span class=" <td><strong>hinttext">Не забывайте "http://" для внешних ссылок!</span>					</td>
				    <td><input name="link" type="text" id="link" size="45" value="<?php echo @$mod['link'];?>" <? if(@$mod['typeimg']=='html'||@$mod['typeimg']=='code') { echo 'disabled="disabled"'; } ?>/></td>
Потом ПЕРЕД следующим кодом
Код PHP:
 <td><strong>Максимум показов: </strong><br />
						<span class="hinttext">Установите "0" для бесконечного количества</span>					</td>
				    <td><input name="maxhits" type="text" id="maxhits" size="5" value="<?php echo @$mod['maxhits'];?>"/>  раз.</td>
Вставляем
Код PHP:
 <td><strong>HTML код: </strong><br />
						<span class="hinttext">Впишите свой код или код баннерной сети</span>					</td>
				    <td><textarea name="html" id="html" cols="30" rows="4" <?php if(@$mod['typeimg']=='html'||@$mod['typeimg']=='code') { echo ' '; } else { echo 'disabled="disabled"'; } ?>><?php echo @$mod['html'];?></textarea></td>
			      </tr>
				  <tr>
И после
Код PHP:
  <td><strong>Максимум показов: </strong><br />
						<span class="hinttext">Установите "0" для бесконечного количества</span>					</td>
				    <td><input name="maxhits" type="text" id="maxhits" size="5" value="<?php echo @$mod['maxhits'];?>"/>  раз.</td>
			      </tr>
				  <tr>
Вставить нужно
Код PHP:
<td><strong>Дней показов: </strong><br />
						<span class="hinttext">Установите "0" для бесконечного количества</span>					</td>
				    <td><input name="maxday" type="text" id="maxday" size="5" value="<?php
					@$days = abs(gregorianToJD(date('m',strtotime(@$mod['maxday'])), date('d',strtotime(@$mod['maxday'])), date( 'Y',strtotime(@$mod['maxday']))) - gregorianToJD(date('m'), date('d'), date( 'Y')));
					echo @$days;?>"/>  дней.</td>
			      </tr>
				  <tr>
Все с файлом admin\components\banners\backend.php покончено!

Идем далее...
Открываем файл - core/cms.php
Ищем функции public function getBanner($position) и public function getBannerById($id)
И полностю заменяем их на:
Код PHP:
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /**
     * Возвращает код баннера с минимальный количеством показов для указанной позиции
     * @param string $position
     * @return html
     */
    public function getBanner($position){
        $inDB = cmsDatabase::getInstance();
        $html = '';

        //get active banners with enough hits
        // Текущяя дата и время
		$nowdate = date('Y-m-d H-i');
        $sql = "SELECT *
                FROM cms_banners
                WHERE position = '$position' AND published = 1 AND ((maxday > '$nowdate') OR (maxday = '0000-00-00 00:00')) AND ((maxhits > hits) OR (maxhits = 0))
                ORDER BY hits ASC
                LIMIT 1";
        $rs = $inDB->query($sql);

        if (mysql_num_rows($rs)==1){
            $banner = mysql_fetch_assoc($rs);
            if ($banner['typeimg']=='image'){
                $html = '<a href="/gobanner'.$banner['id'].'" title="'.$banner['title'].'" target="_blank"><img src="/images/banners/'.$banner['fileurl'].'" border="0" alt="'.$banner['title'].'"/></a>';
            }
            if ($banner['typeimg']=='swf'){
                $html = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="468" height="60">'."\n".
                            '<param name="movie" value="/images/banners/'.$banner['fileurl'].'?banner_id='.$banner['id'].'" />'."\n".
                            '<param name="quality" value="high" />'."\n".
                            '<param name="FlashVars" value="banner_id='.$banner['id'].'" />'."\n".
                            '<embed src="/images/banners/'.$banner['fileurl'].'?banner_id='.$banner['id'].'" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="468" height="60">'."\n".
                            '</embed>'."\n".
                        '</object>';
            }
			if ($banner['typeimg']=='html'||$banner['typeimg']=='code'){
                $html = '<div id="bannerclick" onmouseover="banclk();" rel="'.$banner['id'].'">'.$banner['html'].'</div>';
            }
            if ($html) { $inDB->query("UPDATE cms_banners SET hits = hits + 1 WHERE id=".$banner['id']);	}
        }
        return $html;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /**
     * Возвращает код баннера по ID
     * @param int $id
     * @return html
     */
    public function getBannerById($id){
        $inDB = cmsDatabase::getInstance();
        $html = '';

        $sql = "SELECT *
                FROM cms_banners
                WHERE id = $id
                LIMIT 1";
        $rs = $inDB->query($sql);

        if (mysql_num_rows($rs)==1){
            $banner = mysql_fetch_assoc($rs);
            if ($banner['typeimg']=='image'){
                $html = '<a href="/gobanner'.$banner['id'].'" title="'.$banner['title'].'"><img src="/images/banners/'.$banner['fileurl'].'" border="0" alt="'.$banner['title'].'"/></a>';
            }
            if ($banner['typeimg']=='swf'){
                $html = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="468" height="60">'."\n".
                            '<param name="movie" value="/images/banners/'.$banner['fileurl'].'?banner_id='.$banner['id'].'" />'."\n".
                            '<param name="quality" value="high" />'."\n".
                            '<param name="FlashVars" value="banner_id='.$banner['id'].'" />'."\n".
                            '<embed src="/images/banners/'.$banner['fileurl'].'?banner_id='.$banner['id'].'" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="468" height="60">'."\n".
                            '</embed>'."\n".
                        '</object>';
            }
			if ($banner['typeimg']=='html'||$banner['typeimg']=='code'){
                $html = $banner['html'];
            }
        }
        return $html;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Далее в файле templates/ваш_шаблон/basic/js/basic.js добавим в конце следующее:
Код PHP:
oneclc = 0;
function banclk() {
	$('#bannerclick	> *').click( function() {
          if (oneclc==0)
          {
          var id = $('#bannerclick').attr('rel');

          $.get('/modules/banner/banner.php',{ id:id });
          };
          oneclc = 1;
          });
}
И обязательно делаем запрос к БД
Код PHP:
ALTER TABLE `cms_banners` ADD `maxday` DATETIME NOT NULL ,
ADD `html` TEXT NOT NULL ;
Вот и все у нас теперь модернизированная система баннерокрутилки!  smile
Вопросы установки пишите - отвечу! Кому пригодиться - ставьте плюсы!
Скрытый текст виден только зарегистрированным пользователям

Модуль для новостей.

Модуль для статей с пагинацией.

(Пагинация - от слова page(страница). Самому не нравится это слово, но подумал - во время обсуждения примелькалось и будет понятно о чем речь. Более правильно было бы назвать пост: "Модуль для вывода материалов с постраничной разбивкой")
Назвал "Новости".
Все управление модулем аналогично модулю "Последние материалы".
Сильно не тестировал - база пустая.
В архиве есть все необходимое для работы и настройки.
Порядок установки:
- скачиваем отсюда (http://sverdlovsk.net.ua/users/files/download.html?fileid=20)
- распаковываем локально или кто сможет непосредственно на сервере в корень сайта
- те кто распаковывал локально - копируем файлы в корень сайта
- в браузере открываем страницу http:/Ваш.сайт/install_news.php
- открываем админку
- переходим в Модули
- настраиваем параметры модуля "Новости"

ВНИМАНИЕ!!! Настраиваем ОБЕ закладки! После добавления модуль нигде не показывается, так что обязательно настройте где показывается, кому показывается, какие разделы и по сколько новостей.
- Сохраняем
- Смотрим

Да, еще, чуть не забыл smile
Для модуля сделал свои стили, поэтому, либо копируем содержимое файла /templates/_default_/css/news.css в файл /templates/_default_/css/styles.css, либо в template.php прописываем еще и /templates/_default_/css/news.css

Модуль для версии 1.5! В предыдущих версиях работать не будет однозначно.

P.S. Если у кого есть желание благодарим smile

P.P.S. 1.07.2009. Добавил вывод количества чтений материала. Обновленный архив доступен по прежней ссылке. Изменились файлы /templates/_default_/modules/mod_news.php и /modules/mod_news/module.php
В ходе работы выяснилась следующая закономерность. Оказывается при добавлении комментария пользователем счетчик чтений материала увеличивается на единичку.

Не откажусь и от материальных благодарностей smile
Данные в профиле.

Совершенствование модуля Статьи

Не знаю как вас, а меня напрягает отсутствие возможности отсортировать список статей в обратном порядке добавления в админке, т.е. чтобы последние статьи находились в начале списка (под руками). Бывает, создал статью, сохранил и тут вспомнил что-то еще подправить/добавить и начинается... Последнее время, правда, приноровился вводить текущую дату в фильтр, но этот способ страдает одним минусом - если я после того, как сохраню статью (или сразу, даже не трогая ничего) попытаюсь перейти в другой раздел админки, то получаю сообщение об ошибке (общий смысл, что нет такого значения фильтра или что-то в этом роде). Приходится возвращаться, нажимать "Все" и уже после этого переходить в нужный раздел админки.
Данное усовершенствование делает сортировку по умолчанию для статей "В обратном порядке добавления статей" (новые вверху). При этом совершенно все равно какими датами вы оформляли эти статьи.
Все что нужно сделать, так это:
1. Зайти на сайт
2. Перейти в папку /admin/applets/
3. Открыть на редактирование файл content.php
4. Найти строку cpListTable( - она там одна. У меня это номер 125. Она выглядит следующим образом:
Код PHP:
cpListTable('cms_content', $fields, $actions, 'is_arhive=0');
5. Превратить ее в строку:
Код PHP:
cpListTable('cms_content', $fields, $actions, 'is_arhive=0', 'id DESC');
6. Сохранить и закачать на сервер заменив старый файл.
Все, пользуйтесь.
Все описанное пригодится Вам, если у Вас стоит версия 1.2.