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>
|
|
Отредактировано: Salador (23.02.2015 01:11, 10 лет назад) |