Sanchez

Sanchez

+6
Репутация
9
Рейтинг
#1 Перемещение в архив 31 декабря 2019 в 07:34
Пожалуй апну, хочется эту проблему закрыть в 2019
#2 Перемещение в архив 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. }
но так ничего и не получилось. Предыдущие подсказки результата не дали, при выполнении планировщика, возвращает ошибку.
#3 Перемещение в архив 28 декабря 2019 в 19:52
Ребят, что никто не подскажет что куда прописать чтобы по расписанию можно было менять категорию для контента!? Для знающих код, делов то на минуту. Всё дело встало на этом месте. По хорошему вообще сменить тип контента, но так как никто не хочет заморачиваться, хотя бы категорию.
#4 Перемещение в архив 28 декабря 2019 в 09:28


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

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

Ris

Да всё так, но вот ошибку отдаёт после выполнения cron.
#5 Перемещение в архив 27 декабря 2019 в 20:55
Ребят, подскажите решение, вот очень нужно оно. Выдаёт ошибку
#6 Перемещение в архив 27 декабря 2019 в 16:34


А в ['category_id'] как сразу вписать его category_id ?

@Mrmahonin
Можно прямо вписать.
  1. $this->model->update('con_'.$ctype, $item['id'], array('category_id' => 'нужная_категория');

из чего он складывается чтобы его напрямую вписать?

@Mrmahonin
Из номера категории, которую Вы создали, как архивную.

И всё же если представить что в типе контента 'closed' те же поля с такими же системными именами, как можно перенести?

@Mrmahonin
Добавить в этом типе контента и удалить в другом.

Ris
возможно я не правильно вписываю, выдаёт ошибку sad
в файле system\controllers\content\model.php? правильно?

  1. public function CategoriesExpiredContentItems($ctype_name){
  2.  
  3. return $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. $this->model->update('con_'.$ctype, $item['id'], array('category_id' => '3')
  8. return $item['category_id'];
  9. });
  10.  
  11. }
это то что я вписываю — неработает
#7 Перемещение в архив 27 декабря 2019 в 15:02


как отправить в БД информацию о смене категории

@Mrmahonin
Просто изменить $item['category_id'] на нужную категорию. Потом $this->model->updateContentItem($ctype, $id, $item, $fields);

а лучше вообще сменить тип контента

@Mrmahonin
А вот это сложнее, так как потребуется перенос в другую таблицу.

Ris

Не получается, пишу в system\controllers\content\model.php
  1. return $this->
  2. filterNotNull('date_pub_end')->
  3. filter('i.date_pub_end <= NOW()')->
  4. get($this->table_prefix.$ctype_name, function($item, $model) use($ctype_name){
  5. $item['category_id'];
  6. $this->model->updateContentItem($ctype, $id, $item, $fields);
  7. });
  8.  
  9. }
отдаёт ошибку
#8 Перемещение в архив 27 декабря 2019 в 14:52


как отправить в БД информацию о смене категории

@Mrmahonin
Просто изменить $item['category_id'] на нужную категорию. Потом $this->model->updateContentItem($ctype, $id, $item, $fields);

а лучше вообще сменить тип контента

@Mrmahonin
А вот это сложнее, так как потребуется перенос в другую таблицу.

Ris
А в ['category_id'] как сразу вписать его category_id? это же не просто id который порядковым номером например '7' называется, из чего он складывается чтобы его напрямую вписать?


И всё же если представить что в типе контента 'closed' те же поля с такими же системными именами, как можно перенести?
#9 Перемещение в архив 27 декабря 2019 в 12:33
И так, нам нужно сделать перевод контента через "Управление сроком публикации" в другую категорию, а лучше вообще сменить тип контента, после завершения срока публикации. В последнем варианте у типов контента думаю должны совпадать поля и настройки.
Попробовал реализовать правку таким образом:
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' => 'Перенести в CLOSED' ,
  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. )),
добавил 'transferal' => 'Перенести в CLOSED' ,

system\controllers\content\hooks\cron_publication.php
строка 30
  1. if($ctype['options']['is_date_range_process'] === 'delete') {
  2. $this->model->deleteExpiredContentItems($ctype['name']);
  3. } elseif($ctype['options']['is_date_range_process'] === 'transferal') {
  4. $this->model->CategoriesExpiredContentItems($ctype['name']);
  5. } elseif($ctype['options']['is_date_range_process'] === 'in_basket') {
  6. $this->model->toTrashExpiredContentItems($ctype['name']);
  7. } else {
  8. $this->model->hideExpiredContentItems($ctype['name']);
  9. }
добавил } elseif($ctype['options']['is_date_range_process'] === 'transferal') {
$this->model->CategoriesExpiredContentItems($ctype['name']);

system\controllers\content\model.php
как пример перенос контента в черновик вывглядит так (строка 2602)
  1. public function toTrashExpiredContentItems($ctype_name){
  2.  
  3. return $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. $model->toTrashContentItem($ctype_name, $item);
  8. return $item['id'];
  9. });
  10.  
  11. }
Но теперь я не догоняю как отправить в БД информацию о смене категории, а лучше вообще сменить тип контента
#10 Перемещение в архив 23 декабря 2019 в 17:02
На самом деле, вопрос важный и многим необходим. Думаю не мало сайтов на инстанте с контентом который необходимо переводить в архив, так чтоб он был доступен для поисковиков и не вводил в заблуждение пользователей.
Решение вижу такое, в выпадающем списке (что делать с публикацией по истечении срока) нужно добавить выбор категории в этом же типе контента. Это самый простой выход из положения. Самому нужно такое решение. Буду пробовать, если что то получится отпишусь.
Ну и если есть идеи, как это можно запилить, поделитесь с коллегами пожалуйста. Возможно решение попадёт в коробку инстанта, что было бы здорово!
#11 Вывод полей в произвольных местах 7 декабря 2019 в 13:36
Уважаемые знатоки, вопрос!
Какой вариант перемещения полей в профиле пользователя будет лучше со стороны производительности?
1. Средствами PHP
Вывод изображения и текстового поля со скрытием основного вывода
  1.  
  2. <?php if (!empty($fields['поле']) && $fields['поле']['is_in_item']){ ?>
  3. <?php echo $profile['поле']; ?>
  4. <?php } ?>
  5. <?php if (!empty($fields['поле изображения']) && $fields['поле изображения']['is_in_item']){ ?>
  6. <?php echo html_image($profile['поле изображения'], 'пресет', true); ?>
  7. <?php } ?>
  8.  
2. Средствами JS
  1.  
  2. <script type="text/javascript">
  3. $( init );
  4. function init() {
  5. // Перемещаем всё дерево и объекты из #id в .class
  6. $('.class').append( $('#id') );
  7. }
  8. </script>
  9.  
Оба варианта не плохо работают. Но всё же какой из них предпочтительнее!?
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.