Писать на форуме DIAFAN.CMS могут только зарегистрированные пользователи. Войдите или зарегистрируйтесь.
Первый вебинар-чат
-
- Степан (idxdoc)
- 334
-
11 августа 2016 г. , редакция: 11 августа 2016 г.
-
Доброго всем дня!
Эта тема для программистов, которые делают сайты на diafan и хотят развиваться.
Суть данной темы в том, чтобы не просто ответить какой файл открыть и на какую строчку вставить код, а именно объяснить почему в этот файл, почему именно этот код.
Другими словами мы делимся опытом, решая какие то задачи.
Думаю тема будет развиваться и не стоять на месте.
Пожалуй я начну -
-
-
-
11 августа 2016 г.
-
Идея хорошая, публичные вопросы и публичные ответы. Я буду вести топик, если что привлекать коллег. Все могут задавать уточняющие вопросы.
Степан, давайте только сразу договоримся об удобсстве. Каждый вопрос отдельным сообщением, чтобы на него можно было отдельно отвечать и обсуждать. Я разделю тему. -
-
Поблагодарили: Степан (idxdoc)
-
-
-
- Степан (idxdoc)
- 334
-
11 августа 2016 г.
-
Виталий, спасибо!
-
-
-
-
-
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 и описать её в баннерах, где запрашивать категории магазина и выводить их списком. Система сама сохранит их в БД -
-
-
-
- Степан (idxdoc)
- 334
-
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)
... -
-
-
-
- Степан (idxdoc)
- 334
-
23 января 2017 г.
-
По идее должно быть не r.cat_shop_id, а r.category_id т.к. мы создали именно поле category_id.
А %d это id текущей категории, где мы находимся тобишь, мне его нужно определить по порядку в скобках функции query_fetch_all, но как это сделать? еще такими вещами не занимался. -
-
-
-
- Степан (idxdoc)
- 334
-
20 февраля 2017 г.
-
Виталий, призываю Вас к помощи)
-
-
-
-
- Степан (idxdoc)
- 334
-
02 марта 2017 г.
-
Виталий, большое спасибо за помощь!
Я наконец-то сделал эти категории. Работает как надо.
Единственное мне пока пришлось отказаться от раздела сайта, т.к. идет конфликт, о котором я написал выше.
Будет здорово, если поможете разобраться. -
-
-
-
-
11 августа 2016 г. , редакция: 11 августа 2016 г.
-
СТЕПАН (IDXDOC):
Вопрос 3:
В поиске по товарам, вывести минимальную и максимальную цену в рублях, даже если в админке цены в валюте, в зависимости в какой мы категории
Находил решение, просто поставил в нужное место и все заработало, а почему это решение работает так и не понял, но работало оно пока я не переписал цены в валюту. -
-
-
-
23 августа 2016 г.
-
Приводите это решение сюда, разберем.ЦитатаНаходил решение, просто поставил в нужное место и все заработало
-
-
-
-
- Степан (idxdoc)
- 334
-
24 августа 2016 г.
-
Виталий, доброе утро!
Последнее время в запарах, а тут ответы все, что требуют большого вникания, мне темболее на часа 2-3 каждый)))
Я как освобожусь более менее, я обязательно вернусь к данной теме и мы продолжим, если Вы не против!) -
-
-
-
24 августа 2016 г.
-
Надеюсь, и другие подключатся. А то они стесняются
-
-
-
-
- Степан (idxdoc)
- 334
-
24 августа 2016 г.
-
Никто не хочет раскрывать свои знания, боятся конкурентов))))
Кого обидел извините!) -
-
-
-
-
-
- Степан (idxdoc)
- 334
-
02 марта 2017 г.
-
Кстати, данный вопрос также закрыт.
Кому нужно решение, я всегда на форуме. -
-
-
-
- Denis (Drachoon)
- 154
-
02 сентября 2016 г.
-
Вопрос 4
Как-то подзадолбался с наведением красоты в административной части.
Если используются стандартные механизмы самой CMS то существуют ли какие либо методы или последовательность (набор) действий для того чтобы в итоге получилась красивая картинка а не перекашивало всё к ушам собачьим.
например вывожу список элементов опеределён список колонок например их 6. Их ширина настраивается автоматом и не факт что в итоге будет красиво что делать чтобы было красиво сразу? -
-
-
-
- Denis (Drachoon)
- 154
-
21 февраля 2017 г.
-
Для себя сделал вывод что надо фиксировать ширину всех колонок кроме одной. Для заголовков ширину выставлять не надо они сами встанут как надо.
-
-
-
-
- Андрей (R4W)
- 140
-
21 февраля 2017 г.
-
CSS в админке никто не отменял )
-
-
-
-
- Denis (Drachoon)
- 154
-
21 февраля 2017 г.
-
АНДРЕЙ (R4W), спасибо кэп а я то всё думал, что только картинки можно нарисованные в фотошопе вставлять и только так всё будет красиво. А ещё оказывается есть CSS. Пойду почитаю что это такое и для чего он здесь нужен.
-
-
-
-
- Андрей (R4W)
- 140
-
21 февраля 2017 г.
-
А чтож "спасибо" не жмакнул?
Кстати картинки нарисованные в фотошопе можно area-mapping'ом заверстать. Вообще будет огонь ))) -
-
-
-
- Denis (Drachoon)
- 154
-
22 февраля 2017 г.
-
-
-
-
- Андрей (R4W)
- 140
-
22 февраля 2017 г.
-
Да я в курсе :) Про спасибо тоже был сарказм
-
-
-
-
-
22 февраля 2017 г.
-
Внесу пункт в правила форума.ЦитатаА чтож "спасибо" не жмакнул?ЦитатаПопрошайничество спасиб наказывается удвоенным списанием существующих спасиб
-
-
-
-
22 февраля 2017 г.
-
-
-
-
- Михаил (ZzzBep)
- 139
-
22 февраля 2017 г.
-
Вот СПАСИБО, вам Виталий
-
-
-
-
- Андрей (R4W)
- 140
-
22 февраля 2017 г.
-
Это не попрошайничество, а тонкий троллинг коллеги, прошу не путать
-
-
-
-
22 февраля 2017 г.
-
Сделаю Частный, черный список - "НЕ ПОБЛАГОДАРИВШИХ"
-
-
-
-
22 февраля 2017 г.
-
Стараниями группы лиц всё, что касается "Спасибо" на форуме, уже стало толстым троллингом. И имеет все шансы стать жирным.Цитата[Партнер] Андрей (R4W) 17Сегодня, 12:10
Это не попрошайничество, а тонкий троллинг коллеги, прошу не путать -
-
-
-
-
-
-
-
-
22 февраля 2017 г. , редакция: 22 февраля 2017 г.
-
Идея вебинар-чата в рамках форума без жёсткой модерации - глупость. Будет (уже есть) куча оффтопа, уточняющие вопросы от разных пользователей, которые будут разрывать ленту с решением. В результате это выглядит как свалка, в которой надо ковыряться, чтобы найти что-то полезное.
Если уж нужна подобная тема - то правила установить. Тут публикуется вопрос. Ответ публикуется в разделе "База знаний". Там же под решениями можно прикрутить комментарии (как в документации). Непонятно что-то - прокомментировал и уточнил. Кто-то при желании дополнит решение.
Тут под вопросом публикуется один ответ со ссылкой на решение в "Базе знаний". Решение и комментарии к нему будут отделены друг от друга. Там в отличие от форума есть теги, которые помогают быстро нужное найти.
А так глупо получается. Есть специальный раздел, но решения кусками публикуют по разным темам на форуме. Которые при желании и по прошествии некоторого времени и не найдёшь вовсе, особенно учитывая скудность инструментов форума для закладок (Только "избранное" в одну кучу). -
-
-
-
22 февраля 2017 г. , редакция: 22 февраля 2017 г.
-
"Базе знаний" не хватает справки по markdown`у, как, например, у Beget. А также возможности оставить комментарий/вопрос под решением.
Также за публикацию материалов в "Базе знаний" можно добавлять рейтинг. 0,2 (как у "Спасибо") или 0,5 (как за отзыв). Всё-таки труд общественно-полезный.
Сейчас ссылка в "Базе знаний" отсылает в "Википедию", статья в которой совершенно не имеет наглядности. Т.е. для быстрого оформления сообщения в "Базе знаний" - далеко не самый лучший вариант. -
-
-
Новости
-
18 июня
-
В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
-
24 апреля
-
В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.
-
12 января
-
После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке.
Блоги
-
24.04.2024
-
Выпустили новую сборку DIAFAN.CMS 7.1.4.
Блоги
-
12.01.2024
-
В данном руководстве познакомим вас с панелью управления DIAFAN.CMS