Joomla onContentBeforeSave Данные в xml не работают - PullRequest
0 голосов
/ 19 декабря 2011

Я установил плагин, который должен извлекать некоторые данные из формы и сохранять их в XML-файл. Я пробовал код сам по себе, и он работал, но потом, когда я вставил его в плагин с методом onContentBeforeSave, он больше не работает. Вот код плагина, я понятия не имею, что не работает!

defined('_JEXEC') or die();

jimport('joomla.plugin.plugin');

class plgContentsave2xml extends JPlugin
{
  public function __construct($subject, $config)
  { parent::__construct($subject, $config);
  }

  function onContentBeforeSave($context, &$article, $isNew)
  { global $mainframe;

if(isset($_POST['create_xml']))
{

    $doc = new DOMDocument('1.0');
    // Formatting the file
    $doc->formatOutput = true;
    $doc->encoding = "Utf-8";

    $field = $_POST['field'];
    $field = utf8_encode($field);

    $part = $doc->createElement('part');
    $part = $doc->appendChild($part);

    $field = $doc->createElement('field');
    $field = $part->appendChild($field);
    $text = $doc->createTextNode($field);
    $text = $field->appendChild($text);
    }


echo $doc->save('xmlf/' . 'test' . '.xml');
}

    return true;
  }
}
?>

1 Ответ

0 голосов
/ 19 декабря 2011

Я думаю, что вы не должны ничего выводить из своего кода, и у вас есть строка, где вы выводите (или можете выводить) данные. Другое дело, что вы не проверяете контекст, хотите ли вы, чтобы код выполнялся для статей, категорий и т. Д. Или только для статей? Если это только для статей, вы должны проверить, равен ли контекст "com_content.article":

if ( $context != "com_content.article" ) { return; }

И последнее. Добавляете ли вы поля в форму статьи / категории с помощью события onContentPrepareForm?

Если это так, вы должны получить свои данные так:

function onContentBeforeSave( $context, &$row, $isNew ) {       
   if ( $context != "com_content.article" ) {
      return;
   }
   jimport( 'joomla.html.parameter' );
   $params = new JParameter( $row->attribs );
   $create_xml = $params->get( 'create_xml', false );
   if ( $create_xml ) {
      $field = $params->get( 'field', '');
      // The rest of your code here...
      //If you don't want these fields to be stored with the params of the article:
      $params->set( 'field', '' );
      $params->set( 'create_xml', '' );
   }
   $row->attribs = (string)$params;
   return;
}

Кроме того, если вы не используете onContentPrepareForm, вы можете реализовать его следующим образом:

function onContentPrepareForm($form, $data)
{
   $return = true;
   if (!($form instanceof JForm))
   {
      $this->_subject->setError('JERROR_NOT_A_FORM');
      $return = false;
   } elseif ( $form->getName() != 'com_content.article' ) { 
      $return = true;
   } else {
      // Add the registration fields to the form.
      JForm::addFormPath( __DIR__ . DIRECTORY_SEPARATOR . 'form' );
      $form->loadFile('your_file', false);
      $return = true;
   }

   return $return;
}

В вашей папке плагина должен быть файл: plugin_folder / form / your_file.xml, с этой формой:

<?xml version="1.0" encoding="utf-8"?>
<form>
    <fields name="attribs">
        <fieldset name="create_xml" label="Create XML">
            <field name="create_xml" [...]>
            <field name="field" [...]>
        </fieldset>
    </fields>
</form>

Надеюсь, это помогло!

...