Купчинский Михаил
С нами с 19 января 2013; Место в рейтинге пользователей: #897Обновление дубликатов страниц (duplicate_updater_modx)
Может кому пригодится, написал скриптец для поиска дублей страниц и обновления последних путем добавление префикса +=1
Инструкция залить duplicate_updater_modx.php в корень сайта и запустить в браузере yousute.ru/duplicate_updater_modx.php
git: github.com/vectorserver/duplicate_updater_modx
Сам код:
Инструкция залить duplicate_updater_modx.php в корень сайта и запустить в браузере yousute.ru/duplicate_updater_modx.php
git: github.com/vectorserver/duplicate_updater_modx
Сам код:
<?php
/**
* Created by PhpStorm.
* User: admin
* Date: 25.06.2019
* Time: 14:19
*/
define('MODX_API_MODE', true);
require 'index.php';
$modx->getService('error', 'error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_FATAL);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
$msg = "";
$table_prefix = $modx->config['table_prefix'];
//Ищем двойников
$find_query = $modx->query("SELECT group_concat(`id`) ids, count(id) c FROM `" . $table_prefix . "site_content` GROUP by concat(uri) HAVING c > 1");
$dubles = $find_query->fetchAll(PDO::FETCH_ASSOC);
//Если нашли
if (count($dubles)) {
foreach ($dubles as $item) {
//Разбивем ID
$ids = explode(",", $item['ids']);
//Сортируем - старые вверх
sort($ids, SORT_NUMERIC);
$count = 0;
foreach ($ids as $doc_id) {
$count++;
//ПРопускаем оригинал
if ($count > 1) {
//Обновляем ресурс
$originalRes = $modx->getObject('modResource', $doc_id);
$generated = $originalRes->cleanAlias($originalRes->get('pagetitle')) . "-" . $count;
$originalRes->set('alias', $generated);
$originalRes->save();
//В лог
$msg .= $originalRes->get('id') . " | " . $originalRes->get('pagetitle') . " - обновлен.\n";
}
}
//Сброрс кеша
$modx->cacheManager->refresh();
}
} else {
$msg .= "Дублей нет\n";
}
echo "<pre>" . $msg; Удобная фильтрация в mSearch2 на мобильной версии (внешний вид)
Доброго всем!
дам очень нужную инструкцию для изменения внешнего вида фильтров на мобильной версии (в десктопной ничего не измениться) в mSearch2 совместно с minishop2
На выходе нас ожидает меню куда спрячутся все фильтра, а сбоку, поверх всего будет закреплена кнопка управляющая этим меню (открыть, закрыть). Работает как в bootstrap 3 так и в bootstrap 4. Внешний вид фильтров настраиваете на свой вкус и цвет.
Впринцыпе данный пример можно использовать где угодно, возможно спрячете меню блога, ну там уже на свое усмотрение. Работает через jquery
дам очень нужную инструкцию для изменения внешнего вида фильтров на мобильной версии (в десктопной ничего не измениться) в mSearch2 совместно с minishop2
На выходе нас ожидает меню куда спрячутся все фильтра, а сбоку, поверх всего будет закреплена кнопка управляющая этим меню (открыть, закрыть). Работает как в bootstrap 3 так и в bootstrap 4. Внешний вид фильтров настраиваете на свой вкус и цвет.
Впринцыпе данный пример можно использовать где угодно, возможно спрячете меню блога, ну там уже на свое усмотрение. Работает через jquery
Всплывающее окно после добавления товара в корзину
Всем привет!
Хотел обратиться за помощью по miniShop2.
Как вывести хотя бы
Нашел в интернате вот эту функцию
Делаю для себя интернет магазин.
Буду благодарен за любую помощь :)
Хотел обратиться за помощью по miniShop2.
Как вывести хотя бы
alert() после того как товар успешно добавляется в корзину?Нашел в интернате вот эту функцию
miniShop2.Callbacks.Cart.add.response.success = function() {}Вешаю ее на странице карточки товара. Но в консоль выводится это: Uncaught ReferenceError: miniShop2 is not definedДелаю для себя интернет магазин.
Буду благодарен за любую помощь :)
MODX-Дайджест #1 (25 февраля – 11 марта 2019)
Свежая подборка новостей о MODX. В выпуске: иконки для типов содержимого, рефакторинг 3 ветки от Джейсона, работа над новой документацией, благодарности автору на modx.pro и видео выступлений со всех минских MODX-мероприятий.
Приятного чтения!
Приятного чтения!
SMSC.ru хук
Всем привет, хотела запостить в modstore, но там уже есть похожие платные дополнения.
Хук для FormIt, который отправляет SMS.
Нужно добавить _smschook_ в _hooks_ вызова сниппета (перед mail). В системных настройках Formit указать ключи:
Хук для FormIt, который отправляет SMS.
Нужно добавить _smschook_ в _hooks_ вызова сниппета (перед mail). В системных настройках Formit указать ключи:
- Логин — [[++smschook_login]]
- Пароль — [[++smschook_password]]
- Телефоны — [[++smschook_phones]] в формате КОД СТРАНЫ + НОМЕР ТЕЛЕФОНА (без +), можно указать несколько через запятую
- smschook_tpl — чанк по аналогии чанка для писем
- smschook_phones — сюда можно передать телефоны
{'!AjaxForm' | snippet : [
'form' => 'tpl.AjaxForm.example',
'emailTpl' => 'contactEmailTpl',
'hooks' => 'smschook,email',
'emailFrom' => $_modx->config.emailsender,
'emailFromName' => $_modx->config.site_name,
'emailSubject' => 'Сообщение с сайта' ~ $_modx->config.site_name,
'emailTo' => $_modx->config.emailsender,
'validate' => 'name:equired',
'smschook_tpl' => 'smscTpl',
]} Как вывести ссылку на оплату на странице успешного заказа?
Здравствуйте. Хочу немного переделать логику оформления заказа. Мне нужно чтобы при выборе онлайн-оплаты не происходил редирект на платежный сервис сразу, а сначала был переход на страницу Спасибо за заказ. И уже на этой странице я бы выводил пользователю линк для оплаты.
Я так понимаю, что нужно расширить класс msOrderHandler для того, чтобы убрать редирект. Но вот каким образом в чанке tpl.msGetOrder вывести ссылку на оплату? Подскажете?
Решение:
Для того, чтобы при выборе любого способа оплаты не было редиректа на платёжную систему необходимо расширить класс заказа . Код нового класса:
Я так понимаю, что нужно расширить класс msOrderHandler для того, чтобы убрать редирект. Но вот каким образом в чанке tpl.msGetOrder вывести ссылку на оплату? Подскажете?
Решение:
Для того, чтобы при выборе любого способа оплаты не было редиректа на платёжную систему необходимо расширить класс заказа . Код нового класса:
<?php
if (!class_exists('msOrderInterface')) {
require_once MODX_CORE_PATH . 'components/minishop2/model/minishop2/msorderhandler.class.php';
}
class appOrderHandler extends msOrderHandler implements msOrderInterface
{
/** @var modX $modx */
public $modx;
/** @var miniShop2 $ms2 */
public $ms2;
/** @var array $config */
public $config;
/** @var array $order */
protected $order;
function __construct(miniShop2 & $ms2, array $config = [])
{
parent::__construct($ms2, $config);
//$this->modx->log(1, print_r('__construct', 1));
}
/**
* @param array $data
*
* @return array|string
*/
public function submit($data = [])
{
$response = $this->ms2->invokeEvent('msOnSubmitOrder', [
'data' => $data,
'order' => $this,
]);
if (!$response['success']) {
return $this->error($response['message']);
}
if (!empty($response['data']['data'])) {
$this->set($response['data']['data']);
}
$response = $this->getDeliveryRequiresFields();
if ($this->ms2->config['json_response']) {
$response = json_decode($response, true);
}
if (!$response['success']) {
return $this->error($response['message']);
}
$requires = $response['data']['requires'];
$errors = [];
foreach ($requires as $v) {
if (!empty($v) && empty($this->order[$v])) {
$errors[] = $v;
}
}
if (!empty($errors)) {
return $this->error('ms2_order_err_requires', $errors);
}
$user_id = $this->ms2->getCustomerId();
if (empty($user_id) || !is_int($user_id)) {
return $this->error(is_string($user_id) ? $user_id : 'ms2_err_user_nf');
}
$cart_status = $this->ms2->cart->status();
$delivery_cost = $this->getCost(false, true);
$cart_cost = $this->getCost(true, true) - $delivery_cost;
$createdon = date('Y-m-d H:i:s');
/** @var msOrder $order */
$order = $this->modx->newObject('msOrder');
$order->fromArray([
'user_id' => $user_id,
'createdon' => $createdon,
'num' => $this->getNum(),
'delivery' => $this->order['delivery'],
'payment' => $this->order['payment'],
'cart_cost' => $cart_cost,
'weight' => $cart_status['total_weight'],
'delivery_cost' => $delivery_cost,
'cost' => $cart_cost + $delivery_cost,
'status' => 0,
'context' => $this->ms2->config['ctx'],
]);
// Adding address
/** @var msOrderAddress $address */
$address = $this->modx->newObject('msOrderAddress');
$address->fromArray(array_merge($this->order, [
'user_id' => $user_id,
'createdon' => $createdon,
]));
$order->addOne($address);
// Adding products
$cart = $this->ms2->cart->get();
$products = [];
foreach ($cart as $v) {
if ($tmp = $this->modx->getObject('msProduct', ['id' => $v['id']])) {
$name = $tmp->get('pagetitle');
} else {
$name = '';
}
/** @var msOrderProduct $product */
$product = $this->modx->newObject('msOrderProduct');
$product->fromArray(array_merge($v, [
'product_id' => $v['id'],
'name' => $name,
'cost' => $v['price'] * $v['count'],
]));
$products[] = $product;
}
$order->addMany($products);
$response = $this->ms2->invokeEvent('msOnBeforeCreateOrder', [
'msOrder' => $order,
'order' => $this,
]);
if (!$response['success']) {
return $this->error($response['message']);
}
if ($order->save()) {
$response = $this->ms2->invokeEvent('msOnCreateOrder', [
'msOrder' => $order,
'order' => $this,
]);
if (!$response['success']) {
return $this->error($response['message']);
}
$this->ms2->cart->clean();
$this->clean();
if (empty($_SESSION['minishop2']['orders'])) {
$_SESSION['minishop2']['orders'] = [];
}
$_SESSION['minishop2']['orders'][] = $order->get('id');
// Trying to set status "new"
$response = $this->ms2->changeOrderStatus($order->get('id'), 1);
if ($response !== true) {
return $this->error($response, ['msorder' => $order->get('id')]);
} else {
if ($this->ms2->config['json_response']) {
return $this->success('', ['msorder' => $order->get('id')]);
} else {
$this->modx->sendRedirect(
$this->modx->context->makeUrl($this->modx->resource->id, ['msorder' => $response['data']['msorder']])
);
return $this->success();
}
}
}
return $this->error();
}
} Пару модификаторов для MODX
Модификатор телефонного номера
К примеру нам нужно вывести телефонный номер в формате: +7 (900) 2000 600 и так чтобы он нажимался как ссылка для запуска на устройствахНо так как плейсхолдер всего один [[++phone]]
Создаем сниппет phone c содержимым
1 плагин - 3 лайвхака
Всем привет, порой работа менеджеров в админке modx — сущий ад. Сегодня поступил заказ с просьбой решить несколько проблем.
Проблема №1:
В tinyMCE все изображения которые вставляются имеют атрибуты width и height, и не имеют нужных классов
Проблема №2:
При загрузки файлов в каталог, где уже есть такое имя, файлы переписывают друг друга, необходимо было сделать добавление префикса для файлов с одинаковым именем
Проблема №3:
Иногда менеджеры грузят неприлично большие изображения, что непосредственно влияет и на скорость загрузки страницы и на общий размер файлов
Что делает плагин:
Проблема №1:
В tinyMCE все изображения которые вставляются имеют атрибуты width и height, и не имеют нужных классов
Проблема №2:
При загрузки файлов в каталог, где уже есть такое имя, файлы переписывают друг друга, необходимо было сделать добавление префикса для файлов с одинаковым именем
Проблема №3:
Иногда менеджеры грузят неприлично большие изображения, что непосредственно влияет и на скорость загрузки страницы и на общий размер файлов
Что делает плагин:
- Транслитерация файлов при загрузке, добавление префикса если файл дублируется
- Уменьшает загружаемое изображение до 1200px по ширине
- Из поля content достает все img, вырезает у них атрибуты width и height, вместо них подставляет класс img-thumbnail
pdofield и phpthumbon
Здравствуйте!
Вывожу изображение следующим образом:
Вывожу изображение следующим образом:
<img class="img-fluid" src="[[pdoField? &id=`705` &field=`main-foto`]]">Помогите, пожалуйста, вывести изображение через phpThumbOn Подгрузка галереи и нужных полей товара в простой ресурс
Добрый день!
Сегодня небольшая заметка о том как можно сделать подгрузку в простой ресурс галереи и каких нибудь полей товаров.
Сегодня небольшая заметка о том как можно сделать подгрузку в простой ресурс галереи и каких нибудь полей товаров.