Прошу помощи с фантомом. Не могу найти документацию хорошую.
У меня на сервере установлен фантом. Подскажите, как с помощью php с ним работать (без консоли)?
Возможно ли вообще такое?
вам уже выше подсказали, нужно использовать например phantomjs
вот есть для php реализация — github.com/jonnnnyw/php-phantomjs
Кто-то может подсказать, как имитировать нажатие на кнопку, чтоб открылся номер на сайте OLX и потом уже спарсить страницу. Спарсить уже получается, вот только номер не могу открыть. На олх в исходном коде нигде не дублируется номер телефона, нужно имитировать клик
так был вебинар или нет?) если да — киньте ссылку, пжлста
Вроде да.
Сделал загрузку через Дополнения — Composer.
  • avatar uin23
  • 0
ответу сам на свой вопрос. Ничего умнее не придумал как добавить в таблицу system_eventnames событие OnSHKbeforeCartLoad

а в файлик class.shopkeeper.php в функцию getCartContent

function getCartContent($orderFormPage,$thisPage){
    $chunk = explode('<!--tpl_separator-->',$this->fetchTpl($this->config['cartTpl']));
    if(!empty($_SESSION['purchases'])){
      $evtOut = $this->modx->invokeEvent('OnSHKbeforeCartLoad');

и повесил плагин на это событие

if($e->name=='OnSHKbeforeCartLoad'){
    if(isset($_SESSION['purchases'])){
        $purchases = unserialize($_SESSION['purchases']);
а доставляли через composer то что надо?
Оба шаблонизатора ломают систему, отображается белая страница в админке.

Fatal error: Uncaught Error: Class 'DLTemplate' not found in /stomat/assets/plugins/blade/replaceTemplateBlade.php:7 Stack trace: #0 /stomat/manager/includes/document.parser.class.inc.php(1916) : eval()'d code(1): require() #1 /stomat/manager/includes/document.parser.class.inc.php(1916): eval() #2 /stomat/manager/includes/document.parser.class.inc.php(5441): DocumentParser->evalPlugin('require MODX_BA...', Array) #3 /stomat/manager/includes/document.parser.class.inc.php(2854): DocumentParser->invokeEvent('OnWebPageInit') #4 /stomat/index.php(139): DocumentParser->executeParser() #5 {main} thrown in /stomat/assets/plugins/blade/replaceTemplateBlade.php on line 7
Спасибо!
Хочу сказать, что временами испытываю проблемы с поиском нужной информации для компонентов MODX Evo. Например, по запросу «modx evo файловые элементы или файлы в чанках» я ничего дельного не нашел. А перечисленные выше ресурсы я ни разу не попадал.

Пожалуйста, Дмитрий, сделай поддержку файлов. Считаю, что такая функция даст новый виток в развитии CRM.
Зачем пилить еще 1 вариант? когда и так уже есть несколько?
github.com/dzhuryn/StaticElements-for-MODX-Evo

так же если работаете уже с файлами то можно использовать Twig или Blade
github.com/AgelxNash/EvoBlade
github.com/Pathologic/EvoTwig

Ну а в целом с версии 1.5 планирую сделать возможность работы с файлами из коробки
ipv6 включил завтра еще донастроем его на сервере если поможет будет круто если нет гляну как там можно сменить ip
В целом у меня давно в планах перенести все на EVO ну и на evo.im )
так будет логичней и правильней. Сейчас стоит вопрос по части компонента с комментариями что б можно было сделать систему комментирования :)

так что можно смело скидываться на компанию:
modx.im/blog/kraudfanding/5260.html

После этого компонента я распишу что как куда и надо по проекту ЕВО.им в целом там останеться только взять и сделать :)
Исправил.
  • avatar shden
  • 0
В названии встречается перенос строки тегом br, по этому названия категорий в админке налазят друг на друга, пытался в multicategories/lib/controller.php в вывозе load() добавить $data['pagetitle'] = strip_tags($data['pagetitle']); но не чего не выходит не подскажите как можно решить данный вопрос.

Получилось решить так:
public function load() {
        $id = isset($_POST['id']) ? (int)$_POST['id'] : 0;
        $rid = isset($_POST['rid']) ? (int)$_POST['rid'] : 0;
        $openIds = $this->data->getCategories($rid);
        if (!$id && $openIds) {
            $this->dlParams['openIds'] = implode(',', $openIds);
        }
        if ($id) {
            $this->dlParams['parents'] = $id;
            $this->dlParams['showParent'] = 0;
        }
        $this->dlParams['prepare'] = function(array $data = array()) use ($openIds) {
            $data['state'] = $data['isfolder'] == 1 && !isset($data['children']) ? 'closed' : 'open';
            if (in_array($data['id'], $openIds)) $data['checked'] = true;
            
            $data['pagetitle'] = strip_tags($data['pagetitle']);
            $data['text'] = strip_tags($data['pagetitle']);
            
            return $data;
        };
        $out = json_decode($this->modx->runSnippet('DLMenu', $this->dlParams), true);
        return $out[0];
    }
Нашел парочку небольших багов, о которых сразу не подумал. Фиксятся легко хаком через расширение класса.
1) Свойство $config не доступно для внешних обращений
2) При возникновении ошибки SQL запроса сайт падает из-за Exception. Это и хорошо и плохо. Хорошо, т.к. теперь можно оформить красивую страничку 500 ошибки. Плохо — по умолчанию не обрабатывается стандартными средствами движка. Как исправить смотрите ниже метод query().
3) Метод insert приводит параметр $fields по таким же правилам, как и в других методах. Соответственно из подобных запросов
$modx->getDatabase()->insert(
        array(
                'name'=>'',
                'description'=>'',
                'disabled'=>'',
                'moduleguid'=>'',
                'plugincode'=>'',
                'properties'=>'',
                'category'=>'',
                ), $modx->getDatabase()->getFullTableName('site_plugins'), // Insert into
        "CONCAT(name, ' {$_lang['duplicated_el_suffix']}{$count}') AS name, description, '1' AS disabled, moduleguid, plugincode, properties, category", $modx->getDatabase()->getFullTableName('site_plugins'), "id='{$id}'");


Мы получаем запрос на вставку данных с пустыми именами полей. Лечится так же подменой insertFrom метода.
Итого получается следующий класс
<?php namespace App;

use AgelxNash\Modx\Evo\Database\LegacyDatabase;
use AgelxNash\Modx\Evo\Database\Exceptions;

class Database extends LegacyDatabase
{
    public $config;

    public function query($sql)
    {
        try {
            return parent::query($sql);
        } catch (Exceptions\QueryException $exception) {
            $core = evolutionCMS();
            /**
             * Ошибка запроса лежит тут $exception->getMessage()
             * Код ошибки $exception->getCode()
             * Сам запрос $exception->getQuery()
             * Вместо $core->messageQuit оформляем свою страницу и делаем die();
             */
            $core->messageQuit($exception->getMessage());
        } catch (Exceptions\ConnectException $exception) {
            $core = evolutionCMS();
            /**
             * Ошибка подключения к базе. Текст ошибки $exception->getMessage()
             * Код ошибки $exception->getCode()
             * Вместо $core->messageQuit оформляем свою страницу и делаем die();
             */
            $core->messageQuit($exception->getMessage());
        } catch (\Exception $exception) {
            $core = evolutionCMS();
            $core->messageQuit($exception->getMessage());
        }
    }

    public function insertFrom(
        $fields,
        $table,
        $fromFields = '*',
        $fromTable = '',
        $where = '',
        $limit = ''
    ) {
        if (is_array($fields)) {
            $onlyKeys = true;
            foreach ($fields as $key => $value) {
                if (!empty($value)) {
                    $onlyKeys = false;
                    break;
                }
            }
            if ($onlyKeys) {
                $fields = array_keys($fields);
            }
        }

        return parent::insertFrom($fields, $table, $fromFields, $fromTable, $where, $limit);
    }
}


Именно App\Database::class нужно будет указать вместо AgelxNash\Modx\Evo\Database\LegacyDatabase::class при подмене
Дима, если посчитает нужным и возможным.
Обычно я участвую в интересующих меня проектах «на добрые дела».
Какой общий бюджет работ?
Кто инициирует кампанию?
Все просто, создаем краудфандинговую кампанию на то, чтобы перенести этот сайт на новую платформу с сохранением контента, улучшением поиска и другими удобными плюшками, которые насобирает сообщество. Заранее определяемся с суммой, которая нужна на это дело и собираем. Вот я, например, могу тысячи 3 выделить на это дело. А вы сколько готовы пожертвовать?
В том месте где был ранее подключался композер, мы обязаны были следить за всеми index и ajax скриптами, чтобы они тоже не забывали это делать. Помимо этого от туда нет доступа ни к одной переменной. Так что config mutator это не просто место для инклюда кастомного автозагрузчика. Собственно это я и хотел показать в статье.