Jump to content

how to delete a page in page field [Multiple pages (PageArray)]


leoric
 Share

Recommended Posts

hi,everyone!

i could add some pages in page field like this:

$user->user_app->add($page1);

$user->user_app->add($page2);

$user->user_app->add($page3);

...etc

$user->save();

 now the issue is  i dont know how to delete one page. 

thanks!

Link to comment
Share on other sites

I think this should work but you can also do

$user->user_app->remove($page);

hi ,soma 

before this i had tried to use "remove" ,but it does not work. so i change to "removeAll"

and i found :

if there have this pages in page field [Multiple pages (PageArray)]:

page1 , page2, page 3..etc

removeall() : will remove all pages      =>    its worked      :rolleyes:

removeall(page1): page1 will be removed. => its worked   :rolleyes:

remove(page1):  nothing changed..   => its not working   :(

Link to comment
Share on other sites

I just looked into this again and there's no argument for removeAll() just for remove($key). 

See here in source https://github.com/ryancramerdesign/ProcessWire/blob/dev/wire/core/WireArray.php#L790

removeAll() removes ALL pages from a Wire/PageArray (pages, images, POST vars etc). So I'm not sure about why it works for you because it shouldn't and also doesn't work for me.

Assuming user_app is a page field allowing multiple pages to be selected. It's a WireArray/PageArray and you add pages to it like this from API:

$user->of(false);
$page1 = $pages->get("/somepage/");
$page2 = $pages->get("/someotherpage/");
$user->user_app->add($page1);
$user->user_app->add($page2);
$user->save();
 

Now we got 2 pages added to the page field.

If you now do a $page->user_app->removeAll($page1) they all get removed so does $user->user_app->removeAll();

But if you do:

$page2 = $pages->get("/someotherpage/");
$user->user_app->remove($page2);
$user->of(false);
$user->save();
 

Now only the $page2 which is in the array gets removed. It works all as expected and make sense.  :rolleyes:

  • Like 6
Link to comment
Share on other sites

I just looked into this again and there's no argument for removeAll() just for remove($key). 

See here in source https://github.com/ryancramerdesign/ProcessWire/blob/dev/wire/core/WireArray.php#L790

removeAll() removes ALL pages from a Wire/PageArray (pages, images, POST vars etc). So I'm not sure about why it works for you because it shouldn't and also doesn't work for me.

Assuming user_app is a page field allowing multiple pages to be selected. It's a WireArray/PageArray and you add pages to it like this from API:

$user->of(false);
$page1 = $pages->get("/somepage/");
$page2 = $pages->get("/someotherpage/");
$user->user_app->add($page1);
$user->user_app->add($page2);
$user->save();
 

Now we got 2 pages added to the page field.

If you now do a $page->user_app->removeAll($page1) they all get removed so does $user->user_app->removeAll();

But if you do:

$page2 = $pages->get("/someotherpage/");
$user->user_app->remove($page2);
$user->of(false);
$user->save();
 

Now only the $page2 which is in the array gets removed. It works all as expected and make sense.  :rolleyes:

@soma ,your reply is very helpful...

my fault: $app is a page id variable, not a $page object.

$removepage = $pages->get($app);          ->  add this line
$user->user_app->remove($removepage);   ->change removeall  to remove   
 
its working ^-^
 

thank you very much!

  • Like 1
Link to comment
Share on other sites

  • 2 months later...

Hey in PW 2.4 I was having a PageArray field assigned to a template. And the operations like has, remove etc

$page->page_array_field->has($id);

$page->page_array_field->remove($id);

If the value is integer it don't remove the value or find a value.  But only passing a real page object removes the value from the db. Or is it still behaving for everyone else ?

Link to comment
Share on other sites

  • 3 years later...

I'm having the same problem. Yet I can not find a solution. How do I change my integer into a real object?

This is my code. According to the docs this should work. Right?

                $u->projectmanagers->add(1044); // THIS WORKS!
                $u->projectmanagers->remove(1044); // THIS DOESNT WORK!
                $u->save();

Only thing I can think of doing is first store the array, then remove all, then remove the one item from the array and then adding the array again. But I'd rather not ;)

Edited by mcwhitey
Wanted to add something
Link to comment
Share on other sites

You can add pages using page objects or page ids, but can only remove them using page objects. A bit inconsistent, to be honest.
So you need to do

$u->projectmanagers->remove($pages->get(1044));

From the core:

// PageArray.php

public function add($page) {
    // ...
    } else if(ctype_digit("$page")) {
        $page = $this->wire('pages')->get("id=$page");
        if($page->id) {
            parent::add($page); 
            $this->numTotal++;
        }
    }
    return $this;
}

public function remove($key) {

    // if a Page object has been passed, determine its key
    if($this->isValidItem($key)) {
        $key = $this->getItemKey($key);
    } 
    if($this->has($key)) {
        parent::remove($key);
        $this->numTotal--;
    }

    return $this; 
}

Edit:

I created a feature request

  • Like 2
Link to comment
Share on other sites

  • 7 months later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...