UMIhelp

Разработка дополнительного функционала => Custom макросы => Тема начата: goodprofy от 11 Марта 2014, 14:56:15

Название: Рекурсивное удаление поля в типе данных объект каталога
Отправлено: goodprofy от 11 Марта 2014, 14:56:15
Здравствуйте!
И снова я с дурными задачами)

На этот раз надо удалить поле типа "выпадающий список" из всех дочек родителя "Объект каталога".
Поле Называется Бренд, с ИД brend.

Существует ли какое либо решение?
Название: Re:Рекурсивное удаление поля в типе данных объект каталога
Отправлено: ilyar от 11 Марта 2014, 20:17:45
Поля создаются, присоединяются к группам, группы создаются для типов данных, одно и тоже поле может использоваться в разных типах данных .

Для того что бы получит поле по строковому идентификатору (то что ты называешь "ИД brend") не предусмотрено методов (поправьте меня если я не прав) для этого надо использовать вспомогательные конструкции типа:

Код: PHP [Выделить]

<?php
/**
* Get numeric identifier field from its string identifier
*
* @param umiFieldsGroup $group
* @param $fieldName
* @return int|null
*/
function getFieldIdByName(umiFieldsGroup $group, $fieldName) {
  $fields = $group->getFields();
  foreach($fields as $field) { /** @var $field umiField */
    if($field->getName() == $fieldName) {
      return $field->getId();
    }
  }
}


Для решения твоей задачи надо пройтись рекурсивно по типам вниз от Объект каталога, произвести с каждым типом следующие:

- получить группу полей $fieldsGroup = getFieldsGroupByName($field_group_name[, $allow_disabled = false]) (http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_dannyh/umiobjecttype/getfieldsgroupbyname/)
- вывести поле из группы полей $fieldsGroup->detachField($fieldId) (http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_dannyh/umifieldsgroup/detachfield/)

Еще как вариант решения твоей задачи используя коллекцию umiFieldsCollection (http://api.docs.umi-cms.ru/spravochnik_po_klassam_yadra_umicms/model_dannyh/umifieldscollection/), можно физически удалить поле, в этом случае оно удалится во всех типах данных.

Код: PHP [Выделить]

<?php
  $fieldId = 444;
  umiFieldsCollection::getInstance()->delField($fieldId);
Название: Re:Рекурсивное удаление поля в типе данных объект каталога
Отправлено: ilyar от 11 Марта 2014, 20:45:03
К стати именно для этих таких "дурных" задач был создан UMI.Console (http://bitly.com/UMIConsoleOnUMIHub) проект не получил заинтересованности у аудитории и разработчиков юми, и поэтому используется и развивается только автором. Кратко о проекте UMI.Console позволяет создавать простые скрипты на UMI.API, которые можно переиспользовать в разных проектах, запускается через php-cli это позволяет быстро работать с большим количеством объектов.  Демо - просмотр типов данных (http://bit.ly/UMIConsole_type), документация по командам (http://bit.ly/UMIConsole).
Название: Re:Рекурсивное удаление поля в типе данных объект каталога
Отправлено: goodprofy от 12 Марта 2014, 17:14:59
Спасибо. Моя ошибка была в том что я пытался найти поле по СИД(строковому ИД). И спасибо за консоль, пригодится =)