Moodle: различия между версиями

Содержимое удалено Содержимое добавлено
м <source> -> <syntaxhighlight> (phab:T237267)
Строка 30:
Для создания ''блока'' в Moodle в большинстве случаев достаточно написать один скрипт. Для начала в директории <tt>blocks/имя_блока/</tt> создаем наш скрипт <tt>''имя_блока''</tt>. Например если наш блок будет носить имя <tt>''simplehtml''</tt>, путь к скрипту будет иметь вид <tt>/blocks/simplehtml/'''block_simplehtml.php'''</tt>. Теперь начнем писать сам код:
 
<sourcesyntaxhighlight lang="php">
<?php
class block_simplehtml extends block_base
Строка 41:
• • •
}
</syntaxhighlight>
</source>
 
Сначала мы объявляем класс, он должен обязательно объявлятся таким образом как показано, т. к. является расширением автоподключаемого класса, который находится в файле <tt>/blocks/moodleblock.class.php</tt> В дальнейшем мы можем (и даже должны) изменять только часть <tt>''simplehtml''</tt>, все остальное является стандартным и стандартизированным.
Строка 55:
Для того чтобы наш блок мог что-то отображать, нам необходимо добавить метод<span style="color:grey;">(ы)</span>, который будет осуществлять вывод:
 
<sourcesyntaxhighlight lang="php">
function get_content()
{
Строка 70:
} // Конец класса
?>
</syntaxhighlight>
</source>
 
Давайте проанализируем этот метод, чтобы увидеть, что происходит.
Строка 82:
Для того чтобы блок не был ''"мертвым"'' необходимо обеспечить возможность пользователям (участникам системы) настраивать содержимое блоков.<!-- В ''терминологии блоков'' это называется "настройка объекта".--> Для того чтобы добавить в наш блок возможность конфигурирования необходимо добавить в него еще один метод:
 
<sourcesyntaxhighlight lang="php">
function instance_allow_config() {
return true;
}
</syntaxhighlight>
</source>
 
Этого достаточно для того чтобы в системе Moodle появился пункт (иконка) "Настроить" для нашего блока. Но если вы попробуете его настроить у вас ничего не получится, нам необходимо описать что и как конфигурировать. Для этого нам необходимо создать еще один файл <tt>/blocks/simplehtml/'''config_instance.html'''</tt> (должен называться именно так) с следующим содержанием:
 
<sourcesyntaxhighlight lang="php">
<table cellpadding="9" cellspacing="0">
<tr valign="top">
Строка 108:
 
<?php use_html_editor(); ?>
</syntaxhighlight>
</source>
 
Легко увидеть, что код выше предоставляет нам визуальный редактор текста для нашего блока с кнопкой сохранения. Мы можем обращаться к свойствам класса как <tt>'''$this->config->свойство'''</tt> и менять их из конфигурационной формы.
Строка 116:
Теперь нам осталось только ''привязать'' наш конфигурационный файл к нашему блоку. Сделать это довольно просто, в фале ''/blocks/simplehtml/block_simplehtml.php'' находим:
 
<sourcesyntaxhighlight lang="php">
$this->content = new stdClass;
$this->content->text = 'Здороваемся с Миром :)';
$this->content->footer = 'Завершающий вывод...';
</syntaxhighlight>
</source>
 
и заменяем на:
 
<sourcesyntaxhighlight lang="php">
$this->content = new stdClass;
$this->content->text = $this->config->text;
$this->content->footer = '';
</syntaxhighlight>
</source>
 
Как вы заметили мы ничего не выводим с помощью ''$this->content->footer'', потому что в нашем случае нам просто нечего выводить в нижний завершающий блок.
Строка 136:
Давайте теперь пойдем дальше и дадим возможность пользователям менять не только текст внутри нашего блока но и его заголовок. Для этого добавим еще один параметр в наш конфигурационный файл ''/blocks/simplehtml/config_instance.html'':
 
<sourcesyntaxhighlight lang="php">
<tr valign="top">
<td align="right"><p>
Строка 145:
</td>
</tr>
</syntaxhighlight>
</source>
 
Теперь мы можем использовать параметр ''$this->config->title'', но нам он необходим в методе ''init()'', а как мы говорили раньше обращаться к конфигурационным данным в этом методе нельзя. Как же быть? Для решения этой проблемы нам понадобится еще один специальный метод:
 
<sourcesyntaxhighlight lang="php">
function specialization()
{
Строка 161:
}
}
</syntaxhighlight>
</source>
 
Все, проблема решена. Вся мощь данного метода состоит в том, что он вызывается автоматически при создании оъекта класса после метода ''init'' и до любого другого действия. Таким образом - это идеальная функция для обработки конфигурационных данных.
Строка 175:
Иногда в рамках одного курса необходимо использовать несколько одинаковых блоков <span style="color:grey; font-size:x-small;">''(одного типа)''</span>. Обеспечить возможность включения нескольких блоков на одной странице в moodle очень легко. Для этого необходим еще один короткий метод:
 
<sourcesyntaxhighlight lang="php">
function instance_allow_multiple()
{
return true;
}
</syntaxhighlight>
</source>
 
Теперь количество одинаковых блоков на странице не ограничено. Но стоит помнить, что несмотря на это администратор может запретить множественные вхождения для любого блока вручную, используя пункт ''модули → блоки → управление блоками'' на панели администрирования.
Строка 190:
Если в '''moodle''' существует возможность [[#Множественные включения|множественного включения]] однотипных блоков, то разумно обеспечить возможность определения общих настроек для всех блоков одного типа. Для этого существует отдельные ''метод''.
 
<sourcesyntaxhighlight lang="php">
function has_config()
{
return true;
}
</syntaxhighlight>
</source>
 
Для этого метода необходим соответствующий файл для отображения самих настроек, он должен называться ''/blocks/simplehtml/config_global.html''. В нашем случае в нем будет одна опция ''«разрешить HTML»'':
 
<sourcesyntaxhighlight lang="php">
<div style="text-align: center;">
<input type="hidden" name="block_simplehtml_strict" value="0" />
Строка 210:
</p>
</div>
</syntaxhighlight>
</source>
 
{{ambox|text=На заметку: английская документация по файлу ''settings.php'' не полная. Ее написание и перевод на русский язык ожидается в ближайшее время.}}
Строка 222:
Есть более сложный способ получить и сохранить конфигурационные данные. Он реализуется с помощью метода ''config_save()'', синтаксис которого показан ниже:
 
<sourcesyntaxhighlight lang="php">
function config_save($data)
{
Строка 232:
return true;
}
</syntaxhighlight>
</source>
 
Как мы можем видеть метод перебирает все значения ассоциативного массива ''$data'', который содержит значения всех переменных из обрабатываемой формы. Если мы хотим обойтись без одноименных полей в форме, то обрабатывающий скрипт будет выглядеть так:
 
<sourcesyntaxhighlight lang="php">
function config_save($data)
{
Строка 246:
return true;
}
</syntaxhighlight>
</source>
 
=== чтение конфигурации ===
Строка 259:
Если у нас есть несколько однотипных блоков, то мы можем задать для них глобальные свойства. А как сохранить конфигурацию каждого из них? Для этого существует метод ''instance_config_save()'' который по умолчанию выглядит так:
 
<sourcesyntaxhighlight lang="php">
function instance_config_save($data)
{
Строка 270:
$this->instance->id);
}
</syntaxhighlight>
</source>
 
В нашем случае, если мы хотим предварительно обработать данные перед записью, мы можем использовать такую конструкцию:
 
<sourcesyntaxhighlight lang="php">
function instance_config_save($data)
{
Строка 286:
return parent::instance_config_save($data);
}
</syntaxhighlight>
</source>
 
{{ambox|text='''На заметку:'''
Строка 297:
Для начала, мы можем создать блок вообще без заголовка. Для этого используется следующий метод:
 
<sourcesyntaxhighlight lang="php">
function hide_header()
{
return true;
}
</syntaxhighlight>
</source>
 
Как мы уже говорили выше, мы '''не можем''' просто указать в качестве заголовка пустую строку внутри метода init(). Заголовок используется для идентификации блоков.
Строка 310:
Для того чтобы сообщить Moodle предпочитаемую ширину для нашего блока, используется следующий метод:
 
<sourcesyntaxhighlight lang="php">
function preferred_width()
{
Строка 316:
return 200;
}
</syntaxhighlight>
</source>
 
Все блоки заключены в &lt;div&gt; <span style="color:grey; font-size:x-small;">(&lt;table&gt; в более старых версиях)</span> контейнеры, атрибуты и CSS свойства которых мы можем изменять. Целесообразнее для блока создать CSS класс и прописать селектор с свойствами в CSS файле темы Moodle. Для этого нам необходимо использовать соответствующий метод, который возвращает ассоциативный массив атрибутов и значений:
 
<sourcesyntaxhighlight lang="php">
function html_attributes()
{
Строка 328:
);
}
</syntaxhighlight>
</source>
 
Как видим мы добавили обработку события с использованием JavaScript и сохранили стандартный CSS класс кроме нашего собственного.
Строка 334:
=== полезные примеры ===
 
<sourcesyntaxhighlight lang="php">
function html_attributes()
{
Строка 340:
return array('id' => 'inst'.$this->instance->id, 'class' => 'block_'. $this->name());
}
</syntaxhighlight>
</source>
 
Мы можем переписать (перегрузить) этот метод так, чтобы кроме добавления своих атрибутов, сохранить старые (стандартные):
 
<sourcesyntaxhighlight lang="php">
function html_attributes()
{
Строка 352:
return $attrs;
}
</syntaxhighlight>
</source>
 
== ''«Паранджа»'' ==
Строка 358:
Трудно представить себе блок который был бы полезен во всех случаях, на всех страницах Moodle. Поэтому Moodle позволяет определить на каких страницах, в рамках каких курсов показывать блок. Для этого используется специальный метод, который возвращает ассоциативный массив ключи которого задают формат страниц, а значения (''true/false'') определяют показывать блок или нет:
 
<sourcesyntaxhighlight lang="php">
function applicable_formats()
{
Строка 364:
'course-view' => true);
}
</syntaxhighlight>
</source>
 
В результате использования этого метода блок будет отображаться '''только''' на страницах курсов.
Строка 378:
Мы можем использовать столько шаблонов, сколько захотим. Каждый шаблон может запрещать или разрешать отображение блока.
 
<sourcesyntaxhighlight lang="php">
function applicable_formats()
{
return array('site' => true);
}
</syntaxhighlight>
</source>
 
В этом случае блок будет отображаться только на главной странице Moodle. Так как шаблон '''all''' не указан, то отображение блока будет запрещено. Но шаблон '''site''' разрешает отображение для главной страницы.