Разработан модуль для joomla для открытого института. Модуль размещён на странице информации о специальности и выводит перечень изучаемых дисциплин по заданной специальности.

Для выбора перечня дисциплин требуется получить из url страницы алиас специальности.

Файловая структура

  • mod_disciplines — директория модуля на сервере.
    • tmpl
      • default.php — шаблон модуля, который принимает данные, собранные mod_disciplines.php и генерирует HTML, который будет отображаться на странице.
    • helper.php — файл содержит вспомогательный класс, используемый для того, чтобы сделать фактическую работу в получении информации, которая будет отображаться в модуле.
    • mod_disciplines.php — основной файл входа для модуля, который выполняет необходимые процедуры инициализации, вызова вспомогательных средств для сбора данных и содержит шаблон для отображения вывода модуля.
    • mod_disciplines.xml — файл содержит информацию о модуле и определяет файлы, которые должны быть установлены установщиком Joomla! Так же данный файл задает параметры конфигурации модуля.

Исходный код

tmpl/default.php
PHP
<?php
// No direct access
defined( '_JEXEC' ) or die;

$err_special = [];
$option = [];

$option['driver']   = 'mysql';
$option['host']     = '';
$option['user']     = '';
$option['password'] = '';
$option['database'] = '';
$option['prefix']   = '';
/* 
print '<pre>';
print_r($_GET);
print '</pre>';
 */
$db = & JDatabase::getInstance( $option );

$query_specialties_list = $db->getQuery(true);
$query_specialties_list -> select('s.special_id, s.title');
$query_specialties_list -> from($db->quoteName('specialties', 's'));
$query_specialties_list -> where($db->quoteName('special_status') ." = 'Опубликована'");
$db -> setQuery( $query_specialties_list );
$specialties_list = $db->loadObjectList();
	

if( !isset( $_GET["special_id"] ) ) {
	
	$err_special[] = 'Специальность не указана.';
	
}

if( count( $err_special ) == 0 ) {
	
	$query_specialties = $db->getQuery(true);
	$query_specialties -> select('s.special_id, s.title');
	$query_specialties -> from($db->quoteName('specialties', 's'));
	$query_specialties -> where( $db->quoteName('special_id') ." = ". $_GET["special_id"] );
$query_specialties -> where($db->quoteName('special_status') ." = 'Опубликована'");

	$db -> setQuery( $query_specialties, 0, 1 );
	$specialties = $db->loadObjectList();
	
}

if( count( $specialties ) > 0 ) {
	
	$special_id = $_GET["special_id"];
	$special_title = $specialties[0]->title;
	
} else {
	
	$err_special[] = 'Специальность не найдена.';
	
}

if( count( $err_special ) == 0 ) {
	
	$query_disciplines = $db->getQuery(true);
	$query_disciplines -> select('d.discipline_id, d.discipline_name, s.specialtie_comment');
	$query_disciplines -> from($db->quoteName('disciplines', 'd'));
	$query_disciplines -> join('LEFT OUTER', $db->quoteName('specialtie_to_disciplines', 's') . ' ON (' . $db->quoteName('d.discipline_id') . ' = ' . $db->quoteName('s.discipline_id') . ')');
	$query_disciplines -> where($db->quoteName('special_id')." = ". $db->quote($special_id));
	$db -> setQuery($query_disciplines);
	$disciplines = $db->loadObjectList();
	
	
} else {
	
	$query_disciplines = $db->getQuery(true);
	$query_disciplines -> select('std.discipline_id, d.discipline_name');
	$query_disciplines -> from($db->quoteName('specialtie_to_disciplines', 'std'));
	$query_disciplines -> join('LEFT OUTER', $db->quoteName('disciplines', 'd') . ' ON (' . $db->quoteName('std.discipline_id') . ' = ' . $db->quoteName('d.discipline_id') . ')');
	$query_disciplines -> join('LEFT OUTER', $db->quoteName('specialties', 's') . ' ON (' . $db->quoteName('std.special_id') . ' = ' . $db->quoteName('s.special_id') . ')');
	$query_disciplines -> where($db->quoteName('s.special_status')." = 'Опубликована'");
	$query_disciplines -> group($db->quoteName('std.discipline_id'));
	$query_disciplines -> order($db->quoteName('d.discipline_name'));
	$db -> setQuery($query_disciplines);
	$disciplines = $db->loadObjectList();
	
}

print '<div class="module'. $moduleclass_sfx .'">';
	
	print '<div class="form-group">';
		print '<label>Выберите направление подготовки</label>';
		print '<select name="special_id" class="form-control setTrainingDisciplinesSpecialId">';
			print '<option value="0">Все направления подготовки</option>';
		foreach( $specialties_list AS $special_in_list ) {
			
			$selected = '';
			if( $special_in_list->special_id == $_GET["special_id"] ) $selected = 'selected';
			print '<option value="'. $special_in_list->special_id .'" '. $selected .'>'. $special_in_list->title .'</option>';
			
		}
		print '</select>';
	print '</div>';
	
	if ( isset( $special_title ) ) {
		
		print '<div class="h1 text-center">ООП «'. $special_title .'»</div>';
		
		print '<div class="text-center tab-heading">';
			print '<h3 class="disciplins-list">Тематические планы учебных дисциплин:</h3>';
			print '<span class="label label-required-part"> </span> Обязательная часть';
			print '<span class="label label-variational-part"> </span> Вариативная часть';
			print '<span class="label label-elective-disciplines"> </span> Дисциплины по выбору';
		print '</div>';
		
		print '<ul class="tags" style=" list-style: none; ">';
		
		foreach ( $disciplines AS $i1 => $discipline ) {
			
			$label = '';
			if ( $discipline->specialtie_comment == "Обязательная часть" ) $label = 'required-part';
			if ( $discipline->specialtie_comment == "Вариативная часть" ) $label = 'variational-part';
			if ( $discipline->specialtie_comment == "Дисциплины по выбору" ) $label = 'elective-disciplines';
			
			## Количество разделов
			$query_disciplines_sections = $db->getQuery(true);
			$query_disciplines_sections -> select('ds.sections_id');
			$query_disciplines_sections -> from($db->quoteName('disciplines_sections', 'ds'));
			$query_disciplines_sections -> where($db->quoteName('discipline_id')." = ". $db->quote($discipline->discipline_id));
			$db -> setQuery($query_disciplines_sections);
			$db->execute();
			$col_sections = $db->getNumRows();
			
			## Количество тем
			$query_sections_topics = $db->getQuery(true);
			$query_sections_topics -> select('st.topics_id');
			$query_sections_topics -> from($db->quoteName('sections_topics', 'st'));
			$query_sections_topics -> join('LEFT OUTER', $db->quoteName('disciplines_sections', 'ds') . ' ON (' . $db->quoteName('st.sections_id') . ' = ' . $db->quoteName('ds.sections_id') . ')');
			$query_sections_topics -> where($db->quoteName('discipline_id')." = ". $db->quote($discipline->discipline_id));
			$db -> setQuery($query_sections_topics);
			$db->execute();
			$col_topics = $db->getNumRows();
			
			## Количество занятий
			$query_lessons = $db->getQuery(true);
			$query_lessons -> select('l.lesson_id');
			$query_lessons -> from($db->quoteName('lessons', 'l'));
			$query_lessons -> join('LEFT OUTER', $db->quoteName('specialtie_to_disciplines', 'std') . ' ON (' . $db->quoteName('l.to_discipline_id') . ' = ' . $db->quoteName('std.to_discipline_id') . ')');
			$query_lessons -> where($db->quoteName('std.discipline_id')." = ". $db->quote($discipline->discipline_id));
			$query_lessons -> where($db->quoteName('std.special_id')." = ". $db->quote($special_id));
			$query_lessons -> where($db->quoteName('l.lesson_hours')." > 0 ");
			$db -> setQuery($query_lessons);
			$db->execute();
			$col_lessons = $db->getNumRows();
			
			print '<li>';
				print '<a href="https://sdo.openvuz.org/components/sections_topics/view/ThemePlan.php?discipline_id='. $discipline->discipline_id .'" target="_blank" class="label label-'. $label .'">'. $discipline->discipline_name .'</a> <small class="text-primary">(Разделов: '. $col_sections .'. Тем: '. $col_topics .'. Занятий: '. $col_lessons .')</small>';
			print '</li>';
			
		}
		print '</ul>';
		
	} else {
		
		print '<ul class="tags" style=" list-style: none; ">';
		$label = '';
		foreach ( $disciplines AS $i1 => $discipline ) {
			
			## Количество разделов
			$query_disciplines_sections = $db->getQuery(true);
			$query_disciplines_sections -> select('ds.sections_id');
			$query_disciplines_sections -> from($db->quoteName('disciplines_sections', 'ds'));
			$query_disciplines_sections -> where($db->quoteName('discipline_id')." = ". $db->quote($discipline->discipline_id));
			$db -> setQuery($query_disciplines_sections);
			$db->execute();
			$col_sections = $db->getNumRows();
			
			## Количество тем
			$query_sections_topics = $db->getQuery(true);
			$query_sections_topics -> select('st.topics_id');
			$query_sections_topics -> from($db->quoteName('sections_topics', 'st'));
			$query_sections_topics -> join('LEFT OUTER', $db->quoteName('disciplines_sections', 'ds') . ' ON (' . $db->quoteName('st.sections_id') . ' = ' . $db->quoteName('ds.sections_id') . ')');
			$query_sections_topics -> where($db->quoteName('discipline_id')." = ". $db->quote($discipline->discipline_id));
			$db -> setQuery($query_sections_topics);
			$db->execute();
			$col_topics = $db->getNumRows();
			
			print '<li>';
				print '<a href="https://sdo.openvuz.org/components/sections_topics/view/ThemePlan.php?discipline_id='. $discipline->discipline_id .'" target="_blank" class="label label-elective-disciplines">'. $discipline->discipline_name .'</a> <small class="text-primary">(Разделов: '. $col_sections .'. Тем: '. $col_topics .'.)</small>';
			print '</li>';
			
		}
		print '</ul>';
		
	}
	
print '</div>';
helper.php
PHP
<?php

// No direct access
defined( '_JEXEC' ) or die;

/**
 * Class Module Helper
 * @author alvasdem
 */
class modDisciplinesHelper
{

	/**
	 * getData method
	 * @param $params
	 * @return array
	 */
	static function getData( $params )
	{
		$db = JFactory::getDbo();
		return array();
	}

}
mod_disciplines.php
PHP
<?php

// No direct access
defined( '_JEXEC' ) or die;

require_once( dirname( __FILE__ ) . '/helper.php' );
$data = modDisciplinesHelper::getData( $params );
$moduleclass_sfx = htmlspecialchars( $params->get( 'moduleclass_sfx' ) );
// $special_id = htmlspecialchars( $params->get( 'special_id' ) );
require( JModuleHelper::getLayoutPath( 'mod_disciplines', $params->get( 'layout', 'default' ) ) );
mod_disciplines.xml
XML
<?xml version="1.0"?>
<extension type="module" version="1.0.0" method="upgrade" client="site">
    <name>Перечень дисциплин</name>
    <author>alvasdem</author>
    <authorEmail></authorEmail>
    <authorUrl></authorUrl>
    <copyright></copyright>
    <license></license>
    <version>1.0</version>
    <description></description>
    <files>
        <filename module="mod_disciplines">mod_disciplines.php</filename>
        <filename>index.html</filename>
        <filename>helper.php</filename>
        <folder>tmpl</folder>
    </files>
	<languages>
		<language tag="en-GB">language/en-GB.mod_disciplines.ini</language>
		<language tag="en-GB">language/en-GB.mod_disciplines.sys.ini</language>
		<language tag="ru-RU">language/ru-RU.mod_disciplines.ini</language>
		<language tag="ru-RU">language/ru-RU.mod_disciplines.sys.ini</language>
	</languages>
    <config>
        <fields name="params">
            <fieldset name="advanced">
                <field name="layout" type="modulelayout" label="JFIELD_ALT_LAYOUT_LABEL"
                       description="JFIELD_ALT_MODULE_LAYOUT_DESC"/>
                <field name="moduleclass_sfx" type="text" label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
                       description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC"/>
                <field name="cache" type="list" label="COM_MODULES_FIELD_CACHING_LABEL"
                       description="COM_MODULES_FIELD_CACHING_DESC" default="1">
                    <option value="0">COM_MODULES_FIELD_VALUE_NOCACHING</option>
                    <option value="1">JGLOBAL_USE_GLOBAL</option>
                </field>
            </fieldset>
        </fields>
    </config>
</extension>