ProcessWire - Page Object: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
 
Zeile 116: Zeile 116:
 
In PHP8.3 ist es nicht mehr möglich in einem Objekt einfach dynamisch Variablen zu hinterlegen.  
 
In PHP8.3 ist es nicht mehr möglich in einem Objekt einfach dynamisch Variablen zu hinterlegen.  
 
Sprich so etwas (in einigen Templates von mir genutzt) funktioniert nicht mehr:
 
Sprich so etwas (in einigen Templates von mir genutzt) funktioniert nicht mehr:
 +
 
  page()->homepage = pages()->get('/'); // not working anymore
 
  page()->homepage = pages()->get('/'); // not working anymore
 +
 
Das Page Objekt hat aber eine set() Funktion mit der man trotzdem dynamisch Properties setzen kann:
 
Das Page Objekt hat aber eine set() Funktion mit der man trotzdem dynamisch Properties setzen kann:
 +
 +
<syntaxhighlight lang="php">
 
  page()->set('homepage',pages()->get('/')); // works in php 8.3
 
  page()->set('homepage',pages()->get('/')); // works in php 8.3
 +
</syntaxhighlight>
 +
 
Das Pages Objekt hat leider keine solche Funktion. Aber man kann fast immer page()->set() oder $page->set() nutzen.
 
Das Pages Objekt hat leider keine solche Funktion. Aber man kann fast immer page()->set() oder $page->set() nutzen.
 
Alternativ kann man z.B. eigene Klassen nutzen um etwas zu speichern und diese Global zugänglich machen.
 
Alternativ kann man z.B. eigene Klassen nutzen um etwas zu speichern und diese Global zugänglich machen.

Aktuelle Version vom 11. April 2024, 17:23 Uhr

Links[Bearbeiten]

https://processwire.com/api/ref/page/

Einführung[Bearbeiten]

Das Page Objekt enthält alle Daten einer Seite. Normalerweise kann man bei der Arbeit mit Templates direkt

$page

Das $pages Objekt liefert Funktionen mit denen man Seiten durchsuchen kann. schreiben um auf die aktuelle Seite zuzugreifen. Wenn man das Feld einer aktuellen Seite abrufen möchte kann man das dann z.B. so machen echo $page->title

Wichtige Funktionen[Bearbeiten]

find()[Bearbeiten]

https://processwire.com/api/ref/pages/find/

Findet Seiten und gibt diese als PageArray zurück. Mit den Optionen kann man aber auch nur die Seitenids zurückgeben

findOne[Bearbeiten]

https://processwire.com/api/ref/pages/find-one/

$blogPost = $pages->findOne("template=blog-post, sort=-created");

Im Gegensatz zu $pages->find() liefert findeOne kein Array sondern direkt ein Seitenobjekt. Spart arbeit wenn man nur ein Ergebnis braucht.

Seiten holen[Bearbeiten]

Im einfachsten Fall kann man Seitenobjekte über Get abrufen

// Get a page by ID
$p = $pages->get(1234);

// Get a page by path
$p = $pages->get('/about/contact/');

// Get a random 'skyscraper' page by selector string
$p = $pages->get('template=skyscraper, sort=random');

Über einen Selektor, wie im letzten Beispiel, kann man schnell Seiten abfragen (siehe ProcessWire - Selectors)

Aktuelle Seite[Bearbeiten]

Innerhalb der normalen Templates hat man über $page Zugriff auf die aktuelle Seite

$meineSeite = $page;

Wenn $page für die aktuelle Seite nicht zur Verfügung steht (z.B. in Modulen) kann man sich über das wire Objekt die aktuelle Seite eines Nutzers holen:

$page = wire("page");
$t = $page->title;

Seiten modifizieren oder erstellen[Bearbeiten]

Wenn die Seite noch nicht vorhanden ist wird sie mit save() automatisch erstellt. Wenn Sie existiert upgedatet.

Man kann auch nur ein spezifisches Feld einer Seite speichern.

// Modify a page and save it
$p = $pages->get('/festivals/decatur/beer/');
$p->of(false); // turn off output formatting, if it's on
$p->title = "Decatur Beer Festival";
$p->summary = "Come and enjoy fine beer and good company at the Decatur Beer Festival.";
$pages->save($p); // Same as $p->save();
$page->save($fieldName); // save a specific Field

Neue Seiten erzeugen[Bearbeiten]

$fields = array('title', 'vorname', 'plz', [...]);
$values = array("Mein Titel","Max","D72810");
// fill fieldnames i.e. from database query...
list($oe_id, $oe_nl_name, $oe_plz, [...]) = $row;

$p = new Page();
$p->template = "templatename";
$p->parent = $parentId;// Elternseite
$p->title = "Titel der Seite";
$p->of(false);
if(!$p->save()) echo "Seite konnte nicht gespeichert werden";

// populate fields
$p->vorname = "Max";
$p->[feldname] = "Inhalt des Feldes";
$p->save();

wire('pages') und $pages[Bearbeiten]

Innerhalb von Templates kann man in der Regel auf $pages für alle Seiten und auf $page für die aktuelle Seite zugreifen.

Anderswo geht das nicht, aber innerhalb von ProcessWire kann man denoch über

wire()->pages

oder

wire('pages') 

auf das Seitenobjekt zugreifen.

NullPage[Bearbeiten]

Viele Funktionen geben ein NullPage Objekt zurück wenn keine Seite gefunden wurde.

if(!$item->id) {
  // this is a NullPage
}

if($item instanceof NullPage) {
  // this is a NullPage
}

Seitenstatus[Bearbeiten]

The page statuses are a bitmask so it's possible for there to be multiple statuses on a page, like unpublished and hidden. So it's best to add and remove statuses with the addStatus and removeStatus functions, i.e.

$page->addStatus(Page::statusUnpublished); 
// same as:
$page->status = $page->status | Page::statusUnpublished; 

$page->removeStatus(Page::statusHidden); 
// same as:
$page->status = $page->status & ~Page::statusHidden;
You can also check the status of a page by using the is() function:

if($page->is(Page::statusUnpublished)) { ... }
// same as
if($page->status & Page::statusUnpublished) { ... }

Page Objekt manipulieren[Bearbeiten]

Variablen in Page Objekt speichern[Bearbeiten]

In PHP8.3 ist es nicht mehr möglich in einem Objekt einfach dynamisch Variablen zu hinterlegen. Sprich so etwas (in einigen Templates von mir genutzt) funktioniert nicht mehr:

page()->homepage = pages()->get('/'); // not working anymore

Das Page Objekt hat aber eine set() Funktion mit der man trotzdem dynamisch Properties setzen kann:

 page()->set('homepage',pages()->get('/')); // works in php 8.3

Das Pages Objekt hat leider keine solche Funktion. Aber man kann fast immer page()->set() oder $page->set() nutzen. Alternativ kann man z.B. eigene Klassen nutzen um etwas zu speichern und diese Global zugänglich machen.

global $site;// site ist defined in your own class
$site = new Site( pages()->get('/site-configuration/') );