[http://modx.im/blog/4812.html] Через форму обратной связи постоянно что-то отправляется на почту

Здравствуйте, сайт avtofixik.ru, сборка 1.2-d8.1.5. Через форму обратной связи кто-то или что-то постоянно отправляет на почту письма вот такого содержания:

Это сообщение было отправлено посетителем по имени administrator с помощью формы обратной связи.

Имя: administrator
Телефон:: administrator
Марка: administrator
VIN: administrator
Запрос:

Вы можете использовать эту ссылку для ответа:

Меняется только слово: administrator, admin, avtofixik или avtofixik.ru
Может кто-нибудь подсказать что это такое? Капчу не хотелось бы ставить на форму VIN-запроса...(

[] Не сохраняются документы. MODX 1.2-d8.1.5

Обновился на MODX 1.2-d8.1.5. (Очередной раз спасибо Dmi3yy.)
Обновление встало нормально.
Начал работу, создавал/редактировал/удалял документы. Все было отлично. А через 2 дня почему появилась проблема.
Перестали сохранятся изменения в существующих документах. Также не могу создать новые документы.
Проблема похожа на эту modx.im/blog/questions/463.html
Помогите пожалуйста.

[] Кажется, взлом.

Добрый день. Упали 2 сайта. Везде похожий симптом. Кажется, упала база данных.
При загрузке сайта выпадет это
Execution of a query to the database failed — You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM `site`.`modx_site_content` sc LEFT JOIN `site' at line 1
SQL > SELECT DISTINCT sc. FROM `site`.`modx_site_content` sc LEFT JOIN `site`.`modx_document_groups` dg on dg.document = sc.id WHERE (sc.id IN (1) AND sc.published = '1' AND sc.deleted = '0' ) AND (sc.privateweb=0) GROUP BY sc.id LIMIT 1
Error information
Current Snippet GetParent

В админку сайта могу зайти. В сниппет не пускает.
Warning: require(/home/site/public_html/site.ru): failed to open stream: Победа in /home/site/public_html/site.ru/manager/includes/document.parser.class.inc.php(1205): eval()'d code on line 1

Fatal error: require(): Failed opening required '/home/site/public_html/site.ru/' (include_path='.:/opt/alt/php70/usr/share/pear:/home/site/public_html/site.ru/manager/includes/') in /home/site/public_html/site.ru/manager/includes/document.parser.class.inc.php(1205): eval()'d code on line 1
Это что вообще?
Что делать не знаю…

[] Доставка в shopkeeper

Всем привет! Полазив в архивах форума по shopkeeper нашел скрипт добавления доставки в корзине. Все добавляется нормально, но при отправке заказа вылазит системная ошибка Modx:

Error: mysql_fetch_assoc() expects parameter 1 to be resource, object given
Source while($row = mysql_fetch_assoc($query)){
Current Snippet eForm
Line:149

/home/assets/snippets/shopkeeper/classes/class.shopkeeper.php

Сам плагин такой:
//plugin deliveryCalc
//[X] OnSHKcalcTotalPrice
//Конфигурация плагина: &deliveryID=идентификатор документа "доставка";string;0 

$e = &$modx->Event;
$output = "";

if($e->name=='OnSHKcalcTotalPrice'){

//блок поиска индекса доставки в корзине
//и вычисление стоимости корзины без учёта доставки
$deliveryPrice=0;  //стоимость доставки
$indexDeliv=null;  //индекс доставки в корзине
$totalPrice1=0;  //стоимости корзины без учёта доставки
foreach($purchases as $i => $goods){
    if ($goods[0]==$deliveryID){
        $indexDeliv=$i;
    }else    $totalPrice1 +=$goods[2]*$goods[1];
}

if(IN_MANAGER_MODE!="true"){
   
//если изменение кол-ва товара или удаление товара то наследуем параметры доставки и оплаты из сессии
if( ($_POST['action']=='recount') || ($_POST['action']=='delete') ){
    $payment = $_SESSION['payment'];
    $delivery = $_SESSION['delivery'];
}else{
    //сохраняем в сессию текущие параметры доставки и оплаты, либо обнуляем при отсутствии полей 
    //формы оформления заказа в запросе 
    $payment = isset($_POST['payment']) ? ($_SESSION['payment'] = $_POST['payment']) : ($_SESSION['payment'] = null);
    $delivery = isset($_POST['delivery']) ? ($_SESSION['delivery'] = $_POST['delivery']) : ($_SESSION['delivery'] = null);
}

//выбор или рассчёт стоимости доставки
switch($delivery){
case "RP": //Почта России
    if($payment=="COD"){ //оплата - наложенный платёж
        $deliveryPrice =  500; /*здесь может быть рассчёт стоимости доставки для (Почта России-наложенный платёж)*/
    }elseif($payment=="WEBMONEY"){ //оплата - Webmoney 
        $deliveryPrice =  150;/*здесь может быть рассчёт стоимости доставки (Почта России - Webmoney)*/
    }
    break;
case "COURIER": //доставка курьером
    if($payment=="CUR"){ //оплата - на руки курьеру
        $deliveryPrice=400;
    }elseif($payment=="WEBMONEY"){//оплата - Webmoney
        $deliveryPrice=50;
    }
    break;
case "EMS": 
    $deliveryPrice=300;
    break;
case "TRANS-COMP": 
    $deliveryPrice=300;
    break;
default:         
    $deliveryPrice=0;
}


if ($deliveryPrice) {/*если стоимость доставки больше 0, значит в корзину нужно включить доставку, либо исключить при 0*/
    //не обязательная стр. здесь и далее $addit_params = unserialize($_SESSION['addit_params']);
  
    if (isset($indexDeliv)){/*если в корзине уже имеется доставка, то меняем её цену*/
        unset($purchases[$indexDeliv]);
        $purchases[$indexDeliv] = array(0=>$deliveryID, 'catalog'=>0, 1=>1, 2=>$deliveryPrice);
        //$addit_params[$indexDeliv] = array();
    }else{
        $purchases[] = array(0=>$deliveryID, 'catalog'=>0, 1=>1, 2=>$deliveryPrice);
        //$addit_params[] = array();
    }
  
    $_SESSION['purchases'] = serialize($purchases);
    //$_SESSION['addit_params'] = serialize($addit_params);
}else{
    if (isset($purchases[$indexDeliv])){
        unset($purchases[$indexDeliv]);
        $_SESSION['purchases'] = serialize($purchases);
    
        //$addit_params = unserialize($_SESSION['addit_params']);
        //unset($addit_params[$indexDeliv]);
        //$_SESSION['addit_params'] = serialize($addit_params);
    }
}

//в $output - стоимость доставки
$output = $deliveryPrice;
}elseif(isset($purchases[$indexDeliv])){
    $output = $purchases[$indexDeliv][2];
}

//скидка
$discount1=5; //величина скидки в процентах    
if($totalPrice1>=213213213232132155500){ //если стоимость товаров в корзине больше 500, то скидка 5%
    $output += round($totalPrice1 * (1-$discount1/100), 2);

    /*плэйсхолдер с информацией о предоставленной скидке, можно использовать в чанке корзины*/
    $modx->setPlaceholder('discountInfo', 'Ваша скидка 5%'); 
    
}else $output += $totalPrice1;
    
$e->output($output);
}


Также, в инструкции написано:
Для нормальной работы плагина в class.shopkeeper.php в функции getCartContent
после list($totalItems,$totalPrice) = $this->getTotal($purchases,$addit_params);
добавить
$purchases = unserialize($_SESSION['purchases']);

Добавил и это.

Если убрать изменения в class.shopkeeper.php то естественно доставка не добавляется, но ошибок после отправки заказа нет.

В форме такие поля:

<select id="payment" name="payment" class="textfield">
     <option value="" selected="selected">Выберите способ оплаты</option> 
	 <option value="COD">Наложенный платёж</option>
      <option value="CUR">Оплата курьеру при получении</option>
    </select>
<select id="delivery" name="delivery" class="textfield">
		   <option value="" selected="selected">Выберите способ доставки</option> 
      <option value="COURIER">Доставка на дом курьером (+400 руб.)</option>
      <option value="RP">Почта России (+ 500 руб.)</option>     
    </select>

[] DocLister и вывод в четную\нечетную строку документов из разных родителей

Требуется: есть таблица, в которой нечетное кол-во строк кратное трем. Предположим 9. Таким образом мне нужно вывести в нечетные строки 5 документов из родителя А, а в четные 4 документа родителя Б.

Вопрос: можно ли это сделать средствами DocLister?

[] Вывод wayfinder в вызов скрипта

Привет всем.

Использую замечательную библиотеку fullpage.js

Вызывается она следующим способом:

<script type="text/javascript">
$(document).ready(function() {
$('#fullpage').fullpage({
anchors: ['Главная', 'Уроки', 'Фотографии','Контакты'],
showActiveTooltip: true,
css3: true,
navigation: true,
navigationPosition: 'right',
slidesNavPosition: 'bottom',
slidesNavigation: true,
controlArrows: true,
menu:'#menu',
});
});
</script>


то есть меню создается в параметре anchors

Как мне в этот параметр передать свои данные по страницам сайта?

Пробовал вот так:
anchors: [[[Wayfinder?&startId=`0`&outerTpl=`@CODE`&rowTpl=`@CODE '[+wf.title+]',`]]],


ничего не работает, заголовки страниц в скрипт не добавляются

если просто вывести на странице этот вызов WF то все выводится почти верно, типа
'Главная', 'Уроки', 'Фотографии', 'Контакты',


Как в скрипт добавить названия страниц?

[] Курс разных валют в shopkeeper

Есть сайт, там цены заданы на какие-то товары евро или долларах, а на какие-то в рублях. Все в разных полях, но цена может быть в одном из трех полей.

Благодаря сниппету от Temus все цены пересчитываются, но для shopkeeper был взят плагин из одной темы такой:

$e = &$modx->Event;
$output = "";
$is = isset($is) ? $is : '';    
$xmlURL = 'http://www.cbr.ru/scripts/XML_daily.asp?date_req='.date('d/m/Y');

//кэширование 6 часов
$filename = MODX_BASE_PATH.'assets/cache/kurs.xml';
if (!file_exists($filename) || (file_exists($filename) && time() > filemtime($filename) + 60*60*6)) {
        $file = file_get_contents($xmlURL);
        if ($file) {
                file_put_contents($filename, $file);
                @chmod($filename, 0666);
        }
}

$xml = simplexml_load_file($filename); 
if ($xml != false){
        $usd = $xml->xpath('Valute[@ID="R01239"]/Value');
        $usd = round(str_replace(',','.',$usd[0]),1); 
}
if ($modx->Event->name == 'OnSHKgetProductPrice') {
        $price = $_POST['shk-price'];
        $output = $price * $usd;
    $e->output($output);
}


Но получается, что он пересчитывает при добавлении в корзину все цены в одну валюту. А как сделать, чтобы он знал, что если цена задана в поле euro, то умножал на курс евро, если цена задана в поле, где задаются рубли — то не пересчитывал бы ничего?

Может кто подскажет или за деньги допишет плагин?

[] Slack для разработчиков MODX Evolution



Slack — месседжер, заточенный под команды, с кучей классного функционала и хорошей расширяемостью.

На днях завели Slack для команды разработчиков Evo и всех заинтересованных. Присоединяйтесь!

Сейчас приглашения высылаем мы с Dmi3yy , кидайте адрес электронки кому-то из нас и вышлем приглашение. Если вдруг кто знает, как сделать команду публичной, чтобы вступить мог любой желающий — сообщите, пожалуйста.

В числе прочих имеется клиент для десктопа, настоятельно рекомендую к использованию: https://slack.com/downloads/windows.

Team domain: evocmf.slack.com.

[http://modx.im/blog/4802.html] Пагинация в EVO РЕШЕНО

Вопрос больше по части сео.
Советуют страницы пагинации скрывать от индексации. Точнее использовать каноникал.

Подскажите как это сделать каноникал страницы для DocLister?

Сам нашел ответ.

Может кому пригодиться:

Создаем сниппет: Canonical, в него помещаем код:

$id = $modx->documentIdentifier;
if (isset($_GET['start'])){
$info=$modx->getPageInfo($id,'1','alias');
echo '<link rel="canonical" href="[(site_url)][~[*id*]~]" />';}

Это если вы используете ditto.

Для Doclister:


$id = $modx->documentIdentifier;
if (isset($_GET['page'])){
$info=$modx->getPageInfo($id,'1','alias');
echo '<link rel="canonical" href="[(site_url)][~[*id*]~]" />';}


И потом между head и /head вызываем сниппет [[Canonical]]