Писать на форуме DIAFAN.CMS могут только зарегистрированные пользователи. Войдите или зарегистрируйтесь.

Сообщения Андрей (koda)

Всего найдено: 158

  • 01 сентября 2016 г.
  • добавить отдельный шаблон письма для админа в modules\cart\cart.action.php
    Код
    private function send_mails($order_id, $params, $payment)
    {
    Custom::inc('includes/mail.php');

    $cart = $this->diafan->_tpl->get('table_mail', 'cart', $this->diafan->_shop->order_get($order_id));
    $cart_admin = $this->diafan->_tpl->get('table_admin_mail', 'cart', $this->diafan->_shop->order_get($order_id));
    $payment_name = '';
    if($payment)
    {
    $payment_name = $payment["name"];

    Показать весь код
    if($payment["payment"] == 'non_cash')
    {
    $p = DB::query_fetch_array("SELECT code, id FROM {payment_history} WHERE module_name='cart' AND element_id=%d", $order_id);
    $payment_name .= ', <a href="'.BASE_PATH.'payment/get/non_cash/ul/'.$p["id"].'/'.$p["code"].'/">'.$this->diafan->_('Счет для юридических лиц', false).'</a>,
    <a href="'.BASE_PATH.'payment/get/non_cash/fl/'.$p["id"].'/'.$p["code"].'/">'.$this->diafan->_('Квитанция для физических лиц', false).'</a>';
    }
    }

    $user_email = $this->diafan->_users->mail;
    $user_phone = $this->diafan->_users->phone;
    $user_fio = $this->diafan->_users->fio;
    foreach ($params as $param)
    {
    if ($param["type"] == "email" && ! empty($_POST["p".$param["id"]]))
    {
    $user_email = $_POST["p".$param["id"]];
    }
    if ($param["info"] == "phone" && ! empty($_POST["p".$param["id"]]))
    {
    $user_phone = $_POST["p".$param["id"]];
    }
    if ($param["info"] == "name" && ! empty($_POST["p".$param["id"]]))
    {
    $user_fio = $_POST["p".$param["id"]];
    }
    }

    //send mail admin
    $subject = str_replace(array('%title', '%url', '%id', '%message'),
    array(TITLE, BASE_URL, $order_id, strip_tags($this->message_admin_param)),
    $this->diafan->configmodules('subject_admin', 'shop')
    );

    $message = str_replace(
    array('%title',
    '%url',
    '%id',
    '%message',
    '%order',
    '%payment',
    '%fio'
    ),
    array(
    TITLE,
    BASE_URL,
    $order_id,
    $this->message_admin_param,
    $cart_admin,
    $payment_name,
    $user_fio
    ),
    $this->diafan->configmodules('message_admin', 'shop'));

    send_mail(
    $this->diafan->configmodules("emailconfadmin", 'shop') ? $this->diafan->configmodules("email_admin", 'shop') : EMAIL_CONFIG,
    $subject,
    $message,
    $this->diafan->configmodules("emailconf", 'shop') ? $this->diafan->configmodules("email", 'shop') : ''
    );

    if(in_array("subscribtion", $this->diafan->installed_modules))
    {
    if(! empty($user_phone))
    {
    $phone = preg_replace('/[^0-9]+/', '', $user_phone);
    if(! DB::query_result("SELECT id FROM {subscribtion_phones} WHERE phone='%s' AND trash='0'", $user_phone))
    {
    DB::query("INSERT INTO {subscribtion_phones} (phone, name, created, act) VALUES ('%s', '%h', %d, '1')", $user_phone, $user_fio, time());
    }
    }
    }

    //send mail user
    if (empty($user_email))
    {
    return;
    }

    if(in_array("subscribtion", $this->diafan->installed_modules) && ! empty($_POST['subscribe_in_order']))
    {
    $row_subscribtion = DB::query_fetch_array("SELECT * FROM {subscribtion_emails} WHERE mail='%s' AND trash='0' LIMIT 1", $user_email);

    if(empty($row_subscribtion))
    {
    $code = md5(rand(111, 99999));
    DB::query("INSERT INTO {subscribtion_emails} (created, mail, name, code, act) VALUES (%d, '%s', '%s', '%s', '1')", time(), $user_email, $user_fio, $code);
    }
    elseif(! $row_subscribtion["act"])
    {
    DB::query("UPDATE {subscribtion_emails} SET act='1', created=%d WHERE id=%d", $row_subscribtion['id'], time());
    }
    }

    $subject = str_replace(
    array('%title', '%url', '%id'),
    array(TITLE, BASE_URL, $order_id),
    $this->diafan->configmodules('subject', 'shop')
    );

    $message = str_replace(
    array('%title', '%url', '%id', '%message', '%order', '%payment', '%fio'),
    array(
    TITLE,
    BASE_URL,
    $order_id,
    $this->message_param,
    $cart,
    $payment_name,
    $user_fio
    ),
    $this->diafan->configmodules('message', 'shop')
    );
    send_mail(
    $user_email,
    $subject,
    $message,
    $this->diafan->configmodules("emailconf", 'shop') ? $this->diafan->configmodules("email", 'shop') : ''
    );
    }

    сделать копию modules\cart\views\cart.view.table_mail.php в modules\cart\views\cart.view.table_admin_mail.php
    отредактировать шаблон как необходимо.
    Во вложении архив с этими модификациями, устанавливать как любое дополнение через темы. Останется только исправить cart.view.table_admin_mail.php.
  • 12 марта 2016 г.
  • Если тема уже есть, то нужно в нее зайти, и в поле "Импорт темы" выбрать скачанный архив дополнения. Затем сохранить.
  • 12 января 2016 г.
  • Выводить в списке так:
    Код
    public function list_variable_update_is($row, $var)
    {
    return '<div class="update_is">'.($row["update_is"]==1?'включено':'выключено').'</div>';
    }

    есть еще
    Код
    'fast_edit' => true


    Значения для type:

    1. editor
    2. text
    3. select
    4. numtext
    5. floattext
    6. string

    Когда подключено быстрое редактирование:

    1. numtext
    2. text
    3. floattext
    4. editor
    5. textarea
    6. string
  • 07 января 2016 г.
  • В свое время добавлял в функцию list_search файл shop.model.php
    такой код
    Код
    if(!empty($_GET['article']))// поиск по артикулу
    {

    $count = DB::query_result(
    "SELECT COUNT(DISTINCT s.id) FROM {shop} AS s "
    . ($this->diafan->_users->role_id ? " LEFT JOIN {access} AS a ON a.element_id=s.id AND a.module_name='shop' AND a.element_type='element'" : "")
    . " WHERE s.[act]='1' AND s.trash='0' and s.id=%d "
    ." AND s.date_start<=%d AND (s.date_finish=0 OR s.date_finish>=%d)",
    intval($_GET['article']), $time, $time
    );

    Показать весь код
    if($count>0)
    $this->diafan->redirect(BASE_PATH.$this->diafan->_route->link($this->diafan->_site->id, intval($_GET['article']), 'shop'), '301');
    else
    $this->result["error"] = $this->diafan->_('Извините, ничего не найдено.', false);
    return $this->result;
    }

    Поиск по артикулу включен и поиск по нему заменен на редирект в случае если такой идентификатор найден. Не готовый рецепт, но для начала достаточно.
  • 22 декабря 2015 г. , редакция: 1450782398
  • Выглядит похожим на правду, но еще подобные алгоритмы есть в админке.
    adm/includes/init.php
    в функции init
    Код
    define('BASE_PATH', "http".(isset($_SERVER['HTTP_X_HTTPS']) && $_SERVER['HTTP_X_HTTPS'] != '0' ? "s" : '')."://".getenv("HTTP_HOST")."/".( REVATIVE_PATH ? REVATIVE_PATH.'/' : '' ) );
  • 10 декабря 2015 г.
  • modules/shop/inc/shop.inc.order.php 478 строка
    заменить функцию
    Код

    public function send_mail_change_status($order_id, $status)
    {
    return;
    Custom::inc('includes/mail.php');
    $email = ($this->diafan->configmodules("emailconf", 'shop')
    && $this->diafan->configmodules("email", 'shop')
    ? $this->diafan->configmodules("email", 'shop') : '' );

    $lang_id = DB::query_result("SELECT lang_id FROM {shop_order} WHERE id=%d", $order_id);

    Показать весь код
    if(! $lang_id)
    {
    $lang_id = $this->diafan->_languages->site;
    }
    $user_mail = DB::query_result(
    "SELECT value FROM {shop_order_param_element} AS e"
    ." INNER JOIN {shop_order_param} AS p ON p.id=e.param_id AND p.type='email'"
    ." WHERE e.element_id=%d", $order_id
    );
    if($user_mail)
    {
    $status = DB::query_result("SELECT name".$lang_id." FROM {shop_order_status} WHERE id=%d LIMIT 1", $status);

    $subject = str_replace(array ( '%title', '%url' ), array ( TITLE, BASE_URL ), $this->diafan->configmodules('subject_change_status', 'shop', 0, $lang_id));

    $message = str_replace(array ( '%title', '%url', '%order', '%status' ), array ( TITLE, BASE_URL, $order_id, $status), $this->diafan->configmodules('message_change_status', 'shop', 0, $lang_id));

    send_mail($user_mail, $subject, $message, $email);
    }
    }
  • 16 ноября 2015 г.
  • С 1С и статусам заказа хуже дело обстоит, там нормально сделать только конфигурацию 1с править, обработку выгрузки. Так как приходит только статус "в обработке" остальные 1с не считает нужным присылать, в том числе "выполнен". Протокол не обязывает 1с присылать все статусы, а их там всего пара-тройка.
  • 16 ноября 2015 г.
  • Я вот какое решение делал для такого случая
    Сделал и на моем складе и на сайте одинаковые статусы заказов, чтобы при синхронизации по имени сопоставлять.
    Затем доделал функцию синхронизации заказов
    modules/shop/shop.1c.php 504 строка заменить функцию
    Код
    /**
    * Обмен информацией о заказах: отправка файла обмена на сайт
    *
    * @return void
    */
    private function sale_file()
    {
    $filename = basename($_GET['filename']);

    if(preg_match('/\.php$/', $filename))

    Показать весь код
    {
    return;
    }

    File::save_file(file_get_contents('php://input'), 'tmp/1c/'.$filename);

    $xml = simplexml_load_file(ABSOLUTE_PATH.'tmp/1c/'.$filename);

    File::delete_file('tmp/1c/'.$filename);

    foreach ($xml->Документ as $xml_order)
    {
    $id = $xml_order->Номер;
    list($y, $m, $d) = explode('-', $xml_order->Дата);
    list($h, $i, $s) = explode(':', $xml_order->Время);
    $created = mktime($h, $i, $s, $m, $d, $y);

    $status_name='';
    if(isset($xml_order->ЗначенияРеквизитов->ЗначениеРеквизита))
    {
    foreach($xml_order->ЗначенияРеквизитов->ЗначениеРеквизита as $r)
    {
    switch ($r->Наименование)
    {
    case 'Проведен':
    $proveden = ($r->Значение == 'true');
    break;

    case 'ПометкаУдаления':
    $udalen = ($r->Значение == 'true');
    break;
    case 'Статус заказа':
    $status_name = strval($r->Значение) ;
    break;
    }
    }
    }

    if(! empty($udalen))
    {
    $status = 2;
    }
    elseif(! empty($proveden))
    {
    $status = 3;
    }
    else
    {
    $status = 0;
    }

    if(!empty($status_name))
    {
    $status_id = DB::query_result("SELECT id FROM {shop_order_status} WHERE name1='%s' AND trash='0' LIMIT 1", $status_name);
    }
    else
    $status_id = DB::query_result("SELECT id FROM {shop_order_status} WHERE status='%d' AND trash='0' LIMIT 1", $status);

    if(DB::query_result("SELECT id FROM {shop_order} WHERE id=%d", $id))
    {
    $status_id_old=DB::query_result("SELECT status_id FROM {shop_order} WHERE id=%d", $id);
    if($status == 1)
    {
    $this->diafan->_shop->order_pay($id);
    }
    else if($status_id_old!=$status_id)
    {
    $this->diafan->_shop->order_send_mail_change_status($id, $status_id);
    }
    DB::query("UPDATE {shop_order} SET status='%d', status_id=%d, created=%d WHERE id=%d", $status, $status_id, $created, $id);
    }
    else
    {
    DB::query("INSERT INTO {shop_order} (status, status_id, created".($id ? ", id" : '').") VALUES ('%d', %d, %d".($id ? ", %d" : '').")", $status, $status_id, $created, $id);
    if(! $id)
    {
    $id = DB::insert_id();
    }
    }

    $order_goods = array();
    // Товары
    foreach ($xml_order->Товары->Товар as $xml_product)
    {
    $import_good_id = 0;
    $import_price_id = '';
    $order_goods_id = 0;
    $good_id = 0;
    if(strstr($xml_product->Ид, '#'))
    {
    list($import_good_id, $import_price_id) = explode('#', $xml_product->Ид, 2);
    }
    else
    {
    $import_good_id = $xml_product->Ид;
    }

    $article = $xml_product->Артикул;
    $name = $xml_product->Наименование;
    $count_goods = $xml_product->Количество;
    $price = $xml_product->ЦенаЗаЕдиницу;
    $discount_id = 0;

    if(isset($xml_product->Скидки->Скидка))
    {
    $discount_id = DB::query_result("SELECT id FROM {shop_discount} WHERE discount=%d", $xml_product->Скидки->Скидка->Процент);
    }
    $join_params = '';
    if($import_good_id)
    {
    $good_id = DB::query_result("SELECT id FROM {shop} WHERE import_id='%h'".(! preg_match('/[^0-9]+/', $import_good_id) ? " OR id='%s'" : ''), $import_good_id, $import_good_id);
    if($good_id && $import_price_id)
    {
    $price_id = DB::query_result("SELECT price_id FROM {shop_price} WHERE good_id=%d AND import_id='%h'".(! preg_match('/[^0-9]+/', $import_price_id) ? " OR price_id='%s'" : ''), $good_id,$import_price_id, $import_price_id);
    if($price_id)
    {
    $rs = DB::query_fetch_all("SELECT * FROM {shop_price_param} WHERE price_id=%d", $price_id);
    foreach ($rs as $r)
    {
    if($r["param_value"])
    {
    $i = (empty($i) ? 1 : $i + 1);
    $join_params .= " INNER JOIN {shop_order_goods_param} AS p".$i." ON p".$i.".order_goods_id=g.id AND p".$i.".param_id=".$r["param_id"]." AND p".$i.".value=".$r["param_value"];
    }
    }
    }
    }
    }
    if(! $good_id && $article)
    {
    if(! $good_id = DB::query_result("SELECT id FROM {shop} WHERE article='%h'", $article))
    continue;
    }
    if(! $good_id && $name)
    {
    if(! $good_id = DB::query_result("SELECT id FROM {shop} WHERE [name]='%h'", $name))
    continue;
    }

    $order_goods_id = DB::query_result("SELECT g.id FROM {shop_order_goods} AS g".$join_params." WHERE g.order_id=%d AND g.good_id=%d AND g.trash='0'", $id, $good_id);

    if($order_goods_id)
    {
    DB::query("UPDATE {shop_order_goods} SET count_goods=%d, price=%f, discount_id=%d WHERE id=%d", $count_goods, $price, $discount_id, $order_goods_id);
    }
    else
    {
    $order_goods_id = DB::query("INSERT INTO {shop_order_goods} (order_id, good_id, count_goods, price, discount_id) VALUES (%d, %d, %d, %f, %d)", $id, $good_id, $count_goods, $price, $discount_id);
    }
    $order_goods[] = $order_goods_id;
    }
    // удаляет покупки, которых нет в файле
    if($order_goods)
    {
    $del_goods = DB::query_fetch_value("SELECT id FROM {shop_order_goods} WHERE id NOT IN (%s) AND order_id=%d", implode(",", $order_goods), $id, "id");
    if($del_goods)
    {
    DB::query("DELETE FROM {shop_order_goods_param} WHERE order_goods_id IN (%s)", implode(",", $del_goods));
    DB::query("DELETE FROM {shop_order_goods} WHERE id IN (%s)", implode(",", $del_goods));
    }
    }
    DB::query("UPDATE {shop_order} SET summ=%f WHERE id=%d", $xml_order->Сумма, $id);
    }

    echo "success";
    }


    Там еще были доделки, я их убрал из кода, поэтому проверяйте, вместе исправим если что.
  • 19 октября 2015 г. , редакция: 1445272245
  • Код
    <?php
    /**
    * Файл конфигурации
    *
    * @package DIAFAN.CMS
    * @author diafan.ru
    * @version 5.4
    * @license http://www.diafan.ru/license.html
    * @copyright Copyright (c) 2003-2015 OOO «Диафан» (http://www.diafan.ru/)
    */

    Показать весь код

    if (! defined('DIAFAN'))
    {
    include dirname(__FILE__).'/includes/404.php';
    }

    //папка, в которой лежит сайт. Для корня домена оставьте пустым
    define("REVATIVE_PATH", "");

    //название сайта, добавляется к тегу title в конце через дефис
    define("TIT1", "site.ru");

    //параметры подключения к БД
    define("DB_URL", "mysqli://user:pass@localhost/name_database");

    //префикс таблиц сайта в БД
    define("DB_PREFIX", "diafan_");

    //кодировка БД
    define("DB_CHARSET", "utf8");

    //название папки с визуальным редактором
    define("USERFILES", "userfiles");

    //версия DIAFAN.CMS
    define("VERSION_CMS", "5.4");

    //ЧПУ папки панели администрирования
    define("ADMIN_FOLDER", "admin");

    //мобильная версия true/false (да/нет)
    define("MOBILE_VERSION", false);

    //demo-версия true/false (да/нет)
    define("IS_DEMO", false);

    //включить режим разработки, когда на сайт выводятся все возможные ошибки true/false (да/нет)
    define("MOD_DEVELOPER", true);

    //включить режим технического обслуживания сайта, сайт станет недоступен для пользователей (шаблон оформления сообщения в themes/503.php) true/false (да/нет)
    define("MOD_DEVELOPER_TECH", false);

    //отключить кеширование true/false (да/нет)
    define("MOD_DEVELOPER_CACHE", true);

    //выводить запросы к БД на сайте true/false (да/нет)
    define("MOD_DEVELOPER_PROFILING", false);


    //адрес FTP текущего сайта
    define("FTP_HOST", "");

    //путь к DIAFAN.CMS, после входа ftp-пользователя, например, www/site.ru/docs/
    define("FTP_DIR", "");

    //имя FTP-пользователя
    define("FTP_LOGIN", "");

    //пароль FTP-пользователя
    define("FTP_PASSWORD", "");

    //главный ящик администратора, владельца сайта, используется по умолчанию во всех уведомлениях
    define("EMAIL_CONFIG", "123@gmail.com");

    //использовать SMTP-авторизацию при отправке почтовых сообщений true/false (да/нет)
    define("SMTP_MAIL", false);

    //url почтового сервера (например, smtp.site.ru)
    define("SMTP_HOST", "");

    //логин почты
    define("SMTP_LOGIN", "");

    //пароль к почте
    define("SMTP_PASSWORD", "");

    //порт (по умолчанию 25)
    define("SMTP_PORT", "");

    //экстремальное кэширование
    define("CACHE_EXTREME", false);

    //использовать Memcached сервер для кэширования
    define("CACHE_MEMCACHED", false);

    //хост сервера Memcached
    define("CACHE_MEMCACHED_HOST", "");

    //порт сервера Memcached
    define("CACHE_MEMCACHED_PORT", "");

    //часовой пояс сайта, в формате http://www.php.net/manual/en/timezones.php
    define("TIMEZONE", "Europe/Moscow");

    //конец строки ЧПУ, по умолчанию "/". Можно ввести ".htm"
    define("ROUTE_END", "/");

    //использовать автоматическое формирование ЧПУ для модулей true/false (да/нет)
    define("ROUTE_AUTO_MODULE", true);

    //подключить SMS-уведомления true/false (да/нет)
    define("SMS", false);

    // ключ для сервиса byteHand
    define("SMS_KEY", "");

    // id в системе byteHand
    define("SMS_ID", "");

    // подпись для уведомлений
    define("SMS_SIGNATURE", "");

    //дата последнего экспорта заказов в систему 1С:Предприятие
    define("LAST_1C_EXPORT", "");

    // разрешить вставлять во frame
    define("NO_X_FRAME", false);
  • 13 октября 2015 г.
  • modules/shop/shop.1c.php 694 строка
    Код
    $this->import_categories($xml->Классификатор, $site_id);

    заменить на
    Код
    foreach($xml->Классификатор->Группы as $group)
    $this->import_categories($group, $site_id);

    Написал на скорую руку, отпишитесь заработало или нет.
  • 20 августа 2015 г.
  • файл modules/ shop/ shop.view.show_search.php 191 строка
    нужно заменить
    Код
    case 'select':
    case 'multiple':
    echo '
    <span class="input-title">'.$row["name"].':</span>';
    foreach ($row["select_array"] as $key => $value)
    {
    echo '<input type="checkbox" id="shop_search_p'.$row["id"].'_'.$key.'" name="p'.$row["id"].'[]" value="'.$key.'"'.(in_array($key, $row["value"]) ? " checked" : '').'>
    <label for="shop_search_p'.$row["id"].'_'.$key.'">'.$value.'</label>
    <br>';
    }

    на такой вывод
    Код

    case 'select':
    case 'multiple':
    echo '
    <span class="input-title">'.$row["name"].':</span>';
    echo '<select name="p'.$row["id"].'[]">';
    foreach ($row["select_array"] as $key => $value)
    {
    echo '<option value="'.$key.'"'.(in_array($key, $row["value"]) ? " selected" : '').'>
    '.$value.'</option>

    Показать весь код
    <br>';
    }
    echo '</select>';
  • 19 августа 2015 г.
  • Самый быстрый способ если у вас артикул не используется вместо артикула штрихкод ставить, например так:
    - Заменить в файле "modules/shop/shop.1c.php" $xml_product->Артикул на $xml_product->Штрихкод

    Если отдельной характеристикой, то уже нужно дописывать shop.1c.php строка 1122

    Код

    DB::query("DELETE FROM {shop_param_element} WHERE param_id=%d AND element_id=%d", 777, $id);
    DB::query("INSERT INTO {shop_param_element} (param_id, element_id, [value]) VALUES (%d, %d, '%s')", 777, $id, strval($xml_product->Штрихкод));


    Здесь 777 это номер характеристики "Штрихкод" в диафане, при наведении на параметр в админке показывается.
  • 14 июля 2015 г.
  • Нужно изменить таблицу картинок, добавив там вариант например "some_tag"
    SQL запрос в базу данных
    Код
    ALTER TABLE `diafan_images`
    CHANGE `element_type` `element_type` enum('element','cat','brand','some_tag') COLLATE 'utf8_general_ci' NOT NULL DEFAULT 'element' COMMENT 'тип элемента модуля'
Показывать по:

Новости

Блоги

  • 16.11.2019
  • Достаточно широкой проблемой, которая вызывает множество вопросов, обращений в тех.поддержку и тем на форуме, является обновление, а именно ошибки, с ним связанные. Корни проблем, возникающих при этом, совершенно различны, но наиболее часто причина в кастомизации. И хоть определение это слишком широкое, всё же процедура выявления проблемы вполне стандартизована и проста. Об этом и пойдёт речь в статье.