Source for file DataSet.class.php
Documentation is available at DataSet.class.php
* @copyright Energine 2006
* @version $Id: DataSet.class.php,v 1.32 2008/12/13 14:10:09 pavka Exp $
//require_once('core/framework/Component.class.php');
//require_once('core/framework/DataDescription.class.php');
//require_once('core/framework/Data.class.php');
//require_once('core/framework/SimpleBuilder.class.php');
//require_once('core/framework/Pager.class.php');
//require_once('core/modules/share/components/Toolbar.class.php');
* Предок для формы, списка, и дерева; содержит методы работы с панелью инструментов и набором данных.
* Тип компонента - список
* Тип формы - форма добавления
* Тип формы - форма редактирования
* Префикс названия панели инструментов
* Переводы которые добавляются к форме/списку
//private $translations = array();
public function __construct($name, $module, Document $document, array $params = null) {
parent::__construct($name, $module, $document, $params);
* Параметр recordsPerPage
'recordsPerPage' => false,
final protected function setData(Data $data) {
* Возвращает объект данных
final protected function getData() {
* Возвращает набор тулбаров
* @param string $toolbarName
* @return mixed (array of ToolBar or Toolbar)
protected function getToolbar($toolbarName = false) {
elseif(isset ($this->toolbar[$toolbarName])){
$result = $this->toolbar[$toolbarName];
* Устанавливает объекты тулбара
$toolbar = array($toolbar);
foreach ($toolbar as $tb)
* Устанавливает описание данных
* Возвращает описание данных
* @return DataDescription
// Существует ли описание данных?
// Без описания данных компонент не сможет нормально работать.
// Описание данных не должно быть пустым
//throw new SystemException('ERR_DEV_EMPTY_DATA_DESCRIPTION', SystemException::ERR_DEVELOPER, $this->getName());
* Подготовительные действия перед вызовом основного действия.
if ($data instanceof Data) {
* Создаем объект описания данных
* @return DataDescription
// описание данных из конфигурации
if ($this->config->getCurrentMethodConfig()) {
$configDataDescriptionObject->loadXML($this->config->getCurrentMethodConfig()->fields);
// внешнее описание данных
if (is_null($externalDataDescription)) {
// если существует внешнее описание данных - пересекаем с описанием из конфиг
if ($externalDataDescription) {
$externalDataDescriptionObject->load($externalDataDescription);
$configDataDescriptionObject = $configDataDescriptionObject->intersect($externalDataDescriptionObject);
return $configDataDescriptionObject;
* Создание панелей инструментов
if ($config = $this->config->getCurrentMethodConfig()) {
foreach($config->toolbar as $toolbarDescription){
$toolbarName = ((string) $toolbarDescription['name'])?
(string) $toolbarDescription['name']:
$toolbar = new Toolbar($toolbarName);
$toolbar->attachToComponent($this);
$toolbar->loadXML($toolbarDescription);
$result[$toolbarName] = $toolbar;
if ($recordsPerPage > 0) {
if (isset ($actionParams[0])) {
$page = intval($actionParams[0]);
$this->pager->setCurrentPage($page);
* Абстрактный метод загрузки данных
* Абстрактный метод загрузки описания данных
* Используется для загрузки внешнего описания данных (не из конфигурации)
* Проверяет наличие пострителя
* передает ему данные и описание данны
public function build() {
// передаем данные и описание данных построителю
// вызываем родительский метод построения
$result = parent::build();
$result->documentElement->appendChild($result->importNode($this->js, true));
foreach ($toolbars as $tb)
if($toolbar = $tb->build()){
$result->documentElement->appendChild(
$result->importNode($toolbar, true)
$pager = $result->importNode($pagerData, true);
$result->documentElement->appendChild($pager);
//Работа с константами переводов
if (($methodConfig = $this->config->getCurrentMethodConfig()) && $methodConfig->translations) {
foreach ($methodConfig->translations->translation as $translation) {
* Строит описание JS объектов
if (($config = $this->config->getCurrentMethodConfig()) && $config->javascript) {
$result = $this->doc->createElement('javascript');
foreach ($config->javascript->include as $value) {
$JSIncludeXML = $this->doc->createElement('include');
$JSIncludeXML->setAttribute('name', $value['name']);
$JSIncludeXML->setAttribute('path', 'scripts/');
$result->appendChild($JSIncludeXML);
foreach ($config->javascript->object as $value) {
$JSObjectXML = $this->doc->createElement('object');
$JSObjectXML->setAttribute('name', $value['name']);
$JSObjectXML->setAttribute('path', 'scripts/');
$result->appendChild($JSObjectXML);
foreach ($config->javascript->param as $value) {
$JSParamXML = $this->doc->createElement('param', $value);
$JSParamXML->setAttribute('name', $value['name']);
$result->appendChild($JSParamXML);
* Устанавливает адрес обработчика формы
// если у нас не полностью сформированный путь, то добавляем информацию о языке + путь к шаблону
$action = $this->request->getLangSegment().
// если в конце нет слеша - добавляем его
if (substr($action, - 1) != '/') {
$this->setParam('datasetAction', $action);
* Возвращает адрес обработчика формы
return $this->getParam('datasetAction');
* Устанавливает тип компонента
final protected function setType($type) {
if (in_array($type, array(self::COMPONENT_TYPE_FORM_ADD, self::COMPONENT_TYPE_FORM_ALTER ))) {
$type = self::COMPONENT_TYPE_FORM;
* Возвращает тип компонента
final protected function getType() {
* Устанавливает название компонента
final protected function setTitle($title) {
* Возвращает название компонента
* Метод используется для форматирования даты и времени в полях date и datetime
* Запрашивается через AJAX
* Получает данные из POST и возвращает строку даты
if(isset ($_POST['date'])){
$this->response->setHeader('Content-Type', 'text/javascript; charset=utf-8');
* @param $data string данные файла
* @param $MIMEType string тип файла
* @param $fileName string имя файла
final protected function downloadFile($data, $MIMEType, $fileName) {
$this->response->setHeader('Content-Type', $MIMEType);
$this->response->setHeader('Content-Disposition', ': attachment; filename="'. $fileName. '"');
* Чистка от лишних и вердоносных html тегов
* Вызывается в single режиме
$data = isset ($_POST['data']) ? $_POST['data'] : '';
$data = self::cleanupHTML($data);
$this->response->setHeader('Content-Type', 'application/xml; charset=utf-8');
* Добавляет переводы для тулбара WYSIWYG
array($this, 'addTranslation')
* Удаляет потенциально опасный и лишний HTML код
$aggressive = isset ($_GET['aggressive']);
//Если подключено расширение tidy
'drop-font-tags' => true,
'drop-proprietary-attributes' => true,
'logical-emphasis' => true,
'numeric-entities' => true,
'show-body-only' => true,
$data = $tidy->repairString($data, $config, 'utf8');
catch (Exception $dummyError){
//Никаких действий предпринимать нет необходимости
$jewix->cfgSetXHTMLMode(true);
$jewix->cfgSetAutoBrMode(false);
$jewix->cfgSetAutoLinkMode(false);
$shortTags = array('br', 'hr');
'a', 'abbr', 'acronym', 'address', 'b', 'big', 'blockquote', 'br', 'cite',
'code', 'col', 'colgroup', 'dd', 'del', 'dfn', 'div', 'dl', 'dt', 'em',
'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'ins', 'kbd', 'li', 'ol',
'p', 'q', 's', 'samp', 'small', 'span', 'strong', 'sub', 'sup','pre',
'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr', 'tt', 'u', 'ul', 'var'
$jewix->cfgAllowTags($allowedTags);
$jewix->cfgSetTagShort($shortTags);
$jewix->cfgSetTagNoTypography(array('code', 'pre', 'blockquote'));
$jewix->cfgSetTagPreformatted(array('code', 'pre', 'blockquote'));
$jewix->cfgAllowTagParams('table', array('cellpadding', 'cellspacing'));
$jewix->cfgAllowTagParams('td', array('colspan', 'rowspan'));
$jewix->cfgAllowTagParams('th', array('colspan', 'rowspan'));
$jewix->cfgAllowTagParams('a', array('href', 'target'));
$jewix->cfgSetTagCutWithContent(array('script', 'iframe'));
array_walk($allowedTags, create_function('$element, $key, $jewix', '$jewix->cfgAllowTagParams($element, array("id", "class", "style"));'), $jewix);
$jewix->cfgAllowTagParams('img',
$data = $jewix->parse($data, $errors);
//dump_log($errors, true);
//$data = str_replace('&', '&', $data);
|