Kesinlikle giderdim field_attach_update
.
Fikir basit. Düğümü yükleyin ve field_attach_update öğesini kullanarak kaydedin.
Ör:
$node = node_load($nid);
$node->field_name[LANGUAGE_NONE][0]['value'] = 'New value';
field_attach_presave('node', $node);
field_attach_update('node', $node);
// Clear the static loading cache.
entity_get_controller('node')->resetCache(array($node->nid));
Bu, node_save işlevinin genellikle çağırdığı hiçbir zaman damgasını veya başka bir kancayı değiştirmez. Düğümü yüklemek de bazı kancaları çağıracaktır, bu yüzden muhtemelen o kadar verimli değildir.
Nid değerine sahipseniz ve düğüm yapısı basitse, bunu şu şekilde de yapabilirsiniz:
$node = new stdClass();
$node->nid = $nid; // Enter the nid taken. Make sure it exists.
$node->type = 'article';
$node->field_name[LANGUAGE_NONE][0]['value'] = 'New value';
field_attach_presave('node', $node);
field_attach_update('node', $node);
// Clear the static loading cache.
entity_get_controller('node')->resetCache(array($node->nid));
Her neyse, alanlar dışında bir şey güncellemeye çalışıyorsanız, bu işe yaramaz (yorum durumu, yayınlanmış durum, vb.). Ayrıca node_save kullanıyorsanız, belirli bir düğümün önbelleği, 'entity_get_controller' ile temizlememiz gereken farklı yöntemler için otomatik olarak temizlenir.
Güncelleme:
Görünüşe göre, field_attach_presave()
diğer modüllerin alan girişini doğru şekilde işlemesine izin vermeniz gerekir . Örneğin dosya modülü, bu kancayı kullanarak dosya durumunu kalıcı olarak ayarlamak için kullanır. Yukarıdaki 2 örneğimi güncelledim.
field_attach_update
?