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

Первый вебинар-чат

  • 11 августа 2016 г. , редакция: 11 августа 2016 г.
  • Доброго всем дня!
    Эта тема для программистов, которые делают сайты на diafan и хотят развиваться.
    Суть данной темы в том, чтобы не просто ответить какой файл открыть и на какую строчку вставить код, а именно объяснить почему в этот файл, почему именно этот код.
    Другими словами мы делимся опытом, решая какие то задачи.
    Думаю тема будет развиваться и не стоять на месте.

    Пожалуй я начну
    • 11 августа 2016 г.
    • Идея хорошая, публичные вопросы и публичные ответы. Я буду вести топик, если что привлекать коллег. Все могут задавать уточняющие вопросы.
      Степан, давайте только сразу договоримся об удобсстве. Каждый вопрос отдельным сообщением, чтобы на него можно было отдельно отвечать и обсуждать. Я разделю тему.
      • 11 августа 2016 г.
      • Т.е. здесь в ответ на вопрос необходимо сразу привести программный код? А поощрение предусмотрены?
        • 11 августа 2016 г.
        • Не код! Хуже! Объяснить, почему он такой!

          PS Виталий, что надо из поощрений, обращайтесь, лично Вам я подсуечусь
  • 11 августа 2016 г. , редакция: 11 августа 2016 г.
  • СТЕПАН (IDXDOC):
    Вопрос 1:
    Вчера увидел в проектах задачу сделать автообновление курса валют, что и сам уже давно хотел сделать, но руки не доходили.
    Мне это важно сделать, поскольку у меня 30 сайтов, на которых все товары в валюте, и каждое утро менять руками это не очень круто.
    Помимо автообновления нужно сделать поле, в котором будет записываться процент, который необходимо вычитать их курса валюты.
    • 11 августа 2016 г. , редакция: 11 августа 2016 г.
    • Степан, тут важно понимать логику системы.

      Есть доки, где одна из самых интересных страниц - Архитектура БД DIAFAN.CMS

      (маленькое отступление: документация у нас в большинстве своем генерируется "на лету", из гита, где лежит система. ПОМНИТЕ, что когда мы выкладываем очередное обновление, и там в каком-то модуле есть изменения в БД, они сразу будут отображены на этой странице! То есть, документация анализирует инсталл-файлы всей CMS из гита и на основании их формирует документацию, например, поэтому модуль отзывов мы еще не описали в доках, т.к. полируем его еще, но на станице доков БД таблица модуля "отзывы" REVIEWS уже есть)

      Так вот, нужно помнить, что все цены всех товаров у нас лежат в таблице SHOP_PRICE

      Мы писали https://habrahabr.ru/company/diafan/blog/300930/ что мы все пересчеты делаем только в админке, как раз на примере цен:

      Цитата
      7. Минимизируйте динамическое получение данных

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

      Например, в Diafan.CMS есть гибкая система скидок, когда у одного товара может быть несколько цен, каждая с установленной скидкой, еще и в разных валютах. Мы не высчитываем новые цены на сайте для каждого посетителя сайта. Мы делаем это при установке скидки в административной части сайта, считаем все различные варианты цены для выбранных товаров и собираем их в отдельную таблицу shop_price с признаком price_id. Исходная цена на товар определяется как id=price_id. Если id<>price_id, то это уже вариация цены либо со скидкой либо в основной валюте сайта. И в этой таблице сразу указывается для кого эта цена (если она установлена для какой-то конкретной группы пользователей).

      Да, если товаров много, при добавлении или изменении скидки администратор будет ждать, глядя на крутящееся колесико. Зато посетителям сайта ждать не придется, ведь при выводе на сайте, а также при поиске, сортировке и прочих ёмких операциях система просто из всех доступных цен из одной таблицы по одному price_id выбирает самую маленькую и всё.


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

      Значит, идем в админку, в файл валют: /modules/shop/admin/shop.admin.currency.php
      Видим функцию save_variable_exchange_rate()
      Там один запрос на сохранение нового курса
      Код
      UPDATE {shop_currency} SET exchange_rate='%f'

      и
      Код
      $this->diafan->_shop->price_calc(0, 0, $this->diafan->id);

      судя по названию price_calc - пересчет цен.

      Все такие функции лежат в /modules/shop/inc/shop.inc.price.php

      (подключение $this->diafan->_shop->price_calc() означает взять из INC файла PRICE shop.inc.price.php функцию CALC)

      Открываем файл и видим
      Код
      /**
      * Рассчитывает все возможные вариации цен и записывает их в базу данных
      *
      * @param integer $good_id номер товара, если не задан, цены рассчитываются для всех товаров
      * @param integer $discount_id номер скидки
      * @param integer $currency_id номер валюты, если нужно изменить цены, указанные в валюте
      * @return void
      */
      public function calc($good_id = 0, $discount_id = 0, $currency_id = 0)

      То есть, эту функцию можно дергать где угодно, чтобы пересчитать цены. Для скидок. Для валют.

      Поэтому Ваша задача сделать модуль, который дернет курс валюты с сайта ЦБ, запишет его в БД shop_currency и дернет в его учетом функцию
      Код
      $this->diafan->_shop->price_calc(0, 0, $this->diafan->id);

    • 11 августа 2016 г.
    • Далее получаем контент с web-ресурса.
      Например, $source=file_get_contents($url);
      где в $url строка со всеми get-параметрами. Важно. Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция "fopen wrappers". Смотрите более подробную информацию об определении имени файла в описании функции fopen(), а также список поддерживаемых протоколов URL.
      Но это плохая практика. Поясню из-за чего не стоит использовать url-оболочку для файловых функций. Вы не только лишаетесь возможности передавать POST-запросы и cookie-данные, но и свои собственные HTTP-заголовки, а также в случае передачи сложных структур данных Вы не сможете контролировать передачу данных.
      Используйте лучше CURL либо fsockopen. Как говориться: проще написать функцию основанную на одном из этих подходов один роз и использовать в будущем.
      Если использовать fsockopen, то можно будет считывать по байтам или по массиву байтов сразу. fgets - считывает строчку (до символа начала новой строки) или fread (считывает указанное количество байтов). Использование fsockopen достаточно просто, т.к. Вы используете файловые функции + вы уже можете контролировать HTTP-соединение. Подробности в мануале.
      Ну, или вот пример кода (взят из просторов интернета, автор не я, не проверял), привел его некий movEAX
      Код

      function getContent($url, array $post){
      $ecx = count($post);
      while($ecx--){
      @$post['fields'].=key($post).'='.array_shift($post).'&';
      }
      $post = rtrim($post['fields'], '&');
      try {
      $crl = curl_init($url);
      curl_setopt_array($crl, array(
      CURLOPT_RETURNTRANSFER => 1,
      CURLOPT_POST => 1,
      CURLOPT_POSTFIELDS => $post,
      CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
      CURLOPT_FOLLOWLOCATION => 1
      )
      );
      if(!($html = curl_exec($crl))) throw new Exception();
      curl_close($crl);
      return $html;
      } catch(Exception $e){
      return FALSE;
      }
      }

      Успехов.
  • 11 августа 2016 г. , редакция: 11 августа 2016 г.
  • СТЕПАН (IDXDOC):
    Вопрос 2:
    Было бы хорошо в баннерах сделать выбор не только общего модуля "Магазин" а именно его категорий.
    • 15 августа 2016 г.
    • 1. Тут как обычно, двигаться надо от основного: от БД. Любая информация запоминается в базе, поэтому смотрим, что есть, и думаем, как это можно нарастить.
      Наша любимая страница из доков: Архитектура БД таблица#bs_site_rel - видим, что в ней хранится связь баннеров и страниц сайта.
      Далее уже думать, как лучше приделать категории. Можно отдельную таблицу сделать, можно в эту добавить поле category_id
    • 15 августа 2016 г.
    • 2. Админка. Стандартный файл modules/bs/admin/bs.admin.php, нужно добавить там категории магазина.
      Основа админки модуля - массив $variables
      Если добавить туда поле, которое есть в основной таблице модуля, и его тип ('type' => 'text' поле, 'type' => 'checkbox' галка, 'type' => 'editor' визуальник, 'type' => 'date' календарик, 'type' => 'numtext' числа, и пр.) оно сразу оформится в админке и будет работать на сохранение.

      Собственно, это все описано в доках http://www.diafan.ru/dokument/full-manual/examples/new-field/

      Если поле требует не просто ячейки, а каких-то операций, его можно описать функцией.

      Если функция системная, она подтянется из adm/includes/edit_functions.php, например, называя поле site_id и указывая его тип 'type' => 'function', выполнится функция edit_variable_site_id(), которая выведет список страниц сайта.

      Если функции нет, и мы что-то совсем левое хотим, весь алгоритм работы поля можно определить прям в modules/bs/admin/bs.admin.php.
      То есть, мы добавляем FFFF в $variables и хотим на это поле что-то свое повесить. Тогда мы ниже просто приделываем функцию edit_variable_FFFF() и пишем в ней что хотим, любой алгоритм.

      Есть системные названия внутренних функций, для переопределения стандартного поведения системы.
      edit_variable_ПЕРЕМЕННАЯ - изменение редактирования любого поля модуля
      list_variable_ПЕРЕМЕННАЯ - изменение вывода любого поля в списке модуля
      save_variable_ПЕРЕМЕННАЯ - поменять алгоритм сохранения любого поля.
      и пр.
      Тут надо внимательно прочитать http://www.diafan.ru/dokument/full-manual/developers/admin/module/ и один примерчик http://www.diafan.ru/dokument/full-manual/examples/new-admin/

      Я не знаю, насколько нужно отступать в теорию, насколько Вы знаете основы. Объяснять сначала их, или сразу говорить, что нужно использовать в данном случае. Хотя лучше было бы, если бы задавались предметные вопросы, почему тут так, и почему тут эдак.

      Возвращаясь к задаче, нужно добавить в $variables переменную cat_shop_id типа function и описать её в баннерах, где запрашивать категории магазина и выводить их списком. Система сама сохранит их в БД
      • 23 января 2017 г. , редакция: 02 марта 2017 г.
      • Мне удалось вывести категории, но не могу сохранить.
        Попробовал взять стандартные функции редактирования категории и сохранения, но не получается сделать под себя.

        ________________________________________
        Цитата
        Возвращаясь к задаче, нужно добавить в $variables переменную cat_shop_id типа function и описать её в баннерах, где запрашивать категории магазина и выводить их списком. Система сама сохранит их в БД

        Система сама не сохранит, а выдаст белый экран. Функция save_variable_cat_shop_id не определена ни в баннерах, ни в save_functions.php

        У меня получилось их вывести как нужно, с учетом родителей и т.д. Даже могу сохранять теперь, и белого экрана нет. Все хорошо.
        Но теперь не сохраняется раздел сайта, почему это может быть?

        Нашел причину, для сохранения категории, я использовал функцию update_table_rel, а она по факту используется 2 раза, т.е. после того, как я нажал кнопку сохранить, сначала идет вызов первой функции update_table_rel с данными раздела сайта, а после сразу же идет вторая такая же функция, но с данными категорий, а туда не передаются данные разделов сайтов, и получается что когда фукнция вызывается 2 раз, она перезаписывает разделы сайта на 0, т.к. ничего небыло передано.

        Вопрос: как в функцию update_table_rel, передать значения для 2-х столбов в таблице?
    • 15 августа 2016 г.
    • 3. Третий шаг - фильтровать вывод баннеров на сайте, согласно цифрам ID категорий из БД. Это уже не сложно.
      Это modules/bs/bs.model.php
      Функция show_block()
      Там запрос SELECT , где сейчас отбираются только те баннеры, которые прикреплены к текущей странице
      Код
      ....
      AND (r.site_id=%d OR r.site_id=0)
      ...


      (кстати, надо объяснять, что такое %d в запросе?)

      Сюда нужно только добавить
      Код
      ....
      AND (r.cat_shop_id=%d OR r.cat_shop_id=0)
      ...

      • 23 января 2017 г.
      • По идее должно быть не r.cat_shop_id, а r.category_id т.к. мы создали именно поле category_id.
        А %d это id текущей категории, где мы находимся тобишь, мне его нужно определить по порядку в скобках функции query_fetch_all, но как это сделать? еще такими вещами не занимался.
      • 02 марта 2017 г.
      • Виталий, большое спасибо за помощь!
        Я наконец-то сделал эти категории. Работает как надо.
        Единственное мне пока пришлось отказаться от раздела сайта, т.к. идет конфликт, о котором я написал выше.
        Будет здорово, если поможете разобраться.
  • 11 августа 2016 г. , редакция: 11 августа 2016 г.
  • СТЕПАН (IDXDOC):
    Вопрос 3:
    В поиске по товарам, вывести минимальную и максимальную цену в рублях, даже если в админке цены в валюте, в зависимости в какой мы категории
    Находил решение, просто поставил в нужное место и все заработало, а почему это решение работает так и не понял, но работало оно пока я не переписал цены в валюту.
    • 23 августа 2016 г.
    • Цитата
      Находил решение, просто поставил в нужное место и все заработало
      Приводите это решение сюда, разберем.
      • 24 августа 2016 г.
      • Виталий, доброе утро!
        Последнее время в запарах, а тут ответы все, что требуют большого вникания, мне темболее на часа 2-3 каждый)))
        Я как освобожусь более менее, я обязательно вернусь к данной теме и мы продолжим, если Вы не против!)
        • 24 августа 2016 г.
        • Надеюсь, и другие подключатся. А то они стесняются
          • 24 августа 2016 г.
          • Никто не хочет раскрывать свои знания, боятся конкурентов))))
            Кого обидел извините!)
            • 24 августа 2016 г.
            • Так я вопросы призываю задавать, наоборот, знания получать
    • 02 марта 2017 г.
    • Кстати, данный вопрос также закрыт.
      Кому нужно решение, я всегда на форуме.
  • 02 сентября 2016 г.
  • Вопрос 4
    Как-то подзадолбался с наведением красоты в административной части.
    Если используются стандартные механизмы самой CMS то существуют ли какие либо методы или последовательность (набор) действий для того чтобы в итоге получилась красивая картинка а не перекашивало всё к ушам собачьим.
    например вывожу список элементов опеределён список колонок например их 6. Их ширина настраивается автоматом и не факт что в итоге будет красиво что делать чтобы было красиво сразу?
    • 21 февраля 2017 г.
    • Для себя сделал вывод что надо фиксировать ширину всех колонок кроме одной. Для заголовков ширину выставлять не надо они сами встанут как надо.
      • 21 февраля 2017 г.
      • CSS в админке никто не отменял )
        • 21 февраля 2017 г.
        • АНДРЕЙ (R4W), спасибо кэп а я то всё думал, что только картинки можно нарисованные в фотошопе вставлять и только так всё будет красиво. А ещё оказывается есть CSS. Пойду почитаю что это такое и для чего он здесь нужен.
          • 21 февраля 2017 г.
          • А чтож "спасибо" не жмакнул?
            Кстати картинки нарисованные в фотошопе можно area-mapping'ом заверстать. Вообще будет огонь )))
            • 22 февраля 2017 г.
            • Это был сарказм. Onmaster > ДОПОЛНЕНИЯ 11 (4 из них моих рук дело, готовится 5 модуль).

              • 22 февраля 2017 г.
              • Да я в курсе :) Про спасибо тоже был сарказм
            • 22 февраля 2017 г.
            • Цитата
              А чтож "спасибо" не жмакнул?
              Внесу пункт в правила форума.
              Цитата
              Попрошайничество спасиб наказывается удвоенным списанием существующих спасиб
              • 22 февраля 2017 г.
              • Это не попрошайничество, а тонкий троллинг коллеги, прошу не путать
              • 22 февраля 2017 г.
              • Сделаю Частный, черный список - "НЕ ПОБЛАГОДАРИВШИХ"
              • 22 февраля 2017 г.
              • Цитата
                [Партнер] Андрей (R4W) 17Сегодня, 12:10
                Это не попрошайничество, а тонкий троллинг коллеги, прошу не путать
                Стараниями группы лиц всё, что касается "Спасибо" на форуме, уже стало толстым троллингом. И имеет все шансы стать жирным.
  • 22 февраля 2017 г. , редакция: 22 февраля 2017 г.
  • Идея вебинар-чата в рамках форума без жёсткой модерации - глупость. Будет (уже есть) куча оффтопа, уточняющие вопросы от разных пользователей, которые будут разрывать ленту с решением. В результате это выглядит как свалка, в которой надо ковыряться, чтобы найти что-то полезное.

    Если уж нужна подобная тема - то правила установить. Тут публикуется вопрос. Ответ публикуется в разделе "База знаний". Там же под решениями можно прикрутить комментарии (как в документации). Непонятно что-то - прокомментировал и уточнил. Кто-то при желании дополнит решение.

    Тут под вопросом публикуется один ответ со ссылкой на решение в "Базе знаний". Решение и комментарии к нему будут отделены друг от друга. Там в отличие от форума есть теги, которые помогают быстро нужное найти.

    А так глупо получается. Есть специальный раздел, но решения кусками публикуют по разным темам на форуме. Которые при желании и по прошествии некоторого времени и не найдёшь вовсе, особенно учитывая скудность инструментов форума для закладок (Только "избранное" в одну кучу).
  • 22 февраля 2017 г. , редакция: 22 февраля 2017 г.
  • "Базе знаний" не хватает справки по markdown`у, как, например, у Beget. А также возможности оставить комментарий/вопрос под решением.
    Также за публикацию материалов в "Базе знаний" можно добавлять рейтинг. 0,2 (как у "Спасибо") или 0,5 (как за отзыв). Всё-таки труд общественно-полезный.



    Сейчас ссылка в "Базе знаний" отсылает в "Википедию", статья в которой совершенно не имеет наглядности. Т.е. для быстрого оформления сообщения в "Базе знаний" - далеко не самый лучший вариант.

Новости

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