具体5:如何在自定义块内部的模态对话框中打开TinyMCE?

时间:2013-04-22 13:34:34

标签: concrete5

我想从我正在构建的自定义块内部的模态对话框中打开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>

在tools文件夹中的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的值传递给驻留在tools文件夹中的脚本,但这似乎不起作用。

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

2 个答案:

答案 0 :(得分:2)

应该和其他地方一样工作。首先,在对话框中包含一行代码(无论你有多少TinyMCE,你只需要一次):

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

然后,对于您想要的每个TinyMCE,请使用:

<?php Loader::element('editor_controls'); ?>
<textarea name="your-field-name" class="ccm-advanced-editor"></textarea>

答案 1 :(得分:1)

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

  1. 正如您在编辑问题中所描述的那样,您可以在其中加载工具文件。这里有几点:
    • URL不适合传递文本数据,特别是那些以tinymce(长和格式化)编辑的文本。话虽如此,它应该工作。我不明白为什么$_GET不会工作。确保URL首先包含文本(您可以通过查看开发人员控制台查看)。
    • 更好的是传递ID(tinymce_dialog?id = [ID])。这假设文本保存在数据库中,但看起来你可能正在为它们提供一个接口,基本上是“在一个模态文本中进行wysiwyg编辑,它们已经不是wyswiwyg编辑了”。不过,我不确定你是否已经考虑过它是如何工作的。默认情况下,他们必须处理一堆HTML标记?
  2. 另一种方法是从DOM元素中创建对话框。使用CSS display: none;创建隐藏在表单中的div,将文本保存到其中(如果已经初始化,tinymce有.update()或其他),然后显示隐藏的div(使用示例3来自{ {3}})。当他们点击(SAVE)时,你可以(大概)将数据复制出来并将其放回需要去的地方。
  3. 请注意,在许多情况下,tinymce初始化代码仅在页面加载时运行。我认为这就是Loader::element('editor_init')的作用。它的工作原理是检测适当的textareas(基于类名)。因此,如果在加载textarea之前加载了具有editor_init的页面(例如它现在的样子),则必须重新启动tinymce。这是对#2的投票。一般来说,我建议你走这条路。