Наверх

Шпаргалки по MODX RSS

Парсинг новостей с картинками для сайта

17 июня 2019, 16:07

<?php
$url = 'https://site.ru/type/news';

require_once(MODX_CORE_PATH . 'components/simplehtmldom/simple-html-dom.php');
$html = file_get_html($url);
$teasers = $html->find('.teaser');
$news = [];
foreach ($teasers as $teaser) {
    $link = $teaser->find('a', 0);
    $date = $teaser->find('.date', 0);
    $parser = date_create_from_format('d.m.y', trim($date->plaintext));
    $publishedon = date_format($parser, 'Y-m-d');
    $news[] = ['link' => 'https://site.ru' . $link->href, 'publishedon' => $publishedon, 'pagetitle' => $link->plaintext];
}
foreach ($news as $page) {
    $page['parent'] = 15;
    $html = file_get_html($page['link']);
    $content = $html->find('.body', 0);
    $imgs = $content->find('img');
    foreach ($imgs as $img) {
        if (strpos($img->src, 'http') !== false) {
            $url = $img->src;
        } else {
            $url = 'https://site.ru' . $img->src;
        }
        $name = md5(uniqid()) . '.' . pathinfo($url, PATHINFO_EXTENSION);
        $path = MODX_BASE_PATH . 'assets/images/archive/' . $name;
        file_put_contents($path, file_get_contents($url));
        $img->src = '/assets/images/archive/' . $name;
        if (!isset($page['img']) || !$page['img']) {
            $page['tv1'] = $img->src;
        }
    }
    if ($olds = $content->find('.field-field-old-filename',0)) {
        $olds->outertext = '';
    }
    $page['content'] = $content->innertext;
    if (!$res = $modx->getObject('modResource', ['parent' => $page['parent'], 'pagetitle' => $page['pagetitle'], 'publishedon' => strtotime($page['publishedon'])])) {
        if ($count = $modx->getCount('modResource', ['parent' => $page['parent'], 'pagetitle' => $page['pagetitle']])) {
            $page['alias'] = $page['pagetitle'] . '-' . $count;
            print $page['alias'] . ' - ';
        }
        $response = $modx->runProcessor('resource/create', $page);
        if ($response->isError()) {
            echo $page['pagetitle'] . '
';
            return $modx->error->failure($response->getMessage());
        } else {
            echo 'Resource created
';
        }
    } else {
        echo 'Resource found
';
    }
}

Читать дальше

Правила сервера для MODX Cloud

23 мая 2019, 16:34

location ~* \.(?:ico|css|js|jpe?g|png|gif|svg|pdf|mov|mp4|mp3|woff)$ {
    try_files $uri $uri/ @modx-rewrite;     
    expires 7d;
    add_header Pragma public;
    add_header Cache-Control "public";
    gzip_vary on;
}
if ($scheme != "https") {
    return 301 https://www.webslite.com$request_uri;
}
if ($host != "www.groepenkastmontagenoord.nl") {
    rewrite ^ https://www.webslite.com$request_uri permanent;
}
location / {
    try_files $uri $uri/ @modx-rewrite;
}
location = /robots.txt {
    try_files $uri $uri/ @modx-rewrite;
}

Читать дальше

Удалить все вирусы, найденные ai-bolit'ом

25 апреля 2019, 20:09

<?php
@ini_set('display_errors', 1);
echo 'Start' . PHP_EOL;
$report_file = __DIR__ . '/report.json';
if (!file_exists($report_file)) {
    echo 'Report not found' . PHP_EOL;
    return;
}
$report_json = file_get_contents($report_file);
if (!$report = json_decode($report_json, true)) {
    echo 'Can not decode JSON' . PHP_EOL;
    return;
}
if (isset($report['php_malware'])) {
    foreach ($report['php_malware'] as $php_malware) {
        echo $php_malware['fn'] . PHP_EOL;
        //unlink($php_malware['fn']);
    }
} else {
    echo 'Php Malware not found' . PHP_EOL;
}
if (isset($report['js_malware'])) {
    foreach ($report['js_malware'] as $js_malware) {
        echo $js_malware['fn'] . PHP_EOL;
        //unlink($js_malware['fn']);
    }
} else {
    echo 'JS Malware not found' . PHP_EOL;
}

Читать дальше

Добавление вкладки на страницу редактирования ресурса

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-консоли:

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;
        }
    }
}

Читать дальше

Авторизация

через сервис Loginza:

Подписка или RSS

Буду присылать новые статьи — никакого спама



Шаблоны MODX

1 2 Дальше »

Объектная
модель
MODX