Russian TYPO3 community

Russian TYPO3 community (http://forum.typo3.ru/index.php)
-   Разработка расширений / TYPO3 extension development (http://forum.typo3.ru/forumdisplay.php?f=38)
-   -   Проверка правильности значений в TCEforms для TCA полей типа "user" (http://forum.typo3.ru/showthread.php?t=5792)

reva2 25.01.2008 14:50

Проверка правильности значений в TCEforms для TCA полей типа "user"
 
Встала вот такая задача. В разрабатываемом расширении в определенной таблице есть поле описанное в TCA как "type" => "user". Т.е. отрисовывается это поле полностью моей функцией и имеет достаточно сложную логику. Задача состоит в том чтобы в случае неправильно заполнения этого поля, пользователю при отправке формы на сохранение выдавалось стандартное сообщение ("Некоторы поля формы заполнены неправильно..."), поле помечалось стандартной меткой (желтый восклицательный знак), а форма не передавалась на обработку.

Просмотрев класс TCEforms я сначало обрадовался увидев что там есть массив TCEforms::additionalJS_submit[] в который можно помещать javascript код который будет вызываться при нажатии на одну из кнопок, предназначенных для сохранения формы.
Окинув быстрым взглядом как вызывается код вставленный в этот массив моим расширением я зашел в некоторый тупик. Ниже приводиться отрывок кода как вызывается код добавленный таким образом:
Код:

//код взят из файла jsfunc.tbe_editor.js
var TBE_EDITOR = {
 .....
checkSubmit: function(sendAlert) {
  var funcIndex, funcMax, funcRes;
  if (TBE_EDITOR.checkLoginTimeout() && confirm(TBE_EDITOR.labels.refresh_login)) {
    vHWin=window.open(TBE_EDITOR.backPath+'login_frameset.php?','relogin','height=300,width=400,status=0,menubar=0');
    vHWin.focus();
    return false;
  }
  var OK=1;

  // $this->additionalJS_submit:
  if (TBE_EDITOR.actionChecks && TBE_EDITOR.actionChecks.submit) {
    for (funcIndex=0, funcMax=TBE_EDITOR.actionChecks.submit.length; funcIndex<funcMax; funcIndex++) {
      eval(TBE_EDITOR.actionChecks.submit[funcIndex]); //Вот здесь происходит вывоз всех строк добавленных в TCEforms::additionalJS_submit[]
    }
  }

  if(!OK)    {
    if (!confirm(unescape("SYSTEM ERROR: One or more Rich Text Editors on the page could not be contacted. This IS an error, although it should not be regular.\nYou can save the form now by pressing OK, but you will loose the Rich Text Editor content if you do.\n\nPlease report the error to your administrator if it persists.")))    {
        return false;
    } else {
        OK = 1;
    }
  }
  // $reqLinesCheck
  if (!TBE_EDITOR.checkElements('required', false)) { OK = 0; }
  // $reqRangeCheck
  if (!TBE_EDITOR.checkElements('range', false)) { OK = 0; }

  if (OK || sendAlert==-1) {
    return true;
  } else {
    if(sendAlert) alert(TBE_EDITOR.labels.fieldsMissing);
    return false;
  }
}, .....
}

Т.е. если я буду выставлять значение переменной "OK" в 0 все равно пользователь сможет сохранить форму если в выпругнувшем окошке выберет ответ, что мол можно наплевать на то что неправильно обрабатывается контент RTE. Таким образом, выставление переменной "ОК" в значение 0 мне никаким образом не помогает, да и плюс к этому выдает сообщение никак не относящееся к моему полю.

Стал смотреть дальше на код этой функции. Как видно там идет проверка для полей которые обязательны для заполнения и значение которых должно попадать в определенный диапазон. Все это проверяется через одну функцию и первоначально я подумал что там можно каким либо образом добавить свой тип проверки. Просмотрев код этой функции, а также функции checkElementByType которая непосредственно проверяет правильность заполнения полей, я не обнаружил никакого намека на то что там можно добавить что-то свое.

Подытоживая, все выше сказанное пришел только к одному пути решения задачи (если не "хакать" код TBE_EDITOR): регистрировать мое поля как поле обязательно для заполнения (кстати еще не разобрался как), в TCEforms::additionalJS_submit[] вставлять код который проверяет правильность заполнения моего поля и в случае если поле заполнено неверно убирать значение из него, так чтобы поле не проходило проверку по критерию ("обязательно для заполнения"). Но все это как-то выглядит слишком замудренно.

Поэтому уважаемые коллеги обращаюсь к Вам за помощью. Возможно уже кто-то из Вас делал что-то подобное или просто разбирался как устроена проверка правильности заполнения полей в форме редактирования записи, и если есть такие люди то пожалуйста пните в правильном направлении.


Часовой пояс GMT +4, время: 15:26.

Работает на vBulletin® версия 3.8.1.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot