Вот такое вот наблюдаю уже пару месяцев на одном ресурсе.
<?
//12 - код свойства Дополнительные опции
//39 - код свойства контрольная строка
if (count($PROP["12"])){ //проверяем было ли заполнено данное свойство
$str="";//в эту будет формироваться текст для контрольной строки
$dop=$PROP["12"];
sort($dop);// сортирую массив (можно и не фильтровать, для меня это более эстэтичнее)
foreach ($dop as $key=>$value)
{$str.="_{$value}_";}//далее формируется строка выбранных ID элементов списка
// на выходе получим строку типа "_42_50_30" в зависимости от выбранных параметров
foreach ($PROP["39"] as $key=>$value) $PROP["39"][$key]=$str;
// заполняем свойство для чего сделал это через цикл не помню возможно будет //достаточно $PROP["39"][0]=$str;
}
else foreach ($PROP["39"] as $key=>$value) $PROP["39"][$key]="";//обнуляем если ранее было заполнено
?> |
. Для этого смодулируем флажки, также в коде модифицируем массив фильтра.<?
// код приблизителен выдерал из кучи кода необходимого для работы других свойств
foreach($arResult["ITEMS"] as $key=>$item)
{
foreach($arResult["arrProp"] as $kk=>$prop)
if (($prop["NAME"]==$item["NAME"]) && ($prop["MULTIPLE"]=="Y") ) // я думаю любой программист разберется для чего это нужно, для лучшего понимания вывидите $arResult
{ $chek="";
$ID=$kk;//ID в массиве сгенерированного битриксом мы его заменим на чекбоксы
foreach ($prop["VALUE_LIST"] as $k=>$value )//здесь $k id в списке $value название свойства
{
if (in_array($k,$_GET["filter_pf"][$prop["CODE"]])) $dop=" CHECKED "; else $dop="";// проверяем было ли выбранно данное свойство, т.е фильтр по данному свойству установлен
$chek.="<input $dop name=\"filter_pf[{$prop["CODE"]}][]\" value=\"$k\" type=\"checkbox\"/>".GetMessage($k)."<br>";}
}
$arResult["ITEMS"][$key]["INPUT"]= $chek;// устанвливаем новое свойство
}
}
if (count($GLOBALS["filter"]["PROPERTY"]["DOP"])) // проверяем был ли установлен фильтр
{
$dop=$GLOBALS["filter"]["PROPERTY"]["DOP"]; // сохраняем в переменной
unset($GLOBALS["filter"]["PROPERTY"]["DOP"]);// уничтожаем старые значения, для того что бы не мешали
$str="";//строка будет формировать условия
sort($dop);//опять же я сортирую массив
foreach($dop as $val){
if (strlen($str)) $str.="&(%_{$val}_%)"; else $str.="(%_{$val}_%)"; //формирую строку для сложного поиска
}
//в итоге получается строка приблизительно такая (%_42_%)&(%_43_%).....
$GLOBALS["filter"]["?PROPERTY_DOP_CONTROL"]=$str;// устанвливаем новое значение фильтра уже для поля Контрольной строки
}
//?PROPERTY_DOP_CONTROL - значит что будет сложное условие про это можно почитать в двух слова здесь проверяется вхождение в контрольную строку сразу 42 и 43, посколько значения обрамлены "_" лишних элементов не выбирется % - любое количестов символов () - для условия & - оператор И
?> |
/**
* Класс конфигуратора
*
* Класс предназначен для доступа к конфигурации проекта,
* хранящейся в формате INI
*/
class CSlConfig implements ArrayAccess
{
/**
* Ссылка на экземпляр класса
* @var object
*/
private static $_oInstance;
/**
* Путь к файлу конфигурации
* @var string
*/
private static $_sPathToConfig;
/**
* Конфигурация проекта
* @var array
*/
private $_aConfig = array();
/**
* Конструктор
*
* @throws INVALID_CONFIG_FILE
* @return CSlConfig
*/
private function __construct()
{
if( !empty( self::$_sPathToConfig ) && file_exists( self::$_sPathToConfig ) )
$this->_aConfig = parse_ini_file( self::$_sPathToConfig, true );
else
throw new Exception( 'INVALID_CONFIG_FILE' );
}
/**
* Получение экземпляра класса
*
* @return CSlConfig
*/
public static function GetInstance()
{
if( null === self::$_oInstance )
self::$_oInstance = new self();
return self::$_oInstance;
}
/**
* Инициализация конфигуратора
*
* @param string $sFileName Файл конфигурации
* @throws INVALID_CONFIG_FILE
* @return CSlConfig
*/
public static function SetUp( $sFileName )
{
if( empty( self::$_sPathToConfig ) )
self::$_sPathToConfig = $sFileName;
else
throw new Exception( 'CONFIG_FILE_CANT_BE_REDECLARED' );
}
/**
* Установка элемента массива
*
* @param integer $iOffset Смещение элемента
* @param mixed $mValue Значение элемента
* @throws CONFIG_CANT_BE_CHANGED
*/
public function OffsetSet( $iOffset, $mValue )
{
throw new Exception( 'CONFIG_CANT_BE_CHANGED' );
}
/**
* Проверка существования элемента массива
*
* @param integer $iOffset Смещение элемента
* @return bool
*/
public function OffsetExists( $iOffset )
{
return isset( $this->_aConfig[ $iOffset ] );
}
/**
* Удаление элемента массива
*
* @param integer $iOffset Смещение элемента
*/
public function OffsetUnset( $iOffset )
{
unset( $this->_aConfig[ $iOffset ] );
}
/**
* Получение элемента массива
*
* @param integer $iOffset Смещение элемента
* @return mixed
*/
public function OffsetGet( $iOffset )
{
return isset( $this->_aConfig[ $iOffset ] ) ?
$this->_aConfig[ $iOffset ] : null;
}
} // Конец класса CSlConfig
|
; This is a sample configuration file ; Comments start with ';', as in php.ini [first_section] one = 1 five = 5 animal = BIRD [second_section] path = "/usr/local/bin" URL = "http://www.example.com/~username" [third_section] phpversion[] = "5.0" phpversion[] = "5.1" phpversion[] = "5.2" phpversion[] = "5.3" |
// Подключение класса require_once( dirname( __FILE__ ) . '/config.php' ); // Настройка конфигуратора (это будет где-нибудь в php_interface/init.php) CSlConfig::SetUp( 'config.ini' ); // Работа с конфигом (это будет в любом месте нашего кода) $oConfig = CSlConfig::GetInstance(); var_dump( $oConfig['first_section'] ); var_dump( $oConfig['third_section']['phpversion'] ); |
CModule::AddAutoloadClasses( 'my_module', array( 'CClass1' => 'path/to/class1', 'CClass1' => 'path/to/class2', ... 'CClassN' => 'path/to/classN', ) ); |
CREATE TABLE a
(
data varchar(255)
) ENGINE=InnoDB;
BEGIN;
INSERT INTO `a` (`data`) VALUES ('a');
BEGIN;
ROLLBACK;
ROLLBACK;
SELECT * FROM `a`;
|
<?php
/**
* Пример использования транзакций
*
* Суть примера заключается в создании двух элементов одного инфоблока.
* В случае, если хотя бы один элемент не может быть создан, происходит
* откат всех изменений.
*/
// Подключение Битрикса
require( $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php' );
CModule::IncludeModule( 'iblock' );
// Настройки
define( 'MY_IBLOCK_ID', 1 );
// Инициализация переменных
$bSuccess = true;
$oIBlockElement = new CIBlockElement();
// Запуск транзакции
$DB->StartTransaction();
try
{
// Добавление первого элемента
$iElementId = $oIBlockElement->Add( array(
'IBLOCK_ID' => MY_IBLOCK_ID,
'NAME' => 'ONE',
) );
if( false === $iElementId )
throw new Exception( $oIBlockElement->LAST_ERROR );
// Добавление второго элемента
$iElementId = $oIBlockElement->Add( array(
'IBLOCK_ID' => MY_IBLOCK_ID,
'NAME' => 'TWO',
) );
if( false === $iElementId )
throw new Exception( $oIBlockElement->LAST_ERROR);
// Сохранение данных
$DB->Commit();
}
// Обработка ошибок
catch( Exception $ex )
{
// Откат изменений
$DB->Rollback();
// Сброс флага успеха
$bSuccess = false;
echo 'An error occurred: ' . $ex->getMessage();
}
|
<html> <head> <link rel="alternate" type="application/rss+xml" title="описание_Вашего_фида" href="http://путь_к_сайту/feed.ashx"> </head> </html> |
<%@ Reference VirtualPath="~/bitrix/components/bitrix/blog.post.list/component.ascx" %>
<%@ Control Language="C#" Inherits="Bitrix.Blog.Components.BlogPostListTemplate" EnableViewState="false" %>
<%@ Import Namespace="Bitrix.Blog" %>
<%@ Import Namespace="Bitrix.Blog.Components" %>
<%@ Import Namespace="System.Collections.Generic" %>
<% if (Component.FatalError != BlogPostListComponent.ErrorCode.None) { %>
<%= Component.GetErrorHtml(Component.FatalError) %>
<%
return;
}
else if (Component.Posts.Count < 1)
{
return;
}
%>
<div class="blog-list">
<div class="blog-list-pager">
<bx:IncludeComponent runat="server" ID="HeaderPager" ComponentName="bitrix:system.pager" Template="<%$ Parameters:PagingTemplate %>"/>
</div><br />
<%
BlogPostListComponent.PostInfo post = null;
int cutNum = 0;
Component.RenderHideCut += delegate(object sender, BXBlogCutTagEventArgs e)
{
cutNum++;
string title = !Bitrix.Services.Text.BXStringUtility.IsNullOrTrimEmpty(e.Option) ? e.Option.Trim() : "Подробнее...";
e.Writer.Write(String.Concat(@"<br /><a href=""", post.PostViewHref, "#cut", cutNum, @""">", Encode(title), "</a>"));
//вставляем метку, по которой будем замем обрезать html-содержимое
e.Writer.Write("=== cut ===");
};
for(int i = 0; i < Component.Posts.Count; i++)
{
cutNum = 0;
post = Component.Posts[i];
//если есть метка для обрезки, удаляем хвост
string htmlContent = post.GetContentHtml();
if (htmlContent.IndexOf("=== cut ===")>0)
htmlContent = htmlContent.Remove(htmlContent.IndexOf("=== cut ==="));
%>
<div class="blog-item">
<span class="blog-date-time"><%= post.Post.DatePublished.ToString("d") %></span>
<a href="<%= post.PostViewHref %>"><b><%= post.TitleHtml %></b></a><br />
<%= htmlContent %>
<br clear="all" />
</div>
<%
}
%>
<div class="blog-list-pager">
<bx:IncludeComponent runat="server" ID="FooterPager" ComponentName="bitrix:system.pager" Template="<%$ Parameters:PagingTemplate %>"/>
</div>
</div> |


| Проблема решена модификацией системного шаблона компонента bitrix:forum.topic.last, ссылка Цитата $arResult["FORUM"][$res["FORUM_ID"]]["list"] заменена на Цитата $arResult["FORUMS"][$res["FORUM_ID"]]["URL"]["LIST"] Постараемся также выпустить данное изменение в ближайшем обновлении модуля "Форумы". Приносим извинения за неудобства. |
CXN When Load QPS Slow QCacheHit KCacheHit BpsIn BpsOut local Now 0.00 286.87 0 68.14% 99.20% 279.27k 1.14M local Total 0.00 259.85 3 71.51% 99.08% 219.76k 1.44M CXN Cmd ID User Host DB Time Query local Query 132330 bitrix 192.168.0.1 bitrix 01:01:07 SELECT DISTINCT local Query 158219 bitrix 192.168.0.1 bitrix 12:37 SELECT DISTINCT |
mysql> select version(); +--------------------------+ | version() | +--------------------------+ | 5.0.32-Debian_7etch6-log | +--------------------------+ 1 row in set (0.00 sec) |
mysql> show full processlist; ... | 132330 | bitrix | 192.168.0.1:45057 | bitrix | Query | 3612 | statistics | SELECT DISTINCT BE.ID as ID,BE.NAME as NAME,BE.XML_ID as EXTERNAL_ID,BE.IBLOCK_ID as IBLOCK_ID,BE.IBLOCK_SECTION_ID as IBLOCK_SECTION_ID,B.DETAIL_PAGE_URL as DETAIL_PAGE_URL,BE.PREVIEW_PICTURE as PREVIEW_PICTURE, FPV1.VALUE as PROPERTY_MANUFACTURER_SRC_VALUE, FPV1.ID as PROPERTY_MANUFACTURER_SRC_VALUE_ID, FPEN2.VALUE as PROPERTY_STICKERS_VALUE, FPEN2.ID as PROPERTY_STICKERS_ENUM_ID, FPV2.ID as PROPERTY_STICKERS_VALUE_ID, FPV4.VALUE as PROPERTY_ARTICULS_VALUE, FPV4.ID as PROPERTY_ARTICULS_VALUE_ID, FPV5.VALUE as PROPERTY_RATE_VALUE, FPV5.ID as PROPERTY_RATE_VALUE_ID,L.DIR as LANG_DIR,BE.CODE as CODE,B.IBLOCK_TYPE_ID as IBLOCK_TYPE_ID,B.CODE as IBLOCK_CODE,B.XML_ID as IBLOCK_EXTERNAL_ID FROM b_iblock B INNER JOIN b_lang L ON B.LID=L.LID INNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID INNER JOIN b_iblock_section_element BSE ON BSE.IBLOCK_ELEMENT_ID = BE.ID INNER JOIN b_iblock_section BS ON BSE.IBLOCK_SECTION_ID = BS.ID LEFT JOIN b_iblock_property FP1 ON FP1.IBLOCK_ID=B.ID AND FP1.CODE='MANUFACTURER_SRC' LEFT JOIN b_iblock_element_property FPV1 ON FP1.ID=FPV1.IBLOCK_PROPERTY_ID AND FPV1.IBLOCK_ELEMENT_ID=BE.ID LEFT JOIN b_iblock_property FP2 ON FP2.IBLOCK_ID=B.ID AND FP2.CODE='STICKERS' LEFT JOIN b_iblock_element_property FPV2 ON FP2.ID=FPV2.IBLOCK_PROPERTY_ID AND FPV2.IBLOCK_ELEMENT_ID=BE.ID LEFT JOIN b_iblock_property_enum FPEN2 ON FP2.ID = FPEN2.PROPERTY_ID AND FPV2.VALUE_ENUM=FPEN2.ID LEFT JOIN b_iblock_property FP4 ON FP4.IBLOCK_ID=B.ID AND FP4.CODE='ARTICULS' LEFT JOIN b_iblock_element_property FPV4 ON FP4.ID=FPV4.IBLOCK_PROPERTY_ID AND FPV4.IBLOCK_ELEMENT_ID=BE.ID LEFT JOIN b_iblock_property FP5 ON FP5.IBLOCK_ID=B.ID AND FP5.CODE='RATE' LEFT JOIN b_iblock_element_property FPV5 ON FP5.ID=FPV5.IBLOCK_PROPERTY_ID AND FPV5.IBLOCK_ELEMENT_ID=BE.ID INNER JOIN b_iblock_property FP6 ON FP6.IBLOCK_ID=B.ID AND FP6.CODE='MANUFACTURER' INNER JOIN b_iblock_element_property FPV6 ON FP6.ID=FPV6.IBLOCK_PROPERTY_ID AND FPV6.IBLOCK_ELEMENT_ID=BE.ID INNER JOIN b_iblock_property FP7 ON FP7.IBLOCK_ID=B.ID AND FP7.CODE='BIG_PHOTO' INNER JOIN b_iblock_element_property FPV7 ON FP7.ID=FPV7.IBLOCK_PROPERTY_ID AND FPV7.IBLOCK_ELEMENT_ID=BE.ID INNER JOIN b_iblock_property_enum FPEN7 ON FP7.ID = FPEN7.PROPERTY_ID AND FPV7.VALUE_ENUM=FPEN7.ID INNER JOIN b_iblock_property FP9 ON FP9.IBLOCK_ID=B.ID AND FP9.CODE='BIG_PLANS' INNER JOIN b_iblock_element_property FPV9 ON FP9.ID=FPV9.IBLOCK_PROPERTY_ID AND FPV9.IBLOCK_ELEMENT_ID=BE.ID INNER JOIN b_iblock_property_enum FPEN9 ON FP9.ID = FPEN9.PROPERTY_ID AND FPV9.VALUE_ENUM=FPEN9.ID INNER JOIN b_iblock_property FP11 ON FP11.IBLOCK_ID=B.ID AND FP11.CODE='STABILIZATION' INNER JOIN b_iblock_element_property FPV11 ON FP11.ID=FPV11.IBLOCK_PROPERTY_ID AND FPV11.IBLOCK_ELEMENT_ID=BE.ID INNER JOIN b_iblock_property FP12 ON FP12.IBLOCK_ID=B.ID AND FP12.CODE='PHOTO_RESOLUTION' INNER JOIN b_iblock_element_property FPV12 ON FP12.ID=FPV12.IBLOCK_PROPERTY_ID AND FPV12.IBLOCK_ELEMENT_ID=BE.ID INNER JOIN b_iblock_property FP13 ON FP13.IBLOCK_ID=B.ID AND FP13.CODE='OPTICAL_ZOOM' INNER JOIN b_iblock_element_property FPV13 ON FP13.ID=FPV13.IBLOCK_PROPERTY_ID AND FPV13.IBLOCK_ELEMENT_ID=BE.ID WHERE 1=1 AND B.ID IN (0,21) AND ( (BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL) ) AND (((BE.ACTIVE_TO >= now() OR BE.ACTIVE_TO IS NULL) AND (BE.ACTIVE_FROM <= now() OR BE.ACTIVE_FROM IS NULL))) AND ((((BE.ACTIVE='Y')))) AND ((((FPV6.VALUE_NUM = '218232')) OR ((FPV6.VALUE_NUM = '218235')) OR ((FPV6.VALUE_NUM = '218237')) OR ((FPV6.VALUE_NUM = '218238')))) AND ((((FPEN7.VALUE LIKE 'ДА')))) AND ((((FPEN9.VALUE LIKE 'ДА')))) AND ((((FPV11.VALUE_ENUM = '1388')))) AND ((((FPV12.VALUE >= '8')))) AND ((((FPV13.VALUE >= '5')))) AND ((BS.ID = 1481)) |
mysql> show global variables like 'optimizer_search_depth'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | optimizer_search_depth | 62 | +------------------------+-------+ |
mysql> explain select... Query aborted by Ctrl+C Empty set (4.90 sec) |
mysql> set session optimizer_search_depth=30; Query aborted by Ctrl+C Empty set (7.92 sec) |
mysql> set session optimizer_search_depth=10; 28 rows in set (0.22 sec) |
mysql> set session optimizer_search_depth=0; 28 rows in set (0.03 sec) |
mysql> [B]set session[/B] optimizer_search_depth=...; |
можно попробовать изменить параметр для всей системы:mysql> [B]set global[/B] optimizer_search_depth=...; |
) есть классная феничка - рассылка по нагрузке..2009-06-07 697.34 2009-06-06 599.50 2009-06-05 603.14 2009-06-04 572.12 2009-06-03 541.19 2009-06-02 469.07 2009-06-01 377.94 2009-05-31 367.97 2009-05-30 506.00 2009-05-29 506.64 2009-05-28 420.02 2009-05-27 314.43 2009-05-26 357.23 2009-05-25 299.65 2009-05-24 430.56 2009-05-23 488.64 |
Дата измерения Статистическая нагрузка --------------------------------------- 2009-07-06 242.34 2009-07-05 291.52 2009-07-04 337.23 2009-07-03 300.98 2009-07-02 310.53 2009-07-01 284.79 2009-06-30 349.56 2009-06-29 371.96 2009-06-28 251.04 2009-06-27 297.95 2009-06-26 264.05 2009-06-25 269.38 |
).









