Drupal работа с базой данных – правильная реализация


Содержание материала:

Подключение к другой базе данных в Drupal 7 (2 способа)

Иногда возникает необходимость подключения к другой базе данных для получения из нее выборки данных или же наоборот для записи. При этом база данных может быть как внешней, так и располагаться на одном хосте с файлами друпала и дефолтной базой данных. Эти маневры в Drupal 7 можно выполнить двумя способами: описанием подключения в settings.php или созданием другого подключения в коде кастомного модуля.

1 способ. Описание подключения к внешней базе данных в settings.php

В файле settings.php создаем массив с описанием подключения к другой базе данных в дополнение к дефолтному подключению:

Далее перед выполнением запросов нужно сделать подключение к другой базе данных активным:

2 способ. Создание подключения к другой базе данных в коде кастомного модуля

В кастомном модуле сначала создаем массив с описанием подключения к внешней базе данных:

Далее необходимо добавить информацию о подключении с помощью вызова метода addConnectionInfo() класса Database:

По аналогии с предыдущим методом устанавливаем активным подключение к другой базе данных, выполняем необходимые запросы и в завершение делаем активным дефолтное подключение:

Работа с базой данных в Drupal: Database API и 2 способа написания запросов

Писать запросы к базе данных, используя штатные средства языка PHP, когда вы программируете на Drupal, считается очень плохим / дурным тоном (по крайней мере в подавляющем большинстве случаев). Ведь у него есть сносный Database API. Далее я приведу два абстрактных варианта написания SQL запросов с учетом этого факта: в стиле D6 и в стиле D7 — последней мажорной версии системы на тек. время.

Т.е. из таблички sessions берем значения с двух полей — uid и hostname.

D7 (почти, как в шестерке):

Как видим первый вариант более прозрачен для понимания, т.к. визуально мало чем отличается от сырого запроса, но с т.з. «правильного» кода, его использовать не рекомендуется.

IT-блог о веб-технологиях, серверах, протоколах, базах данных, СУБД, SQL, компьютерных сетях, языках программирования и создание сайтов.

Как работает Drupal. Работа с Drupal. Структура Drupal. Часть 1

Здравствуйте, уважаемые посетители моего скромного блога для начинающих вебразработчиков и web мастеров ZametkiNaPolyah.ru. Продолжаем рубрику Как создать сайт бесплатно. В рубрике Делаем сайты на Drupal было четыре публикации: установка Drupal и русификация Drupal, настройка Drupal и админка Drupal, модули Drupal и что такое Drupal. Сейчас я предлагаю вам ознакомиться с тем, как работает Drupal. Рассматривать работу с Drupal можно на основе семиуровневой модели OSI или другими словами, как взаимодействие клиента и сервера. Данная публикация будет разбита на две части. В первой части мы рассмотрим, собственно то, как работает Drupal, как работают модули Drupal и как взаимодействуют пользователи Drupal.

Как работает Drupal. Работа с Drupal. Структура Drupal.

Во второй части данной публикации мы поговорим о содержимом Drupal (узлы Drupal), о способах организации содержимого в Drupal, какие типы содержимого поддерживаются в Drupal и том, где можно получит справку по Drupal. В этой публикации мы рассмотрим структуру Drupal и общую концепцию работы Drupal, а так же общий принцип формирования содержимого Drupal, который базируется на создание узлов.

Как работает Drupal. Структура Drupal

Во-первых, прежде чем перейти к рассмотрению структуры Drupal, нужно понять, что сайт на Drupal не будет функционировать в принципе без установки дополнительных серверов, а так же то, что Drupal может работать на любой операционной системе: Windows, Linux, MAC OS и т.д. Drupal, как и любая другая система управления содержимым является интерфейсом между пользователем (посетителем сайта) и той «подложкой», на которую установлен Drupal. Drupal – это интерфейс, который позволяет получать информацию пользователю в удобном графическом виде, через протоколы передачи данных.

И так, структуру Drupal, как и любого динамического сайта следует представлять не с самой CMS, а с той «подложки», на которую устанавливается Drupal. Чтобы Drupal функционировал необходимо: операционная система, сервер баз данных (MySQL), веб-сервер (Apache) и PHP сервер. Обратите внимание: Drupal будет функционировать и без FTP сервера.

Операционная система, на которую устанавливаются сервера, необходимые для работы Drupal нужна для того, чтобы организовывать сетевые подключения к сайту Drupal, а так же назначать права доступа к различным папкам и файлам системы управления содержимым. Веб-сервер или HTTP сервер предоставляет доступ к вашему сайту по протоколу передачи данных, например HTTP, чаще всего в качестве такого сервера используется Apache. На сервере баз данных хранится все содержимое вашего сайта: все текстовое содержимое, учетные записи пользователей сайта, параметры и конфигурации сайта на Drupal, начальные установки сайта. Ну, собственно, PHP сервер обеспечивает взаимодействие между сервером баз данных и веб-сервером, по сути, у сервера PHP одна задача – динамически генерировать страницы вашего сайта, грубо говоря, гонять строки и символы из базы данных к веб-серверу и обратно.

Кроме того, что для сайта на Drupal требуется несколько слоев «подложки», необходимо учесть и то, что CMS Drupal состоит из нескольких слоев или уровней. Самый нижний уровень системы Drupal предназначен для обработки сеансов пользователей, механизм аутентификации, фильтр подсистемы безопасности Drupal и система отображения шаблонов Drupal. Над базовым уровнем Drupal, находится еще один уровень, который предназначен для расширения функционала сайта на Drupal или другими словами уровень модулей Drupal. И наконец, у Drupal есть уровень, который предоставляет удобный графический интерфейс для пользователей системы Drupal или другими словами система тем оформлений Drupal.

Система тем Drupal позволяет создавать темы различной сложности, поскольку она имеет очень гибкие настройки и расширения. В общем случае система тем выводит содержимое сайта в виде XHTML документа, но поддерживаются и другие форматы документов. Естественно, что для оформления страниц сайта используются каскадные таблицы стилей CSS, и конечно, при создании тем Drupal для придания динамичности HTML элементам можно использовать язык JavaScript и различные библиотеки, например JQuery.

Общая структура Drupal выглядит примерно так:

Я, кстати, забыл упомянуть о том, что модули Drupal делятся на два вида: модули ядра Drupal, которые будут установлены вместе с системой управления содержимым Drupal и внешние модули, которые вы сможете скачать и установить в процессе создания сайта на Drupal. Модули ядра Drupal и внешние модули необходимо размещать в разные папки сайта.

Как работает Drupal. Модули Drupal

Ну что же с концепцией работы CMS Drupal мы разобрались, теперь можно переходить к понятию модуля Drupal. Практически вся внешняя, да что там практически – вся внешняя часть системы Drupal базируется на понятие модуль. Модуль Drupal – это файл, написанный на языке PHP, реализующий те или иные функции, с которыми умеет работать система управления содержимым Drupal. Все возможности Drupal, которые доступны обычному посетителю сайта или администратору сайта на Drupal реализованы при помощи модулей Drupal. При помощи модулей Drupal реализуются такие возможности, как вход в систему, добавление нового содержимого на сайт, создание галерей, рейтинговая система, система голосований – все это реализуется при помощи модулей Drupal.

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

Топ-пост этого месяца:  Урок 19. Курс по CSS3. Переходы CSS3

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

Drupal – это очень мощная система управления содержимым, с которой довольно проблематично разобраться, в отличие от других CMS. Количество модулей Drupal может напугать, ибо при реализации какой-либо функции вы найдете несколько десятков модулей, которые ее реализуют, каждый из этих модулей делает это по-своему.

Как работает Drupal. Пользователи Drupal

В принципе, любая информационная система, в том числе и сайт, создаётся для пользователя, сайты, создаваемые на Drupal, в данном случае не исключение. Поэтому пользователи Drupal являются важной частью структуры Drupal. Конечно, в случае создания блога на Drupal или сайта визитке нам будет достаточно только одного пользователя – администратора сайта, но если логическая структура сайта подразумевает взаимодействия посетителей друг с другом, то в этом случае необходимо будет настроить Drupal так, чтобы любой желающий посетитель мог зарегистрироваться и принять участие в общение на сайте.

В любом случае первый пользователь, учетная запись которого будет создана в системе Drupal, является главным администратором сайта. Этот пользователь обладает максимальными правами доступа к сайту на Drupal. Для главного администратора Drupal никогда не выполняются проверки безопасности, поэтому, зайдя от имени главного админа, вы легко можете нарушить работу сайта, удалив какие-либо необходимые данные. Поэтому лучше всего заходить от имени администратора на сайт только при необходимости, а для добавления и редактирования содержимого создать новую учетную запись с ограниченными правами доступа.

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

Урок 8. Работа с базой данных

Опубликовано вт, 27/06/2020 — 15:58

Работа с базой данных — неотъемлемая часть разработки. Сегодня поговорим о том, что изменилось по этому поводу в восьмерке.

Содержание

Устаревшие функции

Нововведения коснулись функций для работы с базой данных (БД). Они все еще могут использоваться, но уже являются устаревшими и будут удалены в 9 версии. Если установлен и правильно настроен Code Sniffer, то эти функции будут зачеркнутые как deprecated. Ниже приведен список этих функций [1] :

  • db_query — выполняет запрос для текущей активной базы данных.
  • db_query_range — аналогично db_query, только с ограничением по диапазону выборки.
  • db_query_temporary — выполняет SELECT строковый запрос и сохраняет результат во временную таблицу.
  • db_insert — создает новую запись в конкретной таблице.
  • db_merge — мержит результаты новой записи и старой, которая уже существовала в БД.
  • db_update — обновляет запись в таблице.
  • db_delete — удаляет запись из таблицы.
  • db_truncate — очищает таблицу целиком от всех записей.
  • db_select — выполняет SELECT запрос.
  • db_transaction — создает транзакцию для текущей БД.
  • db_set_active — устанавливает новую активную БД.
  • db_escape_table — ограничивает имя динамической таблицы безопасными символами.
  • db_escape_field — ограничивает имя динамического поля безопасными символами.
  • db_like — подставляет символы, которые необходимы в шаблоне LIKE.
  • db_driver — получает имя текущего активного драйвера БД.
  • db_close — закрывает соединение с активной базой.
  • db_next_id — получает следующий уникальный ID.
  • db_or — устанавливает OR для всех переданных условий.
  • db_and — устанавливает AND для всех переданных условий.
  • db_xor — устанавливает XOR для всех переданных условий.
  • db_condition — возвращает новое DatabaseCondition.
  • db_create_table — создает таблицу в БД.
  • db_field_names — возвращает массив имен филдов в виде ключ/индекс.
  • db_index_exists — проверяет существование индекса в конкретной таблице.
  • db_table_exists — проверяет существование таблицы в БД.
  • db_field_exists — проверяет существование колонки в определенной таблице.
  • db_find_tables — находит все таблицы, которые удовлетворяют поиску.
  • db_rename_table — переименовывает таблицу.
  • db_drop_table — удаляет таблицу.
  • db_add_field — добавляет новые поле в таблицу.
  • db_drop_field — удаляет поле из таблицы.
  • db_field_set_default — устанавливает дефолтное значение для поля.
  • db_field_set_no_default — устанавливает поле, которое не будет иметь дефолтного значения.
  • db_add_primary_key — добавляет primary ключ.
  • db_drop_primary_key — удаляет primary ключ.
  • db_add_unique_key — добавляет уникальный ключ.
  • db_drop_unique_key — удаляет уникальный ключ.
  • db_add_index — добавляет индекс.
  • db_drop_index — удаляет индекс.
  • db_change_field — изменяет поле в таблице БД.

Как видно из этого списка, практически все функции из файла /core/includes/database.inc являются устаревшими, кроме db_ignore_replica() [2] .

Статические запросы

Статические запросы представлены двумя deprecated функциями: db_query() [3] , db_query_range() [4] . Первая выполняет простые выборки, вторая — если необходимо указать диапазон выборки. С помощью данных функций рекомендуется выполнять простые запросы SELECT, которые не используют поиск по сущностям, их полям. Кроме того, есть существенное ограничение — синтаксис запроса может отличаться в различных типах баз данных, что в свою очередь негативно влияет на универсальность запроса.
Есть несколько важных замечаний, которым необходимо следовать:

  • помещать имена таблиц в фигурные скобки <>. Это необходимо для корректного распознавания таблицы друпалом, т.к. если используются префиксы в базе данных, то конечное имя таблицы может не совпадать с ожидаемой.
  • использовать плейсхолдеры вместо прямой подстановки переменных в запрос. Это позволит избежать SQL инъекций.

Примеры запроса с использованием deprecated функции

Тот же запрос с использованием класса Database

Второй вариант, если необходимо выполнить запрос с параметром limit, например из предыдущего примера выберем первые 5 записей

С использованием класса Database

Работа с сущностями

Для работы с сущностями в БД есть специальный API — Entity Query API. API представлен следующими методами, с помощью которых следует выполнять запросы:

    \Drupal::entityQuery() — статический метод, который возвращает entity query объект.
    В качестве примера, получим все ноды с типом article.

После выполнения запроса в переменной $results будет массив с vid в качестве ключей и nid в качестве значений.
Загрузка объектов нод можно выполнить с помощью статического метода loadMultiple() класса Node

В результате получим массив


Динамические запросы

Динамические запросы позволяют абстрагироваться от конкретной базы данных. Т.е. запрос, написанный с помощью abstraction layer для работы с MySQL, прекрасно отработает и на PostgreSQL, и с другой БД, если Друпал имеет соответствующий драйвер. Даже если его нет, его всегда можно написать:)
Упрощенные функции для работы с БД (db_select, db_update, db_delete и т. д.) являются своего рода обертками и, как мы уже выяснили, будут удалены в Drupal 9.
Рассмотрим несколько примеров динамических запросов.
Выборка всех сообщений из таблицы watchdog с типом крон

Пример выборки данных из поискового индекса search_index модуля ядра Search с джойном на таблицу search_total

Транзакции

Для того, чтобы создать транзакцию, нужно использовать простую запись [5]

Если по каким-либо причинам что-то пошло не так — вызываем ролбэк

Пример записи в кастомную в таблицу example с транзакцией и конструкцией try catch.

Внешние ключи (foreign keys)

Внешние ключи по-прежнему не работают в Drupal 8. Использование их в схеме носит исключительно информативный характер [6] .

Если все-таки необходимо реализовать такую возможность, то рекомендую ознакомиться со статьей Разбираемся с FOREIGN KEYS в Друпале.

Хуки установки, деинсталляции, обновления

Привычные для нас хуки с седьмой версии доступны и в 8-ке:

  • hook_schema() — необходим для создания таблиц в БД, если таковые необходимы модулю.
  • hook_schema_alter() — альтер существующей схемы.
  • hook_install() — будет вызван при установке модуля.
  • hook_uninstall() — будет вызван при удалении модуля.
  • hook_update_N() — хук, используемый для обновления модуля, внесения изменений в таблицы БД, выполнения логики когда модуль уже работает. В соответствии с версией Друпала нумерация имеет префикс 8xxx

Хуки hook_enable() и hook_disable() больше не существуют.

Drupal 8 – Database API. Часть 2 – Основные запросы в БД

Из предыдущего урока мы с вами научились создать и удалять таблицу в нашей БД, сегодня мы будем разбираться, как обращаться к БД.

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

Выборка единственной записи в строке с условием:

  • addField() – содержит название поля для выборки
  • condition() – условия выборки

Выборка нескольких записей в строке с условием:

  • fields() – содержит массив с имена полей для выборки

Выборка с сортировкой по полю:

  • orderBy() – содержит имя поля, по которому необходимо сортировать и значение сортировки ASC, DESC

Выбрать определенное кол-во записей:

  • range() – содержит значения для ограничения выборки. Например в данном случае, запись говорит, что нужно получить только первую запись

Использование db like:

Использование JOIN:

Вставка данных в таблицу БД:

Хочу заметить, что первоначально определяется массив из имен полей для вставки,а дальше массив значений для вставки.

Обновление данных в таблице БД:

Обновление данных в таблице БД, с проверкой на уникальность (существование) ключа:

Хочу заметить, что метод key() – должен использоваться для указания имени поля, которое будет использоваться для индентификации строки. Это поле должно иметь уникальное значение (например, с использованием автоинкримента), иначе upsert() будет использована как insert().

Удаление записи из БД:

Использование статичного (static) запроса:

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

Реализация шаблона Репозиторий для работы с БД

Нужно реализовать набор классов для работы с СУБД.

Хочу реализовать шаблон Репозиторий.

Сначала я описываю сущности в виде классов, которые наследую от IRepository.

На этом этапе все ясно.

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

Пришел вот к такой иерархии:

Похоже ли реализация на правду или можно сделать иначе и лучше?

Готовое ORM использовать не хочется, так как схема данных и набор оперций примитивна.

1 ответ 1

Я бы посоветовал написать generic репозиторий вместе с UnitOfWork. Для этого сначала выделим интерфейс репозитория и базовую сущность модели:

Теперь нужно создать реализацию для этого репозитория. Поскольку мы пользуемся EF, то создадим реализацию на основе DbSet:

Теперь нужно создать сущность, которая будет предоставлять нам репозитории для любого типа. Это и есть UnitOfWork:

Теперь напишем небольшой пример. Сначала определим сущность «книга», а потом поработаем с этой сущностью через наш репозиторий:

Вопрос Обращение к таблицам БД

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


  • michelle
  • 29.05.2011
  • 6901

Комментарии

Спасибо за вопрос, давно хотел написать что-то на эту тему. Теперь есть повод 🙂

Запросы в друпале делаются через функцию db_query, которая выполняет запрос к базе данных. Пример (выбираем nid и заголовки у всех материалов):

Далее полученное необходимо обработать. Здесь помогут три функции:
db_fetch_object — выбранные поля формируются в объект
Пример (выводит ссылки на все материалы):

db_fetch_array — то же самое что и предыдущая функция, только выбранные поля формируются в один массив
Пример (выводит ссылки на все материалы):

db_result — получает единственный результат выполнения запроса к базе:
Пример (выводит заголовок последнего материала):

В запросы так же можно передавать переменные. Пример выбора заголовка из 10й ноды:

Предыдущий пример эквивалентен следующему:

В запрос был добавлен LIMIT 0,1 исключительно для показательной оптимизации запроса (по возможности всегда добавляйте лимиты!)

Иногда так же полезной бывает функция db_last_insert_id($table, $field), которая берёт последнее записанное значение из таблицы $table поля $field.

Так же, наверное, стоит упомянуть функцию db_rewrite_sql(), которая позволяет переписывать запросы к бд, но лично я ей практически не пользуюсь.

Набора этих функций более чем достаточно для работы с базами данных 🙂

Drupal learning

Подробные уроки по CMS Drupal простым языком !

Авторизация

Работаем с базой данных в Drupal 7 с помощью Database API

Выборка данных (SELECT запросы)

Для создания SELECT запросов в Drupal 7 используется функция db_select().

Простой запрос выборки nid и title из таблицы node где nid >= 5.

Получение количества записей в таблице node где nid > 10.

Запрос с одним логическим оператором AND и оператором LIKE

Запрос c использованием логического оператора OR

Запрос c использованием оператора BETWEEN

Запрос c использованием оператора IN

Запрос c использованием оператора объединения LEFT JOIN и оператора IS NULL

Запрос c использованием оператора объединения INNER JOIN

В случае сложных условий можно использовать метод where как в следующем примере

Запрос с использованием функции агрегации SUM с группировкой

Запрос с использованием подзапроса (subquery)

Запрос с использованием оператора LIMIT

Для получаения даных из результирующего набора можно использовать следующие функции:

fetchField($index = 0) — получение значения поля с индексом $index.

Эта функция часто используется для получения данных из запроса который возвращает только одну запись.

fetchAssoc() — получение записи в виде ассоциативного массива

fetchObject() — получение записи в виде объекта

fetchAllKeyed($key_index = 0, $value_index = 1) — получение ассоциативного массива в котором ключем является поле с индексом $key_index, а значением поле с индексом $value_index. Массив формируется путем обхода всех записей. Обычно используется для запросов возвращающих только два поля.

rowCount() — получения количества записей

Также все записи можно обойти используя оператор цикла foreach при этом записи будут вытягиваться в виде объектов

Добавление записи (INSERT запросы)

Для добавления записей используется функция db_insert() .

Добавление новой записи в таблицу node

Обновление записи (UPDATE запросы)

Для обновления записей используется функцияdb_update().

Обновление записи в таблице node где n >

Обновление всех полей title в таблице node где nid > 10

Удаление записи (DELETE запросы)

Для удаления записей используется функцияdb_delete().

Удаление всех записей из таблицы node где nid > 10

Комментарии

kalabro 19 Июня 2013 13:00

Мне показалось, что вы имеете к нему какое-то отношение. Если даже это не так, упомянуть его здесь будет как раз к месту 🙂

Денис Захаров 19 Июня 2013 21:46


Привет. Я имею самое непосредственное отношение к этому модулю. Я его написал 🙂 Это мой первый и пока единственный официальный модуль на drupal.org. Приятно что кто-то успел заметить его и даже подготовить статью. Когда будет вермя подготовлю статью о нем в своем блоге тоже.

roman-yakimkin 10 Октября 2014 17:51

Скажите пожалуйста, а каким образом можно модифицировать запрос ?

Допустим, я клонировал некий запрос и хочу в новом запросе удалить какие-либо поля или изменить условия.

Денис Захаров 10 Октября 2014 22:06

Так и сделать: удалить поля или изменить условия 🙂 Что конкретно вы хотите поменять?

pibiv 13 Января 2015 18:32

Столкнулся с проблемой что на сайте все работает хорошо но при попытке сделать drush cc all получаю WD menu: PDOException: SQLSTATE[42000] проблема оказалась в том что если у вас несколько запросов подряд и например результат первого запроса служит какм либо параметров для второго, не поленитесь сделать дополнительную проверку на что данные из первого запроса всетаки получены и сохранены.

Меня спасла прверка на epmty переменной в которой храниться результат из предыдущего запроса.

Надеюсь кому нибуть поможет.

За сайт и конкретно этот пост автору спасибо!

Sergeywrap 13 Марта 2015 12:58

Нужна помощь!!) Необходимо сделать реферальную систему 5 уровней, есть табличка с колонками u > $cookie[‘uid’], p2 => p1(реферала), р3 => р2(реферала) и т.д. уже перепробовал много способов написать такой — ни одного успешного((( вот один из них:
$query = db_select(‘referral’, ‘r’);
$query
->condition(‘u > ->fields(‘r’, array(‘referral_uid’, ‘r2_uid’, ‘r3_uid’, ‘r4_uid’));
$query = db_insert(‘referral’)
->fields(array(
‘uid’ => $uid,
‘referral_uid’ => $cookie[‘uid’],
‘r2_uid’ => ‘r.referral_uid’,
‘r3_uid’ => ‘r.r2_uid’,
‘r4_uid’ => ‘r.r3_uid’,
‘r5_uid’ => ‘r.r4_uid’,
‘created’ => $cookie[‘timestamp’],
‘host’ => $cookie[‘ip’],
‘http_referer’ => $cookie[‘referer’],
))
->execute();
>

Денис Захаров 13 Марта 2015 21:38

Это вопрос не по Drupal. Хотя из вашего кода я совсем ничего не понял. Сперва в $query вы записываете db_select, а потом перетираете его db_insert.

Sergeywrap 14 Марта 2015 03:44

если в двух словах — то мне надо взять из таблицы данные по условию совпадения uid и вставить их в туже таблицу но в другие колонки.

Andrey 25 Сентября 2015 02:47

Доброго времени!!
Нужна помощь. Не очень силен в api , да и в самом php начинающий.
Суть: Нужно обновить одно поле таблицы, то есть все его значения , например, умножить на 2.
Как это сделать прпавильно срeдствами Drupal7 ?

$q = db_select(‘field_data_commerce_price’, ‘tt’);
$q->fields(‘tt’, array(‘revision_id’, ‘commerce_price_amount’));
$res = $q->execute();

$arg = $form_state[‘values’][‘coef’];
$row = array();

while($row = $res->fetchAssoc()) <
$row[‘commerce_price_amount’] *= $arg;
//debug($row[‘commerce_price_amount’]);
$qq = db_update(‘field_data_commerce_price’, ‘ttt’);
$qq -> fields( array ( ‘commerce_price_amount’ => $arg));
$ress = $qq -> execute();
>

Прошу не смеяться сразу очень ). Сам дойти не могу, а спросить не у кого.

Буду безмерно благодарен за помощь.
Спасибо!.

Drupal работа с базой данных – правильная реализация

Условные обозначения:
uXXXX_username — имя mysql-пользователя
mypassword — пароль доступа для mysql-пользователя
uXXXX_database — имя базы данных

Для Drupal 6:
В файле sites/default/settings.php находим строки вида:
$db_url = ‘mysqli://uXXXX_username:mypassword@localhost/uXXXX_database’;

Для Drupal 7:
В файле sites/default/settings.php находим строки вида:

$databases = array (
‘default’ =>
array (
‘default’ =>
array (
‘database’ => ‘uXXXX_database’,
‘username’ => ‘uXXXX_username’,
‘password’ => ‘mypassword’,
‘host’ => ‘localhost’,
‘port’ => »,
‘driver’ => ‘mysql’,
‘prefix’ => »,
),
),
);

Для всех версий:
В консоли, в каталоге домена указываем команду:
drush st —show-passwords
вывод будет такой:

.
Database username : uXXXX_username
Database name : uXXXX_database
Database password : mypassword
.

CRM на базе Drupal 7 — насколько верный выбор?

Добрый день!
Накануне с друзьями обсуждали тему связанную с CRM.
И встал вопрос насколько корректно и правильно будет использовать Drupal для её реализации?
Вопрос именно в том, чтобы на базе Drupal реализовать весь функционал (импорт заявок с сайта, список лидов, статус по каждому + фильтрация, напоминания для менеджеров, срезы по различным акциям, воронка продаж, статистика и т.п.), а не интегрировать его с другой CRM.

За Drupal следующие аргументы:
Возможность построения CRM полностью под свои нужды и безнесс-процессы.
Возможность дальнейшего расширения функционала.
Опыт общения с сайтами на Drupal.
Наличие в портфолио Друпала сайтов с большой посещаемостью.
Сообщество квалифицированных разработчиков и возможность построения отличной команды для реализации проекта. (Dru.io тому пример).

Сомнения:
Планируется, что система постоянно будет развиваться и расширяться. Её жизненный цикл 5-10 лет.
Нагрузоустойчивость и скорость работы при количестве пользователей от 100 до 300 человек? от 300 до 1000? до 2000?
Терзают сомнения не выбираем ли мы инструмент который конечно же может реализовать весь функционал CRM, но при этом эффективнее будет использовать специально заточенные для этого решения (не получится так, что мы используем легковушку, вместо грузовика для перевозки груза)?

Это Drupal «легковушка»? Комплимент однако.

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

Если есть возможность использовать специально заточенные решения — используйте. Если нет — заточите под эти решения Drupal.

Нагрузоустойчивость и скорость работы при количестве пользователей от 100 до 300 человек? от 300 до 1000? до 2000?

Тут больше вопросов к серверу. Drupal потянет, особенно если оптимизировать.

Ответы

По поводу нестандартной архитектуры уже поднимался топик тут — http://dru.io/question/3548

У нас регулярно задачи по crm/erp под конкретный бизнес-процесс.

Навскидку:
1. Сфера недвижимости, несколько сотен менеджеров ежедневно работают с базой объектов/контактов, итого сейчас под 4млн.записей, все это отправляет sms по нужным событиям, считает зарплату, парсит некоторые площадки по недвижимости для актуализации и т.п.
2. Служба ремонта, учет приходящей/уходящей техники, автоматизация счетов/нотификаций о выполнении(доставке)/статистика по проблемным железкам.
3. наша собственная где ведется работа с зп/задачами.
4. В стадии написания — учет фактов на производстве в цеху, планшетики на «перегонах» (сборочных линиях), которые дают возможность пометить деталь как брак с пометками. Итого — куча графиков для планирования производства.

Друпал хорош тем что позволяет в минимальное кол-во часов набросать рабочую модель и сделать какой-никакой вывод. Если там возникает большая нагрузка — это означает что у них и есть ресурсы на ее решение)

Из проблем — с D7 неизбежно встает вопрос миграций. Этого очень ждем от drupal8, и есть мнение что d8 будет прямо прорывом на рынке crm/erp для малого/среднего бизнеса. То что ребята собирают на YII/Symfony/Rails часов за 80-120, там можно собрать часов за 30-60.

Тоже сейчас делаю CRM для компании, примерно то что в пункте 4 написал Александр. Единственная проблема которую можете встретить — непродуманная изначально структура CRM (сайта). Поэтому изначально надо знать даже на будущее, что будет там хотя бы примерно, и от этого придумывать что и как делать. И чем точнее определите, тем меньше переделок в будущем будет. Мне можно сказать в этом плане повезло. Клиент давно бродит по всяким платным CRM и он уже просил разработку зная что ему не хватает во всех тех, что нравится, и что хотелось бы иначе. Т.е. он имел полное представление что хочет, от этого намного легче всё это изначально продумать и заложить в основу. Хотя я подозреваю, когда просят кастомную CRM, люди зачастую понимают что уже хотят, ибо явно, просто так такое просить не будут, уже по опыту других не кастомизируемых платных решений делают выводы в том что надо и не надо.

Для клиента друпальные формы создания материалов оказались неудобными, начал делать кастомные через код, Но на это уходило очень много времени, поэтому формы переехали на entityform, намного проще в админке накидать нужную форму со всеми обертками, теми же полями что и в самой ноде, и повесить на presave процесс сохранениня нужных данных куда надо, в основном в ноду.

В целом соглашусь, 8-ка для CRM будет прямо прорывом.

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

В итоге забили, быстрее оказалось освоить какой-то фреймворк, чем альтерить всё и вся в друпале.
Выбор в итоге пал на Yii2, за неделю было поднято решение аналогичное месячному ковырянию д7.

Друпал, в основном, не устраивал тем, что для вывода в нужном виде нужных данных приходилось каждый раз писать с нуля свой модуль или устраивать глобальный кастомайзинг/альтеринг/темизацию того, что друпал навыводил сам, когда объёмы этого кода стали достигать пары тысяч строк было решено изучить Yii2.

Вывод такой — сделать то можно, только не самый оптимальный путь это будет. Если в команде есть хотя бы один программер, а не только кликатели мыши во views и cck, то лучше обратить внимание на фреймворки.

Ну и дальнейшее разделение на бэкэнд/фронтенд (к примеру — бэкэнд на каком-нибудь Django, а фронтенд на AngularJS) — имхо, гораздо проще без друпала производить, а без глобальной «аяксификации» сейчас ни одна срм не обходится.

Из основных ощущений:

  1. Интерактивность (модальные окна, инлайн-редактирование, сортировки и фильтрации данных, ajax) — однозначно в пользу фреймворка.
  2. Структура БД, выборка и запись данных — однозначно в пользу фреймворка.
  3. Управление доступом — опять же в пользу фреймворка.
  4. Быстрота создания «базового прототипа» — тут друпал рулит, но до момента, когда нужно что-то вывести именно так, как нужно. Как только нужны кастомные решения, а это 90% CRM — уже фреймворк адекватнее.

также стоит упомянуть генератор кода, которого на данный момент в друпале нет, а во фреймворках это практически делает разработку доступной даже тем, кто пишет php-программы по Интернет-шпаргалкам и урокам.

Есть такое, хотя, это скорее плюс на стадии обучения, потом уже не так важно, да и много там не нагенерируешь. Базовый каркас модели, контроллера, вида, а дальше всё равно кастом. Либо так, либо я просто не до конца вник в возможности генерации (через генераторы создаю модели, базовый CRUD, да и всё вроде).

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

Надо сначала набрать команду для реализации такого проекта
А ещё разумнее — нанять управляющего с опытом — пусть он такие вопросы решает

Накрайняк . нужен адекватный прогер — он тоже решит на чём делать

Тут ещё надо понимать . количество пользователей — это фигня
вопрос . что они там у вас будут делать?
если только читать — это одно
набрать даже 300 регулярно шибко активных человек — это уже мегапроект

вопрос не в Drupalе, а в исполнителях и изначально продуманной структуре. ))

Топ-пост этого месяца:  Преобразование символов с помощью метода String toLocaleLowerCase в TypeScript в нижний регистр
Добавить комментарий