13:14

домовой
самка собаки. как же я ненавижу парадигму nocode и современный ооп битрикса.

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

в итоге выяснилось весьма странное.
Модулю почты России требовалось поле "адрес заказа", но вот настройки это самое поле не отображали.
Когда я уже смирился с тем что бить меня будут, и возможно даже ногами удалось найти статью о том как скрыть поле .

@темы: bitrix

домовой
Итак задача: есть  запрос который возвращает до 6000 позиций результата.  И необходимо  эти результаты отрисовать  стандартным компонентом catalog.section.
С сортировкой  разбиением на страницы и прочими мелкими радостями. 

Можно отдать все 6000 id через переменную фильтра, и catalog.section сделает все сам.  Но  после этого не стоит удивляться что сервер 30 секунд обрабатывает результат.

Можно  отдать  в  переменную фильтра  свего  N<99 id  элементов. Тогда скрипт должен взять на себя сортировку  и вывод  количества страниц
читать дальше

@темы: памятка, bitrix

09:48

домовой
запустил memcached   на  битрикс  сервере.
битрикс сразу же перестал жрать дисковое место гигабайтами.
Время отклика уменьшилось до 1 сек  максимум. (в среднем  0.5-0.7 сек)

И блин,  у меня один (философский | риторический) вопрос: по какой причине разработчики битрикс не смогли написать продукт так же без memcached?
грамотно  написанные  sql запросы  получают необходимые данные  за  те же  0.5-0.7  сек. на все необходимые запросы

@темы: bitrix

09:40

домовой
Мы в восхищении. Королева в восхищении.  
Битрикс и Аспро радуют дичью.

В процессе  переписывания  алгоритма поиска ( выбрать весь мусор содержащий слова, а потом постобработкой отобрать удовлетворяющее  условиям) задумался а как быть с xss  в "умном поиске" .
Для примера ввел название  товара  "<sсript>alert(xss)</sсript>" , сохранил. При открытии  детальной страницы  увидел алерт. Сильно удивился. Написал в аспро.
upd
При просмотре исходной страницы удивился еще больше.  14 из 16 упоминаний слова  sсript  корректно  обработаны. дичь только в js  имеющем буквы seo. И есть  подозрение что это скорее  ошибка  bitrix нежели aspro.

@темы: bitrix

15:14

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

3 часа изображал из себя барана перед новыми воротами, пока в голову не  постучалась банальная мысль: посмотреть что творится в бд. Через 5 минут стало понятно что узел подписок был прилеплен соплями с экскрементами, и почти  никак не  пересекается  с остальными таблицами.
И блин весь танец с бубном можно было заменить на три sql запроса

insert into b_subscription(USER_ID,ACTIVE,EMAIL,FORMAT,CONFIRM_CODE,CONFIRMED) values($user_id,'Y','$user_email','html',md5("$user_id $user_email "),'Y'))


insert  b_subscription_rubric values ($subscription_id ,1),($subscription_id ,2)
 где $subscription_id это результат выполнения  select last_insert_id()

@темы: bitrix

домовой
создание простого компонента  умеющего в  ajax

Этап первый: создаем компонент

1. перейти  в папку где лежит битрикс

cd  www/ 

2. создать папку  нового виджета

mkdir -p local/components/domov0y/my.super.component

3. перейти в  папку компонента 
cd  local/components/domov0y/my.super.component 

4. создать файл component.php содержащий  следующий код
<?php
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
//todo: тут будет логика  компонента

//здесь говорится о том что надо подключить  файл шаблона
$this->IncludeComponentTemplate();

?>

5. создать  каталоги  templates/.default и templates/.default/lang/ru/   

mkdir -p templates/.default/lang/ru/  

6.   создать файл шаблона компонента templates/.default/template.php  содержащий текст 
<?
IncludeTemplateLangFile(__FILE__)
//Так выводятся тексты лежащие  в языковом файле
echo getMessage('MY_MESSAGE');?>
//todo: тут код шаблона

?>
7.  создать  файл templates/.default/lang/ru/template.php  
<?
$MESS["MY_MESSAGE "] = "Это произвольный текст  который будет выведен на  экран   после  того  как  языковой файл будет подключен  через функцию IncludeTemplateLangFile(__FILE__) и вызван код echo getMessage('MY_MESSAGE');  ";

Собственно  на этом создание простого и бессмысленного  компонента завершено.
И его  даже  можно  запустить  написав на странице код 
<? $APPLICATION->IncludeComponent(
"domov0y:my.super.component ",
".default",
Array(),
false
);

 Этап второй: учим компонент  работать через ajax
условно простое, но не универсальное решение:  создать файл  ajax.php который будет содержать следующий код
<?
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
define("ajax",1);
include('component.php');
include('templates/.default/template.php');
?>
при этом надо исправить component.php 
 строка
 $this->IncludeComponentTemplate();
 
меняется  на  
 if (!defined("ajax" ))$this->IncludeComponentTemplate(); 

Ну а дальше  остается писать javasсript  позволяющий работать  с файлом 
local/components/domov0y/my.super.component/ajax.php
 c помощью ajax  запросов.
Никакой магии в этом нет. Используйте  стандартный  jquery и не вспоминайте  о том что  в фреймворке bitrix есть свой вариант  функций реализующих ajax

@темы: bitrix

15:47

домовой
на третий год чукча увидел как наименее варврскими методами сказать обнови кеш  по измененным элементам инфоблока.





if (CModule::IncludeModule('iblock')){CIBlock::clearIblockTagCache($iblock_id);}
 

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

Пока найдено интересное но не совсем понятное:




if (CModule::IncludeModule('iblock'))
{
$indexer=\Bitrix\Iblock\PropertyIndex\Manager::createIndexer($iblock_id);
    $result=$indexer->deleteElement($element_id);
    $result=$indexer->indexElement($element_id );
}





Если оно  реально  работает,  то  можно будет попытаться сотворить нехорошее вида 

1. записать список обновленных  элементов в  массив
2. со словами  " они украли нашу прелесть"  вызвать  метод  удалить  и обновить  индекс элемента  инфоблока






А еще  я понял каким матерным заклинанием надо было отбиваться от  битрикса. 
показать шаманство класса: заполнить базу и попытаться  сделать  бекап битрикса и восстановление  на  другом хосте.   30 раз.  (каждый день  по  одному разу) и составить график когда  операция завершиласьошибкой.



@темы: bitrix

09:59

домовой
Продолжаются мазохистские отношения с bitrix и шаблоном от аспро. 
Маленькие полезные находки помогающие понимать что откуда взялось
0. Самоочевидное. но от того не менее полезное. Показать что в какой последовательности подключалось.

<?
global $USER; 
if (defined("admin_debug") && $USER->IsAdmin()) 
{
 echo "<pre>"; 
 $tmp=get_included_files(); 
 foreach($tmp as $val)
 if ( strlen( $_REQUEST['search_file'] )>0 )
 {
  if ( !strpos( $val , $_REQUEST['search_file'] )===false ) echo "$val\n" ;
 }
else
{
 echo "$val\n" ; 
}
 echo "<pre>"; 
}
?>


1.  Показать какие глобальные переменные хочет компонент. Имеет смысл  подсовывать  туда где виджет имеет в аргументах  то что  описывается в мануалах "имя переменной где  будет лежать..."

global $USER;
if (defined("admin_debug") && $USER->IsAdmin())
foreach ($arParams as $val)
{
  if (!is_array($val))
   {   if ( isset( $GLOBALS[$val] ) )
    {
      echo  "<PRE>";
      echo  "$val\n";
      print_r($GLOBALS[$val] );
      echo  "</PRE>";
    }
  }
}
Подсунул  это  выражение  во все шаблоны  catalog.section. Узнал много нового про хентай  БДСМ  и  быдлокод призванный  тормозить  весьма шустрые  процессоры.

@темы: bitrix