Bir açılış sayfasına bir "düğüm ekleme" formu gömmek için bir yol arıyorum. Form Bloğu kullanıyordum , ancak bir geliştirme anlık görüntü sürümü kullandığım için birçok hata getiriyor gibi görünüyor.
Bir açılış sayfasına bir "düğüm ekleme" formu gömmek için bir yol arıyorum. Form Bloğu kullanıyordum , ancak bir geliştirme anlık görüntü sürümü kullandığım için birçok hata getiriyor gibi görünüyor.
Yanıtlar:
Kullanabilirsiniz:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
node_add()
Tanımsız bir hata alırsanız if (!function_exists('node_add')) { module_load_include('inc', 'node', 'node.pages'); }
, başlangıçta eklemek istersiniz . Bu bilgi buradan gelir: ( kahthong.com/2012/01/embed-drupal-node-form-anywhere )
Daniel Wehner'ın cevabı kesinlikle doğru ve işe yarıyor olsa da, bu yaklaşımla karşılaştığım iki yaygın sorunu eklemek istedim ve bu sorunların üstesinden nasıl geldiğime dair geçici çözümler var. Önce kodum, sonra açıklamalar:
global $user;
module_load_include('inc', 'node', 'node.pages');
$node = (object) array(
'uid' => $user->uid,
'name' => (isset($user->name) ? $user->name : ''),
'type' => 'YOUR_NODE_TYPE',
'language' => LANGUAGE_NONE,
);
$form = drupal_get_form('YOUR_NODE_TYPE . '_node_form', $node);
print drupal_render($form)
Neden Daniel'in basit yerine bu şekilde yaptım node_add
?
Sorun 1: node_add()
işlev sayfa başlığını 'düğüm türü' oluştur olarak değiştirir , bu işlevde sabit olarak kodlanmıştır.
Geçici Çözüm 1: node_add
İşlev yerine , kodu kopyaladım ve kaldırdım drupal_set_title
. Yukarıdaki kod, node_add
bu tek satır hariç , işlevle aynı koddur .
Sorun 2: Gömülü formda bazı ajax işlevleri çalışmadı. Örneğin, sınırsız değerleri olabilen bir alanınız varsa, 'Başka bir öğe ekle' düğmesine sahip olmanız veya formunuzda bir yükleme dosyası alanı varsa, bunlar çalışmaz.
Geçici Çözüm 2: Özel modülünüzde hook_menu_alter()
ajax çağrı yolları için uygulayın ve ekleyin node.pages.inc
.
function YOURMODULE_menu_alter(&$items) {
$items['file/ajax']['file path'] = drupal_get_path('module', 'node');
$items['file/ajax']['file'] = 'node.pages.inc';
$items['system/ajax']['file path'] = drupal_get_path('module', 'node');
$items['system/ajax']['file'] = 'node.pages.inc';
}
function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
Kabul edilen cevap kodunu kullanırsam ...
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
... bir sayfa geri çağırma işlevi içinde, print drupal_render..
bu tamamen temalı (bozuk görünümlü) bir sayfa ile sonuçlanır.
Bunun yerine, sadece return
'ed $form
:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;