Bitrix: как сделать пейджер, если выбрал данные через $db->query

Для начала вам нужно сделать запрос с cnt, что бы знать сколько всего записей, дальше вы делаете запрос с лимитом (выводите нужную страницу), а дальше простая магия:

$cnt = new CDBResult;
$cnt->InitFromArray(range(1,$allItemsCnt));
$cnt->NavStart($itemsPerPage, false, (isset($_GET["PAGEN_1"]) ? $_GET["PAGEN_1"] : false));
$arResult["Nav"] = $cnt->GetPageNavStringEx($navComponentObject);
$arResult["NavExt"] = $navComponentObject->arResult;

Почему слетает цена, которая изменена через handler OnBeforeBasketAdd

В битриксе, при обработке корзины, у каждого товара есть своя callback функция (по умолчанию это CatalogBasketCallback).
В фунции CatalogBasketCallback для определения цены, вызывается функция GetOptimalPrice, которая выбирает самую мелкую цену товара. Иногда это нужно, но иногда нет. Что же делать? Нужно прописать в функции OnBeforeBasketAdd:

$arFields["CALLBACK_FUNC"] = "";

Или вызов своей функции, например MyBasketCallback, которая будет проверять скидки, цены, количество товара. И наступит счастье!

Отправить файл на скачивание

Что бы отправить файл на скачивание, нужно создать промежуточный файл, который будет выдавать заголовок «Атача». Джаваскрипт этого сделать не может тоже. Что же делать?

У битрикса есть такой стандартный файл, можно все делать через него, ссылку можно сделать так
"/bitrix/admin/fileman_file_download.php?path=".urlencode($filepath)
правда нужно быть залогиненым и с правами на файлманагер, потому мы сделаем свой файл по мотивам fileman_file_download.php.
назовем его getfile.php и положим в корень
<?
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("fileman");

$strWarning = "";
$site = CFileMan::__CheckSite($site);
$DOC_ROOT = CSite::GetSiteDocRoot($site);

$io = CBXVirtualIo::GetInstance();
$path = $io->CombinePath("/", $path);

if (preg_match("/bitrix/i",$path))
	die("its wrong");

$arPath = Array($site, $path);
$arParsedPath = CFileMan::ParsePath(Array($site, htmlspecialcharsex($path)));
$abs_path = $DOC_ROOT.$path;

if(!$io->FileExists($abs_path))
	$strWarning = GetMessage("FILEMAN_FILENOT_FOUND")." ";

if(strlen($strWarning) <= 0)
{
	$flTmp = $io->GetFile($abs_path);
	$fsize = $flTmp->GetFileSize();
	header("Content-Type: application/force-download; name=\"".$io->GetPhysicalName($arParsedPath["LAST"])."\"");
	header("Content-Transfer-Encoding: binary");
	header("Content-Length: ".$fsize);
	header("Content-Disposition: attachment; filename=\"".$io->GetPhysicalName($arParsedPath["LAST"])."\"");
	header("Expires: 0");
	header("Cache-Control: no-cache, must-revalidate");
	header("Pragma: no-cache");
	$flTmp->ReadFile();
	die();
}

$APPLICATION->SetTitle(GetMessage("FILEMAN_FILEDOWNLOAD")." \"".$arParsedPath["LAST"]."\"");
?>
<font class="text"><?=$arParsedPath["HTML"]?></font>

<?
ShowError($strWarning);
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php"); 
?>


Теперь можно сделать скриптовую заглушку и даже ссылки не менять
<script type="text/javascript">
	$("a[href$=.pdf]").click(function(){
		var url = $(this).attr("href");
		window.open("/getfile.php?path="+encodeURIComponent(url));
		return false;
	});
</script>
Код выше, все файлы pdf отправляет на диалог для скачивания :)

Множественное добавление в корзину bitrix

В битриксе его нет, лол ок.

Можно сделать через массив айди и кодовую фразу с редиректом в корень.
Что бы не лезть в компоненту, запишем все в афтер_коннект.пхп
if (@$_GET["action"] == "ADD2BASKET" && is_array(@$_GET["id"])) {
	if (CModule::IncludeModule("catalog")){
		foreach ($_GET["id"] as $id)
			Add2BasketByProductID($id,1);
	}
	header ("Location: ?");die();
}


По желанию в Add2BasketByProductID можно передать кастомные параметры

Получить файлы с базы одним запросом

$res = CFile::GetList(array("ID"=>"asc"), array("@ID" => implode(",",$collect_imgs)));

while($res_arr = $res->GetNext()) {
	$res_arr["SRC"] = "/upload/".$res_arr["SUBDIR"]."/".$res_arr["FILE_NAME"];
	$arResult["YOURIMAGES"][$res_arr["ID"]] = $res_arr;
}

Где $collect_imgs — массив айдишников картинок

Табличные шаблоны компонент в Битриксе

Как же я хуею, от этого убожества.
Столько лет на рынке, они все на месте, все убогие таблички, во всех компонентах БЛЯ.

Буду сюда выкладывать компоненты, в которых буду удалять таблицы, и их стили.
Со временем.

Везде форма логина/меню заблокированы

Вы перенесли сайт на новое место, а везде для анонимуса показывается форма логина, все меню заблокированы? Не беда! :)

Первым делом в настройках сайта убираете/прописываете наново путь к сайту на диске.
Не помогло, руки не стали расти выше? :)

Тогда вам нужно в корне сайта, создать/отредактировать файл .access.php! Да, все правильно, начинается на точку (стандартный фтп-манагер такие файлы может не видеть, так как в UNIX системах они называются скрытые — копните настройки)

А в файле должна появится строчка:
$PERM["/"]["*"]="R";

Не забываем, что это пыхапы файл ;)
<?
$PERM["/"]["*"]="R";
?>

Файл авторизации auth.php

<? define("NEED_AUTH", true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");

if (isset($_REQUEST["backurl"]) && strlen($_REQUEST["backurl"])>0) LocalRedirect($backurl);

$APPLICATION->SetTitle("Authorization"); ?>

<script type="text/javascript">
	location.href="/";
</script>
<p><a href="<?=SITE_DIR?>">Go to main page</a></p>

<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

Самый обычный .htaccess для битрикса

Options -Indexes 
ErrorDocument 404 /404.php

#php_flag allow_call_time_pass_reference 1
#php_flag session.use_trans_sid off

#php_value display_errors 1

php_value mbstring.func_overload 2
php_value mbstring.internal_encoding UTF-8

<IfModule mod_rewrite.c>
  Options +FollowSymLinks
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-l
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$
  RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]
</IfModule>

<IfModule mod_dir.c>
  DirectoryIndex index.php index.html
</IfModule>

<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresByType image/jpeg "access plus 3 day"
  ExpiresByType image/gif "access plus 3 day"
</IfModule>

Обычная 404 страница

<? # заголовки 404, что бы поисковики были умничками
CHTTP::SetStatus("404 Not Found"); // может убивать некоторые серваки
@define("ERROR_404","Y");

# для 404 картинок отдаём пустышку
$arrImage = array("jpg","bmp","jpeg","jpe","gif","png");
$arrPath = pathinfo($_SERVER["REQUEST_URI"]);
if (in_array($arrPath["extension"],$arrImage)) die();

# делаем редирект, если он есть в правилах
include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/urlrewrite.php');

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("404 - страница не найдена"); ?>

<? $APPLICATION->IncludeComponent("bitrix:main.map", ".default", array(
	"CACHE_TYPE" => "N",
	"CACHE_TIME" => "3600",
	"SET_TITLE" => "Y",
	"LEVEL" => "3",
	"COL_NUM" => "2",
	"SHOW_DESCRIPTION" => "Y"
	),
	false
);?>

<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php"); ?>