Сайт как бизнес

Поисковое продвижение сайтов (SEO), создание сайтов в Минске (Беларусь).

Подпишись на рассылку блога об интернет-бизнесе:

Архивы за декабря, 2008

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

пока комментариев нет

Студенты и выпускники вузов часто терзаются вопросом «где найти работу молодому и неопытному». Нередко ко мне обращаются с таким вопросом мои бывшие студенты, знакомые. При полной убежденности, что человек не подкачает, я помогаю ему найти работу. Однако у соискателей зачастую слишком маленький «профессиональный капитал», чтобы найти работу с достойной зарплатой.

Сегодня все говорят о кризисе. Я склонен думать, что кризис все-таки существует. Каждый переживает этот период по-своему. Где-то идут сокращения, кто-то урезает зарплаты сотрудникам, ну а некоторые вводят сокращенный рабочий день. В результате на рынке появляются многочисленные специалисты-беженцы, которые рыщут в поисках новой основной или дополнительной работы. Многие наниматели потирают руки, говоря, что сегодня найти «крутого» специалиста в несколько раз проще и дешевле, чем еще месяц-другой назад, и становятся очень требовательными к персоналу. В таких условиях молодые неоперившиеся «желторотики» не имеют особых шансов. Ведь работодателю в период кризиса особенно сложно принять решение о найме неопытного молодого человека или девушки. И это можно понять. Особенно трудно найти работу специалистам популярных профессий, где опыт важнее воздуха.

Но и другую сторону тоже можно понять — »кушать хочется». Вот и ищут. А чаще не ищут, а просто ждут с моря погоды.

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

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

  1. экономическое положение предприятия,
  2. примерный уровень зарплаты в отрасли,
  3. уровень зарплаты на данном предприятии,
  4. месторасположение предприятия и его филиалов,
  5. транспортная схема,
  6. условия и график работы,
  7. квалификация сотрудников предприятия,
  8. должностные обязанности специалиста, такого как вы,
  9. другие специфические требования к сотрудникам,
  10. имеющиеся вакансии,
  11. планы по расширению штата, перемещению сотрудников, декретные отпуска и пр.

Собрав таким образом информацию о 2-3 предприятиях, проводим сравнительный анализ.

Выбираем предприятие, в наибольшей стрепени соответствующее вашим критериям хорошего предприятия. Готовимся к собеседованию. Приходим в назначенное время. Проводим личную презентацию. Отвечаем на вопросы. Задаем вопросы.

Если в целом собеседование прошло успешно, но наниматель не может определиться, подходите ли вы ему, то помогите ему принять решение! Предложите ему то, от чего сложно отказаться — халяву. Предложите ему свои услуги на определенный срок бесплатно. Нет, я не имею в виду услуги сексуального характера! Предложите ему свой мозг для проверки его [мозга] на прочность. Прошу понять меня правильно. Бить головой кирпичи я не рекомендую. 

Итак. Дайте согласие на то, что бесплатно будете выполнять определенную работу в течение одного месяца. Если в ваши обязанности не будет входить протирание от пыли красной кнопки «ядерного чемоданчика», то практически любой работодатель с вниманием отнесется к вашему предложению. 

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

Чтобы это не походило на попрошайничество, а выглядело как разумная и выгодная сделка, предложение необходимо обосновать. Нужно объяснить, почему вы это делаете. Причины могут быть следующими:

  1. вы не испытываете острой необходимости в деньгах, поэтому можете себе позволить некоторое время работать бесплатно,
  2. вы считаете, что за все нужно платить, а бесплатная работа — разумная плата за образование,
  3. работая бесплатно, вы получаете практический и уникальный душевный опыт, который сможете положить в свою копилку,
  4. вы молоды и энергичны — начинать с нуля и пройти все ступеньки карьерной лестницы — это отличный вызов для вас (который вы сами себе делаете),
  5. вы ищете именно такую работу, потому что она вам нравится, она вас захватывает, и вы будете ее искать до тех пор, пока не найдете (работодатель из чувства ревности вряд ли захочет вас отпустить к конкуренту).

Отдельно стоить назвать преимущества, которые получает работодатель:

  1. самомотивированного лояльного сотрудника,
  2. сокращение издержек на оплату персонала (за это его могут и премировать),
  3. отсутствие риска.

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

Особенно этот вариант подходит специалистам по продажам, для которых работа за проценты абсолютно естетсвенна. «Продажники» психологически готовы некоторе время работать беплатно. Люди понимают, что если они будут хорошо продавать, то получат хорошую зарплату. Люди идут работать ради завтрашней зарплаты и готовы разделить риски со своим работодателем. Ведь работодатель не может платить за красивые глаза, а только за результат.
 

Новый — неновый способ найти работу

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

Уверяю вас, так не бывает! 

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

Чтобы укрепить вас в упорстве стать [успешным] человеком, приведу еще несколько аргументов.
 

Вы сразу видите результат

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

Я глубоко убежден, что человек никогда не должен работать ради денег, а получать удовольствие от работы, и деньги впридачу, в качестве подарка. Тогда человек найдет все, чего ищет, и будет счастлив. Работая только ради денег, человек как бы откладывает свою жизнь на потом. Он думает: сейчас заработаю денег, а потом начну наслаждаться жизнью. Но зачем, скажите, это откладывать? Работа должна приносить радость! 
 

Многие известные люди так начинали

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

Лучше работать бесплатно, чем слоняться без дела и «разлагаться»

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

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

Таким образом, коллектив — это способ не распасться как личности, не впасть в творческий кризис и уныние. 
 

Тренируйте мозг, работая

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

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

Как можно охарактеризовать человка, согласного на бесплатную работу? Директору на заметку. 

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

Это благодарный мотивированный сотрудник.

На него можно расчитывать. Ему можно доверять, потому что он дорожит своим местом.

Это явный победитель — его место в команде победителей. Пусть это будет ваша команда!

Желаю работодателям и соискателям найти друг друга, и найти совместное счастье! :)

Написал Алексей Шабловский

29 декабря, 2008 в 1:24 дп

Темы: новичку

Подпишись на обновления блога по e-mail или RSS!

Блог «Бизнес по методу Кати Пушкарёвой» ждет ребрендинг

пока комментариев нет

После завершения первой встречи Клуба маркетинга и продаж я попросил Сергея Жуковского рассказать о своей деятельности на ниве блогов и о своей книге. Аудиоверсия интервью прилагается: скачать интервью (MP3, 9,5 Мб)

 

Алексей Шабловский: Сергей, пожалуйста, несколько слов о себе.

Сергей Жуковский: Я занимаюсь интернет-маркетингом и малобюджетным маркетингом. В интернет-маркетинге я с 1999 года, в малобюджетном — уже года три. Эти направления меня привлекают тем, что они позволяют контролировать расходы на маркетинг. В малобюджетном маркетинге, как и в интернет-маркетинге четко видно, сколько стоит тебе клиент. Эти вещи я очень люблю и их разрабатываю.

Лет пять назад я увлекся темой блогов. Чуть больше года назад я создал блог, который, честно говоря, с потолка назвал «Бизнес по методу Кати Пушкарёвой». Возможно, позже я сделаю ребрендинг… Тем не менее, на своем опыте я убедился в том, что для продажи услуг, а я продаю именно услуги, блоги работают просто замечательно.

Алексей Шабловский: С чего начиналось ваше увлечение блогами?

Сергей Жуковский: Начиналось все, как и у многих в то время, с ЖЖ (livejournal.com). Тогда они еще не были в свободной регистрации, а только по приглашению. У некоторых моих знакомых уже были тогда аккаунты в ЖЖ, они что-то писали. И мне очень захотелось туда попасть. А попасть туда было трудно, так сказать, только по блату. И мне хотелось попробовать, тем более что не первый человек мне тогда говорил, что через блоги можно раскручивать какие-то свои услуги. Я, правда, тогда слабо понимал как это работает, поэтому, первые мои блоги, наверное штуки 3-4, естественно, провалились. Провалились в том плане, что я в них что-то вкладывал, но отдачи абсолютно никакой не было — ни денежной, ни экономии времени, ни клиентов — ничего такого, что могло бы приносить радость. Читателей фактически тоже не было. Так происходило из-за того, что у меня не было четкой стратегии, что ли. Потому что в любом случае, когда что-то создаешь, нужно четко представлять что ты хочешь получить. У меня было смутное представление о том, что я хочу получить клиентов, как-то заработать, но я не знал как это сделать, не понимал как это все работает, поэтому тогда, видимо, не получилось.

За пять лет я набил несколько шишек, поднабрался опыта, и сейчас кое-что получается.

Алексей Шабловский: Не то слово «кое-что получается! Недавно вы издали свою книгу «Как сделать $1000 с блога в месяц. Практическое руководство для работы в интернет-бизнесе». Мы знаем, что авторское вознаграждение не велико, так почему вы решили издать именно бумажный вариант книги?   

 Сергей Жуковский: Дело в том, что в электронном виде издать книгу намного проще, потому что достаточно её написать, скомпилировать ее в PDF и выложить в интернете. Конечно, у меня была такая мысль. Я больше человек такой, онлайн, скажем так. Так уж сложилось, что я работаю именно в интернет-маркетинге, поэтому я рассматривал вариант издать электронную книгу. Но пообщавшись с людьми, которые давно занимаются продажей различных тренингов, других услуг, и теми, кто уже писал свои книги, я дал себя переубедить. Дело в том, что электронные книги в большинстве своем —бесплатные. Распространять платно достаточно сложно, потому что электронные книги легко копируются: один человек купит и выложит в интернете, и сотни людей придут и скачают. Контролировать процесс бесполезно – пиратство в интернете процветает.

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

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

Кроме того, книга помогает систематизировать свои знания.

Почему я не взял гонорар за книгу, а предпочел получить часть тиража? Потому что гонорар на самом деле был небольшой, что-то около 300 долларов. Учитывая то, как бы этот гонорар сюда добирался… Больше половины съели бы переводы и налоги. Естественно, мне было гораздо интереснее получить сами книги, которые я могу потом раздавать своим знакомым и клиентам. Опять-таки, послать кому-то на новый год книгу вместо открытки гораздо приятнее.  Именно для рекламы получить книги, а не деньги мне оказалось выгоднее.

Я издавал в России, в Ростове, так как до белорусских издательств достучаться не смог.

Алексей Шабловский: Книга это резюме твоего одноименного курса?

Сергей Жуковский: Книга это урезанная версия курса. Здесь нет нюансов, которые я давал в курсе. Здесь нет каких-то конкретных разборов полетов. Например, в курсе я давал развернутые резюме блогам тех, кто участвовал в курсе. В книге, естественно, это отразить не получилось. Книга — это выжимка из курса. Книга это не весть мой опыт. Я ориентировался скорее на новичков, потому что продвинутые вещи давать было бы сложновато, и не хотелось мешать все в одном. Если будет отклик, то, возможно, я сделаю мастер или VIP-версию, где будет рассказываться какие-то более продвинутые фишки. В книге я постарался сделать что-то типа введения — дать основы, дать практическое руководство, чтобы человек с нуля мог сделать блог. А дальше, если ему захочется, то он сможет обратиться за консультацией ко мне и мы сможем продолжить нашу беседу. 

Написал Алексей Шабловский

17 декабря, 2008 в 2:06 пп

Темы: новости

Подпишись на обновления блога по e-mail или RSS!

Для чего нужен Белорусский клуб маркетинга и продаж?

пока комментариев нет

12 декабря в Минске, состоялась первая встреча Белорусского клуба маркетинга и продаж

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

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

Я считаю, что маркетинг нельзя отрывать от продаж. Маркетинг — это стратегия предприятия на рынке, а продажи — это то, что дает предприятию возможность жить и процветать, реализуя ту самую стратегию маркетинга. Подчеркиваю, маркетинг — это стратегия на длительный срок, от 3-100 лет и более. Продажи — это тактика, оперативные действия продавцов здесь и сейчас, которые непосредственно приводят к получению денег. 

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

Маркетинг – это жизнеспособный план, основанный на глубоком знании процессов рынка, своих потребителей и конкурентов, знании бизнес-процессов предприятия и работников, который приведет предприятие к успеху в отведенный срок.

Сегодня из-за искусственного отрыва маркетинга от продаж многие руководители не понимают что такое маркетинг и для чего он нужен, рассуждая так: бухгалтерия — понятно, продажи — понятно, транспорт — понятно, снабжение — понятно, производство — все понятно, уборщицы — без вопросов, маркетинг — непонятно, зачем?

Я не раз встречал руководителей, которые рассуждают именно так. Да, это люди старой закалки (не обязательно пожилые). Но они правы! Они хорошо знают ситуацию на своем предприятии, многое знают о рынке. Им ли не знать где «куются» деньги! И им ли не знать, без чего предприятие жить не может! К сожалению, на таких предприятиях слабое звено в кризисной ситуации – маркетологи. Именно из-за того, что они как бы неприкаянные, не знающие своего законного места и своей силы. А чтобы знать силу, маркетологам нужно не просто «задирать нос», а стать профессионалами, преданными своему делу, и начать бороться с кризисом на своем месте: изучать спрос, анализировать, думать стратегически, предлагать решения проблем своему руководству! И если ваше решение сработает, то у начальника отложится в мозгу, что маркетинг могёт. 

Маркетинг – это сложная штука. Освоить навыки продаж значительно проще, чем изучать предприятие, рынок и потребителей вдоль и поперек. Продажи это навыки, приёмчики, хитрости. А маркетинг – это хороший (жизнеспособный) план, основанный на глубоком знании процессов рынка, своих потребителей и конкурентов, знании бизнес-процессов предприятия и работников, который приведет предприятие к успеху в отведенный срок.

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

Именно поэтому я решительно выступаю за тесную связь маркетинга и продаж. Идея клуба состоит в том, чтобы объединить два в одном — маркетинг и продажи, и все это завязать на практику бизнеса. Мы не будем обучать прописным истинам. Для этого есть Котлер. Мы будем черпать знания и опыт от практиков и преломлять это к белорусским условиям. Какой сплав мы получим на выходе, честно, не знаю. Однако уверен, что это будет жизнеспособный и ликвидный сплав.

 

Немного официоза

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

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

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

Кроме формального выступления, неформального общения участников ждут интересные фишки. Завсегдатаям конференций и семинаров скажу: «Такого вы еще не видели!».

Активные участники клуба смогут непосредственно влиять на подбор докладчиков и тем выступлений. Вполне возможно, что общие встречи будут иметь продолжение. Все зависит от заинтересованности аудитории. Докладчики будут готовы выкладывать все как на духу! В крайнем случае прибегнем изощренный пыткам :)

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

Для участия приглашаются маркетологи, руководители отделов маркетинга и продаж, предприниматели, директора фирм.

Буду рад услышать мнения (в том числе критические) и пожелания. Приветствуются и предложения как по тематике и формату следующих встреч, так и по другим важным для вас вопросам. Ищем интересных докладчиков со своими темами.

Обсуждение клуба происходит на форуме белорусских маркетологов-практиков www.pro-marketing.by и на этом блоге (www.blog.elab.by).

Для участия во встречах клуба необходимо заполнить регистрационную форму. Регистрируйтесь пока участие абсолютно бесплатно.

Написал Алексей Шабловский

17 декабря, 2008 в 12:49 дп

Подпишись на обновления блога по e-mail или RSS!

Создание таблиц Excel на PHP

пока комментариев нет

Подразумевается, что у Вас есть элементарные знания Excel, но ничего слишком серьезного. Вам даже не обязательно иметь копию, все приведенные примеры работают так же хорошо и с OpenOffice Calc.
Знакомство с PEAR:: Spreadsheet_Excel_Writer

Вот о чем пойдет разговор в этой статье:

* Знакомство с PEAR::Spreadsheet_Excel_Writer
* Продолжаем работу: знакомство с API
* Добавлениe форматирования ячеек
* Добавление функции Excel: C1+D1=2!

Подразумевается, что у Вас есть элементарные знания Excel, но ничего слишком серьезного. Вам даже не обязательно иметь копию, все приведенные примеры работают так же хорошо и с OpenOffice Calc.
Знакомство с PEAR:: Spreadsheet_Excel_Writer

Excel — ом пользуются те, кто работает с финансами и деньгами. Иными словами Буxгалтерский департамент, который не заплатил вашу сумму вовремя, использует ее. Сделайте жизнь буxгалетеров легче и они ответят Вам тем же.

Разве не было бы лучше, если бы Вы могли дать Вашим клиентам возможность доступа к загружаемым данным в виде листов Excel? Xорошие новости состоят в том, что Вы это можете сделать при помощи PEAR::Spreadsheet_Excel_Writer.

«Невозможно!» Вы скажете. «Excel использует файловый формат Microsoft. Это сделать невозможно!».

Да, да это возможно. Spreadsheet_Excel_Writer генерирует «реальные вещи», с функциями Excel, форматированием и все остальным. Нет, тут мы не говорим о файлаx разделенных запятыми, или использующиx COM расширения (или любие другие расширения). Написан он при помощи простого PHP, и будет работать под Unix сервером так же хорошо как и на Windows серверах Если быть кратким, то PEAR::Spreadsheet_Excel_Writer, вместе с дополнительными возможностями PEAR::OLE «понимает» формат Microsoft Excel.

Давайте снимем шляпы перед Xavier Noguer, который сделал удивительную работу для внедрения этого в PHP, с помощью Mika Tuupola для Spreadsheet_Excel_Writer.

Сейчас, без дальнейшего шума, и вооруженными полными знаниями управления пакета PEAR, который у Вас должен быть установлен, начнем загрузку библиотек. Откройте Вашу командную строку и введите в нем следующее:

$ pear install OLE
$ pear install Spreadsheet_Excel_Writer

Вот и все. Мы готовы!

Важное замечание: Для примеров в этой статье я использовал PEAR::OLE version 0.5 и PEAR::Spreadsheet_Excel_Writer version 0.7. Предупреждаю, что кое — что может изменится в будущиx версияx.

Продолжаем наш путь. Давайте создадим простой лист данных.
Имя файла: example_1.php

<?php
// Внедрение PEAR::Spreadsheet_Excel_Writer
require_once «Spreadsheet/Excel/Writer.php»;

// Создание случая
$xls =& new Spreadsheet_Excel_Writer();

// Отправка HTTP заголовков для сообщения обозревателю о типе вxодимыx //данныx
$xls->send(«test.xls»);

// Добавление листа к файлу, возвращение объекта для добавления данныx
$sheet =& $xls->addWorksheet(‘Binary Count’);

// Пишем несколько цифр
for ( $i=0;$i<11;$i++ ) {
// Использование функции PHP decbin()для преобразования целого числа в //бинарные данные
$sheet->write($i,0,decbin($i));
}
// Конец листа, отправка обозревателю
$xls->close();
?>

Откройте скрипт в Вашем обозревателе, (подразумевается, что он «знаком» с Excel или OpenOffice Calc) и он отобразит лист Excel с номерами от 0 до 10 в бинарном виде.
Сохранение файлов

В этом случае лист создается динамически — ничего не соxраняется на сервере. Если Вы xотите вместо этого создать файл, Вы можете отбросить часть для создания листа который не изменился, для этого просто отправляя конструктору имя файла и путь к нему, и этим избегая необxодимости отправки HTTP заголовков:

Имя файла: example_2.php

<?php
// Создался ли лист?
if ( !file_exists(‘sheets/binary.xls’) ) {

// Внедрение PEAR::Spreadsheet_Excel_Writer
require_once «Spreadsheet/Excel/Writer.php»;

// Создание случая, отправка имени файла для создания
$xls =& new Spreadsheet_Excel_Writer(‘sheets/binary.xls’);

//Добавление листа к файлу, возвращение объекта для добавления данныx
$sheet =& $xls->addWorksheet(‘Binary Count’);

// Пишем несколько цифр
for ( $i=0;$i<11;$i++ ) {
// Использование функции PHP decbin()для преобразования целого числа в //бинарные данные
$sheet->write($i,0,decbin($i));
}

// Конец листа, отправка обозревателю
$xls->close();
}
?>

Если Вы используете систему семейства Unix, то не забудьте изменить разрешения к папке в которой Вы xраните листы данных, чтобы PHP смог добавить в ниx данные.
Обзор API

Xорошо, мы разобрались с основными понятиями. Чтобы получить максимум от PEAR::Spreadsheet_Excel_Writer, Вам нужно знать немного больше об API. Документация API, которая доступна на сайте PEAR сейчас устаревшая (она стал намного больше, с теx пор была создана версия документации). Благодаря авторам, которые добавили много документации непосредственно в код, Вы можете создать свою собственную документацию API, если Вы загрузите phpDocumentor и укажете его на папку, которая содержит все исxодные коды Spreadsheet_Excel_Writer.

Основной класс, с которого Вы всегда будете начинать работу — Spreadsheet_Excel_Writer, представляет из себя пункт доступа ко всем остальным классам в библиотеке. Он предоставляет два важныx заводскиx метода (которые определены в родительном классе Spreadsheet_Excel_Writer_Workbook:)

* addWorksheet()- возвращает случай Spreadsheet_Excel_Writer_Worksheet. Большая часть работы выполняется с случай этого класса, давая Вам возможность вписывать данные в ячейки одного листа.
* addFormat()- возвращает случай Spreadsheet_Excel_Writer_Format, который используется для добавления визуального форматирования ячеек.

Библиотека также содержит три другиx класса, которыx Вы должны опосаться, xотя Вам врят ли когда нибудь потребуется иx использовать.

* Spreadsheet_Excel_Writer_Validator делает возможным добавление проверочных правил для ячеек. Сейчас для этого класса не существует документации. Оно как бы является экспериментальным кодом, следовательно я не буду здесь его обсуждать. В основном, он предоставляет возможность проверки данныx введенныx в ячейку конечным пользователем. Более сложные правила проверки могут быть установлены при помощи расширения класса. Класс Spreadsheet_Excel_Writer_Workbook предоставляет метод addValidator() для создания случая проверки, в то время как Spreadsheet_Excel_Writer_Worksheet дает возможность правилам проверки назначиться в ячейки при помощи метода setValidation()
* Spreadsheet_Excel_Writer_Parser, который является Parser — ом для листов данныx Excel, и помогает Вам проверить, является ли функция правильным синтаксисом Excel.
* И наконец — Spreadsheet_Excel_Writer_BIFFwriter — используется для создания Формата Бинарныx Файлов для xранения файлов Excel. Если Вы интересуетесь взломом Excel, то Вам будет интересно изучить что он делает, если же нет, то Вам ни к чему волноваться об этом, так как библиотека полностью скрывает этот класс.

Замешательство нулевого индекса.

Один из методов примечания — Spreadsheet_Excel_Writer_Worksheet::write(), который мы видели в вышеизложенном примере, Вы будете использовать много раз для добавления данныx в ячейки. Этот метод немного запутывающий по ставнению с тем же методом в Excel.

Первым аргументом функции write()является номер строки. Номером первой строки в таблицах PEAR::Spreadsheet_Excel_Writer является 0, а не 1, как принято в Excel.

Вторым аргументом является номер столбца. Теперь, колонки в Excel, идентифицированы буквами алфавита а не числами, так что Вы только должны будете привыкнуть к переводу между двумя. Буква F является 6-ым в алфавите, так что второй аргумент… 5 (конечно!) — крайняя левая колонка — 0 (ноль) в PEAR::Spreadsheet_Excel_Writer, так что Вы должны вычесть, чтобы получить номер колонки.

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

Существуют еще множество методов в классе Spreadsheet_Excel_Writer_Worksheet, такие как для «замораживания» или «таяния» частей листа, для форматирования листа в целом для печати и т.д. О ниx я немного расскажу в последующих примераx, но большинство Вы должны будете исследовать самим.
Добавление форматирования ячеек.

Так как насчет более красивыx листов? Мы можем достигнуть этого при помощи PEAR::Spreadsheet_Excel_Writer используя функцию addFormat()для преобразования объекта в Spreadsheet_Excel_Writer_Format. Мы применяем форматирование к этому объекту, используя методы, которые он обеспечивает, затем передаваем его методом write() функции Spreadsheet_Excel_Writer_Worksheet, для добавления форматирования ячейке, которую мы добавили.

Ради примера «Реального Мира», давайте представим, что я xочу дать своим клиентам Интернет магазина phpPetstore.com возможность скачивания чека для купленныx ими вещей в виде Книги (Workbook) содержащей один лист (Worksheet).

Я начинаю свой лист обычным материалом.

<?php
require_once «Spreadsheet/Excel/Writer.php»;

// создание книги
$xls =& new Spreadsheet_Excel_Writer();

// создание листа
$cart =& $xls->addWorksheet(‘phpPetstore’);

Далее мы добавим заголовок к листу — сливая некоторые ячейки, для его размещения. Здесь мы получим первое представления того, как делается форматирование:

// какой нибудь текст в роли заголовка листа
$titleText = ‘phpPetstore: Receipt from ‘ . date(‘dS M Y’);
// Создание объекта форматирования
$titleFormat =& $xls->addFormat();
// Определение шрифта — Helvetica работает с OpenOffice calc тоже…
$titleFormat->setFontFamily(‘Helvetica’);
// Определение жирного текста
$titleFormat->setBold();
// Определение размера текста
$titleFormat->setSize(’13′);
// Определение цвета текста
$titleFormat->setColor(‘navy’);
// Определения ширину границы основания в «thick»
$titleFormat->setBottom(2);
// Определение цвета границы основания
$titleFormat->setBottomColor(‘navy’);
// Определения выравнивания в специальное значение
$titleFormat->setAlign(‘merge’);
// Добавление заголовка в верxную левую ячейку листа ,
// отправляя ему строку заголовка а также объект форматирования
$cart->write(0,0,$titleText,$titleFormat);
// Добавление треx пустыx ячеек для сливания
$cart->write(0,1,»,$titleFormat);
$cart->write(0,2,»,$titleFormat);
$cart->write(0,3,»,$titleFormat);
// Высота строки
$cart->setRow(0,30);
// Определение ширины колонки для первых 4 колонок
$cart->setColumn(0,3,15);

Сперва заметьте, что я получил объект форматирования вызвав addFormat() посредством объекта $xls, который представляет текущий лист. Затем я применил к объекту некоторое специфическое форматирование (методы под названием setBold() говорят сами о себе — для более подробной информации смотрите документацию API).

Когда форматирование закончено, я вызываю функцию write() для объекта $cart, для добавления к ячейке, передавая объект как четвертый аргумент.

Единственный нестандартный ход я здесь сделал, это объединение четырех ячеек. Вызывая setAlign(‘merge’) для объекта форматирования (обычно Вы используете для этого ‘left’, ‘right’ или ‘center’), я приказал Spreadsheet_Excel_Writer, что он должен объединить все ячейки к которым относиться это форматирования. Вот почему я создал три пустых ячеек и применил к ним форматирование.

Использование setRow() позволяет мне изменить высоту строки, сделая ее больше, чем установка высоты строки Excel по умолчанию. Этот метод имеет много дополнительных аргументов форматирования, которые позволяют Вам, например, применить объект форматирования к текущей строке. Подобно setColumn() я могу установить ширину столбца и применить к нему дальнейшее форматирование. Разница состоит в том, что setRow() применяется только лишь к одной строке, когда setColumn() применяется ко многим столбцам.

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

$items = array (
array( ‘description’=>’Parrot’ ,’price’=>34.0, ‘quantity’=>1),
array( ‘description’=>’Snake’ ,’price’=>16.5, ‘quantity’=>2),
array( ‘description’=>’Mouse’ ,’price’=>1.25, ‘quantity’=>10),
);

«Столбцы в базе данных» являются ключами массива — ‘description’, ‘price’ и ‘quantity’, второе, что мы должны сделать, это добавить заголовки столбцов с дополнительным заголовком ‘Total’, который мы скоро будем использовать:

// Определение некоторого форматирования
$colHeadingFormat =& $xls->addFormat();
$colHeadingFormat->setBold();
$colHeadingFormat->setFontFamily(‘Helvetica’);
$colHeadingFormat->setBold();
$colHeadingFormat->setSize(’10′);
$colHeadingFormat->setAlign(‘center’);

// Массив с данными заголовок для столбцов
$colNames = array(‘Item’,'Price($)’,'Quantity’,'Total’);

// Добавление всех заголовок единым вызовом
// оставляем строку пустым для более приятного вида
$cart->writeRow(2,0,$colNames,$colHeadingFormat);

Вы уже видели форматирование. Вы раньше не видели метод writeRow(). Этот метод делает одно и то же, что и write(), но позволяет Вам добавлять массив данных с лева направо, начиная с определенного номера строки или столбца. Этот метод позволяет значительно сократить код программы.

Еще я хочу сделать так, чтобы заголовки столбцов были всегда видны, когда мы прокручиваем страницу. В Excel — e сделать это можно посредством «замораживания» — выбирая блок ячеек, которые будут видны, когда пользователь будет прокручивать лист, позволяя ему видеть заголовки столбцов (в этом случае), которые объясняют что предствалвют эти данные. То же самое возможно в PEAR::Spreadsheet_Excel_Writer:

// Группа ячеек для замораживания
// 1-ый Аргумент — позиция вертикального обьединения
// 2-ой Аргумент — позиция горизонтального обьединения (0 = нет горизонтального обьединения)
// 3-ий Аргумент — верхняя видимая строка внизу вертикального объединения
// 4-ий Аргумент — левый видимый столбец после горизнотального объединения
$freeze = array(3,0,4,0);

// Заморозить эти ячейки!
$cart->freezePanes($freeze);

Заметьте, что «замораживание» было применено непосредственно объектом $cart, а не посредством объекта форматирования, так как оно было применено к нескольким ячейкам. С другой стороны, форматирование было применено к отдельным ячейкам.

Наконец я прохожу через обьекты в «своей сумке», добавляя данные к листу:

// Псевдо данные
$items = array (
array( ‘description’=>’Parrot’ ,’price’=>34.0, ‘quantity’=>1),
array( ‘description’=>’Snake’ ,’price’=>16.5, ‘quantity’=>2),
array( ‘description’=>’Mouse’ ,’price’=>1.25, ‘quantity’=>10),
);

// Используйте это для отслеживания текущего номера строки
$currentRow = 4;

// Пройдите через данные, добавляя их в лист
foreach ( $items as $item ) {
// Write each item to the sheet
$cart->writeRow($currentRow,0,$item);
$currentRow++;
}

Вот в принцыпе и все. Если Вы новичок ООП в PHP, на первый взгляд это может показаться немного отпугивающим, но Вы могли уже заметить, что все методы очень понятно названы и Вы можете понять их значения только лишь взглянув на них. Идея притяжения одного объекта другим может быть новшевством для Вас, но когда Вы думаете об этом, то кажется, что Вы создаете объект Worksheet вызывая метод addWorksheetSheet() и что Вы добавляете объекты форматирования к ячейке тогда, когда Вы write() (пишете) в Worksheet.
Добавление функции Excel.

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

Теперь я не ас Excel — a (и это не руководство по Excel), но ясно, что мой чек должен быть более умным, так что мне нужно добавить некоторые расчеты основанные на данные, которые я уже внес в таблицу. Для каждой строки я хочу отобразить «total item cost» (сумма купленных вещей) — данные содержат цену единицы измерения а также количество купленных изделий:

«total item cost» = «unit price» * «number of items purchased»

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

[Cell D5] =PRODUCT(B5:C5)

Для достижения этого с PEAR::Spreadsheet_Excel_Writer, мне всего лишь нужно подправитьть код, который проводит проход через данные:

// Используйте это для отслеживания текущего номера строки
$currentRow = 4;

// Пройдите через данные, добавляя их в лист
foreach ( $items as $item ) {
// Добавление каждого предмета к листу
$cart->writeRow($currentRow,0,$item);

// Помните, что Excel начинает подсчет строк с #1!
$excelRow = $currentRow + 1;

// Создание строки PHP содержащую формулу
$formula = ‘=PRODUCT(B’ . $excelRow . ‘:C’ . $excelRow .’)';

// Добавление формулы к строке
$cart->writeFormula($currentRow,3,$formula);

$currentRow++;
}

Добавление формулы не предствляет из себя труда — мы всего лишь воспользуемся методом writeFormula(). Но самое главное то, как я упомянул ранее, —что Excel начинает отсчет строк начиная с единицы, тогда как PEAR::Spreadsheet_Excel_Writer начинает с нуля. Это означает, что при создании функции я должен помнить об этом, в противном случае я буду ссылаться на неправильные ячейки. Вот почему я создал переменную $excelRow, которая из себя представляет $currentRow + 1.Вы можете подумать, что это design flaw on behalf of the authors, но помните, что в PHP, так же как и во многих языках программирования, индексированные массивы начинаются с нулевого индекса.

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

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

[Grand Total Cell] =SUM(D5:D7)

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

// Первая строка, как Excel это понимает, — $currentRow был 4 в начале
$startingExcelRow = 5;

// Последняя строка как в Excel
// (которая та же как и currentRow после окончания прохода)
$finalExcelRow = $currentRow;

// Формат Excel для получения суммы всех значений
$gTFormula = ‘=SUM(D’.$startingExcelRow.’:D’.$finalExcelRow.’)';

// Некоторое дополнительное форматирование для ячеек общей суммы
$gTFormat =& $xls->addFormat();
$gTFormat->setFontFamily(‘Helvetica’);
$gTFormat->setBold();
$gTFormat->setTop(1); // Top border
$gTFormat->setBottom(1); // Bottom border

// Добавление некоторого текста и форматирования
$cart->write($currentRow,2,’Grand Total:’,$gTFormat);

// Добавление формулы общей суммы с форматом
$cart->writeFormula($currentRow,3,$gTFormula,$gTFormat);

Наконец я заканчиваю создание своего чека отправляя лист непосредственно в обозреватель.

// Send the Spreadsheet to the browser
$xls->send(«phpPetstore.xls»);
$xls->close();

Вот и все. Лист готов для скачивания.

Написал Валерий Хвалев

16 декабря, 2008 в 11:22 дп

Подпишись на обновления блога по e-mail или RSS!

Создание PDF из PHP

пока комментариев нет

В наше время формат документов PDF приобретает большую популярность. Он был разработан компанией Adobe Systems Incorporated. Как указано в документации, THE ADOBE PORTABLE DOCUMENT FORMAT (PDF) — переносимый формат документов, является «родным» для программных продуктов семейства Adobe Acrobat. Их цель — дать пользователю возможность легко обмениваться электронными документами и просматривать их независимо от той среды, в которой эти документы были созданы.

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

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

PHP, как один из самых мощных и популярных современных средств разработки web-приложений, справляется с задачей генерации PDF документов «на лету». Для этого разработано несколько дополнительных инструментов. Не возьмусь перечислить их все, но назову одни из самых известных — библиотеку PDFLib, ClibPDF и PHP класс FPDF.

FPDF — только PHP

Названные в предыдущей главе PDFLib и ClibPDF требуют дополнительной настройки PHP, в то время как класс FPDF является чистым PHP кодом и легко подключается к скриптам командой include() и другими подобными. Скачать класс и ознакомиться с подробной документацией можно на сайте www.fpdf.org. Дополнительным (порой решающим) аргументом в пользу этого решения можно рассматривать его бесплатность для использования как в личных, так и коммерческих целях. Цитата из лицензионного соглашения:

«FPDF is Freeware (it is stated at the beginning of the source file). There is no usage restriction. You may embed it freely in your application (commercial or not), with or without modification».

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

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

Если быть точным, то сам класс настраивать практически не придется. Проблема может возникнуть с файлами кириллических шрифтов. Оговорюсь, что тестирование класса я проводил на wintel платформе (впрочем, весь приведенный код работал и на коммерческом *nix хостинге). В windows одним из самых основных форматов шрифтов (наряду с PostScript) является TTF (True Type Font). Но для правильной работы наших скриптов необходим и еще один формат файлов — AFM (файл метрики шрифта). Как считается, AFM файлы поставляются вместе с TTF. В своей ОС я AFM файлов не обнаружил.

Здесь нам на помощь приходят полезные утилиты, в частности — ttf2pt1. Одна из задач данной утилиты — сгенерировать метрический файл для True Type или PFB. Другими словами, появляется возможность взять из директории /fonts (ОС Windows) любой .TTF файл шрифта с поддержкой кириллицы и получить для него метрику при помощи нашей волшебной утилиты. Скачать утилиту можно по следующим линкам: http://ttf2pt1.sourceforge.net и http://fpdf.org/fr/dl.php?id=22 (для Windows).

После того, как утилита скачана, ее необходимо запустить из командной строки (в windows Пуск->Выполнить команду cmd). Формат вызова утилиты для нужной нам цели выглядит следующим образом:

ttf2pt1 -A font.ttf font

К примеру, если вы положили скачанный экземпляр ttf2pt1 прямо на диск C: , а файл шрифта times.ttf в C:CyrFonts, то вам будет необходимо запустить следующую команду:

c:ttf2pt1 -A c:CyrFontstimes.ttf times

где c:ttf2pt1 — вызов программы, -A — ключ, указывающий на необходимость сформировать файл AFM, c:CyrFontstimes.ttf — это адрес файла True Type шрифта и, наконец, times — это имя будущего метрического файла. Итак, AFM файл готов.

Следующим шагом является генерация файла описания шрифта. Этот файл будет иметь знакомое нам расширение — PHP. Вместе с классом FPDF поставляется полезный скрипт для решения этой задачи. Его можно найти в директории font/makefont/ класса. Использовать его просто. Для этого создадим РНР файл (скажем, mf.php) и в нем укажем:

<?php
require(‘font/makefont/makefont.php’);
MakeFont(‘times.ttf’,times.afm’,'cp1251′);
?>

Используя require, мы подключаем нужный скрипт. Понятно, что для этого рядом с нашим файлом должна быть папка font, содержащая в себе makefont/makefont.php. А вот функция MakeFont() уже является специфической и по определению имеет следующий формат:

MakeFont(string fontfile, string afmfile [, string enc [, array patch [, string type]]])

где fontfile — путь к TTF или PFB файлу, afmfile — путь к AFM файлу, enc — имя используемой кодировки (по умолчанию это cp1252), patch — опциональное изменение кодировки и type — тип шрифта (по умолчанию True Type). Для выбора кодировки можно воспользоваться следующим списком:

* cp1250 (Central Europe)
* cp1251 (Cyrillic)
* cp1252 (Western Europe)
* cp1253 (Greek)
* cp1257 (Baltic)
* ISO-8859-1 (Western Europe)
* ISO-8859-2 (Central Europe)
* ISO-8859-4 (Baltic)
* ISO-8859-4 (Cyrillic)
* ISO-8859-7 (Greek)
* ISO-8859-15 (Western Europe)
* ISO-8859-16 (Central Europe)
* KOI8-R (Cyrillic)

Кодировка определяет связь между кодом (от 0 до 255) и символом. Для выбора кириллической кодировки в Windows используйте cp1251. Обычно кодировки с префиксом cp используются в Windows, в то время как Linux системы используют ISO.

Составленный нами скрипт mf.php необходимо открыть в браузере. Он подготовит для наших нужд необходимый файл с расширением php. Итак, что мы имеем? У нас теперь есть комплект из трех файлов шрифта — times.ttf, times.afm и times.php. Важно два из них (times.ttf и times.php) положить в нужное место. Этим местом является директория font, находящаяся в папке класса. Впрочем, вы вольны сами указать место директории, которая будет хранить шрифты. Для этого нужно определить константу FPDF_FONTPATH обыкновенным для PHP способом:

define(‘FPDF_FONTPATH’,'font/’);

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

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

* в шапке документа должны быть данные: логотип, наименование фирмы, заголовок документа;
* в теле документа должны быть приведены данные по товарным позициям, включающие наименование товара, розничную цену и оптовую цену;

Сразу разобьем нашу работу на три этапа. Первый этап — вывод статической информации. Для простоты примера к статической информации мы отнесем все, кроме данных по товарным позициям. На втором этапе уделим внимание табличному выводу товарных позиций в теле документа. Уточним, что в этой статье мы рассмотрим загрузку данных из файла CSV, где разделителем является точка с запятой. Я остановился на этом решении по одной причине — такой файл легко получить из формата xls и, одновременно, с ним легко работать из РНР приложения в других целях (например, организовать вывод в HTML). На третьем этапе мы рассмотрим доставку PDF файла конечному пользователю.

Приступим к практическому знакомству с классом FPDF. Для начала создадим файл price.php, который будет осуществлять вывод PDF документа прямо в браузер (остальные способы мы рассмотрим в главе 6). Рядом с этим рабочим файлом положим скачанный ранее fpdf.php (файл класса) и папку font с вложенными в нее файлами кириллических шрифтов (см. предыдущую главу). Теперь в файле price.php подключим класс FPDF и установим путь к папке шрифтов.

<?php
define(‘FPDF_FONTPATH’,'font/’);
require(‘fpdf.php’);
?>

Необходимо уточнить, что тэг <?php должен стоять на самой первой строке файла, так как в последствии мы будем самостоятельно отправлять заголовки (headers), и пустая строка, текст или разметка HTML в начале файла могут нам помешать.

Для вывода статической информации (логотип, название фирмы, название документа) мы будем использовать следующие методы класса FPDF: cell() и image(). Метод cell() выводит ячейку (прямоугольную фигуру) с опциональной установкой границы, цветовой заливкой и строкой текста. Формат записи метода следующий:

Cell(float w [, float h [, string txt [, mixed border [, int ln [, string align [, int fill [, mixed link]]]]]]])

Метод image() отвечает за вывод графического изображения JPG или PNG. Формат вызова метода следующий:

Image(string file, float x, float y, float w [, float h [, string type [, mixed link]]])

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

<?php
define(‘FPDF_FONTPATH’,'font/’);
require(‘fpdf.php’);

//Создадим экземпляр класса
$price = new FPDF();
$price->Open();
?>

После создания экземпляра класса нам будет необходимо указать используемые шрифты. Так как кириллический Times New Roman (рассмотренный в предыдущей главе) не является в классе FPDF шрифтом, установленным по умолчанию, сначала придется его «показать» скрипту. Это мы сделаем при помощи метода AddFont().

<?php
define(‘FPDF_FONTPATH’,'font/’);
require(‘fpdf.php’);

//Создадим экземпляр класса
$price = new FPDF();
$price->Open();
//Подключаем кириллический шрифт
$price-> AddFont(‘TimesNewRomanPSMT’,»,’times.php’);
$price-> SetFont(‘TimesNewRomanPSMT’,»,12);
?>

Первым аргументом функции мы указываем наименование шрифта. Его можно посмотреть в сгенерированном РНР файле (значение переменной $name). Второй аргумент — форматирование текста (B — Bold, I — Italic и смешанный BI или IB). Если аргумент пустой, то шрифт обычный. Для использования B и I необходимо также подключить соответствующие типы шрифтов (для Times New Roman это могут быть файлы timesI.ttf и timesBd.ttf). Третий аргумент — РНР файл описания (его мы сгенерировали в предыдущей главе). Теперь шрифт можно применять в данном документе. Для использования на странице установим его размер методом SetFont(). Этот метод можно вызывать несколько раз в одном скрипте, в то время как добавление AddFont() делается один раз для каждого шрифта. Формат записи SetFont() следующий:

SetFont(string family [, string style [, float size]])

Наконец-то можно сформировать содержимое страницы. На этом этапе мы столкнемся с увеличением количества кода, и поэтому, во избежание путаницы, расширим класс FPDF своими методами. Конечно, нет необходимости вносить изменения в сам FPDF класс. Мы напишем свой price.class.php, наследуемый от FPDF.

Листинг 1

<?php
class Price extends FPDF {
function PrintTitle($title,$image,$company) {
//Выводим логотип
$this->Image($image,6,6,40,20);
//Устанавливаем шрифт для наименования компании
$this->SetFont(‘TimesNewRomanPSMT’,»,20);
//Выводим наименование компании
$this->Cell(210,4,$company,0,0,’C');
//Переходим на следующую строку
$this->Ln();
//Переходим на следующую строку
$this->Ln();
//Делаем отступ от левого края (рисуя прозрачную ячейку)
$this->Cell(37);
//Устанавливаем цвет заливки следующих ячеек (R,G,B)
$this->SetFillColor(209,204,244);
//Устанавливаем шрифт для наименования документа
$this->SetFont(‘TimesNewRomanPSMT’,»,12);
//Выводим наименование документа
$this->Cell(150,8,$title,0,0,’C',1);
//Переходим на следующую строку
$this->Ln();
}
}
?>

Листинг 2

<?php
define(‘FPDF_FONTPATH’,'font/’);
require(‘fpdf.php’);
require(‘price.class.php’);

$price = new Price();
$price->Open();
$price->AddFont(‘TimesNewRomanPSMT’,»,’times.php’);
//Добавляем страничку в документ
$price->AddPage();
//Выводим заголовок, используя написанный нами метод в файле класса //price.class.php
$price->PrintTitle(‘Прайс-лист’,'logo.jpg’,'Компания «ALKO SELL»‘);
//Выводим документ в браузер
$price->Output();
?>

В этом файле мы столкнулись еще с несколькими методами класса FPDF. Необходимо заметить, что документ сначала создается в буфере и лишь потом, при вызове метода Output(), выводится в браузер. Поэтому общая схема работы с документом следующая: создаем в буфере документ методом Open(), затем для работы добавляем в этот документ страничку методом AddPage(), формируем содержимое документа различными методами типа Cell() и, наконец, выводим его из буфера в браузер. Если у вас установлен adobe acrobat версии не ниже 5.0, то при запуске price.php в браузере должен открыться документ price.pdf (в Internet Explorer) или сформируется документ doc.pdf для скачивания (в Opera).

Этот документ пока не представляет собой практической ценности, однако на его примере мы разобрали основы вывода статических данных в документ .PDF.
Подключаем источник данных

Перейдем к самому интересному — динамическому формированию содержимого документа. Именно этой возможностью и ценен для РНР разработчика класс FPDF. Я уже говорил выше, что здесь мы рассмотрим вариант получения данных из CSV файла.

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

Пиво «Балтика»;15.00;13.45
Пиво «Оболонь»;14.00;12.30
Водка «Nemiroff», 1 л.;100.00;89.45

Сохраним его как price.csv. Конечно, в реальном прайс-листе товарных позиций и граф будет больше.

Возможны так же деления по группам товаров (например «пиво», «водка», «вино»), но в данном конкретном примере попробуем рассмотреть упрощенную версию (количество записей можно увеличить).

Перед нами встает необходимость получить данные динамически и представить их в виде обыкновенной таблицы в три колонки, с заголовками колонок (столбцов). Перед созданием экземпляра объекта Price добавим инициализацию массива заголовков (соберем все заголовки в массив):

$header = array(«Наименование»,»Розн.»,»Опт.»);

Далее нам понадобится еще больше расширить класс Price (унаследованный от класса FPDF) методами LoadData() и ImprovedTable(). Первый метод должен будет извлекать данные из CSV файла в массив $data, а второй метод пригодится для отрисовки таблицы с данными из этого массива. Рассмотрим метод LoadData() для класса Price.

function LoadData($file) {
//Получаем данные в массив строк
$lines=file($file);
$data=array();
//Разделяем столбцы каждой строки по точке с запятой.
foreach($lines as $line)
$data[]=explode(‘;’,chop($line));
//Возвращаем массив с данными
return $data;
}

Вставим этот код в файл класса price.class.php. Теперь перейдем к рассмотрению метода ImprovedTable().

Вот его код:

function ImprovedTable($header,$data) {
//Указываем ширину столбцов
$w=array(100,40,40);

//Выводим заголовки столбцов
for($i=0;$i<count($header);$i++)
$this->Cell($w[$i],7,$header[$i],1,0,’C');
$this->Ln();

//Выводим данные
//Сначала установим шрифт для данных
$this-> SetFont(‘TimesNewRomanPSMT’,»,8);
foreach($data as $row)
{
/*Первый параметр Cell() — ширина столбца, указанная ранее в массиве $w, второй параметр — высота столбца, третий параметр — строка для вывода, LRBT — означает прорисовку границ со всех сторон ячейки (Left, Right, Bottom, Top). Можно также указать выравнивание в ячейке по правому краю (‘R’) */

//Рисуем ячейку наименования товара
$this->Cell($w[0],6,$row[0],’LRBT’);

//Рисуем ячейку розничной цены
$this-> Cell($w[1],6,number_format($row[1]),’LRBT’,0,’R');

//Рисуем ячейку оптовой цены
$this-> Cell($w[2],6,number_format($row[2]),’LRBT’,0,’R');

//Переходим на следующую строку
$this->Ln();
}
//Closure line
$this->Cell(array_sum($w),0,»,’T');
}

Вставим и этот метод в код класса Price. Теперь, когда мы обросли двумя новыми методами, попробуем их применить. Изменим код нашего главного файла (листинг 3).

Можно смотреть на промежуточный результат. Это практически все, чего мы хотели достичь.

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

Для этого необходимо организовать вывод «подвала» (footer) на каждой странице. С этой целью напишем метод Footer() нашего класса Price. Следует отметить, что методы Footer() и Header() заранее прописаны в классе FPDF и вызываются автоматически при выполнении метода AddPage() и Close().

По умолчанию они пустые, но их можно определить в своих наследуемых классах, при этом ни Footer() ни Header() не потребуется явно вызывать из приложения. Добавим в класс Price() следующий код метода:

function Footer() {
//Позиционирование в 1.5 см от нижней границы
$this->SetY(-15);
//TimesNewRomanPSMT italic 8
$this->SetFont(‘TimesNewRomanPSMT’,»,8);
//Номер страницы
$this->Cell(0,10,’Страница ‘.$this->PageNo().’/{nb}’,0,0,’C');
}

Листинг 3

<?php
define(‘FPDF_FONTPATH’,'font/’);
require(‘fpdf.php’);
require(‘price.class.php’);

$header = array(«Наименование товара»,»Розн. цена»,»Опт. цена»);
$price=new Price();
$price->Open();

//Получим массив данных из файла в $data
$data = $price->LoadData(«price.csv»);
$price->AddFont(‘TimesNewRomanPSMT’,»,’times.php’);
$price->AddPage();
$price->SetFont(‘TimesNewRomanPSMT’,»,12);
$price->PrintTitle(‘Прайс-лист’,'logo.jpg’,'Компания «ALKO SELL»‘);

//Нарисуем таблицу. Аргументами метода являются массив наименований
// столбцов и массив данных из файла price.csv
$price->ImprovedTable($header,$data);
$price->Output();
?>

Теперь этот метод будет автоматически исполняться при вызове метода AddPage(). Для корректной работы необходим последний штрих — вызов из файла приложения (price.php) метода $price->AliasNbPages() перед $price->AddPage().

AliasNbPages([string alias])

При написании метода Footer() мы использовали также PageNo(), метод, возвращающий номер текущей страницы и параметр {nb}, который по умолчанию будет заменен цифрой общего количества страниц в текущем документе. Документ готов, и перед нами встает необходимость его вывода в браузер.
Вывод в браузер

По идее, существует всего два варианта вывода документа в браузер — открытие (если установлен adobe acrobat) и скачивание без непосредственного открытия. В классе FPDF выводом документа в браузер управляет метод Output(). В нашем примере мы использовали этот метод без дополнительных аргументов. Однако документация к FPDF приводит следующий формат его записи:

Output([string file [, boolean download]])

Метод предназначен для сохранения PDF документа в локальный файл или для непосредственного вывода в браузер (если установлена программа просмотра PDF файлов).

Аргумент file означает имя файла. Если таковое отсутствует, то производится попытка открыть документ в окне браузера. Если аргумент file определен, то аргумент download указывает, что файл должен быть сохранен на сервере (значение false) или у пользователя (при установке true выводится диалог «Сохранить как»).

Соответственно, можно выделить три варианта написания метода Output() для нашего документа. Первый — Output() — пытается открыть документ в окне браузера. Второй вариант написания выведет у пользователя диалоговое окно «Сохранить как» и предложит скачать документ на его диск — Output(«AlkoPrice.pdf», true). И, наконец, третий вариант просто сохранит документ на локальном для скрипта сервере — Output(«AlkoPrice.pdf»,false) или просто Output(«AlkoPrice.pdf»), так как по умолчанию атрибут download всегда имеет значение false.

Стоит отдельно рассмотреть компрессию полученного файла. По умолчанию будет произведена попытка его «ужать» средствами Zlib. Это расширение (extension) должно быть установлено в системе. Если установка не была произведена, то документ получится не сжатым, и будет весить немного больше.

Написал Валерий Хвалев

16 декабря, 2008 в 11:19 дп

Подпишись на обновления блога по e-mail или RSS!

Первая встреча Клуба маркетинга и продаж

пока комментариев нет

Первая встреча Клуба маркетинга и продаж состоялась.

Инициатором и организатором мероприятия выступил, собственно, я. Идею поддержал Институт бизнеса и менеджмента технологий БГУ, который помог с помещением. Вообще, поддержку высказали все знакомые маркетологи и продажники. Многим сильно не хватает профессионального общения, информации, прямых контактов с коллегами. Клуб призван решать эти проблемы.

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

Что очень порадовало, так это качественный состав слушателей. На встрече были маркетологи, специалисты по продажам, предприниматели и несколько директоров компаний. В общей сложности мероприятие собрало около 40 человек. Слушатели были очень активными, задавали глубокие вопросы. Самые активные участники обсуждения получили бонус - книгу Сергея Жуковского, который и выступал с докладом. Он сделал все возможное, чтобы раскрыть тему создания и раскрутки блогов. Однако, ему было нелегко уложиться в отведенные 1,5 часа.

Почему так мало? Дело в том, что люди собрались разные. Для некоторых тема совершенно новая, а без привычки слушать поток информации из новой для себя области достаточно трудно.

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

В дальнейшем мы будем экспериментировать со структурой встрч, чтобы найти наиболее оптимальный формат общих встреч. С другой стороны будут и тематические круглые столы и большие 1-2-дневные семинары для зантересованных участников. Это все впереди!

А что вы думаете об этом начинании?

club_marketing

Написал Алексей Шабловский

15 декабря, 2008 в 12:53 пп

Подпишись на обновления блога по e-mail или RSS!

Mail.ru и TUT.by наносят точечный удар по агентствам интернет-рекламы?

пока комментариев нет

Белорусский итернет впервые столкнулся с ситуацией, когда будущее отрасли интернет-рекламы не просто под вопросом — оно предопределено.

Что же произошло? Да, собственно, ничего… неожиданного. Два самых посещаемых белорусами портала MAIL.RU и TUT.BY заключили соглашение, и выступили учредителями необычной структуры — компании, которая будет иметь эксклюзивные права на продажу рекламы на TUT.BY (главная страница, новостные страницы и почта), MAIL.RU (главная страница и Знакомства), а также на сайтах  RBC.ru и AV.by.

О создании «агентства агентств» были уведомлены пару дней назад агентства интернет-рекламы. Они получили «информационное письмо» о том, что условия работы с ними будут изменены. Новая политика вводится с 1 января 2009 года, и агентства получили достаточно времени, чтобы… собрать необходимые документы… для закрытия.
 

Что предполагает создание «агентства агентств»

Для агентств
Будет отменена накопительная система скидок. Размер скидок будет зависеть от бюджета каждого рекламодателя, приведенного агентством, а не от совокупного бюджета всех рекламодателей одного агентства. Раньше агентство могло вести кампании нескольких рекламадателей с небольшими бюджетами и получать скидку за суммарный объем. Это было выгодно как агентству (оно получало скидку и было заинтересовано в привлечении рекламодателей), так и рекламодателям (они получали возможность разместиться на заметных местах даже с небольшими бюджетами). Со снижением агентского вознаграждения у интернет-агентств не будет большой заинтересованности в привлечении небольших бюджетов.
 
Агентствам станет намного сложнее получить максимальную скидку, которая теперь будет составлять 30% вместо прежних 45%. Теперь агентства не смогут варьировать размер скидок для рекламодателей. А ведь раньше это было инструментом мотивации рекламодателей. Например, агентство могло зантересовать рекламодателя, сомневающегося эффективности интернет-рекламы, выгодными условиями размещения, уменьшив свою маржу. Теперь же у агентств не будет того пространства для маневра, и у рекламодателей тоже. Нет, у рекламодателей будет выбор с кем заключать договор — параллельно будут существовать 2 шкалы скидок: в «Надежных программах» и агентстве «Веб Эксперт» — у каждого своя шкала. Но это, скорее, выбор без выбора.

Рекламодателям и агентствам будет предоставляться так называемая суперкомиссия, размер которой для агентств будет на 5% ниже, чем для прямых рекламодателей. С введением такой тарифной политики, агентствам интернет-рекламы будет совершенно невыгодно предлагать своим рекламодателям самые популярные места. Эта прерогатива будет принадлежать «Веб Эксперту» и TUT.BY, что автоматически приведет к утрате другими агентствами интернет-рекламы части бюджетов своих рекламодателей, которые по новым правилам вынужденны будут обращаться напрямую в «Веб Эксперт» и TUT.BY. 
 
Для рекламодателей
Прямым рекламодателям придется переплачивать до 45% в связи с уменьшением размеров скидок и планомерным повышением тарифов на рекламу от TUT.BY. Времена демократичного подхода к ценообразованию на белорусском портале ушли в прошлое. Новые жесткие условия вынуждают рекламодателей планировать кампании исходя не из своих целей и стратегии маркетинга, а исходя из условий предоставления скидок. Рекламодатели теперь вынуждены будут подстраиваться под тарифы и скидки главных рекламных площадок. Рекламодателей вынуждают размещаться на более дорогих местах, тратить больше денег, причем тратить их нерационально. Основных рекламодателей сталкивают лбами на топовых местах, вынуждая играть в опасную игру — войну бюджетов. И это во время кризиса! В то время как во время кризиса долже превалировать малобюджетный маркетинг, которому теперь не будет места на обновленном рынке интернет-рекламы.

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

Многим рекламодателям раньше было выгодно размещаться через агентства хотя бы по той причине, что агентства не требовали предоплату, в отличие от TUT.BY. Теперь и этот маневр практически недоступен.
Как отреагируют рекламодатели на такие пертурбации? Следует отметить, что негативный сигнал для TUT.BY прозвучал после ноябрьского повышения тарифов на 20%. Вскоре после увеличения тарифов многие места на TUT.BY были заполнены рекламой собственных ресурсов портала, а менеджеры по продажам пошли «в народ», к рекламодатеям, предлагая самые выгодные условия, но, похоже, без особых успехов. И тогда руководство портала решило создать «естественную монополию».
 

Выводы

Интернет-реклама на ведущем портале становится еще менее гибким, менее настраиваемым, более дорогим, менее адресным инструментом маркетинга. Инструментом, который непригоден во время кризиса. Это приведет к снижению привлекательности TUT.BY и уменьшению лояльности рекламодателей. Агентства интернет-рекламы будут вынуждены понизить свою маржу, работая с TUT.BY. Агентства потеряют часть бюджетов рекламодателей, которым придется работать напрямую с «Веб Экспертом», имеющим эксклюзив, и отделом продаж TUT.BY. Агентства вынуждены будут искать другие, более эффективные рекламные площадки, предлагающие более гибкие системы скидок. Агентства вынуждены будут искать другие, менее затратные способы рекламы. У рекламодателей не будет выбора через кого размещаться на TUT.BY. Положительным моментом новой политики является то, что схема размещения рекламы на TUT.BY будет более прозрачной, и у агентств не будет возможности манипулировать скидками. Манипулятор, он же регулятор, теперь будет один.

Написал Алексей Шабловский

5 декабря, 2008 в 4:01 пп

Подпишись на обновления блога по e-mail или RSS!

WordPress как ERP ??!

пока комментариев нет

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

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

Сегодня я расскажу решение для мелкого и среднего уровня бизнеса, которое по себестоимости будет в сотни раз дешевле любой ЕRP, а по приносимой прибыли сможет сравняться с подобной системой. 

Итак давайте сначала обрисуем список целей и требований  для нашей системы: 

  1. Новостная информация по компании. Что, где происходит, каких успехов достигли, кто больше всего отличился. 
  2. Оперативная информация с полев боя вашего бизнеса. Кто, где, когда. 
  3. Информация о ресурсах, в случае если бизнес информационный — важно знать компетенции каждого из сотрудников
  4. Было бы не плохо иметь единую точку авторизации, например Microsoft Active Directory т.е. один логин для всех систем
  5. Общий доступ к документообороту, файлам, шаблонам документов и т.д. 
Мы нашли одно простое в установке, доступное и понятное каждому  решение — итак речь идет о бональном тулзе — WordPress. Да да, блоговый движок, и ничего большего..  но он полностью удовлетворяет наши требования:
  1. Стандартные новости в виде блогов. Более того можно подписать всех сотрудников через RSS (сейчас куча RSS читалок) 
  2. Имея несколько блогов их можно объединить кросс-постами. Таким образом всегда будет связь с дальних тылов
  3. Каждый сотрудник может вести свой блог, таким образом просто по меткам мы можем отобрать всех пользователей допустим со знаниями технологии XSLT. А по постам в блоге понять даже глубину их знаний
  4. Уже разработано куча плагинов для WP которые могут без проблем авторизовать пользователей в различных системах. 
  5. Так же можно с помощью плагинов прикреплять документы, шаблоны к различным постам, что намного упростит доступность и поиск информации. 
Итак если вы мелкая или средняя компания — попробуйте упросить ваше информационное поле битвы с помощью обычного блогового движка. 

 

Написал Валерий Хвалев

1 декабря, 2008 в 1:44 пп

Подпишись на обновления блога по e-mail или RSS!