Показаны сообщения с ярлыком Программирование. Показать все сообщения
Показаны сообщения с ярлыком Программирование. Показать все сообщения

пятница, 25 ноября 2011 г.

Доводим до ума Media Gallery

Выбирая галерею для Drupal 7, остановилась на Media Gallery. Галерея хороша, но очень сырая, как, в принципе, и многие модули для Drupal 7 на данный момент. Сначала все было вроде неплохо, потом, в какой-то момент я заметила, что при редактировании медиа-файлов не отображаются превьюшки, кроме того, мне совсем не понравился внешний вид галереи, и наконец, самое интересное: в настройках прав модуля Media есть только "просмотр медиа" и "редактирование всех медиа", что автоматически переводит эту чудесную галерею в разряд тех, что используются для персонального блога. Ну или же если у вас на сайте все админы. Тут я решила удалить галерею и все модули, однако и это оказалось непросто: отключить модуль Media невозможно, т.к. он необходим для ядра из-за созданных им полей, а поля, в свою очередь, заблокированы модулем и удалить их тоже нельзя. Еще раз пересмотрев и попробовав имеющиеся модули для семерки, я убедилась, что альтернативы собственно и нет, и решила доводить модуль до ума.

1. Разграничение прав - это первоочередной вопрос. Как я поняла из обсуждения на Drupal.org, эта возможность добавлена в ветке 7.x-2.x модуля Media, которая на данный момент нестабильна. Ждать выхода новой версии конечно не хочется, так что добавим патч, который можно скачать здесь. Этот патч подходит для версии 7.x-1.0 модуля Media, и добавляет несколько прав: "редактировать свои медиа", "загружать медиа", "просматривать библиотеку". Последний пункт позволяет скрыть от пользователей вкладку с библиотекой, чтоб они не могли видеть все загруженные медиа-файлы. Только одно замечание к этому патчу: в файле media.browser.inc должны быть строки (у меня под номером 308 и 309), которых в моем модуле нет:
'types' => $types,
'multiselect' => $multiselect,
Я просто закоментировала их. После этого жизнь стала налаживаться. ))

2. Перелистывание фотографий в Colorbox. Следующее, что я поправила - неприятная особенность работы Colorbox, а именно: нажатие на фотографию при просмотре в Colorbox вместо привычного перехода на следующий файл отрывает страницу просмотра фотографии, в которой вообще особо нет никакого толка, раз нельзя оценивать и комментировать фотографию. Решение уже есть, берем его отсюда.
  1. В папке вашей темы создайте подпапку js (если ее еще нет) и в ней - файл с названием media_gallery_hack.js следующего содержания:
    /*
    Redirects lightbox image click to advance to next image instead of opening image details.
    Via http://drupal.org/node/1088738#comment-4362570
    code from #12
    Posted by stephandale on April 10, 2011 at 12:26pm
    */
    (function ($) {

    Drupal.behaviors.initColorboxDefaultStyle = {
    attach: function (context, settings) {
    $(document).bind('cbox_complete', function () {
    $('.lightbox-stack .gallery-thumb-inner a').click(function(e) {
    e.preventDefault();
    $.colorbox.next();
    });
    });
    }
    };

    })(jQuery);
  2. В файл .info вашей темы добавьте строку scripts[] = js/media_gallery_hack.js.
3. Превьюшки, и еще раз превьюшки. Столкнулась с неприятной особенность: превьюшки фотографий во время просмотра галлереи у меня меняют размер при изменении размеров окна браузера. Оказывается, превьюшки имеют размер в процентах - это нужно для организации распределения фотографий в определенное количество столбцов, которое указывается при создании галереи. На фиксированном шаблоне, каким является стандартный, это незаметно. А вот на резиновом, как у меня, получается не очень красиво. Первой мыслью было перекрыть стили и убрать заданную в процентах ширину. Правда, тогда функционал с колонками перестал бы работать, кроме того, я заметила странный баг в хроме, который не смогла объяснить. Вторая мысль - зафиксировать ширину контейнера, в котором находятся превьюшки. Но тогда на больших мониторах образуется пустота, что тоже не очень приятно. В итоге пока ограничилась самый доступным решением: в админке, в настройках отображения медиа-файлов, установила для отображения миниатюры галереи картинку побольше - пресет media_gallery_thumbnail вполне подходит.


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

4. Сортировка фотографий - работает без проблем, но в журнале регистрируется сообщение: Notice: Undefined variable: offset в функции media_gallery_reorder_gallery() (строка 220 в файле...). В файле media_gallery.pages.inc я нашла указанное место и определила переменную.
$offset = 0;
if (!empty($_POST['page'])) {
$page = array_pop(explode(',', $_POST['page']));
num_per_page = $gallery->media_gallery_columns[LANGUAGE_NONE][0] ['value'] * $gallery->media_gallery_rows[LANGUAGE_NONE][0]['value'];
$offset = $num_per_page * $page;
}
5. Необходимые библиотеки для plupload и colorbox. Это не проблема, а просто результат невнимательности. Для работы этих модулей необходимы библиотеки, которые в поставку модуля не входят, их нужно отдельно скачивать с сайта. Так что если не работает один из этих модулей - возможно вы забыли скачать библиотеки.

6. Локализация текста ссылки на загрузку оригинального файла. Эту проблему я так и не решила - просто удалила перевод и оставила ссылку англоязычной. Лучше, чем абракадабра. )) Вернусь к этому позже.

Вот и все, обнаруженные на данный момент, проблемы - теперь имею вполне работоспособную галерею. По необходимости буду дополнять пост.

среда, 19 января 2011 г.

Ограничение на количество создаваемых материалов

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

Для примера возьмем материал "Фотография" и две группы "Зарегистрированный пользователь" и "VIP". Пусть обычный пользователь может добавлять 7 фотографий в неделю, а привелигированный - 14.

Для решения задачи нам понадобится модуль Node Limit Number версии 2.х. На данный момент нет стабильного релиза, но т.к. альтернативы я не вижу, я взяла единственную доступную версию 6.x-2.0-beta1. Эта версия интегрирована с модулем Rules, который вам тоже прийдется установить. Это очень полезный модуль, я уверена, он вам пригодится и для других целей.

Вы не найдете никаких настроек для Node Limit Number, вместо этого, появится новое событие, которое можно задать в качестве критерия при создании нового правила. Найдем в админразделе Triggered rules (Запланированные правила) и добавим новое правило, где в качестве события выбираем "Check a Node limit".

Добавим несколько состояний:
  • Пользователь имеет роль "Зарегистрированный пользователь"
  • Материал имеет тип "Фотография"
Следующее состояние, которое мы добавим, собственно само ограничение "Reached limit for the node type". Здесь можно указать количество материалов и временные рамки.


Но созданное правило будет срабатывать для всех пользователей, т.к. каждый пользователь входит в эту гуппу, даже есть он также состоит и в другой. Поэтому я указала, что пользователь не имеет роль "VIP". Для этого при создании состояния надо отметить галочку "Negate".

Теперь остается добавить желаемое дейтвие, которое выполнится при срабатывании события. Я выбрала "Show a configurable message on the site" и затем перенаправление на главную страницу.

Правило для группы VIP создается анологично, с тремя состояниями:
  • Пользователь имеет роль "VIP"
  • Материал имеет тип "Фотография"
  • Материалов - 14, временной промежуток - неделя
Все вышеизложенное было сделано на Drupal 6 для сайта http://canon-fan.com

пятница, 17 декабря 2010 г.

Максимальное разрешение для загружаемых изображений

Одна из первых серьезных проблем, с которыми я столкнулась - невозможность ресайза картинок с высоким разрешением. Когда второй мой сайт на Drupal был уже почти готов, я перенесла его на глобальный хостинг, чтоб продолжить тестирование, и поняла, что ресурсов shared-хостинга едва хватит на ресайз картинки 2000х2000 пикселей. Я решила поставить ограничение на разрешение загружаемых картинок, однако Drupal работает так, что картинки, превышающие максимальное разрешение, просто уменьшаются, что как раз и является проблемой.

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

Нам прийдется всего лишь закомментировать несколько строчек, это небольшое изменение и его легко отменить. Заходим в каталог модуля и открываем файл filefield.module. Находим функцию filefield_validate_image_resolution и комментируем две ветки условия, в которых производится попытка ресайза картинки:

// Try resizing the image with ImageAPI if available.
/* elseif (module_exists('imageapi') && imageapi_default_toolkit()) {
$res = imageapi_image_open($file->filepath);
imageapi_image_scale($res, $max_width, $max_height);
imageapi_image_close($res, $file->filepath);
$resized = TRUE;
} */
// Try to resize the image to fit the dimensions.
/* elseif (image_get_toolkit() && @image_scale($file->filepath, $file->filepath, $max_width, $max_height)) {
$resized = TRUE;
} */
Оставшая ветка как раз и будет возвращать необоходимое нам сообщение об ошибке.

Кроме того, я немного подправила информацию о максимальном разрешении, которая выводится возле поля для загрузки файла. В функции filefield_validate_image_resolution_help я нашла строку текста "Images larger than @max_size pixels will be scaled" и заменила на "Maximum allowed resolution: @max_size pixels".

Вот и все изменения!


Хочу также обратить внимание на то, что при использовании FileField для CCK-поля, максимальные значения нужно указывать в настройках этого конкретного поля (Администрирование - Типы материалов - Ваш_тип - Управление полями), а не в общих настройках "Загрузки файлов".

суббота, 31 января 2009 г.

Знакомьтесь, symfony

Что такое symfony?
Symfony — фреймворк с открытым кодом, полностью написанный на PHP5. Использование фреймворка позволяет создавать более структурированный, читаемый код и упрощает программирование хотя бы потому, что набор сложных операций часто можно заменить одной строчкой кода. Symfony основан на идее MVC (MVC pattern) и создан для упрощения разработки веб-приложений. Фреймворк включает в себя множество инструментов и классов, призванных максимально сократить время разработки сложного веб-приложения. Также symfony автоматизирует наиболее популярные и частые задачи, что позволяет разработчику уделить больше внимания особенностям данного конкретного проекта. (из официальной документации)
Основные возможности Symfony:
  • MVC архитектура
  • ORM Propel
  • Специальные средства, упрощающие создание шаблонов страниц
  • Управление многоуровневым кэшем (например, можно кэшировать разные части View)
  • Наличие development и production среды (development/production environment). Причем их может быть несколько.
  • Scaffolding — автоматически генерируемый модуль для управления содержимым таблицы из базы данных
  • Человеко-Понятные URL (ЧПУ)
  • Многоязычность (i18n)
  • Поддержка AJAX
  • Еще много чего
Symfony можно установить как на Unix-систему так и на Windows. Все что нужно — установленный на машине веб-сервер и PHP5. Поскольку для работы с БД используется Propel, то отсюда поддержка MySQL, PostgreSQL, Oracle, MSSQL и целого ряда других СУБД. Плюсом является также море конфигурационных файлов, благодаря которым разработчик может контролировать почти все. В Symfony встроены специальные инструменты для тестирования, отладки и автоматического создания документации. (цитата отсюда)

Но начну по порядку. Узнала о symfony я совсем недавно, около полугода назад. Перед нами встал вопрос о выборе фреймворка для нового проекта. Предпочтителен был РНР, также среди требований были: постоянная поддержка со стороны разработчиков, обновления, удобная работа с Ajax и т.д. Вот тогда-то одни человек из нашей команды и заметил symfony. На деле фреймворк оказался очень прозрачным, легким в освоении, быстрым в разработке. Единогласный выбор нашей команды пал на него.

На данный момент существует три стабильные версии symfony. Сравнить версии, просмотреть историю изменений и скачать можно здесь. Основное различие между 1.0 и 1.1 – работа с формами. Различия серьезные и я настоятельно рекомендую работать с версией не ниже 1.1. Документация по работе с формами даже вынесена в отдельную книгу. К сожалению, в электронном виде доступны только некоторые, основные главы. Однако постепенно книга дополняется сначала было только 4 главы, теперь уже 6. В версии 1.2 основные изменения претерпели система роутинга и генератор админской части – он был полностью переписан.

Для изучения азов разработчиками созданы два учебных проекта: самый первый - Askeet для версии 1.0 и более новый Jobeet для версии 1.2. Оба проекта представляют собой пошаговые инструкции и рассчитаны на 24 часа. Именно такое время разработчики считают достаточным для изучения азов фреймворка. Лично я пока работаю с версией 1.1 и для изучения придумала свой собственный проект, который уже практически завершен и скоро выйдет в свет.

Моменты, которые меня очень порадовали:
  • Автоматизация разработки экономит массу времени. Например, для создания нового модуля вам понадобятся 4 новые папки и как минимум 3 новых файла (в силу архитектуры MVC). В symfony вам не придется создавать их вручную.
  • Удобство работы с формами. Конечно, многое вам придется доработать самим, но основная работа выполняется автоматически. Кроме того, очень легко обновить все формы в соответствии с изменениями в базе данных.
  • Оказалось довольно большое сообщество, в том числе и русскоязычное. Если возникнут проблемы, всегда можно найти ответ на форуме.
Есть и большой минус - документация. В книгах все описано очень сжато, некоторые моменты вообще упущены. С переводом на русский язык тоже слабовато. Перевод идет медленнее, чем выпуск новой версии фреймворка.

Если вы колеблетесь между выбором symfony или ZendFramework, то загляните сюда и сравните структуры фреймворков. По крайней мере, если вы – новичок, то начинать с Zend’а я бы не советовала.

Для тех, кто работает с Eclipse – существует плагин Symfoclipse. А для поклонников NetBeans - радостная новость - поддержка symfony появится в NetBeans 7.0.

Возможно, вы ничего не слышали про symfony, однако за рубежом он довольно популярен. Хотя сейчас уже он набирает обороты и у нас – некоторые харьковские конторы тоже уже работают с symfony. Если вы заглянете сюда, то увидите довольно внушительный (и это далеко не полный) список проектов на symfony – кстати, среди них - Yahoo! Bookmarks.

Ссылки, которые могут вам пригодиться.
http://www.symfony-project.org/ - сайт symfony.
http://symfony.org.ua/ - русскоязычный сайт.
http://trac.symfony-project.org/wiki/Documentation/ru_RU - наиболее полное собрание переводов.
http://www.symfony-project.org/plugins/ - поиск плагинов здесь.
http://symfony.artsofte.ru/ - русскоязычный блог разработчиков symfony.
http://propel.phpdb.org/docs/user_guide/ - документация Propel.
http://habrahabr.ru/blogs/symfony/20814/ - пост на хабре - Symfony: Как начать. + там есть много ссылок.
http://groups.google.com/group/symfony-ru - русскоязычная google-группа.

понедельник, 26 января 2009 г.

Для тех, кто хочет научиться веб-программированию, но не знает с чего начать.

В этом посте попытаюсь описать свои начинания как web-программиста.

Начало: принятие решения.
В одно прекрасное солнечное утро вы просыпаетесь с твердой уверенностью: я буду рнр-программистом! Но что для этого нужно?

Инструменты.
Оговорим сразу некоторые условия: вы работаете в ОС Windows, имеете базовое понятие о программировании (построение алгоритмов, функции, ООП). Чтобы заставить работать рнр-скрипт, вам понадобится Apache, PHP и MySQL. Убъем сразу трех зайцев - поставим Денвер.
(На самом деле использование готовых связок считается плохим тоном и одной из ошибок начинающих программистов. Но лично я не вижу в этом ничего плохого, и тем более не видела тогда, когда только начинала и даже не знала толком, что такое Apache. За всю практику мне до сих пор ни разу не пришлось ставить все это по отдельности. Например, на работе этим занимался системный администратор, как и положено администратору, а я, как программист, приходила на работу и писала код. Также крайне желательным считается разработка на той системе, на которой будет в дальнейшем работать сайт. Почти уверенна, что это будет не windows. Желающие могут поставить себе вторую ось или виртуальную машину.)
Джентльменский набор Web-разработчика («Д.н.w.р», читается «Денвер») — проект Дмитрия Котерова, набор дистрибутивов (Apache, PHP, MySQL, Perl и т.д.) и программная оболочка, используемые Web-разработчиками для разработки сайтов на «домашней» (локальной) Windows-машине без необходимости выхода в Интернет.
Если установка прошла успешно, у вас все готово для работы. Ой, чуть не забыла. Текстовый редактор. Какой угодно. Я пользуюсь PSPad.

Что будем писать?
Писать можно все, что душа пожелает. Начните с простых учебных примеров и какого-нибудь ресурса для начинающих. Когда изучите основы, вам будет достаточно официальной документации РНР в качестве справочника. Существует множество ресурсов по РНР-программированию. Вы можете выбрать в принципе любой (какой посоветует друг; тот, который найдете первым или тот, дизайн которого вам больше понравится), тем более постоянно появляется что-то новое, документация, по которой училась я уже не так актуальна. Лично я для начала использовала лекции интернет-университета INTUIT. Там есть бесплатные курсы, довольно простые и понятные. Надолго меня не хватило правда - решила, лучше (а главное - интереснее) учится на практике и устроилась на работу. Но это как повезет конечно, и смотря у кого какие цели. Мой совет - придумайте сами для себя какое-то интересное задание и по мере выполнения осваивайте необходимые приемы. У меня (помимо работы) таким был мой дипломный проект "Разработка системы для проведения тестирования".

Настройка денвера для работы в локальной сети.
(Это не совсем относится к начинаниям, но все-таки.)Сейчас становится нередкой ситуация, когда в доме несколько компьютеров, объединенных в сеть. Денвер можно настроить для работы по сети. Для этого в папке проекта, с которым хотите работать, создайте файл .htaccess и добавьте в него 2 строки:
## Файл /home/mysite/.htaccess
# dnwr_ip 192.168.0.1
# dnwr_host mysite
Думаю, понятно, что нужно писать IP вашего компа и имя вашего сайта. Затем на другом компе, с которого вы собираетесь работать с проектом, откройте файл C:\WINDOWS\system32\drivers\etc\hosts и добавьте в него следующую строку:
192.168.0.1 mysite
IP и имя сайта те же, что и в .htaccess. Теперь вы сможете обращаться к сайту с обоих компов вот таким образом: http://mysite/.

Желаю всем начинающим удачи.