понедельник, 14 января 2008 г.

добавление поля редактирования даты создания документа (createdon) в менеджере

Одной из проблем, с которыми приходилось сталкиваться не раз - запись даты создания документа задним числом. Можно создавать TV типа date, можно записывать даты в pub_date и тд. Однако, если вы не задаете абсолютно всем документам дату в своем параметре и для каких то документов он остается пустым - возникнут проблемы с сортировкой этих документов с помощью Ditto.

Вот захотелось набраться наглости и сделать в панели редактирования документа дополнительное поле, позволяющее редактировать дату создания документа (createdon). Создавая документ задним числом, вы просто редактируете дату его создания, а по умолчанию естественно задается текущая дата. Итак нужно выполнить следующие шаги:
  1. в manager/actions/mutate_content.dynamic.php меняем
    // retain form values if template was changed
    // edited to convert pub_date and unpub_date
    // sottwell 02-09-2006
    if ($formRestored == true || isset ($_REQUEST['newtemplate'])) {
    $content = array_merge($content, $_POST);
    $content["content"] = $_POST["ta"];
    if (empty ($content["pub_date"])) {
    unset ($content["pub_date"]);
    } else {
    $pub_date = $content['pub_date'];
    list ($d, $m, $Y, $H, $M, $S) = sscanf($pub_date, "%2d-%2d-%4d %2d:%2d:%2d");
    $pub_date = strtotime("$m/$d/$Y $H:$M:$S");
    $content['pub_date'] = $pub_date;
    }
    if (empty ($content["unpub_date"])) {
    unset ($content["unpub_date"]);
    } else {
    $unpub_date = $content['unpub_date'];
    list ($d, $m, $Y, $H, $M, $S) = sscanf($unpub_date, "%2d-%2d-%4d %2d:%2d:%2d");
    $unpub_date = strtotime("$m/$d/$Y $H:$M:$S");
    $content['unpub_date'] = $unpub_date;
    }
    }
    на
    // retain form values if template was changed
    // edited to convert pub_date and unpub_date
    // sottwell 02-09-2006
    if ($formRestored == true || isset ($_REQUEST['newtemplate'])) {
    $content = array_merge($content, $_POST);
    $content["content"] = $_POST["ta"];
    if (empty ($content["pub_date"])) {
    unset ($content["pub_date"]);
    } else {
    $pub_date = $content['pub_date'];
    list ($d, $m, $Y, $H, $M, $S) = sscanf($pub_date, "%2d-%2d-%4d %2d:%2d:%2d");
    $pub_date = strtotime("$m/$d/$Y $H:$M:$S");
    $content['pub_date'] = $pub_date;
    }
    if (empty ($content["unpub_date"])) {
    unset ($content["unpub_date"]);
    } else {
    $unpub_date = $content['unpub_date'];
    list ($d, $m, $Y, $H, $M, $S) = sscanf($unpub_date, "%2d-%2d-%4d %2d:%2d:%2d");
    $unpub_date = strtotime("$m/$d/$Y $H:$M:$S");
    $content['unpub_date'] = $unpub_date;
    }

    if (empty ($content["createdon"])) {
    unset ($content["createdon"]);
    } else {
    $createdon = $content['createdon'];
    list ($d, $m, $Y, $H, $M, $S) = sscanf($createdon, "%2d-%2d-%4d %2d:%2d:%2d");
    $createdon = strtotime("$m/$d/$Y $H:$M:$S");
    $content['createdon'] = $createdon;
    }
    }

  2. добавляем в manager/actions/mutate_content.dynamic.php до строки 700(приблизительно, строка содержит <input name="pub_date">
    <tr>
    <td><span class="warning">Дата создания</span></td>
    <td>
    <?php
    $timestamp = time();
    ?>
    <input name="createdon" value="<?php echo $content['createdon']=="0" || !isset($content['createdon']) ? strftime("%d-%m-%Y %H:%M:%S", $timestamp) : strftime("%d-%m-%Y %H:%M:%S", $content['createdon']); ?>" onblur="documentDirty=true;" />
    <a onclick="documentDirty=false; cal0.popup();" onmouseover="window.status='<?php echo $_lang['select_date']; ?>'; return true;" onmouseout="window.status=''; return true;" style="cursor:pointer; cursor:hand"><img src="media/style/<?php echo $manager_theme ? "$manager_theme/":""; ?>images/icons/cal.gif" width="16" height="16" border="0" alt="<?php echo $_lang['select_date']; ?>" /></a>
    </td>
    </tr>
  3. добавляем в manager/actions/mutate_content.dynamic.php в самый конец файла, в после строки
    <script type="text/javascript">
    ... следующий код:
      var cal0 = new calendar1(document.forms['mutate'].elements['createdon'], document.getElementById("pub_date_show"));
    cal0.path="<?php echo str_replace("index.php", "media/", $_SERVER["PHP_SELF"]); ?>";
    cal0.year_scroll = true;
    cal0.time_comp = true;
  4. добавляем в manager/processors/save_content.processor.php после строки "$hidemenu = intval($_POST['hidemenu']);":
    $createdon = $_POST['createdon'];
    list ($d, $m, $Y, $H, $M, $S) = sscanf($createdon, "%2d-%2d-%4d %2d:%2d:%2d"); //added by yentsun
    $createdon = mktime($H, $M, $S, $m, $d, $Y);
  5. в manager/processors/save_content.processor.php меняем sql-запрос, начинающийся с INSERT на
    $sql = "INSERT INTO $tblsc (introtext,content, pagetitle, longtitle, type, description, alias, link_attributes, isfolder, richtext, published, parent, template, menuindex, searchable, cacheable, createdby, createdon, editedby, editedon, publishedby, publishedon, pub_date, unpub_date, contentType, content_dispo, donthit, menutitle, hidemenu)
    VALUES('" . $introtext . "','" . $content . "', '" . $pagetitle . "', '" . $longtitle . "', '" . $type . "', '" . $description . "', '" . $alias . "', '" . $link_attributes . "', '" . $isfolder . "', '" . $richtext . "', '" . $published . "', '" . $parent . "', '" . $template . "', '" . $menuindex . "', '" . $searchable . "', '" . $cacheable . "', '" . $modx->getLoginUserID() . "', " . $createdon . ", '" . $modx->getLoginUserID() . "', " . time() . ", " . $publishedby . ", " . $publishedon . ", '$pub_date', '$unpub_date', '$contentType', '$contentdispo', '$donthit', '$menutitle', '$hidemenu')";
    , блок
    $sql = "UPDATE $tblsc SET introtext='$introtext', content='$content', pagetitle='$pagetitle', longtitle='$longtitle', type='$type', description='$description', alias='$alias', link_attributes='$link_attributes',
    isfolder=$isfolder, richtext=$richtext, published=$published, pub_date=$pub_date, unpub_date=$unpub_date, parent=$parent, template=$template, menuindex='$menuindex',
    searchable=$searchable, cacheable=$cacheable, editedby=" . $modx->getLoginUserID() . ", editedon=" . time() . ", publishedon=$publishedon, publishedby=$publishedby, contentType='$contentType', content_dispo='$contentdispo', donthit='$donthit', menutitle='$menutitle', hidemenu='$hidemenu' WHERE id=$id;";
    на
    $sql = "UPDATE $tblsc SET introtext='$introtext', content='$content', pagetitle='$pagetitle', longtitle='$longtitle', type='$type', description='$description', alias='$alias', link_attributes='$link_attributes',
    isfolder=$isfolder, richtext=$richtext, published=$published, pub_date=$pub_date, unpub_date=$unpub_date, parent=$parent, template=$template, menuindex='$menuindex',
    searchable=$searchable, cacheable=$cacheable, editedby=" . $modx->getLoginUserID() . ", editedon=" . time() . ", publishedon=$publishedon, publishedby=$publishedby, contentType='$contentType', content_dispo='$contentdispo', donthit='$donthit', menutitle='$menutitle', hidemenu='$hidemenu', createdon='$createdon' WHERE id=$id;";
    (добавляем в хвост запроса строку createdon='$createdon')


-----------------

Хотите запечатлеть важнейшие моменты в жизни? Воспользуйтесь свадебной фотографией Марины Салмановой.

12 комментариев:

Unknown комментирует...

О ура! Наконец-то личный блог про MODx. Пасибо - будем заглядовать

serdeles комментирует...
Этот комментарий был удален автором.
serdeles комментирует...

Поле с датой-то добавилось, но в ней выставляется 01-01-1970 03:00:00. При этом сортировка (в вызове стоит sortBy=`createdon`) происходит совершенно кувырком вне всякой логики. Например, есть три документа: 1, 2, 3. Я хочу расположить их в порядке 3,2,1. Меняю даты: соответственно, более ранний должен быть последним, а созданный недавно - первым. В итоге получаю что угодно, только не то, что нужно. Так вот.

yentsun комментирует...

Очень жаль что не заработало, видимо где то в статье я допустил ошибку. Вот, однако, файлы, взятые с работающего сервера (архив распаковать в корневую папку), MODx версии 0.9.6.1, американский сервер, поэтому в коде дописаны некоторые штуки для учета временной разницы: http://s31183.gridserver.com/createdon_field.rar

serdeles комментирует...

Спасибо, Макс. Заплатка вроде как работает. Я бегло протестил на локалхосте, вроде фурычит. Конечно, там у меня только три тестовых документа, не знаю, будет ли это работать с большим числом документов. Смущает дата создания. Надо как-то настроить собственный часовой пояс юзера, а то по умолчанию дата выставляется на 12 часов вперёд )) Но главное, что цель в общем достигнута. Отличная работа, спасибо.

boblin комментирует...

все работает и сортируется, дата вставляется нужная. Спасибо!

Andrey комментирует...

Работает нормально, но при пересохранении документа, автоматически прибавляется один день. Как это вылечить?

yentsun комментирует...

если честно, я настраивал этот скрипт для работы на американском сервере и должен был (не помню где точно) прибавлять (или убавлять) 11 часов. Однако перед выкладыванием сюда, я эти прибавления убрал. Может где-то забыл... попробую найти

Andrey комментирует...

Спасибо, в архиве rar, в файле mutate_content.dynamic.php, в строках 716 и 717, надо убрать +39600. Теперь не прибавляет.

Анонимный комментирует...

А кто-нибудь ставил на 0963 ?
Подскажите какие надо внести изменения...

Анонимный комментирует...

Who knows where to download XRumer 5.0 Palladium?
Help, please. All recommend this program to effectively advertise on the Internet, this is the best program!

Алексей комментирует...

Попробовал, с первого раза не прокатило. Возился 2 часа, потом исправил запросе $sql = "UPDATE $tblsc переменную на $sql = "UPDATE $tbl_site_content и все заработало. Исправлял ТОЛЬКО В ЭТОМ ЗАПРОСЕ. Правда календарик не всплывает, да и фиг с ним. Руками подставить можно. Автору респект за титанический труд!