Выполняя задачу, связанную с обработкой свойств привязанных к разделам и умным фильтром, столкнулся с недостатком информации. Первым делом обратился к справке битрикса, не найдя там ответов на вопросы, пошел к поисковикам с запросом “CIBlockSectionPropertyLink”, обнаружил почти пустую выдачу. Дальше началось исследование с помощью “Живого описания АПИ”, изучения кода методов и экспериментов, результатами которого я и хочу поделиться в данном посте.
С помощью живого апи, в модуле инфоблоков были найдены следующие методы:
Названия методов и параметры говорят сами за себя, и в принципе на этом можно было бы и закончить. Но рассмотрим некоторые из них подробнее, хотя это и будет по большому счету кэпством.
Так как методы найдены в модуле инфоблоков, то перед их использованием, требуется его подключить: CModule::IncludeModule("iblock");
1. CIBlockSectionPropertyLink::Add($SECTION_ID, $PROPERTY_ID, $arLink = array()) Метод добавляет связь между разделом и свойством инфоблока.
Параметры: $SECTION_ID - идентификатор раздела, либо 0, если требуется привязать свойство ко всему инфоблоку. $PROPERTY_ID - идентификатор свойства. Требуются именно идентификаторы, символьные коды не подойдут.
$arLink - в данный момент может содержать 2 ключа, это IBLOCK_ID и SMART_FILTER. В свою очередь $arLink = array(‘SMART_FILTER’ => ‘Y’) - включить свойство в умный фильтр, если свойство в умный фильтр включать не требуется, можно просто не указывать SMART_FILTER, либо $arLink = array(‘SMART_FILTER’ => ‘N’).
2. CIBlockSectionPropertyLink::Delete($SECTION_ID, $PROPERTY_ID) Метод позволяет отвязать свойство от раздела или инфоблока.
$SECTION_ID - идентификатор раздела, либо 0, если требуется отвязать свойство от инфоблока. $PROPERTY_ID - идентификатор свойства.
Отвязать свойство от инфоблока, может потребоваться, если данное свойство не должно быть привязанным ко всем разделам инфоблока. Т.е. после или до привязки свойств к разделам с помощью CIBlockSectionPropertyLink::Add, требуется выполнить CIBlockSectionPropertyLink::Delete(0, $PROPERTY_ID), чтобы отвязать от инфоблока и не выводить их во всех разделах.
3. CIBlockSectionPropertyLink::DeleteByIBlock($IBLOCK_ID) Метод отвязывает все свойства от разделов в инфоблоке и выключает возможность привязывать их (свойство инфоблока “SECTION_PROPERTY” становится равным “N”).
$IBLOCK_ID - идентификатор инфоблока в котором требуется отвязать все свойства от разделов.
4. CIBlockSectionPropertyLink::DeleteByProperty($PROPERTY_ID) Метод отвязывает свойство с идентификатором $PROPERTY_ID от всех разделов.
5. CIBlockSectionPropertyLink::DeleteBySection($SECTION_ID) Метод отвязывает все свойства от раздела с идентификатором $SECTION_ID
6. CIBlockSectionPropertyLink::GetArray($IBLOCK_ID, $SECTION_ID = 0, $bNewSection = false) $IBLOCK_ID - идентификатор инфоблока, $SECTION_ID - идентификатор раздела, либо 0 - будут собраны свойства инфоблока, $bNewSection - не совсем понял или совсем не понял, на что влияет
Метод возвращает массив с параметрами свойств, выводимые в порядке увеличения сортировки:
Где PROPERTY_ID - идентификатор свойства, равен индексу первого уровня в данном массиве, SMART_FILTER - включено свойство в умный фильтр или нет, INHERITED- наследуется это свойство или привязано непосредственно к разделу INHERITED_FROM - откуда наследуется, если 0, то от инфоблока, если значение отличное от нуля - то это идентификатор раздела, от которого унаследовано свойство. SORT - сортировка.
Тонкости и примеры использования 1. В случае если свойства не привязываются к разделу (или в админке у разделов нет вкладки "Свойства элементов"), нужно установить у инфоблока "SECTION_PROPERTY" => "Y":
3. Скрипт для постепенного перевода сайта на умный фильтр: Например можно разместить в result_modifier.php у комплексного компонента catalog, и по мере посещения ваших каталогов, свойства будут включены в умный фильтр на основе текущих настроек компонента.
P.S. Если где-то что-то упустил, не так понял, допустил неточности или ошибки, пишите - внесу исправления. В листинге могут быть косяки, т.к. правил уже после вставки в блог, в попытке выровнять и т.д.
// Для того чтобы, добавить свойство в "Умный фильтр", необходимо чтобы у инфоблока поле "SECTION_PROPERTY" было установленно в "Y" if(CIBlock::GetArrayByID($IBLOCK_ID, "SECTION_PROPERTY") !== "Y") { $ib = new CIBlock; $ib->Update($IBLOCK_ID, array("SECTION_PROPERTY" => "Y")); }
Задача в общих чертах: создать раздел с конкурсом, разбитый по регионам, с возможностью добавления работ зарегистрированными участниками, голосованием раз в сутки за каждую работу и подсчетом рейтинга, защитой голосования от накруток, комментированием работ, автоматическим определением финалистов каждую неделю. Теперь по подробней
Механизм голосования: каждый пользователь, как зарегистрированный, так и анонимный, может проголосовать за каждую работу не более одного раза в сутки, поставив баллы от 1 до 5. Рейтинг рассчитывается суммированием баллов. Отключение голосования за работы финалистов.
куки были использованы, чтобы от честных пользователей лишний раз запрос не обрабатывать ни более того Про анализ реферала, это да, совсем вылетело что-то с головы, спасибо за замечание, учту
Эффективность bxsessid сомнительна, точнее при проверке реферала наверное избыточна.
Использование модуля опроса, возможна не для всех редакций.
Тут стоит отметить еще цели конкурса, в конкретном случае конкурс являлся инструментом привлечения пользователей на сайт, а не для объективного выбора победителей. Ценность призов, могла бы кого-то спровоцировать на анализ защиты и поиск методов обхода, но первые, самые ценные места, в итоге будет определять жюри.
Самое надежное наверное, или голосование для зарегистрированных пользователей, подтвердивших свою учетную запись кодом из смс с уникального номера сотового, либо голосование по смс через короткие номера. И конечно надежность конкурса, зависит от его бюджета Надеюсь, что когда нибудь доведется сделать более извращенно-защищенный
Остальное обходить намного проще, со списками бесплатных проксей, возможностью создания своего е-майл сервера, где будут генерироваться адреса и парситься потом ссылки из писем и т.д.
Эффективность bxsessid сомнительна, точнее при проверке реферала наверное избыточна.
реферер - это только чтобы удостовериться, что голос с сайта идентификатор сессии - это для того, чтобы ссылка работала реально только один раз. При этом никакие GET и POST переборы по истечении сессии уже не помогут. Возможно, что они друг друга и компенсируют. но в случаях когда несколько доменов, например, удобнее наверное сессии.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».