web-dev-qa-db-ja.com

エディタープラグイン(タイプ:editors-xtd)を更新後も存続させるにはどうすればよいですか?

コンポーネント、モジュール、エディタープラグインを作成しているプロジェクトがあります。

(少なくとも)TinyMCEで動作する基本的なプラグインを何とかまとめることができました。

  1. カスタムボタンを表示します
  2. Dbデータを使用してボタンの動的テーブルを含むポップアップモーダルウィンドウをトリガーします
  3. 中括弧で囲まれたカスタムプレースホルダーを記事に挿入します。

私が関心を持っているのは、私のソリューションを「アップグレード証明」にすることです。

私は https://mrgott.com/13-joomla/17-how-to-create-joomla-editors-xtd-plugin-button-and-open-modal-popup と同じくらいフォローしました私が離れて、​​言及されているものを超えて構築する必要があるまで、できました。そのリソースは警告します:

注:はい、最初に発生する質問は次のとおりです。Joomlaのcom_contentコンポーネントの一部ではないため、更新のたびにファイルが削除された場合はどうなりますか。ええ、そうですが、実際には、このファイルを保持し、システムを更新するたびにアップロードするのではなく、プラグイン開発を間違って汚い方法で行うのではなく、問題ありません。

クライアント用にこのプラグインを構築する場合は、コンポーネントを構築するか、すでにいくつかのコンポーネントを構築していて、editors-xtdプラグイン用の新しいビューファイルを追加するだけです。

私のコンポーネントにはviewsの新しいファイルだけでは足りないようです。私はむしろ「正しい方法」を学びたいです。 フィリップのように "あきらめる" はしたくありません。プラグインを長持ちさせるには、どのファイルを作成(コンポーネントにコピーして変更)する必要がありますか?エディターのカスタムボタンに小さなアイコンを追加する方法のヒントも使用できます。現時点では、左側に空白のテキストしかありません。

_/plugins/editors-xtd/picturelinkcode/picturelinkcode.php_のonDisplay()関数:

_public function onDisplay($name)
{       
    $query_string = [
        "option" => "com_content",      // I want this to be "com_picture",
        "view"   => "article",
        "layout" => "picturelinkcode",  // some examples use "modal" here
        "tmpl"   => "component",
        "editor" => $name
    ];

    $link = 'index.php?' . http_build_query($query_string);

    $button = new JObject;
    $button->modal = true;
    $button->class = 'btn';
    $button->link  = $link;
    $button->text  = JText::_('Linkcode');
    $button->name  = 'picturelinkcode';
    $button->options = "{handler: 'iframe', size: {x: 600, y: 400}}";

    return $button;
}
_

_/administrator/components/com_content/views/article/tmpl/picturelinkcode.php_ファイル:

_<?php
defined('_JEXEC') or die;

$document     = JFactory::getDocument();
$this->editor = JFactory::getApplication()->input->getCmd('editor', '');
$this->editor = preg_replace('~[^\w[\]-]+~', '', $this->editor);  // sanitize

/**
 * ...better coding practice would probably be
 * to store the js and the data processing
 * outside of this tmpl file
 *   --apologies while sprinting
 */
$script  = 'function insertPictureLinkcode(linkcode) {' . "\n";
$script .= '  var tag = "{loadpicture " + linkcode + "}";' . "\n";
$script .= '  window.parent.jInsertEditorText(tag, ' . json_encode($this->editor) . ');' . "\n"; // "jform_articletext"
$script .= '  window.parent.jModalClose();' . "\n";
$script .= '  return false;' . "\n";
$script .= '}' . "\n";

JFactory::getDocument()->addScriptDeclaration($script);

?><h3>Picture Linkcodes</h3><?php

// Retrieve all linkcodes and their associated counts
$db = JFactory::getDBO();
$subquery = $db->getQuery(true)
               ->select("id")
               ->from("#__fields")
               ->where([
                   "context = 'com_picture.picture'",
                   "name = 'linkcode'"
                 ]);
$query = $db->getQuery(true)
            ->select("value AS linkcode, COUNT(*) AS picturecount")
            ->from("#__fields_values")
            ->where("field_id = ($subquery)")
            ->group("value");
$db->setQuery($query);

try
{
    $resultset = $db->loadObjectList();
    if (!$resultset)
    {
        echo "No Linkcodes Available Yet<br>";
    }
    else
    {
        ?>
        <form class="form">
            <table>
                <?php
                foreach ($resultset as $row)
                {
                    ?>
                    <tr>
                        <td>
                            <button onclick="insertPictureLinkcode('<?php echo $row->linkcode; ?>');" class="btn btn-primary">
                                <?php echo $row->linkcode; ?>
                            </button>
                        </td>
                        <td>
                            (<?php echo $row->picturecount; ?>)
                        </td>
                    </tr>
                    <?php
                }
                ?>
            </table>
        </form>
        <?php
    }
} catch (Exception $e) {
    echo "<div class='bg-danger'>Picture Linkcode Query Error - Contact Developer</div>";
    //echo "<div class='bg-danger'>" , $query->dump() , "<br>" , $e->getMessage() , "</div>";
}
_

現在機能しているコーディングのスクリーンショット: https://imgur.com/a/kP2WGKo (@Eoinに彼がどのような技術を使っているか尋ねる これらの気の利いたアニメーションgif

それが重要な場合、私のコンポーネントはコアの_adminstistrator/components/com_contact_とほぼ同じであり、私のモジュールには1つのジョブしかありません-記事のプレースホルダーを動的コンテンツに置き換えることです。私のプラグインは、最終的にはこの質問で示しているよりも優れた機能を備えています。

4
mickmackusa

通常、プラグインはアイテムのリストを開きます。この場合、コンポーネントにはアイテムのモデル/ビューがありません。したがって、それらを作成する必要があります。

最低限、モデルにはgetListQuery()メソッドが含まれている必要があります。このメソッドは、アイテムの取得に使用されるクエリを返します。

管理者/コンポーネント/com_picture/models/items.php:

defined('_JEXEC') or die;

class PictureModelItems extends JModelList
{
    protected function getListQuery()
    {
        // Retrieve all linkcodes and their associated counts
        $db = $this->_db;
        $subQuery = $db->getQuery(true)
            ->select($db->quoteName('id'))
            ->from($db->quoteName('#__fields'))
            ->where(
                [
                    $db->quoteName('context') . ' = ' . $db->quote('com_picture.picture'),
                    $db->quoteName('name') . ' = ' . $db->quote('linkcode'),
                ]
            );

        $query = $db->getQuery(true)
            ->select([$db->quoteName('value', 'linkcode'), 'COUNT(*) AS picturecount'])
            ->from($db->quoteName('#__fields_values'))
            ->where($db->quoteName('field_id') . ' = (' . $subQuery . ')')
            ->group($db->quoteName('value'));

        return $query;
    }
}

ビューは最低限、アイテムを取得する必要があります。

管理者/コンポーネント/com_picture/views/items/view.html.php:

defined('_JEXEC') or die;

class PictureViewItems extends JViewLegacy
{
    protected $items;

    public function display($tpl = null)
    {
        $this->items = $this->get('Items');

        return parent::display($tpl);
    }
}

次に、ビューレイアウトで、アイテムのリストをテーブルまたはその他の任意の形式で出力します。

ボタンプラグインで、新しいビューを指すようにlinkプロパティを変更します。

$button->link = 'index.php?option=com_picture&amp;view=items&amp;layout=modal&amp;tmpl=component&amp;editor=' . $name . '&amp;' . JSession::getFormToken() . '=1';

エディターのカスタムボタンに小さなアイコンを追加する方法のヒントを使用することもできます

アイコンはボタンのnameプロパティからのものです。それが取得します icon-を前に追加して、IcoMoonアイコンクラスを形成します。例えば。 joomlaに設定すると、結果のクラスはicon-joomla。すべてのアイコンをご覧ください こちら

2
Sharky