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

bitrix:iblock.element.add.form не все дополнительные поля видятся

00 голосов
10
В инфоблоке имеется свойства - привязка к разделам. Сталю на страницу компонент "bitrix:iblock.element.add.form", захожу в его настройки, но в "Свойства, выводимые на редактирование" не вижу этих свойств, при том, остальные дополнительные свойства отображаются. Как добавить их?
спросил 13 Март, 13 от Snezhka (2,240 баллов)

10 Ответы

00 голосов
или по дефолту редактирование через этот компонент таких свойств не предусмотренно?
ответил 13 Март, 13 от Snezhka (2,240 баллов)
00 голосов
Стандартно в Битриксе таких возможностей не предусмотрено, здесь уже необходимо дорабатывать компонент под конкретные нужды.

Для примера можно реализовать следующим образом:

1) В коде вызова компонента вручную добавьте ID доп. св-в (которые вы хотите вывести на редактирование)

Код
...
"PROPERTY_CODES" => array(
   0 => "NAME",
   1 => "DATE_ACTIVE_FROM",
   2 => "69", //ID необходимого свойства
   3 => "",
),
"PROPERTY_CODES_REQUIRED" => array(
   0 => "NAME",
   1 => "DATE_ACTIVE_FROM",
   2 => "69", //ID необходимого свойства
   3 => "",
),
...


1) Скопируйте стандартный шаблон компонента;
2) В нем найдите код

Код
...
case "S":
case "N":
...


Добавьте в него

Код
case "E":
case "S":
case "N":


3) далее необходимо произвести выборку необходимых вам данных и вывести их:

Например:

Код
...
<?if($propertyID == 69):?>

   <select name="PROPERTY[<?=$propertyID?>][<?=$i?>]">
      <option value=""></option>
      <?
      $arSelect = Array("ID", "NAME");
      $arFilter = Array("IBLOCK_ID"=>IntVal(15), "ACTIVE"=>"Y");
      $res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>1000), $arSelect);
      while($ob = $res->GetNextElement()){
         $arFields = $ob->GetFields();
            //print_r($arFields);
         if($value == $arFields["ID"]){$selected = "selected";}else{$selected = "";}
         echo "<option value=\"".$arFields["ID"]."\" ".$selected.">".$arFields["NAME"]."</option>";
      }
      ?>
   </select>

<?else:?>

   <input type="text" name="PROPERTY[<?=$propertyID?>][<?=$i?>]" size="25" value="<?=$value?>" />
   <?if($arResult["PROPERTY_LIST_FULL"][$propertyID]["USER_TYPE"] == "DateTime"):?>
   <?$APPLICATION->IncludeComponent(
   'bitrix:main.calendar',
   '',
   array(
   'FORM_NAME' => 'iblock_add',
   'INPUT_NAME' => "PROPERTY[".$propertyID."][".$i."]",
   'INPUT_VALUE' => $value,
   ),
   null,
   array('HIDE_ICONS' => 'Y')
   );?>
   <br /><small><?=GetMessage("IBLOCK_FORM_DATE_FORMAT")?><?=FORMAT_DATETIME?></small>
   <?endif?>

   <br />

<?endif;?>
...


Недостатком такого способа является то, что при редактировании страницы (на которой расположен компонент) через редактор, дополнительные свойства, введенные вручную, удаляются. Но данную проблему можно легко решить доработав данный компонент.
ответил 17 Март, 13 от Thieve (460 баллов)
00 голосов
мм..спасибо, попробую )
ответил 27 Май, 13 от Snezhka (2,240 баллов)
00 голосов
Только вот уточнить хотел - второй пункт, выборку данных в каком case`е делать?
ответил 23 Авг, 13 от Snezhka (2,240 баллов)
00 голосов
Цитата
Олег Белов пишет:
Только вот уточнить хотел - второй пункт, выборку данных в каком case`е делать?



Код
case "E": 
case "S": 
case "N": 

...
здесь производим необходимые действия
...

break;
ответил 22 Ноя, 13 от Thieve (460 баллов)
00 голосов
хм..в коде вызова компонента ставлю:
Код
"PROPERTY_CODES" => array(
      0 => "NAME",
      1 => "DATE_ACTIVE_FROM",
      2 => "PREVIEW_TEXT",
      3 => "PREVIEW_PICTURE",
      4 => "DETAIL_TEXT",
      5 => "DETAIL_PICTURE",
      6 => "2", //Привязка к разделам #1
      7 => "3", //Привязка к разделам #2
      8 => "4",
      9 => "5",
      10 => "6",
      11 => "7",
      12 => "8",
      13 => "9",
      14 => "10",
      15 => "11",
   ),

В шаблоне компонента:
Код
case "N":
for ($i = 0; $i<$inputNum; $i++)
{
   if ($arParams["ID"] > 0 || count($arResult["ERRORS"]) > 0)
   {
      $value = intval($propertyID) > 0 ? $arResult["ELEMENT_PROPERTIES"][$propertyID][$i]["VALUE"] : $arResult["ELEMENT"][$propertyID];
   }
   elseif ($i == 0)
   {
      $value = intval($propertyID) <= 0 ? "" : $arResult["PROPERTY_LIST_FULL"][$propertyID]["DEFAULT_VALUE"];

   }
   else
   {
      $value = "";
   }
   ?>
      <input type="text" name="PROPERTY[<?=$propertyID?>][<?=$i?>]" size="25" value="<?=$value?>" /><br />
   <?
      if($arResult["PROPERTY_LIST_FULL"][$propertyID]["USER_TYPE"] == "DateTime"):?><?
      $APPLICATION->IncludeComponent(
         'bitrix:main.calendar',
         '',
         array(
            'FORM_NAME' => 'iblock_add',
            'INPUT_NAME' => "PROPERTY[".$propertyID."][".$i."]",
            'INPUT_VALUE' => $value,
         ),
         null,
         array('HIDE_ICONS' => 'Y')
      );
      ?><br /><small><?=GetMessage("IBLOCK_FORM_DATE_FORMAT")?><?=FORMAT_DATETIME?></small><?
   endif
   ?><br /><?
   if($propertyID == 2)
   {
   ?>
   <select name="PROPERTY[<?=$propertyID?>][<?=$i?>]">
      <option value=""></option>
      <?
      $arSelect = Array("ID", "NAME");
      $arFilter = Array("IBLOCK_ID"=>IntVal(1), "ACTIVE"=>"Y");
      $res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>1000), $arSelect);
      while($ob = $res->GetNextElement())
      {
         $arFields = $ob->GetFields();
         //print_r($arFields);
         if($value == $arFields["ID"]){$selected = "selected";}else{$selected = "";}
         echo "<option value=\"".$arFields["ID"]."\" ".$selected.">".$arFields["NAME"]."</option>";
      }
      ?>
   </select>
   <? 
   }
}
break;

Но, что-то ничего не выводится..
ответил 03 Март, 14 от Snezhka (2,240 баллов)
00 голосов
Проверьте, в шаблоне обязательно должен стоять case "E": именно он отвечает за такие св-ва, а для проверки можете просто вывести переменную $value и посмотреть выводится она или нет.

Код
case "E":
case "S":
case "N":
ответил 23 Июнь, 14 от Thieve (460 баллов)
00 голосов
да, в блоке swith добавил сначала case "E":
а вывод информации нужно делать в
Код
for ($i = 0; $i<$inputNum; $i++)
{
...
}

?
ответил 23 Окт, 14 от Snezhka (2,240 баллов)
00 голосов
такое ощущение, что у меня не цепляется именно: if($propertyID == 2)
ответил 21 Фев, 15 от Snezhka (2,240 баллов)
00 голосов
Вот полный примерный код:

Код
case "E":
case "S":
case "N":
   for ($i = 0; $i<$inputNum; $i++)
   {
      if ($arParams["ID"] > 0 || count($arResult["ERRORS"]) > 0)
      {
         $value = intval($propertyID) > 0 ? $arResult["ELEMENT_PROPERTIES"][$propertyID][$i]["VALUE"] : $arResult["ELEMENT"][$propertyID];
      }
      elseif ($i == 0)
      {
         $value = intval($propertyID) <= 0 ? "" : $arResult["PROPERTY_LIST_FULL"][$propertyID]["DEFAULT_VALUE"];

      }
      else
      {
         $value = "";
      }

      //Здесь производим необходимые действия
      if($propertyID == 60): //ID необходимого св-ва

         //выполняем выборку и выводим результат, для примера просто выведем текущее значение $value
         echo $value;

      else:

         //выполняем стандартный код
      ?>
         <input type="text" name="PROPERTY[<?=$propertyID?>][<?=$i?>]" size="25" value="<?=$value?>" />
         <?if($arResult["PROPERTY_LIST_FULL"][$propertyID]["USER_TYPE"] == "DateTime"):
            $APPLICATION->IncludeComponent(
      'bitrix:main.calendar',
      '',
      array(
         'FORM_NAME' => 'iblock_add',
         'INPUT_NAME' => "PROPERTY[".$propertyID."][".$i."]",
         'INPUT_VALUE' => $value,
      ),
      null,
      array('HIDE_ICONS' => 'Y')
   );
   ?><br /><small><?=GetMessage("IBLOCK_FORM_DATE_FORMAT")?><?=FORMAT_DATETIME?></small><?
   endif
   ?><br /><?
   endif;
   }
break;


Проверьте $propertyID и $value, выведите их и посмотрите что выведется.

У нас такая конструкция работает на нескольких проектах, еще не подводила :)
ответил 01 Июнь, 15 от Thieve (460 баллов)

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

0 голосов
2 ответов
спросил 29 Апр, 14 от Kiriel (2,010 баллов)
0 голосов
2 ответов
спросил 06 Апр, 14 от PANKELA (100 баллов)
0 голосов
1 ответ
0 голосов
4 ответов
0 голосов
7 ответов
спросил 14 Июль, 13 от shaiba (300 баллов)