[Решено] Путь меню

Главные вкладки

Аватар пользователя Krez Krez 16 июня 2014 в 21:47

Здравствуйте!
Можно ли в путь меню добавить ссылку которая автоматически переходит на последний добавленный материал определенного типу материала? Если можно, то так?

Комментарии

Аватар пользователя Sandy Big Boy Sandy Big Boy 16 июня 2014 в 23:47

"Krez" wrote:
Можно ли в путь меню добавить ссылку которая автоматически переходит на последний добавленный материал определенного типу материала? Если можно, то так?

ИМХО, это из серии хочется странного. Обычно в меня как раз размещаются те ссылки, которые , скажем так, стабильны.

"ХулиGUN" wrote:
Как вариант для ленивых - выводить ноды через views, или хотя бы эту последнюю... в настройках вьюхи сортировка по дате и лимит в 1 ноду.

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

Аватар пользователя Krez Krez 16 июня 2014 в 23:50

«Как вариант для ленивых - выводить ноды через views, или хотя бы эту последнюю... в настройках вьюхи сортировка по дате и лимит в 1 ноду.
Как то так))»
В данном случае у меня так и есть, но это не то что нужно Sad У меня есть одна главная меню и одна по типу материалу, и когда добавляется материал в меню по ТМ мне нужно что бы в главной меню путь автоматически ставился на последний материал и в меню ТМ поле активного материала становился активным. Ну вот что-то такое Smile

Аватар пользователя drupby drupby 17 июня 2014 в 0:04

"Krez" wrote:
У меня есть одна главная меню и одна по типу материалу, и когда добавляется материал в меню по ТМ мне нужно что бы в главной меню путь автоматически ставился на последний материал и в меню ТМ поле активного материала становился активным.

я совершенно ничего не понял, но вообще можно создать страницу вьюс с урлом к примеру /last-article и в меню его добавить

Аватар пользователя Krez Krez 17 июня 2014 в 0:07

drupby wrote:
"Krez" wrote:
У меня есть одна главная меню и одна по типу материалу, и когда добавляется материал в меню по ТМ мне нужно что бы в главной меню путь автоматически ставился на последний материал и в меню ТМ поле активного материала становился активным.

я совершенно ничего не понял, но вообще можно создать страницу вьюс с урлом к примеру /newest-article и в меню его добавить

Мне нужно что бы в меню, путь к материалу автоматически адресовал пользователя на последний материал а не на какой-то конкретный.

Аватар пользователя drupby drupby 17 июня 2014 в 0:53

"Krez" wrote:
Мне нужно что бы в меню, путь к материалу автоматически адресовал пользователя на последний материал а не на какой-то конкретный.

если вам нужно, чтобы в пункте меню путь установлен был именно на саму последнюю ноду, то только программно:
в hook_node_insert создаете новый пункт меню с помощью menu_link_save, а старый удаляете используя menu_link_delete
можно как вариант впихнуть эту ссылку и в функции темизации, которая выводит меню(theme_menu_tree или theme_links)

Аватар пользователя sg85 sg85 17 июня 2014 в 5:23

со всеми этими способами получите подзатыльник от сеошника за дубликат контента, годный из этого 1й способ Хулигана

Вариант drupby тоже годен, однако довольно тяжелый(возможно лишний раз придется кеш сбрасывать)/сложный.

создаете внутри sites/all/modules папку mymodule
внутри создаете файл mymodule.info

name = MyModule
description = Last node's menu link
core = 7.x

создаете файл mymodule.module
<?php
function mymodule_menu(){
return array(
'last_node' => array(
'title' => 'Последний материал',
'page callback' => 'last_node_cb',
'access arguments' => array('access content'),
),
);
}
function last_node_cb(){
$nid = db_select('node','n')
->fields('n',array('nid'))
->orderBy('n.nid','DESC')
->range(0,1)
->execute()->fetchField();
drupal_goto(drupal_get_path_alias('node/'.$nid));
}
?>

далее включаете эту хрень на странице модулей и перекидываете новый пункт меню куда нужно(хотя это можно явно в модуле прописать), по дефолту оно где-то в навигации будет.

неужели это сложно?

Аватар пользователя Krez Krez 18 июня 2014 в 12:43

sg85 wrote:
со всеми этими способами получите подзатыльник от сеошника за дубликат контента, годный из этого 1й способ Хулигана

Вариант drupby тоже годен, однако довольно тяжелый(возможно лишний раз придется кеш сбрасывать)/сложный.

создаете внутри sites/all/modules папку mymodule
внутри создаете файл mymodule.info

name = MyModule
description = Last node's menu link
core = 7.x

создаете файл mymodule.module
<?php
function mymodule_menu(){
return array(
'last_node' => array(
'title' => 'Последний материал',
'page callback' => 'last_node_cb',
'access arguments' => array('access content'),
),
);
}
function last_node_cb(){
$nid = db_select('node','n')
->fields('n',array('nid'))
->orderBy('n.nid','DESC')
->range(0,1)
->execute()->fetchField();
drupal_goto(drupal_get_path_alias('node/'.$nid));
}
?>

далее включаете эту хрень на странице модулей и перекидываете новый пункт меню куда нужно(хотя это можно явно в модуле прописать), по дефолту оно где-то в навигации будет.

неужели это сложно?


Спасибо всем и отдельно sg85, вопрос решен.

Аватар пользователя drupby drupby 17 июня 2014 в 6:07

"sg85" wrote:
однако довольно тяжелый(возможно лишний раз придется кеш сбрасывать)

menu rebuild после создания новой ноды #вешаетсервер - новые мемы зачем же придумывать?
"sg85" wrote:
сложный

я бы сказал просто, что это вариант выполняющий свою задачу
"sg85" wrote:
со всеми этими способами получите подзатыльник от сеошника за дубликат контента

вот тут совсем не понял, в меню появляется новая ссылка с новым анкором и новым урлом, ведущая на соответствующий урлу материал - какие то новые seo-причуды?
"sg85" wrote:
db_select

кондишиона в запросе не хватает

Аватар пользователя sg85 sg85 17 июня 2014 в 6:43

"drupby" wrote:
кондишиона в запросе не хватает

->condition('n.status',1)

довольны?

"drupby" wrote:
menu rebuild после создания новой ноды #вешаетсервер - новые мемы зачем же придумывать?

+SQL запрос на получение старой ссылки, для передачи её настроек в новую
+удаление ссылки, SQL запрос
+добавление ссылки, SQL запрос
...

а в остальном да, способ ох..енно легкий и простой.

"drupby" wrote:
я бы сказал просто, что это вариант выполняющий свою задачу

потому я и написал, что ваш способ тоже подходит, однако, он откровенно геморный.

"drupby" wrote:
вот тут совсем не понял, в меню появляется новая ссылка с новым анкором и новым урлом, ведущая на соответствующий урлу материал - какие то новые seo-причуды?

"Sandy Big Boy" wrote:
Как раз нормальный вариант, можно если что и настройки изменить движением одной руки и хоть картиночку из материала к ссылке добавить или еще чего изменить.

Ну и кроме того, раз уж пошла такая песня, то с hook_menu_alter+hook_node_insert будет меньше и нежданчиков, и кода

или вообще можно какому-либо пункту меню созданному через модуль menu просто менять путь при сохранении новой ноды. Но только опять же, коли вы уж доколупались до кондишена, значит вам этот кондишен придется и тут реализовывать, то есть при сохранении уже существующей ноды проверять её статус, и если он не активен, выяснять является ли нода последней, и если да, то искать новую последнюю ноду со статусом 1. Словом, 10 строк кода магическим образом превращается во вполне солидный модуль, на написание и отладку которого нужно время.

Аватар пользователя drupby drupby 17 июня 2014 в 6:53

"sg85" wrote:
->condition('n.status',1)
довольны?

"Krez" wrote:
определенного типа материала

________________________________________________________
"sg85" wrote:
что ваш способ тоже подходит, однако, он откровенно геморный.

ну так я не увидел другого, который выполняет задачу ТС
"sg85" wrote:
или вообще можно какому-либо пункту меню созданному через модуль menu просто менять путь при сохранении новой ноды.

можно заменить save и delete на hook_menu_link_alter, но если кто то удалит этот пункт, то сломается вся логика модуля

Аватар пользователя sg85 sg85 17 июня 2014 в 6:48

"sg85" wrote:

function last_node_cb(){
  $nid = db_select('node','n')
  ->fields('n',array('nid'))
->condition('n.status', 1)
->condition('n.type','page')
  ->orderBy('n.nid','DESC')
  ->range(0,1)
  ->execute()->fetchField();
  drupal_goto(drupal_get_path_alias('node/'.$nid));
}

page сменить на нужное. Спс что поправили, что-то я спросони не внимательный.

"drupby" wrote:
ну так я не увидел другого, который выполняет задачу ТС

способов там на самом деле овер9000, но почти у всех у них две проблемы - громоздкость кода, да и легкими в плане числа SQL запросов, пусть даже только при сохранении ноды их не назовешь. Вариант с редиректом может не подойти только в случае, если в ТЗ есть условие, что 301 редирект недопустим по каким-то там причинам(пример, СЕО головного мозга).

Аватар пользователя sg85 sg85 17 июня 2014 в 7:08

еще, кстати, есть довольно простой вариант без модуля, это в template.php подменить функцию темизации нужного меню и на этом уровне добавлять в него ссылку, тем более, что этот кеш будет(по крайней мере должен) сбрасываться каждый раз при сохранении ноды автоматически, но это уже из серии "вменяемых" костылей, проблемой такого способа может стать разве что нехватка знаний PHP, например, неумение писать функции сортировки, пользоваться отладкой(хотя бы тот же devel) и т.д., ну и проблема всех костылей - через годик, если понадобится что-то поменять, придется искать откуда у этой ссылки ноги растут.

Аватар пользователя drupby drupby 17 июня 2014 в 7:47

"sg85" wrote:
еще, кстати, есть довольно простой вариант без модуля, это в template.php подменить функцию темизации нужного меню и на этом уровне добавлять в него ссылку

"drupby" wrote:
можно как вариант впихнуть эту ссылку и в функции темизации, которая выводит меню(theme_menu_tree или theme_links)

Аватар пользователя Sandy Big Boy Sandy Big Boy 17 июня 2014 в 10:20

"ХулиGUN" wrote:
ну для этого ж нужно хотя бы php на уровне поверхностного ознакомления знать... А у нас преобладают мышкосайтоделы

php "на уровне поверхностного ознакомления", чтобы модуль набыдлокодить, может и обезьяна изучить. Проблема в том, что для написания модуля нужно еще знание Drupal API, а это уже несколько сложнее. При этом нужный модуль уже может быть на drupal.org, поэтому кодить свой велосипед на каждый чих - признак небольшого ума, мягко говоря.

А ТС откровенно хочет странного.

Аватар пользователя Sandy Big Boy Sandy Big Boy 17 июня 2014 в 15:16

"ХулиGUN" wrote:
Нет. Достаточно уметь гуглить)))

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