Jak vytvářet typy obsahu a CCK políčka v modulu?
Určitě jste se setkali s tím, že musíte vytvořit nějaký modul, společně s typem obsahu, nicméně nechcete typ obsahu klikat na webu, který poté dáte zákazníkovi. Proto je občas vhodné vytvořit samotný typ obsahu přímo při instalaci modulu (Pokud nepoužíváte Features). Jak na to? (Stejně pro CCK políčka).
(Původně publikováno na Blogu Dynamite Heads)
Celý postup je velice jednoduchý:
Krok 1
Naklikejte typ obsahu standardně na webu, včetně CCK polí. Zapněte modul Content Copy a typ obsahu exportujte. Výsledek uložte do souboru jmenomodulu.content.crud.inc (nezapomeňte přidat <?php na začátek).
Krok 2
V .info souboru modulu přidejte závislosti:
<?php
dependencies[] = content
dependencies[] = content_copy
dependencies[] = další CCK moduly
?>
Krok 3
V .install souboru implementujte hook_install() a dejte do něj:
<?php
$content = array();
include "yourmodule.content.crud.inc";
$form_state = array();
$form = content_copy_import_form($form_state, $type_name);
$form_state['values']['type_name'] = $type_name ? $type_name : '';
$form_state['values']['macro'] = '$content = '. var_export($content, 1) .';';
$form_state['values']['op'] = t('Import');
content_copy_import_form_submit($form, $form_state);
?>
Hotovo :-) Jakmile modul zapnete (pozor, jakmile byl už někdy zapnutý a vy ho jen deaktivovali, tak se hook_install nespouští), provede modul vytvoření typu obsahu, včetně CCK polí.
Zbývá už jen dodat, že Features jsou již dnes většinou lepší cestou…
Ahoj, dobry postup, myslim
Ahoj,
dobry postup, myslim vsak, ze zaroven sa vytvara aj node type.
Avsak ak node type definujem cez HOOK_node_info() napr. zdovodu ze chcem vyuzit HOOK_node_grants() / HOOK_node_access_records(), v case instalacie este tento node type neexistuje, a teda sa dane cck polia nevytvoria.
Riesil som to tak, ze cck polia vytvaram v HOOK_node_type(), kde $op == ‚insert‘, a to cez content_field_instance_create(), pricom vstupny parameter je var_export pola, ktore som ziskal z content_fields(). Nie je to vsak uplne optimalne, kedze HOOK_node_type() pre operator insert sa spusta nie len pri instalacii modulu, ale v podstate zakazdym ked sa zavola node_types_rebuild(). Cize je potrebne kontrolovat ci cck pole uz nebolo vytvorene, a tiez to zo sebou prinasa ine problemy.
Chcem sa opytat, ci vas nenapada vhodnejsie riesenie (samozrejme okrem features) vytvarania cck poli pre node types, ktore su vlastne konkretnemu modulu.
Poslat nový komentář