пятница, 15 июля 2016 г.

Выравниваем блоки значков категорий курсов в Essential Moodle Theme

Если Ваш Moodle-сайт оформляется темой Essential, то Вы могли наверняка заметить, что блоки значков категорий у Вас разной высоты, если название категории достаточно длинное и состоит из нескольких слов. Однако, хотелось бы видеть эти блоки одинаковой высоты. Что делать? Ответ один: править код темы!

Отключаем значок загрузки при клике на категорию.
Открываем файл core_course_renderer.php в папке classes темы.
Находим coursecat_include_js() и комментируем весь блок if:

//  if (intval($CFG->version) >= 2013111800) {
            // Make sure JS file to expand category content is included.
       //     $this->coursecat_include_js();
       // }

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

Добавляем файл скрипта, выравнивающего блоки
В этом же файле добавим ещё одну строку в функции public function __construct(moodle_page $page, $target):
после
$theme = theme_config::load('essential');
вставим строчку
print "<script type='text/javascript' src='/theme/essential/javascript/hei.js'></script>";

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

public function __construct(moodle_page $page, $target) {
        parent::__construct($page, $target);
        static $theme;
        if (empty($theme)) {
            $theme = theme_config::load('essential');
            print "<script type='text/javascript' src='/theme/essential/javascript/hei.js'></script>";
        }
        $this->enablecategoryicon = (!empty($theme->settings->enablecategoryicon)) ? $theme->settings->enablecategoryicon : false;
    }

Обратите внимание на название файла скрипта: hei.js и его расположение: /theme/essential/javascript/

Создаём скрипт hei.js
window.onload = function() {
setTimeout(function() {
var subcatDivs = document.getElementsByClassName("categoryname");
var maxHCat = 0;
for (var cat_h = 0; cat_h < subcatDivs.length; ++cat_h) {
if (maxHCat < subcatDivs[cat_h].clientHeight) {
maxHCat = subcatDivs[cat_h].clientHeight;
}
}
for (var cat_h = 0; cat_h < subcatDivs.length; ++cat_h) {
subcatDivs[cat_h].style.height = maxHCat + "px";
}
}, 100);
}


Задержка в скрипте нужна, чтобы после загрузки страницы было время для расчёта высоты блоков. Сохраняем данный файл в /theme/essential/javascript/.

Костыли хака
Во время использования хака заметил следующее: изменяется размер некоторых полей ввода. Необходимо их поправить. Файл essential.css в папке style. К сожалению, структура файла минимизирована, поэтому нам нужно будет выполнять поиск в файле (не привязываясь к строкам).
Ищем login_password. Добавляем в строку (выделено полужирным): login_password,.block_login input#login_username{width:95%; height:30px}
Ищем coursesearchbox. Добавляем в строку: coursesearchbox label{display:inline}#coursesearchbox{height:30px}
Ищем adminsearchquery. Добавляем в строку: #adminsearchquery{max-width:92%; height:30px}

Замечание: при обновлении темы Вам придётся повторять те же операции с файлами вновь и вновь.

среда, 13 июля 2016 г.

Выпрямляем ссылки на облачных сервисах

Часто может случиться ситуация, когда заказанный Вами хостинг удовлетворяет всем Вашим требованиям, кроме одного: Ваш проект разросся до масштабов Солнечной системы и на нём постоянно не хватает места или оно ограниченно тарифным планом, и постоянно не хватает средств на увеличение объёма диска хостинга. Что делать в таком случае? Искать спонсора для своего проекта или решать проблему нехватки места самостоятельно?

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

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

Google Drive
Загрузив файл на GoogleDrive, Вы можете его сделать доступным для всех, кто имеет ссылку на него или разрешить читать/редактировать файл определённому кругу людей. Понятно, для того, чтобы совмещать хостинг с "облаком", нам необходимо открыть доступ к файлу по ссылке. Однако, в таком виде нельзя использовать ссылку для хостинга (если Вы хотите использовать, например, картинку для фона), она не будет прямой (откроется в системе GoogleDrive). Как быть?
Изучаем ссылку, которая автоматически генерируется системой... Например, получили такую ссылку:
https://drive.google.com/open?id=0B_DJFjdH0anuVzZaRXVRbkVkOVk

Копируем код ссылки (после id=), вот он: 0B_DJFjdH0anuVzZaRXVRbkVkOVk

Для использования на хостинге используем прямую ссылку к файлу в виде
https://drive.google.com/uc?export=download&confirm=no_antivirus&id=0B_DJFjdH0anuVzZaRXVRbkVkOVk

Теперь ссылка на файл прямая.
Вот её результат:

DropBox
Аналогично GoogleDrive, загружаем файл в свой DropBox, жмём кнопку "Поделиться", в открывшемся всплывающем окне создаём ссылку на файл и копируем её в буфер обмена.
Получим, например, такую:
https://www.dropbox.com/s/31csv7gzllp1mpe/cover_1453235345-630x315.jpg?dl=0

Немного изменим полученную ссылку:
https://dl.dropbox.com/s/31csv7gzllp1mpe/cover_1453235345-630x315.jpg?dl=1

Это и есть наша прямая ссылка на файл.
А вот и файл по этой ссылке:

OZ.by - не только книжный магазин

пятница, 8 июля 2016 г.

О кодировке в Moodle

Как-то моя коллега обратилась за помощью: разобраться, почему созданный в текстовом редакторе тест не импортируется в Moodle. Синтаксис вопросов множественного выбора с одним вариантом ответа правильный, а Moodle в ходе импорта выдаёт ошибку записи в базу данных, импортируя при этом 2 вопроса из 20.

Начали разбираться, в чём причина. Первое, о чём подумали – о кодировке файла; второе – о кодировке базы данных сервера. Показательно, что Moodle всё же импортировал 2 первых вопроса. Поэтому вариант №2 отпал сам собой – если бы была ошибка в кодировке БД, то тест не импортировался бы полностью.

Рассмотрим первый вариант.
Открываю присланный мне файл в Блокноте – ошибок не вижу. Пытаюсь импортировать в своём Moodle на своём сервере – та же самая проблема. Два первых вопроса импортируются, остальные не хотят! Что делать? Снова лезть в файл и искать ошибки. И вскоре они были найдены. Итак, ниже описание проблемы и её решение.

Пришлось немного повозиться, чтобы понять, что присланные файлы не соответствуют кодировке БД сервера. Присланные файлы были в кодировке ANSI (Windows, чтобы было понятнее), а БД сервера – в кодировке UTF-8. Что это значит? А это значит, что в файлах используется разный набор символов (кодировка UTF-8 богаче набором символов, но многие коды ANSI не соответствуют кодам UTF-8). Как это определить? Можно пытаться на глаз, а можно воспользоваться расширенным блокнотом Notepad++, чем я и не замедлил воспользоваться.
При загрузке файла в Notepad++ и смене кодировки на UTF-8 нечитаемые символы сразу проявляются, это видно на изображении ниже:


Набор этих символов отсутствует в кодировке UTF-8 и они заменяются на последовательности типа x92 и т. п. (выделены на чёрном фоне).

Наша задача заменить все такие символы. В нашем случае, это троеточие в системе ANSI (обратите внимание на то, что три точки в ANSI могут быть стандартными точками, а могут быть и отдельным символом, укороченным троеточием (увидеть это можно, если в Word напечатать три точки подряд. Программа автоматически преобразует три точки в символ троеточия)). Его нужно заменить на троеточие в UTF-8, то есть просто поставить три точки (...) в блокноте Notepad++.
И ещё один код соответствует символу апострофа с неверным наклоном (апостроф в UTF-8 - прямой). Заменяем его на '.
Для замены символов в Notepad++ переходим обратно на систему кодировки ANSI и жмём комбинацию клавиш Ctrl+H (стандартная комбинация клавиш поиска и замены) или вызываем команды меню Поиск – Замена…. Копируем первый символ для замены, затем вставляем заменяемые символы. Жмём «Заменить всё». То же самое производим со вторым (и, если надо, последующими) символами.


Ну вот вроде бы и всё, что нужно знать администратору Moodle для исправления ошибок импорта.