FormIt расширение таблицы

Не получается расширить таблицу с возможностью сохранения данных. Возможно, что-то делаю не так.

Создал плагин, повесил событие: OnMODXInit
switch ($modx->event->name) {

	case 'OnMODXInit':
		$modx->loadClass('FormItForm');
		$modx->map['FormItForm']['fields']['user_id'] = 0;
		$modx->map['FormItForm']['fieldMeta']['user_id'] = array(
			'dbtype' => 'int',
			'precision' => 10,
			'attributes' => 'unsigned',
			'phptype' => 'integer',
			'null' => true,
			'default' => 0,
		);
	break;
}
Создал hook, в нем прописал следующее:
$user_id = isset($modx->user->id) ? $modx->user->id : 0;
$hook->setValue('user_id', $user_id);
Роман
06 августа 2021, 13:45
modx.pro
654
0
Поблагодарить автора Отправить деньги

Комментарии: 5

Тодор
06 августа 2021, 15:30
0
Все значения из формы записываються в modx_formit_forms в поле values в json формате. Етот код:
$hook->setValue('user_id', $user_id);
Добавляєт елемент в масив values
    Тодор
    06 августа 2021, 15:42
    0
    если хочешь добавить поле в отдельное поле то надо внести изменения в хук сохранения формы __CORE_PATH__/components/formit/src/FormIt/Hook/Saveform.php — 183 ряд, в этом случае при обновлении FormiIt изменения перезапишуться. ИЛИ создать свой hook который будет записывать данные с формы в БД в таблицу modx_formit_forms
      Роман
      06 августа 2021, 16:08
      0
      ИЛИ создать свой hook который будет записывать данные с формы в БД в таблицу modx_formit_forms
      А что прописать в этом hook?
        Тодор
        06 августа 2021, 16:53
        0
        логику на подобие той что в файле __CORE_PATH__/components/formit/src/FormIt/Hook/Saveform.php
          Тодор
          06 августа 2021, 16:58
          0
          <?php
          $values = $hook->getValues();
          $identifier = basename($_SERVER['REQUEST_URI']);
          $contextKey = '-';
          if ($modx->resource) {
              $identifier = $modx->resource->get('id');
              $contextKey = $modx->resource->get('context_key');
          }
          $formName = $modx->getOption('formName', $formit->config, 'form-'.$identifier);
          // process formName. Pick a value from the form
          // Inspired from the email's hook of formit (fihooks.class.php)
          if (is_string($formName)) {
              foreach ($fields as $k => $v) {
                  if (is_scalar($k) && is_scalar($v)) {
                      $formName = str_replace('[[+'.$k.']]',$v,$formName);
                  }
              }
          }
          
          $formEncrypt = $modx->getOption('formEncrypt', $formit->config, false);
          $formFields = $modx->getOption('formFields', $formit->config, false);
          $fieldNames = $modx->getOption('fieldNames', $formit->config, false);
          $updateSavedForm = $modx->getOption('updateSavedForm', $formit->config, false); // true, false, '1', '0', or 'values'
          // In order to use update process, you need to provide the hash key to the user somehow
          // Usually with [[!FormItRetriever]] to populate this form field:
          $formHashKeyField = $modx->getOption('savedFormHashKeyField', $formit->config, 'savedFormHashKey');
          // Disable if you want to use the session_id() in your hash, like FormIt does
          // WARNING: this can cause potential hash key collisions and overwriting of the wrong form record!!
          $formHashKeyRandom = $modx->getOption('formHashKeyRandom', $formit->config, true);
          // process formHashKeyField into variable for later use
          $formHashKey = (isset($values[$formHashKeyField])) ? (string) $values[$formHashKeyField] : '';
          // our hashing methods return 32 chars
          if (strlen($formHashKey) !== 32) $formHashKey = '';
          unset($values[$formHashKeyField]);
          
          if ($formFields) {
              $formFields = explode(',', $formFields);
              foreach($formFields as $k => $v) {
                  $formFields[$k] = trim($v);
              }
          }
          // Build the data array
          $dataArray = array();
          if ($formFields) {
              foreach ($formFields as $field) {
                  $fieldValue = isset($values[$field]) ? $values[$field] : '';
                  // When field is file field, value is an array
                  if (is_array($fieldValue) && isset($fieldValue['tmp_name'], $fieldValue['name'])) {
                      $fieldValue = $fieldValue['name'];
                  }
                  $dataArray[$field] = $fieldValue;
              }
          } else {
              $dataArray = $values;
          }
          // Change the fieldnames
          if ($fieldNames) {
              $newDataArray = array();
              $fieldLabels = array();
              $formFieldNames = explode(',', $fieldNames);
              foreach ($formFieldNames as $formFieldName) {
                  $parts = explode('==', $formFieldName);
                  $fieldLabels[trim($parts[0])] = trim($parts[1]);
              }
              foreach ($dataArray as $key => $value) {
                  if ($fieldLabels[$key]) {
                      $labelKey = $fieldLabels[$key];
                      if (array_key_exists($labelKey, $newDataArray)) {
                          $labelKey .= ' ('.$key.')';
                      }
                      $newDataArray[$labelKey] = $value;
                  } else {
                      $newDataArray[$key] = $value;
                  }
              }
              $dataArray = $newDataArray;
          }
          // We only enter update mode if we already have a valid formHashKey (tested above)
          // AND the updateSavedForm param was set to a truth-y value.
          $mode = ($updateSavedForm && $formHashKey) ? 'update' : 'create';
          // Create/get obj
          $newForm = null;
          if ($mode === 'update') {
              $newForm = $modx->getObject('FormItForm', array('hash' => $formHashKey));
          }
          if ($newForm === null) {
              $newForm = $modx->newObject('FormItForm');
          }
          
          // Array from which to populate form record
          $newFormArray = array();
          
          // Handle encryption
          $encryptionType = 1;
          if ($formEncrypt) {
              $dataArray = $newForm->encrypt($modx->toJSON($dataArray));
              // Only set encryption type if encryption is successful
              if ($dataArray) {
                  // Set encryption type to 2 (openssl)
                  $encryptionType = 2;
              }
          } else {
              $dataArray = $modx->toJSON($dataArray);
          }
          
          // Create new hash key on create mode, and handle invalid hash keys. 
          if ($mode === 'create') {
              $formHashKey = ($formHashKeyRandom) ? $newForm->generatePseudoRandomHash() : pathinfo($formit->getStoreKey(), PATHINFO_BASENAME);
          }
          
          // Special case: if updateSavedForm has the flag 'values' we only merge in
          // the form values, not the other stuff
          if ($mode === 'update' && $updateSavedForm === 'values') {
              $newFormArray = $newForm->toArray();
              $newFormArray = array_merge($newFormArray, array(
                  'values' => $dataArray,
                  'encryption_type' => $encryptionType,
              ));
          } else {
              $newFormArray = array(
                  'form' => $formName,
                  'date' => time(),
                  'values' => $dataArray,
                  'user_id' => $modx->user->id ?: 0,
                  'ip' => $modx->getOption('REMOTE_ADDR', $_SERVER, ''),
                  'context_key' => $contextKey,
                  'encrypted' => $formEncrypt,
                  'encryption_type' => $encryptionType,
                  'hash' => $formHashKey,
              );
          }
          // Convert to object
          $newForm->fromArray($newFormArray);
          // Attempt to save
          if (!$newForm->save()) {
              $modx->log(\modX::LOG_LEVEL_ERROR, '[FormItSaveForm] An error occurred while trying to save the submitted form: ' . print_r($newForm->toArray(), true));
              return false;
          }
          $storeAttachments = $modx->getOption('storeAttachments', $this->config, false);
          if ($storeAttachments) {
              $newForm->storeAttachments($formit->config);
          }
          // Pass the hash and form data back to the user
          $hook->setValue('savedForm', $newForm->toArray());
          $hook->setValue($formHashKeyField, $newForm->get('hash'));
          
          return true;
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      5