Расширение drush команды field-clone.

Аватар пользователя univerico univerico 28 июля 2018 в 15:02

Использование drush команды field-clone может значительно ускорить создание новых типов материалов с идентичными по настройкам полями, требущими разной метки. Пока мне удалось найти для быстрого копирования однотипных полей на Друпал 7 только команду drush field-clone. Наверное, можно еще заморочиться с features, но у меня не получилось пока. У field-clone есть из коробки только два аргумента
source_field_name
target_field_name

И при использовании команды поле клонируется во всех типах материала, где встречается.

Вижу два возможных решения:
1)поменять машинное имя поля только в одном типе материала перед клонированием и использовать его в качестве источника;
2)расширить команду field-clone.
Есть и более широкая тема, если кто-то в принципе готов сотрудничать в области ускорения создания типов материалов, то есть тема здесь .

На всякий случай напишу свои самые отдаленные предположения.
Пытаюсь добавить аргумент - 'bundle', чтобы клонировать поле только в пределах одного типа материала.
По аналогии с этой темой и методом
от webpavilion

предполагаю, что нужно править внутри function field_drush_command() и function drush_field_clone($source_field_name, $target_field_name)

Сейчас там следующий код

$items['field-clone'] = array(
    'description' => 'Clone a field and all its instances.',
    'core' => array('7+'),
    'arguments' => array(
      'source_field_name' => 'Name of field that will be cloned',
      'target_field_name' => 'Name of new, cloned field.',
    ),
    'examples' => array(
      'field-clone tags labels' => 'Copy \'tags\' field into a new field \'labels\' field which has same instances.',
      'open `field-clone tags labels`' => 'Clone field and then open field edit forms for refinement.',
    ),
  );

Предполагаю, что нужно, чтобы получилось

$items['field-clone'] = array(
    'description' => 'Clone a field and all its instances.',
    'core' => array('7+'),
    'arguments' => array(
      'source_field_name' => 'Name of field that will be cloned',
      'bundle' => 'Content type (for nodes). Name of bundle to attach fields to. Required.',
      'target_field_name' => 'Name of new, cloned field.',
    ),
  ...
  );

А что добавить в 'examples' => array
не знаю.

дальше вероятно нужно редактировать   function drush_field_clone($source_field_name, $target_field_name) {

Исходно выглядит

 function drush_field_clone($source_field_name, $target_field_name) {
   if (!$info = field_info_field($source_field_name)) {
     return drush_set_error(dt('!source not found in field list.', array('!source' => $source_field_name)));
   }

   unset($info['id']);
   $info['field_name'] = $target_field_name;
   $target = drush_op('field_create_field', $info);

   foreach ($info['bundles'] as $entity_type => $bundles) {
     foreach ($bundles as $bundle) {
       $instance = field_info_instance($entity_type, $source_field_name, $bundle);
       $instance['field_name'] = $target_field_name;
       unset($instance['id']);
       $instance['field_id'] = $target['id'];
       drush_op('field_create_instance', $instance);
       $urls[] = drush_url(drush_field_ui_bundle_admin_path($entity_type, $bundle) . '/fields/' . $target_field_name, array('absolute' => TRUE));
     }
   }

  drush_print(implode(' ', $urls));

Я предполагаю, что по аналогии с
$info['field_name'] = $target_field_name;
нужно добавить
$info['field_label'] = $target_label;

И добавить что-то типа

 $instance = array(
      'field_name' => $target_field_name,
      'entity_type' => $entity_type,
      'bundle' => $bundle,
      'label' => $label,
    );

Также наверное можно и расширить и клонировать поля и в терминах таксономии тогда наверное добавить 'entity_type'