Modul created Content Type mit CCK Felder
am 26.11.2010 - 14:08 Uhr in
Hallo
ich entwickler gerade ein Modul für "Projekte". Dieses soll einen Content Type erstellen.
function pproject_node_info() {
return array(
'pproject' => array(
'name' => t('Project'), // Required.
'module' => 'pproject', // Required.
'description' => t('Create a new project node.'), // Required.
'has_title' => TRUE,
'title_label' => t('Project name'),
'has_body' => TRUE,
'body_label' => t('Project description'),
'min_word_count' => 2,
'locked' => TRUE
)
);
}
Das Modul ist von CCK-Modul abhängig und soll das Content Type "Project" (oben) um einige CCK Felder erweitern. Bis jetzt habe ich versucht, mich an dem hook_form anzuhängen. Es ist aber glaube ich nicht der richtige Anzatz um CCK Felder einzufügen.
function pproject_form($node, $form_state) {
$form = node_content_form($node, $form_state);
// declaring the fieldset
$form['pproject_project'] = array(
'#type' => 'fieldset',
'#title' => t('Project options')
);
$form['pproject_project']['pproject_project_license'] = array(
'#type' => 'select',
'#title' => t('Source code license'),
'#default_value' => $default,
'#options' => array(
1 => t('Apache License 2.0'),
2 => t('Artistic License/GPL'),
3 => t('Eclipse Public License 1.0'),
4 => t('GNU General Public License v2'),
5 => t('GNU General Public License v3'),
),
'#description' => t('Please select a license.'),
);
//
// Vermutlich ist das falscher Ansatz, um das CCK Fields zu benutzen
// man sollte denke ich erstmal diese einfügen und zum Content-Type referenzieren ?
//
$form['field_nodereference'] = array(
'#type' => 'nodereference_autocomplete',
'#title' => 'Nodereference Field',
'#value_callback' => 'nodereference_options',
);
return $form;
}
Ich würde gerne wissen, wie man CCK Felder für einem Content Type erstellt?
also ich suche nach eine funktion => content_create_field() oder so ähnlich :), die CCK-API war leider keine Hilfe bis jetzt :(
Kennt jemand vielleich einen Tutorial oder Modul (das ein Content Type erstellt der aber auch CCK Felder beinhaltet)?
Danke
- Anmelden oder Registrieren um Kommentare zu schreiben
ich würde mir dazu mal das
am 26.11.2010 - 14:52 Uhr
Ich würde mir dazu mal das Modul Content unter CCK ansehen. Da wird so etwas doch gemacht. Den Code analysieren und nachsehen, mit welchen Funktionen die Felder erzeugt werden.
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Features
am 26.11.2010 - 18:56 Uhr
Hallo.
Wenn Du mit dem Modul einen Inhaltstypen erstellen willst, der keine selbst definierten Feldtypen enthält, kann ich Dir wärmstens das Modul [do:features Features] empfehlen.
Damit kannst Du den Inhaltstypen in ein Modul ("Feature") exportieren und er wird dann automatisch bei der Installation des Moduls angelegt.
hth,
Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Hallo stBorchert, deinen
am 29.11.2010 - 09:03 Uhr
Hallo stBorchert,
deinen Vorschlag ist eine sehr gute Möglichkeit. Danke
Ich werde es aber trozdem weiter versuchen über PHP-Code (CCK-API) die Felder einzufügen. Ich will es einfach wissen wie das geht :)
Das was mich wirklich verwundert, ist die Tatsache, dass man über das Problem keine Infos findet. Das CCK-Handbuch (http://drupal.org/handbook/modules/cck) ist leider nur für User gedacht und nicht für Developer. Aber egal.
Also meine Lösung wäre folgende:
In der content.admin.inc, sollte man sich erstmal content_field_overview_form anschauen.
Create von CCK-Felder geht mit:
function content_field_overview_form_validate($form, &$form_state) {
_content_field_overview_form_validate_add_new($form, $form_state);
_content_field_overview_form_validate_add_existing($form, $form_state);
}
Wenn einer eine einfache Möglichkeit kenn, würde mich sehr freuen es zu erfahren :)
Danke
Wie wäre es mit der Funktion
am 29.11.2010 - 12:06 Uhr
Wie wäre es mit der Funktion content_field_instance_create in content.crud.inc? Du mußt allerding heraus bekommen, welche Werte im $field-array übergeben werden müssen. Diese Funktion erzeugt ein neues CCK-Feld.
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Ja, du hast vollkommen
am 29.11.2010 - 14:41 Uhr
Ja, du hast vollkommen Recht
// Add subtitle field
$field = array();
$field['field_name'] = 'field_subtitle';
$field['type_name'] = 'pproject_news';
$field['type'] = 'text';
$field['module'] = 'text';
$field['required'] = FALSE;
$field['widget_type'] = 'optionwidgets_select';
$field['active'] = TRUE;
content_field_instance_create($field);
$field = content_fields('field_subtitle', 'pproject_news');
$field['widget']['label'] = 'Subtitle';
$field['widget']['weight'] = -3;
$field['widget']['type'] = 'optionwidgets_select';
$field['display_settings']['weight'] = -3;
$field['display_settings']['label']['format'] = 'hidden';
$field['display_settings']['teaser']['format'] = 'default';
$field['display_settings']['full']['format'] = 'default';
content_field_instance_update($field);
Lösung
am 01.12.2010 - 09:17 Uhr
Hallo,
ich will hier das Forum nich zuspammen, aber ich habe mich entschieden die Lösung des Problems zu posten. Der Grund dafür ist, das man sehr sehr wenig Information bzw. dokumenttation über das Problem findet.
Also in folgende beispiel wird zuerst einen CCK-Fieldset erstellt dann wird eine CCK-SelectBox und am Ende wird das CCK-SelectBox dem Fieldset zugeordnet.
function _nnproject_cckfields_install(){
module_load_include('inc', 'content', 'includes/content.crud');
$group = array();
$group['label'] = 'Project options';
$group['group_name'] = 'group_nnproject_projectoptions';
$group['group_option'] = null;
$group['group_type'] = 'standard';
$group['weight'] = 2;
$group['parent'] = null;
$group['settings'] = array();
$group['settings']['form'] = array();
$group['settings']['form']['style'] = 'fieldset_collapsible' ; //'fieldset' 'fieldset_collapsible' 'fieldset_collapsed';
$group['settings']['form']['description'] = null;
$group['settings']['display'] = array();
$group['settings']['display']['description'] = null;
$group['settings']['display']['label'] = 'above';
$group['settings']['display']['teaser'] = array();
$group['settings']['display']['teaser']['format'] = 'fieldset';
$group['settings']['display']['teaser']['exclude'] = 0;
$group['settings']['display']['full'] = array();
$group['settings']['display']['full']['format'] = 'fieldset';
$group['settings']['display']['full']['exclude'] = 0;
fieldgroup_save_group('nnproject', $group);
// TODO: check of modul 'text'
// Add 'Source code license' field
$field = array();
$field['field_name'] = 'field_nnproject_license';
$field['type_name'] = 'nnproject';
$field['description'] = 'Please select a license.';
$field['type'] = 'text';
$field['module'] = 'text';
$field['required'] = FALSE; // Required
$field['widget_type'] = 'optionwidgets_select';
$field['active'] = TRUE;
$field['allowed_values'] = '';
$field['allowed_values_php'] = "return array( 1 => 'Apache License 2.0',
2 => 'Artistic License/GPL',
3 => 'Eclipse Public License 1.0'
);";
content_field_instance_create($field);
$field = content_fields('field_nnproject_license', 'nnproject');
$field['group'] = 'group_nnproject_projectoptions';
$field['multiple'] = 0; // Number of values
$field['max_length'] = null; // Maximum length
$field['widget']['label'] = 'Source code license';
$field['widget']['weight'] = -3;
$field['widget']['type'] = 'optionwidgets_select';
$field['display_settings']['weight'] = -3;
$field['display_settings']['label']['format'] = 'hidden';
$field['display_settings']['teaser']['format'] = 'default';
$field['display_settings']['full']['format'] = 'default';
content_field_instance_update($field);
fieldgroup_update_fields(array('field_name' => 'field_nnproject_license', 'group' => 'group_nnproject_projectoptions', 'type_name' => 'nnproject'));
}