Как правильно привязать типы контента друг к другу?

InstantCMS 2.X
#1 4 января 2023 в 19:36

Всем привет. Помогите разобраться с одним моментом, точнее с правильной привязкой тк к тк.

Имеем тк «страны», имеем второй тк «города», эти самые «города» мы привязываем к странам и всё хорошо, пока не открываем саму запись из «городов», тк «страна» пропадает из ссылки и хлебных крошек а она мне там нужна, как можно её(страну) туда добавить и возможно ли?

Спасибо.

Изображение

Открывая город «гагра» страна пропадает.

Изображение

#2 4 января 2023 в 20:51

Не знаю точно, но мне кажется, что штатными средствами так сделать нельзя. Думаю, это связано с тем, что родителей может быть несколько. А замысловатых настроек в связях, связанных с количеством, вроде бы нет. Могу ошибаться.

#3 4 января 2023 в 23:20

Обратите внимание на поле, которое создается при связи ТК. parent_field_yourTC — манипулируйте им в вашем шаблоне записи, чтобы сделать тот-же глубиномер. 

#4 5 января 2023 в 00:07

Не знаю точно, но мне кажется, что штатными средствами так сделать нельзя. Думаю, это связано с тем, что родителей может быть несколько. А замысловатых настроек в связях, связанных с количеством, вроде бы нет. Могу ошибаться.

Нифигаccе о-го-гошеньки

Да, судя по всему нельзя и это странно, какой тогда смысл от данных связей если всё что мы можем, это вывести родителя где-то сбоку при этом в ссылке и глубиномере он фигурировать никак не будет. С точки зрения seo логики нет, никакой структуры.

Изображение

Обратите внимание на поле, которое создается при связи ТК. parent_field_yourTC — манипулируйте им в вашем шаблоне записи, чтобы сделать тот-же глубиномер. 

Make

 такой глубиномер можно сделать переписав, костыль да ладно. Как быть с ссылкой, по логике вещей должно быть так:

/country/abhazija/city/picunda.html

Изображение

Сейчас это так, просто два отдельных тк:

/country/abhazija/view-city

/city/picunda.html

#5 5 января 2023 в 10:44

Можно попробовать хуком вставить хлебные крошки. Я тут соорудил жесточайший костыль, вроде работает. Родительские записи внизу страницы, их две. В хлебные крошки добавлен только один родитель.

Изображение

Ну а вот с вставкой в url родителя сложнее. Собрать url можно, но как по этому новому адресу открыть страницу, чтобы она открылась, фиг его знает. Может кто подскажет.

В общем, примерно всё было так:

В папке system/controllers создаем папку apib, внутри создаем файл frontend.php с таким содержимым:

  1. <?php class apib extends cmsFrontend{}

Там же создаем папку hooks, а внутри файл core_start.php с таким содержимым:

  1. <?php class onApibCoreStart extends cmsAction {
  2.  
  3. public function run(){
  4.  
  5. $url = $_SERVER['REQUEST_URI'];
  6. $url = explode('#', $url);
  7. $url = $url[0];
  8.  
  9. if (strrpos($url, '.html') === false) { return true; }
  10.  
  11. error_reporting(E_NOTICE); // В этом месте почему-то вываливает кучу нотисов - не видит языковые константы
  12.  
  13. $url_ex = explode('/', $url);
  14. $model = cmsCore::getModel('content');
  15. $fields = $model->getContentFields($url_ex[1]);
  16.  
  17. $p_ctype = [];
  18.  
  19. foreach ($fields as $field) {
  20.  
  21. if (stripos($field['name'], 'parent_') === false && strrpos($field['name'], '_id') === false) { continue; }
  22. $p_ctype[] = str_replace(['parent_', '_id'], '', $field['name']);
  23.  
  24. }
  25.  
  26. if (!$p_ctype) { return true; }
  27.  
  28. $p_ctype = $p_ctype[0];
  29.  
  30. $item = $model->getItemByField('con_'.$url_ex[1], 'slug', str_replace('.html', '', $url_ex[2]));
  31.  
  32. if (empty($item['parent_'.$p_ctype.'_id'])) { return true; }
  33.  
  34. $parents = $item['parent_'.$p_ctype.'_id'];
  35. $parents_ex = explode(',', $parents);
  36. $parent_id = $parents_ex['0'];
  37.  
  38. if (empty($parent_id)) { return true; }
  39.  
  40. $parent_item = $model->getContentItem($p_ctype, $parent_id);
  41.  
  42. if (!$parent_item) { return true; }
  43.  
  44. $pc_url = href_to($p_ctype);
  45.  
  46. $pc = $model->getContentTypeByName($p_ctype);
  47. $pc_title = $pc['title'];
  48.  
  49. cmsTemplate::getInstance()->addBreadcrumb($pc_title, $pc_url);
  50.  
  51. $p_url = href_to($p_ctype, $parent_item['slug'].'.html');
  52. $p_title = $parent_item['title'];
  53.  
  54. cmsTemplate::getInstance()->addBreadcrumb($p_title, $p_url);
  55.  
  56. return true;
  57.  
  58. }
  59.  
  60. }
  61.  

И надо обновить события в админке. 

#6 5 января 2023 в 11:39

И надо обновить события в админке. 

Нифигаccе о-го-гошеньки

Вот на этом моменте всё падает:

  1. Parse error: syntax error, unexpected ' ' (T_STRING), expecting function (T_FUNCTION) or const (T_CONST) in /Users/me/sites/me.travel/system/controllers/apib/hooks/core_start.php on line 2
#7 5 января 2023 в 11:50

В тот момент, когда обновляете события? Странно, не должно падать. Попробуйте еще раз скопировать и вставить полностью код хука. Может где-то что-то не зацепили, когда копировали. 

#8 5 января 2023 в 12:29

В тот момент, когда обновляете события? Странно, не должно падать. Попробуйте еще раз скопировать и вставить полностью код хука. Может где-то что-то не зацепили, когда копировали. 

Нифигаccе о-го-гошеньки

это при попытке попасть в раздел «Управление событиями» /admin/controllers/events.

Чуть позже залью на сервер, может проблема где-то у меня а там заработает.

Спасибо!

#9 5 января 2023 в 13:04

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

Нифигаccе о-го-гошеньки

Надо тут добавить массив с описанием регулярного выражения вашего урла типа как здесь

И разместить его повыше указанного места.

Parse error: syntax error, unexpected ' ' (T_STRING)

Василич

Видимо ругается на пробел во второй строке вашего файла. Надо его там удалить.

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

error_reporting(E_NOTICE); // В этом месте почему-то вываливает кучу нотисов — не видит языковые константы

Нифигаccе о-го-гошеньки

Событие на старте движка, поэтому многое ещё не запущено. Можно отдельно подключить языковые файлы  контроллера, например так для контента

  1. cmsCore::loadControllerLanguage('content');

или «забить окончательно» на всё и всех и подключить всю папку с языковыми файлами так

  1. cmsCore::loadAllControllersLanguages();
#10 5 января 2023 в 13:15

Видимо ругается на пробел во второй строке вашего файла. Надо его там удалить.

Loadырь

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

Я тут соорудил жесточайший костыль, вроде работает.

Нифигаccе о-го-гошеньки

спасибо, глубиномер работает, единственное, ссылка с «города» ведёт на тк «города» без привязки к тк «страны»

Страны / Абхазия / города / Пицунда

#11 5 января 2023 в 16:55

Тогда второй вариант. Удалите хук в папке system/controllers/apib/hooks, обновите события в админке, удалите папку system/controllers/apib со всем содержимым.

Откройте файл templates/ваш_шаблон/item_view.tpl.php и в самое начало после  <?php вставьте такой код:

  1. $model = cmsCore::getModel('content');
  2. $fields = $model->getContentFields($ctype['name']);
  3. $p_ctype = [];
  4. foreach ($fields as $field) {
  5. if (stripos($field['name'], 'parent_') === false && strrpos($field['name'], '_id') === false) { continue; }
  6. $p_ctype[] = str_replace(['parent_', '_id'], '', $field['name']);
  7. }
  8. if ($p_ctype && !empty($item['parent_'.$p_ctype[0].'_id'])) {
  9. $p_ctype = $p_ctype[0];
  10. $parents = $item['parent_'.$p_ctype.'_id'];
  11. $parents_ex = explode(',', $parents);
  12. $parent_id = $parents_ex['0'];
  13. $parent_item = $model->getContentItem($p_ctype, $parent_id);
  14. if ($parent_item) {
  15. $pc_url = href_to($p_ctype);
  16. $pc = $model->getContentTypeByName($p_ctype);
  17. $pc_title = $pc['title'];
  18. $p_url = href_to($p_ctype, $parent_item['slug'].'.html');
  19. $p_title = $parent_item['title'];
  20. $pp_url = href_to($p_ctype, $parent_item['slug']).'/view-'.$ctype['name'];
  21. $breadcrumbs = $this->breadcrumbs;
  22. $new_breadcrumbs[0] = [
  23. 'title' => $pc_title,
  24. 'href' => $pc_url
  25. ];
  26. $new_breadcrumbs[1] = [
  27. 'title' => $p_title,
  28. 'href' => $p_url
  29. ];
  30. foreach ($breadcrumbs as $key => $breadcrumb) {
  31. $href = $breadcrumb['href'];
  32. if ($href == '/'.$ctype['name']) {
  33. $href = str_replace('/'.$ctype['name'], $pp_url, $breadcrumb['href']);
  34. }
  35. $new_breadcrumbs[] = [
  36. 'title' => $breadcrumb['title'],
  37. 'href' => $href
  38. ];
  39. }
  40. $this->breadcrumbs = $new_breadcrumbs;
  41. }
  42. }

Но у вас в дочернем ТК не должно быть категорий, а иначе будут 404 ошибки.

Изображение

#12 7 января 2023 в 18:29

Тогда второй вариант

Нифигаccе о-го-гошеньки

Спасибо, работает, задонатил. Предложите это внести на гите, какое никакое развитие движка )

Если получится и с ссылками, продублирую донат )

#13 7 января 2023 в 23:07

Спасибо)) На гит писать нет смысла. Вернее, предлагать это решение. Если Fuze захочет добавить такую опцию в коробку, то сделает это более качественно.

Со ссылками всё сложнее. Вы же не только хотите в адресной строке браузера видеть эту ссылку? Вам ее нужно вписать в карту сайта, во всевозможных списках чтобы она была, ещё где-нибудь, например, в индексаторе. Просто подменить — это полбеды, а дальше начнутся танцы с бубнами.

#14 8 января 2023 в 10:52

На гит писать нет смысла. Вернее, предлагать это решение.

Нифигаccе о-го-гошеньки

На гит писать всегда есть смысл. Но только не это решение, так как уже с первой строки (вызов модели в файле шаблона) решение будет отвергнуто. Но саму «идею» написать всегда можно тут

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