Jump to content

dfile

Members
  • Posts

    9
  • Joined

  • Last visited

Posts posted by dfile

  1. Thanks for your feedback.

    I ended up doing this:
    For each product I store the parend category for each category in the page reference field. This way I can easy count all products in the parent category.

    $this->addHookBefore('Pages::saved', function(HookEvent $event) {
    $pages = $event->object;
    $page = $event->arguments(0);
    
    	if($page->template == 'produkt') {
    		//remove parent kategorie
    		foreach($page->pro_kategorie_parent as $item) {
    			$page->pro_kategorie_parent->remove($item);
    		}
    		$page->save(pro_kategorie_parent);
    		
    		foreach($page->pro_raeume_parent as $item) {
    			$page->pro_raeume_parent->remove($item);
    		}
    		$page->save(pro_raeume_parent);
    		
    		//add parent kategorie
    		if ($page->pro_kategorie){
    			foreach($page->pro_kategorie as $item) {
    			$cat_parent=$item->parent;
    			$page->setAndSave(pro_kategorie_parent, $cat_parent);
    			}
    		}
    		if ($page->pro_raeume){
    			foreach($page->pro_raeume as $item) {
    			$raum_parent=$item->parent;
    			$page->setAndSave(pro_raeume_parent, $raum_parent);
    			}
    		}
    	}
    });

    435213912_Screenshot2020-11-06110029.jpg.f7942dab4bff598b1cbd8557870f462c.jpg

  2. The page reference field (pro_kategorie) have only the level 3 category.
    Here i can count the products, but then i have to go up to  level 2  and
    add all products in all level 3 categories to the count of level 2.

    Sorry if that was not clear.

     I have to search the categories from bottom to top like this
    $parentId=$pages->find($id)->parent();
    this doesn't make things easy in processwire, or did I miss something?

  3. 1 hour ago, Matzn said:

    Hi,

    use $pages->count https://processwire.com/api/ref/pages/count/ 

    for each category like:

    
    $cnt = $pages->count('parent=yourCategory,id=yourProductId');

     

    yes, i know count, so far i have this result, but only for level 3 of the categories:

    //categories level3
    $kategorienId=getCategoryLevel3($page);
    
    $produktCount=WireArray();
    
    foreach ($kategorienId as $id){
        $count=$pages->count("template=produkt, pro_kategorie=$id");
        $produktCount->add($count);
    }
    $kategorienId->data('count', $produktCount);
    
    var_dump($kategorienId->data('count'));

    and this is the ugly function getCategoryLevel3:

    function getCategoryLevel3($page){
        $pages=wire('pages');
        $id=WireArray();
        $p='';
        $data='';
        if ($page->children!=''){
            $children=$page->children;
            //level2
            foreach($children as $children2){    
                if($children2->children!=''){
                    //level3
                    foreach($children2->children as $children3){
                        if($children3->children!=''){
                            foreach($children3->children as $child3){
                                //level3 add id    
                                $id->add($child3->id);
                            }
                        }
                    }
                }
            }
        }
        return $id;
    }

    there is a better way to do this?
    I also need the number of products for level2 and level1.

  4. Hello, i must count products per category like so:

    category 1 (4 products)
    --category 1.1 (2 products)
    ----category 1.1.1 (1 product)

    and so on.

    category 1
    --category 1.1
    ----category 1.1.1
    ----category 1.1.2
    ----category 1.1.3
    
    --category 1.2
    ----category 1.2.1
    ----category 1.2.2
    ----category 1.2.3

    produkts have page references for the categories:

    product 1
    -- page reference->category 1.1.1
    -- page reference->category 1.1.3
    -- page reference->category 1.2.2
    -- page reference->category 1.2.3

    what is the best way to do this, i have many categories and many many products.
    Thank you.

     

  5. i edit the render function in ProcessPageListRenderJSON.php

    	public function render() {
    
    		$children = array();
    
    		###############################################
    		$toBottom=array(
    		//system, login ###################################
    			1088,
    			1036,
    			);
    
    		$bottomPages=array(); // pages forced to bottom of list
    		$extraPages = array(); // pages forced to bottom of list
    
    		foreach($this->children as $page) {
    			if(!$this->superuser && !$page->listable()) continue;
    
    			if(in_array($page->id, $this->systemIDs)) {
    				$extraPages[] = $page;
    				continue;
    			}
    			
    			if(in_array($page->id,$toBottom)) {
    				$bottomPages[] = $page;
    				continue;
    
    			}	
    	
    			$child = $this->renderChild($page);
    			$children[] = $child;
    
    		}
    
    		foreach($bottomPages as $page) { //bottomPages
    			$children[] = $this->renderChild($page);
    		}
    
    		if($this->superuser) foreach($extraPages as $page) {//extraPages 
    			$children[] = $this->renderChild($page);
    		}
    

    that works for me.

  6. Hello! I'm new here and have a question:

    i want to force pages to stay at the bottom of the pagetree:

    pw-forum.png

    I edit the ProcessPageListRenderJSON.php and it works.

    class ProcessPageListRenderJSON extends ProcessPageListRender {
    
    	protected $systemIDs = array();
    
    	public function __construct(Page $page, PageArray $children) {
    
    		parent::__construct($page, $children);
    
    		$this->systemIDs = array(
    			$this->config->http404PageID,
    			$this->config->adminRootPageID,
    			$this->config->trashPageID,
    			$this->config->loginPageID,
    			//system login ####################################################
    			1088,
    			1036,
    			###################################################################
    		);
    	}
    

    Is there a way to do this without hardcode it in the ProcessPageListRenderJSON.php?

×
×
  • Create New...