<?xml version='1.0' encoding='UTF-8'?>
<rss version='2.0'>
	<channel>
		<title>cotonti.com : Пишем плагин с нуля.</title>
		<link>https://www.cotonti.com</link>
		<description>Останні повідомлення в темі</description>
		<generator>Cotonti</generator>
		<language>en</language>
		<pubDate>Wed, 08 Apr 2026 09:10:25 -0000</pubDate>

		<item>
			<title>Kopusha</title>
			<description><![CDATA[<p>Какое этот вопрос имеет отношение к теме?</p>
]]></description>
			<pubDate>Ср, 07 Чер 2023 12:44:44 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=7887&d=0#post46856]]></link>
		</item>
		<item>
			<title>webitproff</title>
			<description><![CDATA[<blockquote class="fp"><a href="https://www.cotonti.com/forums?m=posts&amp;q=7887&amp;d=2#46676">#46676</a> <strong>Kabak: </strong>
<p>Документации полно на этом сайте, но всем  пофигу, что поиск не работает )))  Собственно и призывы ...  Ваш скин не приняли, мой забраковали, свой не предложили и занавес...</p>
</blockquote>

<p>простите, но большая притензия - не засоряйте темы!</p>

<p>такие вещи можно писать в курилке!</p>
<p class="updated"><strong>Добавлено 3 дня спустя:</strong></p><p>В силу того, что часть ссылок</p>

<p>ссылаются на внешние ресурсы, которые уже не работают - дублирую информацию на локальные</p>

<p><a href="https://www.cotonti.com/docs/ext/extensions/ext_hooks"><strong>Информация по хукам №1</strong></a></p>

<p><a href="https://www.cotonti.com/docs/ru/plugins/Spisok_i_opisanie_hukov"><strong>Информация по хукам №2 </strong></a>(возможно, что-то уже не актуально)</p>

<p> </p>
]]></description>
			<pubDate>Пт, 26 Травень 2023 20:33:06 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=7887&d=0#post46678]]></link>
		</item>
		<item>
			<title>Kabak</title>
			<description><![CDATA[<p>Документации полно на этом сайте, но всем  пофигу, что поиск не работает )))  Собственно и призывы ...  Ваш скин не приняли, мой забраковали, свой не предложили и занавес...</p>
]]></description>
			<pubDate>Пт, 26 Травень 2023 20:00:55 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=7887&d=0#post46676]]></link>
		</item>
		<item>
			<title>webitproff</title>
			<description><![CDATA[<p>Года бегут.</p>

<p>с последнего поста в теме..</p>

<p>думаю что-то наш котонти по-притих, после выхода релиза 0.9.22...</p>

<p>да не тут то было, довольно активно обновляется <a href="https://github.com/Cotonti/dev-documentation" rel="nofollow"><span style="color:#8e44ad;"><strong>документация для разработчиков </strong></span></a>и не только...</p>

<p>Если вы хоть немного умеете читать код и думаете о разработке собственных расширений,</p>

<p>а также модернизации и дополнении существующих -  рекомендую форкнуть официальный репозиторий и регулярно синхронизироваться.</p>

<p class="updated"><strong>Добавлено 11 минут спустя:</strong></p>

<blockquote class="fp"><a href="https://www.cotonti.com/forums?m=posts&amp;q=7887&amp;d=1#40569">#40569</a> <strong>Wilder: </strong>

<blockquote><a href="https://www.cotonti.com/forums?m=posts&amp;q=7887&amp;d=1#40544">#40544</a> <strong>Salador:</strong></blockquote>

<blockquote><strong>Шаг 3, Поиск информации:</strong>

<p>Информации очень мало нашел всего 3 сайта:</p>

<ol>
	<li>Этот сайт, как понял главный <a href="http://www.cotonti.com/">http://www.cotonti.com/</a> </li>
	<li><a href="http://cmsworks.ru/" rel="nofollow">http://cmsworks.ru/</a></li>
	<li><a href="http://mycotonti.ru/" rel="nofollow">http://mycotonti.ru/</a></li>
</ol>
</blockquote>

<p>Кроме этого, еще:</p>

<ul>
	<li><a href="http://littledev.ru/" rel="nofollow">http://littledev.ru/</a></li>
	<li><a href="http://www.seditio.by/" rel="nofollow">http://www.seditio.by/</a></li>
	<li><a href="http://www.cotonti.mobi" rel="nofollow">http://www.cotonti.mobi</a></li>
	<li><a href="http://prohtml.net/" rel="nofollow">http://prohtml.net/</a></li>
	<li><a href="http://portal30.ru" rel="nofollow">http://portal30.ru</a></li>
</ul>
</blockquote>

<p>Пожалуйста, у кого есть доступ,</p>

<p>пока тема не выросла, прошу,</p>

<p>удалите с начала темы нерабочие ссылки,</p>

<p>которые указаны в цитате.</p>

<p>Кроме seditio.by и разумеется нашего сайта, остальные уже не работают.</p>

<p>после этого можно и удалить этот мой пост.</p>
]]></description>
			<pubDate>Пт, 26 Травень 2023 17:55:09 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=7887&d=0#post46675]]></link>
		</item>
		<item>
			<title>Macik</title>
			<description><![CDATA[<p><span style="font-family:'Open Sans', 'Helvetica Neue', Helvetica, sans-serif;font-size:15px;line-height:24px;">Пошаговых инструкций, возможно не х</span><span style="font-family:'Open Sans', 'Helvetica Neue', Helvetica, sans-serif;font-size:15px;line-height:24px;">ватает, но р</span>ади справедливости замечу, что <a href="https://www.cotonti.com/ru/docs/">документация</a> по основным темам (актуальным для новичков) переведена на 70-80%, и это не так мало. </p>

<p>На счет порядка изучения — в большей степени зависит какие задачи вы перед собой ставите. Безусловно полезным будет ознакомление с упомянутой документацией. <br />
Далее, если цель писать свои плагины — то хорошим обучением будет взять для примера небольшой плагин и разобраться в его работе. Причем сделать это можно буквально по шагам используя какой-либо отладчик PHP. Это дастобщее понимание как работает система, какие файлы и функции, в каком порядке вызываются.</p>
]]></description>
			<pubDate>Сб, 02 Кві 2016 13:59:11 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=7887&d=0#post41585]]></link>
		</item>
		<item>
			<title>Виктор</title>
			<description><![CDATA[<p>Побольше бы таких тем, сам только начал изучать php, и для практиктики беру cotonti, многое не понятно но вот такие темы очень помогают. Жаль большинство документации на английском с которым не дружу, и вопрос к разработчикам в каком порятке изучать движок чтоб быстрее понять как он работает. Спасибо.</p>
]]></description>
			<pubDate>Сб, 02 Кві 2016 06:40:46 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=7887&d=0#post41584]]></link>
		</item>
		<item>
			<title>Salador</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/ru/forums?m=posts&amp;q=7887&amp;d=1#40589">#40589</a> <strong>Alex300: </strong>

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

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

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

<p><strong>Добавлено 22 часа спустя:</strong></p>

<h3><strong>Шаг 10, Хуки</strong></h3>

<p>Информация по хукам <a href="http://mycotonti.ru/docs/ext/exten/Hook-xuk-v-cotonti" rel="nofollow">здесь.</a> Мне нужно добать календарь для Bootscrap, для этого нужно в &lt;head&gt; подключить 1 css и 2 js файла.</p>

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

<pre class="brush:php;">
/* ====================
[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 в &lt;head&gt;
	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');
}
</pre>

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

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

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

<p>Для ввода начислений создал два файла inc<span style="line-height:20.7999992370605px;">/salazarp.mnach.php в файл шаблона tpl/salazarp.mnach</span><span style="line-height:20.7999992370605px;">.tpl  в нем создал форму:</span></p>

<p><span style="line-height:20.7999992370605px;"><img alt="" src="http://www.cotonti.com/datas/users/forma-nach_3174.jpg" /></span></p>

<p>При выборе даты подключается календарь <a href="https://github.com/dangrossman/bootstrap-daterangepicker" rel="nofollow">bootstrap-daterangepicker</a></p>

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

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

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

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

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

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

<pre class="brush:php;">
$t_sz-&gt;parse('SOTR_TABLE_MONTH.SOTR_ROW');     //Выполняем парсинг шаблона каждой строки таблицы</pre>

<p>но она заработала безпроблем.</p>

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

<pre class="brush:php;">
$tekDate = cot_import('tekdate','P','TXT');    //Получаем дату из формы

// Проверяем если в GET есть параметр 'add' то 
// все данные из POST записываем в масиив $arr_zarp
$par = cot_import('par','G','TXT'); 
if ((!empty($par)) &amp;&amp; $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-&gt;query("SELECT * FROM $table_sotr 
						WHERE `sotr_id`='$zarp[sotr_id]'"
						)-&gt;fetch(); //Выбираем сотрудника по id для отображения его ФИО
		$t_sz-&gt;assign('SOTR_NAME' , $arr_sotr['sotr_name']); // ФИО сотрудника в шаблон

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

<p>Этот код вставляем в файле <span style="line-height:20.7999992370605px;">inc</span><span style="line-height:20.7999992370605px;">/salazarp.mnach.php перед предыдущем.</span></p>
<p><strong>Добавлено 17 минут спустя:</strong></p><h3><strong>Шаг 12, Ввод оплаты сотруднику</strong></h3>

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

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

<p><img alt="" src="http://www.cotonti.com/datas/users/forma-pay_3174.jpg" /></p>

<p>Весь код примерно такой же как в на предыдущем шаге только в базе выбираем по <code class="php plain" style="line-height:14.3000001907349px;white-space:pre;margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;color:#000000;float:none;height:auto;width:auto;background:none;">`nach` = </code><code class="php string" style="line-height:14.3000001907349px;white-space:pre;margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;color:#0000FF;float:none;height:auto;width:auto;background:none;">'0'</code></p>

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

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

<p> </p>
<p><strong>Добавлено 3 часа спустя:</strong></p><h3><strong>Шаг 13, Меню (Хуки):</strong></h3>

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

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

<pre class="brush:xml;">
&lt;ul class="nav"&gt;
	{MENU_GENERAL}
&lt;/ul&gt;&lt;!-- /nav --&gt;</pre>

<p>Перекрывать будем хук header.tags он отвечает за теги для header. (сначала пробовал перекрывать <span style="line-height:20.7999992370605px;">header.first, но ничего не получилось</span>)</p>

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

<pre class="brush: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' =&gt; 2,
		'active'=&gt;false,
		'menu_name' =&gt; 'Сотрудники',
		'menu_link' =&gt; array(
			Array ( 
				'tip' =&gt; 1,
				'active'=&gt;false,
				'menu_name' =&gt; 'Добавить сотрудника',
				'menu_link' =&gt; sala_zap_url('addsotr')
			),
			Array ( 
				'tip' =&gt; 1,
				'active'=&gt;false,
				'menu_name' =&gt; 'Список сотрудников',
				'menu_link' =&gt; sala_zap_url('outsotr')
			)
		)
	),
    Array ( 
		'tip' =&gt; 1,
		'active'=&gt;false,
		'menu_name' =&gt; 'Начисления',
		'menu_link' =&gt; sala_zap_url('mnach')
	),
	Array ( 
		'tip' =&gt; 1,
		'active'=&gt;false,
		'menu_name' =&gt; 'Оплата',
		'menu_link' =&gt; 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-&gt;parse()-&gt;text();
$t-&gt;assign('MENU_GENERAL',$text_menu);</pre>

<p>Посмотрел есть <a href="http://www.seditio.by/portfolio/plagin-menu-generator-dlja-cmf-cotonti" rel="nofollow">плагин меню для cotonti</a> в шаблоне использовал тэг {MENU_GENERAL} на будующее.</p>

<p>Для шаблона tpl/salazarp.menu.tpl использовалась информация по <a href="http://cmsworks.ru/docs/programming/cikl-for-v-shablonax-cotonti" rel="nofollow">циклам для шаблонов</a> </p>

<p>Ниже код если в массиве tip=1 создается простое меню, если  <span style="line-height:20.7999992370605px;">tip=2 то выпадающее. </span></p>

<pre class="brush:xml;">
&lt;!-- BEGIN: MAIN --&gt; 
	&lt;!-- FOR {VALUE} IN {PHP.cfg.menu1} --&gt;	
		&lt;!-- IF {VALUE.tip} == '1' --&gt;
			&lt;li class="&lt;!-- IF {VALUE.active} == '1' --&gt;active&lt;!-- ENDIF --&gt;"&gt;
				&lt;a href="https://www.cotonti.com/{VALUE.menu_link}"&gt;{VALUE.menu_name}&lt;/a&gt;
			&lt;/li&gt;
		&lt;!-- ENDIF --&gt;
		&lt;!-- IF {VALUE.tip} == '2' --&gt;
			&lt;li class="dropdown"&gt;
				&lt;a class="dropdown-toggle &lt;!-- IF {VALUE.active} == '1' --&gt;active&lt;!-- ENDIF --&gt;" data-toggle="dropdown" href="https://www.cotonti.com/#"&gt;
					{VALUE.menu_name}
					&lt;b class="caret"&gt;&lt;/b&gt;
				&lt;/a&gt;
				&lt;ul class="dropdown-menu"&gt;
					&lt;!-- FOR {VALUE1} IN {VALUE.menu_link} --&gt;	
						&lt;!-- IF {VALUE1.tip} == '1' --&gt;
							&lt;li class="&lt;!-- IF {VALUE1.active} == '1' --&gt;active&lt;!-- ENDIF --&gt;"&gt;
								&lt;a href="https://www.cotonti.com/{VALUE1.menu_link}"&gt;{VALUE1.menu_name}&lt;/a&gt;
							&lt;/li&gt;
						&lt;!-- ENDIF --&gt;
					&lt;!-- ENDFOR --&gt;
				&lt;/ul&gt;
		  &lt;/li&gt;
		&lt;!-- ENDIF --&gt;
	&lt;!-- ENDFOR --&gt;
&lt;!-- END: MAIN --&gt;</pre>

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

<p><img alt="" src="http://www.cotonti.com/datas/users/menu-image_3174.jpg" /></p>

<p>Вот архив плагина на текущий момент (<a href="http://www.cotonti.com/datas/users/salazarp-step-13_3174.zip">Скачать</a>).</p>

<p><strong>Что осталось сделать:</strong></p>

<ol><li>Выводить статистику по начислениям и оплатам за месяц (неделю).</li>
	<li>Список сотрудников с возможностью уволить, и по нему небудут отображаться начисления.</li>
	<li>Чтобы это всё работало только у зарегистрированных пользователей (регистрация должна проходить модерацию).</li>
	<li>У незарегистрированных отображалась только форма входа.</li>
	<li>Ну и хотелось бы, для обучения в админке плагина добавить какой-нибудь свой параметр.</li>
</ol><p> </p>
<p><strong>Добавлено 1 день спустя:</strong></p><h3><strong>Шаг 14. Доступ для зарегистрированных пользователей</strong></h3>

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

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

<pre class="brush:php;">
Auth_guests=
Lock_guests=RWA
</pre>

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

<pre class="brush:xml;">
&lt;a href="https://www.cotonti.com/{USERS_AUTH_REGISTER}" class="btn btn-small"&gt;{PHP.L.Register}&lt;/a&gt;</pre>

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

<pre class="brush:xml;">
&lt;a href="https://www.cotonti.com/{PHP|cot_url('login')}" class="btn btn-primary btn-large"&gt;Вход&lt;/a&gt;</pre>

<p> </p>
]]></description>
			<pubDate>Пт, 20 Лют 2015 14:43:05 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=7887&d=0#post40590]]></link>
		</item>
		<item>
			<title>Alex300</title>
			<description><![CDATA[<p>После того как добавили файл salazarp.rc.php плагин переустановили?</p>

<p>Код из этого файла выполняется?</p>
]]></description>
			<pubDate>Пт, 20 Лют 2015 14:11:29 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=7887&d=0#post40589]]></link>
		</item>
		<item>
			<title>Salador</title>
			<description><![CDATA[<h3><strong>Шаг 9, Начало. Работа с базами данных:</strong></h3>

<p>Структуру Cotonti примерно понял теперь начинаю переделывать плагин под себя. Сначала сделаю добавление сотрудников.</p>

<p>1. Cоздал форму добавления сотрудника в файле tpl/salazarp.addsotr.tpl</p>

<p><img alt="" src="http://www.cotonti.com/datas/users/forma1_3174.jpg" /></p>

<p>2. В файле setup/salazarp.install.sql прописываем sql таблицы сотрудников</p>

<pre class="brush:sql;">
CREATE TABLE IF NOT EXISTS `cot_sotr` (
    `sotr_id` INT NOT NULL AUTO_INCREMENT, 
    `sotr_name` VARCHAR(100) NOT NULL, 
	`sotr_dolzh` VARCHAR(90) NOT NULL, 
    `sotr_desk` VARCHAR(255) NOT NULL, 
    `sotr_oklad` DECIMAL(10,2) default NULL, 
     PRIMARY KEY (`sotr_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;</pre>

<p>Теперь нужно в админке удалить и заного установить плагин.</p>

<p>3. Используя информацию <a href="http://cmsworks.ru/docs/programming/primery-mysql-zaprosov-v-cotonti" rel="nofollow">по работе с базами данных Cotonti</a> и <a href="http://www.cotonti.com/reference/api%20-%20database/package-summary.html">API Cotonti</a> в файле inc/salazarp.addsotr.php сделал добавление сотрудника в базу.</p>

<pre class="brush:php;">
$table_sotr='cot_sotr';   // название таблицы сотрудников
$par = cot_import('par','G','TXT'); 
if ((!empty($par)) &amp;&amp; $par=='add') {	
	$arr_sotr=array (                           //получение значений из формы добавления сотрудника в массив
		'sotr_name'=&gt;cot_import('sotr_name','P','TXT'),
		'sotr_dolzh'=&gt;cot_import('sotr_dolzh','P','TXT'),
		'sotr_desk'=&gt;cot_import('sotr_desk','P','TXT'),
		'sotr_oklad'=&gt;cot_import('sotr_oklad','P','TXT')
	);
	if ($db-&gt;insert($table_sotr,$arr_sotr)) {   //ввод данных в таблицу сотрудников
		$plugin_body = $t_sz-&gt;parse('SUC_ADD_SOTR')-&gt;text('SUC_ADD_SOTR'); //успешное добавление сотрудника
	} else {
		$plugin_body = $t_sz-&gt;parse('NOT_ADD_SOTR')-&gt;text('NOT_ADD_SOTR'); //неудачное добавление сотрудника
	}
	 
} 
$plugin_body .= $t_sz-&gt;parse('ADD_SOTR')-&gt;text('ADD_SOTR');</pre>

<p>4. Немного понял как работает XTemplate, в $t автоматически обрабатывается только 'MAIN' блок поэтому другие блоки туда нет смысла пихать. </p>

<p>Немного переработал вывод - так как файл tpl/salazarp.tpl перекрывает стандартный вывод плагина для шаблона  /themes/barebones/plugin.tpl, то сделал его почти таким же:</p>

<pre class="brush:php;">
&lt;!-- BEGIN: MAIN --&gt;
    {PLUGIN_BODY}
&lt;!-- END: MAIN --&gt;</pre>

<p>а в файле salazarp.php сделал подключение шаблона в переменную $t_sz и добавил: </p>

<pre class="brush:php;">
if (!empty($plugin_body)) {
	$t-&gt;assign('PLUGIN_BODY',$plugin_body); //если не пустая переменная $plugin_body, то будет выводится её содержимое
} else {
	$t=$t_sz; //если переменная $plugin_body пустая, то будет выводится содержимое блока MAIN
}</pre>

<p> </p>
<p><strong>Добавлено 1 день спустя:</strong></p><p>Что-то немогу добавить JS и CSS файлы в &lt;head&gt;. Посмотрел как в других плагинах - сделал файл salazarp.rc.php туда положил код:</p>

<pre class="brush:php;">
/* ====================
[BEGIN_COT_EXT]
Hooks=rc
[END_COT_EXT]
==================== */

define('SALAZARP_PLUG', $cfg['plugins_dir'].'/salazarp/');
cot_rc_add_file(SALAZARP_PLUG . 'js/moment.min.js');
cot_rc_add_file(SALAZARP_PLUG . 'js/daterangepicker.jss');
cot_rc_add_file(SALAZARP_PLUG . 'tpl/daterangepicker-bs2.css');</pre>

<p>Неработает. Может с хуками не до конца разобрался, его (этот файл) как-то подключать нужно?</p>
]]></description>
			<pubDate>Thu, 19 Лют 2015 05:41:27 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=7887&d=0#post40584]]></link>
		</item>
		<item>
			<title>Dayver</title>
			<description><![CDATA[<p>Ребята, не превращайте полезный топик в каталог ресурсов</p>
]]></description>
			<pubDate>Ср, 18 Лют 2015 18:32:51 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=7887&d=0#post40578]]></link>
		</item>
		<item>
			<title>Wilder</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/forums?m=posts&amp;q=7887&amp;d=1#40544">#40544</a> <strong>Salador:</strong></blockquote>

<blockquote><strong>Шаг 3, Поиск информации:</strong>

<p>Информации очень мало нашел всего 3 сайта:</p>

<ol><li>Этот сайт, как понял главный <a href="http://www.cotonti.com/">http://www.cotonti.com/</a> </li>
	<li><a href="http://cmsworks.ru/" rel="nofollow">http://cmsworks.ru/</a></li>
	<li><a href="http://mycotonti.ru/" rel="nofollow">http://mycotonti.ru/</a></li>
</ol></blockquote>

<p>Кроме этого, еще:</p>

<ul><li><a href="http://littledev.ru/" rel="nofollow">http://littledev.ru/</a></li>
	<li><a href="http://www.seditio.by/" rel="nofollow">http://www.seditio.by/</a></li>
	<li><a href="http://www.cotonti.mobi" rel="nofollow">http://www.cotonti.mobi</a></li>
	<li><a href="http://prohtml.net/" rel="nofollow">http://prohtml.net/</a></li>
	<li><a href="http://portal30.ru" rel="nofollow">http://portal30.ru</a></li>
</ul>]]></description>
			<pubDate>Ср, 18 Лют 2015 08:14:19 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=7887&d=0#post40569]]></link>
		</item>
		<item>
			<title>Salador</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/ru/forums?m=posts&amp;q=7887&amp;d=1#40548">#40548</a> <strong>Dayver: </strong>
<p>странно что пришлось искать на сторонних ресурсах.</p>
</blockquote>

<p>просто по привычке, чуть что сразу в поисковик.</p>

<p> </p>

<p><strong>Добавлено 1 час спустя:</strong></p>

<blockquote><a href="https://www.cotonti.com/ru/forums?m=posts&amp;q=7887&amp;d=1#40550">#40550</a> <strong>Macik: </strong>

<p><strong>По шагу 5</strong>:</p>

<p>Начисления и выплаты, возможно было бы логичнее разместить в одной таблице,</p>
</blockquote>

<p>точно, так и сделаю</p>

<p>С кэшем не получилось выдает ошибку на функцию</p>

<pre class="brush:php;">
XTemplate::init(array('cache' =&gt; $cfg['xtpl_cache']));</pre>

<p><b style="color:rgb(0,0,0);font-family:'Times New Roman';font-size:medium;line-height:normal;">Fatal error</b><span style="color:rgb(0,0,0);font-family:'Times New Roman';font-size:medium;line-height:normal;">: Uncaught exception 'Exception' with message 'Your "/templates/" is not writable' in /home/proficit/public_html/mysyte.ru/system/cotemplate.php:348 Stack trace: #0 /home/proficit/public_html/mysyte.ru/system/cotemplate.php(88): XTemplate-&gt;restart('themes/barebone...') #1 /home/proficit/public_html/mysyte.ru/system/header.php(82): XTemplate-&gt;__construct('themes/barebone...') #2 /home/proficit/public_html/mysyte.ru/system/plugin.php(118): require_once('/home/proficit/...') #3 /home/proficit/public_html/mysyte.ru/index.php(172): require_once('/home/proficit/...') #4 {main} thrown in </span><b style="color:rgb(0,0,0);font-family:'Times New Roman';font-size:medium;line-height:normal;">/home/proficit/public_html/mysite</b><b style="color:rgb(0,0,0);font-family:'Times New Roman';font-size:medium;line-height:normal;">.ru/system/cotemplate.php</b><span style="color:rgb(0,0,0);font-family:'Times New Roman';font-size:medium;line-height:normal;"> on line </span><b style="color:rgb(0,0,0);font-family:'Times New Roman';font-size:medium;line-height:normal;">348</b></p>

<p>права на папку /datas/cache/templates - 777 и видно что он туда записывает кэш.</p>

<p>получается 'cache' =&gt; false работает, а 'cache' =&gt; true выдает ошибку.</p>

<p> </p>

<p> </p>

<p><strong>Добавлено 15 минут спустя:</strong></p>

<h3><strong>Шаг 8, (Изменение):</strong></h3>

<p>Переделал как подсказал <strong>Macik </strong> убрал папку lib из нее все файлы перекинул в папку inc, изменил код salazarp.php на этот</p>

<pre class="brush:php;">
$mode = cot_import('mode','G','TXT'); //Проверяем на какой странице находимся например: mode= addsotr

$sala_pages=array('addsotr','outsotr'); //Список страниц которые будут в Модуле
$sala_links=sala_zap_url($sala_pages); //Функция создания ссылок на страницы
if ($cfg['debug_mode']) XTemplate::init(array('cache' =&gt; false )); // временно отключаем кэш если включен режим отладки 
if ((!empty($mode)) &amp;&amp; in_array($mode, $sala_pages)) {
	$t= new XTemplate(cot_tplfile(array('salazarp', $mode), 'plug')); // подключает шаблон, если $mode=addsotr ищет шаблон tpl/salazarp.addsotr.tpl
	require_once cot_incfile('salazarp', 'plug', $mode); // подключает скрипт, если $mode=addsotr ищет скрипт inc/salazarp.addsotr.php
}
//XTemplate::init(array('cache' =&gt; $cfg['xtpl_cache'])); // возвращаем значения кэша заданные для сайта (!пока выдает ошибку)</pre>

<p>впринципе уже можно начинать писать на нем свой плагин.</p>

<p> </p>
]]></description>
			<pubDate>Вт, 17 Лют 2015 15:22:52 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=7887&d=0#post40557]]></link>
		</item>
		<item>
			<title>Macik</title>
			<description><![CDATA[<p>Отличная инструкция для новичков. Спасибо.</p>

<p>Далее немного комментариев</p>

<p><strong>По шагу 5</strong>:</p>

<ol><li>Начисления и выплаты, возможно было бы логичнее разместить в одной таблице, а суммы даже в одной колоноке (просто с разным знаком). Это позволит, во-первых, делать меньше запросов к БД, а во-второых, некоторые расчеты осуществлять силами SQL и самой БД.</li>
</ol><p><strong>По шагу 6</strong>:</p>

<ol><li>Да, отдельные шаблоны как правило удобнее для поддержки. Тем не менее, особенно если плагин не большой, можно иметь один шаблон с несколькими блоками:
	<pre class="brush:xml;">
&lt;!-- BEGIN: ADD_USER --&gt;
…
&lt;!-- END: ADD_USER --&gt;

&lt;!-- BEGIN: EDIT_USER --&gt;
…
&lt;!-- END: EDIT_USER --&gt;

…</pre>

	<p>и при выводе парсить нужный блок.</p>
	</li>
	<li>Вызов шаблона лучше осуществлять таким образом:
	<pre class="brush:php;">
$t_salas= new XTemplate(cot_tplfile(array('salazarp', $mode), 'plug'));</pre>

	<p>где в переменной `$mode` у нас находится название текущей страницы (режима в котором работает плагин). См. об этом подробнее в комментарии к шагу 8.</p>
	</li>
	<li>Если мы работает с блоком `MAIN`, его название можно опускать. Кроме этого вызовы функций шаблонизатора можно увязывать в цепочку:
	<pre class="brush:xml;">
$plugin_body = $t_salas-&gt;parse()-&gt;text();</pre>

	<p>(не забываем сделать парсинг нужного блока перед выводом)</p>
	</li>
	<li>По шаблонам, логика такая (если код шаблона вызывается по хуку `standalone`) — если определен шаблон `имя_плагина.php` или `plugin.<span style="line-height:18.9090900421143px;">имя_плагина.php</span><span style="line-height:18.9090900421143px;">`</span>, то он будет загружен автоматически в переменную `$t` (тогда можно использовать вариант с несколькими блоками, см. выше. Блок `MAIN` будет обработан автоматически). Иначе грузится стандартный шаблон <span style="line-height:18.9090900421143px;">`plugin</span><span style="line-height:18.9090900421143px;">.php</span><span style="line-height:18.9090900421143px;">` (обычно находится в папке с темой оформления).</span><br />
	Если хочется использовать свой (например отдельный для кождого раздела), то есть 2 варианта:<br />
	   ​а). загрузить шаблон в отдельную переменную (как описано у тебя) и потом делать вывод в переменную `$plugin_body`.<br />
	   б). грузить свой шаблон «напрямую», переопределяя переменную `$t`. (В таком случае блок `MAIN` будет обработан автоматически).</li>
	<li>Кеширование шаблонов зависит от разных параметров. И в большинствеслучаев страницы обновляются при изменении шаблона.</li>
	<li>Если все же кеширование надо отключить — не надо отключать всю систему кеширования `<span style="color:rgb(68,68,68);font-family:sans-serif;line-height:20.8000011444092px;background-color:rgb(238,238,238);">$cfg['cache'] </span>`. Достаточно сделать это только для <span style="color:rgb(68,68,68);font-family:sans-serif;line-height:20.8000011444092px;background-color:rgb(238,238,238);">$cfg['xtpl_cache']</span>. Более того для тестовых целей можно использовать параметры инициализации шаблонизатора, не отключая кеширование на всем сайте:
	<pre class="brush:php;">
if ($cfg['debug_mode']) XTemplate::init(array('cache' =&gt; false )); // временно отключаем 
$plug_tpl = new XTemplate(…); // инициализируем наш шаблон
XTemplate::init(array(	'cache' =&gt; $cfg['xtpl_cache'] )); // возвращаем значения заданные для сайта</pre>

	<p> </p>
	</li>
</ol><p><strong>По шагу 8</strong>:</p>

<ol><li>переменная «s» в некоторых модулях используется системой для переключения режима сортировки выводимой информации. Поэтому, чтобы не было путаницы лучше изменить на что-то другое. И лучще если это будет более осмысленное название, например «mode».</li>
	<li>Строку 4 с проверкой на не пустое значение для большей безопасности лучше дополнить проверкой на допустимые значения —  `&amp;&amp; in_array('addsotr', '<span style="color:rgb(68,68,68);font-family:sans-serif;line-height:20.8000011444092px;background-color:rgb(238,238,238);">outsotr</span>', …)`</li>
	<li>В фрейморке уже есть некоторый код облегчающий загрузку частей кода в зависимости от выбранного режима. Если файлы `salazarp.addsotr.php` и прочие `salazarp.*.php` расположить в папке `/inc` своего расшрирения, то вызов нужной (строка 6) сведется к следующему:
	<pre class="brush:php;">
require_once cot_incfile('page', 'plug', $mode);</pre>

	<p> </p>
	</li>
</ol>]]></description>
			<pubDate>Вт, 17 Лют 2015 11:53:08 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=7887&d=0#post40550]]></link>
		</item>
		<item>
			<title>Dayver</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/forums?m=posts&amp;q=7887&amp;d=1#40544">#40544</a> <strong>Salador: </strong>
<h3><strong>Шаг 1, Установка:</strong></h3>

<p>Впринципе поставился легко. Возникла небольшая проблемка, ставил последнюю версию 0.9.18, версия php была 5.2.7 при установке всё нормально, но после установки сайт не загружался показывал ошибку (какая ошибка была - забыл) после поиска по ошибке нашел что аналогичная блыла на Joomle и связана с версией php. Установил php 5.3 и всё заработало. <strong>Вывод для разработчиков:</strong> с версии <span style="line-height:20.7999992370605px;">0.9.18 (а может и раньше) нужно при установке проверять на php 5.3.</span></p>
</blockquote>

<p>Обязательно проверять будет, для этого уже созданна <a href="https://github.com/Cotonti/Cotonti/issues/1395" rel="nofollow">заявка</a>. Да и <a href="http://www.cotonti.com/ru/news/announce/cotonti-siena-0918-released">в комментариях</a> и на <a href="http://www.cotonti.com/download/siena_0918">странице релиза</a> уже упоминалось об этом требовании, странно что пришлось искать на сторонних ресурсах. Просто забыли и поздно спохватились с проверкой версии, уже после релиза опомнились.</p>
]]></description>
			<pubDate>Пн, 16 Лют 2015 22:25:27 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=7887&d=0#post40548]]></link>
		</item>
		<item>
			<title>Salador</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/ru/forums?m=posts&amp;q=7887&amp;d=1#40545">#40545</a> <strong>Dr2005alex: </strong>
<p>Поздравляю !!! Начало положено...</p>
</blockquote>

<p>Благодарю.</p>

<p><strong>Добавлено 5 минут спустя:</strong></p>

<blockquote><a href="https://www.cotonti.com/ru/forums?m=posts&amp;q=7887&amp;d=1#40546">#40546</a> <strong>Dayver: </strong>

<p>Любой залогиненый пользователь может на доступной ему странице /index.php?e=users&amp;m=profile выбрать тему отображения сайта среди тек которые есть в папке тем.</p>
</blockquote>

<p>Понятно, а я искал в админке. </p>

<p><strong>Добавлено 1 час спустя:</strong></p>

<h3><strong>Шаг 8, Делаем на каждую страницу свой скрипт и шаблон:</strong></h3>

<p>Нужно чтобы каждая страница (например: добавление сотрудников) обрабатывалась отдельным файлом.</p>

<p>Пробовал через хуки (<a href="http://mycotonti.ru/docs/ext/exten/Hook-xuk-v-cotonti" rel="nofollow">Информация по хукам Cotonti</a>) - неполучилось, и они не для этого.</p>

<p>Незнаю есть ли встроенные методы, сделал по другому вроде норм в salazarp.php написал:</p>

<pre class="brush:php;">
define('SALAZARP_LIB', $cfg['plugins_dir'].'/salazarp/lib/salazarp.'); //Папка с подключаемыми модулями 
$sala_link = cot_import('s','G','TXT'); //Проверяем на какой странице находимся например: s= addsotr

if (!empty($sala_link)) {
	$t= new XTemplate(cot_tplfile('salazarp.'.$sala_link, 'plug')); // подключает шаблон, если $sala_link=addsotr ищет шаблон tpl/salazarp.addsotr.tpl
	require (SALAZARP_LIB . $sala_link . '.php'); // подключает скрипт, если $sala_link=addsotr ищет скрипт lib/salazarp.addsotr.php
}	</pre>

<p>еще сделал через скрипт чтобы все данные из языкового файла попадали в шаблон, но оказалось всё намного проще - в файле шаблона добавляется через <span style="line-height:20.7999992370605px;">{PHP.L.НАЗВАНИЕ_В_ЯЗЫКОВОМ_ФАЙЛЕ},  Например: </span></p>

<pre class="brush:php;">
$L['SZ_TITLE'] = "Пример плагина"; 	</pre>

<p><span style="line-height:20.7999992370605px;">Добавляем</span> {PHP.L.SZ_TITLE}</p>

<p>Вот текущая версия (<a href="http://www.cotonti.com/datas/users/salazarp4_3174.zip">Скачать</a>) седующая уже будет подстроена под мою задачу (без калькулятора умножения).</p>

<p> </p>
]]></description>
			<pubDate>Пн, 16 Лют 2015 19:14:03 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=7887&d=0#post40547]]></link>
		</item>
		<item>
			<title>Dayver</title>
			<description><![CDATA[<blockquote><a href="https://www.cotonti.com/forums?m=posts&amp;q=7887&amp;d=1#40544">#40544</a> <strong>Salador: </strong>
<ol><li>Основной шаблон: Выбрал <a href="http://www.cotonti.com/themes/barebones">Barebones </a>на Bootstrap - возникла небольшая проблемка не отображалась тема, в админке (Конфигурация-&gt;Темы) нужно поставить ДА в "<span style="color:rgb(58,69,75);font-family:'Open Sans', sans-serif;line-height:20px;background-color:rgb(249,249,249);">Принудительная установка темы по умолчанию для всех пользователей:</span>" и заработало. Я так понял что можно в настройках ставить разные темы разным пользователям, но не нашел как (если кто знает - подскажите).</li>
</ol></blockquote>

<p>Любой залогиненый пользователь может на доступной ему странице /index.php?e=users&amp;m=profile выбрать тему отображения сайта среди тек которые есть в папке тем. Вот как на этом сайте: <img alt="" src="http://www.cotonti.com/datas/users/2skrin_29.jpg" style="width:656px;height:664px;" /></p>
]]></description>
			<pubDate>Пн, 16 Лют 2015 17:33:28 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=7887&d=0#post40546]]></link>
		</item>
		<item>
			<title>Dr2005alex</title>
			<description><![CDATA[<p>Поздравляю !!! Начало положено...</p>
]]></description>
			<pubDate>Пн, 16 Лют 2015 15:42:21 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=7887&d=0#post40545]]></link>
		</item>
		<item>
			<title>Salador</title>
			<description><![CDATA[<h3><strong>Задача:</strong></h3>

<p>Мне нужно создать простую бухгалтерскую систему начисления и выплаты зарплаты. Система простая один человек вносит сколько начислено сотруднику второй сколько выплачено. </p>

<p>Система нужна для фермы, между тем кто будет начислять и выплачивать большое расстояние, так<span style="line-height:20.7999992370605px;"> как интернет очень слабый 1С не подходит</span>. Ничего простого в виде скрипта не нашел (только онлайн бухгатерии, но они с помесячной оплатой да и чтобы зарплату начислить много лишних действий нужно делать).</p>

<h3><strong>Выбор CMS:</strong></h3>

<p>Начал делать плагин под Wordpress но он слишком громоздкий для этого. Впринципе мне от CMS нужно: 1) Авторизация пользователей. 2) Легкая работа с базами данных, 3) Безопасность, 4) Шаблон на Bootstrap. Выбор на Cotonti пал из-за решения - <a href="http://cmsworks.ru/apps/freelance2" rel="nofollow">Фриланс биржи</a>  какое-то время назад оно попадалось мне, но нестал его использовать так как не знал CMS <span style="line-height:20.7999992370605px;">Cotonti</span>.</p>

<h3><strong>Шаг 1, Установка:</strong></h3>

<p>Впринципе поставился легко. Возникла небольшая проблемка, ставил последнюю версию 0.9.18, версия php была 5.2.7 при установке всё нормально, но после установки сайт не загружался показывал ошибку (какая ошибка была - забыл) после поиска по ошибке нашел что аналогичная блыла на Joomle и связана с версией php. Установил php 5.3 и всё заработало. <strong>Вывод для разработчиков:</strong> с версии <span style="line-height:20.7999992370605px;">0.9.18 (а может и раньше) нужно при установке проверять на php 5.3.</span></p>

<h3><strong>Шаг 2, Установка шаблонов:</strong></h3>

<ol><li>Шаблон администратора: Шаблон для админки <a href="http://mycotonti.ru/cotonti/theme/Bootos---shablon-admin-paneli" rel="nofollow">Bootos </a>на Bootstrap - поставился без проблем.</li>
	<li>Основной шаблон: Выбрал <a href="http://www.cotonti.com/themes/barebones">Barebones </a>на Bootstrap - возникла небольшая проблемка не отображалась тема, в админке (Конфигурация-&gt;Темы) нужно поставить ДА в "<span style="color:rgb(58,69,75);font-family:'Open Sans', sans-serif;line-height:20px;background-color:rgb(249,249,249);">Принудительная установка темы по умолчанию для всех пользователей:</span>" и заработало. Я так понял что можно в настройках ставить разные темы разным пользователям, но не нашел как (если кто знает - подскажите).</li>
</ol><p> </p>

<h3><strong>Шаг 3, Поиск информации:</strong></h3>

<p>Информации очень мало нашел всего 3 сайта:</p>

<ol><li>Этот сайт, как понял главный <a href="http://www.cotonti.com/">http://www.cotonti.com/</a> </li>
	<li><a href="http://cmsworks.ru/" rel="nofollow">http://cmsworks.ru/</a></li>
	<li><a href="http://mycotonti.ru/" rel="nofollow">http://mycotonti.ru/</a></li>
</ol><p>На главном сайте много информации для старых версий, для адаптации под новые нужно менять заголовки и приставку к функциям "sed_" заменить на "cot_" (Например: Функция sed_import будет - cot_import).</p>

<p>Справочник по функциям <a href="http://www.cotonti.com/reference/index-all.html">здесь</a>.</p>

<h3><strong>Шаг 4, Простой плагин:</strong></h3>

<p>Самый простой плагин взял отсюда (<a href="http://mycotonti.ru/blog/lesson_siena/Urok-1-Sozdanie-plagina-Hello-world" rel="nofollow">Создание плагина Hello World</a>), дальше использовал информацию (<a href="http://www.cotonti.com/docs/ru/plugins/sample_plagin">Создание простейшего плагина</a>) из документации. Пришлось немного подредактировать - вот что получилось на данном шаге (<a href="http://www.cotonti.com/datas/users/salazarp1_3174.zip">Скачать</a>) - Плагин как и в документации умножает введенные числа и выводит ответ. Имеет 4 файла: языковой, шаблона, установочный и исполняемы. Чтобы увидеть плагин нужно перейти по ссылке index.php?e=salazarp</p>

<p>cot_import - как понял важная функция которая обрабатывает все получаемые данные через запросы, <a href="http://www.cotonti.com/ru/docs/devel/validation_messages">вот информация по параметрам</a>.</p>

<p><strong>Добавлено 35 минут спустя:</strong></p>

<h3><strong>Шаг 5, Создание таблиц в базе данных:</strong></h3>

<p>Впринципе основная информация понятна. Переделываю плагин под себя. Для начала мне нужно чтобы в базе было три таблицы  1) Сотрудники 2) Начисления сотруднику 3) Выплаты сотруднику. </p>

<p>Впринципе в Contonti это делается легко - просто создаем дирректорию setup в папке плагина и в ней создаем файл nameplugin.install.sql (у меня salazarp<span style="line-height:20.7999992370605px;">.install.sql</span>) и туда добавляем sql скрипт создания таблицы.</p>

<p>Также добавляем файл <span style="line-height:20.7999992370605px;">nameplugin.uninstall.sql (у меня salazarp</span><span style="line-height:20.7999992370605px;">.uninstall.sql</span><span style="line-height:20.7999992370605px;">) там sql скрипт удаления таблиц.</span></p>

<p> </p>

<p> </p>

<p><strong>Добавлено 1 час спустя:</strong></p>

<h3><strong>Шаг 6, Несколько страниц в плагине:</strong></h3>

<p>Мне нужно чтобы в плагине было несколько страниц, данный момент думаю 5: 1) Создание сотрудника 2) Редактирование данных сотрудника 3) Ввод начислений сотруднику 4) Ввод выплат сотрудинку 5) Статистика по начислениям и выплатам на текущий месяц (можно на месяц по выбору).</p>

<p>Для каждой страницы желательно иметь свой файл шаблона.</p>

<p>Итак пока плагин умеет умножать введенные числа. Делаю так чтобы на одной странице он умножал числа, а на другой выводил результат. </p>

<p>В папку tpl плагина добавлем два файла salazarp.addsotr.tpl и salazarp.outsotr.tpl. Подключение этих шаблонов происходит через XTemplate вот информация (<a href="http://www.cotonti.com/ru/docs/ext/extensions/xtemplate_programming">Ссылка1</a>, <a href="http://www.cotonti.com/reference/api%20-%20cotemplate/xtemplate.html">Ссылка 2</a>).</p>

<p>Подключение шаблона -  </p>

<pre class="brush:php;">
$t_salas= new XTemplate(cot_tplfile('salazarp.addsotr', 'plug'));</pre>

<p>Как я понял вывод шаблона должен происходить через одну из функций.</p>

<pre class="brush:php;">
$t_salas-&gt;out('MAIN');
</pre>

<p>или</p>

<pre class="brush:php;">
$plugin_body = $t_salas-&gt;text('MAIN');</pre>

<p><strong><em>Но у меня они выводятся криво, и еще вместе с шаблоном показывается название плагина, может кто знает решение? </em></strong>Поэтому я пока решил выводить через главный шаблон.</p>

<pre class="brush:php;">
$t-&gt;assign('SALAZARP_PAGES', $t_salas-&gt;text('MAIN'));</pre>

<p>Вот что получилось на данный момент, на одной странице плагина вводятся данные для умножения, а на другой - ответ (<a href="http://www.cotonti.com/datas/users/salazarp_3174.zip">Скачать</a>).</p>

<p>При работе возникла проблема с кэшем (страница плагина не обновлялась после изменений) - в файле datas/config.php  ищем $cfg['cache'] = <strong>TRUE</strong>; и  $cfg['xtpl_cache'] = <strong>TRUE</strong>; и заменяем на FALSE.</p>

<p><strong>Добавлено 2 часа спустя:</strong></p>

<h3><strong>Шаг 7, Отдельный файл функций:</strong></h3>

<p>Нужно для функций сделать отдельный файл. Решил для начала вынести умножение в функцию.</p>

<p>Информацию не искал, просто как в других плагинах сделал папку inc и в ней создал файл salazarp.functions.php и добавил код.</p>

<pre class="brush:php;">
defined('COT_CODE') || die('Wrong URL.');

function sala_proizved($d_1, $d_2) {
	
	$proizved = $d_1*$d_2; 
	return ($proizved);
}
</pre>

<p>В основном файле заменил </p>

<pre class="brush:php;">
$proizved = $d_1*$d_2; 
на
$proizved = sala_proizved($d_1,$d_2);</pre>

<p>Всё заработало.</p>
]]></description>
			<pubDate>Пн, 16 Лют 2015 07:35:55 -0000</pubDate>
			<link><![CDATA[https://www.cotonti.com/ua/forums?m=posts&q=7887&d=0#post40544]]></link>
		</item>
	</channel>
</rss>