Добавление вкладки на страницу редактирования ресурса
18 апреля 2019, 09:06
Плагин
Читать дальше
<?php switch ($modx->event->name) { case 'OnDocFormRender': if ($mode == modSystemEvent::MODE_UPD) { $modx->controller->addLexiconTopic('core:user'); $modx->controller->addLastJavascript($modx->getOption('assets_url') . 'components/resourceextender/mgr/resource/tab.js?v=1.0.0'); } break; }
Читать дальше
Добавляем запись лексикона для строки KB
10 апреля 2019, 10:36
<?php $path = MODX_CORE_PATH . 'lexicon/'; $dirs = scandir($path); unset($dirs[0]); unset($dirs[1]); foreach ($dirs as $dir) { $file = $path . $dir . '/file.inc.php'; if (is_dir($path . $dir) && file_exists($file)) { $content = file_get_contents($file); if (strpos($content, 'file_size_bytes') === false && strpos($content, 'file_size_kilobytes') === false) { $content = str_replace( '$_lang[\'image_size\']', '$_lang[\'file_size_bytes\'] = \'bytes\';' . PHP_EOL . '$_lang[\'file_size_kilobytes\'] = \'KB\';' . PHP_EOL . '$_lang[\'image_size\']', $content); file_put_contents($file, $content); } } }
Читать дальше
Поместить превью и keywords для SeoPRO перед контентом
10 апреля 2019, 10:16
Файл
Меняем:
Читать дальше
assets/components/seopro/js/mgr/seopro.js
Меняем:
// ... var fieldDesc = new Ext.form.Label({ forId: 'pagetitle', text: _('seopro.focuskeywords_desc'), cls: 'desc-under' }); fp.insert(3,fieldDesc); /* было fp.add(field); */ fp.insert(3,field); /* было fp.add(fieldDesc); */ fp.doLayout(); }, addPanel: function() { var fp = Ext.getCmp('modx-resource-main-left'); fp.insert(3, { /* было fp.add({ */ xtype: 'panel', // ...
Читать дальше
Загрузить все актуальные лексиконы для MODX 3
10 апреля 2019, 09:20
Сначала регистрируемся на crowdin.com, полкчаем API-ключ.
Выполнять скрипт в SSH-консоли:
Читать дальше
Выполнять скрипт в SSH-консоли:
mkdir core/lexicon/crowdin/ curl -o core/lexicon/crowdin/all.zip "https://api.crowdin.com/api/project/modx-revolution/download/all.zip?login={login}&account-key={api_key}" unzip core/lexicon/crowdin/all.zip -d core/lexicon/crowdin/ cp -R core/lexicon/crowdin/30/core/lexicon core rm -rf core/lexicon/crowdin
Читать дальше
tvSuperSelect - выборка ресурсов по тегам с условием AND
07 декабря 2018, 08:54
Чтобы tvSuperSelect выбирал ресурсы, которые соответствуют сразу всем выбранным тегам, нужно создать копию сниппета tvssResources, назвать её, например, tvssResourcesAnd. В копию вносим следующие изменения:
Читать дальше
// ... if (!empty($orConditions)) { // Заменяем код внутри этого условия foreach ($tags as $i => $tag) { $leftJoin[$alias . $i] = array( 'class' => 'tvssOption', 'alias' => $alias . $i, 'on' => $alias . $i . '.resource_id = ' . $class . '.id AND ' . $alias . $i . '.tv_id = ' . $tv . ' AND ' . $alias . $i . '.value = "' . addslashes($tag) . '"', ); $where[0][$alias . $i . '.value:!='] = null; } } // ...
Читать дальше
Генерация YML-файла для Яндекс-Маркета
18 июня 2018, 09:44
<?php @ini_set('display_errors', 1); define('MODX_API_MODE', true); require dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php'; $modx->getService('error','error.modError'); $modx->setLogLevel(modX::LOG_LEVEL_INFO); $modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML'); if ($modx->cacheManager->get('running', array('cache_key' => 'ymarket'))) { echo 'Скрипт работает, повторный запуск отменён'; exit; } $running = true; $modx->cacheManager->set('running', $running, 0, array('cache_key' => 'ymarket')); $limit = 500; $offset = $modx->cacheManager->get('offset', array('cache_key' => 'ymarket')); $filename = __DIR__ . '/yandexmarket-gen.yml'; // ...
Читать дальше
Программное создание и заполнение опций товара miniShop2
09 апреля 2018, 08:39
<?php $resources = array($modx->getObject('modResource', $id)); $miniShop2 = $modx->getService('miniShop2'); require_once MODX_CORE_PATH . 'components/simplehtmldom/simple_html_dom.php'; foreach ($resources as $res) { $content = $res->get('content'); $props = $res->getProperties(); if (!isset($props['original_content']) || !$props['original_content']) { $props['original_content'] = $content; $res->setProperties($props); $res->save(); } $html = str_get_html($content); $characters = $html->find('.character'); $content = $html->find('.content', 0)->innertext; foreach ($characters as $char) { $name = $char->find('span', 0)->innertext; $val = $char->find('span', 1)->innertext; print '<b>'.$name . ' - ' . $val . '</b>' . PHP_EOL; if (!$option = $modx->getObject('msOption', array('caption' => $name))) { print 'Option not found' . PHP_EOL; $key = $res->cleanAlias($name); if ($found = $modx->getObject('msOption', array('key' => $key))) { print 'Option key exists' . PHP_EOL; $key = $key . '_2'; } $option = $modx->newObject('msOption'); $option->fromArray(array('key' => $key, 'caption' => $name, 'type' => 'textfield')); $option->save(); print 'Option '.$key.' created' . PHP_EOL; } else { print 'Option found' . PHP_EOL; } if (!$cop = $modx->getObject('msCategoryOption', array('option_id' => $option->id, 'category_id' => $res->parent))) { print 'Category option not found' . PHP_EOL; $table = $modx->getTableName('msCategoryOption'); $sql = "INSERT INTO {$table} (`option_id`,`category_id`,`active`) VALUES ({$option->id}, {$res->parent}, 1);"; $stmt = $this->modx->prepare($sql); $stmt->execute(); print 'Category option created' . PHP_EOL; } else { print 'Category option found' . PHP_EOL; $q = $modx->newQuery('msCategoryOption'); $q->command('UPDATE'); $q->where(array('option_id' => $option->id, 'category_id' => $res->parent)); $q->set(array('active' => 1)); $q->prepare(); $q->stmt->execute(); print 'Category option updated' . PHP_EOL; } if ($po = $modx->getObject('msProductOption', array('product_id' => $res->id, 'key' => $option->key))) { print 'Value found' . PHP_EOL; $q = $modx->newQuery('msProductOption'); $q->command('UPDATE'); $q->where(array('key' => $option->key)); $q->set(array('value' => $val)); $q->prepare(); $q->stmt->execute(); print 'Value updated' . PHP_EOL; } else { print 'Value not found' . PHP_EOL; $table = $modx->getTableName('msProductOption'); if (!is_int($val)) { $val = '"' . $val . '"'; } $sql = "INSERT INTO {$table} (`product_id`,`key`,`value`) VALUES ({$res->id}, \"{$option->key}\", {$val});"; $stmt = $this->modx->prepare($sql); $stmt->execute(); print 'Value created' . PHP_EOL; } } }
Читать дальше
Добавление возможности указать контекст в CatalogFill
27 октября 2017, 15:56
// ... public function xls_export($parent_id, $xls_type='Excel5'){ if (!is_numeric($parent_id)) { $this->config['context'] = $parent_id; $parent_id = 0; } require_once realpath(dirname(__FILE__)).'/PHPExcel.php'; $out = array('count'=>0,'filepath'=>'','filename'=>''); if ($parent_id) { $parent_folder = $this->modx->getObject('modResource',$parent_id); $this->config['context'] = $parent_folder->get('context_key'); } if($this->config['include_categories']){ // ...
Читать дальше
Отдать пользователю ответ, но продолжить обработку данных
14 октября 2017, 17:14
<?php $modx->log(1, 'First log: ' . date('H:i:s', time() + 60 * 60 * 2)); if (function_exists('fastcgi_finish_request')) { echo 'Готово'; session_write_close(); fastcgi_finish_request(); } sleep(10); $modx->log(1, 'Second log: ' . date('H:i:s', time() + 60 * 60 * 2));
Читать дальше
mFilter2 - Вывод результатов на отдельной странице
05 августа 2017, 09:35
<script> $(document).ready(function(){ $(document).on('mse2_load', function(e, data) { document.location.href = '{$_modx->makeUrl(35)}' + e.currentTarget.URL.replace('{$_modx->config.site_url}{$_modx->resource.uri}', ''); }); }); </script>
Читать дальше