3 Декабря 2013 22:12

Ошибка при редактировании компонентов 1С-Битрикс "Не удалось обнаружить код вызова компонента"

Все разработчики работающие с 1С-Битрикс когда-нибудь сталкивались с возникновением ошибки
Цитата
Не удалось обнаружить код вызова компонента
Вот как эта ошибка выглядит в версии 1С-Битрикс 14.0


Причины ее возникновения две:

Первая причина
Вы используете на сайте кодировку UTF-8 и у вас не настроены переменные
Код
.func_overload и
Код
mbstring.internal_encoding

При кодировке UTF-8 значения этих переменных должны быть
Код
func_overload=2 
Код
internal_encoding=utf-8

Узнать что появление ошибки "Не удалось обнаружить код вызова компонента" связано с этими настройками можно проверить зайдя в административный раздел сайта и выбрать "Настройки" - "Проверка сайта" - "Начать тестирование".



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



К сожалению с версии php 5.3 func_overload нельзя изменить в файле .htaccess. А вот internal_encoding - вполне возможно.

Вторая причина
Эта ошибка проявляется на древних версиях 1С-Битрикс.
Если вы перед вызовом компонента добавили свой код, то весьма появление ошибки "Не удалось обнаружить код вызова компонента" весьма вероятна.

Код
<?
$A=$A+1;
$APPLICATION->IncludeComponent(
   "bitrix:blog",
   "",
   Array(
      "THEME" => "red2",
      "GROUP_ID" => array(),
...
Попробуйте изменить код следующим образом

Код
<?
$A=$A+1; 
?>
<?$APPLICATION->IncludeComponent(
   "bitrix:blog",
   "",
   Array(
      "THEME" => "red2",
      "GROUP_ID" => array(),
...
Важно что бы код был окружен своими тегами php, тогда ошибка "Не удалось обнаружить код вызова компонента"появляться не будет.

Просмотров:21191 0   Комментариев:0

'bitrix:asd.share.buttons' is not a component

6 Апреля 2011 22:21

Как сделать ЧПУ

Цитата
Да будет ЧПУ сказал Генеральный и сайт заговорил по человечески


Уже не первый раз наш Генеральный директор настоятельно просит поставить ЧПУ на сайт (сайты в основном мы пишем под битрикс). Ну и против его слова не попрешь. Сидели, разбирались с регулярными выражениями, так как хелп представленный Bitrix описывает только этот вариант.

Но недавно, настраивая фильтры на одном из клиентских сайтов и воспользовавшись функцией $APPLICATION->GetCurDir(), в голову пришла мысля как все можно упростить. Как говорится лучше поздно, чем никогда.

Итак поехали. Начнем с одной из самых распространенных задач - новости на сайте.
Обычно они состоят из страницы списка новостей и детальной страницы.
По традиции размещаем их в директории news.
Код
/news/index.php
/news/detail.php


Кидаем туда соответствующие компоненты, настраиваем и вуаля - все работает. Список выводится, переход на новости тоже есть. Но ЧПУ пока нет.

Следующим шагом открываем файл в корне сайта urlrewrite.php и добавляем следующий код.
Код
   
array(
      "CONDITION"   =>   "#^/news/#",
      "RULE"   =>   "",
      "ID"   =>   "",
      "PATH"   =>   "/news/detail.php",
),


В итоге должно получиться следующее:
Код
<?
$arUrlRewrite = array(
   array(
      "CONDITION"   =>   "#^/news/#",
      "RULE"   =>   "",
      "ID"   =>   "",
      "PATH"   =>   "/news/detail.php",
   ),
)
?>


В двух словах как это работает.
Если пользователь обращается по адресу /news/текст, то прежде чем пользователь перейдет на страницу detail.php будет сделана проверка, нет ли такого файла в директории и если нет, пользователь будет перенаправлен на страницу /news/detail.php.

Таким образом, если пользователь зайдет по адресу http://site.ru/news/ - то он увидит список новостей. Тоже самое произойдет если он укажет адрес http://site.ru/news/index.php.

Пол дела сделали.

Теперь добавляем небольшой код в начало страницы detail.php. Напомню. Адрес страницы с ЧПУ выглядит следующим образом: http://site.ru/news/ЧПУ-код

Код
$arURL = explode("/", $APPLICATION->GetCurPage()); 
$url = $APPLICATION->GetCurDir()."detail.php?ELEMENT_CODE=".$arURL[2];
InitURLParam($url);


1 строчка кода разбирает URL на части. Нам интересна 2-я переменная. Вот распечатка массива
Код
[0] - ""
[1] - "news"
[2] - "ЧПУ-код"


Второй строчкой собираем новый URL.
Код
http://site.ru/news/detail.php?ELEMENT_CODE=ЧПУ-код


Ну и третьей строкой вызываем bitrix функцию которая инициализирует переменные и массивы $_GET, $HTTP_GET_VARS, $_REQUEST, $GLOBALS параметрами переданными в url.

Вот и все. ЧПУ работает. Ура.

В заключении приведу код ЧПУ
Код
<? // ЧПУ
if (!isset($_REQUEST["ID"])):
   $arURL = explode("/", $APPLICATION->GetCurPage()); 
   $url = $APPLICATION->GetCurDir()."detail.php?ELEMENT_CODE=".$arURL[2]; 
   InitURLParam($url);
else:
   if(CModule::IncludeModule("iblock")):
      $rsID = CIBlockElement::GetByID($_REQUEST["ID"]);
      if($arID = $rsID->GetNext()) LocalRedirect($arID["DETAIL_PAGE_URL"]);
   endif;   
endif;
?>


В нем есть особенность. Он умет перенаправлять со старых ссылок на новые. Очень полезная вещь для SEO.

Просмотров:5783 0  

'bitrix:asd.share.buttons' is not a component

18 Декабря 2010 15:25

Создание нескольких доменов на одной версии Bitrix

Поступила интересная просьба от клиента:
Цитата
Сделайте мне из раздела моего сайта, отдельный сайт, но при этом текущий и разрабатываемый сайт должны быть взаимосвязанными (т.е. пользователи должны иметь один логин на оба сайта, а так же общий счет для оформления заказов)


Решение:
Изначально эта задачка попахивала многословностью, есть у Bitrix такая возможность, но за многосайтовость надо отдельно платить, а тут вроде один и тот же сайт. Да и работать с такими версиями не очень приятно. Попробовать настроить apache? Натравить его с помощью правил на нужные директории и вуаля? Не прошло, видимо хостинг имел некоторые ограничения. А времени на решение задачи уже практически не осталось.

И тут набрел на блог написанный одним из сотрудников Bitrix, посвященный многосайтовости.

Итак приступаем к реализации. Для примера пусть будет 2 сайта site1.ru и site2.ru. Первый сайт - это наш рабочий сайт в котором есть папка folder на которую должен ссылаться второй сайт.

Шаг первый. Просим хостера или лезим в apache самостоятельно и говорим что для второго сайта домашняя директория есть не что иное как DOCUMENT_ROOT(SITE1) + folder.

Т.е. в apache у нас должно быть для первого и второго сайта
Код
<VirtualHost *:80>
        ServerName site1.ru
        ServerAlias *.site1.ru
        DocumentRoot /usr/home/site1.ru
        ErrorLog /var/log/httpd/site1_error.log
        CustomLog /var/log/httpd/site1.log custom
        DirectoryIndex index.php
</VirtualHost>

<VirtualHost *:80>
        ServerName site2.ru
        ServerAlias *.site2.ru
        DocumentRoot /usr/home/site1.ru/folder
        ErrorLog /var/log/httpd/site1_error.log
        CustomLog /var/log/httpd/site1.log custom
        DirectoryIndex index.php
</VirtualHost>


Что бы Битрикс работал и для второго сайта, то добавляем 2 символьных ссылки на ядро

Код
ln -s /home/www/site1/bitrix /home/www/site1/folder/
ln -s /home/www/site1/upload /home/www/site1/folder/


В итоге в директории folder появятся 2 символьных ссылки на папки битрикс.

Теперь заключительный шаг
Копируем из корня сайта в папку folder следующие файлы
Код
.htaccess
urlrewrite.php
.access.php
404.php


Если нужно для работы какие то другие файлы тоже копируем суда.
Вот и все. Закрываем, трясем, смотрим. :)

Просмотров:14476 0   Комментариев:0

'bitrix:asd.share.buttons' is not a component

19 Сентября 2010 10:51

Шлем почту с Битрикса через GMail

В Битриксе, начиная с версии 7.1.3, появилась возможность переопределить стандартный механизм отправки почты.

Когда может быть полезен такой финт ушами? К примеру, когда в конторе есть какой-то централизованный сервис отправки почты, который должны использовать все приложения (SMTP-сервер на другой машине, веб-служба, что угодно). Для примера, рассмотрим GMail в качестве такого сервиса.

Механика простая: везде, где должна вызываться функция mail(), вызывается bxmail(). А уже в этой функции, перед вызовом стандартной функции mail(), Битрикс проверяет, определена ли функция custom_mail() и, если да, вызывает её вместо mail(). Соответственно, чтобы переопределить механизм отправки, нужно всего лишь написать функцию custom_mail() (в /bitrix/php_interface/init.php, к примеру (если хотим, чтобы такой механизм отправки действовал для всех сайтов на данной копии)).

Заголовок функции:
Код
custom_mail($to, $subject, $message, $additional_headers, $additional_parameters);

Приступим к делу! Лично мне для отправки почты через GMail ближе всего Zend_Mail, но... Ни эта библиотека, ни другие не позволяют установить "сырые" заголовки для письма. А разбирать $additional_headers мне что-то не очень хочется. Следовательно, выбор перепадает на PEAR::Net_SMTP, как на механизм прямой работы с SMTP-сервером.

Итак, ближе к коду!

Код
require_once 'Net/SMTP.php'; 

/** 
* Отпраляем почту через SMTP-сервер GMail (пользователь: user@gmail.com). 
* 
* @see CEvent::HandleEvent() 
* @see bxmail() 
* 
* @param string $to Адрес получателя. 
* @param string $subject Тема. 
* @param string $message Текст сообщения. 
* @param string $additionalHeaders Дополнительные заголовки передаются Битриксом почти всегда ("FROM" передаётся здесь). 
* 
* @return bool 
*/ 
function custom_mail($to, $subject, $message, $additionalHeaders = '') 
{ 
   /* 
    * Настройки можно (нужно) вынести в админку, но это уже домашнее задание :) 
    */ 
   $smtpServerHost         = 'ssl://smtp.gmail.com'; 
   $smtpServerHostPort      = 465; 
   $smtpServerUser         = 'user@gmail.com'; 
   $smtpServerUserPassword   = 'password'; 

   if (!($smtp = new Net_SMTP($smtpServerHost, $smtpServerHostPort))) { 
      return false; 
   } 
   if (PEAR::isError($e = $smtp->connect())) { 
      return false; 
   } 
   if (PEAR::isError($e = $smtp->auth($smtpServerUser, $smtpServerUserPassword))) { 
      return false; 
   } 

   preg_match('/From: (.+)\n/i', $additionalHeaders, $matches); 
   list(, $from) = $matches; 

   $smtp->mailFrom($from); 
   $smtp->rcptTo($to); 

   /* 
    * Получаем идентификатор конца строки у Битрикса. 
    */ 
   $eol = CAllEvent::GetMailEOL(); 

   $additionalHeaders .= $eol . 'Subject: ' . $subject; 

   if (PEAR::isError($e = $smtp->data($additionalHeaders . "\r\n\r\n" . $message))) { 
      return false; 
   } 

   $smtp->disconnect(); 

   return true; 
}


Вынесение настроек в админку, создание статического объекта соединения (чтобы не тратить время при отправке множества писем за раз) — это всё задания на дом

Источник: http://dev.1c-bitrix.ru/community/webdev/group/18/blog/1073/

Просмотров:20955 0   Комментариев:0

'bitrix:asd.share.buttons' is not a component

IT-технологии
WEB сервера, настройка и конфигурирование, интересные решения
Программирование
WEB программирование, WEB дизайн, Кросс-браузерная верстка
Технические науки
Физика, Математика, Химия и все-то, что лежит в основе наших знаний