Как скопировать родителя вместе с детьми и сохранить при этом alias и pagetitle?

Приветствую друзья! Подскажите есть ли способ в MODX REVO как сопировать ресурс вместе с его детьми и что бы alias и pagetitle у новых ресурсов скопировались тоже? А то при копировании, pagetitle у всех становиться в начале строки добавляет Копия ресурса… и дальше уже наш pagetitle :( прям беда. И у всех детей тоже так же заголовок, и алиасы тоже меняются.
Роман
16 августа 2023, 17:35
modx.pro
623
0

Комментарии: 14

Андрей
16 августа 2023, 18:35
0
Можно простенький плагин накатать:
<?php
if ($modx->event->name=="OnDocFormSave"){ 
    $id = $resource->get('id');
    $pages = $modx->getIterator('modResource', array('parent' => $id));
    foreach ($pages as $p) {
        $p->set('pagetitle', str_replace('Копия ', '', $p->get('pagetitle')) );
        $p->set('alias', str_replace('kopiya-', '', $p->get('alias')) );
        $p->save();
    }
    return;
}

После зайти в скопированный ресурс и сохранить его, это прибьёт у всех дочерних слово Копия в алиасе и заголовке. Ну или плюс минус тот же код в Console запускать.
    Роман
    16 августа 2023, 18:39
    0
    Спасибо, но алиас меняет полностью, если заголовок можно реально вырезать слово Копия, то если у ресурса был blog алиас а заголовок Блог о садоводстве, то в копии будет алиас blog-o-sadovodstve :( короче удаление копия не решает проблему
      Dan
      Dan
      16 августа 2023, 21:54
      1
      0
      Вы сможете создать ресурс с таким же алиасом только в том случае, если у вас включены вложенные урлы и копировать вы будете в другого родителя. В противном случае не получится сохранить ресурс с таким же алиасом.
      Вообще такие вещи лучше делать через процессор, но процессор resource/dublicate не предусматривает указание нового родителя. А почему вам нужно сохранить алиас?
        Андрей
        16 августа 2023, 23:59
        0
        Ну тогда можно доработать скрипт, и вырезать нужную фразу из алиаса. Изначально же речь шла о копии :)
          Роман
          17 августа 2023, 10:10
          0
          да алиас совсем другой в копии, я же привел пример
            Dan
            Dan
            17 августа 2023, 19:27
            0
            Копии в том же родителе создать хотите? Вложенные урлы включены?
              Роман
              17 августа 2023, 20:30
              0
              Вложенные включены, а как создать НЕ в этом родителе? При копировании он по умолчанию появляется рядом.
                Dan
                Dan
                18 августа 2023, 07:19
                +1
                Процессором только в этом же родителе, но тогда alias-ы будут другие. Я вам уже три раза один вопрос задал, но так и не увидел ответа. Зачем вам нужно сохранить алиасы?
      Константин Ильин
      17 августа 2023, 20:56
      0
      Можно использовать процессор дубликата

      $options = [
          "id" => 18, // Ресурс с потомками который копируем
          "name" => "Новый ресурс", // Новое название
          "prefixDuplicate" => false,  
          "published_mode" => "preserve", 
          "duplicate_children" => true
      ];
      $result = $modx->runProcessor('resource/duplicate', $options);
        Роман
        17 августа 2023, 21:30
        0
        Это как снипет запустить на странице?
        Роман
        18 августа 2023, 10:53
        0
        работает, pagetitle не меняет хотя бы, но алиасы все равно меняет, новые прописывает, можно алиасы сохранить как то?
          Константин Ильин
          18 августа 2023, 14:05
          0
          ну тут тогда код написать выборки и создания на основания выборки, в целом он простой, логика такая:
          1. указываем id ресурса с потомками в переменную
          2. сначала получаем его(ресурс родитель) и копируем через resource/create передавая процессору через toArray весь массив
          3. После получаем потомков и в цикле через процессор resource/create создаем потомков уже у нового полученного ресурса.

          если вам не нужно копировать сам родитель то второй шаг не нужен, т.е. просто получить потомки и создать такие же в новом родителе через resource/create, передавая через toArray весь массив, заменяя parent на нужный
            Роман
            18 августа 2023, 14:15
            0
            Понял, спасибо, думал есть готовое решение. Значит нужно разрабатывать свое решение.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        14