<?php
echo '<style>
table,td,tr{border: 1px green solid; padding : 2px;text-align :center;border-collapse: collapse;}</style>';
$data = [ // при запросе из БД отсортируй по дате
['fio'=>'Kolya', 'date'=>'12.12.19', 'cha'=>'12'],
['fio'=>'Petya', 'date'=>'12.12.19', 'cha'=>'12'],
['fio'=>'Vasya', 'date'=>'12.12.19', 'cha'=>'5'],
['fio'=>'Seroja', 'date'=>'13.12.19','cha'=>'2'],
['fio'=>'Igor', 'date'=>'14.12.19', 'cha'=>'6'],
['fio'=>'Sanya', 'date'=>'14.12.19', 'cha'=>'5'],
['fio'=>'Kolya', 'date'=>'15.12.19', 'cha'=>'6'],
['fio'=>'Kolya', 'date'=>'16.12.19', 'cha'=>'2'],
['fio'=>'Vasya', 'date'=>'17.12.19', 'cha'=>'2'],
['fio'=>'Igor', 'date'=>'18.12.19', 'cha'=>'2'],
['fio'=>'Kolya', 'date'=>'18.12.19', 'cha'=>'2'],
];
$allDates = array_unique(array_column($data,'date'));
echo "<table><tr><td>Name</td><td>".implode('</td><td>',$allDates)."</td></tr>";
foreach(array_unique(array_column($data,'fio')) as $name){
echo "<tr><td>$name</td>";
foreach($allDates as $day){
foreach($data as $i){
if($i['fio']==$name && $i['date']==$day && print("<td>{$i['cha']}</td>"))
continue 2;
}
echo "<td>-</td>";
}
echo "</tr>";
}
echo "</table>";
SELECT DISTINCT
users.`users_id`,
users.`name`,
user_dolg.`date`,
SUM(user_dolg.hours) AS sub_hours
FROM `user_dolg`
INNER JOIN `users`
ON users.`users_id` = user_dolg.`user_id`
WHERE user_dolg.`date` BETWEEN '" . $starttime . "' AND '" . $endtime . "'
GROUP BY users.`users_id`, users.`name`, user_dolg.`date`
HAVING COUNT(1) > 1
не совсем понимаю пока что принцип vpn (видимо только он мне и нужен)
я не знаю что это и поможет ли
какие роутеры в остальных офисах я пока не знаю
у меня есть ubuntu сервер в этой же сети с роутером и софтом, может это как то поможет
#можно так
echo TEMPLATEPATH . 'part/to/action/php';
# а можно так
echo home_url('/action_page')
require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' );
crontab -e
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
###
ВОТ ТУТ ПИШИТЕ СВОЁ РАСПИСАНИЕ ДЛЯ CRON
###
* * * * * /home/$user/bash.sh
crontab -l
crontab -u UserName -e
Вы укажите, от имени какого пользователя будет запускаться cron./var/spool/cron/crontabs
. В этой директории будет создан файл с названием по имени пользователя системы. Вот он как раз и редактируется через crontab -e
./etc/cron.d
. В этом случае надо указывать имя пользователя, от которого будет запускаться задание./etc/cron.daily
, /etc/cron.hourly
, /etc/cron.monthly
, /etc/cron.weekly
. В этих директориях можно разместить файлы с заданиями, которые будут запускаться ежедневно, ежечасно, ежемесячно и еженедельно соответственно. function interval(arr, delay, callback) {
let index = -1;
return setInterval(() => {
index = (index + 1) % arr.length;
callback(arr[index]);
}, delay);
}
const intervalId = interval(keys, 1500, function(text) {
this.innerText = text;
}.bind(document.querySelector('.slide-words')));
<button>toggle disabled</button>
<select>
<option value="">выбрать</option>
<option value="69">hello, world!!</option>
<option value="187">fuck the world</option>
<option value="666">fuck everything</option>
</select>
const $select = $('select');
$('button').click(function() {
$select
.prop('disabled', (i, val) => !val)
.val('')
.find('[value=""]')
.text(() => $select.prop('disabled') ? 'тут ничего нет' : 'выбрать');
});
// или
const select = document.querySelector('select');
document.querySelector('button').addEventListener('click', () => {
select.disabled = !select.disabled;
select.value = '';
select.options[0].textContent = select.disabled ? 'тут ничего нет' : 'выбрать';
});
$('table').on('change', 'select', ({ target: t }) => {
const isNone = t.value === 'none';
$(t)
.closest('td')
[isNone ? 'nextAll' : 'next']()
.find('select')
.prop('disabled', isNone)
.val((i, val) => isNone ? 'none' : val);
});
document.querySelector('table').addEventListener('change', ({ target: t }) => {
if (t.tagName === 'SELECT') {
const isNone = t.value === 'none';
const { cellIndex: i, parentNode: { children } } = t.closest('td');
[...children].slice(i + 1, isNone ? undefined : i + 2).forEach(n => {
const select = n.querySelector('select');
select.disabled = isNone;
select.value = isNone ? 'none' : select.value;
});
}
});
$('#example thead tr:eq(1) th').slice(2).each(... дальше всё как было
не проканало, то есть визуально все как надо но по факту поиск из фильтра стал работать не в той колонке
table.column(i)
, а table.column(i + 2)
. Или не полагаться на передаваемый индекс, а вычислять его самостоятельно, что-то вроде const index = $(this).closest('th').index()
.