Использование 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)
Сейчас там следующий код
'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.',
),
);
Предполагаю, что нужно, чтобы получилось
'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) {
Исходно выглядит
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;
И добавить что-то типа
'field_name' => $target_field_name,
'entity_type' => $entity_type,
'bundle' => $bundle,
'label' => $label,
);
Также наверное можно и расширить и клонировать поля и в терминах таксономии тогда наверное добавить 'entity_type'