"Я пойду!" 1.0b

Прислано: nleo

вт, 11/11/2008 - 17:52

Другие статьи по теме:

Модуль добавляет для содержимого типа event список пользователей, которые будут участвовать в событии.
Использует AJAX и jQuery.

Это мой первый модуль, можно сказать тренировочный. Писал его одним глазом глядя в книгу по 5 версии друпала другим глазом в модуль plus1 для 6. jQuery и AJAX вообще первый день знакомства у меня. Жду комментариев по правильности написания кода.

Не позволяет менять настройки через админку. Если надо изменить тип содержимого смотрите 56 строку.

Скрипт установки не тестировал.

А так вроде все должно работать)

UPD: Версия 1.0b
Не изменяю весь текст ноды, посколько кому-нибудь возможно будет интересно в образовательных целях проследить развитие модуля

UPD2: Альтернативы:

 Signup мощный и навороченый модуль от производителя)

Я пойду от bodro. Более гибкий в настройке.

Прикрепленный файлРазмер
leoevents.zip2.47 кб

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано Ильич Рамирес Санчес в вт, 11/11/2008 - 20:49.

хм... у нас будет схожая задачка. но для 5ки. гляну JS


Опубликовано zhylik в ср, 12/11/2008 - 05:37.

1. t() в меню
в leoevents_menu() заголовок ("title") и описание ("description") в 6-ке не надо прогонять через ф-ию t(). Сразу пиши 'title' => 'Go' (http://api.drupal.org/api/function/hook_menu/6 -- "title": Required. The untranslated title of the menu item)

2. Регистрация тем
Темы в шестерке надо регистрировать через hook_theme() (http://api.drupal.org/api/function/hook_theme/6 -- там пример и все есть). Если при разработке модуля ты в leoevents_theme() чего-то поменял, то необходимо перезагрузить список модулей (обновить), чтобы тема инициализировалась и заработала. И потом использовать:

return theme('leoevents', $nid,$link_text);

3. Алиасы таблиц
Не критично, но вроде как принято использовать алиасы таблиц. Тобиш строчка 101:

$res = db_query('SELECT name, {leoevents}.uid FROM {users}, {leoevents} WHERE {users}.uid = {leoevents}.uid AND nid = %d',$nid);

станет
$res = db_query('SELECT u.name, l.uid FROM {users} u, {leoevents} l WHERE u.uid = l.uid AND l.nid = %d',$nid);

4. Только активные пользователи
Смотри на запрос в пункте 3. Не забывай проверять, чтобы статус юзера был активным, иначе выведутся заблокированные пользователи:

$res = db_query('SELECT u.name, l.uid FROM {users} u, {leoevents} l WHERE u.uid = l.uid AND l.nid = %d AND u.status=1',$nid);

5. При удалении пользователя
При удалении ноды ты удаляешь запись в табличке leoevents. Не забывай удалять записи при удалении пользователя (http://api.drupal.org/api/function/hook_user/6)

6. Вопрос красоты.
Не забывай убирать последнюю запятую в списке пользователей идущих на событие... 103—106 строчки. Можно либо формировать массив с линками на юзеров, а после while-а делать implode(', ', $my_array). Либо после while-a вырезать последнюю запятую из строчки. Первый способ затратней по памяти.

7. Вопрос оптимизации.
Так или иначе, если у тебя будет пятьсот юзеров, идущих на событие, то в функции leoevents_who_go() алиас на юзерские пути запросится 500 раз. Раз уж друпал так тупит с путями, то мне нравится пользовать следующее.
СРАЗУ ГОВОРЮ ФУНКЦИЮ НЕ СИЛЬНО ТЕСТИРОВАЛ!!!! ОНА СЫРАЯ. ДАЖЕ ВОЗМОЖНО НЕРАБОЧАЯ. ВОТ.

/**
 * Вспомогательные константы для удобства передачи в функцию
 * массовой загрузки алиасов nedv_alias_loader().
 * Данные константы передаются первым параметром и служат для указания фунции:
 * осуществлять сбор путей без запроса к БД для получения алиаса (NEDV_COLLECT_PATHS),
 * прекратить сбор и вернуть список алиасов собранных путей (NEDV_RETURN_ALIASES).
 *
 * @see nedv_alias_loader()
 */
define('NEDV_COLLECT_PATHS', TRUE);
define('NEDV_RETURN_ALIASES', FALSE);
 
 
/**
 * Массовая загрузка алиасов.
 *
 * Для сокращения количества запросов к БД для получения алиасов для ссылок,
 * была создана функция массовой загрузки алиасов. Функция работает по следующей схеме:
 * при запуске ф-ии с $collect=TRUE все переданные пути собираются в массив; при
 * передаче параметра $collect=FALSE собранные пути разбиваются на группы по 100 штук.
 * Для каждой такой группы выдается запрос для получения алиасов.
 *
 * Полученные алиасы возвращаются функцией. Если для какого-то пути алиас не найден,
 * возвращается сам путь. Массив путей очищается.
 *
 * Важное замечание. В возращаемом массива алиасов полностью сохраняются
 * Ключи, указанные при
 *
 * @param $collect
 *   Флаг, позволяющий определить собирать ли алиасы или выдавать результаты.
 *   Для удобства определены константы NEDV_COLLECT_PATHS (TRUE), и NEDV_RETURN_ALIASES (FALSE).
 * @param $path
 *   Путь, для которого ищется алиас или массив путей array({ключ} => {путь}, ...)
 * @param $key
 *   Уникальный ключ для текущего пути.
 *
 * @return
 *   При $collect=TRUE функция ничего не возвращает, при $collect=FALSE, функция
 *   вернет массив полученных алиасов.
 *
 * @todo
 *   Возможно было бы полезно сделать некий ключ, по которому можно было бы
 *   собирать пути в несколько групп (как в пейджере).
 */
function nedv_alias_loader($collect, $path = NULL, $key = NULL) {
	// Массив собранных путей.
	static $collected_paths = array();
 
	// Обрабатываем переданные пути.
	if ($path !== NULL) {
		if (is_array($path)) {
			// array_merge позволит сохранить ключи
			$collected_paths = array_merge($collected_paths, $path);
		}
		elseif ($key === NULL) {
			$collected_paths[] = $path;
		}
		else {
			$collected_paths[$key] = $path;
		}
	}
 
	if ($collect == FALSE && (count($collected_paths) > 0)) {
		// Передан запрос на получение алиасов.
		$aliases = array();
		// Если  модуль path установлен, загружаем алиасы для тех путей,
		// для которых они существуют.
		if (module_exists('path')) {
			// Разбиваем запрос на части по 100 алиасов.
			$parts = array_chunk($collected_paths, 100, TRUE);
			foreach ($parts as $destinations_part) {
				$query = db_query("SELECT src, dst FROM {url_alias} WHERE src IN ('". implode("', '", $destinations_part) ."')");
				while ($alias = db_fetch_object($query)) {
					$aliases[$alias->src] = $alias->dst;
				}
			}
		}
		// Перебираем собранные пути, и для каждого пути либо ставим алиас,
		// либо оставляем путь, если алиас для него не найден.
		$paths = array();
		foreach ($collected_paths as $key => $path) {
    	$paths[$key] = (isset($aliases[$path])) ? $aliases[$path] : $path;
		}
		// Очищаем массив собранных путей.
		$collected_paths = array();
 
		return $paths;
	}
}

Как с ней работать.
Смотри на строчки 103 и ниже. Было:

...
 
while($data = db_fetch_object($res)){
  #$out .= $data->name;
  $out .= l($data->name,'user/'.$data->uid).', ';
}
 
...

Стало:

...
 
$anybody_goes = FALSE;
while($data = db_fetch_object($res)){
	// Ставим путь для странички юзера в очередь на получение алиаса пути
	nedv_alias_loader(NEDV_COLLECT_PATHS, 'user' . $data->uid, $data->name);
	$anybody_goes = TRUE;
}
if ($anybody_goes) {
	// Загружаем алиасы для ссылок на странички юзеров
	$user_links = nedv_alias_loader(NEDV_RETURN_ALIASES);
	if (is_array($user_links) && (($user_cnt = count($user_links)) > 0)) {
		$i = 1;
		foreach ($user_links as $user_name => $user_link){
			$out .= l($user_name, $user_link, array('alias' => TRUE));
			$out .= ($i != $user_cnt) ? ', ' : '';
			$i++;
		}
	}
 
}
 
...

Еще раз замечу, что функция сырая и возможно лагает. И она рекомендуется к использованию, если идущих на встречу больше 10. Если оных меньше, сойдет и твой вариант. Надеюсь как узнать количество идущих на эвент ты сможешь узнать.

8. Подгрузка JS
Еще меня смущает leoevents_html()
Я МОГУ ОШИБАТЬСЯ!!!! Вроде как во views можно выводить такую страничку, на которой распечатываются несколько целых нод одновременно (не тизеры, а именно целые ноды).
Так вот, для каждой такой ноды будет вызываться leoevents_html() => drupal_add_js(drupal_get_path('m... будет вызываться столько же раз. И получится в коде странички несколько раз будет инклюдится твой JS-файл.
Как этого избежать:

function leoevents_html($nid, $teaser){
	static $js_connected = FALSE;
	if (!js_connected) {
		drupal_add_js(drupal_get_path('module', 'leoevents') .'/leoevents.js');
		$js_connected = TRUE;
	}
...

Еще раз скажу, могу ошибаться.


Опубликовано zhylik в вт, 11/11/2008 - 22:38.

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

название ф-ии подгрузки алиаса и констант начинается с nedv... это я просто скопирнул из кода своего модуля... меняй как хочешь.

А... еще) называй ф-ии человекопонятными названиями (leoevents_alrd_go()...) ну и по-английски писать правильно бы надо... (вроде пишется "who_goes")... у самого с этим проблемы и поэтому уйма времени уходит на поиск перевода слов в словарике :((


Опубликовано nleo в вт, 11/11/2008 - 23:16.

zhylik, спасибо огромное, даже не ожидал такого развернутого комменатрия, займусь правкой модуля


Опубликовано nleo в ср, 12/11/2008 - 08:56.

По комментарю zhylik:

1,3 - исправил

2 Кроме theme('leoevents', $nid,$link_text) пришлось добавить такой код:

function leoevents_theme() {
  return array(
    'leoevents' => array(
      'arguments' => array('nid', 'link_text'),
    ),
  );
}

Что это такое и как работает понятия не имею, но иначе не работает.

6 Сделал так

  if($out){
    return drupal_substr($out, 0,drupal_strlen($out)-2);
  }else{
    return t('None');
  }

8 Вывел в тизер аттачит яву вроде один раз, оставил как было, но заметил глюк, что если щелкнуть на одной ссылке, ява меняла текст для всех элементов на странице. Исправил, теперь и когда много документов все должно быть нормально. Теперь можно выводить в тизерах. Для этого меняем 57 строку.

7. Вопрос оптимизации
Не совсем понял.
Алиасы - это синомы путей, так? Но я же вроде их нигде не использую. Или функция l() перехватывается модулем path, тогда может проще и быстрее ссылку вручную создавать? Это получается самый быстр вариант с точки зрения производительности.


Опубликовано zhylik в ср, 12/11/2008 - 15:10.

7. Да. Но, тогда пользователь не сможет корректно добавить алиас на такие пути. Т.е. добавить-то он добавит, но при выводе страничек href в твоих ссылках останется исходным. Все модули для друпала must поддерживать алиасы.

9. Потом (вообще на глаз говорю...) отключи JS в броузере и попробуй добавить юзера к событию. Думаю ссылка сработает и юзер добавится, но откроется какая-то бредовая страница... с содержанием вида "{ "link_text": "I will go!", "who_go": " " }"
а правильно было бы делать редирект на ноду обратно и выводить зелененькое сообщение, о том, что вы добавлены.

реализацию подобного можно посмотреть на примере закладок на этом сайте.


Опубликовано Valeratal в ср, 12/11/2008 - 17:25.

спасибо, полезно


Опубликовано dd в ср, 12/11/2008 - 21:56.

а для 5-ой версии работает?


Опубликовано nleo в пн, 17/11/2008 - 11:39.

нет, на 5ку не расчитан

Итак, при удалении пользователя, он теперь удаляется из событий.

Для себя я полностью отказался от алиасов, если они нужны правим 123 строку:

function leoevents_ulink($name,$uid){
  return '<a href="/user/'.$uid.'">'.$name.'</a>';//l($name,'user/'.$uid);    
}

При отключении ява скрипт юзер будет редиректится на ноду события.

    drupal_goto('node/'.$nid, NULL, NULL, 302);


Опубликовано fasdalf@fasdalf.ru в вт, 02/12/2008 - 07:00.

Спасибо, пригодилось. Кстати, почему в комплекте нет перевода на русский?


Опубликовано nleo в вт, 02/12/2008 - 08:01.

перевод надо будет добавить

а пока добавил кеширование списка идущих на мероприятие

<?php
//в этой функции изменяется список участвующих, поэтому кеш сбрасываем
function leoevents_go($arg) {
  ...  
  
cache_clear_all('leoevents'.$nid,'cache');
  ...
}

function 
leoevents_who_go($nid){
  
//если уже есть в кеше, возвращаем его
  
if ($cache cache_get('leoevents'.$nid)) {return $cache->data;}
  
//иначе формируем список
  
$res db_query('SELECT name, u.uid FROM {users} u, {leoevents} l WHERE u.uid = l.uid AND nid = %d',$nid);
  
$out '';
  while(
$data db_fetch_object($res)){
    
$out .= leoevents_ulink($data->name,$data->uid).', ';
  }  
  if(
$out){
    
$out drupal_substr($out0,drupal_strlen($out)-2);
  }else{
    
$out t('None');
  }
  
//устанавливаем кэш
  
cache_set('leoevents'.$nid,$out);
  return 
$out;
}
?>


Опубликовано fasdalf@fasdalf.ru в пт, 19/12/2008 - 09:12.

На странице настроек что-то должно быть, или leoevents_settings правильно вырезана и объявление пункта меню можно убрать?

Прикрепляю версию без страницы с настройками, но с исправленным .info В нём добавлены зависимость от event и текстовое описание. ru.po прилагается.

UPD variable_get() используется, значит должна быть страница с настройками.


Опубликовано nleo в пт, 19/12/2008 - 12:19.

спасибо, variable_get() и leoevents_settings() сделаны с расчетом на будущее, сейчас не нужны


Опубликовано ingumsky@drupal.org в сб, 20/12/2008 - 20:08.

Здорово... У меня возникло пара вопросов как у потенциального пользователя модуля.

1. Тип события event задаётся каким-то другим модулем или его нужно создавать самостоятельно?
2. Не хотите ли Вы зарегистрировать модуль на drupal.org, чтобы предоставить доступ к нему большему числу пользователей и получить советы/помощь в доведении его до стабильной версии?


Опубликовано nleo в вс, 21/12/2008 - 06:51.

1. Создаешь самостаятельно или переименовываешь любой существующий или в модуле меняешь так чтоб он к какому-то другому цеплялся.

2. Я думал об этом - можно. Но мне бы хотелось как-нибудь узнать статистику скачек модуля - насколько он популярен


Опубликовано nleo в вс, 21/12/2008 - 07:02.

и если стоит выкладывать, то какие есть предложения по названию модуля? как я понял своим именем называть не принято, а что-то короткое, чтобы отражало суть мне пока в голову не приходит (только "go_list" или "participates_list")


Опубликовано ingumsky@drupal.org в пн, 22/12/2008 - 01:10.

1. Тогда имеет смысл добавить в настройки модуля тип контента, к которому он цепляется. Так, ИМХО, удобнее. Или это и так есть в Road map?

2. Я думаю, он будет довольно популярен. Я не проверял, есть ли аналогичные модули в репозитории, но такая фишка, на мой взгляд, может понадобится многим. В качестве названия можно использовать что-нибудь вроде attendance.

3. Я планирую использовать использовать Ваш модуль для события, дата которого будет время от времени меняться. Это будет что-то вроде еженедельного сбора единомышленников, поэтому хочется привязать каждый из этих сборов к одной ноде, а раз в неделю указывать новую дату и время собрания. Можно ли будет добавить сброс числа посетителей после наступления даты и времени события?


Опубликовано fasdalf@fasdalf.ru в пн, 22/12/2008 - 17:19.

могу предложить название "go2event"
А на drupal.org как раз и будет статистика.


Опубликовано nleo в пн, 22/12/2008 - 20:29.

тут пришла мысль - "takeapart" или "takepart" помоему лучше отражает суть

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

<?php
db_query
('DELETE FROM {leoevents} WHERE nid = %d',$nid);
?>

по первому пункту, конечно, прежде чем на д.о выкладывать сделаю возможность хоть каких-то настроек из админки :)


Опубликовано ingumsky@drupal.org в пн, 22/12/2008 - 22:34.

По названию — уже лучше какой-нибудь «areUgoing» -)

По третьему пункту. ОК. Я думаю, что я либо буду делать это сниппетом, либо попробую «дорасти» до того, чтобы написать и предложить такую функцию в качестве опции к вашему модулю -)


Опубликовано fasdalf@fasdalf.ru в вт, 23/12/2008 - 07:58.

В тему запросов фич. Странно выглядит - событие в архиве, но записаться можно. Можно менять "уже идут" на "туда пошли" когда event (из модуля) становится прошедшим и выключать "я пойду"?


Опубликовано nleo в вт, 23/12/2008 - 08:58.

тогда надо в модуль добавлять и создание типа материала с полем дата, и по ее прошествии производить какие-то действия.

но! под конкретные события (клубные вечеринки или музейные выставки) могут требовать еще свои поля. ССК может добавлять поля к типу материала созданного модулем свои поля? просто у меня он не стоит не могу посмотреть. Или может сразу интегрировать его с ССК расчитывая только на совместное использование и соотвествующим полем даты созданным через ССК?


Опубликовано fasdalf@fasdalf.ru в вт, 23/12/2008 - 09:22.

имелся ввиду конкретный  event


Опубликовано ingumsky@drupal.org в вт, 23/12/2008 - 09:29.

fasdalf@fasdalf.ru
На last.fm подобное реализовано таким образом, что на событие в прошлом тоже можно «пойти», но в формате «я ходил». А фраза «туда идут» как раз меняется на «там были».

PS Ещё там есть вариант «я собираюсь пойти»/«я думал сходить» -)

nleo
Да, CCK может добавлять свои поля к материалу, созданному модулем. Во всяком случае, я нигде не читал обратных утверждений. А интегрировать Ваш модуль с CCK мне кажется неразумным — получается, что желание реализовать небольшую и лёгкую функцию будет тянуть зависимость от тяжёлого CCK, что не есть гуд.


Опубликовано fasdalf@fasdalf.ru в чт, 25/12/2008 - 10:42.

«я ходил»
Хорошая мысль. «Всё уже придумано до нас» (с)

будет тянуть зависимость
Ну, есть же if (module_exist('content')) {};
Я в том смысле, что поддержка CCK и зависимость от него - не одно и то же.
Но в этом случае без админской панельки уже не обойтись - и типы материалос искать, и дату окончания из event/cck выбирать. Уже "nice tiny module" вырастет в убер-монстра.


Опубликовано ingumsky@drupal.org в чт, 25/12/2008 - 11:36.

Я же комментировал конкретную фразу: «Или может сразу интегрировать его с ССК расчитывая только на совместное использование» ;)

По-моему, это ещё не монстр получается, зато модуль, которым удобно управлять и настраивать.


Опубликовано nleo в чт, 25/12/2008 - 13:23.

Итак релизю версию 1.0b

Добавил настройки в админке: к каким нодам привязывать и где показывать (при просмотре документа или в тизере и при просмотре). Поумолчанию показывается и в тизере и в ноде, но не привязан ни к какому типу документов.

Теперь буду думать над второй версией интегрированной с модулем Event. Идея "Я ходил" мне тоже понравилась.


Опубликовано nleo в чт, 25/12/2008 - 18:13.

и сразу версия 1.1b с поддержкой модуля Event

Новое:
В админке можно включить поддержку модуля Event
Переделано кеширование, теперь весь вывод модуля кешируется, а не только список идущих

Проблемы:
1. Никаких проверок на наличие модуля Event
2. Когда время события наступает, кешь не сбрасывается, поэтому можно наблюдать надписи в будущем времени, до тех пор пока кто-нибудь не нажмет "Я пойду" или вручную не будет сброшен кеш.
3. Кажется я забыл прошедшие времена английского, не уверен, что правильно их написал:

<?php
function leoevents_get_messages(){
    return array(
        array(
'link'=>array('I did go','I didn\'t go!'), 'title'=>'Went:'),
        array(
'link'=>array('I will go!','I will not go!'),'title'=>'Already go:')
    );
}
?>

Основные изменения в коде:

<?php
function leoevents_html($node){
  
drupal_add_js(drupal_get_path('module''leoevents') .'/leoevents.js');
  global 
$user;

  
$alrd_go = (int) leoevents_alrd_go($node->nid,$user->uid);  
  if (
$cache cache_get('leoevents'.$node->nid.'-'.$alrd_go)) {return $cache->data;}  
  
$messages leoevents_get_messages();

  
/* Эта конструкция проверит включенали поддержка модуля Event
   * и если она включена, то будет проверено не прошло ли еще событиве
   * если поддержка модуля Event отключена, все события считаются активными (предстоящими)
   */
  
$isactive   variable_get('leoevents_eventsupport''0') ? strftime('%Y-%m-%d %H:%M:%S')<$node->event['start'] : 1;
  
$link_text  $messages[$isactive]['link'][$alrd_go];
  
$title_text $messages[$isactive]['title'];

  
$out theme('leoevents',$node->nid,$link_text,$title_text);
  
cache_set('leoevents'.$node->nid.'-'.$alrd_go,$out);
  return 
$out;
}

function 
leoevents_go($arg) {
  global 
$user;
  list(
$nid,$script) = explode('-'$arg);
  
  if(
$user->uid && $nid){
    
cache_clear_all('leoevents'.$nid.'-0','cache');
    
cache_clear_all('leoevents'.$nid.'-1','cache');

    
$messages leoevents_get_messages();
    
$alrd_go  leoevents_alrd_go($nid,$user->uid);

    
$isactive   variable_get('leoevents_eventsupport''0') ? strftime('%Y-%m-%d %H:%M:%S')<leoevents_get_event_start($nid) : 1;
    
$link_text  $messages[$isactive]['link'][!$alrd_go];
    
$title_text $messages[$isactive]['title'];

    if(
$alrd_go){
      
db_query('DELETE FROM {leoevents} WHERE uid = %d AND nid = %d',$user->uid,$nid);      
    }else{        
      
db_query('INSERT INTO {leoevents} (uid,nid) VALUES (%d,%d)',$user->uid,$nid);
    }
    
$msg = array('link_text' => t($link_text), 'who_go' => leoevents_who_go($nid), 'nid' => $nid);    
  }else{
    
$msg drupal_json(array('result' => check_plain(t('Error!'))));
  }

  
// если переход не через ява скрипт вернем на страницу с нодой
  
if($script){
    
drupal_json($msg);
  }else{
    
drupal_goto('node/'.$nidNULLNULL302);    
  }  
}

function 
leoevents_get_event_start($nid){
    return 
db_result(db_query('SELECT event_start FROM {event} WHERE nid = \'%d\'',$nid));
}
?>

Файл перевода не дополнял, поскольку возможно исходные строки еще изменятся


Опубликовано gumk в чт, 25/12/2008 - 20:06.

спасибо!!! пора и на drupal.org!!!


Опубликовано volocuga в чт, 25/12/2008 - 21:06.

Отличный и полезный модуль,наши девелоперы радуют


Опубликовано ingumsky@drupal.org в пт, 26/12/2008 - 01:38.

Отлично!

1.

"nleo" написал(а):

Никаких проверок на наличие модуля Event

Как я понимаю, нужно просто добавить следующее условие:
if (module_exist('event'))
3.

"nleo" написал(а):

array('link'=>array('I did go','I didn\'t go!'), 'title'=>'Went:'),
array('link'=>array('I will go!','I will not go!'),'title'=>'Already go:')

Мне кажется, правильнее переделать фразы так:

"ingumsky" написал(а):

array('link'=>array('I went','I didn\'t go!'), 'title'=>'Attended:'),
array('link'=>array('I\'ll go!','I won\'t go!'),'title'=>'Attending:')

Как я понимаю, в шестом Друпале запросы к базе принято оформлять несколько иначе — вместо «DELETE FROM {leoevents} WHERE uid = %d AND nid = %d» нужно писать «DELETE FROM {leoevents} l WHERE uid = %d AND nid = %d», например.


Опубликовано nleo в пт, 26/12/2008 - 13:14.

у всех модуль работает? я обнаружил что у меня модуль ко всем типам данных цепляется

Вот пример из книги Pro Drupal development

<?php
$types_to_annotate 
variable_get('annotate_nodetypes', array('page'));
// Abort if this node is not one of the types we should annotate.
if (!in_array($node->type$types_to_annotate)) {
  break;
}
?>

у меня:

<?php
if (in_array($node->typevariable_get('leoevents_nodetypes', array()))) {
  
// цепляем содержимое
}
?>

ничего не понимаю


Опубликовано ingumsky@drupal.org в пт, 26/12/2008 - 13:32.

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

Может имеет смысл variable_get() вынести в отдельную переменную и, аналогично примеру, «пойти от противного»?


Опубликовано nleo в пт, 26/12/2008 - 13:29.

в общем для версий 1.0b и 1.1b

надо в leoevents_nodeapi() заменить строчку

<?php
if (in_array($node->typevariable_get('leoevents_nodetypes', array()))) {
?>

на
<?php
if (in_array($node->typearray_flip(variable_get('leoevents_nodetypes', array())))) {
?>

похоже книге нельзя верить)


Опубликовано nleo в пт, 26/12/2008 - 13:30.

"ingumsky@drupal.org" написал(а):

Может имеет смысл variable_get() вынести в отдельную переменную?

пробовал - от перестановки мест слагаемых...


Опубликовано ingumsky@drupal.org в пт, 26/12/2008 - 17:52.

"nleo" написал(а):

похоже книге нельзя верить)

Может быть это из-за того, что книга о пятом Друпале, а это шестой?


Опубликовано nleo в сб, 27/12/2008 - 14:00.

"ingumsky@drupal.org" написал(а):

Может быть это из-за того, что книга о пятом Друпале, а это шестой?

если бы, 2th edition о шестом. там даже описана структура массива типов нод для шестого, а код как в книжке про 5. но я правда ее внимательно не читал, я больше по русской книжке про 5й, а с этой сверяюсь когда что-то не получается


Опубликовано ingumsky@drupal.org в сб, 27/12/2008 - 17:12.

Хм... Перевод книжки о пятом, кстати, кривой до безобразия. Я дошёл до 15 главы пока что, так вот, даже не имея никаких знаний о Друпале, можно найти кучу ошибок -(( А книжка про шестой у вас в электронном виде или в печатном, если не секрет?

Хм... А зачем там array_flip?


Опубликовано jsv в сб, 27/12/2008 - 19:05.

это более удобный аналог http://drupal.org/project/signup ? Или в чёмто есть принципиальные отличия? Или это вообще для тренировки?


Опубликовано nleo в вс, 28/12/2008 - 08:55.

"jsv" написал(а):

А книжка про шестой у вас в электронном виде или в печатном, если не секрет?

электронный

"ingumsky@drupal.org" написал(а):

А зачем там array_flip?

она меняет местами ключи и значения хэша, зачем? это станет ясно если взглянуть на структуру массива, который возвращает variable_get('leoevents_nodetypes', array())
'page' => 0, 'event' => 'event', 'story' => 0

"jsv" написал(а):

это более удобный аналог http://drupal.org/project/signup ? Или в чёмто есть принципиальные отличия? Или это вообще для тренировки?

мне просто понадобились списки идущих и я их написал про signup я не знал. там конечно гораздо больше функций, модуль на 118 килобайт против 4 у меня) (в запакованом виде) Цель потренироваться тоже стояла, но она вторична

Где-то тут уже видел: человек пишет модуль, выкладывает, людям нравится: "да такой модуль нужен!", потом оказывается на д.о уже есть подобный, но с большим функционалом)

для моих целей мой меня пока вполне устраивает, но singup тоже гляну, спасибо, что сказали


Опубликовано gumk в вс, 28/12/2008 - 09:52.

Мне модуль singup не нравиться, в leoevents ajax ом подгрузка идет, так что буду ждать доработанной версии leoevents


Опубликовано nleo в вс, 28/12/2008 - 11:19.

"gumk" написал(а):

буду ждать доработанной версии leoevents

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


Опубликовано ingumsky@drupal.org в вс, 28/12/2008 - 19:14.

Почему бы тогда просто не подставлять в качестве ключа $node->type и не проверять TRUE он или нет? Я пока плохо знаком с синтаксисом php, но логика такова:
if leoevents_nodetypes[$node->type] != 0 {}

А не могли бы Вы подкинуть ссылку, где можно скачать книжку, или её саму на мыло <мой ник на яндексе>?


Опубликовано nleo в вс, 28/12/2008 - 19:22.

"ingumsky@drupal.org" написал(а):

if leoevents_nodetypes[$node->type] != 0 {}

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

<?php
$node_types 
variable_get('leoevents_nodetypes', array());
if (
$node_types[$node->type]) {
?>

книжка в пути


Опубликовано ingumsky@drupal.org в вс, 28/12/2008 - 19:37.

"nleo" написал(а):

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

;) Будем считать это моим первым вкладом в сообщество разработчиков Друпал ;-)

Я перестраховался с «!= 0» на тот случай, если php делает различие между NULL и 0, потому что тогда if ($node_types[$node->type]) будет давать TRUE для всех типов, вне зависимости от того, прописано для них 0 или 1.

PS Большое спасибо за книжку!


Опубликовано penexe в вс, 28/12/2008 - 19:42.

<?php
in_array
($node->typevariable_get('leoevents_nodetypes', array()), TRUE)
?>


Опубликовано fasdalf@fasdalf.ru в ср, 31/12/2008 - 10:07.

У меня почему-то отпал AJAX при обновлении до 1.1Б. На On Click ничего не висит, JS включен (gmap работает)
У текста "i did go" нет воскл. знака.
настройки по типам материалов модно встраивать в /admin/content/node-type/%name% (но мне удобнее как сейчас)


Опубликовано nleo в ср, 31/12/2008 - 10:14.

предлагаю проверить подключается ли JS файл, и сравнить id и class элементов в документе и в JS файле


Опубликовано nleo в ср, 31/12/2008 - 14:04.

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

UPD: или не с кешем, что-то непонятное. но это уже не сегодня


Опубликовано gorr в чт, 01/01/2009 - 08:41.

Интересная тема, буду следить за развитием, спасибо за модуль.


Новое на сайте