Телеграм: @bazarow_ru Почта: mihail@bazarow.ru
Внимание! Все сообщения на форуме проходят модерацию. Ваше сообщение появится после проверки.
RSS
Самодельная форма добавления элемента на API Битрикс
 
Самодельная форма добавления элемента на API Битрикс

Компонент iblock.element.add.form написан таким образом, что вы не сможете (не попотев изрядно и не используя js) как угодно переставлять поля ввода. Например сделать заполненеие текста анонса до ввода разделов. Или переставить чекбоксы свойств до ввода названия (хотя это глупо, но вы не сможжете сделать такую глупость даже если захотите)
 
Добрый день. Благодарю за действительно понятные уроки по битрикс.
у меня вопрос к вашему уроку
"Самодельная форма добавления элемента на API Битрикс"
Собственно сам вопрос: как сделать вывод не по ID  а по ЧПУ  
 
Цитата
Сергей Манник написал:
Добрый день. Благодарю за действительно понятные уроки по битрикс.
у меня вопрос к вашему уроку
"Самодельная форма добавления элемента на API Битрикс"
Собственно сам вопрос: как сделать вывод не по ID  а по ЧПУ
Просто добавьте в init.php обработчик события, что бы при добавлении элемента создавал ему символьный код

Типа того
Код
<?
AddEventHandler("iblock", "OnBeforeIBlockElementAdd", Array("MyClass40", "OnBeforeIBlockElementAddHandler"));
class MyClass40
{
    function OnBeforeIBlockElementAddHandler(&$arFields)
    {
        $name = $arFields["NAME"];
        $arParams = array("replace_space"=>"-","replace_other"=>"-");
        $trans = Cutil::translit($name,"ru",$arParams);
        $arFields["CODE"] = $trans;
    }
}
?>
 
[COLOR=#2067b0]а если точнее[/COLOR]
Цитата
Сергей Манник пишет:
Добрый день. Благодарю за действительно понятные уроки по битрикс.
у меня вопрос к вашему уроку
"Самодельная форма добавления элемента на API Битрикс"
Собственно сам вопрос: как сделать вывод не по ID а по ЧПУ
а если точнее то при создании не происходит генерация символьного кода а только ID
 
спасибо за оперативный ответ. все работает.
И вопрос не в тему:


Когда планируете дальнейшие видео по созданию инфопортала?
 
подскажите ответ еще вот на такой вопрос.
руководство захотело добавлять новости в подробное описание не через textarea а через визуальный редактор такой же как и комментарий к записи. если хотя бы в общих чертах опишите как это реализовать буду признателен.
 
Цитата
Сергей Манник написал:
подскажите ответ еще вот на такой вопрос.
руководство захотело добавлять новости в подробное описание не через textarea а через визуальный редактор такой же как и комментарий к записи. если хотя бы в общих чертах опишите как это реализовать буду признателен.
Просто берете любой визуальный редактор редактор и интегрируете его в этот вывод. Но зачем вообще новости так добавлять? Их проще через стандартную форму (компонент).  
 
Здравствуйте.
Как вывести свойства из раздела инфоблока? То есть в инфоблоке "объявления" разделы -  мото, экипировка. Для каждого раздела разные свойства. Как сделать чтоб при выборе раздела выводились свойства именно этого раздела? Спасибо
 
Цитата
Motocross Inua написал:
Здравствуйте.
Как вывести свойства из раздела инфоблока? То есть в инфоблоке "объявления" разделы -  мото, экипировка. Для каждого раздела разные свойства. Как сделать чтоб при выборе раздела выводились свойства именно этого раздела? Спасибо
Это достаточно сложно, просто так, в формате текстового описания не объяснить. Более того, боюсь что и в формате видео не объяснить.
 
Здравствуйте, Михаил!
1) Подскажите как организована обработка событий  формы стандартного компонента main.feedback?
2) какой путь будет более правильным: добавить нужную мне функциональность в стандартный обработчик или написать свой собственный обработчик так, как показано в этом уроке?
 
Добрый день.
Огромная благодарность за Ваши труды по ведению данного сайте, он очень сильно помогает начинающим работать с платформой Битрикс. Я не так давно стал заниматься созданием сайтов. И очень заинтересовался данной платформой. Ваши статьи очень в этом помогаю.
Но я пытался сделать форму по данной статье и у меня не очень получилось. Данные передаются, но выдает что "Что-то пошло не так". Если не сложно не могли бы мне помочь с данной проблемой.
 
У меня не получается вставить части кодов из необходимых файлов, и с позволения приложу на них ссылки со своего Гугл Диска. add_form_page.php и add_form_result.php
 
P.S.: Я разобрался, вывел ошибки и решил их. Извиняюсь, если Вас отвлек.
 
Цитата
Владислав Кузнецов написал:
P.S.: Я разобрался, вывел ошибки и решил их. Извиняюсь, если Вас отвлек.
Не успел ответить! Но это хорошо- когда задачки решаются самостоятельно :)
 
Цитата
Дмитрий Гайчук пишет:
Здравствуйте, Михаил!
1) Подскажите как организована обработка событий формы стандартного компонента main.feedback?
2) какой путь будет более правильным: добавить нужную мне функциональность в стандартный обработчик или написать свой собственный обработчик так, как показано в этом уроке?
Добрый день, Михаил. Конкретизирую вопрос. При кастомизиции компонента main.faadback скопировал шаблон с помощью команд меню ( не файловым менеджером), при этом файл component.php остался в папке с компонентами Битрикс. Таким образом, получилось, что форма находится в папке шаблона сайта, а обработчик событий формы остался в папке с компонентами Битрикс и пришлось изменять его там. Это нормальная ситуация или я что-то неправильно сделал?
 
Цитата
Дмитрий Гайчук написал:
Цитата
Дмитрий Гайчук  пишет:
Здравствуйте, Михаил!
1) Подскажите как организована обработка событий формы стандартного компонента main.feedback?
2) какой путь будет более правильным: добавить нужную мне функциональность в стандартный обработчик или написать свой собственный обработчик так, как показано в этом уроке?
Добрый день, Михаил. Конкретизирую вопрос. При кастомизиции компонента main.faadback скопировал шаблон с помощью команд меню ( не файловым менеджером), при этом файл component.php остался в папке с компонентами Битрикс. Таким образом, получилось, что форма находится в папке шаблона сайта, а обработчик событий формы остался в папке с компонентами Битрикс и пришлось изменять его там. Это нормальная ситуация или я что-то неправильно сделал?
Добрый. Нет не нормальная, нельзя менять компоненты в ядре. Если сильно надо- то нужно скопировать его в свое пространство имен и править там. По сути, просто сделать свой компонент- на основе штатного.
 
пробовал скопировать component.php в свое пространство имен, туда же где и весь компонент, но переменная POST_FORM_ACTION_URI упорно указывает на component.php из ядра.

Значит нужно прописать путь к обработчику вручную и добавить в начало этого обработчика:
<?
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php";);
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php";);
?>
а дальше логику обработки события. Правильно?
 
некорректно выразился: "POST_FORM_ACTION_URI указывает на  component.php из ядра".
При использовании  POST_FORM_ACTION_URI  вызывается component.php из ядра
 
Добрый день. Столкнулся с проблемой. Задача: есть три группы пользователей: администраторы, руководители и менеджеры. Менеджер должен редактировать только свой элемент инфоблока, руководители и администраторы должны редактировать элементы инфоблока всех менеджеров. В компоненте делаю проверку:


Код
         $arGroups = CUser::GetUserGroup($USER->GetID());
         for ($i=0; $i < count($arGroups); $i++) if ($arGroups[$i] == 1 || $arGroups[$i] == 6) $groupAcsess = true; 

         if ($groupAcsess == true){
            $arFilter["PROPERTY_RESORT_ID"] = $_SESSION['RESORT_ID'];
         }
         else if ($arParams["ELEMENT_ASSOC"] == "PROPERTY_ID" && intval($arParams["ELEMENT_ASSOC_PROPERTY"]) > 0 && in_array($arParams["ELEMENT_ASSOC_PROPERTY"], $arPropertyIDs))
         {
            $arFilter["PROPERTY_".$arParams["ELEMENT_ASSOC_PROPERTY"]] = $USER->GetID();
         }
         else
         {
            $arFilter["CREATED_BY"] = $USER->GetID();
         }
 
1 и 6 - это группы "администраторы" и "руководители" соответственно. Всё хорошо. Для них выводятся все элементы, для менеджера - только тот, где стоит "привязка к пользователю по свойству инфоблока". Но при редактировании элемента инфоблока через форму, это свойство перезаписывается на текущего пользователя, который редактирует элемент. Соответственно, если элемент отредактировал администратор или руководитель, для менеджера он становится недоступным.

Не подскажете, в какую сторону копать?
 
Разобрался. В компоненте надо закомментировать кусок

Код
/*if ($arParams["ELEMENT_ASSOC"] == "PROPERTY_ID")
            $arUpdatePropertyValues[$arParams["ELEMENT_ASSOC_PROPERTY"]] = $USER->GetID();
         $arUpdateValues["MODIFIED_BY"] = $USER->GetID();

         $arUpdateValues["PROPERTY_VALUES"] = $arUpdatePropertyValues;*/
 
 
Цитата
Антон Шаповал написал:
Разобрался. В компоненте надо закомментировать кусок
Код
 /*if ($arParams["ELEMENT_ASSOC"] == "PROPERTY_ID")
            $arUpdatePropertyValues[$arParams["ELEMENT_ASSOC_PROPERTY"]] = $USER->GetID();
         $arUpdateValues["MODIFIED_BY"] = $USER->GetID();

         $arUpdateValues["PROPERTY_VALUES"] = $arUpdatePropertyValues;*/
  
Не успел ответить. Но да, отрубить перепривязку.
 
Добрый день.
Вопрос по уроку: а как быть с множественной передачей файлов? Скажем, хочу я сделать галерею, отправляю через файловый инпут 4 картинки, он [скрипт] мне в отладке их демонстрирует, но в инфоблоке они не появляются :С
 
Цитата
Desperial написал:
Добрый день.
Вопрос по уроку: а как быть с множественной передачей файлов? Скажем, хочу я сделать галерею, отправляю через файловый инпут 4 картинки, он [скрипт] мне в отладке их демонстрирует, но в инфоблоке они не появляются :С
По идее проблем не должно быть. Уже делал форму которая отправляет картинки в множественное свойство "Файл" MORE_PHOTO. Поковыряйте еще, тут особо и подсказать нечего, там ни какой хитрости нет
 
На самом деле, кое что есть.

Сразу проясню, я немного не договорил: я подавал картинки в форму через инпут с атрибутом multiple. Проблема в том, что он создает массив $_FILES такого рода:
Код
Array
(
    [gal] => Array
        (
            [name] => Array
                (
                    [0] => kelemvortemple.png
                    [1] => laughgob.png
                    [2] => phlan.jpg
                    [3] => road.png
                    [4] => rork.jpg
                    [5] => Shadows of Moonsea.jpg
                )

            [type] => Array
                (
                    [0] => image/png
                    [1] => image/png
                    [2] => image/jpeg
                    [3] => image/png
                    [4] => image/jpeg
                    [5] => image/jpeg
                )

            [tmp_name] => Array
                (
                    [0] => %путь_ко_временному_файлу%/php9tn6RX
                    [1] => %путь_ко_временному_файлу%/phpoXHr1c
                    [2] => %путь_ко_временному_файлу%/phpPtBQas
                    [3] => %путь_ко_временному_файлу%/phpEJ5ukH
                    [4] => %путь_ко_временному_файлу%/phpeiYguW
                    [5] => %путь_ко_временному_файлу%/phpv8h6Db
                )

            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                    [3] => 0
                    [4] => 0
                    [5] => 0
                )

            [size] => Array
                (
                    [0] => 178797
                    [1] => 169764
                    [2] => 667303
                    [3] => 369171
                    [4] => 135182
                    [5] => 73339
                )

        )

)
Понятно, что битрикс не в состоянии прочитать разбитый таким образом массив. Но и в стандартном наборе нет класса, который самостоятельно сформировал бы массивы под каждое изображение. Выкручивался таким образом:
Код
$i=count($_FILES['gal']);
for ($c=0;$c<=$i;$c++) {
$PROP['gal'][$c]['name']=$_FILES['gal']['name'][$c];
$PROP['gal'][$c]['type']=$_FILES['gal']['type'][$c];
$PROP['gal'][$c]['tmp_name']=$_FILES['gal']['tmp_name'][$c];
$PROP['gal'][$c]['error']=$_FILES['gal']['error'][$c];
$PROP['gal'][$c]['size']=$_FILES['gal']['size'][$c];
};
Сейчас всё работает. Оставлю это здесь, мало ли, кто занимается таким-же мазохизмом и испытал те же проблемы С:
Изменено: Desperial - 04.03.2017 01:56:59
 
подскажите с формой а то я немного запутался:
в add_form_result.php мы получаем id раздела записанный в $fields["IBLOCK_SECTION"] как получить его символьный код для последующего редиректа в раздел выбранный пользователем при выборе в форме add_form_page.php
 
Добрый день. очередной затуп с формой...по Вашему руководству вывел и кастомизировал под себя все просто и чертовски удобно за это отдельное СПАСИБО.
как навесить на форму отправку по почтовому шаблону? и еще 1 вопрос он больше относиться к защите от спамеров ссылками:

есть код который просто вырезает ссылки из текста
$detail_value = $_REQUEST['description_detail'];
$detail_value =  preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w( :\ d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '', $detail_value);
$fields = array(
"DETAIL_TEXT"    => $detail_value
);
но проблема в том что там как правило кроме ссылки 2-3 слова и весь раздел куда добавляются данные с формы превращается в помойку....

можно как то сделать проверку на наличие ссылок в тексте и если оные имеются просто не пропускать на запись а выводить какой нибудь текст???
 
Цитата
Сергей Манник написал:
Добрый день. очередной затуп с формой...по Вашему руководству вывел и кастомизировал под себя все просто и чертовски удобно за это отдельное СПАСИБО.
как навесить на форму отправку по почтовому шаблону? и еще 1 вопрос он больше относиться к защите от спамеров ссылками:

есть код который просто вырезает ссылки из текста
$detail_value = $_REQUEST['description_detail'];
$detail_value =  preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(  d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '', $detail_value);
$fields = array(
"DETAIL_TEXT"    => $detail_value
);
но проблема в том что там как правило кроме ссылки 2-3 слова и весь раздел куда добавляются данные с формы превращается в помойку....

можно как то сделать проверку на наличие ссылок в тексте и если оные имеются просто не пропускать на запись а выводить какой нибудь текст???
Google Recapcha не проще прикрутить? А по поводу почтового события, просто напишите обработчик который отправляет письмо, при добавлении нового элемента инфоблока. Под рукой сейчас нет, если не забуду- в заметку допишу.
Но если найдете раньше прошу сюда написать)
 
вроде придумал костыль как проверять ссылки....если у кого то есть идеи как улучшить всегда буду рад
как то так

$mystring = 'abc xyzervev://googlwcwcwec.cwecom reverv<a href="wevwev">eververvev</a>ever rveervev';
function fuckinghref($mystring)
{
$findme = array('http', '//', '.ru', '.com', 'bz', 'net', '.org', '.info', '<a>', '</a>', 'href');
$i = "0";
foreach ($findme as $findme_value) {
$pos = strpos($mystring, $findme_value);
if ($pos === false) {
} else {
$i = $i + 1;
}
}
return $i;
}
echo $mystring . "<hr>";
if (fuckinghref($mystring) > "0" ;) {
echo "..... опять ссылки шлют!!";
}else{
echo "все норм";
}
Изменено: Михаил Базаров - 29.03.2017 19:37:12 (Мат)
 
как то так выглядит мой add_form_result.php если есть идеи по улучшению и защите от sql иньекций и прочей гадости буду рад услышать

<?
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");
$APPLICATION->SetPageProperty("ROBOTS", "noindex, nofollow");
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
?>

<?
$mystring = strip_tags($_REQUEST['name']);
$b = strip_tags($_REQUEST['description_detail']);
function fuckinghref($mystring)
{
   $findme = array('http', '//', '.ru', '.com', '.bz', '.net', '.org', '.info', '<a>', '</a>', 'href', 'url', 'ru', 'bz', 'net' , 'org' , 'info' , 'ucoz' , 'adult' , 'xxx');
   $i = "0";
   foreach ($findme as $findme_value) {
       $pos = strpos($mystring, $findme_value);
       if ($pos === false) {
       } else {
           $i = 1;
       }
   }
   return $i;
}
if ( (fuckinghref($mystring) > "0") || (fuckinghref($b) > "0") ){
   LocalRedirect($_SERVER['HTTP_REFERER']);
}else{

if (!empty($_REQUEST['name']) and !empty($_REQUEST['description_detail']) ) {

   CModule::IncludeModule('iblock');

   //Погнали
   $el = new CIBlockElement;
   $iblock_id = 31;
   $section_id = false;
   $section_id[$i] = $_POST['section_id']; //Разделы для добавления

   //Свойства
   $PROP = array();

$PROP['PERSONAL_YUR'] = $_POST['personal_yur']; //Свойство (частное/юр лицо)
$PROP['NAMES'] = $_POST['names']; //Свойство название
$PROP['PHONE'] = $_POST['phone']; //Свойство телефон
$PROP['CITY'] = $_POST['city']; //Свойство город
$PROP['FILE'] = $_FILES['file']; //Свойство файл

   //Основные поля элемента
   $fields = array(
       "DATE_CREATE" => date("d.m.Y H:i:s"), //Передаем дата создания
       "CREATED_BY" => $GLOBALS['USER']->GetID(), //Передаем ID пользователя кто добавляет
       "IBLOCK_SECTION" => $section_id[$i], //ID разделов
       "IBLOCK_ID" => $iblock_id, //ID информационного блока он 31-ый
       "PROPERTY_VALUES" => $PROP, // Передаем массив значении для свойств
       "NAME" => strip_tags($_REQUEST['name']),
       "ACTIVE" => "N", //поумолчанию делаем активным или ставим N для отключении поумолчанию
       "PREVIEW_TEXT" => TruncateText((strip_tags($_REQUEST['description_detail'])), 250),// strip_tags($_REQUEST['description_detail']), //Анонс
       "PREVIEW_PICTURE" => $_FILES['image'], //изображение для анонса
       "DETAIL_TEXT"    => strip_tags($_REQUEST['description_detail']),
       "DETAIL_PICTURE" => $_FILES['image_detail'] //изображение для детальной страницы
   );
/*
 if (strpos($_REQUEST['description_detail'], 'банкрот') !== false) // именно через жесткое сравнение
{
   echo 'Найдено';
} else {
   echo 'Не найдено';
}
*/
   
   //Результат в конце отработки
   if ($ID = $el->Add($fields)) {
   $rsParentSection = CIBlockSection::GetByID($section_id[$i][0]);
if ($arParentSection = $rsParentSection->GetNext()){
LocalRedirect($arParentSection['SECTION_PAGE_URL']);
}
    }else {
echo 'Произошел как-то косяк Попробуйте еще разок';
    }
}
else{
LocalRedirect($_SERVER['HTTP_REFERER']);
}
}
?>
 
<? require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/footer.php"); ?>
 
помогите решить проблему,сделал все как на видео...но при отправке кидает на странице результата но она пустая...совсем...ни ошибки ни чего-либо еще...что может быть?
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить файлы
 

Записная книжка разработчика

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

Добавление и удаление из сравнения на AJAX: Битрикс Просмотров: 18802 Рецепт лежал у меня в закромах, почти о нем и забыл, но тут подвернулся под руку- решил оп... AJAX корзина с отправкой количества из раздела каталога Просмотров: 20192 Столкнулся с задачкой: нужно было на одном сайте реализовать интерактивный прайс лист. При... Вывести компонент новостей на страницу в Битрикс Просмотров: 65166 Посмотрел Яндекс метрику на свой сайт, и решил что буду частенько писать сюда именно то, ч... INPUT type="file" Предпросмотр превью картинки до загрузки Просмотров: 12967 Рассмотрим на примере компонента "Форма добавления-редактирования элементов инфоблока", ка... Получение местоположений через API Битрикс c поиском по select. Просмотров: 23251 Если нужно получить список городов из модуля "Местоположения" можно воспользоваться API Би... Настройка выгрузки товаров в Яндекс Маркет с сайта Битрикс Просмотров: 38009 Настройка выгрузки в Яндекс маркет в формате yml, выполняется достаточно просто, кроме одн... Кастомизация компонента восстановления пароля bitrix:system.auth.forg... Просмотров: 26837 Достаточно часто спрашивают как кастомизировать компонент восстановления пароля пользовате... Установка Битрикс24 "Интернет-Магазин + CRM" на один домен и настройк... Просмотров: 1709 Задача: установить лицензию "Интернет-Магазин + CRM" на один домен. Что бы crm была доступ... Определить местоположение пользователя и показать магазины поблизости... Просмотров: 1846 Задача: в мобильном приложении, которое открывает сайт на 1С-Битрикс внутри себя, нужно оп... Дать пользователю возможность быстро отредактировать материал Просмотров: 4969 На одном из разрабатываемых сайтов, пользователи формирую его контент. После регистрации, ... Показать пользователю накопительную скидку за все сделанные заказы, и... Просмотров: 2642 Задача: показать, текущему авторизованному, пользователю сумму всех выполненных заказов и ... Список новостей с автопрокруткой через overflow:scroll Просмотров: 6143 Простенький javascript позволит сделать автопрокрутку в шаблоне списка новостей. Достаточн... Добавление в избранное или отложенные, на AJAX из карточки товара Просмотров: 29256 В этой заметке рассакажу как добавлять товары в "Отложенные", для иммитации функционала "И... Наличие на складах в умном фильтре 1С-Битрикс, с автоматическим обнов... Просмотров: 1166 Задача: добавить возможность фильтрации товаров по складам в умном фильтре. Данные должны ... Ссылки для добавления и удаления товара из сравнения в Битрикс Просмотров: 8723 Просто оставляю это здесь, вставка ссылок на добавление и удаление товара из сравнения, ес... Ajax форма обратной связи, реализация в битрикс Просмотров: 8704 Иногда, на сайте требуется создать форму обратной связи, которая будет писать все данные в... Свойство: привязка к Яндекс:Картам - вывести из нескольких элементов ... Просмотров: 18697 Предположим, что у вас есть инфоблок со свойством "Привязка к яндекс картам". В этом инфоб... Проверка на наличие элементов, текущего пользователя, в заданном инфо... Просмотров: 6185 Если стоит задача, определить наличие элементов созданных пользователем на сайте. Можно во... Дополнительные картинки в новостях Битрикс, почти фотогалерея. Просмотров: 49540 Частенько стоит задача, по мимо стандартных "Картинка для анонса" и "Деталь... Вывести свойство привязка к Яндекс Картам в Битрикс Просмотров: 19477 Часто бывает нужно вывести свойство привязка к Яндекс карте в детальном описании элемента...