Предупреждение безопасности

Сегодня в 16-45 сайт был обновлён на новое ядро!
Судя по всему, за бэкэндом сайта никто не следит и требуется аудит кода и базы на предмет уязвимостей.
Также предлагаю начать обсуждение миграции на dru.io – сайт устарел и небезопасен.

Источник: http://www.drupal.ru/node/124683

Vkontakte comments widget (D6)

Привет всему друпал сообществу, с удовольствием выкладываю модуль вывода комментариев VKontakte на странице ноды для Drupal 6.
Самому понадобился недавно, но ничего достойного не нашел решил написать.
Ссыллка на sandbox проект:
https://www.drupal.org/sandbox/nextonizh/2410515
GIT clone:
git clone git.drupal.org:sandbox/nextonizh/2410515.git

Вложение Размер vk_comments.zip 9.42 КБ

Источник: http://www.drupal.ru/node/115176

7 июня в Санкт-Петербурге Drupal White Nights 2014

Город, который пронизан своей особой культурой. Город, в котором каждый камень способен рассказать свою уникальную историю. Город, чья летняя ночь светла как день. Все это – наш любимый Санкт-Петербург. И этим летом наш гостеприимный город встречает друпалеров из разных городов и стран.

7 июня большой праздник для нас, в Питере пройдет долгожданный Кемп – Drupal White Nights 2014. Мы шли к этому событию два года, встречаясь на семинарах, спринтах, тренингах и в неформальной обстановке. И вот, время пришло для чего-то большего.

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

Мы готовы принять как минимум 150 человек, нам это с легкостью позволят комфортные залы конгресс-центра ПетроКонгресс. За один день в два потока пройдут порядка 15 докладов о разработке на Drupal, администрировании, управлении проектами, бизнесе и многом другом. Несколько докладов уже заявлено, и мы продолжаем принимать заявки. Если у вас есть интересный опыт, и вы готовы им поделиться, то милости просим.

После завершения официальной части Кемпа, нас ждет вечеринка, которая позволит пообщаться с интересными людьми вне конференц-залов и формальностей. У нас так много идей о том, где и как провести вечеринку, что мы еще не приняли окончательного решения. Но в одном мы уверены, что это будет весело!

Регистрация на конференцию открыта и идет полным ходом, так что поспешите купить билет. Тем более, в апреле действует ранняя цена.

И на сладкое, специально для сообщества мы приготовили сюрприз и учредили конкурс Счастливый билет на Drupal White Nights 2014. Победитель получит бесплатный билет на конференцию и всеобщую известность

Будем рады видеть и слышать вас!


Соорганизатор конференции Drupal White Nights 2014
Константин Комелин

Источник: http://www.drupal.ru/node/109448

[Краснодар] DrupalCafe #2/2014 – Социальные сети на Drupal, разбираем Drupal Commons. 25 января 2014 в 15:00. Песочница

Всем привет.
Мы проведём очередное DrupalCafe в Краснодаре.
Время и место встречи – 25 января, суббота, 15:00, антикафе “Песочница“.
Основная тематика встречи – социальные сети на Drupal, будем разбирать сборку Drupal Commons и модули для построения социалок.
Расскажет, покажет и ответит на все вопросы – я, Степаньков Виктор
По всем вопросам можно:
звонить – 9183163495
писать – victor@rxb.name
*
**
*
*
*
*
*
*
*
*
*
*
Антикафе Песочница, Краснодар, ул. Кирова, 59, Краснодар
Как добраться:
Энка: 67, 106а, 15, 5, 39. Выходить на остановке Гоголя по ул. Октябрьской
ФМР : 6, 9, 65, 67, 106а, 9, 10, 39. Выходить на остановке Гоголя по ул. Октябрьской
ЧМР: 28, 65. Выходить на остановке Гоголя по ул.Октябрьской
КМР: с 1 пересадкой. До Галереи на 17, от Галереи – 3, 26, 2, 9, 15, 31, 5, 9, 15, 45 Выходить на остановке Гоголя по ул. Октябрьской
ГМР:
ЦМР: 3, 2, 9, 15, 31, 5, 15 Выходить на остановке Гоголя по ул.Октябрьской
ЮМР: 95 Выходить на остановке Гоголя по ул. Октябрьской, 8, 49 Выходить на остановке Гоголя по ул. Кубанонабережная

Источник: http://www.drupal.ru/node/106758

DrupalCafe Краснодар. Планы на 2014 год

Всем привет.
В 2013 году мы попробовали новый формат – DrupalTea, собирались в антикафе и обсуждали какие-то темы, общие или же разбивались на тройки по интересам.
В принципе, всё вышло довольно неплохо, но не хватало тематичности, докладов и периодиночности.
На 2014 годы планы следующие:
-Проводить встречи 1 раз в 2-3 недели по выходным.
-У каждой встречи будет своя тематика, например, ближайшие это SEO и интеграция с социальными сетями.
-Расписание будет известно заранее.
-Переименовываемся в DrupalCafe, чтобы всем было понятнее

Вопросы, предложения?

Источник: http://www.drupal.ru/node/106480

[DrupalЮг] Друпал-чай в Краснодаре 28 декабря 2013 15:00

Всем привет.
Мы проведём очередной Южный DrupalЧай.
Время и место встречи – 28 декабря, суббота, 15:00, антикафе “Песочница“. Потом для желающих afterparty в баре.
По всем вопросам можно:
звонить – 9183163495
писать – victor@rxb.name
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
Основная тема чаепития – результаты 2013 года и обсуждение проведения Drupal-конференции в мае 2014 года в Краснодаре.

Антикафе Песочница, Краснодар, ул. Кирова, 59, Краснодар
Как добраться:
Энка: 67, 106а, 15, 5, 39. Выходить на остановке Гоголя по ул. Октябрьской
ФМР : 6, 9, 65, 67, 106а, 9, 10, 39. Выходить на остановке Гоголя по ул. Октябрьской
ЧМР: 28, 65. Выходить на остановке Гоголя по ул.Октябрьской
КМР: с 1 пересадкой. До Галереи на 17, от Галереи – 3, 26, 2, 9, 15, 31, 5, 9, 15, 45 Выходить на остановке Гоголя по ул. Октябрьской
ГМР:
ЦМР: 3, 2, 9, 15, 31, 5, 15 Выходить на остановке Гоголя по ул.Октябрьской
ЮМР: 95 Выходить на остановке Гоголя по ул. Октябрьской, 8, 49 Выходить на остановке Гоголя по ул. Кубанонабережная

Источник: http://www.drupal.ru/node/105832

Drupal Meetup (Drupal Cafe) #5 – 26 октября 2013 в Санкт-Петербурге


Привет всем!
Приглашаем принять участие в очередной встрече в Санкт-Петербурге!

Вход бесплатный по предварительной и обязательной регистрации.

Источник: http://www.drupal.ru/node/104265

DrupalCafe #4 в Санкт-Петербурге

Привет всем!

Как вы относитесь к еще одной встрече в Санкт-Петербурге?

Мы решили посвятить ее проектам мечты на Drupal. Каждый сможет поделиться своей мечтой!

Регистрация и детали здесь: http://drupalspb.org/event/drupalcafe-4

Источник: http://www.drupal.ru/node/100189

Drupal Drinkup в Санкт-Петербурге

Привет, друзья!

Мы здорово провели время на нескольких DrupalCafe (#1, #2, #3).

Почему бы нам не разбавить наш сообщественный досуг кружечкой пива вместо привычного чая и кофе на DrupalCafe?

Рады анонсировать новый формат наших встреч – Drupal Drinkup.

Будем встречаться каждый четверг и ждем вас!

Время: 25.04.2013 20:00
Место: Санкт-Петербург, Новочеркасский пр., 35, MAMA ROMA

Подробнее смотрите на сайте питерского сообщества DrupalSPB.org.

Источник: http://www.drupal.ru/node/99286

[Краснодар][ДрупалЮг] ДрупалЧай #2. Маёвка

Первый ДрупалЧай прошёл довольно-таки неплохо.
20 человек для регионального сообщества это весомо, притом, что новичков было более половины.
Есть желание и возможность провести ДрупалЧай #2, где-то в конце апреля – начале мая.
Точную дату сообщу до середины следующей недели.
Так же, есть желание переквалифицировать встречи этого формата с обычных посиделок в некоторые мини-обучалки или же разделиться на две секции:
1-ая будет пить чай и говорить за жизнь.
2-ая будет учиться чему-то. От элементарных вещей типа создания новостей до разбора примеров API.
В антикафе “Песочница” есть проектор, так что особых проблем не возникнет.

Хочу собрать мнения народа заранее, отписывайтесь, плиз, в комментах. Интересуют темы для докладов/обучения, замечания и любые другие предложения.

Источник: http://www.drupal.ru/node/99139

[Краснодар] DrupalTea 13 апреля 2013. Вечер

Решили попробовать новый формат – ДрупалЧай.
Приходите в антикафе “Песочница” (г. Краснодар, Кирова 59 (Центр))вечером 13 апреля в в 18 часов.

Будем пить вкусный и настоящий чай предоставленный нашим чайным партнёром. На выбор – пуэр и зелёный чай.
А попутно можно познакомиться, пообщаться на друпальные и около друпальные темы, завести новые контакты, обсудить секцию Drupal на BarCamp Krasnodar 2013.
В качестве экспертов к которым можно будет подсесть и пообщаться, будут выступать
-Степаньков Виктор. Разработка модулей, поддержка сайтов, нагруженные решения.
-Петр Селфин. Создание и продвижение Drupal-сайтов

Знания, ноутбуки, чтобы где-то что-то показать, хорошение настроение и вкусный чай – гарантированы. Мероприятие ориентировано прежде всего на новичков в Друпале и веб-разработке.
Мероприятие бесплатное, вы платите только за пребывание в антикафе “Песочница” – 1.5р/минута, чай и печеньки включены в стоимость.

Вложение Размер drupaltea.jpg 114.85 КБ

Источник: http://www.drupal.ru/node/98866

Drupal Café в Одессе №3

Уважаемые друпалеры и друпалерши, мы рады пригласить Вас на Drupal Café в Одессе №3!
Мы собираемся в неформальной обстановке уютного офиса компании Ciklum, которая любезно предоставила помещение и помогает в организации мероприятия.

Вход на мероприятие бесплатный по предварительной, обязательной, регистрации.

План мероприятия.
- доклад “Google Analytics & Drupal: возможности, интерфейс, технические аспекты.”, уровень – начинающий – Ярослав Крутиков;
- доклад “Drush+Features”, уровень – начинающий – Олег Липовой;
- “Вопросы ответы новичков” – свободный формат. Общение на интересующие темы собравшихся.

Время и место
Дата проведения: 25 апреля.
Начало: 18:30.
Место проведения: г. Одесса, ул. Леха Качинского, 7 (бывшая Польская), офис компании Ciklum.

Форма регистрации на Drupal Café №3 в Одессе – https://docs.google.com/spreadsheet/viewform?formkey=dDJxVUptb0cxSjlCUE5…

Источник: http://www.drupal.ru/node/98189

DrupalCafé – чт, 21/03/2013 – 19:00, Россия, Москва

Второе DrupalCafé в Москве, узнаем подробности про Drupal 8 и про микроформаты, подписываемся, отмечаемся

http://drupalcafe.ru/ru/event/s-2013-03-21-150000-po-2013-03-21-170000

P.S.: В прошлый раз столкнулись с таким и на всякий случай обозначу явно – чтобы избежать платы за пользование услугами антикафе, при входе говорите, что вы на мероприятие и по договору с ЗАО “Госбук”.

Источник: http://www.drupal.ru/node/97756

Почему мой сайт так много стоит?

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

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

Для начала примем ряд аксиом, это необходимо нам для полной картины.
1. “Цели – Задачи” – ставит заказчик основываясь на том или ином опыте.
2. “Время – деньги” определяем мы – исполнители, это наши временные затраты определяющие конечную стоимость выпускаемого нами продукта. Для упрощения расчетов будем считать что все расходы (а оно почти всегда так и есть) включены в конечную стоимость часа работы программиста.
3. “Законченность проекта” – определяется заказчиком на основании удовлетворенности клиента. Т.е. проект можно считать законченным в том случае, когда заказчик удовлетворен тем что у него есть в настоящий момент времени (согласно технического задания).

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

Т1-Ф1 или “а что тут делать”

Сначала официально. Т1-Ф1 это базовый функционал друпала + простая темизация либо настройка базовой или бесплатной темы стоимость такого продукта в принципе равна времени затраченного на разворачивание сайта из коробки и настройку темы.
Подробно:
- БТД (базовая тема друпала) + СФ(стандартный функционал из коробки): условно бесплатно
Цена: “дешево до безобразия” обычно от “бесплатно” и до “кто за сколько продаст”.

К примеру студия берет за 1 час работы программиста 20$, значит, если идти по накатанной схеме установки и базовой настройке друпала (разворачивание сборки, или просто движок + модули) примерно 1 час, то можно выдвигать слоган 20$ за сайт и вперед (в дальнейшем все денежные эквиваленты будут браться из расчета 20$ час), но ….
Вы должны как исполнитель сразу объявить заказчику что он получает в конечном итоге за эти деньги и время, в противном случае мы станем свидетелями следующей ситуации:

“а что тут делать” – Многие очень часто сталкиваются с такой формулировкой и на самом деле это действительно так, если заказчика вполне устраивает бюджетное решение основанное на стандартном функционале. Однако, чаще всего это совсем не так. Просто визуальные ожидания заказчика и понимание задачи разработчиком в большинстве случаев изначально находятся в разных плоскостях и существует задача свести их в одну плоскость, а еще лучше совместить для получения итогового качественного продукта .

В качестве примера.
Многие из нас очень часто встречались с задачей “регистрация пользователей на сайте” – казалось бы куда проще = стандартный функционал друпала, что тут обсуждать или пережевывать, но смотрите как одна фраза в ТЗ или просто банальная хотелка – “как там” превращает вполне тривиальную задачу в “головняк” для разработчика:
“По нажатию на клавишу “восстановить пароль” пользователю должно приходить письмо в котором указан его текущий логин в системе и пароль указанный при регистрации, никаких одноразовых ссылок”.
Получается что вполне стандартное с точки зрения заказчика требование (пусть оно и противоречит требованиям безопасности о хранении паролей в явном виде, сейчас мы не об этом) перерастает для нас в дополнительную работу. Написать модуль, который будет перехватывать задаваемый пользователем или генерируемый системой при регистрации пароль, записывать его в отдельную таблицу БД из которой мы по запросу сможем отправлять нашим пользователям забытые пароли.

Вывод: мелочь из примера увеличивает стоимость разработки минимум на 2-3 часа и либо вы это делаете бесплатно угоду клиенту т.е. из 20$ в 80$ и дарите клиенту 60$, либо пытаетесь объяснить что стандартно это не было предусмотрено движком (клиента чаще всего не интересует, что там предусмотрел Дрис и его коллеги а что нет).
В конечном итоге в 90% случаев клиент с недовольной миной отзывается о вас “вот пообещал все сделать за час а в итоге ничего не сделал, функционал не готов, сайт не работает”.

Таких мелочей и нюансов может быть великое множество. Особенно явно это видно на проектах без технического задания, “грамотный” заказчик оперируя фразой “а что тут делать” заставляет разработчика постоянно тратить время на всякого рода мелочи которые соответственно увеличивают конечную стоимость продукта, но эти средства к вам как исполнителю уже не вернутся, вас будут выжимать как лимон

Поэтому для сайтов выходящих на первый этап Т1-Ф1 используются типовые решения с фиксированным ТЗ и зачастую фиксированной стоимостью. Заказчик должен явно понимать что за свои кровные N долларов он получит вот такое чудо света и никак ни больше и ни меньше. Так же заказчик должен изначально знать и быть готовым к тому что любые его “хочу” сверх ТЗ должны просчитываться и оплачиваться отдельно и они переводят продукт в следующую итерацию.

Т2-Ф2 или “а что тут делать – 2”
Сначала официально. Т2-Ф2 это + дизайн с последующим созданием темы + небольшие отдельные хотелки и финтифлюшки реализуемые на этапе темизации, либо написанием мелких кастомных модулей.

Подробно:
- дизайн (400$ 20часов) может быть заменен дизайном заказчика, тогда бесплатно;
- создание темы (до 40 часов 800$, возьмем половину)
- стоимость отдельного функционала (хотелки) в зависимости от задач и почасового рейта компании.
Итого: итого в среднем по стране без хотелок мы из 1 часа превращаемся в 1 недельную работу (40 часов) и стоимостью в среднем в 800$ без учета хотелок.

В качестве примера.
“а что тут делать -2” – во избежании очередных недопониманий о том “что тут делать”
Банальное слайдшоу из 2-100 картинок на главной странице между меню и основным контентом такое “каждый школьнег умеет делать”, но посмотрим на ожидания заказчика:
- он в 100% подразумевает, что картинки можно было удалять и добавлять из админки.
- он в 95% подразумевает, что можно добавить текст если захочешь и он выведется не ломая верстку
- он в 90% подразумевает, что можно из админки регулировать скорость смены слайдов стили смены слайдов или включать – отключать автоматическую прокрутку
- он в 85% подразумевает, что всем этим умеет управлять блондинка-секретарша а не программист.
Список хотелок в слайдшоу можно попытаться продолжать и дальше, но я не буду этого делать.

Итак 4 хочу, которые заказчик ожидает увидеть но нигде об этом явно не говорится превращают 30-40 минутную задачу в работу на целый день. Ведь если мы банально зальем картинки по фтп или в какой-то статик пейдж и на шаблоне добавим свои js и css результат внешне не будет отличаться от сложного функционала реализованного за 8 часов, но если человек захочет что-то поменять в слайдшоу и не сможет то в 99% задача будет считаться не выполненной, функционал с точки зрения заказчика не сделан.

Т3-Ф3 или “ну а тут то что сложного”
Сначала официально. Т3-Ф3 это два предыдущих этапа + реализация не видимого простому глазу функционала требующего написания одного или нескольких модулей реализующих достаточно сложный функционал к примеру расчет стоимости доставки в зависимости от веса, габаритов товара, региона, способа доставки, учета общей стоимости заказа и т.д. начисления процентов менеджеру через которого сделан заказ или по чьей ссылке человек пришел на сайт в общем любую сложную задачу которую вы можете себе представить

Здесь не будет подразделов “подробно”, “цена” и т.д. поскольку в таких частных случаях конечная стоимость формируется только по оценочной стоимости задач специфичных только для этого проекта. Если кастомный функционал оценен разработчиками в 100 часов то и стоимость проекта будет к примеру 2820$ если присутствуют все этапы, может быть вариант и без дизайна и мелких “свистелок”, тогда стоимость составит 2020$

Почему разработка кастомного функционала при казалось бы простой задаче занимает достаточно большое количество времени?
Попробую ответить на этот вопрос на простом примере для интернет магазина.
Мелочь – помечать товары ленточкой “новинка” или “хит продаж” по умолчанию в уберкатре или коммерце из коробки такой функционал не предусмотрен, какие действия должны предпринять мы и что увидит и не увидит конечный заказчик (по умолчанию каталог сделан с помощью вьюсов (если нет, то мне еще страшнее))

Увидит:
- галочку на форме редактирования товара;
- результат вашей работы при включении свойства товара.

Не увидит:
- таблицу в БД которая появится при создании поля типа select (checkbox);
- изменение вьюхи (добавить поле нового товара), вьюх или дисплеев отображения может быть несколько
- перекрытие шаблона вьюхи (добавить дивку с классом для row);
- вырезать или сохранить картинку из PSD (хуже если нарисовать)
- поправить css файлик темы чтоб выводилась картинка;
- проверить корректность отображения в поддерживаемых браузерах.

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

Итак задача в ТЗ повесить ленточку (примерная оценка):
- добавить филд – 10 минут;
- добавить филд на вьюху – 10 минут на каждую если их больше одной или больше одного дисплея;
- перекрытие шаблона вьюхи – в зависимости от архитектуры – от 15 минут;
- картинка – от 10 мин;
- сss – 10 мин;
- тест – 15 мин;
ИТОГО: в идеальных условиях 1час 10мин т.е. ~23$ за какую-то ленточку
А если что-то не так сделал (все люди) и надо исправить проблему?

Эпилог
Какие-же выводы можно сделать из всего этого набора букв и одной картинки
1. Внешняя картинка (морда) в 90% случаях не отражает весь функционал сайта.
2. Одна и та же задача в глазами заказчика и разработчика совершенно разные картины и чем точнее ее решит разработчик, тем довольнее будет заказчик и будет им обоим много счастья.
3. Совершенный (идеальный) проект сделать можно только в теории, на практике нет, потому и график – асимптота т.к. этот идеал возможно где-то есть в перспективе, время и прогресс важные факторы.
4. Техническое задание – неотъемлемая часть любого проекта включая сайт-визитку. Чем точнее задание будет описывать функционал будущего сайта, тем меньше головных болей будет у вас и меньше будет недовольных конечным результатом заказчиков. И самое главное тем точнее предварительная оценочная стоимость будущего проекта.

P.S.
Так сколько же должен стоить сайт на самом деле? Ответ на этот вопрос мы можем дать только в конце создания продукта, так же как и нет ответа на вопрос “сколько стоит дом нарисованный на схеме”?
Мы можем говорить о конечной стоимости только по завершению какого либо этапа работ.
Спасибо

Вложение Размер graph1.png 39.73 КБ

Источник: http://www.drupal.ru/node/96842

Drupal Café’2013 в Москве. 6 февраля.

Планируется очередное DrupalCafé 6 февраля в Москве.
Место проведения – антикафе Бабочки, рядом с м. Марксистская (Таганская)
В этот раз Вас ждут интересные обсуждения на темы:

Что нас ждет в Drupal 8?. рассказывает и показывает Андрей Постников, активист сообщества Drupal. Напоминаю, что 1 февраля разработчиками Drupal 8 будет проводится подведение итогов по нововведениям в движке. Эта тема очень обширная, Андрей будет рассказывать в этот раз о наиболее заметных изменениях, а в следующих DrupalCafé будет постепенно раскрывать все больше и больше подробностей. Не пропустите, будет интересно! От руководителя проекта Госбук, Юрия Родионова, будет представлен обзор перспектив развития Drupal в России. Каким образом компании-разработчики, используя Drupal, могут помочь его развития, какие для это есть способы, как лучше это делать? Какие плюсы от сотрудничества с сообществом получит компания? На многие подобные вопросы можно будет получить ответ, пообщавшись на этом DrupalCafé.

Источник: http://www.drupal.ru/node/95966

О, драма

Небывалая драма постепенно разгорается по поводу обратной совместимости.
Многие люди (наконец-то!) понимают экономическую абсурдность перестраивания сайта под каждую новую версию Друпала.

Камень в огород Geldora

Я согласен с тем, что для 2013 года это будет одной из основных тем в сообществе.

Ссылки по теме
Первые симптомы http://drupal.org/node/1881074
Я требую продолжения банкета http://www.larks.la/articles/drupal-6-end-of-life-when-drupal-8-is-relea…

Источник: http://www.drupal.ru/node/94834

Собираю вопросы по Drupal

Приветствую всех посетителей и вопрошающих.
Кто еще не знает – я организовываю в Москве регулярные посиделки в стиле DrupalCafé – небольшие встречи друпалеров, где можно за чашкой чая, кофе с печеньками обсудить разные новости, послушать что-то интересное по Drupal.
В этом году последнее мероприятие было 29 ноября, следующее уже будет в январе 2013 года. В этот раз я хочу попробовать кое-что новое – небольшой пакет-доклад с ответами на вопросы пользователей.
В связи с этим я собираю вопросы – вопрос должен быть небольшой, требующий минут 10-15 на ответ. Ответ будет оформлять визуально.
Например, что-то вроде такого:
“Как создать представление для новостей на сайте?” – в ответ будет небольшой скринкаст, где описано как установить нужные модули, как добавить тип материалы и вывести список при помощи Views. Этот скринкаст я покажу вживую сам или попрошу коллег, на одном из DrupalCafé и смогу ответить на уточняющие вопросы, обсудить решение.

Кстати, как Вы сами считаете, будет ли такой формат интересен посетителям?
Возможно где-то уже есть такие вопросы, которые интересны Вам, но не решены. Напишите мне в комментариях тут или оформите тему для обсуждения на сайте DrupalCafé Russia

Источник: http://www.drupal.ru/node/93541

Переезд drupal.ru на другой сервер ночью 19-20 октября

Новости от хостера. Сегодня ночью по Москве сайт не будет работать некоторое время в связи с переездом на другой сервер.

Upd от хостера Переезд перенесен на 19-20 октября.

Внутри механизма d.ru что-то заржавело и разбираться с этим будем уже на D7 (есть мнение, что ржавые детальки отвалятся при апгрейде и больше не будут мешать). А пока сайт создаёт нагрузку на shared-сервере IT Patrol и админы хостинга приняли решение унести нас на выделенный сервер. Не знаю уж радоваться или нет, будет конечно быстро и спасибо IT Patrol за площадку, с другой стороны сайт функционала и посещаемости drupal.ru должен потреблять меньше ресурсов.

Источник: http://www.drupal.ru/node/89582

Реализация релевантного поиска с использованием phpmorphy

Всем добрый день (утро, вечер, ночь)
Много читал жалоб на поиск в друпале. И вот наконец с ним столкнулся. Да что уж тут скрывать поиск ужасный.
Видел много пожелание про phpmorphy, ну думаю а что бы нет, потыркаю.
Сразу говорю код привожу как пример реализации, всегда готов принять критику и пожелания по оптимизации.
Работу поиска можно посмотреть тут: Справочник Норильск

Поехали. Весь поиск у меня реализован одним PHP файлом+Вьюха, без модулей и прочего.
Распишу что да как.

Сначала я рисую формочку с поиском и расширенным фильтром:

<script type="text/javascript"> jQuery(document).ready(function(){ jQuery('.spoiler-body').hide() jQuery('.spoiler-head').click(function(){ jQuery(this).toggleClass("folded").toggleClass("unfolded").next().slideToggle() }) }) </script> <form> <span style="font-size:12px; padding-left:20px;"> <input type="checkbox" value="1" name="h" <?php if (isset($_GET['h'])) echo 'checked'; ?>>только дома <input type="checkbox" value="1" name="p" <?php if (isset($_GET['p'])) echo 'checked'; ?>>только организации </span> <div class="azure_block" style="margin-top:0; padding:10px;"> <input type="text" name="str" style="width:90%;" value="<?php print $_GET['str']; ?>"> <input type="submit" style="width:8%;" value="Найти"> </div> <div class="spoiler-head folded" style="cursor:pointer; color:#D63E03; font-weight:bold; padding-right:15px;" align=right>Расширенный поиск</div> <div class="spoiler-body"> <div class="yell_block"> <input type="checkbox" value="1" name="all" <?php if (isset($_GET['all'])) echo 'checked'; ?>> Искать только те материалы в которых присутствуют все поисковые слова <br /> <input type="checkbox" value="1" name="nomrph" <?php if (isset($_GET['nomrph'])) echo 'checked'; ?>> Искать только введенную форму слов (Не использовать склонения) <br /> <input type="checkbox" value="1" name="like" <?php if (isset($_GET['like'])) echo 'checked'; ?>> Искать по наличию части слова (Например: свал = самосвальный) </div> </div> </form>

Инициализируем phpmorphy. Скачать её можно по поиску в гугле, я взял версию словарей без Ё

<?php
$limit = 50;    
    
include_once('/бла-бла-бла/nprsu/phpmorphy/src/common.php');
$dir = '/бла-бла-бла/nprsu/phpmorphy/dicts';  
$lang = 'ru_RU';
$opts = array('storage' => PHPMORPHY_STORAGE_FILE,); #Экономим на ресурсах сервера не грузим в память.
try {$morphy = new phpMorphy($dir, $lang, $opts);} catch(phpMorphy_Exception $e) 
{die('Error occured while creating phpMorphy instance: ' . $e->getMessage());}

?>

Переменную $limit я используя для вывода только 50 результатов, но вот не надо мне больше, не хочу =( на самом деле грабли это из-за views по коду ниже будет пояснение, очень буду рад подсказке как обойти эти грабли.

Сам код и комментарии:

<?php
if ($_GET['str'] != '') #поисковая строка
{
#Фильтр по типам материалов у меня для вьюхи используется
$filter = 'all'; 
if (isset($_GET['h'])) $filter = 'house';
if (isset($_GET['p'])) $filter = 'place';
if (isset($_GET['h']) && isset($_GET['p'])) $filter = 'all';

$words = $_GET['str'];
#заменяем все Ё на Е, так как качали пхпморфи без Ё
$words = mb_strtoupper ( str_ireplace ( "ё", "е", $words ), "UTF-8" );
#Здесь мы делим строку в массив на слова либо цифры, остальное нам не нужно вообще, 
#плюс к этому в sql запрос не попадет грязи.
preg_match_all ( '/([a-zа-яё0-9]+)/ui', $words, $word_pma); 
#Получаем все формы слов из массива
$words_mor_all = $morphy->getAllForms($word_pma[1]); 
$sSQL_where = array();
$arMorphy = array(); #это массив в котором ключ слово а значение его ID 
if ($words_mor_all) #поехали
    {
    #Здесь мы заменяем равно на лайк если выбрана галочка искать по наличию части слова.    
    if (isset($_GET['like'])) {$sep = "LIKE"; $pr = '%';} else {$sep = "="; $pr = '';}
    #вот это порядковый номер который будет у всех словоформ образованных от одного слова 
        #и у него включительно равен 
    $vv = 0;
    foreach ($words_mor_all as $word=>$word_mor) #крутим все слова
    {        
        #если в словаре нашлись словообразования или нет галочки не использовать склонения то далее
        if (is_array($word_mor) && !isset($_GET['nomrph']) )
        {
            $sSQL_or = array();
            foreach ($word_mor as $word_m)
            {
            $arMorphy[$word_m]=$vv; #собираем массив слов и их ID
            $sSQL_or[] = "word {$sep} '{$pr}{$word_m}{$pr}'"; #собираем условие для запроса
            }
        $sSQL_where[] = "
                        (".join(' OR ', $sSQL_or).")"; #собираем where
        }
        else 
        {
            #В этом блоке обрабатываются слова у которых не нашлось словоформ
            $arMorphy[$word]=$vv; 
            $sSQL_where[] = "
                        (word {$sep} '{$pr}{$word}{$pr}')"; #собираем where
        }
    $vv++; #Увеличиваем ID слова, т.к. для этого слова условие выборки готово
    };
    $sSQL = "SELECT sid, word FROM {search_index} WHERE type = 'node' AND 
            ".join(" OR ", $sSQL_where)."
            "; #вот сам запрос. Таблицу я использую от стандартного поиска, значит нужен рабочий Cron
    #echo "<pre>".$sSQL."</pre>";
    $arIdsV = array();
    $arId2Mor = array();
    $arIdAll = array();
    $search_result = db_query($sSQL);
    #Крутим результаты и вычисляем вес материалов по релевантности
    while($ar_ids = db_fetch_object($search_result))
        {
            if (isset($arIdsV[$ar_ids->sid])) #Вот сам массив ID нод
            { #Все подымаем в верхний регистр т.к. пхпморфи работает с ним
                if (isset($arId2Mor[$ar_ids->sid][$arMorphy[mb_strtoupper($ar_ids->word, "UTF-8")]]))
                {
                    $arIdsV[$ar_ids->sid]++;
                }
                else 
                {
                    #Вообщем вот тут идет увлечение релевантности ноды в 10 раз, если она(нода) 
                    #содержит в себе несколько разных слов в любой форме склонения 
                    $arIdsV[$ar_ids->sid] = ($arIdsV[$ar_ids->sid]+1)*10; 
                    #Этот массив будет использоваться только в том случае, если стоит галочка 
                    #искать только те материалы в которых есть все слова из запроса.
                    $arIdAll[$ar_ids->sid]++;
                }
            } else
            {
                $arId2Mor[$ar_ids->sid][$arMorphy[mb_strtoupper($ar_ids->word, "UTF-8")]] = 1;
                $arIdsV[$ar_ids->sid]++;
            }        
        }
    #Если есть галочка искать только те материалы в которых есть все слова    
    if (isset($_GET['all'])) 
    {
        arsort($arIdAll); #Вот тут массив упорядочивается по убыванию веса релевантности нод. 
        $arIdsVAll = array();
        foreach ($arIdAll as $k=>$v)
        {
            if (($v+1) == $vv) #проверяем все ли слова есть в ноде
            {
            $arIdsVAll[$k] = $v;     
            }
        }
        $arIdsV = array_slice($arIdsVAll,0,$limit,true); #Я режу результаты до 50-ти
    }
    else 
    {
        arsort($arIdsV); #Вот тут массив упорядочивается по убыванию веса релевантности нод.
        $arIdsV = array_slice($arIdsV,0,$limit,true); #Я режу результаты до 50-ти
    }
    
#Вот и все мы имеем массив упорядоченный по убыванию веса нод и с ним уже можно делать что угодна. 
#Можно извлекать прям запросом и выводить. Я пошел по не совсем правильному пути и использовал вьюху. смотрим далее
    
    if ($arIdsV)
    {
        $ids = join(',', array_keys($arIdsV));
    
           $v_nprsearch = views_get_view ('nprsearch');
           $v_nprsearch->set_display('default');
        #Отдаю вьюхе ID нод через запятую. и тип материала по которому ищу, либо all если по всем.
           $v_nprsearch->set_arguments(array($ids,$filter));
        #буду выводить только 50, на всякий случай, хотя массив я итак порезал.
           $v_nprsearch->display_handler->set_option('items_per_page', $limit);
        $v_nprsearch->display_handler->set_option('use_pager', false);
        $v_nprsearch->preview();              
           $v_nprsearch->execute();

           if ($v_nprsearch->result) 
            {
                #Вот внимание сами грабли. Отдаю я значить вьюхе ID нод и он по ним выдаем 
                #мне ноды применяя к ним фильтр по типу материала из аргумента. 
                #Использует views их в запросе как where nid in (1,2,3 и т.п.) и соответствено сортировка
                 #то теряется и мне приходиться крутить еще раз два массива. Чтобы востановить искомую сортировку.
                $isset_result = array(); 
                   foreach ($v_nprsearch->result as $v_result)
                {
                    #Берем Ноду и говорим что она есть в фильтре.
                    $isset_result[$v_result->nid] = 1;
                }
                $new_result = array();
                #Крутим наши массив отсортированных нод
                foreach (array_keys($arIdsV) as $pre_ids)
                {
                    #и если нода в нашем массиве, есть в массиве результатов вьюхи 
                    #загоняем её в массив объектов как у вьюхи
                    if (isset($isset_result[$pre_ids])) 
                        $new_result[]->nid = $pre_ids;
                }
                #Подменяем массив уже с нашей сортировкой.
                   $v_nprsearch->result = $new_result;
           
           
                echo "<hr />";
                print $v_nprsearch->render(); #Рисуем вьюху. Вуаля!
                echo "<i>Показано до {$limit}-ти результатов.</i>";
            }
    } else echo "Нет результатов.";
} else echo "Нет результатов.";
} else echo "Введите поисковой запрос.";
?>

Немного о вьюхе.
Она простая до безобразия в аргументах Материала: Nid с функцией “Разрешить несколько терминов в аргументе” и Материал: Тип.
Стиль строки просто материал. по дефолту. можно по полям выводить ели кому надо.
И в фильтрах на Материал Тип чтобы искать только по тому по чему мне надо. Ну вот и все.

Итоги.
Поиск мне в принципе нравиться, еще бы замутить “возможно вы имели ввиду”, если есть орфографическая ошибка в словах.
Поиск я думаю будет весьма неплохой заменой стандартному, на не крупных проектах, у которых нет root доступа к серверу и прочее. виртуальных хостинг короче.
Писав код старался избегать большого количества итераций при вращении циков, использовал isset для проверки в массивах, так как он обращаеться напрямую к ячейке.
Готов выслушать критику и пожелания, дороботать я его всегда рад.

Источник: http://www.drupal.ru/node/89392

Drupal Cafe’2012 в Москве. 26 октября, м. Чистые пруды / Тургеневская.

Итак, снова планируется провести Drupal Cafe в Москве.

В этом году я побывал на DrupalCamp Kiev, встречался со многими интересными людьми, общался на БОФах и получил несколько полезных подсказок. Опишу некоторые из них и планируемую встречу в октябре. Итак, вот некоторые выкладки – все эти моменты конечно можно обсудить и покритиковать.

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

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

3. После проведения DrupalCafe с дискуссиями и чаем-кофе также планируется проводить небольшие посиделки, но уже в более неформальной обстановке.
Как я это вижу – провести 2-3 часа за обсуждениями, затем дойти до ближайшего злачного места и посидеть уже за столиками, употребляя пиво и кушанья. Это будет способствовать более тесному обсуждению некоторых идей – иногда люди в “пылу” дисскусий не всегда приходят к правильной мысли. И за кружкой пива с жареной картошечкой может прийти озарение.
При этом посещение непосредственно DrupalCafe будет бесплатно для всех участников, но вот с пивом и едой в кафе – за свой счет (что заказал, то и оплатил).

4. Настольные игры?

Подвожу итого. В этом месяце, в последнюю пятница октября будет проводится очередное DrupalCafe.
Это будет 26 октября. Ориентировочно начало встречи в 18:00 – 18:30.
К сожалению, забронировать GLINE не удалось. Мероприятие будет проводиться в месте под названием “[хорошая] республика”, находится она недалеко от м. Чистые пруды или м. Тургеневская.
Как пройти и адрес написан на сайте клуба тут
Дублирую тут на всякий случай
«Адрес: 101000, г. Москва, ул. Мясницкая 13, стр. 20
м. Чистые пруды
1.Последний вагон из центра, выход на Мясницкую улицу (в центр).
2.200 метров пешком по Мясницкой.
3.Свернуть в арку 13 дома с вывеской-стрелкой.
4.Прямо до белого здания и направо.
5.В тупичке — наше желтое здание с вывеской.»
Предварительно, встреча пройдет там же, где была в прошлый раз. Напоминаю, что это место находится недалеко от м. Китай-Город, Лубянка, здание по адресу Бол. Спасоглинищевский пер., 8. Называется это “коворкинг GLINE”, произносить как “Глина”. Зайти внутрь через магазин «Этношоп» и турбюро.
Рядом через дорогу есть неплохое место и для неформальных посиделок – клуб “Странное место”.

1 тема для обсуждения – логин пользователей на сайт через социальные сети (внешняя аутентификация). Дискуссию предложил автор модулей uLogin и HybridAuth 7.x-2.x. – Андрей Березовский.
2 тема для обсуждения – для продвинутых. “Выработка стандартов, рекомендаций и обмена опытом по профессиональной разработке на Drupal (web-разработка)” – Виктор Степаньков.

Также, у желающих будет возможность высказать свои пожелания по организации подобных мероприятий. Чего вам не хватает, какие возможности хотелось бы иметь под рукой? Например, поступало предложение о создании возможности подписки на новости по мероприятия – возможно у вас что-то еще будет, я с удовольствием готов это обсудить.

Источник: http://www.drupal.ru/node/88919

Drupal Cafe’2012 в Москве. Встреча в октябре

Итак, снова планируется провести Drupal Cafe в Москве.

В этом году я побывал на DrupalCamp Kiev, встречался со многими интересными людьми, общался на БОФах и получил несколько полезных подсказок. Опишу некоторые из них и планируемую встречу в октябре. Итак, вот некоторые выкладки – все эти моменты конечно можно обсудить и покритиковать.

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

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

3. После проведения DrupalCafe с дискуссиями и чаем-кофе также планируется проводить небольшие посиделки, но уже в более неформальной обстановке.
Как я это вижу – провести 2-3 часа за обсуждениями, затем дойти до ближайшего злачного места и посидеть уже за столиками, употребляя пиво и кушанья. Это будет способствовать более тесному обсуждению некоторых идей – иногда люди в “пылу” дисскусий не всегда приходят к правильной мысли. И за кружкой пива с жареной картошечкой может прийти озарение.
При этом посещение непосредственно DrupalCafe будет бесплатно для всех участников, но вот с пивом и едой в кафе – за свой счет (что заказал, то и оплатил).

4. Настольные игры?

Подвожу итого. В этом месяце, в последнюю пятница октября будет проводится очередное DrupalCafe.
Это будет 26 октября. Ориентировочно начало встречи в 18:00 – 18:30.
Предварительно, встреча пройдет там же, где была в прошлый раз. Напоминаю, что это место находится недалеко от м. Китай-Город, Лубянка, здание по адресу Бол. Спасоглинищевский пер., 8. Называется это “коворкинг GLINE”, произносить как “Глина”. Зайти внутрь через магазин «Этношоп» и турбюро.
Рядом через дорогу есть неплохое место и для неформальных посиделок – клуб “Странное место”.

Чуть позже будет уточнены названия тем для обсуждения, сейчас проводится сбор данных. Предварительно могу сказать, что возможно будет организована видеоконференция с Егором (gor, IT-Patrol inc.) с обсуждением интересной темы.

1 тема для обсуждения – логин пользователей на сайт через социальные сети (внешняя аутентификация). Дисскусию предложил автор модулей uLogin и HybridAuth 7.x-2.x.

Также, у желающих будет возможность высказать свои пожелания по организации подобных мероприятий. Чего вам не хватает, какие возможности хотелось бы иметь под рукой? Например, поступало предложение о создании возможности подписки на новости по мероприятия – возможно у вас что-то еще будет, я с удовольствием готов это обсудить.

Источник: http://www.drupal.ru/node/88919

Спецвыпуск журнала Linux Journal о Друпале

Linux Journal’s Special Drupal Issue brought to you by NewRelic
http://www.linuxjournal.com/content/drupal-special-edition
На английском, есть что почитать

Установка с нуля, создание тем, начала программирования, обзор сборок и т.д.

Кстати, сайт журнала на друпале.

Ссылки на прямое скачивание сознательно не размещаю, дабы не провоцировать сам журнал – не зря же они их “скрыли”. Кто ищет – тот найдёт.

Источник: http://www.drupal.ru/node/88806

Кнопка Google+ на drupal.ru


Под нодами на drupal.ru при просмотре их полного вида появилась кнопка g+. Можно голосовать за посты и расшаривать их в Google+. Кнопка реализована модулем http://drupal.org/project/google_plusone. Планируется также добавить кнопку для Facebook. Остальные соцсети идут лесом, хватит этих двух. Или не хватит?

Чего не понял, так это как в параметрах гугловского JS уточнять, какой блок текста брать за дексрипшн для расшариваемой статьи? Т.к. не всегда оно берет текст ноды, иногда промахивается и захватывает текст комментария. А картинку к ноде упорно тащит из левой колонки сайта, а там сейчас висит баннер IT patrol (то-то Гор порадуется).

Очень короткий FAQ

Q. Я ненавижу соцсети и не хочу видеть эту кнопку.
A. Решается плагинами в броузере — см. советы тут http://habrahabr.ru/post/136009/ (thx bdagames за хабрассылку).

Источник: http://www.drupal.ru/node/88746

[Решено][Ссылка] Настройка резервного копирования: Amazon S3 и Drupal

Привет!

По мотивам обсуждения вот тут, я решила написать как легко и просто можно настроить резервное копирование на облака Амазон С3.

Пошаговый гид на моем блоге

Источник: http://www.drupal.ru/node/88733

Алматы Друпал-кафе 6

Привет, алматинские друпалеры!

7го сентября будет очередное Друпал-кафе в нашем городе!

В этот раз планируем совместно рассмотреть:
1. Модули по SEO – Hossein J. Saroui
2. GIT и Features- Айрат ‘Dakanca’
3. И модули Drupal Commerce и Rules – Арман ‘Zil’

Детали здесь.

До встречи! : )

Источник: http://www.drupal.ru/node/88317

[Состоялась] 25 сентября встреча друпалеров в Кирове

Знакомый организует небольшую встречу друпалеров в Кирове.

Кому интересно – отписывайтесь http://kirovnet.ru/forum/index.php?topic=795322 и присоединяйтесь

//Цитата ON

Привет тебе, читающий эту тему.

Так сложилось, что у меня есть большой опыт общения с друпалом (один из самых крутых CMS/движков для сайтов). Много было и сайтов мною сделано.

Что?
Буду регулярно проводить в Кирове встречи, подобные DrupalCafe.

Зачем?
Хочу поделиться знаниями с начинающими и не только. Новые люди, новые знакомства, новые интересы. Just for fun

Где?
Предлагаю собраться во вторник, 25 сентября, в кафе Ботаник, с 17.30 до 19 часов (время/место обсуждаемо).

Для кого?
Если ты начинающий в сайтостроении – приходи, я умею понятно и просто объяснять сложные вещи.
Если ты используешь другой инструмент (Bitrix/Umi/Netcat/MODx/Yii/Symfony) – приходи, обсудим плюсы и минусы.
Если ты уже используешь Drupal, то мы точно найдем о чем поговорить.

Кратенько о себе:

5 лет работы с друпалом (начинал с версии 4.6, помню что такое флексиноды, товарищей акселя, вадбарса, и разгонку)
Дофига знаний о contrib-модулях. Галереи изображений, гостевые, форумы, WYSIWYG, Commerce-инетмагазин, импорт/экспорт инфы, и прочая-прочая.
Работал в drupalhosting.ru (IT-Patrol) – домены, хостинг, DNS, перенос сайтов, drush, highload, sphinxsearch, оптимизация, поднятие из бэкапов, поиск ошибок, и т.п.
Участвовал в DrupalCamp.
Сейчас работаю по удаленке на московскую фирму, пишу модули на заказ.

Сфера нынешних интересов: деплой и автоматический перенос сайтов (aegir, vagrant, drush), тестирование (simpletest / selenium), RESTful API, анализ на уязвимости.

P.S. приветствуется репост, ретвит, и прочие способы сарафананного радио и сообщения своим друзьям об этом мероприятии.
Крайне желательно отписаться в этой теме о том, что придете (а также сообщить свой уровень знаний, чтобы я подготовил интересные темы).

//Цитата OFF

Источник: http://www.drupal.ru/node/88068

Изменить ( любой ) или ( все ) в select.

Допустим Вам надо изменить ( любой ) или ( все ) не на всем сайте, а только в одном месте.
Всё очень просто.
В Вашей теме создаете файл template.php

<?php
function phptemplate_select($element){
    // Выбираем нужный нам select
    if( $element['#name'] == 'field_sanuzel_value_many_to_one')
        // меняем All option в select
        $element['#options']['All'] = 'Неважно';
    // для примера меняем Any
    $element['#options']['Any'] = 'Неважно';
    dpm( $element );
    // отправляем измененный select дальше на рендринг
    return theme_select($element);
}
?>

Допустим Вам надо изменить ( любой ) или ( все ) не на всем сайте, а только в одном месте.
Всё очень просто.
В Вашей теме создаете файл template.php

<?php
function phptemplate_select($element){
    // Выбираем нужный нам select
    if( $element['#name'] == 'field_sanuzel_value_many_to_one')
        // меняем All option в select
        $element['#options']['All'] = 'Неважно';
    // для примера меняем Any
    $element['#options']['Any'] = 'Неважно';
    dpm( $element );
    // отправляем измененный select дальше на рендринг
    return theme_select($element);
}
?>

Не забудьте правильно изменить условия (if) и оставить либо измененный All или Any.
P.S. если что-то не получается используйте Devel

<?php
function phptemplate_select($element){
    dpm( $element );
    return theme_select($element);
}
}
?>

Источник: http://www.drupal.ru/node/88049

Правильное скругление углов для браузеров не поддерживающих border-radius в CSS

Статья не относится непосредственно к Drupal, но, я думаю, будет полезна начинающим сайтостроителям.

В статье описывается как грамотно скруглять углы для браузеров, которые не поддерживают CSS свойство border-radius. “Правильно” в данном контексте значит не перегружая код страницы дополнительными элементами.

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

Рекомендуется базовые знания html + javascript.

Ссылка на статью “Скругление углов без CSS и border-radius“

Источник: http://www.drupal.ru/node/88019

Drupal Cafe’2012 в Москве. 10 сентября 2012 г

Несмотря на всякие невзгоды и взгоды я продолжаю традицию проведения мероприятий DrupalCafe в городе Москва.

В этот раз мероприятие планируется провести 10 сентября, вечером, с 19 часов.

Интерактивная игра на Drupal. Антон Житарёв ( NaZg). Что же такое современный хостинг? Егор Марценюк, основатель компании IT-Patrol inc. Обсуждение инициатив Российской Друпал-ассоциации

Самое главное – в этот раз на мероприятии будет сюрприз. В качестве гостя и докладчика будет присутствовать человек-загадка. Этот человек достаточно известен в Drupal-сообществе, в том числе и среди русскоговорящих. Но самое интересное – наяву этого человека в России не видели уже несколько лет, даже те, кто с ним работает. И это при том, что так или иначе он со своим проектом влияет на подавляющее большинство участников российского Drupal-сообщества!!! У посетителей DrupalCafe 10 сентября будет шанс увидеть воочию этого человека, пообщаться с ним, узнать последние новости, а также сможет задать животрепещущие вопросы

Судя по всему сюрприз оказывается не сюрприз. Все уже догадались, что человек-закадка – это Егор

Место проведения находится недалеко от м. Китай-Город, Лубянка, здание по адресу Бол. Спасоглинищевский пер., 8.
Называется это “коворкинг GLINE”, произносить как “Глина”. Зайти внутрь через магазин «Этношоп» и турбюро.

Напоминаю свой номер телефона +79191049873, Алексей.

Источник: http://www.drupal.ru/node/86780

Drupal-cafe в Ростове-на-Дону

Всем привет, рад сказать что после длительного перерыва появилась возможность собрать очреденое друпал-кафе в Ростове-на-Дону.

Когда: 2 сентября, в 15:00. Длительность 1,5 часа
Где: Суворова, 52а карта

Программа: Установка друпал с 0. Создание простого сайта-каталога. Длительность: до 60 минут, включая время на холиварные вопросы. Уровень: для начинающих. Обсуждение DrupalCamp в Киеве, несколько человек из Ростова и Краснодара едут, обсудим кто как едет, какой график. Обсуждение ночного код-спринта, на предмет создания команды или участия в рамках украинских команд.

Проходить это будет в помещении коворкинг-центра Dobro: http://dobrocowork.ru/about .
Мероприятие бесплатное, приглашаются все желающие. Обязательна предварительная регистрация: http://dobrocowork.ru/drupalcafe-form .

Источник: http://www.drupal.ru/node/86530

Алматы Друпал-кафе 5

Привет, друпаллерам в Алматы,

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

Темы, которые будут подниматься на встрече:
1. Работа с Git – ведет Виктор ‘Frio’
2. Субдомены с модулем Domain Access – ведет Арман Зил

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

Детали встречи здесь.

Источник: http://www.drupal.ru/node/86446

Drupal Night, ночной кодспринт

Рад сообщить что за неделю до Kiev Drupal Camp 2012, на выходных, пройдет “Drupal Night”!

Что же это такое?

Это серия код – спринтов, которые будут проводиться ночью, под руководством отличных тимлидов!

Код – спринт пройдет одновременно в крупных городах Украины!

Почему ночь? на основании голосования никто не мешает ночью, т.к все нормальные спят) личный график лишь немного меняется в Америке тем временем день, значит комиты будут быстрее проходить + обратная связь будет быстрее! После спринта группа экспертов рассмотрит все работы и определит победителей, которые получат призы на киевском друпал-кэмпе 2012. Кроме того все участники расширят свои профили на drupal.org за счет комитов. Цели мероприятия: сделать лучше drupal! собрать команды разработчиков – единомышленников для продвижения украинского сообщества на drupal.org. познакомиться/повеселиться

Дата – в зависимости от региональных команд (см. таблицу команд)

Если ты хочешь:

сделать drupal лучше, активно интересуешься его развитием, или хочешь улучшить профиль на drupal.org, или поучаствовать в командной работе, или еще миллион причин (нужное допиши сам:),

то ждем тебя на предварительной встрече с 19 по 25 августа (обсуждения даты и места в facebook группе, вся информация на оф.странице http://camp12.drupal.ua/ru/news/ey-drupaler-privet в таблице городов).

Регистрация на код-спринт и предварительную встречу ЗДЕСЬ!

Источник: http://www.drupal.ru/node/86434

Доступна версия Acar корзины для Drupal 6 – Ubercart 2

Acar – AJAX корзина для Ubercart.

Краткий перечень возможностей:

• Темизация 100% html, никаких ограничений.
• AJAX добавление из формы добавления.
• AJAX удаление из корзины, и из формы добавления.
• AJAX изменение количества из корзины, и из формы добавления.
• AJAX изменение атрибутов помещенных в корзину продуктов.
• Отображение в корзине какой либо вашей информации.

Сайт: http://arpiprogrammer.ru

Источник: http://www.drupal.ru/node/85810

Настройка отправки email для Drupal сайтов

Написал небольшой перевод статьи по простой настройке отправки email для Drupal сайтов. Для отправки можно использовать уже имеющийся аккаунт например на Gmail.

Источник: http://www.drupal.ru/node/85737

Алматы Друпал-кафе 3

Привет, алматинские друпаллеры!

Собираемся уже в третий раз на Друпал-кафе : )
Теперь будем обсуждать:
1. Друпал SEO – ведет Айрат “dakanca”
2. И продолжим спринт-код – ведет Виктор “frio”

Встреча будет 5-го августа в 16:00.
Место здесь. Детали здесь.

До встречи!

ПС. Сорри, что так объявляю всего за пару дней… были сложности с местом проведения.

Источник: http://www.drupal.ru/node/85513

[модуль] Добавление ссылки на сайт в скопированный текст

Настало время для очередного модуля.

На этот раз под прицел попал функционал добавления в скопированный текст ссылки на сайт, откуда этот текст скопировали. Подробно этот функционал обсуждался на хабре без малого два года назад; нашей задачей было внедрить это на Forbes.ru. Так родился модуль Add link to copied text.

Модуль предоставляет админку для настройки всех параметров плагина jQuery addtocopy + добавляет стили, чтобы сделать эту “добавочную стоимость” невидимой. Конечно же, код модуля следует стандартам кодирования и рекомендуемым практикам – поэтому нужно поместить код jQuery плагина в “sites/all/libraries/addtocopy”.

Спасибо!

Attached poll “Дайте совет автору ”.
Register or login to poll
Results:
пеши исчо!: 19 голосов
проще засунуть это в тему!: 0 голосов
давай, до свидания!: 3 голоса

Источник: http://www.drupal.ru/node/84860

Второе Друпал-кафе в Алматы!

Привет, алматинские друпаллеры!

Собираем уже второе Друпал-кафе в нашем городе!
На этот раз помимо знакомства, деления идеями и совместной трапезы у нас будет:

1. Валентина “Geldora” Боровая поделится с нами опытом о том, как работать с Drush!
2. И Виктор организует спринт-код по разработке одного из наиболее востребованных модулей для друпаллеров Казахстана.

Время: в 16:00 в Вск, 22 июля 2012.
Место: Проходить мастер-классы будут в социальном клубе “Баттлер”.
Он находится на ул. Фурманова 193, выше пр. Абая, ниже ул. Сатпаева, выше Французского дома, под магазином Монами.

Детали и обсуждение здесь.

Источник: http://www.drupal.ru/node/84772

Заказ в один клик с помощью комментариев

Процесс заказа в Уберкарт многие считают слишком сложным.
Для его упрощения придумал использовать комментарии как форму заказа товара.

Что делаем:

1. К комментарию добавляем текстовые поля “Количество товара”, “Телефон”, “ФИО” (покупателя). В D6 через модуль  nodecomment, D7 – в ядре.

2. На странице товара темизируем кнопку “Добавить комментарий”, как “Быстрый заказ”. Хотя можно и через перевод интерфейса

3. Сами комментарии делаем по умолчанию не опубликованными, чтобы пользователь мог их оставлять, но не мог видеть. С помощью Rules можно настроить, чтобы покупателю, после заказа-комментария выдавалась информация типа “спасибо за заказ, мы вам перезвоним”. Ну и чтобы админу на почту приходила инфа о новых комментариях.

4. Все комментарии-заказы сводим на одну страницу для админа.

Это все (!) что делал я на момент поста.

Что можно еще сделать:

* Вывести создание комментария-заказа в всплывающее окно.

* Добавить разные статусы заказа через селект лист.

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

В общем ограничено только фантазией разработчика.

Источник: http://www.drupal.ru/node/84512

выкладываю модуль UC Attribute Options Access

Всем привет =)
На днях написал модуль, который позволяет определять через роли доступ к опциям атрибутов товара уберкарта.
На drupal.org уже выложил, модуль там сейчас проверяется, а так же делюсь им с русскоговорящим сообществом.
Модуль прост в использовании, позволяет определять как глобальные параметры доступа, так и перезаписать эти параметры для каждого отдельного товара.

В общем, пользуйтесь на здоровье, о ошибках сообщайте – буду править.

Прикрепленный файл Размер uc_attribute_options_access-6.x-1.0.zip 9.13 кб

Источник: http://www.drupal.ru/node/84379

Первое ‘Drupal-cafe’ в Алматы! : )

Поскольку на Друпал.ру тусуется немало друпаллеров из Казахстана, думаю, это объявление будет уместным и здесь

Мы задумали собраться, познакомиться, поделиться идеями и поговорить о сообществе Друпал в Казахстане.
Приглашаются все друпаллеры от начинающих до маэстро!

Формат встречи не официальный.
Дата и время: 07/07/2012 – 16:00.
Место: ресторан “Дастархан” на Наурызбай Батыра 122/124 (угол Шевченко), г. Алматы.

Детали здесь.

Источник: http://www.drupal.ru/node/83906

Импорт/обновление большого количества материалов по Cron без использования Batch API и Drupal Queue

Часто бывает необходимо импортировать или обновить большое количество материалов на сайте. Чтобы все модули отработали правильно, необходимо сохранять ноды с помощью функций node_submit и node_save.
К сожалению, в этом случае, время выполнения скрипта будет довольно большим по сравнению с непосредственной записью в базу данных.

Для того, чтобы разбить процесс обработки данных на части, и чтобы скрипт не вылетал по тайм-ауту придумали Drupal Batch API. Великолепная идея, но у нее есть один минус – оно требует присутствия человека. Т.е. операцию необходимо запустить из браузера, и браузер должен быть открыт во время всего процесса выполнения. Что же делать, если нам нужна обработка по Cron?

Самый простой способ без использования каких-либо наворотов.

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

2. В модуле по hook_cron вызываете функцию импорта/обновления, после чего удаляете обработанные строки временной базы данных.

Единственный минус такого решения – чем больше у вас данных, тем чаще необходимо запускать Cron, а это не всегда приемлемо.

Кто знает более простое решение – милости прошу в комменты.

Оригинал живет здесь

Источник: http://www.drupal.ru/node/83513

Ajax Nodeloader (D6, D7) – модуль для загрузки материалов с помощью AJAX

Модуль Ajax Nodeloader позволит вам:

Загружать и показывать страницы Drupal (node) с помощью AJAX Использовать произвольные css-селекторы для отображения вашего контента (title, body и т.д.) Загружать и отображать любые поля (node fields) для Drupal 7 Отслеживать посещения ваших AJAX-ссылок с помощью Google Analyitcs (требуется установленный Google Analytics) (опция) Использовать расширенную навигацию на основе HTML5 history API или хэш-тэгах (для устаревших браузеров) (опция) Динамически изменять заголовок браузера (опция)

2. Частые вопросы по использованию модуля.

Домашняя страница: http://www.denry.ru/drupal-ajax-nodeloader/
Частые вопросы: http://www.denry.ru/programmirovanie/662-ajax-nodeloader-f-a-q-ru/

3. Загрузка

Существует несколько способов скачать этот модуль:

1. Скачать файлы .zip с github.com

7.x-1.x.zip

6.x-1.x.zip

2. или клонировать исходный код модуля с drupal.org

Версия для Drupal 7:

git clone –branch 7.x-1.x http://git.drupal.org/sandbox/nick-denry/1447152.git ajax_nodeloader
cd ajax_nodeloader

Версия для Drupal 6:

git clone –branch 6.x-1.x http://git.drupal.org/sandbox/nick-denry/1447152.git ajax_nodeloader
cd ajax_nodeloader

или github.com

git://github.com/nick-denry/Ajax-Nodeloader.git

Внимание! Ajax Nodeloader — это проект с открытым исходным кодом, однако в настоящий момент код является экспериментальным и проходит проверку на drupal.org (en).

AJAX nodeloader на drupal.org:
http://drupal.org/sandbox/nick-denry/1447152

AJAX nodeloader на github.com:
https://github.com/nick-denry/Ajax-Nodeloader

В настоящее время модуль получил статус “reviewed & tested by the community”, но пока все еще явяется экспериментальным.

Источник: http://www.drupal.ru/node/83485

Paste Format – чистка вставляемого текста

По следам успеха модуля uLogin (3 месяца после создания – 500+ сайтов используют на данный момент), про который я уже рассказывал на страницах drupal.ru, хочу рассказать о другом проджекте, который направлен лицом к пользователям – Paste Format.

Модуль решает проблему копирования/вставки текста из всяких “умных” источников (продукты от MS, с других сайтов, ещё откуда-то с “продвинутым” форматированием) – а именно проблему того, что копируется и вставляется различный “мусор”, который вам совсем не нужен в вашем контенте и, кроме этого, ломает ваши шрифты и стили. Да, при отображении контента это всё можно вырезать, используя формат ввода с нужными фильтрами; НО при этом весь этот мусор сохраняется в БД, подгружается при редактировании контента, ломает стили отображения текста в вашем визуальном редакторе, ваши авторы придумывают мифы и другую “ахинею”, что вот при редактировании текст такой, а при отображении все ломается, сайт глючит и так далее. На что тех персонал им обычно отвечает, что вы сами мол “уроды”, копируете текст хз откуда, вы должны писать его сразу в визуальном редакторе на сайте или вставлять через спец кнопочку, которая убивает все форматирование… или вообще включает принудительную чистку форматирования при вставке. В общем, ситуация не из приятных

Именно для решения этой проблемы и был написан модуль Paste Format (сейчас работает только в тандеме с CKEditor, как через отдельный модуль для этого редактора, так и через модуль WYSIWYG). Он позволяет отфильтровать вставляемый текст одним из форматов ввода, настроенном на вашем сайте в админке Друпала. То есть никаких регэкспов вам писать не надо, тем более на джаваскрипте

Установка проста – скачать, распаковать, включить. Создать _отдельный_ формат ввода, в котором включить и настроить фильтры, которые будут вычищать ненужный вам маркап (здесь на помощь придут модули WYSIWYG Filter, HTML Purifier, htmLawed и другие) – и настроить Paste Format использовать именно его (иначе будет использоваться формат ввода по умолчанию). Раздать пермишен на использование этого модуля тем ролям, которые создают/редактируют контент на сайте (этот пермишен защищает аяксовый колбек, который и производит фильтрацию вставляемого текста). Включить плагин Paste Format в нужных профилях редактора CKEditor.

Технически модуль вешается на событие вставки текста в визуальный редактор, посылает этот текст на сервер и вставляет уже обработанный текст. При этом вы сами управляете тем, какой маркап оставлять, а какой вычищать – просто настраивая фильтры обработки текста в админке Друпала.

Надеюсь, я ясно изложил позицию, для чего именно и почему был написан такой модуль (и в комментариях не будет разводиться флейм, что вот у CKEditor есть своя собственная чистка при вставке и так далее – на это могу сказать, что вы сами не контролируете, что именно и как вычищает CKEditor (и по моему опыту он может что-то оставлять, убирая что-то нужное – а поправить это я не могу ); а с этим модулем все находится под вашим полным контролем).
Также надеюсь, что данный модуль поможет улучшить юзер экспириенс авторов контента и отношения между ними и разработчиками/администраторами сайта.

Спасибо!

Источник: http://www.drupal.ru/node/82923

Модуль кросс-постинга материалов в сервис Я.ру для Drupal 6

Данный модуль предназначен для кросс-постинга материалов Друпал-сайта в сервис Я.ру (по аналогии с VKontakte CrossPoster и LiveJournal CrossPoster).

На нынешний момент модель позволяет кросс-постить материалы только на личную страницу сервиса Я.ру.

Работать с модулем достаточно просто и функционал его пока достаточно простой, так что быстренько рассмотрим основные моменты:

Заливаем файлы модуля в папку ./sites/all/modules и включаем его на странице модулей. Никаких зависимостей у него нет, так что все должно быть нормально в процессе установки; Далее, переходим на страницу admin/settings/yaruxp и смотрим на поля, которые необходимо заполнить; Перво-наперво нужно зарегистрировать модуль как приложение на специальной странице Яндекса: https://oauth.yandex.ru/client/new. После регистрации Вам станут доступны идентификатор клиента и секретный идентификатор; Вставляем доступные значение в соответствующие поля на странице admin/settings/yaruxp. Также, не забываем вписать свой логин на сервисах Яндекса; При первом нажатии на кнопку сохранения настроек модуля, Вы будете перенаправлены на специальную страницу Яндекс, на который будет нужно разрешить доступ приложения к требуемой ему информации и при помощи который будет сформирован токен, нужный для авторизации на сервисе. После всех манипуляций Вы будете перенаправлены на страницу настроек модуля; Теперь можно настроить взаимодействие модуля с материалами сайта.

Ссылка на репку: https://github.com/LordotU/drupal_6_yaruxp

Источник: http://www.drupal.ru/node/82817

PhPStorm 4 стал поддерживать Drupal’овский стиль кода из коробки

Мелочь, а приятно черт возьми =)

Ссылка на офф. сайт

Источник: http://www.drupal.ru/node/81772

DrupalCafé №5 в Харькове – 24.05.2012

Опять четверг, опять кафе.

В четверг, 24 мая, в 19:00, в Харькове пройдет пятое DrupalCafe.
На этот раз мы сменили место проведения, мероприятие пройдет по адресу ул. Маломясницкая, д 9/11, Академия “Шаг”. (станция метро “Проспект Гагарина”).
Карта

Темы докладов:

1. “Знакомство с модулем Views” (Алексей Гайдабура, WDG)
- Архитектура Views.
- Основы работы с Views.
- Для чего нужны CONTEXTUAL FILTERS и RELATIONSHIPS.
- Разное, непонятное.
Презентация – http://www.slideshare.net/nobodynone/dc-5-views-13071790

2. “Form API в Drupal 7. “Вкусности” и “красоты” (Дмитрий Олареско, WDG)
Данная тема познакомит Вас с особенностями Form API в Drupal 7. Расскажет о нововведениях и интересных приемах, которые могут пригодится как начинающему так и опытному программисту.
Презентация – http://www.slideshare.net/ssuser876ff0/drupal-cafe-5-drupal-7-form-api

3. “Секция-Вопросы&Ответы.”
В этот раз третий слот посвящен любым вопросам от посетителей. Вопросы можно прикреплять в комментариях, либо присылать на контактный e-mail.

Участие бесплатное, в программе как обычно, вкусные угощения – кофе, чай, блекджек, cookies.
Желательно предварительная регистрация, всем желающим – отпишите в комментарии или в контакты ниже.
Регистрация по ссылке

По всем вопросам можно обращаться:
+38(099)35-25-316 – Алексей Гайдабура, gaydabura@gmail.com skype: alexey.gaydabura
Спонсор по прежнему – WDG (http://wdg-company.com/)

Attached poll “Как Вы оцените свой уровень знания Drupal?”.
Register or login to poll
Results:
Новичек: 4 голоса
Уверенный пользователь: 6 голосов
Пишу модули: 6 голосов
Гуру: 2 голоса
Ниндзя: 2 голоса

Источник: http://www.drupal.ru/node/81588

Drupal Cafe’2012 в Москве. Май, вторая встреча

Итак, настала пора планировать следующее мероприятие.

Ориентировочно пройдет оно в том же помещении, что и первая встреча – антикафе Бабочки.
По датам предварительно ориентируюсь – 16, 17, 23 или 24 мая (дату еще корректирую в зависимости в том числе и от ваших замечаний).
По времени с 19 до 23.

Темы для обсуждения выложу чуть позже, если предложите что-то интересное – велкам!

Источник: http://www.drupal.ru/node/80987

Модуль – сервис оповещения Яндекса о появлении новых страниц на сайте

27 апреля Яндекс выпустил модуль оповещения себя об обновлении/добавлении новых страниц на сайт:
http://site.yandex.ru/cms-plugins/?from=wmblog
Модуль подходит для всех популярных CMS, в т.ч. и для Drupal 5, 6, 7.

Требует установки яндекс-поиска на сайт и добавления сайта в панель Яндекс.Вебмастер. Вроде-бы штука полезная, но я почему-то не могу отправить запрос, модуль говорит: “Яндекс.ПДС: Невозможно отправить пинг. Причина:Сайт не подтвержден в сервисе Яндекс.Вебмастер для указанного имени пользователя”. Хотя в сервисе Яндекс.Вебмастер всё давно подтверждено.

Через несколько часов модуль заработал, видать, дошло, поиск Яндекса индексирует сразу новый материал. Чуть переделал CSS и получилось прикольно.

Источник: http://www.drupal.ru/node/80814

Пингеры от Яндекса для индексации страниц (офциальные модули)

Яндекс выпустил модули “пингеры” для облегчения индексации страниц.

Цитирую Яндекс:
«Вы можете повысить приоритет индексирования некоторых страниц вашего сайта с помощью дополнений для CMS, которые могут отсылать запросы на индексацию автоматически. Дополнение, установленное в CMS, отслеживает изменения на сайте и генерирует запросы на индексацию при создании или изменении документов.»

Подробнее по ссылке + документация

Источник: http://www.drupal.ru/node/80761

Drupal Cafe’2012 в Москве. Быть!

11 апреля 2012 года с 19:00 по 23:00 пройдет великое событие – первое DrupaCafe в 2012 году в городе Москва!
Для проведения мероприятия зарезервирована комната в антикафе Бабочки – по ссылке адрес и карта, по которой проходить. Место находятся рядом с м. Павелецкая (выход с кольцевой ветки), буквально несколько минут пешком.
Главное не теряться и заходить именно со двора, а не с улицы. Само антикафе находится на 5 этаже здания.

Для участников будут выдаваться магнитные карты, поэтому важно – девушке на входе обязательно говорите, что вы по брони на имя Колосов Алексей или ДрупалКафе. Вам укажут куда заходить, где мы находимся.
В случае если вы такого не скажете – вам выдадут персональную карту с отдельно оплачиваемым временем. По брони время уже оплачено, вам дополнительно ничего не надо платить.

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

Напомню, что последняя встреча проводилась в декабре 2011, а на дворе уже практически апрель 2012!
На мой взгляд, это недопустимое упущение для русского сообщества в столице России. Формат встреч такого плана предполагает их регулярное проведение и перерыв в несколько месяцев очень губителен для атмосферы сообщества.

Резиденты DrupalCafe:
Алексей aka Softovick (моб. +7 (919) 104-98-73)
Виктор aka RxB

Гости мероприятия:
технический специалист от Яндекс (виртуальное общение по Skype)
владелец hr-portal.ru Валерий aka valeratal.
гуру СЭД на Drupal – Антон aka NaZg
представитель женской части русскоязычного сообщества – Мария (gagaga)

Предварительный список тем для обсуждения:

Темы обсуждения. Социальные сети на Drupal. Вкратце о том, какие элементы социальных сетей можно делать на Drupal (предварительно, от RxB). Обсуждение API Яндекс.Денег от технического специалиста! (приглашен разработчик от Яндекс) Практический опыт заработка на сайте, блоки контекстной рекламы. Валерий, hr-portal.ru Коротко об анализе узких мест в плане нагрузки на сервер сайтов на Drupal, некоторые наблюдения за очевидными ошибками после завершения разработки сайта и за особо тяжелыми модулями. (от Softovick & IT-Patrol inc) Друпал-лулзы, или примеры особо неправильных и опасных приемов разработки сайтов на Drupal (от RxB). Построение фото-магазина на Drupal. Обсуждение основ и вариантов реализации с использованием модуля Maestro (Drupal 7) (Антон NaZg). Обсуждение смежных вопросов и вопроса организации DrupalCafe в перспективе

На всякий случай хочу уточнить свое видение насчет места и формата проведения мероприятия. Я бы хотел, чтобы это было тихое и светлое место, важно наличие большого телевизора или возможность использования проектора для проведения презентаций. Также считаю немаловажным возможность закусить – в вечернее время любой человек не откажется от чашечки кофе с десертом, а многие я думаю и от легкого ужина. Жду ваших предложений и замечаний!

UPD:
сообщество ДрупалКафе ВКонтакте
страница ДрупалКафе на Facebook
UPD2:
тема на DrupalSN.Ru

Источник: http://www.drupal.ru/node/78994

OG Features – добавляем гибкости в OG


OG Features – модуль позволяющий администратору сайта определять, какой функционал в группе может включаться и отключаться владельцем группы.
Например, это могут быть произвольные типы контента, вьюхи, панели. Яркий пример использования этого модуля, это сборка Drupal Commons, где через og_features сделаны такие фичи для групп как:

Blog Discussions Documents Events Group Aggregator Polling Wiki Q&A

Сам процесс создания фичи для OG Features нетривиален.
Для этого вам нужно создать свой модуль, где нужно реализовать хук hook_og_features_registry().
Например, у нас модуль называется modulename и мы хотим определить фичу my_feature, код будет следующий, код взяд из модуля, комментарии оставлены оригинальные и строкой ниже добавлены мои:

function modulename_og_features_registry() { $registry = array();   // Feature: my_feature. // Создание объекта фичи. $feature = new stdClass;   // The feature id //Указываем id фичи, оно должно быть уникальным в пределах сайта $feature->id = 'my_feature';   // The name that will show up on the feature toggle form //Название фичи, которое будет показываться в группе на странице управления фичами $feature->name = t('Blog');   // The description that will show up on the feature toggle form //Описание, показываемое на странице управления фичами $feature->description = t('Provide a simple blog for your group');   // The components of the feature that will be enabled/disabled //Компоненты которые включает фича $feature->components = array( 'views' => array( 'og_tab_blogs', ), 'node' => array( 'blog', ), 'context' => array( 'group_blogs', ), 'path' => array( 'node/%node/aggregator', ), 'pane' => array( 'og_content_tracker-panel_pane_1', ), 'og link' => array( 'og_invite', // The key of the link in the group details block ), ); // It's recommended that you key the feature with the name of the // module/feature that is supplying this, so that any custom page // callbacks provided by this module/feature become disabled within // the group //помещаем фичу в "контейнер", это позволит нам в модуле определить несколько фич, если требуется $registry[$feature->id] = $feature;   // Feature: my_second_feature //объявляем вторую фичу $feature = new stdClass; // You can continue to add as many as you'd like //в дальнейшем процесс никак не отличается от первой фичи, в конце делаем так же $registry[$feature->id] = $feature; return $registry; }

Источник: http://www.drupal.ru/node/78408

К вопросу о jQuery старших версий в Drupal 6

Исправления Drupal 6 для совместимости с jQuery 1.6.4 и более старших версий.

Работают все функции в том числе ajax, ahah, загрузка файлов, autocomplite, batch и tabledrag.

В common.includes нужно заменить функции для преобразования в формат json:

/** * Converts a PHP variable into its Javascript equivalent. * * We use HTML-safe strings, i.e. with <, > and & escaped. */ function drupal_to_js($var) { switch (gettype($var)) { case 'boolean': return $var ? 'true' : 'false'; // Lowercase necessary! case 'integer': case 'double': return $var; case 'resource': case 'string': /* Patch ++ */   // Always use Unicode escape sequences (\u0022) over JSON escape // sequences (\") to prevent browsers interpreting these as // special characters. $replace_pairs = array( // ", \ and U+0000 - U+001F must be escaped according to RFC 4627. '\\' => '\u005c', '"' => '\u0022', "\x00" => '\u0000', "\x01" => '\u0001', "\x02" => '\u0002', "\x03" => '\u0003', "\x04" => '\u0004', "\x05" => '\u0005', "\x06" => '\u0006', "\x07" => '\u0007', "\x08" => '\u0008', "\x09" => '\u0009', "\x0a" => '\u000a', "\x0b" => '\u000b', "\x0c" => '\u000c', "\x0d" => '\u000d', "\x0e" => '\u000e', "\x0f" => '\u000f', "\x10" => '\u0010', "\x11" => '\u0011', "\x12" => '\u0012', "\x13" => '\u0013', "\x14" => '\u0014', "\x15" => '\u0015', "\x16" => '\u0016', "\x17" => '\u0017', "\x18" => '\u0018', "\x19" => '\u0019', "\x1a" => '\u001a', "\x1b" => '\u001b', "\x1c" => '\u001c', "\x1d" => '\u001d', "\x1e" => '\u001e', "\x1f" => '\u001f', // Prevent browsers from interpreting these as as special. "'" => '\u0027', '<' => '\u003c', '>' => '\u003e', '&' => '\u0026', // Prevent browsers from interpreting the solidus as special and // non-compliant JSON parsers from interpreting // as a comment. '/' => '\u002f', // While these are allowed unescaped according to ECMA-262, section // 15.12.2, they cause problems in some JSON parser. "\xe2\x80\xa8" => '\u2028', // U+2028, Line Separator. "\xe2\x80\xa9" => '\u2029', // U+2029, Paragraph Separator. );   return '"'. strtr($var, $replace_pairs) .'"';   case 'array': // Arrays in JSON can't be associative. If the array is empty or if it // has sequential whole number keys starting with 0, it's not associative // so we can go ahead and convert it as an array. if (empty ($var) || array_keys($var) === range(0, sizeof($var) - 1)) { $output = array(); foreach ($var as $v) { $output[] = drupal_to_js($v); } return '[ '. implode(', ', $output) .' ]'; } // Otherwise, fall through to convert the array as an object. case 'object': $output = array(); foreach ($var as $k => $v) { $output[] = drupal_to_js(strval($k)) .': '. drupal_to_js($v); } return '{ '. implode(', ', $output) .' }'; default: return 'null'; } }   /** * Return data in JSON format. * * This function should be used for JavaScript callback functions returning * data in JSON format. It sets the header for JavaScript output. * * @param $var * (optional) If set, the variable will be converted to JSON and output. */ function drupal_json($var = NULL) { // We are returning JavaScript, so tell the browser.     drupal_set_header('Content-Type: application/json; charset=utf-8');   if (isset($var)) { echo drupal_to_js($var); } }

В атаче исправленные JS файлы из папки misc.

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

p.s.: если активно перебираете DOM, то вместо указателя на селектор $(’selector’) в скриптах можно использовать $.shell.find(’selector’), который работает в области видимости только document без учета window, что несколько быстрее.( зачем так? затем что всякие дополнительные скрипты типа гуглпоиска, метрики, других решений, которые бомбят в документ фрейемы и прочие посторонние объекты могут реально раздувать поле выборки )

Прикрепленный файл Размер drupal_javascripts.zip 31.31 кб

Источник: http://www.drupal.ru/node/76592

Модуль Яндекс.Погода для Drupal 6 и 7

Скачать модуль для Drupal 6: yandex_weather-6.x-1.1.zip
Скачать модуль для Drupal 7: yandex_weather-7.x-1.1.zip

На прошлой неделе на сайте drupal.ru я увидел активное обсуждение топиков «Яндекс сервисы в одном проекте» и «Встреча по поддержке и продвижению Яндекс-сервисов в Drupal». В представленном списке существующих модулей для интеграции с сервисами Яндекса я не обнаружил модуля про погоду. Я доработал свой модуль, исправил ошибки, дописал дополнительный функционал и решил выложить на сайт для обсуждения сообществом.

Вот так выглядит блок с информером погоды от Яндекса в дефолтной теме.

В настройках блока можно:

указать город по умолчанию; разрешить/запретить отображать форму выбора города в блоке; выбирать размер информера.

Текстовые сообщения модуля написаны на английском языке и переведены на русский язык.

Если данный модуль вызовет интерес, то можно переписать его и для Drupal 7. Буду благодарен за любые конструктивные комментарии.

UPD 21.02.2012: Обновил модуль. На прошлой неделе Яндекс обновил свой сервис погоды, поэтому поломалась часть функциональности моего модуля. Сейчас исправил. А также сделал версию модуля под Drupal 7.

Скачать модуль для Drupal 6: yandex_weather-6.x-1.1.zip
Скачать модуль для Drupal 7: yandex_weather-7.x-1.1.zip

Прикрепленный файл Размер yandex_weather-6.x-1.1.zip 9.33 кб yandex_weather-7.x-1.1.zip 9.48 кб

Источник: http://www.drupal.ru/node/76316

Встреча по поддержке и продвижению Яндекс-сервисов в Drupal

Продолжение комментария http://www.drupal.ru/node/74274?page=1#comment-435564
Компания Яндекс заинтересована в продвижении и повышении уровня интеграции своих сервисов с Drupal.
Предлагается провести встречу по вопросам разработки, встреча ориентирована преимущественно на разработчиков.
Яндекс интересует:

Время встречи – 24 января, вторник, 19 часов. Будет забронирована переговорная комната. Встреча будет проходить в офисе Яндекса Количество участников (сколько будет людей очно на встрече, сколько будет удаленно). Товарищи, желающие присутствовать удалённо – отпишитесь, пожалуйста, в комментариях.

Так же я считаю, что будет нелишним подготовить вопросы и предложения по использованию API

Очники:
http://www.drupal.ru/username/rxb
(?) http://www.drupal.ru/username/valeratal
(?) http://www.drupal.ru/username/marygold
http://www.drupal.ru/username/stalker-g2
+1 человек с Артёмом
http://www.drupal.ru/username/irbis
http://www.drupal.ru/username/axel
Те, кто будет приходить лично приходят на главный вход в офис Яндекса и говорят, что они на встречу с Друпал сообщестом. Гостей будет встречать Вадим Францев, руководитель группы маркетинга бизнес-решений, с 19-00 до 19-10 на главном ресепшене. Опаздавшие либо к секретарям обращаются и их проводят, либо звонят по телефону +7 495 739-70-00, добавочный 4234.
Переговорка “7.Холмов”

Илья Азаров
http://www.drupal.ru/username/byuro-piyavok

Заочники:
http://www.drupal.ru/username/gagaga
http://www.drupal.ru/username/fortis
http://www.drupal.ru/user/orb
http://www.drupal.ru/username/s-f
http://www.drupal.ru/username/andypost-drupalorg
http://www.drupal.ru/username/validoll
http://www.drupal.ru/username/konstantinkomelin-drupalorg
http://www.drupal.ru/username/restyler
http://www.drupal.ru/username/dd-85
http://www.drupal.ru/username/gde
http://www.drupal.ru/username/enemy
http://www.drupal.ru/username/scotty
http://www.drupal.ru/username/yexel
http://www.drupal.ru/username/cyber
http://www.drupal.ru/username/marygold
http://www.drupal.ru/username/seaji
http://www.drupal.ru/username/higor1968
http://www.drupal.ru/username/plazik
http://www.drupal.ru/username/aleks-84
http://www.drupal.ru/username/lomalkin
http://www.drupal.ru/username/insime
http://www.drupal.ru/username/eagle
http://www.drupal.ru/username/direqtor
http://www.drupal.ru/username/forest-run
http://www.drupal.ru/username/arcadaisb
http://www.drupal.ru/username/glu2006
http://www.drupal.ru/username/splash
Те, кто участвуют удаленно: в 19-10 по МСК должны зайти по адресу http://yandex.adobeconnect.com/drupal/ – здесь будет трансляция, а также чат (вопросы/ответы).

Хотят запись:
http://www.drupal.ru/username/enemy
http://www.drupal.ru/username/softovick
http://www.drupal.ru/username/mak-vardugin
http://www.drupal.ru/username/andruxa
http://www.drupal.ru/username/orion76
http://www.drupal.ru/username/saltan
http://www.drupal.ru/username/6run0

Будут вноситься коррективы

Источник: http://www.drupal.ru/node/74730

Яндекс сервисы в одном проекте

Предлагаю обсудить возможность объединить все Яндекс сервисы в одном проекте. На текущий момент на д.о. есть несколько различных модулей для интеграции с яндекс сервисами.

Поиск по сайту дал следующие результаты:

 Яндекс.маркет — 6.x.  Яндекс.маркет — 6.x и 7.x(dev). Яндекс.маркет — в песочнице.  Яндекс.видео — 7.x(dev) new!  Яндекс.метрика — 6.x и 7.x. Яндекс.метрика — в песочнице. Яндекс.вакансии — обсуждается.  Яндекс.новости — 6.x(dev) и 7.x(dev).  Яндекс.карты — 6.x(dev).  Яндекс.деньги — 5.x платёжный шлюз для уберкарт. Яндекс.сервер — в песочнице. Яндекс.поделиться — в песочнице. Яндекс.спеллер — в песочнице. Яндекс.почта — обсуждается. Яндекс.карты — почти готов. Яндекс.карты — во вложении.  Site verification — 6.x и 7.x. Яндекс.маркет — во вложении. Быстрый заказ — обсуждается. Яндекс.погода — во вложении.

Если что то забыл, поправьте.

Вот мои причины, для чтобы собрать все сервисы в один проект:

На данный момент большинство из этих модулей находятся «в стадии разработки», а многие попросту брошены без особых шансов получить стабильный релиз для D6 и D7. Я думаю ситуация измениться, если у проекта будет несколько разработчиков. Это поможет устранить дублирования проектов. Например, в приведённом списке представлено сразу 4 модуля для интеграции с Яндекс.маркет. Думаю, лучше всё таки будет объединить усилия. Помощь новым разработчикам. Несколько модулей находятся в песочницах из-за того, что некому сделать review кода. На д.о. яндекс мало кому интересен… Для многих яндекс сервисов интеграция с Друпалом полностью отсутствует. В том числе для самого главного, на мой взгляд сервиса — Яндекс.xml. Для одного общего проекта, легче найти спонсоров.

Attached poll “Нужно ли объединять все яндекс.модули в один проект?”.
Register or login to poll
Results:
Да: 43 голоса
Нет: 27 голосов

Источник: http://www.drupal.ru/node/74274

MVC в Drupal. Внедряем Page Controller’ы.

Хочу поделиться с комьюнити модулем controller, который можно взять здесь. В чем смысл модуля?

Модуль позволяет для каждого УРЛа, который вы определяете в hook_menu() прописать действие контроллера. Для этого есть специальный новый элемент ‘action’:

<?php
/**
 * Implements hook_menu().
 */
function controller_menu() {
  $items = array();
  $items['admin/settings/controller'] = array(
    'title' => 'Controller settings',
    'action' => 'SettingsController::indexAction',
    'access arguments' => array('access administration pages'),
  );
  return $items;

?>

Здесь объявляется новый контроллер SettingsController и действие indexAction() которое будет вызывано для УРЛа ‘admin/settings/controller’.

По умолчанию контроллеры должны лежать в специальной папке controllers/. Которую можно создать в папке своего модуля. Имя файла будет таким же как и прописано в ‘action’, однако имя класса нужно дополнять префиксом, который будет равен имени модуля после применения СamelCase нотации (с первой большой буквой). Звучит сложно, чтобы понять какие префиксы добавятся для разных модулей, несколько примеров:

foo_bar станет FooBar my станет My test_my_super станет TestMySuper и т. д.

В примере выше, в хуке меню объявлен контроллер SettingsController, имя модуля controller, значит полное имя класса будет ControllerSettingsController, а имя файла SettingsController.php. Пример как все это дело работает можно найти в самом модуле.

Надеюсь, понятно описал, если есть вопросы, спрашивайте!

P.S. У темы появилось продолжение.

Источник: http://www.drupal.ru/node/74262

Урок один. Создаем модуль на Drupal. Как с Drupal создать форму и вывести данные из формы на этой или другой страници. Хук hook

Пример 1. Как с Drupal создать форму и вывести данные из формы на этой или другой страници.

————————
| Создаем форму |
————————
|
———————————————————————
| Выводим данные с помощью функции variable_get() |
———————————————————————-

Для этого:
Создаем модуль.
Для этого:

- создаем папку и называем ее по названию модуля, например urokone и сохраняем его в my_site/sites/all/modules

- в этой папке создаем в notepad++ два файла в формате utf-8 without BOM. Что такое BOM и где скачать notepad++ смотрим в википедии.

Создаем два файла в этой папке и называем их
urokone.info
urokone.module

1.1. Минимальное содержимое файла urokone.info

; $Id$ name = Urokone   description = Simple form one core = 6.x

; $Id$ //если вы будите выставлаять ваш модуль на Drupal.org то он добавит автоматически свои параметры
name = urokone // название вашего модуля
description = Simple form one //описание
core = 6.x //в нашем случае мы пишем для Drupal 6.

1.2. Минимальное содержимое файла urokone.module

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

<?php   function urokone_menu() { $items = array();   $items['urokone'] = array( 'page callback' => 'drupal_get_form', 'page arguments' => array('urokone_formone'), );   return $items; }

$items['urokone'] = array( ); // эта сторочка означает, что форму c названием (Form_ID) urokone_formone, которую я собираюсь вставить в этот модуль можно будет найти после активации если кликнуть на локальном сервере

127.0.0.1/my_site/urokone

Теперь активируем модуль
Для этого:
- кликните в администраривной панели на Administer -> modules
ваш новые модуль будет находится в разделе others. Кликаем чекбокс напроив нашего модуля.
У меня на локальном сервере это выглаядит так:


И кликаем на кнопку Save Configuration. Когда сделаем следующие изменения в модуле надо будет очистить кеш. Administer->Performance->Clear cashed data

2. Пишим весь модуль.

———————————–
2.1 | Создаем меню |
———————————–
|
————————————————————————-
2.2. | Создаем условия доступа для различных пользователей |
————————————————————————–
|
——————–
2.3. | Создаем help |
——————–
|
—————————————————————————-

2.4. | Создаем форму |
———————–
|
———————————————————————————————-
2.5. | Выводим содержиое, которое user вбил в форму на экран (в нашем
случае в блоке)
————————————————————————————————

2.1. Создаем меню.

Для создания меню используем hook – это функции дрюпала. Например hook
function hook_menu()
для нашего модуля мы должны измеить по названию нашего модуля на

function urokone_menu() { $items = array();   $items['urokone'] = array( 'title' => 'Как подтвердить факт отправленния ненулевых данных в форму?', 'description' => 'Urokone first form', 'page callback' => 'drupal_get_form', 'page arguments' => array('urokone_formone'), 'access arguments' => array('access administration pages'), 'type' => MENU_NORMAL_ITEM, );   return $items; }

2.2. Создаем условия доступа различных пользователей.
Используем хук hook_perm()

function urokone_perm() { return array('access urokone content', 'access administration pages'); } // function urokone_perm() 2.3. Создаем help

Используем хук hook_help()

function urokone_help($path, $arg) { $output = ''; //declare your output variable switch ($path) { case "admin/help#urokone": $output = '<p>'. t("Displays information about site") .'</p>'; break; } return $output; } // function urokone_help

Здесь можно сохранить модуль. Помните (Administrator-> modules -> Save configurations) и посмотреть появление строчки “Displays information about site” , если пойти Administer – > help -> urokone

Если на этой страницы кликнуть на urokone то увидим страницу со строкой “Displays information about site”. Мы в хуке help можем заменить эту строку на подробное описание нашего модуля.

———————————————————————————————
Теперь нам осталось
————————
| Создать форму |
————————
|
———————————————————————
| Выводим данные с помощью функции variable_get() |
———————————————————————-
———————————————————————————————-

2.4. Создаем форму

Используем функцию urokone_formone()

Например я хочу сделать такую форму:

Для этого в Drupla мы пишем функцию urokone_formone().

function urokone_formone($form_state) { $form = array();   $form['one_one'] = array( '#type' => 'checkbox', '#title' => 'if ($_REQUEST["text"]) {echo "Data was send";}', '#default_value' => variable_get('one_one', false),   );   $form['one_two'] = array( '#type' => 'checkbox', '#title' => t('if ($_REQUEST("text")) {echo "Data was send";}'), '#default_value' => variable_get('one_two', false), );   $form['one_three'] = array( '#type' => 'checkbox', '#title' => t('if {$_REQUEST["text"]} {echo "Data was send";}'), '#default_value' => variable_get('one_three', false), );       return system_settings_form($form); } // end urokone_formone

Заходим на 127.0.0.1/lesson/urokone

При этом в результате работы функции return system_settings_form($form); появляютя две кнопки “Save configuration” и “Reset to default”

2.5. Выводим содержиое, которое user вбил в форму на экран (в нашем
случае в блоке. Используем хук hook_block.

function urokone_block($op='list', $delta=0) {   if ($op == "list") { $block = array(); $block[0]["info"] = t('urokone'); return $block; } else if ($op == 'view') { switch ($delta) { case 0: $block_content = ''; $block['subject'] = 'urokone';   $one_one= variable_get('one_one', false); $one_two= variable_get('one_two', false); $one_three= variable_get('one_three', false);   if ($one_one or $one_two or $one_three) { if ($one_one) $block['content'] .= 'your answer is correct '; if ($one_two) $block['content'] .= 'your answer is not correct '; if ($one_three) $block['content'] .= 'your answer is not correct'; } break;   } return $block; } } // end urokone_block

Теперь надо активировать новый блок urokone который мы создали. Идем в Administer -> blocks.
Находим наш блок urokone в списке Disabled.

Меняю регион с “none” на другоe. Я например выбрала “Left sidebar”.
И нажимаю на кнопку внизу Save blocks.

Теперь зайдем еще раз на страницу с нащей формой 127.0.0.1/lesson/urokone и кликнми на какой нибудь чекбокс. Например на вророй чекбокс с правильным ответом.
У нас слева в блоке urokone появится сообщение о том на какой чекбокс мы кликнули.

Прикрепленный файл Размер tut1_1.png 29.72 кб tut1_2.png 24.68 кб tut1_3.png 23.3 кб tut1_4.png 47.17 кб tut1_5.png 14.56 кб tut1_6.png 33.72 кб tut1_7.png 56.37 кб tut1_8.png 40.71 кб

Источник: http://www.drupal.ru/node/74258

Урок 2. Создаем модуль на Drupal. Как с помощью хука hook_form_form _ID_ alter изменить любую форму в нашем или чужом модуле.

Я буду использовать модуль, который полностью аналагечен модулю из урока один. Я хочу добавить еще один чекбокс в форму и изменить title у первой страницы.

Изменить форму можно и без использования модуля. Смотрите в комметах sas@drupal.org: Как без использования модуля изменить форму.

Код двух файлов модуля uroktwo:
uroktwo.info

;$Id$ name = Uroktwo description = Tutorial Change form with form_alter core = 6.x

uroktwo.module

<?php ;$Id$ /***************************************************** * Implements hook_menu(). *******************************************************/ function uroktwo_menu() { $items = array(); $items['uroktwo'] = array( 'title' => 'What is the correct way to create MySql database? ', 'description' => 'lesson two form', 'page callback' => 'drupal_get_form', 'page arguments' => array('forma'), 'access arguments' => array('access content'), 'type' => MENU_NORMAL_ITEM, ); return $items; } /***************************************************** * Implements hook_perm(). *******************************************************/   function uroktwo_perm() { return array('access uroktwo content', 'access administration pages'); } // function uroktwo_perm()   /***************************************************** * Implements hook_help(). *******************************************************/   function uroktwo_help($path, $arg) { $output = ''; //declare your output variable switch ($path) { case "admin/help#uroktwo": $output = '<p>'. t("Displays information about site") .'</p>'; break; } return $output; } // function uroktwo_help   /***************************************************** * Implements function forma *******************************************************/   function forma($form_state) { $form = array();   $form['one'] = array( '#type' => 'checkbox', '#title' => t('create.databas()'), '#default_value' => variable_get('one', false), );   $form['two'] = array( '#type' => 'checkbox', '#title' => t('mysql_create_db()'), '#default_value' => variable_get('two', false), );   $form['three'] = array( '#type' => 'checkbox', '#title' => t('create_mysql()'), '#default_value' => variable_get('three', false), );   $form['four'] = array( '#type' => 'checkbox', '#title' => t('create_d()'), '#default_value' => variable_get('four', false), ); $form ['submit'] = array ( '#type' => 'submit', '#value' => t('Submit'), ); return $form; } // end forma   /***************************************************** * Implements hook_block(). *******************************************************/   function uroktwo_block($op='list', $delta=0) {   if ($op == "list") { $block = array(); $block[0]["info"] = t('uroktwo'); return $block; } else if ($op == 'view') { switch ($delta) { case 0: $block_content = ''; $block['subject'] = 'uroktwo';   $one= variable_get('one', false); $two= variable_get('two', false); $three= variable_get('three', false);   if ($one or $two or $three) { if ($one) $block['content'] .= 'your answer create.database() was incorrect '; if ($two) $block['content'] .= 'your answer mysql_create_db() was correct '; if ($three) $block['content'] .= 'your answer create_mysql_db() was incorrect'; } break;   } return $block; } } // end uroktwo_block

Для написания hook_form_FORM_ID_alter нам надо знать значение FORM_ID. Если это наш собственный модуль, то можно просто посмотреть на функцию формы.

function forma ($form_state)

forma в нашем случае и будет Form_ID, а hook будет называтся название_модуль_form_forma_alter. Для нашего модуля это будет uroktwo_form_forma_alter.

Второй способ найти Form_ID это посмотреть source code. Для этого я на локальном компьюторе открываю страницу с формой. В моем случае название сайта lesson. В хуке меню мы в этой строчке определили ($items['uroktwo'] = array()), что форму можно открыть, если набрать 127.0.0.1/lesson/uroktwo.

Откройте страницу с формой. Теперь в интернет эксплоурере идите Page -> view souce. С помощью ctrl – F ищим строчку в которой есть слово form. У меня это

То есть id = “forma”

Теперь собственно хук

<?phpfunction uroktwo_form_forma_alter(&$form,
    &$form_state) {
  $form['one']["#title"] = "I do do not know";
      
   $form['five'] = array(
  '#type' => 'checkbox', 
  '#title' => t('create_data()'),
  '#default_value' => variable_get('five', false),
);
}
?>

Получилась полностью функциональная форма, но кнопка сабмит расположенна выше нового чекбокса.

Давайте это исправим. Добавим строчку weght в хук, и у нас получится

<?phpfunction uroktwo_form_forma_alter(&$form,
    &$form_state) {
  $form['one']["#title"] = "I do do not know";
      
   $form['five'] = array(
  '#type' => 'checkbox', 
  '#title' => t('create_data()'),
  '#default_value' => variable_get('five', false),
  );
$form ['submit'] ['#weight'] = 1000;
}

?>


На этом все.
P.S. Создавать новые модули надо сначала на отдельном, выделенном для этого сайте, а потом уже переносить в реальный сайт.

Прикрепленный файл Размер tut2_1.png 35.34 кб tut2_2.png 31.79 кб tut2_3.png 20.71 кб

Источник: http://www.drupal.ru/node/74214

Custom page – Создание пользовательских страниц

Описание:
Модуль создан для создания пользовательских страниц с возможностью подмены контента, как всей страницы, так и только той части, что выводится в переменной $content.

Возможности:
Создание неограниченного числа пользовательских страниц
Создание сложных путей
Создание путей с именованными параметрами вида %param, %some итд
Создание путей с именованными зарезервированными параметрами вида %node, %user, %modulename_modulename
Создание путей с неограниченным числом параметров (ограничение только на длину URI)
Создание не явных параметров вида %
Создание страниц с указанием ролей, которые могут иметь доступ к этим страницам
Создание страниц с указанием темы
Создание шаблонов страницы как в отдельном файле темы вида [cid].tpl.php, так и в template.php вида [cid]()
Поддержка модуля features для экспорта/импорта страниц
Поддержка модуля context

Подробности тут: http://css.mirocow.com/projects/custom-page/wiki/Wiki
Скачать тут: http://css.mirocow.com/projects/custom-page/repository

Level: Profi

Источник: http://www.drupal.ru/node/73058

DrupalConf – прямая трансляция запущена!!!

Внимание! Трансляцию можно смотреть на http://yatv.ru/DrupalConf_2011_P2
Периодически инернет отваливается, но мы стараемся оперативно восстанавливать вещание
Слайды конференции http://dl.dropbox.com/u/1197453/drupalconf2011.zip

Источник: http://www.drupal.ru/drupalconf-moscow-2011-video

Drupal Cafe Москва – встреча 02.12.11 – 19-00

В пятницу 2.12.2011 в 19:00 пройдет очередная встреча Drupal кафе Москва

Место проведения уже традиционно – ул. Покровка 38/1 Читалкафе (вход с Лялиного переулка) карта. Вход свободный, регистрация не требуется, глубоких познаний друпала — тоже.

Список докладов и тем для дискуссии:

Увеличение качества и прибыльности проекта для разработчика Открытое обсуждение темы – Drupal vs Бизнес: почему Drupal лучше любого framework и как его правильно готовить при управлении проектами. Типы контента — это гвозди прибивающие ноды в нужные места сайта. А теперь уберём гвозди… (глубоко теоретическая дискуссия) И напоследок, когда все захотят спать: MySQL + Drupal, базовая настройка

Источник: http://www.drupal.ru/node/72096

Обновляем мгновенно сайты через drush

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

Допустим мы имеем сайт ( придумаем ему синоним @SITE) в двух и более редакциях, например:
1) Сайт в интернете видят все люди – @site.live
2) Сайт на локальной машине – @site.dev

обновляем файлы сайтов вместе с модулями (откуда куда):
drush rsync –progress @site.dev @site.live

обновляем базы данных (при дополнительных параметрах, можно исключать/включать таблицы) (откуда куда)
drush sql-sync –no-cache @site.dev @site.live

обновляем только файловый контент сайтов (откуда куда)
drush rsync @site.dev:%files @site.live:%files
(по дефолту site/mysite.ru/files/ или sites/default/sites – кто любит плодить друпалы)

Хотим посмотреть список включенных модулей удаленного сайта
drush @site.live pml –status=enabled

Хотим включить модули удаленного сайта: admin_menu authcache
drush @site.live en admin_menu authcache -y

Через drush мы экономим много времени на эти операции, иначе эти операции можно выполнять вручную: ставить галочки, копировать файлы….

Теперь опишу как мы обозначаем синонимы, оригинал примера тут http://drupalcontrib.org/api/drupal/contributions–drush–examples–exam…
1. Создаем файл site.aliases.drushrc.php в любом из каталогов ~/.drush, /etc/drush, там где установлен drush, либо прописываем дополнительный путь для каталога синонимов
2. Приведу пример своего файла в котором описан сайт с двумя версиями live – живой сайт на хостинге, dev – сайт на локальной машине


<?php
$aliases['dev'] = array(
'root' => '/var/www/drupal7/',
'uri' => 'www.mysite.local',
);

$aliases['live'] = array(
'root' => '/home/user/projects/mysite',
'uri' => 'site.ru',
'remote-host' => 'mysite.ru',
'remote-user' => 'user-hosting',
'ssh-options' => '-p2222',

'path-aliases' => array(
      '%drush' => '/home/user/bin/drush/',
      '%drush-script' => '/home/user/bin/drush/drush',
      #'%root' => '/home/user/projects/site/sites/',
      '%dump-dir' => '/home/user/projects/site/dump/',
      '%dump' => '/home/user/projects/site/dump/sro.sql', 
      #'%files' => 'sites/site.com/files',
),
);
?>

ps Особеннно радует работа с мультисайтиногом, т.е. даже когда у вас сайты в sites/ на одной установке drupal

Синхронизируем сайты drupal через drush
от lullabot Более подробно на английском

работает ли под вендой – незнаю, т.к. не использую её

Единственное не получилось у меня обновить сайт с одно удаленного сервера на другой удаленный сервер (локальный удаленный – удаленный локальный = работает)

Источник: http://www.drupal.ru/node/71139

DrupalConf Москва – 3 декабря // делимся впечатлениями о конференции

Итак, новости! Во-первых, наш генеральный спонсор – компания Microsoft!
0. Конференция состоится 3 декабря.
1. Формат – 1 поток.
2. Конференция пройдет там же, где и в прошлый раз – метро ВДНХ, павильон Электрификация http://www.expo-elektra.ru/kak-nas-najti.html . Будет интернет! Все недочеты организации прошлой конференции учтем.
3. Конференция будет бесплатной!

Дорогие гости из других городов, можете покупать билеты. Дата не поменяется, событие состоится!

Открыта регистрация на сайте http://drupalconf.ru/user/register Если вы участвовали в прошлой конференции, вам необходимо зайти на сайт и обновить информацию в профиле.

Открыто голосвание и прием докладов! зарегистрированные пользователи могут добавить доклад, перейдя по ссылке http://drupalconf.ru/node/add/session
Голосовать за доклады зарегистрированные пользователи могут по адресу http://drupalconf.ru/sessions

Начало регистрации: 9:30
Окончание конференции: 19:00

Источник: http://www.drupal.ru/node/70326

Тема админки Drupal 8

День добрый.

Грядёт Drupal 8 и в нём будет новая тема оформления. Как в 7-ке на смену Garland пришла Seven, так и в 8-ке будет новая тема, в том числе и тема админки.

Хотялось бы поднять тему разделения темы сайта и темы админки и узнать, кто какую тему устанавливает для админки. На данный момент для Drupal 7, по моему мнению популярны три темы:

Seven – стоит по умолчанию RootCandy Rubik (требует наличия темы Tao)



На мой взгляд Rubik – наиболее удобная и проработанная тема для админки. А для быстрой навигации по страницам настройки модулей есть страница http://www.site.ru/admin/index.

Поделитесь какими темами для админки Вы пользуетесь.
Только вместе мы сможем достичь светлого будущего.

Прикрепленный файл Размер seven.png 47.61 кб rootcandy.png 46.23 кб rubiktao.png 72.23 кб

Attached poll “Какую тему вы используете для админки”.
Register or login to poll
Results:
seven: 29 голосов
rootcandy: 6 голосов
rubik: 17 голосов
свой вариант: 6 голосов
OM Admin Theme: 0 голосов
Polpo Admin Theme: 1 голос

Источник: http://www.drupal.ru/node/69727

Корзина Ubercart в popup окне

Решил на сайте сделать корзину в сплывающем окне.
Прежде всего хочу сказать спасибо Splash за помощь по выковыриванию данных из корзины.
И за отличный модуль UC JS CART который очень был кстати.
Были использованы модули  uc ajax cart для добавления динамической корзины,  colorbox для попап окон, uc js cart для динамического подсчета товара, ну и немного допилены tpl и css.
Итак первое это uc ajax cart. В нем есть папка с тимплейтами, немного правим .tpl для реализации внешнего вида и некоторого функционала.
Сюда же добавим скрытый div с содержимым корзины и ссылку colorbox для показа этого содержимого в попап окне.
У меня это так:

<a href="?width=850&height=auto&inline=true#cartOpen" class="colorbox-inline">В корзине <?   $a = count(uc_cart_get_contents()); echo $a.' товар'.numberProduct($a, array('','а','ов'));       ?></a>   <div class="price-of-cart">на <strong><?php print $total ;?></strong></div> <div id="myCart" style="display:none;"> <div id="cartOpen"> <h2 class="cart_header">Корзина</h2> <?php print ubercart_popup(); ?>   </div> </div>

По внешнему виду так:

Там еще функция для склонения товар, товары, товаров есть:

<?php function numberProduct($number, $titles) { $cases = array (2, 0, 1, 1, 1, 2); return $titles[ ($number%100>4 && $number%100<20)? 2 : $cases[min($number%10, 5)] ]; } ?>

Далее как вы увидели в шаблоне есть вывод содержимого корзины <?php print ubercart_popup(); ?>
Это и есть функция которая выдирает содержимое корзины писать её нужно в template.php
Выглядит она так:

function ubercart_popup() { if (module_exists('uc_cart')) { $items = uc_cart_get_contents(); if (empty($items)) { return theme('uc_empty_cart'); } $output = ''; foreach (uc_cart_cart_pane_list($items) as $pane) { if ($pane['enabled']) { $output .= $pane['body']; } } return '<div id = "uc_popup">'. $output .'</div>'; } }

В общем содержимое уже выводится в попапе, только вот есть несколько моментов. Это не срабатывает яваскрипт для обновления позиций товара из модуля uc ajax cart(как решить не знаю). По этому поводу я отключил в настройках модуля фитчу “Ajaxify cart page”.
Далее установите модуль uc js cart – как раз он и позволяет динамически подсчитывать стоимость.
Вот практически и все. Остальное можно сделать средствами css.
Осталось одно, когда мы открываем корзину и добавляем или уменьшаем количество позиций, в самом блоке корзины при закрыти попап окна нихера не меняется. Скорее всего нужно дописать кусок яваскрипт кода для обновления.(займусь позже)
У меня это выглядит вот так все:

Если кто то из читателей решал этот воброс более изящно, корректно, быстро и еще как нить иначе расскажите плиз.
Всем спасибоу!

Источник: http://www.drupal.ru/node/69695

Мини-CRM своими ручками часть. 4 (Заключительная)

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

Глава 1

Как скрыть ноду от лишних глаз

Актуально при постройке структуры на основе нод, закрепление материала освещенного в части 2

Глава 2

Карточка компании

темизируем ноду

Глава 3

Типы материалов

Пробежимся по 3-ем основным материалам

Глава 4

Заключительная

За сим господа, я завершу писать на эту тему.
В скором времени постараюсь сделать дамп и выложить на суд общественности для допилки и закидывания помидорами.
Вместе все-таки легче делать. У меня уже глаза мылятся..

Глава 5

Заключительная 1 (нов 2)

И все-таки, а нахера оно надо?
Отвечу: помощь манагерам или персоналу без финансовых вливаний. Повышение личного экспириенса. Могу я, значит может и друпал, только четко поставить задачу.
Можно построить ледокол из обычной лодки. Все ограничено Вашей фантазией или конкретной задачей.

часть 1
часть 2
часть 3
————–
оригинал

————–
ДАМП
SQl дамп
Дамп сайта целиком

Импортируете SQL в свою базу ( мой префикс crm2_ ) Заливаете дамп сайта на хостинг (денвер) или еще куда. Дамп целиком, с модулями и т.д. Редактируете settingd.php под свои нужды Заходите на свой сайт через www Логин – cooper Пароль – cooper

Attached poll “Делать дамп?”.
Register or login to poll
Results:
нах: 4 голоса
давай: 15 голосов
давай, я помогу идеями и реализацией: 5 голосов
давай-давай, я его подшаманю и продам, а тебе шиш: 2 голоса
не-не-не, я с 1С останусь: 0 голосов

Источник: http://www.drupal.ru/node/69691

[Состоялось][DrupalЮг] BarCamp + встреча 15 октября 2011

15 октября 2011 в городе Краснодаре будет проводиться BarCamp, силами Южного сообщества будет организована секция Drupal, в рамках которой будет несколько докладов и бурное их обсуждение.

Темы и докладчики:
Почему Drupal? Или немного из своего опыта. Докладчик: Виктор Степаньков
Инструменты для SEO и интернет-маркетинга в Drupal. – Докладчик: Пётр Селфин
Продаем бесплатное – ищем ценность OpenSource решений на примере CMS Drupal. Докладчик: Александр Дубовской
Красивые формы в Drupal 7. Докладчик: Богдан Романенко

Мероприятие состоялось, считаю довольно успешно.
Видео и тексты презентаций будут выложены на http://drupalyug.ru.

Источник: http://www.drupal.ru/node/69365

Drupal Cafe Москва – встреча 4.10.11 – 19-00

Во вторник 4.10.2011 в 19:00 пройдет третья встреча Drupal кафе Москва

Место проведения уже традиционно – ул. Покровка 38/1 Читалкафе (вход с Лялиного переулка) карта

На этот раз у нас будет несколько докладов.

1. Microsoft и Drupal (PVasili)
2. Настройка от боевого, до сервера разработки в VirtualBox (В. Касихин)

Установка Ubuntu-server в VirtualBox. Установка и настройка nginx. Установка и настройка MariaDB. Установка и настройка Git. Установка Zend Server Se.CE. Создание ключей доступа. Первоначальная установка Drupal. Кратко о системах мониторинга и управления: Munin и WebAdmin

3. Минидоклады: инструменты разработки в Drupal, меры защиты сайта (Александр Графов)

Оставшееся время, как всегда посветим остальным актуальным вопросам.

Источник: http://www.drupal.ru/node/69238

Drupal Cafe в Иркутске – 29 сентября!

Итак, окончательная информация:

Дата: четверг, 29 сентября, 19:00.

Место проведения Drupal Cafe в Иркутске – кофейня “Белая ворона”: http://vkontakte.ru/coffeenbook. Адрес: Карла Маркса, 37. Вход через магазин цветов “Рассвет”, находится между Л’Этуалью и Золотом Якутии. Заходите в цветы, немного проходите вперед и спускаетесь в цокольный этаж, идите на запах кофе.

В программе – 3 доклада (20-30 минут):

“Насколько глубока кроличья нора?”. Продвинутое применение модуля Views (уровень – начальный и средний). “Ускоряемся”. Быстрая разработка шаблонов Drupal при помощи “базовых” тем (уровень – начальный и средний). “Мелочи в Drupal”. “Подводные камни”, о которых лучше знать заранее. (уровень – начальный).

Будем рады видеть всех, кому интересен Drupal и вообще тема создания сайтов и веб-сервисов.

Drupal Cafe Иркутск в социалках:
“В контакте”: http://vkontakte.ru/event30298356
“Facebook”: http://www.facebook.com/event.php?eid=172728356140202

Иркутяне, добавляйтесь!

Есть вопросы? Звоните: +7 914 8888621

Комментировать можно здесь и на drupal4all: http://drupal4all.ru/node/25

Афиша мероприятия

Источник: http://www.drupal.ru/node/69127

Размещение баннеров в теле view

Может кому пригодится http://druit.ru/blogs/views/203

Источник: http://www.drupal.ru/node/68935

Модуль интеграции инструментария для работы с изображениями GraphicsMagick

Сделал модуль  ImageAPI GraphicsMagick интегрирующий инструментарий для работы с изображениями GraphicsMagick c ImageAPI. С помощью модуля можно применять GM для обработки изображений, например в модуле ImageCache и ImageCache Actions (вместо встроенного в php GD2 и ImageMagick).

На данный момент в нем интегрированы простейшие действия (изменения размеров, кадрирование и т.д.). Также реализовал поддержку наложения водяных знаков с помощью этого модуля в модуле ImageCache Actions: http://drupal.org/node/1284668 .

Больше всего модуль будет полезен программистам, способным написать свое действие (image action) но также подойдет и обычным пользователям для снижения нагрузки на хостинг и ускорения “тяжелых” операций с изображениями (естесственно, при условии, что вы можете установить сам GraphicsMagick – не на каждом хостинге это доступно).

Видел на Д.ру уже подобную тему, но там речь шла о модуле для D7. Этот модуль – только для D6.

Сравнение с ImageMagick ImageAPI инструментарием. Этот модуль не использует GM как IM (GM частично поддерживает команды IM). В целом, я считаю достоинством то, что это отдельный ImageAPI инструментарий. Например, этот модуль знает про существование gm утилиты и ее команд, и может запускать другие команды gm, а не только convert. Кроме того, GM на одних и тех же командах может вести себя не так, как IM, потому что его исходный код отличается. Этот модуль запускает каждое действие с изображением как отдельную операцию с временным файлом. Данное поведение необходимо, чтобы полноценно использовать различные команды (GM не умеет группировать _все_ команды в одну). Это несет в себе потенциальные недостатки (небольшое снижение производительности и возможную потерю качества результирующего изображения при многократных последовательных операциях с потерей качества), но обходится с помощью своего действия (image action). Этот модуль работает в “сыром” режиме – каждое действие имеет полный доступ к командной строке (на самом деле, действие само запускает GM) что позволяет делать с изображением все что угодно, включая запуск любых сложных операций и внешних программ обработки изображений.

Источник: http://www.drupal.ru/node/68783

[Решено] Пропал/исчез/отвалился CKeditor / IMCE

Весьма популярная проблема “пропавшего” CKeditor или его частей. Во время разработки своего последнего сайта столкнулся с ней раза три и все по разным причинам. Отпишусь, пожалуй. Сразу скажу, что решения проблем в большинстве случаев очевидные, но сразу в голову не всегда приходят.

Возможная проблема 1

Проблема: Установили модуль, но не закинули в него сам редактор.
Решение: Идем на страничку редактора, качаем и закидываем файлы и папки редактора в подпапку “ckeditor” папки модуля. В этой подпапке должен быть файл-подсказка COPY_HERE.

Возможная проблема 2

Проблема: Панелька просто не появляется. Или появляется, но не у всех пользователей.
Решение: Во первых правильно должны быть настроены разрешения ролей самого Drupal (mysite/admin/user/permissions). Во вторых CKeditor нужно вручную привязывать к новым ролям. Идем в настройки редактора (mysite/admin/settings/ckeditor), выбираем профиль, например Default и напротив него нажимаем “изменить”. В первой группе настроек “Основные настройки” выставляем галочки нужным новым ролям.

Возможная проблема 3

Проблема:

У меня такое произошло после выгрузки сайта на хостинг.
Решение: Помогло удаление модуля и переустановка+перенастройка прямо на хостинге. Корень проблемы так и не нашел.

Возможная проблема 4

Пробелма: не открывается файловый менеджер IMCE или нет кнопки “Browse” при попытке добавить картинку в сообщение.
Решение: идем в настройки редактора (mysite/admin/settings/ckeditor), выбираем профиль, нажимаем напротив него “изменить”. Далее в группе Настройки файлового браузера, в File browser type (Link dialog) выбираем IMCE.

Возможная проблема 5

Проблема: При работе с IMCE нет кнопки “загрузить” и “Создать дирректорию”.
Решения: Во-первых, чтобы создать поддиректории нужен модуль IMCE mkdir. Кнопки у меня пропали из-за конфликта с “modernizr”, который использовал при вертске.

UPD: предложенные решения помогли именно мне, в то время как не помогли другие. Таких “других” очень много. Смотрите и их, напрмиер кликнув по тегу ckeditor.

Источник: http://www.drupal.ru/node/68678

С праздником!

Всех программистов поздравляю с профессиональным праздником! Успехов в работе и не бросайте Друпал Без вас тут будет тяжело

Источник: http://www.drupal.ru/node/68471

Первое собрание сообщества Друпал в Самаре


Приглашаем всех самарских (и не только самарских!) друпалеров встретиться на следующей неделе и обсудить дела насущные.

На первом собрании предлагается:
- познакомиться
- пообщаться
- обсудить возможность организации мероприятия как у взрослых: с проектором и докладами

Место проведения:

Beer club в Paint House, http://dosug.samara24.ru/restaurants/company/21476

Время проведения:

суббота, 17 сентября, 17:00

Карта:

мой телефон (Антон)
+7 917 602 37 90

Attached poll “Место проведения”.
Register or login to poll
Results:
Beer club (Paint House): 7 голосов
У Швейка: 3 голоса
Frau Muller: 5 голосов

Источник: http://www.drupal.ru/node/68264

Тормозит трекер ? Есть решение – Views Tracker !

Сделал модуль  Views Tracker, позволяющий создавать высокопроизводительную замену родному трекеру из ядра. Модуль основан на идеях модуля Tracker 2, но по сути является абсолютно новым, написанным с нуля проектом.
Актуальность модуля можно почувствовать на своей шкуре здесь, на Drupal.ru, где трекер, похоже, кешируется, что убивает основную идею – быстрое отслеживание изменений.

Чтобы получить максимальный прирост производительности от использования модуля, нужно создать view по аналогии с tracker, встроенным в Views, но использовать поля, аргументы, фильтры и критерии сортировки из групп модуля Views Tracker везде, где это возможно:

для общего трекера используйте группу Views Tracker для трекера пользователя используйте группу Views Tracker User

Список дополнительных фич и различий между Views Tracker и Tracker2:

В отличие от Tracker 2, Views Tracker имеет индекс по типу материала. За счет этого можно создавать разные трекеры для разных групп материалов без потерь скорости. В отличие от модуля Tracker 2, Views Tracker имеет поддержку модуля Node Comments Views Tracker содержит значительно меньше кода, чем Tracker 2. Tracker 2 не поддерживается – значительные изменения происходят за кадром. Видимо, сказывается то, что модуль используется на Drupal.org Tracker 2 имеет интерфейс пользователя, а Views Tracker нужно использовать вместе с модулем Views (или написать свой интерфейс). Поддержка Views в Tracker 2 тоже есть, но почему-то отсутствует в релизе (те самые изменения “за кадром”).

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

Источник: http://www.drupal.ru/node/68023

Ajax Microblog – стремимся реализовать Twitter.com

Рад общественности представить новый модуль. Это Ajax microblog. Данный модуль реализует функционал Twitter и будет развиваться в этом направлении. Целью модуля или пакета модулей является организация полной копии функционала предоставляемой всеми известной системой микроблогинга Twitter.com

Ссылка на проект: http://css.mirocow.com/projects/microblog
скачать тут: http://css.mirocow.com/projects/microblog/repository

Спонсор модуля: www.ruh.kz

Прикрепленный файл Размер e6674f3201affd625334c0d00cb96301.jpg 71.2 кб

Источник: http://www.drupal.ru/node/67970

Нам пора задуматься(неделя вежливости на портале)

На одном очень популярном ресурсе посвященном различным ЦМС, в комментах о друпале нашел следующую запись о минусах системы:”Грубое русское сообщество”.
Это ведь мы с вами. И правда грубим и хамим новичкам. И я в том числе( Давайте будем добрей и терпеливее.
п.с. такое вот сегодня лирическое настроение

Источник: http://www.drupal.ru/node/67917

Как сделать e-mail рассылку дайджестов любых материалов сайта в автоматическом режиме

Только что опубликовал новость как комментарий в посте о модуле рассылок.

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

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

Как это делается – всего 3 простых шага:

Берете мой модуль подписки – он нужен для набора подписчиков. Или используете “ручную” форму подписки от сервиса Настраиваете любой фильтр через views на отдачу материалов в виде rss Скармливаете один, два или сколько вам нужно вариантов rss сервису рассылок и… вуаля: письма уходя автоматически.

Подробнее о том как скормить и настроить rss для отправки писем.

Это не просто банальное транслирование rss на e-mail. Вы получаете:

Возможность настроить дизайн рассылки под свой корпоративный стиль; Гибкую настройка правил отправки сообщений; Полное отсутствие рекламы; Использование языка Smarty для ветвлений и циклов; Возможность импорта списка подписчиков. Полный контроль режима отправки (моментальный автоматический, по расписанию или ручной); Плюс остальные возможности сервиса рассылок.

Предпоследний и последний пункты требует отдельного пояснения.

Благодаря режиму отправки по расписанию, вы фактически можете организовать регулярные дайдежесты материалов сайта на e-mail. Или, наоборот, отправлять каждый новый материал “моментально” (раз в час).

Из остальных возможностей сервиса, если ваш проект коммерческий вам может пригодиться возможность персонализации и сбора любого количества дополнительных данных о подписчике. Это затем можно использовать для сегментирования списка рассылки.

Добавьте к этому всю мощь модуля views по формированию rss лент и в ваших руках очень гибкий и мощный инструмент для автоматизации работы с базой подписчиков.

Появились вопросы, спрашивайте – отвечу.

P.S. Если у вас уже собрана база подписчиков легально (!), то вы можете ее импортировать.

Источник: http://www.drupal.ru/node/67894

Мини-CRM своими ручками часть. 3

Продолжаем разгребать Вьюсы, Флаги и панели.
В данной статье рассмотрим блок (views) Часть Б нашего интерфейса и его работу.
Под катом трафик 1,3 мб.

Здесь мы рассмотрели только одну вьюху. Дальше больше! Когда протрезвею тогда посмотрим настройки флагов, настройки Rules и много еще чего вкусного.

часть 1
часть 2
часть 4
————–
оригинал

Источник: http://www.drupal.ru/node/67879

Таблицы в друпале – очень краткий обзор модулей

Сабж!

Задался вопросом “Как грамотно вставить таблицу в друпал, с использованием полей и т.д.?“, в поиске здесь наткнулся на топик “Вывести таблицу excel на страницу“. Вспомнил, что раньше видел пару модулей на drupal.org по теме, поискал и нашел.

Итак…

 Tables Filter Module

Самый, наверно, простой табличный модуль. Ставите его, включаете в Форматах Ввода этот фильтр и, используете токены вида [table ] для редактирования таблицы. Пример построения таблицы – здесь.

Никакого импорта файлов и т.д.

Дешево и сердито.

 Slickgrid

Более продвинутый вариант.

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

 Sheetnode

Самый продвинутый модуль.
Для импорта использует http://phpexcel.codeplex.com/ и https://github.com/infojunkie/socialcalc
Некоторые возможности (на сейчас, модуль развивается):
Экспорт-импорт CSV, XLS, XLSX, OOCalc, Google Docs Spreadsheets (в разработке), etc.
Экспорт, помимо перечисленного, в PDF.
Значения таблиц могут раскидываться по (cck)полям.
… и многое другое.

Стабильная версия – только для 6ки, и разработка – для 7ки.
За подробностями лучше на страницу модуля.

Источник: http://www.drupal.ru/node/67684

«Сделайте мне красиво»: User:Name в качестве аргумента Views

Я думаю, каждый друпалер использует на своих сайтах модули  Views и  Pathauto. Да, на некоторых сайтах можно без них обойтись, но, фактически, оба этих модуля давно входят в джентльменский набор при запуске нового сайта, поэтому нет нужды объяснять, для чего они используются. Некоторое время назад я столкнулся с проблемой, которая не то, чтобы была критичной, но беспокоила моё эстетическое чувство и не давала мне считать свою работу выполненной. Дело было связано с тем, что views и pathauto по-разному представляют пользователю одни и те же вещи — как-то заголовки материалов и имена пользователей.

До некоторых пор это не особенно бросается в глаза, но представим себе следующую ситуацию — у вас есть вьюс, с помощью которого вы выводите список материалов по адресу example.net/content. Если задан аргумент, вьюс выводит только материалы за авторством конкретного пользователя. Самый простой способ сделать это — указать в качестве аргумента User:Uid. В результате получается, что при запросе вида example.net/content/1 будут отображаться все материалы, созданные суперпользователем, при запросе example.net/content/150, пользователем с uid 150 и так далее. Это хороший способ, у которого есть один минус — URL example.net/content/150 «некрасив» и мало, о чём говорит стороннему наблюдателю (хотя я часто использую такие конструкции для вьюсов, «закрытых» для пользователя).

Сделать URL «более говорящим» можно достаточно легко, если использовать в качестве аргумента не User:Uid, а User:Name. В результате мы получаем красивые адреса вроде example.net/content/ingumsky, едва взглянув на которые можно понять, что содержимое страницы будет иметь отношение к тому или иному пользователю (другое дело, какое отношение они к нему имеют . В принципе, такого решения уже вполне достаточно, если бы не одно «но»…

Например, представим, что на нашем сайте есть пользователи с именами Ingumsky, John Smith, jack_brown, S.White, He is Awesome, Паша. Мы включаем на сайте модуль pathauto и с его помощью создаём для каждого пользователя красивые адреса страниц профилей: example.net/users/ingumsky, example.net/users/john-smith и так далее. и здесь обнаруживается, что в адресах страниц пользователей, на страницах блогов и так далее синонимы имён пользователей отличаются от того, что принимает views в качестве аргумента. Сравните, как выглядят аргументы во Views и синонимы Pathauto [в квадратных скобках] для каждого из перечисленных выше пользователей (обращаю внимание, что в настройках аргумента включены опции «lowercase» и «turn spaces into dashes»:

example.net/content/ingumsky — материалы пользователя Ingumsky [ingumsky]
example.net/content/john-smith — материалы пользователя John Smith [john-smith]
example.net/content/jack_brown — материалы пользователя jack_brown [jackbrown]
example.net/content/s.white — материалы пользователя S.White [swhite]
example.net/content/he-is-awesome — материалы пользователя He is Awesome [he-awesome]
example.net/content/паша — материалы пользователя Паша [pasha]

Как видно, Views принимает в качестве аргумента именно имя пользователя, которое при указанных чуть выше настройках, просто переведено в нижний регистр и избавлено от пробелов (они заменены на дефисы). Но Pathauto при создании синонима вносит больше изменений в исходный текст. В результате в тех случаях, когда в именах пользователей встречаются знаки подчёркивания, точки, кириллица или даже некоторые английские слова, которые неважны для SEO (is, are и тому подобное), аргумент отличается от того синонима, который нам предлагает Pathauto.

Как я написал в самом начале записи, это не критичная проблема, но она… м-м-м… раздражает. Хочется, чтобы всё было красиво и «единообразно». Вопрос состоял в следующем: Как добиться того, чтобы скармливаемый вьюсу аргумент всегда выглядел так же, как выглядит ник в URL, созданном Pathauto?

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

1. В качестве аргумента мы будем использовать не User: Name, а User: Uid, пусть это прозвучит и несколько странно Теперь нам надо сделать так, чтобы из аргумента, который принимает наш вьюс, мы смогли вытащить uid;
2. В качестве «Что делать, если аргумент не указан» ставим «Показывать всё»;
3. Проверять аргумент мы будем с помощью php, поэтому смело выбираем в списке валидаторов «PHP Code»;
4. В текстовом поле пишем:

<?php
// Проверяем, не число ли дано в качестве аргумента
// Если число, аргумент подходит.
// Это особенно удобно, чтобы проверять, работает ли ваш вьюс с таким валидатором
if (is_numeric($argument)) {
  return TRUE;
}
// Смотрим, не указано ли в качестве аргумента «all»
// Если указано, аргумент подходит, и мы покажем все материалы 
elseif ($argument == 'all') {
  return TRUE;
} else {
// У меня синонимы профилей пользователей выглядят как users/username
// Здесь мы подставляем наш аргумент, чтобы получить такой же синоним
// В вашем случае может потребоваться заменить 'users/' на что-то другое
  $dru_alias = 'users/'.$argument;
// С помощью функции drupal_lookup_path ищем, каков внутренний адрес,
// соответствующий синониму — в нашем случае получится 'user/uid'
  $dru_path = drupal_lookup_path('source',$dru_alias);
// Разбираем внутренний адрес, вытаскивая из него uid 
  $uid = substr($dru_path, strrpos($dru_path, '/') + 1);
// Отдаём uid в качестве аргумента и сообщаем, что всё верно.
  $handler->argument = $uid;
  return TRUE;

?>

5. Profit!

В результате мы получаем views, который правильно обрабатывает аргументы, если они выглядят так же, как наши синонимы. Этот вьюс принимает так же и непосредственно uid в качестве аргумента. Это удобно, но, если у вас есть пользователи с числовыми именами, лучше избавиться от первой части условия в if.

Возможно, гуру Друпал засмеют меня и скажут, что решение было очевидным. Что ж, возможно и так. Я до этого решения дошёл далеко не сразу да и то только по наводке комментаторов с drupal.org, благодаря которым я понял, что надо смотреть в сторону валидатора аргумента. Надеюсь, что это решение поможет кому-нибудь ещё.

Источник: http://www.drupal.ru/node/67625

Drupal Cafe Москва – встреча 30.08.11 – 19-00

Во вторник 30.08.2011 в 19:00 пройдет уже вторая встреча Drupal кафе Москва

Место проведения – ул. Покровка 38/1 Читалкафе (вход с Лялиного переулка) карта

По длительности планируем опять 2-3 часа, по примеру первой встречи.

Основной темой будет обсуждение результатов ДрупалКон’11 Лондон.
Если останется время, то посветим остальным актуальным вопросам.

Как всегда приветствуются доклады. Выступающие могут воспользоваться проектором и микрофоном.

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

Attached poll “Приду на встречу”.
Register or login to poll
Results:
Да: 3 голоса
Нет: 4 голоса
Хочу, но не смогу: 2 голоса

Источник: http://www.drupal.ru/node/67534

1-ое место в рейтинге Рунета: Sportbox.ru

Спортбокс занял 1-ое место в номинации “Развлечении и спорт” в ежегодном конкурсе “Рейтинг Рунета”.
Конкурс сайтов «Рейтинг Рунета» — это премия за лучшие интернет-проекты в своей номинации, проводимая среди профессиональных веб-разработчиков.
Ну и да, Спортбокс сделан на друпале, если кто не знает.


Источник: http://www.drupal.ru/node/67124

Новый сайт компании Acquia

Компания основателя друпал Дриса Байтаерта “АКВИА” сменила фирменный стиль, у нее новый логотип, открылся новый сайт!

Компания разделила все сервисы на 4 категории

- Разработчики ( сборки и профайлы, на сайте можно скачать около десятка разных продуктов )
- Хостинг ( облачный хостинг для разработчиков и проектов, можно прямо на сайте выбрать себе тариф)
- Обслуживание ( от консультаций и тех. поддержки до дистанционного управления проектом)
- Обучение ( курсы тренинги и Acquia Library)

Можно бесплатно посмотреть Acquia Tv .
На сайте есть раздел showcase лучшие сайты на друпал.
На заставке написано что уже 2% сайтов в МИРЕ работают на ДРУПАЛ.
( ВСЕГО в мере более 300′000′000 сайтов! )

Источник: http://www.drupal.ru/node/66655

Прощай Гарланд

Собственно тема Remove Garland from Core.
Те кто не согласны, еще не поздно заступится.

Attached poll “Гарланд лучшая друпал тема всех времён и народов?”.
Register or login to poll
Results:
Да: 48 голосов
Нет: 33 голоса

Источник: http://www.drupal.ru/node/66608

[MSK] Как насчёт встречи друпалерской?

Есть предложение встретиться друпалерам Москвы и их окрестностей.
Дата: конец августа-начало сентября.
Вариант 1. Посидеть в традиционном месте в ёлках-палках. Кафе такое, кто не знает.
Вариант 2. Весело всей толпой сходить на картинг, lasertag или любое другое времяпрепровождение.
Вариант 3. Выбраться ближе к природе и пожарить мяса на открытом огне.
Варианты 4, 5, 6 – предлагайте.

Attached poll “Что делаем?”.
Register or login to poll
Results:
Вариант 1: 4 голоса
Вариант 2: 5 голосов
Вариант 3: 8 голосов
Свой вариант: 0 голосов
Я ассоциальная личность и не буду ни с кем встречаться!: 8 голосов

Источник: http://www.drupal.ru/node/66206

Модуль Промокодов для клуба

Кто помнит или не помнит – я писал когда то, что под заказ пишу модуль для Промокодов (пруфлинк).
Собственно постепенно я его дописываю и сегодня ударным темпом закрыл одну из хотелок.

В чем профит модуля, спросите вы?
Все просто. Если вам нужно пользователю присвоить уникальный номер из заданного диапазона и присвоить ему роль – этот модуль предназначен именно для этого. Администратор генерит промокоды через админку, выдает людям. При регистрации или при редактировании профиля пользователь может указать в специальном поле промокод и получить номер и роль. Полученный номер можно использовать, к примеру, для выдачи значков или футболок и т.п. На роль можно повесить специфические права и доступы.

Для проекта открыл sandbox http://drupal.org/sandbox/softovick/1190802 – если кто желает, может поучаствовать в тестировании и фидбеке. На всякий случай прикрепил к посту архив с модулем.

UPD:
+ добавлен выбор роли, которая присваивается при активации промокода
+ сделан прототип более детального списка промокодов в виде таблицы с ссылкой на профиль пользователя.

Прикрепленный файл Размер promocode.zip 49.19 кб

Источник: http://www.drupal.ru/node/66200

Загрузка поля cck ajax-запросом.

На главной странице есть лента новостей. Она состоит из:
1. Дата новости;
2. Анонс новости;
3. Ссылка на саму новость.

Захотелось мне реализовать ajax-загрузку основного текста новости на место ссылки.
Изучив “как создать свой модуль”, основы javascript, jquery и вспомнив основы php-программирования я все таки реализовал свою идею. Возможно для профи это 5 минутное дело, у меня ушло около 5 дней в совокупности. Работу модуля можете посмотреть на www.appri.ru.
Модуль назвал loadnews. Здесь обноленный код.
Файл loadnews.module: <?php
/*
 * Implementing hook_init
 */

function loadnews_init() {
    drupal_add_css(drupal_get_path('module', 'loadnews') . "/loadnews.css");
  drupal_add_js(drupal_get_path('module', 'loadnews') ."/loadnews.js");
}

/*
 * Implementation hook_perm
 */
function loadnews_perm() {
  return array('access onthisdate content');
}

/**
 * Implementation hook_menu()
 */
function loadnews_menu() {
  // Элемент меню с соответствующим путем
  $items['loadnews'] = array (
    // Функция, которая будет "обрабатывать" путь
    'page callback' => 'loadnews_ajax',
    // Права на доступ к пути
    'access arguments' => array('access content'),
    // Элемент не будет отображаться в меню сайта
    'type' => MENU_CALLBACK,
  );
  return $items;
}

/* Функция обработки запроса */
function loadnews_ajax() {
    /*
     * Ссылка на на новость передается методом GET в переменной 'url'
     * В БД алисы адресов хранятся без первого слеша, поэтом удаляем его
    */
    $url = substr($_GET['url'], 1);
    // По полученному алиасу ищем в таблице url_alias соответствующий системный адрес
    $sys_url = db_result(db_query("SELECT n.src FROM {url_alias} n WHERE dst = '%s'", $url));
    /* Адрес получаем в виде "node/nid". Нам нужно получить параметр nid.
     * Для этого разбиваем строку на массив из 2-х элементов, второй который наш nid
    */
    $sys_url_array = explode('/',$sys_url);
    // Сохраняем наш nid в переменную
    $nid = $sys_url_array['1'];
    // Выбираем поле основного текста новости "field_news_text_value" из таблицы "content_type_news"
    $result = db_result(db_query("SELECT n.field_news_text_value FROM {content_type_news} n WHERE n.nid = '%d'", $nid));
    // Наш ответ клиенту
    drupal_json(array('status' => 1, 'data' => $result));
}
?>

Файл loadnews.js: Drupal.behaviors.loadnews = function(context) { // Добавляем для всех ссылок в блоке новостей class =loadnews $('#block-views-news-block_news', context).find('a').addClass('loadnews') // Реагируем на клик .bind('click', function() { // Передаем с методом get адрес ссылки var href = $(this).attr('href'); // Переменная, это куда мы будем выводить ответ var target = $(this).parents(".field-content"); // Прячем ссылку $(this).hide(); // Вместо нее выводим анимацию $(target).append("<div class=loading></div>"); // Получаем данные с сервера $.get(Drupal.settings.basePath + 'loadnews', {url:href} , function(response) { // Сохраняем ответ в переменной var result = Drupal.parseJson(response); // Прячем анимацию $(target).find(".loading").hide(); // Вместо нее ставим "Свернуть" $(target).append("<span class=hidenews>Свернуть</span>"); $(target).append("<span class=shownews>Подробнее...</span>"); $(target).find(".shownews").hide(); // Создаем блок для вывода текста новости $(target).append("<div class='newstext'></div>"); // Изначально блок будет скрыт, чтобы потом красиво его развернуть $(target).find("div.newstext").hide(); // Загружаем текст из переменной в блок $(target).find("div.newstext").html(result.data); // Красиво раскрываем наш блок $(target).find("div.newstext").slideDown("fast").addClass("active"); // Реализация скрытия и раскрытия блока (нужно оптимизировать код) $(target).find(".hidenews").click(function() { $(target).find(".hidenews").hide(); $(target).find("div.newstext").slideUp("fast").removeClass("active"); $(target).find(".shownews").show(); }); $(target).find(".shownews").click(function() { $(target).find(".shownews").hide(); $(target).find("div.newstext").slideDown("fast").addClass("active"); $(target).find(".hidenews").show(); }); }); return false; }); }

Хотелось бы услышать мнения и замечания профи по коду. Спасибо за внимание.

Прикрепленный файл Размер loadnews_v6.x-1.6.zip 3.62 кб

Источник: http://www.drupal.ru/node/66172

Как добавить ленту сообщений Google+ на сайт, сделанный на CMS Drupal

Давно хочу прикрепить свою ленту сообщений из новой социальной сети Google plus на свой же хоумпейдж. Официального пути это сделать пока нет. Вот один из “неофициальных” вариантов:
1) создать RSS-поток ваших сообщений на сайте http://plusfeed.appspot.com/. В общем-то для этого просто надо добавить ваш ID на сайте G+ к адресу Plusfeed’а. Вот так, например – http://plusfeed.appspot.com/116910563308964275374
2) включить модуль Feed aggregator (есть в стандартном дистрибутиве Drupal) на странице ВАШСАЙТ/admin/build/modules/list.
3) добавить полученный на шаге 1 адрес фида в настройках на странице ВАШСАЙТ/admin/content/aggregator/add/feed
4) и, конечно, настроить cron (если он у вас еще не настроен) и не забыть установить права для просмотра ленты (на ВАШСАЙТ/admin/user/permissions).

И все…
По желанию можно задать адрес для этой страницы, добавить ссылку в меню сайта, сделать более внятное оформление и т.п.
Получится что-то вроде такого: http://vadimbarsukov.com/aggregator/sources/1
Не скажу, что меня все устраивает (например, не показываются фото и видео), но все же это лучше, чем ничего.

Источник: http://www.drupal.ru/node/66099

Hashtags в друпале

Приветствую.

Как оказалось, есть модуль, позволяющий отказаться от необходимости прописывать теги страницы в отдельном поле –  Hashtags, теги как в твиттере, отмечаются непосредственно в тексте. И для seo лучше.

Единственный минус в том, что он есть только под 6-ю версию, и с портом D7 совершенно не ясно… аналогов модуля не нашел.

Источник: http://www.drupal.ru/node/66069

Дополнение к модулю Node Gallery: галереи по умолчанию

 Default Node Gallery – дополнение к модулю  Node Gallery – создает галерею по умолчанию для каждого юзера (и для каждой пары тип_галереи – тип_изображения) при входе его на сайт.
Так же позволяет управлять доступом к галерее по умолчанию, чтобы юзер случайно ее не удалил.
В общем, это должно работать как функция “неразобранные фотки” на многих фотосайтах.
Модуль пока сыроват – возможны ошибки, о которых прошу сообщать в issue queue модуля.

Источник: http://www.drupal.ru/node/66060

Eclipse pdt

Долго капашилась, вроде что-то получилось, а вдруг кому-нибудь пригодиться.
Для быстрой и удобной работы с использованием хуков может пригодиться Eclipse PDT. После его установки, необходимо сделать следующее – скачать файл http://drupal.org/project/eclipse, его содержимое Drupal.xml импортировать в Preferences > PHP > Editor > Templates. Зайдите в Help menu, потом Install New Software введите
Name: XTND.US
Location: http://xtnd.us/downloads/eclipse.
У меня установилось, но почему-то в пункте Php Content Type не отобразились Drupal Module и Drupal Themes. Поэтому я ввела в ручную следующее -
# *.module
# *.install
# *.test
# *.info
# *.po
# *.theme
# *.engine
(для того, чтобы пхп их распознавал).
После данных действий, при наборе hook появляется выборка всевозможных хуков, а после выбора конкретного, его код отображается на странице. (Или же надо при наборе нажать ctrl+space)

Источник: http://www.drupal.ru/node/66000

Drupal SMS24X7 Module (SMS Framework Gateway)


Всем привет, презентую модуль-шлюз http://sms24×7.ru для SMS Framework.

Модуль очень простой, меньше 100 строк, использует их библиотеку, подробное описание api нашел тут.

Ссылка на модуль – https://github.com/stan-kondrat/drupal-sms24×7

PS. Никакого отношения не имею к sms24×7, была нужда в русском шлюзе, его нагуглил первым.

PPS. Если хотите по тестить стандартный модуль SMS User (Provides integration between the SMS Framework and Drupal users), но есть один момент. Он отсылает четырех значный код подтверждения, на что шлюз отвечает: “Сообщение содержит указание на платный номер“, самое простое решение:

diff --git a/sms_user.module.orig b/sms_user.module index 799ec7f..403b609 100644 --- a/sms_user.module.orig +++ b/sms_user.module @@ -264,7 +264,7 @@ function sms_user_settings_sleep_form_submit($form, &$form_s }   function sms_user_send_confirmation($account, $number, $options) { - $code = rand(1000, 9999); + $code = rand(100, 999); $data[0] = array( 'number' => sms_formatter($number), 'status' => 1,

Источник: http://www.drupal.ru/node/65940

Performance-субботник. Чистим сайты после обновления с Drupal 5 на 6 и с 6 на 7

Немного теории

Индекс (англ. index) — объект базы данных, создаваемый с целью повышения производительности поиска данных. Таблицы в базе данных могут иметь большое количество строк, которые хранятся в произвольном порядке, и их поиск по заданному критерию путем последовательного просмотра таблицы строка за строкой может занимать много времени. Индекс формируется из значений одного или нескольких столбцов таблицы и указателей на соответствующие строки таблицы и, таким образом, позволяет искать строки, удовлетворяющие критерию поиска. Ускорение работы с использованием индексов достигается в первую очередь за счёт того, что индекс имеет структуру, оптимизированную под поиск — например, сбалансированного дерева.
Википедия

Для тех кто не понял

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

И чего ты этим сказать хотел?

Ещё работая в IT-Patrol была замечена интересная статистика, а именно:
старые сайты имели большие показатели неиндексированного чтения и проблемы с производительностью. Естественно, в голове это не совсем укладывалось, так как с виду вполне себе обычный сайт, но работает медленно и даёт нехилую нагрузку по БД.
Изначально это связывалось с кривыми модулями и другими физическими ущербностями.
Потом при обновлении fermer.ru я столкнулся с тем, что отпали индексы по fid в таблице files.
Время шло, вышла семёрка, начались апдейты на неё, при апдейте hr-portal.ru было замечено отпадение индексов и даже то, что некоторые индексы давно отсутствовали, но портал более менее нормально работал на шестёрке.
Дело в том, что между версиями меняется структура БД и при накладках во время апдейта, старый индекс удаляется за ненадобностью, а новый не создаётся, например, из-за дублей, так бывает в таблице blocks.
В итоге мы получаем с виду работающий сайт, но внутри имеем вот такие грабли

Как диагностировать?

Очень просто, Устанавливаем модуль  Schema
Сразу хотелось бы предупредить что в версии модуля для Drupal 7 наблюдается баг с префиксами БД, данные которые даёт модуль по БД с префиксом некорректны.
Идём в admin/build/schema/report
Перед нами предстанет страница подобная этой

Легенда:
На желтом фоне пишутся предупреждения, в большинстве случаев они говорят о том, что авторы некоторых модулей не читали раздел про типы полей на api.drupal.org.
Филдсет Match несёт информацию о таблицах которые совпадают со схемой.
Mismatch сообщает нам о таблицах в которых проблемы со схемой.
Extra это таблицы в БД, которые не связаны схемой ни с одним модулем.

Рассмотрим подробнее Mismatch.


primary key: missing in database
Говорит о том, что потерян первичный индекс.
Ещё возможен вариант потери обычного индекса, например:

indexes content_type_uid: missing in database

И чего мне теперь делать, я же спать не буду?!

Вооружаемся текстовым редактором, просматриваем install-файлы модулей, смотрим там hook_schema() и восстанавливаем индексы соответствующими запросами:
ADD INDEX [index_name] (index_col_name,…)
или ADD PRIMARY KEY (index_col_name,…)
или ADD UNIQUE [index_name] (index_col_name,…)
или ADD FULLTEXT [index_name] (index_col_name,…)
Не забываем, что индексы бывают разных типов – составные, уникальные, простые и т.п.

ПЧП, КСС, это всё сложно для меня, может вы сможете помочь?

Я помогу вам за 1000р или эквивалент, я приведу отпавшие индексы в порядок и добавлю свои наработки.
И кстати, если вы клиент Патруля более трёх месяцев, то на вас распространяется 50% скидка, если вы пришли на IT-Patrol менее 3 месяцев назад, то стоимость составит 750р за проблемный сайт, просто напишите в техническую поддержку.

Прикрепленный файл Размер schema.png 30.24 кб missingindex.png 22.48 кб missingindex2.png 13.54 кб

Источник: http://www.drupal.ru/node/65583

Цены за обучение Drupal

Интересный твит пробегал в недавно от «детроидца», известного своими скринкастами… гугл переводит это: «Я думаю, что когда-нибудь люди поймут, что цены за обучение #Drupal нелепы.», полагаю, что речь идёт о прошедших курсах:

Drupal 7 Site Building
June 27, 28, 29 $1,350

Drupal 7 Theming
June 30 & July 1 $900

Entire Week of Workshops
June 27 – July 1 $2,000

Предлагаю проголосовать всем заинтересованным и предлагать свои варианты решения об образовании Drupalista в коментах.

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

Один из найденных тренингов по конкурирующей платформе выставил на начальное обучение ценник (4500 вебинар и от 6500 за очное посещение), в ближайшее время на Drupal.Ru появится раздел посвященный обучению людей премудростям Drupal, пока полагаю в виде подобного ресурса от Acquia. Но об этом позже

PS: … на пути к Друпал-центру обучения и не только

Attached poll “Сколько Вы готовы платить за повышение квалификации, работая с Drupal?”.
Register or login to poll
Results:
Я нищий..: 49 голосов
20 000 – 15 000: 15 голосов
10 000 – 5 000: 27 голосов
не более 5 000: 41 голос

Источник: http://www.drupal.ru/node/65015

[Модуль] Advanced sphinx

Сделала на базе  sphinxsearch небольшой поисковый модуль. Предложения и тестирование весьма желательны. Первоначально модуль делала под свои нужды, так что все лишнее, на мой взгляд, отсутствует . Если понадобятся какие-то доработки, буду рада помочь. На d.org будет выложен позднее. Портирование на 7 будет, после отлова мелких багов, при наличии таковых.

Основные отличия от базового:

возможность автоматической генерации файла конфигурации; mysql вместо xmlpipe2; минимальные настройки файла конфигурации через админку (работает при автоматической генерации); UPD. Добавлено управление индексацией и демоном через админку. Функции внедрены по просьбе IT-patrol; может еще что-то…

Настройка:

Копируем модуль в “sites/all/modules”. Включаем в админке. Настройка модуля на странице “admin/settings/advanced_sphinx”. Если вы хотите автоматически сгенерировать конфиг, то поставьте галочку “Generate a configuration file”. Далее необходимо указать полный путь к папке, в которой храниться sphinx.conf или папку в которой могут быть созданы конфиг и другие папки. Права на запись обязательны. Также на этой странице можете выбрать типы материалов по которым будет осуществлен поиск, если не выбрано, то ищет по всем. Обратите внимание, что при каждом сохранении настроек модуля конфиг будет обновлен, если включена его генерация. запускаем индексатор /usr/bin/indexer –config /home/user/sphinx/config/sphinx.conf –all . Потом демон сфинкса /usr/sbin/searchd –config /home/user/sphinx/config/sphinx.conf . Все пути подставляйте свои. проверяем работоспособность на странице “admin/settings/advanced_sphinx/check-connection”. Добавляем для нужных ролей право на использование страницы поиска (”use advanced_sphinx”) в “admin/user/permissions”

Страница Advanced sphinx на github.

Источник: http://www.drupal.ru/node/65009

Drupal + КЛАДР

Всем привет,

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

Взял Классификатор адресов России (КЛАДР) здесь и сделал.

Выглядит примерно так – [img]

Использование:

Устанавливаем Выбираем куда заливать /admin/settings/kladr Нажимаем кнопку LOAD /admin/build/kladr , если не всё заливается сразу (там 200000 строк), нажимаем ещё раз

Если решили заливать в другой vocablary:

Создаем или Выбираем куда заливать /admin/settings/kladr Нажимаем кнопку “Начать загрузку сначала” Нажимаем кнопку LOAD /admin/build/kladr , если не всё заливается сразу (там 200000 строк), нажимаем ещё раз

Теперь подробнее:

Требуется “extension=dbase.so” Вставляет два уровня терминов, первый – level1 из KLADR.DBF, второй населенные пункты от туда же. Использует Batch API (Загрузку базы можно прерывать)

Версия 0.1
Возможны планы развития: интеграция с http://drupal.org/project/location , http://drupal.org/project/addresses и т.п.

Ну, и как обычно, disclaimer, используйте только на Ваш страх и риск.

Прикрепленный файл Размер drupal-kladr.png 543.36 кб

Источник: http://www.drupal.ru/node/64769

Тема Blogsmith для Drupal 6

Blogsmith – простая и удобная тема для Drupal 6 в зеленых тонах. Если используете FCKeditor, то в его настройках CSS нужно выбрать define.css дабы избежать косяков с фоном в поле редактирования ноды.

- Две колонки
- Оптимизированная для SEO
- Простая и легкая в редактировании тема

Учусь верстать под Drupal и создал сайт cmsdrupal.org.ua на который буду выкладывать свои темы. Сейчас на нем можно посмотреть демо этой темы.

Прикрепленный файл Размер blogsmith.rar 39.98 кб

Источник: http://www.drupal.ru/node/64336

Коротко о Batch API

Пакетные операции дают возможность обрабатывать формы в течении нескольких запросов. Это предотвращает обрыв обработки изза тайм-аута РНР. Также пользователю предоставляется информация о ходе осуществления текущих операций.

Утверждают, что в первую очередь batch был разработан для гармоничной интеграции с Forms API, хотя часто его используют в обычных скриптах таких как update.php.
Представим, что нам необходимо осуществить обработку большого количества данных. Для начала мы создадим страницу в hook_menu.

Читать полностью…

Источник: http://www.drupal.ru/node/64097

Отчет о конференции DrupalConf’2011

Всем доброго времени суток. Пришло время предоставить отчет о конференции DrupalConf, которая прошла 23 апреля 2011 года в Москве.

Цифры:

Зарегистрированных участников конференции (заполнивших анкеты перед конференцией) – 224 участника.
География участников: Россия, Беларусь, Украина, Германия.

Инфы много, далее под катом.

Профессиональный состав:

Уровень владения Drupal:

Потребность в проф.консультациях:

Мы можем смело сказать что конференция получилась международной. За пару недель перед конференцией стало понятно, что количество участников придется как-то ограничивать – количество заявок к организатором намного превысило возможности зала. Как показала конференция – это был оправданный шаг, зал был заполнен полностью, но давки/неудобств не было, всем были обеспечены сидячие места.

На заметку гостям будущих конференций – заблаговременно регистрируйтесь на сайте конференции.

Результаты

На наш взгляд первая в России большая конференция по Drupal удалась. Это было бы невозможно, без активного сообщества. Наверное, основной вывод из всей конференции – сообщество в России есть, мы собрали более 240 участников, 30% участников работают с Drupal профессионально – по характеру вопросов к докладчикам было видно, что это представители студий и коллективов разработчиков, которые видят значительный рост в сфере Drupal-разработок, эта сфера притягивает все большие бюджеты, Drupal как CMS интересует все большее количество заказчиков. Что гарантирует – регулярные встречи Drupal-разработчиков неизбежны.

Организаторы Артем Паньков Андрей Постников Маша Таран HelpTeam Сергей Бабушев Дубовской Александр Спонсоры Информационные системы для бизнеса – Генеральный спонсор Fast Lane Ventures Radon InternetDevels Информационная поддержка РАЭК itmozg.ru Интернет в цифрах RMA CMS Magazine Системный администратор Drupal.ru Рейтинг Рунета Докладчики:

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

1. Вступительный доклад от Постникова Андрея (andypost): Drupal 7 и Drupal 8.

2. Доклад Вячеслава Касихина (Irbis), Ubercart — немного примеров из жизни.

3. Доклад Дубовского Александра (adubovskoy), Drupal для ленивых – как мы делаем больше за меньшее время.

4. Доклад от Алексея Костина (kostin), Drupal & SEO

5. Доклад Анны Федорук, Как построить разработку на Drupal

6. Доклад Антона Житарева (NaZg), Системы Электронного Документооборота на Drupal

7. Доклад Тараса Савчука и Романа Архарова (Romka), Forbs.ru

8. Доклад Клеры Виленской (Klera), Концепция единого модуля интеграции с соцсетями

9. Доклад Влада Савицкого (vladsavitsky), Сайт на Drupal за 15 минут

10. Доклад Александра Швеца (neochief), Разработка Drupal дистрибутивов

По предварительному расписанию у нас было 10 докладов, однако осталось время на экспромт-доклад (без предварительной подготовки), который вызвался рассказать Кинзябулатов Рамиль, посвященный интеграции Ubercart и 1C, ознакомиться с докладом вы можете на данной странице http://video.yandex.ru/users/vaspi/view/44/user-tag/drupalconf/

Отзывы

Вы можете ознакомиться с неформальными отзывами о конференции, которые разместили участники на своих сайтах и блогах:

http://www.drupal.ru/node/61188 http://graker.ru/news/2011/04/24/drupalconf_2011 http://prodrupal.ru/ru/node/89 http://shvetsgroup.com/ru/blog/drupalconf-moscow http://www.ys1.ru/blog/otchet-o-drupalconf-moscow-2011

Следующий шаг

Данная конференция возымела большой резонанс в среде Drupal-разработчиков. Начали появляться региональные встречи, такие как Встреча DrupalSib в Новосибирске, встреча Южного Друпал сообщества в Краснодаре.
Есть потребность в организации регулярных небольших встреч в Москве – Drupal-кафе. В данный момент вы можете помочь с организацией Drupal-кафе, присоединяйтесь к обсуждению и ждем вас на встречах.

Слухи и домыслы

Хотим сказать, что нас воодушевило, какой отклик вызвала конференция DrupalConf. Есть решения о повторении конференции осенью/зимой 2011 или весной 2012. Каждый из вас может оказать значительную помощь и ускорить повторение DrupalConf в Москве. Как это можно сделать:

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

Спасибо всем: читателям, слушателям, докладчикам, спонсорам. Будем рады встретиться на следующем DrupalConf!

Источник: http://www.drupal.ru/node/63916

Ускоряем переводы

Сделал модуль  Locale Cache, ускоряющий переводы строк в Drupal.

Известно, что родной язык Drupal – английский. При каждом запросе к сайту движок берет английские строки в интерфейсе и заменяет их переводами для текущего выбранного языка. Данный модуль оптимизирует и ускоряет этот процесс. В результате ускоряется загрузка страниц, снижается количество запросов к базе и (в зависимости от настроек модуля) снижается потребление сайтом оперативной памяти.
Более подробное описание модуля на  странице проекта.

Для работы требует патч ядра, так что прошу детей и беременных женщин отойти от монитора.
Пробуем, тестируем, и т.д. (снапшот скоро будет готов). Настройки модуля описаны в README.

Модуль больше всего полезен при использовании кэша в оперативной памяти. Очень мало смысла использовать модуль с кэшем в БД – это “шило на мыло” – запросы в одну таблицу заменяются запросами в другую. Более того, существует баг в ядре 6 Друпала, ломающий работу этого модуля с кэшем в базе: http://drupal.org/node/1302286

14.06.11 Добавлена опция обновления кэша локалей с помощью cron
24.06.11 Создал первый релиз. Всем, кто использовал dev версию, рекомендуется обновится

Источник: http://www.drupal.ru/node/63680

Организация интернет магазина в России на базе Ubercart и 1С. Видео с Друпалкемпа Киев 2011

Советую всем кто хотел бы заняться организацией интернет магазина. http://vimeo.com/24901121

Источник: http://www.drupal.ru/node/63623

Ограничения в доступе к форумам drupal.ru

Последние изменения на сайте полагаю требуют пояснений, поскольку мало кто читает changelog. Я по-прежнему исхожу из того, что на сайте сообщества может обсуждаться что угодно кроме друпала, раз это интересно его участникам. При условии что это не мешает основной тематике. Есть два варианта, сделать чтобы не мешало:

1. Жесткая модерация и превращение сайта в закрытый клуб (это на d.ru мы уже прошли).
2. Разрешение любого общения, но фильтрация топиков и офтопиков на отдельные по возможности непересекающиеся потоки.

Я по долгому опыту участия в d.ru и других интернет-сообществах окончательно пришёл к пункту 2. Не должно быть открытое сообщество замодерированным, если хочет привлечения новых участников. Новички бывают разные, но всегда с тупыми вопросами, тут ничего не попишешь. Бороться скорей нужно не с ними, а с теми “профи” кто злобно этих новичков отпинывает.

Я к сожалению по ряду причин последний год мог только минимально поддерживать работу сайта, и не хотел ввязываться в крупные изменения. И после разбирательств в прежней команде модераторов задействовать старую схему модерации также не было желания. Вскоре после ДрупалКонфа этого года в Москве в узком кругу московских друпалеров были намечены планы по перестройке сайта, постепенно вовлекаются люди готовые эти планы реализовывать. По наведению порядка на сайте в текущей реализации на D6 реализуется следующее:

1. Ограничить видимость форумов Курилка и Мусорка, в том числе для поисковиков.
2. Сделать средства для отправки нодов и комментариев в эти форумы.
3. С публикации снимать только спам и материалы явно нарушающие правила сайта.

Эффект от реализации п.1 можно видеть уже сейчас, офтопики не заметны, т.к. всё содержимое Курилки и Мусорки попадает мимо трекера, а Мусорка ещё мимо страницы /blog. Это на время работы сайта под D6, потом планируется использовать API прав доступа на ноды.

По п.2 ничего готового под D6 так и не нашлось, дописывается код текущих модулей для быстрого выноса нодов в Курилку->Мусорку, а также перенос туда комментов. Пока не придумал ничего лучшего, как создавать для перенесённых комментов ноды типа “архив” со ссылкой на исходное обсуждение.

Следите за changelog’ом

Источник: http://www.drupal.ru/node/63210

Тема Infotech

Простой и чистый шаблон под Друпал 6. Подойдет для блогов разной тематики.
Валидность XHTML и CSS
Включены ZEN tabs
Ссылки для редактирования блоков.

Демо можно посмотреть здесь http://infotech.org.ua
Скачать можно ниже

Прикрепленный файл Размер infotech.rar 42.87 кб

Источник: http://www.drupal.ru/node/63068

Вышли обновления Drupal 7.2 и 6.22

Вышли обновления безопасности Drupal. Drupal 7.1 и 6.21 закрывают уязвимость SA-CORE-2011-001, Drupal 7.2 и 6.22 также закрывают другие ошибки, не относящиеся к безопасности. Чтобы закрыть уязвимость SA-CORE-2011-001 достаточно проапдейтиться на 7.1/6.21.

Новость на drupal.org: http://drupal.org/drupal-7.2
Список изменений после Drupal 7.0: http://drupal.org/node/1168946

http://ftp.drupal.org/files/projects/drupal-7.2.tar.gz
http://ftp.drupal.org/files/projects/drupal-6.22.tar.gz

Источник: http://www.drupal.ru/drupal-7.2

Модуль для синхронизации 1С 8.x Предприятие + 1С управление торговля (УТ) с магазином Ubercart 2

English
This is module implements import/export for the application 1c 8.x. It`s a complementary solution for 1C 8.x handler. It`s use Commerce ML 2 format such XML. Else this module work as batch process and use cron for the queue.

Russian
Данный модуль позволяет синхронизировать 1С 8.x Предприятие + 1С управление торговлей (УТ) с магазином Ubercart 2. В синхронизации участвуют:

1C -> Ubercart 2 (Прайс – лист с ценовыми предложениями) 1C -> Ubercart 2 (Категории) 1C <- Ubercart 2 (Ордера от магазина) 1C <- Ubercart 2 (Информационные данные о покупателях)

Настройки

старая глючная версия

beta 4

Прикрепленный файл Размер cmlservice.2.09.jpg 32.08 кб cmlservice.2.09-settings.jpg 49.03 кб 2011_05_22_17-06-16-130.jpg 54.43 кб

Источник: http://www.drupal.ru/node/62395

Интеграция модуля с views. Работа с обработчиками

2я часть, теперь про стандартные обработчики views.
плюсуем, комментим

Источник: http://www.drupal.ru/node/62047

Диалоговая кнопка BUEditor + стандартная drupal-форма для внутреннего линкинга

Вашему вниманию предлагается статья, в которой описывается способ встраивания стандартного функционала форм Drupal в редактор BUEditor для удобного добавления ссылок на внутренние материалы сайта.

Начну с дисклеймера. К сожалению, не имею возможностей разбирать весь процесс создания по косточкам, т.к. было потрачено немало времени и допущено и исправлено множество ошибок прежде, чем получился результат, достойный публикации. Тратить это время здесь смысла большого не имеет, лучше идти дальше. Вот решение – пользуйтесь, экспериментируйте, дорабатывайте, делитесь. Здесь же постараюсь описать все, что необходимо для реализации задуманного функционала. Описание дается для блоками, а не построчно.

Инструменты Module API Drupal form API Ajax JQuery BUEditor Предыстория

Основным редактором на нашем научном портале является BUEditor, т.к. есть твердая необходимость форматировать текст с использованием модуля  DruTeX. Ну и просто постараться сохранить предсказуемый вид для исходных текстов (в отличие от wysiwyg-редактора) для их дальнейшего использования по-жизни. По мере наполнения появилась необходимость для кросс-линкинга между статьями, терминами словаря и другими видами материалов. Все это осложнялось отсутствием таких возможностей для BUEditor, в отличие от других редакторов, для которых есть такой модуль как  Linkit. Потратив некоторое время на изучение матчасти (Drupal form API), было принято решение, что во что бы то ни стало нужно прикрутить стандартную форму Drupal к диалогам BUEditor. Ведь autocomplete уже реализован, стили сделаны, а пока форма ждет ответа, там бегает кружёк и выпадет готовая менюха – вообщем просто и красиво.

Первым делом начал искать, что было сделано. Например – http://www.drupal.ru/node/12619, но по делу там ничего не нашел. Начал экспериментировать с маленьким неофициальным модулем ajax-demo и его autocomplete-возможностями. Все быстро встало на свои места. Дальше появился вопрос – как заставить друпаловскую форму залезть в диалог редактора?

Кстати, бился с поиском до последнего, т.к. не сторонник, чтобы на сайте был такой hand-made. Но готовых решений нет и был вынужден изменить своим же принципам.

Hands on

Итак, приступаем.

Первым делом надо сделать свой модуль (назвал его callbacks), в который войдет основной функционал, а именно:

Описание формы Описание функций обращения к базе Клиентский js-функционал Стили ответа

callbacks.info

; $Id$   name = callbacks module core = "6.x" version = "6.x-1.1"

callbacks.module


<?php
// $Id$

/**
 * Implementation of hook_init().
 */
function callbacks_init(){
    variable_set('callbacks_link_form_var', drupal_get_form('callbacks_link_form'));
}

/**
 * Implementation of hook_menu().
 */
function callbacks_menu() {
  return array(
    'callback/link' => array(
      'access arguments' => array('access content'),
      'page callback' => 'callbacks_link_func',
      'type' => MENU_CALLBACK,
    ),
  );
}

/**
* Retrieve a pipe delimited string of autocomplete suggestions for existing users
*/
function callbacks_link_func($string) {
  $matches = array();
  $dst = "";
  $result = db_query_range("SELECT nid, language, type, title FROM {node} n WHERE LOWER(n.title) LIKE LOWER('%s%%')", $string, 0, 10);
  while ($node = db_fetch_object($result)) {

    $get_alias = db_query("SELECT dst FROM {url_alias} WHERE src = 'node/%s'", $node->nid );
    if( $alias = db_fetch_object($get_alias) )
      $dst = $alias->dst;
    else
      $dst = "node/" . $node->nid;

    $matches[$node->nid] = array(
      'type' => check_plain($node->type),
      'title' => check_plain($node->title),
      'alias' => check_plain($dst),
      'lang' => check_plain($node->language),
    );
  }

  $results = array();
  if (count($matches)) {
    foreach( $matches as $key_nid => $values ) {
      $text = '<div class="clear-block">';
//      $text .= '<div class="callbacks-nid">['. $key_nid .']</div>';
      $text .= '<div class="callbacks-title">'. $values['title'] .'</div>';
      $text .= '<div class="callbacks-type">['. $values['type'] . ':' . ( $values['lang'] ? $values['lang'] : 'any' ) . ']</div>';
      $text .= '<div class="callbacks-alias">'. $values['alias'] .'</div>';
      $text .= "</div>";
      $dst = $values['alias'];
      $results[$dst] = $text;
    }
  }

  drupal_json($results);
}

/**
 * Defines a form.
 */
function callbacks_link_form() {

  drupal_add_js(drupal_get_path('module', 'callbacks') . '/js/callbacks.js');
  drupal_add_css(drupal_get_path('module', 'callbacks') . '/css/callbacks.css');

  return array(
    'link-path-ac' => array(
      '#autocomplete_path' => 'callback/link',
      '#title' => t('URL or Title'),
      '#description' => t('Start type title to get its internal URL'),
      '#type' => 'textfield',
      '#required' => TRUE,
    ),
    'link-text' => array(
      '#title' => t('Link text'),
      '#description' => t('Select text in editor or enter link text'),
      '#type' => 'textfield',
    ),
    'cancel' => array(
      '#value' => t('Cancel'),
      '#attributes' => array('class' => 'callbacks-button'),
      '#type' => 'button',
    ),
     'add-link' => array(
      '#value' => t('Add link'),
      '#attributes' => array('class' => 'callbacks-button'),
      '#type' => 'button',
    ),
  );
}
?>

hook_init() – нужен, чтобы заранее подготовить форму, иначе BUEditor ее не съест.

hook_menu() – это осознанная необходимость для autocomplete в Form API.

callbacks_link_func($string) – стандартный функционал для json-ответов. Здесь можно выбирать из базы любые поля и отдавать их для отображения, в данном случае поиск ноды в базе происходит по заголовку, но этим, как вы понимаете, можно не ограничиваться. Тут же происходит стилевое оформление – дело вкуса прячется в конце функции. Да, кстати, здесь приходится делать двойной запрос к базе, т.к. все, что мы делаем, мы делаем для живых людей и поэтому подставлять красивый alias вместо ссылки вида node/435 насущная необходимость. Для красоты (см. картинку в конце) выводится название, алиас, тип материала и язык.

callbacks_link_form() – описываем форму по-друпаловски: быстро, просто, удобно, с аутокомплитом.

JS часть. Файлик js/callbacks.js

Drupal.behaviors.callbacks = function(){   $('#edit-add-link').unbind().click(   function(){ var url = $('input#edit-link-path-ac').val(); var text = $('input#edit-link-text').val(); E = BUE.active; E.replaceSelection( '[url'+ (text ? ('='+ url) : '') +']'+ (text || url) +'[/url]' ); E.dialog.close('fadeOut'); return false; }   );   $('#edit-cancel').unbind().click( function(){ BUE.active.dialog.close('fadeOut'); return false; } );

$(’#edit-add-link’).unbind().click() – отцепляем стандартный submit и говорим форме, что же нам от нее нужно.

$(’#edit-cancel’).unbind().click() – то же самое, но для кнопочки Cancel, для порядка.

CSS часть. Файлик css/callbacks.css

.form-radios .form-item { display: inline; }   .callbacks-nid { float: left; }   .callbacks-title { float: left; }   .callbacks-alias { color: #333; font-size: 0.9em; clear: both; margin-bottom: 5px; font-weight: bold; }   .callbacks-type { float: right; font-size: 0.8em; }   .callbacks-button { float: right; }

Тут самая скука, расставить цвета и отступы.

Вторым делом добавить php-кнопку в BUEditor.

<?php
php:
$button_form = drupal_to_js(variable_get('callbacks_link_form_var', ''));

return "js:
var S = E.getSelection();
E.dialog.open('Internal linking', $button_form, 'fadeIn');
$('input#edit-link-text').val( S );
Drupal.attachBehaviors($button_form);
";
?>

variable_get() – важен, т.к. вариант с drupal_get_form() в данном случае приводит к непредсказуемым результатам и его использовать нельзя.

drupal_to_js() – важен, т.к. иначе форма выдается в неадаптированном для js виде.
Drupal.attachBehaviors() – важен, т.к. без этой функции форма не слушается и плохо себя ведет.

Все

По идее, этого достаточно, чтобы начать экспериментировать. В оригинальном виде у меня используются две формы и, соответственно, все описанное сделано дважды в одном модуле. Если все это после доведения до ума выльется в новый модуль для BUEditor – будет приятно, и, надеюсь, не только мне.

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

Выглядит форма таким образом:

А результат ее использования не менее красив:

Прикрепленный файл Размер callbacks_form.png 6.79 кб callbacks_form_2.png 34.29 кб

Источник: http://www.drupal.ru/node/61991

Модуль uc_sberbank

Модуль выставления счета “сбербанка”

функциональность

Создание платежки на базе шаблона
Защита платежки от просмотра третьими лицами
Сохранение платежки в личном кабинете.
Отправка платежки на почту клиента.
Отправка платежки на почту компании, на адрес. куда поступают письма с заказами.

Скачать http://css.mirocow.com/projects/sberbank/files

Реализация

1. Создание платежки на базе шаблона

Платежка формируется из JPG темплэйт файла. Заполнение платежки происходит с помощью imagettftext.
Данные платежки имеют защищенный вид хранения. Принцип формирования платежки аналогичен ImageCache.
Защита платежки строится след принципом. Создается каталог хранения платежек sites\default\files\sberbank.
В нем создаются каталоги с именем UID пользователя, в которых лежат хеши платежек вида 55_fe8a0ea4ce326398482061ad5eb1e58d.jpg.
Где fe8a0ea4ce326398482061ad5eb1e58d строится из md5(номера ордера + drupal_private_key), благодаря чему, хеши всегда будут иметь уникальный вид. (подбор хеша невозможен – защита от просмотра третьими лицами)

2. Сохранение платежки в личном кабинете

Для доступа к платежам используется URI вида http:// имя_сайта /sberbank/номер ордера.jpg. Данная ссылка и сама картинка выводится в управляющем меню счета и доступна владельцу счета или администратору магазина.

3. Отправка платежки на почту клиента
Для шаблона писем формируются токены след вида: защищенный и прямой
Примеры:

* http:// имя_сайта /sites/default/files/sberbank/58.png – защищенный
* http:// имя_сайта /sites/default/files/sberbank/5/55_fe8a0ea4ce326398482061ad5eb1e58d.jpg – полный путь до файла платежки

4. Отправка платежки на почту компании, на адрес. куда поступают письма с заказами

Данные формируются аналогично пункту 4
Требования

* Используемые модули (зависимости): Token
* Необходимые библиотеки: GD

Модуль настроен и работает тут http://motodart.ru

Подробнее тут: http://css.mirocow.com/projects/sberbank/wiki/Wiki

Прикрепленный файл Размер sberbank.gif 2.82 кб

Источник: http://www.drupal.ru/node/61778

Ubercart Alter Price

Сделал обещанный модуль.
что он себе представляет:
Модуль называется Ubercart Alter Sell Price. Находиться во вкладке ubercart – extra. Копируем – Включаем. Дальше в материале типа Product появляется возможность писать текст вместо Sell Price причем остается и сам Sell Price. Во вьесе есть дополнительное поле, которое выводит представление альтернативной цены, так и называется – Alter Sell Price.
Как работает во вьесе product – заменяем поле Product: Sell price на поле Product: Alter Sell Price. Нажимаем саве и будет нам щасье.
Product: Alter Sell Price – выводит текст продукта и если в настройках продукта снята галочка “Использовать Alter Sell Price” – то выводит реальную цену продажи.
В чем отличие от других: Альтернативную цену можно писать для каждого продукта разную.

p/s/ Это первый модуль – поэтому прошу строго не судить .. конструктивную критику приветствую..
Все всем спасибо.

Прикрепленный файл Размер ubercart_alter_price.zip 8.37 кб

Источник: http://www.drupal.ru/node/61512

Модуль FormSave: сохраняем отправки для любой формы

Всем привет!

Написал модуль для логирования отправок любых форм. Вы просто указываете id формы, и модуль прицепляется к ней сам. После этого, любая отправленная в форму информация будет сохранена в отдельной таблице базы данных, и в любое время ее можно будет посмотреть.

Зачем это нужно?

Вариант 1. Отслеживание введенных значений. Не всегда вся введенная в форму информация сохраняется. Бывает, что на ее основе делаются какие-либо вычисления, и в базу сохраняются только результаты этих вычислений. Если вы хотите посмотреть, что же было введено в качестве исходных данных, то этот модуль для вас.

Вариант 2. Вы разрабатываете большую, сложную форму, многоступенчатую да с аяксом. А то и не одну и не две, в рамках какого-либо проекта. Или нескольких проектов. Чтобы не писать для каждой из этих форм свой отдельный submit-хендлер, который может быть просто огромным, да и во многом одинаковым для подобных форм, вы просто прицепляете этот модуль, и всю работу по сохранению введенной информации он берет на себя. В модуле предусмотрено API для этого.

Немного подробнее можно прочитать на странице модуля  formsave (он пока в песочнице).

Немного скриншотов:

Скриншот экрана настроек

Скриншот списка отправок

Скриншот одной отправки

Если вы хотите видеть этот модуль в качестве полноценного проекта на drupal.org, отпишитесь, пожалуйста, в этой заявке на получение статуса Full project. то добро пожаловать на страницу проекта  formsave

Источник: http://www.drupal.ru/node/61297

По итогам DrupalConf – теперь с видео!

Спасибо участникам и докладчикам!

В этом топике предлагаю собрать впечатления и ваши замечания по организации конференции. Это поможет сделать нам осеннее мероприятие лучше.

Архив презентаций
Презентация Алексея Костина – Drupal и SEO
Презентация Александра Швеца – разработка Drupal дистрибутивов

Правильные видео от PVasili

Предварительные версии видео(пока без ответов на вопросы)
Доклад Андрея Постникова
Доклад Вячеслава Касихина
Доклад Александра Дубовского
Доклад Алексея Костина
Доклад Анны Федорук
Доклад Клеры Виленской
Доклад Влада Савицкого

Источник: http://www.drupal.ru/node/61223

Модуль оплаты RBK Money для Ubercart


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

Установка и настройка
1. Установка. Копируем папку с модулем в каталог /sites/all/modules
2. Включаем модуль на странице /admin/build/modules, раздел Ubercart – payment
3. Настройка осуществляется по адресу /admin/store/settings/uc_rbkmoney.
3.1. Копируем url из поля “URL оповещения о платеже” и вставляем его в поле “Оповещение о платеже” в личном кабинете RBK Money
3.2. Прописываем ID сайта (берем из личного кабинета)
3.3. Указываем валюту платежей (по-умолчанию – RUR)
3.4. Указываем в личном кабинете RBK Money cекретный ключ и прописываем его же в поле “Секретный ключ”

Необязательные параметры – возможность отключить запись ответов платежной системы в системный журнал; возможность указать предпочитаемый способ оплаты, что позволяет миновать экран выбора способов на странице оплаты RBK Money (на данный момент работают не все предпочитаемые способы).

Страница на drupal.org: http://drupal.org/project/rbk_money

Источник: http://www.drupal.ru/node/61024

NewsMaker: инсталляционный профиль для перекрестного кросспостинга из LiveJournal в Drupal и обратно

Социальные сети в последнее время становятся всё более популярными и LiveLournal является одним из лидеров по числу пользователей.

Но известные события, в результате которых недавно ЖЖ был недоступен достаточно продолжительное время, обнажили суровую правду жизни: livejournal.com – это обычный сайт, с которым может произойти всё, что угодно и нет никаких гарантий, что Ваш блог на этой площадке или его содержимое “внезапно” не уйдет в небытие. Подобное встречается в ЖЖ сплошь и рядом.

Впрочем, вылететь может и Ваш stand-alone блог. К примеру, можно элементарно забыть продлить регистрацию домена (что случилось недавно с хаброй) или, не дай Бог забыть продлить хостинг. При этом в лучшем случае Ваш сайт будет недоступен некоторое время, а в худшем случае хостер может вообще снести его со всем содержимым.

Запасной аэродром для сохранения контента и юзеров в этом случае придется как нельзя кстати. Данный факт и был одним из мотивов для создания этой сборки.

Инсталляционный профиль NewsMaker предназначен как для ЖЖ блогеров, так и для владельцев независимых сайтов. Он позволяет в автоматическом режиме дублировать сообщения из Вашего stand-alone блога, сделанного на Drupal в Ваш блог или комьюнити на площадке LiveJournal. Аналогично Вы можете сохранять сообщения из Вашего ЖЖ в Ваш блог на Drupal, то есть зеркалить их.

Установка и настройка

Несмотря на то, что в этом профиле применен нестандартный инсталлятор, разработанный и реализованный моим партнером Валентином Ворониным http://shaman.asiadata.ru, его установка не отличается от стандартной друпальской.

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

На первом этапе установки сайта выберите инсталляционный профиль “NewsMaker”

Дальше установка происходит как обычно.

Если Вы хотите не только отправлять сообщения из своего блога на Drupal’e в LiveJournal, но и импортировать посты и комментарии, публикуемые в Вашем ЖЖ, на Ваш друпал-сайт, то на Вашем сервере должны быть установлены Perl модули, необходимые для правильной работы модуля LJsync.
Если же Вам нужен только кросспостинг в ЖЖ, то после инсталляции и входа на сайт просто отключите LiveJournal Sync в /admin/build/modules.

Дальнейшая настройка сводится к следующему:

Зайдите в свой профиль /user и укажите там свой логин и пароль доступа в LiveJournal

Зайдите в настройки модуля LiveJournal Sync /admin/settings/ljsync (если Вы решили его использовать) и нажмите кнопку “Вернуться к исходным” Здесь же Вы можете выбрать нужный формат импорта данных, словарь для импортируемых тегов и тип материала для импорта.

Зайдите по ФТП в папку Вашего сайта /sites/default/files/ljsync и создайте там файл вида логин_жж-lj.xml (тот, что Вы указывали в своем профиле).

На этом процесс установки и настройки можно считать завершенным. Да, и не забудьте установить права доступа 777 к папке /tmp в корне сайта.

Возможности, которые Вы получаете

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

Домашнюю страницу aka igoogle c возможностью включения, сворачивания, перетаскивания блоков

Удобный Wysiwyg текстовый редактор для добавления и редактирования материалов, с возможностью внутренней перелинковки и мультизагрузкой файлов любых типов, причем не только изображений (расширения загружаемых файлов, их размеры, объемы можно настраивать через админку). При изменении размера изображения автоматически формируется ссылка от уменьшенной копии к исходному изображению.


Простой способ подключения неограниченного количества лент новостей, причем не только из LJ, но с любого другого сайта, имеющего RSS ленту. При этом в анонсах новостей автоматически ограничивается количество символов, изображения уменьшаются, дубли новостей удаляются. Впрочем, есть возможность просмотра новостей в исходном виде или в виде заголовков.

В сборке предварительно настроены роли, которые вы можете давать своим пользователям.

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

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

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

Автор: имеет возможность добавлять записи в свой блог и управлять ими. Владельцу блога рекомендуется создать для себя дополнительный аккаунт с этой ролью и постить из него.

Модератор: может удалять записи всех авторов.

Редактор: помимо удаления может редактировать все записи.

Администратор: имеет расширенные права для управления настройками сайта.

Разработчик: кроме доступа к настройкам имеет возможность работать с PHP скриптами на сайте.

User#1: Назначает права доступа для ролей и имеет доступ ко всем настройкам.

Имеющиеся проблемы

Так и не решена окончательно проблема в модуле LJsync с дублями записей, отправляемых из ЖЖ в Drupal. Пока что дубли удаляются постфактум самописным модулем, запускаемым по крону. В дальнейшем постораемся решить эту проблему более корректно.

Не публикуются комментарии к записям, изначально публикуемыемым в сайте на Drupal, а потом отправляемым в ЖЖ.

Буду благодарен, если сообщество поможет с решением этих проблем.

Пример работающего на этой сборке сайта: http://newsmaker.su/

Скачать инсталляционный профиль можно у меня в блоге

Там же будут размещаться все модификации и обновления этого профиля.

UPD Во второй версии сборки добавлена интеграция на уровне API c социальными сетями Vkontakte, Мой Мир @ Mail.ru, Facebook, Twitter. Теперь Вы можете отправлять свои сообщения не только в ЖЖ, но и в вышеперечисленные соц.сети. В отличие от стандартного кросспостинга в Facebook и Twitter через LJ, в случае применения этой сборки вы можете добавлять свои комментарии и хэш-тэги к своим записям. Решены проблемы с дублями постов и комментариев.

Актуальная версия

newsmaker-6.x-2.0-rc1.tar.gz (10.32 Мб).

http://ipload.ru/file/9113

или

newsmaker-6.x-2.0-rc1.zip (12.85 Мб).

http://ipload.ru/file/9113

————предрелизы————————

newsmaker-6.x-1.0-beta3.tar.gz (10.78 Мб).

http://www.ipload.ru/file/9095

или

newsmaker-6.x-1.0-beta3.zip (13.1 Мб).

http://www.ipload.ru/file/9094

newsmaker-6.x-1.0-beta2.tar.gz (10.38 Мб).

http://ipload.ru/file/9082

или

newsmaker-6.x-1.0-beta2.zip (12.61 Мб)

http://ipload.ru/file/9081

newsmaker-6.x-1.0-beta1.tar.gz (10.34 Мб)

http://ipload.ru/file/9073

или

newsmaker-6.x-1.0-beta1.zip (12.57 Мб)

http://ipload.ru/file/9074

Источник: http://www.drupal.ru/node/60990

Я люблю Drupal 7 (создаем кататалог для drupal commerce)

Поставил drupal commerce, потыкал несколько дней, понял – весч! Все круто, все легко и гибко настраивается, легко имортируется из csv и xml при помощи модуля feeds. Вообщем то что надо! за одним НО, как мать его создать каталог?

Пробовал ставить разные модули, искать решение на d.org – ничего толового не нашел, побился головой об стену, и полез во …. views

Приступаем:
1) идем на страницу admin/structure/taxonomy и созадем словарь catalog
– на странице admin/structure/taxonomy/catalog/fields добавляем поле c изображением, например, imagecatalog
– добавляем термины, загружая и зображения и создавая иерархию словаря
2) идем на страницу admin/structure/views и включаем представление Taxonomy term
3) идем на страницу admin/structure/views/add и создаем новое представление

выбираем показатель – термины таксономии, и тип – наш словарь catalog

задаем заголовок страницы
путь ставим taxonomy/term/%
отображение ставим grid (сетка)
элементов для отображения ставим 12 – так как по умолчанию в grid 4 столбца, соответственно указываем значение кратное 4

нажимаем “продолжить и редактировать”

4) начинаем редактировать представление:
4a) в блок “Fields” добавляем поле изображение “imagecatalog”, настраиваем его по своему вкусу
расскрываем правую колонку ‘Advanced’
4б) добавляем Contextual filters

указываем значение – Таксономия: вложение

и добавляем ставим галлку – чтобы при не существующем термине показывалась 404 ошибка (этого можно не делать)

Сохраняем фильтр

таким образом мы перекрыли отображение страницы термина. Теперь по адресу taxonomy/term/id_термина будут отображаться его дочерние термины с их изображениями в виде сетки.
Но если у термина не будет дочерних терминов – ничего отображаться не будет. Такая ситуация нас не устраивает, поэтому делаем следующее:
5) Добавляем no results behavior

ставим галку возле views area

нажимаем далее и указываем какое представление может будет выводиться если у термина нет дочерних терминов, а именно taxonomy_term Dispaly: default
не забываем отметить inherit cotextual filters – это означает что аргумент (id термина) будет передаваться представлению, которое будет вызываться.

сохраняем поле, сохраняем представление.

Как это работает?
если у термина есть дочерние термины – грузится вид catalog
если нет – грузится вид taxonomy term
если использовать с модулем taxonimy menu – получается каталог как на сайте ситилинка

Как сделать пункт меню?
вариант 1: делаем все термины таксономии дочерними какого-то одного, и указываем в меню ссылку на этот термин
вариант 2: берем модуль taxonomy menu, и выводим в блоке ссылки на категории

Ожидаемые проблемы:
1) На странице термина не отображаются его дочерние термины
Причина: представление taxonomy term перекрывает по весу наше представление
Выход: отключить отображение page у представления taxonomy term

2) Помимо словаря catalog есть другие словари, для них должно быть свое отображение
Выход: ждем, иди сами портируем модуль taxonomy redirect
- задаем разные пути для разных словарей
- клонируем представление taxonomy term, меняем в нем путь на заданный в taxonomy redirect
- меняем представление catalog – указываем новые пути, и меняем no results behavior на новое представление

Прикрепленный файл Размер 1.png 10.72 кб 2.png 14.02 кб 3.png 14.1 кб 4.png 8.96 кб 5.png 8.25 кб 6.png 13.07 кб 7.png 6.52 кб 8.png 6.65 кб

Источник: http://www.drupal.ru/node/60911

Потестим кнопочку? (Простой вариант интеграции elFinder в CKEditor)

UPD. Как выяснилось из комментариев, модуль ckeditor с версии 6.x-1.3 официально поддерживает elfinder. Таким образом, всё написанное относится к возможному способу вывода “быстрой” кнопки elfinder’a на тулбар.
UPD2(08/05/2011). Плагин доработан до автоматического определения типа файла, возвращаемого elFinder
Нужен был файлменеджер/мультизагрузчик для редактора CKeditor (именно для drupal-модуля).
Я обычно использую IMCE и стал искать дополнения к IMCE, поддерживающие мультизагрузку.
Нашёл только IMCE Swfupload, но он ещё в бета-стадии и требует установки дополнительных модулей. В общем, не устроил.
Зато как-то неожиданно открыл для себя elFinder.
Менеджер показался очень удобным (на мой взгляд, даже получше IMCE).
Мультизагрузка, drag&drop, создание-удаление директорий, файлов. Автоматические тамбы картинок, ну и в целом как-то юзабельнее выглядит.
CKEditor (по крайней мере 6.x-1.3) позволяет интегрировать IMCE как “быструю” кнопку на тулбар (отдельно от диалога выбора ссылки/картинки/файла). Просто нужно раскомментировать соответствующие определения в ckeditor.config.js и убедиться что присутствует папка imce в /modules/ckeditor/plugins
Я стырил это решение и наскоро адаптировал его под elFinder в виде скромного плагина-кнопки (elFinder).
Результат: на тулбаре имеется самодельная кнопочка, по клику на которой сразу открывается окно этого файлового менеджера (т.е. минуя диалог выбора адреса).

После выбора файла (двойной щелчок или команда меню и т.д.) в менеджере, он закрывается и ссылка возвращается в CKeditor в обвязке тегов.
В общем, почти всё как в “обычном” elFinder или IMCE.
Желающие могут пойти дальше и доработать решение плагина. Для примера сравните код приложенного плагина и стандартного плагина кнопки IMCE (функция setFile()): /modules/ckeditor/plugins/imce/plugin.js
Потребуются модули:
- модуль CKEditor
- модуль elFinder
- сам файлменеджер elfinder (он отдельно от модуля).
Плагин кнопки в архиве приложен к посту. Описание установки – в файле README.TXT архива.
После установки не забыть установить необходимые разрешения ролям для доступа к elFinder, CKEditor (если вы это ещё не сделали).
Отображение кнопки не зависит от разрешений.
То есть – если вы запретили какой-то роли использовать elFinder, то кнопка не исчезнет с панели. Просто по клику на ней будет обычный “У вас нет прав для просмотра и т.д.”.
ps. И это… Отписывайтесь, пожалуйста, у кого что получилось. Будут доработки – велкам + респект и уважуха

Прикрепленный файл Размер elfinder.zip 2.72 кб

Источник: http://www.drupal.ru/node/60796

Правильная установка FCKeditor!

Так раз и навсегода.
Во первых модуль FCKeditor 6.x-2.1 работает с FCKeditor 2.6.6
УСТАНОВКА НА DRUPAL

скачать Drupal модуль управления FCKeditor 6.x-2.1 скачать распаковать папку “fckeditor” из архива в папку “/modules”

(на вашем сайте в папке “modules” должна появится папка fckeditor)

качать FCKeditor 2.6.6 скачать распаковать содержимое папки fckeditor архива в /modules/fckeditor/fckeditor

(не перепутайте и не создавайте еще одну папку, а копируйте содержимое архива)

ВКЛЮЧАЕМ FCKeditor

Заходим в ваш сайт как администратор выбираем пункт меню администратора модули в открывшемся разделе ищем одноименный модуль включаем модуль (выбираем галочкой и жмем сохранить) заходим в меню управление пользователями/роли выбираем роль Зарегестрированный пользователь, отмечаем галочкой fckeditor – использовать fckeditor, сохраняем права доступа заходим в меню настройки сайта, там выбираем fckeditor, если нет никаких сообщений идем к 9му пункту, если есть к следующему если выходит сообщение:

The FCKeditor component appears to be not installed correctly, because modules/fckeditor/fckeditor/fckconfig.js could not be found.
Please go to the Домашняя страница FCKeditor to download the latest version. After that you must extract the files to modules/fckeditor/fckeditor and make sure that the directory modules/fckeditor/fckeditor/editor and the file modules/fckeditor/fckeditor/fckeditor.js exist. Refer to the readme.txt for more information.
ПРОВЕРЬТЕ ПУНКТЫ 3 и 4 раздела установки, причем внимательно!!

ИДЕМ в ПРОФИЛИ (внизу написано крупно) к профилю Autorezed Зарегистрированный пользователь-(тот самый которому мы настроили роль в п.5 и 6.)жмем изменить, появляется окно настройки FCKeditor

И ТАК НАСТРОЙКА FCKeditor

первая вкладка Основные настройки здесь задаем имя профиля FCKeditor, кому разрешено пользоваться (можно определенной группе ролей запретить пользоваться модулем, другой разрешить, третьей разрешить использовать только в определнных местах и т.п * вторая вкладка Безопасность здесь мы задаем условия безопаности, фильтровать или не фильтровать код в FCKeditor третья вкладка Настройки видимости здесь мы указываем для какой страницы, раздела или области сайта можно включить модуль (эта часть ограничивает доступ к FCKeditor указанным в первой вкладке ролям пользователей) четвертая вкладка это Внешний вид редактора здесь настраиваем стиль отображения, скин эдитора пятая вкладка Редактор ввода здесь мы управляем режимом ввода (первая выборка действия редактора на Enter, вторая выборка действия редактора на SHift+Enter и т.п) шестая вкладка Настройки файлового браузера здесь выбираем через ккакой ф.б вы хотите загружать файлы, изображения и flash-ролики. седьмая вкладка Стиль и файлы шаблонов здесь управляем шаблонами отображения редактора и стилями

Ну вот вроде все..
единственно незнаю как настроить содержимое панели FCKeditora…

Attached poll “У вас получилось установить и включить:?”.
Register or login to poll
Results:
с первого раза: 1 голос
со второго раза: 2 голоса
с третьего раза: 1 голос
никак не получается: 1 голос

Источник: http://www.drupal.ru/node/60770

#autocomplete_path в элементах textfield

Иногда возникает необходимость для удобства ввода данных создать поле с автозаполнением(autocomplete field). Примерами таких полей могут быть виджеты для cck-полей Node reference i User reference.
Рассмотрим программное создание такого рода полей. Согласно Drupal Forms API reference свойство #autocomplete_path можно добавить только для элемента texfield. Это свойство определяет путь, по которому автоматически включенный JavaScript-код Друпала пошлет HTTP-запросы, используя JQuery.

Читать полностью…

Источник: http://www.drupal.ru/node/60563

Munin

Оглавление

Устанавливаем клиент и сервер

sudo apt-get install munin munin-node

переходим в каталог доступных плагинов munin

cd /usr/share/munin/plugins

скачиваем плагины для nginx

sudo wget -O nginx_request http://exchange.munin-monitoring.org/plugins/nginx_request/version/2/download sudo wget -O nginx_status http://exchange.munin-monitoring.org/plugins/nginx_status/version/3/download sudo wget -O nginx_memory http://exchange.munin-monitoring.org/plugins/nginx_memory/version/1/download

скачиваем другие плагины

sudo wget -O multimemory http://exchange.munin-monitoring.org/plugins/multimemory/version/3/download sudo wget -O sshd_log http://exchange.munin-monitoring.org/plugins/sshd_log/version/1/download sudo wget -O php5-fpm_status http://exchange.munin-monitoring.org/plugins/php5-fpm_status/version/1/download sudo wget -O mysql_connections http://exchange.munin-monitoring.org/plugins/mysql_connections/version/1/download sudo wget -O mysql_qcache http://exchange.munin-monitoring.org/plugins/mysql_qcache/version/1/download sudo wget -O mysql_qcache_mem http://exchange.munin-monitoring.org/plugins/mysql_qcache_mem/version/1/download

делаем плагины исполняемыми

sudo chmod +x nginx_request sudo chmod +x nginx_status sudo chmod +x nginx_memory sudo chmod +x multimemory sudo chmod +x sshd_log sudo chmod +x php5-fpm_status sudo chmod +x mysql_connections sudo chmod +x mysql_qcache sudo chmod +x mysql_qcache_mem

выходим из директории

cd ~

включаем плагины

sudo ln -s /usr/share/munin/plugins/nginx_request /etc/munin/plugins/nginx_request sudo ln -s /usr/share/munin/plugins/nginx_status /etc/munin/plugins/nginx_status sudo ln -s /usr/share/munin/plugins/nginx_memory /etc/munin/plugins/nginx_memory sudo ln -s /usr/share/munin/plugins/multimemory /etc/munin/plugins/multimemory sudo ln -s /usr/share/munin/plugins/sshd_log /etc/munin/plugins/sshd_log sudo ln -s /usr/share/munin/plugins/php5-fpm_status /etc/munin/plugins/php5-fpm_status sudo ln -s /usr/share/munin/plugins/mysql_connections /etc/munin/plugins/mysql_connections sudo ln -s /usr/share/munin/plugins/mysql_qcache /etc/munin/plugins/mysql_qcache sudo ln -s /usr/share/munin/plugins/mysql_qcache_mem /etc/munin/plugins/mysql_qcache_mem

Некоторые плагины имеет не unix формат, чтобы он заработал в Ubuntu открываем его

sudo vim /usr/share/munin/plugins/sshd_log

и пишем команду для vim редактора (не в документ пишем а именно команду)

:set ff=unix

Редактируем дефолтовый конфиг Nginx

sudo vim /etc/nginx/sites-available/default

Добавляем новые location для localhost

location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; }   location /fpm-status { access_log off; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME /fpm-status; include fastcgi_params; allow 127.0.0.1; deny all; }

Перезагружаем nginx

sudo /etc/init.d/nginx stop && sudo /etc/init.d/nginx start

Далее, необходимо указать плагинам, куда ходить за статистикой и тому подобное

sudo vim /etc/munin/plugin-conf.d/munin-node

Добавляем следующее

[nginx*] env.url http://localhost/nginx_status env.ua nginx-status-verifier/0.1   [multimemory] env.os linux env.names nginx php5-fpm mysqld   [users] env.category users   [sshd_log] user root group root env.logfile /var/log/auth.log env.category users

Для работы статистики php5-fpm редактируем его конфиг

sudo vim /etc/php5/fpm/main.conf

Добавляем

pm.status_path = /fpm-status

Перезагружаем клиент Munin:

sudo /etc/init.d/munin-node restart

или

sudo service munin-node restart

Перезагружаем php5-frm

sudo /etc/init.d/php5-fpm restart

Добавляем хост

sudo vim /etc/nginx/sites-available/munin.example.ru

Вставляем примерно следующее

server { listen 80; server_name munin.example.ru; access_log /var/log/nginx/munin.example.ru.access.log;   auth_basic "Restricted"; auth_basic_user_file /etc/munin/.htpasswd;   location / { root /var/cache/munin/www; index index.html; } }

Включаем

sudo ln -s /etc/nginx/sites-available/munin.example.ru /etc/nginx/sites-enabled/munin.example.ru

Создаем файлик, где будут располагаться пользователи, для которых будет открыт доступ к графикам производительности (http://www.codeobsessed.com/encryption.php нужен пароль crypt(3)):

sudo vim /etc/munin/.htpasswd

Перезагружаем nginx

sudo /etc/init.d/nginx stop && sudo /etc/init.d/nginx start

Теперь можно смотреть графики по адресу munin.example.ru

Источник: http://www.drupal.ru/node/60544

Почта

Оглавление

Содержать свой почтовый сервер, со всеми прибомбасами, такими как антивирусник, антиспам и так далее, оказалось слишком дорого в плане ресурсов, это будет плохо вписываться в имеющиеся 384М оперативки, даже при 512 я буду смотреть в сторону увеличения воркеров для fpm, увеличения памяти для скриптов (сейчас 1 воркер на 128М, что катострафически мало), также буду смотреть в сторону организации ускорителя и кеша… В общем только на конфигурации 1Gb оперативной памяти следует задуматься о развёртовании полноценного почтового сервера.

Я использую яндекс, т.к. в панели управления доменами у моего регистратора есть автоматическая привязка. Но можно пробовать завязывать на gmail или mail.ru

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

sudo vim /etc/hostname

Пишем название, например

sergei

Меняем хост

sudo vim /etc/hosts

Заменяем нули на реальный IP

0.0.0.0 sergei.example-d6.ru sergei

Перезагружаем ОС

sudo reboot

Смотрим на имя и хост

hostname hostname -f

Если после перезагрузки имя не сменилось, то надо идти в панель управления VDS если нет доступа к ней, то просить хостера сменить имя.

Установим нужные пакеты, которые настроены будут позже

sudo apt-get install postfix libsasl2-2 sasl2-bin

Отредактируем конфиг:

sudo vim /etc/postfix/main.cf

Исправляем:

mynetworks = 127.0.0.0/8, 192.168.0.0/16

Добавляем в этот же конфиг

smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/saslpass smtp_sasl_security_options = relay = smtp.yandex.ru relayhost = smtp.yandex.ru

Добавим файл /etc/postfix/saslpass:

sudo vim /etc/postfix/saslpass

smtp.yandex.ru admin@example-d6.ru:password

Закрепим изменения:

sudo postmap /etc/postfix/saslpass

Подправим php.ini:

sudo vim /etc/php5/fpm/php.ini

Находим строку sendmail_path и заменяем:

sendmail_path = sendmail -t -i -f admin@example-d6.ru

Перезагружаем fpm

sudo /etc/init.d/php5-fpm restart

Теперь должно всё работать, я проверял на контактной форме случайного сайта, т.е. не c example-d6.ru, а например example-d7.ru, чтобы убедиться что письма отсылаются с любого домена, а не только указанного в конфиге.

Источник: http://www.drupal.ru/node/60543

Cron

Оглавление

Нужно настроить cron для всех сайтов, в том числе и для технических. Периоды выбираются индивидуально для каждого сайта, но на технический я ставлю 1 раз в сутки, не смотря на то что в админке drupal’a ставлю проверять обновления раз в неделю…

Открываем для редактирования задачи cron’a

sudo crontab -e

Должно быть примерно так, третья строка (www.example-d6.ru) запускается каждую минуту чтобы убедиться сразу что работает, после чего надо выставить нормальное время, чтобы не завалить сервер если сайтов в мультисайтинге десяток, а то и не один…

45 2 * * * /usr/bin/wget -O - -q -t 1 http://technical.example-d6.ru/cron.php 15 3 * * * /usr/bin/wget -O - -q -t 1 http://technical.example-d7.ru/cron.php * * * * * /usr/bin/wget -O - -q -t 1 http://www.example-d6.ru/cron.php 35 3 * * /usr/bin/wget -O - -q -t 1 http://www.example-d7.ru/cron.php

Источник: http://www.drupal.ru/node/60542

D6 Установка

Оглавление

Создаём папочки в sites

www.example-d6.ru www.example-d6.ru/files www.example-d6.ru/modules www.example-d6.ru/themes www.example-d6.ru/tmp

Копируем в www.example-d6.ru из sites/default файл default.settings.php и переименовываем в settings.php
Также копируем в www.example-d6.ru robots.txt

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

$db_url = 'mysqli: //и ваши данные о базе $db_prefix = array( 'default' => 'exampled6_', 'locales_meta' => 'shared_', 'locales_source' => 'shared_', 'locales_target' => 'shared_', ); $base_url = 'http://www.example-d6.ru'; ini_set('memory_limit', '128M');

Теперь остаётся только задать адрес

sudo vim /etc/nginx/sites-available/example-d6.ru

Заменяем на свой хост

server { listen 80; server_name example-d6.ru; rewrite ^ http://www.example-d6.ru$request_uri? permanent; #301 redirect }   server { listen 80; server_name www.example-d6.ru; access_log /var/log/nginx/example-d6.ru.access.log;   root /var/www/drupal6; index index.php;   if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?q=$1 last; }   error_page 404 index.php;   # hide protected files location ~* .(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(.php)?|xtmpl|svn-base)$|^(code-style.pl|Entries.*|Repository|Root|Tag|Template|all-wcprops|entries|format)$ { deny all; }   # hide backup_migrate files location ~* ^/sites/www.example-d6.ru/files/backup_migrate { deny all; }   # Static content location = /robots.txt { if (-f $document_root/sites/www.example-d6.ru/robots.txt) { rewrite . /sites/www.example-d6.ru/robots.txt; } break; }   location ~ ^(/sites/all|/sites/www.example-d6.ru)?/(modules|themes|libraries)/.*.(css|js|png|gif|jpg)$ { break; } location /misc/ { break; } location /sites/www.example-d6.ru/files/ { break; }   # Imagecache (http://drupal.org/project/imagecache) location /sites/www.example-d6.ru/files/imagecache/ { if (-f $request_filename) { break; } rewrite ^(.*)$ /index.php?q=$1 last; }   location ~ \.php$ { # fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php;   fastcgi_param SCRIPT_FILENAME /var/www/drupal6$fastcgi_script_name;   include fastcgi_params; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; }   ## Disable viewing .htaccess & .htpassword location ~ /\.ht { deny all; } }

Включаем

sudo ln -s /etc/nginx/sites-available/example-d6.ru /etc/nginx/sites-enabled/example-d6.ru sudo /etc/init.d/nginx restart

Источник: http://www.drupal.ru/node/60541

D6 Подготовка

Оглавление

Создаём пользователя drupal6

sudo /usr/sbin/adduser drupal6

Добавляем папки для ключей SSH

sudo mkdir /home/drupal6/.ssh

Генерируем ключи, сразу же предложит указать файл, он будет такой /home/drupal6/.ssh/id_rsa

sudo ssh-keygen -t rsa sudo mv ~drupal6/.ssh/id_rsa.pub ~drupal6/.ssh/authorized_keys sudo rm ~drupal6/.ssh/id_rsa sudo chown -R drupal6:drupal6 ~drupal6/.ssh sudo chmod 700 ~drupal6/.ssh sudo chmod 600 ~drupal6/.ssh/authorized_keys

Надо разрешить им доступ по SSH для заливки файлов по SFTP протаколу

sudo vim /etc/ssh/sshd_config

Должно быть примерно так

AllowUsers admin drupal6

Перезагружаем SSH

sudo /etc/init.d/ssh reload

Теперь создаём папку для сайта

sudo mkdir /var/www/drupal6 sudo ln -s /var/www/drupal6 ~drupal6/www sudo chown -R drupal6:drupal6 /var/www/drupal6

Логинимся от имени drupal6, например через FileZilla, и заливаем свежую версию ядра, создаём базу, пользователя базы и т.д через PhpMyAdmin

Теперь определяемся с адресами, у меня будет такая структура:
technical6.example-d6.ru – технический сайт который находится пожизненно в режиме “на обслуживании”. Здесь будут включены все модули которые есть в папочке all, следить за обновлениями модулей буду именно отсюда. Это позволит не включать вообще вообще ни на одном другом сайте в этой связке этот модуль, что несомненно ускорит админку этих сайтов. Будут ставиться переводы, таблицы для переводов будут шариться на все сайты связки. Так же на главную страницу будут выноситься ссылки на скрипт обновления каждого из сайтов мультисайтинга, что при установке обновлений ускорит работу.
www.example-d6.ru – первый сайт мультисайтинга, на шестёрке.

Источник: http://www.drupal.ru/node/60540

MySqlDumper

Оглавление

Ставим MySqlDumper (www.mysqldumper.net), его я использую для переноса баз данных, т.к. один сайт имеет запредельный размер, порядка 500М в несжатом виде, также ставлю на хостинг, там делаю экспорт, здесь импорт.

sudo mkdir /var/www/mysqldumper sudo ln -s /var/www/mysqldumper ~admin/mysqldumper sudo chown -R admin:admin /var/www/mysqldumper

Заливаем сюда скрипты, я например через FileZilla это делаю, а не через putty

Сразу поставим права, т.к. этого потребует скрипт установки.

chmod 777 /var/www/mysqldumper/config.php

Добавляем хост

sudo vim /etc/nginx/sites-available/mysqldumper.example.ru

Вставляем примерно следующее

server { listen 80; server_name msd.example.ru; rewrite ^ http://mysqldumper.example.ru$request_uri? permanent; #301 redirect }   server { listen 80; server_name mysqldumper.example.ru; access_log /var/log/nginx/mysqldumper.example.ru.access.log;   location / { root /var/www/mysqldumper; index index.php; }   location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/mysqldumper$fastcgi_script_name; include fastcgi_params; } }

Включаем

sudo ln -s /etc/nginx/sites-available/mysqldumper.example.ru /etc/nginx/sites-enabled/mysqldumper.example.ru

И перезагружаем nginx

sudo /etc/init.d/nginx stop && sudo /etc/init.d/nginx start

Открыв в браузере mysqldumper.example.ru увидим install, проходим её. Нажимаем на “Create directory protection” например MD5. Для nginx нужен crypt(3) можно составить например здесь http://www.codeobsessed.com/encryption.php

Открываем файл с паролями и заменяем пароль на полученный через crypt(3)

vim /var/www/mysqldumper/.htpasswd

Но это не работает для nginx сервера, поэтому добавляем в конфиг

sudo vim /etc/nginx/sites-available/mysqldumper.example.ru

следующее

auth_basic "Restricted"; auth_basic_user_file /var/www/mysqldumper/.htpasswd;

т.е. получится примерно так

server { listen 80; server_name mysqldumper.example.ru; access_log /var/log/nginx/mysqldumper.example.ru.access.log;   auth_basic "Restricted"; auth_basic_user_file /var/www/mysqldumper/.htpasswd;   ...

И снова перезагружаем nginx

sudo /etc/init.d/nginx stop && sudo /etc/init.d/nginx start

Источник: http://www.drupal.ru/node/60538

PhpMyAdmin

Оглавление

Устанавливаем нужные пакеты

sudo apt-get install phpmyadmin php5-mcrypt

В окошке не выбираем ничего просто жмём enter

Добавляем хост

sudo vim /etc/nginx/sites-available/phpmyadmin.example.ru

Вставляем примерно следующее

server { listen 80; server_name pma.example.ru; rewrite ^ http://phpmyadmin.example.ru$request_uri? permanent; #301 redirect }   server { listen 80; server_name phpmyadmin.example.ru;   root /usr/share/phpmyadmin;   access_log /var/log/nginx/phpmyadmin.example.ru.access.log;   location / { root /usr/share/phpmyadmin; index index.php; }   location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/share/phpmyadmin$fastcgi_script_name; include fastcgi_params; } }

Включаем

sudo ln -s /etc/nginx/sites-available/phpmyadmin.example.ru /etc/nginx/sites-enabled/phpmyadmin.example.ru

Забегая вперёд, после входа PhpMyAdmin будет жаловаться на установленный Suhosin, правим конфиг как рекомендовано в доках на PhpMyAdmin

sudo vim /etc/php5/conf.d/suhosin.ini

Должны быть следующие значения:

suhosin.sql.bailout_on_error = off suhosin.post.max_array_index_length = 256 suhosin.post.max_totalname_length = 8192 suhosin.post.max_vars = 2048 suhosin.request.max_array_index_length = 256 suhosin.request.max_totalname_length = 8192 suhosin.request.max_vars = 2048

так же логи не должны включать в себя sql

Далее отключаем предупреждение о возможных проблемах с suhosin

sudo vim /usr/share/phpmyadmin/libraries/config.default.php

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

$cfg['SuhosinDisableWarning'] = true;

Перезагружаем php fpm и nginx

sudo /etc/init.d/php5-fpm restart && sudo /etc/init.d/nginx stop && sudo /etc/init.d/nginx start

Теперь по адресу phpmyadmin.example.ru должна быть форма входа в PhpMyAdmin

Источник: http://www.drupal.ru/node/60537

MySQL

Оглавление

Устанавливаем нужные пакеты

sudo apt-get install mysql-server mysql-client php5-mysql

Правим конфиг чтобы уменьшить потребление памяти

sudo vim /etc/mysql/my.cnf

Находим раздел про InnoDB, и добавляем

skip-innodb

Перезапускаем mysql

sudo /etc/init.d/mysql restart

если не получится, то попробовать надо так

sudo service mysql restart

Потребление памяти уменьшилось, благодаря тому, что запущено теперь меньше процессов mysql

Перезапускаем php fpm т.к. мы поставили php5-mysql, который пока не работает

sudo /etc/init.d/php5-fpm restart

Источник: http://www.drupal.ru/node/60536

MemCache

Оглавление

Устанавливаем сам memcache

sudo apt-get install memcached sudo apt-get install php5-memcache

Перезагружаем php5-frm

sudo /etc/init.d/php5-fpm restart

Источник: http://www.drupal.ru/node/60535

eAccelerator

Оглавление

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

cd /tmp/ sudo wget http://bart.eaccelerator.net/source/0.9.6.1/eaccelerator-0.9.6.1.tar.bz2 sudo tar xvjf eaccelerator-0.9.6.1.tar.bz2 cd eaccelerator-0.9.6.1 sudo phpize sudo ./configure --enable-eaccelerator=shared sudo make sudo make install cd ~

теперь редактируем и добавляем следующие строки, начиная после тега [PHP]:

sudo vim /etc/php5/fpm/php.ini

; eAccelerator configuration ; Note that eAccelerator may also be installed as a PHP extension or as a zend_extension ; If you are using a thread safe build of PHP you must use ; zend_extension_ts instead of zend_extension ;extension = "/usr/lib/php5/20090626/eaccelerator.so" zend_extension = "/usr/lib/php5/20090626/eaccelerator.so" eaccelerator.shm_size = "32" eaccelerator.cache_dir = "/var/cache/eaccelerator" eaccelerator.enable = "1" eaccelerator.optimizer = "1" eaccelerator.check_mtime = "1" eaccelerator.debug = "0" eaccelerator.filter = "" eaccelerator.shm_max = "0" eaccelerator.shm_ttl = "0" eaccelerator.shm_prune_period = "0" eaccelerator.shm_only = "0" eaccelerator.compress = "1" eaccelerator.compress_level = "9" eaccelerator.allowed_admin_path = "/var/www/eaccelerator"

Создаём директории с нужными права

sudo mkdir -p /var/cache/eaccelerator sudo chmod 0777 /var/cache/eaccelerator sudo mkdir -p /var/www/eaccelerator sudo chmod 0755 /var/www/eaccelerator

Копируем панель управления

cp /tmp/eaccelerator-0.9.6.1/control.php /var/www/eaccelerator/index.php

Меняем имя и пароль

sudo vim /var/www/eaccelerator/index.php

Перезагружаем php5-frm

sudo /etc/init.d/php5-fpm restart

Источник: http://www.drupal.ru/node/60534

PHP

Оглавление

Нам понадобятся 2 библиотеки, закачаем последние версии и установим их

cd /tmp wget http://us.archive.ubuntu.com/ubuntu/pool/main/k/krb5/libkrb53_1.6.dfsg.4~beta1-5ubuntu2_i386.deb wget http://us.archive.ubuntu.com/ubuntu/pool/main/i/icu/libicu38_3.8-6ubuntu0.2_i386.deb sudo dpkg -i *.deb cd ~

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

sudo vim /etc/apt/sources.list

Добавляем

deb http://php53.dotdeb.org stable all

Обновляемся и устанавливаем PHP с нужными пакетами.

sudo apt-get update sudo apt-get install php5-cli php5-common php5-suhosin sudo apt-get install php5-fpm php5-cgi sudo apt-get install php-apc php5-curl php5-dev

Редактируем конфиг для fpm, т.к. через него у нас будет запускаться FastCGI

sudo vim /etc/php5/fpm/php.ini

Вставляем следующий параметр

cgi.fix_pathinfo = 0

Правим конфиг для пакета php-apc

sudo vim /etc/php5/conf.d/apc.ini

Добавляем строку

apc.shm_size = 48

Чтобы не было падений php-fpm открываем этот конфиг

sudo vim /etc/php5/fpm/pool.d/www.conf

На самом деле динамические воркеры, это хорошо. Если мы даём каждому юзеру свой воркер это накладно при 2000 сайтов. Но у нас только VDS с 384М, а не сервак с 16 гигами, будет несколько юзеров, но с общими воркерами, для начала поставим 1, а когда будет всё настроено можно будет увеличивать если будут свободные ресурсы (На вторую конфигурацию с гигом памяти смело можно ставить 3, или вообще не трогать и оставить динамические). Так же хорошо для крона сделать отдельный воркер, это связано с тем что на моих сайтах долго выполняется cron, время каждого запуска расчитано, поэтому хватит и одного отдельного потока, для его бесперебойной работы, чтобы он не конкурировал с пользователями сайтов. Но всё это держим только в уме, а пока ставим 1 поток на всех.

pm = static pm.max_children = 1

Перезагружаем nginx и php5-frm.

sudo /etc/init.d/nginx stop && sudo /etc/init.d/nginx start sudo /etc/init.d/php5-fpm stop sudo /etc/init.d/php5-fpm start

Создаём проверочный файл

sudo vim /var/www/index.php

И пишем такую строчку


<?php phpinfo(); ?>

Проверяем, должно всё работать.

Источник: http://www.drupal.ru/node/60533

Nginx

Оглавление

Смотрим установлен ли апач

dpkg -l | grep apache

Если установлен, то удаляем примерно так (будет зависеть от установленных пакетов):

sudo apt-get --purge remove apache2 apache2.2-bin apache2.2-common apache2-mpm-prefork apache2-utils apache2-doc

Устанавливаем nginx

sudo apt-get install nginx

Запускаем

sudo /etc/init.d/nginx start

Далее в браузере вводим IP своего VDS и видим надпись

Welcome to nginx!

* Если появилась ошибка 403, то на этом этапе не страшно, в одной из версий неправильный конфиг дефолтовый, что исправиться при установке PHP

Меняем дефолтовый конфиг

sudo vim /etc/nginx/sites-available/default

Заменяем содержимое файла на следующее

server { listen 80; server_name localhost; access_log /var/log/nginx/localhost.access.log;   ## Default location location / { root /var/www; index index.php; }   ## Images and static content is treated different location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ { access_log off; expires 30d; root /var/www; }   ## Parse all .php file in the /var/www directory location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name; include fastcgi_params; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_intercept_errors on; fastcgi_ignore_client_abort off; fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; }   ## Disable viewing .htaccess & .htpassword location ~ /\.ht { deny all; } }

Чтобы можно было добавлять много server_name в разных конфигах нужно добавить директиву server_names_hash_bucket_size в конфиге nginx в http блок

sudo vim /etc/nginx/nginx.conf

server_names_hash_bucket_size 512;

Источник: http://www.drupal.ru/node/60532

Подготовка ОС

Оглавление

Устанавливаем локаль

sudo /usr/sbin/locale-gen en_US.UTF-8 && sudo /usr/sbin/update-locale LANG=en_US.UTF-8

Обновляемся

sudo apt-get update

Ставим менеджер для обновлений

sudo apt-get install update-manager-core sudo do-release-upgrade

Ставим для обзора процессов и их потребления памяти ими, ставим htop

sudo apt-get install htop

используем очень просто

htop

Ставим утилиты разработки

sudo apt-get install build-essential

Если стоит 10.04 а не 10.10 то обновление делается так

Открываем файл менеджера обновлений для правки

sudo vim /etc/update-manager/release-upgrades

Заменяем

Prompt=lts

на

Prompt=normal

Обновляемся

sudo do-release-upgrade

Теперь должна быть версия 10.10

Источник: http://www.drupal.ru/node/60531

Подготовка сервера

Оглавление

Хостер установил уже Ubuntu Server 10.10 и даже поставил ssh и Apache 2.

Заходим через SSH как root, сразу меняем пароль на нормальный

passwd

Добавляем группу избранных, назовём её raccess

/usr/sbin/groupadd raccess

Открываем файл, для того чтобы нашу группу сделать “избранной”

/usr/sbin/visudo

Добавляем в конец файла, далее если не оговаривается, то всегда вставляется именно в конец.

## Allows people in group raccess to run all commands %raccess ALL=(ALL) ALL

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

/usr/sbin/adduser admin

Добавляем его к ранее созданной группе

/usr/sbin/usermod -a -G raccess admin

Добавляем папку для ключей SSH

mkdir ~/.ssh

Генерируем ключи

ssh-keygen -t rsa

Делаем для нашего будущего аккаунта, где вместо нулей подставляем реальный IP адрес

scp ~/.ssh/id_rsa.pub admin@0.0.0.0: mkdir ~admin/.ssh mv ~admin/id_rsa.pub ~admin/.ssh/authorized_keys

Назначаем права нашему пользователю

chown -R admin:admin ~admin/.ssh chmod 700 ~admin/.ssh chmod 600 ~admin/.ssh/authorized_keys

Настраиваем SSH

vim /etc/ssh/sshd_config

Проверяем значения и меняем или добавляем строки если нет…

Port 10022 # Меняем на что нибудь между 1025 и 65536, это так же усложнит жизнь взломщикам. Protocol 2 PermitRootLogin no # отключаем запись для root пользователя UseDNS no AllowUsers admin # если пользователей несколько через пробел называем всех

В интернете предлагают сделать следующее, я пока не разобрался как потом залогиниться

PasswordAuthentication no

Создаём правила маршрутизации в файлике, чтобы после перезагрузки сервера настройки восстанавливались.

vim /etc/iptables.up.rules

Вставляем следующее, и меняем порт для SSH, который недавно ставили 10022, остальные не трогаем, в комментариях видно для чего они понадобятся.

*filter # Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0 -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT # Accepts all established inbound connections -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Allows all outbound traffic # You can modify this to only allow certain traffic -A OUTPUT -j ACCEPT # Allows HTTP and HTTPS connections from anywhere (the normal ports for websites) -A INPUT -p tcp --dport 80 -j ACCEPT -A INPUT -p tcp --dport 443 -j ACCEPT # Allows mysql -A INPUT -p tcp --dport 3306 -j ACCEPT # Allows fcgi -A INPUT -p tcp --dport 9000 -j ACCEPT -A INPUT -p tcp --dport 8521 -j ACCEPT # Allows SSH connections # # THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE # -A INPUT -p tcp -m state --state NEW --dport 10022 -j ACCEPT # Allows mail -A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 143 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 993 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 995 -j ACCEPT # Allows ldap -A INPUT -p tcp -m state --state NEW -m tcp --dport 389 -j ACCEPT # Allows memcache -A INPUT -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT # Allows munin -A INPUT -p tcp -m state --state NEW -m tcp --dport 4949 -j ACCEPT # Allow ping -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT # log iptables denied calls -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 # Reject all other inbound - default deny unless explicitly allowed policy -A INPUT -j REJECT -A FORWARD -j REJECT COMMIT

Чистим память

/sbin/iptables -F

Применяем наши правила

/sbin/iptables-restore < /etc/iptables.up.rules

Проверяем внимательно особенно наш порт SSH

/sbin/iptables -L

Для восстановления после перезагрузки создаём файл

vim /etc/network/if-pre-up.d/iptables

Вставляем следующее

#!/bin/sh /sbin/iptables-restore < /etc/iptables.up.rules

Разрешаем запускать этот файл

chmod +x /etc/network/if-pre-up.d/iptables

Перезагружаем ssh

/etc/init.d/ssh reload

Закрываем Putty, открываем заново поменяв порт. Заходим под admin

Теперь нельзя залогиниться как root…

Источник: http://www.drupal.ru/node/60530

Drupal, Ubercart, корзина и кеширование для анонимов

При выключенном кешировании аноним видит корзину как положено
При включенном кешировании и анониме с uid 0 корзина всегда показывается ссылкой
При включенном кешировании и анониме не 0 поведение корзины довольно непредсказуемо

Отключать кеш – не самая лучшая идея, не говоря уже о том, чтобы boost включить
вскрытие уберкарта показало, что uid 0 используется явно(кто бы сомневался) поэтому не 0 даёт такой результат

для начала запрещаем выдачу корзины анониму ссылкой
uc_cart.module

case 'view': // 0 = Default shopping cart block. if ($delta == 0) { $cachable = 0;

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

теперь можно смело включать кеширование или даже ставить boost
uc_ajax_cart работает так же отлично

единственный минус – +1 асинхронный запрос к серверу, что при включенном бусте нивелируется полностью

UPDATE 0

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

и вариант для джедаев – написать свой модуль/php-код, который выводит блок правильно, можно даже сразу с аякс

также можно попросить разработчиков уберкарт вычислять $cachable с учётом флага админки, но когда это будет?

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

UPDATE 1
с мест подсказывают, uid анонима должен быть 0 всегда, при любых обстоятельствах, иначе поведение модулей, его проверяющих, может стать непредсказуемым
но случается, что при выливке дампа его срывает – причины лично для меня непонятные, исправляю специально для этого сделанным sql

UPDATE 2

с мест подсказывают, uc_ajax_cart 2.x-beta версии делает всё самостоятельно
если вы не боитесь, то можно использовать его

Источник: http://www.drupal.ru/node/60318

Новый модуль SMS v0.3

Обновил модуль SMS для отправки уведомлений через телефоны или GSM модемы
Добавил отсылку уведомлений при новых коментариях в авторской ноде, уведомления о ответах на комментари и уведомления о всём что происходит на сайте
Ссылка на настройки sms/subscribe/comment но почему то ни как табой ни как меню не отображается если кто сможет помочь – буду рад.
Версия 0.1 http://www.drupal.ru/node/60065
Версия 0.2 http://www.drupal.ru/node/60119

Прикрепленный файл Размер sms-0.3.zip 12.82 кб

Источник: http://www.drupal.ru/node/60206

Новый модуль SMS v0.2

Итак обновил модуль SMS – отправка сообщений через мобильный телефон или GSM модем с помошью GAMMU
Добавил следующее:
* Журнал смс
* Отправка про cron
* Вкыл/Выкл транслит – Соответственно 140 или 63 символа ограничиваю строку
* Модуль подписки на новые ноды
Собираюсь добавить:
* Включение определённой роли при привязке номера
* Уведомление о новых ЛС

Прошлая версия: http://www.drupal.ru/node/60065

Если кто то поможет выложить на drupal.org буду благодарен…

Прикрепленный файл Размер sms-0.2.zip 11.83 кб

Источник: http://www.drupal.ru/node/60119

On-Line видео через IP камеру

Возникло желание сделать трансляцию видео через IP-камеру.
Камера DSC-2121. Можно подключить напрямую к инету, в моем случае через домашний роутер DIR-320.
Далее пошли мучения с поиском и доработкой скрипта.
В результате получился такой код:

<DIV align=center> <object id="xplugApplet" classid="java:xplug.class" java_codebase="http://ХХХ.ХХХ.ХХХ.ХХХ" type="application/x-java-applet" archive="xplug.jar" name="xplugApplet" height="480" width="640"> <param name="archive" value="xplug.jar"> <param name="code" value="xplug"> <param name="codebase" value="http://ХХХ.ХХХ.ХХХ.ХХХ/dcsclictrl.cab#version=1,0,0,2609"> <param name="scriptable" value="true"> <param name="name" value="cvcs"> <param name="type" value="application/x-java-applet;version=1.6"> <param name="menuheight" value="40"> <param name="RemotePort" value="80"> <param name="Timeout" value="10000"> <param name="mayscript" value="true"> <param name="xmode" value="preview"> <param name="productID" value="DCS-2121"> <param name="profileid" value="3"> <param name="bg" value="0xd5dfea"> <param name="inittrigger" value="0"> <param name="imageWidth" value="640"> <param name="imageHeight" value="480"> <param name="webEvent" value="0"> <param name="pageContext" value="Basic Z3Vlc3Q6"> <param name="microphone" value="0"> <param name="speaker" value="0"> <strong> Ваш браузер не имеет встроенной поддержки Java Plug-in. <br> <a href="http://www.java.com/ru/download/manual.jsp"> Установите последнюю версию Java Plug-in отсюда. </a> </strong> </object> </DIV>

ХХХ.ХХХ.ХХХ.ХХХ – это IP Вашей камеры. Впрочем можно указывать и в “нормальном” виде – http://my_account.dlinkddns.com
На стороне клиента должна быть предустановлена Ява. Впрочем если ее не будет, появится сообщение с адресом закачки.
Проверял на ИЕ, Опере, Фоксе.
Пример реализации
(Не всегда работает. Для камеры нужен статический IP, а у меня псевдостатический, через www.dlinkddns.com)
В настройках камеры нужно создать пользователя guest с пустым паролем.

Источник: http://www.drupal.ru/node/60019

Модуль экспорта в ЯндексМаркет. Ещё один

Нацарапал свой модуль для экспорта в ЯндексМаркет. Причиной послужили жалобы народа на модуль yml_export, который был включён в мою бесплатную сборку интернет магазина OpenStore

yml_export прост и в этом, наверное, его сила, но он генерирует XML “налету”, что приводит к тому, что при большой товарной базе Яндекс не успевает забрать весь файл.

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

Модуль Price Export тоже несложен, но обладает приятными фичами

1) Генерация статического .xml файла
2) Поддерживаются все теги упрощённого формата экпорта
3) Возможность выбора источника для тегов – словари или CCK поля
4) Возможность выбора включать только товары, которые активны на складе или всех их. В последнем случае корректно отрабатывается тег available – для товаров под заказ available=”false”
5) Возможность выбора пресета для картинки товара
6) Настройка пути, по которому доступен файл. Также можно качать напрямую с файловой директории

7) Рудиментная статистика: время последнего успешного создания, потраченное время на генерацию файла, количество обработанных товаров

3 режима генерации: вручную пымпочкой, по крону, при обновлении ноды

Файл проходит общую валидацию XML, Яша также ест его.

Ограничения:

не для большой товарной базы! Используется последовательный node_load() при формировании источника экпорта, что довольно затратно по ресурсам.

Качаем же

Источник: http://www.drupal.ru/node/59824

Видео уроки по Drupal

Доброго времени суток. Хочу представить наши видео уроки по Drupal 6, которые точно будут полезны начинающим
Ничего военного в них нет, но снималось с “душой” и стремлением перетянуть людей с других CMSок, в первую очередь с Joomla.

Хотелось бы услышать мнение профессионалов по поводу того, что можно было еще снять и не плохо было бы добавить. (Views и Темизация сейчас оцифровываются).

Источник: http://www.drupal.ru/node/59507

Кнопки ВКонтакте и Одноклассники для SexyBookmarks

Есть хороший модуль  SexyBookmarks, который позволяет сделать на сайте красивые кнопки для добавления материалов в различные сервисы. Но нет в нем особо популярных российских сервисов ВКонтакте и Одноклассники.
Решил добавить эти два сервиса.
Для этого нужно сделать небольшое изменение в файле sexybookmark.inc – добавить в массив, возвращаемый функцией sexybookmarks_sexybookmarks() следующие элементы:

<?php'vkontakte' => array(
      'title' => t('VKontakte'),
      'description' => t('Share this on !title'),
      'url' => 'http://vkontakte.ru/share.php?url={PERMALINK}',
    ),
    'odnoklassniki' => array(
      'title' => t('Odnoklassniki'),
      'description' => t('Share this on !title'),
      'url' => 'http://www.odnoklassniki.ru/dk?st.cmd=addShare&st.s=1&st._surl={PERMALINK}',
    ),?>

Плюс нужно скопировать два png файла (прилагаются) в папку images/icons
В результате в списке появятся иконки вышеупомянутых сервисов.

В действии можно увидеть здесь: http://www.happyho.ru/blog/2/11291

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

Попробую написать на Drupal.org, может добавят эти кнопки в следующую версию модуля.

Прикрепленный файл Размер odnoklassniki.png 2.75 кб vkontakte.png 1.93 кб

Источник: http://www.drupal.ru/node/59299

Курс разработки модулей для Drupal (Киев)

Мы организовываем новый супер-курс для друпаллеров, имеющих навыки PHP.
Первое занятие — 9 апреля.

Приглашаем к коммерческому сотрудничеству владельцов друпал-ресурсов. Подробности по тел.

Цель курса – дать базу знаний и практики начинающим программистам PHP для разработки модулей Drupal.

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

Несколько вопросов, на которые нужно для себя ответить:

Знаешь основы PHP и стремишься к новому уровню знаний? Хочешь научиться писать Drupal модули? Надоело быть ограниченным возможностями существующих модулей? Нужно решать нестандартные задачи?

Ели да, то звони и записывайся – 093-918-1234

В течение всего курса, в качестве упражнений, будет осуществляться разработка собственного модуля, функциональность которого будет расширяться в соответствии с проходимым разделом программы тренинга. Техническое задание на этот модуль достаточно сложное, будут освещены все основные хуки Drupal, API форм, модули Node, User др., что позволит углубиться в специфику написания модулей для Drupal и получить хорошие практические знания.

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

И еще несколько слов о курсе.
Занятия будут проходить 2 субботы. То есть интервал между занятиями 1 неделя.
Полный день: с утра и до вечера. Перерывы на кофе и обед.

Спикеры:
Евгений Курко
Виктор Богуцкий

Стоимость 980 грн.
Хочешь получить скидку? Звони за подробностями.

Есть возможность приема оплаты по безналу.

Реквизиты для оплаты:
Отримувач: Курко Євген Володимирович
Код: 3023914671
Банк: ПуАТ «СЕБ Банк», м. Київ, МФО 300175
Р/p: 2600207929
Призначення платежу: За консультування з питань інформатизації. Рахунок-фактура без номера. Без ПДВ.
______________________________________________________________

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

Программа работы

ТЗ на модуль по управлению и учету рассылок для магазина по продаже мобильных телефонов (Newsletters)
1. Письма рассылок
1.1 Предусмотреть интерфейс для создания рассылочного письма. Письмо должно отправляться в формате HTML без аттачментов
1.2 Интерфейс должен состоять из страницы внесения/редактирования письма рассылки. Страницы со списком всех внесенных писем. Функционал по отправке письма в рассылку. Функционал по поиску письма в списке писем на рассылку.
2. Подписчики на рассылку
2.1 Предусмотреть интерфейс управления подписчиками на рассылку. Подписчики – зарегистрированные пользователи друпал сайта.
2.2 Интерфейс должен состоять из страницы внесения/редактирования пользователя, обеспечивая подписку пользователя на рассылку администратором.
2.3 После того, как админ подписал пользователя на рассылку, пользователю должно прийти соответствующее уведомление из которого он может согласиться на подписку или нет (approved/denied).
2.4 Пользователь может отписаться от рассылки в любое время (статусы subscribed/unsubscribed) после чего ему должно прийти соответствующее уведомление об отписке.
2.5 Интерфейс должен состоять из страницы со списком всех пользователей, с информацией об согласии пользователя на рассылку (approved/denied) и статус пользователя (subscribed/unsubscribed). Реализовать функционал по поиску пользователя в списке.

Источник: http://www.drupal.ru/node/59230

Модуль простого календаря по материалам

В конце прошлого года (2010-го) для разработки одного сайта (вот он) потребовалось вставить туда календарь новостей. Требовалось что-то легкое, быстрое, что не будет грузить сайт сильно… Поискав по модулям и не найдя ничего путного, решил написать свой календарик с блекджеком и так далее…

В общем сделано было давно и уже позабылось, но приходит новое сообщение с drupal.ru с вопросом, как же реализован календарь на том сайте… Учитывая, что есть интерес к такому модулю, я сделал его его отдельным (раньше он был в связке с другими функциями сайта).

Собственно сейчас он отображает все типы материалов в календаре… Кому неудобно в файле модуля поменяйте $type на ваше условие для типа материала, например, $type = ’story’;. Лень было добавлять в настройку блока такое поле.

О, вспомнил. Модуль включается как блок и в нем ещё формируется страница типа /calendar/ГГГГ/ММ/ДД для отображения страницы с материалами за выбранный день

Темизация осуществляется через правку css-файла и спрайта со стрелками. Скрипт править не надо

Вот и всё, собственно… Юзайте на здоровье

Чуть не забыл! Файлик вот… Шестая версия друпала

UPDATE (01.04.2011)
Обновил модуль по просьбе  taru
Добавил выборку по типу материала и по полю CCK Date, для выбора материалов типа афиш
Добавил сохранение последнего месяца, чтобы не листать лишний раз.
Файл вот

За спасибо, приму копеечки на яндекс.деньги 41001896059641 или заказ на разработку новых модулей )))

Прикрепленный файл Размер russian_calendar.zip 7.78 кб russian_calendar_v02.zip 9.25 кб

Источник: http://www.drupal.ru/node/59020

Руководство по созданию draggable-интерфеса

Очень часто бывает нужно сделать сортировку нод по какому-то критерию. Для этого часто используются Views, Nodequeue, Flag и другие похожие модули. Но часто бывает так, что функционала этих модулей недостаточно для удовлетворения хитрых требований заказчика. Конечно можно сделать много nodequeue и рассказать заказчику, которая из них за что отвечает, но такая система с точки зрения юзабилити выглядит как минимум сомнительно. Другим вариантом решения может быть добавление cck-поля “weight” и вручную для каждой ноды выставлять ее вес и уже по нему сортировать. Но опять же при наличии тысяч нод данный способ не является решением проблемы.

Читать полностью…

Источник: http://www.drupal.ru/node/58883

Оптимизация изображений с помощью сервиса Smush.it

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

В интерфейсе нам доступны флешовый мультизагрузчик или загрузка по URL

После того как Smush.it обработает изображения,  на экране появится отчет

Все оптимизированые изображения потом можно сохранить в ZIP файле.Как видно из отчета, оптимизация для нашего примера составила 15.84%, что является потрясающим результатом, поскольку все изображения перед этим уже были оптимизированы другой программой. 

Источник

Источник: http://www.drupal.ru/node/58560

Drupal-day в Краснодаре в предверии 8 марта

Сегодня, точнее вчера, состоялся очередной Drupal Day в Краснодаре, основная тема – восьмое марта и заказчик из Омска.
Были два человека – я и Богдан. Женщин в нашем коллективе нет, поэтому праздник никто не испортил.
В программе мероприятиея были пиво и закуска, обсуждение важных вопросов таких как завышенные требования работодателей, XSS-уязвимости и то как порутать любой сервер.

Источник: http://www.drupal.ru/node/58552

XHprof – иерархический профайлер PHP от разработчиков Facebook


XHprof – это иерархический профайлер для PHP c HTML интерфейсом. Ядро написано на языке С (на уровне отчетов и интерфейса код уже весь на PHP), а для скачки доступно в виде экстеншина для PHP. Этот профайлер умеет собирать данные о использовании памяти, ресурсов процессора, количестве и последовательности вызовов функций, а так же inclusive time (время, потраченное на функцию и на все функции, вызванные из нее) и exclusive time(время, потраченное на функцию без учета времени на вложенные функции).

Дополнительно, XHprof поддерживает сравнение двух запусков (иерархический DIFF отчет) и умеет объединять несколько запусков для усреднения данных.

Читать полностью…

Источник: http://www.drupal.ru/node/58543

В помощь начинающим дизайнерам тем под Drupal


Заготовка в формате *.psd для создания дизайна под Drupal на базе 12-колоночной разметки по стандарту 960 Grid System. Надеюсь она окажется вам полезной. Файл к сожалению прикрепить не удалось, скачать его можно здесь

Источник: http://www.drupal.ru/node/58347

Модуль для подключения препроцессора Less

http://dl.dropbox.com/u/6717893/less.zip

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

Источник: http://www.drupal.ru/node/58323

Обновление с 6.x до 7.x версии

Перед тем как переходить на 7-ую версию друпала, ответьте на вопросы (самому себе):
Зачем вам это нужно? (если всё хорошо работает)
Настолько важен вам переход или стоит подождать? (к чему спешка..)
Возможно лучше пока остаться на 6-ой версии друпала? (Меньше проблем, всё более стабильно работает)

Обычно большинство разработчиков переходят на следующую версию через 6-12 месяцев (статистика приблизительная, по моим личным наблюдениям..). Например с 4-ой на 5-ую версию, составило примерно, от трёх до девяти месяцев, хотя кто-то, только через пару лет обновился

На данный момент, для 7-ой версии друпала имеется чуть более 1000 модулей. С одной стороны это много, с другой, ещё огромное количество модулей не адаптировано под 7-ую версию, а некоторые и не будут переделаны… (по разным причинам).

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

Скачайте все нужные вам модули и установите их локально вместе с 7-ой версией друпала! Проверьте на чистой установке, нормально они работают вместе или есть проблемы. Если есть возможность, сделайте чистую установку на своём хостинге (например, на поддомене), чтобы быть уверенным, что 7-ая версия друпала работает нормально на вашем хостинге и корректно работают модули.

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

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

Список модулей перенесённых в ядро друпал 7.x – http://drupal.org/node/895314

Кстати, можно отследить по функциональности модулей, что нового в 7-ой версии…

Если вы используте свои модули, то здесь – http://drupal.org/update/modules (eng) можете прочитать как их обновить.

Так же можете прочитать, как обновить свой дизайн сайта – http://drupal.org/update/theme (eng)

Перед переходом на 7.x версию друпала, обновите до последней версии Друпала 6.x ваш сайт. Если вы используете версию 5.x, то обновите её сначала до 6-ой версии!

Обновление.

1) Создайте резервную копию базы данных и всех папок и файлов. Сохраните в таком месте, чтобы не удалить случайно Резервную копию базы данных делайте сторонней программой, а не модулем работающим в друпале! Используйте, например – http://sypex.net/ru/

2) Войдите на сайт под пользователем ID 1 (это первый пользователь который был создан, при создании сайта).

3) Перейдите в раздел – admin/settings/site-maintenance и переведите сайт в режим технического обслуживания.

4) Перейдите в раздел – admin/build/themes и включите по умолчанию дизайн сайта – Garland.

5) Перейдите в раздел – admin/build/modules и отключите все модули которые не входят в ядро друпала (обязательные и дополнительные).

Если есть модули, которые вы не будете использовать в 7-ой версии друпала, то можете их удалить на странице – admin/build/modules/uninstall (тем самым очистив базу данных от лишних таблиц). Чем больше удалите, тем лучше )

6) Удалите все файлы и папки, за исключением папки ’sites’ и входящих в неё файлов и папок. Другие файлы, которые вы создали в других местах, тоже сохраните на месте.

Если вы делали изменения в файлах .htaccess или robots.txt, то вам придётся повтороно внести изменения уже в новых файлах.

7) Если вы удалили какие-либо модули из базы данных на странице – admin/build/modules/uninstall то можете удалить файлы этих модулей из папки – sites/all/modules или в зависимости от того, где они у вас находятся…

Остальные модули оставьте на месте, даже если они несовместимы с Drupal 7.x.

Загрузите текущую версию друпал 7.x на ваш сервер.

9) Сделайте если нужно изменения в файлах .htaccess и robots.txt

10) Удалите файл – default.settings.php он находится в папке – sites/default/default.settings.php

11) Сделайте файл settings.php доступным для записи, чтобы в процессе обновления можно было внести изменения, под версию 7.x

Если для режима технического обслуживания вы прописывали строку – $conf['maintenance_theme'] = ‘ваш_дизайн’; – то удалите строку.

12) Запустите update.php он находится по адресу http://вашсайт.ru/update.php

Если вы не можете получить доступ к update.php, то выполните следующие действия:

– Откройте в текстовом редакторе файл settings.php
– Найдите строку – $update_free_access = FALSE;
– Замените её на – $update_free_access = TRUE;
– После того как обновление будет сделано, замените обратно TRUE на FALSE

13) Сделайте резервную копию вашей базы данных, после окончания процесса обновления.

14) Замените и обновите модули, которые не входят в ядро друпала (с запуском update.php до включения модулей и после включения).

15) Убедитесь, что в строке $update_free_access файла settings.php прописано FALSE. Можете прописать строку – $conf['maintenance_theme'] = ‘ваш_дизайн’; с вашим дизайном, для режима технического обслуживания.

16) Зайдите на страницу – admin/reports/status и убедитесь, что нет ошибок.

17) Включите по умолчанию свой дизайн сайта. (конвертированный под 7.x).

18) Сделайте резервную копию базы данных.

19) Зайдите на страницу – admin/config/development/maintenance и включите сайт в рабочий режим.

20) Проверьте настройки, правильный вывод блоков и тому подобное…

Если вы столкнулись с ошибками или проблемами во время обновления, то:
– Обратите внимание на любые сообщения об ошибках.
– Восстановите сайт в предыдущее состояние с помощью резервной копии базы данных, созданной до начала процесса обновления сайта. Не пытайтесь делать дальнейшее обновление сайта, если возникли проблемы при обновлении!

Более подробную информацию по обновлению сайта, можно найти на странице – http://drupal.org/upgrade (eng)

Если в вас живёт дух экспериментатора и новатора, если вы отличный специалист и любите исправлять ошибки, если ваш темперамент и характер не даёт вам спокойно спать или просто “не дала” жена, то можете смело обновляться до 7-ой версии друпала

В остальных случаях, подождите до лета…

P.S. Если будете обновляться, отпишитесь, как получилось..

Attached poll “Вы будете обновляться до 7-ой версии?”.
Register or login to poll
Results:
Хочу обновляться, но нет нужных модулей: 4 голоса
Хочу обновляться, но боюсь косяков: 3 голоса
Не хочу обновляться, геморроя с этим много: 3 голоса
Уже обновился: 2 голоса
А нафига вообще это нужно?: 2 голоса
Буду обновляться ближе к лету: 2 голоса
Буду обновляться примерно в конце года: 1 голос
Буду обновляться в ближайшее время: 4 голоса

Источник: http://www.drupal.ru/node/58265

Увеличения скорости загрузки странички: Content Delivery Network (CDN) и распараллеливание загрузки данных

Что такое CDN?

Кому и почему нужно использовать CDN?

Инфраструктура CDN & Drupal

Пример расширенной настройки CDN в друпале

Распараллеливания загрузки

читать

Источник: http://www.drupal.ru/node/58264

Модуль Elysia cron

Скрипт cron.php используется в Друпале для для работы поиска(индексация контента), отправки писем подписчикам, сбора rss-фидов и т.д. – модули сами могут давать задания для выполнения по расписанию.

На drupal.org присутствует немалое количество модулей, которые позволяют тем или иным образом взаимодействовать со скриптом крона. Наиболее популярными среди них являются: SuperCron и Poormanscron. Первый имеет неплохой набор настроек для автоматизации и планирования крон-задач и является очень перспективным, а второй из всех настроек может похвастаться только интервалом запуска скрипта cron.php. На мой взгяд наиболее правильным и удобным является модуль Elysia cron – этот модуль, благодаря своей исключительной гибкости и юзабельности серьезно уделывает конкурентов.

Полная статья »

Источник: http://www.drupal.ru/node/58184

© 2009 Обзор CMS