Рассмотрим создание инфоблока на примере скрипта «Вопрос-Ответ» с применением функции(метода) CIBlockElement::GetList
Заметка из цикла «Продолжаем знакомство с Битриксом». В ней вы найдете описание простого скрипта «Вопрос-Ответ» для реализации обратной связи с посетителями.
Инструкция по созданию инфоблока
(неофициальная, на примере найденного скрипта):
1. Создать тип инфоблока, например, «Вопрос-Ответ».
2. Создать инфоблок этого типа (запромнить его ID). После чего необходимо добавить пару свойств (на вкладке «Свойства»), а именно две строки с «Вопрос»,»Ответ» в поле «Название», тип в обоих случаях «HTML/тeкcт», сортировки 400 и 500, коды vopros и otvet.
3. Во вкладке «Разработка» выбрать Создать::Раздел. И создать раздел и индексный файл в нем.
4. Поместить в код страницы (через меню «Изменить::Страницу как PHP») следующий код:
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");// подключение хедера$APPLICATION->SetTitle("Вопрос - Ответ");// устанавливаем тайтл страницы
CModule::IncludeModule("iblock");if(isset($_POST['add_question']))// если в массиве POST есть 'add_question' обрабатываем и отправляем вопрос в БД{$errors=array();if(!$USER->IsAuthorized()){if(!$APPLICATION->CaptchaCheckCode($_POST["captcha_word"],$_POST["captcha_code"])){$errors[]='Введен неверный защитный код';}}if(!strlen(trim($_POST['name'])))$errors[]='Введите ваше имя';if(!strlen(trim($_POST['text'])))$errors[]='Введите сообщение';if(sizeof($errors)==0){$el=new CIBlockElement;$PROP=array();$PROP['vopros']['VALUE']['TYPE']='text';$PROP['vopros']['VALUE']['TEXT']=trim($_POST['text']);// записываем отправленный текст в поле инфоблока$arLoadProductArray=Array("MODIFIED_BY"=>$USER->GetID(),"IBLOCK_SECTION"=>false,"IBLOCK_ID"=>123,// ID созданного инфоблока"PROPERTY_VALUES"=>$PROP,"NAME"=>trim($_POST['name']),"ACTIVE"=>"N");if($el->Add($arLoadProductArray))echo'Вопрос отправлен';elseecho"Ошибка: ".$el->LAST_ERROR;}else{echo'<div class="error_msg">';foreach($errorsas$error)echo$error.'<br/>';echo'</div>';}}// выводим список вопросов и ответов$arSelect=Array("ID","NAME","PROPERTY_vopros","PROPERTY_otvet","TIMESTAMP_X");// задаем поля селекта$arFilter=Array("IBLOCK_ID"=>123,"ACTIVE"=>"Y");// указываем из какого инфоблока$arOrder=Array("ID"=>"DESC");// явно задаем сортировку$res= CIBlockElement::GetList($arOrder,$arFilter,false,Array("nPageSize"=>10),$arSelect);$res->NavStart(10);$count=$res->SelectedRowsCount();$i=0;while($ob=$res->GetNextElement()){$arFields=$ob->GetFields();?>
<table>
<tr>
<td><b><?phpechosubstr($arFields['TIMESTAMP_X'],0,10);?></b> <strong style="color: blue;"><?=$arFields['NAME']?></strong> <strong>вопрос:</strong></td>
</tr>
<tr>
<td><?=$arFields['PROPERTY_VOPROS_VALUE']['TEXT']?></td>
</tr>
<tr>
<td style="color: blue; font-weight: bold; padding-left: 20px;">ответ:</td>
</tr>
<tr>
<td style="padding-left: 20px;"><?=$arFields['~PROPERTY_OTVET_VALUE']['TEXT']?></td>
</tr>
</table>
<?$i++;if($i!=$count)echo'<hr />';}echo$res->NavPrint('Вопросы');// счетчик страниц с элементами инфоблока?>
<br/><br/>
<form action="<?=$_SERVER['REQUEST_URI']?>" method="post">
<table>
<tr>
<td>Ваше имя:</td>
<td><input type="text" name="name" width="200" /></td>
</tr>
<tr>
<td>Ваш вопрос:</td>
<td><textarea name="text" cols="40" rows="10"></textarea></td>
</tr>
<?if(!$USER->IsAuthorized()){include_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/captcha.php");$cpt=new CCaptcha();$captchaPass= COption::GetOptionString("main","captcha_password","");if(strlen($captchaPass)<=0){$captchaPass= randString(10);
COption::SetOptionString("main","captcha_password",$captchaPass);}$cpt->SetCodeCrypt($captchaPass);?>
<tr>
<td>Введите код с картинки:<input type="hidden" name="captcha_code" value="<?=htmlspecialchars($cpt->GetCodeCrypt());?>" /></td>
<td valign="top">
<input type="text" id="captcha_word" name="captcha_word" />
<img src="/bitrix/tools/captcha.php?captcha_code=<?=htmlspecialchars($cpt->GetCodeCrypt());?>" />
</td>
</tr>
<?}?>
<tr>
<td align="center" colspan="2"><input type="submit" value="Отправить" name="add_question" /></td>
</tr>
</table>
</form>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
Небольшие особенности скрипта:
1. Добавлена сортировка элементов инфоблока по убыванию значения поля ID (дефолтная Array(«SORT»=>«ASC») нелогична и похоже, что сортирует по ID по возрастанию). Исторически ID — поле автоинкрементное, поэтому в нормальных условиях элемент с максимальным ID и будет последним созданным.
2. Добавлен вывод даты смены статуса у записи в инфоблоке, так как sysdate задания вопроса мы вроде как нигде не фиксируем.
Примечание:
Любознательные безусловно заглянут в файл \bitrix\modules\iblock\classes\mysql\iblockelement.php (найдя его в ТС по подстроке «class CIBlockElement» с учетом регистра) для изучения класса CIBlockElement и его функции GetList.
Также нелишним будет заглянуть в официальную документацию http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblocksection/getlist.php.
Пользуясь случаем, немного рекламы: если вам необходимо создание сайта на 1С-Битрикс сходите по ссылке, рекомендую.
«SORT»=>«ASC» — сортировка по полю «sort» — сортировка. Это нужно для задания порядка элементов руками. Битрикс ставит значение сортировки 500, обычно.
«SORT»=>»ASC» – сортировка по полю «sort» – сортировка. Это нужно для задания порядка элементов руками. Битрикс ставит значение сортировки 500, обычно.
В 9 версии Битрикса предложенный код не работает, пустая страница:( Если убрать кусок с начальными проверками if(isset($_POST['add_question'])) то и форма и сделанные в админке вопросы выводится, но в инфоблок конечно ничего не записать.
Подскажите пожалуйста, как объявить все поля (text, textarea, select, multitext) элементов инфоблока обязательными для заполнения.
Инфоблоки работабт с компонентом «Техподдержка с мастером». В данном компоненте присутствует форма заявки для клиентов. Необходимо чтобы не заполнив все поля клиент не мог перейти на следующий шаг создания обращения.
спасибо, применила на своем сайте
Подскажите, пожалуйста, пошаговую инструкцию. Почему-то раздел у меня на сайте не отображается.
«SORT»=>«ASC» — сортировка по полю «sort» — сортировка. Это нужно для задания порядка элементов руками. Битрикс ставит значение сортировки 500, обычно.
«SORT»=>»ASC» – сортировка по полю «sort» – сортировка. Это нужно для задания порядка элементов руками. Битрикс ставит значение сортировки 500, обычно.
Да по умолчанию 500, все меняется потом руками
2axl: спасибо за инфу по «SORT»=>«ASC»
В 9 версии Битрикса предложенный код не работает, пустая страница:( Если убрать кусок с начальными проверками if(isset($_POST['add_question'])) то и форма и сделанные в админке вопросы выводится, но в инфоблок конечно ничего не записать.
спасибо большое) очень красиво и понятно)
1. создаются не активные элементы, а выводятся активные — так и задумано ?
2. пропущена закрывающая скобка if(!$USER->IsAuthorized()
дошло – ответы видимо пишутся в админке и там же ставится активность
прикольно – моя аватарка подтянулась через gravatar.com
вообще – большое спасибо за хороший пример !
для начинающих – то что нужно !
1. Уже точно не помню, но кажется да, ответы пишутся в админке, там же активируются.
2. Поправил.
Спасибо за добрые слова .
А можно ли как-то приделать e-mail уведомление и форму ответа не из админки?
Доброго времени суток.
Подскажите пожалуйста, как объявить все поля (text, textarea, select, multitext) элементов инфоблока обязательными для заполнения.
Инфоблоки работабт с компонентом «Техподдержка с мастером». В данном компоненте присутствует форма заявки для клиентов. Необходимо чтобы не заполнив все поля клиент не мог перейти на следующий шаг создания обращения.
Кто знает подскажите как это реализовать.
Спасибо
возможноли используя GetList, чтобы элементы выводились в компоненте news.list как минимум из 2х инфоблоков?
п.с. постраничной навигации нет так как это блог популярные, выводятся популярные новости и статьи.
Спасибо.
Было бы очень даже не плохо