Содержание
Введение
Под веб-приложением понимается любые программные комплексы, имеющие возможность подключения к ним по глобальным, либо локальным сетям ,и обладающими возможностью обрабатывать пользовательские запросы и давать на них ответы. Все труднее представить себе программные продукты, которые не имеют веб-интерфейса, кроме того приложения, написанные ранее без использования веб-технологий все чаще переделываются с использованием таковых. Поэтому программы становятся веб-ресурсами, а проектирование и собственно прикладное программирование становятся важным навыком современного инженера.
Интернет технологии проникают во все сферы жизни общества. Одним из направлений развития предприятий, реализующих продукцию, либо услуги стало создание интернет-каталогов и интернет-магазинов. Создание подобных ресурсов экономит время, как работников самого предприятия, так и конечных пользователей, благодаря автоматизации работы с каталогами продукции. Нет необходимости стоять в длинных очередях и не надо беспокоиться о наличии какого-либо товара. Также существует возможность автоматизации процесса покупки товара.
Заказав товар, вы оговариваете с менеджером условие и время доставки, возможную упаковку товара и его стоимость. Оплата проводится или через вашу кредитную карту, либо через банковский счет или по наличному расчету.
Также актуальной является задача предоставления актуального каталога продукции конечному пользователю. Он должен знать количество, качество и стоимость товара в реальном времени. Для этого существует необходимость разработки программного обеспечения, для мониторинга состояния склада и баз данных предприятия и предоставления ссылок для доступа к этому каталогу конечного пользователя.
В данном дипломном проекте разработано программное обеспечение для мониторинга каталога продукции предприятия, анализа склада, получения информации об актуальной стоимости товара, с учетом налоговой политики. Информация предоставляется в удобном для пользователя виде, доступном для просмотра на большом количестве электронных платформ, как мобильных, так и стационарных.
1 Анализ информации и постановка задач
Веб-технологии плотно вошли в нашу жизнь, и для их развития и поддержки работоспособности было разработано большое число технологий для организации соединения между пользователем и сервером, для отображения ответа сервера в виде, удобном для пользователя, а также средств разработки, созданных для ускорения и удешевления процесса разработки и поддержки веб-приложений, рассмотрим технологии, которые мы использовали в ходе дипломного проектирования.
1.1 Язык PHP
PHP (англ. PHP: Hypertext Preprocessor -- «PHP: препроцессор гипертекста»; первоначально Personal Home Page Tools -- «Инструменты для создания персональных веб-страниц»; произносится пи-эйч-пи) --скриптовый язык программирования общего назначения, интенсивно применяемый для разработки веб-приложений. В настоящее время поддерживается подавляющим большинством хостинг-провайдеров и является одним из лидеров среди языков программирования, применяющихся для создания динамических веб-сайтов.
Язык и его интерпретатор разрабатываются группой энтузиастов в рамках проекта с открытым кодом. Проект распространяется под собственной лицензией, несовместимой с GNU GPL.
1.1.1 Области применения
В области программирования для сети Интернет PHP -- один из популярных сценарных языков (наряду с JSP, Perl и языками, используемыми в ASP.NET) благодаря своей простоте, скорости выполнения, богатой функциональности, кроссплатформенности и распространению исходных кодов на основе лицензии PHP.
Популярность в области построения веб-сайтов определяется наличием большого набора встроенных средств для разработки веб-приложений. Основные из них:
· автоматическое извлечение POST и GET-параметров, а также переменных окружения веб-сервера в предопределённые массивы;
· взаимодействие с большим количеством различных систем управления базами данных (MySQL, MySQLi, SQLite, PostgreSQL, Oracle (OCI8), Oracle, Microsoft SQL Server, Sybase,ODBC, mSQL, IBM DB2, Cloudscape и Apache Derby, Informix, Ovrimos SQL, Lotus Notes, DB++, DBM, dBase, DBX, FrontBase, FilePro, Ingres II, SESAM, Firebird / InterBase, Paradox File Access, MaxDB, Интерфейс PDO);
· автоматизированная отправка HTTP-заголовков;
· работа с HTTP-авторизацией;
· работа с cookies и сессиями;
· работа с локальными и удалёнными файлами, сокетами;
· обработка файлов, загружаемых на сервер;
· работа с XForms.
В настоящее время PHP используется сотнями тысяч разработчиков. Согласно рейтингу корпорации TIOBE, базирующемся на данных поисковых систем, в июне 2013 года PHP находился на 5 месте среди языков программирования. К крупнейшим сайтам, использующим PHP, относятся Facebook, Wikipedia и др.
Входит в LAMP -- распространённый набор программного обеспечения для создания и хостинга веб-сайтов (Linux, Apache, MySQL, PHP).
1.1.2 Синтаксис
Синтаксис PHP подобен синтаксису языка Си. Некоторые элементы, такие как ассоциативные массивы и цикл foreach, заимствованы из Perl.
Для работы программы не требуется описывать какие-либо переменные, используемые модули и т. п. Любая программа может начинаться непосредственно с оператора PHP.
Простейшая программа Hello world на PHP выглядит следующим образом:
<?php
echo 'Hello, world!';
?>
Также возможен более короткий вариант вывода строки:
<?= 'Hello, world!' ?>
Открывающий тег вида <?= используется для сокращённой записи конструкций используемых для вывода строки.
PHP исполняет код, находящийся внутри ограничителей, таких как <?php ?>. Всё, что находится вне ограничителей, выводится без изменений. В основном это используется для вставки PHP-кода в HTML-документ, например, так:
<html>
<head>
<title>Тестируем PHP</title>
</head>
<body>
<?php echo 'Hello, world!'; ?>
</body>
</html>
Помимо ограничителей <?php ?>, допускается использование дополнительных вариантов, таких как <? ?> и <script language='php'> </script>. Кроме того, до версии 6.0 допускается использование ограничителей языка программирования ASP <% %> (конструкции <? ?> и <% %> могут быть выключены в конфигурационном файле php.ini).
Имена переменных начинаются с символа $, тип переменной объявлять не нужно. Имена переменных, функций и классов чувствительны к регистру. Константы также чувствительны к регистру. Переменные обрабатываются в строках, заключённых в апострофы или двойные кавычки, и heredoc-строках (строках, созданных при помощи оператора <<<).
PHP рассматривает переход на новую строку как пробел, так же как HTML и другие языки со свободным форматом. Инструкции разделяются с помощью точки с запятой (;), за исключением некоторых случаев, после объявления конструкции if/else и циклов.
Переменные в функцию можно передавать как по значению, так и по ссылке (используется знак &).
PHP поддерживает три типа комментариев: в стиле языка Си (ограниченные /* */), C++ (начинающиеся с // и идущие до конца строки) и оболочки UNIX (с # до конца строки).
Дальше мы разберем MySQL, так как она является одной из самы распространенных системой управления базами данных.
1.2 База данных MySQL
MySQL -- свободная реляционная система управления базами данных. Разработку и поддержку MySQL осуществляет корпорация Oracle, получившая права на торговую марку вместе с поглощённой Sun Microsystems, которая ранее приобрела шведскую компанию MySQL AB. Продукт распространяется как под GNU General Public License, так и под собственной коммерческой лицензией. Помимо этого, разработчики создают функциональность по заказу лицензионных пользователей. Именно благодаря такому заказу почти в самых ранних версиях появился механизм репликации.
MySQL является решением для малых и средних приложений. Входит в состав серверов WAMP, AppServ, LAMP и в портативные сборки серверов Денвер, XAMPP. Обычно MySQL используется в качестве сервера, к которому обращаются локальные или удалённые клиенты, однако в дистрибутив входит библиотека внутреннего сервера, позволяющая включать MySQL в автономные программы.
Гибкость СУБД MySQL обеспечивается поддержкой большого количества типов таблиц: пользователи могут выбрать как таблицы типаMyISAM, поддерживающие полнотекстовый поиск, так и таблицы InnoDB, поддерживающие транзакции на уровне отдельных записей. Более того, СУБД MySQL поставляется со специальным типом таблиц EXAMPLE, демонстрирующим принципы создания новых типов таблиц. Благодаря открытой архитектуре и GPL-лицензированию, в СУБД MySQL постоянно появляются новые типы таблиц.
26 февраля 2008 года Sun Microsystems приобрела MySQL AB за $1 млрд, 27 января 2010 года Oracle приобрела Sun Microsystems за$7,4 млрд и включила MySQL в свою линейку СУБД.
Сообществом разработчиков MySQL созданы различные ответвления кода, такие как Drizzle, OurDelta, Percona Server, и MariaDB. Все эти ответвления уже существовали на момент поглощения компании Sun корпорацией Oracle.
1.2.1 Происхождение MySQL
MySQL возникла как попытка применить mSQL к собственным разработкам компании: таблицам, для которых использовались ISAM -- подпрограммы низкого уровня. В результате был выработан новый SQL-интерфейс, но API-интерфейс остался в наследство от mSQL. Откуда происходит название «MySQL» -- доподлинно неизвестно. Разработчики дают два варианта: либо потому, что практически все наработки компании начинались с префикса My, либо в честь девочки по имени My, дочери Майкла Монти Видениуса, одного из разработчиков системы.
Логотип MySQL в виде дельфина носит имя «Sakila». Он был выбран из большого списка предложенных пользователями «имён дельфина». Имя «Sakila» было отправлено Open Source-разработчиком Ambrose Twebaze.
1.2.2 Платформы
MySQL портирована на большое количество платформ: AIX, BSDi, FreeBSD, HP-UX, Linux, Mac OS X, NetBSD, OpenBSD, OS/2 Warp, SGI IRIX, Solaris, SunOS, SCO OpenServer,UnixWare, Tru64, Windows 95, Windows 98, Windows NT, Windows 2000, Windows XP, Windows Server 2003, WinCE, Windows Vista и Windows 7. Существует также порт MySQL к OpenVMS. Важно отметить, что на официальном сайте СУБД для свободной загрузки предоставляются не только исходные коды, но и откомпилированные и оптимизированные под конкретные операционные системы готовые исполняемые модули СУБД MySQL.
1.2.3 История выпусков
MySQL 4.0
Несмотря на то, что версия 4.0 является устаревшей, она всё ещё имеет значительное распространение. Основные возможности этой версии:
· практически полная реализация ANSI SQL-99, плюс расширения;
· межплатформенная совместимость;
· независимые типы таблиц (MyISAM для быстрого чтения, InnoDB для транзакций и ссылочной целостности);
· транзакции;
· поддержка SSL;
· кэширование запросов;
· репликация: один головной сервер на одного подчинённого, много подчинённых на одного головного;
· полнотекстовая индексация и поиск с использованием типа таблиц MyISAM;
· внедрённая библиотека базы данных;
· поддержка Юникода (UTF-8);
· таблицы InnoDB, обеспечивающие соответствие требованиям ACID;
· встроенный сервер, позволяющий включать MySQL в автономные приложения.
MySQL 4.1
Рекомендованной версией на 2005 год является MySQL 4.1 вышла 27 октября 2004. Она содержит следующие нововведения:
· вложенные запросы и производные таблицы.
· новая система кодировок и сортировок;
· более быстрый и гибкий протокол клиент-сервер с поддержкой подготовленных запросов, обеспечивающий их оптимальное исполнение;
· новая программа установки и настройки для Microsoft Windows и Linux;
· защищённые через OpenSSL соединения клиент-сервер;
· высоко-оптимизированная библиотека, которая может быть использована в сторонних программах;
· полноценная поддержка Юникода (UTF-8 и UCS2);
· стандартные пространственные типы данных GIS, для хранения географической информации;
· улучшенный полнотекстовый поиск и система помощи.
MySQL 5.0
Версия MySQL 5.0 вышла 24 октября 2005 года, в этой версии значительно расширена функциональность, которая ставит MySQL в один ряд с коммерческими СУБД. Если раньше СУБД MySQL обвиняли в недостаточной поддержке стандарта SQL, то с появлением пятой версии этой популярной базы данных, появилась практически полная поддержка стандарта SQL. MySQL 5.0 содержит следующие нововведения:
· хранимые процедуры и функции;
· обработчики ошибок;
· курсоры;
· триггеры;
· представления;
· информационная схема (так называемый системный словарь, содержащий метаданные).
MySQL 5.1
Версия MySQL 5.1 продолжает путь к стандарту SQL:2003. MySQL 5.1 содержит следующие нововведения.
· Сегментирование -- возможность разбить одну большую таблицу на несколько частей, размещенных в разных файловых системах, основываясь на определенной пользователем функции. При определенных условиях это может дать серьёзное увеличение производительности и, кроме того, облегчает масштабирование таблиц.
· Изменено поведение ряда операторов, для обеспечения большей совместимости со стандартом SQL2003.
· Построчная репликация (англ. row-based replication), при которой в бинарный лог будет записываться только информация о реально измененных строках таблицы вместо оригинального (и, возможно, медленного) текста запроса. Построчную репликацию можно использовать только для определенных типов sql-запросов, в терминах MySQL -- смешанная репликация (англ. mixed replication).
· Встроенный планировщик периодически запускаемых работ. По синтаксису добавление задачи похоже на добавление триггера к таблице, по идеологии -- на crontab.
· Дополнительный набор функций для обработки XML, реализация поддержки XPath.
· Новые средства диагностики проблем и утилиты для анализа производительности. Расширены возможности по управлению содержимым лог-файлов, логи теперь могут быть сохранены и в таблицах general_log и slow_log. Утилита mysqlslap позволяет провести нагрузочное тестирование БД с записью времени реакции на каждый запрос.
· Для упрощения операции обновления подготовлена утилита mysql_upgrade, которая выполнит проверку всех существующих таблиц на предмет совместимости с новой версией, и при необходимости выполнит надлежащие корректировки.
· MySQL Cluster отныне выпущен как отдельный продукт, базирующийся на MySQL 5.1 и хранилище NDBCLUSTER.
· Значительные изменения в работе MySQL Cluster, такие, как, например, возможность хранения табличных данных на диске.
· Возврат к использованию встроенной библиотеки libmysqld, отсутствовавшей в MySQL 5.0.
· API для плагинов, которое позволяет загружать сторонние модули, расширяющие функциональность (например, полнотекстовый поиск), без перезапуска сервера.
· Реализация парсера полнотекстового поиска в виде plug-in.
· Новый тип таблиц Maria (устойчивый к сбоям клон MyISAM).
MySQL 5.5
Ветка MySQL 5.5 базируется на невыпущенной серии MySQL 5.4 и содержит ряд значительных улучшений, связанных с повышением масштабируемости и производительности, среди которых:
· Использование по умолчанию движка InnoDB.
· Поддержка полусинхронного (semi-synchronous) механизма репликации, основанного на патчах к InnoDB от компании Google.
· Улучшение функций по секционированию данных. Расширенный синтаксис для разбиения больших таблиц на несколько частей, размещенных в файловых системах (partitioning). Добавлены операции RANGE, LIST и метод оптимизации «partition pruning».
· Новый механизм оптимизации вложенных запросов и JOIN-операций.
· Переработана система внутренних блокировок.
Интегрированы патчи Google с оптимизацией работы InnoDB на процессорах с большим количеством ядер.
MySQL 6.0
Версия MySQL 6.0 была заморожена на стадии альфа-тестирования. Первоначально было принято решение о создании версии 5.2, вскоре эта версия была переименована в 6.0. Однако, позже информация о MySQL 6.0 исчезла с сайта, а разработчики сосредоточились на версии 5.5 и следующей за ней версии 5.6.
Одним из основных нововведений версии 6.0 планировался новый тип таблиц Falcon, разработанный в качестве потенциальной замены для InnoDB компании Innobase, приобретённой компанией Oracle. В связи с приобретением в 2010 году Sun Microsystems тем же Oracle, судьба Falcon остаётся под вопросом.
Рисунок 1.1 - График выхода различных версий MySQL
Далее рассмотрим несколько бесплатных CMS интернет магазинов и подробнее тот, который мы будем использовать для своего проекта.
1.3 Обзор различных CMS интернет магазинов
Content Management System (система управления содержимым) -- информационная система или компьютерная программа для обеспечения и организации совместного процесса создания, редактирования и управления контентом.
1.3.1 osCommerce
Один из старейших движков. Работа по созданию будущей CMS началась в Германии в начале 2000-года. Изначально программа называлась The Exchange Project, а самая популярная версия была выпущена в 2003 году под названием osCommerce 2.2 Milestone 2. Разработчики системы давно работают над версией 3.0., но их детище все еще не увидело свет. От части, это компенсируется огромным количеством всевозможных расширений и плагинов, которые создают на энтузиазме сотни тысяч поклонников osCommerce.
OsCommerce сформировал вокруг себя большое сообщество (свыше 200 тысяч участников), которые с каждым днем вносят свой вклад в улучшение системы. На данный момент существует свыше 5 тыс. различных дополнений и модулей, позволяя подстраивать магазин под нужны любого владельца интернет площадок. На базе CMS osCommerce работают свыше 20 тысяч магазинов по всему миру.
Стандартные функциональные возможности движка:
· Совместим со всеми браузерами
· Многоязычность (по умолчанию поддерживает русский, украинский, английский, немецкий, испанский языки)
· Вы можете добавлять неограниченное количество товаров и разделов
· Легкая настройка резервного копирования данных (поверьте, это важно)
· Просмотр статистики заказов и покупателей
· Поддерживает несколько валют
· Покупатели могут просматривать историю своих заказов
· Наличие временной корзины для гостей магазина и постоянная корзина для покупателей
· Удобный поиск по сайту
· Покупатель может иметь несколько адресов для доставки
· Движок поддерживает многие типа платежей (оплата карточкой, чеком, платежным поручением)
· Поддержка модулей платежных систем (PayPal, Приват24, Webmoney, Яндекс.Деньги, RuPay и так далее)
· Различная форма оплаты для разных областей
· Стоимость доставки рассчитывается на основе зоны доставки, веса и цены заказанного товара.
· Возможность рассчитать налог на товар
Как видите, установив “голую” версию движка интернет магазина osCommerce вы получаете уже вполне рабочую систему, на которой можно создать интернет магазин, без необходимости устанавливать дополнительные модули и настраивать их.
ПЛЮСЫ:
· огромное количество форумов поддержки
· наличие русскоязычной документации и бесплатных модулей на русском языке
· несколько тысяч дополнений и плагинов
· практически неограниченный функционал
МИНУСЫ:
· морально устаревший движок, который редко обновляется и держится за счет только поклонников
· большинство разработанных модулей сторонними программистами не проходят модерацию и часто написаны “коряво”, что влечет за собой нестабильную работу всего движка
· “недружелюбный” интерфейс для пользователя
· сложность в редактировании дизайна
Не рекомендуется использовать для начинающих онлайн предпринимателей.
1.3.2 VirtueMart
VirtueMart -- программное обеспечения, для создания интернет-магазинов. Работает как дополнение к CMS системе Joomla. Идеально подходит для сайтов с низкой и средней степенью нагрузки. На VirtueMart сделано более 100 тыс. интернет магазинов, что делает его самым популярным дополнением к Джумле. Что ж, перейдем сразу к плюсам и минуса данного движка.
ПЛЮСЫ:
· Бесплатная CMS. Причем это совсем не означает, что сам движок плохой и требует доработки. При наличии кое-каких знаний вы сможете самостоятельно “допилить” стандартный функционал и сделать полноценный магазин, который не будет уступать платным аналогам.
· Возможность расширения. Написано огромное количество модулей, плагинов и компонентов, которые разрабатывали специально по VirtueMart. Мало того, с каждым днем появляется все больше и больше дополнительных разработок, что не может не радовать. По сути, вы сможете построить магазин любой сложности, без необходимости приобретать дорогостоящие модули.
· Выбор русского языка. Немаловажный фактор, который часто забывает разработчики своей системы. Многие скрипты магазинов изначально были ориентирован на западных потребителей, поэтому язык по умолчанию используется английский. В модуле Virtuemart поддерживается русский язык в полной мере.
МИНУСЫ:
· Слабая защита скрипта. Если вы планируете сделать большой интернет магазин, то посмотрите в сторону других CMS, так как VirtueMart не сможет вам предоставить качественный уровень защиты ваших данных.
· Частые “глюки”. Они возникают в основном из-за установки сторонних компонентов. Многие программисты пишут свои модули для VirtueMart, но мало кто проверяет совместимость написанных модулей, поэтому и возникают постоянные конфликты внутри системы.
· Необходимо время, чтобы ознакомиться с системой. VirtueMart -- мощное дополнение к Joomla, но новичку будет трудно разобраться и сообразить что к чему. При возникновении каких-либо проблем часто нужно обращаться к специалисту или искать ответ на специализированных форумах.
Рекомендуется для тех, кто только хочет разобраться в тонкостях создания интернет магазина и не знает с чего начать. Но учтите, что серьезные проекты на такой CMS не создаются.
1.3.3 Magento
Популярная система для управления содержимым интернет-магазинов. По данным сайта Alexa.com, Magento является самой популярным движком для онлайн магазинов в 2011 году. Magento в основном рассчитана на западного потребителя, и слабо представлена отечественном рынке. Среди западных компаний, которые используют для своих магазинов этот движок, можно выделить Nokia, Samsung, Nestle, Lenovo и множество других крупных корпораций. Тем не менее, отечественные фирмы не спешат переходить на Magento, отчасти это связано со слабой русскоязычной поддержкой.
ПЛЮСЫ:
· Возможность устанавливать несколько интернет магазинов на одну систему и управлять ими с единого центра. Подобного свойства нет ни у одной другой CMS системы.
· Мультивалютность системы. В Magento легко использовать разные валюты и просто их конвертировать. Подобная функция хорошо подойдет для тех, кто планирует создать онлайн площадку за рубежом.
· Удобное пользование каталогом товаров. В системе реализована функция создания подробного описания для каждого товара, добавление к нему различных характеристик, привязка к товару смежных позиций, а также реализована возможность добавлять несколько фотографий.
· Назначение цен для разной группы покупателей. Очень удобная функция, которой лишены многие популярные CMS в коробочной версии.
· Продуманная система реализации акций и скидок. Создавать и управлять акционными товарами одно удовольствие, а собрать все акции, скидки, распродажи на отдельной странице и создать для неё другой дизайн, не составит труда даже для начинающего пользователя.
· Посетители могут оставлять отзывы, ставить оценку товара.
· Грамотная SEO оптимизация движка.
МИНУСЫ:
· Сложность в настройке. Для создания собственного интерфейса, придется перерыть кучу англоязычной литературы и не факт, что у вас получится, не обладая специальными знаниями, создать уникальный магазин с профессиональным нестандартным дизайном. Придется нанимать специалистов, чтобы они доработали движок специально под вас.
· “Прожорливость” движка. Для CMS Magento требуется качественный быстрый хостинг. Лучший вариант, когда хостинг-провайдер находится в той стране, где и вы.
· Отсутствие нормальной поддержки русского языка. Большинство литературы на английском языке. Соответственно, много полезной информации вам будет не доступно без знания языка.
· Отсутствие модулей для русскоязычных покупателей. Дело даже не в поддержке русского языка, а отсутствие расширений для отечественного сегмента рынка. Например, в Magento нет поддержки российских платежных система (Яндекс. Деньги и Webmoney), которые очень популярны на рынке России. Вам придется нанимать программистов для написания скриптов, что не очень выгодно, особенно если вы планируете бесплатно создать интернет магазин.
· Отсутствие связки с 1C. Для отечественного предпринимателя это важный момент, который может быть ключевым в принятии решении об отказе установки данной системы на свой магазин.
1.4 Presta Shop
Prestashop - сравнительно молодой движок для интернет-магазинов. Первая версия вышла в свет в 2008 году в Париже, и это, несомненно, плюс - мы видим прекрасную новую систему управления контентом, адаптированную под современные потребности интернет-магазинов, а не старый движок, на который «налеплены» обновления для соответствия запросам вебмастеров. Рассмотрим Prestashop как можно более подробно и выясним, отчего же так популярна эта CMS сейчас.
За те несколько лет, которые прошли с момента выпуска еще никому не знакомой Prestashop до современной Prestashop-мании, произошло почти 2,5 миллиона скачиваний продукта с сайта разработчика. Каждые полминуты один решительный вебмастер нажимает кнопку «Download for free» на этом сайте! Вы можете в этом убедиться сами, зайдя на prestashop.com! Тем не менее, в этом количестве очень мало скачиваний из России. Оно и понятно - русской версии Prestashop на официальном сайте не найти (хотя ходят слухи, что ее вот-вот русифицирует разработчик) и поэтому русификацией занялись сами пользователи. На http://prestadev.ru/download/ вы можете скачать версию движка 1.4 (последняя вышедшая на данный момент - 1.5). Следует пояснить для новичков, только познающих системы управления контентом, что CMS - это не программа и просто загрузить и изучить ее не получится. Чтобы увидеть Prestashop, нужно загрузить скачанные файлы на хостинг вашего сайта!
1.4.1 Преимущества
Какие же плюсы имеет Prestashop перед другими движками? И собственно, имеет ли? При первом обзоре, мы видим - да, с плюсами у Prestashop все в полном порядке. С самого начала работы, Prestashop нас «кормит пряниками», да так, чтобы потом мы даже взгляд не бросали в сторону других CMS.
Первое преимущество, которое нам доводится узнать - абсолютная бесплатность и открытый исходный код.Не нужно ничего оплачивать ни до, ни после скачивания. Но вот купить что-нибудь, если уж так хочется вложиться в свой сайт на полную, у вас будет возможность. Всегда можно купить более красивые и уникальные модули и шаблоны - хотя у Prestashop есть свои бесплатные. Также у вас есть возможность поизучать на досуге исходный код CMS. Возможно, после этого вы решите написать свой движок, уяснив, как работает система. Бесплатность и открытый исходный код говорят в первую очередь о чем? Правильно, о том, что CMS создана для людей, а не для денег. Отчасти благодаря этому Prestashop в 2011 году завоевала звание лучшей Европейской системы управления контентом и получила награду.
Итак, идем далее. Второе преимущество Prestashop - удобство. Устанавливать модули и пользоваться ими достаточно просто. Для того, чтобы установить новые модули в другие CMS, зачастую требуются профессиональные навыки вебмастера. Здесь же справится любой новичок, именно поэтому выбор Prestashop будет для них идеален.
И наконец, третье и самое главное преимущество - гибкость и функциональность. Огромное разнообразие шаблонов, модулей, настроек. Нужно заметить, что из-за расширенного функционала, движок работает немного медленнее некоторых конкурентов, но то, что мы получаем взамен, компенсирует этот недостаток с лихвой.
1.4.2 Функциональность
Каталог:
· Возможность использования водяных знаков на фотографии
· Отзывы и оценки товаров клиентами
· Отображение цены с налогом или без него
· Отображение количества товаров на складе
· Сортировка товаров по разным параметрам (релевантность, цена)
· Показ скидок в процентах
· Отображение производителей и брендов
· Опция «отправить другу»
Статистика:
· Статистика посетителей
· Статистика заказов и продаж
· Статистика оборудования пользователей
· Статистика переходов по категориям
· Учёт товаров
· Статистика лучших клиентов
· Заходы с других сайтов
· Статистика по ключевым словам
· Лучшие продукты
· Лучшие категории
· Лучшие поставщики
· Статистика рассылки
· Статистика по доставке
· Geo-локализация
· Статистика заходов по ключевым словам
· Полная интеграция с Google Analytics
· Визуализация GD
· Визуализация Flash (XML, SWF-графики)
· Визуализация Silverlight
· Визуализация Google-графики
Безопасность:
· Безопасный вход в кабинет администратора (логин и пароль)
· Поддержка SSL-протокола
· Пароли шифрования в базе данных
· Cookies-шифрования
· Блокировка при неоднократных попытках восстановления пароля
Управление:
· Текстовый редактор WYSIWYG
· Возможность добавления дополнительных модулей
· Резервное копирование базы данных (частичное или полное)
· Автоматическая генерация htaccess-файлов
· Автоматическая генерация файлов robots.txt
· Отправка электронной почты через SMTP (поддерживается SSL и TLS) или с помощью функции PHP mail.
· Управление шрифтами в PDF-файлах
· Индексация товаров для оптимизации поиска
· Управление запасами
· СМС (инвентаризация, новый порядок…)
· Нет в наличии оповещений по электронной почте
Модули магазина:
· Ajax-корзина
· Облако меток
· Ajax-поиск
· Alias-поиск
· Настраиваемые страницы (текст, фото)
· Продукты сцены (презентация продукции)
· Советы по продуктам страниц: дата приобретения или добавление в корзину
· Модули On-Off
· Товары, рекомендуемые на главной странице
· Возможность вставки объявлений
· Показать новые товары
· Возможность интеграции с Google Adsense
· Закладка в один клик
· Выбор валюты
· Выбор языка
· Продукты RSS-канал
· Показать другие товары из той же категории
· Показать лучших продавцов
· Отображение продуктов категории
· Отображение дополнительной ссылки
· Показать производителей
· Показать поставщиков
· Блок «Мой счет»
· Дисплей счета полного клиента (информация, заказы, скользит …)
· Подписка на рассылку новостей блок
· RSS-канал для подписки
· Подчеркивая доступных платежных средств
· Третий блок RSS-канал
· Быстрый поиск
1.5 Формат представления данных XML
XML (англ. eXtensible Markup Language -- расширяемый язык разметки) -- рекомендованный Консорциумом Всемирной паутины (W3C) язык разметки. Спецификация XML описывает XML-документы и частично описывает поведение XML-процессоров (программ, читающих XML-документы и обеспечивающих доступ к их содержимому). XML разрабатывался как язык с простым формальным синтаксисом, удобный для создания и обработки документов программами и одновременно удобный для чтения и создания документов человеком, с подчёркиванием нацеленности на использование в Интернете. Язык называется расширяемым, поскольку он не фиксирует разметку, используемую в документах: разработчик волен создать разметку в соответствии с потребностями к конкретной области, будучи ограниченным лишь синтаксическими правилами языка. Сочетание простого формального синтаксиса, удобства для человека, расширяемости, а также базирование на кодировках Юникод для представления содержания документов привело к широкому использованию как собственно XML, так и множества производных специализированных языков на базе XML в самых разнообразных программных средствах.
1.5.1 Язык XML
Спецификация XML описывает язык и ряд вопросов, касающихся кодировки и обработки документов. Материал этой секции представляет собой сокращённое изложение описания языка в Спецификации XML, адаптированное для настоящей статьи.
Нормативным считается английский вариант документа, поэтому основные термины приводятся с их английскими оригиналами.
Перевод основных терминов в основном следует доступному в интернете переводу Спецификации на русский язык, исключение составляют термины tag и declaration.
Для термина tag здесь используется перевод тег как соответствующий текущим нормам русского языка.
Для термина declaration отдано предпочтение распространённому переводу объявление (против также распространённой кальки декларация).
В литературе и интернете могут встречаться и иные переводы основных терминов.
1.5.2 Логическая и физическая структура документа
С логической точки зрения, документ состоит из пролога и корневого элемента. Корневой элемент -- обязательная часть документа, пролог, вообще говоря, может отсутствовать.
Пролог может включать объявления, инструкции обработки, комментарии.
Пролог следует начинать с объявления XML, хотя в определённой ситуации допускается отсутствие этого объявления.
Корневой элемент может включать (а может не включать) вложенные в него элементы и символьные данные, а также комментарии. Вложенные в корневой элемент элементы, в свою очередь, могут включать вложенные в них элементы, символьные данные и комментарии, и так далее.
Элементы документа должны быть правильно вложены: любой элемент, начинающийся внутри другого элемента (то есть любой элемент документа, кроме корневого), должен заканчиваться внутри элемента, в котором он начался.
Символьные данные могут встречаться внутри элементов как непосредственно так и в специальных секциях CDATA.
Объявления, инструкции обработки и элементы могут иметь связанные с ними атрибуты. Атрибуты (англ. attribute) используются для связывания с логической единицей текста пар имя-значение.
С физической точки зрения, символы, составляющие документ, делятся на разметку (англ. markup) и символьные данные (англ. character data).
Объявления и инструкции обработки, включая их атрибуты, а также комментарии полностью принадлежат разметке. К разметке также принадлежат теги, обозначающие границы элементов, включая их атрибуты, а также последовательности символов, обрамляющие секции CDATA.
Часть документа, не принадлежащая разметке, составляет символьные данные документа.
1.5.3 Объявление XML
Объявление XML объявляет версию языка, на которой написан документ. Поскольку интерпретация содержимого документа, вообще говоря, зависит от версии языка, то Спецификация предписывает начинать документ с объявления XML. В первой (1.0) версии языка использование объявления не было обязательным, в последующих версиях оно обязательно. Таким образом, версия языка определяется из объявления, и если объявление отсутствует, то принимается версия 1.0.
Кроме версии XML, объявление может также содержать информацию о кодировке документа.
Пример:
<?xml version='1.1' encoding='UTF-8' ?>
Или
<?xml version='1.0' encoding='windows-1251'?>
1.5.4 Элемент и его разметка
Элемент (англ. element) является понятием логической структуры документа. Каждый документ содержит один или несколько элементов. Границы элементов представлены начальными конечным тегами. Имя элемента в начальном и конечном тегах элемента должно совпадать. Элемент может быть также представлен тегом пустого, то есть не включающего в себя другие элементы и символьные данные, элемента.
Тег (англ. tag) -- конструкция разметки, которая содержит имя элемента.
Начальный тег: <element1>
Конечный тег: </element1>
Тег пустого элемента: <empty_element1 />
В элементе атрибуты могут использоваться только в начальном теге и теге пустого элемента.
Пример кулинарного рецепта, размеченного с помощью XML:
<recipe name='хлеб' preptime='5' cooktime='180'>
<title>Простой хлеб</title>
<composition>
<ingredient amount='3' unit='стакан'>Мука</ingredient>
<ingredient amount='0.25' unit='грамм'>Дрожжи</ingredient>
<ingredient amount='1.5' unit='стакан'>Тёплая вода</ingredient>
<ingredient amount='1' unit='чайная ложка'>Соль</ingredient>
</composition>
<instructions>
<step>Смешать все ингредиенты и тщательно замесить.</step>
<step>Закрыть тканью и оставить на один час в тёплом помещении.</step>
<!-- <step>Почитать вчерашнюю газету.</step> - это сомнительный шаг... -->
<step>Замесить ещё раз, положить на противень и поставить в духовку.</step>
</instructions>
</recipe>
1.5.5 Эффективность использования XML
XML -- язык разметки, другими словами, средство описания документа. Именно в нише документов, текстов, где доля разнотипных символьных данных велика, а доля разметки мала -- XML успешен. С другой стороны, обмен данными в открытых системах не сводится к обмену документами. Избыточность разметки XML (а в целях разработки языка прямо указано, что лаконичность не является приоритетом проекта) сказывается в ситуациях, когда данные не вписываются в традиционную модель документа. Лента новостей, например, оформляемая с использованием синтаксиса XML (форматы RSS, Atom), представляет собой не документ в традиционном понимании, а поток однотипных мини-документов -- многословная и избыточная разметка в этом случае составляет существенную часть передаваемых данных.
W3C озабочен эффективностью применения XML, и соответствующие рабочие группы занимаются этой проблемой (к началу 2013 года нормативные документы не разработаны).
Другая ситуация, когда форматы XML могут оказаться не лучшим решением - работа с данными с простой структурой и небольшим по объёму содержанием полей данных. В этом случае доля разметки в общем объёме велика, а программная обработка XML может оказаться неоправданно затратной, по сравнению с работой с данными более простой структуры. В этой области разработчики рассматривают средства, изначально ориентированные на данные, такие как INI, YAML, JSON.
1.6 Office Open XML
Office Open XML (OOXML, DOCX, проект ISO/IEC IS 29500:2008) -- серия форматов файлов для хранения электронных документов пакетов офисных приложений -- в частности, Microsoft Office. Формат представляет собой zip-архив, содержащий текст в виде XML, графику и другие данные, которые могут быть переведены в последовательность битов (сериализованы) с применением защищённых патентами двоичных форматов, спецификации которых были опубликованы Microsoft для пользователей OOXML на условиях Microsoft Open Specification Promise.
Первоначально формат создавался как замена прежнему двоичному формату документов, который использовали приложения Microsoft Office вплоть до версии Office 2003 включительно. В 2006 году формат Office Open XML был объявлен свободным и открытым форматом Ecma International. Он является форматом по умолчанию для приложений Microsoft Office 2007 и более поздних.
Две разные версии OOXML определены в ECMA-376 и в ISO 29500:2008. Полная поддержка формата ISO 29500 ожидается в Microsoft Office 2010.
1.6.1 Стандартизация
К 2005 году участились призывы к госструктурам переходить на открытые форматы. Если в бывшем СССР культура пользования лицензионным ПО была ещё слаба, в Европе закрытый формат правительственных документов фактически стал требованием платить из государственных бюджетов Microsoft -- американской компании -- несколько сотен долларов за рабочее место. Осознав, что у неё нет подходящего формата, а конкуренты, OASIS, проводят свой ODF через ISO, Microsoft на основе своих DOC и XLS создала свой XML-формат и провела его через Ecma International и ISO. Началась эта процедура в 2006 году и закончилась в 2008 -- чуть больше двух лет на всё (ODF начали стандартизировать ещё в 2002-м). Оппоненты обнаружили в этом начинании множество нарушений внутренних процедур ISO.
1.6.1.1 Ecma International
Microsoft заявила, что Office Open XML будет открытым стандартом, и представила его на утверждение Ecma International (ECMA). 8 декабря 2005 года ECMA организовала технический комитет 45 (TC45), чтобы «выпустить формальный стандарт для офисных приложений, полностью совместимый с форматами Office Open XML, представленными Microsoft». Предложение также поддержали Apple Inc., Barclays Capital, BP, the British Library, Essilor, Intel, NextPage., Statoil ASA и Toshiba.
1.6.1.2 ISO/IEC
5 сентября 2007 года принятие варианта OOXML как стандарта ISO/IEC 29500 было временно отклонено по результатам голосования.
В марте 2008 года изменённая спецификация была принята как будущий стандарт ISO/IEC 29500. В частности, в Норвегии при этом были отмечены нарушения процесса стандартизации. Позже оказалось, что файлы, сохраняемые Microsoft Office 2007, не проходят тестов на соответствие стандарту, что нарушает правила принятия стандарта через процедуру Fast-Tracking, требующие, чтобы существовали реализации стандарта.
В мае 2008 были поданы апелляции от ЮАР, Бразилии и Индии, Венесуэлы. Также подана жалоба о нескольких нарушениях от Open Source Leverandшrforeningen в Дании.
Публикация ISO/IEC DIS 29500 была отложена на период рассмотрения апелляций (30 дней).
В июле руководители ISO и IEC порекомендовали Technical Management Board отклонить апелляции, указав в качестве причины то, что проект стандарта был принят голосованием в соответствии с директивами ISO/IEC JTC 1.
В августе ISO отклонила апелляции стран, выступающих против принятия OOXML как стандарта, так как они не смогли получить поддержку необходимого числа участников ISO для приостановления принятия стандарта
В конце августа государственные IT-организации Бразилии, ЮАР, Венесуэлы, Эквадора, Кубы и Парагвая опубликовали заявление о сомнениях в нейтральности ISO.
В Норвегии, где из 21 голоса «против» и двух голосов «за» получилось «за», 29 сентября 2008 года 13 членов технической комиссии в знак протеста вышли из состава Standard Norge (no).
По данным собрания ISO/IEC JTC1/SC34, подкомиссии ISO/IEC JTC1, в начале октября SC34 отправила OASIS неопубликованный запрос на передачу ей контроля над стандартомISO/IEC 26300 (ODF), обосновывая это стремлением к лучшей совместимости между стандартами. В Groklaw также обратили внимание на то, что 9 из 20 присутствовавших на собрании в июле являлись сотрудниками или консультантами Microsoft, либо членами ECMA TC45. В результате появились подозрения в попытке захвата Microsoft контроля над ODF.
Таким образом, было принято решение о разработке программного обеспечения для мониторинга каталога продукции, использующее следующие технологии:
- язык PHP в качестве языка программирования для написания веб-приложения;
- MySQL - база данных, хранящая каталог продукции;
- PrestaShop - CMS, предоставляющая доступ к каталогу для пользователей и администраторов;
- Форматы данных XML и XLSX для предоставления каталога продукции пользователю, в формате удобном для восприятия.
2 Разработка программного обеспечения
Разработанное программное обеспечение представляет собой веб приложение для мониторинга каталога продукции предприятия. Данное приложение должно облегчить работу с каталогами продукции предприятий, как обычным пользователям, так и владельцем данного предприятия. Владельцем позволяет уменьшить затрату времени и ресурсов для обновления своего каталога. В свою очередь пользователи всегда получают свежий каталог в свои руки. Все это позволяет убрать некоторые несоответствия между покупателем и продавцом из-за устаревшего каталога.
В разработке мы используем CMS Prestashop который мы и подключаем к нашей базе данных. В качестве языка программирования мы выбрали php, так как он является широко распространенным и более простым в освоении. В качестве базы данных взята MySQL.
2.1 Структура программного обеспечения
Исходный код каталога продукции представляет собой набор модулей, написанных на языке php и исполняемых на веб-сервере.
Каждый модуль представляет собой класс, выполняющий определенную функцию.
Рассмотрим основной модуль, отвечающий за подключение к базе и предоставление пользователю готового каталога. Модуль написан в файле index.php.
Основой файла index.php служит класс ExcelWriter. В классе предусмотрены следующие поля:
· objPHPExcel объект класса отвечающего за формирование xlsx-документа на диске;
· activeSheetIndex указатель на активную страницу каталога;
· row указатель на текущую ячейку;
· mProductName стиль оформления названия продукта;
· mDescription стиль оформления описания продукта;
· borderOutline оформление границы документа;
· h2Style оформление подзаголовков.
Также в классе предусмотрены методы:
· __construct метод вызываемый при создании объекта класса, отвечает за подключение к базе данных;
· setHeader метод создания заголовка страницы;
· getParentCategory метод получения подкатегории;
· getProductImage метод получения изображения товара;
· writeExcelFile метод записи файла катлога;
· Attachment метод добавления дополнительных файлов к описанию товара.
2.2 Подключение к базе данных
Для подключения к базе данных MySQL используется метод конструктора класса.
Внутри конструктора осуществляется подключение к базе данных с использование логина и пароля для получения доступа, также указывается URL базы данных и ее название:
public function __construct($hostname, $username, $password, $dbName)
{
$this->objPHPExcel = new PHPExcel();
$this->activeSheetIndex = 0;
$this->row = self::MIN_ROW;
mysql_connect($hostname, $username, $password) OR DIE('Не могу создать соединение с базой данных.');
mysql_select_db($dbName) or die(mysql_error());
$this->getParentCategory(2, false);
$this->writeExcelFile();
}
Для получения информации о продукции используются следующие таблицы базы данных:
· ps_category_lang название категории товара на русском языке;
· ps_category код категории товара;
· ps_category_product перечень товаров внутри категории;
· ps_product_lang название продукта на русском языке;
· ps_image информация об изображении товара;
· ps_product артикул продукта и краткая информация о продукте;
· ps_manufacturer информация о производителе товара;
Формирование каталога продукции начинается с получения информации о категориях товаров с использованием SQL-запросов к базе данных.
Данный запрос получает название категории товара по ее идентификатору:
'SELECT name FROM ps_category_lang WHERE id_category=' . $category;
Данный запрос предназначен для получения идентификаторов подкатегорий указанной категории товара:
'SELECT id_category FROM ps_category WHERE id_parent =' . $category;
Следующий запрос предназначен для получения информации о продуктах из выбранной подкатегории:
'SELECT b.name, b.description_short, c.id_image, d.price FROM ps_category_product a, ps_product_lang b, ps_image c, ps_product d WHERE a.id_product = b.id_product AND a.id_product = c.id_product AND a.id_product = d.id_product AND b.id_lang = 7 AND c.cover = 1 AND a.id_category =' . $category;
Запрос для получения информации о дополнительных файла для товара:
'SELECT id_attachment FROM ps_attachment_lang WHERE name LIKE 'Паспорт '.$p_name.$type.''';
Запрос для получения информации о производителе продукта:
'SELECT id_manufacturer FROM ps_manufacturer WHERE name LIKE '' .$p_manufacture.''';
2.3 Подключение к файловой системе
Из файловой системы мы получаем изображение товара и дополнительные файлы если таковые имеются. Также добавляется изображение в заголовке каталога.
Код добавления заголовочной части к каждой странице:
private function setHeader()
{
$iDrawing = new PHPExcel_Worksheet_Drawing();
$iDrawing->setPath('images/header_logo.png');
$iDrawing->setCoordinates('A1');
$iDrawing->setWorksheet($this->objPHPExcel->getActiveSheet());
$this->objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);
$this->objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(60);
$this->objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(15);
}
Функция получения изображения товара из файловой системы:
private function getProductImage($id){
$t = 1;
$x = $id;
$tmp[] = NULL;
while($x != 0){
$tmp[] = $x % ($t * 10);
$x = (int)($x / 10);
}
$path = '../shop1/img/p/';
foreach (array_reverse($tmp) as $value) {
$path .= $value.'/';
}
$path .= $id.'-home_default.jpg';
echo '<img src=''.$path.'' />';
$iDrawing = new PHPExcel_Worksheet_Drawing();
$iDrawing->setPath($path);
$iDrawing->setCoordinates('A'.$this->row);
$iDrawing->setOffsetY(10);
$iDrawing->setOffsetX(10);
$iDrawing->setWorksheet($this->objPHPExcel->getActiveSheet());
$this->objPHPExcel->getActiveSheet()->getRowDimension($this->row)->setRowHeight($iDrawing->getHeight());
}
Изображения товара хранятся в директории /shop1/img/p/' сервера.
2.4 Формирование каталога
Под формирование каталога понимаем создание структуры файла каталога продукции на диске, для этого используются специальные функции работы с потоками ввода-вывода. Кроме всего каталог должен обладать определенным форматированием для наглядности предоставления информации пользователю.
Каталог должен иметь заголовочную часть, в которой имеется информация о предприятии: контакты, название, логотип. Для его создания используется функция:
private function setHeader()
{
$iDrawing = new PHPExcel_Worksheet_Drawing();
$iDrawing->setPath('images/header_logo.png');
$iDrawing->setCoordinates('A1');
$iDrawing->setWorksheet($this->objPHPExcel->getActiveSheet());
$this->objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);
$this->objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(60);
$this->objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(15);
}
Основой составления структуры служит метод getParentCategory, это рекурсивный метод, те он может вызывать себя на исполнение внутри своего тела. Это сделано для получения списка подкатегорий категории.
Сначала с помощью SQL-запроса к базе данных мы получаем список категорий корневой категории каталога, если у категории есть подкатегории, мы рекурсивно получим этот список подкатегорий, иначе приступим к получению списка продукции. Для оформления заголовков категории используются следующие функции:
$this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(0, $this->row)->applyFromArray($this->h2Style)->applyFromArray($this->borderOutline);
$this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(1, $this->row)->applyFromArray($this->borderOutline);
$this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(2, $this->row)->applyFromArray($this->borderOutline);
$this->objPHPExcel->getActiveSheet()->mergeCellsByColumnAndRow(0, $this->row, 2, $this->row);
Для оформления заголовков категории используются стили h2Style и borderOutline:
private $borderOutline = array(
'borders' => array(
'outline' => array(
'style' => PHPExcel_Style_Border::BORDER_THIN,
)
)
);
private $h2Style = array(
'font' => array(
'name' => 'Tahoma',
'size' => '9',
'bold' => true,
'color' => array('argb' => 'FF333333')
),
'alignment' => array(
'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
'vertical' => PHPExcel_Style_Alignment::VERTICAL_TOP
),
'fill' => array(
'type' => PHPExcel_Style_Fill::FILL_SOLID,
'startcolor' => array('argb' => 'FFC4C4C4')
)
)
Каждая категория являющаяся потомком базовой отображается на отдельной странице xls-документа. Подкатегории данных категорий отображаются на странице категории в виде раскрывающегося списка.
Следующим этапом является получение списка товаров. Из базы данных с помощью SQL-запроса получаем название, краткое описание, код изображения товара и его цену. Затем записываем результат в активную страницу:
$name = iconv('windows-1251', 'utf-8', $res3['name']);
$image = iconv('windows-1251', 'utf-8', $res3['id_image']);
$price = iconv('windows-1251', 'utf-8', $res3['price']);
// Currency
$price = round($price * get_currency());
$description_short = iconv('windows-1251', 'utf-8', $res3['description_short']);
$this->objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, $this->row, $name);
$this->objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, $this->row, $description_short);
$this->objPHPExcel->getActiveSheet()->setCellValueExplicitByColumnAndRow(2, $this->row, $price, PHPExcel_Cell_DataType::TYPE_NUMERIC);
$this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(0, $this->row)->applyFromArray($this->mProductName)->getAlignment()->setWrapText(true);
$this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(1, $this->row)->applyFromArray($this->mDescription)->getAlignment()->setWrapText(true);
$this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(2, $this->row)->applyFromArray($this->mDescription)->getNumberFormat()->setFormatCode('#,## руб');
$this->getProductImage($image);
$this->row++;
Для оформления продукта применяются стили:
private $mProductName = array(
'alignment' => array(
'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
'vertical' => PHPExcel_Style_Alignment::VERTICAL_BOTTOM
),
'font' => array(
'name' => 'Tahoma',
'size' => '10',
'bold' => false,
'color' => array('argb' => 'FF333333')
),
);
private $mDescription = array(
'alignment' => array(
'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER
),
'font' => array(
'name' => 'Tahoma',
'size' => '8',
'bold' => false,
'color' => array('argb' => 'FF333333')
)
);
Для получения изображения продуктов применяется следующая функция:
private function getProductImage($id){
$t = 1;
$x = $id;
$tmp[] = NULL;
while($x != 0){
$tmp[] = $x % ($t * 10);
$x = (int)($x / 10);
}
$path = '../shop1/img/p/';
foreach (array_reverse($tmp) as $value) {
$path .= $value.'/';
}
$path .= $id.'-home_default.jpg';
echo '<img src=''.$path.'' />';
$iDrawing = new PHPExcel_Worksheet_Drawing();
$iDrawing->setPath($path);
$iDrawing->setCoordinates('A'.$this->row);
$iDrawing->setOffsetY(10);
$iDrawing->setOffsetX(10);
$iDrawing->setWorksheet($this->objPHPExcel->getActiveSheet());
$this->objPHPExcel->getActiveSheet()->getRowDimension($this->row)->setRowHeight($iDrawing->getHeight());
}
Далее полученный объект сохраняется на диск:
$objWriter = PHPExcel_IOFactory::createWriter($this->objPHPExcel, 'Excel2007');
Последним этапом является предоставление ссылки на документ каталога продукции пользователю.
Для удобства восприятия и для обеспечения кроссплатформенности, каталог продукции сохраняется в формате xls, в следующей главе рассмотрим этот формат подробнее.
3 Формат XLS
Microsoft Excel (также иногда называется Microsoft Office Excel) -- программа для работы с электронными таблицами, созданная корпорацией Microsoft для Microsoft Windows, Windows NT и Mac OS. Она предоставляет возможности экономико-статистических расчетов, графические инструменты и, за исключением Excel 2008 под Mac OS X, язык макропрограммирования VBA (Visual Basic for Application). Microsoft Excel входит в состав Microsoft Office и на сегодняшний день Excel является одним из наиболее популярных приложений в мире.
Рассмотрим структуру файла формата XLS более подробно:
В корне файл формата XLS содержит несколько папок: _rels; docProps; xl. Папки и их содержимое мы рассмотрим ниже. Еще в корне файла находится файл формата xml под названием [Content_Types], его мы сейчас рассмотрим подробнее. В файле [Content_Types] определяются типы ключевого содержимого документа, например основного текста документа, стилей, параметров и свойств файла. Как было показано ранее, в этом файле также определяются типы файлов.
Рисунок 3.1 - Корневой каталог файла XLS
В папке docProps содержится два файла формата xml:app; core.
Рисунок 3.2 - Содержание папки docProps
В папке xl содержатся папки:_rels; theme; worksheets. Так же содержатся файлы: sharedStrings; styles; workbook. Содержание папок мы разберем ниже. В файле styles содержатся стили оформления документа. Файл workbook отвечает за содержание информации в документе фомата XLS.
Рисунок 3.3 - Содержание папки xl
В папке theme содержится файл theme1 отвечающий за стили оформления самого документа формата XLS.
Рисунок 3.4 - Содержание папки theme
В папке worksheets содержатся по умолчанию файлы: sheet 1; sheet 2; sheet 3. Эти файлы содержат информацию для отображения на листах документа.
Рисунок 3.5 - Содержание папки worksheets
После подробного просмотра файла формата XLS, разберем оформление и структуру конечного каталога продукции.
4 Стили форматирования каталога продукции
В данной главе описаны все стили и способы форматирования каталога продукции, которые использованы в данном приложении. Так же приведены скриншоты готового каталога продукции, который получает конечный пользователь.
4.1 Стили форматирования текста
В конечном каталоге продукции получаемым пользователем, все стили форматирования текста заранее заложены в код программы, которая формирует их при каждом запросе пользователем свежего каталога продукции. Подробное описание каждого стиля текста: его шрифт, размер. Так же задано оформление всего каталога продукции: цвет ячеек, размер.
Рисунок 4.1 - Структура каталога
В готовом каталоге продукции, для удобства навигации, все категории продукции приведены на одной странице с возможностью перехода по ним при клике мышкой (рисунок 4.1).
Каждая категория продукции отображена на отдельном листе xls-документа.
4.2 Организация структуры каталога
Каждая страница каталога представляет собой список подкатегорий выбранной категории товаров, для удобства навигации, подкатегории товаров обладают возможностью сворачиваться и разворачиваться при клике на значок плюс либо минус в левой части страницы (рисунок 4.2).
Рисунок 4.2 - Список подкатегорий товара каталога
Рисунок 4.3 - Подкатегория товаров каталога
После того, как содержимое страницы развернуто, пользователь получает доступ к списку товаров, сформированном в виде таблицы (рисунок 4.3).
Список товаров содержит информацию об артикуле товара, краткое его описание и цену с учетом налогов. Данная информация берется из базы данных и добавляется в соответствующую ячейку таблицы. Также информация о товаре содержит изображение товара, если таковое имеется. Изображения товаров получаются из файловой системы. (Рисунок 4.4).
Рисунок 4.4 - Список товаров категории
4.3 Добавление изображений в каталог
Данное приложение получает из базы данных уникальный идентификатор изображения соответствующего товара из категории, а именно их порядковый номер. Сами же картинки хранятся в файловой системе, откуда они с использованием координат соответствующих ячеек таблицы вставляются в конечный прайс-лист. Таким способом пользователь может не только узнать технические характеристики и другую информацию о продукте, но и узнать, как выглядит этот продукт.
4.4 Макросы
В нашем прайс-листе формируются макросы для осуществления навигации по категориям каталога продукции. В документе используются макросы для перехода из содержания в выбранную подкатегорию, а также для разворачивания/сворачивания информации из подкатегории внутри категории товаров. Эта функция позволяет пользователю ориентироваться по каталогу продукции проще и быстрее. Макросы добавляются в файловую систему и затем на основе файловой системы формируется файл формата XLS.
5 Основные положения расчёта стоимости программного обеспечения
Программное обеспечение (ПО) является материальным объектом специфической интеллектуальной деятельности специалистов, состоящим из программно документально оформленного проекта, реализующего свои потребительские свойства и качества в составе функционирующих вычислительных систем или систем обработки данных. По стоимости и срокам службы ПО относится к основным производственным фондам предприятия.
Каждое ПО, как реальная продукция, имеет определенный жизненный цикл, т.е. период от начала разработки и до снятия с эксплуатации, включающей три стадии: разработку (проектирование), производство (создание) и использование (сопровождение).
Программное обеспечение, как товарная продукция, может быть двух видов:
· научно-техническая продукция;
· продукция производственно-технического назначения.
Широкое применение средств вычислительной техники требует постоянного обновления и совершенствования ПО. Выбор эффективных проектов ПО связан с их экономической оценкой и расчетом экономического эффекта.
Расчет экономического эффекта ПО основан на принципах “Комплексной оценки эффективности мероприятий, направленных на ускорение научно-технического прогресса”. Экономический эффект может определяться как у разработчика, так и у пользователя.
У разработчика экономический эффект выступает в виде чистой прибыли, остающейся в распоряжении предприятия от реализации ПО, а у пользователя - в виде экономии трудовых, материальных и финансовых ресурсов, получаемой от:
· снижения трудоемкости расчетов, алгоритмизации программирования и отладки программ (задач) за счет использования ПО в процессе разработки автоматизированных систем и систем обработки данных;
· сокращения расходов на оплату машинного времени и других ресурсов на отладку задач;
· снижения расходов на материалы (магнитные ленты, магнитные диски и прочие материалы);
· ускорения ввода в эксплуатацию новых систем;
· улучшения показателей основной деятельности предприятий в результате использования ПО.
Стоимостная оценка ПО у разработчиков предполагает составление сметы затрат, которая включает следующие статьи:
· заработная плата исполнителей основная и дополнительная;
· отчисления в фонд социальной защиты населения;
· налоги, входящие в себестоимость ПО;
· материальные;
· спецоборудование;
· машинное время;
· расходы на научные командировки;
· прочие расходов;
· накладные расходы;
На основании сметы затрат рассчитывается себестоимость и отпускная цена ПО. Сумма основной заработной платы рассчитывается на основе численности специалистов, соответствующих тарифных ставок и фонда рабочего времени. Численность специалистов, календарные сроки разработки программы и фонда рабочего времени определяются по укрупненным нормам времени на разработку, сопровождение и адаптацию программного обеспечения или экспертным путем. Расчет трудоемкости ПО с использованием укрупненных норм времени осуществляется в основном в крупных научно-технических организациях для решения сложных задач программного обеспечения ВТ. В мелких и средних научно-технических организациях трудоемкость, численность исполнителей и сроки разработки ПО определяются экспертным путем с использованием данных по базовым моделям. При определении трудоемкости ПО учитываются объем ПО (в тыс. условных машинных команд или исходных команд), объем документации (тыс. строк), новизна и сложность ПО, язык программирования, степень использования типовых (стандартных) программ.
Исходные данные
Расчет основной заработной платы исполнителей, занятых разработкой ПО, производится на основе исходных данных, представленных в таблице.
В выполнение работ задействованы следующие разработчики ПО:
· начальник отдела (руководитель дипломного проекта):
· тарифный разряд - 13;
· тарифный коэффициент - 3,98;
· продолжительность участия в разработке - 25 дней;
· инженер программист (студент дипломник):
· тарифный разряд - 9;
· тарифный коэффициент - 2,48;
· продолжительность участия в разработке - 50 дней.
программный обеспечение файловый
Таблица 5.1 - Исходные данные
Наименование показателей |
Буквенные обозначения |
Единицы измерения |
Количество |
|
Коэффициент новизны |
kн |
единиц |
1,0 |
|
Группа сложности |
единиц |
3 |
||
Дополнительный коэффициент сложности |
kсл |
единиц |
1,18 |
|
Поправочный коэффициент, учитывающий использование типовых программ |
kт |
единиц |
0,9 |
|
Установленная плановая продолжительность разработки |
Tр |
лет |
0,094 |
|
Годовой эффективный фонд времени |
Фэф |
дней |
255 |
|
Продолжительность рабочего дня |
Tч |
ч |
8 |
|
Тарифная ставка 1-го разряда |
Tм1 |
руб. |
262000 |
|
Коэффициент премирования |
kп |
единиц |
1,4 |
|
Норматив дополнительной заработной платы |
Hзд |
% |
10 |
|
Ставка отчислений в фонд социальной защиты населения |
Hзсз |
% |
35 |
|
Ставка чрезвычайного налога |
Hнч |
% |
3 |
|
Норматив на сопровождение и адаптацию ПО |
Hрса |
% |
10 |
|
Ставка налога на добавленную стоимость |
Hдс |
% |
20 |
|
Норматив амортизации ВТ |
На |
% |
12,5 |
5.1 Определение объема программного обеспечения
Объем ПО определяется путем подбора аналогов на основании классификации типов ПО, каталога функций ПО и каталога аналогов ПО в разрезе функций, которые постоянно обновляются и утверждаются в установленном порядке. На основании информации о функциях разрабатываемого ПО, по каталогу функций определяется объем функций. Затем по каталогу аналогов в разрезе функций уточняется объем функций. На основании этих данных составлена таблица 5.2.
Общий объем ПО рассчитывается по формуле 5.1:
, (5.1)
где - общий объем ПО, условных машинных команд;
- объем функций ПО, условных машинных команд;
n - общее число функций.
По формуле (5.1) определим общий объем ПО:
V0 =542 + 373 + 893 +475 + 375 + 765 + 1300 =5458 условных машинных команд.
Таблица 5.2 - Объем программного обеспечения
Номер функции |
Содержание функций |
Объем (условных машинных команд) |
|
101 |
Организация ввода / вывода |
542 |
|
203 |
Управление памятью |
373 |
|
305 |
Обработка файлов |
893 |
|
309 |
Формирование файла |
475 |
|
506 |
Обработка ошибочных и сбойных ситуаций |
375 |
|
507 |
Обеспечение интерфейса между компонентами |
765 |
|
703 |
Расчет показателей |
1300 |
5.2 Расчет трудоемкости программного обеспечения
На основании общего объема ПО определяется нормативная трудоемкость Tн по таблицам. Нормативная трудоемкость устанавливается с учетом сложности ПО. Выделяется три группы сложности, в которых учтены следующие составляющие ПО: языковой интерфейс, ввод-вывод, организация данных, режимы работы, операционная система и техническая среда. Кроме того, устанавливаются дополнительные коэффициенты сложности ПО.
С учетом дополнительного коэффициента сложности kсл (таблица 1) рассчитывается общая трудоемкость ПО (формула5.2)
, (5.2)
где То - общая трудоемкость ПО, человеко-дней;
Тн - нормативная трудоемкость ПО, человеко-дней;
kсл - дополнительный коэффициент сложности ПО.
Объему в 5458 условных машинных команд (3-я группа сложности ПО) соответствует нормативная трудоемкость 95 человеко-дней. По формуле определим общую трудоемкость ПО:
человеко-дня.
При решении сложных задач с длительным периодом разработки ПО трудоемкость определяется по стадиям разработки (техническое задание - ТЗ, эскизный проект - ЭП, технический проект - ТП, рабочий проект - РП и внедрение - ВН) с учетом новизны, степени использования типовых программ и удельного веса трудоемкости стадий разработки ПО в общей трудоемкости разработки ПО. При этом на основании общей трудоемкости рассчитывается уточненная трудоемкость с учетом распределения по стадиям (формула 5.3)
, (5.3)
где Ту - уточненная трудоемкость ПО, человеко-дней;
Тi - трудоемкость разработки ПО на i-й стадии, человеко-дней;
m - количество стадий разработки.
Трудоемкость ПО по стадиям определяется с учетом новизны и степени использования в разработке типовых программ и ПО (формула 5.4)
, (5.4)
где Tстi - трудоемкость разработки ПО на i-й стадии (технического задания, эскизного проекта, технического проекта, рабочего проекта и внедрения), человеко-дней;
kн - поправочный коэффициент, учитывающий степень новизны ПО;
kт - поправочный коэффициент, учитывающий степень использования в разработке типовых программ и ПО;
dстi - удельный вес трудоемкости i-й стадии разработки ПО в общей трудоемкости ПО.
На основании уточненной трудоемкости разработки ПО и установленного периода разработки рассчитывается общая плановая численность разработчиков ПО (формула 5.5)
, (5.5)
где Чр - плановая численность разработчиков, чел.;
Фэф - годовой эффективный фонд времени работы одного работника в течение года, дней в год;
Tрд - плановая продолжительность разработки ПО, лет.
Результаты расчетов уточненной трудоемкости и общей плановой численности разработчиков на разных стадиях разработки по формулам (5.4) и (5.5) представлены в таблице 5.3.
Таблица 5.3 - Результаты расчетов трудоемкости
Стадии разработки |
Итого |
||||||
ТЗ |
ЭП |
ТП |
РП |
ВН |
|||
Коэффициенты удельных весов трудоемкости стадий, dстi |
0,11 |
0,09 |
0,11 |
0,55 |
0,14 |
1,0 |
|
Коэффициенты, учитывающие использование типовых программ, kт |
- |
- |
- |
0,9 |
- |
- |
|
Коэффициенты новизны, kн |
1,0 |
1,0 |
1,0 |
1,0 |
1,0 |
- |
|
Уточняющая трудоемкость Tу стадий, человеко-дней |
13 |
11 |
13 |
58 |
17 |
112 |
|
Численность Чр исполнителей, чел. |
1,8 |
1,8 |
1,8 |
1,9 |
1,9 |
1,8 |
|
Срок Tр разработки, лет |
0,026 |
0,026 |
0,026 |
0,13 |
0,03 |
0,24 |
Например, по формуле (5.4) определим уточненную трудоемкость на стадии рабочего проекта
человеко-дней.
Например, по формуле (5.5) определим общую плановую численность разработчиков на стадии рабочего проекта
чел.
5.3 Расчет заработной платы разработчиков программного обеспечения
Уточненная трудоемкость и общая плановая численность разработчиков служат базой для расчета основной заработной платы. По данным о спецификации и сложности выполняемых функций составляется штатное расписание группы специалистов-исполнителей, участвующих в разработке ПО с определением образования, специальности, квалификации и должности.
В соответствии с тарифными разрядами и коэффициентами должностей руководителей научных организаций каждому исполнителю устанавливается разряд и тарифный коэффициент.
Месячная тарифная ставка каждого исполнителя Тм определяется путем умножения действующей месячной тарифной ставки 1-го разряда Тм1 на тарифный коэффициент Тk, соответствующий установленному разряду (формула5.6)
. (5.6)
Часовая тарифная ставка рассчитывается путем деления месячной тарифной ставки на установленный при семичасовом рабочем дне фонд рабочего времени - 169,8 часов (формула 36)
, (5.7)
где Т ч - часовая тарифная ставка, ден. ед.;
Т м - месячная тарифная ставка, ден. ед.
По формулам (5.6) и (5.7) определим месячные и тарифные ставки начальника отдела (Tмо, Tчо) и инженера программиста 1-й категории (Tмп, Tчп)
Tmo=262000*3.98=1042760 рублей;
Tчо = 1042760/169,8 =6141,107 рублей;
Tмп=262000*2,48 = 649760рублей;
Tчп =649760/169,8 = 3826,62рублей.
Основная заработная плата исполнителей ПО рассчитывается по формуле 5.8
, (5.8)
где n - количество исполнителей, занятых разработкой ПО;
Тчi - часовая тарифная ставка i-го исполнителя, ден. ед.;
Фэi - эффективный фонд рабочего времени i-го исполнителя, дней;
Тч - количество часов работы в день, ч;
kп - коэффициент премирования.
По формуле (37) определим основную заработную плату исполнителей ПО
Зоi=(6141,107 *1*25*1,4) + (3826,62*4*50*1,4) = 214938,78+ 1071453,6=
=1286392,38 рублей.
Дополнительная заработная плата на ПО Здi включает выплаты, предусмотренные законодательством о труде (оплата, отпусков, льготных часов, времени выполнения государственных обязанностей и других выплат, не связанных с основной деятельностью исполнителей), и определяется по нормативу в процентах к основной заработной плате (формула 5.9)
, (5.9)
где Здi - дополнительная заработная плата исполнителей ПО, ден. ед.;
Нд - норматив дополнительной заработной платы в целом по научной организации
По формуле (5.9) определим дополнительную заработную плату на ПО
Здi = (1286392,38 *10)/100 = 128639,238 руб.
5.4 Расчет отчислений, налогов и затрат
Отчисления в фонд социальной защиты населения Зсзi определяются в соответствии с действующими законодательными актами по нормативу в процентном отношении к фонду основной и дополнительной заработной платы исполнителей (формула 5.10).
, (5.10)
где Нзсз - норматив отчислений в фонд социальной защиты населения, %.
По формуле (5.10) определим отчисления в фонд социальной защиты населения.
Зсзi=(1286392,38 + 128639,238)*35/100 = 495261,06 рублей.
Расходы по статье “спецоборудование” Pci включают затраты средств на приобретение вспомогательных специального назначения технических и программных средств, необходимых для разработки ПО, включая расходы на их проектирование, изготовление, отладку, установку и эксплуатацию. Затраты по этой статье определяются в соответствии со сметой расходов, которая составляется перед разработкой ПО. Данная статья включается в смету расходов на разработку ПО в том случае, когда приобретаются специальное оборудование или специальные программы, предназначенные для разработки и создания только данного ПО.
В небольших научных организациях и на малых предприятиях, где ОПФ являются лишь средства ВТ, амортизационные отчисления на ПО Аoi можно определить прямым счетом по формуле 5.11:
, (5.11)
где Аoi - амортизационные отчисления по конкретному средству ВТ в расчете на год, ден. ед.;
Тф - фактический срок использования основной ВТ (здесь равен 110 дней или 0,3 года);
Псi - первоначальная стоимость ВТ.
По формуле (6.1) определим сумму амортизационных отчислений
рублей
Расходы на электроэнергию при 8-ми часовом рабочем дне, продолжительности разработки в 50 дней, цене 1217 рублей за один кВт и потребляемой компьютером мощности в размере 200 Вт в час составят:
РЭ =
Расходы по статье “прочие затраты” Пзi на ПО включают затраты на приобретение и подготовку специальной научно-технической информации и специальной литературы. Определяются по нормативу, разрабатываемому в целом по научной организации, в процентах к основной заработной плате (формула 5.12)
, (5.12)
где Hпз - норматив прочих затрат в целом по научной организации, %.
По формуле (5.12) определим прочие затраты
Пзi= (1286392,38 *3)/100 = 38591,77 рублей.
Общая сумма расходов по всем статьям сметы Срi на ПО рассчитывается по формуле 5.13
, ден. ед. (5.13)
где Mi = 5000 - затраты на бумагу;
По формуле (5.13) определим общую сумму расходов
Cpi=1286392,38+128639,238+495261,06+5000+56250++38591,77=2058814,449 рублей.
Кроме того, организация-разработчик осуществляет затраты на сопровождение и адаптацию ПО Pсаi (формула 5.14), которые определяются по нормативу Hрса
, (5.14)
где Hрса - норматив расходов на сопровождение и адаптацию, %.
По формуле (5.14) определим расходы на сопровождение и адаптацию
Рcai = 2058814,449*10/100=205881,4449 рублей.
5.5 Расчет себестоимости, отпускной цены и прибыли
Общая сумма расходов на разработку (с затратами на сопровождение и адаптацию) как полная себестоимость ПО Спi определяется по формуле 5.15
, ден. ед. (5.15)
По формуле (5.15) определим полную себестоимость ПО
Сni= 2058814,449+205881,4449= 2264695,894 рублей.
Рентабельность и прибыль по создаваемому ПО определяются исходя из результатов анализа рыночных условий, переговоров с заказчиком (потребителем) и согласования с ним отпускной цены, включающей дополнительно налог на добавленную стоимость. Прибыль рассчитывается по формуле 5.16
, (5.16)
где Прi - прибыль от реализации ПО заказчика, ден. ед.;
Урпi - уровень рентабельности ПО, принимаем 25 %;
Спi - себестоимость ПО, ден. ед.
По формуле (5.16) определим прибыль от реализации создаваемого ПО
Пpi= 2264695,894 *25/100 = 566173,97 рублей.
В цену ПО включается налог на добавленную стоимость, который рассчитывается по нормативу, установленному действующим законодательством, в процентах к общей сумме добавленной стоимости (формула 5.17)
, (5.17)
где Ндсi - налог на добавленную стоимость, ден. ед.;
Дсi - добавленная стоимость, ден. ед.;
Нндс - норматив налога на добавленную стоимость, %.
Действующим законодательством предусмотрены льготы по налогу на добавленную стоимость. От налога на добавленную стоимость освобождается реализация научно-исследовательских работ, которые выполняются на основе хозяйственных договоров для потребителей Республики Беларусь, работы и услуги учебно-опытных участков и учебных хозяйств, учреждений образования и другие работы.
Добавленная стоимость на ПО рассчитывается по формуле 5.18
, (5.18)
На реализацию создаваемого ПО льготы по налогу на добавленную стоимость Ндсi не распространяются. В связи с этим добавленная стоимость на ПО определяется по формуле (5.18)
ДСi=1286392,38 +128639,238+495261,06+56250+566173,97 = 2532716,643 рублей
По формуле (5.17) определим налог на добавленную стоимость
Ндсi=2532716,643 *20/100 = 506543,32 рублей.
Прогнозируемая отпускная цена ПО представляет собой сумму себестоимости, прибыли и налога на добавленную стоимость (формула 5.19)
ден. ед. (5.19)
По формуле (5.19) определим прогнозируемую отпускную цену ПО
Цoi= 2264695,894 +566173,97 +506543,32 = 3337413,194 рублей.
Прибыль от реализации ПО остается организации, разработчику и предоставляет собой эффект от создания нового программного обеспечения вычислительной техники.
6. Экспертный метод оценки условий труда
Условия труда определяются совместным действием большого числа факторов: технических, санитарно-гигиенических, организационных и др. Для разработки наиболее эффективных мероприятий по улучшению условий труда часто требуется установить значение отдельных факторов. Знание степени влияния тех или иных факторов на условия труда позволяет более успешно решать задачи предупреждения производственного травматизма и профессиональных заболеваний, повышения производительности труда.
Сложность оценки условий труда состоит в том, что определяющие их факторы в ряде случаев не поддаются количественному измерению либо измеряются косвенным путем. Такие факторы, как недостатки в организации работ, слабая трудовая дисциплина, сложность работы в ночное время, удобство пользования приспособлениями, отсутствие средств защиты и другие, прямых измерителей не имеют и оцениваются качественными показателями. Факторы, оцениваемые количественно, например уровни шума, освещенности, вибраций, имеют разные измерители, не позволяющие непосредственно ответить на вопрос, влияние какого из факторов сказывается на условиях труда наиболее неблагоприятного. Поэтому для исследования и практического решения целого ряда задач охраны труда в последние годы широко применяют экспертный метод, основанный на обобщении многолетнего опыта наиболее квалифицированных специалистов в той или иной области охраны труда на железнодорожном транспорте.
Для проведения экспертного анализа необходимо прежде всего определить его цель. Правильно сформулированная цель позволит избежать неконкретных оценок и получить объективные результаты. Далее требуется определить и четко сформулировать вопросы, на которые должны ответить эксперты. Вопросы - перечень факторов - помещают в анкету (экспертный лист), в которой указывают условия ответов. Чтобы избежать «навязывания» эксперту предопределенного результата, вопросы располагаются в случайной последовательности. Для получения такой последовательности могут быть использованы таблицы равномерно распределенных случайных чисел (таблицы 6.1;6.2).
Таблица 6.1 - Таблица равномерно распределенных случайных чисел
Технические факторы |
Rij |
?Rij |
||
1 2 3 4 5 6 7 8 9 10 11 12 |
Недостаточно контрастная окраска подвижного состава Выступающие за габарит подвижного состава детали вагонов и груза Отсутствие благоустроенных переходов через пути Недостаточная эффективность тормозных средств подвижного состава Недостатки станционной технологической связи, вызывающие необходимость частых переходов через пути Неровное и скользкое основание под вагоном в рабочей зоне Несовершенство сигнализации и оповещения о приближении подвижного состава Неиспользование переходов через пути из-за неудобного их размещения Наличие негабаритных мест в рабочей зоне Неудобное размещение служебных помещений на станции Недостаточный обзор при управлении из кабины локомотива Недостаточный обзор при наблюдении за свободностью пути с подножки вагона |
11 9 3 10 2 6 5 7 1 4 8 12 |
81 56 32 81 41 58 74 24 68 38 76 72 |
Важным этапом экспериментального анализа является формирование групп экспертов. Каждый эксперт должен быть достаточно компетентен в оценке рассматриваемых вопросов. Для оценки компетентности используют различные методы, наиболее простым из которых является изучение сведений о производственном опыте и квалификации эксперта. В ряде случаев формируют группы экспертов, имеющих разное отношение к оценке условий труда, - исполнителей, организаторов работ, представителей органов надзора за охраной труда.
Одним из наиболее распространенных в экспертном методе является способ ранговых оценок. При заполнении анкеты эксперт присваивает фактору, оказывающему наибольшее влияние на условия труда, самый высокий ранг - 1, другим факторам - ранги 2, 3 и т.д. по мере убывания их влияния.
В качестве примеров в таблицах 6.1 и 6.2 приведены результаты заполнения анкет i-м экспертом (i= 1, ... 9) при оценке факторов безопасности труда на сортировочной станции.
Так же приведены суммы рангов каждого фактора ?Rij
Таблица 6.2 - Таблица равномерно распределенных случайных чисел
Организационно -технологические факторы |
Rij |
?Rij |
||
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Потери бдительности при переходе через пути в зоне движения неуправляемых отцепов Внезапные толчки стоящих поездов в момент их технологической обработки Недостаточный обзор в рабочей зоне Несогласованность действий исполнителей и организаторов работ Внезапные толчки стоящих составов при переходе через пути, занятые подвижным составом Неправильная оценка опасной ситуации машинистом локомотива Недостаточная квалификация работников и незнание ими местных условий станции Нарушение правил перехода через пути Поспешные действия при переходе через путь Недостатки в организации технологии работы станции Недооценка опасности движущегося подвижного состава Внезапные толчки вагонов при переходе через путь между группами вагонов Невосприятие опасности на фоне помех Недостаточный контроль за выполнением требований безопасности Нарушение установленного порядка ограждения работ Нарушение правил подачи оповестительных сигналов |
1 13 5 2 12 15 11 6 7 10 3 16 8 4 9 14 |
12 52 87 27 84 117 112 30 48 117 92 93 100 34 5 43 |
При заполнении анкет может оказаться, что эксперт присвоил разным факторам одинаковые ранги. В этом случае при обработке анкет ранги нормализуют суммы рангов в каждом экспертном листе должна быть равна
?Rij=n(n + 1)/2. (сумма рангов)
j=1
где n - число факторов;
j - номер фактора;
Rij - ранг фактора по оценке 1- го эксперта.
Это требование выполняется, если всем факторам имеющим совпавшие ранги, присвоить одинаковые, в том числе и дробные ранги, которые численно равны среднему значению мест этих факторов в экспертном листе.
На основании анкет, заполненных m экспертами, составляется матрица рангов
Ri1 Ri2....Rij.... R1n
?Rij= Rji Rj2.... Rij.... Rjn
Rm1 Rm2....Rmj....Rmn
где Rij - ранг. присвоенный i-м экспертом j-му фактору (i=1, ..., m; j=1,...n).
Итоговую оценку влияния j-го фактора устанавливают на основе подсчета суммы ?Rij рангов по столбцам. Самым влиятельным фактором признается тот, у которого сумма рангов наименьшая. Располагая факторы в порядке возрастания суммы их рангов, получают диаграмму рангов, которая может явиться основанием для последующего принятия решений.
Результаты, полученные способом ранговых оценок, можно использовать только в том случае, если имеется достаточная согласованность мнений экспертов. Согласованность мнений определяют с помощью коэффициента конкордации W, рассчитываемого по формуле
n
12?dj2
j=1
W=------------ n
m2(n3 - n)- m ?Ti
j=1
При этом
m
dj= ? R ij - 0,5m(n+1);
i=1
u
Ti= ? (tu3 - tu),
k=1
где u - число групп факторов, которые имеют совпавшие ранги в экспертном листе i-го эксперта;
k - номер группы с совпавшими рангами, k=1, 2;
tu - число факторов с совпавшими рангами в группе с номером k в экспертном листе j-го эксперта.
Если в анкетах экспертов отсутствуют совпавшие ранги, то естественно
m
? Ti =0.
i=1
Коэффициент конкордации может принимать значения от 0 до 1. При значении W=0 не существует связи между оценками экспертов, т.е. нет согласованности их мнений. Значение W=1 свидетельствует о наличии полной согласованности. Изменению коэффициента конкордации от 0 до 1 соответствует повышению степени согласованности мнений экспертов. В примерах рассмотренных в табл.6.1 и 6.2 значения W соответственно равны 0,4 и 0,6.
Для оценки значимости вычисленных значений W используют критерий согласия z2 . Из математической статистики известно, что величина m(n-1) W соответствует z2 - распределению с (n-1) степенью свободы. Распределение случайных величин z2 характеризует случайные отклонения сумм квадратов нормально распределенной величины с нулевым математическим ожиданием. Если задать некоторый уровень значимости q, то с вероятностью (1-q) текущее значение z2 ? z42 соответствуют случайным отклонениям. Если окажется, что значения z2 > z42 , то с вероятностью (1-q), можно утверждать, что обнаруженные отклонения от нуля не случайны и не описываются распределением z2 .
Задавшись уровнем значимости, например q=0,05, по таблицам 6.1 и 6.2
z2 - распределения определяют z42 соответствующие (n-1) степени свободы.
Значение коэффициента конкордации существенно отличается от нуля, если m(n-1)W > z42 . В таком случае следует признать, что согласованность экспертов достаточно и с вероятностью (1-q) не может определяться случайными совпадениями оценок.
В первом из рассмотренных примеров имеем z2 =39,4, во втором z2=81,1. Следовательно, значимость вычисленных значений коэффициента конкордации подтверждается.
При определении согласованности групповых оценок используют коэффициент корреляции рангов p, рассчитывается по формуле
n
6?d2j
j=1
p= 1- ------------ ,
m 3 - n
где dj = Ri - Rj - расхождение групповых оценок;
Ri Rj - соответственно ранги j-го фактора по оценкам, полученным в первой и во второй группах.
Коэффициент корреляции рангов изменяется от -1 до +1. При p= +1 имеет место однозначная и полная согласованность групповых оценок, при p=-1 оценки полностью противоположны. Если 0?p? 1, имеет место положительная корреляция. Групповые оценки можно признать согласованными, если значение коэффициента корреляции рангов существенно отличается от нуля.
Опыт применения способа ранговых оценок показал его пригодность для решения многих задач по охране труда. Недостатком этого способа является то, что с увеличением числа рассматриваемых факторов до 15-20 эксперты, как правило, испытывают затруднения в присвоении рангов.
Как недостаток следует отметить и отсутствие сопоставимой количественной шкалы качественных оценок. От такого недостатка свободен способ бальных оценок, при котором заранее, на стадии разработки анкеты опроса экспертов, устанавливают шкалу баллов. При этом максимальный балл присваивают наиболее неблагоприятному фактору условий труда. Каждый j-й фактор (j=1,.....,n) получает от i-го эксперта (i=1,...,m) бальную оценку qij.
При использовании бальных оценок следует иметь в виду возможность систематического их завышения или занижения отдельными экспертами. Для нейтрализации влияния заниженных или завышенных оценок на результаты исследования условий труда оценки экспертов умножают на весовой коэффициент b. Для i-го эксперта он составит
n
bi=1/?qij
j=1
Очевидно, что чем выше совокупность бальных оценок i-го эксперта, тем ниже его весовой коэффициент. Приведенные бальные оценки i-го эксперта щ ij определяют в виде произведения щij =biqj.
Итоговые сравнительные оценки j-го фактора рассчитывают суммированием оценок щij . После того как итоговые сравнительные оценки будут найдены, проводят ранжирование факторов, располагая их по мере убывания итоговых оценок. Согласованность мнений экспертов оценивают с использованием коэффициента конкордации W.
Способ бальных оценок эффективен при сравнительном анализе преимуществ и недостатков различных вариантов технических решений улучшения условий труда. Однако при анализе большого числа вариантов эксперты, как и в случае использования способа ранговых оценок. испытывают затруднения с ранжированием факторов.
При необходимости более четкого ранжирования применяют способ парных сравнений. Экспертам предлагают анкету с перечнем факторов, каждый из которых следует сравнить со всеми остальными. Результаты сравнения эксперты записывают в матрицу, подобную таблице шахматного турнира. Если, например эксперт считает, что фактор, указанный в первой строке, имеет большее влияние, чем фактор, указанный во втором столбце, то на пересечении первой строки и второго столбца он ставит цифру 1. В противном случае эксперт ставит 0. Если сравниваемые факторы равноценны по влиянию, то он должен проставить знак 1/2.
При сравнении следует иметь в виду возможность нарушения транзитивности, когда в результате парного сравнения оказывается, что i-й фактор влиятельнее j-го, j-й сильнее k-го, а k-й в свою очередь более влиятелен, чем i-й. В таких случаях проводят дополнительные вычисления и последовательными приближениями находят итоговые оценки факторов.
Как указывалось, сравнительную оценку rij пары i-го и j-го факторов варьируют в трех условиях: rij=1; rij=0; rij=0,5. Пусть из общего числа m экспертов i-му фактору отдали предпочтение m i специалистов. Число экспертов, считывающих i-й и j-й факторы равноценными, равно m n . И наконец j-му фактору отдали предпочтение m j экспертов. При этих условиях оценка математического ожидания величины rij составит
1 mi +0,5mn +0mj mi 0,5mn
Е(rij)= ------------ = ------ + ------,
m m m
а величины rij
mj 0,5mn
Е(rij)= ---- + ------,
m m
Очевидно, что сумма математических ожиданий Е(rij)+ Е(rij)=1, а
mi -mj
их разность Е(rij)-Е(rij)= ------.
m
Отсюда
1 mi -mj
Е(rij)= ---- + ------ (i, j=1,...., n).
2 2m
Совокупность E(rij) образует матрицу А=[ E(rij)]i, j=1,...,n. На основе этой матрицы определяют относительную важность факторов. Для каждого фактора находят коэффициенты ki,..., kn относительной важности, которые в совокупности можно рассматривать как координаты вектора k.
Координаты собственного вектора матрицы. А есть коэффициенты относительной важности. Координаты вектора k вычисляют последовательными приближениями
1
ki=----Aki-1,
Јi
где i=1,2...номер итерации;
ki=(ki1,...., kin) - вектор коэффициентов относительной важности;
Јi - нормирующий коэффициент. определяемый из выражения
n n
Јi= ? ? E (rij)kji-1
i=1 j=1
Последовательные приближения производят до тех пор, пока значения Јi и ki не окажутся близкими к Јi-1 iи ki-1.
Вычисления коэффициентов относительной важности позволяют не только провести ранжировку, но и построить шкалу количественных оценок. Наиболее влиятельным считают фактор с наибольшим коэффициентом относительной важности. Ранжировку факторов выполняют по цепочке неравенств k1>k2>...>kn.
Экспертный метод оценки условий труда является наиболее сложным и трудоемким способом. Результаты математической обработки результатов экспертного анализа служат основанием для разработки целенаправленных мероприятий по улучшению условий труда.
Заключение
В данном дипломном проекте реализована возможность генерации каталога продукции предприятия в реальном времени в виде файла MS Excel.
Каталог позволяет наглядно предоставить актуальную информацию для пользователя. Что в свою очередь улучшает качество отношений между предприятием и клиентами, позволяет организовывать процесс учета продукции в электронном виде, а также позволяет избежать искажения информации при передаче конечному пользователю.
В ходе работы над проектом были изучены язык программирования PHP, СУБД MySQL. Рассмотрены форматы XLSX, XML, сервер Apache. Также был проведен анализ существующих систем управления контентом.
В рамках главы, относящейся к охране труда, в дипломном проекте рассмотрены экспертный метод оценки условий труда.
В рамках экономической части дипломного проекта выполнен расчет стоимости разработки программного обеспечения, а также выполнен расчет заработной платы разработчика программного обеспечения.
Список импользуемых источников
1. В. Васвани. MySQL: использование и администрирование = MySQL Database Usage & Administration. -- М.: «Питер», 2011. -- 368 с. -- ISBN 978-5-459-00264-5
2.Кузнецов Максим, Симдянов Игорь. MySQL на примерах. -- Спб.: «БХВ-Петербург», 2008. -- С. 952. -- ISBN 978-5-9775-0066-1
3. Стив Суэринг, Тим Конверс, Джойс Парк. PHP и MySQL. Библия программиста, 2-е издание = PHP 6 and MySQL 6 Bible. -- М.: «Диалектика», 2010. -- С. 912. -- ISBN 978-5-8459-1640-2
4. Кузнецов Максим, Симдянов Игорь. PHP . Практика создания Web-сайтов. -- 2-е изд. перераб. и доп. -- Спб.: «БХВ-Петербург», 2008. -- С. 1264. -- ISBN 978-5-9775-0203-0
5. Роберт Шелдон, Джоффрей Мойе. MySQL 5: базовый курс = Beginning MySQL. -- М.: «Диалектика», 2007. -- 880 с. -- ISBN 978-5-8459-1167-4
6. Поль Дюбуа. MySQL, 3-е издание = MySQL, 3ed. -- М.: «Вильямс», 2006. -- 1168 с. -- ISBN 5-8459-1119-2
7. Дмитрий Котеров, Алексей Костарев. PHP. В подлиннике. -- Спб.: «БХВ-Петербург», 2005. -- С. 1120. -- ISBN 5-94157-245-Х
8. Мэтт Зандстра. PHP: объекты, шаблоны и методики программирования, 3-е издание = PHP Objects, Patterns and Practice, Third Edition. -- М.: «Вильямс», 2010. -- С. 560. -- ISBN 978-5-8459-1689-1
9. Кристиан Дари, Эмилиан Баланеску. PHP и MySQL: создание интернет-магазина = Beginning PHP and MySQL E-Commerce: From Novice to Professional. -- М.:«Вильямс», 2010. -- ISBN 978-5-8459-1602-0
10. Джейсон Ленгсторф. PHP и jQuery для профессионалов = Pro PHP and jQuery. -- М.: «Вильямс», 2010. -- С. 352. -- ISBN 978-5-8459-1693-8
11. Кузнецов Максим, Симдянов Игорь. Самоучитель MySQL 5. -- Спб.: «БХВ-Петербург», 2006. -- С. 560. -- ISBN 5-94157-754-0
12. Кузнецов Максим, Симдянов Игорь. MySQL 5. В подлиннике. -- Спб.: «БХВ-Петербург», 2006. -- С. 1024. -- ISBN 5-94157-928-4
13. Костарев А. Ф. PHP 5. -- Спб.: «БХВ-Петербург», 2008. -- С. 1104. -- ISBN 978-5-9775-0315-0
14. Квентин Зервас. Web 2.0: создание приложений на PHP = Practical Web 2.0 Applications with PHP. -- М.: «Вильямс», 2009. -- С. 544. -- ISBN 978-5-8459-1590-0
15. Эд Леки-Томпсон, Алек Коув, Стивен Новицки, Хьяо Айде-Гудман. PHP 5 для профессионалов = Professional PHP 5. -- М.: «Диалектика», 2006. -- С. 608. -- ISBN 0-7645-7282-2
Приложение А
(обязательное)
ЛИСТИНГ ГЕНЕРАТОРА КАТАЛОГА ПРОДУКЦИИ ПРЕДПРИЯТИЯ
index.php
<?php
set_include_path(get_include_path() . PATH_SEPARATOR .
'Classes/');
require_once 'PHPExcel.php';
require_once 'PHPExcel/IOFactory.php';
/*define('DATE', 'Прайс сформирован:');
define('NAME', 'Название');
define('PRICE', 'Цена');
define('NUMBER', 'Номер');
*/
$eWriter = new ExcelWriter('localhost', 'root', '', 'catalogesm');
class ExcelWriter
{
const MIN_ROW = 8;
private $objPHPExcel;
private $activeSheetIndex;
private $row;
private $mProductName = array(
'alignment' => array(
'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
'vertical' => PHPExcel_Style_Alignment::VERTICAL_BOTTOM
),
'font' => array(
'name' => 'Tahoma',
'size' => '10',
'bold' => false,
'color' => array('argb' => 'FF333333')
),
);
private $mDescription = array(
'alignment' => array(
'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER
),
'font' => array(
'name' => 'Tahoma',
'size' => '8',
'bold' => false,
'color' => array('argb' => 'FF333333')
)
);
private $borderOutline = array(
'borders' => array(
'outline' => array(
'style' => PHPExcel_Style_Border::BORDER_THIN,
)
)
);
private $h2Style = array(
'font' => array(
'name' => 'Tahoma',
'size' => '9',
'bold' => true,
'color' => array('argb' => 'FF333333')
),
'alignment' => array(
'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
'vertical' => PHPExcel_Style_Alignment::VERTICAL_TOP
),
'fill' => array(
'type' => PHPExcel_Style_Fill::FILL_SOLID,
'startcolor' => array('argb' => 'FFC4C4C4')
)/*,
'borders' => array(
'outline' => array(
'style' => PHPExcel_Style_Border::BORDER_THIN,
),
'bottom' => array(
'style' => PHPExcel_Style_Border::BORDER_THIN,
)
)*/
);
public function __construct($hostname, $username, $password, $dbName)
{
$this->objPHPExcel = new PHPExcel();
$this->activeSheetIndex = 0;
$this->row = self::MIN_ROW;
mysql_connect($hostname, $username, $password) OR DIE('Не могу создать соединение с базой данных.');
mysql_select_db($dbName) or die(mysql_error());
$this->getParentCategory(2, false);
$this->writeExcelFile();
}
private function setHeader()
{
$iDrawing = new PHPExcel_Worksheet_Drawing();
$iDrawing->setPath('images/header_logo.png');
$iDrawing->setCoordinates('A1');
$iDrawing->setWorksheet($this->objPHPExcel->getActiveSheet());
$this->objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);
$this->objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(60);
$this->objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(15);
}
private function getParentCategory($category, $parent)
{
$name_query = 'SELECT name FROM ps_category_lang WHERE id_category=' . $category;
$name_query_result = mysql_query($name_query) or die(mysql_error());
$res2 = mysql_fetch_array($name_query_result);
if (!$parent) {
$this->objPHPExcel->createSheet($this->activeSheetIndex);
$this->objPHPExcel->setActiveSheetIndex($this->activeSheetIndex);
$str = iconv('windows-1251', 'utf-8', $res2['name']);
$this->objPHPExcel->getActiveSheet()->setTitle($str);
$this->activeSheetIndex++;
$this->row = self::MIN_ROW;
$this->setHeader();
echo '<h1>' . $res2['name'] . '</h1><br />n';
} else {
echo '<h2>' . $res2['name'] . '</h2><br />n';
$str = iconv('windows-1251', 'utf-8', $res2['name']);
$this->objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, $this->row, $str);
$this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(0, $this->row)->applyFromArray($this->h2Style)->applyFromArray($this->borderOutline);
$this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(1, $this->row)->applyFromArray($this->borderOutline);
$this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(2, $this->row)->applyFromArray($this->borderOutline);
$this->objPHPExcel->getActiveSheet()->mergeCellsByColumnAndRow(0, $this->row, 2, $this->row);
$this->row++;
}
$parent_query = 'SELECT id_category FROM ps_category WHERE id_parent =' . $category;
$result = mysql_query($parent_query) or die(mysql_error());
while ($res = mysql_fetch_array($result)) {
if ($category != 2) {
$this->getParentCategory($res['id_category'], true);
} else {
$this->getParentCategory($res['id_category'], false);
}
}
$product_query = 'SELECT b.name, b.description_short, c.id_image, d.price FROM ps_category_product a, ps_product_lang b, ps_image c, ps_product d WHERE a.id_product = b.id_product AND a.id_product = c.id_product AND a.id_product = d.id_product AND b.id_lang = 7 AND c.cover = 1 AND a.id_category =' . $category;
$product_query_result = mysql_query($product_query) or die(mysql_error());
while ($res3 = mysql_fetch_array($product_query_result)) {
echo '<p>' . $res3['name'] . '</p>n';
$name = iconv('windows-1251', 'utf-8', $res3['name']);
$image = iconv('windows-1251', 'utf-8', $res3['id_image']);
$price = iconv('windows-1251', 'utf-8', $res3['price']);
// Currency
$price = round($price * 8700);
$description_short = iconv('windows-1251', 'utf-8', $res3['description_short']);
$this->objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(0, $this->row, $name);
$this->objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow(1, $this->row, $description_short);
$this->objPHPExcel->getActiveSheet()->setCellValueExplicitByColumnAndRow(2, $this->row, $price, PHPExcel_Cell_DataType::TYPE_NUMERIC);
$this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(0, $this->row)->applyFromArray($this->mProductName)->getAlignment()->setWrapText(true);
$this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(1, $this->row)->applyFromArray($this->mDescription)->getAlignment()->setWrapText(true);
$this->objPHPExcel->getActiveSheet()->getStyleByColumnAndRow(2, $this->row)->applyFromArray($this->mDescription)->getNumberFormat()->setFormatCode('#,## руб');
$this->getProductImage($image);
$this->row++;
}
}
private function getProductImage($id){
$t = 1;
$x = $id;
$tmp[] = NULL;
while($x != 0){
$tmp[] = $x % ($t * 10);
$x = (int)($x / 10);
}
$path = '../shop1/img/p/';
foreach (array_reverse($tmp) as $value) {
$path .= $value.'/';
}
$path .= $id.'-home_default.jpg';
echo '<img src=''.$path.'' />';
$iDrawing = new PHPExcel_Worksheet_Drawing();
$iDrawing->setPath($path);
$iDrawing->setCoordinates('A'.$this->row);
$iDrawing->setOffsetY(10);
$iDrawing->setOffsetX(10);
$iDrawing->setWorksheet($this->objPHPExcel->getActiveSheet());
$this->objPHPExcel->getActiveSheet()->getRowDimension($this->row)->setRowHeight($iDrawing->getHeight());
}
public function writeExcelFile()
{
$objWriter = PHPExcel_IOFactory::createWriter($this->objPHPExcel, 'Excel2007');
$objWriter->save('price.xlsx');
}
}
?>
products.php
<?php
Error_Reporting(E_ALL & ~E_NOTICE);
define('DEBUG', false);
define('_PS_DEBUG_SQL_', false);
define('PS_SHOP_PATH', 'catalog.esm.by');
define('PS_WS_AUTH_KEY', 'HNY7LS6196SK1P656HMW4ELY6OMIHGE7');
set_include_path('Classes/');
require_once 'Classes/PSWebServiceLibrary.php';
require('../config/config.inc.php');
include('db_conn.php');
set_time_limit(300);
class Products
{
private $last_p_manufacture = '';
private $last_id_manufacture = 0;
private $last_p_category = '';
private $last_id_category = 0;
private $last_id_category_par = 0;
private $last_id_category_par_par = 0;
public function glob_files($path){
$file_size = filesize($path);
$FILES = glob(_PS_DOWNLOAD_DIR_.'/*');
foreach($FILES as $key => $file){
if( filesize( $file ) == $file_size ){
if (md5_file($path) == md5_file($file)){
return ($file);
}
}
}
return (false);
}
public function encodestring($string)
{
$table = array(
'А' => 'A',
'Б' => 'B',
'В' => 'V',
'Г' => 'G',
'Д' => 'D',
'Е' => 'E',
'Ё' => 'YO',
'Ж' => 'ZH',
'З' => 'Z',
'И' => 'I',
'Й' => 'J',
'К' => 'K',
'Л' => 'L',
'М' => 'M',
'М' => 'N',
'О' => 'O',
'П' => 'P',
'Р' => 'R',
'С' => 'S',
'Т' => 'T',
'У' => 'U',
'Ф' => 'F',
'Х' => 'H',
'Ц' => 'C',
'Ч' => 'CH',
'Ш' => 'SH',
'Щ' => 'CSH',
'Ь' => '',
'Ы' => 'Y',
'Ъ' => '',
'Э' => 'E',
'Ю' => 'YU',
'Я' => 'YA',
'а' => 'a',
'б' => 'b',
'в' => 'v',
'г' => 'g',
'д' => 'd',
'е' => 'e',
'ё' => 'yo',
'ж' => 'zh',
'з' => 'z',
'и' => 'i',
'й' => 'j',
'к' => 'k',
'л' => 'l',
'м' => 'm',
'н' => 'n',
'о' => 'o',
'п' => 'p',
'р' => 'r',
'с' => 's',
'т' => 't',
'у' => 'u',
'ф' => 'f',
'х' => 'h',
'ц' => 'c',
'ч' => 'ch',
'ш' => 'sh',
'щ' => 'csh',
'ь' => '',
'ы' => 'y',
'ъ' => '',
'э' => 'e',
'ю' => 'yu',
'я' => 'ya',
);
$output = str_replace(
array_keys($table),
array_values($table),$string
);
return $output;
}
public function Attachment($id_for_attach,$p_name, $doc_path, $id_product){
if(file_exists($doc_path.$id_for_attach.'.pdf')){
$mime = 'application/pdf';
$path = $doc_path.$id_for_attach.'.pdf';
$type = '.pdf';
filetype($path);
}
elseif(file_exists($doc_path.$id_for_attach.'.doc')){
$mime = 'application/msword';
$path = $doc_path.$id_for_attach.'.doc';
$type = '.doc';
}
elseif(file_exists($doc_path.$id_for_attach.'.docx')){
$mime = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
$path = $doc_path.$id_for_attach.'.docx';
$type = '.docx';
}
elseif(file_exists($doc_path.$id_for_attach.'.rar')){
$mime = 'application/octet-stream';
$path = $doc_path.$id_for_attach.'.rar';
$type = '.rar';
}
elseif(file_exists($doc_path.$id_for_attach.'.zip')){
$mime = 'application/x-zip-compressed';
$path = $doc_path.$id_for_attach.'.zip';
$type = '.zip';
}
else{
echo 'Не удалось найти приложение - ';
return;
}
$comparison_file = $this->glob_files($path);
$p_name_download = $this->encodestring($p_name);
echo $p_name_download;
if ($comparison_file == TRUE){
$comparison_file = basename($comparison_file);
$attachment = new Attachment();
$attachment->name[7] = 'Паспорт '.$p_name.$type;
$attachment->file = $comparison_file;
$attachment->mime = $mime;
$attachment->file_name = $p_name_download.$type;
$attachment->add();
$attachment->attachProduct($id_product);
$attach_query = 'SELECT id_attachment FROM ps_attachment_lang WHERE name LIKE 'Паспорт '.$p_name.$type.''';
$attach_query_result = mysql_query($attach_query) or die(mysql_error());
$attach_query_par = mysql_fetch_array ($attach_query_result);
$attachment->attachToProduct($id_product, $attach_query_par);
}
else{
do $uniqid = sha1(microtime());
while (file_exists(_PS_DOWNLOAD_DIR_.$uniqid));
if (copy($path, _PS_DOWNLOAD_DIR_.$uniqid)){
if (isset($uniqid))
{
$attachment = new Attachment();
$attachment->name[7] = 'Паспорт '.$p_name.$type;
$attachment->file = $uniqid;
$attachment->mime = $mime;
$attachment->file_name = $p_name_download.$type;
$attachment->add();
$attachment->attachProduct($id_product);
$attach_query = 'SELECT id_attachment FROM ps_attachment_lang WHERE name LIKE 'Паспорт '.$p_name.$type.''';
$attach_query_result = mysql_query($attach_query) or die(mysql_error());
$attach_query_par = mysql_fetch_array ($attach_query_result);
$attachment->attachToProduct($id_product, $attach_query_par);
}
}
}
}
public function link_rewrite($str){
if (function_exists('mb_strtolower'))
$str = mb_strtolower($str, 'utf-8');
$str = trim($str);
if (!function_exists('mb_strtolower'))
$this->replaceAccentedChars($str);
$str = preg_replace('/[^a-zA-Z0-9s':/[]-pL]/u', '', $str);
$str = preg_replace('/[s':/[]-]+/', ' ', $str);
$str = str_replace(array(' ', '/'), '-', $str);
if (!function_exists('mb_strtolower'))
$str = strtolower($str);
return $str;
}
public function replaceAccentedChars($str)
{
$patterns = array(
/* Lowercase */
'/[x{0105}x{00E0}x{00E1}x{00E2}x{00E3}x{00E4}x{00E5}]/u',
'/[x{00E7}x{010D}x{0107}]/u',
'/[x{010F}]/u',
'/[x{00E8}x{00E9}x{00EA}x{00EB}x{011B}x{0119}]/u',
'/[x{00EC}x{00ED}x{00EE}x{00EF}]/u',
'/[x{0142}x{013E}x{013A}]/u',
'/[x{00F1}x{0148}]/u',
'/[x{00F2}x{00F3}x{00F4}x{00F5}x{00F6}x{00F8}]/u',
'/[x{0159}x{0155}]/u',
'/[x{015B}x{0161}]/u',
'/[x{00DF}]/u',
'/[x{0165}]/u',
'/[x{00F9}x{00FA}x{00FB}x{00FC}x{016F}]/u',
'/[x{00FD}x{00FF}]/u',
'/[x{017C}x{017A}x{017E}]/u',
'/[x{00E6}]/u',
'/[x{0153}]/u',
/* Uppercase */
'/[x{0104}x{00C0}x{00C1}x{00C2}x{00C3}x{00C4}x{00C5}]/u',
'/[x{00C7}x{010C}x{0106}]/u',
'/[x{010E}]/u',
'/[x{00C8}x{00C9}x{00CA}x{00CB}x{011A}x{0118}]/u',
'/[x{0141}x{013D}x{0139}]/u',
'/[x{00D1}x{0147}]/u',
'/[x{00D3}]/u',
'/[x{0158}x{0154}]/u',
'/[x{015A}x{0160}]/u',
'/[x{0164}]/u',
'/[x{00D9}x{00DA}x{00DB}x{00DC}x{016E}]/u',
'/[x{017B}x{0179}x{017D}]/u',
'/[x{00C6}]/u',
'/[x{0152}]/u');
$replacements = array(
'a', 'c', 'd', 'e', 'i', 'l', 'n', 'o', 'r', 's', 'ss', 't', 'u', 'y', 'z', 'ae', 'oe',
'A', 'C', 'D', 'E', 'L', 'N', 'O', 'R', 'S', 'T', 'U', 'Z', 'AE', 'OE'
);
return preg_replace($patterns, $replacements, $str);
}
public function PS_new_product($id_for_img, $image_path, $doc_path, $p_name, $p_desc, $p_desc_sh, $p_price, $p_category, $p_manufacture, $p_parent) {
$webService = new PrestaShopWebservice(PS_SHOP_PATH, PS_WS_AUTH_KEY, DEBUG);
$p_category = trim($p_category);
$p_manufacture = trim($p_manufacture);
$p_desc = trim($p_desc);
$p_desc = strip_tags($p_desc, '<ul><ol><li><table><tr><td><tbody>');
$p_desc = preg_replace('/<([a-z][a-z0-9]*)[^>]*?(/?)>/i','<$1$2>', $p_desc);
$p_desc_sh = preg_replace('/<([a-z][a-z0-9]*)[^>]*?(/?)>/i','<$1$2>', $p_desc_sh);
$p_desc_sh = strip_tags($p_desc_sh, '<p><div><ul><ol><li><table><tr><td><tbody>');
$p_desc_sh = trim($p_desc_sh);
if ($p_manufacture != $this->last_p_manufacture)
{
$manufacturer_query = 'SELECT id_manufacturer FROM ps_manufacturer WHERE name LIKE '' .$p_manufacture.''';
$manufacturer_query_result = mysql_query($manufacturer_query) or die(mysql_error());
$this->last_id_manufacture = mysql_fetch_array($manufacturer_query_result);
$this->last_id_manufacture = $this->last_id_manufacture['id_manufacturer'];
$this->last_p_manufacture = $p_manufacture;
}
if (($p_parent == 0) || ($p_parent == NULL)){
if ($p_category != $this->last_p_category)
{
$category_query = 'SELECT id_category FROM ps_category_lang WHERE name LIKE '' .$p_category.''';
$category_query_result = mysql_query($category_query) or die(mysql_error());
$this->last_id_category = mysql_fetch_array($category_query_result);
$this->last_id_category = (integer)$this->last_id_category['id_category'];
$this->last_p_category = $p_category;
$category_par_query = 'SELECT id_parent FROM ps_category WHERE id_category = '.$this->last_id_category;
$category_par_query_result = mysql_query($category_par_query) or die(mysql_error());
$this->last_id_category_par = mysql_fetch_array($category_par_query_result);
$this->last_id_category_par = (integer)$this->last_id_category_par['id_parent'];
$category_par_par_query = 'SELECT id_parent FROM ps_category WHERE id_category = '.$this->last_id_category_par;
$category_par_par_query_result = mysql_query($category_par_par_query) or die(mysql_error());
$this->last_id_category_par_par = mysql_fetch_array($category_par_par_query_result);
$this->last_id_category_par_par = (integer)$this->last_id_category_par_par['id_parent'];
}
}
else{
if ($p_category != $this->last_p_category)
{
$category_par_query = 'SELECT id_category FROM ps_category_lang WHERE name LIKE '' .$p_parent.''';
$category_par_query_result = mysql_query($category_par_query) or die(mysql_error());
$this->last_id_category_par = mysql_fetch_array ($category_par_query_result);
$this->last_id_category_par = (integer)$this->last_id_category_par['id_category'];
$category_par_par_query = 'SELECT id_parent FROM ps_category WHERE id_category = '.$this->last_id_category_par;
$category_par_par_query_result = mysql_query($category_par_par_query) or die(mysql_error());
$this->last_id_category_par_par = mysql_fetch_array($category_par_par_query_result);
$this->last_id_category_par_par = (integer)$this->last_id_category_par_par['id_parent'];
$category_query = 'SELECT id_category FROM ps_category_lang WHERE name LIKE '' .$p_category.'' AND id_category = (SELECT id_category FROM ps_category WHERE id_parent LIKE ''.$this->last_id_category_par.'')';
$category_query_result = mysql_query($category_query) or die(mysql_error());
$this->last_id_category = mysql_fetch_array($category_query_result);
$this->last_id_category = (integer)$this->last_id_category['id_category'];
$this->last_p_category = $p_category;
}
}
$p_link_rewrite = $this->link_rewrite($p_name);
$p_meta_title = $p_manufacture.' '.$p_name;
$p_desc_sh_no_tags = strip_tags($p_desc_sh);
preg_match('`[:.rn]`',$p_desc_sh_no_tags, $M);
$p_meta_description = substr($p_desc_sh_no_tags, 0, strpos($p_desc_sh_no_tags, $M[0])+1);
$p_meta_keywords = mb_strtolower($p_manufacture,'UTF-8').' '.$p_link_rewrite.','.$p_link_rewrite.','.mb_strtolower($p_manufacture,'UTF-8');
$p_l_id = '7';
$xml = $webService -> get(array('url' => PS_SHOP_PATH . '/api/products?schema=blank'));
$resources = $xml -> children() -> children();
unset($resources -> id);
$resources -> id_manufacturer = $this->last_id_manufacture;
$resources -> id_manufacturer['xlink:href'] = PS_SHOP_PATH . '/api/manufactures/' . $this->last_id_manufacture;
unset($resources -> id_supplier);
$resources -> id_category_default = $this->last_id_category;
$resources -> id_category_default['xlink:href'] = PS_SHOP_PATH . '/api/categories/' . $this->last_id_category;
unset($resources -> cache_default_attribute);
unset($resources -> id_default_combination);
$resources -> id_tax_rules_group = 4;
$resources -> id_tax_rules_group['xlink:href'] = PS_SHOP_PATH . '/api/id_tax_rules_group/' . 4;
unset($resources -> position_in_category);
unset($resources -> manufacturer_name);
unset($resources -> quantity);
$resources -> id_shop_default = 1;
$resources -> minimal_quantity = 1;
$resources -> price = $p_price;
$resources -> active = 1;
$resources -> available_for_order = 1;
unset($resources -> available_date);
$resources -> condition = 'new';
$resources -> show_price = 1;
$resources -> indexed = 1;
$resources -> visibility = 'both';
unset($resources -> advanced_stock_management);
unset($resources -> date_add);
unset($resources -> date_upd);
$node = dom_import_simplexml($resources -> meta_description -> language[0][0]);
$no = $node -> ownerDocument;
$node -> appendChild($no -> createCDATASection($p_meta_description));
$resources -> meta_description -> language[0][0] = $p_meta_description;
$resources -> meta_description -> language[0][0]['id'] = $p_l_id;
$resources -> meta_description -> language[0][0]['xlink:href'] = PS_SHOP_PATH . '/api/languages/' . $p_l_id;
$node = dom_import_simplexml($resources -> meta_keywords -> language[0][0]);
$no = $node -> ownerDocument;
$node -> appendChild($no -> createCDATASection($p_meta_keywords));
$resources -> meta_keywords -> language[0][0] = $p_meta_keywords;
$resources -> meta_keywords -> language[0][0]['id'] = $p_l_id;
$resources -> meta_keywords -> language[0][0]['xlink:href'] = PS_SHOP_PATH . '/api/languages/' . $p_l_id;
$resources -> meta_title -> language[0][0] = $p_meta_title;
$resources -> meta_title -> language[0][0]['id'] = $p_l_id;
$resources -> meta_title -> language[0][0]['xlink:href'] = PS_SHOP_PATH . '/api/languages/' . $p_l_id;
$resources -> link_rewrite -> language[0][0] = $p_link_rewrite;
$resources -> link_rewrite -> language[0][0]['id'] = $p_l_id;
$resources -> link_rewrite -> language[0][0]['xlink:href'] = PS_SHOP_PATH . '/api/languages/' . $p_l_id;
$resources -> name -> language[0][0] = $p_name;
$resources -> name -> language[0][0]['id'] = $p_l_id;
$resources -> name -> language[0][0]['xlink:href'] = PS_SHOP_PATH . '/api/languages/' . $p_l_id;
$node = dom_import_simplexml($resources -> description -> language[0][0]);
$no = $node -> ownerDocument;
$node -> appendChild($no -> createCDATASection($p_desc));
$resources -> description -> language[0][0]['id'] = $p_l_id;
$resources -> description -> language[0][0]['xlink:href'] = PS_SHOP_PATH . '/api/languages/' . $p_l_id;
$node = dom_import_simplexml($resources -> description_short -> language[0][0]);
$no = $node -> ownerDocument;
$node -> appendChild($no -> createCDATASection($p_desc_sh));
$resources -> description_short -> language[0][0]['id'] = $p_l_id;
$resources -> description_short -> language[0][0]['xlink:href'] = PS_SHOP_PATH . '/api/languages/' . $p_l_id;
unset($resources -> available_now);
unset($resources -> available_later);
$resources ->associations->categories->category[0]->id = $this->last_id_category_par_par;
$resources -> associations->categories->category[0]['xlink:href'] = PS_SHOP_PATH . '/api/categories/' . $this->last_id_category_par_par;
$resources ->associations->categories->category[1]->id = $this->last_id_category_par;
$resources -> associations->categories->category[1]['xlink:href'] = PS_SHOP_PATH . '/api/categories/' . $this->last_id_category_par;
$resources ->associations->categories->category[2]->id = $this->last_id_category;
$resources -> associations->categories->category[2]['xlink:href'] = PS_SHOP_PATH . '/api/categories/' . $this->last_id_category;
unset($resources -> associations->product_features);
$opt = array('resource' => 'products');
$opt['postXml'] = $xml -> asXML();
$xml = $webService -> add($opt);
unset($opt);
$product_id_image_query = 'SELECT id_product FROM ps_product_lang WHERE id_product=(SELECT MAX(id_product) FROM ps_product) AND name LIKE '' .$p_name.''';
$product_id_image_query_result = mysql_query($product_id_image_query) or die(mysql_error());
$product_id_image = mysql_fetch_array($product_id_image_query_result);
$product_id_image = $product_id_image['id_product'];
$url = 'http://catalog.esm.by/api/images/products/'.$product_id_image;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_USERPWD, PS_WS_AUTH_KEY.':');
if (file_exists($image_path.$id_for_img.'.jpg')){
$format = 'jpg';
}
elseif (file_exists($image_path.$id_for_img.'.png')){
$format = 'png';
}
elseif (file_exists($image_path.$id_for_img.'.gif')){
$format = 'gif';
}
elseif (file_exists($image_path.$id_for_img.'.jpeg')){
$format = 'jpeg';
}
else
echo 'Строка '.$id_for_img.' - ' .$p_name. ' - не удалось загрузить изображение.<br/>';
$image_path = $image_path.$id_for_img.'.'.$format;
curl_setopt($ch, CURLOPT_POSTFIELDS, array('image' => '@'.$image_path.';type=image/'.$format));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
curl_close($ch);
$this->Attachment($id_for_img, $p_name, $doc_path, $product_id_image);
echo 'Строка '.$id_for_img.' - ' .$p_name. ' - продукт добавлен.<br/>';
}
}
?>