Перемещение в архив

InstantCMS 2.X
#16 27 декабря 2019 в 17:03

это то что я вписываю — неработает

@Mrmahonin
Я не кодер, но по моему, после
  1. $this->model->update('con_'.$ctype, $item['id'], array('category_id' => '3')
, нужны кавычки ";"
#17 27 декабря 2019 в 20:55
Ребят, подскажите решение, вот очень нужно оно. Выдаёт ошибку
#18 27 декабря 2019 в 23:12

Ребят, подскажите решение, вот очень нужно оно.

@Mrmahonin
Я вообще не понял, что Вы пытаетесь сделать.
По мне, так нужно получить массив с номерами единиц контента, которые требуют переназначения категории, а потом перебрать этот массив и в процессе изменить категорию.
#19 28 декабря 2019 в 09:28


Ребят, подскажите решение, вот очень нужно оно.

@Mrmahonin
Я вообще не понял, что Вы пытаетесь сделать.
По мне, так нужно получить массив с номерами единиц контента, которые требуют переназначения категории, а потом перебрать этот массив и в процессе изменить категорию.

Ris

Да всё так, но вот ошибку отдаёт после выполнения cron.
#20 28 декабря 2019 в 19:52
Ребят, что никто не подскажет что куда прописать чтобы по расписанию можно было менять категорию для контента!? Для знающих код, делов то на минуту. Всё дело встало на этом месте. По хорошему вообще сменить тип контента, но так как никто не хочет заморачиваться, хотя бы категорию.
#21 28 декабря 2019 в 20:40

Ребят, что никто не подскажет

@Mrmahonin
Подсказали бы с удовольствием, но мало входящих данных.

что куда прописать

@Mrmahonin
Не надо ничего прописывать. Создайте файл например cron_archive.php в папке \system\controllers\content\hooks\.
После этого создайте задание планировщика в админке.
В самом файле напишите то, о чем я говорил ранее.
  1. <?php
  2.  
  3. class onContentCronArchive extends cmsAction {
  4.  
  5. public function run(){
  6.  
  7. /* Получаем нужные статьи для архивирования */
  8. $items = $this->model->условия_по_которым_определяются_единицы контента_для_архивирования->get('нужная_таблица');
  9.  
  10. /* Перебираем массив и отправляем нужные статьи в архивную категорию */
  11. foreach ($items as $item){
  12. $this->model->update('нужная_таблица', $item['id'], array('category_id' => 'нужная_категория');
  13. }
  14.  
  15. }
  16.  
  17. }
#22 29 декабря 2019 в 00:28


Не надо ничего прописывать. Создайте файл например cron_archive.php в папке \system\controllers\content\hooks\.
После этого создайте задание планировщика в админке.

Ris

Видимо неправильно поняли, суть в том что при создании типа контента включая " Управление сроком публикации " выставляем пункт что делать по окончании срока: скрыть, удалить, удалить в корзину. Пользователи публикующие свой контент, устанавливают дату окончания публикации после чего она не должна удаляться а должна перемещается в категорию АРХИВ (closed), в идеале в отдельный тип контента "Архив".
Для чего я и добавил в выпадающий список админки "Управление сроком публикации" — перенести в архив
system\controllers\admin\forms\form_ctypes_basic.php (строка 91)
  1. new fieldList('options:is_date_range_process', array(
  2. 'title' => LANG_CP_IS_PUB_CONTROL_PROCESS,
  3. 'default' => 'hide',
  4. 'items' => array(
  5. 'hide' => LANG_CP_IS_PUB_CONTROL_PROCESS_HIDE,
  6. 'transferal' => 'Перенести в АРХИВ' ,
  7. 'delete' => LANG_CP_IS_PUB_CONTROL_PROCESS_DEL,
  8. 'in_basket' => LANG_BASKET_DELETE
  9. ),
  10. 'visible_depend' => array('is_date_range' => array('show' => array('1')))
  11. )),
далее я присвоил функцию CategoriesExpiredContentItems
system\controllers\content\hooks\cron_publication.php
  1. class onContentCronPublication extends cmsAction {
  2. public function run(){
  3. $ctypes = $this->model->getContentTypes();
  4. $is_pub_items = array();
  5. foreach($ctypes as $ctype){
  6. if (!$ctype['is_date_range']) { continue; }
  7. $pub_items = $this->model->filterNotEqual('is_pub', 1)->
  8. filterIsNull('is_deleted')->
  9. filter('i.date_pub <= NOW()')->
  10. filterStart()->
  11. filter('i.date_pub_end > NOW()')->
  12. filterOr()->
  13. filterIsNull('i.date_pub_end')->
  14. filterEnd()->
  15. get($this->model->table_prefix.$ctype['name']);
  16. if($pub_items){
  17. $this->model->publishDelayedContentItems($ctype['name']);
  18. $is_pub_items[$ctype['name']] = $pub_items;
  19. }
  20. if($ctype['options']['is_date_range_process'] === 'delete') {
  21. $this->model->deleteExpiredContentItems($ctype['name']);
  22. } elseif($ctype['options']['is_date_range_process'] === 'transferal') {
  23. $this->model->CategoriesExpiredContentItems($ctype['name']);
  24. } elseif($ctype['options']['is_date_range_process'] === 'in_basket') {
  25. $this->model->toTrashExpiredContentItems($ctype['name']);
  26. } else {
  27. $this->model->hideExpiredContentItems($ctype['name']);
  28. }
  29. }
  30. if($is_pub_items){
  31. cmsEventsManager::hook('publish_delayed_content', $is_pub_items);
  32. }
  33. }
  34. }
А в system\controllers\content\model.php (строка 2602) хотел прописать изменение категории как сделано это для: скрыть, удалить и удалить в корзину
Вот их код
  1. public function hideExpiredContentItems($ctype_name){
  2.  
  3. return $this->filterIsNull('is_deleted')->
  4. filterEqual('is_pub', 1)->
  5. filterNotNull('date_pub_end')->
  6. filter('i.date_pub_end <= NOW()')->
  7. updateFiltered($this->table_prefix.$ctype_name, array(
  8. 'is_pub' => 0
  9. ));
  10.  
  11. }
  12.  
  13. public function deleteExpiredContentItems($ctype_name){
  14.  
  15. return $this->
  16. filterNotNull('date_pub_end')->
  17. filter('i.date_pub_end <= NOW()')->
  18. get($this->table_prefix.$ctype_name, function($item, $model) use($ctype_name){
  19. $model->deleteContentItem($ctype_name, $item['id']);
  20. return $item['id'];
  21. });
  22.  
  23. }
  24.  
  25.  
  26. public function toTrashExpiredContentItems($ctype_name){
  27.  
  28. return $this->
  29. filterNotNull('date_pub_end')->
  30. filter('i.date_pub_end <= NOW()')->
  31. get($this->table_prefix.$ctype_name, function($item, $model) use($ctype_name){
  32. $model->toTrashContentItem($ctype_name, $item);
  33. return $item['id'];
  34. });
  35.  
  36. }
но так ничего и не получилось. Предыдущие подсказки результата не дали, при выполнении планировщика, возвращает ошибку.
#23 31 декабря 2019 в 07:34
Пожалуй апну, хочется эту проблему закрыть в 2019
#24 31 декабря 2019 в 15:26
Короче сделал изменение категории по крону
Прописал в model.php
  1.  
  2. public function CategoriesExpiredContentItems($ctype_name){
  3.  
  4. $items = $this->
  5. filterNotNull('date_pub_end')->
  6. filter('i.date_pub_end <= NOW()')->
  7. get($this->table_prefix . $ctype_name, function($item, $model) use($ctype_name){
  8. $table_name = $this->table_prefix . $ctype_name;
  9. $binds_table_name = $this->table_prefix . $ctype_name . '_cats_bind';
  10. $this->update($table_name, $item['id'], array('category_id' => 3));
  11. });
  12. cmsCache::getInstance()->clean('content.list.'.$ctype_name);
  13. cmsCache::getInstance()->clean('content.item.'.$ctype_name);
  14. return true;
  15. }
В БД ID категории поменялся, НО я не понимаю!!! Ай Ди записи изменился а в бэкэнде категория та же стоит, 100 раз перепроверил, капец какой то. Подскажите где подстава спряталась!?
#25 31 декабря 2019 в 18:34

В БД ID категории поменялся

Sanchez
Есть еще таблица cms_con_ваштипконтента_cats_bind.
#26 31 декабря 2019 в 19:17


В БД ID категории поменялся

Sanchez
Есть еще таблица cms_con_ваштипконтента_cats_bind.

Ris
Я это вроде бы учёл вот тут
  1. $binds_table_name = $this->table_prefix . $ctype_name . '_cats_bind';
#27 31 декабря 2019 в 19:30

Я это вроде бы учёл вот тут

Sanchez
А где апдейт этого table_prefix. $ctype_name. '_cats_bind' ?
Причем апдейт там не прокатит. Там нет уникального столбца. Надо отсоединить единицу типа контента от старой категории и присоединить к новой.
То есть delete — insert.
#28 31 декабря 2019 в 19:32


Я это вроде бы учёл вот тут

Sanchez
А где апдейт этого table_prefix. $ctype_name. '_cats_bind' ?
Причем апдейт там не прокатит. Там нет уникального столбца. Надо отсоединить единицу типа контента от старой категории и присоединить к новой.
То есть delete — insert.

Ris
Можно кодом подсказать!? А то я так ещё до 2021 протуплю
#29 31 декабря 2019 в 19:48
  1. $this->model->db->delete(table_prefix . $ctype_name . '_cats_bind', 'category_id = '.старая категория.' AND item_id = '.$item['id']);
  2. $this->model->db->insert(table_prefix . $ctype_name . '_cats_bind', array('category_id = >$item['category_id'], 'item_id' => $item['id']);
#30 31 декабря 2019 в 19:48
Короче сделал чёрный, ооочень чёрный код, но он ссс… ка РАБОТАЕТ!!! Несёт куеву тучу ошибок при запуске крона, но действие переноса осуществляет так как надо.
  1. public function CategoriesExpiredContentItems($ctype_name){
  2.  
  3. $items = $this->
  4. filterNotNull('date_pub_end')->
  5. filter('i.date_pub_end <= NOW()')->
  6. get($this->table_prefix . $ctype_name, function($item, $model) use($ctype_name){
  7. $table_name = $this->table_prefix . $ctype_name;
  8. $binds_table_name = $this->table_prefix . $ctype_name . '_cats_bind';
  9. $model->updateContentItemCategories($ctype_name, $item['id'], $item['category_id'], $add_cats);
  10. $this->update($table_name, $item['id'], array('category_id' => 3));
  11. return $item['id'];
  12. });
  13. cmsCache::getInstance()->clean('content.list.'.$ctype_name);
  14. cmsCache::getInstance()->clean('content.item.'.$ctype_name);
  15. return true;
  16. }
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.