Вход • Регистрация

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

  • 03 декабря 2019 г.
  • Можно ли как то сделать независимую и одновременную работу нескольких Ajax запросов на одной странице?
    То есть когда, отправлен, но еще не пришел ответ на один запрос, и в этот промежуток времени отправляется второй запрос, с другими данными, то работа первого запроса не нарушалась, и Ajax ответы пришли бы неискаженными на оба запроса и попали в обработчики, которые им отведены ы js. Интересует - 1) Можно ли это в принципе сделать в Диафане без изменения site.js и 2) Если только с изменением site.js то подскажите основные направления изменений - сам принцип, в каком направлении необходимо менять
  • 17 июня 2019 г.
  • Да, это понятно, что не будет - уже все перепробовал.

    Мне нужна получить в перменную то содержимое, которое в станадртном варианте выдается командой
    Код
    echo $this->get('table', 'cart', $my_result); //вывод таблицы с товарами

  • 17 июня 2019 г.
  • Я привел данную конструкцию как описание задачи. В $cart_model - то, что выдается при выводе корзины в штатном diafan-е из коробки.

    Задача получить то же самое и засунуть это в перменную, но в другом месте diafan. Конкретно у меня, - это при обрпаботке AJAХ запроса от другого модуля.
    Модуль корзины я подключаю в другом модуле при помощи

    Код
    Custom::inc('modules/cart/cart.model.php');
    $cart_model = new Cart_model($this->diafan);


    А вот дальше ничего не получается.

  • 16 июня 2019 г.
  • Подскажите, что то я запутался, - мне кажется, что заблудился в трех соснах.
    Не могу решить задачу. Кратко вот какая проблема:
    В модуле cart.view.form.php вызывается echo $this->get('table', 'cart', $result); //вывод таблицы с товарами .
    С этим все понятно.

    А мне нужно, по аналогии, сформировать содержимое, выводимое этим шаблоном, в виде переменной в совершенно другом, любом другом, месте diafan. Не понимаю, как это сделать.
    Например мне надо в обработке AJAX в action.php получить в виде переменной то, что выводится по данному шаблону

    Я делаю вот так:
    Код
    Custom::inc('modules/cart/cart.model.php');
    $cart_model = new Cart_model($this->diafan);
    $cart_model->list_();
    $my_result = $cart_model->result();


    но как потом связать, то как работает шаблон при выводе view-шки:
    Код
    echo $this->get('table', 'cart', $my_result); //вывод таблицы с товарами

    с тем, что мне надо получить, что то типа:
    Код
    $my_view = $this->get('table', 'cart', $my_result);

    не получается ни через:
    $this->diafan->_tpl->get(...), ни через просто ->get

    В документации сказано:
    В модуле объект этого класса доступен через переменную $this->diafan->_tpl, в шаблоне модуля объект класса доступен через переменную $this.
    Но у меня не шаблон модуля , ни сам модуль, а совершенно другой модуль

    Подскажите, плиз! Мне кажется, что это простейшая задача, но я что-то совсем не так делаю.




    #шаблон #вывод шаблона #ajax
  • 18 июня 2019 г.
  • Никакая это не муть. Вы просто не разобрались до конца. Посмотрите, - в штатном Диафане во всех шаблонах, если есть вывод через шаблон и при формировании страницы , и при обновлении страницы через AJAX, везде стоит проверка в начале и в конце - каким способом сформировано содержание При использовании шаблона при обычном выводе и при выводе через AJAX специально и сделано - либо с обертывающим DIV, либо без DIV ( при выводе через ajax)

    Это обусловлено тем, что при выводе через ajax - у вас на конечном этапе получения ajax ответа так или иначе стоит jquery код типа :

    Код
    $('#my_div).html(prepare(response.mydiv));


    Так вот, если содержимое в ответе сформировано шаблоном, то без использования проверки ajax | не ajax в коде шаблона у вас произойдет задвоение div-вов и результат будет неверный. Будт получаться вот так

    Код
    <div id="my_div"> содержимое </div>

    // это правильно, то есть так, как надо

    а при ajax ответе будет
    Код
    <div id="my_div"><div id="my_div"> содержимое </div></div>

    // это неправильно




  • 17 июня 2019 г. , редакция: 1560804091
  • Вообщем разобрался. Просто посмотрел, что фактически делается в методе get() класса class Template extends Diafan ( это файл includes/template.php)
    А там все элементарно просто, после всяких проверок на наличие, и допустимости фактически выполняется просто следующий код:

    Код

    $current_module = $this->diafan->current_module; // запоминаем имя текущего модуля в котором вызывается tpl->get()
    ob_start(); // отключаем вывод в броузер, вместо этого выводим в специальный промежуточный буфер, см докум. по PHP
    $this->diafan->current_module = $module; // это имя модуля к которому относится вызываемый шаблон
    $this->js($name, $module);// если у шаблона есть прикрепленный js - добавляем его
    include(ABSOLUTE_PATH.Custom::path($file)); // загружаем php файл шаблона, после этого он выполняется и все выводит в промежуточный буфер, а
    // не в броузер
    $this->diafan->current_module = $current_module; // восстанавливаем имя ранее сохраненного модуля
    $text = ob_get_contents(); // копируем все, что накопилось в буфере в переменную $text
    ob_end_clean();// очищаем буфер.

    return $text; // возвращаем то, что шаблрон сформировал в строковой переменной.


    После этого все стало на свои места.
    При использовании шаблона важно передать ему правильные переменные, такие же как он получает, когда просто выводит в броузер результаты своей работы.

    И еще момент. Если вы используете такого рода конструкции при обработке Ajax запроса, то надо обязательно сделать так, что бы у шаблона в начале и конце его работы НЕ ФОРМИРОВАЛСЯ открывающий тег <DIV> и соответсвующий ему закрывающий тег </div>

    В стандартном диафане это везде сделано при помощи использования переменной $result ["ajax"] = true;
    И в начале шаблона стоит такаой код :
    Код

    if (empty($result["ajax"])) { echo '<div>';
    }



    а в конце кода шаблона
    Код
    if (empty($result["ajax"])) { echo '</div>';
    }



    В очередной раз восхитился разработчиками Диафана, какие же они крутые программитсы, как все гибко и в то же время системно, просто и грамотно построено в их системе! Огромный респект!
  • 18 июня 2019 г.
  • Да никого я никуда не ввожу, я все подробно расписал, кто хочет разобраться - тот поймет. Ни про какой конкрертный div я не писал, а лишь разжевал, почему во многих шаблонах стандартнрого diafan часто стоит конструкция в начале шаблона:
    Код

    if (empty($result["ajax"])) { echo '<div >';
    }


    и в конце

    Код
    if (empty($result["ajax"])) { echo '</div>';
    }


    Если вам это очевидно, то странно что вы не поняли смысла моей фразы:

    Цитата
    И еще момент. Если вы используете такого рода конструкции при обработке Ajax запроса, то надо обязательно сделать так, что бы у шаблона в начале и конце его работы НЕ ФОРМИРОВАЛСЯ открывающий тег <DIV> и соответсвующий ему закрывающий тег </div>

  • 03 декабря 2019 г.
  • Андрей, наткнулся на ваш ответ. Все понятно, по логике работы. Возник только вопрос - код, который вы привели для JS - ajax запрос и обработчик ответа на него, если я все правильно понимаю , никак не связан с встроенным в Диафан модулем обработки Ajax и будет работать незавсисимо от него, в том смысле, что ответы не будут никак конфликтовать друг с другом? И можно на одной страничке, если надо, как в моем случае, разместить несколько аналогичных кусков кода : (обработка события - Ajax_запрос - его обработчик), которые будут срабатывать по нужным событиям, и их ответы не будут "пересекаться"? То есть запросы будут работать полностью независимо и если надо , асинхронно.
  • 26 октября 2014 г.
  • Посмотрите что у вас с индексами таблиц. По умолчанию в Диафане индексов практически нет. Мы у себя на некоторых таблицах по 3-4 индекса добавляли. Для инфо : товаров в базе более 400тыс.
    Также можно отказаться от некоторых условий в WHERE в запросах в модели магазина, например от временных параметров.
  • 25 июля 2014 г.
  • Вот возникла задача, сделать так, чтобы корзина магазина работала не на протоколе http, а на https.
    Как можно сменить протокол?

    Оказалось, что google требует только протокол https для передачи персональных данных при заказе.
    У кого какие мысли есть по этому поводу?
  • 29 мая 2014 г.
  • Не проще ли конкретному покупателю - прописывать имеющуюся у него скидку в админке, тогда эта скидка автоматически будет подставляться при заказе этим покупателем товаров. И проверять ничего не надо будет - то что задано для данного покупателя администратором - то ему и подставится


  • 15 марта 2014 г.
  • Используйте глобальную переменную
    $_SERVER['REMOTE_ADDR']

    if ($_SERVER['REMOTE_ADDR']=='xxx.xxx.xxx.xxx') {
    // действия только для данного IP
    .....
    }
    Это самый простой вариант.
    Ну а можно ввести в админке поле - куда вводить те или иные IP и для них делать или не делать какие нить действия
    Это посложнее



    Третий вариант свой модуль написать, в нем управлять списком IP и назанчить каждой группе свои действия / или бездействия.

  • 22 декабря 2013 г.
  • А причем тут xls файл, если Маркету нужен XML?

    А если Вы опечатались и имели ввиду XML, то открывайте его и смотрите, - что не так - написано же
    Invalid document structure (строка 1, столбец 1)

    Неверная структура документа прямо с самого первого символа строка 1 столбец 1.
  • 17 декабря 2013 г.
  • Скорее всего переменная пуста. Проверьте это вставив в начало модуля print_r($result);

    Либо перед выводом анонса посмотрите что в переменно - вот так:
    Код
    print_r($result["anons"]);
    if (!empty($result["anons"]))
    {

    $this->htmleditor($result['anons']);

    }


    Если пуста, а в БД есть информация - значит в модели не заполняется нужной инфо из БД. Надо там вставить выборку данных из базы
  • 16 декабря 2013 г. , редакция: 1387199662
  • Вариантов много ну например

    Код

    if (!empty($result["param"]))
    {
    if ($result["id"]=='6') $this->get('param', 'ab', array("rows" => $result["param"], "id" => $result["id"]));
    };


    Если нужен маcсив конкретных id ,
    тогда как то так:
    Код

    $id_arr = array("6", "19", "36", "199"); // задаете сами можно прямо в коде, можно сделать из админки, но это немного больше телодвижений

    if (!empty($result["param"]))
    {
    if (in_array($result["id"], $id_arr)) $this->get('param', 'ab', array("rows" => $result["param"], "id" => $result["id"]));
    };



    Точный и правильный синтаксис каждой команды на PH можно быстро проверить просто набрав в любом поисковике название команды и слово PHP например: in_array PHP
  • 10 декабря 2013 г. , редакция: 1386704779
  • Все данные из форм обрабатываются как правило в файле AjAX соответствующего модуля. Посмотрите - в любом Ajax файле идет проверка, что мы туда попали из соответствующего модуля, а потом идет разбор переменных запроса. Вот тут и можно вставить сбор значений переменных и отправку их куда нужно или сохранение. Так например сделано при обработке заказа в корзине.
  • 30 ноября 2013 г.
  • Как можно организовать "гибкий " ЧПУ для страниц магазина. По типу как сделано на Я покупаю - например вот ссылка
    http://www.yapokupayu.ru/products/televizor_mystery_mtv_2132_mystery_1909388
    Вроде ссылка как ссылка, но если вы поменяете или даже совсем удалите часть ссылки между
    http://www.yapokupayu.ru/products/ и 1909388 , то все равно попадете за счет редиректа обратно на эту ссылку.
    Например ,
    http://www.yapokupayu.ru/products/xxxxxxxxxx_1909388 и http://www.yapokupayu.ru/products/1909388 - обе ведет на первоначальную страницу

    Таким образом с одной стороны есть ЧПУ ссылка на товар, в которую включено название товара, с другой стороны всегда попадаешь на этот товар, если как то меняется название самого товара.

    Напомните, кто знает, в каком модуле сейчас происходит запись в таблицу diafan_shop_rewrite ЧПУ ссылки на товар в транслите.

    Я так понимаю, что для осуществления поставленной задачи, надо прописать все артикулы в таблицу редиректов, затем в модуле редирект отлавливать наличие в запрашиваем URL вхождения строк shop и артикула из таблицы редиректа, и затем делать переход на страничку товара с этим артикулом. А она будет rewrite-иться на заданный в таблице rewrite ЧПУ для этого товара типа
    http://msite.ru/shop/televizor_mystery_mtv_2132_mystery_1909388 У кого есть какие нибудь соображения по этому вопросу - поделитесь, думаю будет всем полезно.
  • 05 декабря 2013 г.
  • Илья! Спасибо за ответ. Уже все реализовали. Вот гляньте:
    http://scorpion.ru/shop/igrovoy_pult_-_kontroller_dlya_nintendo_wii_remote_nunchuck_combo_belyy__199043869
    Вот например ссылка - можно как угодно менять текст ссылки между /shop/ и артикулом - все равно попадаем на эту страничку
    Никакой серой оптимизации тут нет. Наоборот независимо от текущего названия товара - мы всегда приходим на его страничку, ту которая прописана на всех ссылках и результатах поиска. В стандартном Дифане - если изменить название товара - то ссылки уже имеющиеся в интернете на этот товар будут вести на 404 ошибку
  • 26 ноября 2013 г.
  • Да действительно, надо хранить, как то я с тормозил. Просто таблица за 2 недели разрастается до очень больших размеров - таких что подсчет посетителей в текущий момент на сайте тормозит - до нескольких 100 миллисекунд доходит время одного запроса к таблице сессий.

    Вопрос возник, Виталий, посдкажите схематично , как организовать просмотр администратором, имея доступ к таблице сессий, последние товары, которые положили в корзину, но не заказали.
  • 23 ноября 2013 г.
  • Да, это хорошая идея. Спасибо, попробую.
    Насчет 200 милисекунд - тут 200, там 100 ...200 - все вместе по чуть чуть и набегает. Мест где можно было бы за раз в двое сократить время формирования странички - наверно нет, поэтому приходится по чуть чуть улучшать
  • 23 ноября 2013 г.
  • Заметил что сайт начал подтормаживать, включил профилирование запросов и обнаружил что 90% а может и больше идет на практически ненужную операцию - определение количества пользователей на сайте - реально на выполнение запроса в модуле users.model.php
    $result["count_user"] = DB::query_result("SELECT COUNT(session_id) FROM {sessions} WHERE user_id = 0 AND timestamp >= %d", $timestamp);
    Если все остальные запросы укладываются в 0.0001...0,001 сек, то этот занимает 0.2...0.3 сек


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

    Что посоветуете сделать? - чистить таблицу - например каждый день, может по другому как то организовать определение количества посетителей на сайте, хотя как по другому, иначе чем подсчет сессий - не могу придумать, может какие другие варианты есть. Хотелось бы услышать мнение опытных . пользователей Диафан.
  • 21 ноября 2013 г.
  • Либо закоментировать в коде в нужных местах функцию добавления admin- ского span блока - это выполняется одной строчкой. Тогда не будет вставляться этот блок в тех местах, где закомментируете. Ну например, - он не нужен в меню, но нужно оставить возможность редактирования текстов. Убираем строчку только в модуле меню:
    Файл menu.model.php
    Эта строчка имеет в которой вызывается метод:
    Код
    /$this->result["rows"][$parent_id][$i]["name"] = $this->diafan->_useradmin->get($row["name"], 'name', $row["id"], 'menu', _LANG);


    Вот её и надо закоментировать
  • 12 ноября 2013 г.
  • Как можно сделать свой вид формы, для примера, разберем форму обратной связи. У нее есть HTML часть которая редактируется из админки, и часть состоящая из полей формы, редактируемых в конструкторе форм для данного модуля. Затем идет кнопка Отправить.

    Как добавить еще какой нить HTML блок, содержимое которого редактировалось бы из Админки, и выводилось бы ПОСЛЕ кнопки отправить.
    См рисунок


    Также еще одна недоработочка есть в Диафане, пока не знаю как ее исправить:
    При отправке формы - открывается страничка подтверждения, на которой присутствует блок с HTML текстом, который был в админке для основной страницы модуля + текст, заданный в админке для странички подтверждения, как избавиться от первого HTML текста?



  • 12 ноября 2013 г.
  • Да тут все просто
    Пишите свою функцию - например в function. php
    например create_good()

    Она создает новый товар. То есть добавляет запись в таблицу shop, shop_prices и другие
    Данные берет из полей Get запроса

    Создаете на сайте страничку которая выводит этй функцию. Присваиваете страничке имя и дергаете эту страничку из js скрипта с нужнами праматерами в GET.

    например site.ru/create_good/?action=create_new&name=xxxxx&price=yyyyy и тд

    Таки образом можно все что угодно менять в базе.
    Аналогично можно получать любые данные из базы.

    Желательно встроить систему подтверждения выполнения скрипта что бы инициатор знал что его запрос выполнился так как положено и не было ошибок
Показывать по:

Новости

  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 
  • 15 декабря 2023 г.
  • Подводим итоги 2023 года. Выпустили новую сборку DIAFAN.CMS 7.1.1, вводим новые тарифы на аренду сайта и коммерческую поддержку и автообновления с января 2024 г., строим планы на будущий год.
  • 25 июля 2023 г.
  • Выпустили очередную сборку DIAFAN.CMS 7.0.1. Она уже доступна к установке.

Блоги

  • 15.12.2023
  • В новой сборке DIAFAN.CMS 7.1.1 мы расширили функциональность баннеров, уделили внимание YML-фиду для Яндекс.Маркет, улучшили “Настройки шаблона”, оформили модуль лога действий и разработали “Заметки” для пользователей административной части сайта. Также проработали замечания и предложения наших пользователей, исправили несколько ошибок.

Форум