Cotonti не знаю - пишу плагин с нуля, решил описать процесс здесь так как информации по Cotonti очень мало - собираю по крупицам.
| Salador |
|
|---|---|
#40589 Alex300: Точно, Благодарю. В админке обновил плагин - заработало. Добавлено 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 в нем создал форму:
Весь код примерно такой же как в на предыдущем шаге только в базе выбираем по Также добавлено вычисление средств которые должны быть выплачены сотруднику
//суммируем в базе все начисления по сотруднику
$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 день спустя: Шаг 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, 10 years ago)
|