nurkka Posted April 23, 2015 Posted April 23, 2015 Hi, the output of a CKEditor field is postprocessed by the MarkupHTMLPurifier module, which has no configuration settings in the backend. I want to tweak the html output, so I'm trying to change the MarkupHTMLPurifier settings. The easiest method would be, to change one line in MarkupHTMLPurifier.module, but I want to be save when updating ProcessWire. So I had the idea to change the module settings on runtime. To achieve that, I wrote following module: class configModifer extends WireData implements Module { public static function getModuleInfo() { return array( 'title' => 'Config Modifier Test', 'version' => 1, 'summary' => 'This module tries to change the settings of another module on runtime.', 'singular' => true, 'autoload' => true, ); } public function init() { $this->addHookBefore('Inputfield::render', $this, 'beforeInputFieldRender'); } public function beforeInputFieldRender (HookEvent $event) { $purifier = wire()->modules->get('MarkupHTMLPurifier'); $purifier->set('HTML.Doctype', 'HTML 4.01 Transitional'); } } Unfortunately this doesn't work. The Hook is called, but it doesn't change the settings of MarkupHTMLPurifier. How can I change the module settings of MarkupHTMLPurifier on runtime? Or is there another way to achieve that? Thanks in advance.
LostKobrakai Posted April 23, 2015 Posted April 23, 2015 Edit: Should have read completely before posting, but I can say, that probably your hook is wrong. CKEditor is using a iframe for it's content, so there shouldn't be a inputfield present.
nurkka Posted April 23, 2015 Author Posted April 23, 2015 You're right, it was the wrong hook. Now I'm using InputfieldCKEditor::processInput, but still don't get the right instance of MarkupHTMLPurifier. Next, I took a closer look at the code of InputfieldCKEditor.module and I tried to replace the hook method: public function ___processInput(WireInputData $input) { $value = trim($input[$this->name]); if($value == self::PLACEHOLDER_TEXT) return $this; // ignore value $value = $this->purifyValue($value); if($value != $this->attr('value')) { $this->trackChange('value'); $this->setAttribute('value', $value); } return $this; } The MarkupHTMLPurifier module is instantiated in the $this->purifyValue()-Method: if(is_null(self::$purifier)) self::$purifier = $this->wire('modules')->get('MarkupHTMLPurifier'); Is there any way to get self::$purifier from »outside«, i.e. from a hook method? If not, is it possible to replace the whole processInput-Method and call a custom instance of MarkupHTMLPurifier? I tried to do that, but it didn't work: public function hookMethod (HookEvent $event) { $this->message("Hook InputfieldCKEditor::processInput"); // the hook is called correctly $event->replace = true; // force replace the hook method $field = $event->object; $arguments = $event->arguments; // now I tried to adapt the code of the original method, but it didn't work. $value = trim($event->arguments[$field->name]); if($value == self::PLACEHOLDER_TEXT) return $field; $value = $field->purifyValue($value); if($value != $field->attr('value')) { $field->trackChange('value'); $field->setAttribute('value', $value); } return $field; } I think that must be possible, but how is it done correctly?
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now