Zaktualizuj wszystkie węzły domyślnym polem po dodaniu nowego pola do typu zawartości

15

Mam istniejący typ zawartości z wieloma węzłami. Właśnie dodałem nowe pole boolowskie z domyślną wartością „off”.

Jednak do momentu ponownego zapisania każdego węzła wartość domyślna nie jest ustawiona, więc widok, który powinien pokazywać tylko te węzły, w których nowe pole używa wartości domyślnej, jest obecnie pusty.

Jak mogę zaktualizować istniejące węzły utworzone przed dodaniem pola, aby ustawić jego wartość domyślną?

DanH
źródło
Rozwiązałem ten problem, korzystając z operacji i reguł w
widoku,
Moduł Resave nodes może pomóc w wymuszeniu aktualizacji węzłów.
Supriya Rajgopal

Odpowiedzi:

9

Niestety, nie ma bardzo prostego sposobu na zrobienie tego (oprócz VBO / reguł), ale oto kod, którego używam w funkcjach aktualizacji w moich plikach instalacyjnych modułu niestandardowego, gdy muszę dodać wartości pól dla określonego typu węzła po dodaniu nowego pola ( w tym przypadku węzły „page”):

<?php
// Get all nodes of 'page' type, populate the field with a value of '1'.
$pages = db_query("SELECT nid, vid FROM {node} WHERE type = 'page'")->fetchAllAssoc('nid');
foreach ($pages as $nid => $values) {
  $fields = array(
    'entity_type' => 'node',
    'bundle' => 'page',
    'deleted' => 0,
    'entity_id' => $values->nid,
    'revision_id' => $values->vid,
    'language' => LANGUAGE_NONE,
    'delta' => 0,
    'field_page_new_field_value' => 1,
  );
  db_insert('field_data_field_page_new_field')
    ->fields($fields)
    ->execute();
  db_insert('field_revision_field_page_new_field')
    ->fields($fields)
    ->execute();
}
?>

Inna metoda ręczna wymieniona w tej odpowiedzi używa EntityFieldQuery i ładuje / zapisuje każdy węzeł. Więcej Drupal-y, ale znacznie mniej wydajne ... (wymaga pełnego załadowania węzła i zapisania operacji dla każdego węzła!).

geerlingguy
źródło
To bardzo smutne
AlxVallejo
Czy widziałeś moduł Field Defaults? dgo.to/field_defaults
las
Jest to błąd , aby uruchomić kod jak również to bez spłukiwania wszystkich dotkniętych węzłów z pamięci podręcznej obciążenia jednostki: entity_get_controller('node')->resetCache($nids);- w przeciwnym razie kolejna node_load()może załadować nieaktualne dane z pamięci podręcznej, a wszelkie node_save()tego obiektu byłoby napisać , że dane nieświeży powrotem do bazy danych.
phils
2

Najlepszy zakład znajduje się bezpośrednio w MySQl. Tabele wyglądałyby następująco:

field_data_field_newbooleanfieldname
field_revision_field_newbooleanfieldname

Jeśli spojrzysz na nie, jest to całkiem proste - czy potrzebujesz mnie, aby zacząć od tego, jak będzie wyglądać zapytanie, czy wszystko w porządku?

Mikrofon
źródło
Dzięki Mike, nie, to nie jest problem, naprawdę potrafię poradzić sobie z SQL. Po prostu wydaje mi się, że powinna istnieć opcja „ponownego zapisania” lub coś dostarczonego jako operacja zbiorcza, myślę, że mógłbym w tym celu spojrzeć na integrację VBO i reguł.
DanH
Zrozumiany. Jestem w podobnej sytuacji, migruję około 30 000 artykułów z innego CMS do Drupal. Nie widziałem sensu dodawania kolejnego modułu, gdy SQL był szybki i brudny. Być może możesz także napisać szybką funkcję, która wywołałaby node_load () dla wszystkich twoich węzłów, która też może działać.
Mike
0

Po prostu wypróbuj poniższą logikę. jest znacznie szybszy i omija wszystkie implementacje haczykowe. więcej szczegółów . możesz napisać proste bezpośrednie zapytanie db_select, aby uzyskać wszystkie identyfikatory NID i zapętlić je za pomocą tego przykładowego kodu.

$node = new stdClass();
$node->nid = $val;
$node->type = 'NODETYPE';
$node-field_whatever[LANGUAGE_NONE][0]['value'] = 'VALUE';
field_attach_presave('node', $node);
field_attach_update('node', $node);
nadeesha metthananda
źródło
0

używając sql, biorąc pod uwagę, że węzły z wartością pola nie są ustawione

SELECT nid,vid
 from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

field_data_field_pr_choix_du_document będący tabelą odpowiadającą mojemu polu i zawierającą jeden zestaw wartości pozycji par z identyfikatorem bytu odnoszącym się do węzła

zrobiłem przy użyciu wstawiania SQL ... wybierz składnię

https://dev.mysql.com/doc/refman/5.5/en/insert-select.html

INSERT INTO `field_data_field_pr_choix_du_document` (`entity_type`, `bundle`, `deleted`, `entity_id`, `revision_id`, `language`, `delta`, `field_pr_choix_du_document_value`)
SELECT 'node','procedure',0,nid,vid,'und',0,'Importer un document'
from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)
Matoeil
źródło
0

Zainstaluj i włącz moduł Views Bulk Operations i utwórz widok z wyświetlaniem strony.

Dodaj => Operacje zbiorcze: pole Treść (treść) w widoku.

Odnosić się

wprowadź opis zdjęcia tutaj

Wybierz pola, które chcesz ustawić wartość domyślną.

Zapisz widok i przejdź do utworzonej strony. Jeśli masz więcej niż jedną stronę wyników, możesz wybrać wszystkie elementy na bieżącej stronie, wszystkie elementy na wszystkich stronach lub możesz ręcznie zaznaczyć pola odpowiadające poszczególnym węzłom. Aby kontynuować, należy zaznaczyć przynajmniej jedno pole wyboru.

Teraz ustawiasz wartość domyślną i zapisujesz ją.

DRUPWAY
źródło
0

Znalazłem prosty sposób na aktualizację pól w typie zawartości za pomocą tego modułu: Domyślne pola

Zobacz zrzut ekranu. Możesz zaktualizować istniejącą zawartość o wartości domyślne lub zachować istniejące wartości.

Przetestowałem to na D7 i działa.

wprowadź opis zdjęcia tutaj

Sébastien Gicquel
źródło