Forums / National / Russian / Модули и плагины / Пишем плагин с нуля.

Cotonti не знаю - пишу плагин с нуля, решил описать процесс здесь так как информации по Cotonti очень мало - собираю по крупицам.

Salador
#40590 2015-02-20 14:43
#40589 Alex300:

После того как добавили файл salazarp.rc.php плагин переустановили?

Код из этого файла выполняется?

Точно, Благодарю. В админке обновил плагин - заработало.

Добавлено 22 часа спустя:

Шаг 10, Хуки

Информация по хукам здесь. Мне нужно добать календарь для Bootscrap, для этого нужно в <head> подключить 1 css и 2 js файла.

Создал файл salazarp.rc.php (по хуку rc информацию не нашел, но так было в другом плагине)

/* ====================
[BEGIN_COT_EXT]
Hooks=rc
[END_COT_EXT]
==================== */

defined('COT_CODE') or die('Wrong URL');

require_once cot_incfile('salazarp', 'plug'); //Подключаем tpl/salazarp.functions.php 

if ($cfg['jquery']) { //Проверка подключения jquery
	cot_rc_add_file(SALAZARP_PLUG . 'js/moment.min.js'); //Добавление файла css или js в <head>
	cot_rc_add_file(SALAZARP_PLUG . 'js/daterangepicker.js');
	cot_rc_add_file(SALAZARP_PLUG . 'tpl/daterangepicker-bs2.css');
	cot_rc_add_file(SALAZARP_PLUG . 'tpl/salazarp.css');
}

Обновляем плагин в админке.

Понял, что через хуки это делать нестоило, потомучто теперь эти файлы подключены на всех страницах сайта, а не только на страницах плагина.

Шаг 11, Начисления сотрудникам

Для ввода начислений создал два файла inc/salazarp.mnach.php в файл шаблона tpl/salazarp.mnach.tpl  в нем создал форму:

При выборе даты подключается календарь bootstrap-daterangepicker

Сумма считается как оклад умноженный на ставку и обрабатывается через Jquery, также если внесена сумма, ставка считается автоматически.

Вот самая важная часть шаблона - вывод строки таблицы:

<!-- BEGIN: SOTR_TABLE_MONTH -->
/*Вывод даты и заголовок таблицы*/
<!-- BEGIN: SOTR_ROW -->
<tr>
  <input type="hidden" name="sotrzarp[{SOTR_ID}][sotr_id]" value="{SOTR_ID}">
  <input type="hidden" name="sotrzarp[{SOTR_ID}][datenach]" value="{SOTR_DATE_SQL}">
  <td>{SOTR_NAME}</td>
  <td class="zarpokl">{SOTR_OKLAD}</td>
  <td>{SOTR_DATE}</td>
  <td><input type="text" class="input-mini zarpkoeff" name="sotrzarp[{SOTR_ID}][koeff]" value="{SOTR_STAV}"></td>
  <td><input type="text" class="input-mini zarpvalue" name="sotrzarp[{SOTR_ID}][summa]" value="{SOTR_SUMMA}"></td>
 </tr>
<!-- END: SOTR_ROW -->
/*закрытие таблицы и кнопка сохранить*/
<!-- END: SOTR_TABLE_MONTH -->

Обработка данных из базы данных для вывода в таблицу в файле inc/salazarp.mnach.php

 if (empty($tekDate))  {	
	$tekDate = date("d-m-Y");					   //Если даты нет - ставим сегодняшнюю
 }	
 $tekDateForSql= date("Y-m-d", strtotime($tekDate));   //Преобразование даты в формат для MySQL
 $t_sz->assign('TEK_DATE' , $tekDate);                 //Записываем дату в переменную TEK_DATE для шаблона
 $arr_sotrs = $db->query("SELECT * FROM $table_sotr")->fetchAll();  //Выбираем всех сотрудников
 if(is_array($arr_sotrs)){
	 foreach($arr_sotrs as $sotr) {
		$sotr_zarp = $db->query("SELECT * FROM $table_zarp 
							 WHERE `sotr_id`='$sotr[sotr_id]' 
							 AND `datenach`='$tekDateForSql'
							 AND `nach` = 1")->fetch(); //Ищем начисления на определенную дату для сотрудника
		if (!empty($sotr_zarp)) { 
			$sotr['sotr_stav']=$sotr_zarp['koeff'];
			$sotr['sotr_summa']=$sotr_zarp['summa'];
		} else {
			$sotr['sotr_stav']='0';
			$sotr['sotr_summa']='0';
		}
		 $t_sz->assign(array(
			'SOTR_ID' => $sotr['sotr_id'],
			'SOTR_NAME' => $sotr['sotr_name'],
			'SOTR_OKLAD' => $sotr['sotr_oklad'],
			'SOTR_STAV' => $sotr['sotr_stav'],
			'SOTR_SUMMA' => $sotr['sotr_summa'],
			'SOTR_DATE_SQL' =>  $tekDateForSql,
			'SOTR_DATE' =>  $tekDate
		));
		$t_sz->parse('SOTR_TABLE_MONTH.SOTR_ROW');     //Выполняем парсинг шаблона каждой строки таблицы
	 }
 }
 $plugin_body .= $t_sz->parse('SOTR_TABLE_MONTH')->text('SOTR_TABLE_MONTH');

думал проблемы возникнут с выводм строки таблицы 

$t_sz->parse('SOTR_TABLE_MONTH.SOTR_ROW');     //Выполняем парсинг шаблона каждой строки таблицы

но она заработала безпроблем.

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

$tekDate = cot_import('tekdate','P','TXT');    //Получаем дату из формы

// Проверяем если в GET есть параметр 'add' то 
// все данные из POST записываем в масиив $arr_zarp
$par = cot_import('par','G','TXT'); 
if ((!empty($par)) && $par=='add') {	
	$arr_zarp=cot_import('sotrzarp','P','ARR');
	// Обрабатываем каждую строку массива $arr_zarp как $zarp
	// все данные из POST записываем в масиив $arr_zarp
	foreach($arr_zarp as $zarp) {
		$zarp['user_id']=$usr['id'];	//Выбираем id пользователя кто изменил данные 
										//($usr содержит массив данных текущего пользователя)
		$zarp['nach']='1';              // 1- это начисление  0 - выплата 
		$tekDate = date("d-m-Y", strtotime($zarp[datenach]));
		$arr_sotr = $db->query("SELECT * FROM $table_sotr 
						WHERE `sotr_id`='$zarp[sotr_id]'"
						)->fetch(); //Выбираем сотрудника по id для отображения его ФИО
		$t_sz->assign('SOTR_NAME' , $arr_sotr['sotr_name']); // ФИО сотрудника в шаблон

		$sotr_zarp_row = $db->query("SELECT * FROM $table_zarp 
							 WHERE `sotr_id`='$zarp[sotr_id]' 
							 AND `datenach`='$zarp[datenach]'
							 AND `nach` = '1'")->fetch();  //Ищем начисления на определенную дату для сотрудника
	
		//Если начисления есть то обновляем их
		if (!empty($sotr_zarp_row)) {	
			if ($updzarp=$db->update($table_zarp, $zarp, "`sotr_id`='$zarp[sotr_id]' 
											AND `datenach`='$zarp[datenach]' 
											AND `nach` = '1'")) {  
					$plugin_body .= $t_sz->parse('SUC_UPD_SOTR_ZARP')
						->text('SUC_UPD_SOTR_ZARP'); //успешное обновление начислений
			} else {
					$plugin_body .= $t_sz->parse('NOT_UPD_SOTR_ZARP')
						->text('NOT_UPD_SOTR_ZARP'); //неудачное обновление начислений
			}		
		// Если начислений нет и текущие начисления 
		// не равны 0 то добавляем начисление
		} else {
		
			if (($zarp['summa'])!='0') {
				if ($db->insert($table_zarp ,$zarp)) {   
					$plugin_body .= $t_sz->parse('SUC_ADD_SOTR_ZARP')
						->text('SUC_ADD_SOTR_ZARP'); //успешное добавление начислений
				} else {
					$plugin_body .= $t_sz->parse('NOT_ADD_SOTR_ZARP')
						->text('NOT_ADD_SOTR_ZARP'); //неудачное добавление начислений
				}
			}
		}
	}
}	

Этот код вставляем в файле inc/salazarp.mnach.php перед предыдущем.

Добавлено 17 минут спустя:

Шаг 12, Ввод оплаты сотруднику

Вринципе код почти такой же как на предыдущем шаге.

Созданы два файла inc/salazarp.pay.php в файл шаблона tpl/salazarp.pay.tpl в нем создал форму:

Весь код примерно такой же как в на предыдущем шаге только в базе выбираем по `nach` = '0'

Также добавлено вычисление средств которые должны быть выплачены сотруднику

//суммируем в базе все начисления по сотруднику
$sotr_zarp_allnach = $db->query("SELECT SUM(summa) FROM $table_zarp 
							 WHERE `sotr_id`='$sotr[sotr_id]' 
							 AND `nach` = 1")->fetch(); 
//суммируем в базе все выплаты по сотруднику
$sotr_zarp_allvipl = $db->query("SELECT SUM(summa) FROM $table_zarp 
							 WHERE `sotr_id`='$sotr[sotr_id]' 
							 AND `nach` = 0")->fetch(); 
//вычисляем остаток средств которые должны выплатить сотруднику
$sotr_zarp_ost = $sotr_zarp_allnach['SUM(summa)']-$sotr_zarp_allvipl['SUM(summa)'];		

 

Добавлено 3 часа спустя:

Шаг 13, Меню (Хуки):

Вот здесь хуки вроде использовал правильно. 

в файле шаблона /themes/barebones/header.tpl вместо стандартного меню ставим: 

<ul class="nav">
	{MENU_GENERAL}
</ul><!-- /nav -->

Перекрывать будем хук header.tags он отвечает за теги для header. (сначала пробовал перекрывать header.first, но ничего не получилось)

Создаем файл salazarp.header.tags.php и пишем:

/* ====================
[BEGIN_COT_EXT]
Hooks=header.tags 
[END_COT_EXT]
==================== */

defined('COT_CODE') or die('Wrong URL');

require_once cot_incfile('salazarp', 'plug'); //Подключаем tpl/salazarp.functions.php 

//Массив - меню
$arr_menu = Array ( 
	Array ( 
		'tip' => 2,
		'active'=>false,
		'menu_name' => 'Сотрудники',
		'menu_link' => array(
			Array ( 
				'tip' => 1,
				'active'=>false,
				'menu_name' => 'Добавить сотрудника',
				'menu_link' => sala_zap_url('addsotr')
			),
			Array ( 
				'tip' => 1,
				'active'=>false,
				'menu_name' => 'Список сотрудников',
				'menu_link' => sala_zap_url('outsotr')
			)
		)
	),
    Array ( 
		'tip' => 1,
		'active'=>false,
		'menu_name' => 'Начисления',
		'menu_link' => sala_zap_url('mnach')
	),
	Array ( 
		'tip' => 1,
		'active'=>false,
		'menu_name' => 'Оплата',
		'menu_link' => sala_zap_url('pay')
	)
	);

$cfg['menu1']=$arr_menu;

//присвоение MENU_GENERAL текста созданного при помощи 
//шаблона tpl/salazarp.menu.tpl и массива $arr_menu
$t_sz=new XTemplate(cot_tplfile(array('salazarp', 'menu'), 'plug')); 
$text_menu= $t_sz->parse()->text();
$t->assign('MENU_GENERAL',$text_menu);

Посмотрел есть плагин меню для cotonti в шаблоне использовал тэг {MENU_GENERAL} на будующее.

Для шаблона tpl/salazarp.menu.tpl использовалась информация по циклам для шаблонов 

Ниже код если в массиве tip=1 создается простое меню, если  tip=2 то выпадающее. 

<!-- BEGIN: MAIN --> 
	<!-- FOR {VALUE} IN {PHP.cfg.menu1} -->	
		<!-- IF {VALUE.tip} == '1' -->
			<li class="<!-- IF {VALUE.active} == '1' -->active<!-- ENDIF -->">
				<a href="{VALUE.menu_link}">{VALUE.menu_name}</a>
			</li>
		<!-- ENDIF -->
		<!-- IF {VALUE.tip} == '2' -->
			<li class="dropdown">
				<a class="dropdown-toggle <!-- IF {VALUE.active} == '1' -->active<!-- ENDIF -->" data-toggle="dropdown" href="#">
					{VALUE.menu_name}
					<b class="caret"></b>
				</a>
				<ul class="dropdown-menu">
					<!-- FOR {VALUE1} IN {VALUE.menu_link} -->	
						<!-- IF {VALUE1.tip} == '1' -->
							<li class="<!-- IF {VALUE1.active} == '1' -->active<!-- ENDIF -->">
								<a href="{VALUE1.menu_link}">{VALUE1.menu_name}</a>
							</li>
						<!-- ENDIF -->
					<!-- ENDFOR -->
				</ul>
		  </li>
		<!-- ENDIF -->
	<!-- ENDFOR -->
<!-- END: MAIN -->

Вот такое меню получилось:

Вот архив плагина на текущий момент (Скачать).

Что осталось сделать:

  1. Выводить статистику по начислениям и оплатам за месяц (неделю).
  2. Список сотрудников с возможностью уволить, и по нему небудут отображаться начисления.
  3. Чтобы это всё работало только у зарегистрированных пользователей (регистрация должна проходить модерацию).
  4. У незарегистрированных отображалась только форма входа.
  5. Ну и хотелось бы, для обучения в админке плагина добавить какой-нибудь свой параметр.

 

Добавлено 1 день спустя:

Шаг 14. Доступ для зарегистрированных пользователей

Чтобы плагин работал только у зарегистрированных пользователей, нужно просто в админке плагина во вкладке "Права" убрать все галочки у группы Guests.

Чтобы параметры доступа ставились сразу после установки добавляем в файле salazarp.setup.php между строк [BEGIN_COT_EXT]

Auth_guests=
Lock_guests=RWA

Почему-то в шаблоен нет ссылки на регистрацию,  в файл /themes/barebones/login.tpl  добавил строку:

<a href="{USERS_AUTH_REGISTER}" class="btn btn-small">{PHP.L.Register}</a>

Не стал заморачиваться с формой авторизации на главной странице, просто в файл \themes\barebones\index.tpl добавил ссылку:

<a href="{PHP|cot_url('login')}" class="btn btn-primary btn-large">Вход</a>

 

This post was edited by Salador (2015-02-23 01:11, 9 years ago)