FormIt расширение таблицы
Не получается расширить таблицу с возможностью сохранения данных. Возможно, что-то делаю не так.
Создал плагин, повесил событие: OnMODXInit
Создал плагин, повесил событие: 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);
Поблагодарить автора
Отправить деньги
Комментарии: 5
Все значения из формы записываються в modx_formit_forms в поле values в json формате. Етот код:
$hook->setValue('user_id', $user_id);
Добавляєт елемент в масив values
если хочешь добавить поле в отдельное поле то надо внести изменения в хук сохранения формы __CORE_PATH__/components/formit/src/FormIt/Hook/Saveform.php — 183 ряд, в этом случае при обновлении FormiIt изменения перезапишуться. ИЛИ создать свой hook который будет записывать данные с формы в БД в таблицу modx_formit_forms
ИЛИ создать свой hook который будет записывать данные с формы в БД в таблицу modx_formit_formsА что прописать в этом hook?
логику на подобие той что в файле __CORE_PATH__/components/formit/src/FormIt/Hook/Saveform.php
<?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;
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.