web-dev-qa-db-ja.com

JHTML :: calendarの日付形式をd-m-Yに変更する方法

フォームには日付/時刻フィールドがあります。正しく機能しますが、日付の形式が正しくありません-オランダ語の日付表記(_d-m-Y_)が必要です。

日-月-年の代わりに、年-月-日として表示および保存します。

私のcalendar()メソッド呼び出しは次のようになります。

_JHTML::calendar($formattedDate, 'jform[created]', 'jform_created', "%Y-%m-%d %H:%M", array('showTime' => 'showTime', 'class' => 'inputbox'))
_

ここで、_$formattedDate_は_26-04-2019 08:45_のような文字列です。

4番目のパラメーターを_"%Y-%m-%d %H:%M"_から_"%d-%m-%Y %H:%M"_に変更すると、保存後にフォームフィールドが空になります。

日付をd-m-yとして表示して保存する正しい方法は何ですか?

Joomlaのバージョンは3.9.4で、PHPバージョンは7.1です。

テーブル#__contentのcreated列のデータ型は日時で、デフォルト値は_0000-00-00 00:00:00_です。他のフォームの値は保存されていますが、このカスタムの値だけは保存されていません。この日付列は、オーバーライドに追加した唯一のフィールドではありません。最初は$this->form->renderField('created')を試しましたが、日付ではなく時刻のみが表示されます。警告、通知エラー、その他のヒントは生成されません。

これは/ components/com_content/form/edit.phpのフロントエンド管理における私のオーバーライドです:

_<?php    
/**
 * @package     Joomla.Site
 * @subpackage  com_content
 *
 * @copyright   Copyright (C) 2005 - 2019 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

JHtml::_('behavior.tabstate');
JHtml::_('behavior.keepalive');
JHtml::_('behavior.formvalidator');
JHtml::_('formbehavior.chosen', '#jform_catid', null, array('disable_search_threshold' => 0));
JHtml::_('formbehavior.chosen', 'select');
$this->tab_name = 'com-content-form';
$this->ignore_fieldsets = array('image-intro', 'image-full', 'jmetadata', 'item_associations');

// Create shortcut to parameters.
$params = $this->state->get('params');

// This checks if the editor config options have ever been saved. If they haven't they will fall back to the original settings.
$editoroptions = isset($params->show_publishing_options);

if (!$editoroptions)
{
    $params->show_urls_images_frontend = '0';
}

JFactory::getDocument()->addScriptDeclaration("
    Joomla.submitbutton = function(task)
    {
        if (task == 'article.cancel' || document.formvalidator.isValid(document.getElementById('adminForm')))
        {
            " . $this->form->getField('articletext')->save() . "
            Joomla.submitform(task);
        }
    }
");
?>
<div class="edit item-page<?php echo $this->pageclass_sfx; ?>">
    <?php if ($params->get('show_page_heading')) : ?>
    <div class="page-header">
        <h1>
            <?php echo $this->escape($params->get('page_heading')); ?>
        </h1>
    </div>
    <?php endif; ?>

    <form action="<?php echo JRoute::_('index.php?option=com_content&a_id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="adminForm" class="form-validate form-vertical">
        <div class="btn-toolbar">
            <div class="btn-group">
                <button type="button" class="btn btn-primary" onclick="Joomla.submitbutton('article.save')">
                    <span class="icon-ok"></span><?php echo JText::_('JSAVE') ?>
                </button>
            </div>
            <div class="btn-group">
                <button type="button" class="btn" onclick="Joomla.submitbutton('article.cancel')">
                    <span class="icon-cancel"></span><?php echo JText::_('JCANCEL') ?>
                </button>
            </div>
            <?php if ($params->get('save_history', 0) && $this->item->id) : ?>
            <div class="btn-group">
                <?php echo $this->form->getInput('contenthistory'); ?>
            </div>
            <?php endif; ?>
        </div>
        <fieldset>
            <?php echo JHtml::_('bootstrap.startTabSet', $this->tab_name, array('active' => 'editor')); ?>

            <?php echo JHtml::_('bootstrap.addTab', $this->tab_name, 'editor', JText::_('COM_CONTENT_ARTICLE_CONTENT')); ?>
                <?php echo $this->form->renderField('title'); ?>

                <?php if (is_null($this->item->id)) : ?>
                    <?php echo $this->form->renderField('alias'); ?>
                <?php endif; ?>

                <?php echo $this->form->getInput('articletext'); ?>

                <?php if ($this->captchaEnabled) : ?>
                    <?php echo $this->form->renderField('captcha'); ?>
                <?php endif; ?>
            <?php echo JHtml::_('bootstrap.endTab'); ?>

            <?php if ($params->get('show_urls_images_frontend')) : ?>
            <?php echo JHtml::_('bootstrap.addTab', $this->tab_name, 'images', JText::_('COM_CONTENT_IMAGES_AND_URLS')); ?>
                <?php echo $this->form->renderField('image_intro', 'images'); ?>
                <?php echo $this->form->renderField('image_intro_alt', 'images'); ?>
                <?php echo $this->form->renderField('image_intro_caption', 'images'); ?>
                <?php echo $this->form->renderField('float_intro', 'images'); ?>
                <?php echo $this->form->renderField('image_fulltext', 'images'); ?>
                <?php echo $this->form->renderField('image_fulltext_alt', 'images'); ?>
                <?php echo $this->form->renderField('image_fulltext_caption', 'images'); ?>
                <?php echo $this->form->renderField('float_fulltext', 'images'); ?>
                <?php echo $this->form->renderField('urla', 'urls'); ?>
                <?php echo $this->form->renderField('urlatext', 'urls'); ?>
                <div class="control-group">
                    <div class="controls">
                        <?php echo $this->form->getInput('targeta', 'urls'); ?>
                    </div>
                </div>
                <?php echo $this->form->renderField('urlb', 'urls'); ?>
                <?php echo $this->form->renderField('urlbtext', 'urls'); ?>
                <div class="control-group">
                    <div class="controls">
                        <?php echo $this->form->getInput('targetb', 'urls'); ?>
                    </div>
                </div>
                <?php echo $this->form->renderField('urlc', 'urls'); ?>
                <?php echo $this->form->renderField('urlctext', 'urls'); ?>
                <div class="control-group">
                    <div class="controls">
                        <?php echo $this->form->getInput('targetc', 'urls'); ?>
                    </div>
                </div>
            <?php echo JHtml::_('bootstrap.endTab'); ?>
            <?php endif; ?>

            <?php echo JLayoutHelper::render('joomla.edit.params', $this); ?>

            <?php echo JHtml::_('bootstrap.addTab', $this->tab_name, 'publishing', JText::_('COM_CONTENT_PUBLISHING')); ?>
            <?php echo $this->form->renderField('catid'); ?>
            <?php echo $this->form->renderField('tags'); ?>
            <?php echo $this->form->renderField('note'); ?>
            <?php if ($params->get('save_history', 0)) : ?>
                <?php echo $this->form->renderField('version_note'); ?>
            <?php endif; ?>
            <span style="display: none;">
                <?php if ($params->get('show_publishing_options', 1) == 1) : ?>
                    <?php echo $this->form->renderField('created_by_alias'); ?>
                <?php endif; ?>
            </span>
            <?php if ($this->item->params->get('access-change')) : ?>
                <span style="display: none;">
                    <?php echo $this->form->renderField('featured'); ?>
                </span>

                <?php echo $this->form->renderField('state'); ?>

                    <?php echo $this->form->renderField('publish_up'); ?>
                    <?php echo $this->form->renderField('publish_down'); ?>

                <?php if ($params->get('show_publishing_options', 1) == 1) : ?>
                    <?php echo $this->form->renderField('publish_down'); ?>
                <?php endif; ?>
            <?php endif; ?>


            <?php // Custom added by Yolknet ?>

            <?php
            // Your date from database
            $date = JFactory::getDate($this->item->created);
            $formattedDate = $date->format('d-m-Y H:i');
            ?>

            <div class="control-group">
                <div class="control-label"><label id="jform_created-lbl" for="jform_created">Date event</label></div>
                <div class="controls">
                    <div class="input-append">
                        <?php echo JHTML::calendar($formattedDate, 'jform[created]', 'jform_created', "%Y-%m-%d %H:%M:%S", array('translateformat' => true, 'showTime' => 'showTime', 'class' => 'inputbox')); ?>
                    </div>
                </div>
            </div>

            <?php // End custom added by Yolknet ?>


                <span style="display: none;">
                    <?php echo $this->form->renderField('access'); ?>
                </span>
                <?php if (is_null($this->item->id)) : ?>
                    <div class="control-group">
                        <div class="control-label">
                        </div>
                        <div class="controls">
                            <?php echo JText::_('COM_CONTENT_ORDERING'); ?>
                        </div>
                    </div>
                <?php endif; ?>
            <?php echo JHtml::_('bootstrap.endTab'); ?>

            <?php echo JHtml::_('bootstrap.addTab', $this->tab_name, 'language', JText::_('JFIELD_LANGUAGE_LABEL')); ?>
                <?php echo $this->form->renderField('language'); ?>
            <?php echo JHtml::_('bootstrap.endTab'); ?>

            <?php if ($params->get('show_publishing_options', 1) == 1) : ?> 
                <?php echo JHtml::_('bootstrap.addTab', $this->tab_name, 'metadata', JText::_('COM_CONTENT_METADATA')); ?>
                    <?php echo $this->form->renderField('metadesc'); ?>
                    <?php echo $this->form->renderField('metakey'); ?>
                <?php echo JHtml::_('bootstrap.endTab'); ?>
            <?php endif; ?>

            <?php echo JHtml::_('bootstrap.endTabSet'); ?>

            <input type="hidden" name="task" value="" />
            <input type="hidden" name="return" value="<?php echo $this->return_page; ?>" />
            <?php echo JHtml::_('form.token'); ?>
        </fieldset>
    </form>
</div>
_

過去数週間@zollieの大きな助けのおかげで、問題を解決しました。サードパーティのプラグインを無効にし、オーバーライドを作成しました。今では正しく機能しています。

2
YolkNet

基本的な問題は、SQLの日時フィールドの形式が'YYYY-MM-DD HH:MM:SS'であることです。この形式で日付を保存できるのは、(少なくともMySQLでは)日付/時刻値を保存する場合のみです。カレンダーのhtml入力フィールド(DatePicker)があり、言語(国)のために日付の形式を変更する必要がある場合(たとえば、'DD-MM-YYYY HH:MM:SS')、データベースに保存することはできません。この形式では、Joomlaはデータベースのデフォルト値またはnull値に置き換えます。もちろん、保存する前にモデルの日付入力値の形式を変更できますが、Joomlaでは、この問題は既に作成されている場合解決済みですhtml Joomlaでの基本的な作成方法として、XMLを使用したカレンダーフィールド。

1。カレンダーフォームフィールドをXMLで作成する必要があります。オーバーライドを行うため、このmycalendar.xmlファイルを、たとえばyour_joomla_root/templates/yourtemplate/html/com_content/article/forms/のテンプレートhtmlフォルダーに作成します。

<?xml version="1.0" encoding="utf-8"?>
<form>
    <fieldset name="mynewcalendar">
      <field  name="created"
              type="calendar"
              label="Date event"
              description="This field is for the events"                  
              translateformat="true"
              showtime="true"
              size="40"
              class="inputbox"
              default=""
              filter="user_utc"
      />
    </fieldset>
</form>

2。次に、すでにロードされているフォームオブジェクトを使用して、このフォームフィールドをレイアウトオーバーライドのフォームにロードします。

<?php // Custom added by Yolknet

// Your date from database
$date = (string) JFactory::getDate($this->item->created);

// your xml calendar field file
$file = JPATH_THEMES . '/your_template/html/com_content/article/forms/mycalendar.xml';

$this->form->loadFile($file, $reset = true);

// setting default date value
$this->form->setFieldAttribute($name='created', $attribute='default', $value=$date);

echo $this->form->renderField('created');

// End custom added by Yolknet ?>

または、Calendarフォームフィールドに新しいFormオブジェクトをロードする場合は、次のようにすることもできます。

<? php

// on the top of your layout file you have the Form class:
use \Joomla\CMS\Form\Form;

// the code where you would like to load the input field    
$date = (string) JFactory::getDate($this->item->created); // any date from your table - you do not need to format that
$file = JPATH_THEMES . '/your_template/html/com_content/article/forms/mycalendar.xml';

// create a new form object
$mycalendar = new Form('MyNewForm');

$mycalendar->loadFile($file, $reset = true);

$mycalendar->setFieldAttribute($name='created', $attribute='default', $value=$date);

echo $mycalendar->renderField('created');

?>

完全に機能するカレンダー入力フィールドが表示され、ユーザーの言語設定に従って日時が自動的に表示され、選択した日付を問題なく保存することもできます。 (上記はテストされて機能します)。私もそれがあなたのために働くことを望みます。これについてフィードバックをください。

それでも、この質問の基本的な問題は、フォームのフィールドにtranslateformat="true"オプション値を追加して、ユーザーの言語設定に従って日付時刻値を表示し、同時に日付形式を保存して日付を保存する方法に関するものでした。 JHtml :: calendar()メソッドでそれを行う可能性を私は見ていません。

もちろん、他の多くの方法でフォーム入力フィールドを作成できますが、JoomlaでXMLを使用してフォームフィールドを作成する必要がある理由についての非常に優れた説明を次に示します。 https://magazine.joomla.org/issues/issue- jun-2017/item/3248-new-datepicker-for-joomla-3-7

[〜#〜] update [〜#〜]-フロントエンドからの記事の「作成」日付フィールド編集について

私の回答の前の部分は、記事のcreated日付のフロントエンド編集を除いて、どのフォームでも機能します。

@Yolknet(彼が作業している)からテンプレートファイルを取得しました。カレンダーフォームの作成と使用に関する上記の指示を使用しようとすると、実際の問題が明らかになりますフロントエンドでの記事編集のフィールド。

ここで元の質問は次のようになります:Joomlaのフロントエンドから記事のcreated日付を編集する方法?したがって、ここでの問題はJHtml::calendar()で日付形式を変更する方法ではありません。ここでの問題は、Joomlaコアでは記事の作成日の編集をJoomlaの管理者領域にのみ制限したことです。

この問題は、レイアウトオーバーライドでカレンダーフォームフィールドを作成するだけでは解決できません。日付入力は、コアForm-> validate()メソッドによってフィルターで除外されるためです。 Joomlaは、作成された日付フィールドのフィルター属性unset値に設定されているため、フォームフィールドフィルタリング後の値はnull値。したがって、元の質問は本当に誤解を招くものであり、本当の問題はすぐに@Sharky数ヶ月前にここでよく答えられました: 記事の作成日をフロントエンドで編集できるようにするにはどうすればよいですか?

ソリューション

フロントエンドコンテンツのedit.phpレイアウトオーバーライドに追加する必要があるのは、次のものだけです。

<?php // Custom added by Yolknet

$this->form->setFieldAttribute($name='created', $attribute='showtime', $value='true');
$this->form->setFieldAttribute($name='created', $attribute='label', $value='Created date');
$this->form->setFieldAttribute($name='created', $attribute='class', $value='inputbox');

echo $this->form->renderField('created');

// End custom added by Yolknet ?>

今、このオーバーライドはまだ問題を解決しません、Joomlaのフロントエンドの記事編集レイアウトでcreated日時フィールドをうまく表示しますが、日付を保存することはまだできません。

入力データをコンテンツテーブルに保存するには、プラグインを作成して使用する必要があります(@Sharkyが非常によく提供している 彼の答えでは) すでに)または、別のプラグインイベント(onContentNormaliseRequestData())で独自のバージョンも作成しました。これは、送信されたフォームおよびデータがフィルタリングおよび検証される前のイベントです\ Joomla\CMS\Form\Form classにあります。プラグインは次のようになります。

<?php
/**
 * @package    [PACKAGE_NAME]
 *
 * @author     [AUTHOR] <[AUTHOR_EMAIL]>
 * @copyright  [COPYRIGHT]
 * @license    GNU General Public License version 2 or later; see LICENSE.txt
 * @link       [AUTHOR_URL]
 */
defined('_JEXEC') or die;
use Joomla\CMS\Application\CMSApplication;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Factory;

/**
 * ContentArticleformfieldcreated plugin.
 *
 * @package  [TEMPLATE_NAME]
 * @since    1.0
 */
class PlgContentArticleformfieldcreated extends CMSPlugin
{
    /**
     * Application object
     *
     * @var    CMSApplication
     * @since  1.0
     */
    protected $app;
    /**
     * Database object
     *
     * @var    Factory::getDbo()
     * @since  1.0
     */
    protected $db;
    /**
     * Affects constructor behavior. If true, language files will be loaded automatically.
     *
     * @var    boolean
     * @since  1.0
     */
    protected $autoloadLanguage = true;

    /**
     * This is an event that is called in FormController.php in save() method
     * before the submitted Form $data is filtered and validated in the Form class
     * This plugin makes it possible to edit article created date from the front-end of Joomla.
     * Without this plugin the form field named 'created' is unset and the filter nulls it's value.
     *
     * @param string $context The context of the content passed to the plugin (added in 1.6).
     * @param object $article A JTableContent object.
     *
     * @return  void.
     *
     * @since   1.0
     */
    public function onContentNormaliseRequestData($context, $data, Form $form)
    {
        if ($this->app->isClient('site') && $context == 'com_content.article' && $form->getField('created') != false)
        {
            $form->setFieldAttribute('created', 'filter', 'user_utc');
            $form->setFieldAttribute('created', 'showtime', 'true');
        }
    }    
}

いずれかのプラグインを使用すると、フロントエンドで記事のcreated日付を変更して保存できます。

そして、この質問を完成させるために、記事の作成日(ここではDatum Evenementとラベルが付けられています)のフロントエンド編集と保存を示し、オランダ語の日付形式でも機能することを示す短いビジュアルを作成しました。

enter image description here

1
Zollie