Тодор

Тодор

С нами с 08 мая 2018; Место в рейтинге пользователей: #240
Тодор
01 декабря 2021, 14:59
+1
Провери отрибут base в head, он должен меняться в зависимости от языка
<base href="modx.pro/">
<base href="modx.pro/ru/"> - RU
Тодор
01 декабря 2021, 14:16
+1
switch($modx->event->name){
    case 'OnDocFormSave':
        //$mode //$resource //$id
        if(empty($resource->get('content')) && $resource->get('published')){
            $resource->set('published', 0);
            $resource->save(); //Не уверен что это надо
        }
        break;
}
Тодор
29 ноября 2021, 15:38
1
0
foreach($data as $item){
    /*
    $item = array(
        [name] => Название поризводителя
        [resource] => 
        [country] => 
        [logo] => images/logo.png
        [address] => 
        [phone] => 
        [fax] => 
        [email] => 
        [description] => 
    )
    */
    $vendor = $modx->newObject('msVendor', $item);
    $vendor->save();
}
Тодор
29 ноября 2021, 15:32
0
Я если мне нужно значение языка в js, то я в теге html прописую cultureKey
...
<html lang="[[++cultureKey]]">
...
потом в js обращаетесь к этому зачению
var lang = $('html').attr('lang');
Тодор
25 ноября 2021, 00:08
0
$order = $modx->getObject('msOrder', $orderID);
$prop = $order->Address->get('properties');
Тодор
24 ноября 2021, 23:52
0
1. если указать пустой emailTpl — прийдет от такой емейл:

2. И все таки стандарным хуком email невозможно обработать переменную типа array — так как в field будут передан не масив со значениями, а строка «ArrayArrayArray», надо либо изменить нейми инпутам или сделать свой хук
Тодор
24 ноября 2021, 23:23
0
Абсолютно все данные о заказе (вроде):
$order = $modx->getObject('msOrder', $orderID);
$output = array(
    'order' => $order->toArray(),
    'user' => $order->User->toArray(),
    'profile' => $order->UserProfile->toArray(),
    'address' => $order->Address->toArray(),
    'delivery' => $order->Delivery->toArray(),
    'payment' => $order->Payment->toArray(),
    'status' => $order->Status->toArray(),
    'products' => []
);
foreach($order->Products as $product){
    $output['products'][] = $product->toArray();
}

print_r($output);
Тодор
24 ноября 2021, 17:50
0
Не такое естетическое решение как у вас, но можно воспользоваться стандарными полями MODX

В результате можно обращаться к этим полям вот так:
$profile = $modx->getObject('modUserProfile', $userID);
print_r($profile->get('extended'));
/*
array(
    [2021-11-09] => array(
        [0] => +10
        [1] => -7
        [2] => -3
    )

    [2021-11-09 16:05:56] => -7
    [2021-11-09 18:59:03] => -3
    [2021-11-09 22:18:32] => +10
)
*/
Тодор
24 ноября 2021, 17:13
0
Вроде пропущено закрыкающие скобки после :date=`%d.%m.%Y`
[[+price_bron
    :is=`0`:then=``
    :else=`<a href="[[~[[pdoResources?&parents=`[[*goraID]]` &depth=`0` &templates=`61` &returnIds=`1`]]]]?date_start=[[+start:strtotime:date=`%d.%m.%Y`]]&date_end=[[+finish:strtotime:date=`%d.%m.%Y`]]" target="_blank" class="button button-green">Забронировать</a>`]]
Тодор
24 ноября 2021, 17:05
0
У твоих инпутов очень странные нейми.
Должно быть чтото типа:
Name: [[+field.0.name.0]]
Email: [[+field.1.email.0]]
Phone 1: [[+field.2.phone.0]]
Phone 2: [[+field.3.phone.0]]
Data Start: [[+date_start]]
Date End: [[+date_end]]
Не уверен что все правильно, но date_start и date_end точно должно работать (если они конечно не пустые).
Еще можно попробовать в emailTpl поставить несущесвующий чанк і посмотреть на то что прийдет на почту, там должны быть все доступные в чанке переменные
Тодор
10 ноября 2021, 18:57
0
Можно удалить все локализации и создать их заново в той последовательности которой тебе надо, либо изменить немножко код:
<?php
$pdo = $modx->getService('pdoTools');

$uri = $_SERVER['REQUEST_URI'];
if(substr($uri, 0, 1)) {
    $uri = mb_substr($uri, 1);
    $tmp = explode('/', $uri);
    if($path = $tmp[0]) {
        $tmp = $modx->getObject('localizatorLanguage', array('http_host:LIKE' => "%/{$path}/"));
        if($tmp) {
            $uri = str_replace("{$path}/", "", $uri);
        }
    }
}

$protocol = 'https://';
$languages = $modx->getIterator('localizatorLanguage', ['active' => 1]);
$output = [];
foreach($languages as $language) {
    if(mb_substr($language->http_host, -1) == '/') {
        $placeholders = array(
            'cultureKey' => $language->key,
            'active' => $language->key == $modx->localizator_key? 'active': '',
            'url' => $protocol. $language->http_host. $uri,
        );
    } else {
        $placeholders = array(
            'cultureKey' => $language->key,
            'active' => $language->key == $modx->localizator_key? 'active': '',
            'url' => $protocol. $language->http_host. '/'. $uri,
        );
    }
    
    $output[$language->key] = $pdo->getChunk($tpl, $placeholders);
}

uksort($output, function($a, $b) {
    $order = array(
        "ru", "uk", 'en', 'it', 'fr' //Твоя последовательность языков
    );
    return array_search($a, $s) > array_search($b, $order);
});
return implode('', $output);
Тодор
03 ноября 2021, 17:46
0
{for $counter=1 to=31 step=3}
    {$counter}
{forelse}
    ELSE
{/for}
Тодор
30 августа 2021, 09:46
0
Смотришь в системных настройках на «tree_default_sort», какое там значение по нему и делаш сортировку
Тодор
19 августа 2021, 13:49
0
Есть предложение на счет сниппета msOrder. Для авторизованных пользователей при заходе на страницу с msOrder подтягиваются поля из личного кабинета — это все очень хорошо, но если пользователь изменил какое-то поле например city то после перезагрузки страницы, данные перезаписуться на те которые сохранены в кабинете. Предлагаю переделать 152 срока на:
$value = $order[$value] ?: $profile[$value];
Тодор
18 августа 2021, 14:06
0
{if in_array($id, [100, 150, 154])}
    <a href="{$uri}">{$pagetitle}</a>
{else}
    {$pagetitle}
{/if}
только может быть такое что модыфикаторы не сработають для tpl — @INLINE и надо будет создавать отдельний чанк для этого
Тодор
17 августа 2021, 15:29
0
Создаеш TV, с типом ввода — Список (множественный выбор)
В поле вожможные значения пишеш чтото такое
@EVAL return $modx->runSnippet('msProducts', array(
    'parents'=>$parentID,
    'where'=>'{"Data.price:>=":"150"}',
    'limit'=>0,
    'sortby'=>'{"pagetitle":"ASC"}',
    'tplOuter'=>'@INLINE [[+output]]',
    'tpl'=>'@INLINE [[+pagetitle]]==[[+id]]',
    'outputSeparator'=>'||'
));
А при выводе на сайте береш значение твоей TV и передаеш в pdoResources
{'!pdoResources' | snippet:[
    'parents' => 0,
    'limit' => 0,
    'resources' => $_modx->resource.your_tv_field,
    'tpl' => '@INLINE <a href="{$uri}">{$pagetitle}</a>'
]}
я только не помню точно ставит ли «Список (множественный выбор)» — какой-то свой разделитель между значениями, если ето не "," то надо будет заменить розделитель
Тодор
11 августа 2021, 16:37
0
Вставить в контент визов чанка
[[$productCart?id=`59`]]
или снипета
[[productCart?id=`59`]]
Тодор
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;