We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 17422
    • 225 Posts
    Bonjour,

    j’ai créé une boucle php pour modifier l’alias de 1500 resources,

    explication, j’ai un dossier avec 3 niveaux de ressource, au troisième niveau je modifie l’alias.

    avant => alias = pagetitle
    après la boucle => alias = "femme-menage-".$alias

    le hic c’est que j’ai l’impression que le script se fait plusieurs fois

    je me trouve avec

    femme-de-menage-femme-de-menage-femme-de-menage-femme-de-menage-femme-de-menage-pagetitle.html

    <?php
    $parent="4730";
    $c = $modx->newQuery('modResource');
    $c->where(array( 
        'parent' => $parent,
        ));
      $resources = $modx->getCollection('modResource',$c);
    
        foreach ($resources as $resource)
            {
              $id=$resource->get("id");
              $ArrChild=$modx->getChildIds($id);
              $ArrChild=count($ArrChild);
    
              if ($ArrChild > 1) {
                $idparent=$id;
                $c = $modx->newQuery('modResource');
                $c->where(array( 
                    'parent' => $idparent,
                    ));
                $resources2 = $modx->getCollection('modResource',$c);
                    foreach ($resources2 as $resource2)
                        {
                            $id2=$resource2->get("id");
                            $ArrChild2=$modx->getChildIds($id2);
                            $ArrChild2=count($ArrChild2);
                            
                            if ($ArrChild2 >= 1) {
                                $idparent2=$id2;
                                $c = $modx->newQuery('modResource');
                                $c->where(array( 
                                    'parent' => $idparent2,
                                ));
                                $resources3 = $modx->getCollection('modResource',$c);
                                   foreach ($resources3 as $resource3)
                                    {
                                          $alias=$resource3->get("alias");
                                          $idPage=$resource3->get("id");
                                          $doc = $modx->getObject("modResource",array(
                                          "id"=>$idPage
                                         ));
                                        $alias="femme-de-menage-".$alias;
                                        $doc->set('alias',$alias);
                                        $doc->save();
                                    }
                            }
                        }
                }
            }
    return true;​
      • 36404
      • 307 Posts
      Salut,

      ça paraît probable comme tes foreach sont imbriqués l’un dans l’autre
      sur le premier, tout va bien, le second ne s’exécute qu’une fois puisque tu attaques en fait un tableau de 1 élément,
      le deuxième tableau doit en revanche en avoir 5 et, tu exécutes donc 5 fois le foreach à suivre

      sors tes foreach les uns des autres pour les exécuter individuellement et ça devrait rentrer dans l’ordre, en gros un truc du genre
      (fait vite et à la volée mais l’idée est dans les commentaires)
      <?php
      $parent = "4730";
      $c      = $modx->newQuery('modResource');
      $c->where(array(
      	'parent' => $parent,
      ));
      $resources = $modx->getCollection('modResource',$c);
      
      foreach ($resources as $resource)
      {
      	$id       = $resource->get("id");
      	$ArrChild = $modx->getChildIds($id);
      	$ArrChild = count($ArrChild);
      }
      
      if ($ArrChild > 0)
      {
      	$idparent = $id;
      	$c        = $modx->newQuery('modResource');
      	$c->where(array(
      		'parent' => $idparent,
      	));
      	$resources2 = $modx->getCollection('modResource',$c);
      	foreach ($resources2 as $resource2)
      	{
      		$id2       = $resource2->get("id");
      		$ArrChild2 = $modx->getChildIds($id2);
      		$ArrChild2 = count($ArrChild2);
      	}//ferme le deuxième avant de traiter le tableau qui en résulte
      
      	if ($ArrChild2 > 0) {
      		$idparent2 = $id2;
      		$c         = $modx->newQuery('modResource');
      		$c->where(array(
      			'parent' => $idparent2,
      		));
      		$resources3 = $modx->getCollection('modResource',$c);
      		//et là, le foreach de renommage ne devrait s'éxécuter qu'une fois
      		foreach ($resources3 as $resource3)
      		{
      			$alias  = $resource3->get("alias");
      			$idPage = $resource3->get("id");
      			$doc    = $modx->getObject("modResource",array(
      				"id"=>$idPage
      			));
      			$alias = "femme-de-menage-".$alias;
      			$doc->set('alias',$alias);
      			$doc->save();
      		}
      	}
      }
      
      return true;​


      j’espère que ça sera utile à qque chose smiley

      haves swing
        réfléchir avant d'agir