Search the FirstSpirit Knowledge Base
Hallo Community,
ist es möglich einen Inhaltsbereich einer Seite zu entfernen, so dass auch aktuell vorhandene Inhalte an den Seiten verworfen werden? Aktuell bekomme ich die Meldung, dass der Inhalt "retained" wird. Dieser wird mir auch weiterhin angezeigt und der Bereich verschwindet nicht.
Wir würden hier gern unseren Redakteuren die Arbeit ersparen, dass alle alten Inhalte von Hand entfernt werden müssen.
beste Grüße
Jan Bogutzki
Hallo Jan,
erstelle einfach ein neues Skript im Projekt (Typ "Menü") mit folgendem Inhalt:
import de.espirit.firstspirit.agency.StoreElementAgent;
import de.espirit.firstspirit.access.store.IDProvider;
import de.espirit.firstspirit.access.store.IDProvider.UidType;
import de.espirit.firstspirit.access.ReferenceEntry;
import de.espirit.firstspirit.access.store.pagestore.Body;
import de.espirit.firstspirit.access.store.pagestore.Page;
// Der Referenzname deines Templates
final String TEMPLATE_UID = "pt_page";
// Der Referenzname des Inhaltbereichs
final String BODY_UID = "content";
StoreElementAgent agent = context.requireSpecialist(StoreElementAgent.TYPE);
IDProvider template = agent.loadStoreElement(TEMPLATE_UID, UidType.TEMPLATESTORE, false);
for (ReferenceEntry ref :template.getIncomingReferences()){
if (ref.isType(ReferenceEntry.PAGE_STORE_REFERENCE)) {
// Hole die Page über den Agent, da man sie sonst aus dem Releasestore erhält.
Page page = (Page) agent.loadStoreElement(ref.getReferencedElement().getUid(), UidType.PAGESTORE, false);
Body body = page.getBodyByName(BODY_UID);
if (body!=null) {
// Seite bearbeiten, Bereich löschen, Speichern, freigeben und Bearbeitung beenden.
page.setLock(true, true);
body.delete();
page.save("Removed body " + BODY_UID);
page.release();
page.setLock(false, true);
}
}
}
Ich habe das gerade auf dem Smartphone runtergetippt - also kann es gut sein, dass hier und da ein Schreibfehler o. ä . ist oder die Packagenames nicht komplett stimmen.
Bei TEMPLATE_UID trägst du die UID der Seitenvorlage ein, bei BODY_UID den Referenznamen des Inhaltbereichs.
In Zeile 27-31 wird die Seite bearbeitet und im Anschluss gespeichert und freigegeben. Bedenke hierbei bitte, dass dein User dann als letzter Bearbeiter drin steht und die Seite zudem einfach so freigegeben wird. An dieser Stelle könntest du ggf. noch eine Prüfung einfügen, ob die Seite aktuell bereits freigegeben ist. Zudem fange ich keine Validierungsfehler ab - ist die Seite also nciht valide, so kann sie auch nicht gespeichert werden und das Skript schlägt fehl. Wenn du noch Hilfe brauchst sage Bescheid.
Viele Grüße
Felix
Hallo Jan,
meinst du mit "inhaltsbereich aus der Seite entfernen" ihn aus dem seitentemplate zu entfernen? Wenn ja, so musst du nach dem Löschen noch rechtsklick auf die Vorlage machen und "Übernahme von Vorlageänderungen" wählen, damit die Änderung auch auf die Seiten angewendet wird. (ich glaube der Punkt heißt so - bin gerade unterwegs und habe kein FS zur Hand
Gruß
Felix
Hallo Felix,
ja, genau das ist gemeint. Das ist der Teil den ich bereits gemacht habe. Bei der Anwendung kommen dann die Meldungen, dass die Inhaltsbereiche bei Seite mit Content darin erhalten bleiben (retained). Sprich die Bereiche sind bei allen Seiten weg, die keinen Inhalt gepflegt haben, bei denen mit Inhalt leider nicht.
Gruß
Jan
Oha, ich wäre wirklich davon ausgegangen, dass durch die Übernahme der Vorlagenänderungen diese Inhalte spätestens nach einer erneuten Freigabe der Seite verschwinden. Dann würde ich davon ausgehen, dass man diese leider doch per Skript löschen muss.Wenn du da Hilfe brauchst sage Bescheid - das geht ziemlich fix.
Gruß
Felix
Hallo Felix,
dann sage ich mal "Bescheid". 🙂
Gruß
Jan
Hallo Jan,
erstelle einfach ein neues Skript im Projekt (Typ "Menü") mit folgendem Inhalt:
import de.espirit.firstspirit.agency.StoreElementAgent;
import de.espirit.firstspirit.access.store.IDProvider;
import de.espirit.firstspirit.access.store.IDProvider.UidType;
import de.espirit.firstspirit.access.ReferenceEntry;
import de.espirit.firstspirit.access.store.pagestore.Body;
import de.espirit.firstspirit.access.store.pagestore.Page;
// Der Referenzname deines Templates
final String TEMPLATE_UID = "pt_page";
// Der Referenzname des Inhaltbereichs
final String BODY_UID = "content";
StoreElementAgent agent = context.requireSpecialist(StoreElementAgent.TYPE);
IDProvider template = agent.loadStoreElement(TEMPLATE_UID, UidType.TEMPLATESTORE, false);
for (ReferenceEntry ref :template.getIncomingReferences()){
if (ref.isType(ReferenceEntry.PAGE_STORE_REFERENCE)) {
// Hole die Page über den Agent, da man sie sonst aus dem Releasestore erhält.
Page page = (Page) agent.loadStoreElement(ref.getReferencedElement().getUid(), UidType.PAGESTORE, false);
Body body = page.getBodyByName(BODY_UID);
if (body!=null) {
// Seite bearbeiten, Bereich löschen, Speichern, freigeben und Bearbeitung beenden.
page.setLock(true, true);
body.delete();
page.save("Removed body " + BODY_UID);
page.release();
page.setLock(false, true);
}
}
}
Ich habe das gerade auf dem Smartphone runtergetippt - also kann es gut sein, dass hier und da ein Schreibfehler o. ä . ist oder die Packagenames nicht komplett stimmen.
Bei TEMPLATE_UID trägst du die UID der Seitenvorlage ein, bei BODY_UID den Referenznamen des Inhaltbereichs.
In Zeile 27-31 wird die Seite bearbeitet und im Anschluss gespeichert und freigegeben. Bedenke hierbei bitte, dass dein User dann als letzter Bearbeiter drin steht und die Seite zudem einfach so freigegeben wird. An dieser Stelle könntest du ggf. noch eine Prüfung einfügen, ob die Seite aktuell bereits freigegeben ist. Zudem fange ich keine Validierungsfehler ab - ist die Seite also nciht valide, so kann sie auch nicht gespeichert werden und das Skript schlägt fehl. Wenn du noch Hilfe brauchst sage Bescheid.
Viele Grüße
Felix
Hallo Felix,
danke für die schnelle Hilfe. In unserem DEV-System hat das alles schon super geklappt.
Gruß
Jan