2

我想从我正在构建的自定义块中的模式对话框中打开 TinyMCE。我知道如何实现模态对话框,但无法找到将 TinyMCE 集成到对话框中的方法。

我想要实现的是,当在块添加/编辑弹出窗口中单击文本时,它应该打开一个带有 TinyMCE 的对话框来编辑单击的文本。以前有人做过吗?

这就是我试图在添加/编辑表单中实现的目标:

$this->addHeaderItem(Loader::helper('html')->javascript('tiny_mce/tiny_mce.js'));
Loader::element('editor_init');
Loader::element('editor_config');
Loader::element('editor_controls');

<textarea name="field-name" class="text-area-value ccm-input-textarea">Some text here or empty....</textarea>

$bt = BlockType::getByHandle('myblock');
<a class="dialog-launch ccm-block-type-inner" 
dialog-on-close="ccm_blockWindowAfterClose()" dialog-append-buttons="true" 
dialog-modal="false" dialog-width="500" 
dialog-height="500" dialog-title="<?php echo t('Add/Edit Text)?>"
href="<?php echo $th->getBlockTypeToolsURL($bt); ?>/tinymce_dialog.php?text=<?php echo $text-area-value; ?>">
  Edit the above text in TinyMCE
</a>

在工具文件夹中的 tinymce_dialog.php 中:

<textarea name="textarea-name" 
class="ccm-input-textarea advancedEditor ccm-advanced-editor">
  <?php echo $_GET['text']; ?>
</textarea>

<div class="ccm-buttons dialog-buttons">
    <a href="javascript:void(0)" onClick="ccm_blockWindowClose();" 
       class="ccm-button-left btn">Cancel</a>
    <a href="" onClick="" class="btn primary">Ok</a>
</div>

但我无法将 textarea 的值传递到模式对话框弹出窗口中。我尝试href在锚标记中使用将 textarea 的值传递给驻留在工具文件夹中的脚本,但这似乎也不起作用。

编辑:我还在 tinymce_dialog.php 中添加了按钮(参见上面的代码)。不确定是否可以<a dialog-on-close="ccm_blockWindowAfterClose()" dialog-append-buttons="true".....>在表单中传递这些按钮。

4

2 回答 2

2

应该与其他任何地方一样工作。首先,在你的对话框中包含这行代码一次(你只需要一次,不管你有多少 TinyMCE):

<?php Loader::element('editor_config'); ?>

然后,对于您想要的每个 TinyMCE,使用以下命令:

<?php Loader::element('editor_controls'); ?>
<textarea name="your-field-name" class="ccm-advanced-editor"></textarea>
于 2013-04-22T16:47:27.717 回答
1

有两种方法可以解决这个问题:

  1. 正如您在问题编辑中描述的那样,您在其中加载工具文件。这里有几点:
    • URL 不适用于传递文本数据,尤其是在 tinymce 中编辑的那种文本(长且格式化)。话虽如此,它应该工作。我不明白为什么$_GET不会'工作。确保 URL 首先包含文本(您可以通过查看开发人员控制台来查看)。
    • 更好的是传递一个 ID (tinymce_dialog?id=[ID])。这是假设文本保存在数据库中,但看起来您可能会为他们提供一个界面,基本上是“在模态文本中进行所见即所得的编辑,而他们已经不是所见即所得的编辑”。不过,我不确定您是否考虑过这将如何工作。默认情况下,他们必须处理一堆 HTML 标签?
  2. 另一种方法是使用 DOM 元素创建对话框。使用 CSS 创建一个隐藏在表单中的 div display: none;,将文本保存到其中(如果已经初始化,tinymce 有一个.update()或其他东西),然后显示隐藏的 div (使用来自http://www.concrete5.org/documentation的示例 3 /how-tos/developers/javascript-jquery-and-concrete5/)。当他们单击(保存)时,您可以(大概)从 tinymce 中复制数据并将其放回需要去的地方。

请注意,在许多情况下,tinymce 初始化代码仅在页面加载时运行。我认为就是Loader::element('editor_init')这样。它通过检测适当的文本区域(基于类名)来工作。因此,如果在加载 textarea 之前加载了带有 editor_init 的页面(例如现在的样子),则必须重新初始化 tinymce。这是对#2的投票。一般来说,我建议你走那条路。

于 2013-04-23T22:18:26.373 回答