Перейти к содержимому


Модификации IPB на заказ



JQ-админка

Написано WildRAID, 11 Май 2010 · 1 525 Просмотров
и 1 еще...
JQ-админка.

Добавление новой секции.
1. Придумать короткое имя секции на английском.
2. Добавить в config.php элемент массива $sections:

Например:
$sections['payment'] = array(
	'name'		=> 'Платежи',
	'items'		=> array(
		'distrib'=> 'Разнос платежей',
		'return'=> 'Возврат средств',
	),
);

Где payment - имя секции.
Секция появится в главном меню.

3. В /grids/ создать папку с именем секции. В нее положить классы гридов.
4. В /templates/ создать папку с именем секции. В нее положить шаблоны smarty.
5. (Не обязательно) В /libs/ создать контроллер и модель секции.

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

В новой схеме всё максимально автоматизируется и упрощается.

Контроллер
Чтобы обратиться к функции test секции payment, используем
?section=payment&act=test
Если контроллер секции отсутствует, либо соответствующая функция в нем не определена, то возможны два варианта.

  • Если у act есть префикс 'jq_' (например: 'jq_orders'), то подгружается класс грида с таким названием.
    • Если в запросе есть oper - вызывается соответствующее действие грида (вставка, редактирование и т.п.)
    • Если нет - происходит выгрузка данных в грид (JSON).
  • В ином случае напрямую вызывается tpl-шаблон с именем, аналогичным act. В примере выше произойдет вывод шаблона test.tpl из секции payment.
Если вам нужны дополнительные переменные в шаблоне - создавайте контроллер и определяйте свои функции.


JQ: Работа с гридами

Написано WildRAID, 11 Май 2010 · 2 159 Просмотров
и 1 еще...
Работа с гридами.
Основная документация по JS-части: http://www.trirand.c...wiki:jqgriddocs

Серверная часть представлена классами гридов и шаблонами.

Классы.
В /grids/ лежит базовый класс - jq_base. Он содержит реализацию многих стандартных функций "по умолчанию". От него наследуются классы отдельных гридов.

Необходимый минимум (на примере jq_payment):
<?php
class jq_return extends jq_base
{
	protected function init()
	{
		//определение имени главной таблицы
		$this->tblName = 'payment_tbl_return';

		//основной запрос на выборку
		$this->query = "
			SELECT {fields}
			FROM {$this->tblName} pr
				JOIN tbl_order o ON (pr.order_id=o.id)
				JOIN tbl_order_payment p ON (pr.order_id=p.order_id)
				JOIN lst_payment_types lp ON (lp.id=pr.payment_type)
			WHERE {where}
		";

		//колонки грида
		$this->cols = array(
			'id'			=>array('name' 	=> '№ пп',
									'db'	=> 'pr.id',
									'width'	=> 5,
									),
									
			'order_number'	=>array('name'	=> '№ заказа',
									'db'	=> 'o.order_number',
									'width'	=> 10,
									),
		);
	}
}

Этого достаточно. Грид уже умеет делать постраничный вывод, сортировать по любому из полей, осуществлять поиск. Также умеет делать INSERT, UPDATE и DELETE.

Функции

Если вам нужно особое поведение, то оно достигается перегрузкой соответствующих методов:
  • init() - Вызывается в конструкторе ПОСЛЕ получения массива $this->request, но ПЕРЕД любыми другими действиями.
  • parseRow($r) - Вызывается для каждого ряда таблицы. Принимает массив, возвращает его же. Пример -> добавление элемента '_class' => 'green' для покраски строки в зеленый цвет.
  • op_add($ins) - Добавление ряда (INSERT). Принимает массив значений для вставки.
  • op_edit($id, $upd) - Апдейт ряда (UPDATE). Принимает id и массив значений для обновления.
  • op_del($id) - Удаление ряда (DELETE). Принимает id или список id через запятую (multiselect) для удаления.
  • oper_data($data) - Возвращает массив значений. Вызывается ПЕРЕД op_add и op_edit. Нужно в тех случаях, когда в одном гриде используются обе эти функции, и в обоих должно быть одинаковое преобразование данных перед записью.

Для определения custom-операций следует создавать функции с префиксом 'op_' аналогично стандартным.
Например, oper=test. Функция будет op_test.

Custom-операции не имеют аргументов. Все данные в них следует получать из $this->request.

Колонки
Колонки грида определяются массивами $this->cols и $this->cols_default.

$this->cols_default содержит опции, которые применяются ко всем колонкам, для которых они явно не определены. Например:
$this->cols_default = array('align' => 'center', 'formatter' => 'integer');
- выровняет все колонки по центру и применит к ним formatter.

По структуре $this->cols:
Ключи массива - это идентификаторы колонок. Они используются везде - в colModel, в передаваемых данных, в запросах к БД (pt.id AS id). Необходимо избегать идентификаторов, совпадающих с техническими переменными jqGrid или админки: oper, nd, _search, section, act и т.д.
В будущем будет включена защита, которая будет выкидывать Notice в случае совпадения.

Значения соответствуют структуре colModel jqGrid'а. Со следующими особенностями:
  • Ключ 'name'
    Задает имя колонки. Русское. Для людей. По умолчанию - пустая строка.

  • Ключ 'db'
    Поле для подстановки в {fields} и {where}. Может быть выражением. Примеры:
    pt.id
      COALESCE(pt.id, 0)
      round(price) * discount
    По умолчанию аналогично идентификатору колонки, поэтому в простых запросах ключ db следует опускать.

  • Ключ 'manual'
    Указывает на то, что данные НЕ следует брать из БД, а они будут сформированы в parseRow вручную. Такая колонка не попадет в {fields}, по ней невозможен поиск и сортировка. Ключ 'db' в этом случае игнорируется.

  • Ключ 'unset'
    Действие противоположно manual. Колонка выбирается из БД, по ней возможен поиск и сортировка. Но она не попадает в colModel и не передается в составе результатов от сервера. Нужно для особых случаев -> в обычной жизни лучше прятать стандартным ключом 'hidden'.

  • Ключ 'id_flag'
    Явно указывает поле, которое будет считаться id ряда в jqGrid. По умолчанию первое поле становится id.

  • Ключ 'count_sum'
    Добавляет подсчет суммы по этой колонке. Это происходит в рамках count-запроса. Значения записываются в userdata. Пример работы с footerrow можно посмотреть в партнерке.

  • Определение JS-функций
    Если вам нужно добавить в colModel имя функции (например, dataInit при редактировании), следует добавить перед ним знак апострофа. Например:
    'sum'			=>array('name'	=> 'Оплата',
    									'db'	=> 'b.sum',
    									'width'	=> 10,
    									'editable' => true,
    									'editrules' => array('integer' => true, 'custom' => true, 'custom_func' => '`check_sum'),
    									),
    Хотя это и возможно, следует воздержаться от написания тел JS-функций в определении колонок, ограничившись лишь указанием их имен. Чтобы свалки не было.)
    Апостроф работает только только при создании colModel. Dont worry about your data.)

  • Другие особые ключи
    Если посмотрите в код, сможете обнаружить другие особые ключи: default, null, replace, search_op и т.д. В данный момент их не следует использовать. Пользуйтесь перегрузкой parseRow.



JQ: Рендеринг грида

Написано WildRAID, 11 Май 2010 · 1 712 Просмотров
и 1 еще...
Рендеринг грида
В шаблоне tpl грид создается следующим образом (на примере jq_return):

<script>
{$jq_loader->render('jq_return')}
{literal}
	autowidth: true,
	height: 430,
	rowNum: 50,
	caption: 'Возврат средств',
	scroll: 1,
	gridComplete: function(){
		gridHighlight('#jq_return');
	}
});
$grid.jqGrid('navGrid', pager,{add: false, edit: false, del: true, deltext:'Удалить', refresh:true, refreshtext: 'Обновить', search:false});

Объект $jq_loader - это "фабрика" гридов. Она всегда присутствует в темплейтах.
Метод render подгружает класс грида из текущей секции (?section=xxx) с именем, указанным в аргументе, и рендерит необходимый HTML-код и "верхушку" JS-объекта.

В нее входит:
  • colModel
  • colNames
  • pager
  • url
  • editurl
  • cellurl
Это то, что можно сгенерировать автоматически.

Также определяются переменные:

$grid - объект jQuery с последним созданным гридом. Специально для любителей копи-пасты.) Если гридов несколько, то эту переменную можно использовать на этапе инициализации кнопочек и тулбаров, но нельзя использовать в событиях. Если грид один - можно использовать везде.

$jq_return - переменная с именем, аналогичным id грида. Используется в тех случаях, когда гридов несколько.

Не надо писать селекторы по сто раз! Пользуйтесь переменными.

Несколько однотипных гридов
Если грид один и тот же должен повторяться несколько раз на одном экране, следует использовать второй необязательный аргумент функции render - $suffix.

Например:
{$jq_loader->render('jq_cats', 1)}
...
{$jq_loader->render('jq_cats', 2)}

Будет создано два грида - $jq_cats1 и $jq_cats2. Но они будут работать с единым классом jq_cats.


JQ: Автоматизация поиска и сортировки

Написано WildRAID, 11 Май 2010 · 1 595 Просмотров
и 1 еще...
Всего для выдачи результата необходимо минимум два запроса к БД:
  • Count-запрос. Здесь же считаются суммы для колонок, у которых 'sum' => true.
  • Основной запрос.
В основном SELECT-запросе ($this->query) используется два placeholder'а - {fields} и {where}.

Подробнее:
{fields} - собирается на основании $this->cols, ключа 'db'. В count-запросе подставляется 'count(*)'.
{where} - собирается на основании $this->cols и данных из $this->request. Если поиск не осуществлялся, то подставляет 'true'.

К основному запросу автоматом добавляются ORDER BY, LIMIT и OFFSET на основании входящих данных.

В данный момент поддерживается только автоматический поиск с прямой передачей параметров в запросе. Это filterToolbar, это простой formSearch, это прямая передача параметров через serializeGridData или setPostDataItem. Поддержка других типов поиска появится тогда, когда в этом возникнет надобность.

Указание операторов
При поиске по датам и числам поддерживается указание префиксов-операторов.

Например:
>16 (больше 16)
>=17 (больше-равно 17)
<>15.02.2010 (не равно 15.02.2010)

Прямо так и вводим в filterToolbar.
Оператор по умолчанию - '=' (равенство).

Строковые значения ищутся оператором ILIKE '%{val}%'

Поиск "по умолчанию"
Чтобы упростить жизнь, было сделано следующее.

Все переменные дополнительные переменные (кроме section и act), которые использовались в момент создания грида, будут добавлены к нему в URL. Следовательно, будут влиять на поиск. Пример можно посмотреть в "Статистике внешних сервисов". Там передается &cat=X.

Особый поиск
Для сложных случаев возможно опускать {where} и вручную формировать условия, либо использовать комбинацию из {where} и своих условий. Живой пример:

$transfer_id = isset($this->request['transfer_id']) ? intval($this->request['transfer_id']) : 0;

		$this->query = "
			SELECT {fields}
			FROM payment_bnd_order b
				JOIN payment_tbl_transfer pt ON (b.transfer_id=pt.id)
				JOIN tbl_order o ON (b.order_id=o.id)
				JOIN tbl_order_payment p ON (b.order_id=p.order_id AND pt.payment_type=p.payment_type)
				JOIN lst_payment_types lp ON (p.payment_type=lp.id)
				
				LEFT JOIN (
					SELECT order_id, sum(sum) as sum_prev
					FROM payment_bnd_order
					WHERE transfer_id != $transfer_id
					GROUP BY order_id
				) s ON (b.order_id = s.order_id)
			WHERE b.transfer_id=$transfer_id AND {where}
		";

Работа с диапазонами дат
См. refstat/jq_refstat.php


Дополнительные аватары

Написано WildRAID, 11 Январь 2010 · 5 546 Просмотров
и 1 еще...
Есть время -> постим моды.

Модификация "Дополнительные аватары"
Совместимость: IP. Board 2.3.x
Готовность: 100%

Модификация даёт пользователям возможность загружать дополнительные аватары и выбирать их создании сообщений. Как в ЖЖ и т.п. сервисах.

Подробности
  • Для работы с аватарами добавлен новый пункт меню в "Личных данных".
  • Аватары помечаются "ключевыми словами".
  • Выбрать аватар можно как при полной, так и при быстрой форме ответа (выпадающий список).
  • В полном ответе предусмотрено два вида инструмента для выбора аватары - полный и сокращённый. В первом можно увидеть весь список загруженных аватаров + крупную картинку с выбранным аватаром. Второй включает в себя только иконки нескольких первых аватаров и занимает мало места на экране.
  • Сохранение идёт по ключевому слову. Т.е. вы можете сделать аватар "весёлый", написать несколько постов с его использованием, затем удалить. А когда вы загрузите другой аватар с ключевым словом "весёлый" (или отредактируете старый), то он автоматически заменит старый во всех постах, где это требуется.
  • Пользователи, которых раздражает тот факт, что у одного юзера может быть больше одной аватары, могут отключить отображение дополнительных аватар в настройках форума. В этом случае у них всегда будут отображаться стандартные.

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

Дополнительные аватары хранятся в отдельной папке и не загромождают uploads.

Скриншоты
1). Загружаем аватарки
2). Сокращенный выбор аватары при постинге
3). Полный выбор аватары при постинге
4). Модификация в действии


Прием заказов приостановлен

Написано WildRAID, 20 Июль 2009 · 1 860 Просмотров
и 1 еще...
По всей видимости, работу нашёл. В связи с этим сворачиваю свою коммерческую деятельность в плане IP.Board. Как минимум - на ближайшие месяцы.

"Всем спасибо, все свободны!" (с)

...

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

Всем, кто заказывал у меня что-либо -> пожизненная гарантия на все работы сохраняется в полном объёме. Я никуда не пропадаю - моя ася всегда открыта для возможных баг-репортов.)

Всех люблю. Некоторых - особенно. Удачи, не скучайте тут. :wub:


FAQ по моим планам относительно IPB 3.0

Написано WildRAID, 03 Июль 2009 · 1 798 Просмотров
и 1 еще...
Q: Будешь ли писать моды для "тройки"?
А: Платные - пока нет.

Q: Планируешь перенос уже готовых модов на "тройку"?
A: Да, но не всех, и не сразу. Из открытых модов наверняка будут "Скрытый текст" и "Скрытие подписей". Остальное либо по мере появления свободного времени и желания, либо по индивидуальному заказу.

Q: Можешь мой форум на 2.3.х, на котором куча модов и индивидуальный дизайн, перенести на "тройку"? Много денег заплачу.
А: Нет. Во-первых, это неинтересно. Во-вторых, если вы уже вложили кучу сил, денег и времени в свой форум - и юзеров при этом всё устраивает - никакой переход на 3.0 вам НЕ НУЖЕН. Просто деньги на ветер выкинете.

Q: Не собираешься ли выложить парочку приватных модулей для 2.3 в связи с выходом 3.0?
А: Подумаю. На самом деле, я не жадный, но немного неудобно перед теми, кто за приватность платил.) В любом случае, если такое произойдет, начну с самых старых и наименее популярных. ^_^

Upd от 20.07.09


Удаление неактивных пользователей

Написано WildRAID, 08 Май 2009 · 2 109 Просмотров
и 1 еще...
В свободном доступе не нашлось адекватного модуля для автоматического удаления неактивных пользователей. Решили написать свой.

[Task] Удаление неактивных пользователей
Модуль имеет следующие настройки:
http://vvv-guild.ru/wr/del_mem.jpg

Из важного:
1. Кол-во сообщений, после набора которого пользователь НЕ будет удален независимо от периода неактивности.
2. Список групп, члены которых могут быть удалены.
3. После сколько месяцев неактивности удаляем пользователя.
4. После сколько месяцев неактивности посылаем уведомление о том, что "вы скоро будете удалены".
5. Посылать уведомление можно как на почту, так и в ПМ.
6. Если за один раз удалено больше, чем X пользователей, посылаем отчет администраторам в ПМ.

Формат отчета:
[Ник] – [Мыло] – [Дата регистрации] – [Количество сообщений]

При удалении пользователей вызывается также ipb_member_sync.


База данных для пользователей форума

Написано WildRAID, 02 Май 2009 · 4 066 Просмотров
и 1 еще...
Модификация: База данных пользователей
Для IP. Board 2.3

По сути - это обыкновенные "анкеты". Модификация позволяет пользователям оставлять те или иные данные путём заполнения полей формы; позволяет смотреть данные других пользователей и осуществлять по ним поиск.

Скриншоты с пояснениями. (кликабельно!)
1). Основной экран

На основном экране мы видим:
  • Объявление (сверху), которое задается администратором, и которое может отличаться в зависимости от группы и прав пользователя;
  • Меню с основными действиями;
  • Список пользователей, которые в данный момент пользуются базой;
  • Форма поиска (говорит сама за себя);
  • Дерево поиска.
Дерево создаётся автоматически на основании тех записей, которые имеются в базе данных. Вручную создавать категории не надо. Для построения дерева используется библиотека jquery-treeview.

2). Соглашение перед созданием новой записи
При создании пользователем новой записи ему традиционно предлагается ознакомиться с лицензионным соглашением. Текст, разумеется, настраивается.

3). Форма для внесения данных
Форма полностью настраивается администратором БЕЗ необходимости прямого редактирования шаблонов. Просто редактируем файл конфигурации по инструкции.

Сделано аналогично моим модификациям "Релиз-мастер", "Ролевые карточки", "Один форум на нескольких доменах".

Есть возможность загружать фотографии.

После создания новой записи она должна быть одобрена администратором.

4). Просмотр записи
Смотрим записи. Свои или чужие.

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

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

5). Выдача результатов поиска
Выдается уменьшенная фотография (если есть), а также основная информация. При клике на фото или на ФИО переходим непосредственно к просмотру интересующей нас записи. В правой части есть ссылка на форумный аккаунт и возможность быстро отправить ПМ.

Те записи, которые либо еще не одобрены, либо скрыты, выделяются другим цветом и особой надписью. Разумеется, такие записи видят только администраторы.

6). Логи действий пользователей
Все действия пользователей в базе данных записываются. Предусмотрены фильтры по типу логов, а также по пользователям, которые либо инициировали действие, либо это действие их затронуло.

Старые логи могут автоматически удаляться по прошествии N дней. Также их можно очистить все сразу, либо по ID только логи конкретного пользователя.

7). Настройки в админке
Говорит само за себя.

Прочее
  • Большой шрифт везде - пожелание заказчика.
  • Пользователи могут удалять\скрывать свои записи.
  • Администраторы видят кол-во неодобренных\скрытых записей и могут быстро их найти.
  • У одного пользователя может быть только одна запись. Привязка жестка - ID пользователя соответствует ID записи.
  • Ссылка на запись в базе (если она есть) выводится в профиль и в топики.



FAQ по сотрудничеству со мной v2

Написано WildRAID, 10 Апрель 2009 · 2 796 Просмотров
и 1 еще...
I. Общие слова.

Я занимаюсь следующими вопросами:
  • Создание новых модификаций для IP.Board 2.x с нуля.
  • Доработка существующих модификаций с целью адаптации к нуждам вашего проекта.
  • Простая установка форума, модификаций, стилей.
<<----------------------------------------->>

Важный момент: я стараюсь создавать решения, а не просто программный код. И основная работа при этом заключается в том, чтобы понять и пропустить через себя нужды каждого конкретного заказчика. Прежде всего, это означает общение.. много общения. С целью достижения полного понимания технического задания (ТЗ) обеими сторонами. С целью подумать над возможностями лучше реализовать вашу идею. И т.д.

Ситуация, при которой всё без вопросов делается в точности по первоначальному ТЗ (которое обычно не учитывает множество мелких, но важных ньюансов), невозможна. До тех пор, пока не будет полного понимания, ни одной строчки кода не будет написано.

Индивидуальное решение для вашего конкретного случая. А не просто огрызок кода. Точка.

<<----------------------------------------->>

Я НЕ занимаюсь следующими вопросами:
  • Всё, что не связано с IP.Board, за исключением интеграции. Сайтов не создаю, модулей для Drupal и Joomla не пишу.
  • Создание и редактирование изображений, иконок и прочей графики. Включая "красивые кнопочки" для своих модификаций. Это работа для дизайнера.
  • Создание стилей для IP.Board с нуля, крупные изменения в существующих стилях.
<<----------------------------------------->>

Какие цели мной преследуются:

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

Именно в такой последовательности.

<<===================================>>

II. FAQ по сотрудничеству со мной.

Q: Хочу модификацию! С чего мне начать?
A: Первым делом необходимо связаться со мной при помощи ЛИЧНОГО СООБЩЕНИЯ. В нём следует в общих чертах описать вашу идею и обязательно указать ссылку на ваш проект. Если модификаций хочется несколько -желательно их разбить на отдельные письма.

Далее возможны следующие варианты:
  • Мне интересно! В ответе я попрошу написать подробное "техническое задание" (далее ТЗ), задам первые наводящие вопросы, дам номер ICQ для оперативной связи, укажу приблизительную стоимость и сроки работ.
  • Мне неинтересно. Такое нередко случается. Не расстраивайтесь, а попробуйте обратиться за помощью к сотрудникам IBResource или другим специалистам.
  • Такая модификация уже есть и выложена в открытом доступе. На самом деле, придумать что-то совершенно новое, и, в то же время, действительно полезное, - непросто. Многие вещи уже созданы другими людьми. В этом случае могу дать конкретную ссылку, либо ограничиться фразой "поищите на Invisionize.com\Ipbskins.ru\и т.п.", если занят.

Q: Обязательно ли писать ТЗ? Может, просто по-очереди обсудим все вопросы по аське?
A: Обязательно. Модификация пишется по на основании ТЗ, её стоимость и сроки работ расчитываются на основании ТЗ, обсуждение ньюансов и мелочей происходит только на основании ТЗ. Вся информация должна быть собрана в одном месте, в одном документе.

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

Q: Как должно выглядеть ТЗ?
A: Форма исполнения любая, в завивимости от контекста работ. Обычно это текстовый файл с максимально подробным описанием интерфейса и механизмов работы модификации. ТЗ никогда не бывает слишком подробным! Не стесняйтесь, пишите всё, что приходит вам в голову. Рисуйте картинки с интрфейсом (хоть от руки, хоть в Фотошопе). Давайте ссылки на похожие работы для других движков, если таковые есть.

Словом, почувствуйте себя Дарьей Донцовой. От того, насколько полно и чётко вы изложите свою идею, полностью зависит конечный результат. Можно очень многое сделать именно так, как вам бы того хотелось. Не оставляйте "мелочи" на усмотрение модификатора. Пишите смело.)

Q: Как узнать точные сроки и стоимость работы?
A: После утверждения конечного варианта ТЗ и достижения полного понимания того, что именно необходимо сделать. До этого момента все числа примерные. Как только такой момент настал, я называю точные финальные числа. Меняться в сторону увеличения они не будут.

Q: Платим до, после, или же по частям?
A: Оплата производится после того, как работа будет завершена, и заказчик останется ею доволен. Предоплат не беру.

Важный момент: если вы не являетесь клиентом IBR, но хотите заказать работу на сумму более, чем 1.500WMR, вам будет отказано. Таким образом я сокращаю возможные риски. Серьёзные люди покупают лицензию...

Q: Как платить?
A: WebMoney или Яндекс-деньги. Подробности в отдельной записи "Платежные данные".

Q: Как я смогу контролировать процесс разработки?
A: Создается отдельный демонстрационный форум на моем хостинге. На важных этапах, либо по вашему требования, на него закачиваются актуальные рабочие файлы. При этом работоспособность модификации, а также её соответсвие ТЗ, вы можете проверить самостоятельно.

Q: Что делать, если мне не понравилось то, что получается?
A: Если работа буквально соответсвует утвержденному ТЗ, то претензии, увы, не принимаются. Пишите грамотное задание. :)

Q: Будет ли осуществляться техническая поддержка купленных модификаций? Нужно ли за неё платить дополнительно?
A: Будет. Если обнаружен баг, он устраняется бесплатно и, сколь возможно, оперативно. Если необходимы дополнительные изменения\улучшения функциональности - то всё то же самое, что и для новых модификаций. ТЗ, за деньги, в порядке общей очереди.

Q: Неприятный вопрос. Что, если я закажу модификацию, а после того, как она будет готова, попробую сбить цену?
A: Такие случаи, увы, бывали. Ответ один, и он распространяется на все подобные ситуации. Готовую модификацию в этом случае я не отдаю, и все наши контакты полностью прекращаются. Программирование в качестве основого источника заработка я не рассматриваю, так что шансов, как говорится, взять меня "на понт" - нет.

<<===================================>>

III. Модификации "Вне архива".

Q: Что это такое?
A: Это модификации, основная идея которых, на мой взгляд, может быть интересна не только одному проекту. Но, при этом, они достаточно специфические, и требуют существенной адаптации и доработки для каждого конкретного случая. Выкладывать их "как есть" не имеет смысла.

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

<<===================================>>

IV. Моё отношение к копирайтам.

Q: Добавляешь ли ты копирайты к своим работам?
A: В той части, с которой работают конечные пользователи - нет. Мне бы не хотелось приобретать широкую известность среди всего IPB-сообщества в целом. Но копирайты присутствуют в самом коде. Также возможен префикс 'wr_' к имени создаваемых компонентов. Например, 'wr_groups'.

Q: Могу ли я выдавать твою работу за свою, редактировать её и выкладывать под своим именем?
A: Да, конечно. Можно даже распечатать код на принтере и обклеить стены в туалете. Мне всё равно, никаких холиваров не будет. Словом, feel free to use.






Платежные данные

WebMoney
WMID: 419791831147

Кошельки:
Z182436077740
R286211355217

Яндекс-деньги
41001326492876