Самодельная форма добавления элемента на API Битрикс

Самодельная форма добавления элемента на 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;
    }
}
?>
 
а если точнее
Цитата
Сергей Манник пишет:
Добрый день. Благодарю за действительно понятные уроки по битрикс.
у меня вопрос к вашему уроку
"Самодельная форма добавления элемента на 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 - 4 Марта 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 Марта 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"); ?>
 
помогите решить проблему,сделал все как на видео...но при отправке кидает на странице результата но она пустая...совсем...ни ошибки ни чего-либо еще...что может быть?
 
Кирилл, у пользователей есть доступ на добавление элементов в инфоблок? Если нет, то не мудрено, что так происходит. В типах инфоблока->тип, в который ты добавляешь элементы->доступ, укажи "для всех пользователей - добавление в панели"
Изменено: Desperial - 6 Апреля 2017 03:59:43
 
Здравствуйте! А вот вопрос как пользователю в месте с элементом создать раздел в котором он будет находится..
 
Добрый день!
Спасибо большое за полезный инструмент!
Создаю форму для добавления товаров в торговый каталог. Все получилось. Только никак не могу понять, как вносить цену. Никак она не хочет подхватываться.
Подскажите, как передать цену?
 
Цитата
Ольга Стафиевская пишет:
Добрый день!
Спасибо большое за полезный инструмент!
Создаю форму для добавления товаров в торговый каталог. Все получилось. Только никак не могу понять, как вносить цену. Никак она не хочет подхватываться.
Подскажите, как передать цену?
так сходу не подскажу но чуть позже допишу в заметку. Надо эксперементнуть. Как минимум- точно, нужно подключать модуль sale (вы же цены в торговый каталог грузите?)

Если разберетесь раньше меня: напишите в комментарий
 
Вроде разобралась.
Получилось что-то вроде этого:

Код
$PRODUCT_ID = $ID;
$PRICE_TYPE_ID = 1;
 $arFields = Array(
       "PRODUCT_ID" => $PRODUCT_ID,
       "CATALOG_GROUP_ID" => $PRICE_TYPE_ID,
       "PRICE" => $_POST['price'],
       "CURRENCY" => "RUB",
   );

CCatalogProduct::Add(array('ID' => $ID));

   if(CPrice::Add($arFields))
       echo "Добавил цену ".$_POST['price']." рублей на товар с ID: ".$ID.'<br>';
   else
       echo 'Ошибка добавления цены '.$_POST['price'].'<br>';
Работает.

Теперь разбираюсь, как осуществить множественную загрузку файлов.

И еще вопрос. Если есть форма загрузки материала из пользовательской части, то должна быть и форма редактирования. Кто-нибудь думал в этом направлении?
Можно ли использовать ту же самую форму, или надо делать другую?
 
Цитата
Ольга Стафиевская пишет:
Вроде разобралась.
Получилось что-то вроде этого:
Код
 $PRODUCT_ID = $ID;
$PRICE_TYPE_ID = 1;
 $arFields = Array(
       "PRODUCT_ID" => $PRODUCT_ID,
       "CATALOG_GROUP_ID" => $PRICE_TYPE_ID,
       "PRICE" => $_POST['price'],
       "CURRENCY" => "RUB",
   );

CCatalogProduct::Add(array('ID' => $ID));

   if(CPrice::Add($arFields))
       echo "Добавил цену ".$_POST['price']." рублей на товар с ID: ".$ID.'<br>';
   else
       echo 'Ошибка добавления цены '.$_POST['price'].'<br>'; 
Работает.

Теперь разбираюсь, как осуществить множественную загрузку файлов.

И еще вопрос. Если есть форма загрузки материала из пользовательской части, то должна быть и форма редактирования. Кто-нибудь думал в этом направлении?
Можно ли использовать ту же самую форму, или надо делать другую?
Здравствуйте! А цены то же так отправлять
Код
 <input type="text" name="price" maxlength="255" value="">
Читают тему (гостей: 1)

Форум о Битрикс:

Форум не является официальным. Не преследует ни каких (вообще ни каких) целей.

Владелец сайта оставляет за собой право удалять не интересные и бесполезные посты по своему усмотрению.

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

Поддержать форум

Вы можете поддержать функционирование данного форума:

© 2011—2017 Частный вебмастер: ИП Базаров, ОГРНИП: 315784700173692. Работает на 1С-Битрикс.

Копирование материалов запрещено: "ГК РФ, часть 4, раздел VII: Права на результаты интеллектуальной деятельности".

Информация размещенная на сайте, не является публичной офертой.
Политика конфеденциальности