Ежегодная нумерация

Главные вкладки

Аватар пользователя SScrew SScrew 12 августа 2013 в 17:44

Всем привет! Стоит задача выдавать автоматически заголовок для содержимого, вида "Документ №ххх от хх.хх.хххх". Нумерацию я делаю с помощью модуля Serial, а дату и собственно автоматический заголовок делаю модулем Automatic entity labels. Все хорошо, но вот нужно чтобы каждый год, глобальный счетчик Serial сбивался в 0, т.е. чтобы в системе было два документа: "Документ №7 от 20.11.2013" и например "Документ №7 от 20.11.2012".
Какие есть мысли по этому поводу?

Комментарии

Аватар пользователя Chyvakoff Chyvakoff 12 августа 2013 в 17:47

Каждый год, тридцать первого декабря мы с друзьями идём в баню ищем где хранится значение этого счётчика и сбрасываем его вручную.
Думаю не напряжно раз в году руками чето делать.

Аватар пользователя webpavilion webpavilion 12 августа 2013 в 20:36

"Chyvakoff" wrote:
Думаю не напряжно раз в году руками чето делать.

мало ли вдруг сайт клиентский по схеме сделал и забыл, и каждый год после праздников будут теребить. скорее всего хранит в БД значение посмотрите в таблице "serial_$bundle_$field_name" по крону обнуляйте раз в год и всё.

p.s. я бы сделал совсем по другому:

1) хранить номер последнего документа в переменной
2) при создании документа инкремент переменной и установка заголовка по вашему шаблону
3) в крон каждое первое число в 0:00 сброс переменной в 0

итого 5 функции максимум: hook_node_presave, hook_form_alter, hook_cron, hook_uninstall, hook_install()
кода получилось бы строк 60 не больше

Аватар пользователя pazitiff pazitiff 13 августа 2013 в 10:09

webpavilion wrote:
"Chyvakoff" wrote:
Думаю не напряжно раз в году руками чето делать.

мало ли вдруг сайт клиентский по схеме сделал и забыл, и каждый год после праздников будут теребить. скорее всего хранит в БД значение посмотрите в таблице "serial_$bundle_$field_name" по крону обнуляйте раз в год и всё.

p.s. я бы сделал совсем по другому:

1) хранить номер последнего документа в переменной
2) при создании документа инкремент переменной и установка заголовка по вашему шаблону
3) в крон каждое первое число в 0:00 сброс переменной в 0

итого 5 функции максимум: hook_node_presave, hook_form_alter, hook_cron, hook_uninstall, hook_install()
кода получилось бы строк 60 не больше

Для удобства и сокращения кода, используй variable_set для записи счетчика переменной, и variable_get для извлечения. Раз в год по крону делай variable_set равной нулю и счётчик будет обнуляться.

Аватар пользователя SScrew SScrew 13 августа 2013 в 16:01

webpavilion wrote:
"Chyvakoff" wrote:
Думаю не напряжно раз в году руками чето делать.

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

Да, все верно, делаю для клиента, поэтому "руками" не вариант.

"Chyvakoff" wrote:
скорее всего хранит в БД значение посмотрите в таблице "serial_$bundle_$field_name" по крону обнуляйте раз в год и всё.

В базе нашел serial_$bundle_$field_name, не подскажете как добавить задание по обнулению в крон?

"Chyvakoff" wrote:
p.s. я бы сделал совсем по другому:

1) хранить номер последнего документа в переменной
2) при создании документа инкремент переменной и установка заголовка по вашему шаблону
3) в крон каждое первое число в 0:00 сброс переменной в 0

итого 5 функции максимум: hook_node_presave, hook_form_alter, hook_cron, hook_uninstall, hook_install()
кода получилось бы строк 60 не больше


Боюсь для меня на данный момент это слишком сложно, да и сроки уже поджимают.

Аватар пользователя Chyvakoff Chyvakoff 13 августа 2013 в 16:20

"SScrew" wrote:
не подскажете как добавить задание по обнулению в крон?

Это будет не легче, чем
"SScrew" wrote:
итого 5 функции максимум: hook_node_presave, hook_form_alter, hook_cron, hook_uninstall, hook_install()
кода получилось бы строк 60 не больше

"SScrew" wrote:
да и сроки уже поджимают

Что, скоро 2014?

Аватар пользователя SScrew SScrew 14 августа 2013 в 20:21

Chyvakoff wrote:
Что, скоро 2014?

Нет. Просто скоро, а точнее завтра, выходит шеф который с меня будет спрашивать систему.

Вобщем вкратце прочитал про то, как делается свой модуль, запилил функцию на хук крона (serial_reset_cron), тем самым решив проблему:

//Config
$host = "localhost";
$user = "root";
$password = "";
$database = "drupal";
$current_year = date("Y");

//Connection
$connect = mysql_connect ($host, $user, $password);
mysql_select_db ($database);

//Last cron timestamp
$last_cron = mysql_fetch_array (mysql_query("SELECT MAX(timestamp) FROM watchdog WHERE type='cron';"));
if (date("Y", $last_cron[0]) < $current_year)
{
mysql_query ("TRUNCATE TABLE serial_article_field_serial;"); //Flush counter
}

mysql_close ($connect);

API я не знаю, поэтому сделал так. Всем спасибо за помощь!

Аватар пользователя SScrew SScrew 15 августа 2013 в 14:13

webpavilion wrote:
посмотрите второй комментарий, куда уж подробнее то инструкцию. или мне за вас написать?

Вы описали логику. За какую сумму напишите за меня?

Аватар пользователя webpavilion webpavilion 15 августа 2013 в 14:28

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

Аватар пользователя SScrew SScrew 16 августа 2013 в 16:37

webpavilion wrote:
Извините нет возможности такими мелочами заниматься, минут на 15 работы - денег пяток баксов, думаю найдете желающих.

Спасибо за совет.

Аватар пользователя multpix multpix 14 августа 2013 в 22:06

"SScrew" wrote:
Нет. Просто скоро, а точнее завтра, выходит шеф который с меня будет спрашивать систему.
Вобщем вкратце прочитал про то, как делается свой модуль, запилил функцию на хук крона (serial_reset_cron), тем самым решив проблему:
//Config
$host = "localhost";
$user = "root";
$password = "";
$database = "drupal";
$current_year = date("Y");
//Connection
$connect = mysql_connect ($host, $user, $password);
mysql_select_db ($database);
//Last cron timestamp
$last_cron = mysql_fetch_array (mysql_query("SELECT MAX(timestamp) FROM watchdog WHERE type='cron';"));
if (date("Y", $last_cron[0]) < $current_year)
{
mysql_query ("TRUNCATE TABLE serial_article_field_serial;"); //Flush counter
}
mysql_close ($connect);

API я не знаю, поэтому сделал так. Всем спасибо за помощь!

ЗЫСЫЗ PIZDEC!
зафиксирую пост, что-бы было куда ссылать для примеров "ТАК ДЕЛАТЬ НЕЛЬЗЯ!"

Аватар пользователя Chyvakoff Chyvakoff 15 августа 2013 в 10:18

"webpavilion" wrote:
жуть то какая, только что умер котенок.

Уже не первый раз вижу, как люди в хуках подобное пишут.