goodboy: Блог

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

Добавление материалов пользователями

30 августа 2015 в 15:36

На сайте потребовалось, чтобы анонимные пользователи оставляли свои отзывы и они автоматически публиковались. Создал тип материала "Отзывы" с полями "Имя","Email","Раздел"(taxonomy_term) и "Отзыв". Дал пользователям права на создание ноды типа "Отзыв" и отчитался, что все сделано!

Но, оказалось не все так просто. Мне был предъявлен ряд запросов и недостатков:

  1. В заголовке, вместо "Создание материала Отзыв", необходимо "Добавить отзыв"
  2. Кнопку отправки в форме назвать "Добавить"
  3. Вывести специальное сообщение после создания материала
  4. Убрать "лишнюю" информацию в форме добавления ноды - информация о формате, подсказки...
  5. Использовать AJAX, вывод результатов валидации в том же окне

Формы в одностраничниках

26 августа 2015 в 15:11

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

Как сделать форму, используя только текстовый редактор? Последний раз подобное я делал в 1999 году.
Нужна клиентская валидация полей формы (в т.ч. на корректность введенного Email), красиво вывести ошибки без перезагрузки. Нужен sendform.php, на которое бы указывал action формы. В нем, серверная проверка вводимых данных, борьба со злоумышленниками, ботами... Далее, необходимо вводить в senform.php список Email получателей, формировать формат писем... Но самое страшное, что данные, введенные в форму, необходимо хранить и отображать при необходимости.

Программная установка offset во вьюсах

28 мая 2014 в 12:17

Понадобилось динамически назначать offset для views.

Вызываю вьюв /articles?page1=3, хочу перейти на 4-ю страницу.

function MYMODULE_views_pre_execute(&$view)
{

if ($view->name == 'articles' ) {

  $currpage = 0;
  if ( isset($_GET['page1'])) { $currpage = $_GET['page1']; }
  print "currpage=$currpage";

  if ($currpage > 0) {

      $items_per_page = $view->display[$view->current_display]->handler->view->get_items_per_page();
      $offset = $view->display[$view->current_display]->handler->view->get_offset();
      print "items_per_page=$items_per_page offset=$offset";
      if ($items_per_page>0) {
         $new_offset =  $currpage*$items_per_page;
         print "new_offset=$new_offset";

Как отредактировать содержимое мини-панели context_frontpage?

18 июня 2012 в 13:07

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

Webform: как сделать выпадающий список из значений view?

22 марта 2012 в 14:36

На D6 часто использовал webform с выпадающим списком, который формируется из значений вьюва. Для этого использовал модуль webform_viewreference.
На 7-ке не могу сообразить, как поступить, версии под D7 нет, да и эту версию друпала только осваиваю. Подскажите, пожалуйста.

Склонение названий месяцев при выводе даты

3 сентября 2011 в 15:32

Решил написать свою версию функции format_date(), позволяющую склонять названия месяцев на русском(и других языках): "3 сентября 2011".

<?php

//Склонение на русском языке
function month_declination_ru ( $long_month_name, $month  ) {
   $long_month_name = ( $month == 3 || $month == 8 ) ?
          $long_month_name . 'а' : drupal_substr($long_month_name, 0, drupal_strlen($long_month_name)-1) . 'я';  
   return $long_month_name;
}

//Склонение на украинском языке
function month_declination_ua ( $long_month_name, $month  ) {  
   if ( $month == 2 ) return  drupal_substr($long_month_name, 0, drupal_strlen($long_month_name)-2) . 'ого';
   if ( $month == 11 ) return  $long_month_name . 'а';
   if ( drupal_substr($long_month_name, -3) == 'ень' )
         return drupal_substr($long_month_name, 0, drupal_strlen($long_month_name)-3) . 'ня';

   return $long_month_name;
}

//Функция форматирования даты
function format_date2($timestamp, $type = 'medium', $format = '', $timezone = NULL, $langcode = NULL) {
  if (!isset($timezone)) {
    global $user;
    if (variable_get('configurable_timezones', 1) && $user->uid && strlen($user->timezone)) {
      $timezone = $user->timezone;
    }
    else {
      $timezone = variable_get('date_default_timezone', 0);
    }
  }

  $timestamp += $timezone;

  switch ($type) {
    case 'small':
      $format = variable_get('date_format_short', 'm/d/Y - H:i');
      break;
    case 'large':
      $format = variable_get('date_format_long', 'l, F j, Y - H:i');
      break;

Перенос базы пользователей (c Друпал5 на Друпал6) [Выполнено]

4 мая 2010 в 20:21

Возникла задача перенести базу пользователей с сайта на Drupal5 на сайт на Drupal6. База пользователей - это список пользователей с аккаунтами, ролями, профилями и картинками. Насколько я понял, это таблицы files, profile_fields, profile_values, role, users, users_roles.

Я установил на обоих сайтах модуль Backup&Migrate, экспортировал указанные таблицы (структуру и данные) и импортировал на сайте с Drupal6. Теперь на новом сайте эти таблицы имеют формат Drupal5, что приводит, например к проблеме при создании материала (из-за отсутствия поля signature_format в таблице users); да и непонятно, что будет при добавлении новых файлов или пользователей, так как в Drupal6 поля-идентификаторы в этих таблицах стали автоинкрементными; и т.д. Я надеялся, что update.php исправит ситуацию, но этого не произошло. Кроме как воспользоваться phpmyadmin и вручную править структуру в таблицах (или же вручную править INSERT в файле экспорта) ничего на ум не приходит. Но это как-то ненадежно. Прошу помощи у сообщества, возможно кто-то уже решал подобную задачу.

Галереи: мой опыт

19 марта 2010 в 11:41

Хочу для себя обобщить свой опыт создания галерей на Друпале. (Галерея представляет из себя двухуровневую структуру Альбом-Фотография:  Альбом состоит из фотографий.)
Галерею можно делать при помощи готовых модулей (http://drupal.org/project/modules?text=gallery) или связки Views(сниппет) + CCK ImageField (Image) + ImageCache +лайтбоксы(Lightbox2, Thiсkbox, …)+ jQuery плагины(jCarousel, Circle, Serial Scroll, …)
 
Способы конструирования галерей:

1. Альбом-нода, Фотография-поле

Альбом является нодой, а Фотографии множественным полем ImageField.
 
Достоинства: малое количество нод, встроенная сортировка фотографий
Недостатки: невозможность работать с фотографией как с нодой: сделать оценку, получить дату создания и т.д.

2. Альбом-нода, Фотография-нода

И альбом и фотография являются нодами. Связь между альбомом и нодой осуществляется при помощи CCK Node Reference ( Фотография ставит ссылку на Альбом ).  Кроме того, что для фотографии можно указать несколько альбомов, очень легко переносить фотографию из одного альбома в другой.

Мои инструментарий

24 февраля 2010 в 11:55

Сделав некоторое количество сайтов на Друпал, заметил за собой повторяемость в подходах к созданию сайтов. Этот пост - памятка для самого себя, а не поучение "вот, смотрите, как надо делать".
Однако, буду рад услышать конструктивную критику.

  1. Модули
  • Базовые: Pathauto (+Tokens), CCK, Views
  • Изображения: Imagecache (+ImageAPI), Lightbox2
  • Профиль пользователя: Content Profile, Auto Assign Role, Automatic Nodetitles
  • Редактор: Wysiwyg, IMCE (+IMCE Wysiwyg API bridge), Excerpt
  • Рейтинг: FiveStar (+Voting API)
  • Прочее: Date, jQuery Update
  • Темизация и форматирование
    • Стандартную ленту материалов на главной не вывожу. Чтобы ее скрыть - делаю пустой материал типа Story, и затем пустой node-story.tpl.php
    • Display fields для полей CCK не использую - делаю Hidden. Все форматирование вывода производится в шаблонах темы (в том числе, шаблонах Views)
    • Значения Title и Alt изображений - заголовок ноды. Изображение является ссылкой на ноду (кроме вывода непосредственно в ноде)
  • Программирование
    • Создаю модуль myapi, куда помещаю собственные функции.
    • Использую сниппеты для блоков: программный вывод views, сниппеты типа "Статьи по теме"
  • Экспорт и трансляция
    • RSS (Яндекс, Google), LiveJournal, Twitter

    Public Download Count для 5-го Друпала

    18 июня 2009 в 18:17

    Появилась необходимость подсчитывать количество закачек файлов. Модуль Download count не подошел - побоялся перехода с Public на Private способ закачки. Нашел Public Download Count, а он только для 6-ки, сайт на 5-м Друпале. Никто не собирается ближайшим часом переводить на 5-й этот модуль? Я бы поучаствовал в тестировании.

    Создание произвольного XML [Решено]

    22 мая 2009 в 13:54

    Понадобилось создать уж очень нестандартный RSS - проще сделать руками, чем переделывать views_rss или views_yandex_rss.
    Содержимое xml я сгенерирую сам, непонятно - как добиться, чтобы Друпал при обращению к url выдал xml.
    Могу ли я сделать это сниппетом (используя drupal_set_header('Content-Type: text/xml; charset=utf-8'); ) или писать модуль ( делая hook_menu ).

    Пока теряюсь в догадках. Может, кто делал - подскажите.

    Обновление при переезде

    25 марта 2009 в 23:51

    Решил переезд на другой хостинг совместить с обновлением версии.
    Сейчас 5.5, хочу установить свежий 5.16

    Что планирую сделать:

    1. На новом месте инсталлировать Drupal 5.16
    2. Поставить модуль Backup and Migrate
    3. Скопировать модули (sites/all) и темы
    4. Сделать бекап на старом сайте при помощи Backup and Migrate
    5. Восстановить базу из бекапа на новом сайте при помощи Backup and Migrate
    6. Выполнить update.php

    Надеюсь, ничего не упустил. Буду признателен за замечания и уточнения.

    Проблемы с VPS на мастерхост

    18 февраля 2009 в 19:06

    С утра 17 февраля наш сайт ( виртуальный сервер на masterhost.ru ) неожиданно перестал работать. Одновременно утерян доступ к панелям управления сервера . Саппорт отвечает на один запрос из десяти в духе "у вас что-то не так". Есть смутные подозрения, что это связано с переездом на европейские площадки.

    UPD: Похоже, мне одному не повезло. Действительно, при миграции, данные сайта (файлы и база данных) были безвозвратно утеряны мастерхостом! Был сайт - и нет его. Нормально?

    Создаются директории с owner "apache", нет прав на запись

    16 января 2009 в 17:59

    В процессе эксплуатации сайта, Друпал создает директории с правильными правами, но с owner "apache", group "apache". Из-за этого не работает загрузка файлов через IMCE, Imagecache и прочее. Удалить директорию не хватает прав, можно только переименовать. Использую .htaccess от поставки Друпал, добавил только memory_limit.

    Как и что мне сконфигурировать на VPS, чтобы директории создавались с owner "myclient" и ушла проблема создания/копирования файлов?

    (Хостинг masterhost, панель Plesk, ОС Fedora)

    Pager для вывода FAQs

    22 декабря 2008 в 15:00

    Установил модуль FAQ. Настроил вывод на странице и в блоке, все замечательно работает. Но, со временем, количество вопросов весьма увеличилось и страница стала слишком длинной (на мой взгляд). Хотелось бы прикрутить pager к выводу в странице, никак не соображу, как сделать через темизацию модуля FAQ. Можно, конечно, отказаться от наработок модуля и использовать view, но как-то это неправильно, мне кажется.

    Может, кто сталкивался с подобной проблемой?

    Функция для разбивки массива

    28 октября 2008 в 15:02

    Сделал для своих нужд функцию, которая разбивает массив на несколько подмассивов(колонок). Принцип: "из двух соседних колонок, длина левой не меньше длины правой". Например, массив из 10 элементов разбивается на 3 части как 4-3-3, из 11 элементов как 4-4-3.

    /*
    Разбить массив arr на n частей

    Возвращает массив res, содержащий части исходного массива
    */


    function array_divide($arr, $n) {

    //Проверка входных параметров и подготовка
    $res = array();
    $cnt = count($arr);
    if ( $n < 1 || $cnt < 1) return $res;

    $part = intval( $cnt / $n);
    $rest = $cnt - $part*$n;

    //Определение массива интервалов
    $intervals = array(0 => 0);
    for ( $i=1; $i<$n; $i++ )
      $intervals[$i] = $part*$i;

    while ( $rest > 0 ) {
      for ( $i=1; $i < count($intervals); $i++ ) {
          $intervals[$i]++; $rest--;
      }
    }
    $intervals[] = $cnt;

    //Заполнение результирующего массива
    for ( $i=0; $i < count($intervals)-1; $i++ )
      $res[$i] = array_slice( $arr, $intervals[$i], $intervals[$i+1]-$intervals[$i] );    

    return $res;
    }

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

    $test = range(1,10);
    print_r ( array_divide($test,3) );

    Не ругайте сильно, если изобрел велосипед ))
    Если будет желание - протестируйте.

    В списке блоков перемешиваются регионы и веса

    14 октября 2008 в 16:36

    Начиная с определенного момента, после редактирования существующего или создания нового блока, иногда перемешиваются регионы и веса для блоков. После того, как задать веса и регионы заново, все работает. Аналогичный случай описан в http://drupal.org/node/213446

    Никто не сталкивался с подобным?
    Установлена 5.7

    Как обустроить wijering player

    16 мая 2008 в 18:18

    Начал осваивать флеш, установил Flashnode, Swtools. В комплект SWTools входит модуль Wijering Flash, который умеет работает с Jeroen Wijering's Media Player. Вот только настройки Flashvars модуля не совпадают с настройками Flashvars плейера. В частности, в модуле отсутствует параметр screencolor, который определяет цвет окна (по умолчанию он черный).

    Отчет о проделанной работе

    28 февраля 2008 в 23:11

    Итак, первый сайт на Drupal, в целом, готов.

    Что понадобилось:

    1. Taxonomy+CCK+Views
    2. TinyMCE
    3. 4 сниппета + код для View(Заголовки,Подвал,ArgumentCodeHandling)
    4. Собственные функции (в отдельном модуле)
    5. Переделка шаблона

    Слава Друпалу!

    Вопросы по сбору новостей

    17 февраля 2008 в 17:42

    Создал ленты, категории, настроил cron - все работает, на первый взгляд.

    Настроил: /admin/content/rss-publishing
    Количество элементов на ленту - 10

    На admin/content/aggregator/settings
    не понял, что нужно настраивать.
    "Количество элементов, которое будет отображаться в каждой ленте или категории на сводных страницах категорий и лент." Что за сводные страницы?

    "Удалять элементы старше чем"
    Для разных лент понятие устаревания разное. Что же я должен выбрать?

    Место для собственных функций и переменных

    26 января 2008 в 21:22

    Написал некоторое количество PHP-кода, образовались собственные пользовательские функции и глобальные переменные.
    Подскажите, где лучше их разместить? Понимаю, что можно куда-нибудь типа includes/common.inc, но не хотелось бы получить проблемы при обновлении версии Друпал, да и с UTF-8 не хочется заморачиваться. Вероятно, есть какой модуль или соответствующая настройка; подскажите,пожалуйста. Спасибо.

    Первые шаги

    12 января 2008 в 14:03

    Установил Drupal 5.5

    Сделал настройки, закачал темы.

    Начитался статей: установил модули CCK, taxonomy_fields, cck_taxonomy, views - это и было основной ошибкой. Самое главное - не связываться с модулями, это как порочная практика использования сторонних компонентов при программировании на Delphi(CBuilder). Модулей много, настройки их сложны, описания туманны...

    Хорошо, что набрел на сниппеты, поглядел Drupal API - все проще простого! Теперь только найти окошки, куда писать код - и можно что-то создать на Drupal

    С Taxonomy вроде разобрался. Зачем нужно CCK - пока не понял.