Запрос создание копии записи

InstantCMS 2.X

Запрос создание копии записи

#1 19 июля 2025 в 05:51

всем привет, как в своем компоненте в модели заделать запрос на копию записи (зная id исходной записи) ?

Добавлено спустя 54 минуты

получилось создать дубликат записи, а как редирекнут после создания записи на редактирование этой записи ? 
что то $this->redirectToAction('edit', array($new_id['id']));  не отрабатывает 

#2 19 июля 2025 в 09:57

А ваш экшен, это файл edit.php? В нём есть данный параметр в ф-ции run()?

#3 19 июля 2025 в 15:00

Вероятно вам нужно передать ещё и название типа контента. Например ссылка на редактирование записи выглядит так posts/edit/8

$this->redirectToAction('posts/edit',  array($new_id['id']));

или

$this->redirectToAction('posts, 'edit', array($new_id['id']));

Посмотрите как в движке реализовано 

Сегодня в 03:48
#4 19 июля 2025 в 15:13

 Red-Ray.Ru, это редерикт на экшен, а не на ссылку. Там нет типа контента. Это свой компонент.

#5 20 июля 2025 в 07:06

для теста сделал проще (добавил в контролер content)
добавил в  \system\controllers\content\actions
свой action duplicate.php
в нем код отрабатывается! но не работает почему то 
$this->redirectBack();  (что бы вернутся на предыдущею страницу )
и $this->redirectToAction('edit', array($new_id['id'])); ( что бы отрыть запись для редактирования)

#6 20 июля 2025 в 08:23

Спрашиваю ещё раз. Что такое 'edit'?

#7 20 июля 2025 в 09:26

edit — action контроллера контент

#8 20 июля 2025 в 09:46

Покажите его код И код  duplicate.php

#9 20 июля 2025 в 12:25

Покажите его код

Lora

он стандартный, идет в комплекте с движком (\system\controllers\content\actions\item_edit.php)
а duplicate.php

в нем код отрабатывается! но не работает почему то 
$this->redirectBack();  (что бы вернутся на предыдущею страницу )
и $this->redirectToAction('edit', array($new_id['id'])); ( что бы отрыть запись для редактирования)

  1. <?php
  2.  
  3. class actionContentDuplicate extends cmsAction {
  4.  
  5. public function run(){
  6.  
  7. // Проверяем, передан ли id в URL
  8. if (isset($_GET['id'])) {
  9. $id = (int)$_GET['id']; // Приводим к числу для безопасности
  10.  
  11. // Получаем оригинальную запись
  12. $original = $this->model->getContentItem('person',$id);
  13.  
  14. if (!$original) {
  15. cmsCore::error404();
  16. }
  17.  
  18. // Создаем новый массив данных для дубликата
  19. $new_data = $original;
  20. unset($new_data['id']); // Удаляем ID, чтобы создать новую запись
  21.  
  22.  
  23. $ctype = [
  24. 'name' => 'person'
  25. ];
  26.  
  27. // Добавляем новую запись
  28. $new_id = $this->model->addContentItem($ctype,$new_data,'');
  29.  
  30. if (isset($new_id)) {
  31. // Перенаправляем на редактирование новой записи
  32. $this->redirectToAction('edit', array($new_id['id']));
  33. } else {
  34. cmsUser::addSessionMessage('Ошибка при создании дубликата', 'error');
  35. $this->redirectBack();
  36. }
  37. } else {
  38. echo "ID не передан!";
  39. }
  40. }
  41.  
  42. }
  43.  
#10 20 июля 2025 в 13:52

Ваш экшен не edit, а item_edit. Это первое. Второе. Если вы передаёте в параметре  array($new_id['id']), то этот параметр должен быть и в item_edit, а его там нет. Там id получают из запроса. $id = $this->request->get('id', 0); Значит вам надо передавать его не в параметре, а в строке запроса

  1. $this->redirectToAction('item_edit','',["id"=>$new_id["id"]]);

Далее эта строка в duplicate.php

$new_id = $this->model->addContentItem($ctype,$new_data,'');    

Проверьте, что у вас в $new_id. Возможно вам нужно просто проверять её на существование

if ($new_id){...

#11 21 июля 2025 в 05:41

$this->redirectToAction('item_edit','',[«id»=>$new_id[«id»]]);  — это не работает!

а вот так заработало :
$this->redirectTo('/person/edit/'. $new_id['id']);

#12 21 июля 2025 в 07:33

$this->redirectToAction('item_edit','',[«id»=>$new_id[«id»]]);  — это не работает!

No Name

В ТК  это, как правило, не работает. Только в компоненте. Если код не предусматривает другие правила перенаправления.

#13 21 июля 2025 в 11:44
$this->redirectToAction('item_edit','',[«id»=>$new_id[«id»]]);  — это не работает! а вот так заработало :$this->redirectTo('/person/edit/'. $new_id['id']);
No Name

Вот, отчем я и написал в сообщении выше, что нужно было включить в адрес ссылки

person

'person/edit' и далее id.

И воспользоваться нужным вам редиректом, посмотрев какие есть в движке: redirect, redirectTo, redirectToAction и тд.

#14 22 июля 2025 в 09:31

 Red-Ray.Ru, да спасибо с этим уже разобрался, но странно почему $this->redirectBack();   так и не отрабатывает ? 

#15 22 июля 2025 в 16:33
 Red-Ray.Ru, да спасибо с этим уже разобрался, но странно почему $this->redirectBack();   так и не отрабатывает ? 
No Name

Была как то у меня похожая проблема, что не срабатывал $this->redirectBack(); не помню как решил, но

Посмотрите, есть ли что-нибудь в вашем back_url ?
$back_url = $this->getRequestBackUrl();
dump($back_url);

Возможно что там пусто и поэтому не понятно куда вернуть назад, когда вы используете $this->redirectBack(); 

Например в profile_edit.php используется такой код:
$back_url = $this->getRequestBackUrl();
...
if ($back_url) {
                    return $this->redirect($back_url);
                } else {
                    return $this->redirectTo('users', (empty($profile['slug'])? $profile['id']: $profile['slug']));
                }

Можете попробовать 
$back_url = '/person/'; (прописать свой путь, если back_url пустой)
И редирект на него $this->redirect($back_url);

Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.

Похожие темы

Похожее в блогах

🍪Мы используем файлы cookie для работы сайта. Читать подробнее.