Сортировка пунктов меню по дате

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

Комментарии

Аватар пользователя Rockon Rockon 6 февраля 2013 в 17:16

а можно поподробнее?
Я думал реализовывать такое через hook_menu (но мало ли есть какой плагин)
Но не очень понимаю, как Smile
По сути мне надо при создании текущего пункта меню видимо искать weight от предыдуего пункта(как?), либо вести какой-то счетчик(опять же как его передавать? А если удалится пункт меню, как это отлавливать счетчиком. Долгий и муторный вариант с кучей кода). Либо(вроде где то видел похожее). Через patchauto добавлять к ссылке материала (к которому ведет пункт меню, в моём случае добавляющийся автоматически с созданием статьи) на статью дату. И вот дальше опять же как это отлавливать?
Вообщем не очень ясен план реализации..

либо вообще все послать и взять наконец vievs - возможно же там в две колонки вывести: слева список статей опр. категории, с другой - текущую статью?
еще как вариант - есть готовый модуль, умеющий автоматом добавлять ссылку в меню при добавлении страницы. Осталось его только выставлять weight - есть какие примеры, где реализован такой функционал?

Аватар пользователя Rockon Rockon 7 февраля 2013 в 21:58

вообщем реализовал через костыли, переписав
http://drupal.org/node/1138946
Сразу поясню свежеприбывшим: заказчик хочет что бы у него было некое подобие блога, но с крайне урезанными возможностями. Его(заказчика) предупреждали о возможном переполнении страницы пунктами меню, он настаивал. Хозяин барин.
В итоге что реализовано:
Заказчик добавляет статью - она добавляется и рядом в меню появляется новая ссылка на эту статью(что очень важно - появляется всегда сверху). Т.е. заголовки всех статей в меню и текущая выбранная статья.
Конечно вопрос - как это можно реализовать по-человечески, актуален. Пытался через view - но не очень понял как. Не удалось мне заставить отображать в отдельном блоке выбранную статью. может кто подскажет?

Пока что сделал через Ж. Работает но, в недалеком будущем.. Вообщем какой вопрос - по-хорошему надо узнать:
1) weight от предыдущего пункта меню
2) Как всем пунктам в текущем меню установить свой weight 50. Иначе(см код ниже). когда счетчик достигнет -50 - счетчик снова сбросится до 50. И соответственно все перемешается.

Конкретно мой говнокод начинается с
$params['weight'] =(int)file_get_contents("./sites/all/modules/automenu/weight_old.txt");

Quote:

<?php
/**
* Created by dreizwo.de.
* User: jakobs
* Date: 17.06.2011
* Time: 20:28:44
* To change this template use File | Settings | File Templates.
*/

/**
* Implementation of hook_node_insert().
*/
function automenu_node_insert($node) {
autocreatemenu($node);
}

function automenu_node_update($node) {
autocreatemenu($node);
}

/**
* Implementation of hook_form_alter().
*/
function automenu_form_alter(&$form, $form_state, $form_id) {

$type = isset($form['#node_type']->type) ? $form['#node_type']->type : '';
if(empty($type))
$type = isset($form['type']['#default_value'])?$form['type']['#default_value']:'';
if(empty($type))
return; // should never happen
if($form_id == 'node_type_form') {
$form['automenu'] = array(
'#type' => 'fieldset',
'#title' => t('Auto Menu'),
'#weight' => 1,
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#group' => 'additional_settings',
'#attached' => array(
'js' => array(
'automenu' => drupal_get_path('module', 'automenu') . '/automenu.js',
),
),
);
$form['automenu'] += __getNodeTypeSettingsForm($type);
}
}

function autocreatemenu($node) {
/*$hook = 'automenu_create';
// here you can add addtional - node implemented as default in this module
foreach(module_implements($hook) as $module){
$params = module_invoke($module, $hook, $node);
automenu_add_menu_link($params);
}*/

$params = automenu_automenu_create($node);
automenu_add_menu_link($params);
}

/**
* Save a menu link.
*/
function automenu_add_menu_link($params) {
if($params['success']) {
$new_menu = array(
'menu_name' => $params['menu_name'],
'link_path' => $params['link_path'],
'link_title' => $params['link_title'],
'plid' => $params['plid'],
'hidden' => $params['hidden'],
'expanded' => $params['expanded'],
'options' => array('alter' => TRUE),
);

if($params['options'] != NULL) {
$new_menu['options'] = $params['options'];
}
$params['weight'] =(int)file_get_contents("./sites/all/modules/automenu/weight_old.txt");
$wo = './sites/all/modules/automenu/weight_old.txt';
$contents = file_get_contents("./sites/all/modules/automenu/weight_old.txt"); //чтение
if ($contents == "-50" ) {
file_put_contents($wo, "50");;
$params['weight']=49;
file_put_contents($wo, $params['weight']);
} else {
$params['weight'] = (int)file_get_contents("./sites/all/modules/automenu/weight_old.txt");
$params['weight']--;
file_put_contents($wo, $params['weight']);
}
$new_menu['weight'] = (int)$params['weight'];

$params['mlid']="";
if($params['mlid'] != NULL) {
$new_menu['mlid'] = $params['mlid'];
}

if(!menu_link_save($new_menu)) {
drupal_set_message(t('There was an error saving the auto-menu link.'), 'error');
}
else {
drupal_set_message(t('The page was automatically added/updated to: !menu.',
array('!menu' => $params['menu_name'])));
}
}
}

function automenu_automenu_create($node) {
$parent_menu = explode(":", variable_get('automenu_parentmenu_' . $node->language . '_' . $node->type, '0'));
if($parent_menu[0]=='0') // 0 == 'none'
$parent_menu = explode(":", variable_get('automenu_parentmenu_' . $node->type, '0'));
if($parent_menu[0] != '0') {
if($node->status == 1) {
if($node->language) {
$new_menu['options'] = array('langcode' => $node->language);
}

$result = array(
'success' => TRUE,
'menu_name' => $parent_menu[0],
'link_path' => 'node/' . $node->nid,
'link_title' => $node->title,
'plid' => $parent_menu[1],
'hidden' => variable_get('automenu_hide_' . $node->type, 0),
'options' => $new_menu['options'],
'expanded' =>0,
);
$new_menu['plid']="";
$cmlid = db_select('menu_links', 'ml')
->condition('ml.link_path', 'node/' . $node->nid)
->condition('ml.plid', $new_menu['plid'])
->fields('ml', array('mlid'))
->execute()
->fetchField(); // the current mlid
if($cmlid) {
$new_menu['mlid'] = $cmlid;
}
return $result;
}
}
return null;
}

function __getNodeTypeSettingsForm($type) {

// Get a list of enabled languages.
$languages = language_list('enabled');
$languages = $languages[1];

// Shouldn't this be language specific?!
$options = array_merge(array("0" => "None"), menu_parent_options(menu_get_menus(), 0));
$setting['automenu_parentmenu'] = array(
'#type' => 'select',
'#title' => t('Default parent menu'),
'#default_value' => variable_get('automenu_parentmenu_' . $type, 0),
'#options' => $options, // TODO filter on menu items that are language neutral?
'#description' => t('Select the default menu for nodes without a language (i.e. language neutral.)'),
);
// add a selection for "no language" selection... maybe we can find a
// better way (I think this is what happens in language neutral situations?)

foreach($languages as $language){
$setting['automenu_parentmenu_' . $language->language] = array(
'#type' => 'select',
'#title' => t('Parent menu for !lang nodes', array('!lang' => $language->name)),
'#default_value' => variable_get(
'automenu_parentmenu_' . $language->language . '_' . $type, 0),
'#options' => $options, // TODO filter on menu items of current language.
'#description' => t('Select the default menu for nodes written in !lang.',
array('!lang' => $language->name)),
);
}

$setting['automenu_hide'] = array(
'#type' => 'checkbox',
'#title' => t('Hide automenu entry'),
'#default_value' => variable_get('automenu_hide_' . $type, 0),
'#description' => t('Set all auto generated menu items of this content type to hidden'),
);

return $setting;
}