Bir alanın değerini programlı olarak güncelleme


14

Bir düğüm güncellendiğinde bir düğüm alanının değerini güncellemek istiyorum.

Burada belirtilen kodu kullanarak denedim Drupal 8 düğümünü programlama yoluyla güncelleme

use Drupal\node\Entity\Node;

    function hello_world_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {

      $check = \Drupal::routeMatch()->getParameter('node');

      if ($check) {
      $node = Node::load($check->nid->value);
      $node->title->value = 'testing';     //set value for field
      $node->save();
      }
    }

Ama çalışmadı. Düğümü kaydettikten sonra 500 hatası alıyorum. Ayrıca if ifadesini alıp bir düğüm kimliği belirtmeyi denedim$node = Node::load(1);

Ben de Drupal 8 programsal olarak bir düğüm / Varlık Güncelleştirmeyi kullanmayı denedim

use Drupal\node\Entity\Node;


function hello_world_node_update(Drupal\node\NodeInterface $node) {

$node = Node::load(1);
$node->set("title", 'New value'); // also tried $node->setTitle('The new Title');
$node->save();

}

ama şans da yok.

Buna ek olarak, farklı kanca varlık_presave, entity_update, node_update kullanmayı denedim, ancak herhangi bir fark yaratmadı.

Yanıtlar:


25

Bu kodu deneyebilirsiniz:

function MODULE_NAME_node_presave(Drupal\node\NodeInterface $node) {
  $node->setTitle('new Title');
  $node->set('body', 'this is body');
}

Bu işe yaradığı için teşekkürler, eğer başka olası varyasyonlar eklemek istiyorsa, başka bir cevap eklemekten çekinmeyin.
Hayır Sssweat

1
@NoSssweat: Bu cevapta gösterilen kodda "gövde" ile satır gerçekten sorunuzu cevaplamak için gerekli olmadığını varsayarak haklı mıyım? Ve bu çizgi daha çok (ör. Beden) ile benzer şeyleri nasıl yapabileceğinizi gösteriyor. Ayrıca, sorunuz "alan" ile ilgili olduğundan, özel bir alan için "gövde" satırına benzer bir satır, makine adı (diyelim) field_my_extra_field? Yeni sorular sormak için bir cevabı kaçırmak gibi görünen şey için özür dilerim, ama sadece bir cevapta "kod gösterme" (hiçbir açıklama olmadan) burada da iyi bir uygulama olarak algılanmıyor, değil mi?
Pierre.Vriens

1
@ Pierre.Vriens Sadelik için Q'umda başlık kullandım. Başlığın nasıl değiştirileceğini bilsem, herhangi bir alan için aynı olacağını, sadece makine adını değiştireceğini düşündüm. Bu cevabın, başka bir alan için işe yaramayacak başlığı değiştirmek için belirli bir yöntem kullandığını ortaya koyuyor, bu yüzden vücut için yöntemi göstermesi gerçekten önemlidir.
Sssweat yok

Bu kancayı ateşe veremiyorum. Bir içerik türünü düzenlerim, gönder'i tıklayın, ancak hiçbir şey yapmıyorum.
Bay Pablo

7

Bu, başlangıçta kullanmaya çalıştığınız kancayı kullanmanın başka bir varyasyonu.

Kodunuzla ilgili sorun, düğümün yeni bir örneğini yüklemeye çalışmanızdır, ancak parametre olarak sağlanan düğümü kullanmanız gerektiğidir $entity:

use Drupal\node\NodeInterface;

function hello_world_entity_presave(Drupal\Core\Entity\EntityInterface $entity)   {
  if ($entity instanceof NodeInterface) {
    $entity->title->value = 'testing';     //set value for field
    // $entity->save(); (not needed)
  }
}

Düzenle:

Koda use deyimi eklendi.


1
sadece kodunu denedim, ama siteyi kırıyor, klasik oluyorThe website encountered an unexpected error. Please try again later.
Hayır Sssweat

1
Bu kod sadece kancanın nasıl kullanılacağını göstermek içindir. Doğru kullanım ifadelerine ihtiyacınız var. Watchdog'a bakarsanız (/ admin / raporlar / dblog) bunu öğrenebilirsiniz.
4k4

1
use Drupal\node\NodeInterface;kod eklemek artık siteyi otomatik olarak kesmiyor, ancak düğümü kaydettikten sonra sorumu alıyorum gibi 500 hatasını alıyorum ve günlükler bu konuda bir şey kaydetmiyor.
Hayır Sssweat

1
Yalnızca soruna işaret etmek istedim: Düğümün yeni bir örneğini yüklemeyin, ancak işlev parametresi olarak sağlananı kullanın. 500'ün arkasında ne hata var? Lütfen günlük dosyalarınızı kontrol edin veya hata günlük kaydını açın.
4k4

1
Günlüğü
temizliyorum

3

Drupal 8'deki başlıklar standart alanlar gibi ayarlanmamıştır; kendi işlevleri var. $node->setTitle('New Title');Bir düğüm veya $entity->setLabel('New Title');genel bir varlık için kullanın . Daha fazla bilgi için bkz. Düğüm :: setTitle .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.