Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Редактирование формы элемента

00 голосов
7
Всем привет!

Подскажите, как добавить кнопку в форму для редактирование элемента (во вкладку анонс)? Я так понимаю нужно создать php файл, указать к нему путь в настройках инфоблока (Файл для редактирования элемента, позволяющий модифицировать поля перед сохранением:). Что в нем примерно написать, чтобы инфоблок оставил стандартные настройки (элемент, анонс,подробно), но в анонсе добавилась кнопка?

Заранее спасибо...
спросил 29 Июль, 13 от InFroO (160 баллов)

7 Ответы

00 голосов
Неужели такое никто не реализовывал...
ответил 29 Июль, 13 от InFroO (160 баллов)
00 голосов
Если эта кнопка должна совершать какие-то действия, не связанные с сохранением/удалением редактируемого элемента, то можно создать пользовательское свойство, которое будет возвращать в качестве представления кнопку, а на клик кнопки уже будет навешано нужное действие(открытие попапа, заполнение поля и т.п.). И свойство с таким типом надо добавить к нужному инфоблоку, после чего настроить вкладку "Анонс".
Вот как-то так - http://pastebin.com/MspApa7J:
Код
<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

class CIBlockPropertyCustomButton
{
    function GetUserTypeDescription()
    {
        return array(
                "PROPERTY_TYPE" => "S",
                "USER_TYPE" => "custom_button",
                "DESCRIPTION" => 'Кнопка',
                "GetPublicViewHTML" => array("CIBlockPropertyCustomButton","GetPublicViewHTML"),
                "GetAdminListViewHTML" => array("CIBlockPropertyCustomButton","GetAdminListViewHTML"),
                "GetPropertyFieldHtml" => array("CIBlockPropertyCustomButton","GetPropertyFieldHtml"),
                "ConvertToDB" => array("CIBlockPropertyCustomButton","ConvertToDB"),
                "ConvertFromDB" => array("CIBlockPropertyCustomButton","ConvertFromDB"),
                );
    }

    function GetPublicViewHTML($arProperty, $value, $strHTMLControlName)
    {
        return '';
    }

    function GetAdminListViewHTML($arProperty, $value, $strHTMLControlName)
    {
        return '<button onclick="alert(&quot;Click on list&quot;); return false;">Click</button>';
    }

    function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName)
    {
        return '<button onclick="alert(&quot;Click on edit page&quot;); return false;">Click</button>';
    }

    function ConvertToDB($arProperty, $value)
    {
        return '';
    }

    function ConvertFromDB($arProperty, $value)
    {
        return '';
    }
}

AddEventHandler('iblock', 'OnIBlockPropertyBuildList', array('CIBlockPropertyCustomButton', 'GetUserTypeDescription'));

?>


Выглядит это так:
Рисунок

Рисунок
ответил 26 Сен, 13 от Miko (340 баллов)
00 голосов
Андрей, а куда код нужно вставить?
ответил 26 Дек, 13 от InFroO (160 баллов)
00 голосов
Полистал документацию и нашел файл редактирования элемента: /bitrix/modules/iblock/admin/iblock_element_edit.php

Нахожу строчку кода 2118 и вставляю туда Кнопку:

Код
<?
$tabControl->BeginCustomField("PREVIEW_TEXT", GetMessage("IBLOCK_FIELD_PREVIEW_TEXT"), $arIBlock["FIELDS"]["PREVIEW_TEXT"]["IS_REQUIRED"] === "Y");
?>

<form>
  <button>Кнопка</button>  // кнопка
</form>

<tr class="heading" id="tr_PREVIEW_TEXT_LABEL">
      <td colspan="2"><?echo $tabControl->GetCustomLabelHTML()?></td>
   </tr>
   <?if($ID && $PREV_ID && $bWorkflow):?>
   <tr id="tr_PREVIEW_TEXT_DIFF">
      <td colspan="2">
         <div style="width:95%;background-color:white;border:1px solid black;padding:5px">
            <?echo getDiff($prev_arElement["PREVIEW_TEXT"], $arElement["PREVIEW_TEXT"])?>
         </div>
      </td>
   </tr>
   <?elseif(COption::GetOptionString("iblock", "use_htmledit", "Y")=="Y" && $bFileman):?>
   <tr id="tr_PREVIEW_TEXT_EDITOR">
      <td colspan="2" align="center">
         <?CFileMan::AddHTMLEditorFrame(
         "PREVIEW_TEXT",
         $str_PREVIEW_TEXT,
         "PREVIEW_TEXT_TYPE",
         $str_PREVIEW_TEXT_TYPE,
         //300,
         array(
               'height' => 450,
               'width' => '100%'
            ),
         "N",
         0,
         "",
         "",
         $arIBlock["LID"],
         true,
         false,
         array(
            'toolbarConfig' => CFileman::GetEditorToolbarConfig("iblock_".(defined('BX_PUBLIC_MODE') && BX_PUBLIC_MODE == 1 ? 'public' : 'admin')),
            'saveEditorKey' => $IBLOCK_ID
         )
         );?>
      </td>
   </tr>
   <?else:?>
   <tr id="tr_PREVIEW_TEXT_TYPE">
      <td><?echo GetMessage("IBLOCK_DESC_TYPE")?></td>
      <td><input type="radio" name="PREVIEW_TEXT_TYPE" id="PREVIEW_TEXT_TYPE_text" value="text"<?if($str_PREVIEW_TEXT_TYPE!="html")echo " checked"?>> <label for="PREVIEW_TEXT_TYPE_text"><?echo GetMessage("IBLOCK_DESC_TYPE_TEXT")?></label> / <input type="radio" name="PREVIEW_TEXT_TYPE" id="PREVIEW_TEXT_TYPE_html" value="html"<?if($str_PREVIEW_TEXT_TYPE=="html")echo " checked"?>> <label for="PREVIEW_TEXT_TYPE_html"><?echo GetMessage("IBLOCK_DESC_TYPE_HTML")?></label></td>
   </tr>
   <tr id="tr_PREVIEW_TEXT">
      <td colspan="2" align="center">
         <textarea cols="60" rows="10" name="PREVIEW_TEXT" style="width:100%"><?echo $str_PREVIEW_TEXT?></textarea>
      </td>
   </tr>
   <?endif;
$tabControl->EndCustomField("PREVIEW_TEXT",
   '<input type="hidden" name="PREVIEW_TEXT" value="'.$str_PREVIEW_TEXT.'">'.
   '<input type="hidden" name="PREVIEW_TEXT_TYPE" value="'.$str_PREVIEW_TEXT_TYPE.'">'
);
$tabControl->BeginNextFormTab(); ?>



После чего сохраняю файл, и в редактировании элемента во вкладке анонс появляется эта кнопка! Еще не пробовал, но думаю можно в событии этой кнопки отправить на e-mail значение поля 'PREVIEW_TEXT' с помощью функции mail.

Но проблема такая, мне нужна эта кнопка только в одном инфоблоке, а не во всех! Копирую файл: iblock_element_edit.php и называю его: iblock_element_add_button.php путь будет такой: /bitrix/modules/iblock/admin/iblock_element_add_button.php

Захожу в инфоблок и указываю в поле "Файл с формой редактирования элемента" этот путь: /bitrix/modules/iblock/admin/iblock_element_add_button.php и сохранить!

Также как в коде выше (строка кода начиная с 2118), вставляю код кнопки и сохраняю файл. Далее при входе в редактирование элемента, выдается такая ошибка:

Fatal error: Cannot redeclare class _ciblockerror. If this code worked without the Zend Optimizer+, please set zend_optimizerplus.dups_fix=1 in your php.ini in C:\Program Files\Bitrix Environment\www\bitrix\modules\iblock\admin\iblock_element_edit.php on line 1698

Почему ошибка указывает на файл iblock_element_edit.php, ведь в поле "Файл с формой редактирования элемента" указан файл iblock_element_add_button.php? Может я что-то не так делаю?
ответил 11 Апр, 14 от InFroO (160 баллов)
00 голосов
Цитата
Олег Сапегин пишет:
Андрей, а куда код нужно вставить?

Подключите этот файл в /bitrix/php_interface/init.php, после этого в списке доступных типов свойств появится свойство "Кнопка". В вашем случае на onclick можно повесить асинхронный вызов скрипта, которому передаётся значение из PREVIEW_TEXT. Для меня этот способ кажется несколько проще, чем создание дополнительной формы редактирования(да и гибче, хотя это не ваш вариант - при необходимости можно создать свои кнопки для других инфоблоков, проверяя лишь IBLOCK_ID в коде пользовательского свойства)
ответил 04 Авг, 14 от Miko (340 баллов)
00 голосов
Версия битрикс 10.0

Я не нашел файл init.php по указанному пути:
/bitrix/php_interface/
ответил 08 Дек, 14 от InFroO (160 баллов)
00 голосов
Тогда создайте его и подключите в нём файл с вышеприведенным кодом. Или вставьте его прямо в init.php
ответил 31 Март, 15 от Miko (340 баллов)

Похожие вопросы

0 голосов
0 ответов
спросил 08 Янв, 14 от TukoHDpyC (160 баллов)
0 голосов
2 ответов
спросил 06 Май, 14 от ZooWolf (120 баллов)
0 голосов
3 ответов
0 голосов
1 ответ